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.aka...@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 > 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 U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot