[U-Boot] [PATCH 2/2] efi_loader: device_path: support Sandbox's "host" devices
AKASHI Takahiro
takahiro.akashi at linaro.org
Thu Aug 22 23:34:12 UTC 2019
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
> 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 at 0
> phy 1 [ ] phy_sandbox |-- gen_phy at 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 at 10002000
> eth 1 [ + ] eth_sandbox |-- eth at 10003000
> eth 2 [ + ] eth_sandbox |-- sbe5
> eth 3 [ + ] eth_sandbox |-- eth at 10004000
> gpio 1 [ + ] gpio_sandbox |-- base-gpios
> gpio 2 [ ] gpio_sandbox |-- extra-gpios
> i2c 0 [ + ] i2c_sandbox |-- i2c at 0
> i2c_eeprom 0 [ ] i2c_eeprom | |-- eeprom at 2c
> rtc 0 [ ] rtc-sandbox | |-- rtc at 43
> rtc 1 [ + ] rtc-sandbox | |-- rtc at 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 at 41
> bootcount 0 [ + ] bootcount-rtc |-- bootcount at 0
> adc 0 [ ] sandbox-adc |-- adc at 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 at 0,0
> pci_emul 0 [ ] sandbox_swap_case_em | | `-- emul at 0,0
> pci_generi 1 [ ] pci_generic_drv | |-- pci at 1,0
> pci_emul 1 [ ] sandbox_swap_case_em | | `-- emul at 0,0
> pci_generi 2 [ ] pci_generic_drv | `-- pci at 1f,0
> pci_emul 2 [ ] sandbox_swap_case_em | `-- emul at 1f,0
> pci 1 [ ] pci_sandbox |-- pci-controller1
> pci 2 [ ] pci_sandbox |-- pci-controller2
> pci_generi 3 [ ] pci_generic_drv | `-- pci at 1f,0
> pci_emul 3 [ ] sandbox_swap_case_em | `-- emul at 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 at 0
> sysreset 2 [ ] sysreset_sandbox |-- reset at 1
> reset 0 [ ] sandbox_reset |-- reset-ctl
> misc 4 [ ] sandbox_reset_test |-- reset-ctl-test
> remoteproc 1 [ ] sandbox_test_proc |-- rproc at 1
> remoteproc 2 [ ] sandbox_test_proc |-- rproc at 2
> panel 0 [ ] simple_panel |-- panel
> smem 0 [ ] smem_sandbox |-- smem at 0
> sound 0 [ ] sandbox_sound |-- sound
> spi 0 [ ] spi_sandbox |-- spi at 0
> spi_flash 0 [ ] spi_flash_std | `-- spi.bin at 0
> syscon 0 [ ] sandbox_syscon |-- syscon at 0
> syscon 1 [ ] sandbox_syscon |-- syscon at 1
> simple_bus 2 [ ] generic_simple_bus |-- syscon at 2
> timer 1 [ ] sandbox_timer |-- timer
> tpm 0 [ ] sandbox_tpm2 |-- tpm2
> serial 1 [ ] serial_sandbox |-- serial
> usb 0 [ ] usb_sandbox |-- usb at 1
> usb_hub 0 [ ] usb_hub | `-- hub
> usb_emul 0 [ ] usb_sandbox_hub | `-- hub-emul
> usb_emul 1 [ ] usb_sandbox_flash | |--
> flash-stick at 0
> usb_emul 2 [ ] usb_sandbox_flash | |--
> flash-stick at 1
> usb_emul 3 [ ] usb_sandbox_flash | |--
> flash-stick at 2
> usb_emul 4 [ ] usb_sandbox_keyb | `-- keyb at 3
> spmi 0 [ ] sandbox_spmi |-- spmi at 0
> pmic 2 [ ] pmic_pm8916 | `-- pm8916 at 0
> gpio 3 [ ] gpio_pm8916 | `-- gpios at c000
> watchdog 0 [ + ] wdt_sandbox |-- wdt at 0
> axi 0 [ ] axi_sandbox_bus |-- axi at 0
> axi_emul 0 [ ] sandbox_axi_store | `-- store at 0
> testfdt 7 [ ] testfdt_drv |-- chosen-test
> simple_bus 3 [ ] generic_simple_bus |-- translation-test at 8000
> fdt-dummy 0 [ ] fdt_dummy_drv | |-- dev at 0,0
> fdt-dummy 1 [ ] fdt_dummy_drv | |-- dev at 1,100
> fdt-dummy 2 [ ] fdt_dummy_drv | |-- dev at 2,200
> simple_bus 4 [ ] generic_simple_bus | `-- noxlatebus at 3,300
> fdt-dummy 3 [ ] fdt_dummy_drv | `-- dev at 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 at 0
> dma 0 [ ] sandbox-dma |-- dma
> mdio-mux 0 [ ] mdio_mux_sandbox |-- mdio-mux-test
> mdio 0 [ ] mdio-mux-bus-drv | |-- mdio-ch-test at 0
> mdio 1 [ ] mdio-mux-bus-drv | `-- mdio-ch-test at 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
More information about the U-Boot
mailing list