[PATCH 5/6] kvm/powerpc: Add MPC85xx board support
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
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