summaryrefslogtreecommitdiffstats
path: root/sys/arm/at91/at91.c
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2014-01-31 15:38:05 +0000
committerimp <imp@FreeBSD.org>2014-01-31 15:38:05 +0000
commit9190257f1a260a4d61b397c99c7fdd219464be13 (patch)
tree431ccebf5b12ed89d9d0e5b90c6c774f379527c4 /sys/arm/at91/at91.c
parent3f99ec60916b6b854460761559605c52dcb65f21 (diff)
downloadFreeBSD-src-9190257f1a260a4d61b397c99c7fdd219464be13.zip
FreeBSD-src-9190257f1a260a4d61b397c99c7fdd219464be13.tar.gz
Switch to using PAs rather than VAs for the addresses we map for
devices. This is a nop, except for what's reported by atmelbus for the resources. It would be nice if we could dymanically allocated these things, but the pmap_mapdev panics if we don't keep the static mappings, so we still need to play the carefully allocate VA space between all supported SoC game. User's with their own devices may need to make adjustments.
Diffstat (limited to 'sys/arm/at91/at91.c')
-rw-r--r--sys/arm/at91/at91.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/sys/arm/at91/at91.c b/sys/arm/at91/at91.c
index 316027c..dce1f93 100644
--- a/sys/arm/at91/at91.c
+++ b/sys/arm/at91/at91.c
@@ -260,7 +260,6 @@ static int
at91_attach(device_t dev)
{
struct at91_softc *sc = device_get_softc(dev);
- const struct arm_devmap_entry *pdevmap;
int i;
arm_post_filter = at91_eoi;
@@ -281,11 +280,15 @@ at91_attach(device_t dev)
sc->sc_mem_rman.rm_descr = "AT91 Memory";
if (rman_init(&sc->sc_mem_rman) != 0)
panic("at91_attach: failed to set up memory rman");
- for (pdevmap = at91_devmap; pdevmap->pd_va != 0; pdevmap++) {
- if (rman_manage_region(&sc->sc_mem_rman, pdevmap->pd_va,
- pdevmap->pd_va + pdevmap->pd_size - 1) != 0)
- panic("at91_attach: failed to set up memory rman");
- }
+ /*
+ * Manage the physical space, defined as being everything that isn't
+ * DRAM.
+ */
+ if (rman_manage_region(&sc->sc_mem_rman, 0, PHYSADDR - 1) != 0)
+ panic("at91_attach: failed to set up memory rman");
+ if (rman_manage_region(&sc->sc_mem_rman, PHYSADDR + (256 << 20),
+ 0xfffffffful) != 0)
+ panic("at91_attach: failed to set up memory rman");
/*
* Setup the interrupt table.
@@ -330,6 +333,7 @@ at91_alloc_resource(device_t dev, device_t child, int type, int *rid,
struct resource_list_entry *rle;
struct at91_ivar *ivar = device_get_ivars(child);
struct resource_list *rl = &ivar->resources;
+ bus_space_handle_t bsh;
if (device_get_parent(child) != dev)
return (BUS_ALLOC_RESOURCE(device_get_parent(dev), child,
@@ -355,8 +359,10 @@ at91_alloc_resource(device_t dev, device_t child, int type, int *rid,
rle->res = rman_reserve_resource(&sc->sc_mem_rman,
start, end, count, flags, child);
if (rle->res != NULL) {
+ bus_space_map(&at91_bs_tag, start,
+ rman_get_size(rle->res), 0, &bsh);
rman_set_bustag(rle->res, &at91_bs_tag);
- rman_set_bushandle(rle->res, start);
+ rman_set_bushandle(rle->res, bsh);
}
break;
}
@@ -538,8 +544,14 @@ at91_add_child(device_t dev, int prio, const char *name, int unit,
bus_set_resource(kid, SYS_RES_IRQ, 1, irq1, 1);
if (irq2 != 0)
bus_set_resource(kid, SYS_RES_IRQ, 2, irq2, 1);
- if (addr != 0 && addr < AT91_BASE)
- addr += AT91_BASE;
+ /*
+ * Special case for on-board devices. These have their address
+ * defined relative to AT91_PA_BASE in all the register files we
+ * have. We could change this, but that's a lot of effort which
+ * will be obsoleted when FDT arrives.
+ */
+ if (addr != 0 && addr < 0x10000000 && addr >= 0x0f000000)
+ addr += AT91_PA_BASE;
if (addr != 0)
bus_set_resource(kid, SYS_RES_MEMORY, 0, addr, size);
}
OpenPOWER on IntegriCloud