12c6fe2e2SMarkus Armbruster #ifndef PPC_PNV_CHIP_H 22c6fe2e2SMarkus Armbruster #define PPC_PNV_CHIP_H 32c6fe2e2SMarkus Armbruster 42c6fe2e2SMarkus Armbruster #include "hw/pci-host/pnv_phb4.h" 553f18b3eSNicholas Piggin #include "hw/ppc/pnv_adu.h" 6de3ba0ccSNicholas Piggin #include "hw/ppc/pnv_chiptod.h" 72c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_core.h" 82c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_homer.h" 9c295d3b0SChalapathi V #include "hw/ppc/pnv_n1_chiplet.h" 102c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_lpc.h" 112c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_occ.h" 122c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_psi.h" 132c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_sbe.h" 142c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_xive.h" 155f066121SCédric Le Goater #include "hw/ppc/pnv_i2c.h" 162c6fe2e2SMarkus Armbruster #include "hw/sysbus.h" 172c6fe2e2SMarkus Armbruster 182c6fe2e2SMarkus Armbruster OBJECT_DECLARE_TYPE(PnvChip, PnvChipClass, 192c6fe2e2SMarkus Armbruster PNV_CHIP) 202c6fe2e2SMarkus Armbruster 212c6fe2e2SMarkus Armbruster struct PnvChip { 222c6fe2e2SMarkus Armbruster /*< private >*/ 232c6fe2e2SMarkus Armbruster SysBusDevice parent_obj; 242c6fe2e2SMarkus Armbruster 252c6fe2e2SMarkus Armbruster /*< public >*/ 262c6fe2e2SMarkus Armbruster uint32_t chip_id; 272c6fe2e2SMarkus Armbruster uint64_t ram_start; 282c6fe2e2SMarkus Armbruster uint64_t ram_size; 292c6fe2e2SMarkus Armbruster 30*c26504afSNicholas Piggin bool big_core; 312c6fe2e2SMarkus Armbruster uint32_t nr_cores; 322c6fe2e2SMarkus Armbruster uint32_t nr_threads; 332c6fe2e2SMarkus Armbruster uint64_t cores_mask; 342c6fe2e2SMarkus Armbruster PnvCore **cores; 352c6fe2e2SMarkus Armbruster 362c6fe2e2SMarkus Armbruster uint32_t num_pecs; 372c6fe2e2SMarkus Armbruster 382c6fe2e2SMarkus Armbruster MemoryRegion xscom_mmio; 392c6fe2e2SMarkus Armbruster MemoryRegion xscom; 402c6fe2e2SMarkus Armbruster AddressSpace xscom_as; 412c6fe2e2SMarkus Armbruster 422c6fe2e2SMarkus Armbruster MemoryRegion *fw_mr; 432c6fe2e2SMarkus Armbruster gchar *dt_isa_nodename; 442c6fe2e2SMarkus Armbruster }; 452c6fe2e2SMarkus Armbruster 462c6fe2e2SMarkus Armbruster #define TYPE_PNV8_CHIP "pnv8-chip" 472c6fe2e2SMarkus Armbruster DECLARE_INSTANCE_CHECKER(Pnv8Chip, PNV8_CHIP, 482c6fe2e2SMarkus Armbruster TYPE_PNV8_CHIP) 492c6fe2e2SMarkus Armbruster 502c6fe2e2SMarkus Armbruster struct Pnv8Chip { 512c6fe2e2SMarkus Armbruster /*< private >*/ 522c6fe2e2SMarkus Armbruster PnvChip parent_obj; 532c6fe2e2SMarkus Armbruster 542c6fe2e2SMarkus Armbruster /*< public >*/ 552c6fe2e2SMarkus Armbruster MemoryRegion icp_mmio; 562c6fe2e2SMarkus Armbruster 572c6fe2e2SMarkus Armbruster PnvLpcController lpc; 582c6fe2e2SMarkus Armbruster Pnv8Psi psi; 592c6fe2e2SMarkus Armbruster PnvOCC occ; 602c6fe2e2SMarkus Armbruster PnvHomer homer; 612c6fe2e2SMarkus Armbruster 622c6fe2e2SMarkus Armbruster #define PNV8_CHIP_PHB3_MAX 4 632c6fe2e2SMarkus Armbruster /* 642c6fe2e2SMarkus Armbruster * The array is used to allow quick access to the phbs by 652c6fe2e2SMarkus Armbruster * pnv_ics_get_child() and pnv_ics_resend_child(). 662c6fe2e2SMarkus Armbruster */ 672c6fe2e2SMarkus Armbruster PnvPHB *phbs[PNV8_CHIP_PHB3_MAX]; 682c6fe2e2SMarkus Armbruster uint32_t num_phbs; 692c6fe2e2SMarkus Armbruster 702c6fe2e2SMarkus Armbruster XICSFabric *xics; 712c6fe2e2SMarkus Armbruster }; 722c6fe2e2SMarkus Armbruster 732c6fe2e2SMarkus Armbruster #define TYPE_PNV9_CHIP "pnv9-chip" 742c6fe2e2SMarkus Armbruster DECLARE_INSTANCE_CHECKER(Pnv9Chip, PNV9_CHIP, 752c6fe2e2SMarkus Armbruster TYPE_PNV9_CHIP) 762c6fe2e2SMarkus Armbruster 772c6fe2e2SMarkus Armbruster struct Pnv9Chip { 782c6fe2e2SMarkus Armbruster /*< private >*/ 792c6fe2e2SMarkus Armbruster PnvChip parent_obj; 802c6fe2e2SMarkus Armbruster 812c6fe2e2SMarkus Armbruster /*< public >*/ 8253f18b3eSNicholas Piggin PnvADU adu; 832c6fe2e2SMarkus Armbruster PnvXive xive; 842c6fe2e2SMarkus Armbruster Pnv9Psi psi; 852c6fe2e2SMarkus Armbruster PnvLpcController lpc; 86de3ba0ccSNicholas Piggin PnvChipTOD chiptod; 872c6fe2e2SMarkus Armbruster PnvOCC occ; 882c6fe2e2SMarkus Armbruster PnvSBE sbe; 892c6fe2e2SMarkus Armbruster PnvHomer homer; 902c6fe2e2SMarkus Armbruster 912c6fe2e2SMarkus Armbruster uint32_t nr_quads; 922c6fe2e2SMarkus Armbruster PnvQuad *quads; 932c6fe2e2SMarkus Armbruster 942c6fe2e2SMarkus Armbruster #define PNV9_CHIP_MAX_PEC 3 952c6fe2e2SMarkus Armbruster PnvPhb4PecState pecs[PNV9_CHIP_MAX_PEC]; 965f066121SCédric Le Goater 970d1dcb0bSGlenn Miles #define PNV9_CHIP_MAX_I2C 4 985f066121SCédric Le Goater PnvI2C i2c[PNV9_CHIP_MAX_I2C]; 992c6fe2e2SMarkus Armbruster }; 1002c6fe2e2SMarkus Armbruster 1012c6fe2e2SMarkus Armbruster /* 1022c6fe2e2SMarkus Armbruster * A SMT8 fused core is a pair of SMT4 cores. 1032c6fe2e2SMarkus Armbruster */ 1042c6fe2e2SMarkus Armbruster #define PNV9_PIR2FUSEDCORE(pir) (((pir) >> 3) & 0xf) 1052c6fe2e2SMarkus Armbruster #define PNV9_PIR2CHIP(pir) (((pir) >> 8) & 0x7f) 1062c6fe2e2SMarkus Armbruster 1072c6fe2e2SMarkus Armbruster #define TYPE_PNV10_CHIP "pnv10-chip" 1082c6fe2e2SMarkus Armbruster DECLARE_INSTANCE_CHECKER(Pnv10Chip, PNV10_CHIP, 1092c6fe2e2SMarkus Armbruster TYPE_PNV10_CHIP) 1102c6fe2e2SMarkus Armbruster 1112c6fe2e2SMarkus Armbruster struct Pnv10Chip { 1122c6fe2e2SMarkus Armbruster /*< private >*/ 1132c6fe2e2SMarkus Armbruster PnvChip parent_obj; 1142c6fe2e2SMarkus Armbruster 1152c6fe2e2SMarkus Armbruster /*< public >*/ 11653f18b3eSNicholas Piggin PnvADU adu; 1172c6fe2e2SMarkus Armbruster PnvXive2 xive; 1182c6fe2e2SMarkus Armbruster Pnv9Psi psi; 1192c6fe2e2SMarkus Armbruster PnvLpcController lpc; 120de3ba0ccSNicholas Piggin PnvChipTOD chiptod; 1212c6fe2e2SMarkus Armbruster PnvOCC occ; 1222c6fe2e2SMarkus Armbruster PnvSBE sbe; 1232c6fe2e2SMarkus Armbruster PnvHomer homer; 124c295d3b0SChalapathi V PnvN1Chiplet n1_chiplet; 1252c6fe2e2SMarkus Armbruster 1262c6fe2e2SMarkus Armbruster uint32_t nr_quads; 1272c6fe2e2SMarkus Armbruster PnvQuad *quads; 1282c6fe2e2SMarkus Armbruster 1292c6fe2e2SMarkus Armbruster #define PNV10_CHIP_MAX_PEC 2 1302c6fe2e2SMarkus Armbruster PnvPhb4PecState pecs[PNV10_CHIP_MAX_PEC]; 1311ceda19cSGlenn Miles 1321ceda19cSGlenn Miles #define PNV10_CHIP_MAX_I2C 4 1331ceda19cSGlenn Miles PnvI2C i2c[PNV10_CHIP_MAX_I2C]; 1342c6fe2e2SMarkus Armbruster }; 1352c6fe2e2SMarkus Armbruster 1362c6fe2e2SMarkus Armbruster #define PNV10_PIR2FUSEDCORE(pir) (((pir) >> 3) & 0xf) 1372c6fe2e2SMarkus Armbruster #define PNV10_PIR2CHIP(pir) (((pir) >> 8) & 0x7f) 1382c6fe2e2SMarkus Armbruster 1392c6fe2e2SMarkus Armbruster struct PnvChipClass { 1402c6fe2e2SMarkus Armbruster /*< private >*/ 1412c6fe2e2SMarkus Armbruster SysBusDeviceClass parent_class; 1422c6fe2e2SMarkus Armbruster 1432c6fe2e2SMarkus Armbruster /*< public >*/ 1442c6fe2e2SMarkus Armbruster uint64_t chip_cfam_id; 1452c6fe2e2SMarkus Armbruster uint64_t cores_mask; 1462c6fe2e2SMarkus Armbruster uint32_t num_pecs; 1472c6fe2e2SMarkus Armbruster uint32_t num_phbs; 1482c6fe2e2SMarkus Armbruster 1495f066121SCédric Le Goater uint32_t i2c_num_engines; 1500d1dcb0bSGlenn Miles const int *i2c_ports_per_engine; 1515f066121SCédric Le Goater 1522c6fe2e2SMarkus Armbruster DeviceRealize parent_realize; 1532c6fe2e2SMarkus Armbruster 15425de2822SNicholas Piggin /* Get PIR and TIR values for a CPU thread identified by core/thread id */ 15525de2822SNicholas Piggin void (*get_pir_tir)(PnvChip *chip, uint32_t core_id, uint32_t thread_id, 15625de2822SNicholas Piggin uint32_t *pir, uint32_t *tir); 1572c6fe2e2SMarkus Armbruster void (*intc_create)(PnvChip *chip, PowerPCCPU *cpu, Error **errp); 1582c6fe2e2SMarkus Armbruster void (*intc_reset)(PnvChip *chip, PowerPCCPU *cpu); 1592c6fe2e2SMarkus Armbruster void (*intc_destroy)(PnvChip *chip, PowerPCCPU *cpu); 160ae08259bSPhilippe Mathieu-Daudé void (*intc_print_info)(PnvChip *chip, PowerPCCPU *cpu, GString *buf); 1612c6fe2e2SMarkus Armbruster ISABus *(*isa_create)(PnvChip *chip, Error **errp); 1622c6fe2e2SMarkus Armbruster void (*dt_populate)(PnvChip *chip, void *fdt); 163a58e653aSPhilippe Mathieu-Daudé void (*pic_print_info)(PnvChip *chip, GString *buf); 1642c6fe2e2SMarkus Armbruster uint64_t (*xscom_core_base)(PnvChip *chip, uint32_t core_id); 1652c6fe2e2SMarkus Armbruster uint32_t (*xscom_pcba)(PnvChip *chip, uint64_t addr); 1662c6fe2e2SMarkus Armbruster }; 1672c6fe2e2SMarkus Armbruster 1682c6fe2e2SMarkus Armbruster #endif 169