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" 139bf674bcSMark Cave-Ayland #include "hw/sysbus.h" 14fa2ba3b8SLaurent Vivier #include "exec/address-spaces.h" 15db1015e9SEduardo Habkost #include "qom/object.h" 163616f424SMark Cave-Ayland #include "qemu/units.h" 17fa2ba3b8SLaurent Vivier 18fa2ba3b8SLaurent Vivier #define NUBUS_SUPER_SLOT_SIZE 0x10000000U 1903deab99SMark Cave-Ayland #define NUBUS_SUPER_SLOT_NB 0xe 20fa2ba3b8SLaurent Vivier 2162437f90SMark Cave-Ayland #define NUBUS_SLOT_BASE (NUBUS_SUPER_SLOT_SIZE * \ 2262437f90SMark Cave-Ayland (NUBUS_SUPER_SLOT_NB + 1)) 2362437f90SMark Cave-Ayland 24fa2ba3b8SLaurent Vivier #define NUBUS_SLOT_SIZE 0x01000000 2503deab99SMark Cave-Ayland #define NUBUS_FIRST_SLOT 0x0 2603deab99SMark Cave-Ayland #define NUBUS_LAST_SLOT 0xf 2703deab99SMark Cave-Ayland #define NUBUS_SLOT_NB (NUBUS_LAST_SLOT - NUBUS_FIRST_SLOT + 1) 28fa2ba3b8SLaurent Vivier 29d2cf28a0SMark Cave-Ayland #define NUBUS_IRQS 16 30d2cf28a0SMark Cave-Ayland 31fa2ba3b8SLaurent Vivier #define TYPE_NUBUS_DEVICE "nubus-device" 328063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(NubusDevice, NUBUS_DEVICE) 33fa2ba3b8SLaurent Vivier 34fa2ba3b8SLaurent Vivier #define TYPE_NUBUS_BUS "nubus-bus" 358063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(NubusBus, NUBUS_BUS) 36fa2ba3b8SLaurent Vivier 37fa2ba3b8SLaurent Vivier #define TYPE_NUBUS_BRIDGE "nubus-bridge" 389bf674bcSMark Cave-Ayland OBJECT_DECLARE_SIMPLE_TYPE(NubusBridge, NUBUS_BRIDGE); 39fa2ba3b8SLaurent Vivier 40db1015e9SEduardo Habkost struct NubusBus { 41fa2ba3b8SLaurent Vivier BusState qbus; 42fa2ba3b8SLaurent Vivier 4362437f90SMark Cave-Ayland AddressSpace nubus_as; 4462437f90SMark Cave-Ayland MemoryRegion nubus_mr; 4562437f90SMark Cave-Ayland 46fa2ba3b8SLaurent Vivier MemoryRegion super_slot_io; 47fa2ba3b8SLaurent Vivier MemoryRegion slot_io; 48fa2ba3b8SLaurent Vivier 4903deab99SMark Cave-Ayland uint16_t slot_available_mask; 50d2cf28a0SMark Cave-Ayland 51d2cf28a0SMark Cave-Ayland qemu_irq irqs[NUBUS_IRQS]; 52db1015e9SEduardo Habkost }; 53fa2ba3b8SLaurent Vivier 54*8e8616f3SMark Cave-Ayland #define NUBUS_DECL_ROM_MAX_SIZE (1 * MiB) 553616f424SMark Cave-Ayland 56db1015e9SEduardo Habkost struct NubusDevice { 57fa2ba3b8SLaurent Vivier DeviceState qdev; 58fa2ba3b8SLaurent Vivier 5903deab99SMark Cave-Ayland int32_t slot; 6090be1deaSMark Cave-Ayland MemoryRegion super_slot_mem; 61fa2ba3b8SLaurent Vivier MemoryRegion slot_mem; 623616f424SMark Cave-Ayland 633616f424SMark Cave-Ayland char *romfile; 643616f424SMark Cave-Ayland MemoryRegion decl_rom; 65db1015e9SEduardo Habkost }; 66fa2ba3b8SLaurent Vivier 67d2cf28a0SMark Cave-Ayland void nubus_set_irq(NubusDevice *nd, int level); 68d2cf28a0SMark Cave-Ayland 699bf674bcSMark Cave-Ayland struct NubusBridge { 709bf674bcSMark Cave-Ayland SysBusDevice parent_obj; 711fa04232SMark Cave-Ayland 72d585d89dSMark Cave-Ayland NubusBus bus; 739bf674bcSMark Cave-Ayland }; 749bf674bcSMark Cave-Ayland 75fa2ba3b8SLaurent Vivier #endif 76