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 302c6fe2e2SMarkus Armbruster uint32_t nr_cores; 312c6fe2e2SMarkus Armbruster uint32_t nr_threads; 322c6fe2e2SMarkus Armbruster uint64_t cores_mask; 332c6fe2e2SMarkus Armbruster PnvCore **cores; 342c6fe2e2SMarkus Armbruster 352c6fe2e2SMarkus Armbruster uint32_t num_pecs; 362c6fe2e2SMarkus Armbruster 372c6fe2e2SMarkus Armbruster MemoryRegion xscom_mmio; 382c6fe2e2SMarkus Armbruster MemoryRegion xscom; 392c6fe2e2SMarkus Armbruster AddressSpace xscom_as; 402c6fe2e2SMarkus Armbruster 412c6fe2e2SMarkus Armbruster MemoryRegion *fw_mr; 422c6fe2e2SMarkus Armbruster gchar *dt_isa_nodename; 432c6fe2e2SMarkus Armbruster }; 442c6fe2e2SMarkus Armbruster 452c6fe2e2SMarkus Armbruster #define TYPE_PNV8_CHIP "pnv8-chip" 462c6fe2e2SMarkus Armbruster DECLARE_INSTANCE_CHECKER(Pnv8Chip, PNV8_CHIP, 472c6fe2e2SMarkus Armbruster TYPE_PNV8_CHIP) 482c6fe2e2SMarkus Armbruster 492c6fe2e2SMarkus Armbruster struct Pnv8Chip { 502c6fe2e2SMarkus Armbruster /*< private >*/ 512c6fe2e2SMarkus Armbruster PnvChip parent_obj; 522c6fe2e2SMarkus Armbruster 532c6fe2e2SMarkus Armbruster /*< public >*/ 542c6fe2e2SMarkus Armbruster MemoryRegion icp_mmio; 552c6fe2e2SMarkus Armbruster 562c6fe2e2SMarkus Armbruster PnvLpcController lpc; 572c6fe2e2SMarkus Armbruster Pnv8Psi psi; 582c6fe2e2SMarkus Armbruster PnvOCC occ; 592c6fe2e2SMarkus Armbruster PnvHomer homer; 602c6fe2e2SMarkus Armbruster 612c6fe2e2SMarkus Armbruster #define PNV8_CHIP_PHB3_MAX 4 622c6fe2e2SMarkus Armbruster /* 632c6fe2e2SMarkus Armbruster * The array is used to allow quick access to the phbs by 642c6fe2e2SMarkus Armbruster * pnv_ics_get_child() and pnv_ics_resend_child(). 652c6fe2e2SMarkus Armbruster */ 662c6fe2e2SMarkus Armbruster PnvPHB *phbs[PNV8_CHIP_PHB3_MAX]; 672c6fe2e2SMarkus Armbruster uint32_t num_phbs; 682c6fe2e2SMarkus Armbruster 692c6fe2e2SMarkus Armbruster XICSFabric *xics; 702c6fe2e2SMarkus Armbruster }; 712c6fe2e2SMarkus Armbruster 722c6fe2e2SMarkus Armbruster #define TYPE_PNV9_CHIP "pnv9-chip" 732c6fe2e2SMarkus Armbruster DECLARE_INSTANCE_CHECKER(Pnv9Chip, PNV9_CHIP, 742c6fe2e2SMarkus Armbruster TYPE_PNV9_CHIP) 752c6fe2e2SMarkus Armbruster 762c6fe2e2SMarkus Armbruster struct Pnv9Chip { 772c6fe2e2SMarkus Armbruster /*< private >*/ 782c6fe2e2SMarkus Armbruster PnvChip parent_obj; 792c6fe2e2SMarkus Armbruster 802c6fe2e2SMarkus Armbruster /*< public >*/ 8153f18b3eSNicholas Piggin PnvADU adu; 822c6fe2e2SMarkus Armbruster PnvXive xive; 832c6fe2e2SMarkus Armbruster Pnv9Psi psi; 842c6fe2e2SMarkus Armbruster PnvLpcController lpc; 85de3ba0ccSNicholas Piggin PnvChipTOD chiptod; 862c6fe2e2SMarkus Armbruster PnvOCC occ; 872c6fe2e2SMarkus Armbruster PnvSBE sbe; 882c6fe2e2SMarkus Armbruster PnvHomer homer; 892c6fe2e2SMarkus Armbruster 902c6fe2e2SMarkus Armbruster uint32_t nr_quads; 912c6fe2e2SMarkus Armbruster PnvQuad *quads; 922c6fe2e2SMarkus Armbruster 932c6fe2e2SMarkus Armbruster #define PNV9_CHIP_MAX_PEC 3 942c6fe2e2SMarkus Armbruster PnvPhb4PecState pecs[PNV9_CHIP_MAX_PEC]; 955f066121SCédric Le Goater 960d1dcb0bSGlenn Miles #define PNV9_CHIP_MAX_I2C 4 975f066121SCédric Le Goater PnvI2C i2c[PNV9_CHIP_MAX_I2C]; 982c6fe2e2SMarkus Armbruster }; 992c6fe2e2SMarkus Armbruster 1002c6fe2e2SMarkus Armbruster /* 1012c6fe2e2SMarkus Armbruster * A SMT8 fused core is a pair of SMT4 cores. 1022c6fe2e2SMarkus Armbruster */ 1032c6fe2e2SMarkus Armbruster #define PNV9_PIR2FUSEDCORE(pir) (((pir) >> 3) & 0xf) 1042c6fe2e2SMarkus Armbruster #define PNV9_PIR2CHIP(pir) (((pir) >> 8) & 0x7f) 1052c6fe2e2SMarkus Armbruster 1062c6fe2e2SMarkus Armbruster #define TYPE_PNV10_CHIP "pnv10-chip" 1072c6fe2e2SMarkus Armbruster DECLARE_INSTANCE_CHECKER(Pnv10Chip, PNV10_CHIP, 1082c6fe2e2SMarkus Armbruster TYPE_PNV10_CHIP) 1092c6fe2e2SMarkus Armbruster 1102c6fe2e2SMarkus Armbruster struct Pnv10Chip { 1112c6fe2e2SMarkus Armbruster /*< private >*/ 1122c6fe2e2SMarkus Armbruster PnvChip parent_obj; 1132c6fe2e2SMarkus Armbruster 1142c6fe2e2SMarkus Armbruster /*< public >*/ 11553f18b3eSNicholas Piggin PnvADU adu; 1162c6fe2e2SMarkus Armbruster PnvXive2 xive; 1172c6fe2e2SMarkus Armbruster Pnv9Psi psi; 1182c6fe2e2SMarkus Armbruster PnvLpcController lpc; 119de3ba0ccSNicholas Piggin PnvChipTOD chiptod; 1202c6fe2e2SMarkus Armbruster PnvOCC occ; 1212c6fe2e2SMarkus Armbruster PnvSBE sbe; 1222c6fe2e2SMarkus Armbruster PnvHomer homer; 123c295d3b0SChalapathi V PnvN1Chiplet n1_chiplet; 1242c6fe2e2SMarkus Armbruster 1252c6fe2e2SMarkus Armbruster uint32_t nr_quads; 1262c6fe2e2SMarkus Armbruster PnvQuad *quads; 1272c6fe2e2SMarkus Armbruster 1282c6fe2e2SMarkus Armbruster #define PNV10_CHIP_MAX_PEC 2 1292c6fe2e2SMarkus Armbruster PnvPhb4PecState pecs[PNV10_CHIP_MAX_PEC]; 1301ceda19cSGlenn Miles 1311ceda19cSGlenn Miles #define PNV10_CHIP_MAX_I2C 4 1321ceda19cSGlenn Miles PnvI2C i2c[PNV10_CHIP_MAX_I2C]; 1332c6fe2e2SMarkus Armbruster }; 1342c6fe2e2SMarkus Armbruster 1352c6fe2e2SMarkus Armbruster #define PNV10_PIR2FUSEDCORE(pir) (((pir) >> 3) & 0xf) 1362c6fe2e2SMarkus Armbruster #define PNV10_PIR2CHIP(pir) (((pir) >> 8) & 0x7f) 1372c6fe2e2SMarkus Armbruster 1382c6fe2e2SMarkus Armbruster struct PnvChipClass { 1392c6fe2e2SMarkus Armbruster /*< private >*/ 1402c6fe2e2SMarkus Armbruster SysBusDeviceClass parent_class; 1412c6fe2e2SMarkus Armbruster 1422c6fe2e2SMarkus Armbruster /*< public >*/ 1432c6fe2e2SMarkus Armbruster uint64_t chip_cfam_id; 1442c6fe2e2SMarkus Armbruster uint64_t cores_mask; 1452c6fe2e2SMarkus Armbruster uint32_t num_pecs; 1462c6fe2e2SMarkus Armbruster uint32_t num_phbs; 1472c6fe2e2SMarkus Armbruster 1485f066121SCédric Le Goater uint32_t i2c_num_engines; 1490d1dcb0bSGlenn Miles const int *i2c_ports_per_engine; 1505f066121SCédric Le Goater 1512c6fe2e2SMarkus Armbruster DeviceRealize parent_realize; 1522c6fe2e2SMarkus Armbruster 153*25de2822SNicholas Piggin /* Get PIR and TIR values for a CPU thread identified by core/thread id */ 154*25de2822SNicholas Piggin void (*get_pir_tir)(PnvChip *chip, uint32_t core_id, uint32_t thread_id, 155*25de2822SNicholas Piggin uint32_t *pir, uint32_t *tir); 1562c6fe2e2SMarkus Armbruster void (*intc_create)(PnvChip *chip, PowerPCCPU *cpu, Error **errp); 1572c6fe2e2SMarkus Armbruster void (*intc_reset)(PnvChip *chip, PowerPCCPU *cpu); 1582c6fe2e2SMarkus Armbruster void (*intc_destroy)(PnvChip *chip, PowerPCCPU *cpu); 159ae08259bSPhilippe Mathieu-Daudé void (*intc_print_info)(PnvChip *chip, PowerPCCPU *cpu, GString *buf); 1602c6fe2e2SMarkus Armbruster ISABus *(*isa_create)(PnvChip *chip, Error **errp); 1612c6fe2e2SMarkus Armbruster void (*dt_populate)(PnvChip *chip, void *fdt); 162a58e653aSPhilippe Mathieu-Daudé void (*pic_print_info)(PnvChip *chip, GString *buf); 1632c6fe2e2SMarkus Armbruster uint64_t (*xscom_core_base)(PnvChip *chip, uint32_t core_id); 1642c6fe2e2SMarkus Armbruster uint32_t (*xscom_pcba)(PnvChip *chip, uint64_t addr); 1652c6fe2e2SMarkus Armbruster }; 1662c6fe2e2SMarkus Armbruster 1672c6fe2e2SMarkus Armbruster #endif 168