xref: /openbmc/qemu/include/hw/ppc/pnv_chip.h (revision 93b799fafd9170da3a79a533ea6f73a18de82e22)
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