From: "Andreas Färber" <afaerber@suse.de>
To: Bharat Bhushan <r65777@freescale.com>,
agraf@suse.de, Avi Kivity <avi@redhat.com>
Cc: Bharat Bhushan <Bharat.Bhushan@freescale.com>,
qemu-ppc@nongnu.org, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 2/3] e500: Adding CCSR memory region
Date: Mon, 08 Oct 2012 19:21:39 +0200 [thread overview]
Message-ID: <50730BA3.5000005@suse.de> (raw)
In-Reply-To: <1349714816-12618-3-git-send-email-Bharat.Bhushan@freescale.com>
Am 08.10.2012 18:46, schrieb Bharat Bhushan:
> All devices are also placed under CCSR memory region.
> The CCSR memory region is exported to pci device. The MSI interrupt
> generation is the main reason to export the CCSR region to PCI device.
> This put the requirement to move mpic under CCSR region, but logically
> all devices should be under CCSR. So this patch places all emulated
> devices under ccsr region.
>
> Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com>
> ---
> hw/ppc/e500.c | 61 +++++++++++++++++++++++++++++++++++---------------------
> 1 files changed, 38 insertions(+), 23 deletions(-)
>
> diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
> index 1949c81..b3e6a1e 100644
> --- a/hw/ppc/e500.c
> +++ b/hw/ppc/e500.c
> @@ -46,14 +46,16 @@
> /* TODO: parameterize */
> #define MPC8544_CCSRBAR_BASE 0xE0000000ULL
> #define MPC8544_CCSRBAR_SIZE 0x00100000ULL
> -#define MPC8544_MPIC_REGS_BASE (MPC8544_CCSRBAR_BASE + 0x40000ULL)
> -#define MPC8544_SERIAL0_REGS_BASE (MPC8544_CCSRBAR_BASE + 0x4500ULL)
> -#define MPC8544_SERIAL1_REGS_BASE (MPC8544_CCSRBAR_BASE + 0x4600ULL)
> -#define MPC8544_PCI_REGS_BASE (MPC8544_CCSRBAR_BASE + 0x8000ULL)
> +#define MPC8544_MPIC_REGS_OFFSET 0x40000ULL
> +#define MPC8544_SERIAL0_REGS_OFFSET 0x4500ULL
> +#define MPC8544_SERIAL1_REGS_OFFSET 0x4600ULL
> +#define MPC8544_PCI_REGS_OFFSET 0x8000ULL
> +#define MPC8544_PCI_REGS_BASE (MPC8544_CCSRBAR_BASE + \
> + MPC8544_PCI_REGS_OFFSET)
> #define MPC8544_PCI_REGS_SIZE 0x1000ULL
> #define MPC8544_PCI_IO 0xE1000000ULL
> #define MPC8544_PCI_IOLEN 0x10000ULL
> -#define MPC8544_UTIL_BASE (MPC8544_CCSRBAR_BASE + 0xe0000ULL)
> +#define MPC8544_UTIL_OFFSET 0xe0000ULL
> #define MPC8544_SPIN_BASE 0xEF000000ULL
>
> struct boot_info
> @@ -268,13 +270,12 @@ static int ppce500_load_device_tree(CPUPPCState *env,
> /* XXX should contain a reasonable value */
> qemu_devtree_setprop_cell(fdt, soc, "bus-frequency", 0);
>
> - snprintf(mpic, sizeof(mpic), "%s/pic@%llx", soc,
> - MPC8544_MPIC_REGS_BASE - MPC8544_CCSRBAR_BASE);
> + snprintf(mpic, sizeof(mpic), "%s/pic@%llx", soc, MPC8544_MPIC_REGS_OFFSET);
> qemu_devtree_add_subnode(fdt, mpic);
> qemu_devtree_setprop_string(fdt, mpic, "device_type", "open-pic");
> qemu_devtree_setprop_string(fdt, mpic, "compatible", "chrp,open-pic");
> - qemu_devtree_setprop_cells(fdt, mpic, "reg", MPC8544_MPIC_REGS_BASE -
> - MPC8544_CCSRBAR_BASE, 0x40000);
> + qemu_devtree_setprop_cells(fdt, mpic, "reg", MPC8544_MPIC_REGS_OFFSET,
> + 0x40000);
> qemu_devtree_setprop_cell(fdt, mpic, "#address-cells", 0);
> qemu_devtree_setprop_cell(fdt, mpic, "#interrupt-cells", 2);
> mpic_ph = qemu_devtree_alloc_phandle(fdt);
> @@ -287,17 +288,16 @@ static int ppce500_load_device_tree(CPUPPCState *env,
> * device it finds in the dt as serial output device. And we generate
> * devices in reverse order to the dt.
> */
> - dt_serial_create(fdt, MPC8544_SERIAL1_REGS_BASE - MPC8544_CCSRBAR_BASE,
> + dt_serial_create(fdt, MPC8544_SERIAL1_REGS_OFFSET,
> soc, mpic, "serial1", 1, false);
> - dt_serial_create(fdt, MPC8544_SERIAL0_REGS_BASE - MPC8544_CCSRBAR_BASE,
> + dt_serial_create(fdt, MPC8544_SERIAL0_REGS_OFFSET,
> soc, mpic, "serial0", 0, true);
>
> snprintf(gutil, sizeof(gutil), "%s/global-utilities@%llx", soc,
> - MPC8544_UTIL_BASE - MPC8544_CCSRBAR_BASE);
> + MPC8544_UTIL_OFFSET);
> qemu_devtree_add_subnode(fdt, gutil);
> qemu_devtree_setprop_string(fdt, gutil, "compatible", "fsl,mpc8544-guts");
> - qemu_devtree_setprop_cells(fdt, gutil, "reg", MPC8544_UTIL_BASE -
> - MPC8544_CCSRBAR_BASE, 0x1000);
> + qemu_devtree_setprop_cells(fdt, gutil, "reg", MPC8544_UTIL_OFFSET, 0x1000);
> qemu_devtree_setprop(fdt, gutil, "fsl,has-rstcr", NULL, 0);
>
> snprintf(pci, sizeof(pci), "/pci@%llx", MPC8544_PCI_REGS_BASE);
> @@ -423,6 +423,8 @@ void ppce500_init(PPCE500Params *params)
> qemu_irq **irqs, *mpic;
> DeviceState *dev;
> CPUPPCState *firstenv = NULL;
> + MemoryRegion *ccsr;
> + SysBusDevice *s;
>
> /* Setup CPUs */
> if (params->cpu_model == NULL) {
> @@ -451,7 +453,8 @@ void ppce500_init(PPCE500Params *params)
> irqs[i][OPENPIC_OUTPUT_INT] = input[PPCE500_INPUT_INT];
> irqs[i][OPENPIC_OUTPUT_CINT] = input[PPCE500_INPUT_CINT];
> env->spr[SPR_BOOKE_PIR] = env->cpu_index = i;
> - env->mpic_cpu_base = MPC8544_MPIC_REGS_BASE + 0x20000;
> + env->mpic_cpu_base = MPC8544_CCSRBAR_BASE +
> + MPC8544_MPIC_REGS_OFFSET + 0x20000;
>
> ppc_booke_timers_init(env, 400000000, PPC_TIMER_E500);
>
> @@ -478,8 +481,12 @@ void ppce500_init(PPCE500Params *params)
> vmstate_register_ram_global(ram);
> memory_region_add_subregion(address_space_mem, 0, ram);
>
> + ccsr = g_malloc0(sizeof(MemoryRegion));
> + memory_region_init(ccsr, "e500-cssr", MPC8544_CCSRBAR_SIZE);
> + memory_region_add_subregion(address_space_mem, MPC8544_CCSRBAR_BASE, ccsr);
> +
> /* MPIC */
> - mpic = mpic_init(address_space_mem, MPC8544_MPIC_REGS_BASE,
> + mpic = mpic_init(ccsr, MPC8544_MPIC_REGS_OFFSET,
> smp_cpus, irqs, NULL);
>
> if (!mpic) {
> @@ -488,25 +495,33 @@ void ppce500_init(PPCE500Params *params)
>
> /* Serial */
> if (serial_hds[0]) {
> - serial_mm_init(address_space_mem, MPC8544_SERIAL0_REGS_BASE,
> + serial_mm_init(ccsr, MPC8544_SERIAL0_REGS_OFFSET,
> 0, mpic[12+26], 399193,
> serial_hds[0], DEVICE_BIG_ENDIAN);
> }
>
> if (serial_hds[1]) {
> - serial_mm_init(address_space_mem, MPC8544_SERIAL1_REGS_BASE,
> + serial_mm_init(ccsr, MPC8544_SERIAL1_REGS_OFFSET,
> 0, mpic[12+26], 399193,
> serial_hds[1], DEVICE_BIG_ENDIAN);
> }
>
> /* General Utility device */
> - sysbus_create_simple("mpc8544-guts", MPC8544_UTIL_BASE, NULL);
> + dev = qdev_create(NULL, "mpc8544-guts");
> + qdev_init_nofail(dev);
> + s = sysbus_from_qdev(dev);
s = SYS_BUS_DEVICE(dev);
> + memory_region_add_subregion(ccsr, MPC8544_UTIL_OFFSET, s->mmio[0].memory);
Hmm ...
>
> /* PCI */
> - dev = sysbus_create_varargs("e500-pcihost", MPC8544_PCI_REGS_BASE,
> - mpic[pci_irq_nrs[0]], mpic[pci_irq_nrs[1]],
> - mpic[pci_irq_nrs[2]], mpic[pci_irq_nrs[3]],
> - NULL);
> + dev = qdev_create(NULL, "e500-pcihost");
> + qdev_init_nofail(dev);
> + s = sysbus_from_qdev(dev);
(dito)
> + sysbus_connect_irq(s, 0, mpic[pci_irq_nrs[0]]);
> + sysbus_connect_irq(s, 1, mpic[pci_irq_nrs[1]]);
> + sysbus_connect_irq(s, 2, mpic[pci_irq_nrs[2]]);
> + sysbus_connect_irq(s, 3, mpic[pci_irq_nrs[3]]);
> + memory_region_add_subregion(ccsr, MPC8544_PCI_REGS_OFFSET, s->mmio[0].memory);
... I wonder if fiddling with SysBus MMIO is a good idea.
s->mmio[0].addr is not getting assigned this way, which is checked as
condition for deleting the subregion. But sysbus_mmio_map() only adds to
/ deletes from get_system_memory().
The alternative would be using a custom field rather than the
SysBus-internal one. Avi/Alex?
> +
> pci_bus = (PCIBus *)qdev_get_child_bus(dev, "pci.0");
> if (!pci_bus)
> printf("couldn't create PCI controller!\n");
>
Andreas
--
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
next prev parent reply other threads:[~2012-10-08 17:21 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-08 16:46 [Qemu-devel] [PATCH 0/3] e500: creating CCSR region and registering bar0 Bharat Bhushan
2012-10-08 16:46 ` [Qemu-devel] [PATCH 1/3] e500: Fix serial initialization Bharat Bhushan
2012-10-08 17:00 ` Andreas Färber
2012-10-08 18:54 ` Alexander Graf
2012-10-08 16:46 ` [Qemu-devel] [PATCH 2/3] e500: Adding CCSR memory region Bharat Bhushan
2012-10-08 17:21 ` Andreas Färber [this message]
2012-10-08 18:58 ` Alexander Graf
2012-10-09 17:23 ` Andreas Färber
2012-10-09 9:04 ` Avi Kivity
2012-10-09 16:45 ` Bhushan Bharat-R65777
2012-10-09 16:53 ` Avi Kivity
2012-10-09 16:57 ` Bhushan Bharat-R65777
2012-10-09 17:01 ` Avi Kivity
2012-10-09 17:05 ` Bhushan Bharat-R65777
2012-10-08 17:26 ` Andreas Färber
2012-10-08 16:46 ` [Qemu-devel] [PATCH 3/3] Adding BAR0 for e500 PCI controller Bharat Bhushan
2012-10-08 18:00 ` Andreas Färber
2012-10-08 19:04 ` Alexander Graf
2012-10-08 20:23 ` Scott Wood
2012-10-09 1:55 ` Bhushan Bharat-R65777
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=50730BA3.5000005@suse.de \
--to=afaerber@suse.de \
--cc=Bharat.Bhushan@freescale.com \
--cc=agraf@suse.de \
--cc=avi@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=r65777@freescale.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).