Date: Sat, 06 Sep 2014 08:39:00 -0700 From: Nathan Whitehorn <nwhitehorn@freebsd.org> To: Ian Lepore <ian@FreeBSD.org> Cc: svn-src-head@FreeBSD.org, svn-src-all@FreeBSD.org, src-committers@FreeBSD.org Subject: Re: svn commit: r271190 - head/sys/dev/ofw Message-ID: <540B2A94.4090201@freebsd.org> In-Reply-To: <1410017676.1150.356.camel@revolution.hippie.lan> References: <201409061511.s86FBZAB050025@svn.freebsd.org> <540B2783.9020808@freebsd.org> <1410017676.1150.356.camel@revolution.hippie.lan>
next in thread | previous in thread | raw e-mail | index | archive | help
On 09/06/14 08:34, Ian Lepore wrote: > On Sat, 2014-09-06 at 08:25 -0700, Nathan Whitehorn wrote: >> What is this for? The way the specification works here explicitly >> requires this fallback. >> -Nathan >> > It's for determining whether there is an entry in the device<->xref > list. If a node has no xref phandle property there will be no entry for > it in the list and thus no way to record or retrieve a device > association. I found myself coding the "if it has a phandle, or an > ibm,phandle, or a linux,phandle" incantation, then realized that all > that figuring-out work was done at init time when the xref list is > built, I just needed a way to get the result. This isn't true. On most but not all real OF systems, which use, or will use, the same mechanism, there is no distinction between "regular" and "cross-reference" phandles and device tree cross-references still exist with no explicit phandle property. So registering a device without a phandle property has to to work, and has to fall back to the regular phandle 100% of the time. What may be true is that no single device tree has a mixture of implicit and explicit cross-reference handles, so you could set a flag or something. But it's probably not worth it. Do you have a concrete example where you cared about this? -Nathan > -- Ian > >> On 09/06/14 08:11, Ian Lepore wrote: >>> Author: ian >>> Date: Sat Sep 6 15:11:35 2014 >>> New Revision: 271190 >>> URL: http://svnweb.freebsd.org/changeset/base/271190 >>> >>> Log: >>> Add OF_xref_from_node_strict() which returns -1 if there is no xref handle >>> for the node. The default routine returns the untranslated handle, which >>> is sometimes useful, but sometimes you really need to know there's no >>> entry in the xref<->node<->device translation table. >>> >>> Modified: >>> head/sys/dev/ofw/openfirm.c >>> head/sys/dev/ofw/openfirm.h >>> >>> Modified: head/sys/dev/ofw/openfirm.c >>> ============================================================================== >>> --- head/sys/dev/ofw/openfirm.c Sat Sep 6 13:21:07 2014 (r271189) >>> +++ head/sys/dev/ofw/openfirm.c Sat Sep 6 15:11:35 2014 (r271190) >>> @@ -554,15 +554,15 @@ OF_node_from_xref(phandle_t xref) >>> return (node); >>> } >>> >>> -phandle_t >>> -OF_xref_from_node(phandle_t node) >>> +static phandle_t >>> +xref_from_node(phandle_t node, phandle_t notfoundvalue) >>> { >>> struct xrefinfo *xi; >>> phandle_t xref; >>> >>> if (xref_init_done) { >>> if ((xi = xrefinfo_find(node, FIND_BY_NODE)) == NULL) >>> - return (node); >>> + return (notfoundvalue); >>> return (xi->xref); >>> } >>> >>> @@ -570,10 +570,24 @@ OF_xref_from_node(phandle_t node) >>> -1 && OF_getencprop(node, "ibm,phandle", &xref, >>> sizeof(xref)) == -1 && OF_getencprop(node, >>> "linux,phandle", &xref, sizeof(xref)) == -1) >>> - return (node); >>> + return (notfoundvalue); >>> return (xref); >>> } >>> >>> +phandle_t >>> +OF_xref_from_node(phandle_t node) >>> +{ >>> + >>> + return (xref_from_node(node, node)); >>> +} >>> + >>> +phandle_t >>> +OF_xref_from_node_strict(phandle_t node) >>> +{ >>> + >>> + return (xref_from_node(node, -1)); >>> +} >>> + >>> device_t >>> OF_device_from_xref(phandle_t xref) >>> { >>> >>> Modified: head/sys/dev/ofw/openfirm.h >>> ============================================================================== >>> --- head/sys/dev/ofw/openfirm.h Sat Sep 6 13:21:07 2014 (r271189) >>> +++ head/sys/dev/ofw/openfirm.h Sat Sep 6 15:11:35 2014 (r271190) >>> @@ -128,10 +128,12 @@ ssize_t OF_package_to_path(phandle_t no >>> * Some OF implementations (IBM, FDT) have a concept of effective phandles >>> * used for device-tree cross-references. Given one of these, returns the >>> * real phandle. If one can't be found (or running on OF implementations >>> - * without this property), returns its input. >>> + * without this property), OF_xref_from_node() returns its input, while the >>> + * strict version returns -1. >>> */ >>> phandle_t OF_node_from_xref(phandle_t xref); >>> phandle_t OF_xref_from_node(phandle_t node); >>> +phandle_t OF_xref_from_node_strict(phandle_t node); >>> >>> /* >>> * When properties contain references to other nodes using xref handles it is >>> >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?540B2A94.4090201>