Re: [PATCH v3] libfdt: Add phandle generation helper

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



On 4/3/19 8:27 PM, David Gibson wrote:
> On Wed, Apr 03, 2019 at 01:18:38PM -0700, Frank Rowand wrote:
>> On 3/28/19 7:51 PM, David Gibson wrote:
>>> On Mon, Mar 25, 2019 at 09:18:24AM +0100, Thierry Reding wrote:
>>>> On Fri, Mar 22, 2019 at 03:49:56AM -0700, Frank Rowand wrote:
>>>>> On 3/22/19 1:58 AM, Thierry Reding wrote:
>>>>>> On Thu, Mar 21, 2019 at 11:37:20AM -0700, Frank Rowand wrote:
>>>>>>> On 3/21/19 3:26 AM, Thierry Reding wrote:
>>>>>>>> On Wed, Mar 20, 2019 at 05:36:15PM -0700, Frank Rowand wrote:
>>>>>>>>> On 3/20/19 8:10 AM, Thierry Reding wrote:
>>>>>>>>>> From: Thierry Reding <treding@xxxxxxxxxx>
>>>>>>>>>>
>>>>>>>>>> The new fdt_generate_phandle() function can be used to generate a new,
>>>>>>>>>> unused phandle given a specific device tree blob. The implementation is
>>>>>>>>>> somewhat naive in that it simply walks the entire device tree to find
>>>>>>>>>> the highest phandle value and then returns a phandle value one higher
>>>>>>>>>> than that. A more clever implementation might try to find holes in the
>>>>>>>>>> current set of phandle values and fill them. But this implementation is
>>>>>>>>>> relatively simple and works reliably.
>>>>>>>>>>
>>>>>>>>>> Also add a test that validates that phandles generated by this new API
>>>>>>>>>> are indeed unique.
>>>>>>>>>
>>>>>>>>> I don't see any issues.
>>>>>>>>>
>>>>>>>>> I am curious as to what the envisioned use is for fdt_generate_phandle().
>>>>>>>>
>>>>>>>> The idea here is to allow firmware to pass information about carveout
>>>>>>>> areas to the Linux kernel (and potentially other OSes). To specify the
>>>>>>>> carveouts, it needs to create subnodes in the top-level /reserved-memory
>>>>>>>> node and attach a phandle to those nodes so that they can later be
>>>>>>>> referenced by users of the carveouts.
>>>>>>>>
>>>>>>>> One such example would be a framebuffer carveout set up by early
>>>>>>>> firmware to show a boot splash. In order to prevent the OS kernel from
>>>>>>>> recycling the framebuffer carveout for its allocator, the firmware needs
>>>>>>>> to marks it as reserved memory. This is what the child nodes in the top-
>>>>>>>> level /reserved-memory node do. Then the display controller that's
>>>>>>>> scanning out the framebuffer from that carveout needs to be passed a
>>>>>>>> reference to the reserved memory node (via its phandle, which is stored
>>>>>>>> in the display controller node's memory-region property).
>>>>>>>>
>>>>>>>> The display controller driver can then use that memory-region property
>>>>>>>> to look up the reserved memory region and reuse it, copy out data, ...
>>>>>>>> This information can also be used on early OS boot to setup things like
>>>>>>>> IOMMU page tables so that there's initially a 1:1 mapping of physical
>>>>>>>> to IO virtual addresses for the carveout. This is necessary because the
>>>>>>>> display controller may otherwise cause a lot of IOMMU faults trying to
>>>>>>>> access a physical memory address through the IOMMU.
>>>>>>>>
>>>>>>>> Does that clarify the use-case?
>>>>>>>
>>>>>>> Yes, thanks.  That is an excellent description.
>>>>>>>
>>>>>>> I think that it is not good to provide a mechanism to create phandles
>>>>>>> in libfdt, because people are likely to use the mechanism if it
>>>>>>> exists.  How is that for a rationale?  :-)
>>>>>>>
>>>>>>> The problem is that such a phandle is entirely outside the "architecture"
>>>>>>> (and I use that word loosely) of phandle related infrastructure used
>>>>>>> for overlays.  And I am not just thinking of current implementation, but
>>>>>>> also thinking of how I am hoping the implementation will change.
>>>>>>>
>>>>>>> Either the phandle overlay related metadata will not be available, or
>>>>>>> fdt_generate_phandle() would have to add the complication of also
>>>>>>> creating that metadata (which I also think is not a good idea).
>>>>>>
>>>>>> I'm not sure I understand how that's relevant to this discussion. DT
>>>>>> overlays and phandles are completely orthogonal. phandles need to work
>>>>>> without knowing anything about overlays.
>>>>>
>>>>> If an overlay is going to be applied on top of a base FDT, and the overlay
>>>>> references a phandle in the base FDT, then the base FDT has to have been
>>>>> compiled with the '-@' option so that extra metadata describing the
>>>>> phandles will be included in the base FDT.  Without the extra metadata,
>>>>> the overlay can not be applied.
>>>>>
>>>>> If an overlay needs to reference the phandle created by fdt_generate_phandle()
>>>>> then the overlay apply will fail because the metadata is not in the base
>>>>> FDT.
>>>>
>>>> I have a hard time imagining how this is supposed to work. If the
>>>> phandle is generated at runtime, how will anyone know how to reference
>>>> it in an overlay? Unless they generate the overlay at runtime, in which
>>>> case why bother with the overlay mechanism at all?
>>>>
>>>>>>> Is there an alternative approach to achieve the same required use-case?
>>>>>>> One possibility that jumped to mind (but I haven't thought through yet)
>>>>>>> is to put the possible carveout area definitions in the base dts source,
>>>>>>> but with a size of zero, where size zero means not active.  Then the
>>>>>>> firmware could update the size (and offset if needed) to create the
>>>>>>> actual carveout.
>>>>>>
>>>>>> That's not very practical. First of all, we can't assume that the DTB
>>>>>> can be changed on every device that needs to add carveouts. Also, it is
>>>>>> not necessarily known at the time that the DTS is compiled that there
>>>>>> will even be carveouts. Having them occupy space in the device tree if
>>>>>> they are never used is wasteful and easily confusing.
>>>>>
>>>>> If the base DTB contains a node for a display driver that is capable of
>>>>> detecting a framebuffer carveout, then it is not unlikely that the
>>>>> carveout will exist.  It is not especially confusing to have an unused
>>>>> carveout if there is an unambiguous indication of an inactive carveout
>>>>> (such as size zero).  We already handle inactive nodes that are
>>>>> marked as such by the status property.
>>>>
>>>> I'm not sure what you mean by base DTB, but there are a number of
>>>> reasons why there may be a device tree node for a display controller but
>>>> no need for the carveout. For example a DTB may list a node for a
>>>> display controller, but the display controller may end up not being used
>>>> if the user didn't connect a monitor. Or a user may want to just disable
>>>> the display controller (or not compile/load the driver) if they want to
>>>> run the device in headless mode.
>>>>
>>>> Secondly, bootloaders may not implement display support at all, so even
>>>> if it's possible to output something on a screen and users have
>>>> connected a screen, the bootloader may just not support it. So the
>>>> existence of the carveout is dependent on so many things that it's a bit
>>>> of a stretch to require the DTS file to contain carveouts for every
>>>> possible scenario. One other thing to consider in this context is that a
>>>> carveout is not hardware description, so a lot of DTBs exist that don't
>>>> contain any such information. This means that extending bootloaders with
>>>> functionality that require the creation of a carveout would effectively
>>>> be a device tree ABI break.
>>>>
>>>> Thirdly the carveout will often be allocated dynamically. While we can
>>>> fill in any values at runtime, in order to create a "conformant" DTB we
>>>> would also need to rename the nodes so that they can contain the proper
>>>> unit-addresses. This all ends up with pretty much the same code as we'd
>>>> need to generate all of the nodes from scratch.
>>>>
>>>> Lastly there's also the issue that I've seen bootloaders fail to deal
>>>> with carveouts that have zero size. You could argue that that's a bug in
>>>> the bootloader implementation, but then again, I don't think it's a big
>>>> stretch for users to assume that if there is no reserved memory there's
>>>> no need to have a node at all, so not handling the zero-size carveout
>>>> case is something that I'd think is fairly common.
>>>>
>>>>>> Also, I don't understand how that would change anything with regards to
>>>>>> your point above about overlay metadata. Surely just because the DTS is
>>>>>> compiled doesn't guarantee that overlay metadata will be produced.
>>>>>
>>>>> Correct, the metadata is only in the DTB if the proper compile flag is
>>>>> specified.  But if the carveout (with phandle) is in the DTS and the
>>>>> compile flag is specified, then dtc will create the metadata for that
>>>>> phandle.
>>>>
>>>> Like I said, I don't think this is really an issue that will happen. My
>>>> understanding is that overlays are built on top of a base DTB that needs
>>>> to be (or at least usually will be) available at compile time. Users of
>>>> fdt_generate_phandle() will only ever create the phandles way after the
>>>> creation of DTBs or overlays, so I don't think this would be an issue.
>>>>
>>>> Even if there was an issue, there's nothing preventing us from just
>>>> rejecting both to work together. You already said that an overlay can't
>>>> be applied if there's no metadata for a given phandle. So we already
>>>> have these checks in place and people will just not be able to do this.
>>>>
>>>> You're arguing that we should not be adding support for generating
>>>> phandle values at runtime because it may break in one specific use-case.
>>>> That's a bit like saying people shouldn't be allowed to wear shoes
>>>> because they may trip after stepping on their own shoelaces.
>>>
>>> So.. I think you're talking at cross purposes a bit here.
>>
>> Yes.
>>
>> And in addition, I'm still trying to grok how much the boot
>> loadersmodify a DTB before passing it on to the kernel.  I would
>> like to become more aware of what sort of processing by the boot
>> loaders already occurs.
>>
>>
>>> The core of Frank's point, AFAICT, is that using this code would
>>> generate phandles which don't have corresponding symbols / fixups
>>> information for overlay application, which might be dangerous.
>>
>> Basically yes.  But not dangerous, just prevents overlays from using
>> the generated phandles.
> 
> Oh, ok.  That doesn't seem like such a big deal to me.  Overlays can
> already only use phandles for nodes that are labelled (well, more or
> less).
> 
> If we need this, then, yes, we'd need more support in libfdt.
> Something like fdt_add_label() which would allocate a phandle and also
> add in the necessary symbol information.
> 
> Functions like that are a bit nasty for the libfdt API, though,
> because it makes a non-local change to the tree, any offsets you might
> have in local variables will be invalidated.
> 

Agreed.  This would add a level of complexity that I do not like.



[Index of Archives]     [Device Tree]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux