aboutsummaryrefslogtreecommitdiff
path: root/hw/m68k
diff options
context:
space:
mode:
authorMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>2021-06-25 07:53:55 +0100
committerPhilippe Mathieu-Daudé <f4bug@amsat.org>2021-07-02 17:35:08 +0200
commit408c57331cddd2b9b8964ce5fdd2c14ccd946868 (patch)
tree46d49a43c4917555c8c695234a4fd71850fbf471 /hw/m68k
parent5d53baf3f5b3e711fd809d9e0b39b29be994ba9c (diff)
downloadqemu-408c57331cddd2b9b8964ce5fdd2c14ccd946868.zip
qemu-408c57331cddd2b9b8964ce5fdd2c14ccd946868.tar.gz
qemu-408c57331cddd2b9b8964ce5fdd2c14ccd946868.tar.bz2
hw/m68k/q800: move PROM and checksum calculation from dp8393x device to board
This is in preparation for each board to have its own separate bit storage format and checksum for storing the MAC address. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Tested-by: Finn Thain <fthain@linux-m68k.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20210625065401.30170-5-mark.cave-ayland@ilande.co.uk> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Diffstat (limited to 'hw/m68k')
-rw-r--r--hw/m68k/q800.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 11376da..491f283 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -70,6 +70,8 @@
#define NUBUS_SUPER_SLOT_BASE 0x60000000
#define NUBUS_SLOT_BASE 0xf0000000
+#define SONIC_PROM_SIZE 0x1000
+
/*
* the video base, whereas it a Nubus address,
* is needed by the kernel to have early display and
@@ -211,8 +213,10 @@ static void q800_init(MachineState *machine)
int32_t initrd_size;
MemoryRegion *rom;
MemoryRegion *io;
+ MemoryRegion *dp8393x_prom = g_new(MemoryRegion, 1);
+ uint8_t *prom;
const int io_slice_nb = (IO_SIZE / IO_SLICE) - 1;
- int i;
+ int i, checksum;
ram_addr_t ram_size = machine->ram_size;
const char *kernel_filename = machine->kernel_filename;
const char *initrd_filename = machine->initrd_filename;
@@ -319,9 +323,25 @@ static void q800_init(MachineState *machine)
sysbus = SYS_BUS_DEVICE(dev);
sysbus_realize_and_unref(sysbus, &error_fatal);
sysbus_mmio_map(sysbus, 0, SONIC_BASE);
- sysbus_mmio_map(sysbus, 1, SONIC_PROM_BASE);
sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(glue, 2));
+ memory_region_init_rom(dp8393x_prom, NULL, "dp8393x-q800.prom",
+ SONIC_PROM_SIZE, &error_fatal);
+ memory_region_add_subregion(get_system_memory(), SONIC_PROM_BASE,
+ dp8393x_prom);
+
+ /* Add MAC address with valid checksum to PROM */
+ prom = memory_region_get_ram_ptr(dp8393x_prom);
+ checksum = 0;
+ for (i = 0; i < 6; i++) {
+ prom[i] = nd_table[0].macaddr.a[i];
+ checksum += prom[i];
+ if (checksum > 0xff) {
+ checksum = (checksum + 1) & 0xff;
+ }
+ }
+ prom[7] = 0xff - checksum;
+
/* SCC */
dev = qdev_new(TYPE_ESCC);