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