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 <[email protected]>
---
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.
Could you, please, assign the device paths you want to generate to the
device tree nodes below. Hopefully we than can come up with a UEFI
compliant solution.
@Simon:
Why do we have siblings in the device tree with the same name (e.g.
demo_shape_drv)? I thought siblings should always have different names.
Best regards
Heinrich
Class Index Probed Driver Name
-----------------------------------------------------------
root 0 [ + ] root_driver root_driver
demo 0 [ ] demo_shape_drv |-- demo_shape_drv
demo 1 [ ] demo_simple_drv |-- demo_simple_drv
demo 2 [ ] demo_shape_drv |-- demo_shape_drv
demo 3 [ ] demo_simple_drv |-- demo_simple_drv
demo 4 [ ] demo_shape_drv |-- demo_shape_drv
test 0 [ ] test_drv |-- test_drv
test 1 [ ] test_drv |-- test_drv
test 2 [ ] test_drv |-- test_drv
gpio 0 [ ] gpio_sandbox |-- gpio_sandbox
rsa_mod_ex 0 [ ] mod_exp_sw |-- mod_exp_sw
remoteproc 0 [ ] sandbox_test_proc |-- sandbox_test_proc
timer 0 [ + ] sandbox_timer |-- sandbox_timer
serial 0 [ + ] serial_sandbox |-- serial_sandbox
sysreset 0 [ ] sysreset_sandbox |-- sysreset_sandbox
audio-code 0 [ ] sandbox_codec |-- audio-codec
cros-ec 0 [ + ] cros_ec_sandbox |-- cros-ec
testfdt 0 [ ] testfdt_drv |-- a-test
backlight 0 [ ] pwm_backlight |-- backlight
testfdt 1 [ ] testfdt_drv |-- b-test
phy 0 [ ] phy_sandbox |-- gen_phy@0
phy 1 [ ] phy_sandbox |-- gen_phy@1
simple_bus 0 [ ] generic_simple_bus |-- gen_phy_user
testbus 0 [ ] testbus_drv |-- some-bus
testfdt 2 [ ] testfdt_drv |-- d-test
testfdt 3 [ ] testfdt_drv |-- e-test
testfdt 4 [ ] testfdt_drv |-- f-test
testfdt 5 [ ] testfdt_drv |-- g-test
testfdt 6 [ ] testfdt1_drv |-- h-test
clk 0 [ ] clk_sandbox |-- clk-sbox
misc 0 [ ] sandbox_clk_test |-- clk-test
clk 1 [ ] sandbox_clk_ccf |-- clk-ccf
eth 0 [ + ] eth_sandbox |-- eth@10002000
eth 1 [ + ] eth_sandbox |-- eth@10003000
eth 2 [ + ] eth_sandbox |-- sbe5
eth 3 [ + ] eth_sandbox |-- eth@10004000
gpio 1 [ + ] gpio_sandbox |-- base-gpios
gpio 2 [ ] gpio_sandbox |-- extra-gpios
i2c 0 [ + ] i2c_sandbox |-- i2c@0
i2c_eeprom 0 [ ] i2c_eeprom | |-- eeprom@2c
rtc 0 [ ] rtc-sandbox | |-- rtc@43
rtc 1 [ + ] rtc-sandbox | |-- rtc@61
i2c_emul_p 0 [ + ] i2c_emul_parent_drv | |-- emul
i2c_emul 0 [ ] sandbox_i2c_eeprom_e | | |-- emul-eeprom
i2c_emul 1 [ ] sandbox_i2c_rtc_emul | | |-- emul0
i2c_emul 2 [ + ] sandbox_i2c_rtc_emul | | |-- emull
i2c_emul 3 [ ] sandbox_i2c_pmic_emu | | |-- pmic-emul0
i2c_emul 4 [ ] sandbox_i2c_pmic_emu | | `-- pmic-emul1
pmic 0 [ ] sandbox_pmic | |-- sandbox_pmic
regulator 0 [ ] sandbox_buck | | |-- buck1
regulator 1 [ ] sandbox_buck | | |-- buck2
regulator 2 [ ] sandbox_ldo | | |-- ldo1
regulator 3 [ ] sandbox_ldo | | |-- ldo2
regulator 4 [ ] sandbox_buck | | `--
no_match_by_nodename
pmic 1 [ ] mc34708_pmic | `-- pmic@41
bootcount 0 [ + ] bootcount-rtc |-- bootcount@0
adc 0 [ ] sandbox-adc |-- adc@0
video 0 [ + ] sdl_sandbox |-- lcd
vidconsole 0 [ + ] vidconsole_tt | `-- lcd.vidconsole_tt
led 0 [ + ] gpio_led |-- leds
led 1 [ ] gpio_led | |-- iracibble
led 2 [ ] gpio_led | |-- martinet
led 3 [ + ] gpio_led | |-- default_on
led 4 [ + ] gpio_led | `-- default_off
mailbox 0 [ ] sandbox_mbox |-- mbox
misc 1 [ ] sandbox_mbox_test |-- mbox-test
cpu 0 [ ] cpu_sandbox |-- cpu-test1
cpu 1 [ ] cpu_sandbox |-- cpu-test2
cpu 2 [ ] cpu_sandbox |-- cpu-test3
i2s 0 [ ] sandbox_i2s |-- i2s
nop 0 [ ] noptest1_drv |-- nop-test_0
nop 1 [ ] noptest2_drv | `-- nop-test_1
misc 2 [ ] misc_sandbox |-- misc-test
mmc 0 [ + ] mmc_sandbox |-- mmc2
blk 0 [ ] mmc_blk | `-- mmc2.blk
mmc 1 [ + ] mmc_sandbox |-- mmc1
blk 1 [ ] mmc_blk | `-- mmc1.blk
mmc 2 [ + ] mmc_sandbox |-- mmc0
blk 2 [ ] mmc_blk | `-- mmc0.blk
pch 0 [ ] sandbox-pch |-- pch
pci 0 [ ] pci_sandbox |-- pci-controller0
pci_generi 0 [ ] pci_generic_drv | |-- pci@0,0
pci_emul 0 [ ] sandbox_swap_case_em | | `-- emul@0,0
pci_generi 1 [ ] pci_generic_drv | |-- pci@1,0
pci_emul 1 [ ] sandbox_swap_case_em | | `-- emul@0,0
pci_generi 2 [ ] pci_generic_drv | `-- pci@1f,0
pci_emul 2 [ ] sandbox_swap_case_em | `-- emul@1f,0
pci 1 [ ] pci_sandbox |-- pci-controller1
pci 2 [ ] pci_sandbox |-- pci-controller2
pci_generi 3 [ ] pci_generic_drv | `-- pci@1f,0
pci_emul 3 [ ] sandbox_swap_case_em | `-- emul@1f,0
pci_ep 0 [ ] pci_ep_sandbox |-- pci_ep
simple_bus 1 [ ] generic_simple_bus |-- probing
testprobe 0 [ ] testprobe_drv | |-- test1
testprobe 1 [ ] testprobe_drv | |-- test2
testprobe 2 [ ] testprobe_drv | |-- test3
testprobe 3 [ ] testprobe_drv | `-- test4
power_doma 0 [ ] sandbox_power_domain |-- power-domain
misc 3 [ ] sandbox_power_domain |-- power-domain-test
pwm 0 [ ] pwm_sandbox |-- pwm
pwm 1 [ ] pwm_sandbox |-- pwm2
ram 0 [ ] ram_sandbox |-- ram
sysreset 1 [ ] warm_sysreset_sandbo |-- reset@0
sysreset 2 [ ] sysreset_sandbox |-- reset@1
reset 0 [ ] sandbox_reset |-- reset-ctl
misc 4 [ ] sandbox_reset_test |-- reset-ctl-test
remoteproc 1 [ ] sandbox_test_proc |-- rproc@1
remoteproc 2 [ ] sandbox_test_proc |-- rproc@2
panel 0 [ ] simple_panel |-- panel
smem 0 [ ] smem_sandbox |-- smem@0
sound 0 [ ] sandbox_sound |-- sound
spi 0 [ ] spi_sandbox |-- spi@0
spi_flash 0 [ ] spi_flash_std | `-- spi.bin@0
syscon 0 [ ] sandbox_syscon |-- syscon@0
syscon 1 [ ] sandbox_syscon |-- syscon@1
simple_bus 2 [ ] generic_simple_bus |-- syscon@2
timer 1 [ ] sandbox_timer |-- timer
tpm 0 [ ] sandbox_tpm2 |-- tpm2
serial 1 [ ] serial_sandbox |-- serial
usb 0 [ ] usb_sandbox |-- usb@1
usb_hub 0 [ ] usb_hub | `-- hub
usb_emul 0 [ ] usb_sandbox_hub | `-- hub-emul
usb_emul 1 [ ] usb_sandbox_flash | |--
flash-stick@0
usb_emul 2 [ ] usb_sandbox_flash | |--
flash-stick@1
usb_emul 3 [ ] usb_sandbox_flash | |--
flash-stick@2
usb_emul 4 [ ] usb_sandbox_keyb | `-- keyb@3
spmi 0 [ ] sandbox_spmi |-- spmi@0
pmic 2 [ ] pmic_pm8916 | `-- pm8916@0
gpio 3 [ ] gpio_pm8916 | `-- gpios@c000
watchdog 0 [ + ] wdt_sandbox |-- wdt@0
axi 0 [ ] axi_sandbox_bus |-- axi@0
axi_emul 0 [ ] sandbox_axi_store | `-- store@0
testfdt 7 [ ] testfdt_drv |-- chosen-test
simple_bus 3 [ ] generic_simple_bus |-- translation-test@8000
fdt-dummy 0 [ ] fdt_dummy_drv | |-- dev@0,0
fdt-dummy 1 [ ] fdt_dummy_drv | |-- dev@1,100
fdt-dummy 2 [ ] fdt_dummy_drv | |-- dev@2,200
simple_bus 4 [ ] generic_simple_bus | `-- noxlatebus@3,300
fdt-dummy 3 [ ] fdt_dummy_drv | `-- dev@42
video_osd 0 [ ] sandbox_osd_drv |-- osd
board 0 [ ] board_sandbox |-- board
tee 0 [ ] sandbox_tee |-- sandbox_tee
virtio 0 [ ] virtio-sandbox1 |-- sandbox_virtio1
virtio 1 [ ] virtio-sandbox2 |-- sandbox_virtio2
pinctrl 0 [ + ] sandbox_pinctrl |-- pinctrl
hwspinlock 0 [ ] hwspinlock_sandbox |-- hwspinlock@0
dma 0 [ ] sandbox-dma |-- dma
mdio-mux 0 [ ] mdio_mux_sandbox |-- mdio-mux-test
mdio 0 [ ] mdio-mux-bus-drv | |-- mdio-ch-test@0
mdio 1 [ ] mdio-mux-bus-drv | `-- mdio-ch-test@1
mdio 2 [ ] mdio_sandbox |-- mdio-test
clk 2 [ ] fixed_rate_clock |-- clk-fixed
clk 3 [ ] fixed_factor_clock |-- clk-fixed-factor
clk 4 [ ] fixed_rate_clock |-- osc
firmware 0 [ ] sandbox_firmware `-- sandbox-firmware
_______________________________________________
U-Boot mailing list
[email protected]
https://lists.denx.de/listinfo/u-boot