[PATCH 17/21] arm: Use paging_map/unmap_device for GIC and vexpress sysregs

2 views
Skip to first unread message

Jan Kiszka

unread,
Sep 29, 2016, 4:22:49 PM9/29/16
to jailho...@googlegroups.com
Less boilerplate code, arch_map/unmap_device becomes unused, and we also
properly allocate the virtual addresses of the mapped resources from the
remapping pool, instead of relying on identity mapping creating no
conflicts.

Signed-off-by: Jan Kiszka <jan.k...@siemens.com>
---
hypervisor/arch/arm/gic-v2.c | 31 +++++++++++++++----------------
hypervisor/arch/arm/gic-v3.c | 10 ++++++----
hypervisor/arch/arm/irqchip.c | 10 ++++------
hypervisor/arch/arm/smp-vexpress.c | 14 +++++++-------
4 files changed, 32 insertions(+), 33 deletions(-)

diff --git a/hypervisor/arch/arm/gic-v2.c b/hypervisor/arch/arm/gic-v2.c
index f184cb0..1ef8d94 100644
--- a/hypervisor/arch/arm/gic-v2.c
+++ b/hypervisor/arch/arm/gic-v2.c
@@ -23,20 +23,17 @@ void *gich_base;

static int gic_init(void)
{
- int err;
-
- gicc_base =
- (void *)(unsigned long)system_config->platform_info.arm.gicc_base;
- gich_base =
- (void *)(unsigned long)system_config->platform_info.arm.gich_base;
-
- err = arch_map_device(gicc_base, gicc_base, GICC_SIZE);
- if (err)
- return err;
+ gicc_base = paging_map_device(
+ system_config->platform_info.arm.gicc_base, GICC_SIZE);
+ if (!gicc_base)
+ return -ENOMEM;

- err = arch_map_device(gich_base, gich_base, GICH_SIZE);
+ gich_base = paging_map_device(
+ system_config->platform_info.arm.gich_base, GICH_SIZE);
+ if (!gich_base)
+ return -ENOMEM;

- return err;
+ return 0;
}

static void gic_clear_pending_irqs(void)
@@ -182,21 +179,23 @@ static int gic_cell_init(struct cell *cell)
*/
err = paging_create(&cell->arch.mm,
system_config->platform_info.arm.gicv_base,
- GICC_SIZE, (unsigned long)gicc_base,
+ GICC_SIZE,
+ system_config->platform_info.arm.gicc_base,
(PTE_FLAG_VALID | PTE_ACCESS_FLAG |
S2_PTE_ACCESS_RW | S2_PTE_FLAG_DEVICE),
PAGING_COHERENT);
if (err)
return err;

- mmio_region_register(cell, (unsigned long)gicd_base, GICD_SIZE,
- gic_handle_dist_access, NULL);
+ mmio_region_register(cell, system_config->platform_info.arm.gicd_base,
+ GICD_SIZE, gic_handle_dist_access, NULL);
return 0;
}

static void gic_cell_exit(struct cell *cell)
{
- paging_destroy(&cell->arch.mm, (unsigned long)gicc_base, GICC_SIZE,
+ paging_destroy(&cell->arch.mm,
+ system_config->platform_info.arm.gicc_base, GICC_SIZE,
PAGING_COHERENT);
}

diff --git a/hypervisor/arch/arm/gic-v3.c b/hypervisor/arch/arm/gic-v3.c
index f73f40c..da61eec 100644
--- a/hypervisor/arch/arm/gic-v3.c
+++ b/hypervisor/arch/arm/gic-v3.c
@@ -40,11 +40,13 @@ static int gic_init(void)
if (!(mmio_read32(gicd_base + GICD_CTLR) & GICD_CTLR_ARE_NS))
return trace_error(-EIO);

- gicr_base =
- (void *)(unsigned long)system_config->platform_info.arm.gicr_base;
-
/* Let the per-cpu code access the redistributors */
- return arch_map_device(gicr_base, gicr_base, GICR_SIZE);
+ gicr_base = paging_map_device(
+ system_config->platform_info.arm.gicr_base, GICR_SIZE);
+ if (!gicr_base)
+ return -ENOMEM;
+
+ return 0;
}

static void gic_clear_pending_irqs(void)
diff --git a/hypervisor/arch/arm/irqchip.c b/hypervisor/arch/arm/irqchip.c
index 7c2d754..269ceeb 100644
--- a/hypervisor/arch/arm/irqchip.c
+++ b/hypervisor/arch/arm/irqchip.c
@@ -239,12 +239,10 @@ int irqchip_init(void)
if (irqchip_is_init)
return 0;

- gicd_base =
- (void *)(unsigned long)system_config->platform_info.arm.gicd_base;
-
- err = arch_map_device(gicd_base, gicd_base, GICD_SIZE);
- if (err)
- return err;
+ gicd_base = paging_map_device(
+ system_config->platform_info.arm.gicd_base, GICD_SIZE);
+ if (!gicd_base)
+ return -ENOMEM;

for (i = 3; i >= 0; i--) {
cidr = mmio_read32(gicd_base + GICD_CIDR0 + i * 4);
diff --git a/hypervisor/arch/arm/smp-vexpress.c b/hypervisor/arch/arm/smp-vexpress.c
index 34c4cc6..f33d2ca 100644
--- a/hypervisor/arch/arm/smp-vexpress.c
+++ b/hypervisor/arch/arm/smp-vexpress.c
@@ -18,7 +18,7 @@
#include <asm/setup.h>
#include <asm/smp.h>

-#define SYSREGS_BASE ((void *)0x1c010000)
+#define SYSREGS_BASE 0x1c010000

#define VEXPRESS_FLAGSSET 0x30

@@ -58,13 +58,13 @@ static enum mmio_result smp_mmio(void *arg, struct mmio_access *mmio)

int smp_init(void)
{
- int err;
+ void *sysregs_base;

- err = arch_map_device(SYSREGS_BASE, SYSREGS_BASE, PAGE_SIZE);
- if (err)
- return err;
- root_entry = mmio_read32(SYSREGS_BASE + VEXPRESS_FLAGSSET);
- arch_unmap_device(SYSREGS_BASE, PAGE_SIZE);
+ sysregs_base = paging_map_device(SYSREGS_BASE, PAGE_SIZE);
+ if (!sysregs_base)
+ return -ENOMEM;
+ root_entry = mmio_read32(sysregs_base + VEXPRESS_FLAGSSET);
+ paging_unmap_device(SYSREGS_BASE, sysregs_base, PAGE_SIZE);

smp_cell_init(&root_cell);

--
2.1.4

Reply all
Reply to author
Forward
0 new messages