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