xref: /qemu/include/hw/ppc/pnv_chip.h (revision ae08259b84c92e27fa7fe2cc986cdbfce4145b44)
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"
5de3ba0ccSNicholas Piggin #include "hw/ppc/pnv_chiptod.h"
62c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_core.h"
72c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_homer.h"
8c295d3b0SChalapathi V #include "hw/ppc/pnv_n1_chiplet.h"
92c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_lpc.h"
102c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_occ.h"
112c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_psi.h"
122c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_sbe.h"
132c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_xive.h"
145f066121SCédric Le Goater #include "hw/ppc/pnv_i2c.h"
152c6fe2e2SMarkus Armbruster #include "hw/sysbus.h"
162c6fe2e2SMarkus Armbruster 
172c6fe2e2SMarkus Armbruster OBJECT_DECLARE_TYPE(PnvChip, PnvChipClass,
182c6fe2e2SMarkus Armbruster                     PNV_CHIP)
192c6fe2e2SMarkus Armbruster 
202c6fe2e2SMarkus Armbruster struct PnvChip {
212c6fe2e2SMarkus Armbruster     /*< private >*/
222c6fe2e2SMarkus Armbruster     SysBusDevice parent_obj;
232c6fe2e2SMarkus Armbruster 
242c6fe2e2SMarkus Armbruster     /*< public >*/
252c6fe2e2SMarkus Armbruster     uint32_t     chip_id;
262c6fe2e2SMarkus Armbruster     uint64_t     ram_start;
272c6fe2e2SMarkus Armbruster     uint64_t     ram_size;
282c6fe2e2SMarkus Armbruster 
292c6fe2e2SMarkus Armbruster     uint32_t     nr_cores;
302c6fe2e2SMarkus Armbruster     uint32_t     nr_threads;
312c6fe2e2SMarkus Armbruster     uint64_t     cores_mask;
322c6fe2e2SMarkus Armbruster     PnvCore      **cores;
332c6fe2e2SMarkus Armbruster 
342c6fe2e2SMarkus Armbruster     uint32_t     num_pecs;
352c6fe2e2SMarkus Armbruster 
362c6fe2e2SMarkus Armbruster     MemoryRegion xscom_mmio;
372c6fe2e2SMarkus Armbruster     MemoryRegion xscom;
382c6fe2e2SMarkus Armbruster     AddressSpace xscom_as;
392c6fe2e2SMarkus Armbruster 
402c6fe2e2SMarkus Armbruster     MemoryRegion *fw_mr;
412c6fe2e2SMarkus Armbruster     gchar        *dt_isa_nodename;
422c6fe2e2SMarkus Armbruster };
432c6fe2e2SMarkus Armbruster 
442c6fe2e2SMarkus Armbruster #define TYPE_PNV8_CHIP "pnv8-chip"
452c6fe2e2SMarkus Armbruster DECLARE_INSTANCE_CHECKER(Pnv8Chip, PNV8_CHIP,
462c6fe2e2SMarkus Armbruster                          TYPE_PNV8_CHIP)
472c6fe2e2SMarkus Armbruster 
482c6fe2e2SMarkus Armbruster struct Pnv8Chip {
492c6fe2e2SMarkus Armbruster     /*< private >*/
502c6fe2e2SMarkus Armbruster     PnvChip      parent_obj;
512c6fe2e2SMarkus Armbruster 
522c6fe2e2SMarkus Armbruster     /*< public >*/
532c6fe2e2SMarkus Armbruster     MemoryRegion icp_mmio;
542c6fe2e2SMarkus Armbruster 
552c6fe2e2SMarkus Armbruster     PnvLpcController lpc;
562c6fe2e2SMarkus Armbruster     Pnv8Psi      psi;
572c6fe2e2SMarkus Armbruster     PnvOCC       occ;
582c6fe2e2SMarkus Armbruster     PnvHomer     homer;
592c6fe2e2SMarkus Armbruster 
602c6fe2e2SMarkus Armbruster #define PNV8_CHIP_PHB3_MAX 4
612c6fe2e2SMarkus Armbruster     /*
622c6fe2e2SMarkus Armbruster      * The array is used to allow quick access to the phbs by
632c6fe2e2SMarkus Armbruster      * pnv_ics_get_child() and pnv_ics_resend_child().
642c6fe2e2SMarkus Armbruster      */
652c6fe2e2SMarkus Armbruster     PnvPHB       *phbs[PNV8_CHIP_PHB3_MAX];
662c6fe2e2SMarkus Armbruster     uint32_t     num_phbs;
672c6fe2e2SMarkus Armbruster 
682c6fe2e2SMarkus Armbruster     XICSFabric    *xics;
692c6fe2e2SMarkus Armbruster };
702c6fe2e2SMarkus Armbruster 
712c6fe2e2SMarkus Armbruster #define TYPE_PNV9_CHIP "pnv9-chip"
722c6fe2e2SMarkus Armbruster DECLARE_INSTANCE_CHECKER(Pnv9Chip, PNV9_CHIP,
732c6fe2e2SMarkus Armbruster                          TYPE_PNV9_CHIP)
742c6fe2e2SMarkus Armbruster 
752c6fe2e2SMarkus Armbruster struct Pnv9Chip {
762c6fe2e2SMarkus Armbruster     /*< private >*/
772c6fe2e2SMarkus Armbruster     PnvChip      parent_obj;
782c6fe2e2SMarkus Armbruster 
792c6fe2e2SMarkus Armbruster     /*< public >*/
802c6fe2e2SMarkus Armbruster     PnvXive      xive;
812c6fe2e2SMarkus Armbruster     Pnv9Psi      psi;
822c6fe2e2SMarkus Armbruster     PnvLpcController lpc;
83de3ba0ccSNicholas Piggin     PnvChipTOD   chiptod;
842c6fe2e2SMarkus Armbruster     PnvOCC       occ;
852c6fe2e2SMarkus Armbruster     PnvSBE       sbe;
862c6fe2e2SMarkus Armbruster     PnvHomer     homer;
872c6fe2e2SMarkus Armbruster 
882c6fe2e2SMarkus Armbruster     uint32_t     nr_quads;
892c6fe2e2SMarkus Armbruster     PnvQuad      *quads;
902c6fe2e2SMarkus Armbruster 
912c6fe2e2SMarkus Armbruster #define PNV9_CHIP_MAX_PEC 3
922c6fe2e2SMarkus Armbruster     PnvPhb4PecState pecs[PNV9_CHIP_MAX_PEC];
935f066121SCédric Le Goater 
940d1dcb0bSGlenn Miles #define PNV9_CHIP_MAX_I2C 4
955f066121SCédric Le Goater     PnvI2C      i2c[PNV9_CHIP_MAX_I2C];
962c6fe2e2SMarkus Armbruster };
972c6fe2e2SMarkus Armbruster 
982c6fe2e2SMarkus Armbruster /*
992c6fe2e2SMarkus Armbruster  * A SMT8 fused core is a pair of SMT4 cores.
1002c6fe2e2SMarkus Armbruster  */
1012c6fe2e2SMarkus Armbruster #define PNV9_PIR2FUSEDCORE(pir) (((pir) >> 3) & 0xf)
1022c6fe2e2SMarkus Armbruster #define PNV9_PIR2CHIP(pir)      (((pir) >> 8) & 0x7f)
1032c6fe2e2SMarkus Armbruster 
1042c6fe2e2SMarkus Armbruster #define TYPE_PNV10_CHIP "pnv10-chip"
1052c6fe2e2SMarkus Armbruster DECLARE_INSTANCE_CHECKER(Pnv10Chip, PNV10_CHIP,
1062c6fe2e2SMarkus Armbruster                          TYPE_PNV10_CHIP)
1072c6fe2e2SMarkus Armbruster 
1082c6fe2e2SMarkus Armbruster struct Pnv10Chip {
1092c6fe2e2SMarkus Armbruster     /*< private >*/
1102c6fe2e2SMarkus Armbruster     PnvChip      parent_obj;
1112c6fe2e2SMarkus Armbruster 
1122c6fe2e2SMarkus Armbruster     /*< public >*/
1132c6fe2e2SMarkus Armbruster     PnvXive2     xive;
1142c6fe2e2SMarkus Armbruster     Pnv9Psi      psi;
1152c6fe2e2SMarkus Armbruster     PnvLpcController lpc;
116de3ba0ccSNicholas Piggin     PnvChipTOD   chiptod;
1172c6fe2e2SMarkus Armbruster     PnvOCC       occ;
1182c6fe2e2SMarkus Armbruster     PnvSBE       sbe;
1192c6fe2e2SMarkus Armbruster     PnvHomer     homer;
120c295d3b0SChalapathi V     PnvN1Chiplet     n1_chiplet;
1212c6fe2e2SMarkus Armbruster 
1222c6fe2e2SMarkus Armbruster     uint32_t     nr_quads;
1232c6fe2e2SMarkus Armbruster     PnvQuad      *quads;
1242c6fe2e2SMarkus Armbruster 
1252c6fe2e2SMarkus Armbruster #define PNV10_CHIP_MAX_PEC 2
1262c6fe2e2SMarkus Armbruster     PnvPhb4PecState pecs[PNV10_CHIP_MAX_PEC];
1271ceda19cSGlenn Miles 
1281ceda19cSGlenn Miles #define PNV10_CHIP_MAX_I2C 4
1291ceda19cSGlenn Miles     PnvI2C       i2c[PNV10_CHIP_MAX_I2C];
1302c6fe2e2SMarkus Armbruster };
1312c6fe2e2SMarkus Armbruster 
1322c6fe2e2SMarkus Armbruster #define PNV10_PIR2FUSEDCORE(pir) (((pir) >> 3) & 0xf)
1332c6fe2e2SMarkus Armbruster #define PNV10_PIR2CHIP(pir)      (((pir) >> 8) & 0x7f)
1342c6fe2e2SMarkus Armbruster 
1352c6fe2e2SMarkus Armbruster struct PnvChipClass {
1362c6fe2e2SMarkus Armbruster     /*< private >*/
1372c6fe2e2SMarkus Armbruster     SysBusDeviceClass parent_class;
1382c6fe2e2SMarkus Armbruster 
1392c6fe2e2SMarkus Armbruster     /*< public >*/
1402c6fe2e2SMarkus Armbruster     uint64_t     chip_cfam_id;
1412c6fe2e2SMarkus Armbruster     uint64_t     cores_mask;
1422c6fe2e2SMarkus Armbruster     uint32_t     num_pecs;
1432c6fe2e2SMarkus Armbruster     uint32_t     num_phbs;
1442c6fe2e2SMarkus Armbruster 
1455f066121SCédric Le Goater     uint32_t     i2c_num_engines;
1460d1dcb0bSGlenn Miles     const int    *i2c_ports_per_engine;
1475f066121SCédric Le Goater 
1482c6fe2e2SMarkus Armbruster     DeviceRealize parent_realize;
1492c6fe2e2SMarkus Armbruster 
1509940412aSCaleb Schlossin     uint32_t (*chip_pir)(PnvChip *chip, uint32_t core_id, uint32_t thread_id);
1512c6fe2e2SMarkus Armbruster     void (*intc_create)(PnvChip *chip, PowerPCCPU *cpu, Error **errp);
1522c6fe2e2SMarkus Armbruster     void (*intc_reset)(PnvChip *chip, PowerPCCPU *cpu);
1532c6fe2e2SMarkus Armbruster     void (*intc_destroy)(PnvChip *chip, PowerPCCPU *cpu);
154*ae08259bSPhilippe Mathieu-Daudé     void (*intc_print_info)(PnvChip *chip, PowerPCCPU *cpu, GString *buf);
1552c6fe2e2SMarkus Armbruster     ISABus *(*isa_create)(PnvChip *chip, Error **errp);
1562c6fe2e2SMarkus Armbruster     void (*dt_populate)(PnvChip *chip, void *fdt);
1572c6fe2e2SMarkus Armbruster     void (*pic_print_info)(PnvChip *chip, Monitor *mon);
1582c6fe2e2SMarkus Armbruster     uint64_t (*xscom_core_base)(PnvChip *chip, uint32_t core_id);
1592c6fe2e2SMarkus Armbruster     uint32_t (*xscom_pcba)(PnvChip *chip, uint64_t addr);
1602c6fe2e2SMarkus Armbruster };
1612c6fe2e2SMarkus Armbruster 
1622c6fe2e2SMarkus Armbruster #endif
163