aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorScott Wood <scottwood@freescale.com>2013-04-12 10:08:44 -0400
committerAlexander Graf <agraf@suse.de>2013-04-26 14:27:22 -0400
commit6dd830a09a245c068aad2d10ff6d35c5d81cf2b6 (patch)
tree91d853602e0037e276ac7564bcfd15e469b046d4
parentb823f98f890c9b069d64f8af0996029b1f1af00e (diff)
kvm/ppc/mpic: remove some obviously unneeded code
Remove some parts of the code that are obviously QEMU or Raven specific before fixing style issues, to reduce the style issues that need to be fixed. Signed-off-by: Scott Wood <scottwood@freescale.com> Signed-off-by: Alexander Graf <agraf@suse.de>
-rw-r--r--arch/powerpc/kvm/mpic.c344
1 files changed, 0 insertions, 344 deletions
diff --git a/arch/powerpc/kvm/mpic.c b/arch/powerpc/kvm/mpic.c
index 57655b988288..d6d70a473d7f 100644
--- a/arch/powerpc/kvm/mpic.c
+++ b/arch/powerpc/kvm/mpic.c
@@ -22,39 +22,6 @@
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 * THE SOFTWARE. 23 * THE SOFTWARE.
24 */ 24 */
25/*
26 *
27 * Based on OpenPic implementations:
28 * - Intel GW80314 I/O companion chip developer's manual
29 * - Motorola MPC8245 & MPC8540 user manuals.
30 * - Motorola MCP750 (aka Raven) programmer manual.
31 * - Motorola Harrier programmer manuel
32 *
33 * Serial interrupts, as implemented in Raven chipset are not supported yet.
34 *
35 */
36#include "hw.h"
37#include "ppc/mac.h"
38#include "pci/pci.h"
39#include "openpic.h"
40#include "sysbus.h"
41#include "pci/msi.h"
42#include "qemu/bitops.h"
43#include "ppc.h"
44
45//#define DEBUG_OPENPIC
46
47#ifdef DEBUG_OPENPIC
48static const int debug_openpic = 1;
49#else
50static const int debug_openpic = 0;
51#endif
52
53#define DPRINTF(fmt, ...) do { \
54 if (debug_openpic) { \
55 printf(fmt , ## __VA_ARGS__); \
56 } \
57 } while (0)
58 25
59#define MAX_CPU 32 26#define MAX_CPU 32
60#define MAX_SRC 256 27#define MAX_SRC 256
@@ -82,21 +49,6 @@ static const int debug_openpic = 0;
82#define OPENPIC_CPU_REG_START 0x20000 49#define OPENPIC_CPU_REG_START 0x20000
83#define OPENPIC_CPU_REG_SIZE 0x100 + ((MAX_CPU - 1) * 0x1000) 50#define OPENPIC_CPU_REG_SIZE 0x100 + ((MAX_CPU - 1) * 0x1000)
84 51
85/* Raven */
86#define RAVEN_MAX_CPU 2
87#define RAVEN_MAX_EXT 48
88#define RAVEN_MAX_IRQ 64
89#define RAVEN_MAX_TMR MAX_TMR
90#define RAVEN_MAX_IPI MAX_IPI
91
92/* Interrupt definitions */
93#define RAVEN_FE_IRQ (RAVEN_MAX_EXT) /* Internal functional IRQ */
94#define RAVEN_ERR_IRQ (RAVEN_MAX_EXT + 1) /* Error IRQ */
95#define RAVEN_TMR_IRQ (RAVEN_MAX_EXT + 2) /* First timer IRQ */
96#define RAVEN_IPI_IRQ (RAVEN_TMR_IRQ + RAVEN_MAX_TMR) /* First IPI IRQ */
97/* First doorbell IRQ */
98#define RAVEN_DBL_IRQ (RAVEN_IPI_IRQ + (RAVEN_MAX_CPU * RAVEN_MAX_IPI))
99
100typedef struct FslMpicInfo { 52typedef struct FslMpicInfo {
101 int max_ext; 53 int max_ext;
102} FslMpicInfo; 54} FslMpicInfo;
@@ -138,44 +90,6 @@ static FslMpicInfo fsl_mpic_42 = {
138#define ILR_INTTGT_CINT 0x01 /* critical */ 90#define ILR_INTTGT_CINT 0x01 /* critical */
139#define ILR_INTTGT_MCP 0x02 /* machine check */ 91#define ILR_INTTGT_MCP 0x02 /* machine check */
140 92
141/* The currently supported INTTGT values happen to be the same as QEMU's
142 * openpic output codes, but don't depend on this. The output codes
143 * could change (unlikely, but...) or support could be added for
144 * more INTTGT values.
145 */
146static const int inttgt_output[][2] = {
147 {ILR_INTTGT_INT, OPENPIC_OUTPUT_INT},
148 {ILR_INTTGT_CINT, OPENPIC_OUTPUT_CINT},
149 {ILR_INTTGT_MCP, OPENPIC_OUTPUT_MCK},
150};
151
152static int inttgt_to_output(int inttgt)
153{
154 int i;
155
156 for (i = 0; i < ARRAY_SIZE(inttgt_output); i++) {
157 if (inttgt_output[i][0] == inttgt) {
158 return inttgt_output[i][1];
159 }
160 }
161
162 fprintf(stderr, "%s: unsupported inttgt %d\n", __func__, inttgt);
163 return OPENPIC_OUTPUT_INT;
164}
165
166static int output_to_inttgt(int output)
167{
168 int i;
169
170 for (i = 0; i < ARRAY_SIZE(inttgt_output); i++) {
171 if (inttgt_output[i][1] == output) {
172 return inttgt_output[i][0];
173 }
174 }
175
176 abort();
177}
178
179#define MSIIR_OFFSET 0x140 93#define MSIIR_OFFSET 0x140
180#define MSIIR_SRS_SHIFT 29 94#define MSIIR_SRS_SHIFT 29
181#define MSIIR_SRS_MASK (0x7 << MSIIR_SRS_SHIFT) 95#define MSIIR_SRS_MASK (0x7 << MSIIR_SRS_SHIFT)
@@ -1265,228 +1179,36 @@ static uint64_t openpic_cpu_read(void *opaque, hwaddr addr, unsigned len)
1265 return openpic_cpu_read_internal(opaque, addr, (addr & 0x1f000) >> 12); 1179 return openpic_cpu_read_internal(opaque, addr, (addr & 0x1f000) >> 12);
1266} 1180}
1267 1181
1268static const MemoryRegionOps openpic_glb_ops_le = {
1269 .write = openpic_gbl_write,
1270 .read = openpic_gbl_read,
1271 .endianness = DEVICE_LITTLE_ENDIAN,
1272 .impl = {
1273 .min_access_size = 4,
1274 .max_access_size = 4,
1275 },
1276};
1277
1278static const MemoryRegionOps openpic_glb_ops_be = { 1182static const MemoryRegionOps openpic_glb_ops_be = {
1279 .write = openpic_gbl_write, 1183 .write = openpic_gbl_write,
1280 .read = openpic_gbl_read, 1184 .read = openpic_gbl_read,
1281 .endianness = DEVICE_BIG_ENDIAN,
1282 .impl = {
1283 .min_access_size = 4,
1284 .max_access_size = 4,
1285 },
1286};
1287
1288static const MemoryRegionOps openpic_tmr_ops_le = {
1289 .write = openpic_tmr_write,
1290 .read = openpic_tmr_read,
1291 .endianness = DEVICE_LITTLE_ENDIAN,
1292 .impl = {
1293 .min_access_size = 4,
1294 .max_access_size = 4,
1295 },
1296}; 1185};
1297 1186
1298static const MemoryRegionOps openpic_tmr_ops_be = { 1187static const MemoryRegionOps openpic_tmr_ops_be = {
1299 .write = openpic_tmr_write, 1188 .write = openpic_tmr_write,
1300 .read = openpic_tmr_read, 1189 .read = openpic_tmr_read,
1301 .endianness = DEVICE_BIG_ENDIAN,
1302 .impl = {
1303 .min_access_size = 4,
1304 .max_access_size = 4,
1305 },
1306};
1307
1308static const MemoryRegionOps openpic_cpu_ops_le = {
1309 .write = openpic_cpu_write,
1310 .read = openpic_cpu_read,
1311 .endianness = DEVICE_LITTLE_ENDIAN,
1312 .impl = {
1313 .min_access_size = 4,
1314 .max_access_size = 4,
1315 },
1316}; 1190};
1317 1191
1318static const MemoryRegionOps openpic_cpu_ops_be = { 1192static const MemoryRegionOps openpic_cpu_ops_be = {
1319 .write = openpic_cpu_write, 1193 .write = openpic_cpu_write,
1320 .read = openpic_cpu_read, 1194 .read = openpic_cpu_read,
1321 .endianness = DEVICE_BIG_ENDIAN,
1322 .impl = {
1323 .min_access_size = 4,
1324 .max_access_size = 4,
1325 },
1326};
1327
1328static const MemoryRegionOps openpic_src_ops_le = {
1329 .write = openpic_src_write,
1330 .read = openpic_src_read,
1331 .endianness = DEVICE_LITTLE_ENDIAN,
1332 .impl = {
1333 .min_access_size = 4,
1334 .max_access_size = 4,
1335 },
1336}; 1195};
1337 1196
1338static const MemoryRegionOps openpic_src_ops_be = { 1197static const MemoryRegionOps openpic_src_ops_be = {
1339 .write = openpic_src_write, 1198 .write = openpic_src_write,
1340 .read = openpic_src_read, 1199 .read = openpic_src_read,
1341 .endianness = DEVICE_BIG_ENDIAN,
1342 .impl = {
1343 .min_access_size = 4,
1344 .max_access_size = 4,
1345 },
1346}; 1200};
1347 1201
1348static const MemoryRegionOps openpic_msi_ops_be = { 1202static const MemoryRegionOps openpic_msi_ops_be = {
1349 .read = openpic_msi_read, 1203 .read = openpic_msi_read,
1350 .write = openpic_msi_write, 1204 .write = openpic_msi_write,
1351 .endianness = DEVICE_BIG_ENDIAN,
1352 .impl = {
1353 .min_access_size = 4,
1354 .max_access_size = 4,
1355 },
1356}; 1205};
1357 1206
1358static const MemoryRegionOps openpic_summary_ops_be = { 1207static const MemoryRegionOps openpic_summary_ops_be = {
1359 .read = openpic_summary_read, 1208 .read = openpic_summary_read,
1360 .write = openpic_summary_write, 1209 .write = openpic_summary_write,
1361 .endianness = DEVICE_BIG_ENDIAN,
1362 .impl = {
1363 .min_access_size = 4,
1364 .max_access_size = 4,
1365 },
1366}; 1210};
1367 1211
1368static void openpic_save_IRQ_queue(QEMUFile * f, IRQQueue * q)
1369{
1370 unsigned int i;
1371
1372 for (i = 0; i < ARRAY_SIZE(q->queue); i++) {
1373 /* Always put the lower half of a 64-bit long first, in case we
1374 * restore on a 32-bit host. The least significant bits correspond
1375 * to lower IRQ numbers in the bitmap.
1376 */
1377 qemu_put_be32(f, (uint32_t) q->queue[i]);
1378#if LONG_MAX > 0x7FFFFFFF
1379 qemu_put_be32(f, (uint32_t) (q->queue[i] >> 32));
1380#endif
1381 }
1382
1383 qemu_put_sbe32s(f, &q->next);
1384 qemu_put_sbe32s(f, &q->priority);
1385}
1386
1387static void openpic_save(QEMUFile * f, void *opaque)
1388{
1389 OpenPICState *opp = (OpenPICState *) opaque;
1390 unsigned int i;
1391
1392 qemu_put_be32s(f, &opp->gcr);
1393 qemu_put_be32s(f, &opp->vir);
1394 qemu_put_be32s(f, &opp->pir);
1395 qemu_put_be32s(f, &opp->spve);
1396 qemu_put_be32s(f, &opp->tfrr);
1397
1398 qemu_put_be32s(f, &opp->nb_cpus);
1399
1400 for (i = 0; i < opp->nb_cpus; i++) {
1401 qemu_put_sbe32s(f, &opp->dst[i].ctpr);
1402 openpic_save_IRQ_queue(f, &opp->dst[i].raised);
1403 openpic_save_IRQ_queue(f, &opp->dst[i].servicing);
1404 qemu_put_buffer(f, (uint8_t *) & opp->dst[i].outputs_active,
1405 sizeof(opp->dst[i].outputs_active));
1406 }
1407
1408 for (i = 0; i < MAX_TMR; i++) {
1409 qemu_put_be32s(f, &opp->timers[i].tccr);
1410 qemu_put_be32s(f, &opp->timers[i].tbcr);
1411 }
1412
1413 for (i = 0; i < opp->max_irq; i++) {
1414 qemu_put_be32s(f, &opp->src[i].ivpr);
1415 qemu_put_be32s(f, &opp->src[i].idr);
1416 qemu_get_be32s(f, &opp->src[i].destmask);
1417 qemu_put_sbe32s(f, &opp->src[i].last_cpu);
1418 qemu_put_sbe32s(f, &opp->src[i].pending);
1419 }
1420}
1421
1422static void openpic_load_IRQ_queue(QEMUFile * f, IRQQueue * q)
1423{
1424 unsigned int i;
1425
1426 for (i = 0; i < ARRAY_SIZE(q->queue); i++) {
1427 unsigned long val;
1428
1429 val = qemu_get_be32(f);
1430#if LONG_MAX > 0x7FFFFFFF
1431 val <<= 32;
1432 val |= qemu_get_be32(f);
1433#endif
1434
1435 q->queue[i] = val;
1436 }
1437
1438 qemu_get_sbe32s(f, &q->next);
1439 qemu_get_sbe32s(f, &q->priority);
1440}
1441
1442static int openpic_load(QEMUFile * f, void *opaque, int version_id)
1443{
1444 OpenPICState *opp = (OpenPICState *) opaque;
1445 unsigned int i;
1446
1447 if (version_id != 1) {
1448 return -EINVAL;
1449 }
1450
1451 qemu_get_be32s(f, &opp->gcr);
1452 qemu_get_be32s(f, &opp->vir);
1453 qemu_get_be32s(f, &opp->pir);
1454 qemu_get_be32s(f, &opp->spve);
1455 qemu_get_be32s(f, &opp->tfrr);
1456
1457 qemu_get_be32s(f, &opp->nb_cpus);
1458
1459 for (i = 0; i < opp->nb_cpus; i++) {
1460 qemu_get_sbe32s(f, &opp->dst[i].ctpr);
1461 openpic_load_IRQ_queue(f, &opp->dst[i].raised);
1462 openpic_load_IRQ_queue(f, &opp->dst[i].servicing);
1463 qemu_get_buffer(f, (uint8_t *) & opp->dst[i].outputs_active,
1464 sizeof(opp->dst[i].outputs_active));
1465 }
1466
1467 for (i = 0; i < MAX_TMR; i++) {
1468 qemu_get_be32s(f, &opp->timers[i].tccr);
1469 qemu_get_be32s(f, &opp->timers[i].tbcr);
1470 }
1471
1472 for (i = 0; i < opp->max_irq; i++) {
1473 uint32_t val;
1474
1475 val = qemu_get_be32(f);
1476 write_IRQreg_idr(opp, i, val);
1477 val = qemu_get_be32(f);
1478 write_IRQreg_ivpr(opp, i, val);
1479
1480 qemu_get_be32s(f, &opp->src[i].ivpr);
1481 qemu_get_be32s(f, &opp->src[i].idr);
1482 qemu_get_be32s(f, &opp->src[i].destmask);
1483 qemu_get_sbe32s(f, &opp->src[i].last_cpu);
1484 qemu_get_sbe32s(f, &opp->src[i].pending);
1485 }
1486
1487 return 0;
1488}
1489
1490typedef struct MemReg { 1212typedef struct MemReg {
1491 const char *name; 1213 const char *name;
1492 MemoryRegionOps const *ops; 1214 MemoryRegionOps const *ops;
@@ -1614,73 +1336,7 @@ static int openpic_init(SysBusDevice * dev)
1614 map_list(opp, list_fsl, &list_count); 1336 map_list(opp, list_fsl, &list_count);
1615 1337
1616 break; 1338 break;
1617
1618 case OPENPIC_MODEL_RAVEN:
1619 opp->nb_irqs = RAVEN_MAX_EXT;
1620 opp->vid = VID_REVISION_1_3;
1621 opp->vir = VIR_GENERIC;
1622 opp->vector_mask = 0xFF;
1623 opp->tfrr_reset = 4160000;
1624 opp->ivpr_reset = IVPR_MASK_MASK | IVPR_MODE_MASK;
1625 opp->idr_reset = 0;
1626 opp->max_irq = RAVEN_MAX_IRQ;
1627 opp->irq_ipi0 = RAVEN_IPI_IRQ;
1628 opp->irq_tim0 = RAVEN_TMR_IRQ;
1629 opp->brr1 = -1;
1630 opp->mpic_mode_mask = GCR_MODE_MIXED;
1631
1632 /* Only UP supported today */
1633 if (opp->nb_cpus != 1) {
1634 return -EINVAL;
1635 }
1636
1637 map_list(opp, list_le, &list_count);
1638 break;
1639 }
1640
1641 for (i = 0; i < opp->nb_cpus; i++) {
1642 opp->dst[i].irqs = g_new(qemu_irq, OPENPIC_OUTPUT_NB);
1643 for (j = 0; j < OPENPIC_OUTPUT_NB; j++) {
1644 sysbus_init_irq(dev, &opp->dst[i].irqs[j]);
1645 }
1646 } 1339 }
1647 1340
1648 register_savevm(&opp->busdev.qdev, "openpic", 0, 2,
1649 openpic_save, openpic_load, opp);
1650
1651 sysbus_init_mmio(dev, &opp->mem);
1652 qdev_init_gpio_in(&dev->qdev, openpic_set_irq, opp->max_irq);
1653
1654 return 0; 1341 return 0;
1655} 1342}
1656
1657static Property openpic_properties[] = {
1658 DEFINE_PROP_UINT32("model", OpenPICState, model,
1659 OPENPIC_MODEL_FSL_MPIC_20),
1660 DEFINE_PROP_UINT32("nb_cpus", OpenPICState, nb_cpus, 1),
1661 DEFINE_PROP_END_OF_LIST(),
1662};
1663
1664static void openpic_class_init(ObjectClass * klass, void *data)
1665{
1666 DeviceClass *dc = DEVICE_CLASS(klass);
1667 SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
1668
1669 k->init = openpic_init;
1670 dc->props = openpic_properties;
1671 dc->reset = openpic_reset;
1672}
1673
1674static const TypeInfo openpic_info = {
1675 .name = "openpic",
1676 .parent = TYPE_SYS_BUS_DEVICE,
1677 .instance_size = sizeof(OpenPICState),
1678 .class_init = openpic_class_init,
1679};
1680
1681static void openpic_register_types(void)
1682{
1683 type_register_static(&openpic_info);
1684}
1685
1686type_init(openpic_register_types)