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" 10bb44dc48SChalapathi V #include "hw/ssi/pnv_spi.h" 112c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_lpc.h" 122c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_occ.h" 132c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_psi.h" 142c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_sbe.h" 152c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_xive.h" 165f066121SCédric Le Goater #include "hw/ppc/pnv_i2c.h" 172c6fe2e2SMarkus Armbruster #include "hw/sysbus.h" 182c6fe2e2SMarkus Armbruster 192c6fe2e2SMarkus Armbruster OBJECT_DECLARE_TYPE(PnvChip, PnvChipClass, 202c6fe2e2SMarkus Armbruster PNV_CHIP) 212c6fe2e2SMarkus Armbruster 222c6fe2e2SMarkus Armbruster struct PnvChip { 232c6fe2e2SMarkus Armbruster /*< private >*/ 242c6fe2e2SMarkus Armbruster SysBusDevice parent_obj; 252c6fe2e2SMarkus Armbruster 262c6fe2e2SMarkus Armbruster /*< public >*/ 272c6fe2e2SMarkus Armbruster uint32_t chip_id; 282c6fe2e2SMarkus Armbruster uint64_t ram_start; 292c6fe2e2SMarkus Armbruster uint64_t ram_size; 302c6fe2e2SMarkus Armbruster 31c26504afSNicholas Piggin bool big_core; 323b5ea01eSNicholas Piggin bool lpar_per_core; 332c6fe2e2SMarkus Armbruster uint32_t nr_cores; 342c6fe2e2SMarkus Armbruster uint32_t nr_threads; 352c6fe2e2SMarkus Armbruster uint64_t cores_mask; 362c6fe2e2SMarkus Armbruster PnvCore **cores; 372c6fe2e2SMarkus Armbruster 382c6fe2e2SMarkus Armbruster uint32_t num_pecs; 392c6fe2e2SMarkus Armbruster 402c6fe2e2SMarkus Armbruster MemoryRegion xscom_mmio; 412c6fe2e2SMarkus Armbruster MemoryRegion xscom; 422c6fe2e2SMarkus Armbruster AddressSpace xscom_as; 432c6fe2e2SMarkus Armbruster 442c6fe2e2SMarkus Armbruster MemoryRegion *fw_mr; 452c6fe2e2SMarkus Armbruster gchar *dt_isa_nodename; 462c6fe2e2SMarkus Armbruster }; 472c6fe2e2SMarkus Armbruster 482c6fe2e2SMarkus Armbruster #define TYPE_PNV8_CHIP "pnv8-chip" 492c6fe2e2SMarkus Armbruster DECLARE_INSTANCE_CHECKER(Pnv8Chip, PNV8_CHIP, 502c6fe2e2SMarkus Armbruster TYPE_PNV8_CHIP) 512c6fe2e2SMarkus Armbruster 522c6fe2e2SMarkus Armbruster struct Pnv8Chip { 532c6fe2e2SMarkus Armbruster /*< private >*/ 542c6fe2e2SMarkus Armbruster PnvChip parent_obj; 552c6fe2e2SMarkus Armbruster 562c6fe2e2SMarkus Armbruster /*< public >*/ 572c6fe2e2SMarkus Armbruster MemoryRegion icp_mmio; 582c6fe2e2SMarkus Armbruster 592c6fe2e2SMarkus Armbruster PnvLpcController lpc; 602c6fe2e2SMarkus Armbruster Pnv8Psi psi; 612c6fe2e2SMarkus Armbruster PnvOCC occ; 622c6fe2e2SMarkus Armbruster PnvHomer homer; 632c6fe2e2SMarkus Armbruster 642c6fe2e2SMarkus Armbruster #define PNV8_CHIP_PHB3_MAX 4 652c6fe2e2SMarkus Armbruster /* 662c6fe2e2SMarkus Armbruster * The array is used to allow quick access to the phbs by 672c6fe2e2SMarkus Armbruster * pnv_ics_get_child() and pnv_ics_resend_child(). 682c6fe2e2SMarkus Armbruster */ 692c6fe2e2SMarkus Armbruster PnvPHB *phbs[PNV8_CHIP_PHB3_MAX]; 702c6fe2e2SMarkus Armbruster uint32_t num_phbs; 712c6fe2e2SMarkus Armbruster 722c6fe2e2SMarkus Armbruster XICSFabric *xics; 732c6fe2e2SMarkus Armbruster }; 742c6fe2e2SMarkus Armbruster 752c6fe2e2SMarkus Armbruster #define TYPE_PNV9_CHIP "pnv9-chip" 762c6fe2e2SMarkus Armbruster DECLARE_INSTANCE_CHECKER(Pnv9Chip, PNV9_CHIP, 772c6fe2e2SMarkus Armbruster TYPE_PNV9_CHIP) 782c6fe2e2SMarkus Armbruster 792c6fe2e2SMarkus Armbruster struct Pnv9Chip { 802c6fe2e2SMarkus Armbruster /*< private >*/ 812c6fe2e2SMarkus Armbruster PnvChip parent_obj; 822c6fe2e2SMarkus Armbruster 832c6fe2e2SMarkus Armbruster /*< public >*/ 8453f18b3eSNicholas Piggin PnvADU adu; 852c6fe2e2SMarkus Armbruster PnvXive xive; 862c6fe2e2SMarkus Armbruster Pnv9Psi psi; 872c6fe2e2SMarkus Armbruster PnvLpcController lpc; 88de3ba0ccSNicholas Piggin PnvChipTOD chiptod; 892c6fe2e2SMarkus Armbruster PnvOCC occ; 902c6fe2e2SMarkus Armbruster PnvSBE sbe; 912c6fe2e2SMarkus Armbruster PnvHomer homer; 922c6fe2e2SMarkus Armbruster 932c6fe2e2SMarkus Armbruster uint32_t nr_quads; 942c6fe2e2SMarkus Armbruster PnvQuad *quads; 952c6fe2e2SMarkus Armbruster 962c6fe2e2SMarkus Armbruster #define PNV9_CHIP_MAX_PEC 3 972c6fe2e2SMarkus Armbruster PnvPhb4PecState pecs[PNV9_CHIP_MAX_PEC]; 985f066121SCédric Le Goater 990d1dcb0bSGlenn Miles #define PNV9_CHIP_MAX_I2C 4 1005f066121SCédric Le Goater PnvI2C i2c[PNV9_CHIP_MAX_I2C]; 1012c6fe2e2SMarkus Armbruster }; 1022c6fe2e2SMarkus Armbruster 1032c6fe2e2SMarkus Armbruster /* 1042c6fe2e2SMarkus Armbruster * A SMT8 fused core is a pair of SMT4 cores. 1052c6fe2e2SMarkus Armbruster */ 1062c6fe2e2SMarkus Armbruster #define PNV9_PIR2FUSEDCORE(pir) (((pir) >> 3) & 0xf) 1072c6fe2e2SMarkus Armbruster #define PNV9_PIR2CHIP(pir) (((pir) >> 8) & 0x7f) 1082c6fe2e2SMarkus Armbruster 1092c6fe2e2SMarkus Armbruster #define TYPE_PNV10_CHIP "pnv10-chip" 1102c6fe2e2SMarkus Armbruster DECLARE_INSTANCE_CHECKER(Pnv10Chip, PNV10_CHIP, 1112c6fe2e2SMarkus Armbruster TYPE_PNV10_CHIP) 1122c6fe2e2SMarkus Armbruster 1132c6fe2e2SMarkus Armbruster struct Pnv10Chip { 1142c6fe2e2SMarkus Armbruster /*< private >*/ 1152c6fe2e2SMarkus Armbruster PnvChip parent_obj; 1162c6fe2e2SMarkus Armbruster 1172c6fe2e2SMarkus Armbruster /*< public >*/ 11853f18b3eSNicholas Piggin PnvADU adu; 1192c6fe2e2SMarkus Armbruster PnvXive2 xive; 1202c6fe2e2SMarkus Armbruster Pnv9Psi psi; 1212c6fe2e2SMarkus Armbruster PnvLpcController lpc; 122de3ba0ccSNicholas Piggin PnvChipTOD chiptod; 1232c6fe2e2SMarkus Armbruster PnvOCC occ; 1242c6fe2e2SMarkus Armbruster PnvSBE sbe; 1252c6fe2e2SMarkus Armbruster PnvHomer homer; 126c295d3b0SChalapathi V PnvN1Chiplet n1_chiplet; 127bb44dc48SChalapathi V #define PNV10_CHIP_MAX_PIB_SPIC 6 128bb44dc48SChalapathi V PnvSpi pib_spic[PNV10_CHIP_MAX_PIB_SPIC]; 1292c6fe2e2SMarkus Armbruster 1302c6fe2e2SMarkus Armbruster uint32_t nr_quads; 1312c6fe2e2SMarkus Armbruster PnvQuad *quads; 1322c6fe2e2SMarkus Armbruster 1332c6fe2e2SMarkus Armbruster #define PNV10_CHIP_MAX_PEC 2 1342c6fe2e2SMarkus Armbruster PnvPhb4PecState pecs[PNV10_CHIP_MAX_PEC]; 1351ceda19cSGlenn Miles 1361ceda19cSGlenn Miles #define PNV10_CHIP_MAX_I2C 4 1371ceda19cSGlenn Miles PnvI2C i2c[PNV10_CHIP_MAX_I2C]; 1382c6fe2e2SMarkus Armbruster }; 1392c6fe2e2SMarkus Armbruster 1402c6fe2e2SMarkus Armbruster #define PNV10_PIR2FUSEDCORE(pir) (((pir) >> 3) & 0xf) 1412c6fe2e2SMarkus Armbruster #define PNV10_PIR2CHIP(pir) (((pir) >> 8) & 0x7f) 142*76125c01SNicholas Piggin #define PNV10_PIR2THREAD(pir) (((pir) & 0x7f)) 1432c6fe2e2SMarkus Armbruster 1442c6fe2e2SMarkus Armbruster struct PnvChipClass { 1452c6fe2e2SMarkus Armbruster /*< private >*/ 1462c6fe2e2SMarkus Armbruster SysBusDeviceClass parent_class; 1472c6fe2e2SMarkus Armbruster 1482c6fe2e2SMarkus Armbruster /*< public >*/ 1492c6fe2e2SMarkus Armbruster uint64_t chip_cfam_id; 1502c6fe2e2SMarkus Armbruster uint64_t cores_mask; 1512c6fe2e2SMarkus Armbruster uint32_t num_pecs; 1522c6fe2e2SMarkus Armbruster uint32_t num_phbs; 1532c6fe2e2SMarkus Armbruster 1545f066121SCédric Le Goater uint32_t i2c_num_engines; 1550d1dcb0bSGlenn Miles const int *i2c_ports_per_engine; 1565f066121SCédric Le Goater 1572c6fe2e2SMarkus Armbruster DeviceRealize parent_realize; 1582c6fe2e2SMarkus Armbruster 15925de2822SNicholas Piggin /* Get PIR and TIR values for a CPU thread identified by core/thread id */ 16025de2822SNicholas Piggin void (*get_pir_tir)(PnvChip *chip, uint32_t core_id, uint32_t thread_id, 16125de2822SNicholas Piggin uint32_t *pir, uint32_t *tir); 1622c6fe2e2SMarkus Armbruster void (*intc_create)(PnvChip *chip, PowerPCCPU *cpu, Error **errp); 1632c6fe2e2SMarkus Armbruster void (*intc_reset)(PnvChip *chip, PowerPCCPU *cpu); 1642c6fe2e2SMarkus Armbruster void (*intc_destroy)(PnvChip *chip, PowerPCCPU *cpu); 165ae08259bSPhilippe Mathieu-Daudé void (*intc_print_info)(PnvChip *chip, PowerPCCPU *cpu, GString *buf); 1662c6fe2e2SMarkus Armbruster ISABus *(*isa_create)(PnvChip *chip, Error **errp); 1672c6fe2e2SMarkus Armbruster void (*dt_populate)(PnvChip *chip, void *fdt); 168a58e653aSPhilippe Mathieu-Daudé void (*pic_print_info)(PnvChip *chip, GString *buf); 1692c6fe2e2SMarkus Armbruster uint64_t (*xscom_core_base)(PnvChip *chip, uint32_t core_id); 1702c6fe2e2SMarkus Armbruster uint32_t (*xscom_pcba)(PnvChip *chip, uint64_t addr); 1712c6fe2e2SMarkus Armbruster }; 1722c6fe2e2SMarkus Armbruster 1732c6fe2e2SMarkus Armbruster #endif 174