Re: [RFC PATCH v1 0/3] device property: Support MAC address in VPD
From: Brian Norris <computersforpeace@gmail.com>
Date: 2018-08-15 00:22:11
Also in:
linux-devicetree, lkml
+ Srinivas, as there are NVMEM questions Hi Florian, Thanks for the quick reply. On Tue, Aug 14, 2018 at 04:00:28PM -0700, Florian Fainelli wrote:
On 08/14/2018 03:37 PM, Brian Norris wrote:quoted
Today, we have generic support for 'mac-address' and 'local-mac-address' properties in both Device Tree nodes and in generic Device Properties, such that network device drivers can pick up a hardware address from there, in cases where the MAC address isn't baked into the network card. This method of MAC address retrieval presumes that either: (a) there's a unique device tree (or similar) stored on a given device or (b) some other entity (e.g., boot firmware) will modify device nodes runtime to place that MAC address into the appropriate device properties. Option (a) is not feasbile for many systems. Option (b) can work, but there are some reasons why one might not want to do that: (1) This requires that system firmware understand the device tree structure, sometimes to the point of memorizing path names (e.g., /soc/wifi@xxxxxxxx). At least for Device Tree, these path names are not necessarily an ABI, and so this introduces unneeded fragility.The path to a node is something that is well defined and should be stable given that the high level function of the node and its unit address are not supposed to change. Under which circumstances, besides incorrect specification of either of these two things, do they not consist an ABI? Not refuting your statement here, just curious when/how this can happen?
I can think of a few reasons: * it's not really standardized whether to use a /soc/ node or to just put top-level SoC blocks directly under /. There might be "recommendations", but I certainly have seen it both ways. * the "high level function name" is not set in stone AFAICT. Or at least, I've never seen a list of documented names. So while on one system I might see 'wlan@', another might use 'wifi@'. * in any of the above (and in any other case of lack of clarity), one can make slightly different choices when, e.g., submitting a device tree upstream vs. a downstream tree. While we may try our hardest to document and stick to documented bindings, I personally can't guarantee that one of these choices will be made differently during review, possibly breaking any firmware that made assumptions based on those choices. So I might end up with a firmware that satisfies documented bindings and works with a downstream device tree, but doesn't work with a device tree that gets submitted upstream.
Also, aliases in DT are meant to provide some stability.
How, specifically? I don't see any relevant binding description for aliases under Documentation/devicetree/bindings/net/.
quoted
(2) Other than this device-tree shim requirement, system firmware may have no reason to understand anything about network devices. So instead, I'm looking for a way to have a device node describe where to find its MAC address, rather than having the device node contain the MAC address directly. Then system firmware doesn't have to manage anything. In particular, I add support for the Google Vital Product Data (VPD) format, used within the Coreboot project. The format is described here: https://chromium.googlesource.com/chromiumos/platform/vpd/+/master/README.md TL;DR: VPD consists of a TLV-like table, with key/value pairs of strings. This is often stored persistently on the boot flash and presented via in-memory Coreboot tables, for the operating system to read. We already have a VPD driver that parses this table and presents it to user space. This series extends that driver to allow in-kernel lookups of MAC address entries.A possible alternative approach is to have the VPD driver become a NVMEM producer to expose the VPD keys, did you look into that and possibly found that it was not a good model? The downside to that approach though is that you might have to have a phandle for the VPD provider in the Device Tree, but AFAICS this should solve your needs?
I did notice some NVMEM work. The MTD links you point at shouldn't be
relevant, since this table is already present in RAM. But I suppose I
could shoehorn the memory table into being a fake NVMEM...
And then, how would you recommend doing the parameterization I note
here? Is the expectation that I define a new cell for every single type?
Each cell might have a different binary format, so I'd have to describe:
(a) that they contain MAC addresses (so the "reader" knows to translate
the ASCII strings into equivalent binary representation) and
(b) which key matches (it's not just "mac_address=xxxxx"; there may be
many MAC addresses, with keys "ether_mac0", "ether_mac1",
"wifi_mac0")
Part (a) especially doesn't really sound like the typical NVMEM, which
seems to pretend it provides raw access to these memory regions.
Additionally, VPD is not stored at a fixed address, nor are any
particular entries within it (it uses TLV), so it seems like there are
plenty of other bits of the nvmem.txt documentation I'd have to violate
to get there, such as the definition of 'reg':
reg: specifies the offset in byte within the storage device.
And finally, this may be surmountable, but the existing APIs seem very
device tree centric. We use this same format on ACPI systems, and the
current series would theoretically work on both [1]. I'd have to rewrite
the current (OF-only) helpers to get equivalent support...
BTW, it's quite annoying that we have all of these:
fwnode_get_mac_address()
device_get_mac_address()
of_get_mac_address()
of_get_nvmem_mac_address()
and only 2 of those share any code! Brilliant!
[1]: https://patchwork.ozlabs.org/cover/956062/ [2]: https://lkml.org/lkml/2018/3/24/312
Brian [1] Fortunately, I've only needed this on DT so far.