xref: /qemu/include/hw/pci-host/sabre.h (revision 2a4d6af51b8330bfd7a7dd677927b8dd2f5f5f08)
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 
53*2a4d6af5SMark Cave-Ayland #define MAX_IVEC 0x40
54*2a4d6af5SMark Cave-Ayland 
5528edc7c9SMark Cave-Ayland #define TYPE_APB "pbm"
5628edc7c9SMark Cave-Ayland 
5728edc7c9SMark Cave-Ayland #define APB_DEVICE(obj) \
5828edc7c9SMark Cave-Ayland     OBJECT_CHECK(APBState, (obj), TYPE_APB)
5928edc7c9SMark Cave-Ayland 
6028edc7c9SMark Cave-Ayland #define TYPE_APB_IOMMU_MEMORY_REGION "pbm-iommu-memory-region"
6128edc7c9SMark Cave-Ayland 
6228edc7c9SMark Cave-Ayland typedef struct APBState {
6328edc7c9SMark Cave-Ayland     PCIHostState parent_obj;
6428edc7c9SMark Cave-Ayland 
6528edc7c9SMark Cave-Ayland     MemoryRegion apb_config;
6628edc7c9SMark Cave-Ayland     MemoryRegion pci_config;
6728edc7c9SMark Cave-Ayland     MemoryRegion pci_mmio;
6828edc7c9SMark Cave-Ayland     MemoryRegion pci_ioport;
6928edc7c9SMark Cave-Ayland     uint64_t pci_irq_in;
7028edc7c9SMark Cave-Ayland     IOMMUState iommu;
7128edc7c9SMark Cave-Ayland     uint32_t pci_control[16];
7228edc7c9SMark Cave-Ayland     uint32_t pci_irq_map[8];
7328edc7c9SMark Cave-Ayland     uint32_t pci_err_irq_map[4];
7428edc7c9SMark Cave-Ayland     uint32_t obio_irq_map[32];
7528edc7c9SMark Cave-Ayland     qemu_irq *pbm_irqs;
76*2a4d6af5SMark Cave-Ayland     qemu_irq ivec_irqs[MAX_IVEC];
7728edc7c9SMark Cave-Ayland     unsigned int irq_request;
7828edc7c9SMark Cave-Ayland     uint32_t reset_control;
7928edc7c9SMark Cave-Ayland     unsigned int nr_resets;
8028edc7c9SMark Cave-Ayland } APBState;
8128edc7c9SMark Cave-Ayland 
8228edc7c9SMark Cave-Ayland typedef struct PBMPCIBridge {
8328edc7c9SMark Cave-Ayland     /*< private >*/
8428edc7c9SMark Cave-Ayland     PCIBridge parent_obj;
8528edc7c9SMark Cave-Ayland 
8628edc7c9SMark Cave-Ayland     /* Is this busA with in-built devices (ebus)? */
8728edc7c9SMark Cave-Ayland     bool busA;
8828edc7c9SMark Cave-Ayland } PBMPCIBridge;
8928edc7c9SMark Cave-Ayland 
9028edc7c9SMark Cave-Ayland #define TYPE_PBM_PCI_BRIDGE "pbm-bridge"
9128edc7c9SMark Cave-Ayland #define PBM_PCI_BRIDGE(obj) \
9228edc7c9SMark Cave-Ayland     OBJECT_CHECK(PBMPCIBridge, (obj), TYPE_PBM_PCI_BRIDGE)
9318e08a55SMichael S. Tsirkin 
94588978c0SMark Cave-Ayland APBState *pci_apb_init(hwaddr special_base,
95a8170e5eSAvi Kivity                        hwaddr mem_base,
96*2a4d6af5SMark Cave-Ayland                        PCIBus **bus2, PCIBus **bus3);
9718e08a55SMichael S. Tsirkin #endif
98