Revision 8926b517 hw/cirrus_vga.c

b/hw/cirrus_vga.c
259 259
    uint8_t *cirrus_srcptr;
260 260
    uint8_t *cirrus_srcptr_end;
261 261
    uint32_t cirrus_srccounter;
262
    uint8_t *cirrus_dstptr;
263
    uint8_t *cirrus_dstptr_end;
264
    uint32_t cirrus_dstcounter;
265 262
    /* hwcursor display state */
266 263
    int last_hw_cursor_size;
267 264
    int last_hw_cursor_x;
......
269 266
    int last_hw_cursor_y_start;
270 267
    int last_hw_cursor_y_end;
271 268
    int real_vram_size; /* XXX: suppress that */
269
    CPUWriteMemoryFunc **cirrus_linear_write;
272 270
} CirrusVGAState;
273 271

  
274 272
typedef struct PCICirrusVGAState {
......
285 283
 ***************************************/
286 284

  
287 285

  
288
static void cirrus_bitblt_reset(CirrusVGAState * s);
286
static void cirrus_bitblt_reset(CirrusVGAState *s);
287
static void cirrus_update_memory_access(CirrusVGAState *s);
289 288

  
290 289
/***************************************
291 290
 *
......
711 710
    s->cirrus_srcptr = &s->cirrus_bltbuf[0];
712 711
    s->cirrus_srcptr_end = &s->cirrus_bltbuf[0];
713 712
    s->cirrus_srccounter = 0;
714
    s->cirrus_dstptr = &s->cirrus_bltbuf[0];
715
    s->cirrus_dstptr_end = &s->cirrus_bltbuf[0];
716
    s->cirrus_dstcounter = 0;
713
    cirrus_update_memory_access(s);
717 714
}
718 715

  
719 716
static int cirrus_bitblt_cputovideo(CirrusVGAState * s)
......
746 743
    }
747 744
    s->cirrus_srcptr = s->cirrus_bltbuf;
748 745
    s->cirrus_srcptr_end = s->cirrus_bltbuf + s->cirrus_blt_srcpitch;
746
    cirrus_update_memory_access(s);
749 747
    return 1;
750 748
}
751 749

  
......
1199 1197
    case 0x14:			// Scratch Register 2
1200 1198
    case 0x15:			// Scratch Register 3
1201 1199
    case 0x16:			// Performance Tuning Register
1202
    case 0x17:			// Configuration Readback and Extended Control
1203 1200
    case 0x18:			// Signature Generator Control
1204 1201
    case 0x19:			// Signature Generator Result
1205 1202
    case 0x1a:			// Signature Generator Result
......
1214 1211
	       reg_index, reg_value);
1215 1212
#endif
1216 1213
	break;
1214
    case 0x17:			// Configuration Readback and Extended Control
1215
	s->sr[reg_index] = reg_value;
1216
        cirrus_update_memory_access(s);
1217
        break;
1217 1218
    default:
1218 1219
#ifdef DEBUG_CIRRUS
1219 1220
	printf("cirrus: outport sr_index %02x, sr_value %02x\n", reg_index,
......
1348 1349
	return CIRRUS_HOOK_NOT_HANDLED;
1349 1350
    case 0x05:			// Standard VGA, Cirrus extended mode
1350 1351
	s->gr[reg_index] = reg_value & 0x7f;
1352
        cirrus_update_memory_access(s);
1351 1353
	break;
1352 1354
    case 0x09:			// bank offset #0
1353 1355
    case 0x0A:			// bank offset #1
1356
	s->gr[reg_index] = reg_value;
1357
	cirrus_update_bank_ptr(s, 0);
1358
	cirrus_update_bank_ptr(s, 1);
1359
        break;
1354 1360
    case 0x0B:
1355 1361
	s->gr[reg_index] = reg_value;
1356 1362
	cirrus_update_bank_ptr(s, 0);
1357 1363
	cirrus_update_bank_ptr(s, 1);
1364
        cirrus_update_memory_access(s);
1358 1365
	break;
1359 1366
    case 0x10:			// BGCOLOR 0x0000ff00
1360 1367
    case 0x11:			// FGCOLOR 0x0000ff00
......
2304 2311
    cirrus_linear_writel,
2305 2312
};
2306 2313

  
2314
static void cirrus_linear_mem_writeb(void *opaque, target_phys_addr_t addr,
2315
                                     uint32_t val)
2316
{
2317
    CirrusVGAState *s = (CirrusVGAState *) opaque;
2318

  
2319
    addr &= s->cirrus_addr_mask;
2320
    *(s->vram_ptr + addr) = val;
2321
    cpu_physical_memory_set_dirty(s->vram_offset + addr);
2322
}
2323

  
2324
static void cirrus_linear_mem_writew(void *opaque, target_phys_addr_t addr,
2325
                                     uint32_t val)
2326
{
2327
    CirrusVGAState *s = (CirrusVGAState *) opaque;
2328

  
2329
    addr &= s->cirrus_addr_mask;
2330
    cpu_to_le16w((uint16_t *)(s->vram_ptr + addr), val);
2331
    cpu_physical_memory_set_dirty(s->vram_offset + addr);
2332
}
2333

  
2334
static void cirrus_linear_mem_writel(void *opaque, target_phys_addr_t addr,
2335
                                     uint32_t val)
2336
{
2337
    CirrusVGAState *s = (CirrusVGAState *) opaque;
2338

  
2339
    addr &= s->cirrus_addr_mask;
2340
    cpu_to_le32w((uint32_t *)(s->vram_ptr + addr), val);
2341
    cpu_physical_memory_set_dirty(s->vram_offset + addr);
2342
}
2343

  
2307 2344
/***************************************
2308 2345
 *
2309 2346
 *  system to screen memory access
......
2405 2442
    cirrus_linear_bitblt_writel,
2406 2443
};
2407 2444

  
2445
/* Compute the memory access functions */
2446
static void cirrus_update_memory_access(CirrusVGAState *s)
2447
{
2448
    unsigned mode;
2449

  
2450
    if ((s->sr[0x17] & 0x44) == 0x44) {
2451
        goto generic_io;
2452
    } else if (s->cirrus_srcptr != s->cirrus_srcptr_end) {
2453
        goto generic_io;
2454
    } else {
2455
	if ((s->gr[0x0B] & 0x14) == 0x14) {
2456
            goto generic_io;
2457
	} else if (s->gr[0x0B] & 0x02) {
2458
            goto generic_io;
2459
        }
2460
        
2461
	mode = s->gr[0x05] & 0x7;
2462
	if (mode < 4 || mode > 5 || ((s->gr[0x0B] & 0x4) == 0)) {
2463
            s->cirrus_linear_write[0] = cirrus_linear_mem_writeb;
2464
            s->cirrus_linear_write[1] = cirrus_linear_mem_writew;
2465
            s->cirrus_linear_write[2] = cirrus_linear_mem_writel;
2466
        } else {
2467
        generic_io:
2468
            s->cirrus_linear_write[0] = cirrus_linear_writeb;
2469
            s->cirrus_linear_write[1] = cirrus_linear_writew;
2470
            s->cirrus_linear_write[2] = cirrus_linear_writel;
2471
        }
2472
    }
2473
}
2474

  
2475

  
2408 2476
/* I/O ports */
2409 2477

  
2410 2478
static uint32_t vga_ioport_read(void *opaque, uint32_t addr)
......
2933 3001
    s->cirrus_linear_io_addr =
2934 3002
	cpu_register_io_memory(0, cirrus_linear_read, cirrus_linear_write,
2935 3003
			       s);
3004
    s->cirrus_linear_write = cpu_get_io_memory_write(s->cirrus_linear_io_addr);
3005

  
2936 3006
    /* I/O handler for LFB */
2937 3007
    s->cirrus_linear_bitblt_io_addr =
2938 3008
	cpu_register_io_memory(0, cirrus_linear_bitblt_read, cirrus_linear_bitblt_write,

Also available in: Unified diff