summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornwhitehorn <nwhitehorn@FreeBSD.org>2015-03-10 16:01:43 +0000
committernwhitehorn <nwhitehorn@FreeBSD.org>2015-03-10 16:01:43 +0000
commitd4fc9fa205a9513477f4a0a4f103c45f13645cc7 (patch)
treef6af5b3520583adbbcf6defde01b9c2bfadf9999
parentb25767bb39eb9eb8adb02b32ed63dbd1cbab4eee (diff)
downloadFreeBSD-src-d4fc9fa205a9513477f4a0a4f103c45f13645cc7.zip
FreeBSD-src-d4fc9fa205a9513477f4a0a4f103c45f13645cc7.tar.gz
Allow PowerMac systems to be booted from an FDT as well as Open Firmware.
This is not complete yet: the gem(4) interface on my laptop seems to disappear from the PCI bus as a result of quiescing Open Firmware in the boot loader.
-rw-r--r--sys/powerpc/powermac/platform_powermac.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/sys/powerpc/powermac/platform_powermac.c b/sys/powerpc/powermac/platform_powermac.c
index 3e1bf7a..f6e9d99 100644
--- a/sys/powerpc/powermac/platform_powermac.c
+++ b/sys/powerpc/powermac/platform_powermac.c
@@ -126,6 +126,8 @@ powermac_mem_regions(platform_t plat, struct mem_region *phys, int *physsz,
int physacells = 1;
memory = OF_finddevice("/memory");
+ if (memory == -1)
+ memory = OF_finddevice("/memory@0");
/* "reg" has variable #address-cells, but #size-cells is always 1 */
OF_getprop(OF_parent(memory), "#address-cells", &physacells,
@@ -154,23 +156,32 @@ powermac_mem_regions(platform_t plat, struct mem_region *phys, int *physsz,
/* "available" always has #address-cells = 1 */
propsize = OF_getprop(memory, "available", memoryprop,
sizeof(memoryprop));
- propsize /= sizeof(cell_t);
- for (i = 0, j = 0; i < propsize; i += 2, j++) {
- avail[j].mr_start = memoryprop[i];
- avail[j].mr_size = memoryprop[i + 1];
- }
+ if (propsize <= 0) {
+ for (i = 0; i < *physsz; i++) {
+ avail[i].mr_start = phys[i].mr_start;
+ avail[i].mr_size = phys[i].mr_size;
+ }
+
+ *availsz = *physsz;
+ } else {
+ propsize /= sizeof(cell_t);
+ for (i = 0, j = 0; i < propsize; i += 2, j++) {
+ avail[j].mr_start = memoryprop[i];
+ avail[j].mr_size = memoryprop[i + 1];
+ }
#ifdef __powerpc64__
- /* Add in regions above 4 GB to the available list */
- for (i = 0; i < *physsz; i++) {
- if (phys[i].mr_start > BUS_SPACE_MAXADDR_32BIT) {
- avail[j].mr_start = phys[i].mr_start;
- avail[j].mr_size = phys[i].mr_size;
- j++;
+ /* Add in regions above 4 GB to the available list */
+ for (i = 0; i < *physsz; i++) {
+ if (phys[i].mr_start > BUS_SPACE_MAXADDR_32BIT) {
+ avail[j].mr_start = phys[i].mr_start;
+ avail[j].mr_size = phys[i].mr_size;
+ j++;
+ }
}
- }
#endif
- *availsz = j;
+ *availsz = j;
+ }
}
static int
OpenPOWER on IntegriCloud