]> rtime.felk.cvut.cz Git - jailhouse.git/commitdiff
core: Introduce and use mmio_perform_access
authorJan Kiszka <jan.kiszka@siemens.com>
Thu, 7 Jan 2016 17:17:18 +0000 (18:17 +0100)
committerJan Kiszka <jan.kiszka@siemens.com>
Fri, 15 Jan 2016 09:14:35 +0000 (10:14 +0100)
Generalize arm_mmio_perform_access to mmio_perform_access which can also
be used on other architectures, including those with 64-bit MMIO
support.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
hypervisor/arch/arm/gic-common.c
hypervisor/arch/arm/gic-v3.c
hypervisor/arch/arm/include/asm/mmio.h
hypervisor/arch/arm/mmio.c
hypervisor/include/jailhouse/mmio.h
hypervisor/mmio.c

index 00da4cb2dda592b4a2a97e5b6ae8e8d8f8a783f5..7bb6cd336c01cc16673869267cccac8eab1556af 100644 (file)
@@ -59,7 +59,7 @@ restrict_bitmask_access(struct mmio_access *mmio, unsigned int reg_index,
 
        /* For SGIs or PPIs, let the caller do the mmio access */
        if (!is_spi(first_irq)) {
-               arm_mmio_perform_access((unsigned long)gicd_base, mmio);
+               mmio_perform_access(gicd_base, mmio);
                return MMIO_HANDLED;
        }
 
@@ -73,7 +73,7 @@ restrict_bitmask_access(struct mmio_access *mmio, unsigned int reg_index,
 
        if (!mmio->is_write) {
                /* Restrict the read value */
-               arm_mmio_perform_access((unsigned long)gicd_base, mmio);
+               mmio_perform_access(gicd_base, mmio);
                mmio->value &= access_mask;
                return MMIO_HANDLED;
        }
@@ -89,18 +89,18 @@ restrict_bitmask_access(struct mmio_access *mmio, unsigned int reg_index,
                spin_lock(&dist_lock);
 
                mmio->is_write = false;
-               arm_mmio_perform_access((unsigned long)gicd_base, mmio);
+               mmio_perform_access(gicd_base, mmio);
                mmio->is_write = true;
 
                /* Clear 0 bits */
                mmio->value &= ~(access_mask & ~access_val);
                mmio->value |= access_val;
-               arm_mmio_perform_access((unsigned long)gicd_base, mmio);
+               mmio_perform_access(gicd_base, mmio);
 
                spin_unlock(&dist_lock);
        } else {
                mmio->value &= access_mask;
-               arm_mmio_perform_access((unsigned long)gicd_base, mmio);
+               mmio_perform_access(gicd_base, mmio);
        }
        return MMIO_HANDLED;
 }
@@ -137,7 +137,7 @@ static enum mmio_result handle_irq_route(struct mmio_access *mmio,
                        printk("Attempt to route IRQ%d outside of cell\n", irq);
                        return MMIO_ERROR;
                }
-               arm_mmio_perform_access((unsigned long)gicd_base, mmio);
+               mmio_perform_access(gicd_base, mmio);
        } else {
                cpu = mmio_read32(gicd_base + GICD_IROUTER + 8 * irq);
                mmio->value = arm_cpu_phys2virt(cpu);
@@ -167,7 +167,7 @@ static enum mmio_result handle_irq_target(struct mmio_access *mmio,
         * fill its CPU interface map.
         */
        if (!is_spi(reg)) {
-               arm_mmio_perform_access((unsigned long)gicd_base, mmio);
+               mmio_perform_access(gicd_base, mmio);
                return MMIO_HANDLED;
        }
 
@@ -212,10 +212,10 @@ static enum mmio_result handle_irq_target(struct mmio_access *mmio,
                /* Combine with external SPIs */
                mmio->value |= (itargetsr & ~access_mask);
                /* And do the access */
-               arm_mmio_perform_access((unsigned long)gicd_base, mmio);
+               mmio_perform_access(gicd_base, mmio);
                spin_unlock(&dist_lock);
        } else {
-               arm_mmio_perform_access((unsigned long)gicd_base, mmio);
+               mmio_perform_access(gicd_base, mmio);
                mmio->value &= access_mask;
        }
 
@@ -350,7 +350,7 @@ enum mmio_result gic_handle_dist_access(void *arg, struct mmio_access *mmio)
        case REG_RANGE(GICD_CIDR0, 4, 4):
                /* Allow read access, ignore write */
                if (!mmio->is_write)
-                       arm_mmio_perform_access((unsigned long)gicd_base, mmio);
+                       mmio_perform_access(gicd_base, mmio);
                /* fall through */
        default:
                /* Ignore access. */
index 3a759f939c10fbb5b5dcccadbd30a0807d6c32b2..11cd5ebf0a7870698d6990f14a011355afd6cb83 100644 (file)
@@ -263,7 +263,7 @@ static enum mmio_result gic_handle_redist_access(void *arg,
                        return MMIO_HANDLED;
                }
        }
-       arm_mmio_perform_access((unsigned long)phys_redist, mmio);
+       mmio_perform_access((unsigned long)phys_redist, mmio);
        return MMIO_HANDLED;
 }
 
index 1d445417e7c69643d6268a3fa96b095e066d8eac..09cbc044211546a97ea8aad303fe5438eb253d53 100644 (file)
@@ -1,15 +1 @@
-/*
- * Jailhouse, a Linux-based partitioning hypervisor
- *
- * Copyright (c) ARM Limited, 2014
- *
- * Authors:
- *  Jean-Philippe Brucker <jean-philippe.brucker@arm.com>
- *
- * This work is licensed under the terms of the GNU GPL, version 2.  See
- * the COPYING file in the top-level directory.
- */
-
-struct mmio_access;
-
-void arm_mmio_perform_access(unsigned long base, struct mmio_access *mmio);
+/* nothing to do here */
index ec1fa3df9b918c89cfcae90d86ebb8383962c851..1098e8df57dbbca53ccad00de15ac4c4922652b8 100644 (file)
@@ -61,36 +61,6 @@ static void arch_inject_dabt(struct trap_context *ctx, unsigned long addr)
        arm_write_sysreg(DFAR, addr);
 }
 
-void arm_mmio_perform_access(unsigned long base, struct mmio_access *mmio)
-{
-       void *addr = (void *)(base + mmio->address);
-
-       if (mmio->is_write)
-               switch (mmio->size) {
-               case 1:
-                       mmio_write8(addr, mmio->value);
-                       return;
-               case 2:
-                       mmio_write16(addr, mmio->value);
-                       return;
-               case 4:
-                       mmio_write32(addr, mmio->value);
-                       return;
-               }
-       else
-               switch (mmio->size) {
-               case 1:
-                       mmio->value = mmio_read8(addr);
-                       return;
-               case 2:
-                       mmio->value = mmio_read16(addr);
-                       return;
-               case 4:
-                       mmio->value = mmio_read32(addr);
-                       return;
-               }
-}
-
 int arch_handle_dabt(struct trap_context *ctx)
 {
        enum mmio_result mmio_result;
index 8c2a22c91f56fe99621b7112c9648ff15764d06c..907fa5684bfd0d9d90a2ae76ce3aed0925e5d767 100644 (file)
@@ -169,6 +169,8 @@ enum mmio_result mmio_handle_access(struct mmio_access *mmio);
 
 void mmio_cell_exit(struct cell *cell);
 
+void mmio_perform_access(void *base, struct mmio_access *mmio);
+
 unsigned int arch_mmio_count_regions(struct cell *cell);
 
 /** @} */
index a64093ca3e9dcaa9f1dce0c27dccbcb0e9d5c125..6fbe41424523f9dae51ad62a881833ac4c793ed0 100644 (file)
@@ -219,3 +219,43 @@ void mmio_cell_exit(struct cell *cell)
                        (sizeof(struct mmio_region_location) +
                         sizeof(struct mmio_region_handler))));
 }
+
+void mmio_perform_access(void *base, struct mmio_access *mmio)
+{
+       void *addr = base + mmio->address;
+
+       if (mmio->is_write)
+               switch (mmio->size) {
+               case 1:
+                       mmio_write8(addr, mmio->value);
+                       break;
+               case 2:
+                       mmio_write16(addr, mmio->value);
+                       break;
+               case 4:
+                       mmio_write32(addr, mmio->value);
+                       break;
+#if BITS_PER_LONG == 64
+               case 8:
+                       mmio_write64(addr, mmio->value);
+                       break;
+#endif
+               }
+       else
+               switch (mmio->size) {
+               case 1:
+                       mmio->value = mmio_read8(addr);
+                       break;
+               case 2:
+                       mmio->value = mmio_read16(addr);
+                       break;
+               case 4:
+                       mmio->value = mmio_read32(addr);
+                       break;
+#if BITS_PER_LONG == 64
+               case 8:
+                       mmio->value = mmio_read64(addr);
+                       break;
+#endif
+               }
+}