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