xref: /qemu/include/hw/ppc/pnv_chip.h (revision 5f0661215454959e98f69e7d3933e793d884282d)
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"
52c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_core.h"
62c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_homer.h"
72c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_lpc.h"
82c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_occ.h"
92c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_psi.h"
102c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_sbe.h"
112c6fe2e2SMarkus Armbruster #include "hw/ppc/pnv_xive.h"
12*5f066121SCédric Le Goater #include "hw/ppc/pnv_i2c.h"
132c6fe2e2SMarkus Armbruster #include "hw/sysbus.h"
142c6fe2e2SMarkus Armbruster 
152c6fe2e2SMarkus Armbruster OBJECT_DECLARE_TYPE(PnvChip, PnvChipClass,
162c6fe2e2SMarkus Armbruster                     PNV_CHIP)
172c6fe2e2SMarkus Armbruster 
182c6fe2e2SMarkus Armbruster struct PnvChip {
192c6fe2e2SMarkus Armbruster     /*< private >*/
202c6fe2e2SMarkus Armbruster     SysBusDevice parent_obj;
212c6fe2e2SMarkus Armbruster 
222c6fe2e2SMarkus Armbruster     /*< public >*/
232c6fe2e2SMarkus Armbruster     uint32_t     chip_id;
242c6fe2e2SMarkus Armbruster     uint64_t     ram_start;
252c6fe2e2SMarkus Armbruster     uint64_t     ram_size;
262c6fe2e2SMarkus Armbruster 
272c6fe2e2SMarkus Armbruster     uint32_t     nr_cores;
282c6fe2e2SMarkus Armbruster     uint32_t     nr_threads;
292c6fe2e2SMarkus Armbruster     uint64_t     cores_mask;
302c6fe2e2SMarkus Armbruster     PnvCore      **cores;
312c6fe2e2SMarkus Armbruster 
322c6fe2e2SMarkus Armbruster     uint32_t     num_pecs;
332c6fe2e2SMarkus Armbruster 
342c6fe2e2SMarkus Armbruster     MemoryRegion xscom_mmio;
352c6fe2e2SMarkus Armbruster     MemoryRegion xscom;
362c6fe2e2SMarkus Armbruster     AddressSpace xscom_as;
372c6fe2e2SMarkus Armbruster 
382c6fe2e2SMarkus Armbruster     MemoryRegion *fw_mr;
392c6fe2e2SMarkus Armbruster     gchar        *dt_isa_nodename;
402c6fe2e2SMarkus Armbruster };
412c6fe2e2SMarkus Armbruster 
422c6fe2e2SMarkus Armbruster #define TYPE_PNV8_CHIP "pnv8-chip"
432c6fe2e2SMarkus Armbruster DECLARE_INSTANCE_CHECKER(Pnv8Chip, PNV8_CHIP,
442c6fe2e2SMarkus Armbruster                          TYPE_PNV8_CHIP)
452c6fe2e2SMarkus Armbruster 
462c6fe2e2SMarkus Armbruster struct Pnv8Chip {
472c6fe2e2SMarkus Armbruster     /*< private >*/
482c6fe2e2SMarkus Armbruster     PnvChip      parent_obj;
492c6fe2e2SMarkus Armbruster 
502c6fe2e2SMarkus Armbruster     /*< public >*/
512c6fe2e2SMarkus Armbruster     MemoryRegion icp_mmio;
522c6fe2e2SMarkus Armbruster 
532c6fe2e2SMarkus Armbruster     PnvLpcController lpc;
542c6fe2e2SMarkus Armbruster     Pnv8Psi      psi;
552c6fe2e2SMarkus Armbruster     PnvOCC       occ;
562c6fe2e2SMarkus Armbruster     PnvHomer     homer;
572c6fe2e2SMarkus Armbruster 
582c6fe2e2SMarkus Armbruster #define PNV8_CHIP_PHB3_MAX 4
592c6fe2e2SMarkus Armbruster     /*
602c6fe2e2SMarkus Armbruster      * The array is used to allow quick access to the phbs by
612c6fe2e2SMarkus Armbruster      * pnv_ics_get_child() and pnv_ics_resend_child().
622c6fe2e2SMarkus Armbruster      */
632c6fe2e2SMarkus Armbruster     PnvPHB       *phbs[PNV8_CHIP_PHB3_MAX];
642c6fe2e2SMarkus Armbruster     uint32_t     num_phbs;
652c6fe2e2SMarkus Armbruster 
662c6fe2e2SMarkus Armbruster     XICSFabric    *xics;
672c6fe2e2SMarkus Armbruster };
682c6fe2e2SMarkus Armbruster 
692c6fe2e2SMarkus Armbruster #define TYPE_PNV9_CHIP "pnv9-chip"
702c6fe2e2SMarkus Armbruster DECLARE_INSTANCE_CHECKER(Pnv9Chip, PNV9_CHIP,
712c6fe2e2SMarkus Armbruster                          TYPE_PNV9_CHIP)
722c6fe2e2SMarkus Armbruster 
732c6fe2e2SMarkus Armbruster struct Pnv9Chip {
742c6fe2e2SMarkus Armbruster     /*< private >*/
752c6fe2e2SMarkus Armbruster     PnvChip      parent_obj;
762c6fe2e2SMarkus Armbruster 
772c6fe2e2SMarkus Armbruster     /*< public >*/
782c6fe2e2SMarkus Armbruster     PnvXive      xive;
792c6fe2e2SMarkus Armbruster     Pnv9Psi      psi;
802c6fe2e2SMarkus Armbruster     PnvLpcController lpc;
812c6fe2e2SMarkus Armbruster     PnvOCC       occ;
822c6fe2e2SMarkus Armbruster     PnvSBE       sbe;
832c6fe2e2SMarkus Armbruster     PnvHomer     homer;
842c6fe2e2SMarkus Armbruster 
852c6fe2e2SMarkus Armbruster     uint32_t     nr_quads;
862c6fe2e2SMarkus Armbruster     PnvQuad      *quads;
872c6fe2e2SMarkus Armbruster 
882c6fe2e2SMarkus Armbruster #define PNV9_CHIP_MAX_PEC 3
892c6fe2e2SMarkus Armbruster     PnvPhb4PecState pecs[PNV9_CHIP_MAX_PEC];
90*5f066121SCédric Le Goater 
91*5f066121SCédric Le Goater #define PNV9_CHIP_MAX_I2C 3
92*5f066121SCédric Le Goater #define PNV9_CHIP_MAX_I2C_PORTS 1
93*5f066121SCédric Le Goater     PnvI2C      i2c[PNV9_CHIP_MAX_I2C];
942c6fe2e2SMarkus Armbruster };
952c6fe2e2SMarkus Armbruster 
962c6fe2e2SMarkus Armbruster /*
972c6fe2e2SMarkus Armbruster  * A SMT8 fused core is a pair of SMT4 cores.
982c6fe2e2SMarkus Armbruster  */
992c6fe2e2SMarkus Armbruster #define PNV9_PIR2FUSEDCORE(pir) (((pir) >> 3) & 0xf)
1002c6fe2e2SMarkus Armbruster #define PNV9_PIR2CHIP(pir)      (((pir) >> 8) & 0x7f)
1012c6fe2e2SMarkus Armbruster 
1022c6fe2e2SMarkus Armbruster #define TYPE_PNV10_CHIP "pnv10-chip"
1032c6fe2e2SMarkus Armbruster DECLARE_INSTANCE_CHECKER(Pnv10Chip, PNV10_CHIP,
1042c6fe2e2SMarkus Armbruster                          TYPE_PNV10_CHIP)
1052c6fe2e2SMarkus Armbruster 
1062c6fe2e2SMarkus Armbruster struct Pnv10Chip {
1072c6fe2e2SMarkus Armbruster     /*< private >*/
1082c6fe2e2SMarkus Armbruster     PnvChip      parent_obj;
1092c6fe2e2SMarkus Armbruster 
1102c6fe2e2SMarkus Armbruster     /*< public >*/
1112c6fe2e2SMarkus Armbruster     PnvXive2     xive;
1122c6fe2e2SMarkus Armbruster     Pnv9Psi      psi;
1132c6fe2e2SMarkus Armbruster     PnvLpcController lpc;
1142c6fe2e2SMarkus Armbruster     PnvOCC       occ;
1152c6fe2e2SMarkus Armbruster     PnvSBE       sbe;
1162c6fe2e2SMarkus Armbruster     PnvHomer     homer;
1172c6fe2e2SMarkus Armbruster 
1182c6fe2e2SMarkus Armbruster     uint32_t     nr_quads;
1192c6fe2e2SMarkus Armbruster     PnvQuad      *quads;
1202c6fe2e2SMarkus Armbruster 
1212c6fe2e2SMarkus Armbruster #define PNV10_CHIP_MAX_PEC 2
1222c6fe2e2SMarkus Armbruster     PnvPhb4PecState pecs[PNV10_CHIP_MAX_PEC];
1232c6fe2e2SMarkus Armbruster };
1242c6fe2e2SMarkus Armbruster 
1252c6fe2e2SMarkus Armbruster #define PNV10_PIR2FUSEDCORE(pir) (((pir) >> 3) & 0xf)
1262c6fe2e2SMarkus Armbruster #define PNV10_PIR2CHIP(pir)      (((pir) >> 8) & 0x7f)
1272c6fe2e2SMarkus Armbruster 
1282c6fe2e2SMarkus Armbruster struct PnvChipClass {
1292c6fe2e2SMarkus Armbruster     /*< private >*/
1302c6fe2e2SMarkus Armbruster     SysBusDeviceClass parent_class;
1312c6fe2e2SMarkus Armbruster 
1322c6fe2e2SMarkus Armbruster     /*< public >*/
1332c6fe2e2SMarkus Armbruster     uint64_t     chip_cfam_id;
1342c6fe2e2SMarkus Armbruster     uint64_t     cores_mask;
1352c6fe2e2SMarkus Armbruster     uint32_t     num_pecs;
1362c6fe2e2SMarkus Armbruster     uint32_t     num_phbs;
1372c6fe2e2SMarkus Armbruster 
138*5f066121SCédric Le Goater     uint32_t     i2c_num_engines;
139*5f066121SCédric Le Goater     uint32_t     i2c_num_ports;
140*5f066121SCédric Le Goater 
1412c6fe2e2SMarkus Armbruster     DeviceRealize parent_realize;
1422c6fe2e2SMarkus Armbruster 
1432c6fe2e2SMarkus Armbruster     uint32_t (*core_pir)(PnvChip *chip, uint32_t core_id);
1442c6fe2e2SMarkus Armbruster     void (*intc_create)(PnvChip *chip, PowerPCCPU *cpu, Error **errp);
1452c6fe2e2SMarkus Armbruster     void (*intc_reset)(PnvChip *chip, PowerPCCPU *cpu);
1462c6fe2e2SMarkus Armbruster     void (*intc_destroy)(PnvChip *chip, PowerPCCPU *cpu);
1472c6fe2e2SMarkus Armbruster     void (*intc_print_info)(PnvChip *chip, PowerPCCPU *cpu, Monitor *mon);
1482c6fe2e2SMarkus Armbruster     ISABus *(*isa_create)(PnvChip *chip, Error **errp);
1492c6fe2e2SMarkus Armbruster     void (*dt_populate)(PnvChip *chip, void *fdt);
1502c6fe2e2SMarkus Armbruster     void (*pic_print_info)(PnvChip *chip, Monitor *mon);
1512c6fe2e2SMarkus Armbruster     uint64_t (*xscom_core_base)(PnvChip *chip, uint32_t core_id);
1522c6fe2e2SMarkus Armbruster     uint32_t (*xscom_pcba)(PnvChip *chip, uint64_t addr);
1532c6fe2e2SMarkus Armbruster };
1542c6fe2e2SMarkus Armbruster 
1552c6fe2e2SMarkus Armbruster #endif
156