svn commit: r209674 - user/nwhitehorn/ps3/dev/ofw
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Sat Jul 3 21:02:12 UTC 2010
Author: nwhitehorn
Date: Sat Jul 3 21:02:11 2010
New Revision: 209674
URL: http://svn.freebsd.org/changeset/base/209674
Log:
"Fix" some things in ofw_fdt for 64-bit systems. The basic problem is
that this code uses pointers into the device tree as package handles, but
the PPC OF spec has package handles as 32-bit quantities. Maybe offsets
into the DT blob could be used instead?
In any case, this change is fine on powerpc64/aim, since device trees
will always be loaded at boot time and thus are guaranteed to be in
32-bit accessible memory.
Also, kill some dependence on things in /dev/fdt, which are unimplemented
(and unnecessary) for the time being.
Modified:
user/nwhitehorn/ps3/dev/ofw/ofw_fdt.c
Modified: user/nwhitehorn/ps3/dev/ofw/ofw_fdt.c
==============================================================================
--- user/nwhitehorn/ps3/dev/ofw/ofw_fdt.c Sat Jul 3 20:48:43 2010 (r209673)
+++ user/nwhitehorn/ps3/dev/ofw/ofw_fdt.c Sat Jul 3 21:02:11 2010 (r209674)
@@ -39,7 +39,9 @@ __FBSDID("$FreeBSD$");
#include <machine/stdarg.h>
+#ifndef __powerpc__
#include <dev/fdt/fdt_common.h>
+#endif
#include <dev/ofw/ofwvar.h>
#include <dev/ofw/openfirm.h>
@@ -120,11 +122,11 @@ fdt_phandle_offset(phandle_t p)
dt_struct = (const char *)fdtp + fdt_off_dt_struct(fdtp);
- if (((const char *)p < dt_struct) ||
- (const char *)p > (dt_struct + fdt_size_dt_struct(fdtp)))
+ if (((const char *)(uintptr_t)p < dt_struct) ||
+ (const char *)(uintptr_t)p > (dt_struct + fdt_size_dt_struct(fdtp)))
return (-1);
- offset = (const char *)p - dt_struct;
+ offset = (const char *)(uintptr_t)p - dt_struct;
if (offset < 0)
return (-1);
@@ -141,7 +143,8 @@ ofw_fdt_peer(ofw_t ofw, phandle_t node)
if (node == 0) {
/* Find root node */
offset = fdt_path_offset(fdtp, "/");
- p = (phandle_t)fdt_offset_ptr(fdtp, offset, sizeof(p));
+ p = (phandle_t)(uintptr_t)fdt_offset_ptr(fdtp,
+ offset, sizeof(p));
return (p);
}
@@ -156,7 +159,8 @@ ofw_fdt_peer(ofw_t ofw, phandle_t node)
if (depth < 0)
return (0);
if (depth == 1) {
- p = (phandle_t)fdt_offset_ptr(fdtp, offset, sizeof(p));
+ p = (phandle_t)(uintptr_t)fdt_offset_ptr(fdtp,
+ offset, sizeof(p));
return (p);
}
}
@@ -181,7 +185,8 @@ ofw_fdt_child(ofw_t ofw, phandle_t node)
if (depth < 0)
return (0);
if (depth == 1) {
- p = (phandle_t)fdt_offset_ptr(fdtp, offset, sizeof(p));
+ p = (phandle_t)(uintptr_t)fdt_offset_ptr(fdtp,
+ offset, sizeof(p));
return (p);
}
}
@@ -201,7 +206,8 @@ ofw_fdt_parent(ofw_t ofw, phandle_t node
return (0);
paroffset = fdt_parent_offset(fdtp, offset);
- p = (phandle_t)fdt_offset_ptr(fdtp, paroffset, sizeof(phandle_t));
+ p = (phandle_t)(uintptr_t)fdt_offset_ptr(fdtp, paroffset,
+ sizeof(phandle_t));
return (p);
}
@@ -223,7 +229,8 @@ ofw_fdt_instance_to_package(ofw_t ofw, i
if (offset < 0)
return (0);
- p = (phandle_t)fdt_offset_ptr(fdtp, offset, sizeof(phandle_t));
+ p = (phandle_t)(uintptr_t)fdt_offset_ptr(fdtp, offset,
+ sizeof(phandle_t));
return (p);
}
@@ -326,7 +333,7 @@ ofw_fdt_nextprop(ofw_t ofw, phandle_t pa
size_t size)
{
const struct fdt_property *prop;
- int offset, rv;
+ long offset, rv;
offset = fdt_phandle_offset(package);
if (offset < 0)
@@ -343,7 +350,7 @@ ofw_fdt_nextprop(ofw_t ofw, phandle_t pa
if (prop == NULL)
return (0);
- offset = fdt_phandle_offset((phandle_t)prop);
+ offset = fdt_phandle_offset((phandle_t)(uintptr_t)prop);
rv = fdt_nextprop(offset, buf, size);
return (rv);
}
@@ -379,7 +386,7 @@ ofw_fdt_finddevice(ofw_t ofw, const char
offset = fdt_path_offset(fdtp, device);
- p = (phandle_t)fdt_offset_ptr(fdtp, offset, sizeof(p));
+ p = (phandle_t)(uintptr_t)fdt_offset_ptr(fdtp, offset, sizeof(p));
return (p);
}
@@ -403,6 +410,7 @@ ofw_fdt_package_to_path(ofw_t ofw, phand
static int
ofw_fdt_fixup(ofw_t ofw)
{
+#ifndef __powerpc64__
#define FDT_MODEL_LEN 80
char model[FDT_MODEL_LEN];
phandle_t root;
@@ -430,6 +438,7 @@ ofw_fdt_fixup(ofw_t ofw)
if (fdt_fixup_table[i].handler != NULL)
(*fdt_fixup_table[i].handler)(root);
}
+#endif
return (0);
}
More information about the svn-src-user
mailing list