1121d0712SMarkus Armbruster #ifndef PCI_HOST_APB_H 2121d0712SMarkus Armbruster #define PCI_HOST_APB_H 318e08a55SMichael S. Tsirkin 418e08a55SMichael S. Tsirkin #include "qemu-common.h" 528edc7c9SMark Cave-Ayland #include "hw/pci/pci_host.h" 628edc7c9SMark Cave-Ayland 728edc7c9SMark Cave-Ayland #define IOMMU_NREGS 3 828edc7c9SMark Cave-Ayland 928edc7c9SMark Cave-Ayland #define IOMMU_PAGE_SIZE_8K (1ULL << 13) 1028edc7c9SMark Cave-Ayland #define IOMMU_PAGE_MASK_8K (~(IOMMU_PAGE_SIZE_8K - 1)) 1128edc7c9SMark Cave-Ayland #define IOMMU_PAGE_SIZE_64K (1ULL << 16) 1228edc7c9SMark Cave-Ayland #define IOMMU_PAGE_MASK_64K (~(IOMMU_PAGE_SIZE_64K - 1)) 1328edc7c9SMark Cave-Ayland 1428edc7c9SMark Cave-Ayland #define IOMMU_CTRL 0x0 1528edc7c9SMark Cave-Ayland #define IOMMU_CTRL_TBW_SIZE (1ULL << 2) 1628edc7c9SMark Cave-Ayland #define IOMMU_CTRL_MMU_EN (1ULL) 1728edc7c9SMark Cave-Ayland 1828edc7c9SMark Cave-Ayland #define IOMMU_CTRL_TSB_SHIFT 16 1928edc7c9SMark Cave-Ayland 2028edc7c9SMark Cave-Ayland #define IOMMU_BASE 0x8 2128edc7c9SMark Cave-Ayland #define IOMMU_FLUSH 0x10 2228edc7c9SMark Cave-Ayland 2328edc7c9SMark Cave-Ayland #define IOMMU_TTE_DATA_V (1ULL << 63) 2428edc7c9SMark Cave-Ayland #define IOMMU_TTE_DATA_SIZE (1ULL << 61) 2528edc7c9SMark Cave-Ayland #define IOMMU_TTE_DATA_W (1ULL << 1) 2628edc7c9SMark Cave-Ayland 2728edc7c9SMark Cave-Ayland #define IOMMU_TTE_PHYS_MASK_8K 0x1ffffffe000ULL 2828edc7c9SMark Cave-Ayland #define IOMMU_TTE_PHYS_MASK_64K 0x1ffffff8000ULL 2928edc7c9SMark Cave-Ayland 3028edc7c9SMark Cave-Ayland #define IOMMU_TSB_8K_OFFSET_MASK_8M 0x00000000007fe000ULL 3128edc7c9SMark Cave-Ayland #define IOMMU_TSB_8K_OFFSET_MASK_16M 0x0000000000ffe000ULL 3228edc7c9SMark Cave-Ayland #define IOMMU_TSB_8K_OFFSET_MASK_32M 0x0000000001ffe000ULL 3328edc7c9SMark Cave-Ayland #define IOMMU_TSB_8K_OFFSET_MASK_64M 0x0000000003ffe000ULL 3428edc7c9SMark Cave-Ayland #define IOMMU_TSB_8K_OFFSET_MASK_128M 0x0000000007ffe000ULL 3528edc7c9SMark Cave-Ayland #define IOMMU_TSB_8K_OFFSET_MASK_256M 0x000000000fffe000ULL 3628edc7c9SMark Cave-Ayland #define IOMMU_TSB_8K_OFFSET_MASK_512M 0x000000001fffe000ULL 3728edc7c9SMark Cave-Ayland #define IOMMU_TSB_8K_OFFSET_MASK_1G 0x000000003fffe000ULL 3828edc7c9SMark Cave-Ayland 3928edc7c9SMark Cave-Ayland #define IOMMU_TSB_64K_OFFSET_MASK_64M 0x0000000003ff0000ULL 4028edc7c9SMark Cave-Ayland #define IOMMU_TSB_64K_OFFSET_MASK_128M 0x0000000007ff0000ULL 4128edc7c9SMark Cave-Ayland #define IOMMU_TSB_64K_OFFSET_MASK_256M 0x000000000fff0000ULL 4228edc7c9SMark Cave-Ayland #define IOMMU_TSB_64K_OFFSET_MASK_512M 0x000000001fff0000ULL 4328edc7c9SMark Cave-Ayland #define IOMMU_TSB_64K_OFFSET_MASK_1G 0x000000003fff0000ULL 4428edc7c9SMark Cave-Ayland #define IOMMU_TSB_64K_OFFSET_MASK_2G 0x000000007fff0000ULL 4528edc7c9SMark Cave-Ayland 4628edc7c9SMark Cave-Ayland typedef struct IOMMUState { 4728edc7c9SMark Cave-Ayland AddressSpace iommu_as; 4828edc7c9SMark Cave-Ayland IOMMUMemoryRegion iommu; 4928edc7c9SMark Cave-Ayland 5028edc7c9SMark Cave-Ayland uint64_t regs[IOMMU_NREGS]; 5128edc7c9SMark Cave-Ayland } IOMMUState; 5228edc7c9SMark Cave-Ayland 532a4d6af5SMark Cave-Ayland #define MAX_IVEC 0x40 542a4d6af5SMark Cave-Ayland 554b10c8d7SMark Cave-Ayland /* OBIO IVEC IRQs */ 56*a5546222SMark Cave-Ayland #define OBIO_HDD_IRQ 0x20 57*a5546222SMark Cave-Ayland #define OBIO_NIC_IRQ 0x21 584b10c8d7SMark Cave-Ayland #define OBIO_LPT_IRQ 0x22 594b10c8d7SMark Cave-Ayland #define OBIO_FDD_IRQ 0x27 604b10c8d7SMark Cave-Ayland #define OBIO_KBD_IRQ 0x29 614b10c8d7SMark Cave-Ayland #define OBIO_MSE_IRQ 0x2a 624b10c8d7SMark Cave-Ayland #define OBIO_SER_IRQ 0x2b 634b10c8d7SMark Cave-Ayland 6428edc7c9SMark Cave-Ayland #define TYPE_APB "pbm" 6528edc7c9SMark Cave-Ayland 6628edc7c9SMark Cave-Ayland #define APB_DEVICE(obj) \ 6728edc7c9SMark Cave-Ayland OBJECT_CHECK(APBState, (obj), TYPE_APB) 6828edc7c9SMark Cave-Ayland 6928edc7c9SMark Cave-Ayland #define TYPE_APB_IOMMU_MEMORY_REGION "pbm-iommu-memory-region" 7028edc7c9SMark Cave-Ayland 7128edc7c9SMark Cave-Ayland typedef struct APBState { 7228edc7c9SMark Cave-Ayland PCIHostState parent_obj; 7328edc7c9SMark Cave-Ayland 74cacd0580SMark Cave-Ayland hwaddr special_base; 75cacd0580SMark Cave-Ayland hwaddr mem_base; 7628edc7c9SMark Cave-Ayland MemoryRegion apb_config; 7728edc7c9SMark Cave-Ayland MemoryRegion pci_config; 7828edc7c9SMark Cave-Ayland MemoryRegion pci_mmio; 7928edc7c9SMark Cave-Ayland MemoryRegion pci_ioport; 8028edc7c9SMark Cave-Ayland uint64_t pci_irq_in; 8128edc7c9SMark Cave-Ayland IOMMUState iommu; 824272ad40SMark Cave-Ayland PCIBridge *bridgeA; 834272ad40SMark Cave-Ayland PCIBridge *bridgeB; 8428edc7c9SMark Cave-Ayland uint32_t pci_control[16]; 8528edc7c9SMark Cave-Ayland uint32_t pci_irq_map[8]; 8628edc7c9SMark Cave-Ayland uint32_t pci_err_irq_map[4]; 8728edc7c9SMark Cave-Ayland uint32_t obio_irq_map[32]; 882a4d6af5SMark Cave-Ayland qemu_irq ivec_irqs[MAX_IVEC]; 8928edc7c9SMark Cave-Ayland unsigned int irq_request; 9028edc7c9SMark Cave-Ayland uint32_t reset_control; 9128edc7c9SMark Cave-Ayland unsigned int nr_resets; 9228edc7c9SMark Cave-Ayland } APBState; 9328edc7c9SMark Cave-Ayland 9428edc7c9SMark Cave-Ayland typedef struct PBMPCIBridge { 9528edc7c9SMark Cave-Ayland /*< private >*/ 9628edc7c9SMark Cave-Ayland PCIBridge parent_obj; 9728edc7c9SMark Cave-Ayland } PBMPCIBridge; 9828edc7c9SMark Cave-Ayland 9928edc7c9SMark Cave-Ayland #define TYPE_PBM_PCI_BRIDGE "pbm-bridge" 10028edc7c9SMark Cave-Ayland #define PBM_PCI_BRIDGE(obj) \ 10128edc7c9SMark Cave-Ayland OBJECT_CHECK(PBMPCIBridge, (obj), TYPE_PBM_PCI_BRIDGE) 10218e08a55SMichael S. Tsirkin 10318e08a55SMichael S. Tsirkin #endif 104