34
34
#define TCX_THC_NREGS_24 0x1000
35
35
#define TCX_TEC_NREGS 0x1000
37
#define TYPE_TCX "SUNW,tcx"
38
#define TCX(obj) OBJECT_CHECK(TCXState, (obj), TYPE_TCX)
37
40
typedef struct TCXState {
41
SysBusDevice parent_obj;
41
45
uint32_t *vram24, *cplane;
193
197
ram_addr_t cpage)
195
199
memory_region_reset_dirty(&ts->vram_mem,
196
page_min, page_max + TARGET_PAGE_SIZE,
201
(page_max - page_min) + TARGET_PAGE_SIZE,
197
202
DIRTY_MEMORY_VGA);
198
203
memory_region_reset_dirty(&ts->vram_mem,
199
204
page24 + page_min * 4,
200
page24 + page_max * 4 + TARGET_PAGE_SIZE,
205
(page_max - page_min) * 4 + TARGET_PAGE_SIZE,
201
206
DIRTY_MEMORY_VGA);
202
207
memory_region_reset_dirty(&ts->vram_mem,
203
208
cpage + page_min * 4,
204
cpage + page_max * 4 + TARGET_PAGE_SIZE,
209
(page_max - page_min) * 4 + TARGET_PAGE_SIZE,
205
210
DIRTY_MEMORY_VGA);
285
290
/* reset modified pages */
286
291
if (page_max >= page_min) {
287
292
memory_region_reset_dirty(&ts->vram_mem,
288
page_min, page_max + TARGET_PAGE_SIZE,
294
(page_max - page_min) + TARGET_PAGE_SIZE,
289
295
DIRTY_MEMORY_VGA);
522
528
static int tcx_init1(SysBusDevice *dev)
524
TCXState *s = FROM_SYSBUS(TCXState, dev);
530
TCXState *s = TCX(dev);
525
531
ram_addr_t vram_offset = 0;
527
533
uint8_t *vram_base;
529
memory_region_init_ram(&s->vram_mem, "tcx.vram",
535
memory_region_init_ram(&s->vram_mem, OBJECT(s), "tcx.vram",
530
536
s->vram_size * (1 + 4 + 4));
531
537
vmstate_register_ram_global(&s->vram_mem);
532
538
vram_base = memory_region_get_ram_ptr(&s->vram_mem);
534
540
/* 8-bit plane */
535
541
s->vram = vram_base;
536
542
size = s->vram_size;
537
memory_region_init_alias(&s->vram_8bit, "tcx.vram.8bit",
543
memory_region_init_alias(&s->vram_8bit, OBJECT(s), "tcx.vram.8bit",
538
544
&s->vram_mem, vram_offset, size);
539
545
sysbus_init_mmio(dev, &s->vram_8bit);
540
546
vram_offset += size;
541
547
vram_base += size;
544
memory_region_init_io(&s->dac, &tcx_dac_ops, s, "tcx.dac", TCX_DAC_NREGS);
550
memory_region_init_io(&s->dac, OBJECT(s), &tcx_dac_ops, s,
551
"tcx.dac", TCX_DAC_NREGS);
545
552
sysbus_init_mmio(dev, &s->dac);
547
554
/* TEC (dummy) */
548
memory_region_init_io(&s->tec, &dummy_ops, s, "tcx.tec", TCX_TEC_NREGS);
555
memory_region_init_io(&s->tec, OBJECT(s), &dummy_ops, s,
556
"tcx.tec", TCX_TEC_NREGS);
549
557
sysbus_init_mmio(dev, &s->tec);
550
558
/* THC: NetBSD writes here even with 8-bit display: dummy */
551
memory_region_init_io(&s->thc24, &dummy_ops, s, "tcx.thc24",
559
memory_region_init_io(&s->thc24, OBJECT(s), &dummy_ops, s, "tcx.thc24",
552
560
TCX_THC_NREGS_24);
553
561
sysbus_init_mmio(dev, &s->thc24);
557
565
size = s->vram_size * 4;
558
566
s->vram24 = (uint32_t *)vram_base;
559
567
s->vram24_offset = vram_offset;
560
memory_region_init_alias(&s->vram_24bit, "tcx.vram.24bit",
568
memory_region_init_alias(&s->vram_24bit, OBJECT(s), "tcx.vram.24bit",
561
569
&s->vram_mem, vram_offset, size);
562
570
sysbus_init_mmio(dev, &s->vram_24bit);
563
571
vram_offset += size;
567
575
size = s->vram_size * 4;
568
576
s->cplane = (uint32_t *)vram_base;
569
577
s->cplane_offset = vram_offset;
570
memory_region_init_alias(&s->vram_cplane, "tcx.vram.cplane",
578
memory_region_init_alias(&s->vram_cplane, OBJECT(s), "tcx.vram.cplane",
571
579
&s->vram_mem, vram_offset, size);
572
580
sysbus_init_mmio(dev, &s->vram_cplane);
574
582
s->con = graphic_console_init(DEVICE(dev), &tcx24_ops, s);
576
584
/* THC 8 bit (dummy) */
577
memory_region_init_io(&s->thc8, &dummy_ops, s, "tcx.thc8",
585
memory_region_init_io(&s->thc8, OBJECT(s), &dummy_ops, s, "tcx.thc8",
578
586
TCX_THC_NREGS_8);
579
587
sysbus_init_mmio(dev, &s->thc8);
607
615
static const TypeInfo tcx_info = {
609
617
.parent = TYPE_SYS_BUS_DEVICE,
610
618
.instance_size = sizeof(TCXState),
611
619
.class_init = tcx_class_init,