Revision f40070c3 hw/tcx.c
b/hw/tcx.c | ||
---|---|---|
21 | 21 |
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
22 | 22 |
* THE SOFTWARE. |
23 | 23 |
*/ |
24 |
#include "hw.h" |
|
24 |
|
|
25 | 25 |
#include "sun4m.h" |
26 | 26 |
#include "console.h" |
27 | 27 |
#include "pixel_ops.h" |
28 |
#include "sysbus.h" |
|
28 | 29 |
|
29 | 30 |
#define MAXX 1024 |
30 | 31 |
#define MAXY 768 |
... | ... | |
34 | 35 |
#define TCX_TEC_NREGS 0x1000 |
35 | 36 |
|
36 | 37 |
typedef struct TCXState { |
38 |
SysBusDevice busdev; |
|
37 | 39 |
target_phys_addr_t addr; |
38 | 40 |
DisplayState *ds; |
39 | 41 |
uint8_t *vram; |
... | ... | |
500 | 502 |
void tcx_init(target_phys_addr_t addr, int vram_size, int width, int height, |
501 | 503 |
int depth) |
502 | 504 |
{ |
503 |
TCXState *s; |
|
505 |
DeviceState *dev; |
|
506 |
SysBusDevice *s; |
|
507 |
|
|
508 |
dev = qdev_create(NULL, "SUNW,tcx"); |
|
509 |
qdev_set_prop_int(dev, "addr", addr); |
|
510 |
qdev_set_prop_int(dev, "vram_size", vram_size); |
|
511 |
qdev_set_prop_int(dev, "width", width); |
|
512 |
qdev_set_prop_int(dev, "height", height); |
|
513 |
qdev_set_prop_int(dev, "depth", depth); |
|
514 |
qdev_init(dev); |
|
515 |
s = sysbus_from_qdev(dev); |
|
516 |
/* 8-bit plane */ |
|
517 |
sysbus_mmio_map(s, 0, addr + 0x00800000ULL); |
|
518 |
/* DAC */ |
|
519 |
sysbus_mmio_map(s, 1, addr + 0x00200000ULL); |
|
520 |
/* TEC (dummy) */ |
|
521 |
sysbus_mmio_map(s, 2, addr + 0x00700000ULL); |
|
522 |
/* THC 24 bit: NetBSD writes here even with 8-bit display: dummy */ |
|
523 |
sysbus_mmio_map(s, 3, addr + 0x00301000ULL); |
|
524 |
if (depth == 24) { |
|
525 |
/* 24-bit plane */ |
|
526 |
sysbus_mmio_map(s, 4, addr + 0x02000000ULL); |
|
527 |
/* Control plane */ |
|
528 |
sysbus_mmio_map(s, 5, addr + 0x0a000000ULL); |
|
529 |
} else { |
|
530 |
/* THC 8 bit (dummy) */ |
|
531 |
sysbus_mmio_map(s, 4, addr + 0x00300000ULL); |
|
532 |
} |
|
533 |
} |
|
534 |
|
|
535 |
static void tcx_init1(SysBusDevice *dev) |
|
536 |
{ |
|
537 |
TCXState *s = FROM_SYSBUS(TCXState, dev); |
|
504 | 538 |
int io_memory, dummy_memory; |
505 | 539 |
ram_addr_t vram_offset; |
506 |
int size; |
|
540 |
int size, vram_size;
|
|
507 | 541 |
uint8_t *vram_base; |
508 | 542 |
|
543 |
vram_size = qdev_get_prop_int(&dev->qdev, "vram_size", -1); |
|
544 |
|
|
509 | 545 |
vram_offset = qemu_ram_alloc(vram_size * (1 + 4 + 4)); |
510 | 546 |
vram_base = qemu_get_ram_ptr(vram_offset); |
511 |
|
|
512 |
s = qemu_mallocz(sizeof(TCXState)); |
|
513 |
s->addr = addr; |
|
547 |
s->addr = qdev_get_prop_int(&dev->qdev, "addr", -1); |
|
514 | 548 |
s->vram_offset = vram_offset; |
515 |
s->width = width;
|
|
516 |
s->height = height;
|
|
517 |
s->depth = depth;
|
|
549 |
s->width = qdev_get_prop_int(&dev->qdev, "width", -1);
|
|
550 |
s->height = qdev_get_prop_int(&dev->qdev, "height", -1);
|
|
551 |
s->depth = qdev_get_prop_int(&dev->qdev, "depth", -1);
|
|
518 | 552 |
|
519 |
// 8-bit plane
|
|
553 |
/* 8-bit plane */
|
|
520 | 554 |
s->vram = vram_base; |
521 | 555 |
size = vram_size; |
522 |
cpu_register_physical_memory(addr + 0x00800000ULL, size, vram_offset);
|
|
556 |
sysbus_init_mmio(dev, size, s->vram_offset);
|
|
523 | 557 |
vram_offset += size; |
524 | 558 |
vram_base += size; |
525 | 559 |
|
560 |
/* DAC */ |
|
526 | 561 |
io_memory = cpu_register_io_memory(tcx_dac_read, tcx_dac_write, s); |
527 |
cpu_register_physical_memory(addr + 0x00200000ULL, TCX_DAC_NREGS, |
|
528 |
io_memory); |
|
562 |
sysbus_init_mmio(dev, TCX_DAC_NREGS, io_memory); |
|
529 | 563 |
|
564 |
/* TEC (dummy) */ |
|
530 | 565 |
dummy_memory = cpu_register_io_memory(tcx_dummy_read, tcx_dummy_write, |
531 | 566 |
s); |
532 |
cpu_register_physical_memory(addr + 0x00700000ULL, TCX_TEC_NREGS, |
|
533 |
dummy_memory); |
|
534 |
if (depth == 24) { |
|
535 |
// 24-bit plane |
|
567 |
sysbus_init_mmio(dev, TCX_TEC_NREGS, dummy_memory); |
|
568 |
/* THC: NetBSD writes here even with 8-bit display: dummy */ |
|
569 |
sysbus_init_mmio(dev, TCX_THC_NREGS_24, dummy_memory); |
|
570 |
|
|
571 |
if (s->depth == 24) { |
|
572 |
/* 24-bit plane */ |
|
536 | 573 |
size = vram_size * 4; |
537 | 574 |
s->vram24 = (uint32_t *)vram_base; |
538 | 575 |
s->vram24_offset = vram_offset; |
539 |
cpu_register_physical_memory(addr + 0x02000000ULL, size, vram_offset);
|
|
576 |
sysbus_init_mmio(dev, size, vram_offset);
|
|
540 | 577 |
vram_offset += size; |
541 | 578 |
vram_base += size; |
542 | 579 |
|
543 |
// Control plane
|
|
580 |
/* Control plane */
|
|
544 | 581 |
size = vram_size * 4; |
545 | 582 |
s->cplane = (uint32_t *)vram_base; |
546 | 583 |
s->cplane_offset = vram_offset; |
547 |
cpu_register_physical_memory(addr + 0x0a000000ULL, size, vram_offset); |
|
584 |
sysbus_init_mmio(dev, size, vram_offset); |
|
585 |
|
|
548 | 586 |
s->ds = graphic_console_init(tcx24_update_display, |
549 | 587 |
tcx24_invalidate_display, |
550 | 588 |
tcx24_screen_dump, NULL, s); |
551 | 589 |
} else { |
552 |
cpu_register_physical_memory(addr + 0x00300000ULL, TCX_THC_NREGS_8, |
|
553 |
dummy_memory); |
|
590 |
/* THC 8 bit (dummy) */ |
|
591 |
sysbus_init_mmio(dev, TCX_THC_NREGS_8, dummy_memory); |
|
592 |
|
|
554 | 593 |
s->ds = graphic_console_init(tcx_update_display, |
555 | 594 |
tcx_invalidate_display, |
556 | 595 |
tcx_screen_dump, NULL, s); |
557 | 596 |
} |
558 |
// NetBSD writes here even with 8-bit display |
|
559 |
cpu_register_physical_memory(addr + 0x00301000ULL, TCX_THC_NREGS_24, |
|
560 |
dummy_memory); |
|
561 | 597 |
|
562 |
register_savevm("tcx", addr, 4, tcx_save, tcx_load, s);
|
|
598 |
register_savevm("tcx", -1, 4, tcx_save, tcx_load, s);
|
|
563 | 599 |
qemu_register_reset(tcx_reset, s); |
564 | 600 |
tcx_reset(s); |
565 |
qemu_console_resize(s->ds, width, height);
|
|
601 |
qemu_console_resize(s->ds, s->width, s->height);
|
|
566 | 602 |
} |
567 | 603 |
|
568 | 604 |
static void tcx_screen_dump(void *opaque, const char *filename) |
... | ... | |
627 | 663 |
fclose(f); |
628 | 664 |
return; |
629 | 665 |
} |
666 |
|
|
667 |
static void tcx_register_devices(void) |
|
668 |
{ |
|
669 |
sysbus_register_dev("SUNW,tcx", sizeof(TCXState), tcx_init1); |
|
670 |
} |
|
671 |
|
|
672 |
device_init(tcx_register_devices) |
Also available in: Unified diff