]> git.sur5r.net Git - u-boot/commitdiff
Merge git://git.denx.de/u-boot-mmc
authorTom Rini <trini@konsulko.com>
Wed, 24 Jan 2018 16:28:44 +0000 (11:28 -0500)
committerTom Rini <trini@konsulko.com>
Wed, 24 Jan 2018 16:28:44 +0000 (11:28 -0500)
273 files changed:
MAINTAINERS
arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch3_serdes.c
arch/arm/cpu/armv8/fsl-layerscape/soc.c
arch/arm/cpu/armv8/fsl-layerscape/spl.c
arch/arm/dts/fsl-ls1012a-frdm.dts
arch/arm/dts/fsl-ls1012a-frdm.dtsi
arch/arm/dts/fsl-ls1012a-qds.dts
arch/arm/dts/fsl-ls1012a-qds.dtsi
arch/arm/dts/fsl-ls1012a-rdb.dts
arch/arm/dts/fsl-ls1012a-rdb.dtsi
arch/arm/dts/fsl-ls1012a.dtsi
arch/arm/dts/fsl-ls1043a-qds-duart.dts
arch/arm/dts/fsl-ls1043a-qds-lpuart.dts
arch/arm/dts/fsl-ls1043a-qds.dtsi
arch/arm/dts/fsl-ls1043a-rdb.dts
arch/arm/dts/fsl-ls1043a.dtsi
arch/arm/dts/fsl-ls1046a-qds-duart.dts
arch/arm/dts/fsl-ls1046a-qds-lpuart.dts
arch/arm/dts/fsl-ls1046a-qds.dtsi
arch/arm/dts/fsl-ls1046a-rdb.dts
arch/arm/dts/fsl-ls1046a.dtsi
arch/arm/dts/fsl-ls1088a-qds.dts
arch/arm/dts/fsl-ls1088a-rdb.dts
arch/arm/dts/fsl-ls1088a.dtsi
arch/arm/dts/fsl-ls2080a-qds.dts
arch/arm/dts/fsl-ls2080a-rdb.dts
arch/arm/dts/fsl-ls2080a.dtsi
arch/arm/dts/fsl-ls2081a-rdb.dts
arch/arm/dts/fsl-ls2088a-rdb-qspi.dts
arch/arm/include/asm/arch-fsl-layerscape/fsl_serdes.h
arch/arm/include/asm/arch-fsl-layerscape/immap_lsch3.h
arch/arm/include/asm/arch-fsl-layerscape/soc.h
arch/arm/lib/Makefile
arch/arm/mach-davinci/Kconfig
board/freescale/common/Kconfig
board/freescale/common/Makefile
board/freescale/common/qixis.c
board/freescale/common/vid.c
board/freescale/ls1088a/ddr.c
board/freescale/ls1088a/ls1088a.c
board/logicpd/omap3som/omap3logic.c
cmd/Kconfig
cmd/bootefi.c
common/board_f.c
common/hash.c
configs/am335x_baltos_defconfig
configs/am335x_boneblack_defconfig
configs/am335x_boneblack_vboot_defconfig
configs/am335x_evm_defconfig
configs/am335x_evm_nor_defconfig
configs/am335x_evm_norboot_defconfig
configs/am335x_evm_spiboot_defconfig
configs/am335x_evm_usbspl_defconfig
configs/am335x_hs_evm_defconfig
configs/am335x_hs_evm_uart_defconfig
configs/am3517_crane_defconfig
configs/am3517_evm_defconfig
configs/am43xx_evm_defconfig
configs/am43xx_evm_ethboot_defconfig
configs/am43xx_evm_qspiboot_defconfig
configs/am43xx_evm_usbhost_boot_defconfig
configs/am43xx_hs_evm_defconfig
configs/am57xx_evm_defconfig
configs/am57xx_hs_evm_defconfig
configs/birdland_bav335a_defconfig
configs/birdland_bav335b_defconfig
configs/brppt1_mmc_defconfig
configs/brppt1_nand_defconfig
configs/brppt1_spi_defconfig
configs/brxre1_defconfig
configs/calimain_defconfig
configs/chiliboard_defconfig
configs/chromebit_mickey_defconfig
configs/chromebook_jerry_defconfig
configs/chromebook_minnie_defconfig
configs/cl-som-am57x_defconfig
configs/cm_t3517_defconfig
configs/cm_t35_defconfig
configs/cm_t43_defconfig
configs/da850_am18xxevm_defconfig
configs/da850evm_defconfig
configs/da850evm_direct_nor_defconfig
configs/dra7xx_evm_defconfig
configs/dra7xx_hs_evm_defconfig
configs/draco_defconfig
configs/ds109_defconfig
configs/duovero_defconfig
configs/ea20_defconfig
configs/etamin_defconfig
configs/evb-rk3288_defconfig
configs/fennec-rk3288_defconfig
configs/firefly-rk3288_defconfig
configs/igep0032_defconfig
configs/igep00x0_defconfig
configs/k2e_evm_defconfig
configs/k2e_hs_evm_defconfig
configs/k2g_evm_defconfig
configs/k2g_hs_evm_defconfig
configs/k2hk_evm_defconfig
configs/k2hk_hs_evm_defconfig
configs/k2l_evm_defconfig
configs/kc1_defconfig
configs/legoev3_defconfig
configs/miqi-rk3288_defconfig
configs/mx25pdk_defconfig
configs/nokia_rx51_defconfig
configs/omap3_beagle_defconfig
configs/omap3_evm_defconfig
configs/omap3_logic_defconfig
configs/omap3_zoom1_defconfig
configs/omap4_panda_defconfig
configs/omap4_sdp4430_defconfig
configs/omapl138_lcdk_defconfig
configs/pcm051_rev1_defconfig
configs/pcm051_rev3_defconfig
configs/pengwyn_defconfig
configs/phycore-rk3288_defconfig
configs/poplar_defconfig
configs/popmetal-rk3288_defconfig
configs/pxm2_defconfig
configs/rastaban_defconfig
configs/rock2_defconfig
configs/rock_defconfig
configs/rut_defconfig
configs/sniper_defconfig
configs/thuban_defconfig
configs/tinker-rk3288_defconfig
configs/vyasa-rk3288_defconfig
doc/README.ext4
drivers/block/blk-uclass.c
drivers/clk/Makefile
drivers/clk/clk-uclass.c
drivers/clk/clk_fixed_rate.c
drivers/core/device.c
drivers/core/ofnode.c
drivers/core/read.c
drivers/crypto/fsl/fsl_hash.c
drivers/ddr/fsl/fsl_ddr_gen4.c
drivers/spi/Kconfig
drivers/usb/Kconfig
drivers/usb/musb-new/Kconfig
drivers/usb/musb/Kconfig [new file with mode: 0644]
drivers/usb/phy/Kconfig [new file with mode: 0644]
env/Kconfig
examples/api/Makefile
fs/ext4/Kconfig
fs/fat/Kconfig
fs/fat/fat.c
fs/fat/fat_write.c
include/blk.h
include/common.h
include/config_fallbacks.h
include/configs/MPC8349ITX.h
include/configs/am335x_evm.h
include/configs/am335x_shc.h
include/configs/am3517_crane.h
include/configs/am3517_evm.h
include/configs/am43xx_evm.h
include/configs/am57xx_evm.h
include/configs/apf27.h
include/configs/baltos.h
include/configs/bav335x.h
include/configs/brppt1.h
include/configs/brxre1.h
include/configs/calimain.h
include/configs/chiliboard.h
include/configs/cl-som-am57x.h
include/configs/clearfog.h
include/configs/cm_t35.h
include/configs/cm_t3517.h
include/configs/cm_t43.h
include/configs/controlcenterdc.h
include/configs/da850evm.h
include/configs/db-88f6720.h
include/configs/db-88f6820-amc.h
include/configs/db-88f6820-gp.h
include/configs/db-mv784mp-gp.h
include/configs/dra7xx_evm.h
include/configs/dragonboard820c.h
include/configs/ds414.h
include/configs/ea20.h
include/configs/eco5pk.h
include/configs/edminiv2.h
include/configs/gplugd.h
include/configs/hikey.h
include/configs/ipam390.h
include/configs/kc1.h
include/configs/legoev3.h
include/configs/ls1088aqds.h
include/configs/ls1088ardb.h
include/configs/mv-common.h
include/configs/mvebu_armada-37xx.h
include/configs/mvebu_armada-8k.h
include/configs/mx25pdk.h
include/configs/nas220.h
include/configs/nokia_rx51.h
include/configs/omap3_beagle.h
include/configs/omap3_evm.h
include/configs/omap3_igep00x0.h
include/configs/omap3_logic.h
include/configs/omap3_zoom1.h
include/configs/omapl138_lcdk.h
include/configs/pcm051.h
include/configs/pengwyn.h
include/configs/pic32mzdask.h
include/configs/poplar.h
include/configs/rcar-gen2-common.h
include/configs/rcar-gen3-common.h
include/configs/rk3128_common.h
include/configs/rk3188_common.h
include/configs/rk3288_common.h
include/configs/rk3328_common.h
include/configs/rk3399_common.h
include/configs/s5p_goni.h
include/configs/sandbox.h
include/configs/siemens-am33x-common.h
include/configs/sniper.h
include/configs/sunxi-common.h
include/configs/tegra-common-post.h
include/configs/theadorable.h
include/configs/ti_armv7_keystone2.h
include/configs/ti_omap4_common.h
include/configs/turris_omnia.h
include/configs/vct.h
include/configs/x600.h
include/configs/x86-common.h
include/configs/zmx25.h
include/configs/zynq-common.h
include/dm/ofnode.h
include/dm/pinctrl.h
include/dm/read.h
include/dm/uclass-id.h
include/dm/uclass.h
include/efi_api.h
include/efi_driver.h [new file with mode: 0644]
include/efi_loader.h
include/efi_selftest.h
include/fat.h
lib/Makefile
lib/efi_driver/Makefile [new file with mode: 0644]
lib/efi_driver/efi_block_device.c [new file with mode: 0644]
lib/efi_driver/efi_uclass.c [new file with mode: 0644]
lib/efi_loader/efi_boottime.c
lib/efi_loader/efi_console.c
lib/efi_loader/efi_device_path.c
lib/efi_loader/efi_device_path_to_text.c
lib/efi_loader/efi_disk.c
lib/efi_loader/efi_image_loader.c
lib/efi_loader/efi_memory.c
lib/efi_loader/helloworld.c
lib/efi_selftest/.gitignore [new file with mode: 0644]
lib/efi_selftest/Makefile
lib/efi_selftest/efi_selftest.c
lib/efi_selftest/efi_selftest_block_device.c [new file with mode: 0644]
lib/efi_selftest/efi_selftest_console.c
lib/efi_selftest/efi_selftest_controllers.c [new file with mode: 0644]
lib/efi_selftest/efi_selftest_devicepath.c
lib/efi_selftest/efi_selftest_disk_image.h [new file with mode: 0644]
lib/efi_selftest/efi_selftest_events.c
lib/efi_selftest/efi_selftest_manageprotocols.c
lib/efi_selftest/efi_selftest_miniapp_exit.c [new file with mode: 0644]
lib/efi_selftest/efi_selftest_miniapp_return.c [new file with mode: 0644]
lib/efi_selftest/efi_selftest_startimage_exit.c [new file with mode: 0644]
lib/efi_selftest/efi_selftest_startimage_return.c [new file with mode: 0644]
lib/efi_selftest/efi_selftest_tpl.c
lib/fdtdec.c
lib/vsprintf.c
scripts/config_whitelist.txt
test/print_ut.c
tools/.gitignore
tools/Makefile
tools/file2include.c [new file with mode: 0644]
tools/patman/get_maintainer.py

index 754db5553d467b9e69704da90799b52bd83adada..d4591535039dfaf2a2e7c0ff00d09f96861a9f2c 100644 (file)
@@ -287,9 +287,10 @@ M: Alexander Graf <agraf@suse.de>
 S:     Maintained
 T:     git git://github.com/agraf/u-boot.git
 F:     include/efi*
-F:     lib/efi*
+F:     lib/efi*/
 F:     test/py/tests/test_efi*
 F:     cmd/bootefi.c
+F:     tools/file2include.c
 
 FLATTENED DEVICE TREE
 M:     Simon Glass <sjg@chromium.org>
index 179cac6e49368690e72b61b2c91eace126ba1b58..9ee0dd23e9c9f915d9449ffac3b5dac477efef4d 100644 (file)
@@ -158,6 +158,293 @@ void serdes_init(u32 sd, u32 sd_addr, u32 rcwsr, u32 sd_prctl_mask,
        serdes_prtcl_map[NONE] = 1;
 }
 
+__weak int get_serdes_volt(void)
+{
+       return -1;
+}
+
+__weak int set_serdes_volt(int svdd)
+{
+       return -1;
+}
+
+#define LNAGCR0_RT_RSTB                0x00600000
+
+#define RSTCTL_RESET_MASK      0x000000E0
+
+#define RSTCTL_RSTREQ          0x80000000
+#define RSTCTL_RST_DONE                0x40000000
+#define RSTCTL_RSTERR          0x20000000
+
+#define RSTCTL_SDEN            0x00000020
+#define RSTCTL_SDRST_B         0x00000040
+#define RSTCTL_PLLRST_B                0x00000080
+
+#define TCALCR_CALRST_B                0x08000000
+
+struct serdes_prctl_info {
+       u32 id;
+       u32 mask;
+       u32 shift;
+};
+
+struct serdes_prctl_info srds_prctl_info[] = {
+#ifdef CONFIG_SYS_FSL_SRDS_1
+       {.id = 1,
+        .mask = FSL_CHASSIS3_SRDS1_PRTCL_MASK,
+        .shift = FSL_CHASSIS3_SRDS1_PRTCL_SHIFT
+       },
+
+#endif
+#ifdef CONFIG_SYS_FSL_SRDS_2
+       {.id = 2,
+        .mask = FSL_CHASSIS3_SRDS2_PRTCL_MASK,
+        .shift = FSL_CHASSIS3_SRDS2_PRTCL_SHIFT
+       },
+#endif
+       {} /* NULL ENTRY */
+};
+
+static int get_serdes_prctl_info_idx(u32 serdes_id)
+{
+       int pos = 0;
+       struct serdes_prctl_info *srds_info;
+
+       /* loop until NULL ENTRY defined by .id=0 */
+       for (srds_info = srds_prctl_info; srds_info->id != 0;
+            srds_info++, pos++) {
+               if (srds_info->id == serdes_id)
+                       return pos;
+       }
+
+       return -1;
+}
+
+static void do_enabled_lanes_reset(u32 serdes_id, u32 cfg,
+                                  struct ccsr_serdes __iomem *serdes_base,
+                                  bool cmplt)
+{
+       int i, pos;
+       u32 cfg_tmp;
+
+       pos = get_serdes_prctl_info_idx(serdes_id);
+       if (pos == -1) {
+               printf("invalid serdes_id %d\n", serdes_id);
+               return;
+       }
+
+       cfg_tmp = cfg & srds_prctl_info[pos].mask;
+       cfg_tmp >>= srds_prctl_info[pos].shift;
+
+       for (i = 0; i < 4 && cfg_tmp & (0xf << (3 - i)); i++) {
+               if (cmplt)
+                       setbits_le32(&serdes_base->lane[i].gcr0,
+                                    LNAGCR0_RT_RSTB);
+               else
+                       clrbits_le32(&serdes_base->lane[i].gcr0,
+                                    LNAGCR0_RT_RSTB);
+       }
+}
+
+static void do_pll_reset(u32 cfg,
+                        struct ccsr_serdes __iomem *serdes_base)
+{
+       int i;
+
+       for (i = 0; i < 2 && !(cfg & (0x1 << (1 - i))); i++) {
+               clrbits_le32(&serdes_base->bank[i].rstctl,
+                            RSTCTL_RESET_MASK);
+               udelay(1);
+
+               setbits_le32(&serdes_base->bank[i].rstctl,
+                            RSTCTL_RSTREQ);
+       }
+       udelay(1);
+}
+
+static void do_rx_tx_cal_reset(struct ccsr_serdes __iomem *serdes_base)
+{
+       clrbits_le32(&serdes_base->srdstcalcr, TCALCR_CALRST_B);
+       clrbits_le32(&serdes_base->srdstcalcr, TCALCR_CALRST_B);
+}
+
+static void do_rx_tx_cal_reset_comp(u32 cfg, int i,
+                                   struct ccsr_serdes __iomem *serdes_base)
+{
+       if (!(cfg == 0x3 && i == 1)) {
+               udelay(1);
+               setbits_le32(&serdes_base->srdstcalcr, TCALCR_CALRST_B);
+               setbits_le32(&serdes_base->srdstcalcr, TCALCR_CALRST_B);
+       }
+       udelay(1);
+}
+
+static void do_pll_reset_done(u32 cfg,
+                             struct ccsr_serdes __iomem *serdes_base)
+{
+       int i;
+       u32 reg = 0;
+
+       for (i = 0; i < 2; i++) {
+               reg = in_le32(&serdes_base->bank[i].pllcr0);
+               if (!(cfg & (0x1 << (1 - i))) && ((reg >> 23) & 0x1)) {
+                       setbits_le32(&serdes_base->bank[i].rstctl,
+                                    RSTCTL_RST_DONE);
+               }
+       }
+}
+
+static void do_serdes_enable(u32 cfg,
+                            struct ccsr_serdes __iomem *serdes_base)
+{
+       int i;
+
+       for (i = 0; i < 2 && !(cfg & (0x1 << (1 - i))); i++) {
+               setbits_le32(&serdes_base->bank[i].rstctl, RSTCTL_SDEN);
+               udelay(1);
+
+               setbits_le32(&serdes_base->bank[i].rstctl, RSTCTL_PLLRST_B);
+               udelay(1);
+               /* Take the Rx/Tx calibration out of reset */
+               do_rx_tx_cal_reset_comp(cfg, i, serdes_base);
+       }
+}
+
+static void do_pll_lock(u32 cfg,
+                       struct ccsr_serdes __iomem *serdes_base)
+{
+       int i;
+       u32 reg = 0;
+
+       for (i = 0; i < 2 && !(cfg & (0x1 << (1 - i))); i++) {
+               /* if the PLL is not locked, set RST_ERR */
+               reg = in_le32(&serdes_base->bank[i].pllcr0);
+               if (!((reg >> 23) & 0x1)) {
+                       setbits_le32(&serdes_base->bank[i].rstctl,
+                                    RSTCTL_RSTERR);
+               } else {
+                       udelay(1);
+                       setbits_le32(&serdes_base->bank[i].rstctl,
+                                    RSTCTL_SDRST_B);
+                       udelay(1);
+               }
+       }
+}
+
+int setup_serdes_volt(u32 svdd)
+{
+       struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
+       struct ccsr_serdes __iomem *serdes1_base =
+                       (void *)CONFIG_SYS_FSL_LSCH3_SERDES_ADDR;
+       u32 cfg_rcwsrds1 = gur_in32(&gur->rcwsr[FSL_CHASSIS3_SRDS1_REGSR - 1]);
+#ifdef CONFIG_SYS_FSL_SRDS_2
+       struct ccsr_serdes __iomem *serdes2_base =
+                       (void *)(CONFIG_SYS_FSL_LSCH3_SERDES_ADDR + 0x10000);
+       u32 cfg_rcwsrds2 = gur_in32(&gur->rcwsr[FSL_CHASSIS3_SRDS2_REGSR - 1]);
+#endif
+       u32 cfg_tmp;
+       int svdd_cur, svdd_tar;
+       int ret = 1;
+
+       /* Only support switch SVDD to 900mV */
+       if (svdd != 900)
+               return -EINVAL;
+
+       /* Scale up to the LTC resolution is 1/4096V */
+       svdd = (svdd * 4096) / 1000;
+
+       svdd_tar = svdd;
+       svdd_cur = get_serdes_volt();
+       if (svdd_cur < 0)
+               return -EINVAL;
+
+       debug("%s: current SVDD: %x; target SVDD: %x\n",
+             __func__, svdd_cur, svdd_tar);
+       if (svdd_cur == svdd_tar)
+               return 0;
+
+       /* Put the all enabled lanes in reset */
+#ifdef CONFIG_SYS_FSL_SRDS_1
+       do_enabled_lanes_reset(1, cfg_rcwsrds1, serdes1_base, false);
+#endif
+
+#ifdef CONFIG_SYS_FSL_SRDS_2
+       do_enabled_lanes_reset(2, cfg_rcwsrds2, serdes2_base, false);
+#endif
+
+       /* Put the all enabled PLL in reset */
+#ifdef CONFIG_SYS_FSL_SRDS_1
+       cfg_tmp = cfg_rcwsrds1 & 0x3;
+       do_pll_reset(cfg_tmp, serdes1_base);
+#endif
+
+#ifdef CONFIG_SYS_FSL_SRDS_2
+       cfg_tmp = cfg_rcwsrds1 & 0xC;
+       cfg_tmp >>= 2;
+       do_pll_reset(cfg_tmp, serdes2_base);
+#endif
+
+       /* Put the Rx/Tx calibration into reset */
+#ifdef CONFIG_SYS_FSL_SRDS_1
+       do_rx_tx_cal_reset(serdes1_base);
+#endif
+
+#ifdef CONFIG_SYS_FSL_SRDS_2
+       do_rx_tx_cal_reset(serdes2_base);
+#endif
+
+       ret = set_serdes_volt(svdd);
+       if (ret < 0) {
+               printf("could not change SVDD\n");
+               ret = -1;
+       }
+
+       /* For each PLL that’s not disabled via RCW enable the SERDES */
+#ifdef CONFIG_SYS_FSL_SRDS_1
+       cfg_tmp = cfg_rcwsrds1 & 0x3;
+       do_serdes_enable(cfg_tmp, serdes1_base);
+#endif
+#ifdef CONFIG_SYS_FSL_SRDS_2
+       cfg_tmp = cfg_rcwsrds1 & 0xC;
+       cfg_tmp >>= 2;
+       do_serdes_enable(cfg_tmp, serdes2_base);
+#endif
+
+       /* Wait for at at least 625us, ensure the PLLs being reset are locked */
+       udelay(800);
+
+#ifdef CONFIG_SYS_FSL_SRDS_1
+       cfg_tmp = cfg_rcwsrds1 & 0x3;
+       do_pll_lock(cfg_tmp, serdes1_base);
+#endif
+
+#ifdef CONFIG_SYS_FSL_SRDS_2
+       cfg_tmp = cfg_rcwsrds1 & 0xC;
+       cfg_tmp >>= 2;
+       do_pll_lock(cfg_tmp, serdes2_base);
+#endif
+       /* Take the all enabled lanes out of reset */
+#ifdef CONFIG_SYS_FSL_SRDS_1
+       do_enabled_lanes_reset(1, cfg_rcwsrds1, serdes1_base, true);
+#endif
+#ifdef CONFIG_SYS_FSL_SRDS_2
+       do_enabled_lanes_reset(2, cfg_rcwsrds2, serdes2_base, true);
+#endif
+
+       /* For each PLL being reset, and achieved PLL lock set RST_DONE */
+#ifdef CONFIG_SYS_FSL_SRDS_1
+       cfg_tmp = cfg_rcwsrds1 & 0x3;
+       do_pll_reset_done(cfg_tmp, serdes1_base);
+#endif
+#ifdef CONFIG_SYS_FSL_SRDS_2
+       cfg_tmp = cfg_rcwsrds1 & 0xC;
+       cfg_tmp >>= 2;
+       do_pll_reset_done(cfg_tmp, serdes2_base);
+#endif
+
+       return ret;
+}
+
 void fsl_serdes_init(void)
 {
 #if defined(CONFIG_FSL_MC_ENET) && !defined(CONFIG_SPL_BUILD)
index dc4a437344811d210995fd4b08ec7e9756975af8..b9f837d58d3247a796e19b166fad035a1adb9e1e 100644 (file)
@@ -363,6 +363,45 @@ int sata_init(void)
 }
 #endif
 
+/* Get VDD in the unit mV from voltage ID */
+int get_core_volt_from_fuse(void)
+{
+       struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
+       int vdd;
+       u32 fusesr;
+       u8 vid;
+
+       /* get the voltage ID from fuse status register */
+       fusesr = in_le32(&gur->dcfg_fusesr);
+       debug("%s: fusesr = 0x%x\n", __func__, fusesr);
+       vid = (fusesr >> FSL_CHASSIS3_DCFG_FUSESR_ALTVID_SHIFT) &
+               FSL_CHASSIS3_DCFG_FUSESR_ALTVID_MASK;
+       if ((vid == 0) || (vid == FSL_CHASSIS3_DCFG_FUSESR_ALTVID_MASK)) {
+               vid = (fusesr >> FSL_CHASSIS3_DCFG_FUSESR_VID_SHIFT) &
+                       FSL_CHASSIS3_DCFG_FUSESR_VID_MASK;
+       }
+       debug("%s: VID = 0x%x\n", __func__, vid);
+       switch (vid) {
+       case 0x00: /* VID isn't supported */
+               vdd = -EINVAL;
+               debug("%s: The VID feature is not supported\n", __func__);
+               break;
+       case 0x08: /* 0.9V silicon */
+               vdd = 900;
+               break;
+       case 0x10: /* 1.0V silicon */
+               vdd = 1000;
+               break;
+       default:  /* Other core voltage */
+               vdd = -EINVAL;
+               debug("%s: The VID(%x) isn't supported\n", __func__, vid);
+               break;
+       }
+       debug("%s: The required minimum volt of CORE is %dmV\n", __func__, vdd);
+
+       return vdd;
+}
+
 #elif defined(CONFIG_FSL_LSCH2)
 #ifdef CONFIG_SCSI_AHCI_PLAT
 int sata_init(void)
index 1c694e7c67dbc20daada5ca80dd2c7653f088d80..4093d15e56983d864564ed7000526b4db8a8fe86 100644 (file)
@@ -84,6 +84,9 @@ void board_init_f(ulong dummy)
 
 #ifdef CONFIG_SPL_I2C_SUPPORT
        i2c_init_all();
+#endif
+#ifdef CONFIG_VID
+       init_func_vid();
 #endif
        dram_init();
 #ifdef CONFIG_SPL_FSL_LS_PPA
index 983e599b9bb6c07eb409e1d6d37e33ac0bdb1a20..6ea5f82ec428cd75e6e3a77efb4ac4a0f7f0713b 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2016, Freescale Semiconductor
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /dts-v1/;
index 25dcdd2929af7729b18307dcff402f8fd9381845..d453f5daca8be17b553d67ae5a4f954c48e0587d 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2016, Freescale Semiconductor
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /include/ "fsl-ls1012a.dtsi"
index 76db36ca39faec0c3f0966966827081fbd4b2a6f..ccc9023e39fe1bafeec4298dcf2b1f67501d697d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright 2016 Freescale Semiconductor
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /dts-v1/;
index d17cd99ed97510d4a639f1874dd6bc734954e513..908fbedf03d28374b0cac6400baa2e60d9bd7654 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright 2016 Freescale Semiconductor
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /include/ "fsl-ls1012a.dtsi"
index f683812c30ad328bd2a500727e654c7b0972737c..400cd9e7e8e1dc96389715a2fb52dbe16c761e98 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2016, Freescale Semiconductor
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /dts-v1/;
index bf407aeb94c32937fa85fcc75a5667e5f1131756..c4b6adffb8d537a4c540c14757b8eadc4ea4ea9a 100644 (file)
@@ -3,9 +3,7 @@
  *
  * Copyright 2016, Freescale Semiconductor
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /include/ "fsl-ls1012a.dtsi"
index 23b3cec43443dcf81736cb7d213087343953ff0f..215e095c32492a6aba1858c4ba25452e38c63637 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright 2016 Freescale Semiconductor
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /include/ "skeleton64.dtsi"
index 2124e38504707eb6f8261e0e17f53272c44390c0..cf53ab0025df28b6e3f0453872636375b0a6c1f7 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 2015, Freescale Semiconductor
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /dts-v1/;
index 18adb97d1878aba45b503cf66305906702c1b11b..118c45deef4b1f2bedcc3d9d4067d01f278c1d4d 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 2015, Freescale Semiconductor
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /dts-v1/;
index 21011720dd7d0ba7640f5440b70c89c44209fb99..9611619b59ae6f78bde5eb9026efe6ea052e6272 100644 (file)
@@ -5,9 +5,7 @@
  *
  * Mingkai Hu <Mingkai.hu@freescale.com>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /include/ "fsl-ls1043a.dtsi"
index f271e714b18e4be8504f1d5bcddc25c56f0dcfd0..27670a862933f9a1e9b360006efc530e87387581 100644 (file)
@@ -5,9 +5,7 @@
  *
  * Mingkai Hu <Mingkai.hu@freescale.com>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /dts-v1/;
index fe6698f1612cc215c6fab72bb350b878ce2268fb..3cc20774c12a395ef5687cacd7c9fc6c511e4ffc 100644 (file)
@@ -5,9 +5,7 @@
  *
  * Mingkai Hu <Mingkai.hu@freescale.com>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /include/ "skeleton64.dtsi"
index 10a95ea02543491129688f520b4b183bdbcd08bd..9a4b84fedbb682a43cb4a629bdedfa324faec6cd 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 2016, Freescale Semiconductor
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /dts-v1/;
index 21243d0766373a6441a14a0121b95724070c16a2..1c4d36265679847d7cfa35db6c7b7e1622d98a65 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 2016, Freescale Semiconductor
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /dts-v1/;
index a49ca08d888eb2f9e1cfe83138adb7f41029e38b..4e1920be8726e8f04446d9503d0a9b39ff0d4bd7 100644 (file)
@@ -5,9 +5,7 @@
  *
  * Mingkai Hu <Mingkai.hu@nxp.com>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /include/ "fsl-ls1046a.dtsi"
index 49024541e3650a4994f7448491d5e61f486f8f8a..646e4772c1cdc07f8f64aa6bd432b78419a809e2 100644 (file)
@@ -5,9 +5,7 @@
  *
  * Mingkai Hu <Mingkai.hu@freescale.com>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /dts-v1/;
index 408e81e41570a35ccd30568ce75d9ceebd296bda..f46707d320111bb95aa328993c37700bc797024f 100644 (file)
@@ -5,9 +5,7 @@
  *
  * Mingkai Hu <mingkai.hu@nxp.com>
  *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /include/ "skeleton64.dtsi"
index 9b7bef42b8f615a36b9244ae1c1b5867a526d7ac..225c7c53c752997ac0c18568863fe0da9008bd15 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2017 NXP
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /dts-v1/;
index 30ceed82120d0ce2f5c4fd0f72ccbc74632f1d36..7b6ca1d49ecc64767d3cef4b0131263a0f5bbbe6 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2017 NXP
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /dts-v1/;
index 64b4fcf12b6493aa4966309706b4ae737a81ede4..f8f8654e151a403264c9fd48a571ca622e6d7fc5 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2017 NXP
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 / {
index 0a7f1ffb2db39cac2caf62c10c7bf6c0f1b77d96..b85b802ee617c79ef6478c722030399ea2ec350a 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2013-2015 Freescale Semiconductor, Inc.
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /dts-v1/;
index 1a1813bdbf1584a37dbf9c0280bf2ad448d81868..04b1a71016b18b9723ae57ee999198fb2bb3179f 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2013-2015 Freescale Semiconductor, Inc.
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /dts-v1/;
index 79047d502ba25598c8390b332eea0d73e89f5faa..69273a9836536e53c9b0e2a202b9b48b0f43f56c 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2013-2015 Freescale Semiconductor, Inc.
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 / {
index aa4aa68c9c3d11075d94d25a3502502379f4b00d..ef668a3432a873e07865fbe6ceb61abef2b2a927 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Copyright 2017 NXP
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /dts-v1/;
index 3230e7ed7dfaec6cec6de32a600f73b4f8e2149c..9e3875d8c01951632f330269059ba2966ecd160f 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Copyright 2017 NXP
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0+        X11
  */
 
 /dts-v1/;
index 12fd6b8bdf99b9ecc369b42d3ede2c58ec4e271c..9becdf305d979019b0a6504b8d1b2c8c8d9fb759 100644 (file)
@@ -164,6 +164,7 @@ void fsl_rgmii_init(void);
 #ifdef CONFIG_FSL_LSCH2
 const char *serdes_clock_to_string(u32 clock);
 int get_serdes_protocol(void);
+#endif
 #ifdef CONFIG_SYS_HAS_SERDES
 /* Get the volt of SVDD in unit mV */
 int get_serdes_volt(void);
@@ -172,6 +173,5 @@ int set_serdes_volt(int svdd);
 /* The target volt of SVDD in unit mV */
 int setup_serdes_volt(u32 svdd);
 #endif
-#endif
 
 #endif /* __FSL_SERDES_H__ */
index 957e23b02ad59fe2403b772bf355deb6a0f62157..642df2f50a921eeaba52ad8126eb5bdf0392a7c1 100644 (file)
@@ -201,10 +201,15 @@ struct ccsr_gur {
        u32     gpporcr3;
        u32     gpporcr4;
        u8      res_030[0x60-0x30];
-#define FSL_CHASSIS3_DCFG_FUSESR_VID_SHIFT     2
 #define FSL_CHASSIS3_DCFG_FUSESR_VID_MASK      0x1F
-#define FSL_CHASSIS3_DCFG_FUSESR_ALTVID_SHIFT  7
 #define FSL_CHASSIS3_DCFG_FUSESR_ALTVID_MASK   0x1F
+#if defined(CONFIG_ARCH_LS1088A)
+#define FSL_CHASSIS3_DCFG_FUSESR_VID_SHIFT     25
+#define FSL_CHASSIS3_DCFG_FUSESR_ALTVID_SHIFT  20
+#else
+#define FSL_CHASSIS3_DCFG_FUSESR_VID_SHIFT     2
+#define FSL_CHASSIS3_DCFG_FUSESR_ALTVID_SHIFT  7
+#endif
        u32     dcfg_fusesr;    /* Fuse status register */
        u8      res_064[0x70-0x64];
        u32     devdisr;        /* Device disable control 1 */
@@ -387,5 +392,39 @@ struct ccsr_reset {
        u32 ip_rev2;                    /* 0xbfc */
 };
 
+struct ccsr_serdes {
+       struct {
+               u32     rstctl; /* Reset Control Register */
+               u32     pllcr0; /* PLL Control Register 0 */
+               u32     pllcr1; /* PLL Control Register 1 */
+               u32     pllcr2; /* PLL Control Register 2 */
+               u32     pllcr3; /* PLL Control Register 3 */
+               u32     pllcr4; /* PLL Control Register 4 */
+               u32     pllcr5; /* PLL Control Register 5 */
+               u8      res[0x20 - 0x1c];
+       } bank[2];
+       u8      res1[0x90 - 0x40];
+       u32     srdstcalcr;     /* TX Calibration Control */
+       u32     srdstcalcr1;    /* TX Calibration Control1 */
+       u8      res2[0xa0 - 0x98];
+       u32     srdsrcalcr;     /* RX Calibration Control */
+       u32     srdsrcalcr1;    /* RX Calibration Control1 */
+       u8      res3[0xb0 - 0xa8];
+       u32     srdsgr0;        /* General Register 0 */
+       u8      res4[0x800 - 0xb4];
+       struct serdes_lane {
+               u32     gcr0;   /* General Control Register 0 */
+               u32     gcr1;   /* General Control Register 1 */
+               u32     gcr2;   /* General Control Register 2 */
+               u32     ssc0;   /* Speed Switch Control 0 */
+               u32     rec0;   /* Receive Equalization Control 0 */
+               u32     rec1;   /* Receive Equalization Control 1 */
+               u32     tec0;   /* Transmit Equalization Control 0 */
+               u32     ssc1;   /* Speed Switch Control 1 */
+               u8      res1[0x840 - 0x820];
+       } lane[8];
+       u8 res5[0x19fc - 0xa00];
+};
+
 #endif /*__ASSEMBLY__*/
 #endif /* __ARCH_FSL_LSCH3_IMMAP_H_ */
index 1e65e4e1147719310376a49c253f3d958fb2e5ec..cb760b5b38afc1500c1225bda737a0b02a927ab5 100644 (file)
@@ -121,6 +121,7 @@ struct ccsr_ahci {
 
 #ifdef CONFIG_FSL_LSCH3
 void fsl_lsch3_early_init_f(void);
+int get_core_volt_from_fuse(void);
 #elif defined(CONFIG_FSL_LSCH2)
 void fsl_lsch2_early_init_f(void);
 int setup_chip_volt(void);
index abffa10c8508434b95be89e5671333ae16b7d18d..876024fc157a24a1a119befe1405e84cecfa9d31 100644 (file)
@@ -112,4 +112,5 @@ CFLAGS_$(EFI_RELOC) := $(CFLAGS_EFI)
 CFLAGS_REMOVE_$(EFI_RELOC) := $(CFLAGS_NON_EFI)
 
 extra-$(CONFIG_CMD_BOOTEFI_HELLO_COMPILE) += $(EFI_CRT0) $(EFI_RELOC)
+extra-$(CONFIG_CMD_BOOTEFI_SELFTEST) += $(EFI_CRT0) $(EFI_RELOC)
 extra-$(CONFIG_EFI) += $(EFI_CRT0) $(EFI_RELOC)
index 35e4e9bcea927319e9ef9502f4a6e3a6d854ae55..51a70e057148ff94bc06187e15007b11b85ad82a 100644 (file)
@@ -6,47 +6,63 @@ choice
 
 config TARGET_IPAM390
        bool "IPAM390 board"
+       select MACH_DAVINCI_DA850_EVM
+       select SOC_DA850
        select SUPPORT_SPL
-       select SYS_DA850_PLL_INIT
-       select SYS_DA850_DDR_INIT
 
 config TARGET_DA850EVM
        bool "DA850 EVM board"
+       select MACH_DAVINCI_DA850_EVM
+       select SOC_DA850
        select SUPPORT_SPL
-       select SYS_DA850_PLL_INIT
-       select SYS_DA850_DDR_INIT
 
 config TARGET_EA20
        bool "EA20 board"
+       select MACH_DAVINCI_DA850_EVM
+       select SOC_DA850
        select BOARD_LATE_INIT
 
 config TARGET_OMAPL138_LCDK
        bool "OMAPL138 LCDK"
+       select SOC_DA8XX
        select SUPPORT_SPL
-       select SYS_DA850_PLL_INIT
-       select SYS_DA850_DDR_INIT
 
 config TARGET_CALIMAIN
        bool "Calimain board"
-       select SYS_DA850_PLL_INIT
-       select SYS_DA850_DDR_INIT
+       select SOC_DA850
 
 config TARGET_LEGOEV3
        bool "LEGO MINDSTORMS EV3"
-       select SYS_DA850_PLL_INIT
-       select SYS_DA850_DDR_INIT
+       select MACH_DAVINCI_DA850_EVM
+       select SOC_DA850
 
 endchoice
 
 config SYS_SOC
        default "davinci"
 
+config DA850_LOWLEVEL
+       bool "Enable Lowlevel DA850 initialization"
+       depends on SOC_DA850
+
 config SYS_DA850_PLL_INIT
        bool
 
 config SYS_DA850_DDR_INIT
        bool
 
+config SOC_DA850
+       bool
+       select SOC_DA8XX
+       select SYS_DA850_DDR_INIT if SUPPORT_SPL || DA850_LOWLEVEL
+
+config SOC_DA8XX
+       bool
+       select SYS_DA850_PLL_INIT if SUPPORT_SPL || DA850_LOWLEVEL
+
+config MACH_DAVINCI_DA850_EVM
+       bool
+
 source "board/Barix/ipam390/Kconfig"
 source "board/davinci/da8xxevm/Kconfig"
 source "board/davinci/ea20/Kconfig"
index 280f7d46b808852e82ab3c737961ca611417a81f..8b89c10aba6cec63d5fb8ddb7394669485ff87c9 100644 (file)
@@ -20,3 +20,19 @@ config CMD_ESBC_VALIDATE
 
            esbc_validate - validate signature using RSA verification
            esbc_halt - put the core in spin loop (Secure Boot Only)
+
+config VOL_MONITOR_LTC3882_READ
+       depends on VID
+       bool "Enable the LTC3882 voltage monitor read"
+       default n
+       help
+        This option enables LTC3882 voltage monitor read
+        functionality. It is used by common VID driver.
+
+config VOL_MONITOR_LTC3882_SET
+       depends on VID
+       bool "Enable the LTC3882 voltage monitor set"
+       default n
+       help
+        This option enables LTC3882 voltage monitor set
+        functionality. It is used by common VID driver.
index e13cb2063ce047c30fea44eaa202615522626410..939e9c66a564e3ecf557762c47af55d7b1d5ccee 100644 (file)
@@ -23,8 +23,8 @@ obj-$(CONFIG_FMAN_ENET)       += fman.o
 obj-$(CONFIG_FSL_PIXIS)        += pixis.o
 ifndef CONFIG_SPL_BUILD
 obj-$(CONFIG_FSL_NGPIXIS)      += ngpixis.o
-obj-$(CONFIG_VID)              += vid.o
 endif
+obj-$(CONFIG_VID)              += vid.o
 obj-$(CONFIG_FSL_QIXIS)        += qixis.o
 obj-$(CONFIG_PQ_MDS_PIB)       += pq-mds-pib.o
 ifndef CONFIG_SPL_BUILD
index 24459f8635781f227c4398f6c442efebe24c9c8c..844c00a9e3b2154afbec48f67419fca4d54aaca6 100644 (file)
@@ -234,6 +234,28 @@ static int qixis_reset_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const ar
                QIXIS_WRITE(rcfg_ctl, 0x21);
 #else
                printf("Not implemented\n");
+#endif
+       } else if (strcmp(argv[1], "ifc") == 0) {
+#ifdef QIXIS_LBMAP_IFC
+               QIXIS_WRITE(rst_ctl, 0x30);
+               QIXIS_WRITE(rcfg_ctl, 0);
+               set_lbmap(QIXIS_LBMAP_IFC);
+               set_rcw_src(QIXIS_RCW_SRC_IFC);
+               QIXIS_WRITE(rcfg_ctl, 0x20);
+               QIXIS_WRITE(rcfg_ctl, 0x21);
+#else
+               printf("Not implemented\n");
+#endif
+       } else if (strcmp(argv[1], "emmc") == 0) {
+#ifdef QIXIS_LBMAP_EMMC
+               QIXIS_WRITE(rst_ctl, 0x30);
+               QIXIS_WRITE(rcfg_ctl, 0);
+               set_lbmap(QIXIS_LBMAP_EMMC);
+               set_rcw_src(QIXIS_RCW_SRC_EMMC);
+               QIXIS_WRITE(rcfg_ctl, 0x20);
+               QIXIS_WRITE(rcfg_ctl, 0x21);
+#else
+               printf("Not implemented\n");
 #endif
        } else if (strcmp(argv[1], "sd_qspi") == 0) {
 #ifdef QIXIS_LBMAP_SD_QSPI
index d6d1bfc861677948ab79586c24ac273433962d08..a9451c5c6ee5de5383c530a7f78038324f4ff86c 100644 (file)
@@ -33,6 +33,16 @@ int __weak board_vdd_drop_compensation(void)
        return 0;
 }
 
+/*
+ * Board specific settings for specific voltage value
+ */
+int __weak board_adjust_vdd(int vdd)
+{
+       return 0;
+}
+
+#if defined(CONFIG_VOL_MONITOR_IR36021_SET) || \
+       defined(CONFIG_VOL_MONITOR_IR36021_READ)
 /*
  * Get the i2c address configuration for the IR regulator chip
  *
@@ -65,6 +75,7 @@ static int find_ir_chip_on_i2c(void)
        }
        return -1;
 }
+#endif
 
 /* Maximum loop count waiting for new voltage to take effect */
 #define MAX_LOOP_WAIT_NEW_VOL          100
@@ -163,6 +174,36 @@ static int read_voltage_from_IR(int i2caddress)
 }
 #endif
 
+#ifdef CONFIG_VOL_MONITOR_LTC3882_READ
+/* read the current value of the LTC Regulator Voltage */
+static int read_voltage_from_LTC(int i2caddress)
+{
+       int  ret, vcode = 0;
+       u8 chan = PWM_CHANNEL0;
+
+       /* select the PAGE 0 using PMBus commands PAGE for VDD*/
+       ret = i2c_write(I2C_VOL_MONITOR_ADDR,
+                       PMBUS_CMD_PAGE, 1, &chan, 1);
+       if (ret) {
+               printf("VID: failed to select VDD Page 0\n");
+               return ret;
+       }
+
+       /*read the output voltage using PMBus command READ_VOUT*/
+       ret = i2c_read(I2C_VOL_MONITOR_ADDR,
+                      PMBUS_CMD_READ_VOUT, 1, (void *)&vcode, 2);
+       if (ret) {
+               printf("VID: failed to read the volatge\n");
+               return ret;
+       }
+
+       /* Scale down to the real mV as LTC resolution is 1/4096V,rounding up */
+       vcode = DIV_ROUND_UP(vcode * 1000, 4096);
+
+       return vcode;
+}
+#endif
+
 static int read_voltage(int i2caddress)
 {
        int voltage_read;
@@ -170,12 +211,15 @@ static int read_voltage(int i2caddress)
        voltage_read = read_voltage_from_INA220(i2caddress);
 #elif defined CONFIG_VOL_MONITOR_IR36021_READ
        voltage_read = read_voltage_from_IR(i2caddress);
+#elif defined CONFIG_VOL_MONITOR_LTC3882_READ
+       voltage_read = read_voltage_from_LTC(i2caddress);
 #else
        return -1;
 #endif
        return voltage_read;
 }
 
+#ifdef CONFIG_VOL_MONITOR_IR36021_SET
 /*
  * We need to calculate how long before the voltage stops to drop
  * or increase. It returns with the loop count. Each loop takes
@@ -235,7 +279,6 @@ static int wait_for_voltage_stable(int i2caddress)
        return vdd_current;
 }
 
-#ifdef CONFIG_VOL_MONITOR_IR36021_SET
 /* Set the voltage to the IR chip */
 static int set_voltage_to_IR(int i2caddress, int vdd)
 {
@@ -270,6 +313,43 @@ static int set_voltage_to_IR(int i2caddress, int vdd)
        debug("VID: Current voltage is %d mV\n", vdd_last);
        return vdd_last;
 }
+
+#endif
+
+#ifdef CONFIG_VOL_MONITOR_LTC3882_SET
+/* this function sets the VDD and returns the value set */
+static int set_voltage_to_LTC(int i2caddress, int vdd)
+{
+       int ret, vdd_last, vdd_target = vdd;
+
+       /* Scale up to the LTC resolution is 1/4096V */
+       vdd = (vdd * 4096) / 1000;
+
+       /* 5-byte buffer which needs to be sent following the
+        * PMBus command PAGE_PLUS_WRITE.
+        */
+       u8 buff[5] = {0x04, PWM_CHANNEL0, PMBUS_CMD_VOUT_COMMAND,
+                       vdd & 0xFF, (vdd & 0xFF00) >> 8};
+
+       /* Write the desired voltage code to the regulator */
+       ret = i2c_write(I2C_VOL_MONITOR_ADDR,
+                       PMBUS_CMD_PAGE_PLUS_WRITE, 1, (void *)&buff, 5);
+       if (ret) {
+               printf("VID: I2C failed to write to the volatge regulator\n");
+               return -1;
+       }
+
+       /* Wait for the volatge to get to the desired value */
+       do {
+               vdd_last = read_voltage_from_LTC(i2caddress);
+               if (vdd_last < 0) {
+                       printf("VID: Couldn't read sensor abort VID adjust\n");
+                       return -1;
+               }
+       } while (vdd_last != vdd_target);
+
+       return vdd_last;
+}
 #endif
 
 static int set_voltage(int i2caddress, int vdd)
@@ -278,6 +358,8 @@ static int set_voltage(int i2caddress, int vdd)
 
 #ifdef CONFIG_VOL_MONITOR_IR36021_SET
        vdd_last = set_voltage_to_IR(i2caddress, vdd);
+#elif defined CONFIG_VOL_MONITOR_LTC3882_SET
+       vdd_last = set_voltage_to_LTC(i2caddress, vdd);
 #else
        #error Specific voltage monitor must be defined
 #endif
@@ -290,11 +372,53 @@ int adjust_vdd(ulong vdd_override)
        int re_enable = disable_interrupts();
        struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
        u32 fusesr;
+#if defined(CONFIG_VOL_MONITOR_IR36021_SET) || \
+       defined(CONFIG_VOL_MONITOR_IR36021_READ)
        u8 vid, buf;
+#else
+       u8 vid;
+#endif
        int vdd_target, vdd_current, vdd_last;
        int ret, i2caddress;
        unsigned long vdd_string_override;
        char *vdd_string;
+#ifdef CONFIG_ARCH_LS1088A
+       static const uint16_t vdd[32] = {
+               10250,
+               9875,
+               9750,
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               9000,
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               10000,  /* 1.0000V */
+               10125,
+               10250,
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+               0,      /* reserved */
+       };
+
+#else
        static const uint16_t vdd[32] = {
                10500,
                0,      /* reserved */
@@ -329,6 +453,7 @@ int adjust_vdd(ulong vdd_override)
                0,      /* reserved */
                0,      /* reserved */
        };
+#endif
        struct vdd_drive {
                u8 vid;
                unsigned voltage;
@@ -340,6 +465,8 @@ int adjust_vdd(ulong vdd_override)
                ret = -1;
                goto exit;
        }
+#if defined(CONFIG_VOL_MONITOR_IR36021_SET) || \
+       defined(CONFIG_VOL_MONITOR_IR36021_READ)
        ret = find_ir_chip_on_i2c();
        if (ret < 0) {
                printf("VID: Could not find voltage regulator on I2C.\n");
@@ -364,6 +491,7 @@ int adjust_vdd(ulong vdd_override)
                ret = -1;
                goto exit;
        }
+#endif
 
        /* get the voltage ID from fuse status register */
        fusesr = in_le32(&gur->dcfg_fusesr);
@@ -415,6 +543,11 @@ int adjust_vdd(ulong vdd_override)
        }
        vdd_current = vdd_last;
        debug("VID: Core voltage is currently at %d mV\n", vdd_last);
+
+#ifdef CONFIG_VOL_MONITOR_LTC3882_SET
+       /* Set the target voltage */
+       vdd_last = vdd_current = set_voltage(i2caddress, vdd_target);
+#else
        /*
          * Adjust voltage to at or one step above target.
          * As measurements are less precise than setting the values
@@ -432,6 +565,12 @@ int adjust_vdd(ulong vdd_override)
                vdd_last = set_voltage(i2caddress, vdd_current);
        }
 
+#endif
+       if (board_adjust_vdd(vdd_target) < 0) {
+               ret = -1;
+               goto exit;
+       }
+
        if (vdd_last > 0)
                printf("VID: Core voltage after adjustment is at %d mV\n",
                       vdd_last);
@@ -498,6 +637,8 @@ int adjust_vdd(ulong vdd_override)
                ret = -1;
                goto exit;
        }
+#if defined(CONFIG_VOL_MONITOR_IR36021_SET) || \
+       defined(CONFIG_VOL_MONITOR_IR36021_READ)
        ret = find_ir_chip_on_i2c();
        if (ret < 0) {
                printf("VID: Could not find voltage regulator on I2C.\n");
@@ -522,6 +663,7 @@ int adjust_vdd(ulong vdd_override)
                ret = -1;
                goto exit;
        }
+#endif
 
        /* get the voltage ID from fuse status register */
        fusesr = in_be32(&gur->dcfg_fusesr);
@@ -632,6 +774,8 @@ static int print_vdd(void)
                debug("VID : I2c failed to switch channel\n");
                return -1;
        }
+#if defined(CONFIG_VOL_MONITOR_IR36021_SET) || \
+       defined(CONFIG_VOL_MONITOR_IR36021_READ)
        ret = find_ir_chip_on_i2c();
        if (ret < 0) {
                printf("VID: Could not find voltage regulator on I2C.\n");
@@ -640,6 +784,7 @@ static int print_vdd(void)
                i2caddress = ret;
                debug("VID: IR Chip found on I2C address 0x%02x\n", i2caddress);
        }
+#endif
 
        /*
         * Read voltage monitor to check real voltage.
index e24bfd557c637904598646787517e8b28492466b..2240454ec893d9619865d1131b15492fe74f5991 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#if defined(CONFIG_VID) && (!defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD))
+static void fsl_ddr_setup_0v9_volt(memctl_options_t *popts)
+{
+       int vdd;
+
+       vdd = get_core_volt_from_fuse();
+       /* Nothing to do for silicons doesn't support VID */
+       if (vdd < 0)
+               return;
+
+       if (vdd == 900) {
+               popts->ddr_cdr1 |= DDR_CDR1_V0PT9_EN;
+               debug("VID: configure DDR to support 900 mV\n");
+       }
+}
+#endif
+
 void fsl_ddr_board_options(memctl_options_t *popts,
                           dimm_params_t *pdimm,
                           unsigned int ctrl_num)
@@ -87,6 +104,10 @@ found:
        popts->addr_hash = 1;
 
        popts->ddr_cdr1 = DDR_CDR1_DHC_EN | DDR_CDR1_ODT(DDR_CDR_ODT_60ohm);
+#if defined(CONFIG_VID) && (!defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD))
+       fsl_ddr_setup_0v9_volt(popts);
+#endif
+
        popts->ddr_cdr2 = DDR_CDR2_ODT(DDR_CDR_ODT_60ohm) |
                          DDR_CDR2_VREF_TRAIN_EN | DDR_CDR2_VREF_RANGE_2;
 }
index d12bcaed8f81f1b3350fada363a739b93927a50c..0769e9069b2bd74d314a7d4f729e96cd6d335326 100644 (file)
 #include <asm/arch-fsl-layerscape/soc.h>
 #include <asm/arch/ppa.h>
 #include <hwconfig.h>
+#include <asm/arch/fsl_serdes.h>
+#include <asm/arch/soc.h>
 
 #include "../common/qixis.h"
 #include "ls1088a_qixis.h"
+#include "../common/vid.h"
+#include <fsl_immap.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -51,6 +55,16 @@ unsigned long long get_qixis_addr(void)
 }
 #endif
 
+#if defined(CONFIG_VID)
+int init_func_vid(void)
+{
+       if (adjust_vdd(0) < 0)
+               printf("core voltage not adjusted\n");
+
+       return 0;
+}
+#endif
+
 #if !defined(CONFIG_SPL_BUILD)
 int checkboard(void)
 {
@@ -207,6 +221,7 @@ unsigned long get_board_ddr_clk(void)
 
        return 66666666;
 }
+#endif
 
 int select_i2c_ch_pca9547(u8 ch)
 {
@@ -221,6 +236,7 @@ int select_i2c_ch_pca9547(u8 ch)
        return 0;
 }
 
+#if !defined(CONFIG_SPL_BUILD)
 void board_retimer_init(void)
 {
        u8 reg;
@@ -322,7 +338,122 @@ int misc_init_r(void)
        return 0;
 }
 #endif
+#endif
+
+int i2c_multiplexer_select_vid_channel(u8 channel)
+{
+       return select_i2c_ch_pca9547(channel);
+}
+
+#ifdef CONFIG_TARGET_LS1088AQDS
+/* read the current value(SVDD) of the LTM Regulator Voltage */
+int get_serdes_volt(void)
+{
+       int  ret, vcode = 0;
+       u8 chan = PWM_CHANNEL0;
+
+       /* Select the PAGE 0 using PMBus commands PAGE for VDD */
+       ret = i2c_write(I2C_SVDD_MONITOR_ADDR,
+                       PMBUS_CMD_PAGE, 1, &chan, 1);
+       if (ret) {
+               printf("VID: failed to select VDD Page 0\n");
+               return ret;
+       }
+
+       /* Read the output voltage using PMBus command READ_VOUT */
+       ret = i2c_read(I2C_SVDD_MONITOR_ADDR,
+                      PMBUS_CMD_READ_VOUT, 1, (void *)&vcode, 2);
+       if (ret) {
+               printf("VID: failed to read the volatge\n");
+               return ret;
+       }
+
+       return vcode;
+}
+
+int set_serdes_volt(int svdd)
+{
+       int ret, vdd_last;
+       u8 buff[5] = {0x04, PWM_CHANNEL0, PMBUS_CMD_VOUT_COMMAND,
+                       svdd & 0xFF, (svdd & 0xFF00) >> 8};
+
+       /* Write the desired voltage code to the SVDD regulator */
+       ret = i2c_write(I2C_SVDD_MONITOR_ADDR,
+                       PMBUS_CMD_PAGE_PLUS_WRITE, 1, (void *)&buff, 5);
+       if (ret) {
+               printf("VID: I2C failed to write to the volatge regulator\n");
+               return -1;
+       }
 
+       /* Wait for the volatge to get to the desired value */
+       do {
+               vdd_last = get_serdes_volt();
+               if (vdd_last < 0) {
+                       printf("VID: Couldn't read sensor abort VID adjust\n");
+                       return -1;
+               }
+       } while (vdd_last != svdd);
+
+       return 1;
+}
+#else
+int get_serdes_volt(void)
+{
+       return 0;
+}
+
+int set_serdes_volt(int svdd)
+{
+       int ret;
+       u8 brdcfg4;
+
+       printf("SVDD changing of RDB\n");
+
+       /* Read the BRDCFG54 via CLPD */
+       ret = i2c_read(CONFIG_SYS_I2C_FPGA_ADDR,
+                      QIXIS_BRDCFG4_OFFSET, 1, (void *)&brdcfg4, 1);
+       if (ret) {
+               printf("VID: I2C failed to read the CPLD BRDCFG4\n");
+               return -1;
+       }
+
+       brdcfg4 = brdcfg4 | 0x08;
+
+       /* Write to the BRDCFG4 */
+       ret = i2c_write(CONFIG_SYS_I2C_FPGA_ADDR,
+                       QIXIS_BRDCFG4_OFFSET, 1, (void *)&brdcfg4, 1);
+       if (ret) {
+               debug("VID: I2C failed to set the SVDD CPLD BRDCFG4\n");
+               return -1;
+       }
+
+       /* Wait for the volatge to get to the desired value */
+       udelay(10000);
+
+       return 1;
+}
+#endif
+
+/* this function disables the SERDES, changes the SVDD Voltage and enables it*/
+int board_adjust_vdd(int vdd)
+{
+       int ret = 0;
+
+       debug("%s: vdd = %d\n", __func__, vdd);
+
+       /* Special settings to be performed when voltage is 900mV */
+       if (vdd == 900) {
+               ret = setup_serdes_volt(vdd);
+               if (ret < 0) {
+                       ret = -1;
+                       goto exit;
+               }
+       }
+exit:
+       return ret;
+}
+
+#if !defined(CONFIG_SPL_BUILD)
 int board_init(void)
 {
        init_final_memctl_regs();
index b30fa24a322d6d77714fc16ad44c61ec3f2983d3..4cbbf96faa393cbcb7f842fced8815c5ffa3ee4b 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-/* This is only needed until SPL gets OF support */
-#ifdef CONFIG_SPL_BUILD
-static const struct ns16550_platdata omap3logic_serial = {
-       .base = OMAP34XX_UART1,
-       .reg_shift = 2,
-       .clock = V_NS16550_CLK,
-       .fcr = UART_FCR_DEFVAL,
-};
-
-U_BOOT_DEVICE(omap3logic_uart) = {
-       "ns16550_serial",
-       &omap3logic_serial
-};
-#endif
-
 /*
  * two dimensional array of strucures containining board name and Linux
  * machine IDs; row it selected based on CPU column is slected based
index faa8bc62b5495b7e978ddf2fcf5cbcffd68aa916..35fe9d50016b0c54226fbf4acf9b21e41427a39a 100644 (file)
@@ -1367,17 +1367,20 @@ config CMD_CRAMFS
 
 config CMD_EXT2
        bool "ext2 command support"
+       select FS_EXT4
        help
          Enables EXT2 FS command
 
 config CMD_EXT4
        bool "ext4 command support"
+       select FS_EXT4
        help
          Enables EXT4 FS command
 
 config CMD_EXT4_WRITE
        depends on CMD_EXT4
        bool "ext4 write command support"
+       select EXT4_WRITE
        help
          Enables EXT4 FS write command
 
index 78ff109835d4f9e8ffc9dfc4809cfece614ba5e5..51213c0293c307b843b4a1da819d9141632b9d20 100644 (file)
@@ -32,6 +32,9 @@ static void efi_init_obj_list(void)
 {
        efi_obj_list_initalized = 1;
 
+       /* Initialize EFI driver uclass */
+       efi_driver_init();
+
        efi_console_register();
 #ifdef CONFIG_PARTITIONS
        efi_disk_register();
@@ -103,11 +106,11 @@ static void *copy_fdt(void *fdt)
 
        /* Safe fdt location is at 128MB */
        new_fdt_addr = fdt_ram_start + (128 * 1024 * 1024) + fdt_size;
-       if (efi_allocate_pages(1, EFI_BOOT_SERVICES_DATA, fdt_pages,
+       if (efi_allocate_pages(1, EFI_RUNTIME_SERVICES_DATA, fdt_pages,
                               &new_fdt_addr) != EFI_SUCCESS) {
                /* If we can't put it there, put it somewhere */
                new_fdt_addr = (ulong)memalign(EFI_PAGE_SIZE, fdt_size);
-               if (efi_allocate_pages(1, EFI_BOOT_SERVICES_DATA, fdt_pages,
+               if (efi_allocate_pages(1, EFI_RUNTIME_SERVICES_DATA, fdt_pages,
                                       &new_fdt_addr) != EFI_SUCCESS) {
                        printf("ERROR: Failed to reserve space for FDT\n");
                        return NULL;
@@ -122,8 +125,8 @@ static void *copy_fdt(void *fdt)
 }
 
 static efi_status_t efi_do_enter(
-                       void *image_handle, struct efi_system_table *st,
-                       asmlinkage ulong (*entry)(void *image_handle,
+                       efi_handle_t image_handle, struct efi_system_table *st,
+                       asmlinkage ulong (*entry)(efi_handle_t image_handle,
                                                  struct efi_system_table *st))
 {
        efi_status_t ret = EFI_LOAD_ERROR;
@@ -136,8 +139,8 @@ static efi_status_t efi_do_enter(
 
 #ifdef CONFIG_ARM64
 static efi_status_t efi_run_in_el2(asmlinkage ulong (*entry)(
-                       void *image_handle, struct efi_system_table *st),
-                       void *image_handle, struct efi_system_table *st)
+                       efi_handle_t image_handle, struct efi_system_table *st),
+                       efi_handle_t image_handle, struct efi_system_table *st)
 {
        /* Enable caches again */
        dcache_enable();
@@ -159,7 +162,7 @@ static efi_status_t do_bootefi_exec(void *efi, void *fdt,
        struct efi_device_path *memdp = NULL;
        ulong ret;
 
-       ulong (*entry)(void *image_handle, struct efi_system_table *st)
+       ulong (*entry)(efi_handle_t image_handle, struct efi_system_table *st)
                asmlinkage;
        ulong fdt_pages, fdt_size, fdt_start, fdt_end;
        const efi_guid_t fdt_guid = EFI_FDT_GUID;
index 0bdce64ca583731c3ede6dc6c45ee75ebab4e0f7..7f594d9eaf9d54634ce1797218659f42a3b4d24c 100644 (file)
@@ -200,6 +200,13 @@ static int init_func_i2c(void)
 }
 #endif
 
+#if defined(CONFIG_VID)
+__weak int init_func_vid(void)
+{
+       return 0;
+}
+#endif
+
 #if defined(CONFIG_HARD_SPI)
 static int init_func_spi(void)
 {
@@ -801,6 +808,9 @@ static const init_fnc_t init_sequence_f[] = {
 #if defined(CONFIG_SYS_I2C)
        init_func_i2c,
 #endif
+#if defined(CONFIG_VID) && !defined(CONFIG_SPL)
+       init_func_vid,
+#endif
 #if defined(CONFIG_HARD_SPI)
        init_func_spi,
 #endif
index cf4d70f852c6aa9fcfe03be45cda3090864f1ada..69d53ed251cf210f7fce13f471c338373fcb4b8b 100644 (file)
@@ -390,7 +390,7 @@ int hash_command(const char *algo_name, int flags, cmd_tbl_t *cmdtp, int flag,
 
        if (multi_hash()) {
                struct hash_algo *algo;
-               uint8_t output[HASH_MAX_DIGEST_SIZE];
+               u8 *output;
                uint8_t vsum[HASH_MAX_DIGEST_SIZE];
                void *buf;
 
@@ -405,6 +405,9 @@ int hash_command(const char *algo_name, int flags, cmd_tbl_t *cmdtp, int flag,
                        return 1;
                }
 
+               output = memalign(ARCH_DMA_MINALIGN,
+                                 sizeof(uint32_t) * HASH_MAX_DIGEST_SIZE);
+
                buf = map_sysmem(addr, len);
                algo->hash_func_ws(buf, len, output, algo->chunk_size);
                unmap_sysmem(buf);
@@ -440,6 +443,8 @@ int hash_command(const char *algo_name, int flags, cmd_tbl_t *cmdtp, int flag,
                                store_result(algo, output, *argv,
                                        flags & HASH_FLAG_ENV);
                        }
+               unmap_sysmem(output);
+
                }
 
        /* Horrible code size hack for boards that just want crc32 */
index 0ef9f42962919bfb013ab8882e2468e52b5b6890..548e045e9266a994501bcd51e45b8c7971c0b9aa 100644 (file)
@@ -55,6 +55,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index 50093cd662772d439f5e4ca20846d5af05d4bbc0..f14333d7f4716b5ff7b3c6510c97a654674b6f3b 100644 (file)
@@ -33,6 +33,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index aa9fb9739eca1a5e5218ee7c683b7435bd61d448..016ec4edded0e8c2cbcd6f7f6eee711beaee04bc 100644 (file)
@@ -43,6 +43,7 @@ CONFIG_OMAP_TIMER=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index 9c97009891f9f0efe2d3c52f4aa6a6b160740999..9e79d1c603f874170f2272015dcf18704c9ba5f8 100644 (file)
@@ -47,6 +47,7 @@ CONFIG_DM_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
 CONFIG_USB_MUSB_TI=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index 1813003bbcd16b343fe15fc9adde12bf94a831cb..14aa2679d156a0b14cf1f16e4a9a86be20162008 100644 (file)
@@ -34,6 +34,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index b38d7f671c43f0789a2bf9ae9838c135acc80bb3..22182f5d9bbd0ae41fe58a152bdc9c20f6a13a54 100644 (file)
@@ -30,6 +30,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index 7a20576d47121faf034e4844700dbab7d355b39d..71d6a287795e51849fb297b1ddbbb42aca24b008 100644 (file)
@@ -32,6 +32,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index 1e800173b0f8ce389d3809c2d2d1d2d01035d2db..10d6d385dec3dbe94af469f403e0fb88898356a9 100644 (file)
@@ -38,6 +38,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index 63e7a077ae5bf1d0a4f320202473516d33be9bd4..55565f4d3bfc2e44f04930670b8cf148c7ef049f 100644 (file)
@@ -56,6 +56,7 @@ CONFIG_DM_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
 CONFIG_USB_MUSB_TI=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index 09aab29bc3a37eaf6d4aee0d4dac252bf2199a2d..7f05d56743e31f0d140aa9e14d4d4e64b8c08e01 100644 (file)
@@ -53,6 +53,7 @@ CONFIG_DM_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
 CONFIG_USB_MUSB_TI=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_DOWNLOAD=y
index a1766d9f86abce4f4e62b48450b5c9cdccfc0d06..2e8d9439add94e73db82b0ab3e5cc158de6ca27a 100644 (file)
@@ -31,4 +31,6 @@ CONFIG_SYS_NAND_BUSWIDTH_16BIT=y
 CONFIG_SPL_NAND_SIMPLE=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
+CONFIG_USB_MUSB_HCD=y
+CONFIG_USB_AM35X=y
 CONFIG_USB_STORAGE=y
index e6c17c70f5b85878d1a7c2818e7e947e95f7517f..bb7cc3ff21e394bb90c63992ba91f8c8674e58aa 100644 (file)
@@ -40,5 +40,6 @@ CONFIG_SPL_NAND_SIMPLE=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
+CONFIG_USB_MUSB_AM35X=y
 # CONFIG_FAT_WRITE is not set
 CONFIG_BCH=y
index c1802140dc8159ae2be761dd3cb77d62bf039aaf..c75eab3876455a3df7c779a7f9f10cbf883e7430 100644 (file)
@@ -49,6 +49,7 @@ CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
 CONFIG_USB_DWC3_OMAP=y
 CONFIG_USB_DWC3_PHY_OMAP=y
+CONFIG_OMAP_USB_PHY=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index 60f05528d292226829760bcd7bccd74bf17da122..7f2acd962096586da7edbb023e939716c4fcd00a 100644 (file)
@@ -60,6 +60,7 @@ CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
 CONFIG_USB_DWC3_OMAP=y
 CONFIG_USB_DWC3_PHY_OMAP=y
+CONFIG_OMAP_USB_PHY=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index d6a5263079425724bf1fda17dfb87525537c9850..a56abc929fdfa9c17e97b2f8c56ef6b1505a120e 100644 (file)
@@ -49,6 +49,7 @@ CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
 CONFIG_USB_DWC3_OMAP=y
 CONFIG_USB_DWC3_PHY_OMAP=y
+CONFIG_OMAP_USB_PHY=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index 28cf04a2f796136e837baa8414912a2071b11b15..e9c3a05c0b433875eb0b695a42c4e99105dc7ec4 100644 (file)
@@ -72,6 +72,7 @@ CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
 CONFIG_USB_DWC3_OMAP=y
 CONFIG_USB_DWC3_PHY_OMAP=y
+CONFIG_OMAP_USB_PHY=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index bed05830ae0fad35a2702118dc046be3da733dd1..e8a641eb881b0847f4f96c52e10e86e6b1e4b2e5 100644 (file)
@@ -60,6 +60,7 @@ CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
 CONFIG_USB_DWC3_OMAP=y
 CONFIG_USB_DWC3_PHY_OMAP=y
+CONFIG_OMAP_USB_PHY=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index b3b3cf7168a95cbfe988e0035909ff07159108de..0bcda4f4b3efa305b350eb81ced85eacc96dc69f 100644 (file)
@@ -70,6 +70,7 @@ CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
 CONFIG_USB_DWC3_OMAP=y
 CONFIG_USB_DWC3_PHY_OMAP=y
+CONFIG_OMAP_USB_PHY=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index edfead087dd4d50b957c33b0d501148cbe93b62a..2e0763cfa2a63a7576e8d6e15fa1df8256a5b442 100644 (file)
@@ -73,6 +73,7 @@ CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
 CONFIG_USB_DWC3_OMAP=y
 CONFIG_USB_DWC3_PHY_OMAP=y
+CONFIG_OMAP_USB_PHY=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index 61518f5ca6978ce6a5e1f8c895e36befb9704c45..d6d5d712e9d2837bc36a4b6bcd714c68f5282ac7 100644 (file)
@@ -62,6 +62,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index c7360c31130c6614392b73d3793a08ea5fe8137c..0c145953dbecd738d92efe69519a9eb41ec78da0 100644 (file)
@@ -62,6 +62,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index c41a7b439fe3c7106ea1c6d7b259bcb345b85c6d..aa3e3170728912d6c466c299cf04309aceebcf21 100644 (file)
@@ -55,6 +55,7 @@ CONFIG_PHYLIB=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_SYS_WHITE_ON_BLACK=y
 CONFIG_LCD=y
index 38444134963cd2a2315f45702bc5ebb415ff88f1..c8063b9420c03dada45554833186596c0fc872ba 100644 (file)
@@ -57,6 +57,7 @@ CONFIG_PHYLIB=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_SYS_WHITE_ON_BLACK=y
 CONFIG_LCD=y
index 25d8837ed20bc7a829f4da58ddc548906b8e3229..6385b1a736c8ba80da0e22933ecfeb192407a6e5 100644 (file)
@@ -65,6 +65,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_SYS_WHITE_ON_BLACK=y
 CONFIG_LCD=y
index 0c2d7ed711adf4e1c6504e6ac8a69b44071c86cf..15245dca2a3dc8af4d52a7995b7261584a99a468 100644 (file)
@@ -56,6 +56,7 @@ CONFIG_PHYLIB=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_SYS_WHITE_ON_BLACK=y
 CONFIG_LCD=y
index a02926cb8951a0c93cd812dbe19267d47425dd72..d8ab01221161c3ee04575f9c3fe67ac6760d6635 100644 (file)
@@ -1,6 +1,7 @@
 CONFIG_ARM=y
 CONFIG_ARCH_DAVINCI=y
 CONFIG_TARGET_CALIMAIN=y
+CONFIG_DA850_LOWLEVEL=y
 CONFIG_BOOTDELAY=0
 CONFIG_VERSION_VARIABLE=y
 # CONFIG_DISPLAY_CPUINFO is not set
index bc69df0ca91ade8ae0c38101359effbe273a06b8..a32dab7b511f9dc65f521a78db736a5a6b056b6d 100644 (file)
@@ -45,6 +45,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_FAT_WRITE=y
 CONFIG_LZO=y
index 2a7478499ba9d4eeb18c91b0d87ab0877d33a770..b35081145faba7a9647031efbbb71bdd87f40040 100644 (file)
@@ -74,6 +74,7 @@ CONFIG_ROCKCHIP_SERIAL=y
 CONFIG_ROCKCHIP_SPI=y
 CONFIG_SYSRESET=y
 CONFIG_USB=y
+CONFIG_ROCKCHIP_USB2_PHY=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Rockchip"
 CONFIG_USB_GADGET_VENDOR_NUM=0x2207
index 81ed7d0f8e87d1e8651aad8eaf6d464f3d2ea2ab..f80faaeff8f086609a75d89ddc9221ef11bb1110 100644 (file)
@@ -75,6 +75,7 @@ CONFIG_ROCKCHIP_SERIAL=y
 CONFIG_ROCKCHIP_SPI=y
 CONFIG_SYSRESET=y
 CONFIG_USB=y
+CONFIG_ROCKCHIP_USB2_PHY=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Rockchip"
 CONFIG_USB_GADGET_VENDOR_NUM=0x2207
index 0565c03034b459b88500e53828f2dc7452b990dd..ff94a4d74f4fe2695513b03835fa7157718b9a53 100644 (file)
@@ -74,6 +74,7 @@ CONFIG_ROCKCHIP_SERIAL=y
 CONFIG_ROCKCHIP_SPI=y
 CONFIG_SYSRESET=y
 CONFIG_USB=y
+CONFIG_ROCKCHIP_USB2_PHY=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Rockchip"
 CONFIG_USB_GADGET_VENDOR_NUM=0x2207
index 9c3031bac862867875a028a02672db659e3f22a0..e9b6fe0399cc539d05ef1e0d3440cb4fd9d2dc47 100644 (file)
@@ -57,6 +57,7 @@ CONFIG_TI_QSPI=y
 CONFIG_USB=y
 CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
+CONFIG_OMAP_USB_PHY=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
index 819a95b0db20557826ed660945e353125639a51c..fa78bde0bb11603cf8c7da670cb1328e62cd9442 100644 (file)
@@ -48,6 +48,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
+CONFIG_USB_MUSB_AM35X=y
 CONFIG_USB_STORAGE=y
 CONFIG_LCD=y
 CONFIG_OF_LIBFDT=y
index c61a93beb9863c9376239a5c4688a16fc0ffc495..0cb6e7277d08329a5cf6fd073d97fa158fa650f9 100644 (file)
@@ -50,6 +50,9 @@ CONFIG_SYS_NS16550=y
 CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_MUSB_UDC=y
+CONFIG_USB_OMAP3=y
+CONFIG_TWL4030_USB=y
 CONFIG_USB_STORAGE=y
 CONFIG_LCD=y
 CONFIG_OF_LIBFDT=y
index a621ff25303cfb149331b101277c14cda08d3a87..e234bc6322b22ed78d8e3fadfaae635659d24709 100644 (file)
@@ -72,6 +72,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
+CONFIG_OMAP_USB_PHY=y
 CONFIG_USB_STORAGE=y
 CONFIG_FAT_WRITE=y
 CONFIG_OF_LIBFDT=y
index 824c383bdf74782537f09bdf100bc1885a0ed990..06754015045bfa03e96ae58ce50274b297887a1a 100644 (file)
@@ -42,4 +42,5 @@ CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_DM_SERIAL=y
 CONFIG_SYS_NS16550=y
 CONFIG_DM_SPI=y
+CONFIG_DAVINCI_SPI=y
 # CONFIG_FAT_WRITE is not set
index 067ddd7519bf06a69b55799f39382ba83b5d9d71..4c2f8f37fef80f3ffd349a35481540ffbad3ade4 100644 (file)
@@ -45,4 +45,5 @@ CONFIG_SPI_FLASH_MTD=y
 CONFIG_DM_SERIAL=y
 CONFIG_SYS_NS16550=y
 CONFIG_DM_SPI=y
+CONFIG_DAVINCI_SPI=y
 # CONFIG_FAT_WRITE is not set
index b00eea76d9596e266464043fd1900a5f39030be2..72b8169a7b49c229b3b3c0f8345b2c3aae5bb815 100644 (file)
@@ -1,6 +1,7 @@
 CONFIG_ARM=y
 CONFIG_ARCH_DAVINCI=y
 CONFIG_TARGET_DA850EVM=y
+CONFIG_DA850_LOWLEVEL=y
 CONFIG_TI_COMMON_CMD_OPTIONS=y
 CONFIG_DEFAULT_DEVICE_TREE="da850-evm"
 # CONFIG_SYS_MALLOC_F is not set
@@ -43,3 +44,4 @@ CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_SYS_NS16550=y
 CONFIG_DM_SPI=y
+CONFIG_DAVINCI_SPI=y
index 716a57b37309c29f590489ba6a76c5615ee06700..b13a27e365e589568abe3907336aec8f907e7d70 100644 (file)
@@ -80,6 +80,7 @@ CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
 CONFIG_USB_DWC3_OMAP=y
 CONFIG_USB_DWC3_PHY_OMAP=y
+CONFIG_OMAP_USB_PHY=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index f7418c7942cdbfafb16eb14d9f6e652c1c0d2ca6..7ccb4f0bcefa77f11fb5da857d78a058d222ea08 100644 (file)
@@ -82,6 +82,7 @@ CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GADGET=y
 CONFIG_USB_DWC3_OMAP=y
 CONFIG_USB_DWC3_PHY_OMAP=y
+CONFIG_OMAP_USB_PHY=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
index be0105f5bf3e48060ae825bf6784897217508796..5444260b19b08b11254970fee71df1f56b5704c0 100644 (file)
@@ -64,6 +64,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Siemens AG"
index 6d513cf584ad282926bd8706a6d7a434dc8cbd46..428ac8ce6485658de7c3af8074ac9662a97bd51a 100644 (file)
@@ -22,3 +22,4 @@ CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
+CONFIG_FS_EXT4=y
index f52cbe71b1626be4d25fc0a2430986296e6bf4f8..a510294093cacb56b7255ff4fe409c79f7bdc81c 100644 (file)
@@ -32,6 +32,8 @@ CONFIG_SYS_NS16550=y
 CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_MUSB_UDC=y
+CONFIG_USB_OMAP3=y
 CONFIG_USB_STORAGE=y
 CONFIG_FAT_WRITE=y
 CONFIG_OF_LIBFDT=y
index eada103992089570a753b04ef377dfce24056154..abbb00a2fac6342acb4436c615cbcf2434b6a6a9 100644 (file)
@@ -32,5 +32,6 @@ CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_SYS_NS16550=y
+CONFIG_DAVINCI_SPI=y
 CONFIG_VIDEO=y
 # CONFIG_VIDEO_SW_CURSOR is not set
index 8e8ef6f88ed8be84178fbed3fc08fc8b5e7dcffb..608faf66ec64abb45792c9af3906fe1391dac472 100644 (file)
@@ -64,6 +64,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Siemens AG"
index 6024b86e79b007f0efddf76159e11a6d164eda5d..c10bec21233da020d606f67dbec4d6ca511fb424 100644 (file)
@@ -65,6 +65,7 @@ CONFIG_DEBUG_UART_SHIFT=2
 CONFIG_SYS_NS16550=y
 CONFIG_SYSRESET=y
 CONFIG_USB=y
+CONFIG_ROCKCHIP_USB2_PHY=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Rockchip"
 CONFIG_USB_GADGET_VENDOR_NUM=0x2207
index d76e8c4086ab0f6e9fcde869610b3db3113d0ca4..9ae1b33828c8204a8bf9f7f5717a876b0c7f0b89 100644 (file)
@@ -66,6 +66,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SYSRESET=y
 CONFIG_USB=y
 CONFIG_USB_DWC2=y
+CONFIG_ROCKCHIP_USB2_PHY=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Rockchip"
index e9eb20c2d5c2ab7bc77d0f453cb4fb233c71588e..3a0bd7939e38815f32f62d829c9ac7ad9bbf44dd 100644 (file)
@@ -71,6 +71,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SYSRESET=y
 CONFIG_USB=y
 CONFIG_USB_DWC2=y
+CONFIG_ROCKCHIP_USB2_PHY=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_KEYBOARD=y
 CONFIG_USB_GADGET=y
index e394aa53c7e1969c000b8fd8d87c76458745388b..b0daee1a619ba1506c389015dfd1ac2029499997 100644 (file)
@@ -39,6 +39,10 @@ CONFIG_SMC911X_BASE=0x2C000000
 CONFIG_SMC911X_32_BIT=y
 CONFIG_SYS_NS16550=y
 CONFIG_OMAP3_SPI=y
+CONFIG_USB=y
+CONFIG_USB_MUSB_UDC=y
+CONFIG_USB_OMAP3=y
+CONFIG_TWL4030_USB=y
 CONFIG_FAT_WRITE=y
 CONFIG_BCH=y
 CONFIG_OF_LIBFDT=y
index d70d4c6ce49e85e5160087c24ebf8c69d17b15f9..22dbc706153805f0c43686f6c38b0df7167c9ab7 100644 (file)
@@ -40,6 +40,10 @@ CONFIG_SMC911X_BASE=0x2C000000
 CONFIG_SMC911X_32_BIT=y
 CONFIG_SYS_NS16550=y
 CONFIG_OMAP3_SPI=y
+CONFIG_USB=y
+CONFIG_USB_MUSB_UDC=y
+CONFIG_USB_OMAP3=y
+CONFIG_TWL4030_USB=y
 CONFIG_FAT_WRITE=y
 CONFIG_BCH=y
 CONFIG_OF_LIBFDT=y
index 317d4f06264d0df76fc90c84d973cc00e8224721..e6dc298e2ec754163b2f389be64a23cbfb69d98e 100644 (file)
@@ -44,6 +44,7 @@ CONFIG_DM_ETH=y
 CONFIG_DM_SERIAL=y
 CONFIG_SYS_NS16550=y
 CONFIG_DM_SPI=y
+CONFIG_DAVINCI_SPI=y
 CONFIG_USB=y
 CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
index b9be6063b244e3a09bbb114280681c3025eb2c64..6c5e16749c6a2f477284a00622975017cf3e0825 100644 (file)
@@ -33,6 +33,7 @@ CONFIG_DM_ETH=y
 CONFIG_DM_SERIAL=y
 CONFIG_SYS_NS16550=y
 CONFIG_DM_SPI=y
+CONFIG_DAVINCI_SPI=y
 CONFIG_USB=y
 CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
index 32353e9baaf4d90e6257ce8e754f233cd679bb96..6a1f8dce99135a4c1d5375593d45195ffff447b5 100644 (file)
@@ -47,6 +47,7 @@ CONFIG_REMOTEPROC_TI_POWER=y
 CONFIG_DM_SERIAL=y
 CONFIG_SYS_NS16550=y
 CONFIG_DM_SPI=y
+CONFIG_DAVINCI_SPI=y
 CONFIG_USB=y
 CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
index 9c4530cc814eedee4beabb500ad577fadecb10ed..b4985b55aa45a0a154f664dbdd4942397b21255c 100644 (file)
@@ -35,6 +35,7 @@ CONFIG_REMOTEPROC_TI_POWER=y
 CONFIG_DM_SERIAL=y
 CONFIG_SYS_NS16550=y
 CONFIG_DM_SPI=y
+CONFIG_DAVINCI_SPI=y
 CONFIG_USB=y
 CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
index 711544377e28086284026166930d33cbdcc5b7f1..1e3905f8ef932e2bfb6ac753af94eefb69f6a3e0 100644 (file)
@@ -44,6 +44,7 @@ CONFIG_DM_ETH=y
 CONFIG_DM_SERIAL=y
 CONFIG_SYS_NS16550=y
 CONFIG_DM_SPI=y
+CONFIG_DAVINCI_SPI=y
 CONFIG_USB=y
 CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
index f65185f1b6c114fe66cee03c5b438b53907e9102..b4b08dd8b994f938a7224a12367efc4d5497fb48 100644 (file)
@@ -33,6 +33,7 @@ CONFIG_DM_ETH=y
 CONFIG_DM_SERIAL=y
 CONFIG_SYS_NS16550=y
 CONFIG_DM_SPI=y
+CONFIG_DAVINCI_SPI=y
 CONFIG_USB=y
 CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
index d2ec226b9a35a910c9f9b61de3b950592a8f4a85..074bed026141af43340b6d1c6bcdf6236e463063 100644 (file)
@@ -44,6 +44,7 @@ CONFIG_DM_ETH=y
 CONFIG_DM_SERIAL=y
 CONFIG_SYS_NS16550=y
 CONFIG_DM_SPI=y
+CONFIG_DAVINCI_SPI=y
 CONFIG_USB=y
 CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
index 0ddf64c544b6c403ed1ee75952e694d0a35a653e..e8284051561d69e0588119d0efcb2c415255d029 100644 (file)
@@ -38,6 +38,7 @@ CONFIG_MMC_OMAP_HS=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_OMAP2PLUS=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
 CONFIG_USB_GADGET_VENDOR_NUM=0x0451
index 209250a73d54324256a1a33e73de5e4d9a2dd2a6..d1310797cb91177af49746300253411f3baedb24 100644 (file)
@@ -26,5 +26,6 @@ CONFIG_CMD_DIAG=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_SYS_NS16550=y
+CONFIG_DAVINCI_SPI=y
 CONFIG_OF_LIBFDT=y
 # CONFIG_EFI_LOADER is not set
index d0bcbd820e51f58d99037a341762e5c113dbd61e..3a5ec2d246f91972d169a62b9234929fdddc1e63 100644 (file)
@@ -66,6 +66,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SYSRESET=y
 CONFIG_USB=y
 CONFIG_USB_DWC2=y
+CONFIG_ROCKCHIP_USB2_PHY=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Rockchip"
index 2905614c286a929cacd34f784e4b4a390fd782eb..563c7acd60087a37df0d19a454cd1a534a324843 100644 (file)
@@ -17,5 +17,6 @@ CONFIG_CMD_DATE=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_DOS_PARTITION=y
 CONFIG_ENV_IS_IN_MMC=y
+CONFIG_FS_EXT4=y
 CONFIG_FS_FAT=y
 CONFIG_OF_LIBFDT=y
index 9057811e7f0287c4195d919c1cd83a465eb46d8d..e93042e76af2700ea58638c99fbb54d6d98018f7 100644 (file)
@@ -26,6 +26,11 @@ CONFIG_CMD_FAT=y
 CONFIG_MMC_OMAP_HS=y
 CONFIG_SYS_NS16550=y
 CONFIG_OMAP3_SPI=y
+CONFIG_USB=y
+CONFIG_USB_MUSB_HCD=y
+CONFIG_USB_MUSB_UDC=y
+CONFIG_USB_OMAP3=y
+CONFIG_TWL4030_USB=y
 CONFIG_VIDEO=y
 CONFIG_CFB_CONSOLE_ANSI=y
 # CONFIG_VGA_AS_SINGLE_DEVICE is not set
index 95c8784888483dfc562896e61193e6122f1d3cfb..318c1f934679dc4e0ed4d0d50fad85131881229d 100644 (file)
@@ -52,6 +52,8 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_OMAP2PLUS=y
+CONFIG_TWL4030_USB=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="TI"
index d2b8d421750c69218205fa61053809c1718a5b06..0ae18526e74862d08b418bdda59e139fbe7e61da 100644 (file)
@@ -56,7 +56,9 @@ CONFIG_SYS_NS16550=y
 CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_OMAP3=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_OMAP2PLUS=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
 CONFIG_USB_GADGET_VENDOR_NUM=0x0451
index db72e6f6a86eaaf202d0728c888f8ac6febadbc8..3482538d78162d9eb505680d3b9644d79377672f 100644 (file)
@@ -29,6 +29,8 @@ CONFIG_MTDPARTS_DEFAULT="mtdparts=omap2-nand.0:512k(MLO),1792k(u-boot),128k(spl-
 CONFIG_CMD_UBI=y
 CONFIG_ISO_PARTITION=y
 CONFIG_OF_CONTROL=y
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_SPL_OF_PLATDATA=y
 CONFIG_ENV_IS_IN_NAND=y
 # CONFIG_BLK is not set
 CONFIG_DM_I2C=y
@@ -48,7 +50,10 @@ CONFIG_SYS_NS16550=y
 CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_OMAP3=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_OMAP2PLUS=y
+CONFIG_TWL4030_USB=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="TI"
@@ -56,3 +61,4 @@ CONFIG_USB_GADGET_VENDOR_NUM=0x0451
 CONFIG_USB_GADGET_PRODUCT_NUM=0xd022
 CONFIG_USB_ETHER=y
 CONFIG_BCH=y
+# CONFIG_SPL_OF_LIBFDT is not set
index 6639c7e466a27151e42dd06986f6282708ca48eb..1a915c5128a740873a76df31dfc53de81d4c2dab 100644 (file)
@@ -41,5 +41,9 @@ CONFIG_SMC911X_BASE=0x08000000
 CONFIG_SMC911X_32_BIT=y
 CONFIG_SYS_NS16550=y
 CONFIG_OMAP3_SPI=y
+CONFIG_USB=y
+CONFIG_USB_MUSB_UDC=y
+CONFIG_USB_OMAP3=y
+CONFIG_TWL4030_USB=y
 CONFIG_FAT_WRITE=y
 CONFIG_OF_LIBFDT=y
index 0faea774aec514dce5747bd54c3e3296e2892cb9..aa0c36eb95ae5a7af8b9157731249fc43cad46a4 100644 (file)
@@ -31,6 +31,8 @@ CONFIG_SYS_NS16550=y
 CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_MUSB_UDC=y
+CONFIG_USB_OMAP3=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_SMSC95XX=y
index b7ba1f30b61f8cc95ae0ef1c0e5214e2bff407bc..ac495710633cc7da73a102a4a99a9b150d94dcb9 100644 (file)
@@ -27,5 +27,8 @@ CONFIG_ENV_IS_IN_MMC=y
 CONFIG_MMC_OMAP_HS=y
 CONFIG_SYS_NS16550=y
 CONFIG_OMAP3_SPI=y
+CONFIG_USB=y
+CONFIG_USB_MUSB_UDC=y
+CONFIG_USB_OMAP3=y
 CONFIG_FAT_WRITE=y
 CONFIG_OF_LIBFDT=y
index 0d4506ec44b24fe190c263eecc6b92b5e5254208..944be2b56eb8e97c0fdfce0c91c0e2a06a5dfcba 100644 (file)
@@ -36,4 +36,5 @@ CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_SYS_NS16550=y
+CONFIG_DAVINCI_SPI=y
 CONFIG_OF_LIBFDT=y
index 273fc30705f0b4b2737c7476ca8e6f6ba556f6e8..c16711a4675a310858d8444fb4aae9360f92e1a4 100644 (file)
@@ -58,6 +58,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_ETHER=y
index f1ddaa6ae14fb192c8b4f1b286c682f1a485c356..a8fe7affb209873db3ec7c6d505950f3e1634288 100644 (file)
@@ -58,6 +58,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_ETHER=y
index 4bb6245617832858e61ab762acc9d3a46173866e..78a6b7da44f2790b015c3a88961ba554e744f312 100644 (file)
@@ -62,6 +62,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_FAT_WRITE=y
index aea47c5156e0572a5b63a7fa3e2667efb28ec3eb..969b0e68686845f7f06a289f66c3e0cf18f31db3 100644 (file)
@@ -69,6 +69,7 @@ CONFIG_DEBUG_UART_SHIFT=2
 CONFIG_SYS_NS16550=y
 CONFIG_SYSRESET=y
 CONFIG_USB=y
+CONFIG_ROCKCHIP_USB2_PHY=y
 CONFIG_USB_DWC2=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
index 8f6ac2de192f198b32d9262a8529760e9ad9c072..71ff228cada80ff007f28c030f37730c152f26d6 100644 (file)
@@ -17,4 +17,5 @@ CONFIG_USB_EHCI_GENERIC=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_HOST_ETHER=y
 CONFIG_USB_ETHER_ASIX=y
+CONFIG_FAT_WRITE=y
 CONFIG_LIB_RAND=y
index 6b860bbb11e69ceb30faef3d2c23d7de0162bb00..94f4979ba6af12db02d8f6953b3737cbf4bdc94a 100644 (file)
@@ -66,6 +66,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SYSRESET=y
 CONFIG_USB=y
 CONFIG_USB_DWC2=y
+CONFIG_ROCKCHIP_USB2_PHY=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Rockchip"
index 0ec1591284d16b076f0cdb61a15f96b3f7b44602..f68230079f1519d2d79fec06fe1a4cb11db395a0 100644 (file)
@@ -67,6 +67,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Siemens AG"
index 5ef17401cfd7dbaa2e98b98e20978953bf5836c3..c714b07f344642e44be93b85dc0f7c6400e9ec7a 100644 (file)
@@ -64,6 +64,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Siemens AG"
index 43dce46d58bf1293bec6d33dcf5a8dd96229cbb4..0a95e6aac5c59fc3e73cbd94f2e1ecd90b2b7ccd 100644 (file)
@@ -66,6 +66,7 @@ CONFIG_DEBUG_UART_SHIFT=2
 CONFIG_SYS_NS16550=y
 CONFIG_SYSRESET=y
 CONFIG_USB=y
+CONFIG_ROCKCHIP_USB2_PHY=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Rockchip"
 CONFIG_USB_GADGET_VENDOR_NUM=0x2207
index b174e4b98281c748c45f5fb42cfc7b334f9a081e..483f64b16714f17aec7d734b901587ef783100da 100644 (file)
@@ -47,6 +47,8 @@ CONFIG_DEBUG_UART_CLOCK=24000000
 CONFIG_DEBUG_UART_SHIFT=2
 CONFIG_SYS_NS16550=y
 CONFIG_SYSRESET=y
+CONFIG_USB=y
+CONFIG_ROCKCHIP_USB2_PHY=y
 CONFIG_SPL_TINY_MEMSET=y
 CONFIG_TPL_TINY_MEMSET=y
 CONFIG_CMD_DHRYSTONE=y
index 1711fc71406b6fe188f8aafe5ffa616e3c973ed0..2269747ec3381186c73f97299fc6b9171257dfc6 100644 (file)
@@ -68,6 +68,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Siemens AG"
index a8a592f0d10b97ae4f80c6a4739acbfd8699d2e2..a3bae56cdaf671cd440ad3e45f49d2bb4b0155cb 100644 (file)
@@ -39,6 +39,8 @@ CONFIG_MMC_OMAP_HS=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_OMAP2PLUS=y
+CONFIG_TWL4030_USB=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
 CONFIG_USB_GADGET_VENDOR_NUM=0x0451
index 2575c004dc2759f869151b8470bd9600ecf24cb0..df76145d5b59a3655dde04cf59773e8c05136ed5 100644 (file)
@@ -64,6 +64,7 @@ CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_DSPS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Siemens AG"
index c79dffdfb3ee377d964b96ef9300ff15326ac854..a0df3fd401bafef25fa98c0e00f3f066a362e537 100644 (file)
@@ -69,6 +69,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SYSRESET=y
 CONFIG_USB=y
 CONFIG_USB_DWC2=y
+CONFIG_ROCKCHIP_USB2_PHY=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Rockchip"
index 30ad478bff856e504ef556f15942befd33f9405f..5d8fa228c579eb3c470c0251397e347008157c72 100644 (file)
@@ -63,6 +63,7 @@ CONFIG_DEBUG_UART_SHIFT=2
 CONFIG_SYS_NS16550=y
 CONFIG_SYSRESET=y
 CONFIG_USB=y
+CONFIG_ROCKCHIP_USB2_PHY=y
 CONFIG_USB_DWC2=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_KEYBOARD=y
index 2b0eab5ddec3170800cf0e34f3b34f568a3d6df3..8ecd21eee3bc951508bfbec35807592dc9796fe8 100644 (file)
@@ -2,10 +2,10 @@ U-Boot supports access of both ext2 and ext4 filesystems, either in read-only
 mode or in read-write mode.
 
 First, to enable support for both ext4 (and, automatically, ext2 as well),
-but without selecting the corresponding commands, use one of:
+but without selecting the corresponding commands, enable one of the following:
 
-  #define CONFIG_FS_EXT4       (for read-only)
-  #define CONFIG_EXT4_WRITE    (for read-write)
+  CONFIG_FS_EXT4       (for read-only)
+  CONFIG_EXT4_WRITE    (for read-write)
 
 Next, to select the ext2-related commands:
 
@@ -20,22 +20,22 @@ or ext4-related commands:
 
 use one or both of:
 
-  #define CONFIG_CMD_EXT2
-  #define CONFIG_CMD_EXT4
+  CONFIG_CMD_EXT2
+  CONFIG_CMD_EXT4
 
-Selecting either of the above automatically defines CONFIG_FS_EXT4 if it
-wasn't defined already.
+Selecting either of the above automatically selects CONFIG_FS_EXT4 if it
+wasn't enabled already.
 
-In addition, to get the write access command "ext4write", use:
+In addition, to get the write access command "ext4write", enable:
 
-  #define CONFIG_CMD_EXT4_WRITE
+  CONFIG_CMD_EXT4_WRITE
 
-which automatically defines CONFIG_EXT4_WRITE if it wasn't defined
+which automatically selects CONFIG_EXT4_WRITE if it wasn't defined
 already.
 
 Also relevant are the generic filesystem commands, selected by:
 
-  #define CONFIG_CMD_FS_GENERIC
+  CONFIG_CMD_FS_GENERIC
 
 This does not automatically enable EXT4 support for you, you still need
 to do that yourself.
index 010ed32d3add35c434c0d9f819edd31fcb527fa0..bfda2211f0e8b122b2d3f9909d2e54d5bb7bc005 100644 (file)
@@ -24,6 +24,7 @@ static const char *if_typename_str[IF_TYPE_COUNT] = {
        [IF_TYPE_HOST]          = "host",
        [IF_TYPE_SYSTEMACE]     = "ace",
        [IF_TYPE_NVME]          = "nvme",
+       [IF_TYPE_EFI]           = "efi",
 };
 
 static enum uclass_id if_type_uclass_id[IF_TYPE_COUNT] = {
@@ -36,8 +37,9 @@ static enum uclass_id if_type_uclass_id[IF_TYPE_COUNT] = {
        [IF_TYPE_SD]            = UCLASS_INVALID,
        [IF_TYPE_SATA]          = UCLASS_AHCI,
        [IF_TYPE_HOST]          = UCLASS_ROOT,
-       [IF_TYPE_NVME]          = UCLASS_NVME,
        [IF_TYPE_SYSTEMACE]     = UCLASS_INVALID,
+       [IF_TYPE_NVME]          = UCLASS_NVME,
+       [IF_TYPE_EFI]           = UCLASS_EFI,
 };
 
 static enum if_type if_typename_to_iftype(const char *if_typename)
index 876c2b816f193ca7e0aa5935bda67cb8f6017395..dab106ab7fcd3502c5bf46f51296e4607f9fd7ac 100644 (file)
@@ -6,21 +6,21 @@
 #
 
 obj-$(CONFIG_$(SPL_TPL_)CLK) += clk-uclass.o clk_fixed_rate.o
-obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip/
-obj-$(CONFIG_SANDBOX) += clk_sandbox.o
-obj-$(CONFIG_SANDBOX) += clk_sandbox_test.o
-obj-$(CONFIG_MACH_PIC32) += clk_pic32.o
-obj-$(CONFIG_CLK_RENESAS) += renesas/
-obj-$(CONFIG_CLK_ZYNQ) += clk_zynq.o
-obj-$(CONFIG_CLK_ZYNQMP) += clk_zynqmp.o
 
 obj-y += tegra/
-obj-$(CONFIG_CLK_UNIPHIER) += uniphier/
-obj-$(CONFIG_CLK_EXYNOS) += exynos/
+obj-$(CONFIG_ARCH_ASPEED) += aspeed/
+obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip/
 obj-$(CONFIG_CLK_AT91) += at91/
 obj-$(CONFIG_CLK_BCM6345) += clk_bcm6345.o
 obj-$(CONFIG_CLK_BOSTON) += clk_boston.o
+obj-$(CONFIG_CLK_EXYNOS) += exynos/
 obj-$(CONFIG_CLK_HSDK) += clk-hsdk-cgu.o
-obj-$(CONFIG_ARCH_ASPEED) += aspeed/
+obj-$(CONFIG_CLK_RENESAS) += renesas/
 obj-$(CONFIG_CLK_STM32F) += clk_stm32f.o
+obj-$(CONFIG_CLK_UNIPHIER) += uniphier/
+obj-$(CONFIG_CLK_ZYNQ) += clk_zynq.o
+obj-$(CONFIG_CLK_ZYNQMP) += clk_zynqmp.o
+obj-$(CONFIG_MACH_PIC32) += clk_pic32.o
+obj-$(CONFIG_SANDBOX) += clk_sandbox.o
+obj-$(CONFIG_SANDBOX) += clk_sandbox_test.o
 obj-$(CONFIG_STM32H7) += clk_stm32h7.o
index 83ba13374c78a36acb25c45107c781df82a40925..fbea72091b190c43fdf411a0d96f721735264faf 100644 (file)
 #include <dt-structs.h>
 #include <errno.h>
 
-DECLARE_GLOBAL_DATA_PTR;
-
-static inline struct clk_ops *clk_dev_ops(struct udevice *dev)
+static inline const struct clk_ops *clk_dev_ops(struct udevice *dev)
 {
-       return (struct clk_ops *)dev->driver->ops;
+       return (const struct clk_ops *)dev->driver->ops;
 }
 
 #if CONFIG_IS_ENABLED(OF_CONTROL)
@@ -60,7 +58,7 @@ int clk_get_by_index(struct udevice *dev, int index, struct clk *clk)
        int ret;
        struct ofnode_phandle_args args;
        struct udevice *dev_clk;
-       struct clk_ops *ops;
+       const struct clk_ops *ops;
 
        debug("%s(dev=%p, index=%d, clk=%p)\n", __func__, dev, index, clk);
 
@@ -68,7 +66,7 @@ int clk_get_by_index(struct udevice *dev, int index, struct clk *clk)
        clk->dev = NULL;
 
        ret = dev_read_phandle_with_args(dev, "clocks", "#clock-cells", 0,
-                                         index, &args);
+                                        index, &args);
        if (ret) {
                debug("%s: fdtdec_parse_phandle_with_args failed: err=%d\n",
                      __func__, ret);
@@ -142,7 +140,7 @@ int clk_release_all(struct clk *clk, int count)
 
 int clk_request(struct udevice *dev, struct clk *clk)
 {
-       struct clk_ops *ops = clk_dev_ops(dev);
+       const struct clk_ops *ops = clk_dev_ops(dev);
 
        debug("%s(dev=%p, clk=%p)\n", __func__, dev, clk);
 
@@ -156,7 +154,7 @@ int clk_request(struct udevice *dev, struct clk *clk)
 
 int clk_free(struct clk *clk)
 {
-       struct clk_ops *ops = clk_dev_ops(clk->dev);
+       const struct clk_ops *ops = clk_dev_ops(clk->dev);
 
        debug("%s(clk=%p)\n", __func__, clk);
 
@@ -168,7 +166,7 @@ int clk_free(struct clk *clk)
 
 ulong clk_get_rate(struct clk *clk)
 {
-       struct clk_ops *ops = clk_dev_ops(clk->dev);
+       const struct clk_ops *ops = clk_dev_ops(clk->dev);
 
        debug("%s(clk=%p)\n", __func__, clk);
 
@@ -180,7 +178,7 @@ ulong clk_get_rate(struct clk *clk)
 
 ulong clk_set_rate(struct clk *clk, ulong rate)
 {
-       struct clk_ops *ops = clk_dev_ops(clk->dev);
+       const struct clk_ops *ops = clk_dev_ops(clk->dev);
 
        debug("%s(clk=%p, rate=%lu)\n", __func__, clk, rate);
 
@@ -192,7 +190,7 @@ ulong clk_set_rate(struct clk *clk, ulong rate)
 
 int clk_enable(struct clk *clk)
 {
-       struct clk_ops *ops = clk_dev_ops(clk->dev);
+       const struct clk_ops *ops = clk_dev_ops(clk->dev);
 
        debug("%s(clk=%p)\n", __func__, clk);
 
@@ -204,7 +202,7 @@ int clk_enable(struct clk *clk)
 
 int clk_disable(struct clk *clk)
 {
-       struct clk_ops *ops = clk_dev_ops(clk->dev);
+       const struct clk_ops *ops = clk_dev_ops(clk->dev);
 
        debug("%s(clk=%p)\n", __func__, clk);
 
index 63565b6ed8d12fae68a9d122b7d88482eec6f769..c9a9f0a20b6f1628a0792fe40d8e36119e916d3f 100644 (file)
@@ -8,8 +8,6 @@
 #include <clk-uclass.h>
 #include <dm.h>
 
-DECLARE_GLOBAL_DATA_PTR;
-
 struct clk_fixed_rate {
        unsigned long fixed_rate;
 };
@@ -31,8 +29,8 @@ const struct clk_ops clk_fixed_rate_ops = {
 static int clk_fixed_rate_ofdata_to_platdata(struct udevice *dev)
 {
 #if !CONFIG_IS_ENABLED(OF_PLATDATA)
-       to_clk_fixed_rate(dev)->fixed_rate = dev_read_u32_default(dev,
-                                                       "clock-frequency", 0);
+       to_clk_fixed_rate(dev)->fixed_rate =
+               dev_read_u32_default(dev, "clock-frequency", 0);
 #endif
 
        return 0;
index 9a46a7bbe5e9dea953629413f35809d92def751e..144ac2a991473fb5fd3fc606bbe70f033650b6a0 100644 (file)
@@ -17,6 +17,7 @@
 #include <dm/device.h>
 #include <dm/device-internal.h>
 #include <dm/lists.h>
+#include <dm/of_access.h>
 #include <dm/pinctrl.h>
 #include <dm/platdata.h>
 #include <dm/read.h>
@@ -703,8 +704,12 @@ int device_set_name(struct udevice *dev, const char *name)
 bool device_is_compatible(struct udevice *dev, const char *compat)
 {
        const void *fdt = gd->fdt_blob;
+       ofnode node = dev_ofnode(dev);
 
-       return !fdt_node_check_compatible(fdt, dev_of_offset(dev), compat);
+       if (ofnode_is_np(node))
+               return of_device_is_compatible(ofnode_to_np(node), compat, NULL, NULL);
+       else
+               return !fdt_node_check_compatible(fdt, ofnode_to_offset(node), compat);
 }
 
 bool of_machine_is_compatible(const char *compat)
index 0030ab962ef1912bbc75673ed2c09ec172053fcf..98f4b539ea4d6de876f1058104a260b7a400e035 100644 (file)
@@ -205,8 +205,13 @@ fdt_addr_t ofnode_get_addr_index(ofnode node, int index)
                                          &flags);
                if (!prop_val)
                        return FDT_ADDR_T_NONE;
-               na = of_n_addr_cells(ofnode_to_np(node));
-               return of_read_number(prop_val, na);
+
+               if (IS_ENABLED(CONFIG_OF_TRANSLATE)) {
+                       return of_translate_address(ofnode_to_np(node), prop_val);
+               } else {
+                       na = of_n_addr_cells(ofnode_to_np(node));
+                       return of_read_number(prop_val, na);
+               }
        } else {
                return fdt_get_base_address(gd->fdt_blob,
                                            ofnode_to_offset(node));
@@ -296,7 +301,8 @@ int ofnode_parse_phandle_with_args(ofnode node, const char *list_name,
                int ret;
 
                ret = of_parse_phandle_with_args(ofnode_to_np(node),
-                               list_name, cells_name, index, &args);
+                                                list_name, cells_name, index,
+                                                &args);
                if (ret)
                        return ret;
                ofnode_from_of_phandle_args(&args, out_args);
@@ -305,8 +311,9 @@ int ofnode_parse_phandle_with_args(ofnode node, const char *list_name,
                int ret;
 
                ret = fdtdec_parse_phandle_with_args(gd->fdt_blob,
-                               ofnode_to_offset(node), list_name, cells_name,
-                               cell_count, index, &args);
+                                                    ofnode_to_offset(node),
+                                                    list_name, cells_name,
+                                                    cell_count, index, &args);
                if (ret)
                        return ret;
                ofnode_from_fdtdec_phandle_args(&args, out_args);
@@ -534,10 +541,10 @@ int ofnode_read_pci_addr(ofnode node, enum fdt_pci_space type,
                                addr->phys_mid = fdt32_to_cpu(cell[1]);
                                addr->phys_lo = fdt32_to_cpu(cell[1]);
                                break;
-                       } else {
-                               cell += (FDT_PCI_ADDR_CELLS +
-                                        FDT_PCI_SIZE_CELLS);
                        }
+
+                       cell += (FDT_PCI_ADDR_CELLS +
+                                FDT_PCI_SIZE_CELLS);
                }
 
                if (i == num) {
@@ -546,10 +553,10 @@ int ofnode_read_pci_addr(ofnode node, enum fdt_pci_space type,
                }
 
                return 0;
-       } else {
-               ret = -EINVAL;
        }
 
+       ret = -EINVAL;
+
 fail:
        debug("(not found)\n");
        return ret;
@@ -642,3 +649,11 @@ int ofnode_read_resource_byname(ofnode node, const char *name,
 
        return ofnode_read_resource(node, index, res);
 }
+
+u64 ofnode_translate_address(ofnode node, const fdt32_t *in_addr)
+{
+       if (ofnode_is_np(node))
+               return of_translate_address(ofnode_to_np(node), in_addr);
+       else
+               return fdt_translate_address(gd->fdt_blob, ofnode_to_offset(node), in_addr);
+}
index 758d4003e5e016df18037973123d82c6b095024b..601d1322d6383be8bcb98fa08706bf1cf3bdec6b 100644 (file)
@@ -71,7 +71,7 @@ void *dev_read_addr_ptr(struct udevice *dev)
 }
 
 fdt_addr_t dev_read_addr_size(struct udevice *dev, const char *property,
-                               fdt_size_t *sizep)
+                             fdt_size_t *sizep)
 {
        return ofnode_get_addr_size(dev_ofnode(dev), property, sizep);
 }
@@ -82,7 +82,7 @@ const char *dev_read_name(struct udevice *dev)
 }
 
 int dev_read_stringlist_search(struct udevice *dev, const char *property,
-                         const char *string)
+                              const char *string)
 {
        return ofnode_stringlist_search(dev_ofnode(dev), property, string);
 }
@@ -99,9 +99,8 @@ int dev_read_string_count(struct udevice *dev, const char *propname)
 }
 
 int dev_read_phandle_with_args(struct udevice *dev, const char *list_name,
-                               const char *cells_name, int cell_count,
-                               int index,
-                               struct ofnode_phandle_args *out_args)
+                              const char *cells_name, int cell_count,
+                              int index, struct ofnode_phandle_args *out_args)
 {
        return ofnode_parse_phandle_with_args(dev_ofnode(dev), list_name,
                                              cells_name, cell_count, index,
@@ -201,3 +200,8 @@ int dev_read_resource_byname(struct udevice *dev, const char *name,
 {
        return ofnode_read_resource_byname(dev_ofnode(dev), name, res);
 }
+
+u64 dev_translate_address(struct udevice *dev, const fdt32_t *in_addr)
+{
+       return ofnode_translate_address(dev_ofnode(dev), in_addr);
+}
index a63eba389df89eb64e7060da08a22a5ed1228b81..9373a39931009796858081229758619421cda630 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <common.h>
 #include <malloc.h>
+#include <memalign.h>
 #include "jobdesc.h"
 #include "desc.h"
 #include "jr.h"
@@ -163,20 +164,37 @@ int caam_hash(const unsigned char *pbuf, unsigned int buf_len,
 {
        int ret = 0;
        uint32_t *desc;
+       unsigned int size;
 
-       desc = malloc(sizeof(int) * MAX_CAAM_DESCSIZE);
+       desc = malloc_cache_aligned(sizeof(int) * MAX_CAAM_DESCSIZE);
        if (!desc) {
                debug("Not enough memory for descriptor allocation\n");
                return -ENOMEM;
        }
 
+       if (!IS_ALIGNED((uintptr_t)pbuf, ARCH_DMA_MINALIGN) ||
+           !IS_ALIGNED((uintptr_t)pout, ARCH_DMA_MINALIGN)) {
+               puts("Error: Address arguments are not aligned\n");
+               return -EINVAL;
+       }
+
+       size = ALIGN(buf_len, ARCH_DMA_MINALIGN);
+       flush_dcache_range((unsigned long)pbuf, (unsigned long)pbuf + size);
+
        inline_cnstr_jobdesc_hash(desc, pbuf, buf_len, pout,
                                  driver_hash[algo].alg_type,
                                  driver_hash[algo].digestsize,
                                  0);
 
+       size = ALIGN(sizeof(int) * MAX_CAAM_DESCSIZE, ARCH_DMA_MINALIGN);
+       flush_dcache_range((unsigned long)desc, (unsigned long)desc + size);
+
        ret = run_descriptor_jr(desc);
 
+       size = ALIGN(driver_hash[algo].digestsize, ARCH_DMA_MINALIGN);
+       invalidate_dcache_range((unsigned long)pout,
+                               (unsigned long)pout + size);
+
        free(desc);
        return ret;
 }
index 058c9b9da8cbf663ee184862e15337b4ba425d63..b3a27ec5a86127266f30964f77fa168162b800c8 100644 (file)
@@ -95,6 +95,9 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,
        if (step == 2)
                goto step2;
 
+       /* Set cdr1 first in case 0.9v VDD is enabled for some SoCs*/
+       ddr_out32(&ddr->ddr_cdr1, regs->ddr_cdr1);
+
        if (regs->ddr_eor)
                ddr_out32(&ddr->eor, regs->ddr_eor);
 
@@ -183,7 +186,6 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,
        ddr_out32(&ddr->ddr_sdram_rcw_4, regs->ddr_sdram_rcw_4);
        ddr_out32(&ddr->ddr_sdram_rcw_5, regs->ddr_sdram_rcw_5);
        ddr_out32(&ddr->ddr_sdram_rcw_6, regs->ddr_sdram_rcw_6);
-       ddr_out32(&ddr->ddr_cdr1, regs->ddr_cdr1);
 #ifdef CONFIG_DEEP_SLEEP
        if (is_warm_boot()) {
                ddr_out32(&ddr->sdram_cfg_2,
index 494639fb0196faf0552a529b593c5b253f059bc5..5e31ee42226ab8b932f1d2be0365c12897dc3880 100644 (file)
@@ -217,6 +217,12 @@ config ATCSPI200_SPI
          used to access the SPI flash on AE3XX and AE250 platforms embedding
          this Andestech IP core.
 
+config DAVINCI_SPI
+       bool "Davinci & Keystone SPI driver"
+       depends on ARCH_DAVINCI || ARCH_KEYSTONE
+       help
+         Enable the Davinci SPI driver
+
 config TI_QSPI
        bool "TI QSPI driver"
        help
index e7658b4d95c9c90efb51dc726498489bc06b4aa5..7de41057ca1bbdb8752aed40b34bc26809de358c 100644 (file)
@@ -51,10 +51,14 @@ source "drivers/usb/host/Kconfig"
 
 source "drivers/usb/dwc3/Kconfig"
 
+source "drivers/usb/musb/Kconfig"
+
 source "drivers/usb/musb-new/Kconfig"
 
 source "drivers/usb/emul/Kconfig"
 
+source "drivers/usb/phy/Kconfig"
+
 source "drivers/usb/ulpi/Kconfig"
 
 comment "USB peripherals"
index caba42c26fc1d509b0e95be0996ff40748178ab9..ea5bae260ef9fee80f17a3cb7c66544755f6e146 100644 (file)
@@ -23,6 +23,16 @@ config USB_MUSB_TI
          speed USB controller based on the Mentor Graphics
          silicon IP.
 
+config USB_MUSB_OMAP2PLUS
+       tristate "OMAP2430 and onwards"
+       depends on ARCH_OMAP2PLUS
+
+config USB_MUSB_AM35X
+       bool "AM35x"
+
+config USB_MUSB_DSPS
+       bool "TI DSPS platforms"
+
 if USB_MUSB_HOST || USB_MUSB_GADGET
 
 config USB_MUSB_PIC32
@@ -41,3 +51,10 @@ config USB_MUSB_SUNXI
        used on almost all sunxi boards.
 
 endif
+
+config USB_MUSB_PIO_ONLY
+       bool "Disable DMA (always use PIO)"
+       default y if USB_MUSB_AM35X || USB_MUSB_PIC32 || USB_MUSB_OMAP2PLUS || USB_MUSB_DSPS || USB_MUSB_SUNXI
+       help
+         All data is copied between memory and FIFO by the CPU.
+         DMA controllers are ignored.
diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig
new file mode 100644 (file)
index 0000000..4e2be37
--- /dev/null
@@ -0,0 +1,29 @@
+#
+# (C) Copyright 2017
+# Adam Ford, Logic PD, aford173@gmail.com
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+comment "Legacy MUSB Support"
+
+config USB_MUSB_HCD
+       bool "Legacy MUSB Host Controller"
+
+config USB_MUSB_UDC
+       bool "Legacy USB Device Controller"
+
+config USB_DAVINCI
+       bool "Legacy MUSB DaVinci"
+       
+config USB_OMAP3
+       bool "Legacy MUSB OMAP3 / OMAP4"
+       depends on ARCH_OMAP2PLUS
+
+config USB_DA8XX
+       bool "Legacy MUSB DA8xx/OMAP-L1x"
+       depends on ARCH_DAVINCI
+
+config USB_AM35X
+       bool"Legacy MUSB AM35x"
+       depends on ARCH_OMAP2PLUS && !USB_OMAP3
diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig
new file mode 100644 (file)
index 0000000..bcc67a0
--- /dev/null
@@ -0,0 +1,17 @@
+#
+# (C) Copyright 2017
+# Adam Ford, Logic PD, aford173@gmail.com
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+comment "USB Phy"
+
+config TWL4030_USB
+       bool "TWL4030 PHY"
+
+config OMAP_USB_PHY
+       bool "OMAP PHY"
+
+config ROCKCHIP_USB2_PHY
+       bool "Rockchip USB2 PHY"
index 692f8633b809d222868bb3c3057393ef69b058cb..a24370786b69e2fb9e45ac88dcb2aabbb1922d89 100644 (file)
@@ -74,13 +74,11 @@ config ENV_IS_IN_EEPROM
 config ENV_IS_IN_FAT
        bool "Environment is in a FAT filesystem"
        depends on !CHAIN_OF_TRUST
+       select FS_FAT
        select FAT_WRITE
        help
          Define this if you want to use the FAT file system for the environment.
 
-         - CONFIG_FAT_WRITE:
-         This must be enabled. Otherwise it cannot save the environment file.
-
 config ENV_IS_IN_EXT4
        bool "Environment is in a EXT4 filesystem"
        depends on !CHAIN_OF_TRUST
index 899527267d4b0c27ea68dfd6e32b905c9b2bb4aa..9068727b98b46cc5d84569de577c00a215769373 100644 (file)
@@ -4,6 +4,9 @@
 # SPDX-License-Identifier:     GPL-2.0+
 #
 
+# Provide symbol API_BUILD to signal that the API example is being built.
+KBUILD_CPPFLAGS += -DAPI_BUILD
+
 ifeq ($(ARCH),powerpc)
 LOAD_ADDR = 0x40000
 endif
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1a913d2b6d284c5e3bc048e2a235d0adb354850b 100644 (file)
@@ -0,0 +1,13 @@
+config FS_EXT4
+       bool "Enable ext4 filesystem support"
+       help
+         This provides support for reading images from the ext4 filesystem.
+         ext4 is a widely used general-purpose filesystem for Linux.
+         You can also enable CMD_EXT4 to get access to ext4 commands.
+
+config EXT4_WRITE
+       bool "Enable ext4 filesystem write support"
+       depends on FS_EXT4
+       help
+         This provides support for creating and writing new files to an
+         existing ext4 filesystem partition.
index e7978aae67d27ac9aed8b66f3e5acee6db39e3db..9bb11eac9f7a88f114ffa89ea27ffa4d46abbdbc 100644 (file)
@@ -14,7 +14,7 @@ config FAT_WRITE
          existing FAT filesystem partition.
 
 config FS_FAT_MAX_CLUSTSIZE
-       int "Set maximum possible clusersize"
+       int "Set maximum possible clustersize"
        default 65536
        depends on FS_FAT
        help
index 1283818761d46354dbabb096cde06a090051f0af..dd7888cd6d4d5317c34449a93a8349f63e822056 100644 (file)
 #include <linux/compiler.h>
 #include <linux/ctype.h>
 
-#ifdef CONFIG_SUPPORT_VFAT
-static const int vfat_enabled = 1;
-#else
-static const int vfat_enabled = 0;
-#endif
-
 /*
  * Convert a string to lowercase.  Converts at most 'len' characters,
  * 'len' may be larger than the length of 'str' if 'str' is NULL
@@ -605,9 +599,6 @@ static int get_fs_info(fsdata *mydata)
                return -1;
        }
 
-       if (vfat_enabled)
-               debug("VFAT Support enabled\n");
-
        debug("FAT%d, fat_sect: %d, fatlength: %d\n",
               mydata->fatsize, mydata->fat_sect, mydata->fatlength);
        debug("Rootdir begins at cluster: %d, sector: %d, offset: %x\n"
@@ -857,8 +848,7 @@ static int fat_itr_next(fat_itr *itr)
                        continue;
 
                if (dent->attr & ATTR_VOLUME) {
-                       if (vfat_enabled &&
-                           (dent->attr & ATTR_VFAT) == ATTR_VFAT &&
+                       if ((dent->attr & ATTR_VFAT) == ATTR_VFAT &&
                            (dent->name[0] & LAST_LONG_ENTRY_MASK)) {
                                dent = extract_vfat_name(itr);
                                if (!dent)
index cd65192da54771e815ef0a3b58282d6f8b9d18e5..2b753df2820dcddcdcd5fdbd72be9e0ba4e2035b 100644 (file)
@@ -819,8 +819,7 @@ static dir_entry *find_directory_entry(fsdata *mydata, int startsect,
                                continue;
                        }
                        if ((dentptr->attr & ATTR_VOLUME)) {
-                               if (vfat_enabled &&
-                                   (dentptr->attr & ATTR_VFAT) &&
+                               if ((dentptr->attr & ATTR_VFAT) &&
                                    (dentptr->name[0] & LAST_LONG_ENTRY_MASK)) {
                                        get_long_file_name(mydata, curclust,
                                                     get_dentfromdir_block,
index 41b4d7efa82b3f88994b95a61071310ae51462fe..69b5a98e5673f01b87c0d2ee45f77a848d19e4d4 100644 (file)
@@ -34,6 +34,7 @@ enum if_type {
        IF_TYPE_HOST,
        IF_TYPE_SYSTEMACE,
        IF_TYPE_NVME,
+       IF_TYPE_EFI,
 
        IF_TYPE_COUNT,                  /* Number of interface types */
 };
index 436200044f3272be4ed1a19f5575d2a4cb8270f7..0fe9439a933c7d22b0340345c74e1cf4a8b8f52c 100644 (file)
@@ -364,6 +364,9 @@ int embedded_dtb_select(void);
 
 int    misc_init_f   (void);
 int    misc_init_r   (void);
+#if defined(CONFIG_VID)
+int    init_func_vid(void);
+#endif
 
 /* common/exports.c */
 void   jumptable_init(void);
index 2c4d43d67269ff53f6ee0ce0a42672c2017129b5..9695ee7ffb69b9a64af279a11aaf400a8f5420b6 100644 (file)
 #define CONFIG_SYS_BAUDRATE_TABLE      { 9600, 19200, 38400, 57600, 115200 }
 #endif
 
-#if defined(CONFIG_ENV_IS_IN_FAT) && !defined(CONFIG_FS_FAT)
-#define CONFIG_FS_FAT
-#endif
-
-#if (defined(CONFIG_CMD_EXT4) || defined(CONFIG_CMD_EXT2)) && \
-                                               !defined(CONFIG_FS_EXT4)
-#define CONFIG_FS_EXT4
-#endif
-
-#if defined(CONFIG_CMD_EXT4_WRITE) && !defined(CONFIG_EXT4_WRITE)
-#define CONFIG_EXT4_WRITE
-#endif
-
 /* Rather than repeat this expression each time, add a define for it */
 #if defined(CONFIG_IDE) || \
        defined(CONFIG_SATA) || \
@@ -52,6 +39,7 @@
        defined(CONFIG_MMC) || \
        defined(CONFIG_NVME) || \
        defined(CONFIG_SYSTEMACE) || \
+       (defined(CONFIG_EFI_LOADER) && !defined(CONFIG_SPL_BUILD)) || \
        defined(CONFIG_SANDBOX)
 #define HAVE_BLOCK_DEVICE
 #endif
index c88aa9563221028ebec081f6473af7defd5fca9a..e2807a6b4f05078ca35335f509fc5d1b376d2194 100644 (file)
@@ -470,14 +470,6 @@ boards, we say we have two, but don't display a message if we find only one. */
 #define CONFIG_BOOTP_GATEWAY
 #define CONFIG_BOOTP_HOSTNAME
 
-#if defined(CONFIG_COMPACT_FLASH) || defined(CONFIG_SATA_SIL3114) \
-                               || defined(CONFIG_USB_STORAGE)
-       #define CONFIG_SUPPORT_VFAT
-#endif
-
-#if defined(CONFIG_SATA_SIL3114) || defined(CONFIG_USB_STORAGE)
-#endif
-
 /* Watchdog */
 #undef CONFIG_WATCHDOG         /* watchdog disabled */
 
index 856c546fc101e5bf9fe7b64146d41a7babfa28c7..31ab503dcab68de7254db6fb4b8472ea8edc98aa 100644 (file)
  * add mass storage support and for gadget we add both RNDIS ethernet
  * and DFU.
  */
-#define CONFIG_USB_MUSB_DSPS
-#define CONFIG_USB_MUSB_PIO_ONLY
 #define CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
 #define CONFIG_AM335X_USB0
 #define CONFIG_AM335X_USB0_MODE        MUSB_PERIPHERAL
index 32439f5c4741c69f065d6e6a2bff1b3a6df14ce1..e2d329acabffed72e4580e8800c5da1060b2d51c 100644 (file)
@@ -17,8 +17,6 @@
 
 /* settings we don;t want on this board */
 #undef CONFIG_SPL_AM33XX_ENABLE_RTC32K_OSC
-#undef CONFIG_CMD_EXT4
-#undef CONFIG_CMD_EXT4_WRITE
 #undef CONFIG_CMD_SPI
 
 #define CONFIG_CMD_CACHE
index 400a06eeb2be9b477bc557ef6e5b23e6864bd4cd..16212ef9fb211564203be821d33ca5093c50300b 100644 (file)
@@ -72,8 +72,6 @@
  * Enable CONFIG_USB_MUSB_HCD for Host functionalities MSC, keyboard
  * Enable CONFIG_USB_MUSB_UDC for Device functionalities.
  */
-#define CONFIG_USB_AM35X               1
-#define CONFIG_USB_MUSB_HCD                    1
 
 #ifdef CONFIG_USB_AM35X
 
index 33ed85e6a546e2387d3420b21c77d7f267f833e0..ac5070d8cfe5ec8eb6a520629f10c4da1a040a98 100644 (file)
@@ -42,8 +42,6 @@
  * Enable CONFIG_USB_MUSB_HOST for Host functionalities MSC, keyboard
  * Enable CONFIG_USB_MUSB_GADGET for Device functionalities.
  */
-#define CONFIG_USB_MUSB_AM35X
-#define CONFIG_USB_MUSB_PIO_ONLY
 
 #ifdef CONFIG_USB_MUSB_AM35X
 
index 302181bd2d8ba46fa97f83929f2b852cbb761ee3..77f8e7689c8aacfb4b99e1f2f39871f35b4039fd 100644 (file)
@@ -77,7 +77,6 @@
 #define CONFIG_SYS_USB_FAT_BOOT_PARTITION              1
 #define CONFIG_USB_XHCI_OMAP
 
-#define CONFIG_OMAP_USB_PHY
 #define CONFIG_AM437X_USB2PHY2_HOST
 #endif
 
index 28618a579cd89cc7afae8466aec7a19fb37e2c6e..7546b3f9d049d124710ea1ddffd24442acfffd2c 100644 (file)
@@ -92,7 +92,6 @@
 /* USB xHCI HOST */
 #define CONFIG_USB_XHCI_OMAP
 
-#define CONFIG_OMAP_USB_PHY
 #define CONFIG_OMAP_USB3PHY1_HOST
 
 /* SATA */
index 8294101029d660df65ef1e7c665764290ed764de..24afc84a02e6864fb94f4d5284a6ac5d643f3b0b 100644 (file)
  */
 #define CONFIG_MTD_DEVICE
 #define CONFIG_MTD_PARTITIONS
-#define CONFIG_SUPPORT_VFAT
 
 /*
  * Ethernet (on SOC imx FEC)
index 3fc9e2f544cde59daacdb84332c51501a270348d..939ee3b4ad6d8f5478335ee9f39f468cff65cce5 100644 (file)
  * add mass storage support and for gadget we add both RNDIS ethernet
  * and DFU.
  */
-#define CONFIG_USB_MUSB_DSPS
-#define CONFIG_USB_MUSB_PIO_ONLY
 #define CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
 #define CONFIG_AM335X_USB0
 #define CONFIG_AM335X_USB0_MODE        MUSB_HOST
index 8917bbed6ff28c754390bc0647caf09b7aa4e53d..d084af8ada5ba39bf55e6bd1efd03e29a5abf158 100644 (file)
@@ -394,8 +394,6 @@ DEFAULT_LINUX_BOOT_ENV \
  * add mass storage support and for gadget we add both RNDIS ethernet
  * and DFU.
  */
-#define CONFIG_USB_MUSB_DSPS
-#define CONFIG_USB_MUSB_PIO_ONLY
 #define CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
 #define CONFIG_AM335X_USB0
 #define CONFIG_AM335X_USB0_MODE        MUSB_PERIPHERAL
index 2dadcaecf5ce41d9408255334edd1e8a0e698b6d..a8022b87d53f14786e0e3d8fa2c0b53563ab742d 100644 (file)
@@ -210,8 +210,6 @@ MMCARGS
 #endif /* CONFIG_NAND */
 
 /* USB configuration */
-#define CONFIG_USB_MUSB_DSPS
-#define CONFIG_USB_MUSB_PIO_ONLY
 #define CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
 #define CONFIG_AM335X_USB0
 #define CONFIG_AM335X_USB0_MODE        MUSB_HOST
@@ -245,13 +243,5 @@ MMCARGS
 #else
 #error "no storage for Environment defined!"
 #endif
-/*
- * Common filesystems support.  When we have removable storage we
- * enabled a number of useful commands and support.
- */
-#if defined(CONFIG_MMC) || defined(CONFIG_USB_STORAGE)
-#define CONFIG_FS_EXT4
-#define CONFIG_EXT4_WRITE
-#endif /* CONFIG_MMC, ... */
 
 #endif /* ! __CONFIG_BRPPT1_H__ */
index 8f92d7a9587504d5f126b3594fd7a371091aa97d..09042d44510277c6d1bf6c7a8a5d3c823cebc843 100644 (file)
@@ -80,8 +80,6 @@ BUR_COMMON_ENV \
 #define CONFIG_INITRD_TAG
 
 /* USB configuration */
-#define CONFIG_USB_MUSB_DSPS
-#define CONFIG_USB_MUSB_PIO_ONLY
 #define CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
 #define CONFIG_AM335X_USB0
 #define CONFIG_AM335X_USB0_MODE        MUSB_HOST
index 7686592ee186e4b4a877ff116a342b009ff8205c..7dfc1fa1ec52b9c6db7324ce68da194fad1c81bc 100644 (file)
 /*
  * SoC Configuration
  */
-#define CONFIG_SOC_DA8XX               /* TI DA8xx SoC */
-#define CONFIG_SOC_DA850               /* TI DA850 SoC */
 #define CONFIG_SYS_EXCEPTION_VECTORS_HIGH
 #define CONFIG_SYS_CLK_FREQ            clk_get(DAVINCI_ARM_CLKID)
 #define CONFIG_SYS_OSCIN_FREQ          calimain_get_osc_freq()
 #define CONFIG_SYS_TIMERBASE           DAVINCI_TIMER0_BASE
 #define CONFIG_SYS_HZ_CLOCK            clk_get(DAVINCI_AUXCLK_CLKID)
 #define CONFIG_SYS_TEXT_BASE           0x60000000
-#define CONFIG_DA850_LOWLEVEL
 #define CONFIG_ARCH_CPU_INIT
 #define CONFIG_DA8XX_GPIO
 #define CONFIG_HW_WATCHDOG
index 92fd235d5bee45de0755f7453e8ec139baf6c11b..89740ba1e092c78ca39b893bf7ba68a0e2b8f58e 100644 (file)
 /* NAND: SPL related configs */
 
 /* USB configuration */
-#define CONFIG_USB_MUSB_DSPS
 #define CONFIG_ARCH_MISC_INIT
-#define CONFIG_USB_MUSB_PIO_ONLY
 #define CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
 #define CONFIG_AM335X_USB1
 #define CONFIG_AM335X_USB1_MODE MUSB_HOST
index 6935b06d5c15ac91c014296bae206cbc518a75fa..4f64672bafec27ae876ad6155970c644c1faefc2 100644 (file)
@@ -77,7 +77,6 @@
 /* USB xHCI HOST */
 #define CONFIG_USB_XHCI_OMAP
 
-#define CONFIG_OMAP_USB_PHY
 #define CONFIG_OMAP_USB3PHY1_HOST
 
 /* USB Networking options */
index bf87bac30021a72dbe914997b0483a734c7e55cc..512c4632f139fea2d30d709cfee991a9afa3e006 100644 (file)
  */
 #define CONFIG_SYS_MMC_BASE            MVEBU_SDIO_BASE
 
-/* Partition support */
-
-/* Additional FS support/configuration */
-#define CONFIG_SUPPORT_VFAT
-
 /* USB/EHCI configuration */
 #define CONFIG_EHCI_IS_TDI
 
index dc1b6b57215302775326eb0be2f02c2cf2d9b3a0..3c64cb575cfaf89f6f5e2f7b7bcb5d729cb2ff57 100644 (file)
 #define CONFIG_SYS_BAUDRATE_TABLE      {4800, 9600, 19200, 38400, 57600,\
                                        115200}
 
-/* USB */
-#define CONFIG_USB_OMAP3
-#define CONFIG_USB_MUSB_UDC
-#define CONFIG_TWL4030_USB
-
 /* USB device configuration */
 #define CONFIG_USB_DEVICE
 #define CONFIG_USB_TTY
index a472b9f53823147efe330456f268dc643fe3c95a..fe8b39a65b7389cb959423a19f39b79b43ee6905 100644 (file)
                                        115200}
 
 /* USB */
-#define CONFIG_USB_MUSB_AM35X
 
 #ifndef CONFIG_USB_MUSB_AM35X
-#define CONFIG_USB_OMAP3
 #define CONFIG_OMAP_EHCI_PHY1_RESET_GPIO 146
 #define CONFIG_OMAP_EHCI_PHY2_RESET_GPIO 147
-#else /* !CONFIG_USB_MUSB_AM35X */
-#define CONFIG_USB_MUSB_PIO_ONLY
 #endif /* CONFIG_USB_MUSB_AM35X */
 
 /* commands to include */
index a2224915e7d5bdabb1717dd6c9d5ed0a4c196a95..a564b86c8c360d17aa20c5c49158e028338ad116 100644 (file)
@@ -55,7 +55,6 @@
 
 /* USB support */
 #define CONFIG_USB_XHCI_OMAP
-#define CONFIG_OMAP_USB_PHY
 #define CONFIG_AM437X_USB2PHY2_HOST
 
 /* SPI Flash support */
index a882fa650b987dfc33dbed711ae5fd8ecbf48367..bf324bbbbd4435fd4e4f9eff60e9761f7eec2c5e 100644 (file)
@@ -54,9 +54,6 @@
 #define CONFIG_SYS_SCSI_MAX_DEVICE     (CONFIG_SYS_SCSI_MAX_SCSI_ID * \
                                         CONFIG_SYS_SCSI_MAX_LUN)
 
-/* Additional FS support/configuration */
-#define CONFIG_SUPPORT_VFAT
-
 /* USB/EHCI configuration */
 #define CONFIG_EHCI_IS_TDI
 
index 3ca596515013a30405cd2b356e56eb98aa60941d..2a6916b92ea1716d8a4c70c3e9c7f90eeb570417 100644 (file)
@@ -33,9 +33,6 @@
 /*
  * SoC Configuration
  */
-#define CONFIG_MACH_DAVINCI_DA850_EVM
-#define CONFIG_SOC_DA8XX               /* TI DA8xx SoC */
-#define CONFIG_SOC_DA850               /* TI DA850 SoC */
 #define CONFIG_SYS_EXCEPTION_VECTORS_HIGH
 #define CONFIG_SYS_CLK_FREQ            clk_get(DAVINCI_ARM_CLKID)
 #define CONFIG_SYS_OSCIN_FREQ          24000000
@@ -47,7 +44,6 @@
 #define CONFIG_DA8XX_GPIO
 #define CONFIG_SYS_TEXT_BASE           0x60000000
 #define CONFIG_SYS_DV_NOR_BOOT_CFG     (0x11)
-#define CONFIG_DA850_LOWLEVEL
 #else
 #define CONFIG_SYS_TEXT_BASE           0xc1080000
 #endif
 #define CONFIG_CONS_INDEX      1               /* use UART0 for console */
 
 #define CONFIG_SPI
-#define CONFIG_DAVINCI_SPI
 #define CONFIG_SYS_SPI_CLK             clk_get(DAVINCI_SPI1_CLKID)
 #ifdef CONFIG_SPL_BUILD
 #define CONFIG_SYS_SPI_BASE            DAVINCI_SPI1_BASE
index cdaaced2eb559831e8931ab0065800cfbee787bf..67943bab3d399708c3771e59193924df538d9a5a 100644 (file)
@@ -49,9 +49,6 @@
 
 #define CONFIG_SYS_ALT_MEMTEST
 
-/* Additional FS support/configuration */
-#define CONFIG_SUPPORT_VFAT
-
 /*
  * mv-common.h should be defined after CMD configs since it used them
  * to enable certain macros
index b0e988d23435917ecfd9762aae266fd6669b6519..69ec662454154e292b2cb695ad7550ea8ac91dbe 100644 (file)
 #define CONFIG_SF_DEFAULT_SPEED                1000000
 #define CONFIG_SF_DEFAULT_MODE         SPI_MODE_3
 
-/* Partition support */
-
-/* Additional FS support/configuration */
-#define CONFIG_SUPPORT_VFAT
-
 /* USB/EHCI configuration */
 #define CONFIG_EHCI_IS_TDI
 
index 32f93f2f46e9d63f3def6e7ebf0b96dca10af306..a3ab6ef037c4913faa4e94039cb0f6b168b0b38a 100644 (file)
 #define CONFIG_SYS_SCSI_MAX_DEVICE     (CONFIG_SYS_SCSI_MAX_SCSI_ID * \
                                         CONFIG_SYS_SCSI_MAX_LUN)
 
-/* Partition support */
-
-/* Additional FS support/configuration */
-#define CONFIG_SUPPORT_VFAT
-
 /* USB/EHCI configuration */
 #define CONFIG_EHCI_IS_TDI
 
index 3dcc28710bb1765ac859addac682e1c97f9d228f..524a1cabc67f115bee4ef992416d2f3df82b65dc 100644 (file)
@@ -51,9 +51,6 @@
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
 #define CONFIG_LBA48
 
-/* Additional FS support/configuration */
-#define CONFIG_SUPPORT_VFAT
-
 /* PCIe support */
 #ifndef CONFIG_SPL_BUILD
 #define CONFIG_PCI_MVEBU
index f777d576dd35eed5801a8a23bd7e12235554f513..ff90b6df7229a20fbcf6f7a905ee211ebeb31f1b 100644 (file)
 /* USB xHCI HOST */
 #define CONFIG_USB_XHCI_OMAP
 
-#define CONFIG_OMAP_USB_PHY
 #define CONFIG_OMAP_USB2PHY2_HOST
 
 /* SATA */
index 010bc44b33556271681c46035b92105855eb400d..e28a956e92001795e31f0b04cf8f37387f3c2286 100644 (file)
@@ -60,7 +60,6 @@
        "pxefile_addr_r=0x90100000\0"\
        BOOTENV
 
-#define CONFIG_EXT4_WRITE
 #define CONFIG_ENV_SIZE                        0x4000
 #define CONFIG_ENV_VARS_UBOOT_CONFIG
 
index c201dbf4d3e71be5b616a8473404e203d52d61fb..c840c935b255a53b32ba4e6cffe7467f98a617e5 100644 (file)
@@ -68,7 +68,6 @@
 #endif
 
 /* why is this only defined in mv-common.h if CONFIG_DM is undefined? */
-#define CONFIG_SUPPORT_VFAT
 #define CONFIG_SYS_MVFS
 
 /*
index c5e6e9ef725896a49dc2dc7ac2568e788aa5fa3c..efc72b3a458fe9f77bc617ef611f009c415c4763 100644 (file)
@@ -24,9 +24,6 @@
 /*
  * SoC Configuration
  */
-#define CONFIG_MACH_DAVINCI_DA850_EVM
-#define CONFIG_SOC_DA8XX               /* TI DA8xx SoC */
-#define CONFIG_SOC_DA850               /* TI DA850 SoC */
 #define CONFIG_SYS_CLK_FREQ            clk_get(DAVINCI_ARM_CLKID)
 #define CONFIG_SYS_OSCIN_FREQ          24000000
 #define CONFIG_SYS_TIMERBASE           DAVINCI_TIMER0_BASE
@@ -61,7 +58,6 @@
 #define CONFIG_CONS_INDEX      1               /* use UART0 for console */
 
 #define CONFIG_SPI
-#define CONFIG_DAVINCI_SPI
 #define CONFIG_SYS_SPI_BASE            DAVINCI_SPI1_BASE
 #define CONFIG_SYS_SPI_CLK             clk_get(DAVINCI_SPI1_CLKID)
 #define CONFIG_SF_DEFAULT_SPEED                30000000
index 9dbd7a23313d842ff90e2b3f2c904365b318f4e6..a75932f20fa0e4cc0548fac7414deaf87382d0e5 100644 (file)
@@ -15,8 +15,6 @@
 
 #include "tam3517-common.h"
 
-#undef CONFIG_USB_OMAP3
-
 /* Our console port is port3 */
 #undef CONFIG_CONS_INDEX
 #undef CONFIG_SYS_NS16550_COM1
index b77cfc5d21d83e52837a83d75047f4c449a8df4d..167fcf2e12616ade41a77f0cb28bd56082b608b4 100644 (file)
  */
 #ifdef CONFIG_CMD_USB
 #define ORION5X_USB20_HOST_PORT_BASE ORION5X_USB20_PORT0_BASE
-#define CONFIG_SUPPORT_VFAT
 #endif /* CONFIG_CMD_USB */
 
 /*
index dddd300fb5d553c8106cf7926d85700d6b81624d..67f06722f2db2454a5a8e88f1b1440fdbc659560 100644 (file)
@@ -85,6 +85,4 @@
 #define CONFIG_EHCI_IS_TDI
 #endif /* CONFIG_CMD_USB */
 
-#define CONFIG_SUPPORT_VFAT
-
 #endif /* __CONFIG_GPLUGD_H */
index 7eaa6e4667e580b9c221d804dc7e7cf1e5073643..130c7694bf4abd7d7a4fb209b000a5513ec1f4b8 100644 (file)
@@ -66,8 +66,6 @@
 /* SD/MMC configuration */
 #define CONFIG_BOUNCE_BUFFER
 
-#define CONFIG_FS_EXT4
-
 /* Command line configuration */
 
 #define CONFIG_MTD_PARTITIONS
index 1683855ac06461d6351eefee005eb74848c9464b..618bf72da39a2494e8555ee3156539218957653d 100644 (file)
@@ -24,9 +24,6 @@
 /*
  * SoC Configuration
  */
-#define CONFIG_MACH_DAVINCI_DA850_EVM
-#define CONFIG_SOC_DA8XX               /* TI DA8xx SoC */
-#define CONFIG_SOC_DA850               /* TI DA850 SoC */
 #define CONFIG_SYS_EXCEPTION_VECTORS_HIGH
 #define CONFIG_SYS_CLK_FREQ            clk_get(DAVINCI_ARM_CLKID)
 #define CONFIG_SYS_OSCIN_FREQ          24000000
index 8d8dc26616d01d1d0966df0481fbebb13b67d893..94c3d0ad297f067975ed4f37a0e71607dc7a85d0 100644 (file)
  * USB gadget
  */
 
-#define CONFIG_USB_MUSB_PIO_ONLY
-#define CONFIG_USB_MUSB_OMAP2PLUS
-
 /*
  * Environment
  */
index c27373c56c24ec84b4427c5eca6b861f426a24af..3439cbe090d415e1219ad607fe075682c548c866 100644 (file)
@@ -18,9 +18,6 @@
 /*
  * SoC Configuration
  */
-#define CONFIG_MACH_DAVINCI_DA850_EVM
-#define CONFIG_SOC_DA8XX               /* TI DA8xx SoC */
-#define CONFIG_SOC_DA850               /* TI DA850 SoC */
 #define CONFIG_SYS_EXCEPTION_VECTORS_HIGH
 #define CONFIG_SYS_CLK_FREQ            clk_get(DAVINCI_ARM_CLKID)
 #define CONFIG_SYS_OSCIN_FREQ          24000000
 #define CONFIG_CONS_INDEX      1               /* use UART0 for console */
 
 #define CONFIG_SPI
-#define CONFIG_DAVINCI_SPI
 #define CONFIG_SYS_SPI_BASE            DAVINCI_SPI0_BASE
 #define CONFIG_SYS_SPI_CLK             clk_get(DAVINCI_SPI0_CLKID)
 #define CONFIG_SF_DEFAULT_SPEED                50000000
index 8fbf89001efdb2e640b926f156a825351950740b..5674a5d2079c86918acabce603bad97cedb70c10 100644 (file)
@@ -170,9 +170,13 @@ unsigned long get_board_ddr_clk(void);
 #define QIXIS_LBMAP_DFLTBANK           0x0e
 #define QIXIS_LBMAP_ALTBANK            0x2e
 #define QIXIS_LBMAP_SD                 0x00
+#define QIXIS_LBMAP_EMMC               0x00
+#define QIXIS_LBMAP_IFC                        0x00
 #define QIXIS_LBMAP_SD_QSPI            0x0e
 #define QIXIS_LBMAP_QSPI               0x0e
+#define QIXIS_RCW_SRC_IFC              0x25
 #define QIXIS_RCW_SRC_SD               0x40
+#define QIXIS_RCW_SRC_EMMC             0x41
 #define QIXIS_RCW_SRC_QSPI             0x62
 #define QIXIS_RST_CTL_RESET            0x41
 #define QIXIS_RCFG_CTL_RECONFIG_IDLE   0x20
@@ -279,6 +283,33 @@ unsigned long get_board_ddr_clk(void);
 #define I2C_MUX_CH_DEFAULT             0x8
 #define I2C_MUX_CH5                    0xD
 
+#define I2C_MUX_CH_VOL_MONITOR          0xA
+
+/* Voltage monitor on channel 2*/
+#define I2C_VOL_MONITOR_ADDR           0x63
+#define I2C_VOL_MONITOR_BUS_V_OFFSET   0x2
+#define I2C_VOL_MONITOR_BUS_V_OVF      0x1
+#define I2C_VOL_MONITOR_BUS_V_SHIFT    3
+#define I2C_SVDD_MONITOR_ADDR           0x4F
+
+#define CONFIG_VID_FLS_ENV              "ls1088aqds_vdd_mv"
+#define CONFIG_VID
+
+/* The lowest and highest voltage allowed for LS1088AQDS */
+#define VDD_MV_MIN                     819
+#define VDD_MV_MAX                     1212
+
+#define CONFIG_VOL_MONITOR_LTC3882_SET
+#define CONFIG_VOL_MONITOR_LTC3882_READ
+
+/* PM Bus commands code for LTC3882*/
+#define PMBUS_CMD_PAGE                  0x0
+#define PMBUS_CMD_READ_VOUT             0x8B
+#define PMBUS_CMD_PAGE_PLUS_WRITE       0x05
+#define PMBUS_CMD_VOUT_COMMAND          0x21
+
+#define PWM_CHANNEL0                    0x0
+
 /*
 * RTC configuration
 */
index d0066e3551fdbb4ae837bb33d2a4eb4b5657295c..a6271f5ae263dba19faba4ca31712587480d98a4 100644 (file)
 #endif
 
 #define CONFIG_SYS_I2C_FPGA_ADDR       0x66
+#define QIXIS_BRDCFG4_OFFSET            0x54
 #define QIXIS_LBMAP_SWITCH             2
 #define QIXIS_QMAP_MASK                        0xe0
 #define QIXIS_QMAP_SHIFT               5
 #define QIXIS_LBMAP_DFLTBANK           0x00
 #define QIXIS_LBMAP_ALTBANK            0x20
 #define QIXIS_LBMAP_SD                 0x00
+#define QIXIS_LBMAP_EMMC               0x00
 #define QIXIS_LBMAP_SD_QSPI            0x00
 #define QIXIS_LBMAP_QSPI               0x00
 #define QIXIS_RCW_SRC_SD               0x40
+#define QIXIS_RCW_SRC_EMMC             0x41
 #define QIXIS_RCW_SRC_QSPI             0x62
 #define QIXIS_RST_CTL_RESET            0x31
 #define QIXIS_RCFG_CTL_RECONFIG_IDLE   0x20
 
 #define CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS 5000
 
+#define I2C_MUX_CH_VOL_MONITOR          0xA
+/* Voltage monitor on channel 2*/
+#define I2C_VOL_MONITOR_ADDR           0x63
+#define I2C_VOL_MONITOR_BUS_V_OFFSET   0x2
+#define I2C_VOL_MONITOR_BUS_V_OVF      0x1
+#define I2C_VOL_MONITOR_BUS_V_SHIFT    3
+#define I2C_SVDD_MONITOR_ADDR          0x4F
+
+#define CONFIG_VID_FLS_ENV              "ls1088ardb_vdd_mv"
+#define CONFIG_VID
+
+/* The lowest and highest voltage allowed for LS1088ARDB */
+#define VDD_MV_MIN                     819
+#define VDD_MV_MAX                     1212
+
+#define CONFIG_VOL_MONITOR_LTC3882_SET
+#define CONFIG_VOL_MONITOR_LTC3882_READ
+
+/* PM Bus commands code for LTC3882*/
+#define PMBUS_CMD_PAGE                  0x0
+#define PMBUS_CMD_READ_VOUT             0x8B
+#define PMBUS_CMD_PAGE_PLUS_WRITE       0x05
+#define PMBUS_CMD_VOUT_COMMAND          0x21
+
+#define PWM_CHANNEL0                    0x0
+
 /*
  * I2C bus multiplexer
  */
index 7c2bab2fc6eb8d4b2bb61c9641fcabb56b4b7df6..1721fefd14651f279f37f482d2a93c95641e5beb 100644 (file)
 #ifdef CONFIG_CMD_SF
 #endif
 
-/*
- * Common USB/EHCI configuration
- */
-#if defined(CONFIG_CMD_USB) && !defined(CONFIG_DM)
-#define CONFIG_SUPPORT_VFAT
-#endif /* CONFIG_CMD_USB */
-
 /*
  * File system
  */
index 9f2db099cda562adfe950604346fe9b6064dc505..5c53dd3dfb5715520d7016006cfe2e8a525396ef 100644 (file)
 #define CONFIG_SYS_SCSI_MAX_DEVICE     (CONFIG_SYS_SCSI_MAX_SCSI_ID * \
                                         CONFIG_SYS_SCSI_MAX_LUN)
 
-#define CONFIG_SUPPORT_VFAT
-
 #include <config_distro_defaults.h>
 
 #define BOOT_TARGET_DEVICES(func) \
index 7f143164c3acd3767fbf8abe41a41bf83ee0978b..86e0d4382119601032272c80bf86215b1170ecb1 100644 (file)
 #define CONFIG_SYS_SCSI_MAX_DEVICE     (CONFIG_SYS_SCSI_MAX_SCSI_ID * \
                                         CONFIG_SYS_SCSI_MAX_LUN)
 
-#define CONFIG_SUPPORT_VFAT
-
 /*
  * PCI configuration
  */
index 8e8946a6b42b91f2f2375786a6dd0999393df98f..f82c4ccbde6c0fbe7c2593e759db04f8e63dda65 100644 (file)
 #define CONFIG_CMDLINE_EDITING
 #define CONFIG_SYS_LONGHELP
 
-/* U-Boot commands */
-
-/* Filesystem support */
-#define CONFIG_FS_EXT4
-
 /* Ethernet */
 #define CONFIG_FEC_MXC
 #define CONFIG_FEC_MXC_PHYADDR         0x1f
index 089263f96f749783810f7dfc051d1c788cdea5c4..90be7bd010f16dd0099897f4a6f78b9a10c6aa4d 100644 (file)
@@ -91,7 +91,6 @@
 #ifdef CONFIG_CMD_USB
 #define CONFIG_USB_EHCI_KIRKWOOD       /* on Kirkwood platform */
 #define CONFIG_EHCI_IS_TDI
-#define CONFIG_SUPPORT_VFAT
 #endif /* CONFIG_CMD_USB */
 
 /*
index b7fe7341e407fd16275ed06d2cd399a3a2fc0e6a..00509e8508ade5df9d7d6161cfe28bb75f53c649 100644 (file)
 #define CONFIG_ENV_OVERWRITE
 #define CONFIG_SYS_BAUDRATE_TABLE { 4800, 9600, 19200, 38400, 57600, 115200 }
 
-/* USB */
-#define CONFIG_USB_MUSB_UDC
-#define CONFIG_USB_MUSB_HCD
-#define CONFIG_USB_OMAP3
-#define CONFIG_TWL4030_USB
-
 /* USB device configuration */
 #define CONFIG_USB_DEVICE
 #define CONFIG_USBD_VENDORID           0x0421
index 843e345ffd0ff9fcb8233d1a2b24762a1e06e525..d3dfe60bb08fc810992381fd2484d76d3db94d47 100644 (file)
@@ -62,9 +62,6 @@
 
 /* MUSB */
 #define CONFIG_USB_OMAP3
-#define CONFIG_USB_MUSB_OMAP2PLUS
-#define CONFIG_USB_MUSB_PIO_ONLY
-#define CONFIG_TWL4030_USB
 
 /* USB EHCI */
 #define CONFIG_OMAP_EHCI_PHY1_RESET_GPIO       147
index 3ecfdbb3ce5b161780543a1e9f84be1bfc15e517..ba67e33c384539f62d1684b4da4d164d782910f5 100644 (file)
@@ -74,9 +74,6 @@
 #endif /* CONFIG_NAND */
 
 /* MUSB */
-#define CONFIG_USB_OMAP3
-#define CONFIG_USB_MUSB_OMAP2PLUS
-#define CONFIG_USB_MUSB_PIO_ONLY
 
 /* USB EHCI */
 #define CONFIG_SYS_USB_FAT_BOOT_PARTITION  1
index 91b3a23d29f461c6f9fcf73775f6dc808d07bcc8..76d8e13d52c107d1d5bc79bb062d4d241d894627 100644 (file)
 #define GPIO_IGEP00X0_BOARD_DETECTION          28
 #define GPIO_IGEP00X0_REVISION_DETECTION       129
 
-/* USB */
-#define CONFIG_USB_MUSB_UDC            1
-#define CONFIG_USB_OMAP3               1
-#define CONFIG_TWL4030_USB             1
-
 /* USB device configuration */
 #define CONFIG_USB_DEVICE              1
 #define CONFIG_USB_TTY                 1
index b095814cda8d32efcb179084db95eaa7376da07b..70745a882cbd4ead6665d3bea62fffa2732d38bb 100644 (file)
 
 /* Hardware drivers */
 
-#define CONFIG_USB_OMAP3
-
 /* I2C */
 #define CONFIG_SYS_I2C_EEPROM_ADDR     0x50    /* EEPROM AT24C64      */
 
-/* USB */
-#define CONFIG_USB_MUSB_OMAP2PLUS
-#define CONFIG_USB_MUSB_PIO_ONLY
-
-/* TWL4030 */
-#define CONFIG_TWL4030_USB
-
 /* Board NAND Info. */
 #ifdef CONFIG_NAND
 #define CONFIG_SYS_NAND_ADDR           NAND_BASE /* physical address */
index d1ff48d39fae29bfd047c0117390440cac3b8dc8..cc7c2fdf0435d25baaaa9a3c231c8be0bd33b7c2 100644 (file)
  * Hardware drivers
  */
 
-/* USB */
-#define CONFIG_USB_MUSB_UDC                    1
-#define CONFIG_USB_OMAP3               1
-#define CONFIG_TWL4030_USB             1
-
 /* USB device configuration */
 #define CONFIG_USB_DEVICE              1
 #define CONFIG_USB_TTY                 1
index 5dba7d279a4cee2107f20a1b57fd1d719dce5b88..2cb99119a1ea3ba89bcf40ac682e0329b57019a9 100644 (file)
@@ -24,7 +24,6 @@
  */
 #define CONFIG_MACH_OMAPL138_LCDK
 #define CONFIG_ARM926EJS               /* arm926ejs CPU core */
-#define CONFIG_SOC_DA8XX               /* TI DA8xx SoC */
 #define CONFIG_SYS_CLK_FREQ            clk_get(DAVINCI_ARM_CLKID)
 #define CONFIG_SYS_OSCIN_FREQ          24000000
 #define CONFIG_SYS_TIMERBASE           DAVINCI_TIMER0_BASE
 #define CONFIG_SYS_BAUDRATE_TABLE      { 9600, 19200, 38400, 57600, 115200 }
 
 #define CONFIG_SPI
-#define CONFIG_DAVINCI_SPI
 #define CONFIG_SYS_SPI_BASE            DAVINCI_SPI1_BASE
 #define CONFIG_SYS_SPI_CLK             clk_get(DAVINCI_SPI1_CLKID)
 #define CONFIG_SF_DEFAULT_SPEED                30000000
index 79f3f48df87e4f8250a15b35d99becd56f162bf1..c6ff1e1165b003317860c746b8339e04a3729441 100644 (file)
 /*
  * USB configuration
  */
-#define CONFIG_USB_MUSB_DSPS
-#define CONFIG_USB_MUSB_PIO_ONLY
 #define CONFIG_AM335X_USB0
 #define CONFIG_AM335X_USB0_MODE        MUSB_PERIPHERAL
 #define CONFIG_AM335X_USB1
index 8afd64e810ad2de7667cdeb8cdd228e011180629..d9a50cacf288b193885b415b0fbef627e1aa0626 100644 (file)
  * board schematic and physical port wired to each.  Then for host we
  * add mass storage support.
  */
-#define CONFIG_USB_MUSB_DSPS
-#define CONFIG_USB_MUSB_PIO_ONLY
 #define CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
 #define CONFIG_AM335X_USB0
 #define CONFIG_AM335X_USB0_MODE        MUSB_PERIPHERAL
index 97636fee38593a73264dc1c6f93961ac0454f73b..7a959c4315102161a26da508f4ad2f52ae10fa7d 100644 (file)
 /*--------------------------------------------------
  * USB Configuration
  */
-#define CONFIG_USB_MUSB_PIO_ONLY
-
-/*-----------------------------------------------------------------------
- * File System Configuration
- */
-/* FAT FS */
-#define CONFIG_SUPPORT_VFAT
-
-/* EXT4 FS */
-#define CONFIG_FS_EXT4
 
 /* -------------------------------------------------
  * Environment
index 8a12b526a8d1e40aee0b1ed0cb164a96dbc2e24c..acdce29ba9f35bcaf9911ecb9c43bc9e4f211c8a 100644 (file)
@@ -66,7 +66,6 @@
 #define CONFIG_SYS_MMC_ENV_DEV         0
 #define CONFIG_ENV_OFFSET              (0x780 * 512)   /* env_mmc_blknum */
 #define CONFIG_ENV_SIZE                        0x10000 /* env_mmc_nblks bytes */
-#define CONFIG_FAT_WRITE
 #define CONFIG_ENV_VARS_UBOOT_CONFIG
 
 /* Monitor Command Prompt */
index 2c10e6152d3331842927b0477de2abcf5a194b9d..d7792978f73dfe4e6b5ecbe4aee1f6effcca7ffe 100644 (file)
 
 #include <asm/arch/rmobile.h>
 
-/* Support File sytems */
-#define CONFIG_SUPPORT_VFAT
-#define CONFIG_FS_EXT4
-#define CONFIG_EXT4_WRITE
-
 #define CONFIG_CMDLINE_TAG
 #define CONFIG_SETUP_MEMORY_TAGS
 #define CONFIG_INITRD_TAG
index 30a98b8ada3e5804abac2a29805cf63a76ad8f53..e9e5fecc12a06ee8cf5dfc6ccd9d4e71c4d1fe3d 100644 (file)
 /* boot option */
 #define CONFIG_SUPPORT_RAW_INITRD
 
-/* Support File sytems */
-#define CONFIG_SUPPORT_VFAT
-#define CONFIG_FS_EXT4
-#define CONFIG_EXT4_WRITE
-
 #define CONFIG_CMDLINE_TAG
 #define CONFIG_SETUP_MEMORY_TAGS
 #define CONFIG_INITRD_TAG
index e915a562b926c1812db56d055a25b03f7fb8a18f..8889046f2b2a2e743e3a90740ac1708ecc45f1ae 100644 (file)
@@ -30,9 +30,6 @@
 /* MMC/SD IP block */
 #define CONFIG_BOUNCE_BUFFER
 
-#define CONFIG_SUPPORT_VFAT
-#define CONFIG_FS_EXT4
-
 /* RAW SD card / eMMC locations. */
 #define CONFIG_SYS_SPI_U_BOOT_OFFS     (128 << 10)
 
index 0cb0762345e49f300d648e2a27cc646b7ec3d1fb..9ab550242274df5bc48203635bb73974a1f1035f 100644 (file)
@@ -58,7 +58,6 @@
 
 #ifndef CONFIG_SPL_BUILD
 /* usb otg */
-#define CONFIG_ROCKCHIP_USB2_PHY
 
 /* usb host support */
 #define ENV_MEM_LAYOUT_SETTINGS \
index e2f070fd1c8e75db6658a9e9d887646be13921ca..c2bd378437eb701655009e2ff73e4e1bf510486f 100644 (file)
@@ -58,7 +58,6 @@
 
 #ifndef CONFIG_SPL_BUILD
 /* usb otg */
-#define CONFIG_ROCKCHIP_USB2_PHY
 
 /* usb mass storage */
 #define CONFIG_USB_FUNCTION_MASS_STORAGE
index af556323f89a4c1b4ef347ba5ba7edcc7dd1b6b8..eba5a22e06f1aac063c494530f35b4dd6e2b94c5 100644 (file)
@@ -24,9 +24,6 @@
 /* MMC/SD IP block */
 #define CONFIG_BOUNCE_BUFFER
 
-#define CONFIG_SUPPORT_VFAT
-#define CONFIG_FS_EXT4
-
 /* RAW SD card / eMMC locations. */
 #define CONFIG_SYS_SPI_U_BOOT_OFFS     (128 << 10)
 
index 561bfa73b664c26d56ae5b3e8d3ea53f712e6514..95f544ee58fdf7a48eef32d8fa48371fc8fe1719 100644 (file)
@@ -38,9 +38,6 @@
 #define CONFIG_BOUNCE_BUFFER
 #define CONFIG_ROCKCHIP_SDHCI_MAX_FREQ 200000000
 
-#define CONFIG_SUPPORT_VFAT
-#define CONFIG_FS_EXT4
-
 /* RAW SD card / eMMC locations. */
 #define CONFIG_SYS_SPI_U_BOOT_OFFS     (128 << 10)
 
index 1aa1671738ee5cc3acf707824593eabe2ee14777..c31896ddf87a9422daa88c319f1218e67899e982 100644 (file)
 #define CONFIG_SAMSUNG_ONENAND         1
 #define CONFIG_SYS_ONENAND_BASE                0xB0000000
 
-/* write support for filesystems */
-#define CONFIG_EXT4_WRITE
-
-/* GPT */
-
 #define CONFIG_SYS_INIT_SP_ADDR        (CONFIG_SYS_LOAD_ADDR - 0x1000000)
 
 #define CONFIG_USB_GADGET_DWC2_OTG_PHY
index f0426567fdc330b83702ea1d3606a6b177e41dbb..cfb3e7affd845c3232164ce20c516cfc8a86009e 100644 (file)
@@ -25,8 +25,6 @@
 
 #define CONFIG_LMB
 
-#define CONFIG_FS_EXT4
-#define CONFIG_EXT4_WRITE
 #define CONFIG_HOST_MAX_DEVICES 4
 
 /*
index 78708a23ce42f84b22561619e995c78e972fdd55..85b64123a0eb7fe8ee2c22ceb9a22d1a81b1478d 100644 (file)
 /*
  * USB configuration
  */
-#define CONFIG_USB_MUSB_DSPS
-#define CONFIG_USB_MUSB_PIO_ONLY
 #define CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
 
 #define CONFIG_AM335X_USB0
index 580994280b113ed388f72aa934eff5a77b591841..0ed72cf901b2f9531b4c9e94aa3579eea5af0fb6 100644 (file)
 #define CONFIG_SYS_BAUDRATE_TABLE      { 4800, 9600, 19200, 38400, 57600, \
                                          115200 }
 
-/*
- * USB gadget
- */
-
-#define CONFIG_USB_MUSB_PIO_ONLY
-#define CONFIG_USB_MUSB_OMAP2PLUS
-#define CONFIG_TWL4030_USB
-
 /*
  * Environment
  */
index 3855c564f91495e4e1a659253fbfaa7fe02eb685..582aba298af921c1e1bae96f642a0226f366f2c4 100644 (file)
@@ -302,10 +302,6 @@ extern int soft_i2c_gpio_scl;
 #define CONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS 1
 #endif
 
-#ifdef CONFIG_USB_MUSB_SUNXI
-#define CONFIG_USB_MUSB_PIO_ONLY
-#endif
-
 #ifdef CONFIG_USB_MUSB_GADGET
 #define CONFIG_USB_FUNCTION_MASS_STORAGE
 #endif
index 743be6bb5682f5c6a468c918ba6bb5f6961d4e94..aea8f1fb8e6d4ad7df4c5ecc63cd438d00b9d89a 100644 (file)
 #ifdef CONFIG_CMD_I2C
 #endif
 
-/* remove partitions/filesystems */
-#ifdef CONFIG_FS_EXT4
-#undef CONFIG_FS_EXT4
-#endif
-
 /* remove USB */
 #ifdef CONFIG_USB_EHCI_TEGRA
 #undef CONFIG_USB_EHCI_TEGRA
index 6e95aa1626e509bf9ac2a7dc78764489924ae86f..438abf10cce8148dd7c42700a15b6639963c98d5 100644 (file)
@@ -67,9 +67,6 @@
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
 #define CONFIG_LBA48
 
-/* Additional FS support/configuration */
-#define CONFIG_SUPPORT_VFAT
-
 /* PCIe support */
 #ifdef CONFIG_CMD_PCI
 #ifndef CONFIG_SPL_BUILD
index 7fb3aaf46d6ee18c8e24baba2f6b36b24f98b59a..bbed17a25fa0e060894ca431d18fd30266553012 100644 (file)
@@ -78,7 +78,6 @@
 #endif
 
 /* SPI Configuration */
-#define CONFIG_DAVINCI_SPI
 #define CONFIG_SYS_SPI_CLK             ks_clk_get_rate(KS2_CLK1_6)
 #define CONFIG_SF_DEFAULT_SPEED                30000000
 #define CONFIG_ENV_SPI_MAX_HZ          CONFIG_SF_DEFAULT_SPEED
index 91b2132455d93bf8c8e586577355232528042e8c..844a9e55b3dd758fe6bb11b5ebe85c40437b3acf 100644 (file)
@@ -61,8 +61,6 @@
 #endif
 
 /* USB */
-#define CONFIG_USB_MUSB_UDC                    1
-#define CONFIG_USB_OMAP3               1
 
 /* USB device configuration */
 #define CONFIG_USB_DEVICE              1
index 3dbd2cacbae71dbcc1ad1b9d1f9b322274519184..40d94a2d24b227b9f2fdc6f8f1073e91ce64855a 100644 (file)
@@ -59,9 +59,6 @@
 #define CONFIG_SYS_SCSI_MAX_DEVICE     (CONFIG_SYS_SCSI_MAX_SCSI_ID * \
                                         CONFIG_SYS_SCSI_MAX_LUN)
 
-/* Additional FS support/configuration */
-#define CONFIG_SUPPORT_VFAT
-
 /* USB/EHCI configuration */
 #define CONFIG_EHCI_IS_TDI
 
index 00ad134382e6c565851e164f696d009d8d7a45c0..a5b5aafb407274d67eed9c73d91bb97194808263 100644 (file)
@@ -72,7 +72,6 @@
  * Commands
  */
 #if defined(CONFIG_CMD_USB)
-#define CONFIG_SUPPORT_VFAT
 
 /*
  * USB/EHCI
index 7363057a5c3064c57c4a84a9037877d8d5b5989a..4aa5a2a924fabbb3d15297423f601cc963eb2483 100644 (file)
 #define CONFIG_USB_EHCI_SPEAR
 #define CONFIG_USB_MAX_CONTROLLER_COUNT        2
 
-/* Filesystem support (for USB key) */
-#define CONFIG_SUPPORT_VFAT
-
-
 /*
  * U-Boot Environment placing definitions.
  */
index 064c546403627bea6d192e74beb810de5f6443d5..994214ea48a784ee92855bd0c450916fd7a7d4b7 100644 (file)
@@ -58,8 +58,6 @@
 #define CONFIG_CMDLINE_EDITING
 #define CONFIG_AUTO_COMPLETE
 
-#define CONFIG_SUPPORT_VFAT
-
 /*-----------------------------------------------------------------------
  * Command line configuration.
  */
index 1ae1ca4317f2f091fb115f28d7dfbc42a06a50b8..f9783a21c2ed5f590ecd823c90e24467668feff3 100644 (file)
@@ -82,7 +82,6 @@
 #define CONFIG_MXC_USB_PORTSC  MXC_EHCI_MODE_SERIAL
 #define CONFIG_MXC_USB_FLAGS   (MXC_EHCI_INTERNAL_PHY | MXC_EHCI_IPPUE_DOWN)
 #define CONFIG_EHCI_IS_TDI
-#define CONFIG_SUPPORT_VFAT
 #endif /* CONFIG_CMD_USB */
 
 /* SDRAM */
index b10cb3f572204131e2af35d3b322eb917504036d..28cee15b37a5d8d47f071b9238310c03ccb0ac82 100644 (file)
 # define DFU_ALT_INFO
 #endif
 
-#if defined(CONFIG_MMC_SDHCI_ZYNQ) || defined(CONFIG_ZYNQ_USB)
-# define CONFIG_SUPPORT_VFAT
-#endif
-
 #if defined(CONFIG_ZYNQ_I2C0) || defined(CONFIG_ZYNQ_I2C1)
 #define CONFIG_SYS_I2C_ZYNQ
 #endif
index 8b9932a569ce5a33a813f3bdb11ed2fc880c210b..c359a60f9536a78830d33c23497ba412991e111d 100644 (file)
@@ -652,4 +652,17 @@ int ofnode_read_resource_byname(ofnode node, const char *name,
             ofnode_valid(node); \
             node = ofnode_next_subnode(node))
 
+/**
+ * ofnode_translate_address() - Tranlate a device-tree address
+ *
+ * Translate an address from the device-tree into a CPU physical address. This
+ * function walks up the tree and applies the various bus mappings along the
+ * way.
+ *
+ * @ofnode: Device tree node giving the context in which to translate the
+ *          address
+ * @in_addr: pointer to the address to translate
+ * @return the translated address; OF_BAD_ADDR on error
+ */
+u64 ofnode_translate_address(ofnode node, const fdt32_t *in_addr);
 #endif
index 0eb4b924d4d07d88948e22f30e42d454f9ae3792..c6c8f6158d38d12bdcbb6154881306b6fe6ba09f 100644 (file)
@@ -137,6 +137,12 @@ struct pinctrl_ops {
 /**
  * Generic pin configuration paramters
  *
+ * enum pin_config_param - possible pin configuration parameters
+ * @PIN_CONFIG_BIAS_BUS_HOLD: the pin will be set to weakly latch so that it
+ *     weakly drives the last value on a tristate bus, also known as a "bus
+ *     holder", "bus keeper" or "repeater". This allows another device on the
+ *     bus to change the value by driving the bus high or low and switching to
+ *     tristate. The argument is ignored.
  * @PIN_CONFIG_BIAS_DISABLE: disable any pin bias on the pin, a
  *     transition from say pull-up to pull-down implies that you disable
  *     pull-up in the process, this setting disables all biasing.
@@ -146,14 +152,6 @@ struct pinctrl_ops {
  *     if for example some other pin is going to drive the signal connected
  *     to it for a while. Pins used for input are usually always high
  *     impedance.
- * @PIN_CONFIG_BIAS_BUS_HOLD: the pin will be set to weakly latch so that it
- *     weakly drives the last value on a tristate bus, also known as a "bus
- *     holder", "bus keeper" or "repeater". This allows another device on the
- *     bus to change the value by driving the bus high or low and switching to
- *     tristate. The argument is ignored.
- * @PIN_CONFIG_BIAS_PULL_UP: the pin will be pulled up (usually with high
- *     impedance to VDD). If the argument is != 0 pull-up is enabled,
- *     if it is 0, pull-up is total, i.e. the pin is connected to VDD.
  * @PIN_CONFIG_BIAS_PULL_DOWN: the pin will be pulled down (usually with high
  *     impedance to GROUND). If the argument is != 0 pull-down is enabled,
  *     if it is 0, pull-down is total, i.e. the pin is connected to GROUND.
@@ -165,10 +163,9 @@ struct pinctrl_ops {
  *     If the argument is != 0 pull up/down is enabled, if it is 0, the
  *     configuration is ignored. The proper way to disable it is to use
  *     @PIN_CONFIG_BIAS_DISABLE.
- * @PIN_CONFIG_DRIVE_PUSH_PULL: the pin will be driven actively high and
- *     low, this is the most typical case and is typically achieved with two
- *     active transistors on the output. Setting this config will enable
- *     push-pull mode, the argument is ignored.
+ * @PIN_CONFIG_BIAS_PULL_UP: the pin will be pulled up (usually with high
+ *     impedance to VDD). If the argument is != 0 pull-up is enabled,
+ *     if it is 0, pull-up is total, i.e. the pin is connected to VDD.
  * @PIN_CONFIG_DRIVE_OPEN_DRAIN: the pin will be driven with open drain (open
  *     collector) which means it is usually wired with other output ports
  *     which are then pulled up with an external resistor. Setting this
@@ -176,59 +173,82 @@ struct pinctrl_ops {
  * @PIN_CONFIG_DRIVE_OPEN_SOURCE: the pin will be driven with open source
  *     (open emitter). Setting this config will enable open source mode, the
  *     argument is ignored.
+ * @PIN_CONFIG_DRIVE_PUSH_PULL: the pin will be driven actively high and
+ *     low, this is the most typical case and is typically achieved with two
+ *     active transistors on the output. Setting this config will enable
+ *     push-pull mode, the argument is ignored.
  * @PIN_CONFIG_DRIVE_STRENGTH: the pin will sink or source at most the current
  *     passed as argument. The argument is in mA.
+ * @PIN_CONFIG_INPUT_DEBOUNCE: this will configure the pin to debounce mode,
+ *     which means it will wait for signals to settle when reading inputs. The
+ *     argument gives the debounce time in usecs. Setting the
+ *     argument to zero turns debouncing off.
  * @PIN_CONFIG_INPUT_ENABLE: enable the pin's input.  Note that this does not
  *     affect the pin's ability to drive output.  1 enables input, 0 disables
  *     input.
- * @PIN_CONFIG_INPUT_SCHMITT_ENABLE: control schmitt-trigger mode on the pin.
- *      If the argument != 0, schmitt-trigger mode is enabled. If it's 0,
- *      schmitt-trigger mode is disabled.
  * @PIN_CONFIG_INPUT_SCHMITT: this will configure an input pin to run in
  *     schmitt-trigger mode. If the schmitt-trigger has adjustable hysteresis,
  *     the threshold value is given on a custom format as argument when
  *     setting pins to this mode.
- * @PIN_CONFIG_INPUT_DEBOUNCE: this will configure the pin to debounce mode,
- *     which means it will wait for signals to settle when reading inputs. The
- *     argument gives the debounce time in usecs. Setting the
- *     argument to zero turns debouncing off.
+ * @PIN_CONFIG_INPUT_SCHMITT_ENABLE: control schmitt-trigger mode on the pin.
+ *      If the argument != 0, schmitt-trigger mode is enabled. If it's 0,
+ *      schmitt-trigger mode is disabled.
+ * @PIN_CONFIG_LOW_POWER_MODE: this will configure the pin for low power
+ *     operation, if several modes of operation are supported these can be
+ *     passed in the argument on a custom form, else just use argument 1
+ *     to indicate low power mode, argument 0 turns low power mode off.
+ * @PIN_CONFIG_OUTPUT_ENABLE: this will enable the pin's output mode
+ *     without driving a value there. For most platforms this reduces to
+ *     enable the output buffers and then let the pin controller current
+ *     configuration (eg. the currently selected mux function) drive values on
+ *     the line. Use argument 1 to enable output mode, argument 0 to disable
+ *     it.
+ * @PIN_CONFIG_OUTPUT: this will configure the pin as an output and drive a
+ *     value on the line. Use argument 1 to indicate high level, argument 0 to
+ *     indicate low level. (Please see Documentation/driver-api/pinctl.rst,
+ *     section "GPIO mode pitfalls" for a discussion around this parameter.)
  * @PIN_CONFIG_POWER_SOURCE: if the pin can select between different power
  *     supplies, the argument to this parameter (on a custom format) tells
  *     the driver which alternative power source to use.
+ * @PIN_CONFIG_SLEEP_HARDWARE_STATE: indicate this is sleep related state.
  * @PIN_CONFIG_SLEW_RATE: if the pin can select slew rate, the argument to
  *     this parameter (on a custom format) tells the driver which alternative
  *     slew rate to use.
- * @PIN_CONFIG_LOW_POWER_MODE: this will configure the pin for low power
- *     operation, if several modes of operation are supported these can be
- *     passed in the argument on a custom form, else just use argument 1
- *     to indicate low power mode, argument 0 turns low power mode off.
- * @PIN_CONFIG_OUTPUT: this will configure the pin as an output. Use argument
- *     1 to indicate high level, argument 0 to indicate low level. (Please
- *     see Documentation/pinctrl.txt, section "GPIO mode pitfalls" for a
- *     discussion around this parameter.)
+ * @PIN_CONFIG_SKEW_DELAY: if the pin has programmable skew rate (on inputs)
+ *     or latch delay (on outputs) this parameter (in a custom format)
+ *     specifies the clock skew or latch delay. It typically controls how
+ *     many double inverters are put in front of the line.
  * @PIN_CONFIG_END: this is the last enumerator for pin configurations, if
  *     you need to pass in custom configurations to the pin controller, use
  *     PIN_CONFIG_END+1 as the base offset.
+ * @PIN_CONFIG_MAX: this is the maximum configuration value that can be
+ *     presented using the packed format.
  */
-#define PIN_CONFIG_BIAS_DISABLE                        0
-#define PIN_CONFIG_BIAS_HIGH_IMPEDANCE         1
-#define PIN_CONFIG_BIAS_BUS_HOLD               2
-#define PIN_CONFIG_BIAS_PULL_UP                        3
-#define PIN_CONFIG_BIAS_PULL_DOWN              4
-#define PIN_CONFIG_BIAS_PULL_PIN_DEFAULT       5
-#define PIN_CONFIG_DRIVE_PUSH_PULL             6
-#define PIN_CONFIG_DRIVE_OPEN_DRAIN            7
-#define PIN_CONFIG_DRIVE_OPEN_SOURCE           8
-#define PIN_CONFIG_DRIVE_STRENGTH              9
-#define PIN_CONFIG_INPUT_ENABLE                        10
-#define PIN_CONFIG_INPUT_SCHMITT_ENABLE                11
-#define PIN_CONFIG_INPUT_SCHMITT               12
-#define PIN_CONFIG_INPUT_DEBOUNCE              13
-#define PIN_CONFIG_POWER_SOURCE                        14
-#define PIN_CONFIG_SLEW_RATE                   15
-#define PIN_CONFIG_LOW_POWER_MODE              16
-#define PIN_CONFIG_OUTPUT                      17
-#define PIN_CONFIG_END                         0x7FFF
+enum pin_config_param {
+       PIN_CONFIG_BIAS_BUS_HOLD,
+       PIN_CONFIG_BIAS_DISABLE,
+       PIN_CONFIG_BIAS_HIGH_IMPEDANCE,
+       PIN_CONFIG_BIAS_PULL_DOWN,
+       PIN_CONFIG_BIAS_PULL_PIN_DEFAULT,
+       PIN_CONFIG_BIAS_PULL_UP,
+       PIN_CONFIG_DRIVE_OPEN_DRAIN,
+       PIN_CONFIG_DRIVE_OPEN_SOURCE,
+       PIN_CONFIG_DRIVE_PUSH_PULL,
+       PIN_CONFIG_DRIVE_STRENGTH,
+       PIN_CONFIG_INPUT_DEBOUNCE,
+       PIN_CONFIG_INPUT_ENABLE,
+       PIN_CONFIG_INPUT_SCHMITT,
+       PIN_CONFIG_INPUT_SCHMITT_ENABLE,
+       PIN_CONFIG_LOW_POWER_MODE,
+       PIN_CONFIG_OUTPUT_ENABLE,
+       PIN_CONFIG_OUTPUT,
+       PIN_CONFIG_POWER_SOURCE,
+       PIN_CONFIG_SLEEP_HARDWARE_STATE,
+       PIN_CONFIG_SLEW_RATE,
+       PIN_CONFIG_SKEW_DELAY,
+       PIN_CONFIG_END = 0x7F,
+       PIN_CONFIG_MAX = 0xFF,
+};
 
 #if CONFIG_IS_ENABLED(PINCTRL_GENERIC)
 /**
index 5cacec800074497a7ece65d63a5b637e0e368be4..f1f0dfd4a330e8521807bb5643a34b3cbefed4d7 100644 (file)
@@ -420,6 +420,18 @@ int dev_read_resource(struct udevice *dev, uint index, struct resource *res);
 int dev_read_resource_byname(struct udevice *dev, const char *name,
                             struct resource *res);
 
+/**
+ * dev_translate_address() - Tranlate a device-tree address
+ *
+ * Translate an address from the device-tree into a CPU physical address.  This
+ * function walks up the tree and applies the various bus mappings along the
+ * way.
+ *
+ * @dev: device giving the context in which to translate the address
+ * @in_addr: pointer to the address to translate
+ * @return the translated address; OF_BAD_ADDR on error
+ */
+u64 dev_translate_address(struct udevice *dev, const fdt32_t *in_addr);
 #else /* CONFIG_DM_DEV_READ_INLINE is enabled */
 
 static inline int dev_read_u32(struct udevice *dev,
@@ -598,6 +610,11 @@ static inline int dev_read_resource_byname(struct udevice *dev,
        return ofnode_read_resource_byname(dev_ofnode(dev), name, res);
 }
 
+static inline u64 dev_translate_address(struct udevice *dev, const fdt32_t *in_addr)
+{
+       return ofnode_translate_address(dev_ofnode(dev), in_addr);
+}
+
 #endif /* CONFIG_DM_DEV_READ_INLINE */
 
 /**
index 3fc20834aedd1973800501bbe62e4681eb79dc60..07fabc3ce6cf67d0dc45c85ef598ecd6247c41d7 100644 (file)
@@ -34,6 +34,7 @@ enum uclass_id {
        UCLASS_CROS_EC,         /* Chrome OS EC */
        UCLASS_DISPLAY,         /* Display (e.g. DisplayPort, HDMI) */
        UCLASS_DMA,             /* Direct Memory Access */
+       UCLASS_EFI,             /* EFI managed devices */
        UCLASS_ETH,             /* Ethernet device */
        UCLASS_GPIO,            /* Bank of general-purpose I/O pins */
        UCLASS_FIRMWARE,        /* Firmware */
index 18188497c27ec358b33e819f12baffdff6b47eed..709f661f200b27607bcff6701377fad73271637a 100644 (file)
@@ -72,11 +72,11 @@ struct udevice;
  * then this will be automatically allocated.
  * @per_child_auto_alloc_size: Each child device (of a parent in this
  * uclass) can hold parent data for the device/uclass. This value is only
- * used as a falback if this member is 0 in the driver.
+ * used as a fallback if this member is 0 in the driver.
  * @per_child_platdata_auto_alloc_size: A bus likes to store information about
  * its children. If non-zero this is the size of this data, to be allocated
  * in the child device's parent_platdata pointer. This value is only used as
- * a falback if this member is 0 in the driver.
+ * a fallback if this member is 0 in the driver.
  * @ops: Uclass operations, providing the consistent interface to devices
  * within the uclass.
  * @flags: Flags for this uclass (DM_UC_...)
index 584016dc302d0368fc047b233d9c657c74dbe08d..205f8f1f7007a1ab29d82e08864861632aea5fe3 100644 (file)
@@ -84,11 +84,12 @@ struct efi_boot_services {
        efi_status_t (EFIAPI *reinstall_protocol_interface)(
                        void *handle, const efi_guid_t *protocol,
                        void *old_interface, void *new_interface);
-       efi_status_t (EFIAPI *uninstall_protocol_interface)(void *handle,
-                       const efi_guid_t *protocol, void *protocol_interface);
-       efi_status_t (EFIAPI *handle_protocol)(efi_handle_t,
-                                              const efi_guid_t *protocol,
-                                              void **protocol_interface);
+       efi_status_t (EFIAPI *uninstall_protocol_interface)(
+                       efi_handle_t handle, const efi_guid_t *protocol,
+                       void *protocol_interface);
+       efi_status_t (EFIAPI *handle_protocol)(
+                       efi_handle_t handle, const efi_guid_t *protocol,
+                       void **protocol_interface);
        void *reserved;
        efi_status_t (EFIAPI *register_protocol_notify)(
                        const efi_guid_t *protocol, struct efi_event *event,
@@ -113,7 +114,7 @@ struct efi_boot_services {
        efi_status_t (EFIAPI *exit)(efi_handle_t handle,
                                    efi_status_t exit_status,
                                    unsigned long exitdata_size, s16 *exitdata);
-       efi_status_t (EFIAPI *unload_image)(void *image_handle);
+       efi_status_t (EFIAPI *unload_image)(efi_handle_t image_handle);
        efi_status_t (EFIAPI *exit_boot_services)(efi_handle_t, unsigned long);
 
        efi_status_t (EFIAPI *get_next_monotonic_count)(u64 *count);
@@ -125,8 +126,10 @@ struct efi_boot_services {
                        efi_handle_t *driver_image_handle,
                        struct efi_device_path *remaining_device_path,
                        bool recursive);
-       efi_status_t (EFIAPI *disconnect_controller)(void *controller_handle,
-                       void *driver_image_handle, void *child_handle);
+       efi_status_t (EFIAPI *disconnect_controller)(
+                       efi_handle_t controller_handle,
+                       efi_handle_t driver_image_handle,
+                       efi_handle_t child_handle);
 #define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL  0x00000001
 #define EFI_OPEN_PROTOCOL_GET_PROTOCOL        0x00000002
 #define EFI_OPEN_PROTOCOL_TEST_PROTOCOL       0x00000004
@@ -137,9 +140,10 @@ struct efi_boot_services {
                        const efi_guid_t *protocol, void **interface,
                        efi_handle_t agent_handle,
                        efi_handle_t controller_handle, u32 attributes);
-       efi_status_t (EFIAPI *close_protocol)(void *handle,
-                       const efi_guid_t *protocol, void *agent_handle,
-                       void *controller_handle);
+       efi_status_t (EFIAPI *close_protocol)(
+                       efi_handle_t handle, const efi_guid_t *protocol,
+                       efi_handle_t agent_handle,
+                       efi_handle_t controller_handle);
        efi_status_t(EFIAPI *open_protocol_information)(efi_handle_t handle,
                        const efi_guid_t *protocol,
                        struct efi_open_protocol_info_entry **entry_buffer,
@@ -243,11 +247,11 @@ struct efi_system_table {
        struct efi_table_hdr hdr;
        unsigned long fw_vendor;   /* physical addr of wchar_t vendor string */
        u32 fw_revision;
-       unsigned long con_in_handle;
+       efi_handle_t con_in_handle;
        struct efi_simple_input_interface *con_in;
-       unsigned long con_out_handle;
+       efi_handle_t con_out_handle;
        struct efi_simple_text_output_protocol *con_out;
-       unsigned long stderr_handle;
+       efi_handle_t stderr_handle;
        struct efi_simple_text_output_protocol *std_err;
        struct efi_runtime_services *runtime;
        struct efi_boot_services *boottime;
@@ -329,12 +333,27 @@ struct efi_device_path_acpi_path {
 } __packed;
 
 #define DEVICE_PATH_TYPE_MESSAGING_DEVICE      0x03
+#  define DEVICE_PATH_SUB_TYPE_MSG_ATAPI       0x01
+#  define DEVICE_PATH_SUB_TYPE_MSG_SCSI                0x02
 #  define DEVICE_PATH_SUB_TYPE_MSG_USB         0x05
 #  define DEVICE_PATH_SUB_TYPE_MSG_MAC_ADDR    0x0b
 #  define DEVICE_PATH_SUB_TYPE_MSG_USB_CLASS   0x0f
 #  define DEVICE_PATH_SUB_TYPE_MSG_SD          0x1a
 #  define DEVICE_PATH_SUB_TYPE_MSG_MMC         0x1d
 
+struct efi_device_path_atapi {
+       struct efi_device_path dp;
+       u8 primary_secondary;
+       u8 slave_master;
+       u16 logical_unit_number;
+} __packed;
+
+struct efi_device_path_scsi {
+       struct efi_device_path dp;
+       u16 target_id;
+       u16 logical_unit_number;
+} __packed;
+
 struct efi_device_path_usb {
        struct efi_device_path dp;
        u8 parent_port_number;
@@ -405,18 +424,26 @@ struct efi_block_io_media
        u32 io_align;
        u8 pad2[4];
        u64 last_block;
+       /* Added in revision 2 of the protocol */
+       u64 lowest_aligned_lba;
+       u32 logical_blocks_per_physical_block;
+       /* Added in revision 3 of the protocol */
+       u32 optimal_transfer_length_granualarity;
 };
 
+#define EFI_BLOCK_IO_PROTOCOL_REVISION2        0x00020001
+#define EFI_BLOCK_IO_PROTOCOL_REVISION3        0x0002001f
+
 struct efi_block_io {
        u64 revision;
        struct efi_block_io_media *media;
        efi_status_t (EFIAPI *reset)(struct efi_block_io *this,
                        char extended_verification);
        efi_status_t (EFIAPI *read_blocks)(struct efi_block_io *this,
-                       u32 media_id, u64 lba, unsigned long buffer_size,
+                       u32 media_id, u64 lba, efi_uintn_t buffer_size,
                        void *buffer);
        efi_status_t (EFIAPI *write_blocks)(struct efi_block_io *this,
-                       u32 media_id, u64 lba, unsigned long buffer_size,
+                       u32 media_id, u64 lba, efi_uintn_t buffer_size,
                        void *buffer);
        efi_status_t (EFIAPI *flush_blocks)(struct efi_block_io *this);
 };
@@ -790,4 +817,26 @@ struct efi_file_info {
        s16 file_name[0];
 };
 
+#define EFI_DRIVER_BINDING_PROTOCOL_GUID \
+       EFI_GUID(0x18a031ab, 0xb443, 0x4d1a,\
+                0xa5, 0xc0, 0x0c, 0x09, 0x26, 0x1e, 0x9f, 0x71)
+struct efi_driver_binding_protocol {
+       efi_status_t (EFIAPI * supported)(
+                       struct efi_driver_binding_protocol *this,
+                       efi_handle_t controller_handle,
+                       struct efi_device_path *remaining_device_path);
+       efi_status_t (EFIAPI * start)(
+                       struct efi_driver_binding_protocol *this,
+                       efi_handle_t controller_handle,
+                       struct efi_device_path *remaining_device_path);
+       efi_status_t (EFIAPI * stop)(
+                       struct efi_driver_binding_protocol *this,
+                       efi_handle_t controller_handle,
+                       efi_uintn_t number_of_children,
+                       efi_handle_t *child_handle_buffer);
+       u32 version;
+       efi_handle_t image_handle;
+       efi_handle_t driver_binding_handle;
+};
+
 #endif
diff --git a/include/efi_driver.h b/include/efi_driver.h
new file mode 100644 (file)
index 0000000..2bbe26c
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ *  EFI application loader
+ *
+ *  Copyright (c) 2017 Heinrich Schuchardt
+ *
+ *  SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#ifndef _EFI_DRIVER_H
+#define _EFI_DRIVER_H 1
+
+#include <common.h>
+#include <dm.h>
+#include <efi_loader.h>
+
+struct efi_driver_ops {
+       const efi_guid_t *protocol;
+       const efi_guid_t *child_protocol;
+       int (*bind)(efi_handle_t handle, void *interface);
+};
+
+/*
+ * This structure adds internal fields to the driver binding protocol.
+ */
+struct efi_driver_binding_extended_protocol {
+       struct efi_driver_binding_protocol bp;
+       const struct efi_driver_ops *ops;
+};
+
+#endif /* _EFI_DRIVER_H */
index 6185055e78e8fe11e6ff43a97807fd9090748947..21c03c5c28f88560f4932feff51be25edcda7277 100644 (file)
@@ -69,10 +69,11 @@ const char *__efi_nesting_dec(void);
        } while(0)
 
 /*
- * Write GUID
+ * Write an indented message with EFI prefix
  */
-#define EFI_PRINT_GUID(txt, guid) ({ \
-       debug("%sEFI: %s %pUl\n", __efi_nesting(), txt, guid); \
+#define EFI_PRINT(format, ...) ({ \
+       debug("%sEFI: " format, __efi_nesting(), \
+               ##__VA_ARGS__); \
        })
 
 extern struct efi_runtime_services efi_runtime_services;
@@ -85,9 +86,13 @@ extern const struct efi_device_path_to_text_protocol efi_device_path_to_text;
 
 uint16_t *efi_dp_str(struct efi_device_path *dp);
 
+/* GUID of the EFI_BLOCK_IO_PROTOCOL */
+extern const efi_guid_t efi_block_io_guid;
 extern const efi_guid_t efi_global_variable_guid;
 extern const efi_guid_t efi_guid_console_control;
 extern const efi_guid_t efi_guid_device_path;
+/* GUID of the EFI_DRIVER_BINDING_PROTOCOL */
+extern const efi_guid_t efi_guid_driver_binding_protocol;
 extern const efi_guid_t efi_guid_loaded_image;
 extern const efi_guid_t efi_guid_device_path_to_text_protocol;
 extern const efi_guid_t efi_simple_file_system_protocol_guid;
@@ -96,15 +101,28 @@ extern const efi_guid_t efi_file_info_guid;
 extern unsigned int __efi_runtime_start, __efi_runtime_stop;
 extern unsigned int __efi_runtime_rel_start, __efi_runtime_rel_stop;
 
+/*
+ * When a protocol is opened a open protocol info entry is created.
+ * These are maintained in a list.
+ */
+struct efi_open_protocol_info_item {
+       /* Link to the list of open protocol info entries of a protocol */
+       struct list_head link;
+       struct efi_open_protocol_info_entry info;
+};
+
 /*
  * When the UEFI payload wants to open a protocol on an object to get its
  * interface (usually a struct with callback functions), this struct maps the
- * protocol GUID to the respective protocol interface */
+ * protocol GUID to the respective protocol interface
+ */
 struct efi_handler {
        /* Link to the list of protocols of a handle */
        struct list_head link;
        const efi_guid_t *guid;
        void *protocol_interface;
+       /* Link to the list of open protocol info items */
+       struct list_head open_infos;
 };
 
 /*
@@ -156,6 +174,10 @@ extern struct list_head efi_obj_list;
 int efi_console_register(void);
 /* Called by bootefi to make all disk storage accessible as EFI objects */
 int efi_disk_register(void);
+/* Create handles and protocols for the partitions of a block device */
+int efi_disk_create_partitions(efi_handle_t parent, struct blk_desc *desc,
+                              const char *if_typename, int diskid,
+                              const char *pdevname);
 /* Called by bootefi to make GOP (graphical) interface available */
 int efi_gop_register(void);
 /* Called by bootefi to make the network interface available */
@@ -189,23 +211,25 @@ void efi_set_bootdev(const char *dev, const char *devnr, const char *path);
 /* Add a new object to the object list. */
 void efi_add_handle(struct efi_object *obj);
 /* Create handle */
-efi_status_t efi_create_handle(void **handle);
+efi_status_t efi_create_handle(efi_handle_t *handle);
 /* Delete handle */
 void efi_delete_handle(struct efi_object *obj);
 /* Call this to validate a handle and find the EFI object for it */
-struct efi_object *efi_search_obj(const void *handle);
+struct efi_object *efi_search_obj(const efi_handle_t handle);
 /* Find a protocol on a handle */
-efi_status_t efi_search_protocol(const void *handle,
+efi_status_t efi_search_protocol(const efi_handle_t handle,
                                 const efi_guid_t *protocol_guid,
                                 struct efi_handler **handler);
 /* Install new protocol on a handle */
-efi_status_t efi_add_protocol(const void *handle, const efi_guid_t *protocol,
+efi_status_t efi_add_protocol(const efi_handle_t handle,
+                             const efi_guid_t *protocol,
                              void *protocol_interface);
 /* Delete protocol from a handle */
-efi_status_t efi_remove_protocol(const void *handle, const efi_guid_t *protocol,
+efi_status_t efi_remove_protocol(const efi_handle_t handle,
+                                const efi_guid_t *protocol,
                                 void *protocol_interface);
 /* Delete all protocols from a handle */
-efi_status_t efi_remove_all_protocols(const void *handle);
+efi_status_t efi_remove_all_protocols(const efi_handle_t handle);
 /* Call this to create an event */
 efi_status_t efi_create_event(uint32_t type, efi_uintn_t notify_tpl,
                              void (EFIAPI *notify_function) (
@@ -216,7 +240,7 @@ efi_status_t efi_create_event(uint32_t type, efi_uintn_t notify_tpl,
 efi_status_t efi_set_timer(struct efi_event *event, enum efi_timer_delay type,
                           uint64_t trigger_time);
 /* Call this to signal an event */
-void efi_signal_event(struct efi_event *event);
+void efi_signal_event(struct efi_event *event, bool check_tpl);
 
 /* open file system: */
 struct efi_simple_file_system_protocol *efi_simple_file_system(
@@ -247,6 +271,8 @@ efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size,
 /* Adds a range into the EFI memory map */
 uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
                            bool overlap_only_ram);
+/* Called by board init to initialize the EFI drivers */
+int efi_driver_init(void);
 /* Called by board init to initialize the EFI memory map */
 int efi_memory_init(void);
 /* Adds new or overrides configuration table entry to the system table */
@@ -280,15 +306,20 @@ struct efi_device_path *efi_dp_append_node(const struct efi_device_path *dp,
 
 struct efi_device_path *efi_dp_from_dev(struct udevice *dev);
 struct efi_device_path *efi_dp_from_part(struct blk_desc *desc, int part);
+/* Create a device node for a block device partition. */
+struct efi_device_path *efi_dp_part_node(struct blk_desc *desc, int part);
 struct efi_device_path *efi_dp_from_file(struct blk_desc *desc, int part,
                                         const char *path);
 struct efi_device_path *efi_dp_from_eth(void);
 struct efi_device_path *efi_dp_from_mem(uint32_t mem_type,
                                        uint64_t start_address,
                                        uint64_t end_address);
-void efi_dp_split_file_path(struct efi_device_path *full_path,
-                           struct efi_device_path **device_path,
-                           struct efi_device_path **file_path);
+/* Determine the last device path node that is not the end node. */
+const struct efi_device_path *efi_dp_last_node(
+                       const struct efi_device_path *dp);
+efi_status_t efi_dp_split_file_path(struct efi_device_path *full_path,
+                                   struct efi_device_path **device_path,
+                                   struct efi_device_path **file_path);
 
 #define EFI_DP_TYPE(_dp, _type, _subtype) \
        (((_dp)->type == DEVICE_PATH_TYPE_##_type) && \
index be5ba4bfa91ccc0b8eca88cda6d06c42a3737f3f..08dd8e43ad1c1ec4f829257f68914cef2c294df5 100644 (file)
 #define EFI_ST_SUCCESS 0
 #define EFI_ST_FAILURE 1
 
+/*
+ * Prints a message.
+ */
+#define efi_st_printf(...) \
+       (efi_st_printc(-1, __VA_ARGS__))
+
 /*
  * Prints an error message.
  *
  * @...        format string followed by fields to print
  */
 #define efi_st_error(...) \
-       (efi_st_printf("%s(%u):\nERROR: ", __FILE__, __LINE__), \
-       efi_st_printf(__VA_ARGS__)) \
+       (efi_st_printc(EFI_LIGHTRED, "%s(%u):\nERROR: ", __FILE__, __LINE__), \
+       efi_st_printc(EFI_LIGHTRED, __VA_ARGS__))
 
 /*
  * Prints a TODO message.
@@ -33,8 +39,8 @@
  * @...        format string followed by fields to print
  */
 #define efi_st_todo(...) \
-       (efi_st_printf("%s(%u):\nTODO: ", __FILE__, __LINE__), \
-       efi_st_printf(__VA_ARGS__)) \
+       (efi_st_printc(EFI_YELLOW, "%s(%u):\nTODO: ", __FILE__, __LINE__), \
+       efi_st_printc(EFI_YELLOW, __VA_ARGS__)) \
 
 /*
  * A test may be setup and executed at boottime,
@@ -61,14 +67,15 @@ extern struct efi_simple_input_interface *con_in;
 void efi_st_exit_boot_services(void);
 
 /*
- * Print a pointer to an u16 string
+ * Print a colored message
  *
- * @pointer: pointer
- * @buf: pointer to buffer address
- * on return position of terminating zero word
+ * @color      color, see constants in efi_api.h, use -1 for no color
+ * @fmt                printf format
+ * @...                arguments to be printed
+ *             on return position of terminating zero word
  */
-void efi_st_printf(const char *fmt, ...)
-                __attribute__ ((format (__printf__, 1, 2)));
+void efi_st_printc(int color, const char *fmt, ...)
+                __attribute__ ((format (__printf__, 2, 3)));
 
 /*
  * Compare memory.
index bdeda95e6debebad99523451efdcc14f584d7e44..fa956441c659504d247d0a9ff9860946c7fac479 100644 (file)
@@ -13,7 +13,6 @@
 #include <asm/byteorder.h>
 #include <fs.h>
 
-#define CONFIG_SUPPORT_VFAT
 /* Maximum Long File Name length supported here is 128 UTF-16 code units */
 #define VFAT_MAXLEN_BYTES      256 /* Maximum LFN buffer in bytes */
 #define VFAT_MAXSEQ            9   /* Up to 9 of 13 2-byte UTF-16 entries */
index 8cd779f8cad16d43d27084ade912b86bb5786880..0db41c19f379f1209a5eaf622d8f1867e5655e5b 100644 (file)
@@ -8,6 +8,7 @@
 ifndef CONFIG_SPL_BUILD
 
 obj-$(CONFIG_EFI) += efi/
+obj-$(CONFIG_EFI_LOADER) += efi_driver/
 obj-$(CONFIG_EFI_LOADER) += efi_loader/
 obj-$(CONFIG_EFI_LOADER) += efi_selftest/
 obj-$(CONFIG_LZMA) += lzma/
diff --git a/lib/efi_driver/Makefile b/lib/efi_driver/Makefile
new file mode 100644 (file)
index 0000000..e35529a
--- /dev/null
@@ -0,0 +1,13 @@
+#
+# (C) Copyright 2017 Heinrich Schuchardt
+#
+#  SPDX-License-Identifier:     GPL-2.0+
+#
+
+# This file only gets included with CONFIG_EFI_LOADER set, so all
+# object inclusion implicitly depends on it
+
+obj-y += efi_uclass.o
+ifeq ($(CONFIG_BLK)$(CONFIG_PARTITIONS),yy)
+obj-y += efi_block_device.o
+endif
diff --git a/lib/efi_driver/efi_block_device.c b/lib/efi_driver/efi_block_device.c
new file mode 100644 (file)
index 0000000..d9d2b14
--- /dev/null
@@ -0,0 +1,210 @@
+/*
+ *  EFI block driver
+ *
+ *  Copyright (c) 2017 Heinrich Schuchardt
+ *
+ *  SPDX-License-Identifier:     GPL-2.0+
+ *
+ * The EFI uclass creates a handle for this driver and installs the
+ * driver binding protocol on it.
+ *
+ * The EFI block driver binds to controllers implementing the block io
+ * protocol.
+ *
+ * When the bind function of the EFI block driver is called it creates a
+ * new U-Boot block device. It installs child handles for all partitions and
+ * installs the simple file protocol on these.
+ *
+ * The read and write functions of the EFI block driver delegate calls to the
+ * controller that it is bound to.
+ *
+ * A usage example is as following:
+ *
+ * U-Boot loads the iPXE snp.efi executable. iPXE connects an iSCSI drive and
+ * exposes a handle with the block IO protocol. It calls ConnectController.
+ *
+ * Now the EFI block driver installs the partitions with the simple file
+ * protocol.
+ *
+ * iPXE uses the simple file protocol to load Grub or the Linux Kernel.
+ */
+
+#include <efi_driver.h>
+#include <dm/device-internal.h>
+#include <dm/root.h>
+
+/*
+ * EFI attributes of the udevice handled by this driver.
+ *
+ * handle      handle of the controller on which this driver is installed
+ * io          block io protocol proxied by this driver
+ */
+struct efi_blk_priv {
+       efi_handle_t            handle;
+       struct efi_block_io     *io;
+};
+
+/*
+ * Read from block device
+ *
+ * @dev                device
+ * @blknr      first block to be read
+ * @blkcnt     number of blocks to read
+ * @buffer     output buffer
+ * @return     number of blocks transferred
+ */
+static ulong efi_bl_read(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt,
+                        void *buffer)
+{
+       struct efi_blk_priv *priv = dev->priv;
+       struct efi_block_io *io = priv->io;
+       efi_status_t ret;
+
+       EFI_PRINT("%s: read '%s', from block " LBAFU ", " LBAFU " blocks\n",
+                 __func__, dev->name, blknr, blkcnt);
+       ret = EFI_CALL(io->read_blocks(
+                               io, io->media->media_id, (u64)blknr,
+                               (efi_uintn_t)blkcnt *
+                               (efi_uintn_t)io->media->block_size, buffer));
+       EFI_PRINT("%s: r = %u\n", __func__,
+                 (unsigned int)(ret & ~EFI_ERROR_MASK));
+       if (ret != EFI_SUCCESS)
+               return 0;
+       return blkcnt;
+}
+
+/*
+ * Write to block device
+ *
+ * @dev                device
+ * @blknr      first block to be write
+ * @blkcnt     number of blocks to write
+ * @buffer     input buffer
+ * @return     number of blocks transferred
+ */
+static ulong efi_bl_write(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt,
+                         const void *buffer)
+{
+       struct efi_blk_priv *priv = dev->priv;
+       struct efi_block_io *io = priv->io;
+       efi_status_t ret;
+
+       EFI_PRINT("%s: write '%s', from block " LBAFU ", " LBAFU " blocks\n",
+                 __func__, dev->name, blknr, blkcnt);
+       ret = EFI_CALL(io->write_blocks(
+                               io, io->media->media_id, (u64)blknr,
+                               (efi_uintn_t)blkcnt *
+                               (efi_uintn_t)io->media->block_size,
+                               (void *)buffer));
+       EFI_PRINT("%s: r = %u\n", __func__,
+                 (unsigned int)(ret & ~EFI_ERROR_MASK));
+       if (ret != EFI_SUCCESS)
+               return 0;
+       return blkcnt;
+}
+
+/*
+ * Create partions for the block device.
+ *
+ * @handle     EFI handle of the block device
+ * @dev                udevice of the block device
+ */
+static int efi_bl_bind_partitions(efi_handle_t handle, struct udevice *dev)
+{
+       struct blk_desc *desc;
+       const char *if_typename;
+
+       desc = dev_get_uclass_platdata(dev);
+       if_typename = blk_get_if_type_name(desc->if_type);
+
+       return efi_disk_create_partitions(handle, desc, if_typename,
+                                         desc->devnum, dev->name);
+}
+
+/*
+ * Create a block device for a handle
+ *
+ * @handle     handle
+ * @interface  block io protocol
+ * @return     0 = success
+ */
+static int efi_bl_bind(efi_handle_t handle, void *interface)
+{
+       struct udevice *bdev, *parent = dm_root();
+       int ret, devnum;
+       char *name;
+       struct efi_object *obj = efi_search_obj(handle);
+       struct efi_block_io *io = interface;
+       int disks;
+       struct efi_blk_priv *priv;
+
+       EFI_PRINT("%s: handle %p, interface %p\n", __func__, handle, io);
+
+       if (!obj)
+               return -ENOENT;
+
+       devnum = blk_find_max_devnum(IF_TYPE_EFI);
+       if (devnum == -ENODEV)
+               devnum = 0;
+       else if (devnum < 0)
+               return devnum;
+
+       name = calloc(1, 18); /* strlen("efiblk#2147483648") + 1 */
+       if (!name)
+               return -ENOMEM;
+       sprintf(name, "efiblk#%d", devnum);
+
+       /* Create driver model udevice for the EFI block io device */
+       ret = blk_create_device(parent, "efi_blk", name, IF_TYPE_EFI, devnum,
+                               io->media->block_size,
+                               (lbaint_t)io->media->last_block, &bdev);
+       if (ret)
+               return ret;
+       if (!bdev)
+               return -ENOENT;
+       /* Allocate priv */
+       ret = device_probe(bdev);
+       if (ret)
+               return ret;
+       EFI_PRINT("%s: block device '%s' created\n", __func__, bdev->name);
+
+       priv = bdev->priv;
+       priv->handle = handle;
+       priv->io = interface;
+
+       ret = blk_prepare_device(bdev);
+
+       /* Create handles for the partions of the block device */
+       disks = efi_bl_bind_partitions(handle, bdev);
+       EFI_PRINT("Found %d partitions\n", disks);
+
+       return 0;
+}
+
+/* Block device driver operators */
+static const struct blk_ops efi_blk_ops = {
+       .read   = efi_bl_read,
+       .write  = efi_bl_write,
+};
+
+/* Identify as block device driver */
+U_BOOT_DRIVER(efi_blk) = {
+       .name                   = "efi_blk",
+       .id                     = UCLASS_BLK,
+       .ops                    = &efi_blk_ops,
+       .priv_auto_alloc_size   = sizeof(struct efi_blk_priv),
+};
+
+/* EFI driver operators */
+static const struct efi_driver_ops driver_ops = {
+       .protocol       = &efi_block_io_guid,
+       .child_protocol = &efi_block_io_guid,
+       .bind           = efi_bl_bind,
+};
+
+/* Identify as EFI driver */
+U_BOOT_DRIVER(efi_block) = {
+       .name           = "EFI block driver",
+       .id             = UCLASS_EFI,
+       .ops            = &driver_ops,
+};
diff --git a/lib/efi_driver/efi_uclass.c b/lib/efi_driver/efi_uclass.c
new file mode 100644 (file)
index 0000000..90797f9
--- /dev/null
@@ -0,0 +1,330 @@
+/*
+ *  Uclass for EFI drivers
+ *
+ *  Copyright (c) 2017 Heinrich Schuchardt
+ *
+ *  SPDX-License-Identifier:     GPL-2.0+
+ *
+ * For each EFI driver the uclass
+ * - creates a handle
+ * - installs the driver binding protocol
+ *
+ * The uclass provides the bind, start, and stop entry points for the driver
+ * binding protocol.
+ *
+ * In bind() and stop() it checks if the controller implements the protocol
+ * supported by the EFI driver. In the start() function it calls the bind()
+ * function of the EFI driver. In the stop() function it destroys the child
+ * controllers.
+ */
+
+#include <efi_driver.h>
+
+/*
+ * Check node type. We do not support partitions as controller handles.
+ *
+ * @handle     handle to be checked
+ * @return     status code
+ */
+static efi_status_t check_node_type(efi_handle_t handle)
+{
+       efi_status_t r, ret = EFI_SUCCESS;
+       const struct efi_device_path *dp;
+
+       /* Open the device path protocol */
+       r = EFI_CALL(systab.boottime->open_protocol(
+                       handle, &efi_guid_device_path, (void **)&dp,
+                       NULL, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL));
+       if (r == EFI_SUCCESS && dp) {
+               /* Get the last node */
+               const struct efi_device_path *node = efi_dp_last_node(dp);
+               /* We do not support partitions as controller */
+               if (!node || node->type == DEVICE_PATH_TYPE_MEDIA_DEVICE)
+                       ret = EFI_UNSUPPORTED;
+       }
+       return ret;
+}
+
+/*
+ * Check if the driver supports the controller.
+ *
+ * @this                       driver binding protocol
+ * @controller_handle          handle of the controller
+ * @remaining_device_path      path specifying the child controller
+ * @return                     status code
+ */
+static efi_status_t EFIAPI efi_uc_supported(
+               struct efi_driver_binding_protocol *this,
+               efi_handle_t controller_handle,
+               struct efi_device_path *remaining_device_path)
+{
+       efi_status_t r, ret;
+       void *interface;
+       struct efi_driver_binding_extended_protocol *bp =
+                       (struct efi_driver_binding_extended_protocol *)this;
+
+       EFI_ENTRY("%p, %p, %ls", this, controller_handle,
+                 efi_dp_str(remaining_device_path));
+
+       ret = EFI_CALL(systab.boottime->open_protocol(
+                       controller_handle, bp->ops->protocol,
+                       &interface, this->driver_binding_handle,
+                       controller_handle, EFI_OPEN_PROTOCOL_BY_DRIVER));
+       switch (ret) {
+       case EFI_ACCESS_DENIED:
+       case EFI_ALREADY_STARTED:
+               goto out;
+       case EFI_SUCCESS:
+               break;
+       default:
+               ret = EFI_UNSUPPORTED;
+               goto out;
+       }
+
+       ret = check_node_type(controller_handle);
+
+       r = EFI_CALL(systab.boottime->close_protocol(
+                               controller_handle, bp->ops->protocol,
+                               this->driver_binding_handle,
+                               controller_handle));
+       if (r != EFI_SUCCESS)
+               ret = EFI_UNSUPPORTED;
+out:
+       return EFI_EXIT(ret);
+}
+
+/*
+ * Create child controllers and attach driver.
+ *
+ * @this                       driver binding protocol
+ * @controller_handle          handle of the controller
+ * @remaining_device_path      path specifying the child controller
+ * @return                     status code
+ */
+static efi_status_t EFIAPI efi_uc_start(
+               struct efi_driver_binding_protocol *this,
+               efi_handle_t controller_handle,
+               struct efi_device_path *remaining_device_path)
+{
+       efi_status_t r, ret;
+       void *interface = NULL;
+       struct efi_driver_binding_extended_protocol *bp =
+                       (struct efi_driver_binding_extended_protocol *)this;
+
+       EFI_ENTRY("%p, %pUl, %ls", this, controller_handle,
+                 efi_dp_str(remaining_device_path));
+
+       /* Attach driver to controller */
+       ret = EFI_CALL(systab.boottime->open_protocol(
+                       controller_handle, bp->ops->protocol,
+                       &interface, this->driver_binding_handle,
+                       controller_handle, EFI_OPEN_PROTOCOL_BY_DRIVER));
+       switch (ret) {
+       case EFI_ACCESS_DENIED:
+       case EFI_ALREADY_STARTED:
+               goto out;
+       case EFI_SUCCESS:
+               break;
+       default:
+               ret =  EFI_UNSUPPORTED;
+               goto out;
+       }
+       ret = check_node_type(controller_handle);
+       if (ret != EFI_SUCCESS) {
+               r = EFI_CALL(systab.boottime->close_protocol(
+                               controller_handle, bp->ops->protocol,
+                               this->driver_binding_handle,
+                               controller_handle));
+               if (r != EFI_SUCCESS)
+                       EFI_PRINT("Failure to close handle\n");
+               goto out;
+       }
+
+       /* TODO: driver specific stuff */
+       bp->ops->bind(controller_handle, interface);
+
+out:
+       return EFI_EXIT(ret);
+}
+
+/*
+ * Remove a single child controller from the parent controller.
+ *
+ * @controller_handle  parent controller
+ * @child_handle       child controller
+ * @return             status code
+ */
+static efi_status_t disconnect_child(efi_handle_t controller_handle,
+                                    efi_handle_t child_handle)
+{
+       efi_status_t ret;
+       efi_guid_t *guid_controller = NULL;
+       efi_guid_t *guid_child_controller = NULL;
+
+       ret = EFI_CALL(systab.boottime->close_protocol(
+                               controller_handle, guid_controller,
+                               child_handle, child_handle));
+       if (ret != EFI_SUCCESS) {
+               EFI_PRINT("Cannot close protocol\n");
+               return ret;
+       }
+       ret = EFI_CALL(systab.boottime->uninstall_protocol_interface(
+                               child_handle, guid_child_controller, NULL));
+       if (ret != EFI_SUCCESS) {
+               EFI_PRINT("Cannot uninstall protocol interface\n");
+               return ret;
+       }
+       return ret;
+}
+
+/*
+ * Remove child controllers and disconnect the controller.
+ *
+ * @this                       driver binding protocol
+ * @controller_handle          handle of the controller
+ * @number_of_children         number of child controllers to remove
+ * @child_handle_buffer                handles of the child controllers to remove
+ * @return                     status code
+ */
+static efi_status_t EFIAPI efi_uc_stop(
+               struct efi_driver_binding_protocol *this,
+               efi_handle_t controller_handle,
+               size_t number_of_children,
+               efi_handle_t *child_handle_buffer)
+{
+       efi_status_t ret;
+       efi_uintn_t count;
+       struct efi_open_protocol_info_entry *entry_buffer;
+       efi_guid_t *guid_controller = NULL;
+
+       EFI_ENTRY("%p, %pUl, %zu, %p", this, controller_handle,
+                 number_of_children, child_handle_buffer);
+
+       /* Destroy provided child controllers */
+       if (number_of_children) {
+               efi_uintn_t i;
+
+               for (i = 0; i < number_of_children; ++i) {
+                       ret = disconnect_child(controller_handle,
+                                              child_handle_buffer[i]);
+                       if (ret != EFI_SUCCESS)
+                               return ret;
+               }
+               return EFI_SUCCESS;
+       }
+
+       /* Destroy all children */
+       ret = EFI_CALL(systab.boottime->open_protocol_information(
+                                       controller_handle, guid_controller,
+                                       &entry_buffer, &count));
+       if (ret != EFI_SUCCESS)
+               goto out;
+       while (count) {
+               if (entry_buffer[--count].attributes &
+                   EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {
+                       ret = disconnect_child(
+                                       controller_handle,
+                                       entry_buffer[count].agent_handle);
+                       if (ret != EFI_SUCCESS)
+                               goto out;
+               }
+       }
+       ret = EFI_CALL(systab.boottime->free_pool(entry_buffer));
+       if (ret != EFI_SUCCESS)
+               printf("%s(%u) %s: ERROR: Cannot free pool\n",
+                      __FILE__, __LINE__, __func__);
+
+       /* Detach driver from controller */
+       ret = EFI_CALL(systab.boottime->close_protocol(
+                       controller_handle, guid_controller,
+                       this->driver_binding_handle, controller_handle));
+out:
+       return EFI_EXIT(ret);
+}
+
+static efi_status_t efi_add_driver(struct driver *drv)
+{
+       efi_status_t ret;
+       const struct efi_driver_ops *ops = drv->ops;
+       struct efi_driver_binding_extended_protocol *bp;
+
+       debug("EFI: Adding driver '%s'\n", drv->name);
+       if (!ops->protocol) {
+               printf("EFI: ERROR: protocol GUID missing for driver '%s'\n",
+                      drv->name);
+               return EFI_INVALID_PARAMETER;
+       }
+       bp = calloc(1, sizeof(struct efi_driver_binding_extended_protocol));
+       if (!bp)
+               return EFI_OUT_OF_RESOURCES;
+
+       bp->bp.supported = efi_uc_supported;
+       bp->bp.start = efi_uc_start;
+       bp->bp.stop = efi_uc_stop;
+       bp->bp.version = 0xffffffff;
+       bp->ops = drv->ops;
+
+       ret = efi_create_handle(&bp->bp.driver_binding_handle);
+       if (ret != EFI_SUCCESS) {
+               free(bp);
+               goto out;
+       }
+       bp->bp.image_handle = bp->bp.driver_binding_handle;
+       ret = efi_add_protocol(bp->bp.driver_binding_handle,
+                              &efi_guid_driver_binding_protocol, bp);
+       if (ret != EFI_SUCCESS) {
+               efi_delete_handle(bp->bp.driver_binding_handle);
+               free(bp);
+               goto out;
+       }
+out:
+       return ret;
+}
+
+/*
+ * Initialize the EFI drivers.
+ * Called by board_init_r().
+ *
+ * @return     0 = success, any other value will stop further execution
+ */
+int efi_driver_init(void)
+{
+       struct driver *drv;
+       int ret = 0;
+
+       /* Save 'gd' pointer */
+       efi_save_gd();
+
+       debug("EFI: Initializing EFI driver framework\n");
+       for (drv = ll_entry_start(struct driver, driver);
+            drv < ll_entry_end(struct driver, driver); ++drv) {
+               if (drv->id == UCLASS_EFI) {
+                       ret = efi_add_driver(drv);
+                       if (ret) {
+                               printf("EFI: ERROR: failed to add driver %s\n",
+                                      drv->name);
+                               break;
+                       }
+               }
+       }
+       return ret;
+}
+
+static int efi_uc_init(struct uclass *class)
+{
+       printf("EFI: Initializing UCLASS_EFI\n");
+       return 0;
+}
+
+static int efi_uc_destroy(struct uclass *class)
+{
+       printf("Destroying  UCLASS_EFI\n");
+       return 0;
+}
+
+UCLASS_DRIVER(efi) = {
+       .name           = "efi",
+       .id             = UCLASS_EFI,
+       .init           = efi_uc_init,
+       .destroy        = efi_uc_destroy,
+};
index b90bd0b426f8bc50530e6291114ae4b4e4f6216b..39d8511fe383bb1f06523a6f52b98c05d31782c9 100644 (file)
@@ -56,6 +56,14 @@ static volatile void *efi_gd, *app_gd;
 
 static int entry_count;
 static int nesting_level;
+/* GUID of the EFI_DRIVER_BINDING_PROTOCOL */
+const efi_guid_t efi_guid_driver_binding_protocol =
+                       EFI_DRIVER_BINDING_PROTOCOL_GUID;
+
+static efi_status_t EFIAPI efi_disconnect_controller(
+                                       efi_handle_t controller_handle,
+                                       efi_handle_t driver_image_handle,
+                                       efi_handle_t child_handle);
 
 /* Called on every callback entry */
 int __efi_entry_check(void)
@@ -141,13 +149,14 @@ const char *__efi_nesting_dec(void)
  * For the SignalEvent service see efi_signal_event_ext.
  *
  * @event      event to signal
+ * @check_tpl  check the TPL level
  */
-void efi_signal_event(struct efi_event *event)
+void efi_signal_event(struct efi_event *event, bool check_tpl)
 {
        if (event->notify_function) {
                event->is_queued = true;
                /* Check TPL */
-               if (efi_tpl >= event->notify_tpl)
+               if (check_tpl && efi_tpl >= event->notify_tpl)
                        return;
                EFI_CALL_VOID(event->notify_function(event,
                                                     event->notify_context));
@@ -344,7 +353,7 @@ void efi_add_handle(struct efi_object *obj)
  * @handle     new handle
  * @return     status code
  */
-efi_status_t efi_create_handle(void **handle)
+efi_status_t efi_create_handle(efi_handle_t *handle)
 {
        struct efi_object *obj;
        efi_status_t r;
@@ -367,7 +376,7 @@ efi_status_t efi_create_handle(void **handle)
  * @handler            reference to the protocol
  * @return             status code
  */
-efi_status_t efi_search_protocol(const void *handle,
+efi_status_t efi_search_protocol(const efi_handle_t handle,
                                 const efi_guid_t *protocol_guid,
                                 struct efi_handler **handler)
 {
@@ -400,7 +409,8 @@ efi_status_t efi_search_protocol(const void *handle,
  * @protocol_interface         interface of the protocol implementation
  * @return                     status code
  */
-efi_status_t efi_remove_protocol(const void *handle, const efi_guid_t *protocol,
+efi_status_t efi_remove_protocol(const efi_handle_t handle,
+                                const efi_guid_t *protocol,
                                 void *protocol_interface)
 {
        struct efi_handler *handler;
@@ -422,21 +432,18 @@ efi_status_t efi_remove_protocol(const void *handle, const efi_guid_t *protocol,
  * @handle     handle from which the protocols shall be deleted
  * @return     status code
  */
-efi_status_t efi_remove_all_protocols(const void *handle)
+efi_status_t efi_remove_all_protocols(const efi_handle_t handle)
 {
        struct efi_object *efiobj;
-       struct list_head *lhandle;
-       struct list_head *pos;
+       struct efi_handler *protocol;
+       struct efi_handler *pos;
 
        efiobj = efi_search_obj(handle);
        if (!efiobj)
                return EFI_INVALID_PARAMETER;
-       list_for_each_safe(lhandle, pos, &efiobj->protocols) {
-               struct efi_handler *protocol;
+       list_for_each_entry_safe(protocol, pos, &efiobj->protocols, link) {
                efi_status_t ret;
 
-               protocol = list_entry(lhandle, struct efi_handler, link);
-
                ret = efi_remove_protocol(handle, protocol->guid,
                                          protocol->protocol_interface);
                if (ret != EFI_SUCCESS)
@@ -559,7 +566,7 @@ void efi_timer_check(void)
                if (!efi_events[i].type)
                        continue;
                if (efi_events[i].is_queued)
-                       efi_signal_event(&efi_events[i]);
+                       efi_signal_event(&efi_events[i], true);
                if (!(efi_events[i].type & EVT_TIMER) ||
                    now < efi_events[i].trigger_next)
                        continue;
@@ -575,7 +582,7 @@ void efi_timer_check(void)
                        continue;
                }
                efi_events[i].is_signaled = true;
-               efi_signal_event(&efi_events[i]);
+               efi_signal_event(&efi_events[i], true);
        }
        WATCHDOG_RESET();
 }
@@ -684,7 +691,7 @@ known_event:
                if (!event[i]->type || event[i]->type & EVT_NOTIFY_SIGNAL)
                        return EFI_EXIT(EFI_INVALID_PARAMETER);
                if (!event[i]->is_signaled)
-                       efi_signal_event(event[i]);
+                       efi_signal_event(event[i], true);
        }
 
        /* Wait for signal */
@@ -734,7 +741,7 @@ static efi_status_t EFIAPI efi_signal_event_ext(struct efi_event *event)
                        break;
                event->is_signaled = true;
                if (event->type & EVT_NOTIFY_SIGNAL)
-                       efi_signal_event(event);
+                       efi_signal_event(event, true);
                break;
        }
        return EFI_EXIT(EFI_SUCCESS);
@@ -791,7 +798,7 @@ static efi_status_t EFIAPI efi_check_event(struct efi_event *event)
                if (!event->type || event->type & EVT_NOTIFY_SIGNAL)
                        break;
                if (!event->is_signaled)
-                       efi_signal_event(event);
+                       efi_signal_event(event, true);
                if (event->is_signaled)
                        return EFI_EXIT(EFI_SUCCESS);
                return EFI_EXIT(EFI_NOT_READY);
@@ -805,7 +812,7 @@ static efi_status_t EFIAPI efi_check_event(struct efi_event *event)
  * @handle     handle to find
  * @return     EFI object
  */
-struct efi_object *efi_search_obj(const void *handle)
+struct efi_object *efi_search_obj(const efi_handle_t handle)
 {
        struct efi_object *efiobj;
 
@@ -817,6 +824,40 @@ struct efi_object *efi_search_obj(const void *handle)
        return NULL;
 }
 
+/*
+ * Create open protocol info entry and add it to a protocol.
+ *
+ * @handler    handler of a protocol
+ * @return     open protocol info entry
+ */
+static struct efi_open_protocol_info_entry *efi_create_open_info(
+                       struct efi_handler *handler)
+{
+       struct efi_open_protocol_info_item *item;
+
+       item = calloc(1, sizeof(struct efi_open_protocol_info_item));
+       if (!item)
+               return NULL;
+       /* Append the item to the open protocol info list. */
+       list_add_tail(&item->link, &handler->open_infos);
+
+       return &item->info;
+}
+
+/*
+ * Remove an open protocol info entry from a protocol.
+ *
+ * @handler    handler of a protocol
+ * @return     status code
+ */
+static efi_status_t efi_delete_open_info(
+                       struct efi_open_protocol_info_item *item)
+{
+       list_del(&item->link);
+       free(item);
+       return EFI_SUCCESS;
+}
+
 /*
  * Install new protocol on a handle.
  *
@@ -825,7 +866,8 @@ struct efi_object *efi_search_obj(const void *handle)
  * @protocol_interface         interface of the protocol implementation
  * @return                     status code
  */
-efi_status_t efi_add_protocol(const void *handle, const efi_guid_t *protocol,
+efi_status_t efi_add_protocol(const efi_handle_t handle,
+                             const efi_guid_t *protocol,
                              void *protocol_interface)
 {
        struct efi_object *efiobj;
@@ -843,7 +885,10 @@ efi_status_t efi_add_protocol(const void *handle, const efi_guid_t *protocol,
                return EFI_OUT_OF_RESOURCES;
        handler->guid = protocol;
        handler->protocol_interface = protocol_interface;
+       INIT_LIST_HEAD(&handler->open_infos);
        list_add_tail(&handler->link, &efiobj->protocols);
+       if (!guidcmp(&efi_guid_device_path, protocol))
+               EFI_PRINT("installed device path '%pD'\n", protocol_interface);
        return EFI_SUCCESS;
 }
 
@@ -907,15 +952,118 @@ out:
  * @new_interface              interface to be installed
  * @return                     status code
  */
-static efi_status_t EFIAPI efi_reinstall_protocol_interface(void *handle,
-                       const efi_guid_t *protocol, void *old_interface,
-                       void *new_interface)
+static efi_status_t EFIAPI efi_reinstall_protocol_interface(
+                       efi_handle_t handle, const efi_guid_t *protocol,
+                       void *old_interface, void *new_interface)
 {
        EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, old_interface,
                  new_interface);
        return EFI_EXIT(EFI_ACCESS_DENIED);
 }
 
+/*
+ * Get all drivers associated to a controller.
+ * The allocated buffer has to be freed with free().
+ *
+ * @efiobj                     handle of the controller
+ * @protocol                   protocol guid (optional)
+ * @number_of_drivers          number of child controllers
+ * @driver_handle_buffer       handles of the the drivers
+ * @return                     status code
+ */
+static efi_status_t efi_get_drivers(struct efi_object *efiobj,
+                                   const efi_guid_t *protocol,
+                                   efi_uintn_t *number_of_drivers,
+                                   efi_handle_t **driver_handle_buffer)
+{
+       struct efi_handler *handler;
+       struct efi_open_protocol_info_item *item;
+       efi_uintn_t count = 0, i;
+       bool duplicate;
+
+       /* Count all driver associations */
+       list_for_each_entry(handler, &efiobj->protocols, link) {
+               if (protocol && guidcmp(handler->guid, protocol))
+                       continue;
+               list_for_each_entry(item, &handler->open_infos, link) {
+                       if (item->info.attributes &
+                           EFI_OPEN_PROTOCOL_BY_DRIVER)
+                               ++count;
+               }
+       }
+       /*
+        * Create buffer. In case of duplicate driver assignments the buffer
+        * will be too large. But that does not harm.
+        */
+       *number_of_drivers = 0;
+       *driver_handle_buffer = calloc(count, sizeof(efi_handle_t));
+       if (!*driver_handle_buffer)
+               return EFI_OUT_OF_RESOURCES;
+       /* Collect unique driver handles */
+       list_for_each_entry(handler, &efiobj->protocols, link) {
+               if (protocol && guidcmp(handler->guid, protocol))
+                       continue;
+               list_for_each_entry(item, &handler->open_infos, link) {
+                       if (item->info.attributes &
+                           EFI_OPEN_PROTOCOL_BY_DRIVER) {
+                               /* Check this is a new driver */
+                               duplicate = false;
+                               for (i = 0; i < *number_of_drivers; ++i) {
+                                       if ((*driver_handle_buffer)[i] ==
+                                           item->info.agent_handle)
+                                               duplicate = true;
+                               }
+                               /* Copy handle to buffer */
+                               if (!duplicate) {
+                                       i = (*number_of_drivers)++;
+                                       (*driver_handle_buffer)[i] =
+                                               item->info.agent_handle;
+                               }
+                       }
+               }
+       }
+       return EFI_SUCCESS;
+}
+
+/*
+ * Disconnect all drivers from a controller.
+ *
+ * This function implements the DisconnectController service.
+ * See the Unified Extensible Firmware Interface (UEFI) specification
+ * for details.
+ *
+ * @efiobj             handle of the controller
+ * @protocol           protocol guid (optional)
+ * @child_handle       handle of the child to destroy
+ * @return             status code
+ */
+static efi_status_t efi_disconnect_all_drivers(
+                               struct efi_object *efiobj,
+                               const efi_guid_t *protocol,
+                               efi_handle_t child_handle)
+{
+       efi_uintn_t number_of_drivers;
+       efi_handle_t *driver_handle_buffer;
+       efi_status_t r, ret;
+
+       ret = efi_get_drivers(efiobj, protocol, &number_of_drivers,
+                             &driver_handle_buffer);
+       if (ret != EFI_SUCCESS)
+               return ret;
+
+       ret = EFI_NOT_FOUND;
+       while (number_of_drivers) {
+               r = EFI_CALL(efi_disconnect_controller(
+                               efiobj->handle,
+                               driver_handle_buffer[--number_of_drivers],
+                               child_handle));
+               if (r == EFI_SUCCESS)
+                       ret = r;
+       }
+       free(driver_handle_buffer);
+       return ret;
+}
+
 /*
  * Uninstall protocol interface.
  *
@@ -929,29 +1077,46 @@ static efi_status_t EFIAPI efi_reinstall_protocol_interface(void *handle,
  * @return                     status code
  */
 static efi_status_t EFIAPI efi_uninstall_protocol_interface(
-                               void *handle, const efi_guid_t *protocol,
+                               efi_handle_t handle, const efi_guid_t *protocol,
                                void *protocol_interface)
 {
+       struct efi_object *efiobj;
        struct efi_handler *handler;
+       struct efi_open_protocol_info_item *item;
+       struct efi_open_protocol_info_item *pos;
        efi_status_t r;
 
        EFI_ENTRY("%p, %pUl, %p", handle, protocol, protocol_interface);
 
-       if (!handle || !protocol) {
+       /* Check handle */
+       efiobj = efi_search_obj(handle);
+       if (!efiobj) {
                r = EFI_INVALID_PARAMETER;
                goto out;
        }
-
        /* Find the protocol on the handle */
        r = efi_search_protocol(handle, protocol, &handler);
        if (r != EFI_SUCCESS)
                goto out;
-       if (handler->protocol_interface) {
-               /* TODO disconnect controllers */
+       /* Disconnect controllers */
+       efi_disconnect_all_drivers(efiobj, protocol, NULL);
+       if (!list_empty(&handler->open_infos)) {
                r =  EFI_ACCESS_DENIED;
-       } else {
-               r = efi_remove_protocol(handle, protocol, protocol_interface);
+               goto out;
+       }
+       /* Close protocol */
+       list_for_each_entry_safe(item, pos, &handler->open_infos, link) {
+               if (item->info.attributes ==
+                       EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL ||
+                   item->info.attributes == EFI_OPEN_PROTOCOL_GET_PROTOCOL ||
+                   item->info.attributes == EFI_OPEN_PROTOCOL_TEST_PROTOCOL)
+                       list_del(&item->link);
        }
+       if (!list_empty(&handler->open_infos)) {
+               r =  EFI_ACCESS_DENIED;
+               goto out;
+       }
+       r = efi_remove_protocol(handle, protocol, protocol_interface);
 out:
        return EFI_EXIT(r);
 }
@@ -1310,7 +1475,7 @@ static efi_status_t EFIAPI efi_load_image(bool boot_policy,
        struct efi_object *obj;
        efi_status_t ret;
 
-       EFI_ENTRY("%d, %p, %p, %p, %ld, %p", boot_policy, parent_image,
+       EFI_ENTRY("%d, %p, %pD, %p, %ld, %p", boot_policy, parent_image,
                  file_path, source_buffer, source_size, image_handle);
 
        info = calloc(1, sizeof(*info));
@@ -1369,8 +1534,10 @@ static efi_status_t EFIAPI efi_start_image(efi_handle_t image_handle,
                                           unsigned long *exit_data_size,
                                           s16 **exit_data)
 {
-       ulong (*entry)(void *image_handle, struct efi_system_table *st);
+       asmlinkage ulong (*entry)(efi_handle_t image_handle,
+                                 struct efi_system_table *st);
        struct efi_loaded_image *info = image_handle;
+       efi_status_t ret;
 
        EFI_ENTRY("%p, %p, %p", image_handle, exit_data_size, exit_data);
        entry = info->reserved;
@@ -1379,18 +1546,37 @@ static efi_status_t EFIAPI efi_start_image(efi_handle_t image_handle,
 
        /* call the image! */
        if (setjmp(&info->exit_jmp)) {
-               /* We returned from the child image */
+               /*
+                * We called the entry point of the child image with EFI_CALL
+                * in the lines below. The child image called the Exit() boot
+                * service efi_exit() which executed the long jump that brought
+                * us to the current line. This implies that the second half
+                * of the EFI_CALL macro has not been executed.
+                */
+#ifdef CONFIG_ARM
+               /*
+                * efi_exit() called efi_restore_gd(). We have to undo this
+                * otherwise __efi_entry_check() will put the wrong value into
+                * app_gd.
+                */
+               gd = app_gd;
+#endif
+               /*
+                * To get ready to call EFI_EXIT below we have to execute the
+                * missed out steps of EFI_CALL.
+                */
+               assert(__efi_entry_check());
+               debug("%sEFI: %lu returned by started image\n",
+                     __efi_nesting_dec(),
+                     (unsigned long)((uintptr_t)info->exit_status &
+                                     ~EFI_ERROR_MASK));
                return EFI_EXIT(info->exit_status);
        }
 
-       __efi_nesting_dec();
-       __efi_exit_check();
-       entry(image_handle, &systab);
-       __efi_entry_check();
-       __efi_nesting_inc();
+       ret = EFI_CALL(entry(image_handle, &systab));
 
        /* Should usually never get here */
-       return EFI_EXIT(EFI_SUCCESS);
+       return EFI_EXIT(ret);
 }
 
 /*
@@ -1427,7 +1613,7 @@ static efi_status_t EFIAPI efi_exit(efi_handle_t image_handle,
                  exit_data_size, exit_data);
 
        /* Make sure entry/exit counts for EFI world cross-overs match */
-       __efi_exit_check();
+       EFI_EXIT(exit_status);
 
        /*
         * But longjmp out with the U-Boot gd, not the application's, as
@@ -1451,7 +1637,7 @@ static efi_status_t EFIAPI efi_exit(efi_handle_t image_handle,
  * @image_handle       handle of the image to be unloaded
  * @return             status code
  */
-static efi_status_t EFIAPI efi_unload_image(void *image_handle)
+static efi_status_t EFIAPI efi_unload_image(efi_handle_t image_handle)
 {
        struct efi_object *efiobj;
 
@@ -1479,33 +1665,43 @@ static void efi_exit_caches(void)
 }
 
 /*
- * Stop boot services.
+ * Stop all boot services.
  *
  * This function implements the ExitBootServices service.
  * See the Unified Extensible Firmware Interface (UEFI) specification
  * for details.
  *
+ * All timer events are disabled.
+ * For exit boot services events the notification function is called.
+ * The boot services are disabled in the system table.
+ *
  * @image_handle       handle of the loaded image
  * @map_key            key of the memory map
  * @return             status code
  */
-static efi_status_t EFIAPI efi_exit_boot_services(void *image_handle,
+static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
                                                  unsigned long map_key)
 {
        int i;
 
        EFI_ENTRY("%p, %ld", image_handle, map_key);
 
+       /* Make sure that notification functions are not called anymore */
+       efi_tpl = TPL_HIGH_LEVEL;
+
+       /* Check if ExitBootServices has already been called */
+       if (!systab.boottime)
+               return EFI_EXIT(EFI_SUCCESS);
+
        /* Notify that ExitBootServices is invoked. */
        for (i = 0; i < ARRAY_SIZE(efi_events); ++i) {
                if (efi_events[i].type != EVT_SIGNAL_EXIT_BOOT_SERVICES)
                        continue;
-               efi_signal_event(&efi_events[i]);
+               efi_events[i].is_signaled = true;
+               efi_signal_event(&efi_events[i], false);
        }
-       /* Make sure that notification functions are not called anymore */
-       efi_tpl = TPL_HIGH_LEVEL;
 
-       /* XXX Should persist EFI variables here */
+       /* TODO Should persist EFI variables here */
 
        board_quiesce_devices();
 
@@ -1515,6 +1711,20 @@ static efi_status_t EFIAPI efi_exit_boot_services(void *image_handle,
        /* This stops all lingering devices */
        bootm_disable_interrupts();
 
+       /* Disable boottime services */
+       systab.con_in_handle = NULL;
+       systab.con_in = NULL;
+       systab.con_out_handle = NULL;
+       systab.con_out = NULL;
+       systab.stderr_handle = NULL;
+       systab.std_err = NULL;
+       systab.boottime = NULL;
+
+       /* Recalculate CRC32 */
+       systab.hdr.crc32 = 0;
+       systab.hdr.crc32 = crc32(0, (const unsigned char *)&systab,
+                                sizeof(struct efi_system_table));
+
        /* Give the payload some time to boot */
        efi_set_watchdog(0);
        WATCHDOG_RESET();
@@ -1580,51 +1790,6 @@ static efi_status_t EFIAPI efi_set_watchdog_timer(unsigned long timeout,
        return EFI_EXIT(efi_set_watchdog(timeout));
 }
 
-/*
- * Connect a controller to a driver.
- *
- * This function implements the ConnectController service.
- * See the Unified Extensible Firmware Interface (UEFI) specification
- * for details.
- *
- * @controller_handle  handle of the controller
- * @driver_image_handle        handle of the driver
- * @remain_device_path device path of a child controller
- * @recursive          true to connect all child controllers
- * @return             status code
- */
-static efi_status_t EFIAPI efi_connect_controller(
-                       efi_handle_t controller_handle,
-                       efi_handle_t *driver_image_handle,
-                       struct efi_device_path *remain_device_path,
-                       bool recursive)
-{
-       EFI_ENTRY("%p, %p, %p, %d", controller_handle, driver_image_handle,
-                 remain_device_path, recursive);
-       return EFI_EXIT(EFI_NOT_FOUND);
-}
-
-/*
- * Disconnect a controller from a driver.
- *
- * This function implements the DisconnectController service.
- * See the Unified Extensible Firmware Interface (UEFI) specification
- * for details.
- *
- * @controller_handle  handle of the controller
- * @driver_image_handle handle of the driver
- * @child_handle       handle of the child to destroy
- * @return             status code
- */
-static efi_status_t EFIAPI efi_disconnect_controller(void *controller_handle,
-                                                    void *driver_image_handle,
-                                                    void *child_handle)
-{
-       EFI_ENTRY("%p, %p, %p", controller_handle, driver_image_handle,
-                 child_handle);
-       return EFI_EXIT(EFI_INVALID_PARAMETER);
-}
-
 /*
  * Close a protocol.
  *
@@ -1638,14 +1803,38 @@ static efi_status_t EFIAPI efi_disconnect_controller(void *controller_handle,
  * @controller_handle  handle of the controller
  * @return             status code
  */
-static efi_status_t EFIAPI efi_close_protocol(void *handle,
+static efi_status_t EFIAPI efi_close_protocol(efi_handle_t handle,
                                              const efi_guid_t *protocol,
-                                             void *agent_handle,
-                                             void *controller_handle)
+                                             efi_handle_t agent_handle,
+                                             efi_handle_t controller_handle)
 {
+       struct efi_handler *handler;
+       struct efi_open_protocol_info_item *item;
+       struct efi_open_protocol_info_item *pos;
+       efi_status_t r;
+
        EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, agent_handle,
                  controller_handle);
-       return EFI_EXIT(EFI_NOT_FOUND);
+
+       if (!agent_handle) {
+               r = EFI_INVALID_PARAMETER;
+               goto out;
+       }
+       r = efi_search_protocol(handle, protocol, &handler);
+       if (r != EFI_SUCCESS)
+               goto out;
+
+       r = EFI_NOT_FOUND;
+       list_for_each_entry_safe(item, pos, &handler->open_infos, link) {
+               if (item->info.agent_handle == agent_handle &&
+                   item->info.controller_handle == controller_handle) {
+                       efi_delete_open_info(item);
+                       r = EFI_SUCCESS;
+                       break;
+               }
+       }
+out:
+       return EFI_EXIT(r);
 }
 
 /*
@@ -1666,9 +1855,49 @@ static efi_status_t EFIAPI efi_open_protocol_information(efi_handle_t handle,
                        struct efi_open_protocol_info_entry **entry_buffer,
                        efi_uintn_t *entry_count)
 {
+       unsigned long buffer_size;
+       unsigned long count;
+       struct efi_handler *handler;
+       struct efi_open_protocol_info_item *item;
+       efi_status_t r;
+
        EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, entry_buffer,
                  entry_count);
-       return EFI_EXIT(EFI_NOT_FOUND);
+
+       /* Check parameters */
+       if (!entry_buffer) {
+               r = EFI_INVALID_PARAMETER;
+               goto out;
+       }
+       r = efi_search_protocol(handle, protocol, &handler);
+       if (r != EFI_SUCCESS)
+               goto out;
+
+       /* Count entries */
+       count = 0;
+       list_for_each_entry(item, &handler->open_infos, link) {
+               if (item->info.open_count)
+                       ++count;
+       }
+       *entry_count = count;
+       *entry_buffer = NULL;
+       if (!count) {
+               r = EFI_SUCCESS;
+               goto out;
+       }
+
+       /* Copy entries */
+       buffer_size = count * sizeof(struct efi_open_protocol_info_entry);
+       r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, buffer_size,
+                             (void **)entry_buffer);
+       if (r != EFI_SUCCESS)
+               goto out;
+       list_for_each_entry_reverse(item, &handler->open_infos, link) {
+               if (item->info.open_count)
+                       (*entry_buffer)[--count] = item->info;
+       }
+out:
+       return EFI_EXIT(r);
 }
 
 /*
@@ -1683,8 +1912,8 @@ static efi_status_t EFIAPI efi_open_protocol_information(efi_handle_t handle,
  * @protocol_buffer_count      number of entries in the buffer
  * @return                     status code
  */
-static efi_status_t EFIAPI efi_protocols_per_handle(void *handle,
-                       efi_guid_t ***protocol_buffer,
+static efi_status_t EFIAPI efi_protocols_per_handle(
+                       efi_handle_t handle, efi_guid_t ***protocol_buffer,
                        efi_uintn_t *protocol_buffer_count)
 {
        unsigned long buffer_size;
@@ -1774,7 +2003,7 @@ static efi_status_t EFIAPI efi_locate_handle_buffer(
        r = efi_locate_handle(search_type, protocol, search_key, &buffer_size,
                              *buffer);
        if (r == EFI_SUCCESS)
-               *no_handles = buffer_size / sizeof(void *);
+               *no_handles = buffer_size / sizeof(efi_handle_t);
 out:
        return EFI_EXIT(r);
 }
@@ -2068,6 +2297,101 @@ static void EFIAPI efi_set_mem(void *buffer, size_t size, uint8_t value)
        EFI_EXIT(EFI_SUCCESS);
 }
 
+/*
+ * Open protocol interface on a handle.
+ *
+ * @handler            handler of a protocol
+ * @protocol_interface interface implementing the protocol
+ * @agent_handle       handle of the driver
+ * @controller_handle  handle of the controller
+ * @attributes         attributes indicating how to open the protocol
+ * @return             status code
+ */
+static efi_status_t efi_protocol_open(
+                       struct efi_handler *handler,
+                       void **protocol_interface, void *agent_handle,
+                       void *controller_handle, uint32_t attributes)
+{
+       struct efi_open_protocol_info_item *item;
+       struct efi_open_protocol_info_entry *match = NULL;
+       bool opened_by_driver = false;
+       bool opened_exclusive = false;
+
+       /* If there is no agent, only return the interface */
+       if (!agent_handle)
+               goto out;
+
+       /* For TEST_PROTOCOL ignore interface attribute */
+       if (attributes != EFI_OPEN_PROTOCOL_TEST_PROTOCOL)
+               *protocol_interface = NULL;
+
+       /*
+        * Check if the protocol is already opened by a driver with the same
+        * attributes or opened exclusively
+        */
+       list_for_each_entry(item, &handler->open_infos, link) {
+               if (item->info.agent_handle == agent_handle) {
+                       if ((attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) &&
+                           (item->info.attributes == attributes))
+                               return EFI_ALREADY_STARTED;
+               }
+               if (item->info.attributes & EFI_OPEN_PROTOCOL_EXCLUSIVE)
+                       opened_exclusive = true;
+       }
+
+       /* Only one controller can open the protocol exclusively */
+       if (opened_exclusive && attributes &
+           (EFI_OPEN_PROTOCOL_EXCLUSIVE | EFI_OPEN_PROTOCOL_BY_DRIVER))
+               return EFI_ACCESS_DENIED;
+
+       /* Prepare exclusive opening */
+       if (attributes & EFI_OPEN_PROTOCOL_EXCLUSIVE) {
+               /* Try to disconnect controllers */
+               list_for_each_entry(item, &handler->open_infos, link) {
+                       if (item->info.attributes ==
+                                       EFI_OPEN_PROTOCOL_BY_DRIVER)
+                               EFI_CALL(efi_disconnect_controller(
+                                               item->info.controller_handle,
+                                               item->info.agent_handle,
+                                               NULL));
+               }
+               opened_by_driver = false;
+               /* Check if all controllers are disconnected */
+               list_for_each_entry(item, &handler->open_infos, link) {
+                       if (item->info.attributes & EFI_OPEN_PROTOCOL_BY_DRIVER)
+                               opened_by_driver = true;
+               }
+               /* Only one controller can be conncected */
+               if (opened_by_driver)
+                       return EFI_ACCESS_DENIED;
+       }
+
+       /* Find existing entry */
+       list_for_each_entry(item, &handler->open_infos, link) {
+               if (item->info.agent_handle == agent_handle &&
+                   item->info.controller_handle == controller_handle)
+                       match = &item->info;
+       }
+       /* None found, create one */
+       if (!match) {
+               match = efi_create_open_info(handler);
+               if (!match)
+                       return EFI_OUT_OF_RESOURCES;
+       }
+
+       match->agent_handle = agent_handle;
+       match->controller_handle = controller_handle;
+       match->attributes = attributes;
+       match->open_count++;
+
+out:
+       /* For TEST_PROTOCOL ignore interface attribute. */
+       if (attributes != EFI_OPEN_PROTOCOL_TEST_PROTOCOL)
+               *protocol_interface = handler->protocol_interface;
+
+       return EFI_SUCCESS;
+}
+
 /*
  * Open protocol interface on a handle.
  *
@@ -2109,12 +2433,16 @@ static efi_status_t EFIAPI efi_open_protocol(
        case EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER:
                if (controller_handle == handle)
                        goto out;
+               /* fall-through */
        case EFI_OPEN_PROTOCOL_BY_DRIVER:
        case EFI_OPEN_PROTOCOL_BY_DRIVER | EFI_OPEN_PROTOCOL_EXCLUSIVE:
-               if (controller_handle == NULL)
+               /* Check that the controller handle is valid */
+               if (!efi_search_obj(controller_handle))
                        goto out;
+               /* fall-through */
        case EFI_OPEN_PROTOCOL_EXCLUSIVE:
-               if (agent_handle == NULL)
+               /* Check that the agent handle is valid */
+               if (!efi_search_obj(agent_handle))
                        goto out;
                break;
        default:
@@ -2125,8 +2453,8 @@ static efi_status_t EFIAPI efi_open_protocol(
        if (r != EFI_SUCCESS)
                goto out;
 
-       if (attributes != EFI_OPEN_PROTOCOL_TEST_PROTOCOL)
-               *protocol_interface = handler->protocol_interface;
+       r = efi_protocol_open(handler, protocol_interface, agent_handle,
+                             controller_handle, attributes);
 out:
        return EFI_EXIT(r);
 }
@@ -2143,7 +2471,7 @@ out:
  * @protocol_interface  interface implementing the protocol
  * @return             status code
  */
-static efi_status_t EFIAPI efi_handle_protocol(void *handle,
+static efi_status_t EFIAPI efi_handle_protocol(efi_handle_t handle,
                                               const efi_guid_t *protocol,
                                               void **protocol_interface)
 {
@@ -2151,6 +2479,321 @@ static efi_status_t EFIAPI efi_handle_protocol(void *handle,
                                 NULL, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
 }
 
+static efi_status_t efi_bind_controller(
+                       efi_handle_t controller_handle,
+                       efi_handle_t driver_image_handle,
+                       struct efi_device_path *remain_device_path)
+{
+       struct efi_driver_binding_protocol *binding_protocol;
+       efi_status_t r;
+
+       r = EFI_CALL(efi_open_protocol(driver_image_handle,
+                                      &efi_guid_driver_binding_protocol,
+                                      (void **)&binding_protocol,
+                                      driver_image_handle, NULL,
+                                      EFI_OPEN_PROTOCOL_GET_PROTOCOL));
+       if (r != EFI_SUCCESS)
+               return r;
+       r = EFI_CALL(binding_protocol->supported(binding_protocol,
+                                                controller_handle,
+                                                remain_device_path));
+       if (r == EFI_SUCCESS)
+               r = EFI_CALL(binding_protocol->start(binding_protocol,
+                                                    controller_handle,
+                                                    remain_device_path));
+       EFI_CALL(efi_close_protocol(driver_image_handle,
+                                   &efi_guid_driver_binding_protocol,
+                                   driver_image_handle, NULL));
+       return r;
+}
+
+static efi_status_t efi_connect_single_controller(
+                       efi_handle_t controller_handle,
+                       efi_handle_t *driver_image_handle,
+                       struct efi_device_path *remain_device_path)
+{
+       efi_handle_t *buffer;
+       size_t count;
+       size_t i;
+       efi_status_t r;
+       size_t connected = 0;
+
+       /* Get buffer with all handles with driver binding protocol */
+       r = EFI_CALL(efi_locate_handle_buffer(BY_PROTOCOL,
+                                             &efi_guid_driver_binding_protocol,
+                                             NULL, &count, &buffer));
+       if (r != EFI_SUCCESS)
+               return r;
+
+       /*  Context Override */
+       if (driver_image_handle) {
+               for (; *driver_image_handle; ++driver_image_handle) {
+                       for (i = 0; i < count; ++i) {
+                               if (buffer[i] == *driver_image_handle) {
+                                       buffer[i] = NULL;
+                                       r = efi_bind_controller(
+                                                       controller_handle,
+                                                       *driver_image_handle,
+                                                       remain_device_path);
+                                       /*
+                                        * For drivers that do not support the
+                                        * controller or are already connected
+                                        * we receive an error code here.
+                                        */
+                                       if (r == EFI_SUCCESS)
+                                               ++connected;
+                               }
+                       }
+               }
+       }
+
+       /*
+        * TODO: Some overrides are not yet implemented:
+        * - Platform Driver Override
+        * - Driver Family Override Search
+        * - Bus Specific Driver Override
+        */
+
+       /* Driver Binding Search */
+       for (i = 0; i < count; ++i) {
+               if (buffer[i]) {
+                       r = efi_bind_controller(controller_handle,
+                                               buffer[i],
+                                               remain_device_path);
+                       if (r == EFI_SUCCESS)
+                               ++connected;
+               }
+       }
+
+       efi_free_pool(buffer);
+       if (!connected)
+               return EFI_NOT_FOUND;
+       return EFI_SUCCESS;
+}
+
+/*
+ * Connect a controller to a driver.
+ *
+ * This function implements the ConnectController service.
+ * See the Unified Extensible Firmware Interface (UEFI) specification
+ * for details.
+ *
+ * First all driver binding protocol handles are tried for binding drivers.
+ * Afterwards all handles that have openened a protocol of the controller
+ * with EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER are connected to drivers.
+ *
+ * @controller_handle  handle of the controller
+ * @driver_image_handle        handle of the driver
+ * @remain_device_path device path of a child controller
+ * @recursive          true to connect all child controllers
+ * @return             status code
+ */
+static efi_status_t EFIAPI efi_connect_controller(
+                       efi_handle_t controller_handle,
+                       efi_handle_t *driver_image_handle,
+                       struct efi_device_path *remain_device_path,
+                       bool recursive)
+{
+       efi_status_t r;
+       efi_status_t ret = EFI_NOT_FOUND;
+       struct efi_object *efiobj;
+
+       EFI_ENTRY("%p, %p, %p, %d", controller_handle, driver_image_handle,
+                 remain_device_path, recursive);
+
+       efiobj = efi_search_obj(controller_handle);
+       if (!efiobj) {
+               ret = EFI_INVALID_PARAMETER;
+               goto out;
+       }
+
+       r = efi_connect_single_controller(controller_handle,
+                                         driver_image_handle,
+                                         remain_device_path);
+       if (r == EFI_SUCCESS)
+               ret = EFI_SUCCESS;
+       if (recursive) {
+               struct efi_handler *handler;
+               struct efi_open_protocol_info_item *item;
+
+               list_for_each_entry(handler, &efiobj->protocols, link) {
+                       list_for_each_entry(item, &handler->open_infos, link) {
+                               if (item->info.attributes &
+                                   EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {
+                                       r = EFI_CALL(efi_connect_controller(
+                                               item->info.controller_handle,
+                                               driver_image_handle,
+                                               remain_device_path,
+                                               recursive));
+                                       if (r == EFI_SUCCESS)
+                                               ret = EFI_SUCCESS;
+                               }
+                       }
+               }
+       }
+       /*  Check for child controller specified by end node */
+       if (ret != EFI_SUCCESS && remain_device_path &&
+           remain_device_path->type == DEVICE_PATH_TYPE_END)
+               ret = EFI_SUCCESS;
+out:
+       return EFI_EXIT(ret);
+}
+
+/*
+ * Get all child controllers associated to a driver.
+ * The allocated buffer has to be freed with free().
+ *
+ * @efiobj                     handle of the controller
+ * @driver_handle              handle of the driver
+ * @number_of_children         number of child controllers
+ * @child_handle_buffer                handles of the the child controllers
+ */
+static efi_status_t efi_get_child_controllers(
+                               struct efi_object *efiobj,
+                               efi_handle_t driver_handle,
+                               efi_uintn_t *number_of_children,
+                               efi_handle_t **child_handle_buffer)
+{
+       struct efi_handler *handler;
+       struct efi_open_protocol_info_item *item;
+       efi_uintn_t count = 0, i;
+       bool duplicate;
+
+       /* Count all child controller associations */
+       list_for_each_entry(handler, &efiobj->protocols, link) {
+               list_for_each_entry(item, &handler->open_infos, link) {
+                       if (item->info.agent_handle == driver_handle &&
+                           item->info.attributes &
+                           EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER)
+                               ++count;
+               }
+       }
+       /*
+        * Create buffer. In case of duplicate child controller assignments
+        * the buffer will be too large. But that does not harm.
+        */
+       *number_of_children = 0;
+       *child_handle_buffer = calloc(count, sizeof(efi_handle_t));
+       if (!*child_handle_buffer)
+               return EFI_OUT_OF_RESOURCES;
+       /* Copy unique child handles */
+       list_for_each_entry(handler, &efiobj->protocols, link) {
+               list_for_each_entry(item, &handler->open_infos, link) {
+                       if (item->info.agent_handle == driver_handle &&
+                           item->info.attributes &
+                           EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {
+                               /* Check this is a new child controller */
+                               duplicate = false;
+                               for (i = 0; i < *number_of_children; ++i) {
+                                       if ((*child_handle_buffer)[i] ==
+                                           item->info.controller_handle)
+                                               duplicate = true;
+                               }
+                               /* Copy handle to buffer */
+                               if (!duplicate) {
+                                       i = (*number_of_children)++;
+                                       (*child_handle_buffer)[i] =
+                                               item->info.controller_handle;
+                               }
+                       }
+               }
+       }
+       return EFI_SUCCESS;
+}
+
+/*
+ * Disconnect a controller from a driver.
+ *
+ * This function implements the DisconnectController service.
+ * See the Unified Extensible Firmware Interface (UEFI) specification
+ * for details.
+ *
+ * @controller_handle  handle of the controller
+ * @driver_image_handle handle of the driver
+ * @child_handle       handle of the child to destroy
+ * @return             status code
+ */
+static efi_status_t EFIAPI efi_disconnect_controller(
+                               efi_handle_t controller_handle,
+                               efi_handle_t driver_image_handle,
+                               efi_handle_t child_handle)
+{
+       struct efi_driver_binding_protocol *binding_protocol;
+       efi_handle_t *child_handle_buffer = NULL;
+       size_t number_of_children = 0;
+       efi_status_t r;
+       size_t stop_count = 0;
+       struct efi_object *efiobj;
+
+       EFI_ENTRY("%p, %p, %p", controller_handle, driver_image_handle,
+                 child_handle);
+
+       efiobj = efi_search_obj(controller_handle);
+       if (!efiobj) {
+               r = EFI_INVALID_PARAMETER;
+               goto out;
+       }
+
+       if (child_handle && !efi_search_obj(child_handle)) {
+               r = EFI_INVALID_PARAMETER;
+               goto out;
+       }
+
+       /* If no driver handle is supplied, disconnect all drivers */
+       if (!driver_image_handle) {
+               r = efi_disconnect_all_drivers(efiobj, NULL, child_handle);
+               goto out;
+       }
+
+       /* Create list of child handles */
+       if (child_handle) {
+               number_of_children = 1;
+               child_handle_buffer = &child_handle;
+       } else {
+               efi_get_child_controllers(efiobj,
+                                         driver_image_handle,
+                                         &number_of_children,
+                                         &child_handle_buffer);
+       }
+
+       /* Get the driver binding protocol */
+       r = EFI_CALL(efi_open_protocol(driver_image_handle,
+                                      &efi_guid_driver_binding_protocol,
+                                      (void **)&binding_protocol,
+                                      driver_image_handle, NULL,
+                                      EFI_OPEN_PROTOCOL_GET_PROTOCOL));
+       if (r != EFI_SUCCESS)
+               goto out;
+       /* Remove the children */
+       if (number_of_children) {
+               r = EFI_CALL(binding_protocol->stop(binding_protocol,
+                                                   controller_handle,
+                                                   number_of_children,
+                                                   child_handle_buffer));
+               if (r == EFI_SUCCESS)
+                       ++stop_count;
+       }
+       /* Remove the driver */
+       if (!child_handle)
+               r = EFI_CALL(binding_protocol->stop(binding_protocol,
+                                                   controller_handle,
+                                                   0, NULL));
+       if (r == EFI_SUCCESS)
+               ++stop_count;
+       EFI_CALL(efi_close_protocol(driver_image_handle,
+                                   &efi_guid_driver_binding_protocol,
+                                   driver_image_handle, NULL));
+
+       if (stop_count)
+               r = EFI_SUCCESS;
+       else
+               r = EFI_NOT_FOUND;
+out:
+       if (!child_handle)
+               free(child_handle_buffer);
+       return EFI_EXIT(r);
+}
+
 static const struct efi_boot_services efi_boot_services = {
        .hdr = {
                .headersize = sizeof(struct efi_table_hdr),
@@ -2201,8 +2844,7 @@ static const struct efi_boot_services efi_boot_services = {
 };
 
 
-static uint16_t __efi_runtime_data firmware_vendor[] =
-       { 'D','a','s',' ','U','-','b','o','o','t',0 };
+static uint16_t __efi_runtime_data firmware_vendor[] = L"Das U-Boot";
 
 struct efi_system_table __efi_runtime_data systab = {
        .hdr = {
index 98497db612e341b6983c2afa4b2195681ea9ce87..28d63635ec7d27a7500757a6ef3285155fb23969 100644 (file)
@@ -482,18 +482,26 @@ static void EFIAPI efi_key_notify(struct efi_event *event, void *context)
 {
 }
 
+/*
+ * Notification function of the console timer event.
+ *
+ * event:      console timer event
+ * context:    not used
+ */
 static void EFIAPI efi_console_timer_notify(struct efi_event *event,
                                            void *context)
 {
        EFI_ENTRY("%p, %p", event, context);
+
+       /* Check if input is available */
        if (tstc()) {
+               /* Queue the wait for key event */
                efi_con_in.wait_for_key->is_signaled = true;
-               efi_signal_event(efi_con_in.wait_for_key);
-               }
+               efi_signal_event(efi_con_in.wait_for_key, true);
+       }
        EFI_EXIT(EFI_SUCCESS);
 }
 
-
 /* This gets called from do_bootefi_exec(). */
 int efi_console_register(void)
 {
@@ -503,21 +511,21 @@ int efi_console_register(void)
        struct efi_object *efi_console_input_obj;
 
        /* Create handles */
-       r = efi_create_handle((void **)&efi_console_control_obj);
+       r = efi_create_handle((efi_handle_t *)&efi_console_control_obj);
        if (r != EFI_SUCCESS)
                goto out_of_memory;
        r = efi_add_protocol(efi_console_control_obj->handle,
                             &efi_guid_console_control, &efi_console_control);
        if (r != EFI_SUCCESS)
                goto out_of_memory;
-       r = efi_create_handle((void **)&efi_console_output_obj);
+       r = efi_create_handle((efi_handle_t *)&efi_console_output_obj);
        if (r != EFI_SUCCESS)
                goto out_of_memory;
        r = efi_add_protocol(efi_console_output_obj->handle,
                             &efi_guid_text_output_protocol, &efi_con_out);
        if (r != EFI_SUCCESS)
                goto out_of_memory;
-       r = efi_create_handle((void **)&efi_console_input_obj);
+       r = efi_create_handle((efi_handle_t *)&efi_console_input_obj);
        if (r != EFI_SUCCESS)
                goto out_of_memory;
        r = efi_add_protocol(efi_console_input_obj->handle,
index ccb59337f182edc27be5a21d9b2743416f1c5d10..ecc4eda3f85e399d92aef3cf835c7821ec6b6763 100644 (file)
@@ -6,6 +6,8 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
+#define LOG_CATEGORY LOGL_ERR
+
 #include <common.h>
 #include <blk.h>
 #include <dm.h>
@@ -58,8 +60,11 @@ static void *dp_alloc(size_t sz)
 {
        void *buf;
 
-       if (efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, sz, &buf) != EFI_SUCCESS)
+       if (efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, sz, &buf) !=
+           EFI_SUCCESS) {
+               debug("EFI: ERROR: out of memory in %s\n", __func__);
                return NULL;
+       }
 
        return buf;
 }
@@ -108,7 +113,6 @@ int efi_dp_match(const struct efi_device_path *a,
        }
 }
 
-
 /*
  * See UEFI spec (section 3.1.2, about short-form device-paths..
  * tl;dr: we can have a device-path that starts with a USB WWID
@@ -181,7 +185,6 @@ static struct efi_object *find_obj(struct efi_device_path *dp, bool short_path,
        return NULL;
 }
 
-
 /*
  * Find an efiobj from device-path, if 'rem' is not NULL, returns the
  * remaining part of the device path after the matched object.
@@ -205,6 +208,26 @@ struct efi_object *efi_dp_find_obj(struct efi_device_path *dp,
        return efiobj;
 }
 
+/*
+ * Determine the last device path node that is not the end node.
+ *
+ * @dp         device path
+ * @return     last node before the end node if it exists
+ *             otherwise NULL
+ */
+const struct efi_device_path *efi_dp_last_node(const struct efi_device_path *dp)
+{
+       struct efi_device_path *ret;
+
+       if (!dp || dp->type == DEVICE_PATH_TYPE_END)
+               return NULL;
+       while (dp) {
+               ret = (struct efi_device_path *)dp;
+               dp = efi_dp_next(dp);
+       }
+       return ret;
+}
+
 /* return size not including End node: */
 unsigned efi_dp_size(const struct efi_device_path *dp)
 {
@@ -227,6 +250,8 @@ struct efi_device_path *efi_dp_dup(const struct efi_device_path *dp)
                return NULL;
 
        ndp = dp_alloc(sz);
+       if (!ndp)
+               return NULL;
        memcpy(ndp, dp, sz);
 
        return ndp;
@@ -246,6 +271,8 @@ struct efi_device_path *efi_dp_append(const struct efi_device_path *dp1,
                unsigned sz1 = efi_dp_size(dp1);
                unsigned sz2 = efi_dp_size(dp2);
                void *p = dp_alloc(sz1 + sz2 + sizeof(END));
+               if (!p)
+                       return NULL;
                memcpy(p, dp1, sz1);
                memcpy(p + sz1, dp2, sz2);
                memcpy(p + sz1 + sz2, &END, sizeof(END));
@@ -267,6 +294,8 @@ struct efi_device_path *efi_dp_append_node(const struct efi_device_path *dp,
        } else if (!dp) {
                unsigned sz = node->length;
                void *p = dp_alloc(sz + sizeof(END));
+               if (!p)
+                       return NULL;
                memcpy(p, node, sz);
                memcpy(p + sz, &END, sizeof(END));
                ret = p;
@@ -274,6 +303,8 @@ struct efi_device_path *efi_dp_append_node(const struct efi_device_path *dp,
                /* both dp and node are non-null */
                unsigned sz = efi_dp_size(dp);
                void *p = dp_alloc(sz + node->length + sizeof(END));
+               if (!p)
+                       return NULL;
                memcpy(p, dp, sz);
                memcpy(p + sz, node, node->length);
                memcpy(p + sz + node->length, &END, sizeof(END));
@@ -297,9 +328,36 @@ static unsigned dp_size(struct udevice *dev)
        case UCLASS_SIMPLE_BUS:
                /* stop traversing parents at this point: */
                return sizeof(ROOT);
+       case UCLASS_ETH:
+               return dp_size(dev->parent) +
+                       sizeof(struct efi_device_path_mac_addr);
+#ifdef CONFIG_BLK
+       case UCLASS_BLK:
+               switch (dev->parent->uclass->uc_drv->id) {
+#ifdef CONFIG_IDE
+               case UCLASS_IDE:
+                       return dp_size(dev->parent) +
+                               sizeof(struct efi_device_path_atapi);
+#endif
+#if defined(CONFIG_SCSI) && defined(CONFIG_DM_SCSI)
+               case UCLASS_SCSI:
+                       return dp_size(dev->parent) +
+                               sizeof(struct efi_device_path_scsi);
+#endif
+#if defined(CONFIG_DM_MMC) && defined(CONFIG_MMC)
+               case UCLASS_MMC:
+                       return dp_size(dev->parent) +
+                               sizeof(struct efi_device_path_sd_mmc_path);
+#endif
+               default:
+                       return dp_size(dev->parent);
+               }
+#endif
+#if defined(CONFIG_DM_MMC) && defined(CONFIG_MMC)
        case UCLASS_MMC:
                return dp_size(dev->parent) +
                        sizeof(struct efi_device_path_sd_mmc_path);
+#endif
        case UCLASS_MASS_STORAGE:
        case UCLASS_USB_HUB:
                return dp_size(dev->parent) +
@@ -310,6 +368,13 @@ static unsigned dp_size(struct udevice *dev)
        }
 }
 
+/*
+ * Recursively build a device path.
+ *
+ * @buf                pointer to the end of the device path
+ * @dev                device
+ * @return     pointer to the end of the device path
+ */
 static void *dp_fill(void *buf, struct udevice *dev)
 {
        if (!dev || !dev->driver)
@@ -323,6 +388,79 @@ static void *dp_fill(void *buf, struct udevice *dev)
                *vdp = ROOT;
                return &vdp[1];
        }
+#ifdef CONFIG_DM_ETH
+       case UCLASS_ETH: {
+               struct efi_device_path_mac_addr *dp =
+                       dp_fill(buf, dev->parent);
+               struct eth_pdata *pdata = dev->platdata;
+
+               dp->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
+               dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_MAC_ADDR;
+               dp->dp.length = sizeof(*dp);
+               memset(&dp->mac, 0, sizeof(dp->mac));
+               /* We only support IPv4 */
+               memcpy(&dp->mac, &pdata->enetaddr, ARP_HLEN);
+               /* Ethernet */
+               dp->if_type = 1;
+               return &dp[1];
+       }
+#endif
+#ifdef CONFIG_BLK
+       case UCLASS_BLK:
+               switch (dev->parent->uclass->uc_drv->id) {
+#ifdef CONFIG_IDE
+               case UCLASS_IDE: {
+                       struct efi_device_path_atapi *dp =
+                       dp_fill(buf, dev->parent);
+                       struct blk_desc *desc = dev_get_uclass_platdata(dev);
+
+                       dp->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
+                       dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_ATAPI;
+                       dp->dp.length = sizeof(*dp);
+                       dp->logical_unit_number = desc->devnum;
+                       dp->primary_secondary = IDE_BUS(desc->devnum);
+                       dp->slave_master = desc->devnum %
+                               (CONFIG_SYS_IDE_MAXDEVICE /
+                                CONFIG_SYS_IDE_MAXBUS);
+                       return &dp[1];
+                       }
+#endif
+#if defined(CONFIG_SCSI) && defined(CONFIG_DM_SCSI)
+               case UCLASS_SCSI: {
+                       struct efi_device_path_scsi *dp =
+                               dp_fill(buf, dev->parent);
+                       struct blk_desc *desc = dev_get_uclass_platdata(dev);
+
+                       dp->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
+                       dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_SCSI;
+                       dp->dp.length = sizeof(*dp);
+                       dp->logical_unit_number = desc->lun;
+                       dp->target_id = desc->target;
+                       return &dp[1];
+                       }
+#endif
+#if defined(CONFIG_DM_MMC) && defined(CONFIG_MMC)
+               case UCLASS_MMC: {
+                       struct efi_device_path_sd_mmc_path *sddp =
+                               dp_fill(buf, dev->parent);
+                       struct blk_desc *desc = dev_get_uclass_platdata(dev);
+
+                       sddp->dp.type     = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
+                       sddp->dp.sub_type = is_sd(desc) ?
+                               DEVICE_PATH_SUB_TYPE_MSG_SD :
+                               DEVICE_PATH_SUB_TYPE_MSG_MMC;
+                       sddp->dp.length   = sizeof(*sddp);
+                       sddp->slot_number = dev->seq;
+                       return &sddp[1];
+                       }
+#endif
+               default:
+                       debug("%s(%u) %s: unhandled parent class: %s (%u)\n",
+                             __FILE__, __LINE__, __func__,
+                             dev->name, dev->parent->uclass->uc_drv->id);
+                       return dp_fill(buf, dev->parent);
+               }
+#endif
 #if defined(CONFIG_DM_MMC) && defined(CONFIG_MMC)
        case UCLASS_MMC: {
                struct efi_device_path_sd_mmc_path *sddp =
@@ -359,7 +497,8 @@ static void *dp_fill(void *buf, struct udevice *dev)
                return &udp[1];
        }
        default:
-               debug("unhandled device class: %s (%u)\n",
+               debug("%s(%u) %s: unhandled device class: %s (%u)\n",
+                     __FILE__, __LINE__, __func__,
                      dev->name, dev->driver->id);
                return dp_fill(buf, dev->parent);
        }
@@ -371,6 +510,8 @@ struct efi_device_path *efi_dp_from_dev(struct udevice *dev)
        void *buf, *start;
 
        start = buf = dp_alloc(dp_size(dev) + sizeof(END));
+       if (!buf)
+               return NULL;
        buf = dp_fill(buf, dev);
        *((struct efi_device_path *)buf) = END;
 
@@ -383,7 +524,14 @@ static unsigned dp_part_size(struct blk_desc *desc, int part)
        unsigned dpsize;
 
 #ifdef CONFIG_BLK
-       dpsize = dp_size(desc->bdev->parent);
+       {
+               struct udevice *dev;
+               int ret = blk_find_device(desc->if_type, desc->devnum, &dev);
+
+               if (ret)
+                       dev = desc->bdev->parent;
+               dpsize = dp_size(dev);
+       }
 #else
        dpsize = sizeof(ROOT) + sizeof(struct efi_device_path_usb);
 #endif
@@ -400,43 +548,16 @@ static unsigned dp_part_size(struct blk_desc *desc, int part)
 }
 
 /*
- * Create a device path for a block device or one of its partitions.
+ * Create a device node for a block device partition.
  *
  * @buf                buffer to which the device path is wirtten
  * @desc       block device descriptor
  * @part       partition number, 0 identifies a block device
  */
-static void *dp_part_fill(void *buf, struct blk_desc *desc, int part)
+static void *dp_part_node(void *buf, struct blk_desc *desc, int part)
 {
        disk_partition_t info;
 
-#ifdef CONFIG_BLK
-       buf = dp_fill(buf, desc->bdev->parent);
-#else
-       /*
-        * We *could* make a more accurate path, by looking at if_type
-        * and handling all the different cases like we do for non-
-        * legacy (ie CONFIG_BLK=y) case.  But most important thing
-        * is just to have a unique device-path for if_type+devnum.
-        * So map things to a fictitious USB device.
-        */
-       struct efi_device_path_usb *udp;
-
-       memcpy(buf, &ROOT, sizeof(ROOT));
-       buf += sizeof(ROOT);
-
-       udp = buf;
-       udp->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
-       udp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_USB;
-       udp->dp.length = sizeof(*udp);
-       udp->parent_port_number = desc->if_type;
-       udp->usb_interface = desc->devnum;
-       buf = &udp[1];
-#endif
-
-       if (part == 0) /* the actual disk, not a partition */
-               return buf;
-
        part_get_info(desc, part, &info);
 
        if (desc->part_type == PART_TYPE_ISO) {
@@ -491,6 +612,51 @@ static void *dp_part_fill(void *buf, struct blk_desc *desc, int part)
        return buf;
 }
 
+/*
+ * Create a device path for a block device or one of its partitions.
+ *
+ * @buf                buffer to which the device path is wirtten
+ * @desc       block device descriptor
+ * @part       partition number, 0 identifies a block device
+ */
+static void *dp_part_fill(void *buf, struct blk_desc *desc, int part)
+{
+#ifdef CONFIG_BLK
+       {
+               struct udevice *dev;
+               int ret = blk_find_device(desc->if_type, desc->devnum, &dev);
+
+               if (ret)
+                       dev = desc->bdev->parent;
+               buf = dp_fill(buf, dev);
+       }
+#else
+       /*
+        * We *could* make a more accurate path, by looking at if_type
+        * and handling all the different cases like we do for non-
+        * legacy (ie CONFIG_BLK=y) case.  But most important thing
+        * is just to have a unique device-path for if_type+devnum.
+        * So map things to a fictitious USB device.
+        */
+       struct efi_device_path_usb *udp;
+
+       memcpy(buf, &ROOT, sizeof(ROOT));
+       buf += sizeof(ROOT);
+
+       udp = buf;
+       udp->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
+       udp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_USB;
+       udp->dp.length = sizeof(*udp);
+       udp->parent_port_number = desc->if_type;
+       udp->usb_interface = desc->devnum;
+       buf = &udp[1];
+#endif
+
+       if (part == 0) /* the actual disk, not a partition */
+               return buf;
+
+       return dp_part_node(buf, desc, part);
+}
 
 /* Construct a device-path from a partition on a blk device: */
 struct efi_device_path *efi_dp_from_part(struct blk_desc *desc, int part)
@@ -498,6 +664,8 @@ struct efi_device_path *efi_dp_from_part(struct blk_desc *desc, int part)
        void *buf, *start;
 
        start = buf = dp_alloc(dp_part_size(desc, part) + sizeof(END));
+       if (!buf)
+               return NULL;
 
        buf = dp_part_fill(buf, desc, part);
 
@@ -506,6 +674,29 @@ struct efi_device_path *efi_dp_from_part(struct blk_desc *desc, int part)
        return start;
 }
 
+/*
+ * Create a device node for a block device partition.
+ *
+ * @buf                buffer to which the device path is wirtten
+ * @desc       block device descriptor
+ * @part       partition number, 0 identifies a block device
+ */
+struct efi_device_path *efi_dp_part_node(struct blk_desc *desc, int part)
+{
+       efi_uintn_t dpsize;
+       void *buf;
+
+       if (desc->part_type == PART_TYPE_ISO)
+               dpsize = sizeof(struct efi_device_path_cdrom_path);
+       else
+               dpsize = sizeof(struct efi_device_path_hard_drive_path);
+       buf = dp_alloc(dpsize);
+
+       dp_part_node(buf, desc, part);
+
+       return buf;
+}
+
 /* convert path to an UEFI style path (ie. DOS style backslashes and utf16) */
 static void path_to_uefi(u16 *uefi, const char *path)
 {
@@ -536,6 +727,8 @@ struct efi_device_path *efi_dp_from_file(struct blk_desc *desc, int part,
        dpsize += fpsize;
 
        start = buf = dp_alloc(dpsize + sizeof(END));
+       if (!buf)
+               return NULL;
 
        if (desc)
                buf = dp_part_fill(buf, desc, part);
@@ -570,6 +763,8 @@ struct efi_device_path *efi_dp_from_eth(void)
        dpsize += sizeof(*ndp);
 
        start = buf = dp_alloc(dpsize + sizeof(END));
+       if (!buf)
+               return NULL;
 
 #ifdef CONFIG_DM_ETH
        buf = dp_fill(buf, eth_get_dev());
@@ -600,6 +795,8 @@ struct efi_device_path *efi_dp_from_mem(uint32_t memory_type,
        void *buf, *start;
 
        start = buf = dp_alloc(sizeof(*mdp) + sizeof(END));
+       if (!buf)
+               return NULL;
 
        mdp = buf;
        mdp->dp.type = DEVICE_PATH_TYPE_HARDWARE_DEVICE;
@@ -619,22 +816,31 @@ struct efi_device_path *efi_dp_from_mem(uint32_t memory_type,
  * Helper to split a full device path (containing both device and file
  * parts) into it's constituent parts.
  */
-void efi_dp_split_file_path(struct efi_device_path *full_path,
-                           struct efi_device_path **device_path,
-                           struct efi_device_path **file_path)
+efi_status_t efi_dp_split_file_path(struct efi_device_path *full_path,
+                                   struct efi_device_path **device_path,
+                                   struct efi_device_path **file_path)
 {
        struct efi_device_path *p, *dp, *fp;
 
+       *device_path = NULL;
+       *file_path = NULL;
        dp = efi_dp_dup(full_path);
+       if (!dp)
+               return EFI_OUT_OF_RESOURCES;
        p = dp;
-       while (!EFI_DP_TYPE(p, MEDIA_DEVICE, FILE_PATH))
+       while (!EFI_DP_TYPE(p, MEDIA_DEVICE, FILE_PATH)) {
                p = efi_dp_next(p);
+               if (!p)
+                       return EFI_OUT_OF_RESOURCES;
+       }
        fp = efi_dp_dup(p);
-
+       if (!fp)
+               return EFI_OUT_OF_RESOURCES;
        p->type = DEVICE_PATH_TYPE_END;
        p->sub_type = DEVICE_PATH_SUB_TYPE_END;
        p->length = sizeof(*p);
 
        *device_path = dp;
        *file_path = fp;
+       return EFI_SUCCESS;
 }
index 50d9e911c0b0141c8cfe44645b5d9a48cee4aa0b..a79e60a4eeae89f4a768f526d3d4c7267f440601 100644 (file)
@@ -87,6 +87,20 @@ static char *dp_acpi(char *s, struct efi_device_path *dp)
 static char *dp_msging(char *s, struct efi_device_path *dp)
 {
        switch (dp->sub_type) {
+       case DEVICE_PATH_SUB_TYPE_MSG_ATAPI: {
+               struct efi_device_path_atapi *ide =
+                       (struct efi_device_path_atapi *)dp;
+               s += sprintf(s, "Ata(%d,%d,%d)", ide->primary_secondary,
+                            ide->slave_master, ide->logical_unit_number);
+               break;
+       }
+       case DEVICE_PATH_SUB_TYPE_MSG_SCSI: {
+               struct efi_device_path_scsi *ide =
+                       (struct efi_device_path_scsi *)dp;
+               s += sprintf(s, "Scsi(%u,%u)", ide->target_id,
+                            ide->logical_unit_number);
+               break;
+       }
        case DEVICE_PATH_SUB_TYPE_MSG_USB: {
                struct efi_device_path_usb *udp =
                        (struct efi_device_path_usb *)dp;
@@ -231,6 +245,8 @@ static char *efi_convert_single_device_node_to_text(
        case DEVICE_PATH_TYPE_MEDIA_DEVICE:
                str = dp_media(str, dp);
                break;
+       case DEVICE_PATH_TYPE_END:
+               break;
        default:
                str = dp_unknown(str, dp);
        }
index d299fc8dea5b0a0b104207b227ca12591b961659..ac39a65ee893e0af57eee18dd24b82d0847e043d 100644 (file)
@@ -14,7 +14,7 @@
 #include <part.h>
 #include <malloc.h>
 
-static const efi_guid_t efi_block_io_guid = BLOCK_IO_GUID;
+const efi_guid_t efi_block_io_guid = BLOCK_IO_GUID;
 
 struct efi_disk_obj {
        /* Generic EFI object parent class data */
@@ -91,7 +91,7 @@ static efi_status_t efi_disk_rw_blocks(struct efi_block_io *this,
 }
 
 static efi_status_t EFIAPI efi_disk_read_blocks(struct efi_block_io *this,
-                       u32 media_id, u64 lba, unsigned long buffer_size,
+                       u32 media_id, u64 lba, efi_uintn_t buffer_size,
                        void *buffer)
 {
        void *real_buffer = buffer;
@@ -112,7 +112,7 @@ static efi_status_t EFIAPI efi_disk_read_blocks(struct efi_block_io *this,
        real_buffer = efi_bounce_buffer;
 #endif
 
-       EFI_ENTRY("%p, %x, %"PRIx64", %lx, %p", this, media_id, lba,
+       EFI_ENTRY("%p, %x, %" PRIx64 ", %zx, %p", this, media_id, lba,
                  buffer_size, buffer);
 
        r = efi_disk_rw_blocks(this, media_id, lba, buffer_size, real_buffer,
@@ -126,7 +126,7 @@ static efi_status_t EFIAPI efi_disk_read_blocks(struct efi_block_io *this,
 }
 
 static efi_status_t EFIAPI efi_disk_write_blocks(struct efi_block_io *this,
-                       u32 media_id, u64 lba, unsigned long buffer_size,
+                       u32 media_id, u64 lba, efi_uintn_t buffer_size,
                        void *buffer)
 {
        void *real_buffer = buffer;
@@ -147,7 +147,7 @@ static efi_status_t EFIAPI efi_disk_write_blocks(struct efi_block_io *this,
        real_buffer = efi_bounce_buffer;
 #endif
 
-       EFI_ENTRY("%p, %x, %"PRIx64", %lx, %p", this, media_id, lba,
+       EFI_ENTRY("%p, %x, %" PRIx64 ", %zx, %p", this, media_id, lba,
                  buffer_size, buffer);
 
        /* Populate bounce buffer if necessary */
@@ -175,49 +175,72 @@ static const struct efi_block_io block_io_disk_template = {
 };
 
 /*
- * Find filesystem from a device-path.  The passed in path 'p' probably
- * contains one or more /File(name) nodes, so the comparison stops at
- * the first /File() node, and returns the pointer to that via 'rp'.
- * This is mostly intended to be a helper to map a device-path to an
- * efi_file_handle object.
+ * Get the simple file system protocol for a file device path.
+ *
+ * The full path provided is split into device part and into a file
+ * part. The device part is used to find the handle on which the
+ * simple file system protocol is installed.
+ *
+ * @full_path  device path including device and file
+ * @return     simple file system protocol
  */
 struct efi_simple_file_system_protocol *
-efi_fs_from_path(struct efi_device_path *fp)
+efi_fs_from_path(struct efi_device_path *full_path)
 {
        struct efi_object *efiobj;
-       struct efi_disk_obj *diskobj;
+       struct efi_handler *handler;
+       struct efi_device_path *device_path;
+       struct efi_device_path *file_path;
+       efi_status_t ret;
 
-       efiobj = efi_dp_find_obj(fp, NULL);
+       /* Split the path into a device part and a file part */
+       ret = efi_dp_split_file_path(full_path, &device_path, &file_path);
+       if (ret != EFI_SUCCESS)
+               return NULL;
+       efi_free_pool(file_path);
+
+       /* Get the EFI object for the partition */
+       efiobj = efi_dp_find_obj(device_path, NULL);
+       efi_free_pool(device_path);
        if (!efiobj)
                return NULL;
 
-       diskobj = container_of(efiobj, struct efi_disk_obj, parent);
+       /* Find the simple file system protocol */
+       ret = efi_search_protocol(efiobj, &efi_simple_file_system_protocol_guid,
+                                 &handler);
+       if (ret != EFI_SUCCESS)
+               return NULL;
 
-       return diskobj->volume;
+       /* Return the simple file system protocol for the partition */
+       return handler->protocol_interface;
 }
 
 /*
- * Create a device for a disk
+ * Create a handle for a partition or disk
  *
- * @name       not used
+ * @parent     parent handle
+ * @dp_parent  parent device path
  * @if_typename interface name for block device
  * @desc       internal block device
  * @dev_index   device index for block device
  * @offset     offset into disk for simple partitions
+ * @return     disk object
  */
-static void efi_disk_add_dev(const char *name,
-                            const char *if_typename,
-                            struct blk_desc *desc,
-                            int dev_index,
-                            lbaint_t offset,
-                            unsigned int part)
+static struct efi_disk_obj *efi_disk_add_dev(
+                               efi_handle_t parent,
+                               struct efi_device_path *dp_parent,
+                               const char *if_typename,
+                               struct blk_desc *desc,
+                               int dev_index,
+                               lbaint_t offset,
+                               unsigned int part)
 {
        struct efi_disk_obj *diskobj;
        efi_status_t ret;
 
        /* Don't add empty devices */
        if (!desc->lba)
-               return;
+               return NULL;
 
        diskobj = calloc(1, sizeof(*diskobj));
        if (!diskobj)
@@ -227,7 +250,14 @@ static void efi_disk_add_dev(const char *name,
        efi_add_handle(&diskobj->parent);
 
        /* Fill in object data */
-       diskobj->dp = efi_dp_from_part(desc, part);
+       if (part) {
+               struct efi_device_path *node = efi_dp_part_node(desc, part);
+
+               diskobj->dp = efi_dp_append_node(dp_parent, node);
+               efi_free_pool(node);
+       } else {
+               diskobj->dp = efi_dp_from_part(desc, part);
+       }
        diskobj->part = part;
        ret = efi_add_protocol(diskobj->parent.handle, &efi_block_io_guid,
                               &diskobj->ops);
@@ -242,7 +272,7 @@ static void efi_disk_add_dev(const char *name,
                                                         diskobj->dp);
                ret = efi_add_protocol(diskobj->parent.handle,
                                       &efi_simple_file_system_protocol_guid,
-                                      &diskobj->volume);
+                                      diskobj->volume);
                if (ret != EFI_SUCCESS)
                        goto out_of_memory;
        }
@@ -261,20 +291,38 @@ static void efi_disk_add_dev(const char *name,
        if (part != 0)
                diskobj->media.logical_partition = 1;
        diskobj->ops.media = &diskobj->media;
-       return;
+       return diskobj;
 out_of_memory:
        printf("ERROR: Out of memory\n");
+       return NULL;
 }
 
-static int efi_disk_create_partitions(struct blk_desc *desc,
-                                     const char *if_typename,
-                                     int diskid,
-                                     const char *pdevname)
+/*
+ * Create handles and protocols for the partitions of a block device
+ *
+ * @parent             handle of the parent disk
+ * @blk_desc           block device
+ * @if_typename                interface type
+ * @diskid             device number
+ * @pdevname           device name
+ * @return             number of partitions created
+ */
+int efi_disk_create_partitions(efi_handle_t parent, struct blk_desc *desc,
+                              const char *if_typename, int diskid,
+                              const char *pdevname)
 {
        int disks = 0;
        char devname[32] = { 0 }; /* dp->str is u16[32] long */
        disk_partition_t info;
        int part;
+       struct efi_device_path *dp = NULL;
+       efi_status_t ret;
+       struct efi_handler *handler;
+
+       /* Get the device path of the parent */
+       ret = efi_search_protocol(parent, &efi_guid_device_path, &handler);
+       if (ret == EFI_SUCCESS)
+               dp = handler->protocol_interface;
 
        /* Add devices for each partition */
        for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
@@ -282,7 +330,7 @@ static int efi_disk_create_partitions(struct blk_desc *desc,
                        continue;
                snprintf(devname, sizeof(devname), "%s:%d", pdevname,
                         part);
-               efi_disk_add_dev(devname, if_typename, desc, diskid,
+               efi_disk_add_dev(parent, dp, if_typename, desc, diskid,
                                 info.start, part);
                disks++;
        }
@@ -303,6 +351,7 @@ static int efi_disk_create_partitions(struct blk_desc *desc,
  */
 int efi_disk_register(void)
 {
+       struct efi_disk_obj *disk;
        int disks = 0;
 #ifdef CONFIG_BLK
        struct udevice *dev;
@@ -311,19 +360,21 @@ int efi_disk_register(void)
             dev;
             uclass_next_device_check(&dev)) {
                struct blk_desc *desc = dev_get_uclass_platdata(dev);
-               const char *if_typename = dev->driver->name;
+               const char *if_typename = blk_get_if_type_name(desc->if_type);
 
                printf("Scanning disk %s...\n", dev->name);
 
                /* Add block device for the full device */
-               efi_disk_add_dev(dev->name, if_typename, desc,
-                                desc->devnum, 0, 0);
-
+               disk = efi_disk_add_dev(NULL, NULL, if_typename,
+                                       desc, desc->devnum, 0, 0);
+               if (!disk)
+                       return -ENOMEM;
                disks++;
 
                /* Partitions show up as block devices in EFI */
-               disks += efi_disk_create_partitions(desc, if_typename,
-                                                   desc->devnum, dev->name);
+               disks += efi_disk_create_partitions(
+                                       disk->parent.handle, desc, if_typename,
+                                       desc->devnum, dev->name);
        }
 #else
        int i, if_type;
@@ -353,12 +404,16 @@ int efi_disk_register(void)
                                 if_typename, i);
 
                        /* Add block device for the full device */
-                       efi_disk_add_dev(devname, if_typename, desc, i, 0, 0);
+                       disk = efi_disk_add_dev(NULL, NULL, if_typename, desc,
+                                               i, 0, 0);
+                       if (!disk)
+                               return -ENOMEM;
                        disks++;
 
                        /* Partitions show up as block devices in EFI */
-                       disks += efi_disk_create_partitions(desc, if_typename,
-                                                           i, devname);
+                       disks += efi_disk_create_partitions(
+                                               disk->parent.handle, desc,
+                                               if_typename, i, devname);
                }
        }
 #endif
index af29cc4f04e9849c1ca5a84805a2eab01f28ed02..9d2214b481c6b0816a3bf4eed200691267d8f48d 100644 (file)
@@ -73,6 +73,40 @@ void __weak invalidate_icache_all(void)
        /* If the system doesn't support icache_all flush, cross our fingers */
 }
 
+/*
+ * Determine the memory types to be used for code and data.
+ *
+ * @loaded_image_info  image descriptor
+ * @image_type         field Subsystem of the optional header for
+ *                     Windows specific field
+ */
+static void efi_set_code_and_data_type(
+                       struct efi_loaded_image *loaded_image_info,
+                       uint16_t image_type)
+{
+       switch (image_type) {
+       case IMAGE_SUBSYSTEM_EFI_APPLICATION:
+               loaded_image_info->image_code_type = EFI_LOADER_CODE;
+               loaded_image_info->image_data_type = EFI_LOADER_DATA;
+               break;
+       case IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
+               loaded_image_info->image_code_type = EFI_BOOT_SERVICES_CODE;
+               loaded_image_info->image_data_type = EFI_BOOT_SERVICES_DATA;
+               break;
+       case IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
+       case IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER:
+               loaded_image_info->image_code_type = EFI_RUNTIME_SERVICES_CODE;
+               loaded_image_info->image_data_type = EFI_RUNTIME_SERVICES_DATA;
+               break;
+       default:
+               printf("%s: invalid image type: %u\n", __func__, image_type);
+               /* Let's assume it is an application */
+               loaded_image_info->image_code_type = EFI_LOADER_CODE;
+               loaded_image_info->image_data_type = EFI_LOADER_DATA;
+               break;
+       }
+}
+
 /*
  * This function loads all sections from a PE binary into a newly reserved
  * piece of memory. On successful load it then returns the entry point for
@@ -94,7 +128,6 @@ void *efi_load_pe(void *efi, struct efi_loaded_image *loaded_image_info)
        unsigned long virt_size = 0;
        bool can_run_nt64 = true;
        bool can_run_nt32 = true;
-       uint16_t image_type;
 
 #if defined(CONFIG_ARM64)
        can_run_nt32 = false;
@@ -131,55 +164,38 @@ void *efi_load_pe(void *efi, struct efi_loaded_image *loaded_image_info)
                IMAGE_NT_HEADERS64 *nt64 = (void *)nt;
                IMAGE_OPTIONAL_HEADER64 *opt = &nt64->OptionalHeader;
                image_size = opt->SizeOfImage;
-               efi_reloc = efi_alloc(virt_size, EFI_LOADER_DATA);
+               efi_set_code_and_data_type(loaded_image_info, opt->Subsystem);
+               efi_reloc = efi_alloc(virt_size,
+                                     loaded_image_info->image_code_type);
                if (!efi_reloc) {
-                       printf("%s: Could not allocate %ld bytes\n",
-                               __func__, virt_size);
+                       printf("%s: Could not allocate %lu bytes\n",
+                              __func__, virt_size);
                        return NULL;
                }
                entry = efi_reloc + opt->AddressOfEntryPoint;
                rel_size = opt->DataDirectory[rel_idx].Size;
                rel = efi_reloc + opt->DataDirectory[rel_idx].VirtualAddress;
-               image_type = opt->Subsystem;
        } else if (can_run_nt32 &&
                   (nt->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)) {
                IMAGE_OPTIONAL_HEADER32 *opt = &nt->OptionalHeader;
                image_size = opt->SizeOfImage;
-               efi_reloc = efi_alloc(virt_size, EFI_LOADER_DATA);
+               efi_set_code_and_data_type(loaded_image_info, opt->Subsystem);
+               efi_reloc = efi_alloc(virt_size,
+                                     loaded_image_info->image_code_type);
                if (!efi_reloc) {
-                       printf("%s: Could not allocate %ld bytes\n",
-                               __func__, virt_size);
+                       printf("%s: Could not allocate %lu bytes\n",
+                              __func__, virt_size);
                        return NULL;
                }
                entry = efi_reloc + opt->AddressOfEntryPoint;
                rel_size = opt->DataDirectory[rel_idx].Size;
                rel = efi_reloc + opt->DataDirectory[rel_idx].VirtualAddress;
-               image_type = opt->Subsystem;
        } else {
                printf("%s: Invalid optional header magic %x\n", __func__,
                       nt->OptionalHeader.Magic);
                return NULL;
        }
 
-       switch (image_type) {
-       case IMAGE_SUBSYSTEM_EFI_APPLICATION:
-               loaded_image_info->image_code_type = EFI_LOADER_CODE;
-               loaded_image_info->image_data_type = EFI_LOADER_DATA;
-               break;
-       case IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
-               loaded_image_info->image_code_type = EFI_BOOT_SERVICES_CODE;
-               loaded_image_info->image_data_type = EFI_BOOT_SERVICES_DATA;
-               break;
-       case IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
-       case IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER:
-               loaded_image_info->image_code_type = EFI_RUNTIME_SERVICES_CODE;
-               loaded_image_info->image_data_type = EFI_RUNTIME_SERVICES_DATA;
-               break;
-       default:
-               printf("%s: invalid image type: %u\n", __func__, image_type);
-               break;
-       }
-
        /* Load sections into RAM */
        for (i = num_sections - 1; i >= 0; i--) {
                IMAGE_SECTION_HEADER *sec = &sections[i];
index 0aa3e0881d43ec1d451897ab76ffdbd673d49f82..aaf64421a395d2d7ff6ea4060f52fc33090db15a 100644 (file)
@@ -275,6 +275,15 @@ static uint64_t efi_find_free_memory(uint64_t len, uint64_t max_addr)
        return 0;
 }
 
+/*
+ * Allocate memory pages.
+ *
+ * @type               type of allocation to be performed
+ * @memory_type                usage type of the allocated memory
+ * @pages              number of pages to be allocated
+ * @memory             allocated memory
+ * @return             status code
+ */
 efi_status_t efi_allocate_pages(int type, int memory_type,
                                efi_uintn_t pages, uint64_t *memory)
 {
@@ -338,6 +347,13 @@ void *efi_alloc(uint64_t len, int memory_type)
        return NULL;
 }
 
+/*
+ * Free memory pages.
+ *
+ * @memory     start of the memory area to be freed
+ * @pages      number of pages to be freed
+ * @return     status code
+ */
 efi_status_t efi_free_pages(uint64_t memory, efi_uintn_t pages)
 {
        uint64_t r = 0;
@@ -351,8 +367,15 @@ efi_status_t efi_free_pages(uint64_t memory, efi_uintn_t pages)
        return EFI_NOT_FOUND;
 }
 
-efi_status_t efi_allocate_pool(int pool_type, efi_uintn_t size,
-                              void **buffer)
+/*
+ * Allocate memory from pool.
+ *
+ * @pool_type  type of the pool from which memory is to be allocated
+ * @size       number of bytes to be allocated
+ * @buffer     allocated memory
+ * @return     status code
+ */
+efi_status_t efi_allocate_pool(int pool_type, efi_uintn_t size, void **buffer)
 {
        efi_status_t r;
        efi_physical_addr_t t;
@@ -375,6 +398,12 @@ efi_status_t efi_allocate_pool(int pool_type, efi_uintn_t size,
        return r;
 }
 
+/*
+ * Free memory from pool.
+ *
+ * @buffer     start of memory to be freed
+ * @return     status code
+ */
 efi_status_t efi_free_pool(void *buffer)
 {
        efi_status_t r;
@@ -392,6 +421,17 @@ efi_status_t efi_free_pool(void *buffer)
        return r;
 }
 
+/*
+ * Get map describing memory usage.
+ *
+ * @memory_map_size    on entry the size, in bytes, of the memory map buffer,
+ *                     on exit the size of the copied memory map
+ * @memory_map         buffer to which the memory map is written
+ * @map_key            key for the memory map
+ * @descriptor_size    size of an individual memory descriptor
+ * @descriptor_version version number of the memory descriptor structure
+ * @return             status code
+ */
 efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size,
                                struct efi_mem_desc *memory_map,
                                efi_uintn_t *map_key,
index b8c147d7f2a271b9ebda5ee33221dbd69d2bc8c2..1ec0179226328f4f31b6fc44645699095153fab2 100644 (file)
 #include <efi_api.h>
 
 static const efi_guid_t loaded_image_guid = LOADED_IMAGE_GUID;
+static const efi_guid_t fdt_guid = EFI_FDT_GUID;
+static const efi_guid_t smbios_guid = SMBIOS_TABLE_GUID;
+
+static int hw_memcmp(const void *buf1, const void *buf2, size_t length)
+{
+       const u8 *pos1 = buf1;
+       const u8 *pos2 = buf2;
+
+       for (; length; --length) {
+               if (*pos1 != *pos2)
+                       return *pos1 - *pos2;
+               ++pos1;
+               ++pos2;
+       }
+       return 0;
+}
 
 /*
  * Entry point of the EFI application.
@@ -29,6 +45,7 @@ efi_status_t EFIAPI efi_main(efi_handle_t handle,
        struct efi_boot_services *boottime = systable->boottime;
        struct efi_loaded_image *loaded_image;
        efi_status_t ret;
+       efi_uintn_t i;
 
        con_out->output_string(con_out, L"Hello, world!\n");
 
@@ -40,6 +57,15 @@ efi_status_t EFIAPI efi_main(efi_handle_t handle,
                                       L"Cannot open loaded image protocol\n");
                goto out;
        }
+       /* Find configuration tables */
+       for (i = 0; i < systable->nr_tables; ++i) {
+               if (!hw_memcmp(&systable->tables[i].guid, &fdt_guid,
+                              sizeof(efi_guid_t)))
+                       con_out->output_string(con_out, L"Have device tree\n");
+               if (!hw_memcmp(&systable->tables[i].guid, &smbios_guid,
+                              sizeof(efi_guid_t)))
+                       con_out->output_string(con_out, L"Have SMBIOS table\n");
+       }
        /* Output the load options */
        con_out->output_string(con_out, L"Load options: ");
        if (loaded_image->load_options_size && loaded_image->load_options)
diff --git a/lib/efi_selftest/.gitignore b/lib/efi_selftest/.gitignore
new file mode 100644 (file)
index 0000000..c527e46
--- /dev/null
@@ -0,0 +1,2 @@
+efi_miniapp_file_image.h
+*.efi
index 837e86228ea4d9fbb0ac55f920333708610c8375..90246f78273852c9a8727bffcf385b8a89c92919 100644 (file)
@@ -7,8 +7,12 @@
 # This file only gets included with CONFIG_EFI_LOADER set, so all
 # object inclusion implicitly depends on it
 
+CFLAGS_efi_selftest_miniapp.o := $(CFLAGS_EFI) -Os -ffreestanding
+CFLAGS_REMOVE_efi_selftest_miniapp.o := $(CFLAGS_NON_EFI) -Os
+
 obj-$(CONFIG_CMD_BOOTEFI_SELFTEST) += \
 efi_selftest.o \
+efi_selftest_controllers.o \
 efi_selftest_console.o \
 efi_selftest_devicepath.o \
 efi_selftest_events.o \
@@ -20,3 +24,39 @@ efi_selftest_textoutput.o \
 efi_selftest_tpl.o \
 efi_selftest_util.o \
 efi_selftest_watchdog.o
+
+ifeq ($(CONFIG_BLK)$(CONFIG_PARTITIONS),yy)
+obj-$(CONFIG_CMD_BOOTEFI_SELFTEST) += efi_selftest_block_device.o
+endif
+
+# TODO: As of v2018.01 the relocation code for the EFI application cannot
+# be built on x86_64.
+ifeq ($(CONFIG_X86_64),)
+
+ifneq ($(CONFIG_CMD_BOOTEFI_SELFTEST),)
+
+obj-y += \
+efi_selftest_startimage_exit.o \
+efi_selftest_startimage_return.o
+
+targets += \
+efi_miniapp_file_image_exit.h \
+efi_miniapp_file_image_return.h \
+efi_selftest_miniapp_exit.efi \
+efi_selftest_miniapp_return.efi
+
+$(obj)/efi_miniapp_file_image_exit.h: $(obj)/efi_selftest_miniapp_exit.efi
+       $(obj)/../../tools/file2include $(obj)/efi_selftest_miniapp_exit.efi > \
+       $(obj)/efi_miniapp_file_image_exit.h
+
+$(obj)/efi_miniapp_file_image_return.h: $(obj)/efi_selftest_miniapp_return.efi
+       $(obj)/../../tools/file2include $(obj)/efi_selftest_miniapp_return.efi > \
+       $(obj)/efi_miniapp_file_image_return.h
+
+$(obj)/efi_selftest_startimage_exit.o: $(obj)/efi_miniapp_file_image_exit.h
+
+$(obj)/efi_selftest_startimage_return.o: $(obj)/efi_miniapp_file_image_return.h
+
+endif
+
+endif
index 4e5a12c47cae33543b15c230675467f040bca52e..fc5ef254a1d14c1e256c2ff304f07c22cdd50614 100644 (file)
@@ -65,7 +65,7 @@ void efi_st_exit_boot_services(void)
                efi_st_error("ExitBootServices did not return EFI_SUCCESS\n");
                return;
        }
-       efi_st_printf("\nBoot services terminated\n");
+       efi_st_printc(EFI_WHITE, "\nBoot services terminated\n");
 }
 
 /*
@@ -81,13 +81,14 @@ static int setup(struct efi_unit_test *test, unsigned int *failures)
 
        if (!test->setup)
                return EFI_ST_SUCCESS;
-       efi_st_printf("\nSetting up '%s'\n", test->name);
+       efi_st_printc(EFI_LIGHTBLUE, "\nSetting up '%s'\n", test->name);
        ret = test->setup(handle, systable);
        if (ret != EFI_ST_SUCCESS) {
                efi_st_error("Setting up '%s' failed\n", test->name);
                ++*failures;
        } else {
-               efi_st_printf("Setting up '%s' succeeded\n", test->name);
+               efi_st_printc(EFI_LIGHTGREEN,
+                             "Setting up '%s' succeeded\n", test->name);
        }
        return ret;
 }
@@ -105,13 +106,14 @@ static int execute(struct efi_unit_test *test, unsigned int *failures)
 
        if (!test->execute)
                return EFI_ST_SUCCESS;
-       efi_st_printf("\nExecuting '%s'\n", test->name);
+       efi_st_printc(EFI_LIGHTBLUE, "\nExecuting '%s'\n", test->name);
        ret = test->execute();
        if (ret != EFI_ST_SUCCESS) {
                efi_st_error("Executing '%s' failed\n", test->name);
                ++*failures;
        } else {
-               efi_st_printf("Executing '%s' succeeded\n", test->name);
+               efi_st_printc(EFI_LIGHTGREEN,
+                             "Executing '%s' succeeded\n", test->name);
        }
        return ret;
 }
@@ -129,13 +131,14 @@ static int teardown(struct efi_unit_test *test, unsigned int *failures)
 
        if (!test->teardown)
                return EFI_ST_SUCCESS;
-       efi_st_printf("\nTearing down '%s'\n", test->name);
+       efi_st_printc(EFI_LIGHTBLUE, "\nTearing down '%s'\n", test->name);
        ret = test->teardown();
        if (ret != EFI_ST_SUCCESS) {
                efi_st_error("Tearing down '%s' failed\n", test->name);
                ++*failures;
        } else {
-               efi_st_printf("Tearing down '%s' succeeded\n", test->name);
+               efi_st_printc(EFI_LIGHTGREEN,
+                             "Tearing down '%s' succeeded\n", test->name);
        }
        return ret;
 }
@@ -262,12 +265,12 @@ efi_status_t EFIAPI efi_selftest(efi_handle_t image_handle,
                }
        }
 
-       efi_st_printf("\nTesting EFI API implementation\n");
+       efi_st_printc(EFI_WHITE, "\nTesting EFI API implementation\n");
 
        if (testname)
-               efi_st_printf("\nSelected test: '%ps'\n", testname);
+               efi_st_printc(EFI_WHITE, "\nSelected test: '%ps'\n", testname);
        else
-               efi_st_printf("\nNumber of tests to execute: %u\n",
+               efi_st_printc(EFI_WHITE, "\nNumber of tests to execute: %u\n",
                              ll_entry_count(struct efi_unit_test,
                                             efi_unit_test));
 
@@ -291,7 +294,7 @@ efi_status_t EFIAPI efi_selftest(efi_handle_t image_handle,
                        &failures);
 
        /* Give feedback */
-       efi_st_printf("\nSummary: %u failures\n\n", failures);
+       efi_st_printc(EFI_WHITE, "\nSummary: %u failures\n\n", failures);
 
        /* Reset system */
        efi_st_printf("Preparing for reset. Press any key.\n");
diff --git a/lib/efi_selftest/efi_selftest_block_device.c b/lib/efi_selftest/efi_selftest_block_device.c
new file mode 100644 (file)
index 0000000..9e4b93d
--- /dev/null
@@ -0,0 +1,395 @@
+/*
+ * efi_selftest_block
+ *
+ * Copyright (c) 2017 Heinrich Schuchardt <xypron.glpk@gmx.de>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * This test checks the driver for block IO devices.
+ * A disk image is created in memory.
+ * A handle is created for the new block IO device.
+ * The block I/O protocol is installed on the handle.
+ * ConnectController is used to setup partitions and to install the simple
+ * file protocol.
+ * A known file is read from the file system and verified.
+ */
+
+#include <efi_selftest.h>
+#include "efi_selftest_disk_image.h"
+
+/* Block size of compressed disk image */
+#define COMPRESSED_DISK_IMAGE_BLOCK_SIZE 8
+
+/* Binary logarithm of the block size */
+#define LB_BLOCK_SIZE 9
+
+static struct efi_boot_services *boottime;
+
+static const efi_guid_t block_io_protocol_guid = BLOCK_IO_GUID;
+static const efi_guid_t guid_device_path = DEVICE_PATH_GUID;
+static const efi_guid_t guid_simple_file_system_protocol =
+                                       EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID;
+static efi_guid_t guid_vendor =
+       EFI_GUID(0xdbca4c98, 0x6cb0, 0x694d,
+                0x08, 0x72, 0x81, 0x9c, 0x65, 0x0c, 0xb7, 0xb8);
+
+static struct efi_device_path *dp;
+
+/* One 8 byte block of the compressed disk image */
+struct line {
+       size_t addr;
+       char *line;
+};
+
+/* Compressed disk image */
+struct compressed_disk_image {
+       size_t length;
+       struct line lines[];
+};
+
+static const struct compressed_disk_image img = EFI_ST_DISK_IMG;
+
+/* Decompressed disk image */
+static u8 *image;
+
+/*
+ * Reset service of the block IO protocol.
+ *
+ * @this       block IO protocol
+ * @return     status code
+ */
+static efi_status_t EFIAPI reset(
+                       struct efi_block_io *this,
+                       char extended_verification)
+{
+       return EFI_SUCCESS;
+}
+
+/*
+ * Read service of the block IO protocol.
+ *
+ * @this       block IO protocol
+ * @media_id   media id
+ * @lba                start of the read in logical blocks
+ * @buffer_size        number of bytes to read
+ * @buffer     target buffer
+ * @return     status code
+ */
+static efi_status_t EFIAPI read_blocks(
+                       struct efi_block_io *this, u32 media_id, u64 lba,
+                       efi_uintn_t buffer_size, void *buffer)
+{
+       u8 *start;
+
+       if ((lba << LB_BLOCK_SIZE) + buffer_size > img.length)
+               return EFI_INVALID_PARAMETER;
+       start = image + (lba << LB_BLOCK_SIZE);
+
+       boottime->copy_mem(buffer, start, buffer_size);
+
+       return EFI_SUCCESS;
+}
+
+/*
+ * Write service of the block IO protocol.
+ *
+ * @this       block IO protocol
+ * @media_id   media id
+ * @lba                start of the write in logical blocks
+ * @buffer_size        number of bytes to read
+ * @buffer     source buffer
+ * @return     status code
+ */
+static efi_status_t EFIAPI write_blocks(
+                       struct efi_block_io *this, u32 media_id, u64 lba,
+                       efi_uintn_t buffer_size, void *buffer)
+{
+       u8 *start;
+
+       if ((lba << LB_BLOCK_SIZE) + buffer_size > img.length)
+               return EFI_INVALID_PARAMETER;
+       start = image + (lba << LB_BLOCK_SIZE);
+
+       boottime->copy_mem(start, buffer, buffer_size);
+
+       return EFI_SUCCESS;
+}
+
+/*
+ * Flush service of the block IO protocol.
+ *
+ * @this       block IO protocol
+ * @return     status code
+ */
+static efi_status_t EFIAPI flush_blocks(struct efi_block_io *this)
+{
+       return EFI_SUCCESS;
+}
+
+/*
+ * Decompress the disk image.
+ *
+ * @image      decompressed disk image
+ * @return     status code
+ */
+static efi_status_t decompress(u8 **image)
+{
+       u8 *buf;
+       size_t i;
+       size_t addr;
+       size_t len;
+       efi_status_t ret;
+
+       ret = boottime->allocate_pool(EFI_LOADER_DATA, img.length,
+                                     (void **)&buf);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Out of memory\n");
+               return ret;
+       }
+       boottime->set_mem(buf, img.length, 0);
+
+       for (i = 0; ; ++i) {
+               if (!img.lines[i].line)
+                       break;
+               addr = img.lines[i].addr;
+               len = COMPRESSED_DISK_IMAGE_BLOCK_SIZE;
+               if (addr + len > img.length)
+                       len = img.length - addr;
+               boottime->copy_mem(buf + addr, img.lines[i].line, len);
+       }
+       *image = buf;
+       return ret;
+}
+
+static struct efi_block_io_media media;
+
+static struct efi_block_io block_io = {
+       .media = &media,
+       .reset = reset,
+       .read_blocks = read_blocks,
+       .write_blocks = write_blocks,
+       .flush_blocks = flush_blocks,
+};
+
+/* Handle for the block IO device */
+static efi_handle_t disk_handle;
+
+/*
+ * Setup unit test.
+ *
+ * @handle:    handle of the loaded image
+ * @systable:  system table
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int setup(const efi_handle_t handle,
+                const struct efi_system_table *systable)
+{
+       efi_status_t ret;
+       struct efi_device_path_vendor vendor_node;
+       struct efi_device_path end_node;
+
+       boottime = systable->boottime;
+
+       decompress(&image);
+
+       block_io.media->block_size = 1 << LB_BLOCK_SIZE;
+       block_io.media->last_block = img.length >> LB_BLOCK_SIZE;
+
+       ret = boottime->install_protocol_interface(
+                               &disk_handle, &block_io_protocol_guid,
+                               EFI_NATIVE_INTERFACE, &block_io);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to install block I/O protocol\n");
+               return EFI_ST_FAILURE;
+       }
+
+       ret = boottime->allocate_pool(EFI_LOADER_DATA,
+                                     sizeof(struct efi_device_path_vendor) +
+                                     sizeof(struct efi_device_path),
+                                     (void **)&dp);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Out of memory\n");
+               return EFI_ST_FAILURE;
+       }
+       vendor_node.dp.type = DEVICE_PATH_TYPE_HARDWARE_DEVICE;
+       vendor_node.dp.sub_type = DEVICE_PATH_SUB_TYPE_VENDOR;
+       vendor_node.dp.length = sizeof(struct efi_device_path_vendor);
+
+       boottime->copy_mem(&vendor_node.guid, &guid_vendor,
+                          sizeof(efi_guid_t));
+       boottime->copy_mem(dp, &vendor_node,
+                          sizeof(struct efi_device_path_vendor));
+       end_node.type = DEVICE_PATH_TYPE_END;
+       end_node.sub_type = DEVICE_PATH_SUB_TYPE_END;
+       end_node.length = sizeof(struct efi_device_path);
+
+       boottime->copy_mem((char *)dp + sizeof(struct efi_device_path_vendor),
+                          &end_node, sizeof(struct efi_device_path));
+       ret = boottime->install_protocol_interface(&disk_handle,
+                                                  &guid_device_path,
+                                                  EFI_NATIVE_INTERFACE,
+                                                  dp);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("InstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
+       }
+       return EFI_ST_SUCCESS;
+}
+
+/*
+ * Tear down unit test.
+ *
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int teardown(void)
+{
+       efi_status_t r = EFI_ST_SUCCESS;
+
+       if (disk_handle) {
+               r = boottime->uninstall_protocol_interface(disk_handle,
+                                                          &guid_device_path,
+                                                          dp);
+               if (r != EFI_SUCCESS) {
+                       efi_st_error("Uninstall device path failed\n");
+                       return EFI_ST_FAILURE;
+               }
+               r = boottime->uninstall_protocol_interface(
+                               disk_handle, &block_io_protocol_guid,
+                               &block_io);
+               if (r != EFI_SUCCESS) {
+                       efi_st_todo(
+                               "Failed to uninstall block I/O protocol\n");
+                       return EFI_ST_SUCCESS;
+               }
+       }
+
+       if (image) {
+               r = efi_free_pool(image);
+               if (r != EFI_SUCCESS) {
+                       efi_st_error("Failed to free image\n");
+                       return EFI_ST_FAILURE;
+               }
+       }
+       return r;
+}
+
+/*
+ * Get length of device path without end tag.
+ *
+ * @dp         device path
+ * @return     length of device path in bytes
+ */
+static efi_uintn_t dp_size(struct efi_device_path *dp)
+{
+       struct efi_device_path *pos = dp;
+
+       while (pos->type != DEVICE_PATH_TYPE_END)
+               pos = (struct efi_device_path *)((char *)pos + pos->length);
+       return (char *)pos - (char *)dp;
+}
+
+/*
+ * Execute unit test.
+ *
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int execute(void)
+{
+       efi_status_t ret;
+       efi_uintn_t no_handles, i, len;
+       efi_handle_t *handles;
+       efi_handle_t handle_partition = NULL;
+       struct efi_device_path *dp_partition;
+       struct efi_simple_file_system_protocol *file_system;
+       struct efi_file_handle *root, *file;
+       u64 buf_size;
+       char buf[16] __aligned(ARCH_DMA_MINALIGN);
+
+       ret = boottime->connect_controller(disk_handle, NULL, NULL, 1);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to connect controller\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = boottime->locate_handle_buffer(
+                               BY_PROTOCOL, &guid_device_path, NULL,
+                               &no_handles, &handles);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to locate handles\n");
+               return EFI_ST_FAILURE;
+       }
+       len = dp_size(dp);
+       for (i = 0; i < no_handles; ++i) {
+               ret = boottime->open_protocol(handles[i], &guid_device_path,
+                                             (void **)&dp_partition,
+                                             NULL, NULL,
+                                             EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+               if (ret != EFI_SUCCESS) {
+                       efi_st_error("Failed to open device path protocol\n");
+                       return EFI_ST_FAILURE;
+               }
+               if (len >= dp_size(dp_partition))
+                       continue;
+               if (efi_st_memcmp(dp, dp_partition, len))
+                       continue;
+               handle_partition = handles[i];
+               break;
+       }
+       ret = boottime->free_pool(handles);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to free pool memory\n");
+               return EFI_ST_FAILURE;
+       }
+       if (!handle_partition) {
+               efi_st_error("Partition handle not found\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = boottime->open_protocol(handle_partition,
+                                     &guid_simple_file_system_protocol,
+                                     (void **)&file_system, NULL, NULL,
+                                     EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to open simple file system protocol\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = file_system->open_volume(file_system, &root);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to open volume\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = root->open(root, &file, (s16 *)L"hello.txt", EFI_FILE_MODE_READ,
+                        0);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to open file\n");
+               return EFI_ST_FAILURE;
+       }
+       buf_size = sizeof(buf) - 1;
+       ret = file->read(file, &buf_size, buf);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to read file\n");
+               return EFI_ST_FAILURE;
+       }
+       if (efi_st_memcmp(buf, "Hello world!", 12)) {
+               efi_st_error("Unexpected file content\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = file->close(file);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to close file\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = root->close(root);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to close volume\n");
+               return EFI_ST_FAILURE;
+       }
+
+       return EFI_ST_SUCCESS;
+}
+
+EFI_UNIT_TEST(blkdev) = {
+       .name = "block device",
+       .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+       .setup = setup,
+       .execute = execute,
+       .teardown = teardown,
+};
index 6a7fd20da5c51b008fd0794b07c96345c50225cc..e1649f48bc4bc874add10169a4e0a6cf41eb127a 100644 (file)
@@ -130,22 +130,25 @@ static void int2dec(s32 value, u16 **buf)
 }
 
 /*
- * Print a formatted string to the EFI console
+ * Print a colored formatted string to the EFI console
  *
- * @fmt: format string
- * @...: optional arguments
+ * @color      color, see constants in efi_api.h, use -1 for no color
+ * @fmt                format string
+ * @...                optional arguments
  */
-void efi_st_printf(const char *fmt, ...)
+void efi_st_printc(int color, const char *fmt, ...)
 {
        va_list args;
        u16 buf[160];
        const char *c;
        u16 *pos = buf;
        const char *s;
-       const u16 *u;
+       u16 *u;
 
        va_start(args, fmt);
 
+       if (color >= 0)
+               con_out->set_attribute(con_out, (unsigned long)color);
        c = fmt;
        for (; *c; ++c) {
                switch (*c) {
@@ -188,9 +191,13 @@ void efi_st_printf(const char *fmt, ...)
                                /* u16 string */
                                case 's':
                                        u = va_arg(args, u16*);
-                                       /* Ensure string fits into buffer */
-                                       for (; *u && pos < buf + 120; ++u)
-                                               *pos++ = *u;
+                                       if (pos > buf) {
+                                               *pos = 0;
+                                               con_out->output_string(con_out,
+                                                                      buf);
+                                       }
+                                       con_out->output_string(con_out, u);
+                                       pos = buf;
                                        break;
                                default:
                                        --c;
@@ -216,6 +223,8 @@ void efi_st_printf(const char *fmt, ...)
        va_end(args);
        *pos = 0;
        con_out->output_string(con_out, buf);
+       if (color >= 0)
+               con_out->set_attribute(con_out, EFI_LIGHTGRAY);
 }
 
 /*
diff --git a/lib/efi_selftest/efi_selftest_controllers.c b/lib/efi_selftest/efi_selftest_controllers.c
new file mode 100644 (file)
index 0000000..1a22aba
--- /dev/null
@@ -0,0 +1,385 @@
+/*
+ * efi_selftest_controllers
+ *
+ * Copyright (c) 2017 Heinrich Schuchardt <xypron.glpk@gmx.de>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * This unit test checks the following protocol services:
+ * ConnectController, DisconnectController,
+ * InstallProtocol, UninstallProtocol,
+ * OpenProtocol, CloseProtcol, OpenProtocolInformation
+ */
+
+#include <efi_selftest.h>
+
+#define NUMBER_OF_CHILD_CONTROLLERS 4
+
+static struct efi_boot_services *boottime;
+const efi_guid_t guid_driver_binding_protocol =
+                       EFI_DRIVER_BINDING_PROTOCOL_GUID;
+static efi_guid_t guid_controller =
+       EFI_GUID(0xe6ab1d96, 0x6bff, 0xdb42,
+                0xaa, 0x05, 0xc8, 0x1f, 0x7f, 0x45, 0x26, 0x34);
+static efi_guid_t guid_child_controller =
+       EFI_GUID(0x1d41f6f5, 0x2c41, 0xddfb,
+                0xe2, 0x9b, 0xb8, 0x0e, 0x2e, 0xe8, 0x3a, 0x85);
+static efi_handle_t handle_controller;
+static efi_handle_t handle_child_controller[NUMBER_OF_CHILD_CONTROLLERS];
+static efi_handle_t handle_driver;
+
+/*
+ * Count child controllers
+ *
+ * @handle     handle on which child controllers are installed
+ * @protocol   protocol for which the child controlles where installed
+ * @count      number of child controllers
+ * @return     status code
+ */
+static efi_status_t count_child_controllers(efi_handle_t handle,
+                                           efi_guid_t *protocol,
+                                           efi_uintn_t *count)
+{
+       efi_status_t ret;
+       efi_uintn_t entry_count;
+       struct efi_open_protocol_info_entry *entry_buffer;
+
+       *count = 0;
+       ret = boottime->open_protocol_information(handle, protocol,
+                                                 &entry_buffer, &entry_count);
+       if (ret != EFI_SUCCESS)
+               return ret;
+       if (!entry_count)
+               return EFI_SUCCESS;
+       while (entry_count) {
+               if (entry_buffer[--entry_count].attributes &
+                   EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER)
+                       ++*count;
+       }
+       ret = boottime->free_pool(entry_buffer);
+       if (ret != EFI_SUCCESS)
+               efi_st_error("Cannot free buffer\n");
+       return ret;
+}
+
+/*
+ * Check if the driver supports the controller.
+ *
+ * @this                       driver binding protocol
+ * @controller_handle          handle of the controller
+ * @remaining_device_path      path specifying the child controller
+ * @return                     status code
+ */
+static efi_status_t EFIAPI supported(
+               struct efi_driver_binding_protocol *this,
+               efi_handle_t controller_handle,
+               struct efi_device_path *remaining_device_path)
+{
+       efi_status_t ret;
+       void *interface;
+
+       ret = boottime->open_protocol(
+                       controller_handle, &guid_controller,
+                       &interface, handle_driver,
+                       controller_handle, EFI_OPEN_PROTOCOL_BY_DRIVER);
+       switch (ret) {
+       case EFI_ACCESS_DENIED:
+       case EFI_ALREADY_STARTED:
+               return ret;
+       case EFI_SUCCESS:
+               break;
+       default:
+               return EFI_UNSUPPORTED;
+       }
+       ret = boottime->close_protocol(
+                               controller_handle, &guid_controller,
+                               handle_driver, controller_handle);
+       if (ret != EFI_SUCCESS)
+               ret = EFI_UNSUPPORTED;
+       return ret;
+}
+
+/*
+ * Create child controllers and attach driver.
+ *
+ * @this                       driver binding protocol
+ * @controller_handle          handle of the controller
+ * @remaining_device_path      path specifying the child controller
+ * @return                     status code
+ */
+static efi_status_t EFIAPI start(
+               struct efi_driver_binding_protocol *this,
+               efi_handle_t controller_handle,
+               struct efi_device_path *remaining_device_path)
+{
+       size_t i;
+       efi_status_t ret;
+       void *interface;
+
+       /* Attach driver to controller */
+       ret = boottime->open_protocol(
+                       controller_handle, &guid_controller,
+                       &interface, handle_driver,
+                       controller_handle, EFI_OPEN_PROTOCOL_BY_DRIVER);
+       switch (ret) {
+       case EFI_ACCESS_DENIED:
+       case EFI_ALREADY_STARTED:
+               return ret;
+       case EFI_SUCCESS:
+               break;
+       default:
+               return EFI_UNSUPPORTED;
+       }
+
+       /* Create child controllers */
+       for (i = 0; i < NUMBER_OF_CHILD_CONTROLLERS; ++i) {
+               ret = boottime->install_protocol_interface(
+                       &handle_child_controller[i], &guid_child_controller,
+                       EFI_NATIVE_INTERFACE, NULL);
+               if (ret != EFI_SUCCESS) {
+                       efi_st_error("InstallProtocolInterface failed\n");
+                       return EFI_ST_FAILURE;
+               }
+               ret = boottime->open_protocol(
+                       controller_handle, &guid_controller,
+                       &interface, handle_child_controller[i],
+                       handle_child_controller[i],
+                       EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER);
+               if (ret != EFI_SUCCESS) {
+                       efi_st_error("OpenProtocol failed\n");
+                       return EFI_ST_FAILURE;
+               }
+       }
+       return ret;
+}
+
+/*
+ * Remove a single child controller from the parent controller.
+ *
+ * @controller_handle  parent controller
+ * @child_handle       child controller
+ * @return             status code
+ */
+static efi_status_t disconnect_child(efi_handle_t controller_handle,
+                                    efi_handle_t child_handle)
+{
+       efi_status_t ret;
+
+       ret = boottime->close_protocol(
+                               controller_handle, &guid_controller,
+                               child_handle, child_handle);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Cannot close protocol\n");
+               return ret;
+       }
+       ret = boottime->uninstall_protocol_interface(
+                               child_handle, &guid_child_controller, NULL);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Cannot uninstall protocol interface\n");
+               return ret;
+       }
+       return ret;
+}
+
+/*
+ * Remove child controllers and disconnect the controller.
+ *
+ * @this                       driver binding protocol
+ * @controller_handle          handle of the controller
+ * @number_of_children         number of child controllers to remove
+ * @child_handle_buffer                handles of the child controllers to remove
+ * @return                     status code
+ */
+static efi_status_t EFIAPI stop(
+               struct efi_driver_binding_protocol *this,
+               efi_handle_t controller_handle,
+               size_t number_of_children,
+               efi_handle_t *child_handle_buffer)
+{
+       efi_status_t ret;
+       efi_uintn_t count;
+       struct efi_open_protocol_info_entry *entry_buffer;
+
+       /* Destroy provided child controllers */
+       if (number_of_children) {
+               efi_uintn_t i;
+
+               for (i = 0; i < number_of_children; ++i) {
+                       ret = disconnect_child(controller_handle,
+                                              child_handle_buffer[i]);
+                       if (ret != EFI_SUCCESS)
+                               return ret;
+               }
+               return EFI_SUCCESS;
+       }
+
+       /* Destroy all children */
+       ret = boottime->open_protocol_information(
+                                       controller_handle, &guid_controller,
+                                       &entry_buffer, &count);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("OpenProtocolInformation failed\n");
+               return ret;
+       }
+       while (count) {
+               if (entry_buffer[--count].attributes &
+                   EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {
+                       ret = disconnect_child(
+                                       controller_handle,
+                                       entry_buffer[count].agent_handle);
+                       if (ret != EFI_SUCCESS)
+                               return ret;
+               }
+       }
+       ret = boottime->free_pool(entry_buffer);
+       if (ret != EFI_SUCCESS)
+               efi_st_error("Cannot free buffer\n");
+
+       /* Detach driver from controller */
+       ret = boottime->close_protocol(
+                       controller_handle, &guid_controller,
+                       handle_driver, controller_handle);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Cannot close protocol\n");
+               return ret;
+       }
+       return EFI_SUCCESS;
+}
+
+/* Driver binding protocol interface */
+static struct efi_driver_binding_protocol binding_interface = {
+       supported,
+       start,
+       stop,
+       0xffffffff,
+       NULL,
+       NULL,
+       };
+
+/*
+ * Setup unit test.
+ *
+ * @handle     handle of the loaded image
+ * @systable   system table
+ */
+static int setup(const efi_handle_t img_handle,
+                const struct efi_system_table *systable)
+{
+       efi_status_t ret;
+
+       boottime = systable->boottime;
+
+       /* Create controller handle */
+       ret = boottime->install_protocol_interface(
+                       &handle_controller, &guid_controller,
+                       EFI_NATIVE_INTERFACE, NULL);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("InstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
+       }
+       /* Create driver handle */
+       ret = boottime->install_protocol_interface(
+                       &handle_driver,  &guid_driver_binding_protocol,
+                       EFI_NATIVE_INTERFACE, &binding_interface);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("InstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
+       }
+
+       return EFI_ST_SUCCESS;
+}
+
+/*
+ * Execute unit test.
+ *
+ * The number of child controllers is checked after each of the following
+ * actions:
+ *
+ * Connect a controller to a driver.
+ * Disconnect and destroy a child controller.
+ * Disconnect and destroy the remaining child controllers.
+ *
+ * Connect a controller to a driver.
+ * Uninstall the driver protocol from the controller.
+ */
+static int execute(void)
+{
+       efi_status_t ret;
+       efi_uintn_t count;
+
+       /* Connect controller to driver */
+       ret = boottime->connect_controller(handle_controller, NULL, NULL, 1);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to connect controller\n");
+               return EFI_ST_FAILURE;
+       }
+       /* Check number of child controllers */
+       ret = count_child_controllers(handle_controller, &guid_controller,
+                                     &count);
+       if (ret != EFI_SUCCESS || count != NUMBER_OF_CHILD_CONTROLLERS) {
+               efi_st_error("Number of children %u != %u\n",
+                            (unsigned int)count, NUMBER_OF_CHILD_CONTROLLERS);
+       }
+       /* Destroy second child controller */
+       ret = boottime->disconnect_controller(handle_controller,
+                                             handle_driver,
+                                             handle_child_controller[1]);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to disconnect child controller\n");
+               return EFI_ST_FAILURE;
+       }
+       /* Check number of child controllers */
+       ret = count_child_controllers(handle_controller, &guid_controller,
+                                     &count);
+       if (ret != EFI_SUCCESS || count != NUMBER_OF_CHILD_CONTROLLERS - 1) {
+               efi_st_error("Destroying single child controller failed\n");
+               return EFI_ST_FAILURE;
+       }
+       /* Destroy remaining child controllers and disconnect controller */
+       ret = boottime->disconnect_controller(handle_controller, NULL, NULL);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to disconnect controller\n");
+               return EFI_ST_FAILURE;
+       }
+       /* Check number of child controllers */
+       ret = count_child_controllers(handle_controller, &guid_controller,
+                                     &count);
+       if (ret != EFI_SUCCESS || count) {
+               efi_st_error("Destroying child controllers failed\n");
+               return EFI_ST_FAILURE;
+       }
+
+       /* Connect controller to driver */
+       ret = boottime->connect_controller(handle_controller, NULL, NULL, 1);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to connect controller\n");
+               return EFI_ST_FAILURE;
+       }
+       /* Check number of child controllers */
+       ret = count_child_controllers(handle_controller, &guid_controller,
+                                     &count);
+       if (ret != EFI_SUCCESS || count != NUMBER_OF_CHILD_CONTROLLERS) {
+               efi_st_error("Number of children %u != %u\n",
+                            (unsigned int)count, NUMBER_OF_CHILD_CONTROLLERS);
+       }
+       /* Uninstall controller protocol */
+       ret = boottime->uninstall_protocol_interface(handle_controller,
+                                                    &guid_controller, NULL);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to uninstall protocols\n");
+               return EFI_ST_FAILURE;
+       }
+       /* Check number of child controllers */
+       ret = count_child_controllers(handle_controller, &guid_controller,
+                                     &count);
+       if (ret == EFI_SUCCESS)
+               efi_st_error("Uninstall failed\n");
+       return EFI_ST_SUCCESS;
+}
+
+EFI_UNIT_TEST(controllers) = {
+       .name = "controllers",
+       .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+       .setup = setup,
+       .execute = execute,
+};
index 1ab54ebb371b385fc16cac55c29d5cd07f1bf1a1..92940c7ab67305e6db20d7706b08dc4cd1948c9f 100644 (file)
@@ -192,31 +192,41 @@ static int teardown(void)
 {
        efi_status_t ret;
 
-       ret = boottime->uninstall_protocol_interface(&handle1,
+       ret = boottime->uninstall_protocol_interface(handle1,
                                                     &guid_device_path,
                                                     dp1);
-       if (ret != EFI_SUCCESS)
-               efi_st_todo("UninstallProtocolInterface failed\n");
-       ret = boottime->uninstall_protocol_interface(&handle1,
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("UninstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = boottime->uninstall_protocol_interface(handle1,
                                                     &guid_protocol,
                                                     &interface);
-       if (ret != EFI_SUCCESS)
-               efi_st_todo("UninstallProtocolInterface failed\n");
-       ret = boottime->uninstall_protocol_interface(&handle2,
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("UninstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = boottime->uninstall_protocol_interface(handle2,
                                                     &guid_device_path,
                                                     dp2);
-       if (ret != EFI_SUCCESS)
-               efi_st_todo("UninstallProtocolInterface failed\n");
-       ret = boottime->uninstall_protocol_interface(&handle2,
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("UninstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = boottime->uninstall_protocol_interface(handle2,
                                                     &guid_protocol,
                                                     &interface);
-       if (ret != EFI_SUCCESS)
-               efi_st_todo("UninstallProtocolInterface failed\n");
-       ret = boottime->uninstall_protocol_interface(&handle3,
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("UninstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = boottime->uninstall_protocol_interface(handle3,
                                                     &guid_device_path,
                                                     dp3);
-       if (ret != EFI_SUCCESS)
-               efi_st_todo("UninstallProtocolInterface failed\n");
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("UninstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
+       }
        if (dp1) {
                ret = boottime->free_pool(dp1);
                if (ret != EFI_SUCCESS) {
@@ -299,17 +309,16 @@ static int execute(void)
                        efi_st_error("FreePool failed\n");
                        return EFI_ST_FAILURE;
                }
-               ret = boottime->close_protocol(handles[i], &guid_device_path,
-                                              NULL, NULL);
-               if (ret != EFI_SUCCESS)
-                       efi_st_todo("Cannot close device path protocol.\n");
+               /*
+                * CloseProtocol cannot be called without agent handle.
+                * There is no need to close the device path protocol.
+                */
        }
        ret = boottime->free_pool(handles);
        if (ret != EFI_SUCCESS) {
                efi_st_error("FreePool failed\n");
                return EFI_ST_FAILURE;
        }
-       efi_st_printf("\n");
 
        /* Test ConvertDevicePathToText */
        string = device_path_to_text->convert_device_path_to_text(
@@ -318,15 +327,14 @@ static int execute(void)
                efi_st_error("ConvertDevicePathToText failed\n");
                return EFI_ST_FAILURE;
        }
-       efi_st_printf("dp2: %ps\n", string);
        if (efi_st_strcmp_16_8(
                string,
                "/VenHw(dbca4c98-6cb0-694d-0872-819c650cbbb1)/VenHw(dbca4c98-6cb0-694d-0872-819c650cbba2)")
            ) {
+               efi_st_printf("dp2: %ps\n", string);
                efi_st_error("Incorrect text from ConvertDevicePathToText\n");
                return EFI_ST_FAILURE;
        }
-
        ret = boottime->free_pool(string);
        if (ret != EFI_SUCCESS) {
                efi_st_error("FreePool failed\n");
@@ -340,17 +348,17 @@ static int execute(void)
                efi_st_error("ConvertDeviceNodeToText failed\n");
                return EFI_ST_FAILURE;
        }
-       efi_st_printf("dp_node: %ps\n", string);
-       ret = boottime->free_pool(string);
-       if (ret != EFI_SUCCESS) {
-               efi_st_error("FreePool failed\n");
-               return EFI_ST_FAILURE;
-       }
        if (efi_st_strcmp_16_8(string, "u-boot")) {
+               efi_st_printf("dp_node: %ps\n", string);
                efi_st_error(
                        "Incorrect conversion by ConvertDeviceNodeToText\n");
                return EFI_ST_FAILURE;
        }
+       ret = boottime->free_pool(string);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("FreePool failed\n");
+               return EFI_ST_FAILURE;
+       }
 
        /* Test LocateDevicePath */
        remaining_dp = (struct efi_device_path *)dp3;
@@ -370,13 +378,18 @@ static int execute(void)
                efi_st_error("ConvertDevicePathToText failed\n");
                return EFI_ST_FAILURE;
        }
-       efi_st_printf("remaining device path: %ps\n", string);
        if (efi_st_strcmp_16_8(string,
                               "/VenHw(dbca4c98-6cb0-694d-0872-819c650cbbc3)")
            ) {
+               efi_st_printf("remaining device path: %ps\n", string);
                efi_st_error("LocateDevicePath: wrong remaining device path\n");
                return EFI_ST_FAILURE;
        }
+       ret = boottime->free_pool(string);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("FreePool failed\n");
+               return EFI_ST_FAILURE;
+       }
 
        return EFI_ST_SUCCESS;
 }
diff --git a/lib/efi_selftest/efi_selftest_disk_image.h b/lib/efi_selftest/efi_selftest_disk_image.h
new file mode 100644 (file)
index 0000000..4775dac
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ *  Non-zero 8 byte strings of a disk image
+ *
+ *  Generated with tools/file2include
+ *
+ *  SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#define EFI_ST_DISK_IMG { 0x00010000, { \
+       {0x000001b8, "\x94\x37\x69\xfc\x00\x00\x00\x00"}, /* .7i..... */ \
+       {0x000001c0, "\x02\x00\x83\x02\x02\x00\x01\x00"}, /* ........ */ \
+       {0x000001c8, "\x00\x00\x7f\x00\x00\x00\x00\x00"}, /* ........ */ \
+       {0x000001f8, "\x00\x00\x00\x00\x00\x00\x55\xaa"}, /* ......U. */ \
+       {0x00000200, "\xeb\x3c\x90\x6d\x6b\x66\x73\x2e"}, /* .<.mkfs. */ \
+       {0x00000208, "\x66\x61\x74\x00\x02\x04\x01\x00"}, /* fat..... */ \
+       {0x00000210, "\x02\x00\x02\x7f\x00\xf8\x01\x00"}, /* ........ */ \
+       {0x00000218, "\x20\x00\x40\x00\x00\x00\x00\x00"}, /*  .@..... */ \
+       {0x00000220, "\x00\x00\x00\x00\x80\x00\x29\x86"}, /* ......). */ \
+       {0x00000228, "\xe8\x82\x80\x4e\x4f\x20\x4e\x41"}, /* ...NO NA */ \
+       {0x00000230, "\x4d\x45\x20\x20\x20\x20\x46\x41"}, /* ME    FA */ \
+       {0x00000238, "\x54\x31\x32\x20\x20\x20\x0e\x1f"}, /* T12   .. */ \
+       {0x00000240, "\xbe\x5b\x7c\xac\x22\xc0\x74\x0b"}, /* .[|.".t. */ \
+       {0x00000248, "\x56\xb4\x0e\xbb\x07\x00\xcd\x10"}, /* V....... */ \
+       {0x00000250, "\x5e\xeb\xf0\x32\xe4\xcd\x16\xcd"}, /* ^..2.... */ \
+       {0x00000258, "\x19\xeb\xfe\x54\x68\x69\x73\x20"}, /* ...This  */ \
+       {0x00000260, "\x69\x73\x20\x6e\x6f\x74\x20\x61"}, /* is not a */ \
+       {0x00000268, "\x20\x62\x6f\x6f\x74\x61\x62\x6c"}, /*  bootabl */ \
+       {0x00000270, "\x65\x20\x64\x69\x73\x6b\x2e\x20"}, /* e disk.  */ \
+       {0x00000278, "\x20\x50\x6c\x65\x61\x73\x65\x20"}, /*  Please  */ \
+       {0x00000280, "\x69\x6e\x73\x65\x72\x74\x20\x61"}, /* insert a */ \
+       {0x00000288, "\x20\x62\x6f\x6f\x74\x61\x62\x6c"}, /*  bootabl */ \
+       {0x00000290, "\x65\x20\x66\x6c\x6f\x70\x70\x79"}, /* e floppy */ \
+       {0x00000298, "\x20\x61\x6e\x64\x0d\x0a\x70\x72"}, /*  and..pr */ \
+       {0x000002a0, "\x65\x73\x73\x20\x61\x6e\x79\x20"}, /* ess any  */ \
+       {0x000002a8, "\x6b\x65\x79\x20\x74\x6f\x20\x74"}, /* key to t */ \
+       {0x000002b0, "\x72\x79\x20\x61\x67\x61\x69\x6e"}, /* ry again */ \
+       {0x000002b8, "\x20\x2e\x2e\x2e\x20\x0d\x0a\x00"}, /*  ... ... */ \
+       {0x000003f8, "\x00\x00\x00\x00\x00\x00\x55\xaa"}, /* ......U. */ \
+       {0x00000400, "\xf8\xff\xff\x00\x00\x00\x00\xf0"}, /* ........ */ \
+       {0x00000408, "\xff\x00\x00\x00\x00\x00\x00\x00"}, /* ........ */ \
+       {0x00000600, "\xf8\xff\xff\x00\x00\x00\x00\xf0"}, /* ........ */ \
+       {0x00000608, "\xff\x00\x00\x00\x00\x00\x00\x00"}, /* ........ */ \
+       {0x00000800, "\xe5\x70\x00\x00\x00\xff\xff\xff"}, /* .p...... */ \
+       {0x00000808, "\xff\xff\xff\x0f\x00\x0e\xff\xff"}, /* ........ */ \
+       {0x00000810, "\xff\xff\xff\xff\xff\xff\xff\xff"}, /* ........ */ \
+       {0x00000818, "\xff\xff\x00\x00\xff\xff\xff\xff"}, /* ........ */ \
+       {0x00000820, "\xe5\x2e\x00\x68\x00\x65\x00\x6c"}, /* ...h.e.l */ \
+       {0x00000828, "\x00\x6c\x00\x0f\x00\x0e\x6f\x00"}, /* .l....o. */ \
+       {0x00000830, "\x2e\x00\x74\x00\x78\x00\x74\x00"}, /* ..t.x.t. */ \
+       {0x00000838, "\x2e\x00\x00\x00\x73\x00\x77\x00"}, /* ....s.w. */ \
+       {0x00000840, "\xe5\x45\x4c\x4c\x4f\x54\x7e\x31"}, /* .ELLOT~1 */ \
+       {0x00000848, "\x53\x57\x50\x20\x00\x64\xd0\x8a"}, /* SWP .d.. */ \
+       {0x00000850, "\x92\x4b\x92\x4b\x00\x00\xd0\x8a"}, /* .K.K.... */ \
+       {0x00000858, "\x92\x4b\x00\x00\x00\x00\x00\x00"}, /* .K...... */ \
+       {0x00000860, "\x41\x68\x00\x65\x00\x6c\x00\x6c"}, /* Ah.e.l.l */ \
+       {0x00000868, "\x00\x6f\x00\x0f\x00\xf1\x2e\x00"}, /* .o...... */ \
+       {0x00000870, "\x74\x00\x78\x00\x74\x00\x00\x00"}, /* t.x.t... */ \
+       {0x00000878, "\xff\xff\x00\x00\xff\xff\xff\xff"}, /* ........ */ \
+       {0x00000880, "\x48\x45\x4c\x4c\x4f\x20\x20\x20"}, /* HELLO    */ \
+       {0x00000888, "\x54\x58\x54\x20\x00\x64\xd4\x8a"}, /* TXT .d.. */ \
+       {0x00000890, "\x92\x4b\x92\x4b\x00\x00\xd4\x8a"}, /* .K.K.... */ \
+       {0x00000898, "\x92\x4b\x05\x00\x0d\x00\x00\x00"}, /* .K...... */ \
+       {0x000008a0, "\xe5\x45\x4c\x4c\x4f\x54\x7e\x31"}, /* .ELLOT~1 */ \
+       {0x000008a8, "\x53\x57\x58\x20\x00\x64\xd0\x8a"}, /* SWX .d.. */ \
+       {0x000008b0, "\x92\x4b\x92\x4b\x00\x00\xd0\x8a"}, /* .K.K.... */ \
+       {0x000008b8, "\x92\x4b\x00\x00\x00\x00\x00\x00"}, /* .K...... */ \
+       {0x00006000, "\x48\x65\x6c\x6c\x6f\x20\x77\x6f"}, /* Hello wo */ \
+       {0x00006008, "\x72\x6c\x64\x21\x0a\x00\x00\x00"}, /* rld!.... */ \
+       {0, NULL} } }
index ad9490bd250ca5e2a4ada2e1c0214331aeb59059..5393e393523a1331ff032f69b417d9da744ca9a0 100644 (file)
@@ -142,8 +142,8 @@ static int execute(void)
                efi_st_error("WaitForEvent returned wrong index\n");
                return EFI_ST_FAILURE;
        }
-       efi_st_printf("Notification count periodic: %u\n", timer_ticks);
        if (timer_ticks < 8 || timer_ticks > 12) {
+               efi_st_printf("Notification count periodic: %u\n", timer_ticks);
                efi_st_error("Incorrect timing of events\n");
                return EFI_ST_FAILURE;
        }
@@ -170,8 +170,9 @@ static int execute(void)
                efi_st_error("Could not wait for event\n");
                return EFI_ST_FAILURE;
        }
-       efi_st_printf("Notification count single shot: %u\n", timer_ticks);
        if (timer_ticks != 1) {
+               efi_st_printf("Notification count single shot: %u\n",
+                             timer_ticks);
                efi_st_error("Single shot timer failed\n");
                return EFI_ST_FAILURE;
        }
@@ -180,8 +181,9 @@ static int execute(void)
                efi_st_error("Could not wait for event\n");
                return EFI_ST_FAILURE;
        }
-       efi_st_printf("Notification count stopped timer: %u\n", timer_ticks);
        if (timer_ticks != 1) {
+               efi_st_printf("Notification count stopped timer: %u\n",
+                             timer_ticks);
                efi_st_error("Stopped timer fired\n");
                return EFI_ST_FAILURE;
        }
index f20f1528d471e9989e556d26e010cfaea0eee6f3..874f86102d0787721eca89e653efb3a3a6f498f1 100644 (file)
@@ -194,7 +194,7 @@ static int execute(void)
                                                &guid3, &interface3,
                                                NULL);
        if (ret == EFI_SUCCESS) {
-               efi_st_todo("UninstallMultipleProtocolInterfaces did not catch error\n");
+               efi_st_error("UninstallMultipleProtocolInterfaces did not catch error\n");
                return EFI_ST_FAILURE;
        }
 
@@ -273,8 +273,8 @@ static int execute(void)
                                                &guid2, &interface2,
                                                NULL);
        if (ret != EFI_SUCCESS) {
-               efi_st_todo("UninstallMultipleProtocolInterfaces failed\n");
-               /* This test is known to fail due to missing implementation */
+               efi_st_error("UninstallMultipleProtocolInterfaces failed\n");
+               return EFI_ST_FAILURE;
        }
        /*
         * Check that the protocols are really uninstalled.
@@ -287,8 +287,8 @@ static int execute(void)
                return EFI_ST_FAILURE;
        }
        if (count != 1) {
-               efi_st_todo("UninstallMultipleProtocolInterfaces failed to uninstall protocols\n");
-               /* This test is known to fail due to missing implementation */
+               efi_st_error("UninstallMultipleProtocolInterfaces failed to uninstall protocols\n");
+               return EFI_ST_FAILURE;
        }
        ret = find_in_buffer(handle1, count, buffer);
        if (ret != EFI_SUCCESS) {
@@ -327,19 +327,19 @@ static int execute(void)
        ret = boottime->uninstall_protocol_interface(handle1, &guid1,
                                                     &interface1);
        if (ret != EFI_SUCCESS) {
-               efi_st_todo("UninstallProtocolInterface failed\n");
-               /* This test is known to fail due to missing implementation */
+               efi_st_error("UninstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
        }
        ret = boottime->handle_protocol(handle1, &guid1, (void **)&interface);
        if (ret == EFI_SUCCESS) {
-               efi_st_todo("UninstallProtocolInterface failed\n");
-               /* This test is known to fail due to missing implementation */
+               efi_st_error("UninstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
        }
        ret = boottime->uninstall_protocol_interface(handle1, &guid3,
                                                     &interface1);
        if (ret != EFI_SUCCESS) {
-               efi_st_todo("UninstallProtocolInterface failed\n");
-               /* This test is known to fail due to missing implementation */
+               efi_st_error("UninstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
        }
 
        return EFI_ST_SUCCESS;
diff --git a/lib/efi_selftest/efi_selftest_miniapp_exit.c b/lib/efi_selftest/efi_selftest_miniapp_exit.c
new file mode 100644 (file)
index 0000000..5ec57ab
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * efi_selftest_miniapp_exit
+ *
+ * Copyright (c) 2018 Heinrich Schuchardt
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * This EFI application is run by the StartImage selftest.
+ * It uses the Exit boot service to return.
+ */
+
+#include <common.h>
+#include <efi_api.h>
+
+/*
+ * Entry point of the EFI application.
+ *
+ * @handle     handle of the loaded image
+ * @systable   system table
+ * @return     status code
+ */
+efi_status_t EFIAPI efi_main(efi_handle_t handle,
+                            struct efi_system_table *systable)
+{
+       struct efi_simple_text_output_protocol *con_out = systable->con_out;
+
+       con_out->output_string(con_out, L"EFI application calling Exit\n");
+
+       /* The return value is checked by the calling test */
+       systable->boottime->exit(handle, EFI_UNSUPPORTED, 0, NULL);
+
+       /*
+        * This statement should not be reached.
+        * To enable testing use a different return value.
+        */
+       return EFI_SUCCESS;
+}
diff --git a/lib/efi_selftest/efi_selftest_miniapp_return.c b/lib/efi_selftest/efi_selftest_miniapp_return.c
new file mode 100644 (file)
index 0000000..0a82391
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * efi_selftest_miniapp_return
+ *
+ * Copyright (c) 2018 Heinrich Schuchardt
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * This EFI application is run by the StartImage selftest.
+ * It returns directly without calling the Exit boot service.
+ */
+
+#include <common.h>
+#include <efi_api.h>
+
+/*
+ * Entry point of the EFI application.
+ *
+ * @handle     handle of the loaded image
+ * @systable   system table
+ * @return     status code
+ */
+efi_status_t EFIAPI efi_main(efi_handle_t handle,
+                            struct efi_system_table *systable)
+{
+       struct efi_simple_text_output_protocol *con_out = systable->con_out;
+
+       con_out->output_string(con_out,
+                              L"EFI application returning w/o calling Exit\n");
+
+       /* The return value is checked by the calling test */
+       return EFI_INCOMPATIBLE_VERSION;
+}
diff --git a/lib/efi_selftest/efi_selftest_startimage_exit.c b/lib/efi_selftest/efi_selftest_startimage_exit.c
new file mode 100644 (file)
index 0000000..0809690
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ * efi_selftest_start_image
+ *
+ * Copyright (c) 2018 Heinrich Schuchardt <xypron.glpk@gmx.de>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * This test checks the StartImage boot service.
+ * The efi_selftest_miniapp_exit.efi application is loaded into memory
+ * and started.
+ */
+
+#include <efi_selftest.h>
+/* Include containing the miniapp.efi application */
+#include "efi_miniapp_file_image_exit.h"
+
+/* Block size of compressed disk image */
+#define COMPRESSED_DISK_IMAGE_BLOCK_SIZE 8
+
+/* Binary logarithm of the block size */
+#define LB_BLOCK_SIZE 9
+
+static efi_handle_t image_handle;
+static struct efi_boot_services *boottime;
+
+/* One 8 byte block of the compressed disk image */
+struct line {
+       size_t addr;
+       char *line;
+};
+
+/* Compressed file image */
+struct compressed_file_image {
+       size_t length;
+       struct line lines[];
+};
+
+static struct compressed_file_image img = EFI_ST_DISK_IMG;
+
+/* Decompressed file image */
+static u8 *image;
+
+/*
+ * Decompress the disk image.
+ *
+ * @image      decompressed disk image
+ * @return     status code
+ */
+static efi_status_t decompress(u8 **image)
+{
+       u8 *buf;
+       size_t i;
+       size_t addr;
+       size_t len;
+       efi_status_t ret;
+
+       ret = boottime->allocate_pool(EFI_LOADER_DATA, img.length,
+                                     (void **)&buf);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Out of memory\n");
+               return ret;
+       }
+       boottime->set_mem(buf, img.length, 0);
+
+       for (i = 0; ; ++i) {
+               if (!img.lines[i].line)
+                       break;
+               addr = img.lines[i].addr;
+               len = COMPRESSED_DISK_IMAGE_BLOCK_SIZE;
+               if (addr + len > img.length)
+                       len = img.length - addr;
+               boottime->copy_mem(buf + addr, img.lines[i].line, len);
+       }
+       *image = buf;
+       return ret;
+}
+
+/*
+ * Setup unit test.
+ *
+ * @handle:    handle of the loaded image
+ * @systable:  system table
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int setup(const efi_handle_t handle,
+                const struct efi_system_table *systable)
+{
+       image_handle = handle;
+       boottime = systable->boottime;
+
+       /* Load the application image into memory */
+       decompress(&image);
+
+       return EFI_ST_SUCCESS;
+}
+
+/*
+ * Tear down unit test.
+ *
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int teardown(void)
+{
+       efi_status_t r = EFI_ST_SUCCESS;
+
+       if (image) {
+               r = efi_free_pool(image);
+               if (r != EFI_SUCCESS) {
+                       efi_st_error("Failed to free image\n");
+                       return EFI_ST_FAILURE;
+               }
+       }
+       return r;
+}
+
+/*
+ * Execute unit test.
+ *
+ * Load and start the application image.
+ *
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int execute(void)
+{
+       efi_status_t ret;
+       efi_handle_t handle;
+
+       ret = boottime->load_image(false, image_handle, NULL, image,
+                                  img.length, &handle);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to load image\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = boottime->start_image(handle, NULL, NULL);
+       if (ret != EFI_UNSUPPORTED) {
+               efi_st_error("Wrong return value from application\n");
+               return EFI_ST_FAILURE;
+       }
+
+       return EFI_ST_SUCCESS;
+}
+
+EFI_UNIT_TEST(startimage_exit) = {
+       .name = "start image exit",
+       .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+       .setup = setup,
+       .execute = execute,
+       .teardown = teardown,
+};
diff --git a/lib/efi_selftest/efi_selftest_startimage_return.c b/lib/efi_selftest/efi_selftest_startimage_return.c
new file mode 100644 (file)
index 0000000..2209911
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ * efi_selftest_start_image
+ *
+ * Copyright (c) 2018 Heinrich Schuchardt <xypron.glpk@gmx.de>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * This test checks the StartImage boot service.
+ * The efi_selftest_miniapp_return.efi application is loaded into memory
+ * and started.
+ */
+
+#include <efi_selftest.h>
+/* Include containing the miniapp.efi application */
+#include "efi_miniapp_file_image_return.h"
+
+/* Block size of compressed disk image */
+#define COMPRESSED_DISK_IMAGE_BLOCK_SIZE 8
+
+/* Binary logarithm of the block size */
+#define LB_BLOCK_SIZE 9
+
+static efi_handle_t image_handle;
+static struct efi_boot_services *boottime;
+
+/* One 8 byte block of the compressed disk image */
+struct line {
+       size_t addr;
+       char *line;
+};
+
+/* Compressed file image */
+struct compressed_file_image {
+       size_t length;
+       struct line lines[];
+};
+
+static struct compressed_file_image img = EFI_ST_DISK_IMG;
+
+/* Decompressed file image */
+static u8 *image;
+
+/*
+ * Decompress the disk image.
+ *
+ * @image      decompressed disk image
+ * @return     status code
+ */
+static efi_status_t decompress(u8 **image)
+{
+       u8 *buf;
+       size_t i;
+       size_t addr;
+       size_t len;
+       efi_status_t ret;
+
+       ret = boottime->allocate_pool(EFI_LOADER_DATA, img.length,
+                                     (void **)&buf);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Out of memory\n");
+               return ret;
+       }
+       boottime->set_mem(buf, img.length, 0);
+
+       for (i = 0; ; ++i) {
+               if (!img.lines[i].line)
+                       break;
+               addr = img.lines[i].addr;
+               len = COMPRESSED_DISK_IMAGE_BLOCK_SIZE;
+               if (addr + len > img.length)
+                       len = img.length - addr;
+               boottime->copy_mem(buf + addr, img.lines[i].line, len);
+       }
+       *image = buf;
+       return ret;
+}
+
+/*
+ * Setup unit test.
+ *
+ * @handle:    handle of the loaded image
+ * @systable:  system table
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int setup(const efi_handle_t handle,
+                const struct efi_system_table *systable)
+{
+       image_handle = handle;
+       boottime = systable->boottime;
+
+       /* Load the application image into memory */
+       decompress(&image);
+
+       return EFI_ST_SUCCESS;
+}
+
+/*
+ * Tear down unit test.
+ *
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int teardown(void)
+{
+       efi_status_t r = EFI_ST_SUCCESS;
+
+       if (image) {
+               r = efi_free_pool(image);
+               if (r != EFI_SUCCESS) {
+                       efi_st_error("Failed to free image\n");
+                       return EFI_ST_FAILURE;
+               }
+       }
+       return r;
+}
+
+/*
+ * Execute unit test.
+ *
+ * Load and start the application image.
+ *
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int execute(void)
+{
+       efi_status_t ret;
+       efi_handle_t handle;
+
+       ret = boottime->load_image(false, image_handle, NULL, image,
+                                  img.length, &handle);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to load image\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = boottime->start_image(handle, NULL, NULL);
+       if (ret != EFI_INCOMPATIBLE_VERSION) {
+               efi_st_error("Wrong return value from application\n");
+               return EFI_ST_FAILURE;
+       }
+
+       return EFI_ST_SUCCESS;
+}
+
+EFI_UNIT_TEST(startimage) = {
+       .name = "start image return",
+       .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+       .setup = setup,
+       .execute = execute,
+       .teardown = teardown,
+};
index 6ea0bb7177f402e0fde6766d7e45a596ac07dc87..8243fae15ba688e73f32ef7d8e56977accc11504 100644 (file)
@@ -144,9 +144,10 @@ static int execute(void)
                efi_st_error("WaitForEvent returned wrong index\n");
                return EFI_ST_FAILURE;
        }
-       efi_st_printf("Notification count with TPL level TPL_APPLICATION: %u\n",
-                     notification_count);
        if (notification_count < 8 || notification_count > 12) {
+               efi_st_printf(
+                   "Notification count with TPL level TPL_APPLICATION: %u\n",
+                   notification_count);
                efi_st_error("Incorrect timing of events\n");
                return EFI_ST_FAILURE;
        }
@@ -181,9 +182,10 @@ static int execute(void)
                efi_st_error("Could not check event\n");
                return EFI_ST_FAILURE;
        }
-       efi_st_printf("Notification count with TPL level TPL_CALLBACK: %u\n",
-                     notification_count);
        if (notification_count != 0) {
+               efi_st_printf(
+                       "Notification count with TPL level TPL_CALLBACK: %u\n",
+                       notification_count);
                efi_st_error("Suppressed timer fired\n");
                return EFI_ST_FAILURE;
        }
@@ -200,9 +202,10 @@ static int execute(void)
                efi_st_error("Could not wait for event\n");
                return EFI_ST_FAILURE;
        }
-       efi_st_printf("Notification count with TPL level TPL_APPLICATION: %u\n",
-                     notification_count);
        if (notification_count < 1) {
+               efi_st_printf(
+                   "Notification count with TPL level TPL_APPLICATION: %u\n",
+                   notification_count);
                efi_st_error("Queued timer event did not fire\n");
                return EFI_ST_FAILURE;
        }
index 6b138faf8550de24f2f0e743facd1a20f8485415..df9d9ae4333a3f82212ab5e84f92f1c7f53a924c 100644 (file)
@@ -83,8 +83,9 @@ const char *fdtdec_get_compatible(enum fdt_compat_id id)
 }
 
 fdt_addr_t fdtdec_get_addr_size_fixed(const void *blob, int node,
-               const char *prop_name, int index, int na, int ns,
-               fdt_size_t *sizep, bool translate)
+                                     const char *prop_name, int index, int na,
+                                     int ns, fdt_size_t *sizep,
+                                     bool translate)
 {
        const fdt32_t *prop, *prop_end;
        const fdt32_t *prop_addr, *prop_size, *prop_after_size;
@@ -138,8 +139,9 @@ fdt_addr_t fdtdec_get_addr_size_fixed(const void *blob, int node,
 }
 
 fdt_addr_t fdtdec_get_addr_size_auto_parent(const void *blob, int parent,
-               int node, const char *prop_name, int index, fdt_size_t *sizep,
-               bool translate)
+                                           int node, const char *prop_name,
+                                           int index, fdt_size_t *sizep,
+                                           bool translate)
 {
        int na, ns;
 
@@ -164,8 +166,9 @@ fdt_addr_t fdtdec_get_addr_size_auto_parent(const void *blob, int parent,
 }
 
 fdt_addr_t fdtdec_get_addr_size_auto_noparent(const void *blob, int node,
-               const char *prop_name, int index, fdt_size_t *sizep,
-               bool translate)
+                                             const char *prop_name, int index,
+                                             fdt_size_t *sizep,
+                                             bool translate)
 {
        int parent;
 
@@ -182,7 +185,7 @@ fdt_addr_t fdtdec_get_addr_size_auto_noparent(const void *blob, int node,
 }
 
 fdt_addr_t fdtdec_get_addr_size(const void *blob, int node,
-               const char *prop_name, fdt_size_t *sizep)
+                               const char *prop_name, fdt_size_t *sizep)
 {
        int ns = sizep ? (sizeof(fdt_size_t) / sizeof(fdt32_t)) : 0;
 
@@ -191,15 +194,14 @@ fdt_addr_t fdtdec_get_addr_size(const void *blob, int node,
                                          ns, sizep, false);
 }
 
-fdt_addr_t fdtdec_get_addr(const void *blob, int node,
-               const char *prop_name)
+fdt_addr_t fdtdec_get_addr(const void *blob, int node, const char *prop_name)
 {
        return fdtdec_get_addr_size(blob, node, prop_name, NULL);
 }
 
 #if defined(CONFIG_PCI) && defined(CONFIG_DM_PCI)
 int fdtdec_get_pci_addr(const void *blob, int node, enum fdt_pci_space type,
-               const char *prop_name, struct fdt_pci_addr *addr)
+                       const char *prop_name, struct fdt_pci_addr *addr)
 {
        const u32 *cell;
        int len;
@@ -231,10 +233,10 @@ int fdtdec_get_pci_addr(const void *blob, int node, enum fdt_pci_space type,
                                addr->phys_mid = fdt32_to_cpu(cell[1]);
                                addr->phys_lo = fdt32_to_cpu(cell[1]);
                                break;
-                       } else {
-                               cell += (FDT_PCI_ADDR_CELLS +
-                                        FDT_PCI_SIZE_CELLS);
                        }
+
+                       cell += (FDT_PCI_ADDR_CELLS +
+                                FDT_PCI_SIZE_CELLS);
                }
 
                if (i == num) {
@@ -243,10 +245,10 @@ int fdtdec_get_pci_addr(const void *blob, int node, enum fdt_pci_space type,
                }
 
                return 0;
-       } else {
-               ret = -EINVAL;
        }
 
+       ret = -EINVAL;
+
 fail:
        debug("(not found)\n");
        return ret;
@@ -263,11 +265,9 @@ int fdtdec_get_pci_vendev(const void *blob, int node, u16 *vendor, u16 *device)
 
        end = list + len;
        while (list < end) {
-               char *s;
-
                len = strlen(list);
                if (len >= strlen("pciVVVV,DDDD")) {
-                       s = strstr(list, "pci");
+                       char *s = strstr(list, "pci");
 
                        /*
                         * check if the string is something like pciVVVV,DDDD.RR
@@ -297,7 +297,7 @@ int fdtdec_get_pci_bar32(struct udevice *dev, struct fdt_pci_addr *addr,
 
        /* extract the bar number from fdt_pci_addr */
        barnum = addr->phys_hi & 0xff;
-       if ((barnum < PCI_BASE_ADDRESS_0) || (barnum > PCI_CARDBUS_CIS))
+       if (barnum < PCI_BASE_ADDRESS_0 || barnum > PCI_CARDBUS_CIS)
                return -EINVAL;
 
        barnum = (barnum - PCI_BASE_ADDRESS_0) / 4;
@@ -308,7 +308,7 @@ int fdtdec_get_pci_bar32(struct udevice *dev, struct fdt_pci_addr *addr,
 #endif
 
 uint64_t fdtdec_get_uint64(const void *blob, int node, const char *prop_name,
-               uint64_t default_val)
+                          uint64_t default_val)
 {
        const uint64_t *cell64;
        int length;
@@ -333,7 +333,7 @@ int fdtdec_get_is_enabled(const void *blob, int node)
         */
        cell = fdt_getprop(blob, node, "status", NULL);
        if (cell)
-               return 0 == strcmp(cell, "okay");
+               return strcmp(cell, "okay") == 0;
        return 1;
 }
 
@@ -343,20 +343,19 @@ enum fdt_compat_id fdtdec_lookup(const void *blob, int node)
 
        /* Search our drivers */
        for (id = COMPAT_UNKNOWN; id < COMPAT_COUNT; id++)
-               if (0 == fdt_node_check_compatible(blob, node,
-                               compat_names[id]))
+               if (fdt_node_check_compatible(blob, node,
+                                             compat_names[id]) == 0)
                        return id;
        return COMPAT_UNKNOWN;
 }
 
-int fdtdec_next_compatible(const void *blob, int node,
-               enum fdt_compat_id id)
+int fdtdec_next_compatible(const void *blob, int node, enum fdt_compat_id id)
 {
        return fdt_node_offset_by_compatible(blob, node, compat_names[id]);
 }
 
 int fdtdec_next_compatible_subnode(const void *blob, int node,
-               enum fdt_compat_id id, int *depthp)
+                                  enum fdt_compat_id id, int *depthp)
 {
        do {
                node = fdt_next_node(blob, node, depthp);
@@ -370,8 +369,8 @@ int fdtdec_next_compatible_subnode(const void *blob, int node,
        return -FDT_ERR_NOTFOUND;
 }
 
-int fdtdec_next_alias(const void *blob, const char *name,
-               enum fdt_compat_id id, int *upto)
+int fdtdec_next_alias(const void *blob, const char *name, enum fdt_compat_id id,
+                     int *upto)
 {
 #define MAX_STR_LEN 20
        char str[MAX_STR_LEN + 20];
@@ -393,7 +392,8 @@ int fdtdec_next_alias(const void *blob, const char *name,
 }
 
 int fdtdec_find_aliases_for_id(const void *blob, const char *name,
-                       enum fdt_compat_id id, int *node_list, int maxcount)
+                              enum fdt_compat_id id, int *node_list,
+                              int maxcount)
 {
        memset(node_list, '\0', sizeof(*node_list) * maxcount);
 
@@ -402,7 +402,8 @@ int fdtdec_find_aliases_for_id(const void *blob, const char *name,
 
 /* TODO: Can we tighten this code up a little? */
 int fdtdec_add_aliases_for_id(const void *blob, const char *name,
-                       enum fdt_compat_id id, int *node_list, int maxcount)
+                             enum fdt_compat_id id, int *node_list,
+                             int maxcount)
 {
        int name_len = strlen(name);
        int nodes[maxcount];
@@ -429,7 +430,7 @@ int fdtdec_add_aliases_for_id(const void *blob, const char *name,
        }
        if (node >= 0)
                debug("%s: warning: maxcount exceeded with alias '%s'\n",
-                      __func__, name);
+                     __func__, name);
 
        /* Now find all the aliases */
        for (offset = fdt_first_property_offset(blob, alias_node);
@@ -452,7 +453,7 @@ int fdtdec_add_aliases_for_id(const void *blob, const char *name,
                number = simple_strtoul(path + name_len, NULL, 10);
                if (number < 0 || number >= maxcount) {
                        debug("%s: warning: alias '%s' is out of range\n",
-                              __func__, path);
+                             __func__, path);
                        continue;
                }
 
@@ -498,7 +499,7 @@ int fdtdec_add_aliases_for_id(const void *blob, const char *name,
                if (!node_list[i]) {
                        for (; j < maxcount; j++)
                                if (nodes[j] &&
-                                       fdtdec_get_is_enabled(blob, nodes[j]))
+                                   fdtdec_get_is_enabled(blob, nodes[j]))
                                        break;
 
                        /* Have we run out of nodes to add? */
@@ -641,7 +642,8 @@ int fdtdec_lookup_phandle(const void *blob, int node, const char *prop_name)
  * @return pointer to cell, which is only valid if err == 0
  */
 static const void *get_prop_check_min_len(const void *blob, int node,
-               const char *prop_name, int min_len, int *err)
+                                         const char *prop_name, int min_len,
+                                         int *err)
 {
        const void *cell;
        int len;
@@ -658,15 +660,17 @@ static const void *get_prop_check_min_len(const void *blob, int node,
 }
 
 int fdtdec_get_int_array(const void *blob, int node, const char *prop_name,
-               u32 *array, int count)
+                        u32 *array, int count)
 {
        const u32 *cell;
-       int i, err = 0;
+       int err = 0;
 
        debug("%s: %s\n", __func__, prop_name);
        cell = get_prop_check_min_len(blob, node, prop_name,
                                      sizeof(u32) * count, &err);
        if (!err) {
+               int i;
+
                for (i = 0; i < count; i++)
                        array[i] = fdt32_to_cpu(cell[i]);
        }
@@ -850,7 +854,7 @@ int fdtdec_get_child_count(const void *blob, int node)
 }
 
 int fdtdec_get_byte_array(const void *blob, int node, const char *prop_name,
-               u8 *array, int count)
+                         u8 *array, int count)
 {
        const u8 *cell;
        int err;
@@ -862,7 +866,7 @@ int fdtdec_get_byte_array(const void *blob, int node, const char *prop_name,
 }
 
 const u8 *fdtdec_locate_byte_array(const void *blob, int node,
-                            const char *prop_name, int count)
+                                  const char *prop_name, int count)
 {
        const u8 *cell;
        int err;
@@ -874,7 +878,7 @@ const u8 *fdtdec_locate_byte_array(const void *blob, int node,
 }
 
 int fdtdec_get_config_int(const void *blob, const char *prop_name,
-               int default_val)
+                         int default_val)
 {
        int config_node;
 
@@ -971,7 +975,8 @@ int fdt_get_resource(const void *fdt, int node, const char *property,
 
        while (ptr + na + ns <= end) {
                if (i == index) {
-                       res->start = res->end = fdtdec_get_number(ptr, na);
+                       res->start = fdtdec_get_number(ptr, na);
+                       res->end = res->start;
                        res->end += fdtdec_get_number(&ptr[na], ns) - 1;
                        return 0;
                }
index dd572d2868a5453c8cd99326a944f3ee4e20cd25..226f4eb3e5125878200fbeb1109d3ab24e41e260 100644 (file)
  * from hush: simple_itoa() was lifted from boa-0.93.15
  */
 
-#include <stdarg.h>
-#include <linux/types.h>
-#include <linux/string.h>
-#include <linux/ctype.h>
-
 #include <common.h>
 #include <charset.h>
+#include <efi_loader.h>
+#include <div64.h>
 #include <uuid.h>
+#include <stdarg.h>
+#include <linux/ctype.h>
+#include <linux/err.h>
+#include <linux/types.h>
+#include <linux/string.h>
 
-#include <div64.h>
 #define noinline __attribute__((noinline))
 
 /* we use this so that we can do without the ctype library */
@@ -292,6 +293,26 @@ static char *string16(char *buf, char *end, u16 *s, int field_width,
        return buf;
 }
 
+#if defined(CONFIG_EFI_LOADER) && \
+       !defined(CONFIG_SPL_BUILD) && !defined(API_BUILD)
+static char *device_path_string(char *buf, char *end, void *dp, int field_width,
+                               int precision, int flags)
+{
+       u16 *str;
+
+       if (!dp)
+               return "<NULL>";
+
+       str = efi_dp_str((struct efi_device_path *)dp);
+       if (!str)
+               return ERR_PTR(-ENOMEM);
+
+       buf = string16(buf, end, str, field_width, precision, flags);
+       efi_free_pool(str);
+       return buf;
+}
+#endif
+
 #ifdef CONFIG_CMD_NET
 static const char hex_asc[] = "0123456789abcdef";
 #define hex_asc_lo(x)  hex_asc[((x) & 0x0f)]
@@ -435,6 +456,12 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
 #endif
 
        switch (*fmt) {
+#if defined(CONFIG_EFI_LOADER) && \
+       !defined(CONFIG_SPL_BUILD) && !defined(API_BUILD)
+       case 'D':
+               return device_path_string(buf, end, ptr, field_width,
+                                         precision, flags);
+#endif
 #ifdef CONFIG_CMD_NET
        case 'a':
                flags |= SPECIAL | ZEROPAD;
@@ -604,6 +631,8 @@ repeat:
                        str = pointer(fmt + 1, str, end,
                                        va_arg(args, void *),
                                        field_width, precision, flags);
+                       if (IS_ERR(str))
+                               return PTR_ERR(str);
                        /* Skip all alphanumeric pointer suffixes */
                        while (isalnum(fmt[1]))
                                fmt++;
@@ -768,6 +797,9 @@ int printf(const char *fmt, ...)
        i = vscnprintf(printbuffer, sizeof(printbuffer), fmt, args);
        va_end(args);
 
+       /* Handle error */
+       if (i <= 0)
+               return i;
        /* Print the string */
        puts(printbuffer);
        return i;
@@ -784,6 +816,9 @@ int vprintf(const char *fmt, va_list args)
         */
        i = vscnprintf(printbuffer, sizeof(printbuffer), fmt, args);
 
+       /* Handle error */
+       if (i <= 0)
+               return i;
        /* Print the string */
        puts(printbuffer);
        return i;
index c98f262079d394a81f3a6c93b8ca611768d1ddec..6be4a76df30bafc5f916639b0db88d6ff85f0602 100644 (file)
@@ -344,9 +344,7 @@ CONFIG_CUSTOMER_BOARD_SUPPORT
 CONFIG_D2NET_V2
 CONFIG_DA850_AM18X_EVM
 CONFIG_DA850_EVM_MAX_CPU_CLK
-CONFIG_DA850_LOWLEVEL
 CONFIG_DA8XX_GPIO
-CONFIG_DAVINCI_SPI
 CONFIG_DBAU1000
 CONFIG_DBAU1X00
 CONFIG_DBGU
@@ -602,7 +600,6 @@ CONFIG_ETHER_ON_FCC3
 CONFIG_ETHPRIME
 CONFIG_ETH_BUFSIZE
 CONFIG_ETH_RXSIZE
-CONFIG_EXT4_WRITE
 CONFIG_EXTRA_BOOTARGS
 CONFIG_EXTRA_CLOCK
 CONFIG_EXTRA_ENV
@@ -752,7 +749,6 @@ CONFIG_FSL_VIA
 CONFIG_FSMC_NAND_BASE
 CONFIG_FSMTDBLK
 CONFIG_FSNOTIFY
-CONFIG_FS_EXT4
 CONFIG_FS_POSIX_ACL
 CONFIG_FTAHBC020S
 CONFIG_FTAHBC020S_BASE
@@ -1279,7 +1275,6 @@ CONFIG_MACB1_PHY
 CONFIG_MACB2_PHY
 CONFIG_MACB3_PHY
 CONFIG_MACB_SEARCH_PHY
-CONFIG_MACH_DAVINCI_DA850_EVM
 CONFIG_MACH_OMAPL138_LCDK
 CONFIG_MACH_SPECIFIC
 CONFIG_MACH_TYPE
@@ -1528,7 +1523,6 @@ CONFIG_OMAP_EHCI_PHY2_RESET_GPIO
 CONFIG_OMAP_EHCI_PHY3_RESET_GPIO
 CONFIG_OMAP_USB2PHY2_HOST
 CONFIG_OMAP_USB3PHY1_HOST
-CONFIG_OMAP_USB_PHY
 CONFIG_ORIGEN
 CONFIG_OS1_ENV_ADDR
 CONFIG_OS2_ENV_ADDR
@@ -1795,7 +1789,6 @@ CONFIG_RMSTP9_ENA
 CONFIG_ROCKCHIP_CHIP_TAG
 CONFIG_ROCKCHIP_MAX_INIT_SIZE
 CONFIG_ROCKCHIP_SDHCI_MAX_FREQ
-CONFIG_ROCKCHIP_USB2_PHY
 CONFIG_ROM_STUBS
 CONFIG_ROOTFS_OFFSET
 CONFIG_ROOTPATH
@@ -1974,8 +1967,6 @@ CONFIG_SOC_AU1100
 CONFIG_SOC_AU1500
 CONFIG_SOC_AU1550
 CONFIG_SOC_AU1X00
-CONFIG_SOC_DA850
-CONFIG_SOC_DA8XX
 CONFIG_SOC_DM355
 CONFIG_SOC_DM365
 CONFIG_SOC_DM644X
@@ -2168,7 +2159,6 @@ CONFIG_SUPERH_ON_CHIP_R8A66597
 CONFIG_SUPPORT_EMMC_BOOT
 CONFIG_SUPPORT_EMMC_RPMB
 CONFIG_SUPPORT_RAW_INITRD
-CONFIG_SUPPORT_VFAT
 CONFIG_SUVD3
 CONFIG_SXNI855T
 CONFIG_SYSFLAGS_ADDR
@@ -4748,7 +4738,6 @@ CONFIG_TUXX1
 CONFIG_TWL4030_INPUT
 CONFIG_TWL4030_KEYPAD
 CONFIG_TWL4030_LED
-CONFIG_TWL4030_USB
 CONFIG_TWL6030_INPUT
 CONFIG_TWL6030_POWER
 CONFIG_TWR
@@ -4817,7 +4806,6 @@ CONFIG_USBD_VENDORID
 CONFIG_USBID_ADDR
 CONFIG_USBNET_DEV_ADDR
 CONFIG_USBTTY
-CONFIG_USB_AM35X
 CONFIG_USB_ATMEL
 CONFIG_USB_ATMEL_CLK_SEL_PLLB
 CONFIG_USB_ATMEL_CLK_SEL_UPLL
@@ -4877,21 +4865,14 @@ CONFIG_USB_HOST_XHCI_BASE
 CONFIG_USB_INVENTRA_DMA
 CONFIG_USB_ISP1301_I2C_ADDR
 CONFIG_USB_MAX_CONTROLLER_COUNT
-CONFIG_USB_MUSB_AM35X
 CONFIG_USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
-CONFIG_USB_MUSB_DSPS
-CONFIG_USB_MUSB_HCD
-CONFIG_USB_MUSB_OMAP2PLUS
-CONFIG_USB_MUSB_PIO_ONLY
 CONFIG_USB_MUSB_TIMEOUT
 CONFIG_USB_MUSB_TUSB6010
-CONFIG_USB_MUSB_UDC
 CONFIG_USB_OHCI
 CONFIG_USB_OHCI_EP93XX
 CONFIG_USB_OHCI_LPC32XX
 CONFIG_USB_OHCI_NEW
 CONFIG_USB_OHCI_SUNXI
-CONFIG_USB_OMAP3
 CONFIG_USB_OTG
 CONFIG_USB_OTG_BLACKLIST_HUB
 CONFIG_USB_PHY_CFG_BASE
index a42c554bef8d563b86334c06671878cfced0a1a3..1aa68be7a9ac6cef1e68e31e6f31b9472068091f 100644 (file)
@@ -7,12 +7,46 @@
 #define DEBUG
 
 #include <common.h>
+#if defined(CONFIG_EFI_LOADER) && \
+       !defined(CONFIG_SPL_BUILD) && !defined(API_BUILD)
+#include <efi_api.h>
+#endif
 #include <display_options.h>
 #include <version.h>
 
 #define FAKE_BUILD_TAG "jenkins-u-boot-denx_uboot_dm-master-build-aarch64" \
                        "and a lot more text to come"
 
+/* Test efi_loader specific printing */
+static void efi_ut_print(void)
+{
+#if defined(CONFIG_EFI_LOADER) && \
+    !defined(CONFIG_SPL_BUILD) && !defined(API_BUILD)
+       char str[10];
+       u8 buf[sizeof(struct efi_device_path_sd_mmc_path) +
+              sizeof(struct efi_device_path)];
+       u8 *pos = buf;
+       struct efi_device_path *dp_end;
+       struct efi_device_path_sd_mmc_path *dp_sd =
+                       (struct efi_device_path_sd_mmc_path *)pos;
+
+       /* Create a device path for an SD card */
+       dp_sd->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
+       dp_sd->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_SD;
+       dp_sd->dp.length = sizeof(struct efi_device_path_sd_mmc_path);
+       dp_sd->slot_number = 3;
+       pos += sizeof(struct efi_device_path_sd_mmc_path);
+       /* Append end node */
+       dp_end = (struct efi_device_path *)pos;
+       dp_end->type = DEVICE_PATH_TYPE_END;
+       dp_end->sub_type = DEVICE_PATH_SUB_TYPE_END;
+       dp_end->length = sizeof(struct efi_device_path);
+
+       snprintf(str, sizeof(str), "_%pD_", buf);
+       assert(!strcmp("_/SD(3)_", str));
+#endif
+}
+
 static int do_ut_print(cmd_tbl_t *cmdtp, int flag, int argc,
                       char *const argv[])
 {
@@ -75,6 +109,9 @@ static int do_ut_print(cmd_tbl_t *cmdtp, int flag, int argc,
        assert(!strncmp(FAKE_BUILD_TAG, s + 9 + len, 12));
        assert(!strcmp("\n\n", s + big_str_len - 3));
 
+       /* Test efi_loader specific printing */
+       efi_ut_print();
+
        printf("%s: Everything went swimmingly\n", __func__);
        return 0;
 }
index 6a487d22027aa6838eb1fbc2335473a731863b62..c8cdaef90c2211a8751eb788e6a938ba386c180a 100644 (file)
@@ -6,6 +6,7 @@
 /easylogo/easylogo
 /envcrc
 /fdtgrep
+/file2include
 /fit_check_sign
 /fit_info
 /gdb/gdbcont
index 571f571ec92b4dceda357939251c7b88ffdc7ebb..b7d7d418ee0fd7e0048e563940c474432beaf1b5 100644 (file)
@@ -57,6 +57,8 @@ mkenvimage-objs := mkenvimage.o os_support.o lib/crc32.o
 hostprogs-y += dumpimage mkimage
 hostprogs-$(CONFIG_FIT_SIGNATURE) += fit_info fit_check_sign
 
+hostprogs-$(CONFIG_CMD_BOOTEFI_SELFTEST) += file2include
+
 FIT_SIG_OBJS-$(CONFIG_FIT_SIGNATURE) := common/image-sig.o
 
 # The following files are synced with upstream DTC.
@@ -118,6 +120,7 @@ dumpimage-objs := $(dumpimage-mkimage-objs) dumpimage.o
 mkimage-objs   := $(dumpimage-mkimage-objs) mkimage.o
 fit_info-objs   := $(dumpimage-mkimage-objs) fit_info.o
 fit_check_sign-objs   := $(dumpimage-mkimage-objs) fit_check_sign.o
+file2include-objs := file2include.o
 
 ifneq ($(CONFIG_MX23)$(CONFIG_MX28),)
 # Add CONFIG_MXS into host CFLAGS, so we can check whether or not register
diff --git a/tools/file2include.c b/tools/file2include.c
new file mode 100644 (file)
index 0000000..9145f08
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Convert a file image to a C define
+ *
+ * Copyright (c) 2017 Heinrich Schuchardt <xypron.glpk@gmx.de>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * For testing EFI disk management we need an in memory image of
+ * a disk.
+ *
+ * The tool file2include converts a file to a C include. The file
+ * is separated into strings of 8 bytes. Only the non-zero strings
+ * are written to the include. The output format has been designed
+ * to maintain readability.
+ *
+ * As the disk image needed for testing contains mostly zeroes a high
+ * compression ratio can be attained.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <malloc.h>
+
+/* Size of the blocks written to the compressed file */
+#define BLOCK_SIZE 8
+
+int main(int argc, char *argv[])
+{
+       FILE *file;
+       int ret;
+       unsigned char *buf;
+       size_t count, i, j;
+
+       /* Provide usage help */
+       if (argc != 2) {
+               printf("Usage:\n%s FILENAME\n", argv[0]);
+               return EXIT_FAILURE;
+       }
+       /* Open file */
+       file = fopen(argv[1], "r");
+       if (!file) {
+               perror("fopen");
+               return EXIT_FAILURE;
+       }
+       /* Get file length */
+       ret = fseek(file, 0, SEEK_END);
+       if (ret < 0) {
+               perror("fseek");
+               return EXIT_FAILURE;
+       }
+       count = ftell(file);
+       if (!count) {
+               fprintf(stderr, "File %s has length 0\n", argv[1]);
+               return EXIT_FAILURE;
+       }
+       rewind(file);
+       /* Read file */
+       buf = malloc(count);
+       if (!buf) {
+               perror("calloc");
+               return EXIT_FAILURE;
+       }
+       count = fread(buf, 1, count, file);
+
+       /* Generate output */
+       printf("/*\n");
+       printf(" *  Non-zero %u byte strings of a disk image\n", BLOCK_SIZE);
+       printf(" *\n");
+       printf(" *  Generated with tools/file2include\n");
+       printf(" *\n");
+       printf(" *  SPDX-License-Identifier:    GPL-2.0+\n");
+       printf(" */\n\n");
+       printf("#define EFI_ST_DISK_IMG { 0x%08zx, { \\\n", count);
+
+       for (i = 0; i < count; i += BLOCK_SIZE) {
+               int c = 0;
+
+               for (j = i; j < i + BLOCK_SIZE && j < count; ++j) {
+                       if (buf[j])
+                               c = 1;
+               }
+               if (!c)
+                       continue;
+               printf("\t{0x%08zx, \"", i);
+               for (j = i; j < i + BLOCK_SIZE && j < count; ++j)
+                       printf("\\x%02x", buf[j]);
+               printf("\"}, /* ");
+               for (j = i; j < i + BLOCK_SIZE && j < count; ++j) {
+                       if (buf[j] >= 0x20 && buf[j] <= 0x7e)
+                               printf("%c", buf[j]);
+                       else
+                               printf(".");
+               }
+               printf(" */ \\\n");
+       }
+       printf("\t{0, NULL} } }\n");
+
+       /* Release resources */
+       free(buf);
+       ret = fclose(file);
+       if (ret) {
+               perror("fclose");
+               return EXIT_FAILURE;
+       }
+       return EXIT_SUCCESS;
+}
index 2deb5db6ecff7bcfc9c4ba3da5905eb6d7e36476..22b091808a1914f541d4162b4b8da91c7b4614a3 100644 (file)
@@ -44,4 +44,5 @@ def GetMaintainer(fname, verbose=False):
         return []
 
     stdout = command.Output(get_maintainer, '--norolestats', fname)
-    return stdout.splitlines()
+    lines = stdout.splitlines()
+    return [ x.replace('"', '') for x in lines ]