summaryrefslogtreecommitdiffstats
path: root/sys/powerpc
diff options
context:
space:
mode:
authornwhitehorn <nwhitehorn@FreeBSD.org>2014-09-04 18:28:30 +0000
committernwhitehorn <nwhitehorn@FreeBSD.org>2014-09-04 18:28:30 +0000
commitd02b558c9307d5a184afb91f322c5f1b072af59e (patch)
tree8501f96f37469e431e6396775895f32450f304b4 /sys/powerpc
parentff75003b88c2692803422cd7cefda9bafe2e9285 (diff)
downloadFreeBSD-src-d02b558c9307d5a184afb91f322c5f1b072af59e.zip
FreeBSD-src-d02b558c9307d5a184afb91f322c5f1b072af59e.tar.gz
MFC r265883,268898:
Repair bitrot in PS3 memory and interrupt allocation.
Diffstat (limited to 'sys/powerpc')
-rw-r--r--sys/powerpc/ps3/platform_ps3.c13
-rw-r--r--sys/powerpc/ps3/ps3bus.c14
2 files changed, 17 insertions, 10 deletions
diff --git a/sys/powerpc/ps3/platform_ps3.c b/sys/powerpc/ps3/platform_ps3.c
index c772a8d..94df37d 100644
--- a/sys/powerpc/ps3/platform_ps3.c
+++ b/sys/powerpc/ps3/platform_ps3.c
@@ -110,14 +110,6 @@ ps3_probe(platform_t plat)
static int
ps3_attach(platform_t plat)
{
- uint64_t junk;
- int count;
- struct mem_region avail_regions[2];
-
- ps3_mem_regions(plat, NULL, NULL, avail_regions, &count);
-
- lv1_allocate_memory(avail_regions[1].mr_size, 24 /* 16 MB pages */,
- 0, 0x04 /* any address */, &avail_regions[1].mr_start, &junk);
pmap_mmu_install("mmu_ps3", BUS_PROBE_SPECIFIC);
cpu_idle_hook = ps3_cpu_idle;
@@ -152,6 +144,11 @@ ps3_mem_regions(platform_t plat, struct mem_region *phys, int *physsz,
/* Convert to maximum amount we can allocate in 16 MB pages */
avail_regions[1].mr_size -= avail_regions[0].mr_size;
avail_regions[1].mr_size -= avail_regions[1].mr_size % (16*1024*1024);
+
+ /* Allocate extended memory region */
+ lv1_allocate_memory(avail_regions[1].mr_size, 24 /* 16 MB pages */,
+ 0, 0x04 /* any address */, &avail_regions[1].mr_start, &junk);
+
*availsz = 2;
if (phys != NULL) {
diff --git a/sys/powerpc/ps3/ps3bus.c b/sys/powerpc/ps3/ps3bus.c
index 65e1153..d7659e4 100644
--- a/sys/powerpc/ps3/ps3bus.c
+++ b/sys/powerpc/ps3/ps3bus.c
@@ -127,6 +127,7 @@ static device_method_t ps3bus_methods[] = {
struct ps3bus_softc {
struct rman sc_mem_rman;
+ struct rman sc_intr_rman;
struct mem_region *regions;
int rcount;
};
@@ -328,7 +329,11 @@ ps3bus_attach(device_t self)
sc = device_get_softc(self);
sc->sc_mem_rman.rm_type = RMAN_ARRAY;
sc->sc_mem_rman.rm_descr = "PS3Bus Memory Mapped I/O";
+ sc->sc_intr_rman.rm_type = RMAN_ARRAY;
+ sc->sc_intr_rman.rm_descr = "PS3Bus Interrupts";
rman_init(&sc->sc_mem_rman);
+ rman_init(&sc->sc_intr_rman);
+ rman_manage_region(&sc->sc_intr_rman, 0, ~0);
/* Get memory regions for DMA */
mem_regions(&sc->regions, &sc->rcount, &sc->regions, &sc->rcount);
@@ -562,8 +567,13 @@ ps3bus_alloc_resource(device_t bus, device_t child, int type, int *rid,
rm = &sc->sc_mem_rman;
break;
case SYS_RES_IRQ:
- return (resource_list_alloc(&dinfo->resources, bus, child,
- type, rid, start, end, count, flags));
+ rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ,
+ *rid);
+ rm = &sc->sc_intr_rman;
+ adjstart = rle->start;
+ adjcount = ulmax(count, rle->count);
+ adjend = ulmax(rle->end, rle->start + adjcount - 1);
+ break;
default:
device_printf(bus, "unknown resource request from %s\n",
device_get_nameunit(child));
OpenPOWER on IntegriCloud