[U-Boot] [PATCH 2/2] efi_loader: device_path: support Sandbox's "host" devices
Heinrich Schuchardt
xypron.glpk at gmx.de
Wed Sep 11 17:22:57 UTC 2019
On 9/11/19 8:35 AM, AKASHI Takahiro wrote:
> Heinrich,
>
> Apologies for having not replied.
>
> On Fri, Aug 23, 2019 at 08:09:45PM +0200, Heinrich Schuchardt wrote:
>> On 8/23/19 1:34 AM, AKASHI Takahiro wrote:
>>> On Thu, Aug 22, 2019 at 08:19:24PM +0200, Heinrich Schuchardt wrote:
>>>> On 8/22/19 10:54 AM, AKASHI Takahiro wrote:
>>>>> Sandbox's "host" devices are currently described as UCLASS_ROOT udevice
>>>>> with DEV_IF_HOST block device. As the current implementation of
>>>>> efi_device_path doesn't support such a type, any "host" device
>>>>> on sandbox cannot be seen as a distinct object.
>>>>>
>>>>> For example,
>>>>> => host bind 0 /foo/disk.img
>>>>>
>>>>> => efi devices
>>>>> Scanning disk host0...
>>>>> Found 1 disks
>>>>> Device Device Path
>>>>> ================ ====================
>>>>> 0000000015c19970 /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)
>>>>> 0000000015c19d70 /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)
>>>>>
>>>>> => efi dh
>>>>> Handle Protocols
>>>>> ================ ====================
>>>>> 0000000015c19970 Device Path, Device Path To Text, Device Path Utilities, Unicode Collation 2, HII String, HII Database, HII Config Routing
>>>>> 0000000015c19ba0 Driver Binding
>>>>> 0000000015c19c10 Simple Text Output
>>>>> 0000000015c19c80 Simple Text Input, Simple Text Input Ex
>>>>> 0000000015c19d70 Block IO, Device Path, Simple File System
>>>>>
>>>>> As you can see here, efi_root (0x0000000015c19970) and host0 device
>>>>> (0x0000000015c19d70) has the same representation of device path.
>>>>>
>>>>> This is not only inconvenient, but also confusing since two different
>>>>> efi objects are associated with the same device path and
>>>>> efi_dp_find_obj() will possibly return a wrong result.
>>>>>
>>>>> Solution:
>>>>> Each "host" device should be given an additional device path node
>>>>> of Logical Unit Number(LUN) to make it distinguishable. The result
>>>>> would be:
>>>>> Device Device Path
>>>>> ================ ====================
>>>>> 0000000015c19970 /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)
>>>>> 0000000015c19d70 /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)/LUN(0)
>>>>>
>>>>> Signed-off-by: AKASHI Takahiro <takahiro.akashi at linaro.org>
>>>>> ---
>>>>> lib/efi_loader/efi_device_path.c | 22 ++++++++++++++++++++++
>>>>> 1 file changed, 22 insertions(+)
>>>>>
>>>>> diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c
>>>>> index eeeb80683607..565bb6888fe1 100644
>>>>> --- a/lib/efi_loader/efi_device_path.c
>>>>> +++ b/lib/efi_loader/efi_device_path.c
>>>>> @@ -12,6 +12,7 @@
>>>>> #include <mmc.h>
>>>>> #include <efi_loader.h>
>>>>> #include <part.h>
>>>>> +#include <sandboxblockdev.h>
>>>>> #include <asm-generic/unaligned.h>
>>>>>
>>>>> /* template END node: */
>>>>> @@ -422,6 +423,10 @@ static unsigned dp_size(struct udevice *dev)
>>>>>
>>>>> switch (dev->driver->id) {
>>>>> case UCLASS_ROOT:
>>>>> +#ifdef CONFIG_SANDBOX
>>>>> + /* stop traversing parents at this point: */
>>>>> + return sizeof(ROOT) + sizeof(struct efi_device_path_lun);
>>>>> +#endif
>>>>> case UCLASS_SIMPLE_BUS:
>>>>> /* stop traversing parents at this point: */
>>>>> return sizeof(ROOT);
>>>>> @@ -505,6 +510,23 @@ static void *dp_fill(void *buf, struct udevice *dev)
>>>>> #ifdef CONFIG_BLK
>>>>> case UCLASS_BLK:
>>>>> switch (dev->parent->uclass->uc_drv->id) {
>>>>> +#ifdef CONFIG_SANDBOX
>>>>> + case UCLASS_ROOT: {
>>>>> + /* stop traversing parents at this point: */
>>>>> + struct efi_device_path_vendor *vdp = buf;
>>>>> + struct efi_device_path_lun *dp;
>>>>> + struct host_block_dev *host_dev = dev_get_platdata(dev);
>>>>> + struct blk_desc *desc = dev_get_uclass_platdata(dev);
>>>>> +
>>>>> + *vdp++ = ROOT;
>>>>> + dp = (struct efi_device_path_lun *)vdp;
>>>>> + dp->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
>>>>> + dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_LUN;
>>>>> + dp->dp.length = sizeof(*dp);
>>>>> + dp->logical_unit_number = desc->devnum;
>>>>> + return ++dp;
>>>>> + }
>>>>> +#endif
>>>>> #ifdef CONFIG_IDE
>>>>> case UCLASS_IDE: {
>>>>> struct efi_device_path_atapi *dp =
>>>>>
>>>>
>>>> Hello Takahiro,
>>>>
>>>> thank you for pointing out that currently we generate the same device
>>>> path twice. This for sure is something we need to fix.
>>>>
>>>> In the table below you will find the device tree for
>>>>
>>>> ./u-boot -d arch/sandbox/dts/test.dtb
>>>>
>>>> In the device tree I see exactly one root node. I see no device called
>>>> host0.
>>>
>>> "Host0" or whatever other host device is a pseudo device which will
>>> be dynamically created, like other hot-pluggable devices, by "host bind"
>>> command on sandbox U-Boot. So it won't appear in device tree.
>>>
>>> -Takahiro Akashi
>>
>> Thank you for the explanation.
>>
>> The host device is shown in the device tree:
>
> "device tree" is a confusing term. Is "dm tree" better?
The README calls it Live Device Tree.
./doc/driver-model/livetree.rst
But yes I mean the tree of the driver model.
>
>
>> make sandbox_defconfig
>> make
>> ./u-boot
>> => host bind 0 ../sct-amd64.img
>> => dm tree
>> Class Index Probed Driver Name
>> -----------------------------------------------------------
>> root 0 [ + ] root_driver root_driver
>> <snip />
>> blk 0 [ + ] sandbox_host_blk `-- host0
>>
>> I guess the device node for host0 should be of type "Vendor-Defined
>> Media Device Path". The field "Vendor Defined Data" can be used to
>> differentiate between host0 - host3.
>
> Okay, agreed.
> But this will also create another gap between "dm tree"
> and device path representation in UEFI.
Previously you suggested using the logical unit class (LUN). I think a
vendor defined node is more appropriate.
Commit 8254f8feb71a93a4d87aa68d900660ef445d44cd
efi_loader: correct text conversion for vendor DP
ensures that you can print out the extra data identifying the individual
host number.
>
>> But for MMC, USB, SATA, and SCSI devices you would want to use another
>> node type.
>
> There is no issue that I'm aware of on those devices.
>
>> The code in your patch should not depend on CONFIG_SANDBOX. Instead in
>> the driver model you can simply walk up the device tree up to its root
>> node and assign a device path node to each node on the device tree path
>> according to its UCLASS (UCLASS_BLK here) and according to its interface
>> type (IF_TYPE_HOST here) in the case of block devices.
>
> I don't get your point.
> IICU, what you claim above is the exact same as my patch does.
> The issue is not 'walking dm tree,' which is already done
> by efi_disk_register(), but adding an extra "device path" to
> host device.
Sorry, the mistake is on my side.
Best regards
Heinrich
More information about the U-Boot
mailing list