[U-Boot] [PATCH 2/2] efi_loader: device_path: support Sandbox's "host" devices

Heinrich Schuchardt xypron.glpk at gmx.de
Fri Aug 23 18:09:45 UTC 2019


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:

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.

But for MMC, USB, SATA, and SCSI devices you would want to use another
node type.

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.

Best regards

Heinrich


More information about the U-Boot mailing list