From: Peter Maydell <peter.maydell@linaro.org>
To: Anthony Liguori <anthony@codemonkey.ws>
Cc: qemu-devel@nongnu.org, Paul Brook <paul@codesourcery.com>
Subject: [Qemu-devel] [PATCH 16/22] arm_boot: Pass base address of GIC CPU interface, not whole GIC
Date: Fri, 17 Feb 2012 11:29:31 +0000 [thread overview]
Message-ID: <1329478177-14650-17-git-send-email-peter.maydell@linaro.org> (raw)
In-Reply-To: <1329478177-14650-1-git-send-email-peter.maydell@linaro.org>
The arm_boot secondary boot loader code needs the address of
the GIC CPU interface. Obtaining this from the base address
of the private peripheral region was possible for A9 and 11MPcore,
but the A15 puts the GIC CPU interface in a different place.
So make boards pass in the GIC CPU interface address directly.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
hw/arm-misc.h | 2 +-
hw/arm_boot.c | 8 ++++----
hw/exynos4_boards.c | 3 ++-
hw/realview.c | 12 +++++++-----
hw/vexpress.c | 6 ++++--
5 files changed, 18 insertions(+), 13 deletions(-)
diff --git a/hw/arm-misc.h b/hw/arm-misc.h
index 5e5204b..306013a 100644
--- a/hw/arm-misc.h
+++ b/hw/arm-misc.h
@@ -37,7 +37,7 @@ struct arm_boot_info {
*/
target_phys_addr_t smp_loader_start;
target_phys_addr_t smp_bootreg_addr;
- target_phys_addr_t smp_priv_base;
+ target_phys_addr_t gic_cpu_if_addr;
int nb_cpus;
int board_id;
int (*atag_board)(const struct arm_boot_info *info, void *p);
diff --git a/hw/arm_boot.c b/hw/arm_boot.c
index 34a8739..2ef25ca 100644
--- a/hw/arm_boot.c
+++ b/hw/arm_boot.c
@@ -43,16 +43,16 @@ static uint32_t bootloader[] = {
* location for the kernel secondary CPU entry point.
*/
static uint32_t smpboot[] = {
- 0xe59f201c, /* ldr r2, privbase */
+ 0xe59f201c, /* ldr r2, gic_cpu_if */
0xe59f001c, /* ldr r0, startaddr */
0xe3a01001, /* mov r1, #1 */
- 0xe5821100, /* str r1, [r2, #256] */
+ 0xe5821000, /* str r1, [r2] */
0xe320f003, /* wfi */
0xe5901000, /* ldr r1, [r0] */
0xe1110001, /* tst r1, r1 */
0x0afffffb, /* beq <wfi> */
0xe12fff11, /* bx r1 */
- 0, /* privbase: Private memory region base address. */
+ 0, /* gic_cpu_if: base address of GIC CPU interface */
0 /* bootreg: Boot register address is held here */
};
@@ -61,7 +61,7 @@ static void default_write_secondary(CPUState *env,
{
int n;
smpboot[ARRAY_SIZE(smpboot) - 1] = info->smp_bootreg_addr;
- smpboot[ARRAY_SIZE(smpboot) - 2] = info->smp_priv_base;
+ smpboot[ARRAY_SIZE(smpboot) - 2] = info->gic_cpu_if_addr;
for (n = 0; n < ARRAY_SIZE(smpboot); n++) {
smpboot[n] = tswap32(smpboot[n]);
}
diff --git a/hw/exynos4_boards.c b/hw/exynos4_boards.c
index 329efbe..553a02b 100644
--- a/hw/exynos4_boards.c
+++ b/hw/exynos4_boards.c
@@ -112,7 +112,8 @@ static Exynos4210State *exynos4_boards_init_common(
exynos4_board_binfo.kernel_filename = kernel_filename;
exynos4_board_binfo.initrd_filename = initrd_filename;
exynos4_board_binfo.kernel_cmdline = kernel_cmdline;
- exynos4_board_binfo.smp_priv_base = EXYNOS4210_SMP_PRIVATE_BASE_ADDR;
+ exynos4_board_binfo.gic_cpu_if_addr =
+ EXYNOS4210_SMP_PRIVATE_BASE_ADDR + 0x100;
PRINT_DEBUG("\n ram_size: %luMiB [0x%08lx]\n"
" kernel_filename: %s\n"
diff --git a/hw/realview.c b/hw/realview.c
index bcf982f..ae1bbcd 100644
--- a/hw/realview.c
+++ b/hw/realview.c
@@ -222,21 +222,23 @@ static void realview_init(ram_addr_t ram_size,
sysbus_mmio_map(sysbus_from_qdev(sysctl), 0, 0x10000000);
if (is_mpcore) {
+ target_phys_addr_t periphbase;
dev = qdev_create(NULL, is_pb ? "a9mpcore_priv": "realview_mpcore");
qdev_prop_set_uint32(dev, "num-cpu", smp_cpus);
qdev_init_nofail(dev);
busdev = sysbus_from_qdev(dev);
if (is_pb) {
- realview_binfo.smp_priv_base = 0x1f000000;
+ periphbase = 0x1f000000;
} else {
- realview_binfo.smp_priv_base = 0x10100000;
+ periphbase = 0x10100000;
}
- sysbus_mmio_map(busdev, 0, realview_binfo.smp_priv_base);
+ sysbus_mmio_map(busdev, 0, periphbase);
for (n = 0; n < smp_cpus; n++) {
sysbus_connect_irq(busdev, n, cpu_irq[n]);
}
- sysbus_create_varargs("l2x0", realview_binfo.smp_priv_base + 0x2000,
- NULL);
+ sysbus_create_varargs("l2x0", periphbase + 0x2000, NULL);
+ /* Both A9 and 11MPCore put the GIC CPU i/f at base + 0x100 */
+ realview_binfo.gic_cpu_if_addr = periphbase + 0x100;
} else {
uint32_t gic_addr = is_pb ? 0x1e000000 : 0x10040000;
/* For now just create the nIRQ GIC, and ignore the others. */
diff --git a/hw/vexpress.c b/hw/vexpress.c
index 43ad206..aae9d81 100644
--- a/hw/vexpress.c
+++ b/hw/vexpress.c
@@ -115,6 +115,7 @@ typedef void DBoardInitFn(const VEDBoardInfo *daughterboard,
struct VEDBoardInfo {
const target_phys_addr_t *motherboard_map;
target_phys_addr_t loader_start;
+ const target_phys_addr_t gic_cpu_if_addr;
DBoardInitFn *init;
};
@@ -175,8 +176,7 @@ static void a9_daughterboard_init(const VEDBoardInfo *daughterboard,
qdev_prop_set_uint32(dev, "num-cpu", smp_cpus);
qdev_init_nofail(dev);
busdev = sysbus_from_qdev(dev);
- vexpress_binfo.smp_priv_base = 0x1e000000;
- sysbus_mmio_map(busdev, 0, vexpress_binfo.smp_priv_base);
+ sysbus_mmio_map(busdev, 0, 0x1e000000);
for (n = 0; n < smp_cpus; n++) {
sysbus_connect_irq(busdev, n, cpu_irq[n]);
}
@@ -214,6 +214,7 @@ static void a9_daughterboard_init(const VEDBoardInfo *daughterboard,
static const VEDBoardInfo a9_daughterboard = {
.motherboard_map = motherboard_legacy_map,
.loader_start = 0x60000000,
+ .gic_cpu_if_addr = 0x1e000100,
.init = a9_daughterboard_init,
};
@@ -316,6 +317,7 @@ static void vexpress_common_init(const VEDBoardInfo *daughterboard,
vexpress_binfo.loader_start = daughterboard->loader_start;
vexpress_binfo.smp_loader_start = map[VE_SRAM];
vexpress_binfo.smp_bootreg_addr = map[VE_SYSREGS] + 0x30;
+ vexpress_binfo.gic_cpu_if_addr = daughterboard->gic_cpu_if_addr;
arm_load_kernel(first_cpu, &vexpress_binfo);
}
--
1.7.1
next prev parent reply other threads:[~2012-02-17 11:35 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-17 11:29 [Qemu-devel] [PULL 00/22] arm-devs queue Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 01/22] ARM: exynos4210: IRQ subsystem support Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 02/22] ARM: Samsung exynos4210-based boards emulation Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 03/22] ARM: exynos4210: UART support Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 04/22] ARM: exynos4210: PWM support Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 05/22] ARM: exynos4210: basic Power Management Unit implementation Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 06/22] ARM: exynos4210: MCT support Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 07/22] hw/lan9118: Add basic 16-bit mode support Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 08/22] hw/exynos4210.c: Add LAN support for SMDKC210 Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 09/22] Exynos4210: added display controller implementation Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 10/22] MAINTAINERS: Add maintainers for Exynos SOC Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 11/22] hw/a15mpcore.c: Add Cortex-A15 private peripheral model Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 12/22] hw/vexpress.c: Make motherboard peripheral memory map table-driven Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 13/22] hw/vexpress.c: Move secondary CPU boot code to SRAM Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 14/22] hw/vexpress.c: Factor out daughterboard-specific initialization Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 15/22] hw/vexpress.c: Instantiate the motherboard CLCD Peter Maydell
2012-02-17 11:29 ` Peter Maydell [this message]
2012-02-17 11:29 ` [Qemu-devel] [PATCH 17/22] hw/vexpress.c: Add vexpress-a15 machine Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 18/22] hw/arm_sysctl: Drop legacy init function Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 19/22] hw/primecell.h: Remove obsolete pl080_init() declaration Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 20/22] Remove unnecessary includes of primecell.h Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 21/22] MAINTAINERS: Add hw/highbank.c maintainer Peter Maydell
2012-02-17 11:29 ` [Qemu-devel] [PATCH 22/22] hw/pl031: Actually raise interrupt on timer expiry Peter Maydell
2012-02-17 13:53 ` [Qemu-devel] [PULL 00/22] arm-devs queue Anthony Liguori
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=1329478177-14650-17-git-send-email-peter.maydell@linaro.org \
--to=peter.maydell@linaro.org \
--cc=anthony@codemonkey.ws \
--cc=paul@codesourcery.com \
--cc=qemu-devel@nongnu.org \
/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).