1121d0712SMarkus Armbruster #ifndef PCI_HOST_APB_H 2121d0712SMarkus Armbruster #define PCI_HOST_APB_H 318e08a55SMichael S. Tsirkin 418e08a55SMichael S. Tsirkin #include "qemu-common.h" 5*28edc7c9SMark Cave-Ayland #include "hw/pci/pci_host.h" 6*28edc7c9SMark Cave-Ayland 7*28edc7c9SMark Cave-Ayland #define IOMMU_NREGS 3 8*28edc7c9SMark Cave-Ayland 9*28edc7c9SMark Cave-Ayland #define IOMMU_PAGE_SIZE_8K (1ULL << 13) 10*28edc7c9SMark Cave-Ayland #define IOMMU_PAGE_MASK_8K (~(IOMMU_PAGE_SIZE_8K - 1)) 11*28edc7c9SMark Cave-Ayland #define IOMMU_PAGE_SIZE_64K (1ULL << 16) 12*28edc7c9SMark Cave-Ayland #define IOMMU_PAGE_MASK_64K (~(IOMMU_PAGE_SIZE_64K - 1)) 13*28edc7c9SMark Cave-Ayland 14*28edc7c9SMark Cave-Ayland #define IOMMU_CTRL 0x0 15*28edc7c9SMark Cave-Ayland #define IOMMU_CTRL_TBW_SIZE (1ULL << 2) 16*28edc7c9SMark Cave-Ayland #define IOMMU_CTRL_MMU_EN (1ULL) 17*28edc7c9SMark Cave-Ayland 18*28edc7c9SMark Cave-Ayland #define IOMMU_CTRL_TSB_SHIFT 16 19*28edc7c9SMark Cave-Ayland 20*28edc7c9SMark Cave-Ayland #define IOMMU_BASE 0x8 21*28edc7c9SMark Cave-Ayland #define IOMMU_FLUSH 0x10 22*28edc7c9SMark Cave-Ayland 23*28edc7c9SMark Cave-Ayland #define IOMMU_TTE_DATA_V (1ULL << 63) 24*28edc7c9SMark Cave-Ayland #define IOMMU_TTE_DATA_SIZE (1ULL << 61) 25*28edc7c9SMark Cave-Ayland #define IOMMU_TTE_DATA_W (1ULL << 1) 26*28edc7c9SMark Cave-Ayland 27*28edc7c9SMark Cave-Ayland #define IOMMU_TTE_PHYS_MASK_8K 0x1ffffffe000ULL 28*28edc7c9SMark Cave-Ayland #define IOMMU_TTE_PHYS_MASK_64K 0x1ffffff8000ULL 29*28edc7c9SMark Cave-Ayland 30*28edc7c9SMark Cave-Ayland #define IOMMU_TSB_8K_OFFSET_MASK_8M 0x00000000007fe000ULL 31*28edc7c9SMark Cave-Ayland #define IOMMU_TSB_8K_OFFSET_MASK_16M 0x0000000000ffe000ULL 32*28edc7c9SMark Cave-Ayland #define IOMMU_TSB_8K_OFFSET_MASK_32M 0x0000000001ffe000ULL 33*28edc7c9SMark Cave-Ayland #define IOMMU_TSB_8K_OFFSET_MASK_64M 0x0000000003ffe000ULL 34*28edc7c9SMark Cave-Ayland #define IOMMU_TSB_8K_OFFSET_MASK_128M 0x0000000007ffe000ULL 35*28edc7c9SMark Cave-Ayland #define IOMMU_TSB_8K_OFFSET_MASK_256M 0x000000000fffe000ULL 36*28edc7c9SMark Cave-Ayland #define IOMMU_TSB_8K_OFFSET_MASK_512M 0x000000001fffe000ULL 37*28edc7c9SMark Cave-Ayland #define IOMMU_TSB_8K_OFFSET_MASK_1G 0x000000003fffe000ULL 38*28edc7c9SMark Cave-Ayland 39*28edc7c9SMark Cave-Ayland #define IOMMU_TSB_64K_OFFSET_MASK_64M 0x0000000003ff0000ULL 40*28edc7c9SMark Cave-Ayland #define IOMMU_TSB_64K_OFFSET_MASK_128M 0x0000000007ff0000ULL 41*28edc7c9SMark Cave-Ayland #define IOMMU_TSB_64K_OFFSET_MASK_256M 0x000000000fff0000ULL 42*28edc7c9SMark Cave-Ayland #define IOMMU_TSB_64K_OFFSET_MASK_512M 0x000000001fff0000ULL 43*28edc7c9SMark Cave-Ayland #define IOMMU_TSB_64K_OFFSET_MASK_1G 0x000000003fff0000ULL 44*28edc7c9SMark Cave-Ayland #define IOMMU_TSB_64K_OFFSET_MASK_2G 0x000000007fff0000ULL 45*28edc7c9SMark Cave-Ayland 46*28edc7c9SMark Cave-Ayland typedef struct IOMMUState { 47*28edc7c9SMark Cave-Ayland AddressSpace iommu_as; 48*28edc7c9SMark Cave-Ayland IOMMUMemoryRegion iommu; 49*28edc7c9SMark Cave-Ayland 50*28edc7c9SMark Cave-Ayland uint64_t regs[IOMMU_NREGS]; 51*28edc7c9SMark Cave-Ayland } IOMMUState; 52*28edc7c9SMark Cave-Ayland 53*28edc7c9SMark Cave-Ayland #define TYPE_APB "pbm" 54*28edc7c9SMark Cave-Ayland 55*28edc7c9SMark Cave-Ayland #define APB_DEVICE(obj) \ 56*28edc7c9SMark Cave-Ayland OBJECT_CHECK(APBState, (obj), TYPE_APB) 57*28edc7c9SMark Cave-Ayland 58*28edc7c9SMark Cave-Ayland #define TYPE_APB_IOMMU_MEMORY_REGION "pbm-iommu-memory-region" 59*28edc7c9SMark Cave-Ayland 60*28edc7c9SMark Cave-Ayland typedef struct APBState { 61*28edc7c9SMark Cave-Ayland PCIHostState parent_obj; 62*28edc7c9SMark Cave-Ayland 63*28edc7c9SMark Cave-Ayland MemoryRegion apb_config; 64*28edc7c9SMark Cave-Ayland MemoryRegion pci_config; 65*28edc7c9SMark Cave-Ayland MemoryRegion pci_mmio; 66*28edc7c9SMark Cave-Ayland MemoryRegion pci_ioport; 67*28edc7c9SMark Cave-Ayland uint64_t pci_irq_in; 68*28edc7c9SMark Cave-Ayland IOMMUState iommu; 69*28edc7c9SMark Cave-Ayland uint32_t pci_control[16]; 70*28edc7c9SMark Cave-Ayland uint32_t pci_irq_map[8]; 71*28edc7c9SMark Cave-Ayland uint32_t pci_err_irq_map[4]; 72*28edc7c9SMark Cave-Ayland uint32_t obio_irq_map[32]; 73*28edc7c9SMark Cave-Ayland qemu_irq *pbm_irqs; 74*28edc7c9SMark Cave-Ayland qemu_irq *ivec_irqs; 75*28edc7c9SMark Cave-Ayland unsigned int irq_request; 76*28edc7c9SMark Cave-Ayland uint32_t reset_control; 77*28edc7c9SMark Cave-Ayland unsigned int nr_resets; 78*28edc7c9SMark Cave-Ayland } APBState; 79*28edc7c9SMark Cave-Ayland 80*28edc7c9SMark Cave-Ayland typedef struct PBMPCIBridge { 81*28edc7c9SMark Cave-Ayland /*< private >*/ 82*28edc7c9SMark Cave-Ayland PCIBridge parent_obj; 83*28edc7c9SMark Cave-Ayland 84*28edc7c9SMark Cave-Ayland /* Is this busA with in-built devices (ebus)? */ 85*28edc7c9SMark Cave-Ayland bool busA; 86*28edc7c9SMark Cave-Ayland } PBMPCIBridge; 87*28edc7c9SMark Cave-Ayland 88*28edc7c9SMark Cave-Ayland #define TYPE_PBM_PCI_BRIDGE "pbm-bridge" 89*28edc7c9SMark Cave-Ayland #define PBM_PCI_BRIDGE(obj) \ 90*28edc7c9SMark Cave-Ayland OBJECT_CHECK(PBMPCIBridge, (obj), TYPE_PBM_PCI_BRIDGE) 9118e08a55SMichael S. Tsirkin 92a8170e5eSAvi Kivity PCIBus *pci_apb_init(hwaddr special_base, 93a8170e5eSAvi Kivity hwaddr mem_base, 94361dea40SBlue Swirl qemu_irq *ivec_irqs, PCIBus **bus2, PCIBus **bus3, 95361dea40SBlue Swirl qemu_irq **pbm_irqs); 9618e08a55SMichael S. Tsirkin #endif 97