bus/dpaa: add API to get MAC address
authorAkhil Goyal <akhil.goyal@nxp.com>
Fri, 6 Jul 2018 08:10:04 +0000 (13:40 +0530)
committerThomas Monjalon <thomas@monjalon.net>
Thu, 12 Jul 2018 12:36:22 +0000 (14:36 +0200)
Signed-off-by: Akhil Goyal <akhil.goyal@nxp.com>
Acked-by: Shreyansh Jain <shreyansh.jain@nxp.com>
drivers/bus/dpaa/base/fman/of.c
drivers/bus/dpaa/include/of.h
drivers/bus/dpaa/rte_bus_dpaa_version.map

index eb55cb9..a7f3174 100644 (file)
@@ -546,3 +546,42 @@ of_device_is_compatible(const struct device_node *dev_node,
                return true;
        return false;
 }
+
+static const void *of_get_mac_addr(const struct device_node *np,
+               const char *name)
+{
+       return of_get_property(np, name, NULL);
+}
+
+/**
+ * Search the device tree for the best MAC address to use.  'mac-address' is
+ * checked first, because that is supposed to contain to "most recent" MAC
+ * address. If that isn't set, then 'local-mac-address' is checked next,
+ * because that is the default address.  If that isn't set, then the obsolete
+ * 'address' is checked, just in case we're using an old device tree.
+ *
+ * Note that the 'address' property is supposed to contain a virtual address of
+ * the register set, but some DTS files have redefined that property to be the
+ * MAC address.
+ *
+ * All-zero MAC addresses are rejected, because those could be properties that
+ * exist in the device tree, but were not set by U-Boot.  For example, the
+ * DTS could define 'mac-address' and 'local-mac-address', with zero MAC
+ * addresses.  Some older U-Boots only initialized 'local-mac-address'.  In
+ * this case, the real MAC is in 'local-mac-address', and 'mac-address' exists
+ * but is all zeros.
+ */
+const void *of_get_mac_address(const struct device_node *np)
+{
+       const void *addr;
+
+       addr = of_get_mac_addr(np, "mac-address");
+       if (addr)
+               return addr;
+
+       addr = of_get_mac_addr(np, "local-mac-address");
+       if (addr)
+               return addr;
+
+       return of_get_mac_addr(np, "address");
+}
index 151be5a..7ea7608 100644 (file)
@@ -109,6 +109,8 @@ const struct device_node *of_get_parent(const struct device_node *dev_node);
 const struct device_node *of_get_next_child(const struct device_node *dev_node,
                                            const struct device_node *prev);
 
+const void *of_get_mac_address(const struct device_node *np);
+
 #define for_each_child_node(parent, child) \
        for (child = of_get_next_child(parent, NULL); child != NULL; \
                        child = of_get_next_child(parent, child))
index 8d90285..e00c911 100644 (file)
@@ -92,3 +92,11 @@ DPDK_18.02 {
 
        local: *;
 } DPDK_17.11;
+
+DPDK_18.08 {
+       global:
+
+       of_get_mac_address;
+
+       local: *;
+} DPDK_18.02;