[PATCH 5/6] kvm/powerpc: Add MPC85xx board support

2009-01-22 Thread Liu Yu
All MPC85xx boards use E500v1/v2 core.
This patch add emulation of a virtual MPC85xx board,
so that any MPC85xx host could run this emulation.

Only tested it on MPC8544DS and MPC8572DS hosts,
but it should work on other MPC85xx boards.

Signed-off-by: Liu Yu yu@freescale.com
---
 Makefile.target  |2 +-
 hw/boards.h  |1 +
 hw/ppce500.h |   22 +++
 hw/ppce500_mpc85xx.c |  346 ++
 target-ppc/machine.c |1 +
 5 files changed, 371 insertions(+), 1 deletions(-)
 create mode 100644 hw/ppce500.h
 create mode 100644 hw/ppce500_mpc85xx.c

diff --git a/Makefile.target b/Makefile.target
index 5cae257..3852f53 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -599,7 +599,7 @@ OBJS+= unin_pci.o ppc_chrp.o
 OBJS+= pflash_cfi02.o ppc4xx_devs.o ppc4xx_pci.o ppc405_uc.o ppc405_boards.o
 OBJS+= ppc440.o ppc440_bamboo.o
 # PowerPC E500 boards
-OBJS+= ppce500_pci.o
+OBJS+= ppce500_pci.o ppce500_mpc85xx.o
 ifdef FDT_LIBS
 OBJS+= device_tree.o
 LIBS+= $(FDT_LIBS)
diff --git a/hw/boards.h b/hw/boards.h
index 0577f06..1939f78 100644
--- a/hw/boards.h
+++ b/hw/boards.h
@@ -40,6 +40,7 @@ extern QEMUMachine heathrow_machine;
 extern QEMUMachine ref405ep_machine;
 extern QEMUMachine taihu_machine;
 extern QEMUMachine bamboo_machine;
+extern QEMUMachine mpc85xx_machine;
 
 /* mips_r4k.c */
 extern QEMUMachine mips_machine;
diff --git a/hw/ppce500.h b/hw/ppce500.h
new file mode 100644
index 000..24d49bb
--- /dev/null
+++ b/hw/ppce500.h
@@ -0,0 +1,22 @@
+/*
+ * QEMU PowerPC E500 emulation shared definitions
+ *
+ * Copyright (C) 2009 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Yu Liu, yu@freescale.com
+ *
+ * This file is derived from hw/ppc440.h
+ * the copyright for that material belongs to the original owners.
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of  the GNU General  Public License as published by
+ * the Free Software Foundation;  either version 2 of the  License, or
+ * (at your option) any later version.
+ */
+
+#if !defined(PPC_E500_H)
+#define PPC_E500_H
+
+PCIBus *ppce500_pci_init(qemu_irq *pic, target_phys_addr_t registers);
+
+#endif /* !defined(PPC_E500_H) */
diff --git a/hw/ppce500_mpc85xx.c b/hw/ppce500_mpc85xx.c
new file mode 100644
index 000..9dd619d
--- /dev/null
+++ b/hw/ppce500_mpc85xx.c
@@ -0,0 +1,346 @@
+/*
+ * Qemu PowerPC MPC85xx board emualtion
+ *
+ * Copyright (C) 2009 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Yu Liu, yu@freescale.com
+ *
+ * This file is derived from hw/ppc440_bamboo.c,
+ * the copyright for that material belongs to the original owners.
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of  the GNU General  Public License as published by
+ * the Free Software Foundation;  either version 2 of the  License, or
+ * (at your option) any later version.
+ */
+
+#include dirent.h
+
+#include config.h
+#include qemu-common.h
+#include net.h
+#include hw.h
+#include pc.h
+#include pci.h
+#include virtio-blk.h
+#include boards.h
+#include sysemu.h
+#include kvm.h
+#include kvm_ppc.h
+#include device_tree.h
+#include openpic.h
+#include ppce500.h
+
+#define BINARY_DEVICE_TREE_FILE  mpc85xx.dtb
+#define UIMAGE_LOAD_BASE 0
+#define DTB_LOAD_BASE0x60
+#define INITRD_LOAD_BASE 0x200
+
+#define RAM_SIZES_ALIGN  (64UL  20)
+
+#define MPC85xx_CCSRBAR_BASE   0xE000
+#define MPC85xx_MPIC_REGS_BASE (MPC85xx_CCSRBAR_BASE + 0x4)
+#define MPC85xx_SERIAL0_REGS_BASE  (MPC85xx_CCSRBAR_BASE + 0x4500)
+#define MPC85xx_SERIAL1_REGS_BASE  (MPC85xx_CCSRBAR_BASE + 0x4600)
+#define MPC85xx_PCI_REGS_BASE  (MPC85xx_CCSRBAR_BASE + 0x8000)
+#define MPC85xx_PCI_REGS_SIZE  0x1000
+#define MPC85xx_PCI_IO 0xE100
+#define MPC85xx_PCI_IOLEN 0x1
+
+struct board {
+const char *model;
+const char *compatible;
+};
+
+#define BOARD_DEF(_model, _compatible)   \
+{\
+.model   = _model,   \
+.compatible  = _compatible,  \
+}
+
+/* Supported host boards */
+static const struct board mpc85xx_table[] = {
+BOARD_DEF(MPC8544DS,MPC8544DS), /* MPC8544DS */
+BOARD_DEF(fsl,MPC8572DS,fsl,MPC8572DS), /* MPC8572DS */
+BOARD_DEF(fsl,mpc8536ds,fsl,mpc8536ds), /* MPC8536DS */
+BOARD_DEF(MPC8548CDS,   MPC8548CDS),/* MPC8548CDS */
+BOARD_DEF(MPC8555CDS,   MPC8555CDS),/* MPC8555CDS */
+BOARD_DEF(MPC8541CDS,   MPC8541CDS),/* MPC8541CDS */
+BOARD_DEF(MPC8540ADS,   MPC8540ADS),/* MPC8540ADS */
+BOARD_DEF(MPC8560ADS,   MPC8560ADS),/* MPC8560ADS */
+BOARD_DEF(MPC8568EMDS,  MPC8568EMDS),   /* MPC8568EMDS */
+};
+
+#define BOARDS_NUM   (sizeof(mpc85xx_table)/sizeof(struct board))
+
+static int 

Re: [PATCH 5/6] kvm/powerpc: Add MPC85xx board support

2009-01-22 Thread Hollis Blanchard
On Thu, 2009-01-22 at 18:14 +0800, Liu Yu wrote:
 All MPC85xx boards use E500v1/v2 core.
 This patch add emulation of a virtual MPC85xx board,
 so that any MPC85xx host could run this emulation.
 
 Only tested it on MPC8544DS and MPC8572DS hosts,
 but it should work on other MPC85xx boards.
 
 Signed-off-by: Liu Yu yu@freescale.com
...

 +struct board {
 +const char *model;
 +const char *compatible;
 +};
 +
 +#define BOARD_DEF(_model, _compatible)   \
 +{\
 +.model   = _model,   \
 +.compatible  = _compatible,  \
 +}
 +
 +/* Supported host boards */
 +static const struct board mpc85xx_table[] = {
 +BOARD_DEF(MPC8544DS,MPC8544DS), /* MPC8544DS */
 +BOARD_DEF(fsl,MPC8572DS,fsl,MPC8572DS), /* MPC8572DS */
 +BOARD_DEF(fsl,mpc8536ds,fsl,mpc8536ds), /* MPC8536DS */
 +BOARD_DEF(MPC8548CDS,   MPC8548CDS),/* MPC8548CDS */
 +BOARD_DEF(MPC8555CDS,   MPC8555CDS),/* MPC8555CDS */
 +BOARD_DEF(MPC8541CDS,   MPC8541CDS),/* MPC8541CDS */
 +BOARD_DEF(MPC8540ADS,   MPC8540ADS),/* MPC8540ADS */
 +BOARD_DEF(MPC8560ADS,   MPC8560ADS),/* MPC8560ADS */
 +BOARD_DEF(MPC8568EMDS,  MPC8568EMDS),   /* MPC8568EMDS */
 +};
 +
 +#define BOARDS_NUM   (sizeof(mpc85xx_table)/sizeof(struct board))
...
 +static void *mpc85xx_load_device_tree(void *addr,
 + uint32_t ramsize,
 + target_phys_addr_t initrd_base,
 + target_phys_addr_t initrd_size,
 + const char *kernel_cmdline)
 +{
...
 +if (kvm_enabled()) {
 + FILE *fp;
 + char *model;
 + char const *compatible = NULL;
 + struct dirent *dirp;
 + DIR *dp;
 + int i;
 + char buf[128];
 +
 + if ((fp = fopen(/proc/cpuinfo, r)) == NULL) {
 + printf(Can't open file /proc/cpuinfo\n);
 + goto out;
 + }
 + while (fgets(buf, 128, fp) != NULL) {
 + if (strncmp(buf, model, 5) == 0) {
 + model = buf + 9;
 + break;
 + }
 + }
 + fclose(fp);
 +
 + for (i = 0; i  BOARDS_NUM; i++) {
 + if (strncmp(model, mpc85xx_table[i].model,
 + strlen(mpc85xx_table[i].model)) == 0) {
 + compatible = mpc85xx_table[i].compatible;
 + }
 + }
 +
 + if (compatible == NULL) {
 + printf(Unknow host board!\n);
 + goto out;
 + }
 +
 + ret = qemu_devtree_setprop_string(fdt, /, compatible, compatible);
 + if (ret  0)
 + fprintf(stderr, couldn't set /compatible = %s\n, compatible);
 +
 + if ((dp = opendir(/proc/device-tree/cpus/)) == NULL) {
 + printf(Can't open directory /proc/device-tree/cpus/\n);
 + goto out;
 + }
 +
 + buf[0] = '\0';
 + while ((dirp = readdir(dp)) != NULL) {
 + if (strncmp(dirp-d_name, PowerPC, 7) == 0) {
 + sprintf(buf, /proc/device-tree/cpus/%s, dirp-d_name);
 + break;
 + }
 + }
 + closedir(dp);
 + if (buf[0] == '\0') {
 + printf(Unknow host!\n);
 + goto out;
 + }
 + path = buf + 17;

I don't think you should do this at all. As long as the core is known,
it doesn't matter what the host board is. You *always* emulate the
MPC8544DS board (that's what your device tree says). You should be able
to emulate a MPC8544DS on *any* e500v2 host board or chip.

For comparison, on 440 we have tested with Sequoia (440EPx) and Bamboo
(440EP) hosts, but qemu always emulates a Bamboo guest. The chips aren't
the same, but that's irrelevant because the core is (440 x5).

The rest of this patch looks good.

-- 
Hollis Blanchard
IBM Linux Technology Center

--
To unsubscribe from this list: send the line unsubscribe kvm-ppc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html