*/
#include <jailhouse/mmio.h>
+#include <asm/bitops.h>
#include <asm/irqchip.h>
#include <asm/processor.h>
#include <asm/smp.h>
unsigned int arch_mmio_count_regions(struct cell *cell)
{
- return smp_mmio_regions;
+ return irqchip_mmio_count_regions(cell) + smp_mmio_regions;
}
/* Taken from the ARM ARM pseudocode for taking a data abort */
arm_write_sysreg(DFAR, addr);
}
-void arm_mmio_perform_access(struct mmio_access *mmio)
-{
- void *addr = (void *)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;
- }
-
- printk("WARNING: Ignoring unsupported MMIO access size %d\n",
- mmio->size);
-}
-
int arch_handle_dabt(struct trap_context *ctx)
{
enum mmio_result mmio_result;
struct mmio_access mmio;
unsigned long hpfar;
unsigned long hdfar;
- int ret = TRAP_UNHANDLED;
/* Decode the syndrome fields */
u32 icc = ESR_ICC(ctx->esr);
u32 isv = icc >> 24;
mmio_result = mmio_handle_access(&mmio);
if (mmio_result == MMIO_ERROR)
return TRAP_FORBIDDEN;
- if (mmio_result == MMIO_UNHANDLED) {
- ret = irqchip_mmio_access(&mmio);
-
- if (ret == TRAP_FORBIDDEN)
- return TRAP_FORBIDDEN;
- if (ret == TRAP_UNHANDLED)
- goto error_unhandled;
- }
+ if (mmio_result == MMIO_UNHANDLED)
+ goto error_unhandled;
/* Put the read value into the dest register */
if (!is_write) {