xref: /qemu/include/hw/pci-host/sabre.h (revision a5546222e3eafc9b6bc784c1bffbc8e1614d5e5b)
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