1fa2ba3b8SLaurent Vivier /* 2fa2ba3b8SLaurent Vivier * Copyright (c) 2013-2018 Laurent Vivier <laurent@vivier.eu> 3fa2ba3b8SLaurent Vivier * 4fa2ba3b8SLaurent Vivier * This work is licensed under the terms of the GNU GPL, version 2 or later. 5fa2ba3b8SLaurent Vivier * See the COPYING file in the top-level directory. 6fa2ba3b8SLaurent Vivier * 7fa2ba3b8SLaurent Vivier */ 8fa2ba3b8SLaurent Vivier 9fa2ba3b8SLaurent Vivier #ifndef HW_NUBUS_NUBUS_H 10fa2ba3b8SLaurent Vivier #define HW_NUBUS_NUBUS_H 11fa2ba3b8SLaurent Vivier 12fa2ba3b8SLaurent Vivier #include "hw/qdev-properties.h" 13fa2ba3b8SLaurent Vivier #include "exec/address-spaces.h" 14*db1015e9SEduardo Habkost #include "qom/object.h" 15fa2ba3b8SLaurent Vivier 16fa2ba3b8SLaurent Vivier #define NUBUS_SUPER_SLOT_SIZE 0x10000000U 17fa2ba3b8SLaurent Vivier #define NUBUS_SUPER_SLOT_NB 0x9 18fa2ba3b8SLaurent Vivier 19fa2ba3b8SLaurent Vivier #define NUBUS_SLOT_SIZE 0x01000000 20fa2ba3b8SLaurent Vivier #define NUBUS_SLOT_NB 0xF 21fa2ba3b8SLaurent Vivier 22fa2ba3b8SLaurent Vivier #define NUBUS_FIRST_SLOT 0x9 23fa2ba3b8SLaurent Vivier #define NUBUS_LAST_SLOT 0xF 24fa2ba3b8SLaurent Vivier 25fa2ba3b8SLaurent Vivier #define TYPE_NUBUS_DEVICE "nubus-device" 26*db1015e9SEduardo Habkost typedef struct NubusDevice NubusDevice; 27fa2ba3b8SLaurent Vivier #define NUBUS_DEVICE(obj) \ 28fa2ba3b8SLaurent Vivier OBJECT_CHECK(NubusDevice, (obj), TYPE_NUBUS_DEVICE) 29fa2ba3b8SLaurent Vivier 30fa2ba3b8SLaurent Vivier #define TYPE_NUBUS_BUS "nubus-bus" 31*db1015e9SEduardo Habkost typedef struct NubusBus NubusBus; 32fa2ba3b8SLaurent Vivier #define NUBUS_BUS(obj) OBJECT_CHECK(NubusBus, (obj), TYPE_NUBUS_BUS) 33fa2ba3b8SLaurent Vivier 34fa2ba3b8SLaurent Vivier #define TYPE_NUBUS_BRIDGE "nubus-bridge" 35fa2ba3b8SLaurent Vivier 36*db1015e9SEduardo Habkost struct NubusBus { 37fa2ba3b8SLaurent Vivier BusState qbus; 38fa2ba3b8SLaurent Vivier 39fa2ba3b8SLaurent Vivier MemoryRegion super_slot_io; 40fa2ba3b8SLaurent Vivier MemoryRegion slot_io; 41fa2ba3b8SLaurent Vivier 42fa2ba3b8SLaurent Vivier int current_slot; 43*db1015e9SEduardo Habkost }; 44fa2ba3b8SLaurent Vivier 45*db1015e9SEduardo Habkost struct NubusDevice { 46fa2ba3b8SLaurent Vivier DeviceState qdev; 47fa2ba3b8SLaurent Vivier 48fa2ba3b8SLaurent Vivier int slot_nb; 49fa2ba3b8SLaurent Vivier MemoryRegion slot_mem; 50fa2ba3b8SLaurent Vivier 51fa2ba3b8SLaurent Vivier /* Format Block */ 52fa2ba3b8SLaurent Vivier 53fa2ba3b8SLaurent Vivier MemoryRegion fblock_io; 54fa2ba3b8SLaurent Vivier 55fa2ba3b8SLaurent Vivier uint32_t rom_length; 56fa2ba3b8SLaurent Vivier uint32_t rom_crc; 57fa2ba3b8SLaurent Vivier uint8_t rom_rev; 58fa2ba3b8SLaurent Vivier uint8_t rom_format; 59fa2ba3b8SLaurent Vivier uint8_t byte_lanes; 60fa2ba3b8SLaurent Vivier int32_t directory_offset; 61fa2ba3b8SLaurent Vivier 62fa2ba3b8SLaurent Vivier /* ROM */ 63fa2ba3b8SLaurent Vivier 64fa2ba3b8SLaurent Vivier MemoryRegion rom_io; 65fa2ba3b8SLaurent Vivier const uint8_t *rom; 66*db1015e9SEduardo Habkost }; 67fa2ba3b8SLaurent Vivier 68fa2ba3b8SLaurent Vivier void nubus_register_rom(NubusDevice *dev, const uint8_t *rom, uint32_t size, 69fa2ba3b8SLaurent Vivier int revision, int format, uint8_t byte_lanes); 70fa2ba3b8SLaurent Vivier 71fa2ba3b8SLaurent Vivier #endif 72