pnv.c (4f9924c4d4cf9c039e247c5cdbbf71bce4e573c3) pnv.c (9ae1329ee2fee95f201ca219090d7c742eaf6a90)
1/*
2 * QEMU PowerPC PowerNV machine model
3 *
4 * Copyright (c) 2016, IBM Corporation.
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either

--- 602 unchanged lines hidden (view full) ---

611static ISABus *pnv_isa_create(PnvChip *chip, Error **errp)
612{
613 return PNV_CHIP_GET_CLASS(chip)->isa_create(chip, errp);
614}
615
616static void pnv_chip_power8_pic_print_info(PnvChip *chip, Monitor *mon)
617{
618 Pnv8Chip *chip8 = PNV8_CHIP(chip);
1/*
2 * QEMU PowerPC PowerNV machine model
3 *
4 * Copyright (c) 2016, IBM Corporation.
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either

--- 602 unchanged lines hidden (view full) ---

611static ISABus *pnv_isa_create(PnvChip *chip, Error **errp)
612{
613 return PNV_CHIP_GET_CLASS(chip)->isa_create(chip, errp);
614}
615
616static void pnv_chip_power8_pic_print_info(PnvChip *chip, Monitor *mon)
617{
618 Pnv8Chip *chip8 = PNV8_CHIP(chip);
619 int i;
619
620 ics_pic_print_info(&chip8->psi.ics, mon);
620
621 ics_pic_print_info(&chip8->psi.ics, mon);
622 for (i = 0; i < chip->num_phbs; i++) {
623 pnv_phb3_msi_pic_print_info(&chip8->phbs[i].msis, mon);
624 ics_pic_print_info(&chip8->phbs[i].lsis, mon);
625 }
621}
622
623static void pnv_chip_power9_pic_print_info(PnvChip *chip, Monitor *mon)
624{
625 Pnv9Chip *chip9 = PNV9_CHIP(chip);
626 int i, j;
627
628 pnv_xive_pic_print_info(&chip9->xive, mon);

--- 392 unchanged lines hidden (view full) ---

1021 */
1022#define POWER9_CORE_MASK (0xffffffffffffffull)
1023
1024
1025#define POWER10_CORE_MASK (0xffffffffffffffull)
1026
1027static void pnv_chip_power8_instance_init(Object *obj)
1028{
626}
627
628static void pnv_chip_power9_pic_print_info(PnvChip *chip, Monitor *mon)
629{
630 Pnv9Chip *chip9 = PNV9_CHIP(chip);
631 int i, j;
632
633 pnv_xive_pic_print_info(&chip9->xive, mon);

--- 392 unchanged lines hidden (view full) ---

1026 */
1027#define POWER9_CORE_MASK (0xffffffffffffffull)
1028
1029
1030#define POWER10_CORE_MASK (0xffffffffffffffull)
1031
1032static void pnv_chip_power8_instance_init(Object *obj)
1033{
1034 PnvChip *chip = PNV_CHIP(obj);
1029 Pnv8Chip *chip8 = PNV8_CHIP(obj);
1035 Pnv8Chip *chip8 = PNV8_CHIP(obj);
1036 PnvChipClass *pcc = PNV_CHIP_GET_CLASS(obj);
1037 int i;
1030
1031 object_property_add_link(obj, "xics", TYPE_XICS_FABRIC,
1032 (Object **)&chip8->xics,
1033 object_property_allow_set_link,
1034 OBJ_PROP_LINK_STRONG,
1035 &error_abort);
1036
1037 object_initialize_child(obj, "psi", &chip8->psi, sizeof(chip8->psi),
1038 TYPE_PNV8_PSI, &error_abort, NULL);
1039
1040 object_initialize_child(obj, "lpc", &chip8->lpc, sizeof(chip8->lpc),
1041 TYPE_PNV8_LPC, &error_abort, NULL);
1042
1043 object_initialize_child(obj, "occ", &chip8->occ, sizeof(chip8->occ),
1044 TYPE_PNV8_OCC, &error_abort, NULL);
1045
1046 object_initialize_child(obj, "homer", &chip8->homer, sizeof(chip8->homer),
1047 TYPE_PNV8_HOMER, &error_abort, NULL);
1038
1039 object_property_add_link(obj, "xics", TYPE_XICS_FABRIC,
1040 (Object **)&chip8->xics,
1041 object_property_allow_set_link,
1042 OBJ_PROP_LINK_STRONG,
1043 &error_abort);
1044
1045 object_initialize_child(obj, "psi", &chip8->psi, sizeof(chip8->psi),
1046 TYPE_PNV8_PSI, &error_abort, NULL);
1047
1048 object_initialize_child(obj, "lpc", &chip8->lpc, sizeof(chip8->lpc),
1049 TYPE_PNV8_LPC, &error_abort, NULL);
1050
1051 object_initialize_child(obj, "occ", &chip8->occ, sizeof(chip8->occ),
1052 TYPE_PNV8_OCC, &error_abort, NULL);
1053
1054 object_initialize_child(obj, "homer", &chip8->homer, sizeof(chip8->homer),
1055 TYPE_PNV8_HOMER, &error_abort, NULL);
1056
1057 for (i = 0; i < pcc->num_phbs; i++) {
1058 object_initialize_child(obj, "phb[*]", &chip8->phbs[i],
1059 sizeof(chip8->phbs[i]), TYPE_PNV_PHB3,
1060 &error_abort, NULL);
1061 }
1062
1063 /*
1064 * Number of PHBs is the chip default
1065 */
1066 chip->num_phbs = pcc->num_phbs;
1048}
1049
1050static void pnv_chip_icp_realize(Pnv8Chip *chip8, Error **errp)
1051 {
1052 PnvChip *chip = PNV_CHIP(chip8);
1053 PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
1054 int i, j;
1055 char *name;

--- 22 unchanged lines hidden (view full) ---

1078
1079static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
1080{
1081 PnvChipClass *pcc = PNV_CHIP_GET_CLASS(dev);
1082 PnvChip *chip = PNV_CHIP(dev);
1083 Pnv8Chip *chip8 = PNV8_CHIP(dev);
1084 Pnv8Psi *psi8 = &chip8->psi;
1085 Error *local_err = NULL;
1067}
1068
1069static void pnv_chip_icp_realize(Pnv8Chip *chip8, Error **errp)
1070 {
1071 PnvChip *chip = PNV_CHIP(chip8);
1072 PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
1073 int i, j;
1074 char *name;

--- 22 unchanged lines hidden (view full) ---

1097
1098static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
1099{
1100 PnvChipClass *pcc = PNV_CHIP_GET_CLASS(dev);
1101 PnvChip *chip = PNV_CHIP(dev);
1102 Pnv8Chip *chip8 = PNV8_CHIP(dev);
1103 Pnv8Psi *psi8 = &chip8->psi;
1104 Error *local_err = NULL;
1105 int i;
1086
1087 assert(chip8->xics);
1088
1089 /* XSCOM bridge is first */
1090 pnv_xscom_realize(chip, PNV_XSCOM_SIZE, &local_err);
1091 if (local_err) {
1092 error_propagate(errp, local_err);
1093 return;

--- 64 unchanged lines hidden (view full) ---

1158 return;
1159 }
1160 /* Homer Xscom region */
1161 pnv_xscom_add_subregion(chip, PNV_XSCOM_PBA_BASE, &chip8->homer.pba_regs);
1162
1163 /* Homer mmio region */
1164 memory_region_add_subregion(get_system_memory(), PNV_HOMER_BASE(chip),
1165 &chip8->homer.regs);
1106
1107 assert(chip8->xics);
1108
1109 /* XSCOM bridge is first */
1110 pnv_xscom_realize(chip, PNV_XSCOM_SIZE, &local_err);
1111 if (local_err) {
1112 error_propagate(errp, local_err);
1113 return;

--- 64 unchanged lines hidden (view full) ---

1178 return;
1179 }
1180 /* Homer Xscom region */
1181 pnv_xscom_add_subregion(chip, PNV_XSCOM_PBA_BASE, &chip8->homer.pba_regs);
1182
1183 /* Homer mmio region */
1184 memory_region_add_subregion(get_system_memory(), PNV_HOMER_BASE(chip),
1185 &chip8->homer.regs);
1186
1187 /* PHB3 controllers */
1188 for (i = 0; i < chip->num_phbs; i++) {
1189 PnvPHB3 *phb = &chip8->phbs[i];
1190 PnvPBCQState *pbcq = &phb->pbcq;
1191
1192 object_property_set_int(OBJECT(phb), i, "index", &error_fatal);
1193 object_property_set_int(OBJECT(phb), chip->chip_id, "chip-id",
1194 &error_fatal);
1195 object_property_set_bool(OBJECT(phb), true, "realized", &local_err);
1196 if (local_err) {
1197 error_propagate(errp, local_err);
1198 return;
1199 }
1200 qdev_set_parent_bus(DEVICE(phb), sysbus_get_default());
1201
1202 /* Populate the XSCOM address space. */
1203 pnv_xscom_add_subregion(chip,
1204 PNV_XSCOM_PBCQ_NEST_BASE + 0x400 * phb->phb_id,
1205 &pbcq->xscom_nest_regs);
1206 pnv_xscom_add_subregion(chip,
1207 PNV_XSCOM_PBCQ_PCI_BASE + 0x400 * phb->phb_id,
1208 &pbcq->xscom_pci_regs);
1209 pnv_xscom_add_subregion(chip,
1210 PNV_XSCOM_PBCQ_SPCI_BASE + 0x040 * phb->phb_id,
1211 &pbcq->xscom_spci_regs);
1212 }
1166}
1167
1168static uint32_t pnv_chip_power8_xscom_pcba(PnvChip *chip, uint64_t addr)
1169{
1170 addr &= (PNV_XSCOM_SIZE - 1);
1171 return ((addr >> 4) & ~0xfull) | ((addr >> 3) & 0xf);
1172}
1173
1174static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data)
1175{
1176 DeviceClass *dc = DEVICE_CLASS(klass);
1177 PnvChipClass *k = PNV_CHIP_CLASS(klass);
1178
1179 k->chip_cfam_id = 0x221ef04980000000ull; /* P8 Murano DD2.1 */
1180 k->cores_mask = POWER8E_CORE_MASK;
1213}
1214
1215static uint32_t pnv_chip_power8_xscom_pcba(PnvChip *chip, uint64_t addr)
1216{
1217 addr &= (PNV_XSCOM_SIZE - 1);
1218 return ((addr >> 4) & ~0xfull) | ((addr >> 3) & 0xf);
1219}
1220
1221static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data)
1222{
1223 DeviceClass *dc = DEVICE_CLASS(klass);
1224 PnvChipClass *k = PNV_CHIP_CLASS(klass);
1225
1226 k->chip_cfam_id = 0x221ef04980000000ull; /* P8 Murano DD2.1 */
1227 k->cores_mask = POWER8E_CORE_MASK;
1228 k->num_phbs = 3;
1181 k->core_pir = pnv_chip_core_pir_p8;
1182 k->intc_create = pnv_chip_power8_intc_create;
1183 k->intc_reset = pnv_chip_power8_intc_reset;
1184 k->intc_destroy = pnv_chip_power8_intc_destroy;
1185 k->intc_print_info = pnv_chip_power8_intc_print_info;
1186 k->isa_create = pnv_chip_power8_isa_create;
1187 k->dt_populate = pnv_chip_power8_dt_populate;
1188 k->pic_print_info = pnv_chip_power8_pic_print_info;

--- 7 unchanged lines hidden (view full) ---

1196
1197static void pnv_chip_power8_class_init(ObjectClass *klass, void *data)
1198{
1199 DeviceClass *dc = DEVICE_CLASS(klass);
1200 PnvChipClass *k = PNV_CHIP_CLASS(klass);
1201
1202 k->chip_cfam_id = 0x220ea04980000000ull; /* P8 Venice DD2.0 */
1203 k->cores_mask = POWER8_CORE_MASK;
1229 k->core_pir = pnv_chip_core_pir_p8;
1230 k->intc_create = pnv_chip_power8_intc_create;
1231 k->intc_reset = pnv_chip_power8_intc_reset;
1232 k->intc_destroy = pnv_chip_power8_intc_destroy;
1233 k->intc_print_info = pnv_chip_power8_intc_print_info;
1234 k->isa_create = pnv_chip_power8_isa_create;
1235 k->dt_populate = pnv_chip_power8_dt_populate;
1236 k->pic_print_info = pnv_chip_power8_pic_print_info;

--- 7 unchanged lines hidden (view full) ---

1244
1245static void pnv_chip_power8_class_init(ObjectClass *klass, void *data)
1246{
1247 DeviceClass *dc = DEVICE_CLASS(klass);
1248 PnvChipClass *k = PNV_CHIP_CLASS(klass);
1249
1250 k->chip_cfam_id = 0x220ea04980000000ull; /* P8 Venice DD2.0 */
1251 k->cores_mask = POWER8_CORE_MASK;
1252 k->num_phbs = 3;
1204 k->core_pir = pnv_chip_core_pir_p8;
1205 k->intc_create = pnv_chip_power8_intc_create;
1206 k->intc_reset = pnv_chip_power8_intc_reset;
1207 k->intc_destroy = pnv_chip_power8_intc_destroy;
1208 k->intc_print_info = pnv_chip_power8_intc_print_info;
1209 k->isa_create = pnv_chip_power8_isa_create;
1210 k->dt_populate = pnv_chip_power8_dt_populate;
1211 k->pic_print_info = pnv_chip_power8_pic_print_info;

--- 7 unchanged lines hidden (view full) ---

1219
1220static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data)
1221{
1222 DeviceClass *dc = DEVICE_CLASS(klass);
1223 PnvChipClass *k = PNV_CHIP_CLASS(klass);
1224
1225 k->chip_cfam_id = 0x120d304980000000ull; /* P8 Naples DD1.0 */
1226 k->cores_mask = POWER8_CORE_MASK;
1253 k->core_pir = pnv_chip_core_pir_p8;
1254 k->intc_create = pnv_chip_power8_intc_create;
1255 k->intc_reset = pnv_chip_power8_intc_reset;
1256 k->intc_destroy = pnv_chip_power8_intc_destroy;
1257 k->intc_print_info = pnv_chip_power8_intc_print_info;
1258 k->isa_create = pnv_chip_power8_isa_create;
1259 k->dt_populate = pnv_chip_power8_dt_populate;
1260 k->pic_print_info = pnv_chip_power8_pic_print_info;

--- 7 unchanged lines hidden (view full) ---

1268
1269static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data)
1270{
1271 DeviceClass *dc = DEVICE_CLASS(klass);
1272 PnvChipClass *k = PNV_CHIP_CLASS(klass);
1273
1274 k->chip_cfam_id = 0x120d304980000000ull; /* P8 Naples DD1.0 */
1275 k->cores_mask = POWER8_CORE_MASK;
1276 k->num_phbs = 3;
1227 k->core_pir = pnv_chip_core_pir_p8;
1228 k->intc_create = pnv_chip_power8_intc_create;
1229 k->intc_reset = pnv_chip_power8_intc_reset;
1230 k->intc_destroy = pnv_chip_power8_intc_destroy;
1231 k->intc_print_info = pnv_chip_power8_intc_print_info;
1232 k->isa_create = pnv_chip_power8nvl_isa_create;
1233 k->dt_populate = pnv_chip_power8_dt_populate;
1234 k->pic_print_info = pnv_chip_power8_pic_print_info;

--- 508 unchanged lines hidden (view full) ---

1743 }
1744 }
1745 return NULL;
1746}
1747
1748static ICSState *pnv_ics_get(XICSFabric *xi, int irq)
1749{
1750 PnvMachineState *pnv = PNV_MACHINE(xi);
1277 k->core_pir = pnv_chip_core_pir_p8;
1278 k->intc_create = pnv_chip_power8_intc_create;
1279 k->intc_reset = pnv_chip_power8_intc_reset;
1280 k->intc_destroy = pnv_chip_power8_intc_destroy;
1281 k->intc_print_info = pnv_chip_power8_intc_print_info;
1282 k->isa_create = pnv_chip_power8nvl_isa_create;
1283 k->dt_populate = pnv_chip_power8_dt_populate;
1284 k->pic_print_info = pnv_chip_power8_pic_print_info;

--- 508 unchanged lines hidden (view full) ---

1793 }
1794 }
1795 return NULL;
1796}
1797
1798static ICSState *pnv_ics_get(XICSFabric *xi, int irq)
1799{
1800 PnvMachineState *pnv = PNV_MACHINE(xi);
1751 int i;
1801 int i, j;
1752
1753 for (i = 0; i < pnv->num_chips; i++) {
1802
1803 for (i = 0; i < pnv->num_chips; i++) {
1804 PnvChip *chip = pnv->chips[i];
1754 Pnv8Chip *chip8 = PNV8_CHIP(pnv->chips[i]);
1755
1756 if (ics_valid_irq(&chip8->psi.ics, irq)) {
1757 return &chip8->psi.ics;
1758 }
1805 Pnv8Chip *chip8 = PNV8_CHIP(pnv->chips[i]);
1806
1807 if (ics_valid_irq(&chip8->psi.ics, irq)) {
1808 return &chip8->psi.ics;
1809 }
1810 for (j = 0; j < chip->num_phbs; j++) {
1811 if (ics_valid_irq(&chip8->phbs[j].lsis, irq)) {
1812 return &chip8->phbs[j].lsis;
1813 }
1814 if (ics_valid_irq(ICS(&chip8->phbs[j].msis), irq)) {
1815 return ICS(&chip8->phbs[j].msis);
1816 }
1817 }
1759 }
1760 return NULL;
1761}
1762
1763static void pnv_ics_resend(XICSFabric *xi)
1764{
1765 PnvMachineState *pnv = PNV_MACHINE(xi);
1818 }
1819 return NULL;
1820}
1821
1822static void pnv_ics_resend(XICSFabric *xi)
1823{
1824 PnvMachineState *pnv = PNV_MACHINE(xi);
1766 int i;
1825 int i, j;
1767
1768 for (i = 0; i < pnv->num_chips; i++) {
1826
1827 for (i = 0; i < pnv->num_chips; i++) {
1828 PnvChip *chip = pnv->chips[i];
1769 Pnv8Chip *chip8 = PNV8_CHIP(pnv->chips[i]);
1829 Pnv8Chip *chip8 = PNV8_CHIP(pnv->chips[i]);
1830
1770 ics_resend(&chip8->psi.ics);
1831 ics_resend(&chip8->psi.ics);
1832 for (j = 0; j < chip->num_phbs; j++) {
1833 ics_resend(&chip8->phbs[j].lsis);
1834 ics_resend(ICS(&chip8->phbs[j].msis));
1835 }
1771 }
1772}
1773
1774static ICPState *pnv_icp_get(XICSFabric *xi, int pir)
1775{
1776 PowerPCCPU *cpu = ppc_get_vcpu_by_pir(pir);
1777
1778 return cpu ? ICP(pnv_cpu_state(cpu)->intc) : NULL;

--- 249 unchanged lines hidden ---
1836 }
1837}
1838
1839static ICPState *pnv_icp_get(XICSFabric *xi, int pir)
1840{
1841 PowerPCCPU *cpu = ppc_get_vcpu_by_pir(pir);
1842
1843 return cpu ? ICP(pnv_cpu_state(cpu)->intc) : NULL;

--- 249 unchanged lines hidden ---