]> git.sur5r.net Git - u-boot/commitdiff
Merge git://git.denx.de/u-boot-samsung
authorTom Rini <trini@konsulko.com>
Wed, 13 Dec 2017 22:58:18 +0000 (17:58 -0500)
committerTom Rini <trini@konsulko.com>
Wed, 13 Dec 2017 22:58:18 +0000 (17:58 -0500)
353 files changed:
MAINTAINERS
README
arch/arc/include/asm/arcregs.h
arch/arc/include/asm/gpio.h [new file with mode: 0644]
arch/arc/lib/cache.c
arch/arm/Kconfig
arch/arm/cpu/armv7/ls102xa/Kconfig
arch/arm/cpu/armv8/fsl-layerscape/Kconfig
arch/arm/cpu/armv8/fsl-layerscape/cpu.c
arch/arm/cpu/armv8/fsl-layerscape/doc/README.core_prefetch [new file with mode: 0644]
arch/arm/cpu/armv8/fsl-layerscape/soc.c
arch/arm/include/asm/arch-ls102xa/config.h
arch/arm/include/asm/arch-pxa/hardware.h
arch/arm/lib/crt0_64.S
arch/arm/mach-kirkwood/include/mach/config.h
arch/arm/mach-uniphier/clk/Makefile
arch/arm/mach-uniphier/clk/pll-base-ld20.c
arch/powerpc/cpu/mpc83xx/Kconfig
arch/powerpc/cpu/mpc85xx/Kconfig
arch/sandbox/cpu/os.c
arch/x86/cpu/baytrail/Kconfig
arch/x86/cpu/braswell/Kconfig
arch/x86/cpu/broadwell/Kconfig
arch/x86/cpu/coreboot/Kconfig
arch/x86/cpu/ivybridge/Kconfig
arch/x86/cpu/qemu/Kconfig
arch/x86/cpu/queensbay/Kconfig
board/Arcturus/ucp1020/tlb.c
board/freescale/b4860qds/tlb.c
board/freescale/bsc9131rdb/tlb.c
board/freescale/bsc9132qds/tlb.c
board/freescale/c29xpcie/tlb.c
board/freescale/ls1088a/Kconfig
board/freescale/ls1088a/MAINTAINERS
board/freescale/ls1088a/ls1088a.c
board/freescale/mpc8541cds/tlb.c
board/freescale/mpc8548cds/tlb.c
board/freescale/mpc8568mds/tlb.c
board/freescale/p1010rdb/tlb.c
board/freescale/p1022ds/tlb.c
board/freescale/p1023rdb/tlb.c
board/freescale/p1_p2_rdb_pc/tlb.c
board/freescale/p1_twr/tlb.c
board/freescale/t102xqds/tlb.c
board/freescale/t102xrdb/tlb.c
board/freescale/t104xrdb/tlb.c
board/freescale/t208xqds/tlb.c
board/freescale/t208xrdb/tlb.c
board/freescale/t4qds/tlb.c
board/freescale/t4rdb/tlb.c
board/gdsys/p1022/tlb.c
board/logicpd/omap3som/README
board/logicpd/omap3som/omap3logic.c
board/sbc8548/tlb.c
board/synopsys/hsdk/hsdk.c
board/theobroma-systems/puma_rk3399/puma-rk3399.c
cmd/Kconfig
cmd/Makefile
cmd/bootefi.c
cmd/i2c.c
cmd/log.c
cmd/mtdparts.c
common/Kconfig
common/Makefile
common/board_f.c
common/board_r.c
common/console.c
common/image-fit.c
common/image.c
common/log.c [new file with mode: 0644]
common/log_console.c [new file with mode: 0644]
common/spl/spl_fit.c
common/stdio.c
common/usb_hub.c
configs/A10-OLinuXino-Lime_defconfig
configs/A20-OLinuXino-Lime2-eMMC_defconfig
configs/A20-OLinuXino-Lime2_defconfig
configs/A20-OLinuXino-Lime_defconfig
configs/A20-OLinuXino_MICRO-eMMC_defconfig
configs/A20-OLinuXino_MICRO_defconfig
configs/A20-Olimex-SOM-EVB_defconfig
configs/Bananapi_M2_Ultra_defconfig
configs/Bananapi_defconfig
configs/Bananapro_defconfig
configs/Cubieboard2_defconfig
configs/Cubieboard_defconfig
configs/Cubietruck_defconfig
configs/Itead_Ibox_A20_defconfig
configs/Lamobo_R1_defconfig
configs/Linksprite_pcDuino3_Nano_defconfig
configs/Linksprite_pcDuino3_defconfig
configs/MPC8315ERDB_defconfig
configs/MPC8349ITX_LOWBOOT_defconfig
configs/MPC8349ITX_defconfig
configs/MPC837XERDB_defconfig
configs/MPC8544DS_defconfig
configs/MPC8572DS_36BIT_defconfig
configs/MPC8572DS_defconfig
configs/MPC8610HPCD_defconfig
configs/MPC8641HPCN_36BIT_defconfig
configs/MPC8641HPCN_defconfig
configs/Marsboard_A10_defconfig
configs/Mele_A1000_defconfig
configs/Mele_M5_defconfig
configs/Orangepi_defconfig
configs/Orangepi_mini_defconfig
configs/TWR-P1025_defconfig
configs/Wits_Pro_A20_DKT_defconfig
configs/am57xx_evm_defconfig
configs/am57xx_hs_evm_defconfig
configs/apalis_imx6_defconfig
configs/apalis_imx6_nospl_com_defconfig
configs/apalis_imx6_nospl_it_defconfig
configs/bananapi_m1_plus_defconfig
configs/cgtqmx6eval_defconfig
configs/cl-som-am57x_defconfig
configs/cm_fx6_defconfig
configs/cm_t54_defconfig
configs/controlcenterd_36BIT_SDCARD_DEVELOP_defconfig
configs/controlcenterd_36BIT_SDCARD_defconfig
configs/controlcenterdc_defconfig
configs/d2net_v2_defconfig
configs/db-88f6820-gp_defconfig
configs/db-mv784mp-gp_defconfig
configs/dh_imx6_defconfig
configs/dms-ba16-1g_defconfig
configs/dms-ba16_defconfig
configs/dns325_defconfig
configs/dreamplug_defconfig
configs/ds109_defconfig
configs/edminiv2_defconfig
configs/goflexhome_defconfig
configs/guruplug_defconfig
configs/gwventana_emmc_defconfig
configs/gwventana_gw5904_defconfig
configs/gwventana_nand_defconfig
configs/highbank_defconfig
configs/ib62x0_defconfig
configs/inetspace_v2_defconfig
configs/ls1012aqds_qspi_defconfig
configs/ls1088aqds_qspi_SECURE_BOOT_defconfig [new file with mode: 0644]
configs/ls1088aqds_qspi_defconfig
configs/ls1088aqds_sdcard_qspi_defconfig
configs/ls1088ardb_qspi_SECURE_BOOT_defconfig [new file with mode: 0644]
configs/ls1088ardb_qspi_defconfig
configs/ls1088ardb_sdcard_qspi_defconfig
configs/ls2080aqds_SECURE_BOOT_defconfig
configs/ls2080ardb_SECURE_BOOT_defconfig
configs/ls2081ardb_defconfig
configs/lschlv2_defconfig
configs/lsxhl_defconfig
configs/m53evk_defconfig
configs/mvebu_db-88f3720_defconfig
configs/mvebu_db_armada8k_defconfig
configs/mvebu_espressobin-88f3720_defconfig
configs/mvebu_mcbin-88f8040_defconfig
configs/mx53loco_defconfig
configs/mx6cuboxi_defconfig
configs/mx6qsabrelite_defconfig
configs/nas220_defconfig
configs/net2big_v2_defconfig
configs/netspace_lite_v2_defconfig
configs/netspace_max_v2_defconfig
configs/netspace_mini_v2_defconfig
configs/netspace_v2_defconfig
configs/nitrogen6q2g_defconfig
configs/nitrogen6q_defconfig
configs/novena_defconfig
configs/nsa310s_defconfig
configs/omap3_logic_defconfig
configs/omap5_uevm_defconfig
configs/openrd_base_defconfig
configs/openrd_client_defconfig
configs/openrd_ultimate_defconfig
configs/ot1200_defconfig
configs/ot1200_spl_defconfig
configs/qemu_arm_defconfig
configs/sandbox_defconfig
configs/sheevaplug_defconfig
configs/tbs2910_defconfig
configs/theadorable_debug_defconfig
configs/turris_omnia_defconfig
configs/udoo_defconfig
configs/wandboard_defconfig
configs/xilinx_zynqmp_ep_defconfig
configs/xilinx_zynqmp_zcu102_rev1_0_defconfig
configs/xilinx_zynqmp_zcu102_revA_defconfig
configs/xilinx_zynqmp_zcu102_revB_defconfig
doc/README.log [new file with mode: 0644]
doc/device-tree-bindings/clock/snps,hsdk-cgu.txt [new file with mode: 0644]
doc/uImage.FIT/source_file_format.txt
drivers/ata/Kconfig
drivers/ata/Makefile
drivers/ata/mxc_ata.c [deleted file]
drivers/ata/sata_dwc.c [deleted file]
drivers/ata/sata_dwc.h [deleted file]
drivers/clk/Kconfig
drivers/clk/Makefile
drivers/clk/clk-hsdk-cgu.c [new file with mode: 0644]
drivers/gpio/Kconfig
drivers/i2c/Kconfig
drivers/i2c/at91_i2c.c
drivers/i2c/meson_i2c.c
drivers/mtd/nand/Kconfig
drivers/net/fsl-mc/dpbp.c
drivers/net/fsl-mc/dpio/dpio.c
drivers/net/fsl-mc/dpmac.c
drivers/net/fsl-mc/dpni.c
drivers/net/fsl-mc/dprc.c
drivers/net/fsl-mc/fsl_dpmng_cmd.h
drivers/net/fsl-mc/mc.c
drivers/net/ldpaa_eth/ldpaa_eth.c
drivers/net/ldpaa_eth/ldpaa_eth.h
drivers/spmi/spmi-msm.c
include/asm-generic/global_data.h
include/charset.h
include/common.h
include/configs/MPC8315ERDB.h
include/configs/MPC8349ITX.h
include/configs/MPC837XEMDS.h
include/configs/MPC837XERDB.h
include/configs/MPC8536DS.h
include/configs/MPC8544DS.h
include/configs/MPC8572DS.h
include/configs/MPC8610HPCD.h
include/configs/MPC8641HPCN.h
include/configs/P1010RDB.h
include/configs/P1022DS.h
include/configs/P2041RDB.h
include/configs/P4080DS.h
include/configs/T102xQDS.h
include/configs/T1040QDS.h
include/configs/T104xRDB.h
include/configs/T208xQDS.h
include/configs/T208xRDB.h
include/configs/T4240QDS.h
include/configs/T4240RDB.h
include/configs/UCP1020.h
include/configs/advantech_dms-ba16.h
include/configs/am57xx_evm.h
include/configs/apalis_imx6.h
include/configs/cgtqmx6eval.h
include/configs/cl-som-am57x.h
include/configs/cm_fx6.h
include/configs/cm_t54.h
include/configs/controlcenterd.h
include/configs/controlcenterdc.h
include/configs/corenet_ds.h
include/configs/cyrus.h
include/configs/db-88f6820-gp.h
include/configs/db-mv784mp-gp.h
include/configs/dh_imx6.h
include/configs/dra7xx_evm.h
include/configs/edminiv2.h
include/configs/efi-x86.h
include/configs/galileo.h
include/configs/ge_bx50v3.h
include/configs/gw_ventana.h
include/configs/highbank.h
include/configs/ls1012a_common.h
include/configs/ls1012afrdm.h
include/configs/ls1012aqds.h
include/configs/ls1012ardb.h
include/configs/ls1021aiot.h
include/configs/ls1021atwr.h
include/configs/ls1043a_common.h
include/configs/ls1043aqds.h
include/configs/ls1043ardb.h
include/configs/ls1046a_common.h
include/configs/ls1046aqds.h
include/configs/ls1046ardb.h
include/configs/ls1088a_common.h
include/configs/ls1088aqds.h
include/configs/ls1088ardb.h
include/configs/ls2080aqds.h
include/configs/ls2080ardb.h
include/configs/m53evk.h
include/configs/mvebu_armada-37xx.h
include/configs/mvebu_armada-8k.h
include/configs/mx53loco.h
include/configs/mx6cuboxi.h
include/configs/nitrogen6x.h
include/configs/novena.h
include/configs/omap3_logic.h
include/configs/omap5_uevm.h
include/configs/ot1200.h
include/configs/p1_p2_rdb_pc.h
include/configs/p1_twr.h
include/configs/qemu-arm.h
include/configs/sbc8641d.h
include/configs/sunxi-common.h
include/configs/t4qds.h
include/configs/tbs2910.h
include/configs/theadorable.h
include/configs/turris_omnia.h
include/configs/udoo.h
include/configs/wandboard.h
include/configs/x86-common.h
include/configs/xilinx_zynqmp.h
include/dt-bindings/clock/snps,hsdk-cgu.h [new file with mode: 0644]
include/efi.h
include/efi_api.h
include/efi_loader.h
include/efi_selftest.h
include/fsl-mc/fsl_dpbp.h
include/fsl-mc/fsl_dpio.h
include/fsl-mc/fsl_dpmac.h
include/fsl-mc/fsl_dpni.h
include/fsl-mc/fsl_dprc.h
include/fsl-mc/fsl_mc_cmd.h
include/fsl-mc/fsl_mc_private.h
include/image.h
include/log.h [new file with mode: 0644]
include/logbuff.h [deleted file]
include/os.h
include/post.h
lib/charset.c
lib/efi/efi_stub.c
lib/efi_loader/Makefile
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_gop.c
lib/efi_loader/efi_memory.c
lib/efi_loader/efi_net.c
lib/efi_loader/efi_watchdog.c [new file with mode: 0644]
lib/efi_loader/helloworld.c
lib/efi_selftest/Makefile
lib/efi_selftest/efi_selftest.c
lib/efi_selftest/efi_selftest_console.c
lib/efi_selftest/efi_selftest_devicepath.c [new file with mode: 0644]
lib/efi_selftest/efi_selftest_events.c
lib/efi_selftest/efi_selftest_gop.c [new file with mode: 0644]
lib/efi_selftest/efi_selftest_manageprotocols.c [new file with mode: 0644]
lib/efi_selftest/efi_selftest_snp.c
lib/efi_selftest/efi_selftest_textoutput.c [new file with mode: 0644]
lib/efi_selftest/efi_selftest_tpl.c
lib/efi_selftest/efi_selftest_util.c
lib/efi_selftest/efi_selftest_watchdog.c [new file with mode: 0644]
post/post.c
post/tests.c
scripts/config_whitelist.txt
test/Makefile
test/log/Makefile [new file with mode: 0644]
test/log/log_test.c [new file with mode: 0644]
test/py/tests/test_efi_loader.py
test/py/tests/test_efi_selftest.py
test/py/tests/test_gpt.py
test/py/tests/test_log.py [new file with mode: 0644]
test/py/tests/test_sleep.py
tools/omapimage.c

index c024b41f13c70975de65678a5b357fbc25db35cf..e950267494a3c608b7f541dfe0b9f622295dcaf3 100644 (file)
@@ -65,6 +65,14 @@ S:   Maintained
 L:     uboot-snps-arc@synopsys.com
 F:     drivers/gpio/hsdk-creg-gpio.c
 
+ARC HSDK CGU CLOCK
+M:     Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
+S:     Maintained
+L:     uboot-snps-arc@synopsys.com
+F:     drivers/clk/clk-hsdk-cgu.c
+F:     include/dt-bindings/clock/snps,hsdk-cgu.h
+F:     doc/device-tree-bindings/clock/snps,hsdk-cgu.txt
+
 ARM
 M:     Albert Aribaud <albert.u.boot@aribaud.net>
 S:     Maintained
@@ -310,6 +318,15 @@ S: Maintained
 T:     git git://git.denx.de/u-boot-i2c.git
 F:     drivers/i2c/
 
+LOGGING
+M:     Simon Glass <sjg@chromium.org>
+S:     Maintained
+T:     git git://git.denx.de/u-boot.git
+F:     common/log.c
+F:     cmd/log.c
+F:     test/log/log_test.c
+F:     test/py/tests/test_log.py
+
 MICROBLAZE
 M:     Michal Simek <monstr@monstr.eu>
 S:     Maintained
diff --git a/README b/README
index 2df0e1f8a78e66f075a6c5c0991402440f064c4f..93c7ea966589984c334213fd6d84f8baa8521109 100644 (file)
--- a/README
+++ b/README
@@ -5126,8 +5126,9 @@ Coding Standards:
 -----------------
 
 All contributions to U-Boot should conform to the Linux kernel
-coding style; see the file "Documentation/CodingStyle" and the script
-"scripts/Lindent" in your Linux kernel source directory.
+coding style; see the kernel coding style guide at
+https://www.kernel.org/doc/html/latest/process/coding-style.html, and the
+script "scripts/Lindent" in your Linux kernel source directory.
 
 Source files originating from a different project (for example the
 MTD subsystem) are generally exempt from these guidelines and are not
index 54a9b00d4c24cb3c0bc83d2a62631b8ad54ed28e..ba1f7bac77c77bd5e8d83469e0758bae25847d15 100644 (file)
 #define ARC_AUX_IC_PTAG                0x1E
 #endif
 #define ARC_BCR_IC_BUILD       0x77
+#define AUX_AUX_CACHE_LIMIT            0x5D
+#define ARC_AUX_NON_VOLATILE_LIMIT     0x5E
+
+/* ICCM and DCCM auxiliary registers */
+#define ARC_AUX_DCCM_BASE      0x18    /* DCCM Base Addr ARCv2 */
+#define ARC_AUX_ICCM_BASE      0x208   /* ICCM Base Addr ARCv2 */
 
 /* Timer related auxiliary registers */
 #define ARC_AUX_TIMER0_CNT     0x21    /* Timer 0 count */
@@ -72,6 +78,9 @@
 /* gcc builtin sr needs reg param to be long immediate */
 #define write_aux_reg(reg_immed, val)          \
                __builtin_arc_sr((unsigned int)val, reg_immed)
+
+/* ARCNUM [15:8] - field to identify each core in a multi-core system */
+#define CPU_ID_GET()   ((read_aux_reg(ARC_AUX_IDENTITY) & 0xFF00) >> 8)
 #endif /* __ASSEMBLY__ */
 
 #endif /* _ASM_ARC_ARCREGS_H */
diff --git a/arch/arc/include/asm/gpio.h b/arch/arc/include/asm/gpio.h
new file mode 100644 (file)
index 0000000..306ab4c
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/gpio.h>
index d8741fe959c3fc7ddec39ecaf6bfaa7443cb8d38..1073e1570fa7906ac106bb32a5311d7f99054baf 100644 (file)
  * relocation but will be used after being zeroed.
  */
 int l1_line_sz __section(".data");
-int dcache_exists __section(".data");
-int icache_exists __section(".data");
+bool dcache_exists __section(".data") = false;
+bool icache_exists __section(".data") = false;
 
 #define CACHE_LINE_MASK                (~(l1_line_sz - 1))
 
 #ifdef CONFIG_ISA_ARCV2
 int slc_line_sz __section(".data");
-int slc_exists __section(".data");
-int ioc_exists __section(".data");
+bool slc_exists __section(".data") = false;
+bool ioc_exists __section(".data") = false;
 
 static unsigned int __before_slc_op(const int op)
 {
@@ -152,7 +152,7 @@ static void read_decode_cache_bcr_arcv2(void)
        sbcr.word = read_aux_reg(ARC_BCR_SLC);
        if (sbcr.fields.ver) {
                slc_cfg.word = read_aux_reg(ARC_AUX_SLC_CONFIG);
-               slc_exists = 1;
+               slc_exists = true;
                slc_line_sz = (slc_cfg.fields.lsz == 0) ? 128 : 64;
        }
 
@@ -169,7 +169,7 @@ static void read_decode_cache_bcr_arcv2(void)
 
        cbcr.word = read_aux_reg(ARC_BCR_CLUSTER);
        if (cbcr.fields.c)
-               ioc_exists = 1;
+               ioc_exists = true;
 }
 #endif
 
@@ -190,7 +190,7 @@ void read_decode_cache_bcr(void)
 
        ibcr.word = read_aux_reg(ARC_BCR_IC_BUILD);
        if (ibcr.fields.ver) {
-               icache_exists = 1;
+               icache_exists = true;
                l1_line_sz = ic_line_sz = 8 << ibcr.fields.line_len;
                if (!ic_line_sz)
                        panic("Instruction exists but line length is 0\n");
@@ -198,7 +198,7 @@ void read_decode_cache_bcr(void)
 
        dbcr.word = read_aux_reg(ARC_BCR_DC_BUILD);
        if (dbcr.fields.ver){
-               dcache_exists = 1;
+               dcache_exists = true;
                l1_line_sz = dc_line_sz = 16 << dbcr.fields.line_len;
                if (!dc_line_sz)
                        panic("Data cache exists but line length is 0\n");
index e50ba930a17c21261cdede4d993168e9fa5fa32f..73909952d0e692df5944b72ba9aa4d4deedf8842 100644 (file)
@@ -850,6 +850,7 @@ config TARGET_LS2080AQDS
        select SUPPORT_SPL
        select ARCH_MISC_INIT
        imply SCSI
+       imply SCSI_AHCI
        help
          Support for Freescale LS2080AQDS platform
          The LS2080A Development System (QDS) is a high-performance
@@ -865,6 +866,7 @@ config TARGET_LS2080ARDB
        select SUPPORT_SPL
        select ARCH_MISC_INIT
        imply SCSI
+       imply SCSI_AHCI
        help
          Support for Freescale LS2080ARDB platform.
          The LS2080A Reference design board (RDB) is a high-performance
@@ -926,6 +928,7 @@ config TARGET_LS1012ARDB
        select ARM64
        select BOARD_LATE_INIT
        imply SCSI
+       imply SCSI_AHCI
        help
          Support for Freescale LS1012ARDB platform.
          The LS1012A Reference design board (RDB) is a high-performance
index 20e2b1a50abf77b614a8c80fbff1297125e5a2b7..635358e328381fc8238aaef50f4b55b68288de93 100644 (file)
@@ -20,6 +20,7 @@ config ARCH_LS1021A
        select SYS_FSL_SEC_COMPAT_5
        select SYS_FSL_SEC_LE
        imply SCSI
+       imply SCSI_AHCI
        imply CMD_PCI
 
 menu "LS102xA architecture"
index 5daf79e919235b6ed978a08d720acf0b4c70690d..66bc32cc85113aec1b9b3d8b19bd6721dbed37d7 100644 (file)
@@ -5,6 +5,10 @@ config ARCH_LS1012A
        select SYS_FSL_DDR_BE
        select SYS_FSL_MMDC
        select SYS_FSL_ERRATUM_A010315
+       select SYS_FSL_ERRATUM_A009798
+       select SYS_FSL_ERRATUM_A008997
+       select SYS_FSL_ERRATUM_A009007
+       select SYS_FSL_ERRATUM_A009008
        select ARCH_EARLY_INIT_R
        select BOARD_EARLY_INIT_F
 
@@ -31,6 +35,7 @@ config ARCH_LS1043A
        select ARCH_EARLY_INIT_R
        select BOARD_EARLY_INIT_F
        imply SCSI
+       imply SCSI_AHCI
        imply CMD_PCI
 
 config ARCH_LS1046A
@@ -57,6 +62,7 @@ config ARCH_LS1046A
        select ARCH_EARLY_INIT_R
        select BOARD_EARLY_INIT_F
        imply SCSI
+       imply SCSI_AHCI
 
 config ARCH_LS1088A
        bool
@@ -244,6 +250,7 @@ config SYS_LS_PPA_ESBC_ADDR
        default 0x40680000 if SYS_LS_PPA_FW_IN_XIP && ARCH_LS1012A
        default 0x20680000 if SYS_LS_PPA_FW_IN_XIP && QSPI_BOOT && ARCH_LS2080A
        default 0x580680000 if SYS_LS_PPA_FW_IN_XIP && ARCH_LS2080A
+       default 0x20680000 if SYS_LS_PPA_FW_IN_XIP && ARCH_LS1088A
        default 0x680000 if SYS_LS_PPA_FW_IN_MMC
        default 0x680000 if SYS_LS_PPA_FW_IN_NAND
        help
index ab5d76ea3b641571eb46d3a865470b5929ced413..d08262971e74c1be3306fec011aa058e8681301f 100644 (file)
@@ -29,6 +29,7 @@
 #include <fsl_ddr.h>
 #endif
 #include <asm/arch/clock.h>
+#include <hwconfig.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -494,6 +495,41 @@ static inline int check_psci(void)
        return 0;
 }
 
+static void config_core_prefetch(void)
+{
+       char *buf = NULL;
+       char buffer[HWCONFIG_BUFFER_SIZE];
+       const char *prefetch_arg = NULL;
+       size_t arglen;
+       unsigned int mask;
+       struct pt_regs regs;
+
+       if (env_get_f("hwconfig", buffer, sizeof(buffer)) > 0)
+               buf = buffer;
+
+       prefetch_arg = hwconfig_subarg_f("core_prefetch", "disable",
+                                        &arglen, buf);
+
+       if (prefetch_arg) {
+               mask = simple_strtoul(prefetch_arg, NULL, 0) & 0xff;
+               if (mask & 0x1) {
+                       printf("Core0 prefetch can't be disabled\n");
+                       return;
+               }
+
+#define SIP_PREFETCH_DISABLE_64 0xC200FF13
+               regs.regs[0] = SIP_PREFETCH_DISABLE_64;
+               regs.regs[1] = mask;
+               smc_call(&regs);
+
+               if (regs.regs[0])
+                       printf("Prefetch disable config failed for mask ");
+               else
+                       printf("Prefetch disable config passed for mask ");
+               printf("0x%x\n", mask);
+       }
+}
+
 int arch_early_init_r(void)
 {
 #ifdef CONFIG_SYS_FSL_ERRATUM_A009635
@@ -521,6 +557,8 @@ int arch_early_init_r(void)
        fsl_rgmii_init();
 #endif
 
+       config_core_prefetch();
+
 #ifdef CONFIG_SYS_HAS_SERDES
        fsl_serdes_init();
 #endif
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/doc/README.core_prefetch b/arch/arm/cpu/armv8/fsl-layerscape/doc/README.core_prefetch
new file mode 100644 (file)
index 0000000..85cf6ab
--- /dev/null
@@ -0,0 +1,20 @@
+Core instruction prefetch disable
+---------------------------------
+To disable instruction prefetch of core; hwconfig needs to be updated.
+for e.g.
+setenv hwconfig 'fsl_ddr:bank_intlv=auto;core_prefetch:disable=0x02'
+
+Here 0x02 can be replaced with any valid value except Mask[0] bit. It
+represents 64 bit mask. The 64-bit Mask has one bit for each core.
+Mask[0] = core0
+Mask[1] = core1
+Mask[2] = core2
+etc
+If the bit is set ('b1) in the mask, then prefetch is disabled for
+that core when it is released from reset.
+
+core0 prefetch should not be disabled i.e. Mask[0] should never be set.
+Setting Mask[0] may lead to undefined behavior.
+
+Once disabled, prefetch remains disabled until the next reset.
+There is no function to re-enable prefetch.
index 497a4b541df8634856e401da7f9f1da3c01baf82..ae57c0e31d73550d09a5f6d8c4b530c6e0347861 100644 (file)
@@ -66,10 +66,13 @@ static void erratum_a009008(void)
 #ifdef CONFIG_SYS_FSL_ERRATUM_A009008
        u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
 
-#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
+#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A) || \
+       defined(CONFIG_ARCH_LS1012A)
        set_usb_txvreftune(scfg, SCFG_USB3PRM1CR_USB1);
+#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
        set_usb_txvreftune(scfg, SCFG_USB3PRM1CR_USB2);
        set_usb_txvreftune(scfg, SCFG_USB3PRM1CR_USB3);
+#endif
 #elif defined(CONFIG_ARCH_LS2080A)
        set_usb_txvreftune(scfg, SCFG_USB3PRM1CR);
 #endif
@@ -87,17 +90,21 @@ static void erratum_a009798(void)
 #ifdef CONFIG_SYS_FSL_ERRATUM_A009798
        u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
 
-#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
+#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A) || \
+       defined(CONFIG_ARCH_LS1012A)
        set_usb_sqrxtune(scfg, SCFG_USB3PRM1CR_USB1);
+#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
        set_usb_sqrxtune(scfg, SCFG_USB3PRM1CR_USB2);
        set_usb_sqrxtune(scfg, SCFG_USB3PRM1CR_USB3);
+#endif
 #elif defined(CONFIG_ARCH_LS2080A)
        set_usb_sqrxtune(scfg, SCFG_USB3PRM1CR);
 #endif
 #endif /* CONFIG_SYS_FSL_ERRATUM_A009798 */
 }
 
-#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
+#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A) || \
+       defined(CONFIG_ARCH_LS1012A)
 static inline void set_usb_pcstxswingfull(u32 __iomem *scfg, u32 offset)
 {
        scfg_clrsetbits32(scfg + offset / 4,
@@ -109,17 +116,21 @@ static inline void set_usb_pcstxswingfull(u32 __iomem *scfg, u32 offset)
 static void erratum_a008997(void)
 {
 #ifdef CONFIG_SYS_FSL_ERRATUM_A008997
-#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
+#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A) || \
+       defined(CONFIG_ARCH_LS1012A)
        u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
 
        set_usb_pcstxswingfull(scfg, SCFG_USB3PRM2CR_USB1);
+#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
        set_usb_pcstxswingfull(scfg, SCFG_USB3PRM2CR_USB2);
        set_usb_pcstxswingfull(scfg, SCFG_USB3PRM2CR_USB3);
 #endif
+#endif
 #endif /* CONFIG_SYS_FSL_ERRATUM_A008997 */
 }
 
-#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
+#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A) || \
+       defined(CONFIG_ARCH_LS1012A)
 
 #define PROGRAM_USB_PHY_RX_OVRD_IN_HI(phy)     \
        out_be16((phy) + SCFG_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_1);      \
@@ -139,16 +150,18 @@ static void erratum_a008997(void)
 
 static void erratum_a009007(void)
 {
-#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
+#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A) || \
+       defined(CONFIG_ARCH_LS1012A)
        void __iomem *usb_phy = (void __iomem *)SCFG_USB_PHY1;
 
        PROGRAM_USB_PHY_RX_OVRD_IN_HI(usb_phy);
-
+#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
        usb_phy = (void __iomem *)SCFG_USB_PHY2;
        PROGRAM_USB_PHY_RX_OVRD_IN_HI(usb_phy);
 
        usb_phy = (void __iomem *)SCFG_USB_PHY3;
        PROGRAM_USB_PHY_RX_OVRD_IN_HI(usb_phy);
+#endif
 #elif defined(CONFIG_ARCH_LS2080A) || defined(CONFIG_ARCH_LS1088A)
        void __iomem *dcsr = (void __iomem *)DCSR_BASE;
 
index ff0fc47021efd54b805056abf85f01d52e4e5732..940461137eb455ccee63c735957fdc19ed08f1d8 100644 (file)
@@ -80,8 +80,6 @@
 
 /* SATA */
 #define AHCI_BASE_ADDR                         (CONFIG_SYS_IMMR + 0x02200000)
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID            1
 #define CONFIG_SYS_SCSI_MAX_LUN                1
index e671c143ac11590c901e94fe7df7704f479d16e1..6d0023d7b8650d27f80e2240d613c57c96506b82 100644 (file)
 
 #endif
 
-
-/*
- * Implementation specifics
- */
-
-#ifdef CONFIG_ARCH_LUBBOCK
-#include "lubbock.h"
-#endif
-
-#ifdef CONFIG_ARCH_PXA_IDP
-#include "idp.h"
-#endif
-
-#ifdef CONFIG_ARCH_PXA_CERF
-#include "cerf.h"
-#endif
-
-#ifdef CONFIG_ARCH_CSB226
-#include "csb226.h"
-#endif
-
-#ifdef CONFIG_ARCH_INNOKOM
-#include "innokom.h"
-#endif
-
-#ifdef CONFIG_ARCH_PLEB
-#include "pleb.h"
-#endif
-
 #endif /* _ASM_ARCH_HARDWARE_H */
index ccefce0b20a4658d383c61f7981009ca6855cd0f..9cb70552fedad205d0dba215134dbb12324b9906 100644 (file)
@@ -120,8 +120,9 @@ relocation_return:
 #endif /* !CONFIG_SPL_BUILD */
 #if defined(CONFIG_SPL_BUILD)
        bl      spl_relocate_stack_gd           /* may return NULL */
-       /* set up gd here, outside any C code */
-       mov     x18, x0
+       /* set up gd here, outside any C code, if new stack is returned */
+       cmp     x0, #0
+       csel    x18, x0, x18, ne
        /*
         * Perform 'sp = (x0 != NULL) ? x0 : sp' while working
         * around the constraint that conditional moves can not
index ba6007186e7606ea43b8930cb144e7f44fb90084..efa4e7b6e24250222a860738f85d81381bce11c6 100644 (file)
@@ -97,7 +97,6 @@
  */
 #ifdef CONFIG_IDE
 #define __io
-#define CONFIG_MVSATA_IDE
 #define CONFIG_IDE_PREINIT
 #define CONFIG_MVSATA_IDE_USE_PORT1
 /* Needs byte-swapping for ATA data register */
index 76633bcd498a0ebbd981316955c082d538779574..5cd0897dffb338fb627d5c2b00bdd633eecd1a8f 100644 (file)
@@ -27,3 +27,4 @@ endif
 
 obj-$(CONFIG_ARCH_UNIPHIER_LD11)       += pll-base-ld20.o
 obj-$(CONFIG_ARCH_UNIPHIER_LD20)       += pll-base-ld20.o
+obj-$(CONFIG_ARCH_UNIPHIER_PXS3)       += pll-base-ld20.o
index 3aa42f8bfdcd9909e3aae3cc5bf8f31aeba94775..385f54dfc3b9941fcacabd62fc283f9c011d4e95 100644 (file)
@@ -5,8 +5,10 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
+#include <linux/bitfield.h>
 #include <linux/bitops.h>
 #include <linux/delay.h>
+#include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/io.h>
 #include <linux/sizes.h>
@@ -18,7 +20,6 @@
 #define SC_PLLCTRL_SSC_EN              BIT(31)
 #define SC_PLLCTRL2_NRSTDS             BIT(28)
 #define SC_PLLCTRL2_SSC_JK_MASK                GENMASK(26, 0)
-#define SC_PLLCTRL3_REGI_SHIFT         16
 #define SC_PLLCTRL3_REGI_MASK          GENMASK(19, 16)
 
 /* PLL type: VPLL27 */
@@ -41,13 +42,17 @@ int uniphier_ld20_sscpll_init(unsigned long reg_base, unsigned int freq,
        if (freq != UNIPHIER_PLL_FREQ_DEFAULT) {
                tmp = readl(base);      /* SSCPLLCTRL */
                tmp &= ~SC_PLLCTRL_SSC_DK_MASK;
-               tmp |= (487 * freq * ssc_rate / divn / 512) &
-                                                       SC_PLLCTRL_SSC_DK_MASK;
+               tmp |= FIELD_PREP(SC_PLLCTRL_SSC_DK_MASK,
+                                 DIV_ROUND_CLOSEST(487UL * freq * ssc_rate,
+                                                   divn * 512));
                writel(tmp, base);
 
                tmp = readl(base + 4);
                tmp &= ~SC_PLLCTRL2_SSC_JK_MASK;
-               tmp |= (41859 * freq / divn) & SC_PLLCTRL2_SSC_JK_MASK;
+               tmp |= FIELD_PREP(SC_PLLCTRL2_SSC_JK_MASK,
+                                 DIV_ROUND_CLOSEST(21431887UL * freq,
+                                                   divn * 512));
+               writel(tmp, base + 4);
 
                udelay(50);
        }
@@ -90,7 +95,7 @@ int uniphier_ld20_sscpll_set_regi(unsigned long reg_base, unsigned regi)
 
        tmp = readl(base + 8);  /* SSCPLLCTRL3 */
        tmp &= ~SC_PLLCTRL3_REGI_MASK;
-       tmp |= regi << SC_PLLCTRL3_REGI_SHIFT;
+       tmp |= FIELD_PREP(SC_PLLCTRL3_REGI_MASK, regi);
        writel(tmp, base + 8);
 
        iounmap(base);
index a3779734c1abc5e41d252d8ccee2b2374a558f11..05d29d2fd95f086eea75c9e7360bd829039f55ca 100644 (file)
@@ -55,6 +55,7 @@ config TARGET_MPC837XEMDS
        bool "Support MPC837XEMDS"
        select BOARD_EARLY_INIT_F
        imply CMD_SATA
+       imply FSL_SATA
 
 config TARGET_MPC837XERDB
        bool "Support MPC837XERDB"
index 92187d371be39f0dfbb16ace7577cc3352f1c8cc..5df8175f1ed6a08bb0f4c3e346eb820316568f66 100644 (file)
@@ -92,6 +92,7 @@ config TARGET_MPC8536DS
 # Use DDR3 controller with DDR2 DIMMs on this board
        select SYS_FSL_DDRC_GEN3
        imply CMD_SATA
+       imply FSL_SATA
 
 config TARGET_MPC8541CDS
        bool "Support MPC8541CDS"
@@ -148,6 +149,7 @@ config TARGET_P1022DS
        select SUPPORT_SPL
        select SUPPORT_TPL
        imply CMD_SATA
+       imply FSL_SATA
 
 config TARGET_P1023RDB
        bool "Support P1023RDB"
@@ -209,6 +211,7 @@ config TARGET_P1025RDB
        select ARCH_P1025
        imply CMD_EEPROM
        imply CMD_SATA
+       imply SATA_SIL
 
 config TARGET_P2020RDB
        bool "Support P2020RDB-PC"
@@ -217,6 +220,7 @@ config TARGET_P2020RDB
        select ARCH_P2020
        imply CMD_EEPROM
        imply CMD_SATA
+       imply SATA_SIL
 
 config TARGET_P1_TWR
        bool "Support p1_twr"
@@ -228,6 +232,7 @@ config TARGET_P2041RDB
        select BOARD_LATE_INIT if CHAIN_OF_TRUST
        select PHYS_64BIT
        imply CMD_SATA
+       imply FSL_SATA
 
 config TARGET_QEMU_PPCE500
        bool "Support qemu-ppce500"
@@ -242,6 +247,7 @@ config TARGET_T1024QDS
        select PHYS_64BIT
        imply CMD_EEPROM
        imply CMD_SATA
+       imply FSL_SATA
 
 config TARGET_T1023RDB
        bool "Support T1023RDB"
@@ -640,6 +646,7 @@ config ARCH_P1010
        imply CMD_SATA
        imply CMD_PCI
        imply CMD_REGINFO
+       imply FSL_SATA
 
 config ARCH_P1011
        bool
@@ -672,6 +679,7 @@ config ARCH_P1020
        imply CMD_SATA
        imply CMD_PCI
        imply CMD_REGINFO
+       imply SATA_SIL
 
 config ARCH_P1021
        bool
@@ -690,6 +698,7 @@ config ARCH_P1021
        imply CMD_NAND
        imply CMD_SATA
        imply CMD_REGINFO
+       imply SATA_SIL
 
 config ARCH_P1022
        bool
@@ -737,6 +746,7 @@ config ARCH_P1024
        imply CMD_SATA
        imply CMD_PCI
        imply CMD_REGINFO
+       imply SATA_SIL
 
 config ARCH_P1025
        bool
@@ -821,6 +831,7 @@ config ARCH_P3041
        imply CMD_NAND
        imply CMD_SATA
        imply CMD_REGINFO
+       imply FSL_SATA
 
 config ARCH_P4080
        bool
@@ -858,6 +869,7 @@ config ARCH_P4080
        select FSL_ELBC
        imply CMD_SATA
        imply CMD_REGINFO
+       imply SATA_SIL
 
 config ARCH_P5020
        bool
@@ -881,6 +893,7 @@ config ARCH_P5020
        select FSL_ELBC
        imply CMD_SATA
        imply CMD_REGINFO
+       imply FSL_SATA
 
 config ARCH_P5040
        bool
@@ -904,6 +917,7 @@ config ARCH_P5040
        select FSL_ELBC
        imply CMD_SATA
        imply CMD_REGINFO
+       imply FSL_SATA
 
 config ARCH_QEMU_E500
        bool
@@ -970,6 +984,7 @@ config ARCH_T1040
        imply CMD_NAND
        imply CMD_SATA
        imply CMD_REGINFO
+       imply FSL_SATA
 
 config ARCH_T1042
        bool
@@ -992,6 +1007,7 @@ config ARCH_T1042
        imply CMD_NAND
        imply CMD_SATA
        imply CMD_REGINFO
+       imply FSL_SATA
 
 config ARCH_T2080
        bool
@@ -1017,6 +1033,7 @@ config ARCH_T2080
        imply CMD_SATA
        imply CMD_NAND
        imply CMD_REGINFO
+       imply FSL_SATA
 
 config ARCH_T2081
        bool
@@ -1063,6 +1080,7 @@ config ARCH_T4160
        imply CMD_SATA
        imply CMD_NAND
        imply CMD_REGINFO
+       imply FSL_SATA
 
 config ARCH_T4240
        bool
@@ -1090,6 +1108,7 @@ config ARCH_T4240
        imply CMD_SATA
        imply CMD_NAND
        imply CMD_REGINFO
+       imply FSL_SATA
 
 config BOOKE
        bool
index c524957b6c531afcc1d5d68d0e52c09cadb7a0ba..9dd90a1b304572ffae5a06565957255096bf1990 100644 (file)
@@ -421,6 +421,17 @@ int os_get_filesize(const char *fname, loff_t *size)
        return 0;
 }
 
+void os_putc(int ch)
+{
+       putchar(ch);
+}
+
+void os_puts(const char *str)
+{
+       while (*str)
+               os_putc(*str++);
+}
+
 int os_write_ram_buf(const char *fname)
 {
        struct sandbox_state *state = state_get_current();
index 1d876b19275ff6c990f52b2990958e2df3e391c9..f47bedaf8dc8c0de9dd7ae28eeb8ff86e0107818 100644 (file)
@@ -19,6 +19,7 @@ config INTEL_BAYTRAIL
        imply MMC_SDHCI
        imply MMC_SDHCI_SDMA
        imply SCSI
+       imply SCSI_AHCI
        imply SPI_FLASH
        imply SYS_NS16550
        imply USB
index 31ac279c568e5f3eb8a45bb0e0824a4c4650957f..042ad2bf5156db01be9566eb3a41fd9a5c3c9a4a 100644 (file)
@@ -19,6 +19,7 @@ config INTEL_BRASWELL
        imply MMC_SDHCI
        imply MMC_SDHCI_SDMA
        imply SCSI
+       imply SCSI_AHCI
        imply SPI_FLASH
        imply SYS_NS16550
        imply USB
index bc2dba2bd7c816629880dbbed40d9180c890eb99..42018dc127792f224069e7ca9c450dc8484a65aa 100644 (file)
@@ -13,6 +13,7 @@ config INTEL_BROADWELL
        imply ICH_SPI
        imply INTEL_BROADWELL_GPIO
        imply SCSI
+       imply SCSI_AHCI
        imply SPI_FLASH
        imply USB
        imply USB_EHCI_HCD
index 60eb45f9d0ab00f9f49fed8bbc47a5c05b27a2c3..fa3b64f2bb8e725543d62726dc6b5e6bf28a0a3c 100644 (file)
@@ -10,6 +10,7 @@ config SYS_COREBOOT
        imply MMC_PCI
        imply MMC_SDHCI
        imply MMC_SDHCI_SDMA
+       imply SCSI_AHCI
        imply SPI_FLASH
        imply SYS_NS16550
        imply USB
index c214ea0efe0931485a9a128b2833b0237b740523..85ea6c91f34f277aceb94b7d5f35067b576d1ea5 100644 (file)
@@ -14,6 +14,7 @@ config NORTHBRIDGE_INTEL_IVYBRIDGE
        imply ICH_SPI
        imply INTEL_ICH6_GPIO
        imply SCSI
+       imply SCSI_AHCI
        imply SPI_FLASH
        imply USB
        imply USB_EHCI_HCD
index 81444f3d9e1da628ab9083e269de0c87f1d5fd00..0a801aabeadb2f115bcc9c536a0a9d88d9dba7fd 100644 (file)
@@ -9,6 +9,7 @@ config QEMU
        select ARCH_EARLY_INIT_R
        imply AHCI_PCI
        imply E1000
+       imply SCSI_AHCI
        imply SYS_NS16550
        imply USB
        imply USB_EHCI_HCD
index 835de85268dd4c1612b481b4050a26e3bcfc1622..460ede00bc539226030bd0df79214a59a0f3d1b3 100644 (file)
@@ -18,6 +18,7 @@ config INTEL_QUEENSBAY
        imply MMC_SDHCI_SDMA
        imply PCH_GBE
        imply SCSI
+       imply SCSI_AHCI
        imply SPI_FLASH
        imply SYS_NS16550
        imply USB
index fd7134f5cf9c314ebb55c234fd54b41cfd7a5097..95d58af0e5e8167ab0244f592f5886ccd74f2965 100644 (file)
@@ -79,7 +79,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
        (defined(CONFIG_SPL) && !defined(CONFIG_SPL_COMMON_INIT_DDR))
        /* *I*G - eSDHC/eSPI/NAND boot */
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
-                     MAS3_SX | MAS3_SW | MAS3_SR, 0,
+                     MAS3_SX | MAS3_SW | MAS3_SR, MAS2_M,
                      0, 8, BOOKE_PAGESZ_1G, 1),
 
 #endif /* RAMBOOT/SPL */
index 7b55b860d088f00a85a3d301dd2bf4cb995552a1..88910d6cd11c87bbe3fa6e06418cdbefc5d30424 100644 (file)
@@ -147,7 +147,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
 
 #if defined(CONFIG_RAMBOOT_PBL) && !defined(CONFIG_SPL_BUILD)
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 17, BOOKE_PAGESZ_2G, 1)
 #endif
 };
index c8ecf5de59190f2fd06ad06cccc266a2ef1db639..e5dab9ea30d21fb07577be0248f0a7d29a92e94b 100644 (file)
@@ -49,7 +49,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
 
 #if  defined(CONFIG_SYS_RAMBOOT) || defined(CONFIG_SPL)
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
-                       MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                       MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                        0, 8, BOOKE_PAGESZ_1G, 1),
 #endif
 
index 07febc2b375ba1f8ff80003e8f5ee90b23f20457..56199e52449f94388fbbf30129a31a09576cb181 100644 (file)
@@ -71,7 +71,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
 
 #if defined(CONFIG_SYS_RAMBOOT) || defined(CONFIG_SPL)
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 8, BOOKE_PAGESZ_1G, 1),
 #endif
 
index c5abed05049b8e7b790ff19bfcdf0be24f993d40..85d58c8cd4580d90f4c8c98b36d367af303d998b 100644 (file)
@@ -67,11 +67,11 @@ struct fsl_e_tlb_entry tlb_table[] = {
                (defined(CONFIG_SPL) && !defined(CONFIG_SPL_BUILD))
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE,
                        CONFIG_SYS_DDR_SDRAM_BASE,
-                       MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                       MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                        0, 8, BOOKE_PAGESZ_256M, 1),
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE + 0x10000000,
                        CONFIG_SYS_DDR_SDRAM_BASE + 0x10000000,
-                       MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                       MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                        0, 9, BOOKE_PAGESZ_256M, 1),
 #endif
 
index 1ada661743ed12d7a03aeeb9a07075e5e986f6b8..4479dd075844d8eb6d79057c859a54f159298ecf 100644 (file)
@@ -12,6 +12,7 @@ config SYS_SOC
 config SYS_CONFIG_NAME
        default "ls1088aqds"
 
+source "board/freescale/common/Kconfig"
 endif
 
 if TARGET_LS1088ARDB
@@ -28,4 +29,5 @@ config SYS_SOC
 config SYS_CONFIG_NAME
        default "ls1088ardb"
 
+source "board/freescale/common/Kconfig"
 endif
index b3d5c388ebe4be23954466f6679e3c627649a6af..de3961d510e038f61f2edd6af10ba1194263b1bc 100644 (file)
@@ -15,3 +15,15 @@ F:   board/freescale/ls1088a/
 F:     include/configs/ls1088aqds.h
 F:     configs/ls1088aqds_qspi_defconfig
 F:     configs/ls1088aqds_sdcard_qspi_defconfig
+
+LS1088AQDS_QSPI_SECURE_BOOT BOARD
+M:     Udit Agarwal <udit.agarwal@nxp.com>
+M:     Vinitha Pillai-B57223 <vinitha.pillai@nxp.com>
+S:     Maintained
+F:     configs/ls1088aqds_qspi_SECURE_BOOT_defconfig
+
+LS1088ARDB_QSPI_SECURE_BOOT BOARD
+M:     Udit Agarwal <udit.agarwal@nxp.com>
+M:     Vinitha Pillai-B57223 <vinitha.pillai@nxp.com>
+S:     Maintained
+F:     configs/ls1088ardb_qspi_SECURE_BOOT_defconfig
index 96d9ae7f1dc89114c069221d8254467a421461ba..9daa00759083040c6c2c46f2a20d91e0ae40f844 100644 (file)
@@ -315,6 +315,9 @@ int board_init(void)
        out_le32(irq_ccsr + IRQCR_OFFSET / 4, AQR105_IRQ_MASK);
 #endif
 
+#ifdef CONFIG_FSL_CAAM
+       sec_init();
+#endif
 #ifdef CONFIG_FSL_LS_PPA
        ppa_init();
 #endif
@@ -337,9 +340,6 @@ void detail_board_ddr_info(void)
 #if defined(CONFIG_ARCH_MISC_INIT)
 int arch_misc_init(void)
 {
-#ifdef CONFIG_FSL_CAAM
-       sec_init();
-#endif
        return 0;
 }
 #endif
@@ -368,6 +368,33 @@ void fdt_fixup_board_enet(void *fdt)
 #endif
 
 #ifdef CONFIG_OF_BOARD_SETUP
+void fsl_fdt_fixup_flash(void *fdt)
+{
+       int offset;
+
+/*
+ * IFC-NOR and QSPI are muxed on SoC.
+ * So disable IFC node in dts if QSPI is enabled or
+ * disable QSPI node in dts in case QSPI is not enabled.
+ */
+
+#ifdef CONFIG_FSL_QSPI
+       offset = fdt_path_offset(fdt, "/soc/ifc/nor");
+
+       if (offset < 0)
+               offset = fdt_path_offset(fdt, "/ifc/nor");
+#else
+       offset = fdt_path_offset(fdt, "/soc/quadspi");
+
+       if (offset < 0)
+               offset = fdt_path_offset(fdt, "/quadspi");
+#endif
+       if (offset < 0)
+               return;
+
+       fdt_status_disabled(fdt, offset);
+}
+
 int ft_board_setup(void *blob, bd_t *bd)
 {
        int err, i;
@@ -394,6 +421,8 @@ int ft_board_setup(void *blob, bd_t *bd)
 
        fdt_fixup_memory_banks(blob, base, size, CONFIG_NR_DRAM_BANKS);
 
+       fsl_fdt_fixup_flash(blob);
+
 #ifdef CONFIG_FSL_MC_ENET
        fdt_fixup_board_enet(blob);
        err = fsl_mc_ldpaa_exit(bd);
index fff3b4a7c28cd7b066083f010b372b6bd319bd33..6664f2755d380988eeece24601fa91d3cda52e0d 100644 (file)
@@ -81,7 +81,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
         * 0xf000_0000  64M     LBC SDRAM
         */
        SET_TLB_ENTRY(1, CONFIG_SYS_LBC_SDRAM_BASE, CONFIG_SYS_LBC_SDRAM_BASE,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 6, BOOKE_PAGESZ_64M, 1),
 
        /*
index 363e043d068e4074ff958c6c0e06760dc1fd06b3..571341ff68eab7faa902d627a31cecf812a5afbd 100644 (file)
@@ -48,7 +48,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
         */
        SET_TLB_ENTRY(1, CONFIG_SYS_LBC_SDRAM_BASE,
                      CONFIG_SYS_LBC_SDRAM_BASE_PHYS,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 2, BOOKE_PAGESZ_64M, 1),
 
        /*
index b5e2fec1f995ae26e245cbd89c420abe4e95f943..03d0fa1cd9a6f682ad0ffc7d1959e88e4c1d04f0 100644 (file)
@@ -67,7 +67,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
         * 0xf000_0000  64M     LBC SDRAM
         */
        SET_TLB_ENTRY(1, CONFIG_SYS_LBC_SDRAM_BASE, CONFIG_SYS_LBC_SDRAM_BASE,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 4, BOOKE_PAGESZ_64M, 1),
 
        /*
index af40f979d36efb0ff76e20cd6faff65e3c12b55a..7d151f9e5f344bbfc5b8c7bac875e21015114a01 100644 (file)
@@ -76,7 +76,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
 #if defined(CONFIG_SYS_RAMBOOT) || \
        (defined(CONFIG_SPL) && !defined(CONFIG_SPL_COMMON_INIT_DDR))
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
-                       MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                       MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                        0, 8, BOOKE_PAGESZ_1G, 1),
 #endif
 
index e7ae2e25b224acf62009cc39760c2b4e36ea5f30..69d5e449e0d46253e42cfa0017f6ca16ab14be19 100644 (file)
@@ -75,12 +75,12 @@ struct fsl_e_tlb_entry tlb_table[] = {
        (defined(CONFIG_SPL) && !defined(CONFIG_SPL_COMMON_INIT_DDR))
        /* **** - eSDHC/eSPI/NAND boot */
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 8, BOOKE_PAGESZ_1G, 1),
        /* **** - eSDHC/eSPI/NAND boot - second 1GB of memory */
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
                      CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 9, BOOKE_PAGESZ_1G, 1),
 #endif
 
index 8fd178e211bacebac7d6fbae4387d66450098c64..35a63fe0269e87a4d16cf207bd5cf872a95148be 100644 (file)
@@ -86,12 +86,12 @@ struct fsl_e_tlb_entry tlb_table[] = {
 #ifdef CONFIG_SYS_RAMBOOT
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE,
                      CONFIG_SYS_DDR_SDRAM_BASE,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 12, BOOKE_PAGESZ_256M, 1),
 
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE + 0x10000000,
                      CONFIG_SYS_DDR_SDRAM_BASE + 0x10000000,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 13, BOOKE_PAGESZ_256M, 1),
 #endif
 };
index 7cba411007fb8a3c4f0f6f6108e51651abb5a4df..6324ebfa322020367cdb727888f4088e3c5c44e9 100644 (file)
@@ -82,7 +82,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
        (defined(CONFIG_SPL) && !defined(CONFIG_SPL_COMMON_INIT_DDR))
        /* *I*G - eSDHC/eSPI/NAND boot */
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
-                       MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                       MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                        0, 8, BOOKE_PAGESZ_1G, 1),
 
 #if defined(CONFIG_TARGET_P1020MBG) || defined(CONFIG_TARGET_P1020RDB_PD)
index 308335c974a060184f28adc42a789ca2ab0f0d0a..0f365f9163457db662a1bbe358317bad13ea3795 100644 (file)
@@ -67,7 +67,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
 #ifdef CONFIG_SYS_RAMBOOT
        /* *I*G - eSDHC boot */
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
-                       MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                       MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                        0, 8, BOOKE_PAGESZ_1G, 1),
 #endif
 
index 409e1739996c4847040ceb110d29abdcc7060590..0d27a998c51a410999efa912d073ebceb29a13f9 100644 (file)
@@ -102,11 +102,11 @@ struct fsl_e_tlb_entry tlb_table[] = {
 
 #if defined(CONFIG_RAMBOOT_PBL) && !defined(CONFIG_SPL_BUILD)
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 12, BOOKE_PAGESZ_1G, 1),
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
                      CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 13, BOOKE_PAGESZ_1G, 1)
 #endif
        /* entry 14 and 15 has been used hard coded, they will be disabled
index 8269b3d72505c91d9ee83e091c81affe1507bb81..d77ce25784cea8fd68558fb94be26828ffccc009 100644 (file)
@@ -102,11 +102,11 @@ struct fsl_e_tlb_entry tlb_table[] = {
 
 #if defined(CONFIG_RAMBOOT_PBL) && !defined(CONFIG_SPL_BUILD)
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 12, BOOKE_PAGESZ_1G, 1),
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
                      CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 13, BOOKE_PAGESZ_1G, 1)
 #endif
        /* entry 14 and 15 has been used hard coded, they will be disabled
index 7c0511e268bad96546b13aae3882a0e1f7dd3275..078947902fd952b1f2eee3cd25d3bc87deaa7553 100644 (file)
@@ -120,11 +120,11 @@ struct fsl_e_tlb_entry tlb_table[] = {
 
 #if defined(CONFIG_RAMBOOT_PBL) && !defined(CONFIG_SPL_BUILD)
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 12, BOOKE_PAGESZ_1G, 1),
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
                      CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 13, BOOKE_PAGESZ_1G, 1)
 #endif
 };
index 8d602989b2dd92b1ce78f31db2aa04cdc461d637..b0b3b4d48a5435e26fe230c9a959e79eceb5c8f2 100644 (file)
@@ -145,7 +145,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
 
 #if defined(CONFIG_RAMBOOT_PBL) && !defined(CONFIG_SPL_BUILD)
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 19, BOOKE_PAGESZ_2G, 1)
 #endif
 };
index 2ebea36a5c22d5664c3fea4129f347bb8b6bc2af..2cae4d02b36586f197735c08a7a4dfda4b6bf3fd 100644 (file)
@@ -144,7 +144,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
 #endif
 #if defined(CONFIG_RAMBOOT_PBL) && !defined(CONFIG_SPL_BUILD)
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 19, BOOKE_PAGESZ_2G, 1)
 #endif
 
index 1e4d096f5f9716649a23a7eabb48f976bd10f1ef..a6d8bb36037d2a28f291a00eeba4e0dc3083e1fb 100644 (file)
@@ -139,7 +139,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
 
 #if defined(CONFIG_RAMBOOT_PBL) && !defined(CONFIG_SPL_BUILD)
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 19, BOOKE_PAGESZ_2G, 1)
 #endif
 };
index 6a6b4b5cc13feaee680d9083e6e9fa1caa312e9e..648cfabeea0a8260aa64d2149d1752edf40685c1 100644 (file)
@@ -116,7 +116,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
 #endif
 #if defined(CONFIG_RAMBOOT_PBL) && !defined(CONFIG_SPL_BUILD)
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 18, BOOKE_PAGESZ_2G, 1)
 #endif
 };
index aee86a4356d6876f3b7a42b60882af3e69f6c043..58b438fc1493ca2883f9ec9815ae36d9aeeb2c80 100644 (file)
@@ -65,7 +65,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
 
 #ifdef CONFIG_SYS_RAMBOOT
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 6, BOOKE_PAGESZ_1G, 1),
 #endif
 #endif
index 06b3998ac055b2ee9f038ee4cb7baffd5931206d..b77b3d63dbb8a3a932797518db2f9abaece14951 100644 (file)
@@ -17,3 +17,46 @@ This step is optional, but should you want to change the default to the SOM-LV,
   make distclean
   make omap3_logic_defconfig
 
+Falcon Mode: FAT SD cards
+=========================
+
+In this case the additional file is written to the filesystem.  In this
+example we assume that the uImage and device tree to be used are already on
+the FAT filesystem (only the uImage MUST be for this to function
+afterwards) along with a Falcon Mode aware MLO and the FAT partition has
+already been created and marked bootable:
+
+U-Boot # mmc rescan
+# Load kernel and device tree into memory, perform export
+U-Boot # fatload mmc 0 ${loadaddr} uImage
+U-Boot # run loadfdt
+U-Boot # setenv optargs quiet
+U-Boot # run mmcargs
+U-Boot # run common_bootargs
+U-Boot # spl export fdt ${loadaddr} - ${fdtaddr}
+
+This will print a number of lines and then end with something like:
+   Loading Device Tree to 8dec9000, end 8dee0295 ... OK
+
+So then note the starting address and write the args to mmc/sd:
+
+U-Boot # fatwrite mmc 0:1 0x8dec9000 args 0x20000
+
+The size of 0x20000 matches the CMD_SPL_WRITE_SIZE.
+
+Falcon Mode: NAND
+=================
+
+In this case the additional data is written to another partition of the
+NAND.  In this example we assume that the uImage and device tree to be are
+already located on the NAND somewhere (such as filesystem or mtd partition)
+along with a Falcon Mode aware MLO written to the correct locations for
+booting and mtdparts have been configured correctly for the board:
+
+U-Boot # nand read ${loadaddr} kernel
+U-Boot # load nand rootfs ${fdtaddr} /boot/am335x-evm.dtb
+U-Boot # run nandargs
+U-Boot # run common_bootargs
+U-Boot # spl export fdt ${loadaddr} - ${fdtaddr}
+U-Boot # nand erase.part u-boot-spl-os
+U-Boot # nand write ${fdtaddr} u-boot-spl-os
index a55a520e63e512a69f237599b6311766feb69078..b30fa24a322d6d77714fc16ad44c61ec3f2983d3 100644 (file)
@@ -114,6 +114,47 @@ void get_board_mem_timings(struct board_sdrc_timings *timings)
        timings->ctrlb = MICRON_V_ACTIMB_200;
        timings->rfr_ctrl = SDP_3430_SDRC_RFR_CTRL_200MHz;
 }
+
+#define GPMC_NAND_COMMAND_0 (OMAP34XX_GPMC_BASE + 0x7c)
+#define GPMC_NAND_DATA_0 (OMAP34XX_GPMC_BASE + 0x84)
+#define GPMC_NAND_ADDRESS_0 (OMAP34XX_GPMC_BASE + 0x80)
+
+void spl_board_prepare_for_linux(void)
+{
+       /* The Micron NAND starts locked which
+        * prohibits mounting the NAND as RW
+        * The following commands are what unlocks
+        * the NAND to become RW Falcon Mode does not
+        * have as many smarts as U-Boot, but Logic PD
+        * only makes NAND with 512MB so these hard coded
+        * values should work for all current models
+        */
+
+       writeb(0x70, GPMC_NAND_COMMAND_0);
+       writeb(-1, GPMC_NAND_DATA_0);
+       writeb(0x7a, GPMC_NAND_COMMAND_0);
+       writeb(0x00, GPMC_NAND_ADDRESS_0);
+       writeb(0x00, GPMC_NAND_ADDRESS_0);
+       writeb(0x00, GPMC_NAND_ADDRESS_0);
+       writeb(-1, GPMC_NAND_COMMAND_0);
+
+       /* Begin address 0 */
+       writeb(NAND_CMD_UNLOCK1, 0x6e00007c);
+       writeb(0x00, GPMC_NAND_ADDRESS_0);
+       writeb(0x00, GPMC_NAND_ADDRESS_0);
+       writeb(0x00, GPMC_NAND_ADDRESS_0);
+       writeb(-1, GPMC_NAND_DATA_0);
+
+       /* Ending address at the end of Flash */
+       writeb(NAND_CMD_UNLOCK2, GPMC_NAND_COMMAND_0);
+       writeb(0xc0, GPMC_NAND_ADDRESS_0);
+       writeb(0xff, GPMC_NAND_ADDRESS_0);
+       writeb(0x03, GPMC_NAND_ADDRESS_0);
+       writeb(-1, GPMC_NAND_DATA_0);
+       writeb(0x79, GPMC_NAND_COMMAND_0);
+       writeb(-1, GPMC_NAND_DATA_0);
+       writeb(-1, GPMC_NAND_DATA_0);
+}
 #endif
 
 #ifdef CONFIG_USB_MUSB_OMAP2PLUS
@@ -207,6 +248,16 @@ int board_init(void)
 }
 
 #ifdef CONFIG_BOARD_LATE_INIT
+
+static void unlock_nand(void)
+{
+       int dev = nand_curr_device;
+       struct mtd_info *mtd;
+
+       mtd = get_nand_dev_by_index(dev);
+       nand_unlock(mtd, 0, mtd->size, 0);
+}
+
 int board_late_init(void)
 {
        struct board_id *board;
@@ -256,6 +307,10 @@ int board_late_init(void)
 
        /* restore hsusb0_data5 pin as hsusb0_data5 */
        MUX_VAL(CP(HSUSB0_DATA5),       (IEN  | PTD | DIS | M0));
+
+#ifdef CONFIG_CMD_NAND_LOCK_UNLOCK
+       unlock_nand();
+#endif
        return 0;
 }
 #endif
index 2f7e4c536488150529f660fef1943ff44324f67a..d2bf3049f10a1a810803214fb48da5be61099903 100644 (file)
@@ -66,7 +66,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
         * 0xf0000000   64M     LBC SDRAM First half
         */
        SET_TLB_ENTRY(1, CONFIG_SYS_LBC_SDRAM_BASE, CONFIG_SYS_LBC_SDRAM_BASE,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 3, BOOKE_PAGESZ_64M, 1),
 
        /*
@@ -75,7 +75,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
         */
        SET_TLB_ENTRY(1, CONFIG_SYS_LBC_SDRAM_BASE + 0x4000000,
                      CONFIG_SYS_LBC_SDRAM_BASE + 0x4000000,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
+                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                      0, 4, BOOKE_PAGESZ_64M, 1),
 #endif
 
index 7b562556e6bcd9469185fbaa5182752f10a36939..7641978a7b13d7b5bd17cccca06b640499c8b49e 100644 (file)
@@ -26,6 +26,10 @@ int board_early_init_f(void)
        return 0;
 }
 
+#define SDIO_BASE              (ARC_PERIPHERAL_BASE + 0xA000)
+#define SDIO_UHS_REG_EXT       (SDIO_BASE + 0x108)
+#define SDIO_UHS_REG_EXT_DIV_2 (2 << 30)
+
 int board_mmc_init(bd_t *bis)
 {
        struct dwmci_host *host = NULL;
@@ -36,12 +40,18 @@ int board_mmc_init(bd_t *bis)
                return 1;
        }
 
+       /*
+        * Switch SDIO external ciu clock divider from default div-by-8 to
+        * minimum possible div-by-2.
+        */
+       writel(SDIO_UHS_REG_EXT_DIV_2, (void __iomem *) SDIO_UHS_REG_EXT);
+
        memset(host, 0, sizeof(struct dwmci_host));
        host->name = "Synopsys Mobile storage";
        host->ioaddr = (void *)ARC_DWMMC_BASE;
        host->buswidth = 4;
        host->dev_index = 0;
-       host->bus_hz = 100000000;
+       host->bus_hz = 50000000;
 
        add_dwmci(host, host->bus_hz / 2, 400000);
 
index 0ad267cdd07b5db5a04fe1e138be69d9484cec16..27e3823d525c01952a2904564e87de0838329447 100644 (file)
@@ -173,7 +173,7 @@ static void setup_serial(void)
 
        serialno = crc32_no_comp(0, low, 8);
        serialno |= (u64)crc32_no_comp(serialno, high, 8) << 32;
-       snprintf(serialno_str, sizeof(serialno_str), "%llx", serialno);
+       snprintf(serialno_str, sizeof(serialno_str), "%016llx", serialno);
 
        env_set("cpuid#", cpuid_str);
        env_set("serial#", serialno_str);
index 5a6afab99b7f4cdbd3635378dc7bbd99e2c04cc7..c0332235261f3826ecfcca5c088a3e51d3519cf9 100644 (file)
@@ -1502,6 +1502,14 @@ config CMD_KGDB
          single-stepping, inspecting variables, etc. This is supported only
          on PowerPC at present.
 
+config CMD_LOG
+       bool "log - Generation, control and access to logging"
+       help
+         This provides access to logging features. It allows the output of
+         log data to be controlled to a limited extent (setting up the default
+         maximum log level for emitting of records). It also provides access
+         to a command used for testing the log system.
+
 config CMD_TRACE
        bool "trace - Support tracing of function calls and timing"
        help
index 2b0444d5b777819fb744318bd43843b131a877f5..00e38696daaf6a230a28f5bb8e01daa12ed90694 100644 (file)
@@ -76,7 +76,7 @@ obj-$(CONFIG_LED_STATUS_CMD) += legacy_led.o
 obj-$(CONFIG_CMD_LED) += led.o
 obj-$(CONFIG_CMD_LICENSE) += license.o
 obj-y += load.o
-obj-$(CONFIG_LOGBUFFER) += log.o
+obj-$(CONFIG_CMD_LOG) += log.o
 obj-$(CONFIG_ID_EEPROM) += mac.o
 obj-$(CONFIG_CMD_MD5SUM) += md5sum.o
 obj-$(CONFIG_CMD_MEMORY) += mem.o
index 478bc116e242a167835d2033831d94034058931b..78ff109835d4f9e8ffc9dfc4809cfece614ba5e5 100644 (file)
@@ -6,10 +6,12 @@
  *  SPDX-License-Identifier:     GPL-2.0+
  */
 
+#include <charset.h>
 #include <common.h>
 #include <command.h>
 #include <dm.h>
 #include <efi_loader.h>
+#include <efi_selftest.h>
 #include <errno.h>
 #include <libfdt.h>
 #include <libfdt_env.h>
@@ -43,12 +45,39 @@ static void efi_init_obj_list(void)
 #ifdef CONFIG_GENERATE_SMBIOS_TABLE
        efi_smbios_register();
 #endif
+       efi_watchdog_register();
 
        /* Initialize EFI runtime services */
        efi_reset_system_init();
        efi_get_time_init();
 }
 
+/*
+ * Set the load options of an image from an environment variable.
+ *
+ * @loaded_image_info: the image
+ * @env_var:           name of the environment variable
+ */
+static void set_load_options(struct efi_loaded_image *loaded_image_info,
+                            const char *env_var)
+{
+       size_t size;
+       const char *env = env_get(env_var);
+
+       loaded_image_info->load_options = NULL;
+       loaded_image_info->load_options_size = 0;
+       if (!env)
+               return;
+       size = strlen(env) + 1;
+       loaded_image_info->load_options = calloc(size, sizeof(u16));
+       if (!loaded_image_info->load_options) {
+               printf("ERROR: Out of memory\n");
+               return;
+       }
+       utf8_to_utf16(loaded_image_info->load_options, (u8 *)env, size);
+       loaded_image_info->load_options_size = size * 2;
+}
+
 static void *copy_fdt(void *fdt)
 {
        u64 fdt_size = fdt_totalsize(fdt);
@@ -92,10 +121,10 @@ static void *copy_fdt(void *fdt)
        return new_fdt;
 }
 
-static ulong efi_do_enter(void *image_handle,
-                         struct efi_system_table *st,
-                         asmlinkage ulong (*entry)(void *image_handle,
-                               struct efi_system_table *st))
+static efi_status_t efi_do_enter(
+                       void *image_handle, struct efi_system_table *st,
+                       asmlinkage ulong (*entry)(void *image_handle,
+                                                 struct efi_system_table *st))
 {
        efi_status_t ret = EFI_LOAD_ERROR;
 
@@ -106,7 +135,7 @@ static ulong efi_do_enter(void *image_handle,
 }
 
 #ifdef CONFIG_ARM64
-static unsigned long efi_run_in_el2(asmlinkage ulong (*entry)(
+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)
 {
@@ -121,9 +150,9 @@ static unsigned long efi_run_in_el2(asmlinkage ulong (*entry)(
  * Load an EFI payload into a newly allocated piece of memory, register all
  * EFI objects it would want to access and jump to it.
  */
-static unsigned long do_bootefi_exec(void *efi, void *fdt,
-                                    struct efi_device_path *device_path,
-                                    struct efi_device_path *image_path)
+static efi_status_t do_bootefi_exec(void *efi, void *fdt,
+                                   struct efi_device_path *device_path,
+                                   struct efi_device_path *image_path)
 {
        struct efi_loaded_image loaded_image_info = {};
        struct efi_object loaded_image_info_obj = {};
@@ -189,6 +218,8 @@ static unsigned long do_bootefi_exec(void *efi, void *fdt,
                efi_install_configuration_table(&fdt_guid, NULL);
        }
 
+       /* Transfer environment variable bootargs as load options */
+       set_load_options(&loaded_image_info, "bootargs");
        /* Load the EFI payload */
        entry = efi_load_pe(efi, &loaded_image_info);
        if (!entry) {
@@ -223,7 +254,8 @@ static unsigned long do_bootefi_exec(void *efi, void *fdt,
                dcache_disable();       /* flush cache before switch to EL2 */
 
                /* Move into EL2 and keep running there */
-               armv8_switch_to_el2((ulong)entry, (ulong)&loaded_image_info,
+               armv8_switch_to_el2((ulong)entry,
+                                   (ulong)&loaded_image_info_obj.handle,
                                    (ulong)&systab, 0, (ulong)efi_run_in_el2,
                                    ES_TO_AARCH64);
 
@@ -232,7 +264,7 @@ static unsigned long do_bootefi_exec(void *efi, void *fdt,
        }
 #endif
 
-       ret = efi_do_enter(&loaded_image_info, &systab, entry);
+       ret = efi_do_enter(loaded_image_info_obj.handle, &systab, entry);
 
 exit:
        /* image has returned, loaded-image obj goes *poof*: */
@@ -277,7 +309,7 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        char *saddr, *sfdt;
        unsigned long addr, fdt_addr = 0;
-       unsigned long r;
+       efi_status_t r;
 
        if (argc < 2)
                return CMD_RET_USAGE;
@@ -298,6 +330,12 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                struct efi_loaded_image loaded_image_info = {};
                struct efi_object loaded_image_info_obj = {};
 
+               /* Construct a dummy device path. */
+               bootefi_device_path = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE,
+                                                     (uintptr_t)&efi_selftest,
+                                                     (uintptr_t)&efi_selftest);
+               bootefi_image_path = efi_dp_from_file(NULL, 0, "\\selftest");
+
                efi_setup_loaded_image(&loaded_image_info,
                                       &loaded_image_info_obj,
                                       bootefi_device_path, bootefi_image_path);
@@ -310,7 +348,14 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                /* Initialize and populate EFI object list */
                if (!efi_obj_list_initalized)
                        efi_init_obj_list();
-               return efi_selftest(&loaded_image_info, &systab);
+               /* Transfer environment variable efi_selftest as load options */
+               set_load_options(&loaded_image_info, "efi_selftest");
+               /* Execute the test */
+               r = efi_selftest(loaded_image_info_obj.handle, &systab);
+               efi_restore_gd();
+               free(loaded_image_info.load_options);
+               list_del(&loaded_image_info_obj.link);
+               return r != EFI_SUCCESS;
        } else
 #endif
        if (!strcmp(argv[1], "bootmgr")) {
@@ -356,6 +401,8 @@ static char bootefi_help_text[] =
 #ifdef CONFIG_CMD_BOOTEFI_SELFTEST
        "bootefi selftest\n"
        "  - boot an EFI selftest application stored within U-Boot\n"
+       "    Use environment variable efi_selftest to select a single test.\n"
+       "    Use 'setenv efi_selftest list' to enumerate all tests.\n"
 #endif
        "bootmgr [fdt addr]\n"
        "  - load and boot EFI payload based on BootOrder/BootXXXX variables.\n"
@@ -390,6 +437,8 @@ void efi_set_bootdev(const char *dev, const char *devnr, const char *path)
                int part;
 
                desc = blk_get_dev(dev, simple_strtol(devnr, NULL, 10));
+               if (!desc)
+                       return;
                part = parse_partnum(devnr);
 
                bootefi_device_path = efi_dp_from_part(desc, part);
index 3dd7c6ba4de2d014535a973ba400eae060d8698d..bfddf8be1b9849d5cb9f66262aaaf747896d7396 100644 (file)
--- a/cmd/i2c.c
+++ b/cmd/i2c.c
@@ -1156,7 +1156,10 @@ static int do_sdram (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
        uint    chip;
        u_char  data[128];
        u_char  cksum;
-       int     j;
+       int     j, ret;
+#ifdef CONFIG_DM_I2C
+       struct udevice *dev;
+#endif
 
        static const char *decode_CAS_DDR2[] = {
                " TBD", " 6", " 5", " 4", " 3", " 2", " TBD", " TBD"
@@ -1210,7 +1213,14 @@ static int do_sdram (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
         */
        chip = simple_strtoul (argv[1], NULL, 16);
 
-       if (i2c_read (chip, 0, 1, data, sizeof (data)) != 0) {
+#ifdef CONFIG_DM_I2C
+       ret = i2c_get_cur_bus_chip(chip, &dev);
+       if (!ret)
+               ret = dm_i2c_read(dev, 0, data, sizeof(data));
+#else
+       ret = i2c_read(chip, 0, 1, data, sizeof(data));
+#endif
+       if (ret) {
                puts ("No SDRAM Serial Presence Detect found.\n");
                return 1;
        }
index 7a3bd5cd690d08df58907a124ec7c0d37e43e520..abc523b497192cd84c41fea10ddbb575def68b5a 100644 (file)
--- a/cmd/log.c
+++ b/cmd/log.c
 /*
- * (C) Copyright 2002-2007
- * Detlev Zundel, DENX Software Engineering, dzu@denx.de.
+ * Copyright (c) 2017 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
  *
- * Code used from linux/kernel/printk.c
- * Copyright (C) 1991, 1992  Linus Torvalds
- *
- * SPDX-License-Identifier:    GPL-2.0+
- *
- * Comments:
- *
- * After relocating the code, the environment variable "loglevel" is
- * copied to console_loglevel.  The functionality is similar to the
- * handling in the Linux kernel, i.e. messages logged with a priority
- * less than console_loglevel are also output to stdout.
- *
- * If you want messages with the default level (e.g. POST messages) to
- * appear on stdout also, make sure the environment variable
- * "loglevel" is set at boot time to a number higher than
- * default_message_loglevel below.
- */
-
-/*
- * Logbuffer handling routines
+ * SPDX-License-Identifier:     GPL-2.0+
  */
 
 #include <common.h>
 #include <command.h>
-#include <stdio_dev.h>
-#include <post.h>
-#include <logbuff.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-/* Local prototypes */
-static void logbuff_putc(struct stdio_dev *dev, const char c);
-static void logbuff_puts(struct stdio_dev *dev, const char *s);
-static int logbuff_printk(const char *line);
-
-static char buf[1024];
-
-/* This combination will not print messages with the default loglevel */
-static unsigned console_loglevel = 3;
-static unsigned default_message_loglevel = 4;
-static unsigned log_version = 1;
-#ifdef CONFIG_ALT_LB_ADDR
-static volatile logbuff_t *log;
-#else
-static logbuff_t *log;
-#endif
-static char *lbuf;
-
-unsigned long __logbuffer_base(void)
-{
-       return CONFIG_SYS_SDRAM_BASE + get_effective_memsize() - LOGBUFF_LEN;
-}
-unsigned long logbuffer_base(void)
-__attribute__((weak, alias("__logbuffer_base")));
+#include <dm.h>
+#include <log.h>
 
-void logbuff_init_ptrs(void)
+static int do_log_level(cmd_tbl_t *cmdtp, int flag, int argc,
+                       char * const argv[])
 {
-       unsigned long tag, post_word;
-       char *s;
-
-#ifdef CONFIG_ALT_LB_ADDR
-       log = (logbuff_t *)CONFIG_ALT_LH_ADDR;
-       lbuf = (char *)CONFIG_ALT_LB_ADDR;
-#else
-       log = (logbuff_t *)(logbuffer_base()) - 1;
-       lbuf = (char *)log->buf;
-#endif
-
-       /* Set up log version */
-       s = env_get("logversion");
-       if (s)
-               log_version = (int)simple_strtoul(s, NULL, 10);
-
-       if (log_version == 2)
-               tag = log->v2.tag;
+       if (argc > 1)
+               gd->default_log_level = simple_strtol(argv[1], NULL, 10);
        else
-               tag = log->v1.tag;
-       post_word = post_word_load();
-#ifdef CONFIG_POST
-       /* The post routines have setup the word so we can simply test it */
-       if (tag != LOGBUFF_MAGIC || (post_word & POST_COLDBOOT))
-               logbuff_reset();
-#else
-       /* No post routines, so we do our own checking                    */
-       if (tag != LOGBUFF_MAGIC || post_word != LOGBUFF_MAGIC) {
-               logbuff_reset ();
-               post_word_store (LOGBUFF_MAGIC);
-       }
-#endif
-       if (log_version == 2 && (long)log->v2.start > (long)log->v2.con)
-               log->v2.start = log->v2.con;
-
-       /* Initialize default loglevel if present */
-       s = env_get("loglevel");
-       if (s)
-               console_loglevel = (int)simple_strtoul(s, NULL, 10);
+               printf("Default log level: %d\n", gd->default_log_level);
 
-       gd->flags |= GD_FLG_LOGINIT;
+       return 0;
 }
 
-void logbuff_reset(void)
-{
-#ifndef CONFIG_ALT_LB_ADDR
-       memset(log, 0, sizeof(logbuff_t));
-#endif
-       if (log_version == 2) {
-               log->v2.tag = LOGBUFF_MAGIC;
-#ifdef CONFIG_ALT_LB_ADDR
-               log->v2.start = 0;
-               log->v2.con = 0;
-               log->v2.end = 0;
-               log->v2.chars = 0;
+static cmd_tbl_t log_sub[] = {
+       U_BOOT_CMD_MKENT(level, CONFIG_SYS_MAXARGS, 1, do_log_level, "", ""),
+#ifdef CONFIG_LOG_TEST
+       U_BOOT_CMD_MKENT(test, 2, 1, do_log_test, "", ""),
 #endif
-       } else {
-               log->v1.tag = LOGBUFF_MAGIC;
-#ifdef CONFIG_ALT_LB_ADDR
-               log->v1.dummy = 0;
-               log->v1.start = 0;
-               log->v1.size = 0;
-               log->v1.chars = 0;
-#endif
-       }
-}
+};
 
-int drv_logbuff_init(void)
+static int do_log(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
-       struct stdio_dev logdev;
-       int rc;
-
-       /* Device initialization */
-       memset (&logdev, 0, sizeof (logdev));
-
-       strcpy (logdev.name, "logbuff");
-       logdev.ext   = 0;                       /* No extensions */
-       logdev.flags = DEV_FLAGS_OUTPUT;        /* Output only */
-       logdev.putc  = logbuff_putc;            /* 'putc' function */
-       logdev.puts  = logbuff_puts;            /* 'puts' function */
-
-       rc = stdio_register(&logdev);
+       cmd_tbl_t *cp;
 
-       return (rc == 0) ? 1 : rc;
-}
+       if (argc < 2)
+               return CMD_RET_USAGE;
 
-static void logbuff_putc(struct stdio_dev *dev, const char c)
-{
-       char buf[2];
-       buf[0] = c;
-       buf[1] = '\0';
-       logbuff_printk(buf);
-}
+       /* drop initial "log" arg */
+       argc--;
+       argv++;
 
-static void logbuff_puts(struct stdio_dev *dev, const char *s)
-{
-       logbuff_printk (s);
-}
+       cp = find_cmd_tbl(argv[0], log_sub, ARRAY_SIZE(log_sub));
+       if (cp)
+               return cp->cmd(cmdtp, flag, argc, argv);
 
-void logbuff_log(char *msg)
-{
-       if ((gd->flags & GD_FLG_LOGINIT)) {
-               logbuff_printk(msg);
-       } else {
-               /*
-                * Can happen only for pre-relocated errors as logging
-                * at that stage should be disabled
-                */
-               puts (msg);
-       }
+       return CMD_RET_USAGE;
 }
 
-/*
- * Subroutine:  do_log
- *
- * Description: Handler for 'log' command..
- *
- * Inputs:     argv[1] contains the subcommand
- *
- * Return:      None
- *
- */
-int do_log(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
-{
-       struct stdio_dev *sdev = NULL;
-       char *s;
-       unsigned long i, start, size;
-
-       if (strcmp(argv[1], "append") == 0) {
-               /* Log concatenation of all arguments separated by spaces */
-               for (i = 2; i < argc; i++) {
-                       logbuff_printk(argv[i]);
-                       logbuff_putc(sdev, (i < argc - 1) ? ' ' : '\n');
-               }
-               return 0;
-       }
-
-       switch (argc) {
-
-       case 2:
-               if (strcmp(argv[1], "show") == 0) {
-                       if (log_version == 2) {
-                               start = log->v2.start;
-                               size = log->v2.end - log->v2.start;
-                       } else {
-                               start = log->v1.start;
-                               size = log->v1.size;
-                       }
-                       if (size > LOGBUFF_LEN)
-                               size = LOGBUFF_LEN;
-                       for (i = 0; i < size; i++) {
-                               s = lbuf + ((start + i) & LOGBUFF_MASK);
-                               putc(*s);
-                       }
-                       return 0;
-               } else if (strcmp(argv[1], "reset") == 0) {
-                       logbuff_reset();
-                       return 0;
-               } else if (strcmp(argv[1], "info") == 0) {
-                       printf("Logbuffer   at  %08lx\n", (unsigned long)lbuf);
-                       if (log_version == 2) {
-                               printf("log_start    =  %08lx\n",
-                                       log->v2.start);
-                               printf("log_end      =  %08lx\n", log->v2.end);
-                               printf("log_con      =  %08lx\n", log->v2.con);
-                               printf("logged_chars =  %08lx\n",
-                                       log->v2.chars);
-                       }
-                       else {
-                               printf("log_start    =  %08lx\n",
-                                       log->v1.start);
-                               printf("log_size     =  %08lx\n",
-                                       log->v1.size);
-                               printf("logged_chars =  %08lx\n",
-                                       log->v1.chars);
-                       }
-                       return 0;
-               }
-               return CMD_RET_USAGE;
-
-       default:
-               return CMD_RET_USAGE;
-       }
-}
+#ifdef CONFIG_SYS_LONGHELP
+static char log_help_text[] =
+       "level - get/set log level\n"
+#ifdef CONFIG_LOG_TEST
+       "log test - run log tests\n"
+#endif
+       ;
+#endif
 
 U_BOOT_CMD(
-       log,     255,   1,      do_log,
-       "manipulate logbuffer",
-       "info   - show pointer details\n"
-       "log reset  - clear contents\n"
-       "log show   - show contents\n"
-       "log append <msg> - append <msg> to the logbuffer"
+       log, CONFIG_SYS_MAXARGS, 1, do_log,
+       "log system", log_help_text
 );
-
-static int logbuff_printk(const char *line)
-{
-       int i;
-       char *msg, *p, *buf_end;
-       int line_feed;
-       static signed char msg_level = -1;
-
-       strcpy(buf + 3, line);
-       i = strlen(line);
-       buf_end = buf + 3 + i;
-       for (p = buf + 3; p < buf_end; p++) {
-               msg = p;
-               if (msg_level < 0) {
-                       if (
-                               p[0] != '<' ||
-                               p[1] < '0' ||
-                               p[1] > '7' ||
-                               p[2] != '>'
-                       ) {
-                               p -= 3;
-                               p[0] = '<';
-                               p[1] = default_message_loglevel + '0';
-                               p[2] = '>';
-                       } else {
-                               msg += 3;
-                       }
-                       msg_level = p[1] - '0';
-               }
-               line_feed = 0;
-               for (; p < buf_end; p++) {
-                       if (log_version == 2) {
-                               lbuf[log->v2.end & LOGBUFF_MASK] = *p;
-                               log->v2.end++;
-                               if (log->v2.end - log->v2.start > LOGBUFF_LEN)
-                                       log->v2.start++;
-                               log->v2.chars++;
-                       } else {
-                               lbuf[(log->v1.start + log->v1.size) &
-                                        LOGBUFF_MASK] = *p;
-                               if (log->v1.size < LOGBUFF_LEN)
-                                       log->v1.size++;
-                               else
-                                       log->v1.start++;
-                               log->v1.chars++;
-                       }
-                       if (*p == '\n') {
-                               line_feed = 1;
-                               break;
-                       }
-               }
-               if (msg_level < console_loglevel) {
-                       printf("%s", msg);
-               }
-               if (line_feed)
-                       msg_level = -1;
-       }
-       return i;
-}
index 3169c33265ce818aa46d93bd55afe49ae80fdd11..9bc977450cf8910aae84c2b6c225c27f2e651402 100644 (file)
@@ -873,15 +873,12 @@ static int device_parse(const char *const mtd_dev, const char **ret, struct mtd_
                return 1;
        }
 
-#ifdef DEBUG
        pend = strchr(p, ';');
-#endif
        debug("dev type = %d (%s), dev num = %d, mtd-id = %s\n",
                        id->type, MTD_DEV_TYPE(id->type),
                        id->num, id->mtd_id);
        debug("parsing partitions %.*s\n", (int)(pend ? pend - p : strlen(p)), p);
 
-
        /* parse partitions */
        num_parts = 0;
 
index c50d6ebb2adf35beac605282686b642a36fb4d38..4da095a4fd76240ae2490bcb3a76a9014169995f 100644 (file)
@@ -420,6 +420,92 @@ config SYS_STDIO_DEREGISTER
 
 endmenu
 
+menu "Logging"
+
+config LOG
+       bool "Enable logging support"
+       help
+         This enables support for logging of status and debug messages. These
+         can be displayed on the console, recorded in a memory buffer, or
+         discarded if not needed. Logging supports various categories and
+         levels of severity.
+
+config SPL_LOG
+       bool "Enable logging support in SPL"
+       help
+         This enables support for logging of status and debug messages. These
+         can be displayed on the console, recorded in a memory buffer, or
+         discarded if not needed. Logging supports various categories and
+         levels of severity.
+
+config LOG_MAX_LEVEL
+       int "Maximum log level to record"
+       depends on LOG
+       default 5
+       help
+         This selects the maximum log level that will be recorded. Any value
+         higher than this will be ignored. If possible log statements below
+         this level will be discarded at build time. Levels:
+
+           0 - panic
+           1 - critical
+           2 - error
+           3 - warning
+           4 - note
+           5 - info
+           6 - detail
+           7 - debug
+
+config SPL_LOG_MAX_LEVEL
+       int "Maximum log level to record in SPL"
+       depends on SPL_LOG
+       default 3
+       help
+         This selects the maximum log level that will be recorded. Any value
+         higher than this will be ignored. If possible log statements below
+         this level will be discarded at build time. Levels:
+
+           0 - panic
+           1 - critical
+           2 - error
+           3 - warning
+           4 - note
+           5 - info
+           6 - detail
+           7 - debug
+
+config LOG_CONSOLE
+       bool "Allow log output to the console"
+       depends on LOG
+       default y
+       help
+         Enables a log driver which writes log records to the console.
+         Generally the console is the serial port or LCD display. Only the
+         log message is shown - other details like level, category, file and
+         line number are omitted.
+
+config LOG_SPL_CONSOLE
+       bool "Allow log output to the console in SPL"
+       depends on LOG_SPL
+       default y
+       help
+         Enables a log driver which writes log records to the console.
+         Generally the console is the serial port or LCD display. Only the
+         log message is shown - other details like level, category, file and
+         line number are omitted.
+
+config LOG_TEST
+       bool "Provide a test for logging"
+       depends on LOG
+       default y if SANDBOX
+       help
+         This enables a 'log test' command to test logging. It is normally
+         executed from a pytest and simply outputs logging information
+         in various different ways to test that the logging system works
+         correctly with varoius settings.
+
+endmenu
+
 config DEFAULT_FDT_FILE
        string "Default fdt file"
        help
index cec506fe3e1efe25149577708d2bd59d531f9d47..14166209fe4c5d7202f00eeb6a1936da1a78478b 100644 (file)
@@ -128,5 +128,7 @@ obj-y += cli.o
 obj-$(CONFIG_FSL_DDR_INTERACTIVE) += cli_simple.o cli_readline.o
 obj-$(CONFIG_CMD_DFU) += dfu.o
 obj-y += command.o
+obj-$(CONFIG_$(SPL_)LOG) += log.o
+obj-$(CONFIG_$(SPL_)LOG_CONSOLE) += log_console.o
 obj-y += s_record.o
 obj-y += xyzModem.o
index 9220815441e51f58d34eac914c570a84da206bd1..e46eceda7d0f24ee8261eec2febde7e4c2d65b96 100644 (file)
@@ -19,7 +19,6 @@
 #include <i2c.h>
 #include <initcall.h>
 #include <init_helpers.h>
-#include <logbuff.h>
 #include <malloc.h>
 #include <mapmem.h>
 #include <os.h>
@@ -296,20 +295,6 @@ static int setup_dest_addr(void)
        return 0;
 }
 
-#if defined(CONFIG_LOGBUFFER)
-static int reserve_logbuffer(void)
-{
-#ifndef CONFIG_ALT_LB_ADDR
-       /* reserve kernel log buffer */
-       gd->relocaddr -= LOGBUFF_RESERVE;
-       debug("Reserving %dk for kernel logbuffer at %08lx\n", LOGBUFF_LEN,
-               gd->relocaddr);
-#endif
-
-       return 0;
-}
-#endif
-
 #ifdef CONFIG_PRAM
 /* reserve protected RAM */
 static int reserve_pram(void)
@@ -766,6 +751,7 @@ static const init_fnc_t init_sequence_f[] = {
        trace_early_init,
 #endif
        initf_malloc,
+       log_init,
        initf_bootstage,        /* uses its own timer, so does not need DM */
        initf_console_record,
 #if defined(CONFIG_HAVE_FSP)
@@ -846,9 +832,6 @@ static const init_fnc_t init_sequence_f[] = {
         *  - board info struct
         */
        setup_dest_addr,
-#if defined(CONFIG_LOGBUFFER)
-       reserve_logbuffer,
-#endif
 #ifdef CONFIG_PRAM
        reserve_pram,
 #endif
@@ -950,8 +933,10 @@ void board_init_f_r(void)
         * The pre-relocation drivers may be using memory that has now gone
         * away. Mark serial as unavailable - this will fall back to the debug
         * UART if available.
+        *
+        * Do the same with log drivers since the memory may not be available.
         */
-       gd->flags &= ~GD_FLG_SERIAL_READY;
+       gd->flags &= ~(GD_FLG_SERIAL_READY | GD_FLG_LOG_READY);
 #ifdef CONFIG_TIMER
        gd->timer = NULL;
 #endif
index a3b9bfb8ee4a4fe12d58818eb49c4a457f463920..09167c13cc88c987bb122c2212313f82d0c9245e 100644 (file)
@@ -30,7 +30,6 @@
 #if defined(CONFIG_CMD_KGDB)
 #include <kgdb.h>
 #endif
-#include <logbuff.h>
 #include <malloc.h>
 #include <mapmem.h>
 #ifdef CONFIG_BITBANGMII
@@ -200,19 +199,6 @@ static int initr_addr_map(void)
 }
 #endif
 
-#ifdef CONFIG_LOGBUFFER
-unsigned long logbuffer_base(void)
-{
-       return gd->ram_top - LOGBUFF_LEN;
-}
-
-static int initr_logbuffer(void)
-{
-       logbuff_init_ptrs();
-       return 0;
-}
-#endif
-
 #ifdef CONFIG_POST
 static int initr_post_backlog(void)
 {
@@ -628,7 +614,7 @@ static int initr_ide(void)
 }
 #endif
 
-#if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER)
+#if defined(CONFIG_PRAM)
 /*
  * Export available size of memory for Linux, taking into account the
  * protected RAM at top of memory
@@ -640,10 +626,6 @@ int initr_mem(void)
 
 # ifdef CONFIG_PRAM
        pram = env_get_ulong("pram", 10, CONFIG_PRAM);
-# endif
-# if defined(CONFIG_LOGBUFFER) && !defined(CONFIG_ALT_LB_ADDR)
-       /* Also take the logbuffer into account (pram is in kB) */
-       pram += (LOGBUFF_LEN + LOGBUFF_OVERHEAD) / 1024;
 # endif
        sprintf(memsz, "%ldk", (long int) ((gd->ram_size / 1024) - pram));
        env_set("mem", memsz);
@@ -709,6 +691,7 @@ static init_fnc_t init_sequence_r[] = {
 #endif
        initr_barrier,
        initr_malloc,
+       log_init,
        initr_bootstage,        /* Needs malloc() but has its own timer */
        initr_console_record,
 #ifdef CONFIG_SYS_NONCACHED_MEMORY
@@ -753,9 +736,6 @@ static init_fnc_t init_sequence_r[] = {
        board_early_init_r,
 #endif
        INIT_FUNC_WATCHDOG_RESET
-#ifdef CONFIG_LOGBUFFER
-       initr_logbuffer,
-#endif
 #ifdef CONFIG_POST
        initr_post_backlog,
 #endif
@@ -877,7 +857,7 @@ static init_fnc_t init_sequence_r[] = {
        INIT_FUNC_WATCHDOG_RESET
        initr_bedbug,
 #endif
-#if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER)
+#if defined(CONFIG_PRAM)
        initr_mem,
 #endif
 #ifdef CONFIG_PS2KBD
@@ -905,6 +885,7 @@ void board_init_r(gd_t *new_gd, ulong dest_addr)
 #if !defined(CONFIG_X86) && !defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
        gd = new_gd;
 #endif
+       gd->flags &= ~GD_FLG_LOG_READY;
 
 #ifdef CONFIG_NEEDS_MANUAL_RELOC
        for (i = 0; i < ARRAY_SIZE(init_sequence_r); i++)
index d763f2c68460df82aae6ce933823835b0e419200..0e0295514b21687fadced9a8827a0c7e4700eb6c 100644 (file)
@@ -489,6 +489,13 @@ static inline void print_pre_console_buffer(int flushpoint) {}
 
 void putc(const char c)
 {
+#ifdef CONFIG_SANDBOX
+       /* sandbox can send characters to stdout before it has a console */
+       if (!gd || !(gd->flags & GD_FLG_SERIAL_READY)) {
+               os_putc(c);
+               return;
+       }
+#endif
 #ifdef CONFIG_DEBUG_UART
        /* if we don't have a console yet, use the debug UART */
        if (!gd || !(gd->flags & GD_FLG_SERIAL_READY)) {
index 7f17fd1410ed8a3b37e48f33f7ddf14dd4b54f65..b785d8a36e6a0483f1cbdf30f73a3fec82d12b01 100644 (file)
@@ -806,6 +806,31 @@ int fit_image_get_data_offset(const void *fit, int noffset, int *data_offset)
        return 0;
 }
 
+/**
+ * Get 'data-position' property from a given image node.
+ *
+ * @fit: pointer to the FIT image header
+ * @noffset: component image node offset
+ * @data_position: holds the data-position property
+ *
+ * returns:
+ *     0, on success
+ *     -ENOENT if the property could not be found
+ */
+int fit_image_get_data_position(const void *fit, int noffset,
+                               int *data_position)
+{
+       const fdt32_t *val;
+
+       val = fdt_getprop(fit, noffset, FIT_DATA_POSITION_PROP, NULL);
+       if (!val)
+               return -ENOENT;
+
+       *data_position = fdt32_to_cpu(*val);
+
+       return 0;
+}
+
 /**
  * Get 'data-size' property from a given image node.
  *
index 4ec4744589f21dee4d3a3fa3401d42129c3e1d63..4bcf6b3128a852ee24a4a83f8d4ee91bd70699ac 100644 (file)
 #include <status_led.h>
 #endif
 
-#ifdef CONFIG_LOGBUFFER
-#include <logbuff.h>
-#endif
-
 #include <rtc.h>
 
 #include <environment.h>
@@ -1154,11 +1150,6 @@ int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
        }
 
 
-#ifdef CONFIG_LOGBUFFER
-       /* Prevent initrd from overwriting logbuffer */
-       lmb_reserve(lmb, logbuffer_base() - LOGBUFF_OVERHEAD, LOGBUFF_RESERVE);
-#endif
-
        debug("## initrd_high = 0x%08lx, copy_to_ram = %d\n",
                        initrd_high, initrd_copy_to_ram);
 
diff --git a/common/log.c b/common/log.c
new file mode 100644 (file)
index 0000000..45e46dd
--- /dev/null
@@ -0,0 +1,245 @@
+/*
+ * Logging support
+ *
+ * Copyright (c) 2017 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <log.h>
+#include <malloc.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static struct log_device *log_device_find_by_name(const char *drv_name)
+{
+       struct log_device *ldev;
+
+       list_for_each_entry(ldev, &gd->log_head, sibling_node) {
+               if (!strcmp(drv_name, ldev->drv->name))
+                       return ldev;
+       }
+
+       return NULL;
+}
+
+/**
+ * log_has_cat() - check if a log category exists within a list
+ *
+ * @cat_list: List of categories to check, at most LOGF_MAX_CATEGORIES entries
+ *     long, terminated by LC_END if fewer
+ * @cat: Category to search for
+ * @return true if @cat is in @cat_list, else false
+ */
+static bool log_has_cat(enum log_category_t cat_list[], enum log_category_t cat)
+{
+       int i;
+
+       for (i = 0; i < LOGF_MAX_CATEGORIES && cat_list[i] != LOGC_END; i++) {
+               if (cat_list[i] == cat)
+                       return true;
+       }
+
+       return false;
+}
+
+/**
+ * log_has_file() - check if a file is with a list
+ *
+ * @file_list: List of files to check, separated by comma
+ * @file: File to check for. This string is matched against the end of each
+ *     file in the list, i.e. ignoring any preceding path. The list is
+ *     intended to consist of relative pathnames, e.g. common/main.c,cmd/log.c
+ * @return true if @file is in @file_list, else false
+ */
+static bool log_has_file(const char *file_list, const char *file)
+{
+       int file_len = strlen(file);
+       const char *s, *p;
+       int substr_len;
+
+       for (s = file_list; *s; s = p + (*p != '\0')) {
+               p = strchrnul(s, ',');
+               substr_len = p - s;
+               if (file_len >= substr_len &&
+                   !strncmp(file + file_len - substr_len, s, substr_len))
+                       return true;
+       }
+
+       return false;
+}
+
+/**
+ * log_passes_filters() - check if a log record passes the filters for a device
+ *
+ * @ldev: Log device to check
+ * @rec: Log record to check
+ * @return true if @rec is not blocked by the filters in @ldev, false if it is
+ */
+static bool log_passes_filters(struct log_device *ldev, struct log_rec *rec)
+{
+       struct log_filter *filt;
+
+       /* If there are no filters, filter on the default log level */
+       if (list_empty(&ldev->filter_head)) {
+               if (rec->level > gd->default_log_level)
+                       return false;
+               return true;
+       }
+
+       list_for_each_entry(filt, &ldev->filter_head, sibling_node) {
+               if (rec->level > filt->max_level)
+                       continue;
+               if ((filt->flags & LOGFF_HAS_CAT) &&
+                   !log_has_cat(filt->cat_list, rec->cat))
+                       continue;
+               if (filt->file_list &&
+                   !log_has_file(filt->file_list, rec->file))
+                       continue;
+               return true;
+       }
+
+       return false;
+}
+
+/**
+ * log_dispatch() - Send a log record to all log devices for processing
+ *
+ * The log record is sent to each log device in turn, skipping those which have
+ * filters which block the record
+ *
+ * @rec: Log record to dispatch
+ * @return 0 (meaning success)
+ */
+static int log_dispatch(struct log_rec *rec)
+{
+       struct log_device *ldev;
+
+       list_for_each_entry(ldev, &gd->log_head, sibling_node) {
+               if (log_passes_filters(ldev, rec))
+                       ldev->drv->emit(ldev, rec);
+       }
+
+       return 0;
+}
+
+int _log(enum log_category_t cat, enum log_level_t level, const char *file,
+        int line, const char *func, const char *fmt, ...)
+{
+       char buf[CONFIG_SYS_CBSIZE];
+       struct log_rec rec;
+       va_list args;
+
+       rec.cat = cat;
+       rec.level = level;
+       rec.file = file;
+       rec.line = line;
+       rec.func = func;
+       va_start(args, fmt);
+       vsnprintf(buf, sizeof(buf), fmt, args);
+       va_end(args);
+       rec.msg = buf;
+       if (!gd || !(gd->flags & GD_FLG_LOG_READY)) {
+               if (gd)
+                       gd->log_drop_count++;
+               return -ENOSYS;
+       }
+       log_dispatch(&rec);
+
+       return 0;
+}
+
+int log_add_filter(const char *drv_name, enum log_category_t cat_list[],
+                  enum log_level_t max_level, const char *file_list)
+{
+       struct log_filter *filt;
+       struct log_device *ldev;
+       int i;
+
+       ldev = log_device_find_by_name(drv_name);
+       if (!ldev)
+               return -ENOENT;
+       filt = (struct log_filter *)calloc(1, sizeof(*filt));
+       if (!filt)
+               return -ENOMEM;
+
+       if (cat_list) {
+               filt->flags |= LOGFF_HAS_CAT;
+               for (i = 0; ; i++) {
+                       if (i == ARRAY_SIZE(filt->cat_list))
+                               return -ENOSPC;
+                       filt->cat_list[i] = cat_list[i];
+                       if (cat_list[i] == LOGC_END)
+                               break;
+               }
+       }
+       filt->max_level = max_level;
+       if (file_list) {
+               filt->file_list = strdup(file_list);
+               if (!filt->file_list)
+                       goto nomem;
+       }
+       filt->filter_num = ldev->next_filter_num++;
+       list_add_tail(&filt->sibling_node, &ldev->filter_head);
+
+       return filt->filter_num;
+
+nomem:
+       free(filt);
+       return -ENOMEM;
+}
+
+int log_remove_filter(const char *drv_name, int filter_num)
+{
+       struct log_filter *filt;
+       struct log_device *ldev;
+
+       ldev = log_device_find_by_name(drv_name);
+       if (!ldev)
+               return -ENOENT;
+
+       list_for_each_entry(filt, &ldev->filter_head, sibling_node) {
+               if (filt->filter_num == filter_num) {
+                       list_del(&filt->sibling_node);
+                       free(filt);
+
+                       return 0;
+               }
+       }
+
+       return -ENOENT;
+}
+
+int log_init(void)
+{
+       struct log_driver *drv = ll_entry_start(struct log_driver, log_driver);
+       const int count = ll_entry_count(struct log_driver, log_driver);
+       struct log_driver *end = drv + count;
+
+       /*
+        * We cannot add runtime data to the driver since it is likely stored
+        * in rodata. Instead, set up a 'device' corresponding to each driver.
+        * We only support having a single device.
+        */
+       INIT_LIST_HEAD((struct list_head *)&gd->log_head);
+       while (drv < end) {
+               struct log_device *ldev;
+
+               ldev = calloc(1, sizeof(*ldev));
+               if (!ldev) {
+                       debug("%s: Cannot allocate memory\n", __func__);
+                       return -ENOMEM;
+               }
+               INIT_LIST_HEAD(&ldev->filter_head);
+               ldev->drv = drv;
+               list_add_tail(&ldev->sibling_node,
+                             (struct list_head *)&gd->log_head);
+               drv++;
+       }
+       gd->flags |= GD_FLG_LOG_READY;
+       gd->default_log_level = LOGL_INFO;
+
+       return 0;
+}
diff --git a/common/log_console.c b/common/log_console.c
new file mode 100644 (file)
index 0000000..5af73bd
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Logging support
+ *
+ * Copyright (c) 2017 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <log.h>
+
+static int log_console_emit(struct log_device *ldev, struct log_rec *rec)
+{
+       puts(rec->msg);
+
+       return 0;
+}
+
+LOG_DRIVER(console) = {
+       .name   = "console",
+       .emit   = log_console_emit,
+};
index 72ae8f4c50310e26eb95b7c14eef62b99a6143ff..cc07fbc8a02adc332fd4a7b45b574aa0f74b17ad 100644 (file)
@@ -173,6 +173,7 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
        int align_len = ARCH_DMA_MINALIGN - 1;
        uint8_t image_comp = -1, type = -1;
        const void *data;
+       bool external_data = false;
 
        if (IS_ENABLED(CONFIG_SPL_OS_BOOT) && IS_ENABLED(CONFIG_SPL_GZIP)) {
                if (fit_image_get_comp(fit, node, &image_comp))
@@ -189,9 +190,15 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
        if (fit_image_get_load(fit, node, &load_addr))
                load_addr = image_info->load_addr;
 
-       if (!fit_image_get_data_offset(fit, node, &offset)) {
-               /* External data */
+       if (!fit_image_get_data_position(fit, node, &offset)) {
+               external_data = true;
+       } else if (!fit_image_get_data_offset(fit, node, &offset)) {
                offset += base_offset;
+               external_data = true;
+       }
+
+       if (external_data) {
+               /* External data */
                if (fit_image_get_data_size(fit, node, &len))
                        return -ENOENT;
 
index ee4f0bda9ea72f69efbefcaa3849a3f5b8f422ca..2e5143a025533a214f873aaf22440ed74e2f6cef 100644 (file)
@@ -17,9 +17,6 @@
 #include <malloc.h>
 #include <stdio_dev.h>
 #include <serial.h>
-#ifdef CONFIG_LOGBUFFER
-#include <logbuff.h>
-#endif
 
 #if defined(CONFIG_SYS_I2C)
 #include <i2c.h>
@@ -380,9 +377,6 @@ int stdio_add_devices(void)
 #endif /* CONFIG_DM_VIDEO */
 #if defined(CONFIG_KEYBOARD) && !defined(CONFIG_DM_KEYBOARD)
        drv_keyboard_init ();
-#endif
-#ifdef CONFIG_LOGBUFFER
-       drv_logbuff_init ();
 #endif
        drv_system_init ();
        serial_stdio_init ();
index 024dadb27741f4f3953f337b85ed578f1797c165..b46dfa16ccf1285d5ff9f2f142461f6146dd06ab 100644 (file)
@@ -625,7 +625,7 @@ static int usb_hub_configure(struct usb_device *dev)
        short hubCharacteristics;
        struct usb_hub_descriptor *descriptor;
        struct usb_hub_device *hub;
-       __maybe_unused struct usb_hub_status *hubsts;
+       struct usb_hub_status *hubsts;
        int ret;
 
        hub = usb_get_hub_device(dev);
@@ -779,9 +779,7 @@ static int usb_hub_configure(struct usb_device *dev)
                return ret;
        }
 
-#ifdef DEBUG
        hubsts = (struct usb_hub_status *)buffer;
-#endif
 
        debug("get_hub_status returned status %X, change %X\n",
              le16_to_cpu(hubsts->wHubStatus),
index 30e846cf4899520b291811b492c36959fe4cddc6..ff1d35bd77ffbe956477a53eaf8c8ff603a1b0fd 100644 (file)
@@ -17,6 +17,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_SUN4I_EMAC=y
 CONFIG_AXP_ALDO3_VOLT=2800
 CONFIG_AXP_ALDO4_VOLT=2800
index cd1fa64ecb0f7d205d4ab98783f099b31019fbfc..97f2e7d345d4d44c5df6087f6071a13abaa1e606 100644 (file)
@@ -21,6 +21,7 @@ CONFIG_CMD_USB_MASS_STORAGE=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_PARTITION_UUIDS is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_DFU_RAM=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_RGMII=y
index 4a90ab695a4d023bad7e4d74d7a107536be9e5d3..2916112f144f5b1ec64253d172cec04474e28003 100644 (file)
@@ -20,6 +20,7 @@ CONFIG_CMD_USB_MASS_STORAGE=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_PARTITION_UUIDS is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_DFU_RAM=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_RGMII=y
index 08b301a483b5288cf05ab944df050e1d8662ee2d..4d94548a768ab8649127e576b97fedc495e066f8 100644 (file)
@@ -15,6 +15,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_SUN7I_GMAC=y
 CONFIG_AXP_ALDO3_VOLT=2800
index 2ff2723065fab5a1ec0104e835b8beac278244d4..586e6abab07ddac2136c37ea66a3037d7a6a721e 100644 (file)
@@ -17,6 +17,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_SUN7I_GMAC=y
 CONFIG_AXP_ALDO3_VOLT=2800
index 1a0ad5a6d412063f45b171a4633c718f7c451d89..4abac45de504c4d92c875eec2ba2612e390de77c 100644 (file)
@@ -18,6 +18,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_SUN7I_GMAC=y
 CONFIG_AXP_ALDO3_VOLT=2800
index ee9415517f2a4255dc59ba0f08e1ae2dd7a09c8c..25ddce514b86c3cfe6c0cc8d4a3c5935499e1ed7 100644 (file)
@@ -19,6 +19,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_RGMII=y
 CONFIG_SUN7I_GMAC=y
index 4c2c05c4da06752100dbe56833410090e6a29f0a..808351027411d2831771de99b3be8e26eb2c90f0 100644 (file)
@@ -13,6 +13,7 @@ CONFIG_SPL=y
 CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_CMD_FLASH is not set
 # CONFIG_CMD_FPGA is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_AXP_DLDO4_VOLT=2500
 CONFIG_AXP_ELDO3_VOLT=1200
 CONFIG_SCSI=y
index a5456127e2bf6dec85fcb1535429c7a32c32954d..52650448091b38398bdc8597d7e21fb3983ef215 100644 (file)
@@ -16,6 +16,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_NETCONSOLE=y
+CONFIG_SCSI_AHCI=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_RGMII=y
 CONFIG_SUN7I_GMAC=y
index 5c8e7594980b45b219b390915f96cf01dad7c3b5..fbf18ae1e10c0bf3f7d06bd3b61a2c2d3d5fae3c 100644 (file)
@@ -18,6 +18,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_NETCONSOLE=y
+CONFIG_SCSI_AHCI=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_RGMII=y
 CONFIG_SUN7I_GMAC=y
index ef95ac6a5effcfed5ba1b868cc669e53d60a87d6..594714ef07269190273abb18800461496b85e514 100644 (file)
@@ -14,6 +14,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_SUN7I_GMAC=y
 CONFIG_SCSI=y
index c670ab851aece6b03a8b5de076f73d93636bd5aa..8c1c1334e7eb3f24bf6f503d4b1be22c7a18bfdb 100644 (file)
@@ -14,6 +14,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_SUN4I_EMAC=y
 CONFIG_SCSI=y
 CONFIG_USB_EHCI_HCD=y
index f9f73fdb2393354b96d0d6c4ba868678fd31018d..8da593be6ab33685e7b112d8cb8fb8d1dddef356 100644 (file)
@@ -22,6 +22,7 @@ CONFIG_CMD_USB_MASS_STORAGE=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_PARTITION_UUIDS is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_DFU_RAM=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_RGMII=y
index 8f7ee1d55f35ca24c1e0b92426eaf6a8a36b1ea6..cd388a9aee8b1fcb9ce0802871a42901966c51cf 100644 (file)
@@ -14,6 +14,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_SUN7I_GMAC=y
 CONFIG_SCSI=y
index 84007ad374b8bd0b228d8786f63b84a49fa1d1d9..4cc4dc4b1689598c696f786c03b0cd609930630f 100644 (file)
@@ -16,6 +16,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_RGMII=y
 CONFIG_SUN7I_GMAC=y
index 08749b8f75982899e098f44ea306ee8c9102e2c1..13538fafd11895b1bcd3078d2ca99d48d86b6cc7 100644 (file)
@@ -16,6 +16,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_RGMII=y
 CONFIG_SUN7I_GMAC=y
index a54f9de3a6ee82e75c05a99cc40d0e336be219fd..1392d1f4ac7b00129df8148a446909cf6359149e 100644 (file)
@@ -14,6 +14,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_DM_MMC=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_SUN7I_GMAC=y
index fc846b26bddbd28f34d46d4915fef8ff9b70efc3..473b9a6d5a128f30fba9e3b307895af867c05a61 100644 (file)
@@ -19,6 +19,7 @@ CONFIG_CMD_EXT2=y
 CONFIG_CMD_MTDPARTS=y
 CONFIG_MTDIDS_DEFAULT="nand0=e0600000.flash"
 CONFIG_MTDPARTS_DEFAULT="mtdparts=e0600000.flash:512k(uboot),128k(env),6m@1m(kernel),-(fs)"
+CONFIG_FSL_SATA=y
 # CONFIG_MMC is not set
 CONFIG_MTD_NOR_FLASH=y
 CONFIG_PHYLIB=y
index 0893c4ac026077a3b09adb9e174612e3b40096bf..c95cec698af9d94286f304c9da5a0d27c1f8a3ab 100644 (file)
@@ -23,6 +23,7 @@ CONFIG_CMD_CACHE=y
 CONFIG_CMD_DATE=y
 CONFIG_CMD_EXT2=y
 CONFIG_CMD_FAT=y
+CONFIG_SATA_SIL3114=y
 # CONFIG_MMC is not set
 CONFIG_MTD_NOR_FLASH=y
 CONFIG_PHYLIB=y
index 8a8f05544f2fdd395d51cd842f1e898b70b680d6..4403bc0d62ccdcd8a6427d1a466931ee5769d375 100644 (file)
@@ -23,6 +23,7 @@ CONFIG_CMD_CACHE=y
 CONFIG_CMD_DATE=y
 CONFIG_CMD_EXT2=y
 CONFIG_CMD_FAT=y
+CONFIG_SATA_SIL3114=y
 # CONFIG_MMC is not set
 CONFIG_MTD_NOR_FLASH=y
 CONFIG_PHYLIB=y
index 14b7a5a8bae3fa3386e67e71e4989053d23f07d9..bc54b3ac52a105b8f34451c8f834fa714ce55dd6 100644 (file)
@@ -17,6 +17,7 @@ CONFIG_CMD_PING=y
 CONFIG_CMD_DATE=y
 CONFIG_CMD_EXT2=y
 CONFIG_CMD_FAT=y
+CONFIG_FSL_SATA=y
 CONFIG_MTD_NOR_FLASH=y
 CONFIG_PHYLIB=y
 CONFIG_SYS_NS16550=y
index 6e30ac45f0ff5c57c5d7921250ede119ddc7f7b0..4f9219b7ea77872b834ac16313b5ef2c53419f32 100644 (file)
@@ -18,6 +18,7 @@ CONFIG_CMD_PING=y
 # CONFIG_CMD_HASH is not set
 CONFIG_CMD_EXT2=y
 CONFIG_ENV_IS_IN_FLASH=y
+CONFIG_SCSI_AHCI=y
 # CONFIG_MMC is not set
 CONFIG_MTD_NOR_FLASH=y
 CONFIG_PHYLIB=y
index bce08d139e77bc8909151e74906fa211c96b3335..14e2933f5b910539589146058483e8d17d779238 100644 (file)
@@ -18,6 +18,7 @@ CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
 # CONFIG_CMD_HASH is not set
 CONFIG_CMD_EXT2=y
+CONFIG_SCSI_AHCI=y
 CONFIG_SYS_FSL_DDR2=y
 # CONFIG_MMC is not set
 CONFIG_MTD_NOR_FLASH=y
index 9dd7c735d11982068bbba92160f24872125166ae..86546f068e2f3b061a4dd5cb7ab1491aa29396f0 100644 (file)
@@ -17,6 +17,7 @@ CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
 # CONFIG_CMD_HASH is not set
 CONFIG_CMD_EXT2=y
+CONFIG_SCSI_AHCI=y
 CONFIG_SYS_FSL_DDR2=y
 # CONFIG_MMC is not set
 CONFIG_MTD_NOR_FLASH=y
index 40256c8708f6715374938be304d8a07f75c9d3fb..cb2e06377d9735021660a49195d25c309aac2f05 100644 (file)
@@ -16,6 +16,7 @@ CONFIG_CMD_PING=y
 CONFIG_CMD_BMP=y
 CONFIG_CMD_EXT2=y
 CONFIG_DOS_PARTITION=y
+CONFIG_SCSI_AHCI=y
 # CONFIG_MMC is not set
 CONFIG_MTD_NOR_FLASH=y
 CONFIG_SCSI=y
index d51bdf3b9e5cee22934e4d5bd0f24d742d16cfbd..a85ecfb976c005eed227ba808f15b3a812ad0282 100644 (file)
@@ -15,6 +15,7 @@ CONFIG_CMD_USB=y
 CONFIG_CMD_PING=y
 CONFIG_CMD_EXT2=y
 CONFIG_DOS_PARTITION=y
+CONFIG_SCSI_AHCI=y
 # CONFIG_MMC is not set
 CONFIG_MTD_NOR_FLASH=y
 CONFIG_PHYLIB=y
index dd2a92b69143f63f297d364cb66646d12e75d77d..72ff192a52eeca8ebf0ba9700445dad9b46febee 100644 (file)
@@ -15,6 +15,7 @@ CONFIG_CMD_DHCP=y
 CONFIG_CMD_PING=y
 CONFIG_CMD_EXT2=y
 CONFIG_DOS_PARTITION=y
+CONFIG_SCSI_AHCI=y
 # CONFIG_MMC is not set
 CONFIG_MTD_NOR_FLASH=y
 CONFIG_PHYLIB=y
index 8bce411663b9324b05ea47e237f6dab70db5dd51..e79c3a2245d8cb9a7b30c34e9c6114506983b828 100644 (file)
@@ -10,6 +10,7 @@ CONFIG_SPL=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_SUN4I_EMAC=y
 CONFIG_SUNXI_NO_PMIC=y
 CONFIG_SCSI=y
index 24a4aff478262ba27dc6418f94d95827df7ec024..d51ee9d91f409af5ad13098d5d338950c2dad503 100644 (file)
@@ -14,6 +14,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_SUN4I_EMAC=y
 CONFIG_SCSI=y
 CONFIG_USB_EHCI_HCD=y
index 84c83dab2ee0210e17274b7bff57db4a5fcfaa2f..b4a1964629eb54a63119604dba8c67632d653f64 100644 (file)
@@ -15,6 +15,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_SUN7I_GMAC=y
 CONFIG_SCSI=y
index d39cc66d8558714e5551719ae78ed73af46beba2..50dd0fc32c626d57ff441fcfe3d48ca8d6b2646d 100644 (file)
@@ -18,6 +18,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_RGMII=y
 CONFIG_SUN7I_GMAC=y
index 17f825f241b55114b6b5de8ad4e43860ea8462c4..6f3782c1059cf344de008179fe63945bec5b81e1 100644 (file)
@@ -20,6 +20,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_RGMII=y
 CONFIG_SUN7I_GMAC=y
index 5dda2bbdb5282f0c59994e866569d087c21d65b2..1eedd3c21fd4db1d7b3e2eedf7ecab5f0a9c6827 100644 (file)
@@ -25,6 +25,7 @@ CONFIG_CMD_MTDPARTS=y
 CONFIG_MTDIDS_DEFAULT="nor0=ec000000.nor"
 CONFIG_MTDPARTS_DEFAULT="mtdparts=ec000000.nor:256k(vsc7385-firmware),256k(dtb),5632k(kernel),57856k(fs),256k(qe-ucode-firmware),1280k(u-boot)"
 CONFIG_ENV_IS_IN_FLASH=y
+CONFIG_SATA_SIL3114=y
 CONFIG_MTD_NOR_FLASH=y
 CONFIG_PHYLIB=y
 CONFIG_NETDEVICES=y
index 2e96ba2a526437dc8a8c071bc27982ee9ba5e09c..a16e3630009e071064be940deef2d088298c3936 100644 (file)
@@ -18,6 +18,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SCSI_AHCI=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_RGMII=y
 CONFIG_SUN7I_GMAC=y
index 6e4d04c13b66c270d0ac45f69a1c20a4b3025498..fc96401d3e55c391e1ea84370ddafda3c2c2a9ea 100644 (file)
@@ -39,6 +39,7 @@ CONFIG_OF_LIST="am57xx-beagle-x15 am57xx-beagle-x15-revb1 am57xx-beagle-x15-revc
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
 CONFIG_SPL_DM=y
+CONFIG_SCSI_AHCI=y
 # CONFIG_BLK is not set
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
index e36491086f0bb6d9084ba7c2a9988244b3a11dbd..681e2a54c8ffa2bccb9c50eaac558fc9154c45e1 100644 (file)
@@ -42,6 +42,7 @@ CONFIG_OF_LIST="am57xx-beagle-x15 am57xx-beagle-x15-revb1 am57xx-beagle-x15-revc
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
 CONFIG_SPL_DM=y
+CONFIG_SCSI_AHCI=y
 # CONFIG_BLK is not set
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
index 2b1b34d80a2927778d8928e64ecbf9ffcef2f27a..18107e88ff7c256d98b3ec9a427ae41ba530dd2f 100644 (file)
@@ -45,6 +45,7 @@ CONFIG_CMD_EXT4=y
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_ENV_IS_IN_MMC=y
+CONFIG_DWC_AHSATA=y
 CONFIG_PHYLIB=y
 CONFIG_PHY_MICREL=y
 CONFIG_PHY_MICREL_KSZ90X1=y
index ddf8c8d1e357db63dbef33b7667d3743267279eb..c40e14fdf28de05fdb283b749c8578ed63855c02 100644 (file)
@@ -34,6 +34,7 @@ CONFIG_CMD_EXT4=y
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_ENV_IS_IN_MMC=y
+CONFIG_DWC_AHSATA=y
 CONFIG_PHYLIB=y
 CONFIG_PHY_MICREL=y
 CONFIG_PHY_MICREL_KSZ90X1=y
index 6eba47b8ce0d47073fc866d455c34377bf2c8eb8..5d1243ad92767ea99a7ae58a418718caa894b07a 100644 (file)
@@ -34,6 +34,7 @@ CONFIG_CMD_EXT4=y
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_ENV_IS_IN_MMC=y
+CONFIG_DWC_AHSATA=y
 CONFIG_PHYLIB=y
 CONFIG_PHY_MICREL=y
 CONFIG_PHY_MICREL_KSZ90X1=y
index 79ff0aaed282adfc5350d898f2a4fe290bf4432c..efe15459bcfdb7ab1be0d052ca5892109a07fefd 100644 (file)
@@ -16,6 +16,7 @@ CONFIG_SPL_I2C_SUPPORT=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_NETCONSOLE=y
+CONFIG_SCSI_AHCI=y
 CONFIG_ETH_DESIGNWARE=y
 CONFIG_RGMII=y
 CONFIG_SUN7I_GMAC=y
index 47c0b4c6221a6083bd9378d38fb8b5d5fbe08de0..418e4e2d8cbebd51f20c79604a92a60fed327afe 100644 (file)
@@ -45,6 +45,7 @@ CONFIG_CMD_EXT4_WRITE=y
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_DWC_AHSATA=y
 CONFIG_DFU_MMC=y
 CONFIG_DFU_SF=y
 CONFIG_PHYLIB=y
index 8f0a7f68ce6fb4f0b9a33818b07848458f989907..9c3031bac862867875a028a02672db659e3f22a0 100644 (file)
@@ -33,6 +33,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_ISO_PARTITION=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_SCSI_AHCI=y
 CONFIG_CMD_PCA953X=y
 CONFIG_LED_STATUS=y
 CONFIG_LED_STATUS_GPIO=y
index 0773aca0d4998c14438c1473e5c12785baaf58eb..8e0746bcf83540d2b6375a7ba690f8cd95e59444 100644 (file)
@@ -52,6 +52,7 @@ CONFIG_MTDIDS_DEFAULT="nor0=spi0.0"
 CONFIG_MTDPARTS_DEFAULT="mtdparts=spi0.0:768k(uboot),256k(uboot-environment),-(reserved)"
 CONFIG_OF_CONTROL=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_DWC_AHSATA=y
 CONFIG_DM_MMC=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_ATMEL=y
index 69b1cbfdfe8bc843f9f8edff0f54fefea4648e74..ca80f18e77387e13b43383a3bab80e82e880ad53 100644 (file)
@@ -38,6 +38,7 @@ CONFIG_CMD_FS_GENERIC=y
 CONFIG_ISO_PARTITION=y
 CONFIG_EFI_PARTITION=y
 CONFIG_ENV_IS_IN_MMC=y
+CONFIG_SCSI_AHCI=y
 CONFIG_MMC_OMAP_HS=y
 CONFIG_SCSI=y
 CONFIG_SYS_NS16550=y
index 48e9f6e920d021957b95d9b3889b6954d02d1bcf..67fa8e4e87c20ec7e985c93bef0d01060ebc6d73 100644 (file)
@@ -32,6 +32,7 @@ CONFIG_CMD_EXT2=y
 CONFIG_CMD_FAT=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
+CONFIG_FSL_SATA=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_PHYLIB=y
index 58729b62ada7d05095e82925f7c3181d9dc5f788..19a4daa2c26b9230c372f739300d88dd7284d204 100644 (file)
@@ -32,6 +32,7 @@ CONFIG_CMD_EXT2=y
 CONFIG_CMD_FAT=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
+CONFIG_FSL_SATA=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_PHYLIB=y
index f65e5259342551d9d61ff959c598897589848bdf..856591e2c88251e663da6f6cbe85a552d9ae7547 100644 (file)
@@ -35,6 +35,7 @@ CONFIG_EFI_PARTITION=y
 CONFIG_OF_BOARD_FIXUP=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SPL_OF_TRANSLATE=y
+CONFIG_SCSI_AHCI=y
 CONFIG_DM_GPIO=y
 CONFIG_DM_PCA953X=y
 CONFIG_DM_I2C=y
index 496c5c02d49400c893b7de62ed046705aef9228d..61fd89200587d363b6bfe5f9c1995fd8ed51a149 100644 (file)
@@ -26,6 +26,7 @@ CONFIG_ISO_PARTITION=y
 CONFIG_EFI_PARTITION=y
 # CONFIG_PARTITION_UUIDS is not set
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_MACRONIX=y
index beac2661892951ef7486972c0da8db4d1fb50164..5cc27813b052f3a3a4c0fd15104e49e7498b4c31 100644 (file)
@@ -38,6 +38,7 @@ CONFIG_EFI_PARTITION=y
 # CONFIG_SPL_PARTITION_UUIDS is not set
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SPL_OF_TRANSLATE=y
+CONFIG_SCSI_AHCI=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_SDMA=y
 CONFIG_MMC_SDHCI_MV=y
index 23eaa123a2fdf2201440cfa7153145e99deb3ed3..6724af04bc2616370f8b153253a6f5a2271a25b0 100644 (file)
@@ -37,6 +37,7 @@ CONFIG_EFI_PARTITION=y
 # CONFIG_PARTITION_UUIDS is not set
 # CONFIG_SPL_PARTITION_UUIDS is not set
 CONFIG_SPL_OF_TRANSLATE=y
+CONFIG_SATA_MV=y
 # CONFIG_MMC is not set
 CONFIG_NAND=y
 CONFIG_NAND_PXA3XX=y
index 814df1cd275c5b6548fc842b63b61183740f4a0d..1fd7c50e316c3189ac9b249c5c049d922478e671 100644 (file)
@@ -40,6 +40,7 @@ CONFIG_CMD_EXT4_WRITE=y
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_DWC_AHSATA=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_SPANSION=y
 CONFIG_PHYLIB=y
index cbc9e82eedbe21dcf3b81d2515ad5d8379c1e3b9..144a86bcbfce63f0b053eab3d50c121accfc8381 100644 (file)
@@ -28,6 +28,7 @@ CONFIG_CMD_EXT4_WRITE=y
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_DWC_AHSATA=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_PHYLIB=y
index 9be2d6cc529f683d7559ccf4b3ab13b33ce29cb4..075e5070f0440cca19cbdb80b161b780963d8e0f 100644 (file)
@@ -27,6 +27,7 @@ CONFIG_CMD_EXT4_WRITE=y
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_DWC_AHSATA=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_PHYLIB=y
index 62ad86ced4b9d555017963ea7ec2a3178633ff5a..f5556e30aab852b9983088258d792298dc711d8d 100644 (file)
@@ -23,6 +23,7 @@ CONFIG_MTDPARTS_DEFAULT="mtdparts=orion_nand:896k(u-boot),128k(u-boot-env),5m(ke
 CONFIG_CMD_UBI=y
 CONFIG_ISO_PARTITION=y
 CONFIG_ENV_IS_IN_NAND=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
index 1130faa3923aad9cab31d83d646a341e881a86d8..9d24f9c16bb59fb462f1d4b1e0d101042f166552 100644 (file)
@@ -19,6 +19,7 @@ CONFIG_CMD_EXT4=y
 CONFIG_CMD_FAT=y
 CONFIG_ISO_PARTITION=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_MACRONIX=y
index 987a924b7e9ff6703c423cb7ebeb9a05b4f1ce88..6d513cf584ad282926bd8706a6d7a434dc8cbd46 100644 (file)
@@ -14,6 +14,7 @@ CONFIG_CMD_DATE=y
 CONFIG_CMD_FAT=y
 CONFIG_ISO_PARTITION=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_BAR=y
index 14540ca3718a7973df798192c0dda1457dc66dd2..4eafb6d5faf750b106756ad1a9639b86f329fb06 100644 (file)
@@ -21,6 +21,7 @@ CONFIG_CMD_USB=y
 CONFIG_CMD_EXT2=y
 CONFIG_ISO_PARTITION=y
 CONFIG_ENV_IS_IN_FLASH=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_MTD_NOR_FLASH=y
 CONFIG_SYS_NS16550=y
index 80652fec7966d9ba728f331cfa83a986680ab39c..bdfd62a5765eaf871281819b577a8ee17965e41a 100644 (file)
@@ -24,6 +24,7 @@ CONFIG_MTDPARTS_DEFAULT="mtdparts=orion_nand:1m(uboot),6M(uImage),-(root)"
 CONFIG_CMD_UBI=y
 CONFIG_ISO_PARTITION=y
 CONFIG_ENV_IS_IN_NAND=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
index d219fee508f4941ba4054e7d366b319d6067cf9a..66a668a7bb56f42bb6fafb69f3f68af33025cb2c 100644 (file)
@@ -24,6 +24,7 @@ CONFIG_MTDPARTS_DEFAULT="mtdparts=orion_nand:896K(uboot),128K(uboot_env),-@1M(ro
 CONFIG_CMD_UBI=y
 CONFIG_ISO_PARTITION=y
 CONFIG_ENV_IS_IN_NAND=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
index 5379cf3b3b321890ecad44187ad987f3cbe6898a..b35d0914e33a4e910a204d466be7323e0431be48 100644 (file)
@@ -53,6 +53,7 @@ CONFIG_MTDPARTS_DEFAULT="mtdparts=nand:16m(uboot),1m(env),-(rootfs)"
 CONFIG_CMD_UBI=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
+CONFIG_DWC_AHSATA=y
 CONFIG_PHYLIB=y
 CONFIG_NETDEVICES=y
 CONFIG_E1000=y
index fe364d07ce46a89d34c74d643d4c844bc8af9aaa..6a2c196c9bb4bb131b8ff8a6b4dde44012997a1b 100644 (file)
@@ -53,6 +53,7 @@ CONFIG_MTDPARTS_DEFAULT="mtdparts=nand:16m(uboot),1m(env),-(rootfs)"
 CONFIG_CMD_UBI=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
+CONFIG_DWC_AHSATA=y
 CONFIG_PHYLIB=y
 CONFIG_MV88E61XX_SWITCH=y
 CONFIG_MV88E61XX_CPU_PORT=5
index dd4d73ce9e862d511ed36ffcbdefc12773a4546a..be6cf0cbdece48c42e9e76d2cceb6674a4f05455 100644 (file)
@@ -56,6 +56,7 @@ CONFIG_MTDPARTS_DEFAULT="mtdparts=nand:16m(uboot),1m(env),-(rootfs)"
 CONFIG_CMD_UBI=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_DM=y
+CONFIG_DWC_AHSATA=y
 CONFIG_PHYLIB=y
 CONFIG_NETDEVICES=y
 CONFIG_E1000=y
index 20a7b71737175d23afb032ac21fc5eb41a850112..f55b5dcebd98f7aef0f9e77960176ced8d4a3ea6 100644 (file)
@@ -23,6 +23,7 @@ CONFIG_ISO_PARTITION=y
 CONFIG_EFI_PARTITION=y
 # CONFIG_PARTITION_UUIDS is not set
 CONFIG_ENV_IS_IN_NVRAM=y
+CONFIG_SCSI_AHCI=y
 # CONFIG_MMC is not set
 CONFIG_SCSI=y
 CONFIG_OF_LIBFDT=y
index fd7c14886070e2b0fe3e6662bdee1570977e7c24..f6bfa06dcb80a5b60bbd1faca8f7c8e637de547e 100644 (file)
@@ -22,6 +22,7 @@ CONFIG_MTDPARTS_DEFAULT="mtdparts=orion_nand:0xe0000@0x0(uboot),0x20000@0xe0000(
 CONFIG_CMD_UBI=y
 CONFIG_ISO_PARTITION=y
 CONFIG_ENV_IS_IN_NAND=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
index bac0d95b76bea022890209e85ce548b17e2e7cf2..d222c335fea6ac9b2b1b96605cb265d2fe4088ab 100644 (file)
@@ -26,6 +26,7 @@ CONFIG_ISO_PARTITION=y
 CONFIG_EFI_PARTITION=y
 # CONFIG_PARTITION_UUIDS is not set
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_MACRONIX=y
index 4073db6583e7bd3f31fd239fdbae02f54d3222d0..0435d51dc41ad5ee680383eb195857ee6196778a 100644 (file)
@@ -34,6 +34,7 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM=y
+CONFIG_SCSI_AHCI=y
 # CONFIG_BLK is not set
 CONFIG_DM_MMC=y
 CONFIG_DM_SPI_FLASH=y
diff --git a/configs/ls1088aqds_qspi_SECURE_BOOT_defconfig b/configs/ls1088aqds_qspi_SECURE_BOOT_defconfig
new file mode 100644 (file)
index 0000000..7d0e985
--- /dev/null
@@ -0,0 +1,48 @@
+CONFIG_ARM=y
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_USB=y
+# CONFIG_SYS_MALLOC_F is not set
+CONFIG_DEFAULT_DEVICE_TREE="fsl-ls1088a-qds"
+CONFIG_DM=y
+CONFIG_SCSI_AHCI=y
+CONFIG_DM_PCI=y
+CONFIG_DM_PCI_COMPAT=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_DM_USB=y
+CONFIG_EFI_LOADER_BOUNCE_BUFFER=y
+CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_E1000=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_FSL_CAAM=y
+CONFIG_FSL_DSPI=y
+CONFIG_FSL_LS_PPA=y
+CONFIG_HUSH_PARSER=y
+CONFIG_NETDEVICES=y
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_OF_BOARD_SETUP=y
+CONFIG_OF_CONTROL=y
+CONFIG_OF_STDOUT_VIA_ALIAS=y
+CONFIG_PCI=y
+CONFIG_PCIE_LAYERSCAPE=y
+CONFIG_RSA=y
+CONFIG_RSA_SOFTWARE_EXP=y
+CONFIG_SECURE_BOOT=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_SYS_EXTRA_OPTIONS="SYS_FSL_DDR4, QSPI_BOOT"
+CONFIG_SYS_NS16550=y
+CONFIG_TARGET_LS1088AQDS=y
+CONFIG_USB=y
+CONFIG_USB_DWC3=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_XHCI_DWC3=y
+CONFIG_USB_XHCI_HCD=y
+# CONFIG_DISPLAY_BOARDINFO is not set
+# CONFIG_USE_BOOTCOMMAND is not set
index 850be3ebc9bbc85a549cfdc8a2b211fd2b763809..df5bdaf41d2006fc8c82ef51d8a6c52ff195c4b7 100644 (file)
@@ -8,6 +8,7 @@ CONFIG_OF_BOARD_SETUP=y
 CONFIG_OF_STDOUT_VIA_ALIAS=y
 CONFIG_SYS_EXTRA_OPTIONS="SYS_FSL_DDR4, QSPI_BOOT"
 # CONFIG_DISPLAY_BOARDINFO is not set
+# CONFIG_USE_BOOTCOMMAND is not set
 CONFIG_HUSH_PARSER=y
 CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
@@ -20,6 +21,7 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM=y
+CONFIG_SCSI_AHCI=y
 CONFIG_DM_SPI_FLASH=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_SPANSION=y
index 214de5459dbecdcabe764157c02c0ea8b20f2809..805364e8c78fe99a45bfa7664d003ae5ecc886e0 100644 (file)
@@ -14,6 +14,7 @@ CONFIG_PARTITIONS=y
 CONFIG_SYS_EXTRA_OPTIONS="SD_BOOT_QSPI"
 CONFIG_SD_BOOT=y
 # CONFIG_DISPLAY_BOARDINFO is not set
+# CONFIG_USE_BOOTCOMMAND is not set
 CONFIG_SPL=y
 CONFIG_SPL_BUILD=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
@@ -32,6 +33,7 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM=y
+CONFIG_SCSI_AHCI=y
 CONFIG_DM_SPI_FLASH=y
 CONFIG_SPI_FLASH=y
 CONFIG_NETDEVICES=y
diff --git a/configs/ls1088ardb_qspi_SECURE_BOOT_defconfig b/configs/ls1088ardb_qspi_SECURE_BOOT_defconfig
new file mode 100644 (file)
index 0000000..d020f7e
--- /dev/null
@@ -0,0 +1,49 @@
+CONFIG_ARM=y
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_USB=y
+# CONFIG_SYS_MALLOC_F is not set
+CONFIG_DEFAULT_DEVICE_TREE="fsl-ls1088a-rdb"
+CONFIG_DISTRO_DEFAULTS=y
+CONFIG_DM=y
+CONFIG_SCSI_AHCI=y
+CONFIG_DM_PCI=y
+CONFIG_DM_PCI_COMPAT=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_DM_USB=y
+CONFIG_EFI_LOADER_BOUNCE_BUFFER=y
+CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_E1000=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_FSL_CAAM=y
+CONFIG_FSL_DSPI=y
+CONFIG_FSL_LS_PPA=y
+CONFIG_HUSH_PARSER=y
+CONFIG_NETDEVICES=y
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_OF_BOARD_SETUP=y
+CONFIG_OF_CONTROL=y
+CONFIG_OF_STDOUT_VIA_ALIAS=y
+CONFIG_PCI=y
+CONFIG_PCIE_LAYERSCAPE=y
+CONFIG_RSA=y
+CONFIG_RSA_SOFTWARE_EXP=y
+CONFIG_SECURE_BOOT=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_SYS_EXTRA_OPTIONS="SYS_FSL_DDR4, QSPI_BOOT"
+CONFIG_SYS_NS16550=y
+CONFIG_TARGET_LS1088ARDB=y
+CONFIG_USB=y
+CONFIG_USB_DWC3=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_XHCI_DWC3=y
+CONFIG_USB_XHCI_HCD=y
+# CONFIG_DISPLAY_BOARDINFO is not set
+# CONFIG_USE_BOOTCOMMAND is not set
index 1f3d5812444112cf15c81a0bef98560829088bab..93f7a153039f6b524c1c02f4ff6b35b70421e0d0 100644 (file)
@@ -9,6 +9,7 @@ CONFIG_OF_BOARD_SETUP=y
 CONFIG_OF_STDOUT_VIA_ALIAS=y
 CONFIG_SYS_EXTRA_OPTIONS="SYS_FSL_DDR4, QSPI_BOOT"
 # CONFIG_DISPLAY_BOARDINFO is not set
+# CONFIG_USE_BOOTCOMMAND is not set
 CONFIG_HUSH_PARSER=y
 CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
@@ -21,6 +22,7 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM=y
+CONFIG_SCSI_AHCI=y
 CONFIG_DM_SPI_FLASH=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_SPANSION=y
index 8e5cf3bc5b25143ac8f61823d464099f33770d28..539326c9a387af71c284a994b508a5193c659418 100644 (file)
@@ -15,6 +15,7 @@ CONFIG_PARTITIONS=y
 CONFIG_SYS_EXTRA_OPTIONS="SD_BOOT_QSPI"
 CONFIG_SD_BOOT=y
 # CONFIG_DISPLAY_BOARDINFO is not set
+# CONFIG_USE_BOOTCOMMAND is not set
 CONFIG_SPL=y
 CONFIG_SPL_BUILD=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
@@ -33,6 +34,7 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM=y
+CONFIG_SCSI_AHCI=y
 CONFIG_DM_SPI_FLASH=y
 CONFIG_SPI_FLASH=y
 CONFIG_NETDEVICES=y
index ee6043e704dca1b28022639d1db7ae3084cc7680..17a077d8d71f74761c9bb652d08f0afe66c4e64b 100644 (file)
@@ -1,12 +1,13 @@
 CONFIG_ARM=y
 CONFIG_TARGET_LS2080AQDS=y
+CONFIG_FSL_LS_PPA=y
 CONFIG_SECURE_BOOT=y
 CONFIG_DEFAULT_DEVICE_TREE="fsl-ls2080a-qds"
 # CONFIG_SYS_MALLOC_F is not set
-CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_OF_STDOUT_VIA_ALIAS=y
+CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_BOOTDELAY=10
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 root=/dev/ram0 earlycon=uart8250,mmio,0x21c0500 ramdisk_size=0x2000000 default_hugepagesz=2m hugepagesz=2m hugepages=256"
@@ -28,6 +29,7 @@ CONFIG_CMD_DATE=y
 CONFIG_OF_CONTROL=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM=y
+CONFIG_FSL_CAAM=y
 CONFIG_MTD_NOR_FLASH=y
 CONFIG_DM_SPI_FLASH=y
 CONFIG_PHYLIB=y
@@ -47,6 +49,5 @@ CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_STORAGE=y
 CONFIG_RSA=y
-CONFIG_SPL_RSA=y
 CONFIG_RSA_SOFTWARE_EXP=y
 CONFIG_EFI_LOADER_BOUNCE_BUFFER=y
index 01fc9e65b7d652741e0fd31125840361a526463d..37137f442594467d6c23529c71c47edd6905a346 100644 (file)
@@ -1,12 +1,13 @@
 CONFIG_ARM=y
 CONFIG_TARGET_LS2080ARDB=y
+CONFIG_FSL_LS_PPA=y
 CONFIG_SECURE_BOOT=y
 CONFIG_DEFAULT_DEVICE_TREE="fsl-ls2080a-rdb"
 # CONFIG_SYS_MALLOC_F is not set
-CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_OF_STDOUT_VIA_ALIAS=y
+CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_BOOTDELAY=10
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS1,115200 root=/dev/ram0 earlycon=uart8250,mmio,0x21c0600 ramdisk_size=0x2000000 default_hugepagesz=2m hugepagesz=2m hugepages=256"
@@ -27,6 +28,7 @@ CONFIG_CMD_DATE=y
 CONFIG_OF_CONTROL=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM=y
+CONFIG_FSL_CAAM=y
 CONFIG_MTD_NOR_FLASH=y
 CONFIG_DM_SPI_FLASH=y
 CONFIG_PHYLIB=y
@@ -46,6 +48,5 @@ CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_STORAGE=y
 CONFIG_RSA=y
-CONFIG_SPL_RSA=y
 CONFIG_RSA_SOFTWARE_EXP=y
 CONFIG_EFI_LOADER_BOUNCE_BUFFER=y
index 1ab8f18cd34ed6ce19f2eaac0c5ab305d0cbf3c4..e53203284074be695028f5ec7cb1eeb1b7c6c45f 100644 (file)
@@ -25,6 +25,7 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM=y
+CONFIG_SCSI_AHCI=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_SPI_FLASH=y
 CONFIG_PHYLIB=y
index 4df0a21298830d7d5fcedbad20fb68025f0c7928..077df1a5bfaee344022a0856acde606874dd3bf6 100644 (file)
@@ -28,6 +28,7 @@ CONFIG_EFI_PARTITION=y
 # CONFIG_PARTITION_UUIDS is not set
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_STMICRO=y
index d6ba4be28653e4a612d4851239743ede4a05c3a0..3627eb998beeb33764172a9d5ae68d520e9a356b 100644 (file)
@@ -20,6 +20,7 @@ CONFIG_CMD_USB=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_STMICRO=y
index 291144d421cbe976a0d83d349b17085b89e13fd2..845aee4730615e35196c4976c21e51efbf259e08 100644 (file)
@@ -39,6 +39,7 @@ CONFIG_MTDIDS_DEFAULT="nand0=mxc_nand"
 CONFIG_MTDPARTS_DEFAULT="mtdparts=mxc_nand:1024k(u-boot),512k(env1),512k(env2),14m(boot),240m(data),-@2048k(UBI)"
 CONFIG_CMD_UBI=y
 CONFIG_ENV_IS_IN_NAND=y
+CONFIG_DWC_AHSATA=y
 CONFIG_NAND=y
 CONFIG_NAND_MXC=y
 CONFIG_PHYLIB=y
index 0fd4514c3748c0ebc8193130779de57705d264d9..283a964f24b437133c5964050fda75f9b458eece 100644 (file)
@@ -36,6 +36,7 @@ CONFIG_MAC_PARTITION=y
 CONFIG_ISO_PARTITION=y
 CONFIG_EFI_PARTITION=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_SCSI_AHCI=y
 CONFIG_BLOCK_CACHE=y
 CONFIG_DM_GPIO=y
 # CONFIG_MVEBU_GPIO is not set
index cffb3d06e6580a470bc930e945030bca0c52d337..48742d612a7bd90fe2e1c0184d5b774db5c71dcc 100644 (file)
@@ -39,6 +39,7 @@ CONFIG_MAC_PARTITION=y
 CONFIG_ISO_PARTITION=y
 CONFIG_EFI_PARTITION=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_SCSI_AHCI=y
 CONFIG_BLOCK_CACHE=y
 CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_MVTWSI=y
index 95db6c610e3b2268361ccaf63637ed22cef4e8e7..d99c4f52d97f079ef0f4238a75791ae48f962185 100644 (file)
@@ -35,6 +35,7 @@ CONFIG_MAC_PARTITION=y
 CONFIG_ISO_PARTITION=y
 CONFIG_EFI_PARTITION=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_SCSI_AHCI=y
 CONFIG_BLOCK_CACHE=y
 CONFIG_DM_I2C=y
 CONFIG_MISC=y
index f77979308257bed44766bc605a4efaa3a3cfe94e..366e4378df76576c3f068dd4535402830670bb5d 100644 (file)
@@ -41,6 +41,7 @@ CONFIG_MAC_PARTITION=y
 CONFIG_ISO_PARTITION=y
 CONFIG_EFI_PARTITION=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_SCSI_AHCI=y
 CONFIG_BLOCK_CACHE=y
 CONFIG_DM_GPIO=y
 CONFIG_DM_I2C=y
index 3fba84c04756083e646eb456b070c39b99814452..7471b10aa02d6b1a43295cb10b870858e624a9ca 100644 (file)
@@ -20,6 +20,7 @@ CONFIG_CMD_EXT2=y
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_ENV_IS_IN_MMC=y
+CONFIG_DWC_AHSATA=y
 CONFIG_USB=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_HOST_ETHER=y
index 37a2f2abd3a1fdc87f5d5b7b11469915534fd55a..05eaf1270dd5c988c8b74ab068990b21c9db1cff 100644 (file)
@@ -28,6 +28,7 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_PARTITION_UUIDS is not set
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
+CONFIG_DWC_AHSATA=y
 CONFIG_PHYLIB=y
 CONFIG_DM_THERMAL=y
 CONFIG_USB=y
index 6beb52893c24b0b7f0ece0a6847b910a7bb68d76..c52c3923b4b05dfeeece842a4987dda61c351454 100644 (file)
@@ -33,6 +33,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
+CONFIG_DWC_AHSATA=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_SST=y
 CONFIG_PHYLIB=y
index 09bb8f1e932a331e7f21f0107c4f7b9df576d1de..8a71ed894e37744b9a05896f8e967aad8f46894b 100644 (file)
@@ -24,6 +24,7 @@ CONFIG_ISO_PARTITION=y
 CONFIG_EFI_PARTITION=y
 # CONFIG_PARTITION_UUIDS is not set
 CONFIG_ENV_IS_IN_NAND=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
index 3e3150042d5e127158ede85156caa624c553569c..76b1f90354b6d4c63b64c863259116d6824cc646 100644 (file)
@@ -26,6 +26,7 @@ CONFIG_ISO_PARTITION=y
 CONFIG_EFI_PARTITION=y
 # CONFIG_PARTITION_UUIDS is not set
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_MACRONIX=y
index edd279ad6fe47a1bd9b05b55f8af329f089b6abd..67cb4dd2e9f9079355dc5eb9573d8e234123d4fb 100644 (file)
@@ -26,6 +26,7 @@ CONFIG_ISO_PARTITION=y
 CONFIG_EFI_PARTITION=y
 # CONFIG_PARTITION_UUIDS is not set
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_MACRONIX=y
index 2454c4f380ed0215310eef96c8e6c35e102a0e7c..dc721282755250344a90bb91f0942ddfb6933ab8 100644 (file)
@@ -26,6 +26,7 @@ CONFIG_ISO_PARTITION=y
 CONFIG_EFI_PARTITION=y
 # CONFIG_PARTITION_UUIDS is not set
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_MACRONIX=y
index 6f67c5db6369c59709f6ae32230cc52409d4ca6b..f2dec062e754ab1ef7d51e0501d6e41c61a1cc8f 100644 (file)
@@ -24,6 +24,7 @@ CONFIG_CMD_FAT=y
 CONFIG_EFI_PARTITION=y
 # CONFIG_PARTITION_UUIDS is not set
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_MACRONIX=y
index cdcc09641e92a30fc05d85cc39946b4fafd9ed3f..c898150d9e60e20f764aa25b8bdb4a288fb974ff 100644 (file)
@@ -26,6 +26,7 @@ CONFIG_ISO_PARTITION=y
 CONFIG_EFI_PARTITION=y
 # CONFIG_PARTITION_UUIDS is not set
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_MACRONIX=y
index c25d2bf67b6d9f81c7fbdbe66d1107192ba8bc9b..d0153d4df6784350258db54ccfb3020a7b968a88 100644 (file)
@@ -32,6 +32,7 @@ CONFIG_CMD_EXT4_WRITE=y
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_DWC_AHSATA=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_SST=y
 CONFIG_PHYLIB=y
index 65d75910b6f4936ccd2f03371b67854c5155dfcb..bf12cbde80af87c915b6031ea670c87c473d6b8e 100644 (file)
@@ -32,6 +32,7 @@ CONFIG_CMD_EXT4_WRITE=y
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_DWC_AHSATA=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_SST=y
 CONFIG_PHYLIB=y
index 3084fef89c381d82bfc7edc661e31a7cde508cd7..1a69e496c8895a1f8744ed383ce70f04c6ecc084 100644 (file)
@@ -36,6 +36,7 @@ CONFIG_CMD_TIME=y
 CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_PARTITION_UUIDS is not set
 CONFIG_ENV_IS_IN_MMC=y
+CONFIG_DWC_AHSATA=y
 CONFIG_PHYLIB=y
 CONFIG_PHY_MICREL=y
 CONFIG_PHY_MICREL_KSZ90X1=y
index 425b53a0add19bc78897be7ce634fc1ca2c5cdb2..5e111cb3399f6f712049cc95bd13e2c531507040 100644 (file)
@@ -21,6 +21,7 @@ CONFIG_MTDPARTS_DEFAULT="mtdparts=orion_nand:0xe0000@0x0(uboot),0x20000@0xe0000(
 CONFIG_CMD_UBI=y
 CONFIG_ISO_PARTITION=y
 CONFIG_ENV_IS_IN_NAND=y
+CONFIG_MVSATA_IDE=y
 # CONFIG_MMC is not set
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
index 8801268212957c8854b51c5f650f5a51b9009389..db72e6f6a86eaaf202d0728c888f8ac6febadbc8 100644 (file)
@@ -17,6 +17,7 @@ CONFIG_FASTBOOT_BUF_ADDR=0x82000000
 # CONFIG_CMD_IMI is not set
 CONFIG_CMD_SPL=y
 CONFIG_CMD_SPL_NAND_OFS=0x240000
+CONFIG_CMD_SPL_WRITE_SIZE=0x20000
 # CONFIG_CMD_EEPROM is not set
 # CONFIG_CMD_FLASH is not set
 # CONFIG_CMD_FPGA is not set
index acf8962201f39eb9f9981a6670136294d758aa81..b3c6fa9cf11bc8805e05c65f0160b0315f42fe65 100644 (file)
@@ -33,6 +33,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_ISO_PARTITION=y
 CONFIG_ENV_IS_IN_MMC=y
+CONFIG_SCSI_AHCI=y
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
 CONFIG_CMD_TCA642X=y
index 9bc628f168ebe151555130a16f79f1a656e394bc..1a829b763f3af17f3c97389ba8cd6cd240747d0a 100644 (file)
@@ -24,6 +24,7 @@ CONFIG_MTDPARTS_DEFAULT="mtdparts=nand_mtd:0x100000@0x000000(uboot),0x400000@0x1
 CONFIG_CMD_UBI=y
 CONFIG_ISO_PARTITION=y
 CONFIG_ENV_IS_IN_NAND=y
+CONFIG_MVSATA_IDE=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
index c74f0cf56f435f59613e7e4bc6dda5a894780e52..7a95b5b54fcd7f5f799673ad848044d1a7d6b940 100644 (file)
@@ -24,6 +24,7 @@ CONFIG_MTDPARTS_DEFAULT="mtdparts=nand_mtd:0x100000@0x000000(uboot),0x400000@0x1
 CONFIG_CMD_UBI=y
 CONFIG_ISO_PARTITION=y
 CONFIG_ENV_IS_IN_NAND=y
+CONFIG_MVSATA_IDE=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
index 6792af84efb1b62c84e80061755cbc51c0d63ee9..757be16f5337aa26d933bebd57ccd7863e0cc3b3 100644 (file)
@@ -24,6 +24,7 @@ CONFIG_MTDPARTS_DEFAULT="mtdparts=nand_mtd:0x100000@0x000000(uboot),0x400000@0x1
 CONFIG_CMD_UBI=y
 CONFIG_ISO_PARTITION=y
 CONFIG_ENV_IS_IN_NAND=y
+CONFIG_MVSATA_IDE=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
index bc37f89f4898853dd9128c62df7cbed288a8c1c4..0c3258ff1bd4f4d723850ccb6e75a3d01e116f8c 100644 (file)
@@ -24,6 +24,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_DM=y
+CONFIG_DWC_AHSATA=y
 CONFIG_CMD_PCA953X=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_MACRONIX=y
index 518483c5d9855284a6fd81dc7d77287770c95df6..ac96221ebf04bcf1f3a236ede860cd50e347c504 100644 (file)
@@ -32,6 +32,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_DM=y
+CONFIG_DWC_AHSATA=y
 CONFIG_CMD_PCA953X=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_MACRONIX=y
index f353eea691a03f0ba3eed9323d8e00186e6c74dd..3cd4d4543328c076c101e72cd97849ff919cbb13 100644 (file)
@@ -8,6 +8,7 @@ CONFIG_DISTRO_DEFAULTS=y
 CONFIG_CMD_PCI=y
 CONFIG_CMD_USB=y
 CONFIG_OF_BOARD=y
+CONFIG_SCSI_AHCI=y
 CONFIG_AHCI_PCI=y
 CONFIG_BLK=y
 # CONFIG_MMC is not set
index 08eec8ecc6f9495353dc8e62b9445a543ae20e23..7efb4ebf117b07e3e62526ae3bc9ce7b0fee68f2 100644 (file)
@@ -15,7 +15,9 @@ CONFIG_CONSOLE_RECORD=y
 CONFIG_CONSOLE_RECORD_OUT_SIZE=0x1000
 CONFIG_SILENT_CONSOLE=y
 CONFIG_PRE_CONSOLE_BUFFER=y
-CONFIG_PRE_CON_BUF_ADDR=0
+CONFIG_PRE_CON_BUF_ADDR=0x100000
+CONFIG_LOG=y
+CONFIG_LOG_MAX_LEVEL=6
 CONFIG_CMD_CPU=y
 CONFIG_CMD_LICENSE=y
 CONFIG_CMD_BOOTZ=y
@@ -64,6 +66,7 @@ CONFIG_CMD_CBFS=y
 CONFIG_CMD_CRAMFS=y
 CONFIG_CMD_EXT4_WRITE=y
 CONFIG_CMD_MTDPARTS=y
+CONFIG_CMD_LOG=y
 CONFIG_MAC_PARTITION=y
 CONFIG_AMIGA_PARTITION=y
 CONFIG_OF_CONTROL=y
index 6145077ebf311312a9347f9e4c0eaaedc4f5d3ef..21704ec1ff7d89c433f72c7b20a9c7c40d3d3fa2 100644 (file)
@@ -25,6 +25,7 @@ CONFIG_MTDPARTS_DEFAULT="mtdparts=orion_nand:512K(uboot),512K(env),4M(kernel),-(
 CONFIG_CMD_UBI=y
 CONFIG_ISO_PARTITION=y
 CONFIG_ENV_IS_IN_NAND=y
+CONFIG_MVSATA_IDE=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
index 1152b69c72ea6b97179b229a60d0f3f9b6a5f419..5adcd9d98692a9b3cebbd07a8460a3a390be7c73 100644 (file)
@@ -35,6 +35,7 @@ CONFIG_CMD_FS_GENERIC=y
 CONFIG_EFI_PARTITION=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
+CONFIG_DWC_AHSATA=y
 CONFIG_PHYLIB=y
 CONFIG_PCI=y
 CONFIG_DM_THERMAL=y
index 863d6ce3d0bcc091cf540bb21e4402403d9a5de0..f602c839c314625f8329131fd0312d7a693d7b2e 100644 (file)
@@ -42,6 +42,7 @@ CONFIG_EFI_PARTITION=y
 # CONFIG_SPL_PARTITION_UUIDS is not set
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_OF_TRANSLATE=y
+CONFIG_SATA_MV=y
 CONFIG_FPGA_ALTERA=y
 CONFIG_DM_GPIO=y
 # CONFIG_MMC is not set
index b9b5cbc2c5c7c5236ce021b2d10b1e9067d15660..ffb26cdac3398b52db549b7c51f5a2c4779e95fc 100644 (file)
@@ -29,6 +29,7 @@ CONFIG_CMD_BTRFS=y
 # CONFIG_SPL_PARTITION_UUIDS is not set
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SPL_OF_TRANSLATE=y
+CONFIG_SCSI_AHCI=y
 CONFIG_MISC=y
 CONFIG_ATSHA204A=y
 CONFIG_MMC_SDHCI=y
index b92b181d4fb952e620c4a93235f8cc82d8f26412..52cfdb009c4afefca36bc3c6faf28dad68fac8f8 100644 (file)
@@ -30,6 +30,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
+CONFIG_DWC_AHSATA=y
 CONFIG_PHYLIB=y
 CONFIG_PHY_MICREL=y
 CONFIG_PHY_MICREL_KSZ90X1=y
index 4b6b9d9aaee7a5dc11144787bec158f28f9ebb12..3c277772c0836ff7264154b2826477533b9466be 100644 (file)
@@ -29,6 +29,7 @@ CONFIG_CMD_CACHE=y
 CONFIG_CMD_EXT4_WRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
+CONFIG_DWC_AHSATA=y
 CONFIG_PHYLIB=y
 CONFIG_DM_THERMAL=y
 CONFIG_USB=y
index ff865f1bdcd04ca7a42da5c016138f28ea1ac057..ee9528caec7151b30ae24343de6e09a42b02841d 100644 (file)
@@ -49,6 +49,7 @@ CONFIG_ENV_IS_IN_FAT=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_SCSI_AHCI=y
 CONFIG_SATA_CEVA=y
 CONFIG_DFU_RAM=y
 CONFIG_FPGA_XILINX=y
index bf27ca48db93db884f3f73de0d4884a991eec9eb..158dc7ed8c6724cb920cd71dab1f27209dfe6184 100644 (file)
@@ -42,6 +42,7 @@ CONFIG_ENV_IS_IN_FAT=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_SCSI_AHCI=y
 CONFIG_SATA_CEVA=y
 CONFIG_DFU_RAM=y
 CONFIG_FPGA_XILINX=y
index 80c5e4934844ea30612673dbbe5121b748cab1f3..01e956cbc9358bb6b28f11b2093b9dc2b8947e98 100644 (file)
@@ -42,6 +42,7 @@ CONFIG_ENV_IS_IN_FAT=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_SCSI_AHCI=y
 CONFIG_SATA_CEVA=y
 CONFIG_DFU_RAM=y
 CONFIG_FPGA_XILINX=y
index 232532c995970c4e5a7a482677c07e1a0875ea4b..ab2f0a830a0cd4bb95e5d94ec823e399bf3bca60 100644 (file)
@@ -42,6 +42,7 @@ CONFIG_ENV_IS_IN_FAT=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_SCSI_AHCI=y
 CONFIG_SATA_CEVA=y
 CONFIG_DFU_RAM=y
 CONFIG_FPGA_XILINX=y
diff --git a/doc/README.log b/doc/README.log
new file mode 100644 (file)
index 0000000..f653fe7
--- /dev/null
@@ -0,0 +1,214 @@
+Logging in U-Boot
+=================
+
+Introduction
+------------
+
+U-Boot's internal operation involves many different steps and actions. From
+setting up the board to displaying a start-up screen to loading an Operating
+System, there are many component parts each with many actions.
+
+Most of the time this internal detail is not useful. Displaying it on the
+console would delay booting (U-Boot's primary purpose) and confuse users.
+
+But for digging into what is happening in a particular area, or for debugging
+a problem it is often useful to see what U-Boot is doing in more detail than
+is visible from the basic console output.
+
+U-Boot's logging feature aims to satisfy this goal for both users and
+developers.
+
+
+Logging levels
+--------------
+
+There are a number logging levels available, in increasing order of verbosity:
+
+   LOGL_EMERG  - Printed before U-Boot halts
+   LOGL_ALERT  - Indicates action must be taken immediate or U-Boot will crash
+   LOGL_CRIT   - Indicates a critical error that will cause boot failure
+   LOGL_ERR    - Indicates an error that may cause boot failure
+   LOGL_WARNING        - Warning about an unexpected condition
+   LOGL_NOTE   - Important information about progress
+   LOGL_INFO   - Information about normal boot progress
+   LOGL_DEBUG  - Debug information (useful for debugging a driver or subsystem)
+   LOGL_DEBUG_CONTENT  - Debug message showing full message content
+   LOGL_DEBUG_IO       - Debug message showing hardware I/O access
+
+
+Logging category
+----------------
+
+Logging can come from a wide variety of places within U-Boot. Each log message
+has a category which is intended to allow messages to be filtered according to
+their source.
+
+The following main categories are defined:
+
+   LOGC_NONE   - Unknown category (e.g. a debug() statement)
+   UCLASS_...  - Related to a particular uclass (e.g. UCLASS_USB)
+   LOGC_ARCH   - Related to architecture-specific code
+   LOGC_BOARD  - Related to board-specific code
+   LOGC_CORE   - Related to core driver-model support
+   LOGC_DT     - Related to device tree control
+
+
+Enabling logging
+----------------
+
+The following options are used to enable logging at compile time:
+
+   CONFIG_LOG          - Enables the logging system
+   CONFIG_MAX_LOG_LEVEL - Max log level to build (anything higher is compiled
+                               out)
+   CONFIG_LOG_CONSOLE  - Enable writing log records to the console
+
+If CONFIG_LOG is not set, then no logging will be available.
+
+The above have SPL versions also, e.g. CONFIG_SPL_MAX_LOG_LEVEL.
+
+
+Using DEBUG
+-----------
+
+U-Boot has traditionally used a #define called DEBUG to enable debugging on a
+file-by-file basis. The debug() macro compiles to a printf() statement if
+DEBUG is enabled, and an empty statement if not.
+
+With logging enabled, debug() statements are interpreted as logging output
+with a level of LOGL_DEBUG and a category of LOGC_NONE.
+
+The logging facilities are intended to replace DEBUG, but if DEBUG is defined
+at the top of a file, then it takes precedence. This means that debug()
+statements will result in output to the console and this output will not be
+logged.
+
+
+Logging destinations
+--------------------
+
+If logging information goes nowhere then it serves no purpose. U-Boot provides
+several possible determinations for logging information, all of which can be
+enabled or disabled independently:
+
+   console - goes to stdout
+
+
+Filters
+-------
+
+Filters are attached to log drivers to control what those drivers emit. Only
+records that pass through the filter make it to the driver.
+
+Filters can be based on several criteria:
+
+   - maximum log level
+   - in a set of categories
+   - in a set of files
+
+If no filters are attached to a driver then a default filter is used, which
+limits output to records with a level less than CONFIG_LOG_MAX_LEVEL.
+
+
+Logging statements
+------------------
+
+The main logging function is:
+
+   log(category, level, format_string, ...)
+
+Also debug() and error() will generate log records  - these use LOG_CATEGORY
+as the category, so you should #define this right at the top of the source
+file to ensure the category is correct.
+
+
+Code size
+---------
+
+Code size impact depends largely on what is enabled. The following numbers are
+for snow, which is a Thumb-2 board:
+
+This series: adds bss +20.0 data +4.0 rodata +4.0 text +44.0
+CONFIG_LOG: bss -52.0 data +92.0 rodata -635.0 text +1048.0
+CONFIG_LOG_MAX_LEVEL=7: bss +188.0 data +4.0 rodata +49183.0 text +98124.0
+
+The last option turns every debug() statement into a logging call, which
+bloats the code hugely. The advantage is that it is then possible to enable
+all logging within U-Boot.
+
+
+To Do
+-----
+
+There are lots of useful additions that could be made. None of the below is
+implemented! If you do one, please add a test in test/py/tests/test_log.py
+
+Convenience functions to support setting the category:
+
+   log_arch(level, format_string, ...) - category LOGC_ARCH
+   log_board(level, format_string, ...) - category LOGC_BOARD
+   log_core(level, format_string, ...) - category LOGC_CORE
+   log_dt(level, format_string, ...) - category LOGC_DT
+
+Convenience functions to support a category defined for a single file, for
+example:
+
+   #define LOG_CATEGORY   UCLASS_USB
+
+all of these can use LOG_CATEGORY as the category, and a log level
+corresponding to the function name:
+
+   logc(level, format_string, ...)
+
+More logging destinations:
+
+   device - goes to a device (e.g. serial)
+   buffer - recorded in a memory buffer
+
+Convert debug() statements in the code to log() statements
+
+Support making printf() emit log statements a L_INFO level
+
+Convert error() statements in the code to log() statements
+
+Figure out what to do with BUG(), BUG_ON() and warn_non_spl()
+
+Figure out what to do with assert()
+
+Add a way to browse log records
+
+Add a way to record log records for browsing using an external tool
+
+Add commands to add and remove filters
+
+Add commands to add and remove log devices
+
+Allow sharing of printf format strings in log records to reduce storage size
+for large numbers of log records
+
+Add a command-line option to sandbox to set the default logging level
+
+Convert core driver model code to use logging
+
+Convert uclasses to use logging with the correct category
+
+Consider making log() calls emit an automatic newline, perhaps with a logn()
+   function to avoid that
+
+Passing log records through to linux (e.g. via device tree /chosen)
+
+Provide a command to access the number of log records generated, and the
+number dropped due to them being generated before the log system was ready.
+
+Add a printf() format string pragma so that log statements are checked properly
+
+Enhance the log console driver to show level / category / file / line
+information
+
+Add a command to add new log records and delete existing records.
+
+Provide additional log() functions - e.g. logc() to specify the category
+
+--
+Simon Glass <sjg@chromium.org>
+15-Sep-17
diff --git a/doc/device-tree-bindings/clock/snps,hsdk-cgu.txt b/doc/device-tree-bindings/clock/snps,hsdk-cgu.txt
new file mode 100644 (file)
index 0000000..82fe1dd
--- /dev/null
@@ -0,0 +1,35 @@
+* Synopsys HSDK clock generation unit
+
+The Synopsys HSDK clock controller generates and supplies clock to various
+controllers and peripherals within the SoC.
+
+Required Properties:
+
+- compatible: should be "snps,hsdk-cgu-clock"
+- reg: the pair of physical base address and length of clock generation unit
+  memory mapped region and creg arc core divider memory mapped region.
+- #clock-cells: should be 1.
+
+Each clock is assigned an identifier and client nodes can use this identifier
+to specify the clock which they consume. All available clocks are defined as
+preprocessor macros in the dt-bindings/clock/snps,hsdk-cgu.h headers and can be
+used in device tree sources.
+
+Example: Clock controller node:
+
+       cgu_clk: cgu-clk@f0000000 {
+               compatible = "snps,hsdk-cgu-clock";
+               reg = <0xf0000000 0x1000>, <0xf00014B8 0x4>;
+               #clock-cells = <1>;
+       };
+
+Example: UART controller node that consumes the clock generated by the clock
+controller:
+
+       uart0: serial0@f0005000 {
+               compatible = "snps,dw-apb-uart";
+               reg = <0xf0005000 0x1000>;
+               reg-shift = <2>;
+               reg-io-width = <4>;
+               clocks = <&cgu_clk CLK_SYS_UART_REF>;
+       };
index 6f727a1e8a2fe7d91f4af7d7ed4a9170a9369e01..88663a161d34e9c1824144c6aa0fdce51f07307b 100644 (file)
@@ -288,7 +288,8 @@ In this case the 'data' property is omitted. Instead you can use:
 
 The 'data-offset' property can be substituted with 'data-position', which
 defines an absolute position or address as the offset. This is helpful when
-booting U-Boot proper before performing relocation.
+booting U-Boot proper before performing relocation. Pass '-p [offset]' to
+mkimage to enable 'data-position'.
 
 Normal kernel FIT image has data embedded within FIT structure. U-Boot image
 for SPL boot has external data. Existence of 'data-offset' can be used to
index 803064aaf110a11c8da5e529084839e4f9b7b05b..990de72309a222b032798a641042651db467f5e8 100644 (file)
@@ -20,6 +20,17 @@ config SATA
 
          See also CMD_SATA which provides command-line support.
 
+config LIBATA
+       bool
+       help
+         Select this to build and link the libata helper functions.
+
+config SCSI_AHCI
+       bool "Enable SCSI interface to SATA devices"
+       select LIBATA
+       help
+         Enable this to allow interfacing SATA devices via the SCSI layer.
+
 menu "SATA/SCSI device support"
 
 config AHCI_PCI
@@ -47,4 +58,44 @@ config DWC_AHCI
          Enable this driver to support Sata devices through
          Synopsys DWC AHCI module.
 
+config DWC_AHSATA
+       bool "Enable DWC AHSATA driver support"
+       select LIBATA
+       help
+         Enable this driver to support the DWC AHSATA SATA controller found
+         in i.MX5 and i.MX6 SoCs.
+
+config FSL_SATA
+       bool "Enable Freescale SATA controller driver support"
+       select LIBATA
+       help
+         Enable this driver to support the SATA controller found in
+         some Freescale PowerPC SoCs.
+
+config MVSATA_IDE
+       bool "Enable Marvell SATA controller driver support via IDE interface"
+       help
+         Enable this driver to support the SATA controller found in
+         some Marvell SoCs, running in IDE compatibility mode using PIO.
+
+config SATA_MV
+       bool "Enable Marvell SATA controller driver support"
+       select LIBATA
+       help
+         Enable this driver to support the SATA controller found in
+         some Marvell SoCs.
+
+config SATA_SIL
+       bool "Enable Silicon Image SIL3131 / SIL3132 / SIL3124 SATA driver support"
+       select LIBATA
+       help
+         Enable this driver to support the SIL3131, SIL3132 and SIL3124
+         SATA controllers.
+
+config SATA_SIL3114
+       bool "Enable Silicon Image SIL3114 SATA driver support"
+       select LIBATA
+       help
+         Enable this driver to support the SIL3114 SATA controllers.
+
 endmenu
index 4e2de930256293237eb6634f0caa0e5b17910378..a94c804e7a403351b46cb422878c7268a838f6a6 100644 (file)
@@ -13,10 +13,8 @@ obj-$(CONFIG_DWC_AHSATA) += dwc_ahsata.o
 obj-$(CONFIG_FSL_SATA) += fsl_sata.o
 obj-$(CONFIG_LIBATA) += libata.o
 obj-$(CONFIG_MVSATA_IDE) += mvsata_ide.o
-obj-$(CONFIG_MX51_PATA) += mxc_ata.o
 obj-$(CONFIG_SATA) += sata.o
 obj-$(CONFIG_SATA_CEVA) += sata_ceva.o
-obj-$(CONFIG_SATA_DWC) += sata_dwc.o
 obj-$(CONFIG_SATA_MV) += sata_mv.o
 obj-$(CONFIG_SATA_SIL3114) += sata_sil3114.o
 obj-$(CONFIG_SATA_SIL) += sata_sil.o
diff --git a/drivers/ata/mxc_ata.c b/drivers/ata/mxc_ata.c
deleted file mode 100644 (file)
index 44bb406..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Freescale iMX51 ATA driver
- *
- * Copyright (C) 2010 Marek Vasut <marek.vasut@gmail.com>
- *
- * Based on code by:
- *     Mahesh Mahadevan <mahesh.mahadevan@freescale.com>
- *
- * Based on code from original FSL ATA driver, which is
- * part of eCos, the Embedded Configurable Operating System.
- * Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-#include <common.h>
-#include <command.h>
-#include <config.h>
-#include <asm/byteorder.h>
-#include <asm/io.h>
-#include <ide.h>
-
-#include <asm/arch/imx-regs.h>
-#include <asm/arch/clock.h>
-
-/* MXC ATA register offsets */
-struct mxc_ata_config_regs {
-       u8      time_off;       /* 0x00 */
-       u8      time_on;
-       u8      time_1;
-       u8      time_2w;
-       u8      time_2r;
-       u8      time_ax;
-       u8      time_pio_rdx;
-       u8      time_4;
-       u8      time_9;
-       u8      time_m;
-       u8      time_jn;
-       u8      time_d;
-       u8      time_k;
-       u8      time_ack;
-       u8      time_env;
-       u8      time_udma_rdx;
-       u8      time_zah;       /* 0x10 */
-       u8      time_mlix;
-       u8      time_dvh;
-       u8      time_dzfs;
-       u8      time_dvs;
-       u8      time_cvh;
-       u8      time_ss;
-       u8      time_cyc;
-       u32     fifo_data_32;   /* 0x18 */
-       u32     fifo_data_16;
-       u32     fifo_fill;
-       u32     ata_control;
-       u32     interrupt_pending;
-       u32     interrupt_enable;
-       u32     interrupt_clear;
-       u32     fifo_alarm;
-};
-
-struct mxc_data_hdd_regs {
-       u32     drive_data;     /* 0xa0 */
-       u32     drive_features;
-       u32     drive_sector_count;
-       u32     drive_sector_num;
-       u32     drive_cyl_low;
-       u32     drive_cyl_high;
-       u32     drive_dev_head;
-       u32     command;
-       u32     status;
-       u32     alt_status;
-};
-
-/* PIO timing table */
-#define        NR_PIO_SPECS    5
-static uint16_t pio_t1[NR_PIO_SPECS]   = { 70,  50,  30,  30,  25 };
-static uint16_t pio_t2_8[NR_PIO_SPECS] = { 290, 290, 290, 80,  70 };
-static uint16_t pio_t4[NR_PIO_SPECS]   = { 30,  20,  15,  10,  10 };
-static uint16_t pio_t9[NR_PIO_SPECS]   = { 20,  15,  10,  10,  10 };
-static uint16_t pio_tA[NR_PIO_SPECS]   = { 50,  50,  50,  50,  50 };
-
-#define        REG2OFF(reg)    ((((uint32_t)reg) & 0x3) * 8)
-static void set_ata_bus_timing(unsigned char mode)
-{
-       uint32_t T = 1000000000 / mxc_get_clock(MXC_IPG_CLK);
-
-       struct mxc_ata_config_regs *ata_regs;
-       ata_regs = (struct mxc_ata_config_regs *)CONFIG_SYS_ATA_BASE_ADDR;
-
-       if (mode >= NR_PIO_SPECS)
-               return;
-
-       /* Write TIME_OFF/ON/1/2W */
-       writeb(3, &ata_regs->time_off);
-       writeb(3, &ata_regs->time_on);
-       writeb((pio_t1[mode] + T) / T, &ata_regs->time_1);
-       writeb((pio_t2_8[mode] + T) / T, &ata_regs->time_2w);
-
-       /* Write TIME_2R/AX/RDX/4 */
-       writeb((pio_t2_8[mode] + T) / T, &ata_regs->time_2r);
-       writeb((pio_tA[mode] + T) / T + 2, &ata_regs->time_ax);
-       writeb(1, &ata_regs->time_pio_rdx);
-       writeb((pio_t4[mode] + T) / T, &ata_regs->time_4);
-
-       /* Write TIME_9 ; the rest of timing registers is irrelevant for PIO */
-       writeb((pio_t9[mode] + T) / T, &ata_regs->time_9);
-}
-
-int ide_preinit(void)
-{
-       struct mxc_ata_config_regs *ata_regs;
-       ata_regs = (struct mxc_ata_config_regs *)CONFIG_SYS_ATA_BASE_ADDR;
-
-       /* 46.3.3.4 @ FSL iMX51 manual */
-       /* FIFO normal op., drive reset */
-       writel(0x80, &ata_regs->ata_control);
-       /* FIFO normal op., drive not reset */
-       writel(0xc0, &ata_regs->ata_control);
-
-       /* Configure the PIO timing */
-       set_ata_bus_timing(CONFIG_MXC_ATA_PIO_MODE);
-
-       /* 46.3.3.4 @ FSL iMX51 manual */
-       /* Drive not reset, IORDY handshake */
-       writel(0x41, &ata_regs->ata_control);
-
-       return 0;
-}
diff --git a/drivers/ata/sata_dwc.c b/drivers/ata/sata_dwc.c
deleted file mode 100644 (file)
index 2f3b2dd..0000000
+++ /dev/null
@@ -1,2077 +0,0 @@
-/*
- * sata_dwc.c
- *
- * Synopsys DesignWare Cores (DWC) SATA host driver
- *
- * Author: Mark Miesfeld <mmiesfeld@amcc.com>
- *
- * Ported from 2.6.19.2 to 2.6.25/26 by Stefan Roese <sr@denx.de>
- * Copyright 2008 DENX Software Engineering
- *
- * Based on versions provided by AMCC and Synopsys which are:
- *          Copyright 2006 Applied Micro Circuits Corporation
- *          COPYRIGHT (C) 2005  SYNOPSYS, INC.  ALL RIGHTS RESERVED
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-/*
- * SATA support based on the chip canyonlands.
- *
- * 04-17-2009
- *             The local version of this driver for the canyonlands board
- *             does not use interrupts but polls the chip instead.
- */
-
-#include <common.h>
-#include <command.h>
-#include <pci.h>
-#include <asm/processor.h>
-#include <linux/dma-direction.h>
-#include <linux/errno.h>
-#include <asm/io.h>
-#include <malloc.h>
-#include <ata.h>
-#include <sata.h>
-#include <linux/ctype.h>
-
-#include "sata_dwc.h"
-
-#define DMA_NUM_CHANS                  1
-#define DMA_NUM_CHAN_REGS              8
-
-#define AHB_DMA_BRST_DFLT              16
-
-struct dmareg {
-       u32 low;
-       u32 high;
-};
-
-struct dma_chan_regs {
-       struct dmareg sar;
-       struct dmareg dar;
-       struct dmareg llp;
-       struct dmareg ctl;
-       struct dmareg sstat;
-       struct dmareg dstat;
-       struct dmareg sstatar;
-       struct dmareg dstatar;
-       struct dmareg cfg;
-       struct dmareg sgr;
-       struct dmareg dsr;
-};
-
-struct dma_interrupt_regs {
-       struct dmareg tfr;
-       struct dmareg block;
-       struct dmareg srctran;
-       struct dmareg dsttran;
-       struct dmareg error;
-};
-
-struct ahb_dma_regs {
-       struct dma_chan_regs    chan_regs[DMA_NUM_CHAN_REGS];
-       struct dma_interrupt_regs       interrupt_raw;
-       struct dma_interrupt_regs       interrupt_status;
-       struct dma_interrupt_regs       interrupt_mask;
-       struct dma_interrupt_regs       interrupt_clear;
-       struct dmareg                   statusInt;
-       struct dmareg                   rq_srcreg;
-       struct dmareg                   rq_dstreg;
-       struct dmareg                   rq_sgl_srcreg;
-       struct dmareg                   rq_sgl_dstreg;
-       struct dmareg                   rq_lst_srcreg;
-       struct dmareg                   rq_lst_dstreg;
-       struct dmareg                   dma_cfg;
-       struct dmareg                   dma_chan_en;
-       struct dmareg                   dma_id;
-       struct dmareg                   dma_test;
-       struct dmareg                   res1;
-       struct dmareg                   res2;
-       /* DMA Comp Params
-        * Param 6 = dma_param[0], Param 5 = dma_param[1],
-        * Param 4 = dma_param[2] ...
-        */
-       struct dmareg                   dma_params[6];
-};
-
-#define DMA_EN                 0x00000001
-#define DMA_DI                 0x00000000
-#define DMA_CHANNEL(ch)                (0x00000001 << (ch))
-#define DMA_ENABLE_CHAN(ch)    ((0x00000001 << (ch)) | \
-                               ((0x000000001 << (ch)) << 8))
-#define DMA_DISABLE_CHAN(ch)   (0x00000000 |   \
-                               ((0x000000001 << (ch)) << 8))
-
-#define SATA_DWC_MAX_PORTS     1
-#define SATA_DWC_SCR_OFFSET    0x24
-#define SATA_DWC_REG_OFFSET    0x64
-
-struct sata_dwc_regs {
-       u32 fptagr;
-       u32 fpbor;
-       u32 fptcr;
-       u32 dmacr;
-       u32 dbtsr;
-       u32 intpr;
-       u32 intmr;
-       u32 errmr;
-       u32 llcr;
-       u32 phycr;
-       u32 physr;
-       u32 rxbistpd;
-       u32 rxbistpd1;
-       u32 rxbistpd2;
-       u32 txbistpd;
-       u32 txbistpd1;
-       u32 txbistpd2;
-       u32 bistcr;
-       u32 bistfctr;
-       u32 bistsr;
-       u32 bistdecr;
-       u32 res[15];
-       u32 testr;
-       u32 versionr;
-       u32 idr;
-       u32 unimpl[192];
-       u32 dmadr[256];
-};
-
-#define SATA_DWC_TXFIFO_DEPTH          0x01FF
-#define SATA_DWC_RXFIFO_DEPTH          0x01FF
-
-#define SATA_DWC_DBTSR_MWR(size)       ((size / 4) & SATA_DWC_TXFIFO_DEPTH)
-#define SATA_DWC_DBTSR_MRD(size)       (((size / 4) &  \
-                                       SATA_DWC_RXFIFO_DEPTH) << 16)
-#define SATA_DWC_INTPR_DMAT            0x00000001
-#define SATA_DWC_INTPR_NEWFP           0x00000002
-#define SATA_DWC_INTPR_PMABRT          0x00000004
-#define SATA_DWC_INTPR_ERR             0x00000008
-#define SATA_DWC_INTPR_NEWBIST         0x00000010
-#define SATA_DWC_INTPR_IPF             0x10000000
-#define SATA_DWC_INTMR_DMATM           0x00000001
-#define SATA_DWC_INTMR_NEWFPM          0x00000002
-#define SATA_DWC_INTMR_PMABRTM         0x00000004
-#define SATA_DWC_INTMR_ERRM            0x00000008
-#define SATA_DWC_INTMR_NEWBISTM                0x00000010
-
-#define SATA_DWC_DMACR_TMOD_TXCHEN     0x00000004
-#define SATA_DWC_DMACR_TXRXCH_CLEAR    SATA_DWC_DMACR_TMOD_TXCHEN
-
-#define SATA_DWC_QCMD_MAX      32
-
-#define SATA_DWC_SERROR_ERR_BITS       0x0FFF0F03
-
-#define HSDEVP_FROM_AP(ap)     (struct sata_dwc_device_port*)  \
-                               (ap)->private_data
-
-struct sata_dwc_device {
-       struct device           *dev;
-       struct ata_probe_ent    *pe;
-       struct ata_host         *host;
-       u8                      *reg_base;
-       struct sata_dwc_regs    *sata_dwc_regs;
-       int                     irq_dma;
-};
-
-struct sata_dwc_device_port {
-       struct sata_dwc_device  *hsdev;
-       int                     cmd_issued[SATA_DWC_QCMD_MAX];
-       u32                     dma_chan[SATA_DWC_QCMD_MAX];
-       int                     dma_pending[SATA_DWC_QCMD_MAX];
-};
-
-enum {
-       SATA_DWC_CMD_ISSUED_NOT         = 0,
-       SATA_DWC_CMD_ISSUED_PEND        = 1,
-       SATA_DWC_CMD_ISSUED_EXEC        = 2,
-       SATA_DWC_CMD_ISSUED_NODATA      = 3,
-
-       SATA_DWC_DMA_PENDING_NONE       = 0,
-       SATA_DWC_DMA_PENDING_TX         = 1,
-       SATA_DWC_DMA_PENDING_RX         = 2,
-};
-
-#define msleep(a)      udelay(a * 1000)
-#define ssleep(a)      msleep(a * 1000)
-
-static int ata_probe_timeout = (ATA_TMOUT_INTERNAL / 100);
-
-enum sata_dev_state {
-       SATA_INIT = 0,
-       SATA_READY = 1,
-       SATA_NODEVICE = 2,
-       SATA_ERROR = 3,
-};
-enum sata_dev_state dev_state = SATA_INIT;
-
-static struct ahb_dma_regs             *sata_dma_regs = 0;
-static struct ata_host                 *phost;
-static struct ata_port                 ap;
-static struct ata_port                 *pap = &ap;
-static struct ata_device               ata_device;
-static struct sata_dwc_device_port     dwc_devp;
-
-static void    *scr_addr_sstatus;
-static u32     temp_n_block = 0;
-
-static unsigned ata_exec_internal(struct ata_device *dev,
-                       struct ata_taskfile *tf, const u8 *cdb,
-                       int dma_dir, unsigned int buflen,
-                       unsigned long timeout);
-static unsigned int ata_dev_set_feature(struct ata_device *dev,
-                       u8 enable,u8 feature);
-static unsigned int ata_dev_init_params(struct ata_device *dev,
-                       u16 heads, u16 sectors);
-static u8 ata_irq_on(struct ata_port *ap);
-static struct ata_queued_cmd *__ata_qc_from_tag(struct ata_port *ap,
-                       unsigned int tag);
-static int ata_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
-                       u8 status, int in_wq);
-static void ata_tf_to_host(struct ata_port *ap,
-                       const struct ata_taskfile *tf);
-static void ata_exec_command(struct ata_port *ap,
-                       const struct ata_taskfile *tf);
-static unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc);
-static u8 ata_check_altstatus(struct ata_port *ap);
-static u8 ata_check_status(struct ata_port *ap);
-static void ata_dev_select(struct ata_port *ap, unsigned int device,
-                       unsigned int wait, unsigned int can_sleep);
-static void ata_qc_issue(struct ata_queued_cmd *qc);
-static void ata_tf_load(struct ata_port *ap,
-                       const struct ata_taskfile *tf);
-static int ata_dev_read_sectors(unsigned char* pdata,
-                       unsigned long datalen, u32 block, u32 n_block);
-static int ata_dev_write_sectors(unsigned char* pdata,
-                       unsigned long datalen , u32 block, u32 n_block);
-static void ata_std_dev_select(struct ata_port *ap, unsigned int device);
-static void ata_qc_complete(struct ata_queued_cmd *qc);
-static void __ata_qc_complete(struct ata_queued_cmd *qc);
-static void fill_result_tf(struct ata_queued_cmd *qc);
-static void ata_tf_read(struct ata_port *ap, struct ata_taskfile *tf);
-static void ata_mmio_data_xfer(struct ata_device *dev,
-                       unsigned char *buf,
-                       unsigned int buflen,int do_write);
-static void ata_pio_task(struct ata_port *arg_ap);
-static void __ata_port_freeze(struct ata_port *ap);
-static int ata_port_freeze(struct ata_port *ap);
-static void ata_qc_free(struct ata_queued_cmd *qc);
-static void ata_pio_sectors(struct ata_queued_cmd *qc);
-static void ata_pio_sector(struct ata_queued_cmd *qc);
-static void ata_pio_queue_task(struct ata_port *ap,
-                       void *data,unsigned long delay);
-static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq);
-static int sata_dwc_softreset(struct ata_port *ap);
-static int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
-               unsigned int flags, u16 *id);
-static int check_sata_dev_state(void);
-
-static const struct ata_port_info sata_dwc_port_info[] = {
-       {
-               .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
-                               ATA_FLAG_MMIO | ATA_FLAG_PIO_POLLING |
-                               ATA_FLAG_SRST | ATA_FLAG_NCQ,
-               .pio_mask       = 0x1f,
-               .mwdma_mask     = 0x07,
-               .udma_mask      = 0x7f,
-       },
-};
-
-int init_sata(int dev)
-{
-       struct sata_dwc_device hsdev;
-       struct ata_host host;
-       struct ata_port_info pi = sata_dwc_port_info[0];
-       struct ata_link *link;
-       struct sata_dwc_device_port hsdevp = dwc_devp;
-       u8 *base = 0;
-       u8 *sata_dma_regs_addr = 0;
-       u8 status;
-       unsigned long base_addr = 0;
-       int chan = 0;
-       int rc;
-       int i;
-
-       phost = &host;
-
-       base = (u8*)SATA_BASE_ADDR;
-
-       hsdev.sata_dwc_regs = (void *__iomem)(base + SATA_DWC_REG_OFFSET);
-
-       host.n_ports = SATA_DWC_MAX_PORTS;
-
-       for (i = 0; i < SATA_DWC_MAX_PORTS; i++) {
-               ap.pflags |= ATA_PFLAG_INITIALIZING;
-               ap.flags = ATA_FLAG_DISABLED;
-               ap.print_id = -1;
-               ap.ctl = ATA_DEVCTL_OBS;
-               ap.host = &host;
-               ap.last_ctl = 0xFF;
-
-               link = &ap.link;
-               link->ap = &ap;
-               link->pmp = 0;
-               link->active_tag = ATA_TAG_POISON;
-               link->hw_sata_spd_limit = 0;
-
-               ap.port_no = i;
-               host.ports[i] = &ap;
-       }
-
-       ap.pio_mask = pi.pio_mask;
-       ap.mwdma_mask = pi.mwdma_mask;
-       ap.udma_mask = pi.udma_mask;
-       ap.flags |= pi.flags;
-       ap.link.flags |= pi.link_flags;
-
-       host.ports[0]->ioaddr.cmd_addr = base;
-       host.ports[0]->ioaddr.scr_addr = base + SATA_DWC_SCR_OFFSET;
-       scr_addr_sstatus = base + SATA_DWC_SCR_OFFSET;
-
-       base_addr = (unsigned long)base;
-
-       host.ports[0]->ioaddr.cmd_addr = (void *)base_addr + 0x00;
-       host.ports[0]->ioaddr.data_addr = (void *)base_addr + 0x00;
-
-       host.ports[0]->ioaddr.error_addr = (void *)base_addr + 0x04;
-       host.ports[0]->ioaddr.feature_addr = (void *)base_addr + 0x04;
-
-       host.ports[0]->ioaddr.nsect_addr = (void *)base_addr + 0x08;
-
-       host.ports[0]->ioaddr.lbal_addr = (void *)base_addr + 0x0c;
-       host.ports[0]->ioaddr.lbam_addr = (void *)base_addr + 0x10;
-       host.ports[0]->ioaddr.lbah_addr = (void *)base_addr + 0x14;
-
-       host.ports[0]->ioaddr.device_addr = (void *)base_addr + 0x18;
-       host.ports[0]->ioaddr.command_addr = (void *)base_addr + 0x1c;
-       host.ports[0]->ioaddr.status_addr = (void *)base_addr + 0x1c;
-
-       host.ports[0]->ioaddr.altstatus_addr = (void *)base_addr + 0x20;
-       host.ports[0]->ioaddr.ctl_addr = (void *)base_addr + 0x20;
-
-       sata_dma_regs_addr = (u8*)SATA_DMA_REG_ADDR;
-       sata_dma_regs = (void *__iomem)sata_dma_regs_addr;
-
-       status = ata_check_altstatus(&ap);
-
-       if (status == 0x7f) {
-               printf("Hard Disk not found.\n");
-               dev_state = SATA_NODEVICE;
-               rc = false;
-               return rc;
-       }
-
-       printf("Waiting for device...");
-       i = 0;
-       while (1) {
-               udelay(10000);
-
-               status = ata_check_altstatus(&ap);
-
-               if ((status & ATA_BUSY) == 0) {
-                       printf("\n");
-                       break;
-               }
-
-               i++;
-               if (i > (ATA_RESET_TIME * 100)) {
-                       printf("** TimeOUT **\n");
-
-                       dev_state = SATA_NODEVICE;
-                       rc = false;
-                       return rc;
-               }
-               if ((i >= 100) && ((i % 100) == 0))
-                       printf(".");
-       }
-
-       rc = sata_dwc_softreset(&ap);
-
-       if (rc) {
-               printf("sata_dwc : error. soft reset failed\n");
-               return rc;
-       }
-
-       for (chan = 0; chan < DMA_NUM_CHANS; chan++) {
-               out_le32(&(sata_dma_regs->interrupt_mask.error.low),
-                               DMA_DISABLE_CHAN(chan));
-
-               out_le32(&(sata_dma_regs->interrupt_mask.tfr.low),
-                               DMA_DISABLE_CHAN(chan));
-       }
-
-       out_le32(&(sata_dma_regs->dma_cfg.low), DMA_DI);
-
-       out_le32(&hsdev.sata_dwc_regs->intmr,
-               SATA_DWC_INTMR_ERRM |
-               SATA_DWC_INTMR_PMABRTM);
-
-       /* Unmask the error bits that should trigger
-        * an error interrupt by setting the error mask register.
-        */
-       out_le32(&hsdev.sata_dwc_regs->errmr, SATA_DWC_SERROR_ERR_BITS);
-
-       hsdev.host = ap.host;
-       memset(&hsdevp, 0, sizeof(hsdevp));
-       hsdevp.hsdev = &hsdev;
-
-       for (i = 0; i < SATA_DWC_QCMD_MAX; i++)
-               hsdevp.cmd_issued[i] = SATA_DWC_CMD_ISSUED_NOT;
-
-       out_le32((void __iomem *)scr_addr_sstatus + 4,
-               in_le32((void __iomem *)scr_addr_sstatus + 4));
-
-       rc = 0;
-       return rc;
-}
-
-int reset_sata(int dev)
-{
-       return 0;
-}
-
-static u8 ata_check_altstatus(struct ata_port *ap)
-{
-       u8 val = 0;
-       val = readb(ap->ioaddr.altstatus_addr);
-       return val;
-}
-
-static int sata_dwc_softreset(struct ata_port *ap)
-{
-       u8 nsect,lbal = 0;
-       u8 tmp = 0;
-       struct ata_ioports *ioaddr = &ap->ioaddr;
-
-       in_le32((void *)ap->ioaddr.scr_addr + (SCR_ERROR * 4));
-
-       writeb(0x55, ioaddr->nsect_addr);
-       writeb(0xaa, ioaddr->lbal_addr);
-       writeb(0xaa, ioaddr->nsect_addr);
-       writeb(0x55, ioaddr->lbal_addr);
-       writeb(0x55, ioaddr->nsect_addr);
-       writeb(0xaa, ioaddr->lbal_addr);
-
-       nsect = readb(ioaddr->nsect_addr);
-       lbal = readb(ioaddr->lbal_addr);
-
-       if ((nsect == 0x55) && (lbal == 0xaa)) {
-               printf("Device found\n");
-       } else {
-               printf("No device found\n");
-               dev_state = SATA_NODEVICE;
-               return false;
-       }
-
-       tmp = ATA_DEVICE_OBS;
-       writeb(tmp, ioaddr->device_addr);
-       writeb(ap->ctl, ioaddr->ctl_addr);
-
-       udelay(200);
-
-       writeb(ap->ctl | ATA_SRST, ioaddr->ctl_addr);
-
-       udelay(200);
-       writeb(ap->ctl, ioaddr->ctl_addr);
-
-       msleep(150);
-       ata_check_status(ap);
-
-       msleep(50);
-       ata_check_status(ap);
-
-       while (1) {
-               u8 status = ata_check_status(ap);
-
-               if (!(status & ATA_BUSY))
-                       break;
-
-               printf("Hard Disk status is BUSY.\n");
-               msleep(50);
-       }
-
-       tmp = ATA_DEVICE_OBS;
-       writeb(tmp, ioaddr->device_addr);
-
-       nsect = readb(ioaddr->nsect_addr);
-       lbal = readb(ioaddr->lbal_addr);
-
-       return 0;
-}
-
-static u8 ata_check_status(struct ata_port *ap)
-{
-       u8 val = 0;
-       val = readb(ap->ioaddr.status_addr);
-       return val;
-}
-
-static int ata_id_has_hipm(const u16 *id)
-{
-       u16 val = id[76];
-
-       if (val == 0 || val == 0xffff)
-               return -1;
-
-       return val & (1 << 9);
-}
-
-static int ata_id_has_dipm(const u16 *id)
-{
-       u16 val = id[78];
-
-       if (val == 0 || val == 0xffff)
-               return -1;
-
-       return val & (1 << 3);
-}
-
-int scan_sata(int dev)
-{
-       int i;
-       int rc;
-       u8 status;
-       const u16 *id;
-       struct ata_device *ata_dev = &ata_device;
-       unsigned long pio_mask, mwdma_mask;
-       char revbuf[7];
-       u16 iobuf[ATA_SECTOR_WORDS];
-
-       memset(iobuf, 0, sizeof(iobuf));
-
-       if (dev_state == SATA_NODEVICE)
-               return 1;
-
-       printf("Waiting for device...");
-       i = 0;
-       while (1) {
-               udelay(10000);
-
-               status = ata_check_altstatus(&ap);
-
-               if ((status & ATA_BUSY) == 0) {
-                       printf("\n");
-                       break;
-               }
-
-               i++;
-               if (i > (ATA_RESET_TIME * 100)) {
-                       printf("** TimeOUT **\n");
-
-                       dev_state = SATA_NODEVICE;
-                       return 1;
-               }
-               if ((i >= 100) && ((i % 100) == 0))
-                       printf(".");
-       }
-
-       udelay(1000);
-
-       rc = ata_dev_read_id(ata_dev, &ata_dev->class,
-                       ATA_READID_POSTRESET,ata_dev->id);
-       if (rc) {
-               printf("sata_dwc : error. failed sata scan\n");
-               return 1;
-       }
-
-       /* SATA drives indicate we have a bridge. We don't know which
-        * end of the link the bridge is which is a problem
-        */
-       if (ata_id_is_sata(ata_dev->id))
-               ap.cbl = ATA_CBL_SATA;
-
-       id = ata_dev->id;
-
-       ata_dev->flags &= ~ATA_DFLAG_CFG_MASK;
-       ata_dev->max_sectors = 0;
-       ata_dev->cdb_len = 0;
-       ata_dev->n_sectors = 0;
-       ata_dev->cylinders = 0;
-       ata_dev->heads = 0;
-       ata_dev->sectors = 0;
-
-       if (id[ATA_ID_FIELD_VALID] & (1 << 1)) {
-               pio_mask = id[ATA_ID_PIO_MODES] & 0x03;
-               pio_mask <<= 3;
-               pio_mask |= 0x7;
-       } else {
-               /* If word 64 isn't valid then Word 51 high byte holds
-                * the PIO timing number for the maximum. Turn it into
-                * a mask.
-                */
-               u8 mode = (id[ATA_ID_OLD_PIO_MODES] >> 8) & 0xFF;
-               if (mode < 5) {
-                       pio_mask = (2 << mode) - 1;
-               } else {
-                       pio_mask = 1;
-               }
-       }
-
-       mwdma_mask = id[ATA_ID_MWDMA_MODES] & 0x07;
-
-       if (ata_id_is_cfa(id)) {
-               int pio = id[163] & 0x7;
-               int dma = (id[163] >> 3) & 7;
-
-               if (pio)
-                       pio_mask |= (1 << 5);
-               if (pio > 1)
-                       pio_mask |= (1 << 6);
-               if (dma)
-                       mwdma_mask |= (1 << 3);
-               if (dma > 1)
-                       mwdma_mask |= (1 << 4);
-       }
-
-       if (ata_dev->class == ATA_DEV_ATA) {
-               if (ata_id_is_cfa(id)) {
-                       if (id[162] & 1)
-                               printf("supports DRM functions and may "
-                                       "not be fully accessable.\n");
-                       strcpy(revbuf, "CFA");
-               } else {
-                       if (ata_id_has_tpm(id))
-                               printf("supports DRM functions and may "
-                                               "not be fully accessable.\n");
-               }
-
-               ata_dev->n_sectors = ata_id_n_sectors((u16*)id);
-
-               if (ata_dev->id[59] & 0x100)
-                       ata_dev->multi_count = ata_dev->id[59] & 0xff;
-
-               if (ata_id_has_lba(id)) {
-                       char ncq_desc[20];
-
-                       ata_dev->flags |= ATA_DFLAG_LBA;
-                       if (ata_id_has_lba48(id)) {
-                               ata_dev->flags |= ATA_DFLAG_LBA48;
-
-                               if (ata_dev->n_sectors >= (1UL << 28) &&
-                                       ata_id_has_flush_ext(id))
-                                       ata_dev->flags |= ATA_DFLAG_FLUSH_EXT;
-                       }
-                       if (!ata_id_has_ncq(ata_dev->id))
-                               ncq_desc[0] = '\0';
-
-                       if (ata_dev->horkage & ATA_HORKAGE_NONCQ)
-                               strcpy(ncq_desc, "NCQ (not used)");
-
-                       if (ap.flags & ATA_FLAG_NCQ)
-                               ata_dev->flags |= ATA_DFLAG_NCQ;
-               }
-               ata_dev->cdb_len = 16;
-       }
-       ata_dev->max_sectors = ATA_MAX_SECTORS;
-       if (ata_dev->flags & ATA_DFLAG_LBA48)
-               ata_dev->max_sectors = ATA_MAX_SECTORS_LBA48;
-
-       if (!(ata_dev->horkage & ATA_HORKAGE_IPM)) {
-               if (ata_id_has_hipm(ata_dev->id))
-                       ata_dev->flags |= ATA_DFLAG_HIPM;
-               if (ata_id_has_dipm(ata_dev->id))
-                       ata_dev->flags |= ATA_DFLAG_DIPM;
-       }
-
-       if ((ap.cbl == ATA_CBL_SATA) && (!ata_id_is_sata(ata_dev->id))) {
-               ata_dev->udma_mask &= ATA_UDMA5;
-               ata_dev->max_sectors = ATA_MAX_SECTORS;
-       }
-
-       if (ata_dev->horkage & ATA_HORKAGE_DIAGNOSTIC) {
-               printf("Drive reports diagnostics failure."
-                               "This may indicate a drive\n");
-               printf("fault or invalid emulation."
-                               "Contact drive vendor for information.\n");
-       }
-
-       rc = check_sata_dev_state();
-
-       ata_id_c_string(ata_dev->id,
-                       (unsigned char *)sata_dev_desc[dev].revision,
-                        ATA_ID_FW_REV, sizeof(sata_dev_desc[dev].revision));
-       ata_id_c_string(ata_dev->id,
-                       (unsigned char *)sata_dev_desc[dev].vendor,
-                        ATA_ID_PROD, sizeof(sata_dev_desc[dev].vendor));
-       ata_id_c_string(ata_dev->id,
-                       (unsigned char *)sata_dev_desc[dev].product,
-                        ATA_ID_SERNO, sizeof(sata_dev_desc[dev].product));
-
-       sata_dev_desc[dev].lba = (u32) ata_dev->n_sectors;
-
-#ifdef CONFIG_LBA48
-       if (ata_dev->id[83] & (1 << 10)) {
-               sata_dev_desc[dev].lba48 = 1;
-       } else {
-               sata_dev_desc[dev].lba48 = 0;
-       }
-#endif
-
-       return 0;
-}
-
-static u8 ata_busy_wait(struct ata_port *ap,
-               unsigned int bits,unsigned int max)
-{
-       u8 status;
-
-       do {
-               udelay(10);
-               status = ata_check_status(ap);
-               max--;
-       } while (status != 0xff && (status & bits) && (max > 0));
-
-       return status;
-}
-
-static int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
-               unsigned int flags, u16 *id)
-{
-       struct ata_port *ap = pap;
-       unsigned int class = *p_class;
-       struct ata_taskfile tf;
-       unsigned int err_mask = 0;
-       const char *reason;
-       int may_fallback = 1, tried_spinup = 0;
-       u8 status;
-       int rc;
-
-       status = ata_busy_wait(ap, ATA_BUSY, 30000);
-       if (status & ATA_BUSY) {
-               printf("BSY = 0 check. timeout.\n");
-               rc = false;
-               return rc;
-       }
-
-       ata_dev_select(ap, dev->devno, 1, 1);
-
-retry:
-       memset(&tf, 0, sizeof(tf));
-       ap->print_id = 1;
-       ap->flags &= ~ATA_FLAG_DISABLED;
-       tf.ctl = ap->ctl;
-       tf.device = ATA_DEVICE_OBS;
-       tf.command = ATA_CMD_ID_ATA;
-       tf.protocol = ATA_PROT_PIO;
-
-       /* Some devices choke if TF registers contain garbage.  Make
-        * sure those are properly initialized.
-        */
-       tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
-
-       /* Device presence detection is unreliable on some
-        * controllers.  Always poll IDENTIFY if available.
-        */
-       tf.flags |= ATA_TFLAG_POLLING;
-
-       temp_n_block = 1;
-
-       err_mask = ata_exec_internal(dev, &tf, NULL, DMA_FROM_DEVICE,
-                                       sizeof(id[0]) * ATA_ID_WORDS, 0);
-
-       if (err_mask) {
-               if (err_mask & AC_ERR_NODEV_HINT) {
-                       printf("NODEV after polling detection\n");
-                       return -ENOENT;
-               }
-
-               if ((err_mask == AC_ERR_DEV) && (tf.feature & ATA_ABORTED)) {
-                       /* Device or controller might have reported
-                        * the wrong device class.  Give a shot at the
-                        * other IDENTIFY if the current one is
-                        * aborted by the device.
-                        */
-                       if (may_fallback) {
-                               may_fallback = 0;
-
-                               if (class == ATA_DEV_ATA) {
-                                       class = ATA_DEV_ATAPI;
-                               } else {
-                                       class = ATA_DEV_ATA;
-                               }
-                               goto retry;
-                       }
-                       /* Control reaches here iff the device aborted
-                        * both flavors of IDENTIFYs which happens
-                        * sometimes with phantom devices.
-                        */
-                       printf("both IDENTIFYs aborted, assuming NODEV\n");
-                       return -ENOENT;
-               }
-               rc = -EIO;
-               reason = "I/O error";
-               goto err_out;
-       }
-
-       /* Falling back doesn't make sense if ID data was read
-        * successfully at least once.
-        */
-       may_fallback = 0;
-
-       unsigned int id_cnt;
-
-       for (id_cnt = 0; id_cnt < ATA_ID_WORDS; id_cnt++)
-               id[id_cnt] = le16_to_cpu(id[id_cnt]);
-
-
-       rc = -EINVAL;
-       reason = "device reports invalid type";
-
-       if (class == ATA_DEV_ATA) {
-               if (!ata_id_is_ata(id) && !ata_id_is_cfa(id))
-                       goto err_out;
-       } else {
-               if (ata_id_is_ata(id))
-                       goto err_out;
-       }
-       if (!tried_spinup && (id[2] == 0x37c8 || id[2] == 0x738c)) {
-               tried_spinup = 1;
-               /*
-                * Drive powered-up in standby mode, and requires a specific
-                * SET_FEATURES spin-up subcommand before it will accept
-                * anything other than the original IDENTIFY command.
-                */
-               err_mask = ata_dev_set_feature(dev, SETFEATURES_SPINUP, 0);
-               if (err_mask && id[2] != 0x738c) {
-                       rc = -EIO;
-                       reason = "SPINUP failed";
-                       goto err_out;
-               }
-               /*
-                * If the drive initially returned incomplete IDENTIFY info,
-                * we now must reissue the IDENTIFY command.
-                */
-               if (id[2] == 0x37c8)
-                       goto retry;
-       }
-
-       if ((flags & ATA_READID_POSTRESET) && class == ATA_DEV_ATA) {
-               /*
-                * The exact sequence expected by certain pre-ATA4 drives is:
-                * SRST RESET
-                * IDENTIFY (optional in early ATA)
-                * INITIALIZE DEVICE PARAMETERS (later IDE and ATA)
-                * anything else..
-                * Some drives were very specific about that exact sequence.
-                *
-                * Note that ATA4 says lba is mandatory so the second check
-                * shoud never trigger.
-                */
-               if (ata_id_major_version(id) < 4 || !ata_id_has_lba(id)) {
-                       err_mask = ata_dev_init_params(dev, id[3], id[6]);
-                       if (err_mask) {
-                               rc = -EIO;
-                               reason = "INIT_DEV_PARAMS failed";
-                               goto err_out;
-                       }
-
-                       /* current CHS translation info (id[53-58]) might be
-                        * changed. reread the identify device info.
-                        */
-                       flags &= ~ATA_READID_POSTRESET;
-                       goto retry;
-               }
-       }
-
-       *p_class = class;
-       return 0;
-
-err_out:
-       printf("failed to READ ID (%s, err_mask=0x%x)\n", reason, err_mask);
-       return rc;
-}
-
-static u8 ata_wait_idle(struct ata_port *ap)
-{
-       u8 status = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);
-       return status;
-}
-
-static void ata_dev_select(struct ata_port *ap, unsigned int device,
-               unsigned int wait, unsigned int can_sleep)
-{
-       if (wait)
-               ata_wait_idle(ap);
-
-       ata_std_dev_select(ap, device);
-
-       if (wait)
-               ata_wait_idle(ap);
-}
-
-static void ata_std_dev_select(struct ata_port *ap, unsigned int device)
-{
-       u8 tmp;
-
-       if (device == 0) {
-               tmp = ATA_DEVICE_OBS;
-       } else {
-               tmp = ATA_DEVICE_OBS | ATA_DEV1;
-       }
-
-       writeb(tmp, ap->ioaddr.device_addr);
-
-       readb(ap->ioaddr.altstatus_addr);
-
-       udelay(1);
-}
-
-static int waiting_for_reg_state(volatile u8 *offset,
-                               int timeout_msec,
-                               u32 sign)
-{
-       int i;
-       u32 status;
-
-       for (i = 0; i < timeout_msec; i++) {
-               status = readl(offset);
-               if ((status & sign) != 0)
-                       break;
-               msleep(1);
-       }
-
-       return (i < timeout_msec) ? 0 : -1;
-}
-
-static void ata_qc_reinit(struct ata_queued_cmd *qc)
-{
-       qc->dma_dir = DMA_NONE;
-       qc->flags = 0;
-       qc->nbytes = qc->extrabytes = qc->curbytes = 0;
-       qc->n_elem = 0;
-       qc->err_mask = 0;
-       qc->sect_size = ATA_SECT_SIZE;
-       qc->nbytes = ATA_SECT_SIZE * temp_n_block;
-
-       memset(&qc->tf, 0, sizeof(qc->tf));
-       qc->tf.ctl = 0;
-       qc->tf.device = ATA_DEVICE_OBS;
-
-       qc->result_tf.command = ATA_DRDY;
-       qc->result_tf.feature = 0;
-}
-
-struct ata_queued_cmd *__ata_qc_from_tag(struct ata_port *ap,
-                                       unsigned int tag)
-{
-       if (tag < ATA_MAX_QUEUE)
-               return &ap->qcmd[tag];
-       return NULL;
-}
-
-static void __ata_port_freeze(struct ata_port *ap)
-{
-       printf("set port freeze.\n");
-       ap->pflags |= ATA_PFLAG_FROZEN;
-}
-
-static int ata_port_freeze(struct ata_port *ap)
-{
-       __ata_port_freeze(ap);
-       return 0;
-}
-
-unsigned ata_exec_internal(struct ata_device *dev,
-                       struct ata_taskfile *tf, const u8 *cdb,
-                       int dma_dir, unsigned int buflen,
-                       unsigned long timeout)
-{
-       struct ata_link *link = dev->link;
-       struct ata_port *ap = pap;
-       struct ata_queued_cmd *qc;
-       unsigned int tag, preempted_tag;
-       u32 preempted_sactive, preempted_qc_active;
-       int preempted_nr_active_links;
-       unsigned int err_mask;
-       int rc = 0;
-       u8 status;
-
-       status = ata_busy_wait(ap, ATA_BUSY, 300000);
-       if (status & ATA_BUSY) {
-               printf("BSY = 0 check. timeout.\n");
-               rc = false;
-               return rc;
-       }
-
-       if (ap->pflags & ATA_PFLAG_FROZEN)
-               return AC_ERR_SYSTEM;
-
-       tag = ATA_TAG_INTERNAL;
-
-       if (test_and_set_bit(tag, &ap->qc_allocated)) {
-               rc = false;
-               return rc;
-       }
-
-       qc = __ata_qc_from_tag(ap, tag);
-       qc->tag = tag;
-       qc->ap = ap;
-       qc->dev = dev;
-
-       ata_qc_reinit(qc);
-
-       preempted_tag = link->active_tag;
-       preempted_sactive = link->sactive;
-       preempted_qc_active = ap->qc_active;
-       preempted_nr_active_links = ap->nr_active_links;
-       link->active_tag = ATA_TAG_POISON;
-       link->sactive = 0;
-       ap->qc_active = 0;
-       ap->nr_active_links = 0;
-
-       qc->tf = *tf;
-       if (cdb)
-               memcpy(qc->cdb, cdb, ATAPI_CDB_LEN);
-       qc->flags |= ATA_QCFLAG_RESULT_TF;
-       qc->dma_dir = dma_dir;
-       qc->private_data = 0;
-
-       ata_qc_issue(qc);
-
-       if (!timeout)
-               timeout = ata_probe_timeout * 1000 / HZ;
-
-       status = ata_busy_wait(ap, ATA_BUSY, 30000);
-       if (status & ATA_BUSY) {
-               printf("BSY = 0 check. timeout.\n");
-               printf("altstatus = 0x%x.\n", status);
-               qc->err_mask |= AC_ERR_OTHER;
-               return qc->err_mask;
-       }
-
-       if (waiting_for_reg_state(ap->ioaddr.altstatus_addr, 1000, 0x8)) {
-               u8 status = 0;
-               u8 errorStatus = 0;
-
-               status = readb(ap->ioaddr.altstatus_addr);
-               if ((status & 0x01) != 0) {
-                       errorStatus = readb(ap->ioaddr.feature_addr);
-                       if (errorStatus == 0x04 &&
-                               qc->tf.command == ATA_CMD_PIO_READ_EXT){
-                               printf("Hard Disk doesn't support LBA48\n");
-                               dev_state = SATA_ERROR;
-                               qc->err_mask |= AC_ERR_OTHER;
-                               return qc->err_mask;
-                       }
-               }
-               qc->err_mask |= AC_ERR_OTHER;
-               return qc->err_mask;
-       }
-
-       status = ata_busy_wait(ap, ATA_BUSY, 10);
-       if (status & ATA_BUSY) {
-               printf("BSY = 0 check. timeout.\n");
-               qc->err_mask |= AC_ERR_OTHER;
-               return qc->err_mask;
-       }
-
-       ata_pio_task(ap);
-
-       if (!rc) {
-               if (qc->flags & ATA_QCFLAG_ACTIVE) {
-                       qc->err_mask |= AC_ERR_TIMEOUT;
-                       ata_port_freeze(ap);
-               }
-       }
-
-       if (qc->flags & ATA_QCFLAG_FAILED) {
-               if (qc->result_tf.command & (ATA_ERR | ATA_DF))
-                       qc->err_mask |= AC_ERR_DEV;
-
-               if (!qc->err_mask)
-                       qc->err_mask |= AC_ERR_OTHER;
-
-               if (qc->err_mask & ~AC_ERR_OTHER)
-                       qc->err_mask &= ~AC_ERR_OTHER;
-       }
-
-       *tf = qc->result_tf;
-       err_mask = qc->err_mask;
-       ata_qc_free(qc);
-       link->active_tag = preempted_tag;
-       link->sactive = preempted_sactive;
-       ap->qc_active = preempted_qc_active;
-       ap->nr_active_links = preempted_nr_active_links;
-
-       if (ap->flags & ATA_FLAG_DISABLED) {
-               err_mask |= AC_ERR_SYSTEM;
-               ap->flags &= ~ATA_FLAG_DISABLED;
-       }
-
-       return err_mask;
-}
-
-static void ata_qc_issue(struct ata_queued_cmd *qc)
-{
-       struct ata_port *ap = qc->ap;
-       struct ata_link *link = qc->dev->link;
-       u8 prot = qc->tf.protocol;
-
-       if (ata_is_ncq(prot)) {
-               if (!link->sactive)
-                       ap->nr_active_links++;
-               link->sactive |= 1 << qc->tag;
-       } else {
-               ap->nr_active_links++;
-               link->active_tag = qc->tag;
-       }
-
-       qc->flags |= ATA_QCFLAG_ACTIVE;
-       ap->qc_active |= 1 << qc->tag;
-
-       if (qc->dev->flags & ATA_DFLAG_SLEEPING) {
-               msleep(1);
-               return;
-       }
-
-       qc->err_mask |= ata_qc_issue_prot(qc);
-       if (qc->err_mask)
-               goto err;
-
-       return;
-err:
-       ata_qc_complete(qc);
-}
-
-static unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc)
-{
-       struct ata_port *ap = qc->ap;
-
-       if (ap->flags & ATA_FLAG_PIO_POLLING) {
-               switch (qc->tf.protocol) {
-               case ATA_PROT_PIO:
-               case ATA_PROT_NODATA:
-               case ATAPI_PROT_PIO:
-               case ATAPI_PROT_NODATA:
-                       qc->tf.flags |= ATA_TFLAG_POLLING;
-                       break;
-               default:
-                       break;
-               }
-       }
-
-       ata_dev_select(ap, qc->dev->devno, 1, 0);
-
-       switch (qc->tf.protocol) {
-       case ATA_PROT_PIO:
-               if (qc->tf.flags & ATA_TFLAG_POLLING)
-                       qc->tf.ctl |= ATA_NIEN;
-
-               ata_tf_to_host(ap, &qc->tf);
-
-               ap->hsm_task_state = HSM_ST;
-
-               if (qc->tf.flags & ATA_TFLAG_POLLING)
-                       ata_pio_queue_task(ap, qc, 0);
-
-               break;
-
-       default:
-               return AC_ERR_SYSTEM;
-       }
-
-       return 0;
-}
-
-static void ata_tf_to_host(struct ata_port *ap,
-                       const struct ata_taskfile *tf)
-{
-       ata_tf_load(ap, tf);
-       ata_exec_command(ap, tf);
-}
-
-static void ata_tf_load(struct ata_port *ap,
-                       const struct ata_taskfile *tf)
-{
-       struct ata_ioports *ioaddr = &ap->ioaddr;
-       unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR;
-
-       if (tf->ctl != ap->last_ctl) {
-               if (ioaddr->ctl_addr)
-                       writeb(tf->ctl, ioaddr->ctl_addr);
-               ap->last_ctl = tf->ctl;
-               ata_wait_idle(ap);
-       }
-
-       if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) {
-               writeb(tf->hob_feature, ioaddr->feature_addr);
-               writeb(tf->hob_nsect, ioaddr->nsect_addr);
-               writeb(tf->hob_lbal, ioaddr->lbal_addr);
-               writeb(tf->hob_lbam, ioaddr->lbam_addr);
-               writeb(tf->hob_lbah, ioaddr->lbah_addr);
-       }
-
-       if (is_addr) {
-               writeb(tf->feature, ioaddr->feature_addr);
-               writeb(tf->nsect, ioaddr->nsect_addr);
-               writeb(tf->lbal, ioaddr->lbal_addr);
-               writeb(tf->lbam, ioaddr->lbam_addr);
-               writeb(tf->lbah, ioaddr->lbah_addr);
-       }
-
-       if (tf->flags & ATA_TFLAG_DEVICE)
-               writeb(tf->device, ioaddr->device_addr);
-
-       ata_wait_idle(ap);
-}
-
-static void ata_exec_command(struct ata_port *ap,
-                       const struct ata_taskfile *tf)
-{
-       writeb(tf->command, ap->ioaddr.command_addr);
-
-       readb(ap->ioaddr.altstatus_addr);
-
-       udelay(1);
-}
-
-static void ata_pio_queue_task(struct ata_port *ap,
-                       void *data,unsigned long delay)
-{
-       ap->port_task_data = data;
-}
-
-static unsigned int ac_err_mask(u8 status)
-{
-       if (status & (ATA_BUSY | ATA_DRQ))
-               return AC_ERR_HSM;
-       if (status & (ATA_ERR | ATA_DF))
-               return AC_ERR_DEV;
-       return 0;
-}
-
-static unsigned int __ac_err_mask(u8 status)
-{
-       unsigned int mask = ac_err_mask(status);
-       if (mask == 0)
-               return AC_ERR_OTHER;
-       return mask;
-}
-
-static void ata_pio_task(struct ata_port *arg_ap)
-{
-       struct ata_port *ap = arg_ap;
-       struct ata_queued_cmd *qc = ap->port_task_data;
-       u8 status;
-       int poll_next;
-
-fsm_start:
-       /*
-        * This is purely heuristic.  This is a fast path.
-        * Sometimes when we enter, BSY will be cleared in
-        * a chk-status or two.  If not, the drive is probably seeking
-        * or something.  Snooze for a couple msecs, then
-        * chk-status again.  If still busy, queue delayed work.
-        */
-       status = ata_busy_wait(ap, ATA_BUSY, 5);
-       if (status & ATA_BUSY) {
-               msleep(2);
-               status = ata_busy_wait(ap, ATA_BUSY, 10);
-               if (status & ATA_BUSY) {
-                       ata_pio_queue_task(ap, qc, ATA_SHORT_PAUSE);
-                       return;
-               }
-       }
-
-       poll_next = ata_hsm_move(ap, qc, status, 1);
-
-       /* another command or interrupt handler
-        * may be running at this point.
-        */
-       if (poll_next)
-               goto fsm_start;
-}
-
-static int ata_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
-                       u8 status, int in_wq)
-{
-       int poll_next;
-
-fsm_start:
-       switch (ap->hsm_task_state) {
-       case HSM_ST_FIRST:
-               poll_next = (qc->tf.flags & ATA_TFLAG_POLLING);
-
-               if ((status & ATA_DRQ) == 0) {
-                       if (status & (ATA_ERR | ATA_DF)) {
-                               qc->err_mask |= AC_ERR_DEV;
-                       } else {
-                               qc->err_mask |= AC_ERR_HSM;
-                       }
-                       ap->hsm_task_state = HSM_ST_ERR;
-                       goto fsm_start;
-               }
-
-               /* Device should not ask for data transfer (DRQ=1)
-                * when it finds something wrong.
-                * We ignore DRQ here and stop the HSM by
-                * changing hsm_task_state to HSM_ST_ERR and
-                * let the EH abort the command or reset the device.
-                */
-               if (status & (ATA_ERR | ATA_DF)) {
-                       if (!(qc->dev->horkage & ATA_HORKAGE_STUCK_ERR)) {
-                               printf("DRQ=1 with device error, "
-                                       "dev_stat 0x%X\n", status);
-                               qc->err_mask |= AC_ERR_HSM;
-                               ap->hsm_task_state = HSM_ST_ERR;
-                               goto fsm_start;
-                       }
-               }
-
-               if (qc->tf.protocol == ATA_PROT_PIO) {
-                       /* PIO data out protocol.
-                        * send first data block.
-                        */
-                       /* ata_pio_sectors() might change the state
-                        * to HSM_ST_LAST. so, the state is changed here
-                        * before ata_pio_sectors().
-                        */
-                       ap->hsm_task_state = HSM_ST;
-                       ata_pio_sectors(qc);
-               } else {
-                       printf("protocol is not ATA_PROT_PIO \n");
-               }
-               break;
-
-       case HSM_ST:
-               if ((status & ATA_DRQ) == 0) {
-                       if (status & (ATA_ERR | ATA_DF)) {
-                               qc->err_mask |= AC_ERR_DEV;
-                       } else {
-                               /* HSM violation. Let EH handle this.
-                                * Phantom devices also trigger this
-                                * condition.  Mark hint.
-                                */
-                               qc->err_mask |= AC_ERR_HSM | AC_ERR_NODEV_HINT;
-                       }
-
-                       ap->hsm_task_state = HSM_ST_ERR;
-                       goto fsm_start;
-               }
-               /* For PIO reads, some devices may ask for
-                * data transfer (DRQ=1) alone with ERR=1.
-                * We respect DRQ here and transfer one
-                * block of junk data before changing the
-                * hsm_task_state to HSM_ST_ERR.
-                *
-                * For PIO writes, ERR=1 DRQ=1 doesn't make
-                * sense since the data block has been
-                * transferred to the device.
-                */
-               if (status & (ATA_ERR | ATA_DF)) {
-                       qc->err_mask |= AC_ERR_DEV;
-
-                       if (!(qc->tf.flags & ATA_TFLAG_WRITE)) {
-                               ata_pio_sectors(qc);
-                               status = ata_wait_idle(ap);
-                       }
-
-                       if (status & (ATA_BUSY | ATA_DRQ))
-                               qc->err_mask |= AC_ERR_HSM;
-
-                       /* ata_pio_sectors() might change the
-                        * state to HSM_ST_LAST. so, the state
-                        * is changed after ata_pio_sectors().
-                        */
-                       ap->hsm_task_state = HSM_ST_ERR;
-                       goto fsm_start;
-               }
-
-               ata_pio_sectors(qc);
-               if (ap->hsm_task_state == HSM_ST_LAST &&
-                       (!(qc->tf.flags & ATA_TFLAG_WRITE))) {
-                       status = ata_wait_idle(ap);
-                       goto fsm_start;
-               }
-
-               poll_next = 1;
-               break;
-
-       case HSM_ST_LAST:
-               if (!ata_ok(status)) {
-                       qc->err_mask |= __ac_err_mask(status);
-                       ap->hsm_task_state = HSM_ST_ERR;
-                       goto fsm_start;
-               }
-
-               ap->hsm_task_state = HSM_ST_IDLE;
-
-               ata_hsm_qc_complete(qc, in_wq);
-
-               poll_next = 0;
-               break;
-
-       case HSM_ST_ERR:
-               /* make sure qc->err_mask is available to
-                * know what's wrong and recover
-                */
-               ap->hsm_task_state = HSM_ST_IDLE;
-
-               ata_hsm_qc_complete(qc, in_wq);
-
-               poll_next = 0;
-               break;
-       default:
-               poll_next = 0;
-       }
-
-       return poll_next;
-}
-
-static void ata_pio_sectors(struct ata_queued_cmd *qc)
-{
-       struct ata_port *ap;
-       ap = pap;
-       qc->pdata = ap->pdata;
-
-       ata_pio_sector(qc);
-
-       readb(qc->ap->ioaddr.altstatus_addr);
-       udelay(1);
-}
-
-static void ata_pio_sector(struct ata_queued_cmd *qc)
-{
-       int do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
-       struct ata_port *ap = qc->ap;
-       unsigned int offset;
-       unsigned char *buf;
-       char temp_data_buf[512];
-
-       if (qc->curbytes == qc->nbytes - qc->sect_size)
-               ap->hsm_task_state = HSM_ST_LAST;
-
-       offset = qc->curbytes;
-
-       switch (qc->tf.command) {
-       case ATA_CMD_ID_ATA:
-               buf = (unsigned char *)&ata_device.id[0];
-               break;
-       case ATA_CMD_PIO_READ_EXT:
-       case ATA_CMD_PIO_READ:
-       case ATA_CMD_PIO_WRITE_EXT:
-       case ATA_CMD_PIO_WRITE:
-               buf = qc->pdata + offset;
-               break;
-       default:
-               buf = (unsigned char *)&temp_data_buf[0];
-       }
-
-       ata_mmio_data_xfer(qc->dev, buf, qc->sect_size, do_write);
-
-       qc->curbytes += qc->sect_size;
-
-}
-
-static void ata_mmio_data_xfer(struct ata_device *dev, unsigned char *buf,
-                               unsigned int buflen, int do_write)
-{
-       struct ata_port *ap = pap;
-       void __iomem *data_addr = ap->ioaddr.data_addr;
-       unsigned int words = buflen >> 1;
-       u16 *buf16 = (u16 *)buf;
-       unsigned int i = 0;
-
-       udelay(100);
-       if (do_write) {
-               for (i = 0; i < words; i++)
-                       writew(le16_to_cpu(buf16[i]), data_addr);
-       } else {
-               for (i = 0; i < words; i++)
-                       buf16[i] = cpu_to_le16(readw(data_addr));
-       }
-
-       if (buflen & 0x01) {
-               __le16 align_buf[1] = { 0 };
-               unsigned char *trailing_buf = buf + buflen - 1;
-
-               if (do_write) {
-                       memcpy(align_buf, trailing_buf, 1);
-                       writew(le16_to_cpu(align_buf[0]), data_addr);
-               } else {
-                       align_buf[0] = cpu_to_le16(readw(data_addr));
-                       memcpy(trailing_buf, align_buf, 1);
-               }
-       }
-}
-
-static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq)
-{
-       struct ata_port *ap = qc->ap;
-
-       if (in_wq) {
-               /* EH might have kicked in while host lock is
-                * released.
-                */
-               qc = &ap->qcmd[qc->tag];
-               if (qc) {
-                       if (!(qc->err_mask & AC_ERR_HSM)) {
-                               ata_irq_on(ap);
-                               ata_qc_complete(qc);
-                       } else {
-                               ata_port_freeze(ap);
-                       }
-               }
-       } else {
-               if (!(qc->err_mask & AC_ERR_HSM)) {
-                       ata_qc_complete(qc);
-               } else {
-                       ata_port_freeze(ap);
-               }
-       }
-}
-
-static u8 ata_irq_on(struct ata_port *ap)
-{
-       struct ata_ioports *ioaddr = &ap->ioaddr;
-       u8 tmp;
-
-       ap->ctl &= ~ATA_NIEN;
-       ap->last_ctl = ap->ctl;
-
-       if (ioaddr->ctl_addr)
-               writeb(ap->ctl, ioaddr->ctl_addr);
-
-       tmp = ata_wait_idle(ap);
-
-       return tmp;
-}
-
-static unsigned int ata_tag_internal(unsigned int tag)
-{
-       return tag == ATA_MAX_QUEUE - 1;
-}
-
-static void ata_qc_complete(struct ata_queued_cmd *qc)
-{
-       struct ata_device *dev = qc->dev;
-       if (qc->err_mask)
-               qc->flags |= ATA_QCFLAG_FAILED;
-
-       if (qc->flags & ATA_QCFLAG_FAILED) {
-               if (!ata_tag_internal(qc->tag)) {
-                       fill_result_tf(qc);
-                       return;
-               }
-       }
-       if (qc->flags & ATA_QCFLAG_RESULT_TF)
-               fill_result_tf(qc);
-
-       /* Some commands need post-processing after successful
-        * completion.
-        */
-       switch (qc->tf.command) {
-       case ATA_CMD_SET_FEATURES:
-               if (qc->tf.feature != SETFEATURES_WC_ON &&
-                               qc->tf.feature != SETFEATURES_WC_OFF)
-                       break;
-       case ATA_CMD_INIT_DEV_PARAMS:
-       case ATA_CMD_SET_MULTI:
-               break;
-
-       case ATA_CMD_SLEEP:
-               dev->flags |= ATA_DFLAG_SLEEPING;
-               break;
-       }
-
-       __ata_qc_complete(qc);
-}
-
-static void fill_result_tf(struct ata_queued_cmd *qc)
-{
-       struct ata_port *ap = qc->ap;
-
-       qc->result_tf.flags = qc->tf.flags;
-       ata_tf_read(ap, &qc->result_tf);
-}
-
-static void ata_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
-{
-       struct ata_ioports *ioaddr = &ap->ioaddr;
-
-       tf->command = ata_check_status(ap);
-       tf->feature = readb(ioaddr->error_addr);
-       tf->nsect = readb(ioaddr->nsect_addr);
-       tf->lbal = readb(ioaddr->lbal_addr);
-       tf->lbam = readb(ioaddr->lbam_addr);
-       tf->lbah = readb(ioaddr->lbah_addr);
-       tf->device = readb(ioaddr->device_addr);
-
-       if (tf->flags & ATA_TFLAG_LBA48) {
-               if (ioaddr->ctl_addr) {
-                       writeb(tf->ctl | ATA_HOB, ioaddr->ctl_addr);
-
-                       tf->hob_feature = readb(ioaddr->error_addr);
-                       tf->hob_nsect = readb(ioaddr->nsect_addr);
-                       tf->hob_lbal = readb(ioaddr->lbal_addr);
-                       tf->hob_lbam = readb(ioaddr->lbam_addr);
-                       tf->hob_lbah = readb(ioaddr->lbah_addr);
-
-                       writeb(tf->ctl, ioaddr->ctl_addr);
-                       ap->last_ctl = tf->ctl;
-               } else {
-                       printf("sata_dwc warnning register read.\n");
-               }
-       }
-}
-
-static void __ata_qc_complete(struct ata_queued_cmd *qc)
-{
-       struct ata_port *ap = qc->ap;
-       struct ata_link *link = qc->dev->link;
-
-       link->active_tag = ATA_TAG_POISON;
-       ap->nr_active_links--;
-
-       if (qc->flags & ATA_QCFLAG_CLEAR_EXCL && ap->excl_link == link)
-               ap->excl_link = NULL;
-
-       qc->flags &= ~ATA_QCFLAG_ACTIVE;
-       ap->qc_active &= ~(1 << qc->tag);
-}
-
-static void ata_qc_free(struct ata_queued_cmd *qc)
-{
-       struct ata_port *ap = qc->ap;
-       unsigned int tag;
-       qc->flags = 0;
-       tag = qc->tag;
-       if (tag < ATA_MAX_QUEUE) {
-               qc->tag = ATA_TAG_POISON;
-               clear_bit(tag, &ap->qc_allocated);
-       }
-}
-
-static int check_sata_dev_state(void)
-{
-       unsigned long datalen;
-       unsigned char *pdata;
-       int ret = 0;
-       int i = 0;
-       char temp_data_buf[512];
-
-       while (1) {
-               udelay(10000);
-
-               pdata = (unsigned char*)&temp_data_buf[0];
-               datalen = 512;
-
-               ret = ata_dev_read_sectors(pdata, datalen, 0, 1);
-
-               if (ret == true)
-                       break;
-
-               i++;
-               if (i > (ATA_RESET_TIME * 100)) {
-                       printf("** TimeOUT **\n");
-                       dev_state = SATA_NODEVICE;
-                       return false;
-               }
-
-               if ((i >= 100) && ((i % 100) == 0))
-                       printf(".");
-       }
-
-       dev_state = SATA_READY;
-
-       return true;
-}
-
-static unsigned int ata_dev_set_feature(struct ata_device *dev,
-                               u8 enable, u8 feature)
-{
-       struct ata_taskfile tf;
-       struct ata_port *ap;
-       ap = pap;
-       unsigned int err_mask;
-
-       memset(&tf, 0, sizeof(tf));
-       tf.ctl = ap->ctl;
-
-       tf.device = ATA_DEVICE_OBS;
-       tf.command = ATA_CMD_SET_FEATURES;
-       tf.feature = enable;
-       tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
-       tf.protocol = ATA_PROT_NODATA;
-       tf.nsect = feature;
-
-       err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, 0, 0);
-
-       return err_mask;
-}
-
-static unsigned int ata_dev_init_params(struct ata_device *dev,
-                               u16 heads, u16 sectors)
-{
-       struct ata_taskfile tf;
-       struct ata_port *ap;
-       ap = pap;
-       unsigned int err_mask;
-
-       if (sectors < 1 || sectors > 255 || heads < 1 || heads > 16)
-               return AC_ERR_INVALID;
-
-       memset(&tf, 0, sizeof(tf));
-       tf.ctl = ap->ctl;
-       tf.device = ATA_DEVICE_OBS;
-       tf.command = ATA_CMD_INIT_DEV_PARAMS;
-       tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
-       tf.protocol = ATA_PROT_NODATA;
-       tf.nsect = sectors;
-       tf.device |= (heads - 1) & 0x0f;
-
-       err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, 0, 0);
-
-       if (err_mask == AC_ERR_DEV && (tf.feature & ATA_ABORTED))
-               err_mask = 0;
-
-       return err_mask;
-}
-
-#if defined(CONFIG_SATA_DWC) && !defined(CONFIG_LBA48)
-#define SATA_MAX_READ_BLK 0xFF
-#else
-#define SATA_MAX_READ_BLK 0xFFFF
-#endif
-
-ulong sata_read(int device, ulong blknr, lbaint_t blkcnt, void *buffer)
-{
-       ulong start,blks, buf_addr;
-       unsigned short smallblks;
-       unsigned long datalen;
-       unsigned char *pdata;
-       device &= 0xff;
-
-       u32 block = 0;
-       u32 n_block = 0;
-
-       if (dev_state != SATA_READY)
-               return 0;
-
-       buf_addr = (unsigned long)buffer;
-       start = blknr;
-       blks = blkcnt;
-       do {
-               pdata = (unsigned char *)buf_addr;
-               if (blks > SATA_MAX_READ_BLK) {
-                       datalen = sata_dev_desc[device].blksz * SATA_MAX_READ_BLK;
-                       smallblks = SATA_MAX_READ_BLK;
-
-                       block = (u32)start;
-                       n_block = (u32)smallblks;
-
-                       start += SATA_MAX_READ_BLK;
-                       blks -= SATA_MAX_READ_BLK;
-               } else {
-                       datalen = sata_dev_desc[device].blksz * SATA_MAX_READ_BLK;
-                       datalen = sata_dev_desc[device].blksz * blks;
-                       smallblks = (unsigned short)blks;
-
-                       block = (u32)start;
-                       n_block = (u32)smallblks;
-
-                       start += blks;
-                       blks = 0;
-               }
-
-               if (ata_dev_read_sectors(pdata, datalen, block, n_block) != true) {
-                       printf("sata_dwc : Hard disk read error.\n");
-                       blkcnt -= blks;
-                       break;
-               }
-               buf_addr += datalen;
-       } while (blks != 0);
-
-       return (blkcnt);
-}
-
-static int ata_dev_read_sectors(unsigned char *pdata, unsigned long datalen,
-                                               u32 block, u32 n_block)
-{
-       struct ata_port *ap = pap;
-       struct ata_device *dev = &ata_device;
-       struct ata_taskfile tf;
-       unsigned int class = ATA_DEV_ATA;
-       unsigned int err_mask = 0;
-       const char *reason;
-       int may_fallback = 1;
-
-       if (dev_state == SATA_ERROR)
-               return false;
-
-       ata_dev_select(ap, dev->devno, 1, 1);
-
-retry:
-       memset(&tf, 0, sizeof(tf));
-       tf.ctl = ap->ctl;
-       ap->print_id = 1;
-       ap->flags &= ~ATA_FLAG_DISABLED;
-
-       ap->pdata = pdata;
-
-       tf.device = ATA_DEVICE_OBS;
-
-       temp_n_block = n_block;
-
-#ifdef CONFIG_LBA48
-       tf.command = ATA_CMD_PIO_READ_EXT;
-       tf.flags |= ATA_TFLAG_LBA | ATA_TFLAG_LBA48;
-
-       tf.hob_feature = 31;
-       tf.feature = 31;
-       tf.hob_nsect = (n_block >> 8) & 0xff;
-       tf.nsect = n_block & 0xff;
-
-       tf.hob_lbah = 0x0;
-       tf.hob_lbam = 0x0;
-       tf.hob_lbal = (block >> 24) & 0xff;
-       tf.lbah = (block >> 16) & 0xff;
-       tf.lbam = (block >> 8) & 0xff;
-       tf.lbal = block & 0xff;
-
-       tf.device = 1 << 6;
-       if (tf.flags & ATA_TFLAG_FUA)
-               tf.device |= 1 << 7;
-#else
-       tf.command = ATA_CMD_PIO_READ;
-       tf.flags |= ATA_TFLAG_LBA ;
-
-       tf.feature = 31;
-       tf.nsect = n_block & 0xff;
-
-       tf.lbah = (block >> 16) & 0xff;
-       tf.lbam = (block >> 8) & 0xff;
-       tf.lbal = block & 0xff;
-
-       tf.device = (block >> 24) & 0xf;
-
-       tf.device |= 1 << 6;
-       if (tf.flags & ATA_TFLAG_FUA)
-               tf.device |= 1 << 7;
-
-#endif
-
-       tf.protocol = ATA_PROT_PIO;
-
-       /* Some devices choke if TF registers contain garbage.  Make
-        * sure those are properly initialized.
-        */
-       tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
-       tf.flags |= ATA_TFLAG_POLLING;
-
-       err_mask = ata_exec_internal(dev, &tf, NULL, DMA_FROM_DEVICE, 0, 0);
-
-       if (err_mask) {
-               if (err_mask & AC_ERR_NODEV_HINT) {
-                       printf("READ_SECTORS NODEV after polling detection\n");
-                       return -ENOENT;
-               }
-
-               if ((err_mask == AC_ERR_DEV) && (tf.feature & ATA_ABORTED)) {
-                       /* Device or controller might have reported
-                        * the wrong device class.  Give a shot at the
-                        * other IDENTIFY if the current one is
-                        * aborted by the device.
-                        */
-                       if (may_fallback) {
-                               may_fallback = 0;
-
-                               if (class == ATA_DEV_ATA) {
-                                       class = ATA_DEV_ATAPI;
-                               } else {
-                                       class = ATA_DEV_ATA;
-                               }
-                               goto retry;
-                       }
-                       /* Control reaches here iff the device aborted
-                        * both flavors of IDENTIFYs which happens
-                        * sometimes with phantom devices.
-                        */
-                       printf("both IDENTIFYs aborted, assuming NODEV\n");
-                       return -ENOENT;
-               }
-
-               reason = "I/O error";
-               goto err_out;
-       }
-
-       return true;
-
-err_out:
-       printf("failed to READ SECTORS (%s, err_mask=0x%x)\n", reason, err_mask);
-       return false;
-}
-
-#if defined(CONFIG_SATA_DWC) && !defined(CONFIG_LBA48)
-#define SATA_MAX_WRITE_BLK 0xFF
-#else
-#define SATA_MAX_WRITE_BLK 0xFFFF
-#endif
-
-ulong sata_write(int device, ulong blknr, lbaint_t blkcnt, const void *buffer)
-{
-       ulong start,blks, buf_addr;
-       unsigned short smallblks;
-       unsigned long datalen;
-       unsigned char *pdata;
-       device &= 0xff;
-
-
-       u32 block = 0;
-       u32 n_block = 0;
-
-       if (dev_state != SATA_READY)
-               return 0;
-
-       buf_addr = (unsigned long)buffer;
-       start = blknr;
-       blks = blkcnt;
-       do {
-               pdata = (unsigned char *)buf_addr;
-               if (blks > SATA_MAX_WRITE_BLK) {
-                       datalen = sata_dev_desc[device].blksz * SATA_MAX_WRITE_BLK;
-                       smallblks = SATA_MAX_WRITE_BLK;
-
-                       block = (u32)start;
-                       n_block = (u32)smallblks;
-
-                       start += SATA_MAX_WRITE_BLK;
-                       blks -= SATA_MAX_WRITE_BLK;
-               } else {
-                       datalen = sata_dev_desc[device].blksz * blks;
-                       smallblks = (unsigned short)blks;
-
-                       block = (u32)start;
-                       n_block = (u32)smallblks;
-
-                       start += blks;
-                       blks = 0;
-               }
-
-               if (ata_dev_write_sectors(pdata, datalen, block, n_block) != true) {
-                       printf("sata_dwc : Hard disk read error.\n");
-                       blkcnt -= blks;
-                       break;
-               }
-               buf_addr += datalen;
-       } while (blks != 0);
-
-       return (blkcnt);
-}
-
-static int ata_dev_write_sectors(unsigned char* pdata, unsigned long datalen,
-                                               u32 block, u32 n_block)
-{
-       struct ata_port *ap = pap;
-       struct ata_device *dev = &ata_device;
-       struct ata_taskfile tf;
-       unsigned int class = ATA_DEV_ATA;
-       unsigned int err_mask = 0;
-       const char *reason;
-       int may_fallback = 1;
-
-       if (dev_state == SATA_ERROR)
-               return false;
-
-       ata_dev_select(ap, dev->devno, 1, 1);
-
-retry:
-       memset(&tf, 0, sizeof(tf));
-       tf.ctl = ap->ctl;
-       ap->print_id = 1;
-       ap->flags &= ~ATA_FLAG_DISABLED;
-
-       ap->pdata = pdata;
-
-       tf.device = ATA_DEVICE_OBS;
-
-       temp_n_block = n_block;
-
-
-#ifdef CONFIG_LBA48
-       tf.command = ATA_CMD_PIO_WRITE_EXT;
-       tf.flags |= ATA_TFLAG_LBA | ATA_TFLAG_LBA48 | ATA_TFLAG_WRITE;
-
-       tf.hob_feature = 31;
-       tf.feature = 31;
-       tf.hob_nsect = (n_block >> 8) & 0xff;
-       tf.nsect = n_block & 0xff;
-
-       tf.hob_lbah = 0x0;
-       tf.hob_lbam = 0x0;
-       tf.hob_lbal = (block >> 24) & 0xff;
-       tf.lbah = (block >> 16) & 0xff;
-       tf.lbam = (block >> 8) & 0xff;
-       tf.lbal = block & 0xff;
-
-       tf.device = 1 << 6;
-       if (tf.flags & ATA_TFLAG_FUA)
-               tf.device |= 1 << 7;
-#else
-       tf.command = ATA_CMD_PIO_WRITE;
-       tf.flags |= ATA_TFLAG_LBA | ATA_TFLAG_WRITE;
-
-       tf.feature = 31;
-       tf.nsect = n_block & 0xff;
-
-       tf.lbah = (block >> 16) & 0xff;
-       tf.lbam = (block >> 8) & 0xff;
-       tf.lbal = block & 0xff;
-
-       tf.device = (block >> 24) & 0xf;
-
-       tf.device |= 1 << 6;
-       if (tf.flags & ATA_TFLAG_FUA)
-               tf.device |= 1 << 7;
-
-#endif
-
-       tf.protocol = ATA_PROT_PIO;
-
-       /* Some devices choke if TF registers contain garbage.  Make
-        * sure those are properly initialized.
-        */
-       tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
-       tf.flags |= ATA_TFLAG_POLLING;
-
-       err_mask = ata_exec_internal(dev, &tf, NULL, DMA_FROM_DEVICE, 0, 0);
-
-       if (err_mask) {
-               if (err_mask & AC_ERR_NODEV_HINT) {
-                       printf("READ_SECTORS NODEV after polling detection\n");
-                       return -ENOENT;
-               }
-
-               if ((err_mask == AC_ERR_DEV) && (tf.feature & ATA_ABORTED)) {
-                       /* Device or controller might have reported
-                        * the wrong device class.  Give a shot at the
-                        * other IDENTIFY if the current one is
-                        * aborted by the device.
-                        */
-                       if (may_fallback) {
-                               may_fallback = 0;
-
-                               if (class == ATA_DEV_ATA) {
-                                       class = ATA_DEV_ATAPI;
-                               } else {
-                                       class = ATA_DEV_ATA;
-                               }
-                               goto retry;
-                       }
-                       /* Control reaches here iff the device aborted
-                        * both flavors of IDENTIFYs which happens
-                        * sometimes with phantom devices.
-                        */
-                       printf("both IDENTIFYs aborted, assuming NODEV\n");
-                       return -ENOENT;
-               }
-
-               reason = "I/O error";
-               goto err_out;
-       }
-
-       return true;
-
-err_out:
-       printf("failed to WRITE SECTORS (%s, err_mask=0x%x)\n", reason, err_mask);
-       return false;
-}
diff --git a/drivers/ata/sata_dwc.h b/drivers/ata/sata_dwc.h
deleted file mode 100644 (file)
index 17fb20c..0000000
+++ /dev/null
@@ -1,458 +0,0 @@
-/*
- * sata_dwc.h
- *
- * Synopsys DesignWare Cores (DWC) SATA host driver
- *
- * Author: Mark Miesfeld <mmiesfeld@amcc.com>
- *
- * Ported from 2.6.19.2 to 2.6.25/26 by Stefan Roese <sr@denx.de>
- * Copyright 2008 DENX Software Engineering
- *
- * Based on versions provided by AMCC and Synopsys which are:
- *          Copyright 2006 Applied Micro Circuits Corporation
- *          COPYRIGHT (C) 2005  SYNOPSYS, INC.  ALL RIGHTS RESERVED
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-/*
- * SATA support based on the chip canyonlands.
- *
- * 04-17-2009
- *             The local version of this driver for the canyonlands board
- *             does not use interrupts but polls the chip instead.
- */
-
-
-#ifndef _SATA_DWC_H_
-#define _SATA_DWC_H_
-
-#define __U_BOOT__
-
-#define HZ 100
-#define READ 0
-#define WRITE 1
-
-enum {
-       ATA_READID_POSTRESET    = (1 << 0),
-
-       ATA_DNXFER_PIO          = 0,
-       ATA_DNXFER_DMA          = 1,
-       ATA_DNXFER_40C          = 2,
-       ATA_DNXFER_FORCE_PIO    = 3,
-       ATA_DNXFER_FORCE_PIO0   = 4,
-
-       ATA_DNXFER_QUIET        = (1 << 31),
-};
-
-enum hsm_task_states {
-       HSM_ST_IDLE,
-       HSM_ST_FIRST,
-       HSM_ST,
-       HSM_ST_LAST,
-       HSM_ST_ERR,
-};
-
-#define        ATA_SHORT_PAUSE         ((HZ >> 6) + 1)
-
-struct ata_queued_cmd {
-       struct ata_port         *ap;
-       struct ata_device       *dev;
-
-       struct ata_taskfile     tf;
-       u8                      cdb[ATAPI_CDB_LEN];
-       unsigned long           flags;
-       unsigned int            tag;
-       unsigned int            n_elem;
-
-       int                     dma_dir;
-       unsigned int            sect_size;
-
-       unsigned int            nbytes;
-       unsigned int            extrabytes;
-       unsigned int            curbytes;
-
-       unsigned int            err_mask;
-       struct ata_taskfile     result_tf;
-
-       void                    *private_data;
-#ifndef __U_BOOT__
-       void                    *lldd_task;
-#endif
-       unsigned char           *pdata;
-};
-
-typedef void (*ata_qc_cb_t) (struct ata_queued_cmd *qc);
-
-#define ATA_TAG_POISON 0xfafbfcfdU
-
-enum {
-       LIBATA_MAX_PRD          = ATA_MAX_PRD / 2,
-       LIBATA_DUMB_MAX_PRD     = ATA_MAX_PRD / 4,
-       ATA_MAX_PORTS           = 8,
-       ATA_DEF_QUEUE           = 1,
-       ATA_MAX_QUEUE           = 32,
-       ATA_TAG_INTERNAL        = ATA_MAX_QUEUE - 1,
-       ATA_MAX_BUS             = 2,
-       ATA_DEF_BUSY_WAIT       = 10000,
-
-       ATAPI_MAX_DRAIN         = 16 << 10,
-
-       ATA_SHT_EMULATED        = 1,
-       ATA_SHT_CMD_PER_LUN     = 1,
-       ATA_SHT_THIS_ID         = -1,
-       ATA_SHT_USE_CLUSTERING  = 1,
-
-       ATA_DFLAG_LBA           = (1 << 0),
-       ATA_DFLAG_LBA48         = (1 << 1),
-       ATA_DFLAG_CDB_INTR      = (1 << 2),
-       ATA_DFLAG_NCQ           = (1 << 3),
-       ATA_DFLAG_FLUSH_EXT     = (1 << 4),
-       ATA_DFLAG_ACPI_PENDING  = (1 << 5),
-       ATA_DFLAG_ACPI_FAILED   = (1 << 6),
-       ATA_DFLAG_AN            = (1 << 7),
-       ATA_DFLAG_HIPM          = (1 << 8),
-       ATA_DFLAG_DIPM          = (1 << 9),
-       ATA_DFLAG_DMADIR        = (1 << 10),
-       ATA_DFLAG_CFG_MASK      = (1 << 12) - 1,
-
-       ATA_DFLAG_PIO           = (1 << 12),
-       ATA_DFLAG_NCQ_OFF       = (1 << 13),
-       ATA_DFLAG_SPUNDOWN      = (1 << 14),
-       ATA_DFLAG_SLEEPING      = (1 << 15),
-       ATA_DFLAG_DUBIOUS_XFER  = (1 << 16),
-       ATA_DFLAG_INIT_MASK     = (1 << 24) - 1,
-
-       ATA_DFLAG_DETACH        = (1 << 24),
-       ATA_DFLAG_DETACHED      = (1 << 25),
-
-       ATA_LFLAG_HRST_TO_RESUME        = (1 << 0),
-       ATA_LFLAG_SKIP_D2H_BSY          = (1 << 1),
-       ATA_LFLAG_NO_SRST               = (1 << 2),
-       ATA_LFLAG_ASSUME_ATA            = (1 << 3),
-       ATA_LFLAG_ASSUME_SEMB           = (1 << 4),
-       ATA_LFLAG_ASSUME_CLASS = ATA_LFLAG_ASSUME_ATA | ATA_LFLAG_ASSUME_SEMB,
-       ATA_LFLAG_NO_RETRY              = (1 << 5),
-       ATA_LFLAG_DISABLED              = (1 << 6),
-
-       ATA_FLAG_SLAVE_POSS     = (1 << 0),
-       ATA_FLAG_SATA           = (1 << 1),
-       ATA_FLAG_NO_LEGACY      = (1 << 2),
-       ATA_FLAG_MMIO           = (1 << 3),
-       ATA_FLAG_SRST           = (1 << 4),
-       ATA_FLAG_SATA_RESET     = (1 << 5),
-       ATA_FLAG_NO_ATAPI       = (1 << 6),
-       ATA_FLAG_PIO_DMA        = (1 << 7),
-       ATA_FLAG_PIO_LBA48      = (1 << 8),
-       ATA_FLAG_PIO_POLLING    = (1 << 9),
-       ATA_FLAG_NCQ            = (1 << 10),
-       ATA_FLAG_DEBUGMSG       = (1 << 13),
-       ATA_FLAG_IGN_SIMPLEX    = (1 << 15),
-       ATA_FLAG_NO_IORDY       = (1 << 16),
-       ATA_FLAG_ACPI_SATA      = (1 << 17),
-       ATA_FLAG_AN             = (1 << 18),
-       ATA_FLAG_PMP            = (1 << 19),
-       ATA_FLAG_IPM            = (1 << 20),
-
-       ATA_FLAG_DISABLED       = (1 << 23),
-
-       ATA_PFLAG_EH_PENDING            = (1 << 0),
-       ATA_PFLAG_EH_IN_PROGRESS        = (1 << 1),
-       ATA_PFLAG_FROZEN                = (1 << 2),
-       ATA_PFLAG_RECOVERED             = (1 << 3),
-       ATA_PFLAG_LOADING               = (1 << 4),
-       ATA_PFLAG_UNLOADING             = (1 << 5),
-       ATA_PFLAG_SCSI_HOTPLUG          = (1 << 6),
-       ATA_PFLAG_INITIALIZING          = (1 << 7),
-       ATA_PFLAG_RESETTING             = (1 << 8),
-       ATA_PFLAG_SUSPENDED             = (1 << 17),
-       ATA_PFLAG_PM_PENDING            = (1 << 18),
-
-       ATA_QCFLAG_ACTIVE       = (1 << 0),
-       ATA_QCFLAG_DMAMAP       = (1 << 1),
-       ATA_QCFLAG_IO           = (1 << 3),
-       ATA_QCFLAG_RESULT_TF    = (1 << 4),
-       ATA_QCFLAG_CLEAR_EXCL   = (1 << 5),
-       ATA_QCFLAG_QUIET        = (1 << 6),
-
-       ATA_QCFLAG_FAILED       = (1 << 16),
-       ATA_QCFLAG_SENSE_VALID  = (1 << 17),
-       ATA_QCFLAG_EH_SCHEDULED = (1 << 18),
-
-       ATA_HOST_SIMPLEX        = (1 << 0),
-       ATA_HOST_STARTED        = (1 << 1),
-
-       ATA_TMOUT_BOOT                  = 30 * 100,
-       ATA_TMOUT_BOOT_QUICK            = 7 * 100,
-       ATA_TMOUT_INTERNAL              = 30 * 100,
-       ATA_TMOUT_INTERNAL_QUICK        = 5 * 100,
-
-       /* FIXME: GoVault needs 2s but we can't afford that without
-        * parallel probing.  800ms is enough for iVDR disk
-        * HHD424020F7SV00.  Increase to 2secs when parallel probing
-        * is in place.
-        */
-       ATA_TMOUT_FF_WAIT       = 4 * 100 / 5,
-
-       BUS_UNKNOWN             = 0,
-       BUS_DMA                 = 1,
-       BUS_IDLE                = 2,
-       BUS_NOINTR              = 3,
-       BUS_NODATA              = 4,
-       BUS_TIMER               = 5,
-       BUS_PIO                 = 6,
-       BUS_EDD                 = 7,
-       BUS_IDENTIFY            = 8,
-       BUS_PACKET              = 9,
-
-       PORT_UNKNOWN            = 0,
-       PORT_ENABLED            = 1,
-       PORT_DISABLED           = 2,
-
-       /* encoding various smaller bitmaps into a single
-        * unsigned long bitmap
-        */
-       ATA_NR_PIO_MODES        = 7,
-       ATA_NR_MWDMA_MODES      = 5,
-       ATA_NR_UDMA_MODES       = 8,
-
-       ATA_SHIFT_PIO           = 0,
-       ATA_SHIFT_MWDMA         = ATA_SHIFT_PIO + ATA_NR_PIO_MODES,
-       ATA_SHIFT_UDMA          = ATA_SHIFT_MWDMA + ATA_NR_MWDMA_MODES,
-
-       ATA_DMA_PAD_SZ          = 4,
-
-       ATA_ERING_SIZE          = 32,
-
-       ATA_DEFER_LINK          = 1,
-       ATA_DEFER_PORT          = 2,
-
-       ATA_EH_DESC_LEN         = 80,
-
-       ATA_EH_REVALIDATE       = (1 << 0),
-       ATA_EH_SOFTRESET        = (1 << 1),
-       ATA_EH_HARDRESET        = (1 << 2),
-       ATA_EH_ENABLE_LINK      = (1 << 3),
-       ATA_EH_LPM              = (1 << 4),
-
-       ATA_EH_RESET_MASK       = ATA_EH_SOFTRESET | ATA_EH_HARDRESET,
-       ATA_EH_PERDEV_MASK      = ATA_EH_REVALIDATE,
-
-       ATA_EHI_HOTPLUGGED      = (1 << 0),
-       ATA_EHI_RESUME_LINK     = (1 << 1),
-       ATA_EHI_NO_AUTOPSY      = (1 << 2),
-       ATA_EHI_QUIET           = (1 << 3),
-
-       ATA_EHI_DID_SOFTRESET   = (1 << 16),
-       ATA_EHI_DID_HARDRESET   = (1 << 17),
-       ATA_EHI_PRINTINFO       = (1 << 18),
-       ATA_EHI_SETMODE         = (1 << 19),
-       ATA_EHI_POST_SETMODE    = (1 << 20),
-
-       ATA_EHI_DID_RESET = ATA_EHI_DID_SOFTRESET | ATA_EHI_DID_HARDRESET,
-       ATA_EHI_RESET_MODIFIER_MASK = ATA_EHI_RESUME_LINK,
-
-       ATA_EH_MAX_TRIES        = 5,
-
-       ATA_PROBE_MAX_TRIES     = 3,
-       ATA_EH_DEV_TRIES        = 3,
-       ATA_EH_PMP_TRIES        = 5,
-       ATA_EH_PMP_LINK_TRIES   = 3,
-
-       SATA_PMP_SCR_TIMEOUT    = 250,
-
-       /* Horkage types. May be set by libata or controller on drives
-       (some horkage may be drive/controller pair dependant */
-
-       ATA_HORKAGE_DIAGNOSTIC  = (1 << 0),
-       ATA_HORKAGE_NODMA       = (1 << 1),
-       ATA_HORKAGE_NONCQ       = (1 << 2),
-       ATA_HORKAGE_MAX_SEC_128 = (1 << 3),
-       ATA_HORKAGE_BROKEN_HPA  = (1 << 4),
-       ATA_HORKAGE_SKIP_PM     = (1 << 5),
-       ATA_HORKAGE_HPA_SIZE    = (1 << 6),
-       ATA_HORKAGE_IPM         = (1 << 7),
-       ATA_HORKAGE_IVB         = (1 << 8),
-       ATA_HORKAGE_STUCK_ERR   = (1 << 9),
-
-       ATA_DMA_MASK_ATA        = (1 << 0),
-       ATA_DMA_MASK_ATAPI      = (1 << 1),
-       ATA_DMA_MASK_CFA        = (1 << 2),
-
-       ATAPI_READ              = 0,
-       ATAPI_WRITE             = 1,
-       ATAPI_READ_CD           = 2,
-       ATAPI_PASS_THRU         = 3,
-       ATAPI_MISC              = 4,
-};
-
-enum ata_completion_errors {
-       AC_ERR_DEV              = (1 << 0),
-       AC_ERR_HSM              = (1 << 1),
-       AC_ERR_TIMEOUT          = (1 << 2),
-       AC_ERR_MEDIA            = (1 << 3),
-       AC_ERR_ATA_BUS          = (1 << 4),
-       AC_ERR_HOST_BUS         = (1 << 5),
-       AC_ERR_SYSTEM           = (1 << 6),
-       AC_ERR_INVALID          = (1 << 7),
-       AC_ERR_OTHER            = (1 << 8),
-       AC_ERR_NODEV_HINT       = (1 << 9),
-       AC_ERR_NCQ              = (1 << 10),
-};
-
-enum ata_xfer_mask {
-       ATA_MASK_PIO    = ((1LU << ATA_NR_PIO_MODES) - 1) << ATA_SHIFT_PIO,
-       ATA_MASK_MWDMA  = ((1LU << ATA_NR_MWDMA_MODES) - 1) << ATA_SHIFT_MWDMA,
-       ATA_MASK_UDMA   = ((1LU << ATA_NR_UDMA_MODES) - 1) << ATA_SHIFT_UDMA,
-};
-
-struct ata_port_info {
-#ifndef __U_BOOT__
-       struct scsi_host_template       *sht;
-#endif
-       unsigned long                   flags;
-       unsigned long                   link_flags;
-       unsigned long                   pio_mask;
-       unsigned long                   mwdma_mask;
-       unsigned long                   udma_mask;
-#ifndef __U_BOOT__
-       const struct ata_port_operations *port_ops;
-       void                            *private_data;
-#endif
-};
-
-struct ata_ioports {
-       void __iomem            *cmd_addr;
-       void __iomem            *data_addr;
-       void __iomem            *error_addr;
-       void __iomem            *feature_addr;
-       void __iomem            *nsect_addr;
-       void __iomem            *lbal_addr;
-       void __iomem            *lbam_addr;
-       void __iomem            *lbah_addr;
-       void __iomem            *device_addr;
-       void __iomem            *status_addr;
-       void __iomem            *command_addr;
-       void __iomem            *altstatus_addr;
-       void __iomem            *ctl_addr;
-#ifndef __U_BOOT__
-       void __iomem            *bmdma_addr;
-#endif
-       void __iomem            *scr_addr;
-};
-
-struct ata_host {
-#ifndef __U_BOOT__
-       void __iomem * const    *iomap;
-       void                    *private_data;
-       const struct ata_port_operations *ops;
-       unsigned long           flags;
-       struct ata_port         *simplex_claimed;
-#endif
-       unsigned int            n_ports;
-       struct ata_port         *ports[0];
-};
-
-#ifndef __U_BOOT__
-struct ata_port_stats {
-       unsigned long           unhandled_irq;
-       unsigned long           idle_irq;
-       unsigned long           rw_reqbuf;
-};
-#endif
-
-struct ata_device {
-       struct ata_link         *link;
-       unsigned int            devno;
-       unsigned long           flags;
-       unsigned int            horkage;
-#ifndef __U_BOOT__
-       struct scsi_device      *sdev;
-#ifdef CONFIG_ATA_ACPI
-       acpi_handle             acpi_handle;
-       union acpi_object       *gtf_cache;
-#endif
-#endif
-       u64                     n_sectors;
-       unsigned int            class;
-
-       union {
-               u16             id[ATA_ID_WORDS];
-               u32             gscr[SATA_PMP_GSCR_DWORDS];
-       };
-#ifndef __U_BOOT__
-       u8                      pio_mode;
-       u8                      dma_mode;
-       u8                      xfer_mode;
-       unsigned int            xfer_shift;
-#endif
-       unsigned int            multi_count;
-       unsigned int            max_sectors;
-       unsigned int            cdb_len;
-#ifndef __U_BOOT__
-       unsigned long           pio_mask;
-       unsigned long           mwdma_mask;
-#endif
-       unsigned long           udma_mask;
-       u16                     cylinders;
-       u16                     heads;
-       u16                     sectors;
-#ifndef __U_BOOT__
-       int                     spdn_cnt;
-#endif
-};
-
-struct ata_link {
-       struct ata_port         *ap;
-       int                     pmp;
-       unsigned int            active_tag;
-       u32                     sactive;
-       unsigned int            flags;
-       unsigned int            hw_sata_spd_limit;
-#ifndef __U_BOOT__
-       unsigned int            sata_spd_limit;
-       unsigned int            sata_spd;
-       struct ata_device       device[2];
-#endif
-};
-
-struct ata_port {
-       unsigned long           flags;
-       unsigned int            pflags;
-       unsigned int            print_id;
-       unsigned int            port_no;
-
-       struct ata_ioports      ioaddr;
-
-       u8                      ctl;
-       u8                      last_ctl;
-       unsigned int            pio_mask;
-       unsigned int            mwdma_mask;
-       unsigned int            udma_mask;
-       unsigned int            cbl;
-
-       struct ata_queued_cmd   qcmd[ATA_MAX_QUEUE];
-       unsigned long           qc_allocated;
-       unsigned int            qc_active;
-       int                     nr_active_links;
-
-       struct ata_link         link;
-#ifndef __U_BOOT__
-       int                     nr_pmp_links;
-       struct ata_link         *pmp_link;
-#endif
-       struct ata_link         *excl_link;
-       int                     nr_pmp_links;
-#ifndef __U_BOOT__
-       struct ata_port_stats   stats;
-       struct device           *dev;
-       u32                     msg_enable;
-#endif
-       struct ata_host         *host;
-       void                    *port_task_data;
-
-       unsigned int            hsm_task_state;
-       void                    *private_data;
-       unsigned char           *pdata;
-};
-
-#endif
index f6644ee6d16f881be63a6f9661f15a25152942e0..cdfa052c16a9717a97134ecd927b71a20a7ba177 100644 (file)
@@ -54,6 +54,12 @@ config CLK_STM32F
          This clock driver adds support for RCC clock management
          for STM32F4 and STM32F7 SoCs.
 
+config CLK_HSDK
+       bool "Enable cgu clock driver for HSDK"
+       depends on CLK
+       help
+         Enable this to support the cgu clocks on Synopsys ARC HSDK
+
 config CLK_ZYNQ
        bool "Enable clock driver support for Zynq"
        depends on CLK && ARCH_ZYNQ
index bcc8f82fb65db2c3e12df6331a2810876971b13d..876c2b816f193ca7e0aa5935bda67cb8f6017395 100644 (file)
@@ -20,6 +20,7 @@ obj-$(CONFIG_CLK_EXYNOS) += exynos/
 obj-$(CONFIG_CLK_AT91) += at91/
 obj-$(CONFIG_CLK_BCM6345) += clk_bcm6345.o
 obj-$(CONFIG_CLK_BOSTON) += clk_boston.o
+obj-$(CONFIG_CLK_HSDK) += clk-hsdk-cgu.o
 obj-$(CONFIG_ARCH_ASPEED) += aspeed/
 obj-$(CONFIG_CLK_STM32F) += clk_stm32f.o
 obj-$(CONFIG_STM32H7) += clk_stm32h7.o
diff --git a/drivers/clk/clk-hsdk-cgu.c b/drivers/clk/clk-hsdk-cgu.c
new file mode 100644 (file)
index 0000000..c80f90e
--- /dev/null
@@ -0,0 +1,564 @@
+/*
+ * Synopsys HSDK SDP CGU clock driver
+ *
+ * Copyright (C) 2017 Synopsys
+ * Author: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.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.
+ */
+
+#include <common.h>
+#include <clk-uclass.h>
+#include <div64.h>
+#include <dm.h>
+#include <linux/io.h>
+
+/*
+ * Synopsys ARC HSDK clock tree.
+ *
+ *   ------------------
+ *   | 33.33 MHz xtal |
+ *   ------------------
+ *            |
+ *            |   -----------
+ *            |-->| ARC PLL |
+ *            |   -----------
+ *            |        |
+ *            |        |-->|CGU_ARC_IDIV|----------->
+ *            |        |-->|CREG_CORE_IF_DIV|------->
+ *            |
+ *            |   --------------
+ *            |-->| SYSTEM PLL |
+ *            |   --------------
+ *            |        |
+ *            |        |-->|CGU_SYS_IDIV_APB|------->
+ *            |        |-->|CGU_SYS_IDIV_AXI|------->
+ *            |        |-->|CGU_SYS_IDIV_*|--------->
+ *            |        |-->|CGU_SYS_IDIV_EBI_REF|--->
+ *            |
+ *            |   --------------
+ *            |-->| TUNNEL PLL |
+ *            |   --------------
+ *            |        |
+ *            |        |-->|CGU_TUN_IDIV|----------->
+ *            |
+ *            |   ------------
+ *            |-->| HDMI PLL |
+ *            |   ------------
+ *            |        |
+ *            |        |-->|CGU_HDMI_IDIV_APB|------>
+ *            |
+ *            |   -----------
+ *            |-->| DDR PLL |
+ *                -----------
+ *                     |
+ *                     |---------------------------->
+ */
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define CGU_ARC_IDIV           0x080
+#define CGU_TUN_IDIV           0x380
+#define CGU_HDMI_IDIV_APB      0x480
+#define CGU_SYS_IDIV_APB       0x180
+#define CGU_SYS_IDIV_AXI       0x190
+#define CGU_SYS_IDIV_ETH       0x1A0
+#define CGU_SYS_IDIV_USB       0x1B0
+#define CGU_SYS_IDIV_SDIO      0x1C0
+#define CGU_SYS_IDIV_HDMI      0x1D0
+#define CGU_SYS_IDIV_GFX_CORE  0x1E0
+#define CGU_SYS_IDIV_GFX_DMA   0x1F0
+#define CGU_SYS_IDIV_GFX_CFG   0x200
+#define CGU_SYS_IDIV_DMAC_CORE 0x210
+#define CGU_SYS_IDIV_DMAC_CFG  0x220
+#define CGU_SYS_IDIV_SDIO_REF  0x230
+#define CGU_SYS_IDIV_SPI_REF   0x240
+#define CGU_SYS_IDIV_I2C_REF   0x250
+#define CGU_SYS_IDIV_UART_REF  0x260
+#define CGU_SYS_IDIV_EBI_REF   0x270
+
+#define CGU_IDIV_MASK          0xFF /* All idiv have 8 significant bits */
+
+#define CGU_ARC_PLL            0x0
+#define CGU_SYS_PLL            0x10
+#define CGU_DDR_PLL            0x20
+#define CGU_TUN_PLL            0x30
+#define CGU_HDMI_PLL           0x40
+
+#define CGU_PLL_CTRL           0x000 /* ARC PLL control register */
+#define CGU_PLL_STATUS         0x004 /* ARC PLL status register */
+#define CGU_PLL_FMEAS          0x008 /* ARC PLL frequency measurement register */
+#define CGU_PLL_MON            0x00C /* ARC PLL monitor register */
+
+#define CGU_PLL_CTRL_ODIV_SHIFT                2
+#define CGU_PLL_CTRL_IDIV_SHIFT                4
+#define CGU_PLL_CTRL_FBDIV_SHIFT       9
+#define CGU_PLL_CTRL_BAND_SHIFT                20
+
+#define CGU_PLL_CTRL_ODIV_MASK         GENMASK(3, CGU_PLL_CTRL_ODIV_SHIFT)
+#define CGU_PLL_CTRL_IDIV_MASK         GENMASK(8, CGU_PLL_CTRL_IDIV_SHIFT)
+#define CGU_PLL_CTRL_FBDIV_MASK                GENMASK(15, CGU_PLL_CTRL_FBDIV_SHIFT)
+
+#define CGU_PLL_CTRL_PD                        BIT(0)
+#define CGU_PLL_CTRL_BYPASS            BIT(1)
+
+#define CGU_PLL_STATUS_LOCK            BIT(0)
+#define CGU_PLL_STATUS_ERR             BIT(1)
+
+#define HSDK_PLL_MAX_LOCK_TIME         100 /* 100 us */
+
+#define CREG_CORE_IF_DIV               0x000 /* ARC CORE interface divider */
+#define CORE_IF_CLK_THRESHOLD_HZ       500000000
+#define CREG_CORE_IF_CLK_DIV_1         0x0
+#define CREG_CORE_IF_CLK_DIV_2         0x1
+
+#define PARENT_RATE                    33333333 /* fixed clock - xtal */
+#define CGU_MAX_CLOCKS                 24
+
+struct hsdk_pll_cfg {
+       u32 rate;
+       u32 idiv;
+       u32 fbdiv;
+       u32 odiv;
+       u32 band;
+};
+
+static const struct hsdk_pll_cfg asdt_pll_cfg[] = {
+       { 100000000,  0, 11, 3, 0 },
+       { 125000000,  0, 14, 3, 0 },
+       { 133000000,  0, 15, 3, 0 },
+       { 150000000,  0, 17, 3, 0 },
+       { 200000000,  1, 47, 3, 0 },
+       { 233000000,  1, 27, 2, 0 },
+       { 300000000,  1, 35, 2, 0 },
+       { 333000000,  1, 39, 2, 0 },
+       { 400000000,  1, 47, 2, 0 },
+       { 500000000,  0, 14, 1, 0 },
+       { 600000000,  0, 17, 1, 0 },
+       { 700000000,  0, 20, 1, 0 },
+       { 800000000,  0, 23, 1, 0 },
+       { 900000000,  1, 26, 0, 0 },
+       { 1000000000, 1, 29, 0, 0 },
+       { 1100000000, 1, 32, 0, 0 },
+       { 1200000000, 1, 35, 0, 0 },
+       { 1300000000, 1, 38, 0, 0 },
+       { 1400000000, 1, 41, 0, 0 },
+       { 1500000000, 1, 44, 0, 0 },
+       { 1600000000, 1, 47, 0, 0 },
+       {}
+};
+
+static const struct hsdk_pll_cfg hdmi_pll_cfg[] = {
+       { 297000000,  0, 21, 2, 0 },
+       { 540000000,  0, 19, 1, 0 },
+       { 594000000,  0, 21, 1, 0 },
+       {}
+};
+
+struct hsdk_cgu_clk {
+       /* CGU block register */
+       void __iomem *cgu_regs;
+       /* CREG block register */
+       void __iomem *creg_regs;
+
+       /* PLLs registers */
+       void __iomem *regs;
+       /* PLLs special registers */
+       void __iomem *spec_regs;
+       /* PLLs devdata */
+       const struct hsdk_pll_devdata *pll_devdata;
+
+       /* Dividers registers */
+       void __iomem *idiv_regs;
+};
+
+struct hsdk_pll_devdata {
+       const struct hsdk_pll_cfg *pll_cfg;
+       int (*update_rate)(struct hsdk_cgu_clk *clk, unsigned long rate,
+                          const struct hsdk_pll_cfg *cfg);
+};
+
+static int hsdk_pll_core_update_rate(struct hsdk_cgu_clk *, unsigned long,
+                                    const struct hsdk_pll_cfg *);
+static int hsdk_pll_comm_update_rate(struct hsdk_cgu_clk *, unsigned long,
+                                    const struct hsdk_pll_cfg *);
+
+static const struct hsdk_pll_devdata core_pll_dat = {
+       .pll_cfg = asdt_pll_cfg,
+       .update_rate = hsdk_pll_core_update_rate,
+};
+
+static const struct hsdk_pll_devdata sdt_pll_dat = {
+       .pll_cfg = asdt_pll_cfg,
+       .update_rate = hsdk_pll_comm_update_rate,
+};
+
+static const struct hsdk_pll_devdata hdmi_pll_dat = {
+       .pll_cfg = hdmi_pll_cfg,
+       .update_rate = hsdk_pll_comm_update_rate,
+};
+
+static ulong idiv_set(struct clk *, ulong);
+static ulong idiv_get(struct clk *);
+static int idiv_off(struct clk *);
+static ulong pll_set(struct clk *, ulong);
+static ulong pll_get(struct clk *);
+
+struct hsdk_cgu_clock_map {
+       u32 cgu_pll_oft;
+       u32 creg_div_oft;
+       u32 cgu_div_oft;
+       const struct hsdk_pll_devdata *pll_devdata;
+       ulong (*get_rate)(struct clk *clk);
+       ulong (*set_rate)(struct clk *clk, ulong rate);
+       int (*disable)(struct clk *clk);
+};
+
+static const struct hsdk_cgu_clock_map clock_map[] = {
+       { CGU_ARC_PLL, 0, 0, &core_pll_dat, pll_get, pll_set, NULL },
+       { CGU_ARC_PLL, 0, CGU_ARC_IDIV, &core_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_DDR_PLL, 0, 0, &sdt_pll_dat, pll_get, pll_set, NULL },
+       { CGU_SYS_PLL, 0, 0, &sdt_pll_dat, pll_get, pll_set, NULL },
+       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_APB, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_AXI, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_ETH, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_USB, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_SDIO, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_HDMI, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_GFX_CORE, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_GFX_DMA, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_GFX_CFG, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_DMAC_CORE, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_DMAC_CFG, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_SDIO_REF, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_SPI_REF, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_I2C_REF, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_UART_REF, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_EBI_REF, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_TUN_PLL, 0, 0, &sdt_pll_dat, pll_get, pll_set, NULL },
+       { CGU_TUN_PLL, 0, CGU_TUN_IDIV, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
+       { CGU_HDMI_PLL, 0, 0, &hdmi_pll_dat, pll_get, pll_set, NULL },
+       { CGU_HDMI_PLL, 0, CGU_HDMI_IDIV_APB, &hdmi_pll_dat, idiv_get, idiv_set, idiv_off }
+};
+
+static inline void hsdk_idiv_write(struct hsdk_cgu_clk *clk, u32 val)
+{
+       iowrite32(val, clk->idiv_regs);
+}
+
+static inline u32 hsdk_idiv_read(struct hsdk_cgu_clk *clk)
+{
+       return ioread32(clk->idiv_regs);
+}
+
+static inline void hsdk_pll_write(struct hsdk_cgu_clk *clk, u32 reg, u32 val)
+{
+       iowrite32(val, clk->regs + reg);
+}
+
+static inline u32 hsdk_pll_read(struct hsdk_cgu_clk *clk, u32 reg)
+{
+       return ioread32(clk->regs + reg);
+}
+
+static inline void hsdk_pll_spcwrite(struct hsdk_cgu_clk *clk, u32 reg, u32 val)
+{
+       iowrite32(val, clk->spec_regs + reg);
+}
+
+static inline u32 hsdk_pll_spcread(struct hsdk_cgu_clk *clk, u32 reg)
+{
+       return ioread32(clk->spec_regs + reg);
+}
+
+static inline void hsdk_pll_set_cfg(struct hsdk_cgu_clk *clk,
+                                   const struct hsdk_pll_cfg *cfg)
+{
+       u32 val = 0;
+
+       /* Powerdown and Bypass bits should be cleared */
+       val |= cfg->idiv << CGU_PLL_CTRL_IDIV_SHIFT;
+       val |= cfg->fbdiv << CGU_PLL_CTRL_FBDIV_SHIFT;
+       val |= cfg->odiv << CGU_PLL_CTRL_ODIV_SHIFT;
+       val |= cfg->band << CGU_PLL_CTRL_BAND_SHIFT;
+
+       pr_debug("write configurarion: %#x\n", val);
+
+       hsdk_pll_write(clk, CGU_PLL_CTRL, val);
+}
+
+static inline bool hsdk_pll_is_locked(struct hsdk_cgu_clk *clk)
+{
+       return !!(hsdk_pll_read(clk, CGU_PLL_STATUS) & CGU_PLL_STATUS_LOCK);
+}
+
+static inline bool hsdk_pll_is_err(struct hsdk_cgu_clk *clk)
+{
+       return !!(hsdk_pll_read(clk, CGU_PLL_STATUS) & CGU_PLL_STATUS_ERR);
+}
+
+static ulong pll_get(struct clk *sclk)
+{
+       u32 val;
+       u64 rate;
+       u32 idiv, fbdiv, odiv;
+       struct hsdk_cgu_clk *clk = dev_get_priv(sclk->dev);
+
+       val = hsdk_pll_read(clk, CGU_PLL_CTRL);
+
+       pr_debug("current configurarion: %#x\n", val);
+
+       /* Check if PLL is disabled */
+       if (val & CGU_PLL_CTRL_PD)
+               return 0;
+
+       /* Check if PLL is bypassed */
+       if (val & CGU_PLL_CTRL_BYPASS)
+               return PARENT_RATE;
+
+       /* input divider = reg.idiv + 1 */
+       idiv = 1 + ((val & CGU_PLL_CTRL_IDIV_MASK) >> CGU_PLL_CTRL_IDIV_SHIFT);
+       /* fb divider = 2*(reg.fbdiv + 1) */
+       fbdiv = 2 * (1 + ((val & CGU_PLL_CTRL_FBDIV_MASK) >> CGU_PLL_CTRL_FBDIV_SHIFT));
+       /* output divider = 2^(reg.odiv) */
+       odiv = 1 << ((val & CGU_PLL_CTRL_ODIV_MASK) >> CGU_PLL_CTRL_ODIV_SHIFT);
+
+       rate = (u64)PARENT_RATE * fbdiv;
+       do_div(rate, idiv * odiv);
+
+       return rate;
+}
+
+static unsigned long hsdk_pll_round_rate(struct clk *sclk, unsigned long rate)
+{
+       int i;
+       unsigned long best_rate;
+       struct hsdk_cgu_clk *clk = dev_get_priv(sclk->dev);
+       const struct hsdk_pll_cfg *pll_cfg = clk->pll_devdata->pll_cfg;
+
+       if (pll_cfg[0].rate == 0)
+               return -EINVAL;
+
+       best_rate = pll_cfg[0].rate;
+
+       for (i = 1; pll_cfg[i].rate != 0; i++) {
+               if (abs(rate - pll_cfg[i].rate) < abs(rate - best_rate))
+                       best_rate = pll_cfg[i].rate;
+       }
+
+       pr_debug("chosen best rate: %lu\n", best_rate);
+
+       return best_rate;
+}
+
+static int hsdk_pll_comm_update_rate(struct hsdk_cgu_clk *clk,
+                                    unsigned long rate,
+                                    const struct hsdk_pll_cfg *cfg)
+{
+       hsdk_pll_set_cfg(clk, cfg);
+
+       /*
+        * Wait until CGU relocks and check error status.
+        * If after timeout CGU is unlocked yet return error.
+        */
+       udelay(HSDK_PLL_MAX_LOCK_TIME);
+       if (!hsdk_pll_is_locked(clk))
+               return -ETIMEDOUT;
+
+       if (hsdk_pll_is_err(clk))
+               return -EINVAL;
+
+       return 0;
+}
+
+static int hsdk_pll_core_update_rate(struct hsdk_cgu_clk *clk,
+                                    unsigned long rate,
+                                    const struct hsdk_pll_cfg *cfg)
+{
+       /*
+        * When core clock exceeds 500MHz, the divider for the interface
+        * clock must be programmed to div-by-2.
+        */
+       if (rate > CORE_IF_CLK_THRESHOLD_HZ)
+               hsdk_pll_spcwrite(clk, CREG_CORE_IF_DIV, CREG_CORE_IF_CLK_DIV_2);
+
+       hsdk_pll_set_cfg(clk, cfg);
+
+       /*
+        * Wait until CGU relocks and check error status.
+        * If after timeout CGU is unlocked yet return error.
+        */
+       udelay(HSDK_PLL_MAX_LOCK_TIME);
+       if (!hsdk_pll_is_locked(clk))
+               return -ETIMEDOUT;
+
+       if (hsdk_pll_is_err(clk))
+               return -EINVAL;
+
+       /*
+        * Program divider to div-by-1 if we succesfuly set core clock below
+        * 500MHz threshold.
+        */
+       if (rate <= CORE_IF_CLK_THRESHOLD_HZ)
+               hsdk_pll_spcwrite(clk, CREG_CORE_IF_DIV, CREG_CORE_IF_CLK_DIV_1);
+
+       return 0;
+}
+
+static ulong pll_set(struct clk *sclk, ulong rate)
+{
+       int i;
+       unsigned long best_rate;
+       struct hsdk_cgu_clk *clk = dev_get_priv(sclk->dev);
+       const struct hsdk_pll_cfg *pll_cfg = clk->pll_devdata->pll_cfg;
+
+       best_rate = hsdk_pll_round_rate(sclk, rate);
+
+       for (i = 0; pll_cfg[i].rate != 0; i++) {
+               if (pll_cfg[i].rate == best_rate) {
+                       return clk->pll_devdata->update_rate(clk, best_rate,
+                                                            &pll_cfg[i]);
+               }
+       }
+
+       pr_err("invalid rate=%ld, parent_rate=%d\n", best_rate, PARENT_RATE);
+
+       return -EINVAL;
+}
+
+static int idiv_off(struct clk *sclk)
+{
+       struct hsdk_cgu_clk *clk = dev_get_priv(sclk->dev);
+
+       hsdk_idiv_write(clk, 0);
+
+       return 0;
+}
+
+static ulong idiv_get(struct clk *sclk)
+{
+       struct hsdk_cgu_clk *clk = dev_get_priv(sclk->dev);
+       ulong parent_rate = pll_get(sclk);
+       u32 div_factor = hsdk_idiv_read(clk);
+
+       div_factor &= CGU_IDIV_MASK;
+
+       pr_debug("current configurarion: %#x (%d)\n", div_factor, div_factor);
+
+       if (div_factor == 0)
+               return 0;
+
+       return parent_rate / div_factor;
+}
+
+static ulong idiv_set(struct clk *sclk, ulong rate)
+{
+       struct hsdk_cgu_clk *clk = dev_get_priv(sclk->dev);
+       ulong parent_rate = pll_get(sclk);
+       u32 div_factor;
+
+       div_factor = parent_rate / rate;
+       if (abs(rate - parent_rate / (div_factor + 1)) <=
+           abs(rate - parent_rate / div_factor)) {
+               div_factor += 1;
+       }
+
+       if (div_factor & ~CGU_IDIV_MASK) {
+               pr_err("invalid rate=%ld, parent_rate=%ld, div=%d: max divider valie is%d\n",
+                      rate, parent_rate, div_factor, CGU_IDIV_MASK);
+
+               div_factor = CGU_IDIV_MASK;
+       }
+
+       if (div_factor == 0) {
+               pr_err("invalid rate=%ld, parent_rate=%ld, div=%d: min divider valie is 1\n",
+                      rate, parent_rate, div_factor);
+
+               div_factor = 1;
+       }
+
+       hsdk_idiv_write(clk, div_factor);
+
+       return 0;
+}
+
+static int hsdk_prepare_clock_tree_branch(struct clk *sclk)
+{
+       struct hsdk_cgu_clk *clk = dev_get_priv(sclk->dev);
+
+       if (sclk->id >= CGU_MAX_CLOCKS)
+               return -EINVAL;
+
+       clk->pll_devdata = clock_map[sclk->id].pll_devdata;
+       clk->regs = clk->cgu_regs + clock_map[sclk->id].cgu_pll_oft;
+       clk->spec_regs = clk->creg_regs + clock_map[sclk->id].creg_div_oft;
+       clk->idiv_regs = clk->cgu_regs + clock_map[sclk->id].cgu_div_oft;
+
+       return 0;
+}
+
+static ulong hsdk_cgu_get_rate(struct clk *sclk)
+{
+       if (hsdk_prepare_clock_tree_branch(sclk))
+               return -EINVAL;
+
+       return clock_map[sclk->id].get_rate(sclk);
+}
+
+static ulong hsdk_cgu_set_rate(struct clk *sclk, ulong rate)
+{
+       if (hsdk_prepare_clock_tree_branch(sclk))
+               return -EINVAL;
+
+       return clock_map[sclk->id].set_rate(sclk, rate);
+}
+
+static int hsdk_cgu_disable(struct clk *sclk)
+{
+       if (hsdk_prepare_clock_tree_branch(sclk))
+               return -EINVAL;
+
+       if (clock_map[sclk->id].disable)
+               return clock_map[sclk->id].disable(sclk);
+
+       return -ENOTSUPP;
+}
+
+static const struct clk_ops hsdk_cgu_ops = {
+       .set_rate = hsdk_cgu_set_rate,
+       .get_rate = hsdk_cgu_get_rate,
+       .disable = hsdk_cgu_disable,
+};
+
+static int hsdk_cgu_clk_probe(struct udevice *dev)
+{
+       struct hsdk_cgu_clk *pll_clk = dev_get_priv(dev);
+
+       BUILD_BUG_ON(ARRAY_SIZE(clock_map) != CGU_MAX_CLOCKS);
+
+       pll_clk->cgu_regs = (void __iomem *)devfdt_get_addr_index(dev, 0);
+       if (!pll_clk->cgu_regs)
+               return -EINVAL;
+
+       pll_clk->creg_regs = (void __iomem *)devfdt_get_addr_index(dev, 1);
+       if (!pll_clk->creg_regs)
+               return -EINVAL;
+
+       return 0;
+}
+
+static const struct udevice_id hsdk_cgu_clk_id[] = {
+       { .compatible = "snps,hsdk-cgu-clock" },
+       { }
+};
+
+U_BOOT_DRIVER(hsdk_cgu_clk) = {
+       .name = "hsdk-cgu-clk",
+       .id = UCLASS_CLK,
+       .of_match = hsdk_cgu_clk_id,
+       .probe = hsdk_cgu_clk_probe,
+       .platdata_auto_alloc_size = sizeof(struct hsdk_cgu_clk),
+       .ops = &hsdk_cgu_ops,
+};
index 2acb33bb51bc9bb709ae1f942f0c3acb99360f47..b4e859e40cfe3b7f4796f17a3be0985c06be6ab2 100644 (file)
@@ -82,7 +82,7 @@ config IMX_RGPIO2P
 
 config HSDK_CREG_GPIO
        bool "HSDK CREG GPIO griver"
-       depends on DM
+       depends on DM_GPIO
        default n
        help
          This driver supports CREG GPIOs on Synopsys HSDK SOC.
index cc370b9c57c6e9cec0bb420a299173645f92cbec..0630712e4a4a473ab25211800a679f6df0142745 100644 (file)
@@ -141,7 +141,12 @@ config SYS_I2C_MESON
        bool "Amlogic Meson I2C driver"
        depends on DM_I2C && ARCH_MESON
        help
-         Add support for the Amlogic Meson I2C driver.
+         Add support for the I2C controller available in Amlogic Meson
+         SoCs. The controller supports programmable bus speed including
+         standard (100kbits/s) and fast (400kbit/s) speed and allows the
+         software to define a flexible format of the bit streams. It has an
+         internal buffer holding up to 8 bytes for transfers and supports
+         both 7-bit and 10-bit addresses.
 
 config SYS_I2C_MXC
        bool "NXP i.MX I2C driver"
index d394044f80de5362d8b8a77862800093f878602c..7917ca123120a207bcce311bd7048c50cf96243b 100644 (file)
@@ -72,6 +72,8 @@ static int at91_i2c_xfer_msg(struct at91_i2c_bus *bus, struct i2c_msg *msg)
 
        } else {
                writel(msg->buf[0], &reg->thr);
+               ret = at91_wait_for_xfer(bus, TWI_SR_TXRDY);
+
                for (i = 1; !ret && (i < msg->len); i++) {
                        writel(msg->buf[i], &reg->thr);
                        ret = at91_wait_for_xfer(bus, TWI_SR_TXRDY);
@@ -199,27 +201,6 @@ static int at91_i2c_enable_clk(struct udevice *dev)
        return 0;
 }
 
-static int at91_i2c_probe_chip(struct udevice *dev, uint chip, uint chip_flags)
-{
-       struct at91_i2c_bus *bus = dev_get_priv(dev);
-       struct at91_i2c_regs *reg = bus->regs;
-       int ret;
-
-       ret = at91_i2c_enable_clk(dev);
-       if (ret)
-               return ret;
-
-       writel(TWI_CR_SWRST, &reg->cr);
-
-       at91_calc_i2c_clock(dev, bus->clock_frequency);
-
-       writel(bus->cwgr_val, &reg->cwgr);
-       writel(TWI_CR_MSEN, &reg->cr);
-       writel(TWI_CR_SVDIS, &reg->cr);
-
-       return 0;
-}
-
 static int at91_i2c_set_bus_speed(struct udevice *dev, unsigned int speed)
 {
        struct at91_i2c_bus *bus = dev_get_priv(dev);
@@ -254,7 +235,6 @@ static int at91_i2c_ofdata_to_platdata(struct udevice *dev)
 
 static const struct dm_i2c_ops at91_i2c_ops = {
        .xfer           = at91_i2c_xfer,
-       .probe_chip     = at91_i2c_probe_chip,
        .set_bus_speed  = at91_i2c_set_bus_speed,
        .get_bus_speed  = at91_i2c_get_bus_speed,
 };
index 2434d9ed53874b4702f04cf3a20075e62eea9022..4f37d2f3168aa3df6f24b77769ea5f1ca0a9e7a6 100644 (file)
@@ -9,7 +9,7 @@
 #include <dm.h>
 #include <i2c.h>
 
-#define I2C_TIMEOUT_MS         500
+#define I2C_TIMEOUT_MS         100
 
 /* Control register fields */
 #define REG_CTRL_START         BIT(0)
@@ -44,12 +44,12 @@ struct i2c_regs {
 
 struct meson_i2c {
        struct i2c_regs *regs;
-       struct i2c_msg *msg;
-       bool last;
-       uint count;
-       uint pos;
-       u32 tokens[2];
-       uint num_tokens;
+       struct i2c_msg *msg;    /* Current I2C message */
+       bool last;              /* Whether the message is the last */
+       uint count;             /* Number of bytes in the current transfer */
+       uint pos;               /* Position of current transfer in message */
+       u32 tokens[2];          /* Sequence of tokens to be written */
+       uint num_tokens;        /* Number of tokens to be written */
 };
 
 static void meson_i2c_reset_tokens(struct meson_i2c *i2c)
@@ -69,6 +69,10 @@ static void meson_i2c_add_token(struct meson_i2c *i2c, int token)
        i2c->num_tokens++;
 }
 
+/*
+ * Retrieve data for the current transfer (which can be at most 8
+ * bytes) from the device internal buffer.
+ */
 static void meson_i2c_get_data(struct meson_i2c *i2c, u8 *buf, int len)
 {
        u32 rdata0, rdata1;
@@ -86,6 +90,10 @@ static void meson_i2c_get_data(struct meson_i2c *i2c, u8 *buf, int len)
                *buf++ = (rdata1 >> (i - 4) * 8) & 0xff;
 }
 
+/*
+ * Write data for the current transfer (which can be at most 8 bytes)
+ * to the device internal buffer.
+ */
 static void meson_i2c_put_data(struct meson_i2c *i2c, u8 *buf, int len)
 {
        u32 wdata0 = 0, wdata1 = 0;
@@ -103,6 +111,11 @@ static void meson_i2c_put_data(struct meson_i2c *i2c, u8 *buf, int len)
        debug("meson i2c: write data %08x %08x len %d\n", wdata0, wdata1, len);
 }
 
+/*
+ * Prepare the next transfer: pick the next 8 bytes in the remaining
+ * part of message and write tokens and data (if needed) to the
+ * device.
+ */
 static void meson_i2c_prepare_xfer(struct meson_i2c *i2c)
 {
        bool write = !(i2c->msg->flags & I2C_M_RD);
@@ -178,7 +191,7 @@ static int meson_i2c_xfer_msg(struct meson_i2c *i2c, struct i2c_msg *msg,
 
                if (readl(&i2c->regs->ctrl) & REG_CTRL_ERROR) {
                        debug("meson i2c: error\n");
-                       return -ENXIO;
+                       return -EREMOTEIO;
                }
 
                if ((msg->flags & I2C_M_RD) && i2c->count) {
@@ -200,7 +213,7 @@ static int meson_i2c_xfer(struct udevice *bus, struct i2c_msg *msg,
        for (i = 0; i < nmsgs; i++) {
                ret = meson_i2c_xfer_msg(i2c, msg + i, i == nmsgs - 1);
                if (ret)
-                       return -EREMOTEIO;
+                       return ret;
        }
 
        return 0;
index 47ec43500cb4c880f5d88f1049ce52c024bbbbe6..78a39abf7542e122e5c59be6dbb7cf07156c8913 100644 (file)
@@ -10,15 +10,14 @@ config SYS_NAND_SELF_INIT
          NAND initialization process.
 
 config NAND_DENALI
-       bool "Support Denali NAND controller"
+       bool
        select SYS_NAND_SELF_INIT
        imply CMD_NAND
-       help
-         Enable support for the Denali NAND controller.
 
 config NAND_DENALI_DT
        bool "Support Denali NAND controller as a DT device"
-       depends on NAND_DENALI && OF_CONTROL && DM
+       select NAND_DENALI
+       depends on OF_CONTROL && DM
        help
          Enable the driver for NAND flash on platforms using a Denali NAND
          controller as a DT device.
index ba9536d405087014ca21eab03e806e4e1622e98f..a0552f44dc23ddabd72636390ff952b25200f161 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Freescale Layerscape MC I/O wrapper
  *
- * Copyright (C) 2013-2015 Freescale Semiconductor, Inc.
- * Author: German Rivera <German.Rivera@freescale.com>
+ * Copyright (C) 2013-2016 Freescale Semiconductor, Inc.
+ * Copyright 2017 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -50,9 +50,10 @@ int dpbp_close(struct fsl_mc_io *mc_io,
 }
 
 int dpbp_create(struct fsl_mc_io *mc_io,
+               uint16_t dprc_token,
                uint32_t cmd_flags,
                const struct dpbp_cfg *cfg,
-               uint16_t *token)
+               uint32_t *obj_id)
 {
        struct mc_command cmd = { 0 };
        int err;
@@ -62,7 +63,7 @@ int dpbp_create(struct fsl_mc_io *mc_io,
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPBP_CMDID_CREATE,
                                          cmd_flags,
-                                         0);
+                                         dprc_token);
 
        /* send command to mc*/
        err = mc_send_command(mc_io, &cmd);
@@ -70,21 +71,25 @@ int dpbp_create(struct fsl_mc_io *mc_io,
                return err;
 
        /* retrieve response parameters */
-       *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
+       MC_CMD_READ_OBJ_ID(cmd, *obj_id);
 
        return 0;
 }
 
 int dpbp_destroy(struct fsl_mc_io *mc_io,
+                uint16_t dprc_token,
                 uint32_t cmd_flags,
-                uint16_t token)
+                uint32_t obj_id)
 {
        struct mc_command cmd = { 0 };
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPBP_CMDID_DESTROY,
                                          cmd_flags,
-                                         token);
+                                         dprc_token);
+
+       /* set object id to destroy */
+       CMD_DESTROY_SET_OBJ_ID_PARAM0(cmd, obj_id);
 
        /* send command to mc*/
        return mc_send_command(mc_io, &cmd);
@@ -157,3 +162,26 @@ int dpbp_get_attributes(struct fsl_mc_io *mc_io,
 
        return 0;
 }
+
+int dpbp_get_api_version(struct fsl_mc_io *mc_io,
+                        u32 cmd_flags,
+                        u16 *major_ver,
+                        u16 *minor_ver)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPBP_CMDID_GET_API_VERSION,
+                                         cmd_flags, 0);
+
+       /* send command to mc */
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       mc_cmd_read_api_version(&cmd, major_ver, minor_ver);
+
+       return 0;
+}
index b61df52860e50351d47478275e01b9e1e75f3cb7..ccac506e9957ed2694d2b78ab78bb7f94fdd3bb3 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright (C) 2013-2015 Freescale Semiconductor
+ * Copyright (C) 2013-2016 Freescale Semiconductor
+ * Copyright 2017 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -10,7 +11,7 @@
 
 int dpio_open(struct fsl_mc_io *mc_io,
              uint32_t cmd_flags,
-             int dpio_id,
+             uint32_t dpio_id,
              uint16_t *token)
 {
        struct mc_command cmd = { 0 };
@@ -49,9 +50,10 @@ int dpio_close(struct fsl_mc_io *mc_io,
 }
 
 int dpio_create(struct fsl_mc_io *mc_io,
+               uint16_t dprc_token,
                uint32_t cmd_flags,
                const struct dpio_cfg *cfg,
-               uint16_t *token)
+               uint32_t *obj_id)
 {
        struct mc_command cmd = { 0 };
        int err;
@@ -59,7 +61,7 @@ int dpio_create(struct fsl_mc_io *mc_io,
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPIO_CMDID_CREATE,
                                          cmd_flags,
-                                         0);
+                                         dprc_token);
        DPIO_CMD_CREATE(cmd, cfg);
 
        /* send command to mc*/
@@ -68,21 +70,25 @@ int dpio_create(struct fsl_mc_io *mc_io,
                return err;
 
        /* retrieve response parameters */
-       *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
+       MC_CMD_READ_OBJ_ID(cmd, *obj_id);
 
        return 0;
 }
 
 int dpio_destroy(struct fsl_mc_io *mc_io,
+                uint16_t dprc_token,
                 uint32_t cmd_flags,
-                uint16_t token)
+                uint32_t obj_id)
 {
        struct mc_command cmd = { 0 };
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPIO_CMDID_DESTROY,
                                          cmd_flags,
-                                         token);
+                                         dprc_token);
+
+       /* set object id to destroy */
+       CMD_DESTROY_SET_OBJ_ID_PARAM0(cmd, obj_id);
 
        /* send command to mc*/
        return mc_send_command(mc_io, &cmd);
@@ -156,3 +162,26 @@ int dpio_get_attributes(struct fsl_mc_io *mc_io,
 
        return 0;
 }
+
+int dpio_get_api_version(struct fsl_mc_io *mc_io,
+                        u32 cmd_flags,
+                        u16 *major_ver,
+                        u16 *minor_ver)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPIO_CMDID_GET_API_VERSION,
+                                         cmd_flags, 0);
+
+       /* send command to mc */
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       mc_cmd_read_api_version(&cmd, major_ver, minor_ver);
+
+       return 0;
+}
index 072a90dcaee6c48c21b3150fd914914ef690eee0..a719ac12d4895b2d36a858aebee34d99053d85b5 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * Freescale Layerscape MC I/O wrapper
  *
- * Copyright (C) 2015 Freescale Semiconductor, Inc.
+ * Copyright (C) 2015-2016 Freescale Semiconductor, Inc.
+ * Copyright 2017 NXP
  * Author: Prabhakar Kushwaha <prabhakar@freescale.com>
  *
  * SPDX-License-Identifier:    GPL-2.0+
@@ -51,9 +52,10 @@ int dpmac_close(struct fsl_mc_io *mc_io,
 }
 
 int dpmac_create(struct fsl_mc_io *mc_io,
+                uint16_t dprc_token,
                 uint32_t cmd_flags,
                 const struct dpmac_cfg *cfg,
-                uint16_t *token)
+                uint32_t *obj_id)
 {
        struct mc_command cmd = { 0 };
        int err;
@@ -61,7 +63,7 @@ int dpmac_create(struct fsl_mc_io *mc_io,
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPMAC_CMDID_CREATE,
                                          cmd_flags,
-                                         0);
+                                         dprc_token);
        DPMAC_CMD_CREATE(cmd, cfg);
 
        /* send command to mc*/
@@ -70,21 +72,25 @@ int dpmac_create(struct fsl_mc_io *mc_io,
                return err;
 
        /* retrieve response parameters */
-       *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
+       MC_CMD_READ_OBJ_ID(cmd, *obj_id);
 
        return 0;
 }
 
 int dpmac_destroy(struct fsl_mc_io *mc_io,
+                 uint16_t dprc_token,
                  uint32_t cmd_flags,
-                 uint16_t token)
+                 uint32_t obj_id)
 {
        struct mc_command cmd = { 0 };
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPMAC_CMDID_DESTROY,
                                          cmd_flags,
-                                         token);
+                                         dprc_token);
+
+       /* set object id to destroy */
+       CMD_DESTROY_SET_OBJ_ID_PARAM0(cmd, obj_id);
 
        /* send command to mc*/
        return mc_send_command(mc_io, &cmd);
@@ -220,3 +226,26 @@ int dpmac_get_counter(struct fsl_mc_io *mc_io,
 
        return 0;
 }
+
+int dpmac_get_api_version(struct fsl_mc_io *mc_io,
+                        u32 cmd_flags,
+                        u16 *major_ver,
+                        u16 *minor_ver)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_API_VERSION,
+                                         cmd_flags, 0);
+
+       /* send command to mc */
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       mc_cmd_read_api_version(&cmd, major_ver, minor_ver);
+
+       return 0;
+}
index 41bf56abf5b19c0a773c344d5094f07ed43ff796..481f9d882b0f647539d60da0cf8641496c12f7b1 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright (C) 2013-2015 Freescale Semiconductor
+ * Copyright (C) 2013-2016 Freescale Semiconductor
+ * Copyright 2017 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -8,22 +9,22 @@
 #include <fsl-mc/fsl_mc_cmd.h>
 #include <fsl-mc/fsl_dpni.h>
 
-int dpni_prepare_extended_cfg(const struct dpni_extended_cfg   *cfg,
-                             uint8_t                   *ext_cfg_buf)
+int dpni_prepare_cfg(const struct dpni_cfg     *cfg,
+                    uint8_t                    *cfg_buf)
 {
-       uint64_t *ext_params = (uint64_t *)ext_cfg_buf;
+       uint64_t *params = (uint64_t *)cfg_buf;
 
-       DPNI_PREP_EXTENDED_CFG(ext_params, cfg);
+       DPNI_PREP_CFG(params, cfg);
 
        return 0;
 }
 
-int dpni_extract_extended_cfg(struct dpni_extended_cfg *cfg,
-                             const uint8_t             *ext_cfg_buf)
+int dpni_extract_cfg(struct dpni_cfg   *cfg,
+                    const uint8_t      *cfg_buf)
 {
-       uint64_t *ext_params = (uint64_t *)ext_cfg_buf;
+       uint64_t *params = (uint64_t *)cfg_buf;
 
-       DPNI_EXT_EXTENDED_CFG(ext_params, cfg);
+       DPNI_EXT_CFG(params, cfg);
 
        return 0;
 }
@@ -69,9 +70,10 @@ int dpni_close(struct fsl_mc_io *mc_io,
 }
 
 int dpni_create(struct fsl_mc_io *mc_io,
+               uint16_t dprc_token,
                uint32_t cmd_flags,
                const struct dpni_cfg *cfg,
-               uint16_t *token)
+               uint32_t *obj_id)
 {
        struct mc_command cmd = { 0 };
        int err;
@@ -79,7 +81,7 @@ int dpni_create(struct fsl_mc_io *mc_io,
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPNI_CMDID_CREATE,
                                          cmd_flags,
-                                         0);
+                                         dprc_token);
        DPNI_CMD_CREATE(cmd, cfg);
 
        /* send command to mc*/
@@ -88,21 +90,25 @@ int dpni_create(struct fsl_mc_io *mc_io,
                return err;
 
        /* retrieve response parameters */
-       *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
+        MC_CMD_READ_OBJ_ID(cmd, *obj_id);
 
        return 0;
 }
 
 int dpni_destroy(struct fsl_mc_io *mc_io,
+                uint16_t dprc_token,
                 uint32_t cmd_flags,
-                uint16_t token)
+                uint32_t obj_id)
 {
        struct mc_command cmd = { 0 };
 
        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPNI_CMDID_DESTROY,
                                          cmd_flags,
-                                         token);
+                                         dprc_token);
+
+       /* set object id to destroy */
+       CMD_DESTROY_SET_OBJ_ID_PARAM0(cmd, obj_id);
 
        /* send command to mc*/
        return mc_send_command(mc_io, &cmd);
@@ -182,8 +188,6 @@ int dpni_get_attributes(struct fsl_mc_io *mc_io,
        cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_ATTR,
                                          cmd_flags,
                                          token);
-       DPNI_CMD_GET_ATTR(cmd, attr);
-
        /* send command to mc*/
        err = mc_send_command(mc_io, &cmd);
        if (err)
@@ -212,124 +216,19 @@ int dpni_set_errors_behavior(struct fsl_mc_io *mc_io,
        return mc_send_command(mc_io, &cmd);
 }
 
-int dpni_get_rx_buffer_layout(struct fsl_mc_io *mc_io,
-                             uint32_t cmd_flags,
-                             uint16_t token,
-                             struct dpni_buffer_layout *layout)
-{
-       struct mc_command cmd = { 0 };
-       int err;
-
-       /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_RX_BUFFER_LAYOUT,
-                                         cmd_flags,
-                                         token);
-
-       /* send command to mc*/
-       err = mc_send_command(mc_io, &cmd);
-       if (err)
-               return err;
-
-       /* retrieve response parameters */
-       DPNI_RSP_GET_RX_BUFFER_LAYOUT(cmd, layout);
-
-       return 0;
-}
-
-int dpni_set_rx_buffer_layout(struct fsl_mc_io *mc_io,
-                             uint32_t cmd_flags,
-                             uint16_t token,
-                             const struct dpni_buffer_layout *layout)
+int dpni_set_buffer_layout(struct fsl_mc_io *mc_io,
+                          uint32_t cmd_flags,
+                          uint16_t token,
+                          const struct dpni_buffer_layout *layout,
+                          enum dpni_queue_type type)
 {
        struct mc_command cmd = { 0 };
 
        /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_BUFFER_LAYOUT,
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_BUFFER_LAYOUT,
                                          cmd_flags,
                                          token);
-       DPNI_CMD_SET_RX_BUFFER_LAYOUT(cmd, layout);
-
-       /* send command to mc*/
-       return mc_send_command(mc_io, &cmd);
-}
-
-int dpni_get_tx_buffer_layout(struct fsl_mc_io *mc_io,
-                             uint32_t cmd_flags,
-                             uint16_t token,
-                             struct dpni_buffer_layout *layout)
-{
-       struct mc_command cmd = { 0 };
-       int err;
-
-       /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_BUFFER_LAYOUT,
-                                         cmd_flags,
-                                         token);
-
-       /* send command to mc*/
-       err = mc_send_command(mc_io, &cmd);
-       if (err)
-               return err;
-
-       /* retrieve response parameters */
-       DPNI_RSP_GET_TX_BUFFER_LAYOUT(cmd, layout);
-
-       return 0;
-}
-
-int dpni_set_tx_buffer_layout(struct fsl_mc_io *mc_io,
-                             uint32_t cmd_flags,
-                             uint16_t token,
-                             const struct dpni_buffer_layout *layout)
-{
-       struct mc_command cmd = { 0 };
-
-       /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_BUFFER_LAYOUT,
-                                         cmd_flags,
-                                         token);
-       DPNI_CMD_SET_TX_BUFFER_LAYOUT(cmd, layout);
-
-       /* send command to mc*/
-       return mc_send_command(mc_io, &cmd);
-}
-
-int dpni_get_tx_conf_buffer_layout(struct fsl_mc_io *mc_io,
-                                  uint32_t cmd_flags,
-                                  uint16_t token,
-                                  struct dpni_buffer_layout *layout)
-{
-       struct mc_command cmd = { 0 };
-       int err;
-
-       /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_CONF_BUFFER_LAYOUT,
-                                         cmd_flags,
-                                         token);
-
-       /* send command to mc*/
-       err = mc_send_command(mc_io, &cmd);
-       if (err)
-               return err;
-
-       /* retrieve response parameters */
-       DPNI_RSP_GET_TX_CONF_BUFFER_LAYOUT(cmd, layout);
-
-       return 0;
-}
-
-int dpni_set_tx_conf_buffer_layout(struct fsl_mc_io *mc_io,
-                                  uint32_t cmd_flags,
-                                  uint16_t token,
-                                  const struct dpni_buffer_layout *layout)
-{
-       struct mc_command cmd = { 0 };
-
-       /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_CONF_BUFFER_LAYOUT,
-                                         cmd_flags,
-                                         token);
-       DPNI_CMD_SET_TX_CONF_BUFFER_LAYOUT(cmd, layout);
+       DPNI_CMD_SET_BUFFER_LAYOUT(cmd, layout, type);
 
        /* send command to mc*/
        return mc_send_command(mc_io, &cmd);
@@ -383,50 +282,6 @@ int dpni_get_tx_data_offset(struct fsl_mc_io *mc_io,
        return 0;
 }
 
-int dpni_get_counter(struct fsl_mc_io *mc_io,
-                    uint32_t cmd_flags,
-                    uint16_t token,
-                    enum dpni_counter counter,
-                    uint64_t *value)
-{
-       struct mc_command cmd = { 0 };
-       int err;
-
-       /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_COUNTER,
-                                         cmd_flags,
-                                         token);
-       DPNI_CMD_GET_COUNTER(cmd, counter);
-
-       /* send command to mc*/
-       err = mc_send_command(mc_io, &cmd);
-       if (err)
-               return err;
-
-       /* retrieve response parameters */
-       DPNI_RSP_GET_COUNTER(cmd, *value);
-
-       return 0;
-}
-
-int dpni_set_counter(struct fsl_mc_io *mc_io,
-                    uint32_t cmd_flags,
-                    uint16_t token,
-                    enum dpni_counter counter,
-                    uint64_t value)
-{
-       struct mc_command cmd = { 0 };
-
-       /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_COUNTER,
-                                         cmd_flags,
-                                         token);
-       DPNI_CMD_SET_COUNTER(cmd, counter, value);
-
-       /* send command to mc*/
-       return mc_send_command(mc_io, &cmd);
-}
-
 int dpni_set_link_cfg(struct fsl_mc_io *mc_io,
                      uint32_t cmd_flags,
                      uint16_t token,
@@ -544,46 +399,64 @@ int dpni_remove_mac_addr(struct fsl_mc_io *mc_io,
        return mc_send_command(mc_io, &cmd);
 }
 
-int dpni_set_tx_flow(struct fsl_mc_io *mc_io,
-                    uint32_t cmd_flags,
-                    uint16_t token,
-                    uint16_t *flow_id,
-                    const struct dpni_tx_flow_cfg *cfg)
+int dpni_get_api_version(struct fsl_mc_io *mc_io,
+                        u32 cmd_flags,
+                        u16 *major_ver,
+                        u16 *minor_ver)
 {
        struct mc_command cmd = { 0 };
        int err;
 
        /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_FLOW,
-                                         cmd_flags,
-                                         token);
-       DPNI_CMD_SET_TX_FLOW(cmd, *flow_id, cfg);
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_API_VERSION,
+                                         cmd_flags, 0);
 
-       /* send command to mc*/
+       /* send command to mc */
        err = mc_send_command(mc_io, &cmd);
        if (err)
                return err;
 
        /* retrieve response parameters */
-       DPNI_RSP_SET_TX_FLOW(cmd, *flow_id);
+       mc_cmd_read_api_version(&cmd, major_ver, minor_ver);
 
        return 0;
 }
 
-int dpni_get_tx_flow(struct fsl_mc_io *mc_io,
-                    uint32_t cmd_flags,
-                    uint16_t token,
-                    uint16_t flow_id,
-                    struct dpni_tx_flow_attr *attr)
+int dpni_set_queue(struct fsl_mc_io *mc_io,
+       uint32_t cmd_flags,
+       uint16_t token,
+       enum dpni_queue_type type,
+       uint8_t tc,
+       uint8_t index,
+       const struct dpni_queue *queue)
+{
+       struct mc_command cmd = { 0 };
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_QUEUE,
+                                         cmd_flags,
+                                         token);
+       DPNI_CMD_SET_QUEUE(cmd, type, tc, index, queue);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_get_queue(struct fsl_mc_io *mc_io,
+       uint32_t cmd_flags,
+       uint16_t token,
+       enum dpni_queue_type type,
+       uint8_t tc,
+       uint8_t index,
+       struct dpni_queue *queue)
 {
        struct mc_command cmd = { 0 };
        int err;
 
        /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_FLOW,
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QUEUE,
                                          cmd_flags,
                                          token);
-       DPNI_CMD_GET_TX_FLOW(cmd, flow_id);
+       DPNI_CMD_GET_QUEUE(cmd, type, tc, index);
 
        /* send command to mc*/
        err = mc_send_command(mc_io, &cmd);
@@ -591,44 +464,43 @@ int dpni_get_tx_flow(struct fsl_mc_io *mc_io,
                return err;
 
        /* retrieve response parameters */
-       DPNI_RSP_GET_TX_FLOW(cmd, attr);
-
+       DPNI_RSP_GET_QUEUE(cmd, queue);
        return 0;
 }
 
-int dpni_set_rx_flow(struct fsl_mc_io *mc_io,
-                    uint32_t cmd_flags,
-                    uint16_t token,
-                    uint8_t tc_id,
-                    uint16_t flow_id,
-                    const struct dpni_queue_cfg *cfg)
+int dpni_set_tx_confirmation_mode(struct fsl_mc_io *mc_io,
+       uint32_t cmd_flags,
+       uint16_t token,
+       enum dpni_confirmation_mode mode)
 {
+       struct dpni_tx_confirmation_mode *cmd_params;
        struct mc_command cmd = { 0 };
 
        /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_FLOW,
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_CONFIRMATION_MODE,
                                          cmd_flags,
                                          token);
-       DPNI_CMD_SET_RX_FLOW(cmd, tc_id, flow_id, cfg);
+
+       cmd_params = (struct dpni_tx_confirmation_mode *)cmd.params;
+       cmd_params->confirmation_mode = mode;
 
        /* send command to mc*/
        return mc_send_command(mc_io, &cmd);
 }
 
-int dpni_get_rx_flow(struct fsl_mc_io *mc_io,
-                    uint32_t cmd_flags,
-                    uint16_t token,
-                    uint8_t tc_id,
-                    uint16_t flow_id,
-                    struct dpni_queue_attr *attr)
+int dpni_get_statistics(struct fsl_mc_io *mc_io,
+                       uint32_t cmd_flags,
+                       uint16_t token,
+                       uint8_t  page,
+                       struct dpni_statistics *stat)
 {
        struct mc_command cmd = { 0 };
        int err;
+
        /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_RX_FLOW,
-                                         cmd_flags,
-                                         token);
-       DPNI_CMD_GET_RX_FLOW(cmd, tc_id, flow_id);
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_STATISTICS,
+                                         cmd_flags, token);
+       DPNI_CMD_GET_STATISTICS(cmd, page);
 
        /* send command to mc*/
        err = mc_send_command(mc_io, &cmd);
@@ -636,50 +508,22 @@ int dpni_get_rx_flow(struct fsl_mc_io *mc_io,
                return err;
 
        /* retrieve response parameters */
-       DPNI_RSP_GET_RX_FLOW(cmd, attr);
+       DPNI_RSP_GET_STATISTICS(cmd, stat);
 
        return 0;
 }
 
-int dpni_set_tx_conf(struct fsl_mc_io  *mc_io,
-                    uint32_t           cmd_flags,
-                    uint16_t           token,
-                    uint16_t           flow_id,
-                    const struct dpni_tx_conf_cfg      *cfg)
+int dpni_reset_statistics(struct fsl_mc_io *mc_io,
+                         uint32_t cmd_flags,
+                         uint16_t token)
 {
        struct mc_command cmd = { 0 };
 
        /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_CONF,
-                                         cmd_flags,
-                                         token);
-       DPNI_CMD_SET_TX_CONF(cmd, flow_id, cfg);
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET_STATISTICS,
+                                         cmd_flags, token);
 
        /* send command to mc*/
        return mc_send_command(mc_io, &cmd);
 }
 
-int dpni_get_tx_conf(struct fsl_mc_io          *mc_io,
-                    uint32_t                   cmd_flags,
-                    uint16_t                   token,
-                    uint16_t                   flow_id,
-                    struct dpni_tx_conf_attr   *attr)
-{
-       struct mc_command cmd = { 0 };
-       int err;
-
-       /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_CONF,
-                                         cmd_flags,
-                                         token);
-       DPNI_CMD_GET_TX_CONF(cmd, flow_id);
-
-       /* send command to mc*/
-       err = mc_send_command(mc_io, &cmd);
-       if (err)
-               return err;
-
-       DPNI_RSP_GET_TX_CONF(cmd, attr);
-
-       return 0;
-}
index 7d34355b866bcb48b1601bbc1c8c43c290ab29b2..be02057b46e3df5f781e8692fb52659c51b43449 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Freescale Layerscape MC I/O wrapper
  *
- * Copyright (C) 2013-2015 Freescale Semiconductor, Inc.
- * Author: German Rivera <German.Rivera@freescale.com>
+ * Copyright (C) 2013-2016 Freescale Semiconductor, Inc.
+ * Copyright 2017 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -353,3 +353,26 @@ int dprc_get_connection(struct fsl_mc_io *mc_io,
 
        return 0;
 }
+
+int dprc_get_api_version(struct fsl_mc_io *mc_io,
+                        u32 cmd_flags,
+                        u16 *major_ver,
+                        u16 *minor_ver)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_API_VERSION,
+                                         cmd_flags, 0);
+
+       /* send command to mc */
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       mc_cmd_read_api_version(&cmd, major_ver, minor_ver);
+
+       return 0;
+}
index 33f84f39bb94cc788b261c2c2956861560def85d..a91da2b52d310113d6fba1ff48e8406f910ae38c 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright 2013-2015 Freescale Semiconductor Inc.
+/* Copyright 2013-2016 Freescale Semiconductor Inc.
+ * Copyright 2017 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -6,7 +7,7 @@
 #define __FSL_DPMNG_CMD_H
 
 /* Command IDs */
-#define DPMNG_CMDID_GET_VERSION                        0x831
+#define DPMNG_CMDID_GET_VERSION                        0x8311
 
 /*                cmd, param, offset, width, type, arg_name */
 #define DPMNG_RSP_GET_VERSION(cmd, mc_ver_info) \
index c76f58253d6c6909de0ff90013b0d0b7e50c3d83..f36fe06269d4651f45ae887cd6728c952efee460 100644 (file)
@@ -854,21 +854,25 @@ int fsl_mc_ldpaa_init(bd_t *bis)
 
 static int dprc_version_check(struct fsl_mc_io *mc_io, uint16_t handle)
 {
-       struct dprc_attributes attr;
        int error;
+       uint16_t major_ver, minor_ver;
 
-       memset(&attr, 0, sizeof(struct dprc_attributes));
-       error = dprc_get_attributes(mc_io, MC_CMD_NO_FLAGS, handle, &attr);
-       if (error == 0) {
-               if ((attr.version.major != DPRC_VER_MAJOR) ||
-                   (attr.version.minor != DPRC_VER_MINOR)) {
-                       printf("DPRC version mismatch found %u.%u,",
-                              attr.version.major,
-                              attr.version.minor);
-                       printf("supported version is %u.%u\n",
-                              DPRC_VER_MAJOR, DPRC_VER_MINOR);
-               }
+       error = dprc_get_api_version(mc_io, 0,
+                                    &major_ver,
+                                    &minor_ver);
+       if (error < 0) {
+               printf("dprc_get_api_version() failed: %d\n", error);
+               return error;
+       }
+
+       if (major_ver < DPRC_VER_MAJOR || (major_ver == DPRC_VER_MAJOR &&
+                                          minor_ver < DPRC_VER_MINOR)) {
+               printf("DPRC version mismatch found %u.%u,",
+                      major_ver, minor_ver);
+               printf("supported version is %u.%u\n",
+                      DPRC_VER_MAJOR, DPRC_VER_MINOR);
        }
+
        return error;
 }
 
@@ -878,6 +882,7 @@ static int dpio_init(void)
        struct dpio_attr attr;
        struct dpio_cfg dpio_cfg;
        int err = 0;
+       uint16_t major_ver, minor_ver;
 
        dflt_dpio = (struct fsl_dpio_obj *)calloc(
                                        sizeof(struct fsl_dpio_obj), 1);
@@ -886,18 +891,44 @@ static int dpio_init(void)
                err = -ENOMEM;
                goto err_calloc;
        }
-
        dpio_cfg.channel_mode = DPIO_LOCAL_CHANNEL;
        dpio_cfg.num_priorities = 8;
 
-       err = dpio_create(dflt_mc_io, MC_CMD_NO_FLAGS, &dpio_cfg,
-                         &dflt_dpio->dpio_handle);
+       err = dpio_create(dflt_mc_io,
+                         dflt_dprc_handle,
+                         MC_CMD_NO_FLAGS,
+                         &dpio_cfg,
+                         &dflt_dpio->dpio_id);
        if (err < 0) {
                printf("dpio_create() failed: %d\n", err);
                err = -ENODEV;
                goto err_create;
        }
 
+       err = dpio_get_api_version(dflt_mc_io, 0,
+                                  &major_ver,
+                                  &minor_ver);
+       if (err < 0) {
+               printf("dpio_get_api_version() failed: %d\n", err);
+               goto err_get_api_ver;
+       }
+
+       if (major_ver < DPIO_VER_MAJOR || (major_ver == DPIO_VER_MAJOR &&
+                                          minor_ver < DPIO_VER_MINOR)) {
+               printf("DPRC version mismatch found %u.%u,",
+                      major_ver,
+                      minor_ver);
+       }
+
+       err = dpio_open(dflt_mc_io,
+                       MC_CMD_NO_FLAGS,
+                       dflt_dpio->dpio_id,
+                       &dflt_dpio->dpio_handle);
+       if (err) {
+               printf("dpio_open() failed\n");
+               goto err_open;
+       }
+
        memset(&attr, 0, sizeof(struct dpio_attr));
        err = dpio_get_attributes(dflt_mc_io, MC_CMD_NO_FLAGS,
                                  dflt_dpio->dpio_handle, &attr);
@@ -906,15 +937,11 @@ static int dpio_init(void)
                goto err_get_attr;
        }
 
-       if ((attr.version.major != DPIO_VER_MAJOR) ||
-           (attr.version.minor != DPIO_VER_MINOR)) {
-               printf("DPIO version mismatch found %u.%u,",
-                      attr.version.major, attr.version.minor);
-               printf("supported version is %u.%u\n",
-                      DPIO_VER_MAJOR, DPIO_VER_MINOR);
+       if (dflt_dpio->dpio_id != attr.id) {
+               printf("dnpi object id and attribute id are not same\n");
+               goto err_attr_not_same;
        }
 
-       dflt_dpio->dpio_id = attr.id;
 #ifdef DEBUG
        printf("Init: DPIO id=0x%d\n", dflt_dpio->dpio_id);
 #endif
@@ -945,8 +972,14 @@ err_get_swp_init:
        dpio_disable(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpio->dpio_handle);
 err_get_enable:
 err_get_attr:
+err_attr_not_same:
        dpio_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpio->dpio_handle);
-       dpio_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpio->dpio_handle);
+err_open:
+err_get_api_ver:
+       dpio_destroy(dflt_mc_io,
+                    dflt_dprc_handle,
+                    MC_CMD_NO_FLAGS,
+                    dflt_dpio->dpio_id);
 err_create:
        free(dflt_dpio);
 err_calloc:
@@ -963,7 +996,16 @@ static int dpio_exit(void)
                goto err;
        }
 
-       err = dpio_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpio->dpio_handle);
+       dpio_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpio->dpio_handle);
+       if (err < 0) {
+               printf("dpio_close() failed: %d\n", err);
+               goto err;
+       }
+
+       err = dpio_destroy(dflt_mc_io,
+                          dflt_dprc_handle,
+                          MC_CMD_NO_FLAGS,
+                          dflt_dpio->dpio_id);
        if (err < 0) {
                printf("dpio_destroy() failed: %d\n", err);
                goto err;
@@ -1040,6 +1082,7 @@ static int dprc_init(void)
 
        child_portal_id = MC_PORTAL_OFFSET_TO_PORTAL_ID(mc_portal_offset);
        dflt_mc_io->mmio_regs = SOC_MC_PORTAL_ADDR(child_portal_id);
+
 #ifdef DEBUG
        printf("MC portal of child DPRC container: %d, physical addr %p)\n",
               child_dprc_id, dflt_mc_io->mmio_regs);
@@ -1110,6 +1153,7 @@ static int dpbp_init(void)
        int err;
        struct dpbp_attr dpbp_attr;
        struct dpbp_cfg dpbp_cfg;
+       uint16_t major_ver, minor_ver;
 
        dflt_dpbp = (struct fsl_dpbp_obj *)calloc(
                                        sizeof(struct fsl_dpbp_obj), 1);
@@ -1121,8 +1165,11 @@ static int dpbp_init(void)
 
        dpbp_cfg.options = 512;
 
-       err = dpbp_create(dflt_mc_io, MC_CMD_NO_FLAGS, &dpbp_cfg,
-                         &dflt_dpbp->dpbp_handle);
+       err = dpbp_create(dflt_mc_io,
+                         dflt_dprc_handle,
+                         MC_CMD_NO_FLAGS,
+                         &dpbp_cfg,
+                         &dflt_dpbp->dpbp_id);
 
        if (err < 0) {
                err = -ENODEV;
@@ -1130,6 +1177,31 @@ static int dpbp_init(void)
                goto err_create;
        }
 
+       err = dpbp_get_api_version(dflt_mc_io, 0,
+                                  &major_ver,
+                                  &minor_ver);
+       if (err < 0) {
+               printf("dpbp_get_api_version() failed: %d\n", err);
+               goto err_get_api_ver;
+       }
+
+       if (major_ver < DPBP_VER_MAJOR || (major_ver == DPBP_VER_MAJOR &&
+                                          minor_ver < DPBP_VER_MINOR)) {
+               printf("DPBP version mismatch found %u.%u,",
+                      major_ver, minor_ver);
+               printf("supported version is %u.%u\n",
+                      DPBP_VER_MAJOR, DPBP_VER_MINOR);
+       }
+
+       err = dpbp_open(dflt_mc_io,
+                       MC_CMD_NO_FLAGS,
+                       dflt_dpbp->dpbp_id,
+                       &dflt_dpbp->dpbp_handle);
+       if (err) {
+               printf("dpbp_open() failed\n");
+               goto err_open;
+       }
+
        memset(&dpbp_attr, 0, sizeof(struct dpbp_attr));
        err = dpbp_get_attributes(dflt_mc_io, MC_CMD_NO_FLAGS,
                                  dflt_dpbp->dpbp_handle,
@@ -1139,17 +1211,13 @@ static int dpbp_init(void)
                goto err_get_attr;
        }
 
-       if ((dpbp_attr.version.major != DPBP_VER_MAJOR) ||
-           (dpbp_attr.version.minor != DPBP_VER_MINOR)) {
-               printf("DPBP version mismatch found %u.%u,",
-                      dpbp_attr.version.major, dpbp_attr.version.minor);
-               printf("supported version is %u.%u\n",
-                      DPBP_VER_MAJOR, DPBP_VER_MINOR);
+       if (dflt_dpbp->dpbp_id != dpbp_attr.id) {
+               printf("dpbp object id and attribute id are not same\n");
+               goto err_attr_not_same;
        }
 
-       dflt_dpbp->dpbp_attr.id = dpbp_attr.id;
 #ifdef DEBUG
-       printf("Init: DPBP id=0x%d\n", dflt_dpbp->dpbp_attr.id);
+       printf("Init: DPBP id=0x%x\n", dflt_dpbp->dpbp_attr.id);
 #endif
 
        err = dpbp_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpbp->dpbp_handle);
@@ -1160,12 +1228,18 @@ static int dpbp_init(void)
 
        return 0;
 
-err_close:
-       free(dflt_dpbp);
 err_get_attr:
+err_attr_not_same:
        dpbp_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpbp->dpbp_handle);
-       dpbp_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpbp->dpbp_handle);
+       dpbp_destroy(dflt_mc_io,
+                    dflt_dprc_handle,
+                    MC_CMD_NO_FLAGS,
+                    dflt_dpbp->dpbp_id);
+err_get_api_ver:
+err_close:
+err_open:
 err_create:
+       free(dflt_dpbp);
 err_calloc:
        return err;
 }
@@ -1174,15 +1248,8 @@ static int dpbp_exit(void)
 {
        int err;
 
-       err = dpbp_open(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpbp->dpbp_attr.id,
-                       &dflt_dpbp->dpbp_handle);
-       if (err < 0) {
-               printf("dpbp_open() failed: %d\n", err);
-               goto err;
-       }
-
-       err = dpbp_destroy(dflt_mc_io, MC_CMD_NO_FLAGS,
-                          dflt_dpbp->dpbp_handle);
+       err = dpbp_destroy(dflt_mc_io, dflt_dprc_handle, MC_CMD_NO_FLAGS,
+                          dflt_dpbp->dpbp_id);
        if (err < 0) {
                printf("dpbp_destroy() failed: %d\n", err);
                goto err;
@@ -1203,10 +1270,9 @@ err:
 static int dpni_init(void)
 {
        int err;
-       struct dpni_attr dpni_attr;
-       uint8_t ext_cfg_buf[256] = {0};
-       struct dpni_extended_cfg dpni_extended_cfg;
+       uint8_t cfg_buf[256] = {0};
        struct dpni_cfg dpni_cfg;
+       uint16_t major_ver, minor_ver;
 
        dflt_dpni = (struct fsl_dpni_obj *)calloc(
                                        sizeof(struct fsl_dpni_obj), 1);
@@ -1216,50 +1282,53 @@ static int dpni_init(void)
                goto err_calloc;
        }
 
-       memset(&dpni_extended_cfg, 0, sizeof(dpni_extended_cfg));
-       err = dpni_prepare_extended_cfg(&dpni_extended_cfg, &ext_cfg_buf[0]);
+       memset(&dpni_cfg, 0, sizeof(dpni_cfg));
+       err = dpni_prepare_cfg(&dpni_cfg, &cfg_buf[0]);
        if (err < 0) {
                err = -ENODEV;
-               printf("dpni_prepare_extended_cfg() failed: %d\n", err);
-               goto err_prepare_extended_cfg;
+               printf("dpni_prepare_cfg() failed: %d\n", err);
+               goto err_prepare_cfg;
        }
 
-       memset(&dpni_cfg, 0, sizeof(dpni_cfg));
-       dpni_cfg.adv.options = DPNI_OPT_UNICAST_FILTER |
-                              DPNI_OPT_MULTICAST_FILTER;
-
-       dpni_cfg.adv.ext_cfg_iova = (uint64_t)&ext_cfg_buf[0];
-       err = dpni_create(dflt_mc_io, MC_CMD_NO_FLAGS, &dpni_cfg,
-                         &dflt_dpni->dpni_handle);
-
+       err = dpni_create(dflt_mc_io,
+                         dflt_dprc_handle,
+                         MC_CMD_NO_FLAGS,
+                         &dpni_cfg,
+                         &dflt_dpni->dpni_id);
        if (err < 0) {
                err = -ENODEV;
-               printf("dpni_create() failed: %d\n", err);
+               printf("dpni create() failed: %d\n", err);
                goto err_create;
        }
 
-       memset(&dpni_attr, 0, sizeof(struct dpni_attr));
-       err = dpni_get_attributes(dflt_mc_io, MC_CMD_NO_FLAGS,
-                                 dflt_dpni->dpni_handle,
-                                 &dpni_attr);
+       err = dpni_get_api_version(dflt_mc_io, 0,
+                                  &major_ver,
+                                  &minor_ver);
        if (err < 0) {
-               printf("dpni_get_attributes() failed: %d\n", err);
-               goto err_get_attr;
+               printf("dpni_get_api_version() failed: %d\n", err);
+               goto err_get_version;
        }
 
-       if ((dpni_attr.version.major != DPNI_VER_MAJOR) ||
-           (dpni_attr.version.minor != DPNI_VER_MINOR)) {
+       if (major_ver < DPNI_VER_MAJOR || (major_ver == DPNI_VER_MAJOR &&
+                                          minor_ver < DPNI_VER_MINOR)) {
                printf("DPNI version mismatch found %u.%u,",
-                      dpni_attr.version.major, dpni_attr.version.minor);
+                      major_ver, minor_ver);
                printf("supported version is %u.%u\n",
                       DPNI_VER_MAJOR, DPNI_VER_MINOR);
        }
 
-       dflt_dpni->dpni_id = dpni_attr.id;
+       err = dpni_open(dflt_mc_io,
+                       MC_CMD_NO_FLAGS,
+                       dflt_dpni->dpni_id,
+                       &dflt_dpni->dpni_handle);
+       if (err) {
+               printf("dpni_open() failed\n");
+               goto err_open;
+       }
+
 #ifdef DEBUG
        printf("Init: DPNI id=0x%d\n", dflt_dpni->dpni_id);
 #endif
-
        err = dpni_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle);
        if (err < 0) {
                printf("dpni_close() failed: %d\n", err);
@@ -1269,11 +1338,15 @@ static int dpni_init(void)
        return 0;
 
 err_close:
-err_get_attr:
        dpni_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle);
-       dpni_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle);
+err_open:
+err_get_version:
+       dpni_destroy(dflt_mc_io,
+                    dflt_dprc_handle,
+                    MC_CMD_NO_FLAGS,
+                    dflt_dpni->dpni_id);
 err_create:
-err_prepare_extended_cfg:
+err_prepare_cfg:
        free(dflt_dpni);
 err_calloc:
        return err;
@@ -1283,15 +1356,8 @@ static int dpni_exit(void)
 {
        int err;
 
-       err = dpni_open(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_id,
-                       &dflt_dpni->dpni_handle);
-       if (err < 0) {
-               printf("dpni_open() failed: %d\n", err);
-               goto err;
-       }
-
-       err = dpni_destroy(dflt_mc_io, MC_CMD_NO_FLAGS,
-                          dflt_dpni->dpni_handle);
+       err = dpni_destroy(dflt_mc_io, dflt_dprc_handle, MC_CMD_NO_FLAGS,
+                          dflt_dpni->dpni_id);
        if (err < 0) {
                printf("dpni_destroy() failed: %d\n", err);
                goto err;
@@ -1370,12 +1436,13 @@ int fsl_mc_ldpaa_exit(bd_t *bd)
         */
        if (bd && mc_boot_status && !is_dpl_apply_status) {
                printf("fsl-mc: DPL not deployed, DPAA2 ethernet not work\n");
-               return 0;
+               goto mc_obj_cleanup;
        }
 
        if (bd && mc_boot_status && is_dpl_apply_status)
                return 0;
 
+mc_obj_cleanup:
        err = dpbp_exit();
        if (err < 0) {
                printf("dpbp_exit() failed: %d\n", err);
@@ -1420,6 +1487,7 @@ static int do_fsl_mc(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 #endif
 
                        sub_cmd = argv[2][0];
+
                        switch (sub_cmd) {
                        case 'm':
                                if (argc < 5)
index 21be79a58ad4618d4e9f08054c350b316f9c6953..109aba2f967f8500b87512ac810c6a590d4d25ad 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright (C) 2014 Freescale Semiconductor
+ * Copyright (C) 2014-2016 Freescale Semiconductor
+ * Copyright 2017 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -42,80 +43,67 @@ static int init_phy(struct eth_device *dev)
 #endif
 
 #ifdef DEBUG
-static void ldpaa_eth_get_dpni_counter(void)
-{
-       int err = 0;
-       u64 value;
-
-       err = dpni_get_counter(dflt_mc_io, MC_CMD_NO_FLAGS,
-                    dflt_dpni->dpni_handle,
-                    DPNI_CNT_ING_FRAME,
-                    &value);
-       if (err < 0) {
-               printf("dpni_get_counter: DPNI_CNT_ING_FRAME failed\n");
-               return;
-       }
-       printf("DPNI_CNT_ING_FRAME=%lld\n", value);
 
-       err = dpni_get_counter(dflt_mc_io, MC_CMD_NO_FLAGS,
-                    dflt_dpni->dpni_handle,
-                    DPNI_CNT_ING_BYTE,
-                    &value);
-       if (err < 0) {
-               printf("dpni_get_counter: DPNI_CNT_ING_BYTE failed\n");
-               return;
-       }
-       printf("DPNI_CNT_ING_BYTE=%lld\n", value);
-
-       err = dpni_get_counter(dflt_mc_io, MC_CMD_NO_FLAGS,
-                    dflt_dpni->dpni_handle,
-                    DPNI_CNT_ING_FRAME_DROP ,
-                    &value);
-       if (err < 0) {
-               printf("dpni_get_counter: DPNI_CNT_ING_FRAME_DROP failed\n");
-               return;
-       }
-       printf("DPNI_CNT_ING_FRAME_DROP =%lld\n", value);
-
-       err = dpni_get_counter(dflt_mc_io, MC_CMD_NO_FLAGS,
-                    dflt_dpni->dpni_handle,
-                    DPNI_CNT_ING_FRAME_DISCARD,
-                    &value);
-       if (err < 0) {
-               printf("dpni_get_counter: DPNI_CNT_ING_FRAME_DISCARD failed\n");
-               return;
-       }
-       printf("DPNI_CNT_ING_FRAME_DISCARD=%lld\n", value);
-
-       err = dpni_get_counter(dflt_mc_io, MC_CMD_NO_FLAGS,
-                    dflt_dpni->dpni_handle,
-                    DPNI_CNT_EGR_FRAME,
-                    &value);
-       if (err < 0) {
-               printf("dpni_get_counter: DPNI_CNT_EGR_FRAME failed\n");
-               return;
-       }
-       printf("DPNI_CNT_EGR_FRAME=%lld\n", value);
+#define DPNI_STATS_PER_PAGE 6
+
+static const char *dpni_statistics[][DPNI_STATS_PER_PAGE] = {
+       {
+       "DPNI_CNT_ING_ALL_FRAMES",
+       "DPNI_CNT_ING_ALL_BYTES",
+       "DPNI_CNT_ING_MCAST_FRAMES",
+       "DPNI_CNT_ING_MCAST_BYTES",
+       "DPNI_CNT_ING_BCAST_FRAMES",
+       "DPNI_CNT_ING_BCAST_BYTES",
+       }, {
+       "DPNI_CNT_EGR_ALL_FRAMES",
+       "DPNI_CNT_EGR_ALL_BYTES",
+       "DPNI_CNT_EGR_MCAST_FRAMES",
+       "DPNI_CNT_EGR_MCAST_BYTES",
+       "DPNI_CNT_EGR_BCAST_FRAMES",
+       "DPNI_CNT_EGR_BCAST_BYTES",
+       }, {
+       "DPNI_CNT_ING_FILTERED_FRAMES",
+       "DPNI_CNT_ING_DISCARDED_FRAMES",
+       "DPNI_CNT_ING_NOBUFFER_DISCARDS",
+       "DPNI_CNT_EGR_DISCARDED_FRAMES",
+       "DPNI_CNT_EGR_CNF_FRAMES",
+       ""
+       },
+};
+
+static void print_dpni_stats(const char *strings[],
+                            struct dpni_statistics dpni_stats)
+{
+       uint64_t *stat;
+       int i;
 
-       err = dpni_get_counter(dflt_mc_io, MC_CMD_NO_FLAGS,
-                    dflt_dpni->dpni_handle,
-                    DPNI_CNT_EGR_BYTE ,
-                    &value);
-       if (err < 0) {
-               printf("dpni_get_counter: DPNI_CNT_EGR_BYTE failed\n");
-               return;
+       stat = (uint64_t *)&dpni_stats;
+       for (i = 0; i < DPNI_STATS_PER_PAGE; i++) {
+               if (strcmp(strings[i], "\0") == 0)
+                       break;
+               printf("%s= %llu\n", strings[i], *stat);
+               stat++;
        }
-       printf("DPNI_CNT_EGR_BYTE =%lld\n", value);
+}
 
-       err = dpni_get_counter(dflt_mc_io, MC_CMD_NO_FLAGS,
-                    dflt_dpni->dpni_handle,
-                    DPNI_CNT_EGR_FRAME_DISCARD ,
-                    &value);
-       if (err < 0) {
-               printf("dpni_get_counter: DPNI_CNT_EGR_FRAME_DISCARD failed\n");
-               return;
+static void ldpaa_eth_get_dpni_counter(void)
+{
+       int err = 0;
+       unsigned int page = 0;
+       struct dpni_statistics dpni_stats;
+
+       printf("DPNI counters ..\n");
+       for (page = 0; page < 3; page++) {
+               err = dpni_get_statistics(dflt_mc_io, MC_CMD_NO_FLAGS,
+                                         dflt_dpni->dpni_handle, page,
+                                         &dpni_stats);
+               if (err < 0) {
+                       printf("dpni_get_statistics: failed:");
+                       printf("%d for page[%d]\n", err, page);
+                       return;
+               }
+               print_dpni_stats(dpni_statistics[page], dpni_stats);
        }
-       printf("DPNI_CNT_EGR_FRAME_DISCARD =%lld\n", value);
 }
 
 static void ldpaa_eth_get_dpmac_counter(struct eth_device *net_dev)
@@ -132,6 +120,7 @@ static void ldpaa_eth_get_dpmac_counter(struct eth_device *net_dev)
                printf("dpmac_get_counter: DPMAC_CNT_ING_BYTE failed\n");
                return;
        }
+       printf("\nDPMAC counters ..\n");
        printf("DPMAC_CNT_ING_BYTE=%lld\n", value);
 
        err = dpmac_get_counter(dflt_mc_io, MC_CMD_NO_FLAGS,
@@ -392,7 +381,6 @@ error:
 static int ldpaa_eth_open(struct eth_device *net_dev, bd_t *bd)
 {
        struct ldpaa_eth_priv *priv = (struct ldpaa_eth_priv *)net_dev->priv;
-       struct dpni_queue_attr rx_queue_attr;
        struct dpmac_link_state dpmac_link_state = { 0 };
 #ifdef DEBUG
        struct dpni_link_state link_state;
@@ -400,6 +388,7 @@ static int ldpaa_eth_open(struct eth_device *net_dev, bd_t *bd)
        int err = 0;
        struct mii_dev *bus;
        phy_interface_t enet_if;
+       struct dpni_queue d_queue;
 
        if (net_dev->state == ETH_STATE_ACTIVE)
                return 0;
@@ -508,6 +497,10 @@ static int ldpaa_eth_open(struct eth_device *net_dev, bd_t *bd)
        }
 
 #ifdef DEBUG
+       printf("DPMAC link status: %d - ", dpmac_link_state.up);
+       dpmac_link_state.up == 0 ? printf("down\n") :
+       dpmac_link_state.up == 1 ? printf("up\n") : printf("error state\n");
+
        err = dpni_get_link_state(dflt_mc_io, MC_CMD_NO_FLAGS,
                                  dflt_dpni->dpni_handle, &link_state);
        if (err < 0) {
@@ -515,20 +508,21 @@ static int ldpaa_eth_open(struct eth_device *net_dev, bd_t *bd)
                return err;
        }
 
-       printf("link status: %d - ", link_state.up);
+       printf("DPNI link status: %d - ", link_state.up);
        link_state.up == 0 ? printf("down\n") :
        link_state.up == 1 ? printf("up\n") : printf("error state\n");
 #endif
 
-       /* TODO: support multiple Rx flows */
-       err = dpni_get_rx_flow(dflt_mc_io, MC_CMD_NO_FLAGS,
-                              dflt_dpni->dpni_handle, 0, 0, &rx_queue_attr);
+       memset(&d_queue, 0, sizeof(struct dpni_queue));
+       err = dpni_get_queue(dflt_mc_io, MC_CMD_NO_FLAGS,
+                            dflt_dpni->dpni_handle, DPNI_QUEUE_RX,
+                            0, 0, &d_queue);
        if (err) {
-               printf("dpni_get_rx_flow() failed\n");
-               goto err_rx_flow;
+               printf("dpni_get_queue failed\n");
+               goto err_get_queue;
        }
 
-       priv->rx_dflt_fqid = rx_queue_attr.fqid;
+       priv->rx_dflt_fqid = d_queue.fqid;
 
        err = dpni_get_qdid(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle,
                            &priv->tx_qdid);
@@ -540,7 +534,7 @@ static int ldpaa_eth_open(struct eth_device *net_dev, bd_t *bd)
        return priv->phydev->link;
 
 err_qdid:
-err_rx_flow:
+err_get_queue:
        dpni_disable(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle);
 err_dpni_bind:
        ldpaa_dpbp_free();
@@ -548,7 +542,10 @@ err_dpbp_setup:
        dpni_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle);
 err_dpni_setup:
 err_dpamc_bind:
-       dpmac_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, priv->dpmac_handle);
+       dpmac_close(dflt_mc_io, MC_CMD_NO_FLAGS, priv->dpmac_handle);
+       dpmac_destroy(dflt_mc_io,
+                     dflt_dprc_handle,
+                     MC_CMD_NO_FLAGS, priv->dpmac_id);
 err_dpmac_setup:
        return err;
 }
@@ -575,7 +572,14 @@ static void ldpaa_eth_stop(struct eth_device *net_dev)
        if (err < 0)
                printf("dprc_disconnect() failed dpmac_endpoint\n");
 
-       err = dpmac_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, priv->dpmac_handle);
+       err = dpmac_close(dflt_mc_io, MC_CMD_NO_FLAGS, priv->dpmac_handle);
+       if (err < 0)
+               printf("dpmac_close() failed\n");
+
+       err = dpmac_destroy(dflt_mc_io,
+                           dflt_dprc_handle,
+                           MC_CMD_NO_FLAGS,
+                           priv->dpmac_id);
        if (err < 0)
                printf("dpmac_destroy() failed\n");
 
@@ -593,9 +597,16 @@ static void ldpaa_eth_stop(struct eth_device *net_dev)
        }
 #endif
 
+       /* Free DPBP handle and reset. */
        ldpaa_dpbp_free();
+
        dpni_reset(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle);
+       if (err < 0)
+               printf("dpni_reset() failed\n");
+
        dpni_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle);
+       if (err < 0)
+               printf("dpni_close() failed\n");
 }
 
 static void ldpaa_dpbp_drain_cnt(int count)
@@ -711,6 +722,7 @@ static int ldpaa_dpbp_setup(void)
        }
 
        err = ldpaa_dpbp_seed(dflt_dpbp->dpbp_attr.bpid);
+
        if (err) {
                printf("Buffer seeding failed for DPBP %d (bpid=%d)\n",
                       dflt_dpbp->dpbp_attr.id, dflt_dpbp->dpbp_attr.bpid);
@@ -739,21 +751,19 @@ static void ldpaa_dpbp_free(void)
 static int ldpaa_dpmac_version_check(struct fsl_mc_io *mc_io,
                                     struct ldpaa_eth_priv *priv)
 {
-       struct dpmac_attr attr;
        int error;
-
-       memset(&attr, 0, sizeof(struct dpmac_attr));
-       error = dpmac_get_attributes(mc_io, MC_CMD_NO_FLAGS,
-                                    priv->dpmac_handle,
-                                    &attr);
-       if (error == 0) {
-               if ((attr.version.major != DPMAC_VER_MAJOR) ||
-                   (attr.version.minor != DPMAC_VER_MINOR)) {
-                       printf("DPMAC version mismatch found %u.%u,",
-                              attr.version.major, attr.version.minor);
-                       printf("supported version is %u.%u\n",
-                              DPMAC_VER_MAJOR, DPMAC_VER_MINOR);
-               }
+       uint16_t major_ver, minor_ver;
+
+       error = dpmac_get_api_version(dflt_mc_io, 0,
+                                       &major_ver,
+                                       &minor_ver);
+       if ((major_ver < DPMAC_VER_MAJOR) ||
+           (major_ver == DPMAC_VER_MAJOR && minor_ver < DPMAC_VER_MINOR)) {
+               printf("DPMAC version mismatch found %u.%u,",
+                      major_ver, minor_ver);
+               printf("supported version is %u.%u\n",
+                      DPMAC_VER_MAJOR, DPMAC_VER_MINOR);
+               return error;
        }
 
        return error;
@@ -765,14 +775,36 @@ static int ldpaa_dpmac_setup(struct ldpaa_eth_priv *priv)
        struct dpmac_cfg dpmac_cfg;
 
        dpmac_cfg.mac_id = priv->dpmac_id;
-       err = dpmac_create(dflt_mc_io, MC_CMD_NO_FLAGS, &dpmac_cfg,
-                         &priv->dpmac_handle);
+
+       err = dpmac_create(dflt_mc_io,
+                          dflt_dprc_handle,
+                          MC_CMD_NO_FLAGS, &dpmac_cfg,
+                          &priv->dpmac_id);
        if (err)
                printf("dpmac_create() failed\n");
 
        err = ldpaa_dpmac_version_check(dflt_mc_io, priv);
-       if (err < 0)
+       if (err < 0) {
                printf("ldpaa_dpmac_version_check() failed: %d\n", err);
+               goto err_version_check;
+       }
+
+       err = dpmac_open(dflt_mc_io,
+                        MC_CMD_NO_FLAGS,
+                        priv->dpmac_id,
+                        &priv->dpmac_handle);
+       if (err < 0) {
+               printf("dpmac_open() failed: %d\n", err);
+               goto err_open;
+       }
+
+       return err;
+
+err_open:
+err_version_check:
+       dpmac_destroy(dflt_mc_io,
+                     dflt_dprc_handle,
+                     MC_CMD_NO_FLAGS, priv->dpmac_id);
 
        return err;
 }
@@ -838,7 +870,6 @@ static int ldpaa_dpni_setup(struct ldpaa_eth_priv *priv)
                printf("dpni_open() failed\n");
                goto err_open;
        }
-
        err = dpni_get_attributes(dflt_mc_io, MC_CMD_NO_FLAGS,
                                  dflt_dpni->dpni_handle,
                                  &dflt_dpni->dpni_attrs);
@@ -857,12 +888,13 @@ static int ldpaa_dpni_setup(struct ldpaa_eth_priv *priv)
        dflt_dpni->buf_layout.private_data_size = LDPAA_ETH_SWA_SIZE;
        /* HW erratum mandates data alignment in multiples of 256 */
        dflt_dpni->buf_layout.data_align = LDPAA_ETH_BUF_ALIGN;
+
        /* ...rx, ... */
-       err = dpni_set_rx_buffer_layout(dflt_mc_io, MC_CMD_NO_FLAGS,
-                                       dflt_dpni->dpni_handle,
-                                       &dflt_dpni->buf_layout);
+       err = dpni_set_buffer_layout(dflt_mc_io, MC_CMD_NO_FLAGS,
+                                    dflt_dpni->dpni_handle,
+                                    &dflt_dpni->buf_layout, DPNI_QUEUE_RX);
        if (err) {
-               printf("dpni_set_rx_buffer_layout() failed");
+               printf("dpni_set_buffer_layout() failed");
                goto err_buf_layout;
        }
 
@@ -870,21 +902,22 @@ static int ldpaa_dpni_setup(struct ldpaa_eth_priv *priv)
        /* remove Rx-only options */
        dflt_dpni->buf_layout.options &= ~(DPNI_BUF_LAYOUT_OPT_DATA_ALIGN |
                                      DPNI_BUF_LAYOUT_OPT_PARSER_RESULT);
-       err = dpni_set_tx_buffer_layout(dflt_mc_io, MC_CMD_NO_FLAGS,
-                                       dflt_dpni->dpni_handle,
-                                       &dflt_dpni->buf_layout);
+       err = dpni_set_buffer_layout(dflt_mc_io, MC_CMD_NO_FLAGS,
+                                    dflt_dpni->dpni_handle,
+                                    &dflt_dpni->buf_layout, DPNI_QUEUE_TX);
        if (err) {
-               printf("dpni_set_tx_buffer_layout() failed");
+               printf("dpni_set_buffer_layout() failed");
                goto err_buf_layout;
        }
 
        /* ... tx-confirm. */
        dflt_dpni->buf_layout.options &= ~DPNI_BUF_LAYOUT_OPT_PRIVATE_DATA_SIZE;
-       err = dpni_set_tx_conf_buffer_layout(dflt_mc_io, MC_CMD_NO_FLAGS,
-                                            dflt_dpni->dpni_handle,
-                                            &dflt_dpni->buf_layout);
+       err = dpni_set_buffer_layout(dflt_mc_io, MC_CMD_NO_FLAGS,
+                                    dflt_dpni->dpni_handle,
+                                    &dflt_dpni->buf_layout,
+                                    DPNI_QUEUE_TX_CONFIRM);
        if (err) {
-               printf("dpni_set_tx_conf_buffer_layout() failed");
+               printf("dpni_set_buffer_layout() failed");
                goto err_buf_layout;
        }
 
@@ -919,8 +952,7 @@ err_open:
 static int ldpaa_dpni_bind(struct ldpaa_eth_priv *priv)
 {
        struct dpni_pools_cfg pools_params;
-       struct dpni_tx_flow_cfg dflt_tx_flow;
-       struct dpni_tx_conf_cfg tx_conf_cfg;
+       struct dpni_queue tx_queue;
        int err = 0;
 
        memset(&pools_params, 0, sizeof(pools_params));
@@ -934,26 +966,22 @@ static int ldpaa_dpni_bind(struct ldpaa_eth_priv *priv)
                return err;
        }
 
-       priv->tx_flow_id = DPNI_NEW_FLOW_ID;
-       memset(&dflt_tx_flow, 0, sizeof(dflt_tx_flow));
+       memset(&tx_queue, 0, sizeof(struct dpni_queue));
+
+       err = dpni_set_queue(dflt_mc_io, MC_CMD_NO_FLAGS,
+                            dflt_dpni->dpni_handle,
+                            DPNI_QUEUE_TX, 0, 0, &tx_queue);
 
-       dflt_tx_flow.use_common_tx_conf_queue = 0;
-       err = dpni_set_tx_flow(dflt_mc_io, MC_CMD_NO_FLAGS,
-                              dflt_dpni->dpni_handle, &priv->tx_flow_id,
-                              &dflt_tx_flow);
        if (err) {
-               printf("dpni_set_tx_flow() failed\n");
+               printf("dpni_set_queue() failed\n");
                return err;
        }
 
-       memset(&tx_conf_cfg, 0, sizeof(struct dpni_tx_conf_cfg));
-       tx_conf_cfg.errors_only = true;
-       /*Set tx-conf and error configuration*/
-       err = dpni_set_tx_conf(dflt_mc_io, MC_CMD_NO_FLAGS,
-                              dflt_dpni->dpni_handle,
-                              priv->tx_flow_id, &tx_conf_cfg);
+       err = dpni_set_tx_confirmation_mode(dflt_mc_io, MC_CMD_NO_FLAGS,
+                                           dflt_dpni->dpni_handle,
+                                           DPNI_CONF_DISABLE);
        if (err) {
-               printf("dpni_set_tx_conf() failed\n");
+               printf("dpni_set_tx_confirmation_mode() failed\n");
                return err;
        }
 
@@ -996,7 +1024,6 @@ int ldpaa_eth_init(int dpmac_id, phy_interface_t enet_if)
        struct ldpaa_eth_priv           *priv = NULL;
        int                             err = 0;
 
-
        /* Net device */
        net_dev = (struct eth_device *)malloc(sizeof(struct eth_device));
        if (!net_dev) {
index 3b161507359ef10a86a001247ca2c1a4c3cd7b3d..1e26630043a097e0c6ad4f2d0434dc3fb85aed67 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright (C) 2014 Freescale Semiconductor
+ * Copyright (C) 2014-2016 Freescale Semiconductor
+ * Copyright 2017 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -117,7 +118,7 @@ struct ldpaa_fas {
 
 struct ldpaa_eth_priv {
        struct eth_device *net_dev;
-       int dpmac_id;
+       uint32_t dpmac_id;
        uint16_t dpmac_handle;
 
        uint16_t tx_data_offset;
index ca27ee5736877a23fef42ed45e245c234064d2fa..c226913f9e8c2af9ef6252f59e3aa306ec0102e5 100644 (file)
@@ -161,7 +161,7 @@ static int msm_spmi_probe(struct udevice *dev)
                return -EINVAL;
 
        /* Scan peripherals connected to each SPMI channel */
-       for (i = 0; i < SPMI_MAX_CHANNELS ; i++) {
+       for (i = 0; i < SPMI_MAX_PERIPH ; i++) {
                uint32_t periph = readl(priv->arb_chnl + ARB_CHANNEL_OFFSET(i));
                uint8_t slave_id = (periph & 0xf0000) >> 16;
                uint8_t pid = (periph & 0xff00) >> 8;
index 944f58195cafb767672b9c6a360c6c96912b5181..73e036d6fd4ac32c128143f74dd853d7c6f7bdd5 100644 (file)
@@ -36,7 +36,7 @@ typedef struct global_data {
 #if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
        unsigned long fb_base;          /* Base address of framebuffer mem */
 #endif
-#if defined(CONFIG_POST) || defined(CONFIG_LOGBUFFER)
+#if defined(CONFIG_POST)
        unsigned long post_log_word;    /* Record POST activities */
        unsigned long post_log_res;     /* success of POST test */
        unsigned long post_init_f_time; /* When post_init_f started */
@@ -114,6 +114,11 @@ typedef struct global_data {
        struct bootstage_data *bootstage;       /* Bootstage information */
        struct bootstage_data *new_bootstage;   /* Relocated bootstage info */
 #endif
+#ifdef CONFIG_LOG
+       int log_drop_count;             /* Number of dropped log messages */
+       int default_log_level;          /* For devices with no filters */
+       struct list_head log_head;      /* List of struct log_device */
+#endif
 } gd_t;
 #endif
 
@@ -141,5 +146,6 @@ typedef struct global_data {
 #define GD_FLG_RECORD          0x01000 /* Record console                  */
 #define GD_FLG_ENV_DEFAULT     0x02000 /* Default variable flag           */
 #define GD_FLG_SPL_EARLY_INIT  0x04000 /* Early SPL init is done          */
+#define GD_FLG_LOG_READY       0x08000 /* Log system is ready for use     */
 
 #endif /* __ASM_GENERIC_GBL_DATA_H */
index 37a32784998aaf633a786ba31b9d87334bdb56fd..2662c2f7c9a68cf6647f6799a63ca9ba17fb28b7 100644 (file)
@@ -9,6 +9,8 @@
 #ifndef __CHARSET_H_
 #define __CHARSET_H_
 
+#include <linux/types.h>
+
 #define MAX_UTF8_PER_UTF16 3
 
 /**
@@ -62,4 +64,17 @@ uint16_t *utf16_strdup(const uint16_t *s);
  */
 uint8_t *utf16_to_utf8(uint8_t *dest, const uint16_t *src, size_t size);
 
+/**
+ * utf8_to_utf16() - Convert an utf8 string to utf16
+ *
+ * Converts up to 'size' characters of the utf16 string 'src' to utf8
+ * written to the 'dest' buffer. Stops at 0x00.
+ *
+ * @dest   the destination buffer to write the utf8 characters
+ * @src    the source utf16 string
+ * @size   maximum number of utf16 characters to convert
+ * @return the pointer to the first unwritten byte in 'dest'
+ */
+uint16_t *utf8_to_utf16(uint16_t *dest, const uint8_t *src, size_t size);
+
 #endif /* __CHARSET_H_ */
index 6e2454517891b1751c4f890a8d37d198642f0d48..436200044f3272be4ed1a19f5575d2a4cb8270f7 100644 (file)
@@ -45,51 +45,7 @@ typedef volatile unsigned char       vu_char;
 #define CONFIG_SYS_SUPPORT_64BIT_DATA
 #endif
 
-#ifdef DEBUG
-#define _DEBUG 1
-#else
-#define _DEBUG 0
-#endif
-
-#ifdef CONFIG_SPL_BUILD
-#define _SPL_BUILD     1
-#else
-#define _SPL_BUILD     0
-#endif
-
-/*
- * Output a debug text when condition "cond" is met. The "cond" should be
- * computed by a preprocessor in the best case, allowing for the best
- * optimization.
- */
-#define debug_cond(cond, fmt, args...)                 \
-       do {                                            \
-               if (cond)                               \
-                       printf(pr_fmt(fmt), ##args);    \
-       } while (0)
-
-/* Show a message if DEBUG is defined in a file */
-#define debug(fmt, args...)                    \
-       debug_cond(_DEBUG, fmt, ##args)
-
-/* Show a message if not in SPL */
-#define warn_non_spl(fmt, args...)                     \
-       debug_cond(!_SPL_BUILD, fmt, ##args)
-
-/*
- * An assertion is run-time check done in debug mode only. If DEBUG is not
- * defined then it is skipped. If DEBUG is defined and the assertion fails,
- * then it calls panic*( which may or may not reset/halt U-Boot (see
- * CONFIG_PANIC_HANG), It is hoped that all failing assertions are found
- * before release, and after release it is hoped that they don't matter. But
- * in any case these failing assertions cannot be fixed with a reset (which
- * may just do the same assertion again).
- */
-void __assert_fail(const char *assertion, const char *file, unsigned line,
-                  const char *function);
-#define assert(x) \
-       ({ if (!(x) && _DEBUG) \
-               __assert_fail(#x, __FILE__, __LINE__, __func__); })
+#include <log.h>
 
 typedef void (interrupt_handler_t)(void *);
 
index b6715418fc8cd0ae59a328156968fe7524559b05..bd1a7b267930028de906409049ddde3c7fa85eb6 100644 (file)
 /*
  * SATA
  */
-#define CONFIG_LIBATA
-#define CONFIG_FSL_SATA
-
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
 #define CONFIG_SATA1
 #define CONFIG_SYS_SATA1_OFFSET        0x18000
index d06d4a28170f4be171abb10f0e3b080f33fc8e87..c88aa9563221028ebec081f6473af7defd5fca9a 100644 (file)
@@ -67,7 +67,6 @@
 /* The CF card interface on the back of the board */
 #define CONFIG_COMPACT_FLASH
 #define CONFIG_VSC7385_ENET    /* VSC7385 ethernet support */
-#define CONFIG_SATA_SIL3114    /* SIL3114 SATA controller */
 #define CONFIG_SYS_USB_HOST    /* use the EHCI USB controller */
 #endif
 
 #ifdef CONFIG_SATA_SIL3114
 
 #define CONFIG_SYS_SATA_MAX_DEVICE      4
-#define CONFIG_LIBATA
 #define CONFIG_LBA48
 
 #endif
index 264aa90cb3082446ab57130049f8aca90f23dfe1..3cc1a4717b6406cbce047be5efbc6749404b4c82 100644 (file)
@@ -420,9 +420,6 @@ extern int board_pci_host_broken(void);
 /*
  * SATA
  */
-#define CONFIG_LIBATA
-#define CONFIG_FSL_SATA
-
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
 #define CONFIG_SATA1
 #define CONFIG_SYS_SATA1_OFFSET        0x18000
index beec38f9342be98c67101aac1caba3dd463760c2..656180f91a8bc8e7ee862c1927ab7a2c745b53da 100644 (file)
 /*
  * SATA
  */
-#define CONFIG_LIBATA
-#define CONFIG_FSL_SATA
-
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
 #define CONFIG_SATA1
 #define CONFIG_SYS_SATA1_OFFSET        0x18000
index 3319a6f958dc9f1858654e779c2da27f3cd2abf5..7587225bda67a5c719f3a71ff6567e793eb8d7ec 100644 (file)
 #endif /* CONFIG_PCI */
 
 /* SATA */
-#define CONFIG_LIBATA
-#define CONFIG_FSL_SATA
-
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
 #define CONFIG_SATA1
 #define CONFIG_SYS_SATA1               CONFIG_SYS_MPC85xx_SATA1_ADDR
index 2aea8928eed7f6a92086ef944b22003591297fe2..bec8a09b5f324a5e7b4de2f09f88608d112bccac 100644 (file)
@@ -282,10 +282,8 @@ extern unsigned long get_board_sys_clk(unsigned long dummy);
 #endif
 
 #define CONFIG_PCI_SCAN_SHOW           /* show pci devices on startup */
-#define CONFIG_SCSI_AHCI
 
 #ifdef CONFIG_SCSI_AHCI
-#define CONFIG_LIBATA
 #define CONFIG_SATA_ULI5288
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    4
 #define CONFIG_SYS_SCSI_MAX_LUN        1
index b277cdb1c66e1f209c488ef181a6022d9b352aee..ebc2e3aad493e162553ed3dece03e9ebee217f59 100644 (file)
 #endif
 
 #define CONFIG_PCI_SCAN_SHOW           /* show pci devices on startup */
-#define CONFIG_SCSI_AHCI
 
 #ifdef CONFIG_SCSI_AHCI
-#define CONFIG_LIBATA
 #define CONFIG_SATA_ULI5288
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    4
 #define CONFIG_SYS_SCSI_MAX_LUN        1
index e7b59a3d65ae75cfa98d04fd01cd3dcbbd2d56ca..bd14bc0607eb748bb85a30e611013de2d9c5f971 100644 (file)
 #define PCI_IDSEL_NUMBER       0x0c    /* slot0->3(IDSEL)=12->15 */
 #endif
 
-#define CONFIG_SCSI_AHCI
-
 #ifdef CONFIG_SCSI_AHCI
-#define CONFIG_LIBATA
 #define CONFIG_SATA_ULI5288
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    4
 #define CONFIG_SYS_SCSI_MAX_LUN        1
index 298fe5a63de6a446af1bbd31b208524518e8780b..567111798bf2c6f5976240911a147b723ebda71c 100644 (file)
@@ -373,10 +373,7 @@ extern unsigned long get_board_sys_clk(unsigned long dummy);
 
 #undef CONFIG_PCI_SCAN_SHOW            /* show pci devices on startup */
 
-#define CONFIG_SCSI_AHCI
-
 #ifdef CONFIG_SCSI_AHCI
-#define CONFIG_LIBATA
 #define CONFIG_SATA_ULI5288
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    4
 #define CONFIG_SYS_SCSI_MAX_LUN        1
index cbc15ae4c51ad8d1fc2651676dee489657a123e9..72b6e3ad6d2a86714a3ae69302233341e449bb08 100644 (file)
@@ -634,9 +634,7 @@ extern unsigned long get_sdram_size(void);
 #endif /* CONFIG_TSEC_ENET */
 
 /* SATA */
-#define CONFIG_FSL_SATA
 #define CONFIG_FSL_SATA_V2
-#define CONFIG_LIBATA
 
 #ifdef CONFIG_FSL_SATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
index 4756a7102da061f56191fa86e5c34d49d556e263..30e20bc6e48a81f0c78b22ce64756176ba25e51e 100644 (file)
 #endif
 
 /* SATA */
-#define CONFIG_LIBATA
-#define CONFIG_FSL_SATA
 #define CONFIG_FSL_SATA_V2
 
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
index 600823798c72019d85d10b70fe7e8ac1fe4235b5..917e5d5a064e454c174beff9568559fca3d55c50 100644 (file)
@@ -527,9 +527,6 @@ unsigned long get_board_sys_clk(unsigned long dummy);
 #define CONFIG_FSL_SATA_V2
 
 #ifdef CONFIG_FSL_SATA_V2
-#define CONFIG_FSL_SATA
-#define CONFIG_LIBATA
-
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
 #define CONFIG_SATA1
 #define CONFIG_SYS_SATA1               CONFIG_SYS_MPC85xx_SATA1_ADDR
index f192181c0844c00a44f49eeebcf5d37a74153606..117def9dc2fed4b62569ff8b34b632366f4c9dcc 100644 (file)
@@ -12,9 +12,7 @@
 
 #define CONFIG_PCIE3
 
-#define CONFIG_SATA_SIL
 #define CONFIG_SYS_SATA_MAX_DEVICE  2
-#define CONFIG_LIBATA
 #define CONFIG_LBA48
 
 #define CONFIG_SYS_SRIO
index 259e8a01f38ddb4f40346a05cc358f72d90eb6be..ed6df539167e99e8621bed022fe81efb1f372f84 100644 (file)
@@ -615,8 +615,6 @@ unsigned long get_board_ddr_clk(void);
  */
 #define CONFIG_FSL_SATA_V2
 #ifdef CONFIG_FSL_SATA_V2
-#define CONFIG_LIBATA
-#define CONFIG_FSL_SATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
 #define CONFIG_SATA1
 #define CONFIG_SYS_SATA1               CONFIG_SYS_MPC85xx_SATA1_ADDR
index c694e50c2c2e8ea062a172c66bcaec229fb00671..bc5c0d2e68f3ab839382ef525d72b139de1d3062 100644 (file)
@@ -500,9 +500,6 @@ unsigned long get_board_ddr_clk(void);
 /* SATA */
 #define CONFIG_FSL_SATA_V2
 #ifdef CONFIG_FSL_SATA_V2
-#define CONFIG_LIBATA
-#define CONFIG_FSL_SATA
-
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
 #define CONFIG_SATA1
 #define CONFIG_SYS_SATA1               CONFIG_SYS_MPC85xx_SATA1_ADDR
index 2dbeffdd2a97ad92638e1696a0e405b7d683face..2b9c77f7c882b8880d27bf8fda1ee33e0be7d79c 100644 (file)
@@ -614,9 +614,6 @@ $(SRCTREE)/board/freescale/t104xrdb/t1042d4_sd_rcw.cfg
 /* SATA */
 #define CONFIG_FSL_SATA_V2
 #ifdef CONFIG_FSL_SATA_V2
-#define CONFIG_LIBATA
-#define CONFIG_FSL_SATA
-
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
 #define CONFIG_SATA1
 #define CONFIG_SYS_SATA1               CONFIG_SYS_MPC85xx_SATA1_ADDR
@@ -634,6 +631,7 @@ $(SRCTREE)/board/freescale/t104xrdb/t1042d4_sd_rcw.cfg
 #ifdef CONFIG_USB_EHCI_HCD
 #define CONFIG_USB_EHCI_FSL
 #define CONFIG_EHCI_HCD_INIT_AFTER_RESET
+#define CONFIG_EHCI_DESC_BIG_ENDIAN
 #endif
 #endif
 
index 41926f76e68a920b2ab4c1de6b0dd131b291ab9a..43fcc6f5ddc4499847cb429c3445e72c732e47b4 100644 (file)
@@ -678,8 +678,6 @@ unsigned long get_board_ddr_clk(void);
  * SATA
  */
 #ifdef CONFIG_FSL_SATA_V2
-#define CONFIG_LIBATA
-#define CONFIG_FSL_SATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
 #define CONFIG_SATA1
 #define CONFIG_SYS_SATA1               CONFIG_SYS_MPC85xx_SATA1_ADDR
index d2ddb17fce25d59f3f7ec0575ebfeb3c279f2e4d..e1c57de2af790a7613acac146782e4795a441b97 100644 (file)
@@ -628,8 +628,6 @@ unsigned long get_board_ddr_clk(void);
  * SATA
  */
 #ifdef CONFIG_FSL_SATA_V2
-#define CONFIG_LIBATA
-#define CONFIG_FSL_SATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
 #define CONFIG_SATA1
 #define CONFIG_SYS_SATA1               CONFIG_SYS_MPC85xx_SATA1_ADDR
index 885dc776eb96def8fe58a7db0ab7bd8747e104d3..099e9e1d94ce838278f76e68acebefb9cc68e5ce 100644 (file)
@@ -468,9 +468,6 @@ unsigned long get_board_ddr_clk(void);
 
 /* SATA */
 #ifdef CONFIG_FSL_SATA_V2
-#define CONFIG_LIBATA
-#define CONFIG_FSL_SATA
-
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
 #define CONFIG_SATA1
 #define CONFIG_SYS_SATA1               CONFIG_SYS_MPC85xx_SATA1_ADDR
index 625130aafcb81d69fa1e694647c09097bda8874b..98f8f4f10c5838778f695a66c39320a71cab2db1 100644 (file)
 
 /* SATA */
 #ifdef CONFIG_FSL_SATA_V2
-#define CONFIG_LIBATA
-#define CONFIG_FSL_SATA
-
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
 #define CONFIG_SATA1
 #define CONFIG_SYS_SATA1               CONFIG_SYS_MPC85xx_SATA1_ADDR
@@ -635,9 +632,6 @@ unsigned long get_board_ddr_clk(void);
 
 /* SATA */
 #ifdef CONFIG_FSL_SATA_V2
-#define CONFIG_LIBATA
-#define CONFIG_FSL_SATA
-
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
 #define CONFIG_SATA1
 #define CONFIG_SYS_SATA1               CONFIG_SYS_MPC85xx_SATA1_ADDR
index 902abc48cecc7fa36055cd2864497209854d8682..e8b1a74c64a82414c4ee1dd7407419297e8f7407 100644 (file)
 
 #define CONFIG_ENV_OVERWRITE
 
-#define CONFIG_SATA_SIL
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
-#define CONFIG_LIBATA
 #define CONFIG_LBA48
 
 #define CONFIG_SYS_CLK_FREQ    66666666
index 09f470c6b56f4466eb97e32fb36630822a063a1e..f370fe5b7814f350d4f9db930941b3363cff5bea 100644 (file)
 #define CONFIG_MXC_OCOTP
 
 /* SATA Configs */
-#define CONFIG_DWC_AHSATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
 #define CONFIG_DWC_AHSATA_PORT_ID      0
 #define CONFIG_DWC_AHSATA_BASE_ADDR    SATA_ARB_BASE_ADDR
 #define CONFIG_LBA48
-#define CONFIG_LIBATA
 
 /* MMC Configs */
 #define CONFIG_FSL_ESDHC
index dc05bea05e98804275533403262d655b4e7cb789..28618a579cd89cc7afae8466aec7a19fb37e2c6e 100644 (file)
@@ -96,8 +96,6 @@
 #define CONFIG_OMAP_USB3PHY1_HOST
 
 /* SATA */
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    1
 #define CONFIG_SYS_SCSI_MAX_LUN                1
index 5a51f3c5560a232b8fa939b552ef7d19b903c12d..c4e93562b5fca24c30aeb7e6f0b48267885190b9 100644 (file)
  * SATA Configs
  */
 #ifdef CONFIG_CMD_SATA
-#define CONFIG_DWC_AHSATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
 #define CONFIG_DWC_AHSATA_PORT_ID      0
 #define CONFIG_DWC_AHSATA_BASE_ADDR    SATA_ARB_BASE_ADDR
 #define CONFIG_LBA48
-#define CONFIG_LIBATA
 #endif
 
 /* Network */
index 2e8993d7d4c6a0f743d1426165757ade909e301a..b50535f9b06b65c161e02f85f8ac7eb53c9016be 100644 (file)
 #define CONFIG_IMX_HDMI
 
 /* SATA */
-#define CONFIG_DWC_AHSATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
 #define CONFIG_DWC_AHSATA_PORT_ID      0
 #define CONFIG_DWC_AHSATA_BASE_ADDR    SATA_ARB_BASE_ADDR
 #define CONFIG_LBA48
-#define CONFIG_LIBATA
 
 /* Ethernet */
 #define CONFIG_FEC_MXC
index a3b40ab1966f78a3254f6e8a5f91a5d12c6afa9f..6935b06d5c15ac91c014296bae206cbc518a75fa 100644 (file)
@@ -62,8 +62,6 @@
 
 #ifndef CONFIG_SPL_BUILD
 /* SATA */
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    1
 #define CONFIG_SYS_SCSI_MAX_LUN                1
index da3233e965b4fd7d02059f6487989f6351307a70..51956102335105e974821906c24b0fed8fe6cf22 100644 (file)
 
 /* SATA */
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
-#define CONFIG_LIBATA
 #define CONFIG_LBA48
-#define CONFIG_DWC_AHSATA
 #define CONFIG_DWC_AHSATA_PORT_ID      0
 #define CONFIG_DWC_AHSATA_BASE_ADDR    SATA_ARB_BASE_ADDR
 
index 9152c71717e31e8c247106bb5af4f7ec435cc099..1351eb85f2f7b55441b438d02e6e91dbaf25131b 100644 (file)
@@ -47,8 +47,6 @@
 #define CONFIG_SPL_SATA_BOOT_DEVICE            0
 #define CONFIG_SYS_SATA_FAT_BOOT_PARTITION     1
 
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    1
 #define CONFIG_SYS_SCSI_MAX_LUN                1
index 37c8be48ace1adf7915751e859caeaf77050395b..4312ddd4fc64fb0a0f93f34efae31f38f65be631 100644 (file)
 /*
  * SATA
  */
-#define CONFIG_LIBATA
 #define CONFIG_LBA48
 
-#define CONFIG_FSL_SATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
 #define CONFIG_SATA1
 #define CONFIG_SYS_SATA1               CONFIG_SYS_MPC85xx_SATA1_ADDR
index 715e9ed9c902b74196141776f9e343eb7f0703ea..a882fa650b987dfc33dbed711ae5fd8ecbf48367 100644 (file)
@@ -48,8 +48,6 @@
 /*
  * SATA/SCSI/AHCI configuration
  */
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    2
 #define CONFIG_SYS_SCSI_MAX_LUN                1
index 0dbf149725dc291fc598c89d9b45d27727c70245..d0e8bfbed7713d12bef0b41efe377e59bf71fd13 100644 (file)
 
 /* SATA */
 #ifdef CONFIG_FSL_SATA_V2
-#define CONFIG_LIBATA
-#define CONFIG_FSL_SATA
-
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
 #define CONFIG_SATA1
 #define CONFIG_SYS_SATA1               CONFIG_SYS_MPC85xx_SATA1_ADDR
index 1b20d85acfc5136336721cea5f49ef2a98563e08..4fea53bf797cdb6801ddd069eda874f1a09dfa0a 100644 (file)
 
 /* SATA */
 #ifdef CONFIG_FSL_SATA_V2
-#define CONFIG_LIBATA
-#define CONFIG_FSL_SATA
-
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
 #define CONFIG_SATA1
 #define CONFIG_SYS_SATA1               CONFIG_SYS_MPC85xx_SATA1_ADDR
index 44fd968d3b6ec751c38568ea5eea6ba58c7d3ac1..32f93f2f46e9d63f3def6e7ebf0b96dca10af306 100644 (file)
@@ -44,8 +44,6 @@
 /*
  * SATA/SCSI/AHCI configuration
  */
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    2
 #define CONFIG_SYS_SCSI_MAX_LUN                1
index 4a5be6188f1131da6e4de0ca525520c0f80b158b..3dcc28710bb1765ac859addac682e1c97f9d228f 100644 (file)
@@ -49,8 +49,6 @@
 
 /* SATA support */
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
-#define CONFIG_SATA_MV
-#define CONFIG_LIBATA
 #define CONFIG_LBA48
 
 /* Additional FS support/configuration */
index 11a01d476fbcfbb8e38eefdea6a76f37c8f1cbbc..fb49997ebd3aed87fe663f24c048b1113b5d46cd 100644 (file)
 
 /* SATA Configs */
 #ifdef CONFIG_CMD_SATA
-#define CONFIG_DWC_AHSATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
 #define CONFIG_DWC_AHSATA_PORT_ID      0
 #define CONFIG_DWC_AHSATA_BASE_ADDR    SATA_ARB_BASE_ADDR
 #define CONFIG_LBA48
-#define CONFIG_LIBATA
 #endif
 
 /* SPI Flash Configs */
index f84c1f014673ecd5bcecddea88b8300bea705ffe..f777d576dd35eed5801a8a23bd7e12235554f513 100644 (file)
 #define CONFIG_OMAP_USB2PHY2_HOST
 
 /* SATA */
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    1
 #define CONFIG_SYS_SCSI_MAX_LUN                1
index 17d23839b8f25de57ab7770f02cfe5f98e68c1b7..2b7a5d7c5cfb9fd746e06162cc2c2e987e30966a 100644 (file)
 #define __io
 #define CONFIG_IDE_PREINIT
 /* ED Mini V has an IDE-compatible SATA connector for port 1 */
-#define CONFIG_MVSATA_IDE
 #define CONFIG_MVSATA_IDE_USE_PORT1
 /* Needs byte-swapping for ATA data register */
 #define CONFIG_IDE_SWAP_IO
index 43935bf4b4f64d069dd5fe06c0e30fdf495cd75c..b0276151398f40d23986c6062a0a4a378c6eb58e 100644 (file)
@@ -11,8 +11,6 @@
 
 #undef CONFIG_TPM_TIS_BASE_ADDRESS
 
-#undef CONFIG_SCSI_AHCI
-
 #define CONFIG_STD_DEVICES_SETTINGS     "stdin=usbkbd,vga,serial\0" \
                                        "stdout=vga,serial\0" \
                                        "stderr=vga,serial\0"
index 00c5434125c9ff40d9ae439048c6ce95427244d6..cf798d07e790e7090e785490a1a0d87f48b04511 100644 (file)
@@ -22,9 +22,6 @@
                                        "stdout=serial\0" \
                                        "stderr=serial\0"
 
-/* SATA is not supported in Quark SoC */
-#undef CONFIG_SCSI_AHCI
-
 /* 10/100M Ethernet support */
 #define CONFIG_DESIGNWARE_ETH
 #define CONFIG_DW_ALTDESCRIPTOR
index 33f5101c145f08f6e8cee4a6a99405c60cc24957..1454577dbfc49eaa320e08cd3fede8f7e5e31e17 100644 (file)
 
 /* SATA Configs */
 #ifdef CONFIG_CMD_SATA
-#define CONFIG_DWC_AHSATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
 #define CONFIG_DWC_AHSATA_PORT_ID      0
 #define CONFIG_DWC_AHSATA_BASE_ADDR    SATA_ARB_BASE_ADDR
 #define CONFIG_LBA48
-#define CONFIG_LIBATA
 #endif
 
 /* MMC Configs */
index 05c88b3ef85c8c8d68ab97142f18bdd16846610c..068962d6135405da53f77fdf044e4199e218b658 100644 (file)
  * SATA Configs
  */
 #ifdef CONFIG_CMD_SATA
-  #define CONFIG_DWC_AHSATA
   #define CONFIG_SYS_SATA_MAX_DEVICE   1
   #define CONFIG_DWC_AHSATA_PORT_ID    0
   #define CONFIG_DWC_AHSATA_BASE_ADDR  SATA_ARB_BASE_ADDR
   #define CONFIG_LBA48
-  #define CONFIG_LIBATA
 #endif
 
 /*
index b2b2c2500aff5f0b4860906a46952cb9412e09f4..a5a524008b4a216da740655e1ebf3bdc90124bc2 100644 (file)
@@ -33,8 +33,6 @@
 #define CONFIG_SYS_BOOTCOUNT_ADDR      0xfff3cf0c
 
 #define CONFIG_MISC_INIT_R
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    5
 #define CONFIG_SYS_SCSI_MAX_LUN                1
index d2fa50a8be752956a54de7a91615f1f9c40dd6f9..57cae9498cbd20565a4664cb436491e814444546 100644 (file)
@@ -65,7 +65,7 @@
 #define CONFIG_ENV_OVERWRITE
 
 #define CONFIG_ENV_SIZE                        0x40000          /* 256KB */
-#define CONFIG_ENV_OFFSET              0x200000        /* 2MB */
+#define CONFIG_ENV_OFFSET              0x300000        /* 3MB */
 #define CONFIG_ENV_SECT_SIZE           0x40000
 #endif
 
@@ -94,7 +94,7 @@
        "kernel_addr=0x100000\0"                \
        "fdt_high=0xffffffffffffffff\0"         \
        "initrd_high=0xffffffffffffffff\0"      \
-       "kernel_start=0xa00000\0"               \
+       "kernel_start=0x1000000\0"              \
        "kernel_load=0xa0000000\0"              \
        "kernel_size=0x2800000\0"               \
 
index efb4c00cd91e0b1eae73317ac5ed82b575265b7d..5b4bf288e759cf6283e9f1f8f3c512cebaac7dd4 100644 (file)
@@ -27,7 +27,7 @@
        "kernel_addr=0x100000\0"                \
        "fdt_high=0xffffffffffffffff\0"         \
        "initrd_high=0xffffffffffffffff\0"      \
-       "kernel_start=0xa00000\0"               \
+       "kernel_start=0x1000000\0"              \
        "kernel_load=0x96000000\0"              \
        "kernel_size=0x2800000\0"
 
index d15054709ec082c206aac6cb26f4ebbe3ea7552c..af5f37cca3fbc726d59d7af57c0271e2cefdad70 100644 (file)
 #endif
 
 /* SATA */
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 
 #define CONFIG_SYS_SATA                                AHCI_BASE_ADDR
index 794117062f4da32079ce23f8b2f0129003f27fc9..89aa952dc61ff6a9adf7773458c051d87b3e8049 100644 (file)
@@ -40,8 +40,6 @@
 #endif
 
 /* SATA */
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 
 #define CONFIG_SYS_SATA                                AHCI_BASE_ADDR
index 46bf55f89171fdd638fab6506e56f2c7f8f1a5c4..4a63efc5ef893a3fbd9885b342c382e5101eb5b5 100644 (file)
 #define CONFIG_FSL_ESDHC
 
 /* SATA */
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 #ifndef PCI_DEVICE_ID_FREESCALE_AHCI
 #define PCI_DEVICE_ID_FREESCALE_AHCI   0x0440
index 5be61ad7b6b544b5e6cc65d29f46e684f924c99d..3db7ef12b07243931440b165c2376b761a842708 100644 (file)
        "initrd_high=0xffffffff\0"      \
        "fdt_high=0xffffffff\0"         \
        "fdt_addr=0x64f00000\0"         \
-       "kernel_addr=0x65000000\0"      \
+       "kernel_addr=0x61000000\0"      \
+       "kernelheader_addr=0x60800000\0"        \
        "scriptaddr=0x80000000\0"       \
        "scripthdraddr=0x80080000\0"    \
        "fdtheader_addr_r=0x80100000\0" \
        "kernelheader_addr_r=0x80200000\0"      \
        "kernel_addr_r=0x81000000\0"    \
+       "kernelheader_size=0x40000\0"   \
        "fdt_addr_r=0x90000000\0"       \
        "ramdisk_addr_r=0xa0000000\0"   \
        "load_addr=0xa0000000\0"        \
        "kernel_size=0x2800000\0"       \
+       "kernel_addr_sd=0x8000\0"       \
+       "kernel_size_sd=0x14000\0"      \
+       "kernelhdr_addr_sd=0x4000\0"            \
+       "kernelhdr_size_sd=0x10\0"              \
        BOOTENV                         \
        "boot_scripts=ls1021atwr_boot.scr\0"    \
        "boot_script_hdr=hdr_ls1021atwr_bs.out\0"       \
                "source ${scriptaddr}\0"          \
        "qspi_bootcmd=echo Trying load from qspi..;"    \
                "sf probe && sf read $load_addr "       \
-               "$kernel_addr $kernel_size && bootm $load_addr#$board\0"        \
+               "$kernel_addr $kernel_size; env exists secureboot "     \
+               "&& sf read $kernelheader_addr_r $kernelheader_addr "   \
+               "$kernelheader_size && esbc_validate ${kernelheader_addr_r}; " \
+               "bootm $load_addr#$board\0" \
        "nor_bootcmd=echo Trying load from nor..;"      \
                "cp.b $kernel_addr $load_addr "         \
-               "$kernel_size && bootm $load_addr#$board\0" \
+               "$kernel_size; env exists secureboot "  \
+               "&& cp.b $kernelheader_addr $kernelheader_addr_r "      \
+               "$kernelheader_size && esbc_validate ${kernelheader_addr_r}; " \
+               "bootm $load_addr#$board\0"     \
        "sd_bootcmd=echo Trying load from SD ..;"       \
                "mmcinfo && mmc read $load_addr "       \
                "$kernel_addr_sd $kernel_size_sd && "   \
+               "env exists secureboot && mmc read $kernelheader_addr_r "               \
+               "$kernelhdr_addr_sd $kernelhdr_size_sd "                \
+               " && esbc_validate ${kernelheader_addr_r};"     \
                "bootm $load_addr#$board\0"
 #endif
 
 #undef CONFIG_BOOTCOMMAND
 #if defined(CONFIG_QSPI_BOOT) || defined(CONFIG_SD_BOOT_QSPI)
-#define CONFIG_BOOTCOMMAND "run distro_bootcmd; env exists secureboot" \
-                          "&& esbc_halt; run qspi_bootcmd;"
+#define CONFIG_BOOTCOMMAND "run distro_bootcmd; run qspi_bootcmd"      \
+                          "env exists secureboot && esbc_halt"
 #elif defined(CONFIG_SD_BOOT)
-#define CONFIG_BOOTCOMMAND "run distro_bootcmd; env exists secureboot"  \
-                          "&& esbc_halt; run sd_bootcmd;"
+#define CONFIG_BOOTCOMMAND "run distro_bootcmd; run sd_bootcmd; "      \
+                          "env exists secureboot && esbc_halt;"
 #else
-#define CONFIG_BOOTCOMMAND "run distro_bootcmd; env exists secureboot" \
-                          "&& esbc_halt; run nor_bootcmd;"
+#define CONFIG_BOOTCOMMAND "run distro_bootcmd; run nor_bootcmd;"      \
+                          "env exists secureboot && esbc_halt;"
 #endif
 
 /*
index a4cd09aa90d5d68bccb7f02959adfd0cdfb28d7d..67b5ea715e860f8508a69f8b3a42b8c50a9dbb12 100644 (file)
        "fdt_high=0xffffffffffffffff\0"         \
        "initrd_high=0xffffffffffffffff\0"      \
        "fdt_addr=0x64f00000\0"                 \
-       "kernel_addr=0x65000000\0"              \
+       "kernel_addr=0x61000000\0"              \
        "scriptaddr=0x80000000\0"               \
        "scripthdraddr=0x80080000\0"            \
        "fdtheader_addr_r=0x80100000\0"         \
        "kernel_addr_r=0x81000000\0"            \
        "fdt_addr_r=0x90000000\0"               \
        "load_addr=0xa0000000\0"                \
+       "kernelheader_addr=0x60800000\0"        \
        "kernel_size=0x2800000\0"               \
+       "kernelheader_size=0x40000\0"           \
        "kernel_addr_sd=0x8000\0"               \
        "kernel_size_sd=0x14000\0"              \
+       "kernelhdr_addr_sd=0x4000\0"            \
+       "kernelhdr_size_sd=0x10\0"              \
        "console=ttyS0,115200\0"                \
        "boot_os=y\0"                           \
        "mtdparts=" CONFIG_MTDPARTS_DEFAULT "\0"        \
                "source ${scriptaddr}\0"                        \
        "qspi_bootcmd=echo Trying load from qspi..;"    \
                "sf probe && sf read $load_addr "       \
-               "$kernel_addr $kernel_size && bootm $load_addr#$board\0" \
+               "$kernel_addr $kernel_size; env exists secureboot "     \
+               "&& sf read $kernelheader_addr_r $kernelheader_addr "   \
+               "$kernelheader_size && esbc_validate ${kernelheader_addr_r}; " \
+               "bootm $load_addr#$board\0"     \
        "nor_bootcmd=echo Trying load from nor..;"      \
                "cp.b $kernel_addr $load_addr " \
-               "$kernel_size && bootm $load_addr#$board\0" \
+               "$kernel_size; env exists secureboot "  \
+               "&& cp.b $kernelheader_addr $kernelheader_addr_r "      \
+               "$kernelheader_size && esbc_validate ${kernelheader_addr_r}; " \
+               "bootm $load_addr#$board\0"         \
        "sd_bootcmd=echo Trying load from SD ..;"       \
                "mmcinfo; mmc read $load_addr "         \
                "$kernel_addr_sd $kernel_size_sd && "     \
+               "env exists secureboot && mmc read $kernelheader_addr_r "               \
+               "$kernelhdr_addr_sd $kernelhdr_size_sd "                \
+               " && esbc_validate ${kernelheader_addr_r};"     \
                "bootm $load_addr#$board\0"
 
 
 #undef CONFIG_BOOTCOMMAND
 #if defined(CONFIG_QSPI_BOOT) || defined(CONFIG_SD_BOOT_QSPI)
-#define CONFIG_BOOTCOMMAND "run distro_bootcmd; env exists secureboot" \
-                          "&& esbc_halt; run qspi_bootcmd;"
+#define CONFIG_BOOTCOMMAND "run distro_bootcmd; run qspi_bootcmd; "    \
+                          "env exists secureboot && esbc_halt;"
 #elif defined(CONFIG_SD_BOOT)
-#define CONFIG_BOOTCOMMAND "run distro_bootcmd; env exists secureboot"  \
-                          "&& esbc_halt; run sd_bootcmd;"
+#define CONFIG_BOOTCOMMAND "run distro_bootcmd; run sd_bootcmd; "  \
+                          "env exists secureboot && esbc_halt;"
 #else
-#define CONFIG_BOOTCOMMAND "run distro_bootcmd; env exists secureboot" \
-                          "&& esbc_halt; run nor_bootcmd;"
+#define CONFIG_BOOTCOMMAND "run distro_bootcmd; run nor_bootcmd; "     \
+                          "env exists secureboot && esbc_halt;"
 #endif
 #endif
 
index 8cc2abb2b6bd3ed46336622fc885b5164392cabb..a7f78f46ae5079c4b715b04a15ab5bb2c9268eea 100644 (file)
@@ -94,8 +94,6 @@ unsigned long get_board_ddr_clk(void);
 #endif
 
 /* SATA */
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 
 /* EEPROM */
index b4b4d5e178fb6e2eddaba8976bad575cf7695038..34f82281c839ac74f3f11df5927915e9b3280db1 100644 (file)
 
 /* SATA */
 #ifndef SPL_NO_SATA
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #ifndef CONFIG_CMD_EXT2
 #define CONFIG_CMD_EXT2
 #endif
index 11f2a28743e741e271e82a86883ce9e7e3f47288..e208f7d2de78a7d450255523f75f28602dbd3494 100644 (file)
        "fdt_addr_r=0x90000000\0"               \
        "ramdisk_addr_r=0xa0000000\0"           \
        "kernel_start=0x1000000\0"              \
+       "kernelheader_start=0x800000\0"         \
        "kernel_load=0xa0000000\0"              \
        "kernel_size=0x2800000\0"               \
+       "kernelheader_size=0x40000\0"           \
        "kernel_addr_sd=0x8000\0"               \
        "kernel_size_sd=0x14000\0"              \
+       "kernelhdr_addr_sd=0x4000\0"            \
+       "kernelhdr_size_sd=0x10\0"              \
        "console=ttyS0,115200\0"                \
         CONFIG_MTDPARTS_DEFAULT "\0"           \
        BOOTENV                                 \
                "source ${scriptaddr}\0"          \
        "qspi_bootcmd=echo Trying load from qspi..;"      \
                "sf probe && sf read $load_addr "         \
-               "$kernel_start $kernel_size && bootm $load_addr#$board\0" \
+               "$kernel_start $kernel_size; env exists secureboot "    \
+               "&& sf read $kernelheader_addr_r $kernelheader_start "  \
+               "$kernelheader_size && esbc_validate ${kernelheader_addr_r}; " \
+               "bootm $load_addr#$board\0"             \
        "sd_bootcmd=echo Trying load from SD ..;"       \
                "mmcinfo; mmc read $load_addr "         \
                "$kernel_addr_sd $kernel_size_sd && "   \
+               "env exists secureboot && mmc read $kernelheader_addr_r "               \
+               "$kernelhdr_addr_sd $kernelhdr_size_sd "                \
+               " && esbc_validate ${kernelheader_addr_r};"     \
                "bootm $load_addr#$board\0"
 
 #endif
index 1713e2c031e9b04c83a0f480e6f9b481ab4ec91e..f510f2457a58d009c7ec3a488487bbad1b3b142e 100644 (file)
@@ -137,8 +137,6 @@ unsigned long get_board_ddr_clk(void);
 #endif
 
 /* SATA */
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 
 /* EEPROM */
index d001b8027017957afd88387e5aeb95ae31dd093c..784894f0b7b94973cabbeb5fb615690b3267d894 100644 (file)
 
 /* SATA */
 #ifndef SPL_NO_SATA
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 
 #define CONFIG_SYS_SATA                                AHCI_BASE_ADDR
 #ifndef SPL_NO_MISC
 #undef CONFIG_BOOTCOMMAND
 #if defined(CONFIG_QSPI_BOOT)
-#define CONFIG_BOOTCOMMAND "run distro_bootcmd; env exists secureboot" \
-                          "&& esbc_halt; run qspi_bootcmd;"
+#define CONFIG_BOOTCOMMAND "run distro_bootcmd; run qspi_bootcmd; "    \
+                          "env exists secureboot && esbc_halt;;"
 #elif defined(CONFIG_SD_BOOT)
-#define CONFIG_BOOTCOMMAND "run distro_bootcmd; env exists secureboot" \
-                          "&& esbc_halt; run sd_bootcmd;"
+#define CONFIG_BOOTCOMMAND "run distro_bootcmd;run sd_bootcmd; "       \
+                          "env exists secureboot && esbc_halt;"
 #endif
 #endif
 
index 6b71d47c5acc8030c5ad4ca5fb6e73b3c26ca5cc..0cd2f3c2bc9d9f30e3c60f6c9bed954d0dcaad8e 100644 (file)
@@ -144,9 +144,6 @@ unsigned long long get_qixis_addr(void);
 #if defined(CONFIG_FSL_MC_ENET)
 #define CONFIG_SYS_LS_MC_DRAM_BLOCK_MIN_SIZE           (512UL * 1024 * 1024)
 #endif
-
-#define CONFIG_FSL_CAAM                        /* Enable SEC/CAAM */
-
 /* Command line configuration */
 #define CONFIG_CMD_GREPENV
 #define CONFIG_CMD_CACHE
@@ -156,8 +153,6 @@ unsigned long long get_qixis_addr(void);
 
 /* SATA */
 #ifdef CONFIG_SCSI
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 #define CONFIG_SYS_SATA1               AHCI_BASE_ADDR1
 
index 310e8fd59f3f41cde3777f65b7f5a014797e65a3..e7e3afefd9a8fbd2d5912f93112d2a3fc4998f54 100644 (file)
@@ -335,6 +335,26 @@ unsigned long get_board_ddr_clk(void);
        QIXIS_SDID_MASK) != QIXIS_ESDHC_NO_ADAPTER)
 
 /* Initial environment variables */
+#ifdef CONFIG_SECURE_BOOT
+#undef CONFIG_EXTRA_ENV_SETTINGS
+#define CONFIG_EXTRA_ENV_SETTINGS              \
+       "hwconfig=fsl_ddr:bank_intlv=auto\0"    \
+       "loadaddr=0x90100000\0"                 \
+       "kernel_addr=0x100000\0"                \
+       "ramdisk_addr=0x800000\0"               \
+       "ramdisk_size=0x2000000\0"              \
+       "fdt_high=0xa0000000\0"                 \
+       "initrd_high=0xffffffffffffffff\0"      \
+       "kernel_start=0x1000000\0"              \
+       "kernel_load=0xa0000000\0"              \
+       "kernel_size=0x2800000\0"               \
+       "mcinitcmd=sf probe 0:0;sf read 0xa0a00000 0xa00000 0x100000;"  \
+       "sf read 0xa0700000 0x700000 0x4000; esbc_validate 0xa0700000;" \
+       "sf read 0xa0e00000 0xe00000 0x100000;" \
+       "sf read 0xa0740000 0x740000 0x4000;esbc_validate 0xa0740000;"  \
+       "fsl_mc start mc 0xa0a00000 0xa0e00000\0"                       \
+       "mcmemsize=0x70000000 \0"
+#else /* if !(CONFIG_SECURE_BOOT) */
 #if defined(CONFIG_QSPI_BOOT)
 #undef CONFIG_EXTRA_ENV_SETTINGS
 #define CONFIG_EXTRA_ENV_SETTINGS              \
@@ -385,6 +405,7 @@ unsigned long get_board_ddr_clk(void);
        "mcinitcmd=fsl_mc start mc 0x580A00000 0x580E00000\0"   \
        "mcmemsize=0x70000000 \0"
 #endif
+#endif /* CONFIG_SECURE_BOOT */
 
 #ifdef CONFIG_FSL_MC_ENET
 #define CONFIG_FSL_MEMAC
index e6bf2b8d8733d86f459748375b8f3f54b757e3d7..1da8153a4e911447b2d159bc6ec7ccb6d9538715 100644 (file)
@@ -95,6 +95,7 @@
 #define CONFIG_SYS_FLASH_BANKS_LIST    { CONFIG_SYS_FLASH_BASE }
 #endif
 #endif
+#define CONFIG_NAND_FSL_IFC
 #define CONFIG_SYS_NAND_MAX_ECCPOS     256
 #define CONFIG_SYS_NAND_MAX_OOBFREE    2
 
 #define CONFIG_SYS_NAND_BASE_LIST      { CONFIG_SYS_NAND_BASE }
 #define CONFIG_SYS_MAX_NAND_DEVICE     1
 #define CONFIG_MTD_NAND_VERIFY_WRITE
+#define CONFIG_CMD_NAND
 
 #define CONFIG_SYS_NAND_BLOCK_SIZE     (128 * 1024)
 
 #define MC_INIT_CMD                            \
        "mcinitcmd=sf probe 0:0;sf read 0x80000000 0xA00000 0x100000;"  \
        "sf read 0x80100000 0xE00000 0x100000;"                         \
-       "fsl_mc start mc 0x80000000 0x80100000\0"                       \
+       "env exists secureboot && "                     \
+       "sf read 0x80700000 0x700000 0x40000 && "       \
+       "sf read 0x80740000 0x740000 0x40000 && "       \
+       "esbc_validate 0x80700000 && "                  \
+       "esbc_validate 0x80740000 ;"                    \
+       "fsl_mc start mc 0x80000000 0x80100000\0"       \
        "mcmemsize=0x70000000\0"
 #elif defined(CONFIG_SD_BOOT)
 #define MC_INIT_CMD                            \
        "mcinitcmd=mmcinfo;mmc read 0x80000000 0x5000 0x800;"           \
        "mmc read 0x80100000 0x7000 0x800;"                             \
-       "fsl_mc start mc 0x80000000 0x80100000\0"                       \
+       "env exists secureboot && "                     \
+       "mmc read 0x80700000 0x3800 0x10 && "           \
+       "mmc read 0x80740000 0x3A00 0x10 && "           \
+       "esbc_validate 0x80700000 && "                  \
+       "esbc_validate 0x80740000 ;"                    \
+       "fsl_mc start mc 0x80000000 0x80100000\0"       \
        "mcmemsize=0x70000000\0"
 #endif
 
        "fdt_addr=0x64f00000\0"                 \
        "kernel_addr=0x1000000\0"               \
        "kernel_addr_sd=0x8000\0"               \
+       "kernelhdr_addr_sd=0x4000\0"            \
        "kernel_start=0x580100000\0"            \
        "kernelheader_start=0x580800000\0"      \
        "scriptaddr=0x80000000\0"               \
        "load_addr=0xa0000000\0"                \
        "kernel_size=0x2800000\0"               \
        "kernel_size_sd=0x14000\0"              \
+       "kernelhdr_size_sd=0x10\0"              \
        MC_INIT_CMD                             \
        BOOTENV                                 \
        "boot_scripts=ls1088ardb_boot.scr\0"    \
                "bootm $load_addr#ls1088ardb\0"                 \
        "qspi_bootcmd=echo Trying load from qspi..;"            \
                "sf probe && sf read $load_addr "               \
-               "$kernel_addr $kernel_size &&"                  \
+               "$kernel_addr $kernel_size ; env exists secureboot "    \
+               "&& sf read $kernelheader_addr_r $kernelheader_addr "   \
+               "$kernelheader_size && esbc_validate ${kernelheader_addr_r}; "\
                "bootm $load_addr#$BOARD\0"                     \
-       "sd_bootcmd=echo Trying load from sd card..;"           \
+               "sd_bootcmd=echo Trying load from sd card..;"           \
                "mmcinfo; mmc read $load_addr "                 \
                "$kernel_addr_sd $kernel_size_sd ;"             \
+               "env exists secureboot && mmc read $kernelheader_addr_r "\
+               "$kernelhdr_addr_sd $kernelhdr_size_sd "        \
+               " && esbc_validate ${kernelheader_addr_r};"     \
                "bootm $load_addr#$BOARD\0"
 
 #undef CONFIG_BOOTCOMMAND
 #if defined(CONFIG_QSPI_BOOT)
 /* Try to boot an on-QSPI kernel first, then do normal distro boot */
 #define CONFIG_BOOTCOMMAND                                      \
-               "env exists mcinitcmd && run mcinitcmd && "     \
-               "sf read 0x80200000 0xd00000 0x100000;" \
-               " fsl_mc apply dpl 0x80200000;"         \
-               "run distro_bootcmd;run qspi_bootcmd"
+               "sf read 0x80200000 0xd00000 0x100000;"         \
+               "env exists mcinitcmd && env exists secureboot "        \
+               " && sf read 0x80780000 0x780000 0x100000 "     \
+               "&& esbc_validate 0x80780000;env exists mcinitcmd "     \
+               "&& fsl_mc apply dpl 0x80200000;"               \
+               "run distro_bootcmd;run qspi_bootcmd;"          \
+               "env exists secureboot && esbc_halt;"
+
 /* Try to boot an on-SD kernel first, then do normal distro boot */
 #elif defined(CONFIG_SD_BOOT)
 #define CONFIG_BOOTCOMMAND                                      \
-               "env exists mcinitcmd && run mcinitcmd ;"       \
-               "&& env exists mcinitcmd && mmcinfo; "          \
-               "mmc read 0x88000000 0x6800 0x800; "            \
-               "&& fsl_mc apply dpl 0x88000000;"               \
-               "run distro_bootcmd;run sd_bootcmd"
+               "env exists mcinitcmd && mmcinfo; "             \
+               "mmc read 0x80200000 0x6800 0x800; "            \
+               "env exists mcinitcmd && env exists secureboot "        \
+               " && mmc read 0x80780000 0x3800 0x10 "          \
+               "&& esbc_validate 0x80780000;env exists mcinitcmd "     \
+               "&& fsl_mc apply dpl 0x80200000;"               \
+               "run distro_bootcmd;run sd_bootcmd;"            \
+               "env exists secureboot && esbc_halt;"
 #endif
 
 /* MAC/PHY configuration */
index f1968cc53353506490411ffa32d2ac144071a21a..815d8adc92a24573c8aa5103b45d33a62ed45c07 100644 (file)
@@ -46,8 +46,6 @@ unsigned long get_board_ddr_clk(void);
 #define CONFIG_FSL_DDR_BIST    /* enable built-in memory test */
 
 /* SATA */
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 
 #define CONFIG_SYS_SATA1                       AHCI_BASE_ADDR1
index 650db2f594d5daf7501486ee7accdfe6275d38ec..6f3301c2fdc8381bec4dac9caf2403ad11e97b9b 100644 (file)
@@ -64,8 +64,6 @@ unsigned long get_board_sys_clk(void);
 #define CONFIG_FSL_DDR_BIST    /* enable built-in memory test */
 
 /* SATA */
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 
 #define CONFIG_SYS_SATA1                       AHCI_BASE_ADDR1
index 29eb59a3cba1e30638c3796b61b4e83734e4003b..50379c7b21abf7912f75f66ebc7bb0f0bd55c73a 100644 (file)
  * SATA
  */
 #ifdef CONFIG_CMD_SATA
-#define CONFIG_DWC_AHSATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
 #define CONFIG_DWC_AHSATA_PORT_ID      0
 #define CONFIG_DWC_AHSATA_BASE_ADDR    SATA_BASE_ADDR
 #define CONFIG_LBA48
-#define CONFIG_LIBATA
 #endif
 
 /*
index 1b2e0d71b4583a8a80ac85e2e43c7f3e1db1dde7..af16b9454a39b39ded1f898e65f4df15522479e8 100644 (file)
@@ -96,9 +96,7 @@
 /*
  * SATA/SCSI/AHCI configuration
  */
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
-#define CONFIG_LIBATA
 #define CONFIG_LBA48
 #define CONFIG_SYS_64BIT_LBA
 
index d85527434a0aa5ab36dc191318be1e922449bb64..7f143164c3acd3767fbf8abe41a41bf83ee0978b 100644 (file)
@@ -96,9 +96,7 @@
 /*
  * SATA/SCSI/AHCI configuration
  */
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
-#define CONFIG_LIBATA
 #define CONFIG_LBA48
 #define CONFIG_SYS_64BIT_LBA
 
index e973b3569850c279af36e287df26af1c9f89f8c9..323aa3d907256edf36c9cfc4068d2e34420c5007 100644 (file)
 #define CONFIG_SYS_MMC_ENV_DEV 0
 
 #ifdef CONFIG_CMD_SATA
-       #define CONFIG_DWC_AHSATA
        #define CONFIG_SYS_SATA_MAX_DEVICE      1
        #define CONFIG_DWC_AHSATA_PORT_ID       0
        #define CONFIG_DWC_AHSATA_BASE_ADDR     SATA_BASE_ADDR
        #define CONFIG_LBA48
-       #define CONFIG_LIBATA
 #endif
 
 /* Framebuffer and LCD */
index 6b42b2b3c188c70c05389bee66fdb76c87ee7bd2..d649172d5fc8b5414ae406d3067acd8e88cce5ab 100644 (file)
 
 /* SATA Configuration */
 #ifdef CONFIG_CMD_SATA
-#define CONFIG_DWC_AHSATA
 #define CONFIG_SYS_SATA_MAX_DEVICE      1
 #define CONFIG_DWC_AHSATA_PORT_ID       0
 #define CONFIG_DWC_AHSATA_BASE_ADDR     SATA_ARB_BASE_ADDR
 #define CONFIG_LBA48
-#define CONFIG_LIBATA
 #endif
 
 /* Ethernet Configuration */
index b847906310058ebf999f3834b5ff4fe43b327b90..8e0d6df93d5c9e2c76ce26fe9c28d2db3bc73a36 100644 (file)
  * SATA Configs
  */
 #ifdef CONFIG_CMD_SATA
-#define CONFIG_DWC_AHSATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
 #define CONFIG_DWC_AHSATA_PORT_ID      0
 #define CONFIG_DWC_AHSATA_BASE_ADDR    SATA_ARB_BASE_ADDR
 #define CONFIG_LBA48
-#define CONFIG_LIBATA
 #endif
 
 #define CONFIG_FEC_MXC
index dd0e6370629fc8e40611dc79096055cf4cb1c5cb..f82b6a44d2473875a3406b49d830452ab90d3f46 100644 (file)
 
 /* SATA Configs */
 #ifdef CONFIG_CMD_SATA
-#define CONFIG_DWC_AHSATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
 #define CONFIG_DWC_AHSATA_PORT_ID      0
 #define CONFIG_DWC_AHSATA_BASE_ADDR    SATA_ARB_BASE_ADDR
 #define CONFIG_LBA48
-#define CONFIG_LIBATA
 #endif
 
 /* UART */
index 3ecfb58918604968f432e91fa6de7e6ed4a34601..b095814cda8d32efcb179084db95eaa7376da07b 100644 (file)
@@ -93,7 +93,6 @@
 
 #define CONFIG_PREBOOT \
        "setenv preboot;"                                               \
-       "nand unlock;"                                                  \
        "saveenv;"
 
 #define CONFIG_EXTRA_ENV_SETTINGS \
                "tftpboot $loadaddr zImage;" \
                "bootz $loadaddr\0" \
        "nandbootcommon=echo 'Booting kernel from NAND...';" \
-               "nand unlock;" \
                "run nandargs;" \
                "run common_bootargs;" \
                "run dump_bootargs;" \
index 38d74120998a0ba669040006cf4020d191bd38cb..38a00552975e0206626e55273642913db873c8b6 100644 (file)
@@ -61,8 +61,6 @@
 
 #define CONSOLEDEV             "ttyO2"
 
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    1
 #define CONFIG_SYS_SCSI_MAX_LUN                1
index 55e716a22aa1bcaaad154421e170173dfbf0a2eb..051416eab87548ddd32e21cc3e7cb23727ef2d30 100644 (file)
  * SATA Configs
  */
 #ifdef CONFIG_CMD_SATA
-#define CONFIG_DWC_AHSATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
 #define CONFIG_DWC_AHSATA_PORT_ID      0
 #define CONFIG_DWC_AHSATA_BASE_ADDR    SATA_ARB_BASE_ADDR
 #define CONFIG_LBA48
-#define CONFIG_LIBATA
 #endif
 
 /* SPL */
index 1b665b2c15d877e2c5ff278310b74db80e9a2012..07c192aecc1d216934e5892f26ae332d9dfe858e 100644 (file)
 #define CONFIG_TSEC_ENET       /* tsec ethernet support */
 #define CONFIG_ENV_OVERWRITE
 
-#define CONFIG_SATA_SIL
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
-#define CONFIG_LIBATA
 #define CONFIG_LBA48
 
 #if defined(CONFIG_TARGET_P2020RDB)
 #ifdef CONFIG_USB_EHCI_HCD
 #define CONFIG_EHCI_HCD_INIT_AFTER_RESET
 #define CONFIG_USB_EHCI_FSL
+#define CONFIG_EHCI_DESC_BIG_ENDIAN
 #endif
 #endif
 
index e9692048d14cf6c715da1333e203bdf2d3aa282f..d2302636ac90a79caaec9fa08024d7efaefce9f9 100644 (file)
@@ -50,9 +50,7 @@
 #define CONFIG_TSEC_ENET       /* tsec ethernet support */
 #define CONFIG_ENV_OVERWRITE
 
-#define CONFIG_SATA_SIL3114
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
-#define CONFIG_LIBATA
 #define CONFIG_LBA48
 
 #ifndef __ASSEMBLY__
index 4376a247876706e535c2e6aa572d3678e08e16d1..c8852cef349c0baff60a9f82f31270648d51a4fa 100644 (file)
@@ -31,8 +31,6 @@
 
 /* For block devices, QEMU emulates an ICH9 AHCI controller over PCI */
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID 6
-#define CONFIG_SCSI_AHCI
-#define CONFIG_LIBATA
 
 /* Environment options */
 #define CONFIG_ENV_SIZE                                SZ_64K
index a0097fdbd9157c6528e62694e801f2a18b197982..817c9d920dd794192b57a0acb670dc3b571d00d3 100644 (file)
 
 #define CONFIG_PCI_SCAN_SHOW           /* show pci devices on startup */
 
-#undef CONFIG_SCSI_AHCI
-
 #ifdef CONFIG_SCSI_AHCI
 #define CONFIG_SATA_ULI5288
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    4
index 4391a8cbc82407400215695d9187c0c74b11cd97..26f889dd3eed2cb800b73d05c4bfda51fdc64743 100644 (file)
 #define PHYS_SDRAM_0_SIZE              0x80000000 /* 2 GiB */
 
 #ifdef CONFIG_AHCI
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 #define CONFIG_SUNXI_AHCI
 #define CONFIG_SYS_64BIT_LBA
index 4938f43985c66fe4124271178a0ea9ab8548ea92..5a69708e30356f3e65d763a28523c46e0db8aca0 100644 (file)
 
 /* SATA */
 #ifdef CONFIG_FSL_SATA_V2
-#define CONFIG_LIBATA
-#define CONFIG_FSL_SATA
-
 #define CONFIG_SYS_SATA_MAX_DEVICE     2
 #define CONFIG_SATA1
 #define CONFIG_SYS_SATA1               CONFIG_SYS_MPC85xx_SATA1_ADDR
index 849d4a6aecccce3ecae5d41e185039fced60bce1..3a3bab0fea91ef48a3ccb34638ef09d83ad93b10 100644 (file)
 
 /* SATA */
 #ifdef CONFIG_CMD_SATA
-#define CONFIG_DWC_AHSATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
 #define CONFIG_DWC_AHSATA_PORT_ID      0
 #define CONFIG_DWC_AHSATA_BASE_ADDR    SATA_ARB_BASE_ADDR
 #define CONFIG_LBA48
-#define CONFIG_LIBATA
 #endif
 
 /* USB */
index a7001e76aaac672bb844f006c6ee603af0c00e9d..6e95aa1626e509bf9ac2a7dc78764489924ae86f 100644 (file)
@@ -65,8 +65,6 @@
 
 /* SATA support */
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
-#define CONFIG_SATA_MV
-#define CONFIG_LIBATA
 #define CONFIG_LBA48
 
 /* Additional FS support/configuration */
index d2c3e575703b4d92989ea4d3fd57882926daf324..3dbd2cacbae71dbcc1ad1b9d1f9b322274519184 100644 (file)
@@ -53,8 +53,6 @@
 /*
  * SATA/SCSI/AHCI configuration
  */
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    2
 #define CONFIG_SYS_SCSI_MAX_LUN                1
index bcce41db8a4caddf1a66cc0ad9d3db3c3824c3b0..989014a177a0c11fbfde4066a5f1a083539b0c90 100644 (file)
 /* SATA Configs */
 
 #ifdef CONFIG_CMD_SATA
-#define CONFIG_DWC_AHSATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
 #define CONFIG_DWC_AHSATA_PORT_ID      0
 #define CONFIG_DWC_AHSATA_BASE_ADDR    SATA_ARB_BASE_ADDR
 #define CONFIG_LBA48
-#define CONFIG_LIBATA
 #endif
 
 /* Network support */
index 97d193ba49c6ebd81c54e3172009d01ccc057fef..e42bfc51f8432111ebe091c9b6d7ff97618977af 100644 (file)
 /* SATA Configs */
 
 #ifdef CONFIG_CMD_SATA
-#define CONFIG_DWC_AHSATA
 #define CONFIG_SYS_SATA_MAX_DEVICE     1
 #define CONFIG_DWC_AHSATA_PORT_ID      0
 #define CONFIG_DWC_AHSATA_BASE_ADDR    SATA_ARB_BASE_ADDR
 #define CONFIG_LBA48
-#define CONFIG_LIBATA
 #endif
 
 #define CONFIG_SYS_MEMTEST_START       0x10000000
index 6422852010742dcc4f3c29aa0cc03f0c06aa947a..064c546403627bea6d192e74beb810de5f6443d5 100644 (file)
 #define CONFIG_SYS_BOOTM_LEN           (16 << 20)
 
 /* SATA AHCI storage */
-
-#define CONFIG_SCSI_AHCI
 #ifdef CONFIG_SCSI_AHCI
-#define CONFIG_LIBATA
 #define CONFIG_LBA48
 #define CONFIG_SYS_64BIT_LBA
 
index 14604eb4e8013d1d910ae78000ba87d5f57d5d48..57fee6a4c8a562dc3c071614d39a4877f8471061 100644 (file)
 #endif
 
 #ifdef CONFIG_SATA_CEVA
-#define CONFIG_LIBATA
-#define CONFIG_SCSI_AHCI
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID    2
 #define CONFIG_SYS_SCSI_MAX_LUN                1
 #define CONFIG_SYS_SCSI_MAX_DEVICE     (CONFIG_SYS_SCSI_MAX_SCSI_ID * \
diff --git a/include/dt-bindings/clock/snps,hsdk-cgu.h b/include/dt-bindings/clock/snps,hsdk-cgu.h
new file mode 100644 (file)
index 0000000..813ab71
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Synopsys HSDK SDP CGU clock driver dts bindings
+ *
+ * Copyright (C) 2017 Synopsys
+ * Author: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.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.
+ */
+
+#ifndef __DT_BINDINGS_CLK_HSDK_CGU_H_
+#define __DT_BINDINGS_CLK_HSDK_CGU_H_
+
+#define CLK_ARC_PLL            0
+#define CLK_ARC                        1
+#define CLK_DDR_PLL            2
+#define CLK_SYS_PLL            3
+#define CLK_SYS_APB            4
+#define CLK_SYS_AXI            5
+#define CLK_SYS_ETH            6
+#define CLK_SYS_USB            7
+#define CLK_SYS_SDIO           8
+#define CLK_SYS_HDMI           9
+#define CLK_SYS_GFX_CORE       10
+#define CLK_SYS_GFX_DMA                11
+#define CLK_SYS_GFX_CFG                12
+#define CLK_SYS_DMAC_CORE      13
+#define CLK_SYS_DMAC_CFG       14
+#define CLK_SYS_SDIO_REF       15
+#define CLK_SYS_SPI_REF                16
+#define CLK_SYS_I2C_REF                17
+#define CLK_SYS_UART_REF       18
+#define CLK_SYS_EBI_REF                19
+#define CLK_TUN_PLL            20
+#define CLK_TUN                        21
+#define CLK_HDMI_PLL           22
+#define CLK_HDMI               23
+
+#endif /* __DT_BINDINGS_CLK_HSDK_CGU_H_ */
index dc8edc8743aca2f1b30f967c268c63ee616dbaa2..2f0be9c86cb08a69ac94aee7a4c21755fd62710f 100644 (file)
@@ -227,9 +227,9 @@ struct efi_time_cap {
 };
 
 enum efi_locate_search_type {
-       all_handles,
-       by_register_notify,
-       by_protocol
+       ALL_HANDLES,
+       BY_REGISTER_NOTIFY,
+       BY_PROTOCOL
 };
 
 struct efi_open_protocol_info_entry {
index fcd7483ab21a36fd65befa8c2b61afc16e9ecdae..584016dc302d0368fc047b233d9c657c74dbe08d 100644 (file)
@@ -28,8 +28,7 @@ enum efi_timer_delay {
        EFI_TIMER_RELATIVE = 2
 };
 
-#define UINTN size_t
-typedef long INTN;
+#define efi_uintn_t size_t
 typedef uint16_t *efi_string_t;
 
 #define EVT_TIMER                              0x80000000
@@ -49,20 +48,22 @@ struct efi_event;
 /* EFI Boot Services table */
 struct efi_boot_services {
        struct efi_table_hdr hdr;
-       efi_status_t (EFIAPI *raise_tpl)(UINTN new_tpl);
-       void (EFIAPI *restore_tpl)(UINTN old_tpl);
+       efi_status_t (EFIAPI *raise_tpl)(efi_uintn_t new_tpl);
+       void (EFIAPI *restore_tpl)(efi_uintn_t old_tpl);
 
-       efi_status_t (EFIAPI *allocate_pages)(int, int, unsigned long,
+       efi_status_t (EFIAPI *allocate_pages)(int, int, efi_uintn_t,
                                              efi_physical_addr_t *);
-       efi_status_t (EFIAPI *free_pages)(efi_physical_addr_t, unsigned long);
-       efi_status_t (EFIAPI *get_memory_map)(unsigned long *memory_map_size,
-                       struct efi_mem_desc *desc, unsigned long *key,
-                       unsigned long *desc_size, u32 *desc_version);
-       efi_status_t (EFIAPI *allocate_pool)(int, unsigned long, void **);
+       efi_status_t (EFIAPI *free_pages)(efi_physical_addr_t, efi_uintn_t);
+       efi_status_t (EFIAPI *get_memory_map)(efi_uintn_t *memory_map_size,
+                                             struct efi_mem_desc *desc,
+                                             efi_uintn_t *key,
+                                             efi_uintn_t *desc_size,
+                                             u32 *desc_version);
+       efi_status_t (EFIAPI *allocate_pool)(int, efi_uintn_t, void **);
        efi_status_t (EFIAPI *free_pool)(void *);
 
        efi_status_t (EFIAPI *create_event)(uint32_t type,
-                       UINTN notify_tpl,
+                       efi_uintn_t notify_tpl,
                        void (EFIAPI *notify_function) (
                                        struct efi_event *event,
                                        void *context),
@@ -70,8 +71,9 @@ struct efi_boot_services {
        efi_status_t (EFIAPI *set_timer)(struct efi_event *event,
                                         enum efi_timer_delay type,
                                         uint64_t trigger_time);
-       efi_status_t (EFIAPI *wait_for_event)(unsigned long number_of_events,
-                       struct efi_event **event, size_t *index);
+       efi_status_t (EFIAPI *wait_for_event)(efi_uintn_t number_of_events,
+                                             struct efi_event **event,
+                                             efi_uintn_t *index);
        efi_status_t (EFIAPI *signal_event)(struct efi_event *event);
        efi_status_t (EFIAPI *close_event)(struct efi_event *event);
        efi_status_t (EFIAPI *check_event)(struct efi_event *event);
@@ -94,7 +96,7 @@ struct efi_boot_services {
        efi_status_t (EFIAPI *locate_handle)(
                        enum efi_locate_search_type search_type,
                        const efi_guid_t *protocol, void *search_key,
-                       unsigned long *buffer_size, efi_handle_t *buffer);
+                       efi_uintn_t *buffer_size, efi_handle_t *buffer);
        efi_status_t (EFIAPI *locate_device_path)(const efi_guid_t *protocol,
                        struct efi_device_path **device_path,
                        efi_handle_t *device);
@@ -141,14 +143,14 @@ struct efi_boot_services {
        efi_status_t(EFIAPI *open_protocol_information)(efi_handle_t handle,
                        const efi_guid_t *protocol,
                        struct efi_open_protocol_info_entry **entry_buffer,
-                       unsigned long *entry_count);
+                       efi_uintn_t *entry_count);
        efi_status_t (EFIAPI *protocols_per_handle)(efi_handle_t handle,
                        efi_guid_t ***protocol_buffer,
-                       unsigned long *protocols_buffer_count);
+                       efi_uintn_t *protocols_buffer_count);
        efi_status_t (EFIAPI *locate_handle_buffer) (
                        enum efi_locate_search_type search_type,
                        const efi_guid_t *protocol, void *search_key,
-                       unsigned long *no_handles, efi_handle_t **buffer);
+                       efi_uintn_t *no_handles, efi_handle_t **buffer);
        efi_status_t (EFIAPI *locate_protocol)(const efi_guid_t *protocol,
                        void *registration, void **protocol_interface);
        efi_status_t (EFIAPI *install_multiple_protocol_interfaces)(
@@ -249,7 +251,7 @@ struct efi_system_table {
        struct efi_simple_text_output_protocol *std_err;
        struct efi_runtime_services *runtime;
        struct efi_boot_services *boottime;
-       unsigned long nr_tables;
+       efi_uintn_t nr_tables;
        struct efi_configuration_table *tables;
 };
 
@@ -583,14 +585,14 @@ struct efi_gop_mode
 struct efi_gop
 {
        efi_status_t (EFIAPI *query_mode)(struct efi_gop *this, u32 mode_number,
-                                         unsigned long *size_of_info,
+                                         efi_uintn_t *size_of_info,
                                          struct efi_gop_mode_info **info);
        efi_status_t (EFIAPI *set_mode)(struct efi_gop *this, u32 mode_number);
        efi_status_t (EFIAPI *blt)(struct efi_gop *this, void *buffer,
-                                  unsigned long operation, unsigned long sx,
-                                  unsigned long sy, unsigned long dx,
-                                  unsigned long dy, unsigned long width,
-                                  unsigned long height, unsigned long delta);
+                                  u32 operation, efi_uintn_t sx,
+                                  efi_uintn_t sy, efi_uintn_t dx,
+                                  efi_uintn_t dy, efi_uintn_t width,
+                                  efi_uintn_t height, efi_uintn_t delta);
        struct efi_gop_mode *mode;
 };
 
index 1b92edbd77c2a888560f26a87cbe250aa475ec4a..c0caabddb122e696930170f6315bd153b57ede1b 100644 (file)
@@ -6,6 +6,9 @@
  *  SPDX-License-Identifier:     GPL-2.0+
  */
 
+#ifndef _EFI_LOADER_H
+#define _EFI_LOADER_H 1
+
 #include <common.h>
 #include <part_efi.h>
 #include <efi_api.h>
@@ -75,9 +78,9 @@ const char *__efi_nesting_dec(void);
 extern struct efi_runtime_services efi_runtime_services;
 extern struct efi_system_table systab;
 
-extern const struct efi_simple_text_output_protocol efi_con_out;
+extern struct efi_simple_text_output_protocol efi_con_out;
 extern struct efi_simple_input_interface efi_con_in;
-extern const struct efi_console_control_protocol efi_console_control;
+extern struct efi_console_control_protocol efi_console_control;
 extern const struct efi_device_path_to_text_protocol efi_device_path_to_text;
 
 uint16_t *efi_dp_str(struct efi_device_path *dp);
@@ -98,6 +101,8 @@ extern unsigned int __efi_runtime_rel_start, __efi_runtime_rel_stop;
  * interface (usually a struct with callback functions), this struct maps the
  * 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;
 };
@@ -112,20 +117,12 @@ struct efi_handler {
 struct efi_object {
        /* Every UEFI object is part of a global object list */
        struct list_head link;
-       /* We support up to 16 "protocols" an object can be accessed through */
-       struct efi_handler protocols[16];
+       /* The list of protocols */
+       struct list_head protocols;
        /* The object spawner can either use this for data or as identifier */
        void *handle;
 };
 
-#define EFI_PROTOCOL_OBJECT(_guid, _protocol) (struct efi_object){     \
-       .protocols = {{                                                 \
-               .guid = &(_guid),                                       \
-               .protocol_interface = (void *)(_protocol),              \
-       }},                                                             \
-       .handle = (void *)(_protocol),                                  \
-}
-
 /**
  * struct efi_event
  *
@@ -141,7 +138,7 @@ struct efi_object {
  */
 struct efi_event {
        uint32_t type;
-       UINTN notify_tpl;
+       efi_uintn_t notify_tpl;
        void (EFIAPI *notify_function)(struct efi_event *event, void *context);
        void *notify_context;
        u64 trigger_next;
@@ -163,6 +160,8 @@ int efi_disk_register(void);
 int efi_gop_register(void);
 /* Called by bootefi to make the network interface available */
 int efi_net_register(void);
+/* Called by bootefi to make the watchdog available */
+int efi_watchdog_register(void);
 /* Called by bootefi to make SMBIOS tables available */
 void efi_smbios_register(void);
 
@@ -171,6 +170,8 @@ efi_fs_from_path(struct efi_device_path *fp);
 
 /* Called by networking code to memorize the dhcp ack package */
 void efi_net_set_dhcp_ack(void *pkt, int len);
+/* Called by efi_set_watchdog_timer to reset the timer */
+efi_status_t efi_set_watchdog(unsigned long timeout);
 
 /* Called from places to check whether a timer expired */
 void efi_timer_check(void);
@@ -185,8 +186,26 @@ void efi_restore_gd(void);
 void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map);
 /* Call this to set the current device name */
 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);
+/* Call this to validate a handle and find the EFI object for it */
+struct efi_object *efi_search_obj(const void *handle);
+/* Find a protocol on a handle */
+efi_status_t efi_search_protocol(const void *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,
+                             void *protocol_interface);
+/* Delete protocol from a handle */
+efi_status_t efi_remove_protocol(const void *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);
 /* Call this to create an event */
-efi_status_t efi_create_event(uint32_t type, UINTN notify_tpl,
+efi_status_t efi_create_event(uint32_t type, efi_uintn_t notify_tpl,
                              void (EFIAPI *notify_function) (
                                        struct efi_event *event,
                                        void *context),
@@ -208,20 +227,20 @@ struct efi_file_handle *efi_file_from_path(struct efi_device_path *fp);
 /* Generic EFI memory allocator, call this to get memory */
 void *efi_alloc(uint64_t len, int memory_type);
 /* More specific EFI memory allocator, called by EFI payloads */
-efi_status_t efi_allocate_pages(int type, int memory_type, unsigned long pages,
+efi_status_t efi_allocate_pages(int type, int memory_type, efi_uintn_t pages,
                                uint64_t *memory);
 /* EFI memory free function. */
-efi_status_t efi_free_pages(uint64_t memory, unsigned long pages);
+efi_status_t efi_free_pages(uint64_t memory, efi_uintn_t pages);
 /* EFI memory allocator for small allocations */
-efi_status_t efi_allocate_pool(int pool_type, unsigned long size,
+efi_status_t efi_allocate_pool(int pool_type, efi_uintn_t size,
                               void **buffer);
 /* EFI pool memory free function. */
 efi_status_t efi_free_pool(void *buffer);
 /* Returns the EFI memory map */
-efi_status_t efi_get_memory_map(unsigned long *memory_map_size,
+efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size,
                                struct efi_mem_desc *memory_map,
-                               unsigned long *map_key,
-                               unsigned long *descriptor_size,
+                               efi_uintn_t *map_key,
+                               efi_uintn_t *descriptor_size,
                                uint32_t *descriptor_version);
 /* Adds a range into the EFI memory map */
 uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
@@ -243,7 +262,8 @@ extern void *efi_bounce_buffer;
 
 
 struct efi_device_path *efi_dp_next(const struct efi_device_path *dp);
-int efi_dp_match(struct efi_device_path *a, struct efi_device_path *b);
+int efi_dp_match(const struct efi_device_path *a,
+                const struct efi_device_path *b);
 struct efi_object *efi_dp_find_obj(struct efi_device_path *dp,
                                   struct efi_device_path **rem);
 unsigned efi_dp_size(const struct efi_device_path *dp);
@@ -341,4 +361,6 @@ static inline void efi_set_bootdev(const char *dev, const char *devnr,
                                   const char *path) { }
 static inline void efi_net_set_dhcp_ack(void *pkt, int len) { }
 
-#endif
+#endif /* CONFIG_EFI_LOADER && !CONFIG_SPL_BUILD */
+
+#endif /* _EFI_LOADER_H */
index 7ec42a0406bca52da1add4ddcc224c38ffa2b7c5..be5ba4bfa91ccc0b8eca88cda6d06c42a3737f3f 100644 (file)
@@ -12,6 +12,7 @@
 #include <common.h>
 #include <efi.h>
 #include <efi_api.h>
+#include <efi_loader.h>
 #include <linker_lists.h>
 
 #define EFI_ST_SUCCESS 0
        (efi_st_printf("%s(%u):\nERROR: ", __FILE__, __LINE__), \
        efi_st_printf(__VA_ARGS__)) \
 
+/*
+ * Prints a TODO message.
+ *
+ * @...        format string followed by fields to print
+ */
+#define efi_st_todo(...) \
+       (efi_st_printf("%s(%u):\nTODO: ", __FILE__, __LINE__), \
+       efi_st_printf(__VA_ARGS__)) \
+
 /*
  * A test may be setup and executed at boottime,
  * it may be setup at boottime and executed at runtime,
@@ -71,6 +81,15 @@ void efi_st_printf(const char *fmt, ...)
  */
 int efi_st_memcmp(const void *buf1, const void *buf2, size_t length);
 
+/*
+ * Compare an u16 string to a char string.
+ *
+ * @buf1:      u16 string
+ * @buf2:      char string
+ * @return:    0 if both buffers contain the same bytes
+ */
+int efi_st_strcmp_16_8(const u16 *buf1, const char *buf2);
+
 /*
  * Reads an Unicode character from the input device.
  *
@@ -88,6 +107,7 @@ u16 efi_st_get_key(void);
  * @setup:     set up the unit test
  * @teardown:  tear down the unit test
  * @execute:   execute the unit test
+ * @on_request:        test is only executed on request
  */
 struct efi_unit_test {
        const char *name;
@@ -96,6 +116,7 @@ struct efi_unit_test {
                     const struct efi_system_table *systable);
        int (*execute)(void);
        int (*teardown)(void);
+       bool on_request;
 };
 
 /* Declare a new EFI unit test */
index b1ad46ee45e6602b893afb5bdddaf4e1d6654652..5401e861f0f049404d37aaecb5e11b79c59566fb 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Freescale Layerscape MC I/O wrapper
  *
- * Copyright (C) 2013-2015 Freescale Semiconductor, Inc.
- * Author: German Rivera <German.Rivera@freescale.com>
+ * Copyright (C) 2013-2016 Freescale Semiconductor, Inc.
+ * Copyright 2017 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
 #define __FSL_DPBP_H
 
 /* DPBP Version */
-#define DPBP_VER_MAJOR                         2
-#define DPBP_VER_MINOR                         2
+#define DPBP_VER_MAJOR                         3
+#define DPBP_VER_MINOR                         3
 
 /* Command IDs */
-#define DPBP_CMDID_CLOSE                               0x800
-#define DPBP_CMDID_OPEN                                        0x804
-#define DPBP_CMDID_CREATE                              0x904
-#define DPBP_CMDID_DESTROY                             0x900
-
-#define DPBP_CMDID_ENABLE                              0x002
-#define DPBP_CMDID_DISABLE                             0x003
-#define DPBP_CMDID_GET_ATTR                            0x004
-#define DPBP_CMDID_RESET                               0x005
+#define DPBP_CMDID_CLOSE                               0x8001
+#define DPBP_CMDID_OPEN                                        0x8041
+#define DPBP_CMDID_CREATE                              0x9041
+#define DPBP_CMDID_DESTROY                             0x9841
+#define DPBP_CMDID_GET_API_VERSION                     0xa041
+
+#define DPBP_CMDID_ENABLE                              0x0021
+#define DPBP_CMDID_DISABLE                             0x0031
+#define DPBP_CMDID_GET_ATTR                            0x0041
+#define DPBP_CMDID_RESET                               0x0051
+#define DPBP_CMDID_IS_ENABLED                          0x0061
 
 /*                cmd, param, offset, width, type, arg_name */
 #define DPBP_CMD_OPEN(cmd, dpbp_id) \
@@ -37,8 +39,6 @@
 do { \
        MC_RSP_OP(cmd, 0, 16, 16, uint16_t, attr->bpid); \
        MC_RSP_OP(cmd, 0, 32, 32, int,      attr->id);\
-       MC_RSP_OP(cmd, 1, 0,  16, uint16_t, attr->version.major);\
-       MC_RSP_OP(cmd, 1, 16, 16, uint16_t, attr->version.minor);\
 } while (0)
 
 /* Data Path Buffer Pool API
@@ -114,9 +114,10 @@ struct dpbp_cfg {
  * Return:     '0' on Success; Error code otherwise.
  */
 int dpbp_create(struct fsl_mc_io       *mc_io,
+               uint16_t                dprc_token,
                uint32_t                cmd_flags,
                const struct dpbp_cfg   *cfg,
-               uint16_t                *token);
+               uint32_t                *obj_id);
 
 /**
  * dpbp_destroy() - Destroy the DPBP object and release all its resources.
@@ -127,8 +128,9 @@ int dpbp_create(struct fsl_mc_io    *mc_io,
  * Return:     '0' on Success; error code otherwise.
  */
 int dpbp_destroy(struct fsl_mc_io      *mc_io,
+                uint16_t               dprc_token,
                 uint32_t               cmd_flags,
-                uint16_t               token);
+                uint32_t               obj_id);
 
 /**
  * dpbp_enable() - Enable the DPBP.
@@ -189,16 +191,7 @@ int dpbp_reset(struct fsl_mc_io    *mc_io,
  *             acquire/release operations on buffers
  */
 struct dpbp_attr {
-       int id;
-       /**
-        * struct version - Structure representing DPBP version
-        * @major:      DPBP major version
-        * @minor:      DPBP minor version
-        */
-       struct {
-               uint16_t major;
-               uint16_t minor;
-       } version;
+       uint32_t id;
        uint16_t bpid;
 };
 
@@ -217,6 +210,21 @@ int dpbp_get_attributes(struct fsl_mc_io   *mc_io,
                        uint16_t                token,
                        struct dpbp_attr        *attr);
 
+/**
+ * dpbp_get_api_version - Retrieve DPBP Major and Minor version info.
+ *
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @major_ver: DPBP major version
+ * @minor_ver: DPBP minor version
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpbp_get_api_version(struct fsl_mc_io *mc_io,
+                        u32 cmd_flags,
+                        u16 *major_ver,
+                        u16 *minor_ver);
+
 /** @} */
 
 #endif /* __FSL_DPBP_H */
index d8c458fb4fc270d6ed83afa442df0454eb536d64..86251e222f8b806b7f4dafea456cef4751595ed5 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright (C) 2013-2015 Freescale Semiconductor
+ * Copyright (C) 2013-2016 Freescale Semiconductor
+ * Copyright 2017 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -8,19 +9,20 @@
 #define _FSL_DPIO_H
 
 /* DPIO Version */
-#define DPIO_VER_MAJOR                         3
+#define DPIO_VER_MAJOR                         4
 #define DPIO_VER_MINOR                         2
 
 /* Command IDs */
-#define DPIO_CMDID_CLOSE                                       0x800
-#define DPIO_CMDID_OPEN                                                0x803
-#define DPIO_CMDID_CREATE                                      0x903
-#define DPIO_CMDID_DESTROY                                     0x900
+#define DPIO_CMDID_CLOSE                                       0x8001
+#define DPIO_CMDID_OPEN                                                0x8031
+#define DPIO_CMDID_CREATE                                      0x9031
+#define DPIO_CMDID_DESTROY                                     0x9831
+#define DPIO_CMDID_GET_API_VERSION                             0xa031
 
-#define DPIO_CMDID_ENABLE                                      0x002
-#define DPIO_CMDID_DISABLE                                     0x003
-#define DPIO_CMDID_GET_ATTR                                    0x004
-#define DPIO_CMDID_RESET                                       0x005
+#define DPIO_CMDID_ENABLE                                      0x0021
+#define DPIO_CMDID_DISABLE                                     0x0031
+#define DPIO_CMDID_GET_ATTR                                    0x0041
+#define DPIO_CMDID_RESET                                       0x0051
 
 /*                cmd, param, offset, width, type, arg_name */
 #define DPIO_CMD_OPEN(cmd, dpio_id) \
@@ -43,8 +45,6 @@ do { \
        MC_RSP_OP(cmd, 0, 56, 4,  enum dpio_channel_mode, attr->channel_mode);\
        MC_RSP_OP(cmd, 1, 0,  64, uint64_t, attr->qbman_portal_ce_offset);\
        MC_RSP_OP(cmd, 2, 0,  64, uint64_t, attr->qbman_portal_ci_offset);\
-       MC_RSP_OP(cmd, 3, 0,  16, uint16_t, attr->version.major);\
-       MC_RSP_OP(cmd, 3, 16, 16, uint16_t, attr->version.minor);\
        MC_RSP_OP(cmd, 3, 32, 32, uint32_t, attr->qbman_version);\
 } while (0)
 
@@ -73,7 +73,7 @@ struct fsl_mc_io;
  */
 int dpio_open(struct fsl_mc_io *mc_io,
              uint32_t          cmd_flags,
-             int               dpio_id,
+             uint32_t          dpio_id,
              uint16_t          *token);
 
 /**
@@ -114,9 +114,10 @@ struct dpio_cfg {
 /**
  * dpio_create() - Create the DPIO object.
  * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Authentication token.
  * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @cfg:       Configuration structure
- * @token:     Returned token; use in subsequent API calls
+ * @obj_id:    Returned obj_id; use in subsequent API calls
  *
  * Create the DPIO object, allocate required resources and
  * perform required initialization.
@@ -134,21 +135,24 @@ struct dpio_cfg {
  * Return:     '0' on Success; Error code otherwise.
  */
 int dpio_create(struct fsl_mc_io       *mc_io,
+               uint16_t                token,
                uint32_t                cmd_flags,
                const struct dpio_cfg   *cfg,
-               uint16_t                *token);
+               uint32_t                *obj_id);
 
 /**
  * dpio_destroy() - Destroy the DPIO object and release all its resources.
  * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Authentication token.
  * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
- * @token:     Token of DPIO object
+ * @obj_id:    Object ID of DPIO
  *
  * Return:     '0' on Success; Error code otherwise
  */
 int dpio_destroy(struct fsl_mc_io      *mc_io,
+                uint16_t               token,
                 uint32_t               cmd_flags,
-                uint16_t               token);
+                uint32_t               obj_id);
 
 /**
  * dpio_enable() - Enable the DPIO, allow I/O portal operations.
@@ -199,16 +203,7 @@ int dpio_reset(struct fsl_mc_io    *mc_io,
  * @qbman_version: QBMAN version
  */
 struct dpio_attr {
-       int id;
-       /**
-        * struct version - DPIO version
-        * @major: DPIO major version
-        * @minor: DPIO minor version
-        */
-       struct {
-               uint16_t major;
-               uint16_t minor;
-       } version;
+       uint32_t id;
        uint64_t qbman_portal_ce_offset;
        uint64_t qbman_portal_ci_offset;
        uint16_t qbman_portal_id;
@@ -231,4 +226,19 @@ int dpio_get_attributes(struct fsl_mc_io   *mc_io,
                        uint16_t                token,
                        struct dpio_attr        *attr);
 
+/**
+ * dpio_get_api_version - Retrieve DPIO Major and Minor version info.
+ *
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @major_ver: DPIO major version
+ * @minor_ver: DPIO minor version
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpio_get_api_version(struct fsl_mc_io *mc_io,
+                        u32 cmd_flags,
+                        u16 *major_ver,
+                        u16 *minor_ver);
+
 #endif /* _FSL_DPIO_H */
index 296f3aed24558a8316d02aaf113e75ffb3446557..36a5cca69cec2900ee033eec4ed9f70c1668c8f3 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * Freescale Layerscape MC I/O wrapper
  *
- * Copyright (C) 2015 Freescale Semiconductor, Inc.
+ * Copyright (C) 2015-2016 Freescale Semiconductor, Inc.
+ * Copyright 2017 NXP
  * Author: Prabhakar Kushwaha <prabhakar@freescale.com>
  *
  * SPDX-License-Identifier:    GPL-2.0+
 #define __FSL_DPMAC_H
 
 /* DPMAC Version */
-#define DPMAC_VER_MAJOR                                3
+#define DPMAC_VER_MAJOR                                4
 #define DPMAC_VER_MINOR                                2
 
 /* Command IDs */
-#define DPMAC_CMDID_CLOSE                      0x800
-#define DPMAC_CMDID_OPEN                       0x80c
-#define DPMAC_CMDID_CREATE                     0x90c
-#define DPMAC_CMDID_DESTROY                    0x900
+#define DPMAC_CMDID_CLOSE                      0x8001
+#define DPMAC_CMDID_OPEN                       0x80c1
+#define DPMAC_CMDID_CREATE                     0x90c1
+#define DPMAC_CMDID_DESTROY                    0x98c1
+#define DPMAC_CMDID_GET_API_VERSION             0xa0c1
 
-#define DPMAC_CMDID_GET_ATTR                   0x004
-#define DPMAC_CMDID_RESET                      0x005
+#define DPMAC_CMDID_GET_ATTR                   0x0041
+#define DPMAC_CMDID_RESET                      0x0051
 
-#define DPMAC_CMDID_MDIO_READ                  0x0c0
-#define DPMAC_CMDID_MDIO_WRITE                 0x0c1
-#define DPMAC_CMDID_GET_LINK_CFG               0x0c2
-#define DPMAC_CMDID_SET_LINK_STATE             0x0c3
-#define DPMAC_CMDID_GET_COUNTER                        0x0c4
+#define DPMAC_CMDID_MDIO_READ                  0x0c01
+#define DPMAC_CMDID_MDIO_WRITE                 0x0c11
+#define DPMAC_CMDID_GET_LINK_CFG               0x0c21
+#define DPMAC_CMDID_SET_LINK_STATE             0x0c31
+#define DPMAC_CMDID_GET_COUNTER                        0x0c41
 
 /*                cmd, param, offset, width, type, arg_name */
 #define DPMAC_CMD_CREATE(cmd, cfg) \
-       MC_CMD_OP(cmd, 0, 0,  32, int,      cfg->mac_id)
+       MC_CMD_OP(cmd, 0, 0,  16, uint16_t,      cfg->mac_id)
 
 /*                cmd, param, offset, width, type, arg_name */
 #define DPMAC_CMD_OPEN(cmd, dpmac_id) \
@@ -42,8 +44,6 @@
 do { \
        MC_RSP_OP(cmd, 0, 0,  32, int,                  attr->phy_id);\
        MC_RSP_OP(cmd, 0, 32, 32, int,                  attr->id);\
-       MC_RSP_OP(cmd, 1, 0,  16, uint16_t,             attr->version.major);\
-       MC_RSP_OP(cmd, 1, 16, 16, uint16_t,             attr->version.minor);\
        MC_RSP_OP(cmd, 1, 32,  8, enum dpmac_link_type, attr->link_type);\
        MC_RSP_OP(cmd, 1, 40,  8, enum dpmac_eth_if,    attr->eth_if);\
        MC_RSP_OP(cmd, 2, 0,  32, uint32_t,             attr->max_rate);\
@@ -85,7 +85,7 @@ do { \
 
 /*                cmd, param, offset, width, type, arg_name */
 #define DPMAC_CMD_GET_COUNTER(cmd, type) \
-       MC_CMD_OP(cmd, 0, 0,  8, enum dpmac_counter, type)
+       MC_CMD_OP(cmd, 1, 0,  64, enum dpmac_counter, type)
 
 /*                cmd, param, offset, width, type, arg_name */
 #define DPMAC_RSP_GET_COUNTER(cmd, counter) \
@@ -187,9 +187,10 @@ struct dpmac_cfg {
 /**
  * dpmac_create() - Create the DPMAC object.
  * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Authentication token.
  * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @cfg:       Configuration structure
- * @token:     Returned token; use in subsequent API calls
+ * @obj_id:    Returned obj_id; use in subsequent API calls
  *
  * Create the DPMAC object, allocate required resources and
  * perform required initialization.
@@ -206,21 +207,24 @@ struct dpmac_cfg {
  * Return:     '0' on Success; Error code otherwise.
  */
 int dpmac_create(struct fsl_mc_io      *mc_io,
+                uint16_t               token,
                 uint32_t               cmd_flags,
                 const struct dpmac_cfg *cfg,
-                uint16_t               *token);
+                uint32_t               *obj_id);
 
 /**
  * dpmac_destroy() - Destroy the DPMAC object and release all its resources.
  * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Authentication token.
  * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
- * @token:     Token of DPMAC object
+ * @obj_id:    DPMAC object id
  *
  * Return:     '0' on Success; error code otherwise.
  */
 int dpmac_destroy(struct fsl_mc_io     *mc_io,
+                 uint16_t              token,
                  uint32_t              cmd_flags,
-                 uint16_t              token);
+                 uint32_t              obj_id);
 
 /* DPMAC IRQ Index and Events */
 
@@ -246,15 +250,6 @@ struct dpmac_attr {
        enum dpmac_link_type    link_type;
        enum dpmac_eth_if       eth_if;
        uint32_t                max_rate;
-       /**
-        * struct version - Structure representing DPMAC version
-        * @major:      DPMAC major version
-        * @minor:      DPMAC minor version
-        */
-       struct {
-               uint16_t major;
-               uint16_t minor;
-       } version;
 };
 
 /**
@@ -464,5 +459,19 @@ int dpmac_get_counter(struct fsl_mc_io             *mc_io,
                      uint16_t                  token,
                      enum dpmac_counter         type,
                      uint64_t                  *counter);
+/**
+ * dpmac_get_api_version - Retrieve DPMAC Major and Minor version info.
+ *
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @major_ver: DPMAC major version
+ * @minor_ver: DPMAC minor version
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpmac_get_api_version(struct fsl_mc_io *mc_io,
+                         uint32_t cmd_flags,
+                         uint16_t *major_ver,
+                         uint16_t *minor_ver);
 
 #endif /* __FSL_DPMAC_H */
index f396dc304fe2a77c1f4b3f35734256969694264d..5b80b6f8e0c7577730569556a6bca9bfcf61ceee 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright (C) 2013-2015 Freescale Semiconductor
+ * Copyright (C) 2013-2016 Freescale Semiconductor
+ * Copyright 2017 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
 #define _FSL_DPNI_H
 
 /* DPNI Version */
-#define DPNI_VER_MAJOR                         6
-#define DPNI_VER_MINOR                         0
+#define DPNI_VER_MAJOR                         7
+#define DPNI_VER_MINOR                         3
 
 /* Command IDs */
-#define DPNI_CMDID_OPEN                                0x801
-#define DPNI_CMDID_CLOSE                       0x800
-#define DPNI_CMDID_CREATE                      0x901
-#define DPNI_CMDID_DESTROY                     0x900
-
-#define DPNI_CMDID_ENABLE                      0x002
-#define DPNI_CMDID_DISABLE                     0x003
-#define DPNI_CMDID_GET_ATTR                    0x004
-#define DPNI_CMDID_RESET                       0x005
-
-#define DPNI_CMDID_SET_POOLS                   0x200
-#define DPNI_CMDID_GET_RX_BUFFER_LAYOUT                0x201
-#define DPNI_CMDID_SET_RX_BUFFER_LAYOUT                0x202
-#define DPNI_CMDID_GET_TX_BUFFER_LAYOUT                0x203
-#define DPNI_CMDID_SET_TX_BUFFER_LAYOUT                0x204
-#define DPNI_CMDID_SET_TX_CONF_BUFFER_LAYOUT   0x205
-#define DPNI_CMDID_GET_TX_CONF_BUFFER_LAYOUT   0x206
-#define DPNI_CMDID_SET_ERRORS_BEHAVIOR         0x20B
-
-#define DPNI_CMDID_GET_QDID                    0x210
-#define DPNI_CMDID_GET_TX_DATA_OFFSET          0x212
-#define DPNI_CMDID_GET_COUNTER                 0x213
-#define DPNI_CMDID_SET_COUNTER                 0x214
-#define DPNI_CMDID_GET_LINK_STATE              0x215
-#define DPNI_CMDID_SET_LINK_CFG                0x21A
-
-#define DPNI_CMDID_SET_PRIM_MAC                        0x224
-#define DPNI_CMDID_GET_PRIM_MAC                        0x225
-#define DPNI_CMDID_ADD_MAC_ADDR                        0x226
-#define DPNI_CMDID_REMOVE_MAC_ADDR             0x227
-
-#define DPNI_CMDID_SET_TX_FLOW                 0x236
-#define DPNI_CMDID_GET_TX_FLOW                 0x237
-#define DPNI_CMDID_SET_RX_FLOW                 0x238
-#define DPNI_CMDID_GET_RX_FLOW                 0x239
-#define DPNI_CMDID_SET_TX_CONF                                         0x257
-#define DPNI_CMDID_GET_TX_CONF                                         0x258
+#define DPNI_CMDID_OPEN                                0x8011
+#define DPNI_CMDID_CLOSE                       0x8001
+#define DPNI_CMDID_CREATE                      0x9011
+#define DPNI_CMDID_DESTROY                     0x9811
+#define DPNI_CMDID_GET_API_VERSION              0xa011
+
+#define DPNI_CMDID_ENABLE                      0x0021
+#define DPNI_CMDID_DISABLE                     0x0031
+#define DPNI_CMDID_GET_ATTR                    0x0041
+#define DPNI_CMDID_RESET                       0x0051
+
+#define DPNI_CMDID_SET_POOLS                   0x2002
+#define DPNI_CMDID_SET_BUFFER_LAYOUT           0x2651
+#define DPNI_CMDID_GET_BUFFER_LAYOUT           0x2641
+#define DPNI_CMDID_SET_ERRORS_BEHAVIOR         0x20B1
+
+#define DPNI_CMDID_GET_QDID                    0x2101
+#define DPNI_CMDID_GET_TX_DATA_OFFSET          0x2121
+#define DPNI_CMDID_GET_LINK_STATE              0x2151
+#define DPNI_CMDID_SET_LINK_CFG                        0x21A1
+
+#define DPNI_CMDID_SET_PRIM_MAC                        0x2241
+#define DPNI_CMDID_GET_PRIM_MAC                        0x2251
+#define DPNI_CMDID_ADD_MAC_ADDR                        0x2261
+#define DPNI_CMDID_REMOVE_MAC_ADDR             0x2271
+
+#define DPNI_CMDID_GET_STATISTICS              0x25D1
+#define DPNI_CMDID_RESET_STATISTICS            0x25E1
+#define DPNI_CMDID_GET_QUEUE                   0x25F1
+#define DPNI_CMDID_SET_QUEUE                   0x2601
+#define DPNI_CMDID_SET_TX_CONFIRMATION_MODE    0x2661
 
 /*                cmd, param, offset, width, type, arg_name */
 #define DPNI_CMD_OPEN(cmd, dpni_id) \
        MC_CMD_OP(cmd,   0,     0,      32,     int,    dpni_id)
 
-#define DPNI_PREP_EXTENDED_CFG(ext, cfg) \
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_PREP_CFG(param, cfg) \
 do { \
-       MC_PREP_OP(ext, 0, 0,   16, uint16_t, cfg->tc_cfg[0].max_dist); \
-       MC_PREP_OP(ext, 0, 16,  16, uint16_t, cfg->tc_cfg[0].max_fs_entries); \
-       MC_PREP_OP(ext, 0, 32,  16, uint16_t, cfg->tc_cfg[1].max_dist); \
-       MC_PREP_OP(ext, 0, 48,  16, uint16_t, cfg->tc_cfg[1].max_fs_entries); \
-       MC_PREP_OP(ext, 1, 0,   16, uint16_t, cfg->tc_cfg[2].max_dist); \
-       MC_PREP_OP(ext, 1, 16,  16, uint16_t, cfg->tc_cfg[2].max_fs_entries); \
-       MC_PREP_OP(ext, 1, 32,  16, uint16_t, cfg->tc_cfg[3].max_dist); \
-       MC_PREP_OP(ext, 1, 48,  16, uint16_t, cfg->tc_cfg[3].max_fs_entries); \
-       MC_PREP_OP(ext, 2, 0,   16, uint16_t, cfg->tc_cfg[4].max_dist); \
-       MC_PREP_OP(ext, 2, 16,  16, uint16_t, cfg->tc_cfg[4].max_fs_entries); \
-       MC_PREP_OP(ext, 2, 32,  16, uint16_t, cfg->tc_cfg[5].max_dist); \
-       MC_PREP_OP(ext, 2, 48,  16, uint16_t, cfg->tc_cfg[5].max_fs_entries); \
-       MC_PREP_OP(ext, 3, 0,   16, uint16_t, cfg->tc_cfg[6].max_dist); \
-       MC_PREP_OP(ext, 3, 16,  16, uint16_t, cfg->tc_cfg[6].max_fs_entries); \
-       MC_PREP_OP(ext, 3, 32,  16, uint16_t, cfg->tc_cfg[7].max_dist); \
-       MC_PREP_OP(ext, 3, 48,  16, uint16_t, cfg->tc_cfg[7].max_fs_entries); \
-       MC_PREP_OP(ext, 4, 0,   16, uint16_t, \
-                  cfg->ipr_cfg.max_open_frames_ipv4); \
-       MC_PREP_OP(ext, 4, 16,  16, uint16_t, \
-                  cfg->ipr_cfg.max_open_frames_ipv6); \
-       MC_PREP_OP(ext, 4, 32,  16, uint16_t, \
-                  cfg->ipr_cfg.max_reass_frm_size); \
-       MC_PREP_OP(ext, 5, 0,   16, uint16_t, \
-                  cfg->ipr_cfg.min_frag_size_ipv4); \
-       MC_PREP_OP(ext, 5, 16,  16, uint16_t, \
-                  cfg->ipr_cfg.min_frag_size_ipv6); \
+       MC_PREP_OP(param, 0, 0,   32, uint16_t, cfg->adv.options); \
+       MC_PREP_OP(param, 0, 32,   8, uint16_t, cfg->adv.num_queues); \
+       MC_PREP_OP(param, 0, 40,   8, uint16_t, cfg->adv.num_tcs); \
+       MC_PREP_OP(param, 0, 48,   8, uint16_t, cfg->adv.mac_entries); \
+       MC_PREP_OP(param, 1, 0,   8, uint16_t, cfg->adv.vlan_entries); \
+       MC_PREP_OP(param, 1, 16,   8, uint16_t, cfg->adv.qos_entries); \
+       MC_PREP_OP(param, 1, 32,   16, uint16_t, cfg->adv.fs_entries); \
 } while (0)
 
-#define DPNI_EXT_EXTENDED_CFG(ext, cfg) \
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_EXT_CFG(param, cfg) \
 do { \
-       MC_EXT_OP(ext, 0, 0,   16, uint16_t, cfg->tc_cfg[0].max_dist); \
-       MC_EXT_OP(ext, 0, 16,  16, uint16_t, cfg->tc_cfg[0].max_fs_entries); \
-       MC_EXT_OP(ext, 0, 32,  16, uint16_t, cfg->tc_cfg[1].max_dist); \
-       MC_EXT_OP(ext, 0, 48,  16, uint16_t, cfg->tc_cfg[1].max_fs_entries); \
-       MC_EXT_OP(ext, 1, 0,   16, uint16_t, cfg->tc_cfg[2].max_dist); \
-       MC_EXT_OP(ext, 1, 16,  16, uint16_t, cfg->tc_cfg[2].max_fs_entries); \
-       MC_EXT_OP(ext, 1, 32,  16, uint16_t, cfg->tc_cfg[3].max_dist); \
-       MC_EXT_OP(ext, 1, 48,  16, uint16_t, cfg->tc_cfg[3].max_fs_entries); \
-       MC_EXT_OP(ext, 2, 0,   16, uint16_t, cfg->tc_cfg[4].max_dist); \
-       MC_EXT_OP(ext, 2, 16,  16, uint16_t, cfg->tc_cfg[4].max_fs_entries); \
-       MC_EXT_OP(ext, 2, 32,  16, uint16_t, cfg->tc_cfg[5].max_dist); \
-       MC_EXT_OP(ext, 2, 48,  16, uint16_t, cfg->tc_cfg[5].max_fs_entries); \
-       MC_EXT_OP(ext, 3, 0,   16, uint16_t, cfg->tc_cfg[6].max_dist); \
-       MC_EXT_OP(ext, 3, 16,  16, uint16_t, cfg->tc_cfg[6].max_fs_entries); \
-       MC_EXT_OP(ext, 3, 32,  16, uint16_t, cfg->tc_cfg[7].max_dist); \
-       MC_EXT_OP(ext, 3, 48,  16, uint16_t, cfg->tc_cfg[7].max_fs_entries); \
-       MC_EXT_OP(ext, 4, 0,   16, uint16_t, \
-                 cfg->ipr_cfg.max_open_frames_ipv4); \
-       MC_EXT_OP(ext, 4, 16,  16, uint16_t, \
-                 cfg->ipr_cfg.max_open_frames_ipv6); \
-       MC_EXT_OP(ext, 4, 32,  16, uint16_t, \
-                 cfg->ipr_cfg.max_reass_frm_size); \
-       MC_EXT_OP(ext, 5, 0,   16, uint16_t, \
-                 cfg->ipr_cfg.min_frag_size_ipv4); \
-       MC_EXT_OP(ext, 5, 16,  16, uint16_t, \
-                 cfg->ipr_cfg.min_frag_size_ipv6); \
+       MC_EXT_OP(param, 0, 0,   32, uint16_t, cfg->adv.options); \
+       MC_EXT_OP(param, 0, 32,   8, uint16_t, cfg->adv.num_queues); \
+       MC_EXT_OP(param, 0, 40,   8, uint16_t, cfg->adv.num_tcs); \
+       MC_EXT_OP(param, 0, 48,   8, uint16_t, cfg->adv.mac_entries); \
+       MC_EXT_OP(param, 1, 0,   8, uint16_t, cfg->adv.vlan_entries); \
+       MC_EXT_OP(param, 1, 16,   8, uint16_t, cfg->adv.qos_entries); \
+       MC_EXT_OP(param, 1, 32,   16, uint16_t, cfg->adv.fs_entries); \
 } while (0)
 
 /*                cmd, param, offset, width, type, arg_name */
 #define DPNI_CMD_CREATE(cmd, cfg) \
 do { \
-       MC_CMD_OP(cmd, 0, 0,    8,  uint8_t,  cfg->adv.max_tcs); \
-       MC_CMD_OP(cmd, 0, 8,    8,  uint8_t,  cfg->adv.max_senders); \
-       MC_CMD_OP(cmd, 0, 16,   8,  uint8_t,  cfg->mac_addr[5]); \
-       MC_CMD_OP(cmd, 0, 24,   8,  uint8_t,  cfg->mac_addr[4]); \
-       MC_CMD_OP(cmd, 0, 32,   8,  uint8_t,  cfg->mac_addr[3]); \
-       MC_CMD_OP(cmd, 0, 40,   8,  uint8_t,  cfg->mac_addr[2]); \
-       MC_CMD_OP(cmd, 0, 48,   8,  uint8_t,  cfg->mac_addr[1]); \
-       MC_CMD_OP(cmd, 0, 56,   8,  uint8_t,  cfg->mac_addr[0]); \
-       MC_CMD_OP(cmd, 1, 0,    32, uint32_t, cfg->adv.options); \
-       MC_CMD_OP(cmd, 2, 0,    8,  uint8_t,  cfg->adv.max_unicast_filters); \
-       MC_CMD_OP(cmd, 2, 8,    8,  uint8_t,  cfg->adv.max_multicast_filters); \
-       MC_CMD_OP(cmd, 2, 16,   8,  uint8_t,  cfg->adv.max_vlan_filters); \
-       MC_CMD_OP(cmd, 2, 24,   8,  uint8_t,  cfg->adv.max_qos_entries); \
-       MC_CMD_OP(cmd, 2, 32,   8,  uint8_t,  cfg->adv.max_qos_key_size); \
-       MC_CMD_OP(cmd, 2, 48,   8,  uint8_t,  cfg->adv.max_dist_key_size); \
-       MC_CMD_OP(cmd, 2, 56,   8,  enum net_prot, cfg->adv.start_hdr); \
-       MC_CMD_OP(cmd, 4, 48,   8,  uint8_t, cfg->adv.max_policers); \
-       MC_CMD_OP(cmd, 4, 56,   8,  uint8_t, cfg->adv.max_congestion_ctrl); \
-       MC_CMD_OP(cmd, 5, 0,    64, uint64_t, cfg->adv.ext_cfg_iova); \
+       MC_CMD_OP(cmd, 0, 0,    32,     uint32_t,  cfg->adv.options); \
+       MC_CMD_OP(cmd, 0, 32,   8,      uint8_t,   cfg->adv.num_queues); \
+       MC_CMD_OP(cmd, 0, 40,   8,      uint8_t,   cfg->adv.num_tcs); \
+       MC_CMD_OP(cmd, 0, 48,   8,      uint8_t,   cfg->adv.mac_entries); \
+       MC_CMD_OP(cmd, 1, 0,    8,      uint8_t,   cfg->adv.vlan_entries); \
+       MC_CMD_OP(cmd, 1, 16,   8,      uint8_t,   cfg->adv.qos_entries); \
+       MC_CMD_OP(cmd, 1, 32,   16,     uint8_t,   cfg->adv.fs_entries); \
 } while (0)
 
 /*                cmd, param, offset, width, type, arg_name */
@@ -167,28 +114,19 @@ do { \
        MC_CMD_OP(cmd, 6, 16, 16, uint16_t, cfg->pools[7].buffer_size);\
 } while (0)
 
-/*                cmd, param, offset, width, type, arg_name */
-#define DPNI_CMD_GET_ATTR(cmd, attr) \
-       MC_CMD_OP(cmd, 6, 0,  64, uint64_t, attr->ext_cfg_iova)
-
 /*                cmd, param, offset, width, type, arg_name */
 #define DPNI_RSP_GET_ATTR(cmd, attr) \
 do { \
-       MC_RSP_OP(cmd, 0, 0,  32, int,      attr->id);\
-       MC_RSP_OP(cmd, 0, 32, 8,  uint8_t,  attr->max_tcs); \
-       MC_RSP_OP(cmd, 0, 40, 8,  uint8_t,  attr->max_senders); \
-       MC_RSP_OP(cmd, 0, 48, 8,  enum net_prot, attr->start_hdr); \
-       MC_RSP_OP(cmd, 1, 0,  32, uint32_t, attr->options); \
-       MC_RSP_OP(cmd, 2, 0,  8,  uint8_t,  attr->max_unicast_filters); \
-       MC_RSP_OP(cmd, 2, 8,  8,  uint8_t,  attr->max_multicast_filters);\
-       MC_RSP_OP(cmd, 2, 16, 8,  uint8_t,  attr->max_vlan_filters); \
-       MC_RSP_OP(cmd, 2, 24, 8,  uint8_t,  attr->max_qos_entries); \
-       MC_RSP_OP(cmd, 2, 32, 8,  uint8_t,  attr->max_qos_key_size); \
-       MC_RSP_OP(cmd, 2, 40, 8,  uint8_t,  attr->max_dist_key_size); \
-       MC_RSP_OP(cmd, 4, 48, 8,  uint8_t, attr->max_policers); \
-       MC_RSP_OP(cmd, 4, 56, 8,  uint8_t, attr->max_congestion_ctrl); \
-       MC_RSP_OP(cmd, 5, 32, 16, uint16_t, attr->version.major);\
-       MC_RSP_OP(cmd, 5, 48, 16, uint16_t, attr->version.minor);\
+       MC_RSP_OP(cmd, 0, 0,  32, int,      attr->options);\
+       MC_RSP_OP(cmd, 0, 32,  8,  uint8_t,  attr->max_num_queues); \
+       MC_RSP_OP(cmd, 0, 40,  8,  uint8_t,  attr->max_num_tcs); \
+       MC_RSP_OP(cmd, 0, 48,  8,  uint8_t,  attr->max_mac_entries); \
+       MC_RSP_OP(cmd, 1,  0,  8,  uint8_t,  attr->max_vlan_entries); \
+       MC_RSP_OP(cmd, 1, 16,  8,  uint8_t,  attr->max_qos_entries); \
+       MC_RSP_OP(cmd, 1, 32, 16,  uint16_t,  attr->max_fs_entries); \
+       MC_RSP_OP(cmd, 2,  0,  8,  uint8_t,  attr->max_qos_key_size); \
+       MC_RSP_OP(cmd, 2,  8,  8,  uint8_t,  attr->max_fs_key_size); \
+       MC_RSP_OP(cmd, 2, 16, 16,  uint16_t,  attr->wriop_version); \
 } while (0)
 
 /*                cmd, param, offset, width, type, arg_name */
@@ -200,78 +138,17 @@ do { \
 } while (0)
 
 /*                cmd, param, offset, width, type, arg_name */
-#define DPNI_RSP_GET_RX_BUFFER_LAYOUT(cmd, layout) \
-do { \
-       MC_RSP_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
-       MC_RSP_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
-       MC_RSP_OP(cmd, 1, 0,  1,  int,      layout->pass_timestamp); \
-       MC_RSP_OP(cmd, 1, 1,  1,  int,      layout->pass_parser_result); \
-       MC_RSP_OP(cmd, 1, 2,  1,  int,      layout->pass_frame_status); \
-       MC_RSP_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
-       MC_RSP_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
-} while (0)
-
-/*                cmd, param, offset, width, type, arg_name */
-#define DPNI_CMD_SET_RX_BUFFER_LAYOUT(cmd, layout) \
-do { \
-       MC_CMD_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
-       MC_CMD_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
-       MC_CMD_OP(cmd, 0, 32, 32, uint32_t, layout->options); \
-       MC_CMD_OP(cmd, 1, 0,  1,  int,      layout->pass_timestamp); \
-       MC_CMD_OP(cmd, 1, 1,  1,  int,      layout->pass_parser_result); \
-       MC_CMD_OP(cmd, 1, 2,  1,  int,      layout->pass_frame_status); \
-       MC_CMD_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
-       MC_CMD_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
-} while (0)
-
-/*                cmd, param, offset, width, type, arg_name */
-#define DPNI_RSP_GET_TX_BUFFER_LAYOUT(cmd, layout) \
-do { \
-       MC_RSP_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
-       MC_RSP_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
-       MC_RSP_OP(cmd, 1, 0,  1,  int,      layout->pass_timestamp); \
-       MC_RSP_OP(cmd, 1, 1,  1,  int,      layout->pass_parser_result); \
-       MC_RSP_OP(cmd, 1, 2,  1,  int,      layout->pass_frame_status); \
-       MC_RSP_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
-       MC_RSP_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
-} while (0)
-
-/*                cmd, param, offset, width, type, arg_name */
-#define DPNI_CMD_SET_TX_BUFFER_LAYOUT(cmd, layout) \
-do { \
-       MC_CMD_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
-       MC_CMD_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
-       MC_CMD_OP(cmd, 0, 32, 32, uint32_t, layout->options); \
-       MC_CMD_OP(cmd, 1, 0,  1,  int,      layout->pass_timestamp); \
-       MC_CMD_OP(cmd, 1, 1,  1,  int,      layout->pass_parser_result); \
-       MC_CMD_OP(cmd, 1, 2,  1,  int,      layout->pass_frame_status); \
-       MC_CMD_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
-       MC_CMD_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
-} while (0)
-
-/*                cmd, param, offset, width, type, arg_name */
-#define DPNI_RSP_GET_TX_CONF_BUFFER_LAYOUT(cmd, layout) \
-do { \
-       MC_RSP_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
-       MC_RSP_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
-       MC_RSP_OP(cmd, 1, 0,  1,  int,      layout->pass_timestamp); \
-       MC_RSP_OP(cmd, 1, 1,  1,  int,      layout->pass_parser_result); \
-       MC_RSP_OP(cmd, 1, 2,  1,  int,      layout->pass_frame_status); \
-       MC_RSP_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
-       MC_RSP_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
-} while (0)
-
-/*                cmd, param, offset, width, type, arg_name */
-#define DPNI_CMD_SET_TX_CONF_BUFFER_LAYOUT(cmd, layout) \
+#define DPNI_CMD_SET_BUFFER_LAYOUT(cmd, layout, queue) \
 do { \
-       MC_CMD_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
-       MC_CMD_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
-       MC_CMD_OP(cmd, 0, 32, 32, uint32_t, layout->options); \
-       MC_CMD_OP(cmd, 1, 0,  1,  int,      layout->pass_timestamp); \
-       MC_CMD_OP(cmd, 1, 1,  1,  int,      layout->pass_parser_result); \
-       MC_CMD_OP(cmd, 1, 2,  1,  int,      layout->pass_frame_status); \
-       MC_CMD_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
-       MC_CMD_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
+       MC_CMD_OP(cmd, 0, 0,  8, enum dpni_queue_type, queue); \
+       MC_CMD_OP(cmd, 1, 0,  16, uint16_t, layout->private_data_size); \
+       MC_CMD_OP(cmd, 1, 16, 16, uint16_t, layout->data_align); \
+       MC_CMD_OP(cmd, 0, 32, 16, uint16_t, layout->options); \
+       MC_CMD_OP(cmd, 0, 48,  1,  int,     layout->pass_timestamp); \
+       MC_CMD_OP(cmd, 0, 49,  1,  int,     layout->pass_parser_result); \
+       MC_CMD_OP(cmd, 0, 50,  1,  int,     layout->pass_frame_status); \
+       MC_CMD_OP(cmd, 1, 32, 16, uint16_t, layout->data_head_room); \
+       MC_CMD_OP(cmd, 1, 48, 16, uint16_t, layout->data_tail_room); \
 } while (0)
 
 /*                cmd, param, offset, width, type, arg_name */
@@ -282,21 +159,6 @@ do { \
 #define DPNI_RSP_GET_TX_DATA_OFFSET(cmd, data_offset) \
        MC_RSP_OP(cmd, 0, 0,  16, uint16_t, data_offset)
 
-/*                cmd, param, offset, width, type, arg_name */
-#define DPNI_CMD_GET_COUNTER(cmd, counter) \
-       MC_CMD_OP(cmd, 0, 0,  16, enum dpni_counter, counter)
-
-/*                cmd, param, offset, width, type, arg_name */
-#define DPNI_RSP_GET_COUNTER(cmd, value) \
-       MC_RSP_OP(cmd, 1, 0,  64, uint64_t, value)
-
-/*                cmd, param, offset, width, type, arg_name */
-#define DPNI_CMD_SET_COUNTER(cmd, counter, value) \
-do { \
-       MC_CMD_OP(cmd, 0, 0,  16, enum dpni_counter, counter); \
-       MC_CMD_OP(cmd, 1, 0,  64, uint64_t, value); \
-} while (0)
-
 /*                cmd, param, offset, width, type, arg_name */
 #define DPNI_CMD_SET_LINK_CFG(cmd, cfg) \
 do { \
@@ -358,129 +220,54 @@ do { \
        MC_CMD_OP(cmd, 0, 56, 8,  uint8_t,  mac_addr[0]); \
 } while (0)
 
-/*                cmd, param, offset, width, type, arg_name */
-#define DPNI_CMD_SET_TX_FLOW(cmd, flow_id, cfg) \
+#define DPNI_CMD_GET_QUEUE(cmd, type, tc, index) \
 do { \
-       MC_CMD_OP(cmd, 0, 43, 1,  int,      cfg->l3_chksum_gen);\
-       MC_CMD_OP(cmd, 0, 44, 1,  int,      cfg->l4_chksum_gen);\
-       MC_CMD_OP(cmd, 0, 45, 1,  int,      cfg->use_common_tx_conf_queue);\
-       MC_CMD_OP(cmd, 0, 48, 16, uint16_t, flow_id);\
-       MC_CMD_OP(cmd, 2, 0,  32, uint32_t, cfg->options);\
+       MC_CMD_OP(cmd, 0,  0,  8, enum dpni_queue_type, type); \
+       MC_CMD_OP(cmd, 0,  8,  8, uint8_t, tc); \
+       MC_CMD_OP(cmd, 0, 16,  8, uint8_t, index); \
 } while (0)
 
-/*                cmd, param, offset, width, type, arg_name */
-#define DPNI_RSP_SET_TX_FLOW(cmd, flow_id) \
-       MC_RSP_OP(cmd, 0, 48, 16, uint16_t, flow_id)
-
-/*                cmd, param, offset, width, type, arg_name */
-#define DPNI_CMD_GET_TX_FLOW(cmd, flow_id) \
-       MC_CMD_OP(cmd, 0, 48, 16, uint16_t, flow_id)
-
-/*                cmd, param, offset, width, type, arg_name */
-#define DPNI_RSP_GET_TX_FLOW(cmd, attr) \
+#define DPNI_RSP_GET_QUEUE(cmd, queue) \
 do { \
-       MC_RSP_OP(cmd, 0, 43, 1,  int,      attr->l3_chksum_gen);\
-       MC_RSP_OP(cmd, 0, 44, 1,  int,      attr->l4_chksum_gen);\
-       MC_RSP_OP(cmd, 0, 45, 1,  int,      attr->use_common_tx_conf_queue);\
+       MC_RSP_OP(cmd, 1,  0, 32, uint32_t, (queue)->destination.id); \
+       MC_RSP_OP(cmd, 1, 56,  4, enum dpni_dest, (queue)->destination.type); \
+       MC_RSP_OP(cmd, 1, 62,  1, char, (queue)->destination.stash_ctrl); \
+       MC_RSP_OP(cmd, 1, 63,  1, char, (queue)->destination.hold_active); \
+       MC_RSP_OP(cmd, 2,  0, 64, uint64_t, (queue)->flc); \
+       MC_RSP_OP(cmd, 3,  0, 64, uint64_t, (queue)->user_context); \
+       MC_RSP_OP(cmd, 4,  0, 32, uint32_t, (queue)->fqid); \
+       MC_RSP_OP(cmd, 4, 32, 16, uint16_t, (queue)->qdbin); \
 } while (0)
 
-/*                cmd, param, offset, width, type, arg_name */
-#define DPNI_CMD_SET_RX_FLOW(cmd, tc_id, flow_id, cfg) \
+#define DPNI_CMD_SET_QUEUE(cmd, type, tc, index, queue) \
 do { \
-       MC_CMD_OP(cmd, 0, 0,  32, int,      cfg->dest_cfg.dest_id); \
-       MC_CMD_OP(cmd, 0, 32, 8,  uint8_t,  cfg->dest_cfg.priority);\
-       MC_CMD_OP(cmd, 0, 40, 2,  enum dpni_dest, cfg->dest_cfg.dest_type);\
-       MC_CMD_OP(cmd, 0, 42, 1,  int,      cfg->order_preservation_en);\
-       MC_CMD_OP(cmd, 0, 48, 16, uint16_t, flow_id); \
-       MC_CMD_OP(cmd, 1, 0,  64, uint64_t, cfg->user_ctx); \
-       MC_CMD_OP(cmd, 2, 16, 8,  uint8_t,  tc_id); \
-       MC_CMD_OP(cmd, 2, 32, 32, uint32_t, cfg->options); \
-       MC_CMD_OP(cmd, 3, 0,  4,  enum dpni_flc_type, cfg->flc_cfg.flc_type); \
-       MC_CMD_OP(cmd, 3, 4,  4,  enum dpni_stash_size, \
-               cfg->flc_cfg.frame_data_size);\
-       MC_CMD_OP(cmd, 3, 8,  4,  enum dpni_stash_size, \
-               cfg->flc_cfg.flow_context_size);\
-       MC_CMD_OP(cmd, 3, 32, 32, uint32_t, cfg->flc_cfg.options);\
-       MC_CMD_OP(cmd, 4, 0,  64, uint64_t, cfg->flc_cfg.flow_context);\
-       MC_CMD_OP(cmd, 5, 0,  32, uint32_t, cfg->tail_drop_threshold); \
+       MC_CMD_OP(cmd, 0,  0,  8, enum dpni_queue_type, type); \
+       MC_CMD_OP(cmd, 0,  8,  8, uint8_t, tc); \
+       MC_CMD_OP(cmd, 0, 16,  8, uint8_t, index); \
+       MC_CMD_OP(cmd, 0, 24,  8, uint8_t, (queue)->options); \
+       MC_CMD_OP(cmd, 1,  0, 32, uint32_t, (queue)->destination.id); \
+       MC_CMD_OP(cmd, 1, 56,  4, enum dpni_dest, (queue)->destination.type); \
+       MC_CMD_OP(cmd, 1, 62,  1, char, (queue)->destination.stash_ctrl); \
+       MC_CMD_OP(cmd, 1, 63,  1, char, (queue)->destination.hold_active); \
+       MC_CMD_OP(cmd, 1,  0, 32, uint32_t, (queue)->destination.id); \
+       MC_CMD_OP(cmd, 2,  0, 64, uint64_t, (queue)->flc); \
+       MC_CMD_OP(cmd, 3,  0, 64, uint64_t, (queue)->user_context); \
 } while (0)
 
-/*                cmd, param, offset, width, type, arg_name */
-#define DPNI_CMD_GET_RX_FLOW(cmd, tc_id, flow_id) \
-do { \
-       MC_CMD_OP(cmd, 0, 16, 8,  uint8_t,  tc_id); \
-       MC_CMD_OP(cmd, 0, 48, 16, uint16_t, flow_id); \
-} while (0)
+/*                     cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_GET_STATISTICS(cmd, page) \
+       MC_CMD_OP(cmd, 0, 0, 8, uint8_t, page)
 
 /*                cmd, param, offset, width, type, arg_name */
-#define DPNI_RSP_GET_RX_FLOW(cmd, attr) \
+#define DPNI_RSP_GET_STATISTICS(cmd, stat) \
 do { \
-       MC_RSP_OP(cmd, 0, 0,  32, int,      attr->dest_cfg.dest_id); \
-       MC_RSP_OP(cmd, 0, 32, 8,  uint8_t,  attr->dest_cfg.priority);\
-       MC_RSP_OP(cmd, 0, 40, 2,  enum dpni_dest, attr->dest_cfg.dest_type); \
-       MC_RSP_OP(cmd, 0, 42, 1,  int,      attr->order_preservation_en);\
-       MC_RSP_OP(cmd, 1, 0,  64, uint64_t, attr->user_ctx); \
-       MC_RSP_OP(cmd, 2, 0,  32, uint32_t, attr->tail_drop_threshold); \
-       MC_RSP_OP(cmd, 2, 32, 32, uint32_t, attr->fqid); \
-       MC_RSP_OP(cmd, 3, 0,  4,  enum dpni_flc_type, attr->flc_cfg.flc_type); \
-       MC_RSP_OP(cmd, 3, 4,  4,  enum dpni_stash_size, \
-               attr->flc_cfg.frame_data_size);\
-       MC_RSP_OP(cmd, 3, 8,  4,  enum dpni_stash_size, \
-               attr->flc_cfg.flow_context_size);\
-       MC_RSP_OP(cmd, 3, 32, 32, uint32_t, attr->flc_cfg.options);\
-       MC_RSP_OP(cmd, 4, 0,  64, uint64_t, attr->flc_cfg.flow_context);\
-} while (0)
-
-#define DPNI_CMD_SET_TX_CONF(cmd, flow_id, cfg) \
-do { \
-       MC_CMD_OP(cmd, 0, 32, 8,  uint8_t, cfg->queue_cfg.dest_cfg.priority); \
-       MC_CMD_OP(cmd, 0, 40, 2,  enum dpni_dest, \
-               cfg->queue_cfg.dest_cfg.dest_type); \
-       MC_CMD_OP(cmd, 0, 42, 1,  int, cfg->errors_only); \
-       MC_CMD_OP(cmd, 0, 46, 1,  int, cfg->queue_cfg.order_preservation_en); \
-       MC_CMD_OP(cmd, 0, 48, 16, uint16_t, flow_id); \
-       MC_CMD_OP(cmd, 1, 0,  64, uint64_t, cfg->queue_cfg.user_ctx); \
-       MC_CMD_OP(cmd, 2, 0,  32, uint32_t, cfg->queue_cfg.options); \
-       MC_CMD_OP(cmd, 2, 32, 32, int,      cfg->queue_cfg.dest_cfg.dest_id); \
-       MC_CMD_OP(cmd, 3, 0,  32, uint32_t, \
-               cfg->queue_cfg.tail_drop_threshold); \
-       MC_CMD_OP(cmd, 4, 0,  4,  enum dpni_flc_type, \
-               cfg->queue_cfg.flc_cfg.flc_type); \
-       MC_CMD_OP(cmd, 4, 4,  4,  enum dpni_stash_size, \
-               cfg->queue_cfg.flc_cfg.frame_data_size); \
-       MC_CMD_OP(cmd, 4, 8,  4,  enum dpni_stash_size, \
-               cfg->queue_cfg.flc_cfg.flow_context_size); \
-       MC_CMD_OP(cmd, 4, 32, 32, uint32_t, cfg->queue_cfg.flc_cfg.options); \
-       MC_CMD_OP(cmd, 5, 0,  64, uint64_t, \
-               cfg->queue_cfg.flc_cfg.flow_context); \
-} while (0)
-
-#define DPNI_CMD_GET_TX_CONF(cmd, flow_id) \
-               MC_CMD_OP(cmd, 0, 48, 16, uint16_t,  flow_id)
-
-#define DPNI_RSP_GET_TX_CONF(cmd, attr) \
-do { \
-       MC_RSP_OP(cmd, 0, 32, 8,  uint8_t, \
-                 attr->queue_attr.dest_cfg.priority); \
-       MC_RSP_OP(cmd, 0, 40, 2,  enum dpni_dest, \
-               attr->queue_attr.dest_cfg.dest_type); \
-       MC_RSP_OP(cmd, 0, 42, 1,  int, attr->errors_only); \
-       MC_RSP_OP(cmd, 0, 46, 1,  int, \
-                 attr->queue_attr.order_preservation_en); \
-       MC_RSP_OP(cmd, 1, 0,  64, uint64_t, attr->queue_attr.user_ctx); \
-       MC_RSP_OP(cmd, 2, 32, 32, int,  attr->queue_attr.dest_cfg.dest_id); \
-       MC_RSP_OP(cmd, 3, 0,  32, uint32_t, \
-               attr->queue_attr.tail_drop_threshold); \
-       MC_RSP_OP(cmd, 3, 32, 32, uint32_t, attr->queue_attr.fqid); \
-       MC_RSP_OP(cmd, 4, 0,  4,  enum dpni_flc_type, \
-               attr->queue_attr.flc_cfg.flc_type); \
-       MC_RSP_OP(cmd, 4, 4,  4,  enum dpni_stash_size, \
-               attr->queue_attr.flc_cfg.frame_data_size); \
-       MC_RSP_OP(cmd, 4, 8,  4,  enum dpni_stash_size, \
-               attr->queue_attr.flc_cfg.flow_context_size); \
-       MC_RSP_OP(cmd, 4, 32, 32, uint32_t, attr->queue_attr.flc_cfg.options); \
-       MC_RSP_OP(cmd, 5, 0,  64, uint64_t, \
-               attr->queue_attr.flc_cfg.flow_context); \
+       MC_RSP_OP(cmd, 0, 0, 64, uint64_t, (stat)->counter0); \
+       MC_RSP_OP(cmd, 1, 0, 64, uint64_t, (stat)->counter1); \
+       MC_RSP_OP(cmd, 2, 0, 64, uint64_t, (stat)->counter2); \
+       MC_RSP_OP(cmd, 3, 0, 64, uint64_t, (stat)->counter3); \
+       MC_RSP_OP(cmd, 4, 0, 64, uint64_t, (stat)->counter4); \
+       MC_RSP_OP(cmd, 5, 0, 64, uint64_t, (stat)->counter5); \
+       MC_RSP_OP(cmd, 6, 0, 64, uint64_t, (stat)->counter6); \
 } while (0)
 
 enum net_prot {
@@ -644,6 +431,33 @@ int dpni_close(struct fsl_mc_io    *mc_io,
 /* Support masking of Flow Steering lookup keys */
 #define DPNI_OPT_FS_MASK_SUPPORT               0x00040000
 
+/**
+ * enum dpni_queue_type - Identifies a type of queue targeted by the command
+ * @DPNI_QUEUE_RX: Rx queue
+ * @DPNI_QUEUE_TX: Tx queue
+ * @DPNI_QUEUE_TX_CONFIRM: Tx confirmation queue
+ * @DPNI_QUEUE_RX_ERR: Rx error queue
+ */
+enum dpni_queue_type {
+       DPNI_QUEUE_RX,
+       DPNI_QUEUE_TX,
+       DPNI_QUEUE_TX_CONFIRM,
+       DPNI_QUEUE_RX_ERR,
+};
+
+struct dpni_cfg {
+               uint8_t mac_addr[6];
+       struct {
+               uint32_t                options;
+               uint16_t                fs_entries;
+               uint8_t                 num_queues;
+               uint8_t                 num_tcs;
+               uint8_t                 mac_entries;
+               uint8_t                 vlan_entries;
+               uint8_t                 qos_entries;
+       } adv;
+};
+
 /**
  * struct dpni_extended_cfg - Structure representing extended DPNI configuration
  * @tc_cfg: TCs configuration
@@ -685,78 +499,21 @@ struct dpni_extended_cfg {
 };
 
 /**
- * dpni_prepare_extended_cfg() - function prepare extended parameters
- * @cfg: extended structure
- * @ext_cfg_buf: Zeroed 256 bytes of memory before mapping it to DMA
+ * dpni_prepare_cfg() - function prepare parameters
+ * @cfg: cfg structure
+ * @cfg_buf: Zeroed 256 bytes of memory before mapping it to DMA
  *
  * This function has to be called before dpni_create()
  */
-int dpni_prepare_extended_cfg(const struct dpni_extended_cfg   *cfg,
-                             uint8_t                   *ext_cfg_buf);
-
-/**
- * struct dpni_cfg - Structure representing DPNI configuration
- * @mac_addr: Primary MAC address
- * @adv: Advanced parameters; default is all zeros;
- *             use this structure to change default settings
- */
-struct dpni_cfg {
-       uint8_t mac_addr[6];
-       /**
-        * struct adv - Advanced parameters
-        * @options: Mask of available options; use 'DPNI_OPT_<X>' values
-        * @start_hdr: Selects the packet starting header for parsing;
-        *              'NET_PROT_NONE' is treated as default: 'NET_PROT_ETH'
-        * @max_senders: Maximum number of different senders; used as the number
-        *              of dedicated Tx flows; Non-power-of-2 values are rounded
-        *              up to the next power-of-2 value as hardware demands it;
-        *              '0' will be treated as '1'
-        * @max_tcs: Maximum number of traffic classes (for both Tx and Rx);
-        *              '0' will e treated as '1'
-        * @max_unicast_filters: Maximum number of unicast filters;
-        *                      '0' is treated  as '16'
-        * @max_multicast_filters: Maximum number of multicast filters;
-        *                      '0' is treated as '64'
-        * @max_qos_entries: if 'max_tcs > 1', declares the maximum entries in
-        *                      the QoS table; '0' is treated as '64'
-        * @max_qos_key_size: Maximum key size for the QoS look-up;
-        *                      '0' is treated as '24' which is enough for IPv4
-        *                      5-tuple
-        * @max_dist_key_size: Maximum key size for the distribution;
-        *              '0' is treated as '24' which is enough for IPv4 5-tuple
-        * @max_policers: Maximum number of policers;
-        *              should be between '0' and max_tcs
-        * @max_congestion_ctrl: Maximum number of congestion control groups
-        *              (CGs); covers early drop and congestion notification
-        *              requirements;
-        *              should be between '0' and ('max_tcs' + 'max_senders')
-        * @ext_cfg_iova: I/O virtual address of 256 bytes DMA-able memory
-        *              filled with the extended configuration by calling
-        *              dpni_prepare_extended_cfg()
-        */
-       struct {
-               uint32_t                options;
-               enum net_prot           start_hdr;
-               uint8_t         max_senders;
-               uint8_t         max_tcs;
-               uint8_t         max_unicast_filters;
-               uint8_t         max_multicast_filters;
-               uint8_t                 max_vlan_filters;
-               uint8_t         max_qos_entries;
-               uint8_t         max_qos_key_size;
-               uint8_t         max_dist_key_size;
-               uint8_t         max_policers;
-               uint8_t         max_congestion_ctrl;
-               uint64_t        ext_cfg_iova;
-       } adv;
-};
-
+int dpni_prepare_cfg(const struct dpni_cfg     *cfg,
+                    uint8_t                    *cfg_buf);
 /**
  * dpni_create() - Create the DPNI object
  * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Authentication token.
  * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @cfg:       Configuration structure
- * @token:     Returned token; use in subsequent API calls
+ * @obj_id:    Returned obj_id; use in subsequent API calls
  *
  * Create the DPNI object, allocate required resources and
  * perform required initialization.
@@ -774,21 +531,24 @@ struct dpni_cfg {
  * Return:     '0' on Success; Error code otherwise.
  */
 int dpni_create(struct fsl_mc_io       *mc_io,
+               uint16_t                token,
                uint32_t                cmd_flags,
                const struct dpni_cfg   *cfg,
-               uint16_t                *token);
+               uint32_t                *obj_id);
 
 /**
  * dpni_destroy() - Destroy the DPNI object and release all its resources.
  * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Authentication token.
  * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
- * @token:     Token of DPNI object
+ * @obj_id:    Returned obj_id; use in subsequent API calls
  *
  * Return:     '0' on Success; error code otherwise.
  */
 int dpni_destroy(struct fsl_mc_io      *mc_io,
+                uint16_t               token,
                 uint32_t               cmd_flags,
-                uint16_t               token);
+                uint32_t               obj_id);
 
 /**
  * struct dpni_pools_cfg - Structure representing buffer pools configuration
@@ -867,49 +627,32 @@ int dpni_reset(struct fsl_mc_io   *mc_io,
 
 /**
  * struct dpni_attr - Structure representing DPNI attributes
- * @id: DPNI object ID
- * @version: DPNI version
- * @start_hdr: Indicates the packet starting header for parsing
  * @options: Mask of available options; reflects the value as was given in
  *             object's creation
- * @max_senders: Maximum number of different senders; used as the number
- *             of dedicated Tx flows;
- * @max_tcs: Maximum number of traffic classes (for both Tx and Rx)
+ * @max_num_queues: Number of queues available (for both Tx and Rx)
+ * @max_num_tcs: Maximum number of traffic classes (for both Tx and Rx)
+ * @max_mac_entries: Maximum number of traffic classes (for both Tx and Rx)
  * @max_unicast_filters: Maximum number of unicast filters
  * @max_multicast_filters: Maximum number of multicast filters
- * @max_vlan_filters: Maximum number of VLAN filters
+ * @max_vlan_entries: Maximum number of VLAN filters
  * @max_qos_entries: if 'max_tcs > 1', declares the maximum entries in QoS table
+ * @max_fs_entries: declares the maximum entries in flow steering table
  * @max_qos_key_size: Maximum key size for the QoS look-up
- * @max_dist_key_size: Maximum key size for the distribution look-up
- * @max_policers: Maximum number of policers;
- * @max_congestion_ctrl: Maximum number of congestion control groups (CGs);
- * @ext_cfg_iova: I/O virtual address of 256 bytes DMA-able memory;
- *     call dpni_extract_extended_cfg() to extract the extended configuration
+ * @max_fs_key_size: Maximum key size for the flow steering
+ * @wriop_version: Indicates revision of WRIOP hardware block
  */
 struct dpni_attr {
-       int id;
-       /**
-        * struct version - DPNI version
-        * @major: DPNI major version
-        * @minor: DPNI minor version
-        */
-       struct {
-               uint16_t major;
-               uint16_t minor;
-       } version;
-       enum net_prot start_hdr;
+       uint32_t id;
        uint32_t options;
-       uint8_t max_senders;
-       uint8_t max_tcs;
-       uint8_t max_unicast_filters;
-       uint8_t max_multicast_filters;
-       uint8_t max_vlan_filters;
+       uint8_t max_num_queues;
+       uint8_t max_num_tcs;
+       uint8_t max_mac_entries;
+       uint8_t max_vlan_entries;
        uint8_t max_qos_entries;
+       uint16_t max_fs_entries;
        uint8_t max_qos_key_size;
-       uint8_t max_dist_key_size;
-       uint8_t max_policers;
-       uint8_t max_congestion_ctrl;
-       uint64_t        ext_cfg_iova;
+       uint8_t max_fs_key_size;
+       uint16_t wriop_version;
 };
 
 /**
@@ -927,14 +670,14 @@ int dpni_get_attributes(struct fsl_mc_io  *mc_io,
                        struct dpni_attr        *attr);
 
 /**
- * dpni_extract_extended_cfg() - extract the extended parameters
- * @cfg: extended structure
- * @ext_cfg_buf: 256 bytes of DMA-able memory
+ * dpni_extract_cfg() - extract the parameters
+ * @cfg: cfg structure
+ * @cfg_buf: 256 bytes of DMA-able memory
  *
  * This function has to be called after dpni_get_attributes()
  */
-int dpni_extract_extended_cfg(struct dpni_extended_cfg *cfg,
-                             const uint8_t             *ext_cfg_buf);
+int dpni_extract_cfg(struct dpni_cfg   *cfg,
+                    const uint8_t      *cfg_buf);
 
 /**
  * DPNI errors
@@ -1037,7 +780,7 @@ int dpni_set_errors_behavior(struct fsl_mc_io              *mc_io,
  * @data_tail_room: Data tail room
  */
 struct dpni_buffer_layout {
-       uint32_t options;
+       uint16_t options;
        int pass_timestamp;
        int pass_parser_result;
        int pass_frame_status;
@@ -1048,96 +791,38 @@ struct dpni_buffer_layout {
 };
 
 /**
- * dpni_get_rx_buffer_layout() - Retrieve Rx buffer layout attributes.
+ * dpni_get_buffer_layout() - Retrieve buffer layout attributes.
  * @mc_io:     Pointer to MC portal's I/O object
  * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPNI object
  * @layout:    Returns buffer layout attributes
+ * @type:      DPNI queue type
  *
  * Return:     '0' on Success; Error code otherwise.
  */
-int dpni_get_rx_buffer_layout(struct fsl_mc_io         *mc_io,
-                             uint32_t                  cmd_flags,
-                             uint16_t                  token,
-                             struct dpni_buffer_layout *layout);
+int dpni_get_buffer_layout(struct fsl_mc_io                    *mc_io,
+                          uint32_t                             cmd_flags,
+                          uint16_t                             token,
+                          const struct dpni_buffer_layout      *layout,
+                          enum dpni_queue_type                 type);
 
 /**
- * dpni_set_rx_buffer_layout() - Set Rx buffer layout configuration.
+ * dpni_set_buffer_layout() - Set buffer layout configuration.
  * @mc_io:     Pointer to MC portal's I/O object
  * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPNI object
  * @layout:    Buffer layout configuration
+ * @type:      DPNI queue type
  *
  * Return:     '0' on Success; Error code otherwise.
  *
  * @warning    Allowed only when DPNI is disabled
  */
-int dpni_set_rx_buffer_layout(struct fsl_mc_io                 *mc_io,
-                             uint32_t                          cmd_flags,
-                             uint16_t                          token,
-                             const struct dpni_buffer_layout   *layout);
-
-/**
- * dpni_get_tx_buffer_layout() - Retrieve Tx buffer layout attributes.
- * @mc_io:     Pointer to MC portal's I/O object
- * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
- * @token:     Token of DPNI object
- * @layout:    Returns buffer layout attributes
- *
- * Return:     '0' on Success; Error code otherwise.
- */
-int dpni_get_tx_buffer_layout(struct fsl_mc_io         *mc_io,
-                             uint32_t                  cmd_flags,
-                             uint16_t                  token,
-                             struct dpni_buffer_layout *layout);
-
-/**
- * dpni_set_tx_buffer_layout() - Set Tx buffer layout configuration.
- * @mc_io:     Pointer to MC portal's I/O object
- * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
- * @token:     Token of DPNI object
- * @layout:    Buffer layout configuration
- *
- * Return:     '0' on Success; Error code otherwise.
- *
- * @warning    Allowed only when DPNI is disabled
- */
-int dpni_set_tx_buffer_layout(struct fsl_mc_io                 *mc_io,
-                             uint32_t                          cmd_flags,
-                             uint16_t                          token,
-                             const struct dpni_buffer_layout   *layout);
-
-/**
- * dpni_get_tx_conf_buffer_layout() - Retrieve Tx confirmation buffer layout
- *                             attributes.
- * @mc_io:     Pointer to MC portal's I/O object
- * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
- * @token:     Token of DPNI object
- * @layout:    Returns buffer layout attributes
- *
- * Return:     '0' on Success; Error code otherwise.
- */
-int dpni_get_tx_conf_buffer_layout(struct fsl_mc_io            *mc_io,
-                                  uint32_t                     cmd_flags,
-                                  uint16_t                     token,
-                                  struct dpni_buffer_layout    *layout);
-
-/**
- * dpni_set_tx_conf_buffer_layout() - Set Tx confirmation buffer layout
- *                                     configuration.
- * @mc_io:     Pointer to MC portal's I/O object
- * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
- * @token:     Token of DPNI object
- * @layout:    Buffer layout configuration
- *
- * Return:     '0' on Success; Error code otherwise.
- *
- * @warning    Allowed only when DPNI is disabled
- */
-int dpni_set_tx_conf_buffer_layout(struct fsl_mc_io               *mc_io,
-                                  uint32_t                        cmd_flags,
-                                  uint16_t                        token,
-                                  const struct dpni_buffer_layout *layout);
+int dpni_set_buffer_layout(struct fsl_mc_io                    *mc_io,
+                          uint32_t                             cmd_flags,
+                          uint16_t                             token,
+                          const struct dpni_buffer_layout      *layout,
+                          enum dpni_queue_type                 type);
 
 /**
  * dpni_get_qdid() - Get the Queuing Destination ID (QDID) that should be used
@@ -1169,68 +854,6 @@ int dpni_get_tx_data_offset(struct fsl_mc_io      *mc_io,
                            uint16_t            token,
                            uint16_t            *data_offset);
 
-/**
- * enum dpni_counter - DPNI counter types
- * @DPNI_CNT_ING_FRAME: Counts ingress frames
- * @DPNI_CNT_ING_BYTE: Counts ingress bytes
- * @DPNI_CNT_ING_FRAME_DROP: Counts ingress frames dropped due to explicit
- *             'drop' setting
- * @DPNI_CNT_ING_FRAME_DISCARD: Counts ingress frames discarded due to errors
- * @DPNI_CNT_ING_MCAST_FRAME: Counts ingress multicast frames
- * @DPNI_CNT_ING_MCAST_BYTE: Counts ingress multicast bytes
- * @DPNI_CNT_ING_BCAST_FRAME: Counts ingress broadcast frames
- * @DPNI_CNT_ING_BCAST_BYTES: Counts ingress broadcast bytes
- * @DPNI_CNT_EGR_FRAME: Counts egress frames
- * @DPNI_CNT_EGR_BYTE: Counts egress bytes
- * @DPNI_CNT_EGR_FRAME_DISCARD: Counts egress frames discarded due to errors
- */
-enum dpni_counter {
-       DPNI_CNT_ING_FRAME = 0x0,
-       DPNI_CNT_ING_BYTE = 0x1,
-       DPNI_CNT_ING_FRAME_DROP = 0x2,
-       DPNI_CNT_ING_FRAME_DISCARD = 0x3,
-       DPNI_CNT_ING_MCAST_FRAME = 0x4,
-       DPNI_CNT_ING_MCAST_BYTE = 0x5,
-       DPNI_CNT_ING_BCAST_FRAME = 0x6,
-       DPNI_CNT_ING_BCAST_BYTES = 0x7,
-       DPNI_CNT_EGR_FRAME = 0x8,
-       DPNI_CNT_EGR_BYTE = 0x9,
-       DPNI_CNT_EGR_FRAME_DISCARD = 0xa
-};
-
-/**
- * dpni_get_counter() - Read a specific DPNI counter
- * @mc_io:     Pointer to MC portal's I/O object
- * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
- * @token:     Token of DPNI object
- * @counter:   The requested counter
- * @value:     Returned counter's current value
- *
- * Return:     '0' on Success; Error code otherwise.
- */
-int dpni_get_counter(struct fsl_mc_io  *mc_io,
-                    uint32_t           cmd_flags,
-                    uint16_t           token,
-                    enum dpni_counter  counter,
-                    uint64_t           *value);
-
-/**
- * dpni_set_counter() - Set (or clear) a specific DPNI counter
- * @mc_io:     Pointer to MC portal's I/O object
- * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
- * @token:     Token of DPNI object
- * @counter:   The requested counter
- * @value:     New counter value; typically pass '0' for resetting
- *                     the counter.
- *
- * Return:     '0' on Success; Error code otherwise.
- */
-int dpni_set_counter(struct fsl_mc_io  *mc_io,
-                    uint32_t           cmd_flags,
-                    uint16_t           token,
-                    enum dpni_counter  counter,
-                    uint64_t           value);
-
 /* Enable auto-negotiation */
 #define DPNI_LINK_OPT_AUTONEG          0x0000000000000001ULL
 /* Enable half-duplex mode */
@@ -1506,183 +1129,199 @@ struct dpni_queue_attr {
 #define DPNI_TX_FLOW_OPT_L4_CHKSUM_GEN 0x00000020
 
 /**
- * struct dpni_tx_flow_cfg - Structure representing Tx flow configuration
- * @options: Flags representing the suggested modifications to the Tx flow;
- *     Use any combination 'DPNI_TX_FLOW_OPT_<X>' flags
- * @use_common_tx_conf_queue: Set to '1' to use the common (default) Tx
- *     confirmation and error queue; Set to '0' to use the private
- *     Tx confirmation and error queue; valid only if
- *     'DPNI_OPT_PRIVATE_TX_CONF_ERROR_DISABLED' wasn't set at DPNI creation
- *     and 'DPNI_TX_FLOW_OPT_TX_CONF_ERROR' is contained in 'options'
- * @l3_chksum_gen: Set to '1' to enable L3 checksum generation; '0' to disable;
- *     valid only if 'DPNI_TX_FLOW_OPT_L3_CHKSUM_GEN' is contained in 'options'
- * @l4_chksum_gen: Set to '1' to enable L4 checksum generation; '0' to disable;
- *     valid only if 'DPNI_TX_FLOW_OPT_L4_CHKSUM_GEN' is contained in 'options'
- */
-struct dpni_tx_flow_cfg {
-       uint32_t        options;
-       int             use_common_tx_conf_queue;
-       int             l3_chksum_gen;
-       int             l4_chksum_gen;
-};
-
-/**
- * dpni_set_tx_flow() - Set Tx flow configuration
+ * dpni_get_api_version - Retrieve DPNI Major and Minor version info.
+ *
  * @mc_io:     Pointer to MC portal's I/O object
  * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
- * @token:     Token of DPNI object
- * @flow_id:   Provides (or returns) the sender's flow ID;
- *     for each new sender set (*flow_id) to 'DPNI_NEW_FLOW_ID' to generate
- *     a new flow_id;  this ID should be used as the QDBIN argument
- *     in enqueue operations
- * @cfg:       Tx flow configuration
+ * @major_ver: DPNI major version
+ * @minor_ver: DPNI minor version
  *
- * Return:     '0' on Success; Error code otherwise.
- */
-int dpni_set_tx_flow(struct fsl_mc_io                  *mc_io,
-                    uint32_t                           cmd_flags,
-                    uint16_t                           token,
-                    uint16_t                           *flow_id,
-                    const struct dpni_tx_flow_cfg      *cfg);
-
-/**
- * struct dpni_tx_flow_attr - Structure representing Tx flow attributes
- * @use_common_tx_conf_queue: '1' if using common (default) Tx confirmation and
- *     error queue; '0' if using private Tx confirmation and error queue
- * @l3_chksum_gen: '1' if L3 checksum generation is enabled; '0' if disabled
- * @l4_chksum_gen: '1' if L4 checksum generation is enabled; '0' if disabled
- */
-struct dpni_tx_flow_attr {
-       int     use_common_tx_conf_queue;
-       int     l3_chksum_gen;
-       int     l4_chksum_gen;
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_api_version(struct fsl_mc_io *mc_io,
+                        u32 cmd_flags,
+                        u16 *major_ver,
+                        u16 *minor_ver);
+
+/**
+ * enum dpni_confirmation_mode - Defines DPNI options supported for Tx
+ * confirmation
+ * @DPNI_CONF_AFFINE: For each Tx queue set associated with a sender there is
+ * an affine Tx Confirmation queue
+ * @DPNI_CONF_SINGLE: All Tx queues are associated with a single Tx
+ * confirmation queue
+ * @DPNI_CONF_DISABLE: Tx frames are not confirmed.  This must be associated
+ * with proper FD set-up to have buffers release to a Buffer Pool, otherwise
+ * buffers will be leaked.
+ */
+enum dpni_confirmation_mode {
+       DPNI_CONF_AFFINE,
+       DPNI_CONF_SINGLE,
+       DPNI_CONF_DISABLE,
 };
 
-/**
- * dpni_get_tx_flow() - Get Tx flow attributes
- * @mc_io:     Pointer to MC portal's I/O object
- * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
- * @token:     Token of DPNI object
- * @flow_id:   The sender's flow ID, as returned by the
- *     dpni_set_tx_flow() function
- * @attr:      Returned Tx flow attributes
- *
- * Return:     '0' on Success; Error code otherwise.
- */
-int dpni_get_tx_flow(struct fsl_mc_io          *mc_io,
-                    uint32_t                   cmd_flags,
-                    uint16_t                   token,
-                    uint16_t                   flow_id,
-                    struct dpni_tx_flow_attr   *attr);
+struct dpni_tx_confirmation_mode {
+       uint32_t pad;
+       uint8_t confirmation_mode;
+};
 
 /**
- * struct dpni_tx_conf_cfg - Structure representing Tx conf configuration
- * @errors_only: Set to '1' to report back only error frames;
- *     Set to '0' to confirm transmission/error for all transmitted frames;
- * @queue_cfg: Queue configuration
+ * struct dpni_queue - Queue structure
+ * @fqid:  FQID used for enqueueing to and/or configuration of this specific FQ
+ * @qdbin: Queueing bin, used to enqueue using QDID, DQBIN, QPRI. Only relevant
+ *         for Tx queues.
+ * @flc:   FLC value for traffic dequeued from this queue.
+ * @user_context:    User data, presented to the user along with any frames
+ *                   from this queue. Not relevant for Tx queues.
  */
-struct dpni_tx_conf_cfg {
-       int                     errors_only;
-       struct dpni_queue_cfg   queue_cfg;
+struct dpni_queue {
+       /**
+       * struct destination - Destination structure
+       * @id:   ID of the destination, only relevant if DEST_TYPE is > 0.
+       *        Identifies either a DPIO or a DPCON object. Not relevant for Tx
+       *        queues.
+       * @type: May be one of the following:
+       *         0 - No destination, queue can be manually queried, but won't
+       *             push traffic or notifications to a DPIO;
+       *         1 - The destination is DPIO. When traffic becomes available in
+       *             the queue a FQDAN (FQ data available notification) will be
+       *             generated to selected DPIO;
+       *         2 - The destination is a DPCON. The queue is associated with a
+       *             DPCON object for purpose of scheduling between multiple
+       *             queues. The DPCON may be independently configured to
+       *             generate notifications. Not relevant for Tx queues.
+       * @hold_active: Hold active
+       */
+       struct {
+               uint32_t id;
+               enum dpni_dest type;
+               char hold_active;
+               char stash_ctrl;
+       } destination;
+       uint8_t  options;
+       uint32_t fqid;
+       uint16_t qdbin;
+       uint64_t flc;
+       uint64_t user_context;
 };
 
 /**
- * dpni_set_tx_conf() - Set Tx confirmation and error queue configuration
- * @mc_io:     Pointer to MC portal's I/O object
- * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
- * @token:     Token of DPNI object
- * @flow_id:   The sender's flow ID, as returned by the
- *     dpni_set_tx_flow() function;
- *     use 'DPNI_COMMON_TX_CONF' for common tx-conf
- * @cfg:       Queue configuration
+ * dpni_set_queue() - Set queue parameters
+ * @mc_io:      Pointer to MC portal's I/O object
+ * @cmd_flags:  Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:      Token of DPNI object
+ * @type:       Type of queue
+ * @tc:         Traffic class, in range 0 to NUM_TCS - 1
+ * @index:      Selects the specific queue out of the set allocated for the same
+ *              TC. Value must be in range 0 to NUM_QUEUES - 1
+ * @queue:      Queue structure
  *
- * If either 'DPNI_OPT_TX_CONF_DISABLED' or
- * 'DPNI_OPT_PRIVATE_TX_CONF_ERROR_DISABLED' were selected at DPNI creation,
- * this function can ONLY be used with 'flow_id == DPNI_COMMON_TX_CONF';
- * i.e. only serve the common tx-conf-err queue;
- * if 'DPNI_OPT_TX_CONF_DISABLED' was selected, only error frames are reported
- * back - successfully transmitted frames are not confirmed. Otherwise, all
- * transmitted frames are sent for confirmation.
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_set_queue(struct fsl_mc_io            *mc_io,
+                  uint32_t                     cmd_flags,
+                  uint16_t                     token,
+                  enum dpni_queue_type         type,
+                  uint8_t                      tc,
+                  uint8_t                      index,
+                  const struct dpni_queue      *queue);
+
+/**
+ * dpni_get_queue() - Get queue parameters
+ * @mc_io:      Pointer to MC portal's I/O object
+ * @cmd_flags:  Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:      Token of DPNI object
+ * @type:       Type of queue
+ * @tc:         Traffic class, in range 0 to NUM_TCS - 1
+ * @index:      Selects the specific queue out of the set allocated for the same
+ *              TC. Value must be in range 0 to NUM_QUEUES - 1
+ * @queue:      Queue structure
  *
- * Return:     '0' on Success; Error code otherwise.
+ * Return:      '0' on Success; Error code otherwise.
  */
-int dpni_set_tx_conf(struct fsl_mc_io  *mc_io,
-                    uint32_t           cmd_flags,
-                    uint16_t           token,
-                    uint16_t           flow_id,
-                    const struct dpni_tx_conf_cfg      *cfg);
+int dpni_get_queue(struct fsl_mc_io            *mc_io,
+                  uint32_t                     cmd_flags,
+                  uint16_t                     token,
+                  enum dpni_queue_type         type,
+                  uint8_t                      tc,
+                  uint8_t                      index,
+                  struct dpni_queue            *queue);
 
 /**
- * struct dpni_tx_conf_attr - Structure representing Tx conf attributes
- * @errors_only: '1' if only error frames are reported back; '0' if all
- *             transmitted frames are confirmed
- * @queue_attr: Queue attributes
+ * dpni_set_tx_confirmation_mode() - Set TX conf mode
+ * @mc_io:      Pointer to MC portal's I/O object
+ * @cmd_flags:  Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:      Token of DPNI object
+ * @mode:       DPNI confirmation mode type
+ *
+ * Return:      '0' on Success; Error code otherwise.
  */
-struct dpni_tx_conf_attr {
-       int                     errors_only;
-       struct dpni_queue_attr  queue_attr;
+int dpni_set_tx_confirmation_mode(struct fsl_mc_io     *mc_io,
+                                 uint32_t              cmd_flags,
+                                 uint16_t              token,
+                                 enum dpni_confirmation_mode mode);
+struct dpni_statistics {
+       /**
+        * Page_0 statistics structure
+        * @ingress_all_frames: Ingress frame count
+        * @ingress_all_bytes: Ingress byte count
+        * @ingress_multicast_frames: Ingress multicast frame count
+        * @ingress_multicast_bytes: Ingress multicast byte count
+        * @ingress_broadcast_frames: Ingress broadcast frame count
+        * @ingress_broadcast_bytes: Ingress broadcast byte count
+        *
+        * Page_1 statistics structure
+        * @egress_all_frames: Egress frame count
+        * @egress_all_bytes: Egress byte count
+        * @egress_multicast_frames: Egress multicast frame count
+        * @egress_multicast_bytes: Egress multicast byte count
+        * @egress_broadcast_frames: Egress broadcast frame count
+        * @egress_broadcast_bytes: Egress broadcast byte count
+        *
+        * Page_2 statistics structure
+        * @ingress_filtered_frames: Ingress filtered frame count
+        * @ingress_discarded_frames: Ingress discarded frame count
+        * @ingress_nobuffer_discards: Ingress discarded frame count due to
+        *  lack of buffers.
+        * @egress_discarded_frames: Egress discarded frame count
+        * @egress_confirmed_frames: Egress confirmed frame count
+        */
+
+       uint64_t counter0;
+       uint64_t counter1;
+       uint64_t counter2;
+       uint64_t counter3;
+       uint64_t counter4;
+       uint64_t counter5;
+       uint64_t counter6;
 };
 
 /**
- * dpni_get_tx_conf() - Get Tx confirmation and error queue attributes
+ * dpni_get_statistics() - Get DPNI statistics
  * @mc_io:     Pointer to MC portal's I/O object
  * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPNI object
- * @flow_id:   The sender's flow ID, as returned by the
- *     dpni_set_tx_flow() function;
- *     use 'DPNI_COMMON_TX_CONF' for common tx-conf
- * @attr:      Returned tx-conf attributes
- *
- * If either 'DPNI_OPT_TX_CONF_DISABLED' or
- * 'DPNI_OPT_PRIVATE_TX_CONF_ERROR_DISABLED' were selected at DPNI creation,
- * this function can ONLY be used with 'flow_id == DPNI_COMMON_TX_CONF';
- * i.e. only serve the common tx-conf-err queue;
+ * @page:      Selects the statistics page to retrieve, see DPNI_GET_STATISTICS
+ *             output. Pages are numbered 0 to 2.
+ * @stat:      Structure containing the statistics
  *
  * Return:     '0' on Success; Error code otherwise.
  */
-int dpni_get_tx_conf(struct fsl_mc_io  *mc_io,
-                    uint32_t           cmd_flags,
-                    uint16_t           token,
-                    uint16_t           flow_id,
-                    struct dpni_tx_conf_attr   *attr);
-/**
- * dpni_set_rx_flow() - Set Rx flow configuration
- * @mc_io:     Pointer to MC portal's I/O object
- * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
- * @token:     Token of DPNI object
- * @tc_id:     Traffic class selection (0-7);
- *                     use 'DPNI_ALL_TCS' to set all TCs and all flows
- * @flow_id:   Rx flow id within the traffic class; use
- *                     'DPNI_ALL_TC_FLOWS' to set all flows within
- *                     this tc_id; ignored if tc_id is set to
- *                     'DPNI_ALL_TCS';
- * @cfg:       Rx flow configuration
- *
- * Return:     '0' on Success; Error code otherwise.
- */
-int dpni_set_rx_flow(struct fsl_mc_io                  *mc_io,
-                    uint32_t                           cmd_flags,
-                    uint16_t                           token,
-                    uint8_t                            tc_id,
-                    uint16_t                           flow_id,
-                    const struct dpni_queue_cfg        *cfg);
+int dpni_get_statistics(struct fsl_mc_io *mc_io,
+                       uint32_t cmd_flags,
+                       uint16_t token,
+                       uint8_t page,
+                       struct dpni_statistics *stat);
 
 /**
- * dpni_get_rx_flow() -        Get Rx flow attributes
+ * dpni_reset_statistics() - Clears DPNI statistics
  * @mc_io:     Pointer to MC portal's I/O object
  * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
  * @token:     Token of DPNI object
- * @tc_id:     Traffic class selection (0-7)
- * @flow_id:   Rx flow id within the traffic class
- * @attr:      Returned Rx flow attributes
  *
  * Return:     '0' on Success; Error code otherwise.
  */
-int dpni_get_rx_flow(struct fsl_mc_io          *mc_io,
-                    uint32_t                   cmd_flags,
-                    uint16_t                   token,
-                    uint8_t                    tc_id,
-                    uint16_t                   flow_id,
-                    struct dpni_queue_attr     *attr);
-
+int dpni_reset_statistics(struct fsl_mc_io *mc_io,
+                         uint32_t cmd_flags,
+                         uint16_t token);
 #endif /* _FSL_DPNI_H */
index 535c789c95e68d420a735d6ccfed5819b26cea3f..8ad01d4f511ad41b039e373890486c2cf3cb7655 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Freescale Layerscape MC I/O wrapper
  *
- * Copyright (C) 2013-2015 Freescale Semiconductor, Inc.
- * Author: German Rivera <German.Rivera@freescale.com>
+ * Copyright (C) 2013-2016 Freescale Semiconductor, Inc.
+ * Copyright 2017 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
 #define _FSL_DPRC_H
 
 /* DPRC Version */
-#define DPRC_VER_MAJOR                         5
+#define DPRC_VER_MAJOR                         6
 #define DPRC_VER_MINOR                         1
 
 /* Command IDs */
-#define DPRC_CMDID_CLOSE                       0x800
-#define DPRC_CMDID_OPEN                                0x805
-#define DPRC_CMDID_CREATE                      0x905
-
-#define DPRC_CMDID_GET_ATTR                    0x004
-#define DPRC_CMDID_RESET_CONT                  0x005
-
-#define DPRC_CMDID_CREATE_CONT                 0x151
-#define DPRC_CMDID_DESTROY_CONT                        0x152
-#define DPRC_CMDID_GET_CONT_ID                 0x830
-#define DPRC_CMDID_GET_OBJ_COUNT               0x159
-#define DPRC_CMDID_GET_OBJ                     0x15A
-#define DPRC_CMDID_GET_RES_COUNT               0x15B
-#define DPRC_CMDID_GET_RES_IDS                 0x15C
-#define DPRC_CMDID_GET_OBJ_REG                 0x15E
-
-#define DPRC_CMDID_CONNECT                     0x167
-#define DPRC_CMDID_DISCONNECT                  0x168
-#define DPRC_CMDID_GET_CONNECTION              0x16C
+#define DPRC_CMDID_CLOSE                       0x8001
+#define DPRC_CMDID_OPEN                                0x8051
+#define DPRC_CMDID_CREATE                      0x9051
+
+#define DPRC_CMDID_GET_ATTR                    0x0041
+#define DPRC_CMDID_RESET_CONT                  0x0051
+#define DPRC_CMDID_GET_API_VERSION              0xa051
+
+#define DPRC_CMDID_CREATE_CONT                 0x1511
+#define DPRC_CMDID_DESTROY_CONT                        0x1521
+#define DPRC_CMDID_GET_CONT_ID                 0x8301
+#define DPRC_CMDID_GET_OBJ_COUNT               0x1591
+#define DPRC_CMDID_GET_OBJ                     0x15A1
+#define DPRC_CMDID_GET_RES_COUNT               0x15B1
+#define DPRC_CMDID_GET_RES_IDS                 0x15C1
+#define DPRC_CMDID_GET_OBJ_REG                 0x15E1
+
+#define DPRC_CMDID_CONNECT                     0x1671
+#define DPRC_CMDID_DISCONNECT                  0x1681
+#define DPRC_CMDID_GET_CONNECTION              0x16C1
 
 /*                cmd, param, offset, width, type, arg_name */
 #define DPRC_RSP_GET_CONTAINER_ID(cmd, container_id) \
@@ -88,8 +89,6 @@ do { \
        MC_RSP_OP(cmd, 0, 32, 16, uint16_t, attr->icid); \
        MC_RSP_OP(cmd, 1, 0,  32, uint32_t, attr->options);\
        MC_RSP_OP(cmd, 1, 32, 32, int,      attr->portal_id); \
-       MC_RSP_OP(cmd, 2, 0,  16, uint16_t, attr->version.major);\
-       MC_RSP_OP(cmd, 2, 16, 16, uint16_t, attr->version.minor);\
 } while (0)
 
 /*                cmd, param, offset, width, type, arg_name */
@@ -345,9 +344,9 @@ do { \
 #define DPRC_CMD_CONNECT(cmd, endpoint1, endpoint2, cfg) \
 do { \
        MC_CMD_OP(cmd, 0, 0,  32, int,      endpoint1->id); \
-       MC_CMD_OP(cmd, 0, 32, 16, uint16_t, endpoint1->if_id); \
+       MC_CMD_OP(cmd, 0, 32, 32, int, endpoint1->if_id); \
        MC_CMD_OP(cmd, 1, 0,  32, int,      endpoint2->id); \
-       MC_CMD_OP(cmd, 1, 32, 16, uint16_t, endpoint2->if_id); \
+       MC_CMD_OP(cmd, 1, 32, 32, int, endpoint2->if_id); \
        MC_CMD_OP(cmd, 2, 0,  8,  char,     endpoint1->type[0]); \
        MC_CMD_OP(cmd, 2, 8,  8,  char,     endpoint1->type[1]); \
        MC_CMD_OP(cmd, 2, 16, 8,  char,     endpoint1->type[2]); \
@@ -410,8 +409,8 @@ do { \
 /*                cmd, param, offset, width, type, arg_name */
 #define DPRC_CMD_GET_CONNECTION(cmd, endpoint1) \
 do { \
-       MC_CMD_OP(cmd, 0, 0,  32, int,      endpoint1->id); \
-       MC_CMD_OP(cmd, 0, 32, 16, uint16_t, endpoint1->if_id); \
+       MC_CMD_OP(cmd, 0, 0,  32, int,      endpoint1->id); \
+       MC_CMD_OP(cmd, 0, 32, 32, int,      endpoint1->if_id); \
        MC_CMD_OP(cmd, 1, 0,  8,  char,     endpoint1->type[0]); \
        MC_CMD_OP(cmd, 1, 8,  8,  char,     endpoint1->type[1]); \
        MC_CMD_OP(cmd, 1, 16, 8,  char,     endpoint1->type[2]); \
@@ -657,15 +656,6 @@ struct dprc_attributes {
        uint16_t icid;
        int portal_id;
        uint64_t options;
-       /**
-        * struct version - DPRC version
-        * @major: DPRC major version
-        * @minor: DPRC minor version
-        */
-       struct {
-               uint16_t major;
-               uint16_t minor;
-       } version;
 };
 
 /**
@@ -950,4 +940,19 @@ int dprc_get_connection(struct fsl_mc_io           *mc_io,
                        struct dprc_endpoint            *endpoint2,
                        int                             *state);
 
+/**
+ * dprc_get_api_version - Retrieve DPRC Major and Minor version info.
+ *
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @major_ver: DPRC major version
+ * @minor_ver: DPRC minor version
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dprc_get_api_version(struct fsl_mc_io *mc_io,
+                        u32 cmd_flags,
+                        u16 *major_ver,
+                        u16 *minor_ver);
+
 #endif /* _FSL_DPRC_H */
index f3d1498cc0fabe455e1447f549ad7ef741de31c1..1ec67b549164f4a7a48969d8eb9f004228252891 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright 2013-2015 Freescale Semiconductor Inc.
+/* Copyright 2013-2016 Freescale Semiconductor Inc.
+ * Copyright 2017 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -24,6 +25,15 @@ struct mc_command {
        uint64_t params[MC_CMD_NUM_OF_PARAMS];
 };
 
+struct mc_rsp_create {
+       __le32 object_id;
+};
+
+struct mc_rsp_api_ver {
+       __le16 major_ver;
+       __le16 minor_ver;
+};
+
 enum mc_cmd_status {
        MC_CMD_STATUS_OK = 0x0, /*!< Completed successfully */
        MC_CMD_STATUS_READY = 0x1, /*!< Ready to be processed */
@@ -51,15 +61,15 @@ enum mc_cmd_status {
 #define MC_CMD_FLAG_INTR_DIS   0x01000000
 
 
-#define MC_CMD_HDR_CMDID_O     52      /* Command ID field offset */
-#define MC_CMD_HDR_CMDID_S     12      /* Command ID field size */
+#define MC_CMD_HDR_CMDID_O     48      /* Command ID field offset */
+#define MC_CMD_HDR_CMDID_S     16      /* Command ID field size */
 #define MC_CMD_HDR_STATUS_O    16      /* Status field offset */
-#define MC_CMD_HDR_TOKEN_O     38      /* Token field offset */
-#define MC_CMD_HDR_TOKEN_S     10      /* Token field size */
+#define MC_CMD_HDR_TOKEN_O     32      /* Token field offset */
+#define MC_CMD_HDR_TOKEN_S     16      /* Token field size */
 #define MC_CMD_HDR_STATUS_S    8       /* Status field size*/
 #define MC_CMD_HDR_FLAGS_O     0       /* Flags field offset */
 #define MC_CMD_HDR_FLAGS_S     32      /* Flags field size*/
-#define MC_CMD_HDR_FLAGS_MASK  0xFF00FF00 /* Command flags mask */
+#define MC_CMD_HDR_FLAGS_MASK  0x0000FFFF /* Command flags mask */
 
 #define MC_CMD_HDR_READ_STATUS(_hdr) \
        ((enum mc_cmd_status)mc_dec((_hdr), \
@@ -80,11 +90,19 @@ enum mc_cmd_status {
 #define MC_RSP_OP(_cmd, _param, _offset, _width, _type, _arg) \
        (_arg = (_type)mc_dec(_cmd.params[_param], (_offset), (_width)))
 
+/*                cmd, param, offset, width, type, arg_name */
+#define MC_CMD_READ_OBJ_ID(cmd, obj_id) \
+       MC_RSP_OP(cmd, 0, 0,  32,  uint32_t,        obj_id)
+
+/* cmd, param, offset, width, type, arg_name */
+#define CMD_DESTROY_SET_OBJ_ID_PARAM0(cmd, object_id) \
+       MC_CMD_OP(cmd, 0, 0,  32,  uint32_t,  object_id)
+
 static inline uint64_t mc_encode_cmd_header(uint16_t cmd_id,
                                            uint32_t cmd_flags,
                                            uint16_t token)
 {
-       uint64_t hdr;
+       uint64_t hdr = 0;
 
        hdr = mc_enc(MC_CMD_HDR_CMDID_O, MC_CMD_HDR_CMDID_S, cmd_id);
        hdr |= mc_enc(MC_CMD_HDR_FLAGS_O, MC_CMD_HDR_FLAGS_S,
@@ -144,4 +162,22 @@ static inline enum mc_cmd_status mc_read_response(
        return status;
 }
 
+/**
+ * mc_read_version - read version of the given cmd
+ *
+ * @cmd: pointer to a filled command
+ * @major_version: major version value for the given cmd
+ * @minor_version: minor version value for the given cmd
+ */
+static inline void mc_cmd_read_api_version(struct mc_command *cmd,
+                                          u16 *major_ver,
+                                          u16 *minor_ver)
+{
+       struct mc_rsp_api_ver *rsp_params;
+
+       rsp_params = (struct mc_rsp_api_ver *)cmd->params;
+       *major_ver = le16_to_cpu(rsp_params->major_ver);
+       *minor_ver = le16_to_cpu(rsp_params->minor_ver);
+}
+
 #endif /* __FSL_MC_CMD_H */
index 17e061196408eefea1c7e0f5b180f82412b82ce6..2932d9d56199cc21e27ad4f53e3d89d7d81a018e 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright (C) 2014 Freescale Semiconductor
+ * Copyright (C) 2014-2016 Freescale Semiconductor
+ * Copyright 2017 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -29,6 +30,7 @@ extern struct fsl_mc_io *dflt_mc_io;
  * @struct dpbp_attr: DPBP attribute
  */
 struct fsl_dpbp_obj {
+       uint32_t dpbp_id;
        uint16_t dpbp_handle;
        struct dpbp_attr dpbp_attr;
 };
@@ -41,7 +43,7 @@ extern struct fsl_dpbp_obj *dflt_dpbp;
  * @struct qbman_swp *sw_portal: SW portal object
  */
 struct fsl_dpio_obj {
-       int dpio_id;
+       uint32_t dpio_id;
        uint16_t dpio_handle;
        struct qbman_swp *sw_portal; /** SW portal object */
 };
@@ -56,7 +58,7 @@ extern struct fsl_dpio_obj *dflt_dpio;
  * @struct dpni_buffer_layout: DPNI buffer layout
  */
 struct fsl_dpni_obj {
-       int dpni_id;
+       uint32_t dpni_id;
        uint16_t dpni_handle;
        struct dpni_attr dpni_attrs;
        struct dpni_buffer_layout buf_layout;
index e9c18ce40357fb27320eb29a01e684f424ffb333..a128a623e51bc0c0a229385804042e1248c20abb 100644 (file)
@@ -887,6 +887,7 @@ int bootz_setup(ulong image, ulong *start, ulong *end);
 
 /* image node */
 #define FIT_DATA_PROP          "data"
+#define FIT_DATA_POSITION_PROP "data-position"
 #define FIT_DATA_OFFSET_PROP   "data-offset"
 #define FIT_DATA_SIZE_PROP     "data-size"
 #define FIT_TIMESTAMP_PROP     "timestamp"
@@ -968,6 +969,8 @@ int fit_image_get_entry(const void *fit, int noffset, ulong *entry);
 int fit_image_get_data(const void *fit, int noffset,
                                const void **data, size_t *size);
 int fit_image_get_data_offset(const void *fit, int noffset, int *data_offset);
+int fit_image_get_data_position(const void *fit, int noffset,
+                               int *data_position);
 int fit_image_get_data_size(const void *fit, int noffset, int *data_size);
 
 int fit_image_hash_get_algo(const void *fit, int noffset, char **algo);
diff --git a/include/log.h b/include/log.h
new file mode 100644 (file)
index 0000000..8083b64
--- /dev/null
@@ -0,0 +1,304 @@
+/*
+ * Logging support
+ *
+ * Copyright (c) 2017 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __LOG_H
+#define __LOG_H
+
+#include <dm/uclass-id.h>
+#include <linux/list.h>
+
+/** Log levels supported, ranging from most to least important */
+enum log_level_t {
+       LOGL_EMERG = 0,         /*U-Boot is unstable */
+       LOGL_ALERT,             /* Action must be taken immediately */
+       LOGL_CRIT,              /* Critical conditions */
+       LOGL_ERR,               /* Error that prevents something from working */
+       LOGL_WARNING,           /* Warning may prevent optimial operation */
+       LOGL_NOTICE,            /* Normal but significant condition, printf() */
+       LOGL_INFO,              /* General information message */
+       LOGL_DEBUG,             /* Basic debug-level message */
+       LOGL_DEBUG_CONTENT,     /* Debug message showing full message content */
+       LOGL_DEBUG_IO,          /* Debug message showing hardware I/O access */
+
+       LOGL_COUNT,
+       LOGL_FIRST = LOGL_EMERG,
+       LOGL_MAX = LOGL_DEBUG,
+};
+
+/**
+ * Log categories supported. Most of these correspond to uclasses (i.e.
+ * enum uclass_id) but there are also some more generic categories
+ */
+enum log_category_t {
+       LOGC_FIRST = 0, /* First part mirrors UCLASS_... */
+
+       LOGC_NONE = UCLASS_COUNT,
+       LOGC_ARCH,
+       LOGC_BOARD,
+       LOGC_CORE,
+       LOGC_DT,
+
+       LOGC_COUNT,
+       LOGC_END,
+};
+
+/* Helper to cast a uclass ID to a log category */
+static inline int log_uc_cat(enum uclass_id id)
+{
+       return (enum log_category_t)id;
+}
+
+/**
+ * _log() - Internal function to emit a new log record
+ *
+ * @cat: Category of log record (indicating which subsystem generated it)
+ * @level: Level of log record (indicating its severity)
+ * @file: File name of file where log record was generated
+ * @line: Line number in file where log record was generated
+ * @func: Function where log record was generated
+ * @fmt: printf() format string for log record
+ * @...: Optional parameters, according to the format string @fmt
+ * @return 0 if log record was emitted, -ve on error
+ */
+int _log(enum log_category_t cat, enum log_level_t level, const char *file,
+        int line, const char *func, const char *fmt, ...);
+
+/* Define this at the top of a file to add a prefix to debug messages */
+#ifndef pr_fmt
+#define pr_fmt(fmt) fmt
+#endif
+
+/* Use a default category if this file does not supply one */
+#ifndef LOG_CATEGORY
+#define LOG_CATEGORY LOGC_NONE
+#endif
+
+/*
+ * This header may be including when CONFIG_LOG is disabled, in which case
+ * CONFIG_LOG_MAX_LEVEL is not defined. Add a check for this.
+ */
+#if CONFIG_IS_ENABLED(LOG)
+#define _LOG_MAX_LEVEL CONFIG_VAL(LOG_MAX_LEVEL)
+#else
+#define _LOG_MAX_LEVEL LOGL_INFO
+#endif
+
+/* Emit a log record if the level is less that the maximum */
+#define log(_cat, _level, _fmt, _args...) ({ \
+       int _l = _level; \
+       if (_l <= _LOG_MAX_LEVEL) \
+               _log((enum log_category_t)(_cat), _l, __FILE__, __LINE__, \
+                     __func__, \
+                     pr_fmt(_fmt), ##_args); \
+       })
+
+#ifdef DEBUG
+#define _DEBUG 1
+#else
+#define _DEBUG 0
+#endif
+
+#ifdef CONFIG_SPL_BUILD
+#define _SPL_BUILD     1
+#else
+#define _SPL_BUILD     0
+#endif
+
+#if !_DEBUG && CONFIG_IS_ENABLED(LOG)
+
+#define debug_cond(cond, fmt, args...)                 \
+       do {                                            \
+               if (1)                                  \
+                       log(LOG_CATEGORY, LOGL_DEBUG, fmt, ##args); \
+       } while (0)
+
+#else /* _DEBUG */
+
+/*
+ * Output a debug text when condition "cond" is met. The "cond" should be
+ * computed by a preprocessor in the best case, allowing for the best
+ * optimization.
+ */
+#define debug_cond(cond, fmt, args...)                 \
+       do {                                            \
+               if (cond)                               \
+                       printf(pr_fmt(fmt), ##args);    \
+       } while (0)
+
+#endif /* _DEBUG */
+
+/* Show a message if DEBUG is defined in a file */
+#define debug(fmt, args...)                    \
+       debug_cond(_DEBUG, fmt, ##args)
+
+/* Show a message if not in SPL */
+#define warn_non_spl(fmt, args...)                     \
+       debug_cond(!_SPL_BUILD, fmt, ##args)
+
+/*
+ * An assertion is run-time check done in debug mode only. If DEBUG is not
+ * defined then it is skipped. If DEBUG is defined and the assertion fails,
+ * then it calls panic*( which may or may not reset/halt U-Boot (see
+ * CONFIG_PANIC_HANG), It is hoped that all failing assertions are found
+ * before release, and after release it is hoped that they don't matter. But
+ * in any case these failing assertions cannot be fixed with a reset (which
+ * may just do the same assertion again).
+ */
+void __assert_fail(const char *assertion, const char *file, unsigned int line,
+                  const char *function);
+#define assert(x) \
+       ({ if (!(x) && _DEBUG) \
+               __assert_fail(#x, __FILE__, __LINE__, __func__); })
+
+/**
+ * struct log_rec - a single log record
+ *
+ * Holds information about a single record in the log
+ *
+ * Members marked as 'not allocated' are stored as pointers and the caller is
+ * responsible for making sure that the data pointed to is not overwritten.
+ * Memebers marked as 'allocated' are allocated (e.g. via strdup()) by the log
+ * system.
+ *
+ * @cat: Category, representing a uclass or part of U-Boot
+ * @level: Severity level, less severe is higher
+ * @file: Name of file where the log record was generated (not allocated)
+ * @line: Line number where the log record was generated
+ * @func: Function where the log record was generated (not allocated)
+ * @msg: Log message (allocated)
+ */
+struct log_rec {
+       enum log_category_t cat;
+       enum log_level_t level;
+       const char *file;
+       int line;
+       const char *func;
+       const char *msg;
+};
+
+struct log_device;
+
+/**
+ * struct log_driver - a driver which accepts and processes log records
+ *
+ * @name: Name of driver
+ */
+struct log_driver {
+       const char *name;
+       /**
+        * emit() - emit a log record
+        *
+        * Called by the log system to pass a log record to a particular driver
+        * for processing. The filter is checked before calling this function.
+        */
+       int (*emit)(struct log_device *ldev, struct log_rec *rec);
+};
+
+/**
+ * struct log_device - an instance of a log driver
+ *
+ * Since drivers are set up at build-time we need to have a separate device for
+ * the run-time aspects of drivers (currently just a list of filters to apply
+ * to records send to this device).
+ *
+ * @next_filter_num: Seqence number of next filter filter added (0=no filters
+ *     yet). This increments with each new filter on the device, but never
+ *     decrements
+ * @drv: Pointer to driver for this device
+ * @filter_head: List of filters for this device
+ * @sibling_node: Next device in the list of all devices
+ */
+struct log_device {
+       int next_filter_num;
+       struct log_driver *drv;
+       struct list_head filter_head;
+       struct list_head sibling_node;
+};
+
+enum {
+       LOGF_MAX_CATEGORIES = 5,        /* maximum categories per filter */
+};
+
+enum log_filter_flags {
+       LOGFF_HAS_CAT           = 1 << 0,       /* Filter has a category list */
+};
+
+/**
+ * struct log_filter - criterial to filter out log messages
+ *
+ * @filter_num: Sequence number of this filter.  This is returned when adding a
+ *     new filter, and must be provided when removing a previously added
+ *     filter.
+ * @flags: Flags for this filter (LOGFF_...)
+ * @cat_list: List of categories to allow (terminated by LOGC_none). If empty
+ *     then all categories are permitted. Up to LOGF_MAX_CATEGORIES entries
+ *     can be provided
+ * @max_level: Maximum log level to allow
+ * @file_list: List of files to allow, separated by comma. If NULL then all
+ *     files are permitted
+ * @sibling_node: Next filter in the list of filters for this log device
+ */
+struct log_filter {
+       int filter_num;
+       int flags;
+       enum log_category_t cat_list[LOGF_MAX_CATEGORIES];
+       enum log_level_t max_level;
+       const char *file_list;
+       struct list_head sibling_node;
+};
+
+#define LOG_DRIVER(_name) \
+       ll_entry_declare(struct log_driver, _name, log_driver)
+
+/* Handle the 'log test' command */
+int do_log_test(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]);
+
+/**
+ * log_add_filter() - Add a new filter to a log device
+ *
+ * @drv_name: Driver name to add the filter to (since each driver only has a
+ *     single device)
+ * @cat_list: List of categories to allow (terminated by LOGC_none). If empty
+ *     then all categories are permitted. Up to LOGF_MAX_CATEGORIES entries
+ *     can be provided
+ * @max_level: Maximum log level to allow
+ * @file_list: List of files to allow, separated by comma. If NULL then all
+ *     files are permitted
+ * @return the sequence number of the new filter (>=0) if the filter was added,
+ *     or a -ve value on error
+ */
+int log_add_filter(const char *drv_name, enum log_category_t cat_list[],
+                  enum log_level_t max_level, const char *file_list);
+
+/**
+ * log_remove_filter() - Remove a filter from a log device
+ *
+ * @drv_name: Driver name to remove the filter from (since each driver only has
+ *     a single device)
+ * @filter_num: Filter number to remove (as returned by log_add_filter())
+ * @return 0 if the filter was removed, -ENOENT if either the driver or the
+ *     filter number was not found
+ */
+int log_remove_filter(const char *drv_name, int filter_num);
+
+#if CONFIG_IS_ENABLED(LOG)
+/**
+ * log_init() - Set up the log system ready for use
+ *
+ * @return 0 if OK, -ENOMEM if out of memory
+ */
+int log_init(void);
+#else
+static inline int log_init(void)
+{
+       return 0;
+}
+#endif
+
+#endif
diff --git a/include/logbuff.h b/include/logbuff.h
deleted file mode 100644 (file)
index 625feb9..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * (C) Copyright 2002-2007
- * Detlev Zundel, dzu@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-#ifndef _LOGBUFF_H
-#define _LOGBUFF_H
-
-#ifdef CONFIG_LOGBUFFER
-
-#define LOGBUFF_MAGIC  0xc0de4ced      /* Forced by code, eh!  */
-#define LOGBUFF_LEN    (16384) /* Must be 16k right now */
-#define LOGBUFF_MASK   (LOGBUFF_LEN-1)
-#define LOGBUFF_OVERHEAD (4096) /* Logbuffer overhead for extra info */
-#define LOGBUFF_RESERVE (LOGBUFF_LEN+LOGBUFF_OVERHEAD)
-
-/* The mapping used here has to be the same as in setup_ext_logbuff ()
-   in linux/kernel/printk */
-
-typedef struct {
-       union {
-               struct {
-                       unsigned long   tag;
-                       unsigned long   start;
-                       unsigned long   con;
-                       unsigned long   end;
-                       unsigned long   chars;
-               } v2;
-               struct {
-                       unsigned long   dummy;
-                       unsigned long   tag;
-                       unsigned long   start;
-                       unsigned long   size;
-                       unsigned long   chars;
-               } v1;
-       };
-       unsigned char   buf[0];
-} logbuff_t;
-
-int drv_logbuff_init (void);
-void logbuff_init_ptrs (void);
-void logbuff_log(char *msg);
-void logbuff_reset (void);
-unsigned long logbuffer_base (void);
-
-#endif /* CONFIG_LOGBUFFER */
-
-#endif /* _LOGBUFF_H */
index 2bf4bdb1b8369a48b3c3f6ec89d8889b97bd685c..049b248c5b016fe59e050cac153300202b071889 100644 (file)
@@ -240,6 +240,26 @@ const char *os_dirent_get_typename(enum os_dirent_t type);
  */
 int os_get_filesize(const char *fname, loff_t *size);
 
+/**
+ * Write a character to the controlling OS terminal
+ *
+ * This bypasses the U-Boot console support and writes directly to the OS
+ * stdout file descriptor.
+ *
+ * @param ch   Character to write
+ */
+void os_putc(int ch);
+
+/**
+ * Write a string to the controlling OS terminal
+ *
+ * This bypasses the U-Boot console support and writes directly to the OS
+ * stdout file descriptor.
+ *
+ * @param str  String to write (note that \n is not appended)
+ */
+void os_puts(const char *str);
+
 /**
  * Write the sandbox RAM buffer to a existing file
  *
index d5278111e8501a89b2b09d0e46fae9dc9d817b5d..b41a6c812722a577149f33a8ffbd0929ba643452 100644 (file)
@@ -15,7 +15,7 @@
 #include <common.h>
 #include <asm/io.h>
 
-#if defined(CONFIG_POST) || defined(CONFIG_LOGBUFFER)
+#if defined(CONFIG_POST)
 
 #ifndef CONFIG_POST_EXTERNAL_WORD_FUNCS
 #ifdef CONFIG_SYS_POST_WORD_ADDR
@@ -58,7 +58,7 @@ extern ulong post_word_load(void);
 extern void post_word_store(ulong value);
 
 #endif /* CONFIG_POST_EXTERNAL_WORD_FUNCS */
-#endif /* defined (CONFIG_POST) || defined(CONFIG_LOGBUFFER) */
+#endif /* defined (CONFIG_POST) */
 #endif /* __ASSEMBLY__ */
 
 #ifdef CONFIG_POST
index ff76e88c776b1b39a715ae6081a0243bdd83119d..8cd17ea1cb78363b17f049d05e4fb0f5153da37c 100644 (file)
@@ -6,7 +6,6 @@
  *  SPDX-License-Identifier:     GPL-2.0+
  */
 
-#include <common.h>
 #include <charset.h>
 #include <malloc.h>
 
@@ -99,3 +98,59 @@ uint8_t *utf16_to_utf8(uint8_t *dest, const uint16_t *src, size_t size)
 
        return dest;
 }
+
+uint16_t *utf8_to_utf16(uint16_t *dest, const uint8_t *src, size_t size)
+{
+       while (size--) {
+               int extension_bytes;
+               uint32_t code;
+
+               extension_bytes = 0;
+               if (*src <= 0x7f) {
+                       code = *src++;
+                       /* Exit on zero byte */
+                       if (!code)
+                               size = 0;
+               } else if (*src <= 0xbf) {
+                       /* Illegal code */
+                       code = '?';
+               } else if (*src <= 0xdf) {
+                       code = *src++ & 0x1f;
+                       extension_bytes = 1;
+               } else if (*src <= 0xef) {
+                       code = *src++ & 0x0f;
+                       extension_bytes = 2;
+               } else if (*src <= 0xf7) {
+                       code = *src++ & 0x07;
+                       extension_bytes = 3;
+               } else {
+                       /* Illegal code */
+                       code = '?';
+               }
+
+               for (; extension_bytes && size; --size, --extension_bytes) {
+                       if ((*src & 0xc0) == 0x80) {
+                               code <<= 6;
+                               code |= *src++ & 0x3f;
+                       } else {
+                               /* Illegal code */
+                               code = '?';
+                               ++src;
+                               --size;
+                               break;
+                       }
+               }
+
+               if (code < 0x10000) {
+                       *dest++ = code;
+               } else {
+                       /*
+                        * Simplified expression for
+                        * (((code - 0x10000) >> 10) & 0x3ff) | 0xd800
+                        */
+                       *dest++ = (code >> 10) + 0xd7c0;
+                       *dest++ = (code & 0x3ff) | 0xdc00;
+               }
+       }
+       return dest;
+}
index 1814960572890e100c0884e45e35961a180d5173..2e8d409d31af1ea99f90932dfe6c292a13ef7ce0 100644 (file)
@@ -277,7 +277,7 @@ efi_status_t efi_main(efi_handle_t image, struct efi_system_table *sys_table)
        struct efi_boot_services *boot = sys_table->boottime;
        struct efi_mem_desc *desc;
        struct efi_entry_memmap map;
-       ulong key, desc_size, size;
+       efi_uintn_t key, desc_size, size;
        efi_status_t ret;
        u32 version;
        int cs32;
index ddb978f650fffb308084cc56225594a0e3d2d5d3..2722265ee3d1dc728ef0681e06a7b5020c22aa41 100644 (file)
@@ -7,8 +7,8 @@
 # This file only gets included with CONFIG_EFI_LOADER set, so all
 # object inclusion implicitly depends on it
 
-CFLAGS_helloworld.o := $(CFLAGS_EFI)
-CFLAGS_REMOVE_helloworld.o := $(CFLAGS_NON_EFI)
+CFLAGS_helloworld.o := $(CFLAGS_EFI) -Os -ffreestanding
+CFLAGS_REMOVE_helloworld.o := $(CFLAGS_NON_EFI) -Os
 
 ifneq ($(CONFIG_CMD_BOOTEFI_HELLO_COMPILE),)
 always += helloworld.efi
@@ -17,7 +17,7 @@ endif
 obj-$(CONFIG_CMD_BOOTEFI_HELLO) += helloworld_efi.o
 obj-y += efi_image_loader.o efi_boottime.o efi_runtime.o efi_console.o
 obj-y += efi_memory.o efi_device_path_to_text.o efi_device_path.o
-obj-y += efi_file.o efi_variable.o efi_bootmgr.o
+obj-y += efi_file.o efi_variable.o efi_bootmgr.o efi_watchdog.o
 obj-$(CONFIG_LCD) += efi_gop.o
 obj-$(CONFIG_DM_VIDEO) += efi_gop.o
 obj-$(CONFIG_PARTITIONS) += efi_disk.o
index 743b84864fc17dd51883f1764a19e98c80269d8f..a37fb25638ce35aea864a6d7c0ae92b18bdaaafd 100644 (file)
@@ -21,7 +21,7 @@
 DECLARE_GLOBAL_DATA_PTR;
 
 /* Task priority level */
-static UINTN efi_tpl = TPL_APPLICATION;
+static efi_uintn_t efi_tpl = TPL_APPLICATION;
 
 /* This list contains all the EFI objects our payload has access to */
 LIST_HEAD(efi_obj_list);
@@ -155,18 +155,6 @@ void efi_signal_event(struct efi_event *event)
        event->is_queued = false;
 }
 
-/*
- * Write a debug message for an EPI API service that is not implemented yet.
- *
- * @funcname   function that is not yet implemented
- * @return     EFI_UNSUPPORTED
- */
-static efi_status_t efi_unsupported(const char *funcname)
-{
-       debug("EFI: App called into unimplemented function %s\n", funcname);
-       return EFI_EXIT(EFI_UNSUPPORTED);
-}
-
 /*
  * Raise the task priority level.
  *
@@ -177,9 +165,9 @@ static efi_status_t efi_unsupported(const char *funcname)
  * @new_tpl    new value of the task priority level
  * @return     old value of the task priority level
  */
-static unsigned long EFIAPI efi_raise_tpl(UINTN new_tpl)
+static unsigned long EFIAPI efi_raise_tpl(efi_uintn_t new_tpl)
 {
-       UINTN old_tpl = efi_tpl;
+       efi_uintn_t old_tpl = efi_tpl;
 
        EFI_ENTRY("0x%zx", new_tpl);
 
@@ -202,7 +190,7 @@ static unsigned long EFIAPI efi_raise_tpl(UINTN new_tpl)
  *
  * @old_tpl    value of the task priority level to be restored
  */
-static void EFIAPI efi_restore_tpl(UINTN old_tpl)
+static void EFIAPI efi_restore_tpl(efi_uintn_t old_tpl)
 {
        EFI_ENTRY("0x%zx", old_tpl);
 
@@ -229,12 +217,12 @@ static void EFIAPI efi_restore_tpl(UINTN old_tpl)
  * @return             status code
  */
 static efi_status_t EFIAPI efi_allocate_pages_ext(int type, int memory_type,
-                                                 unsigned long pages,
+                                                 efi_uintn_t pages,
                                                  uint64_t *memory)
 {
        efi_status_t r;
 
-       EFI_ENTRY("%d, %d, 0x%lx, %p", type, memory_type, pages, memory);
+       EFI_ENTRY("%d, %d, 0x%zx, %p", type, memory_type, pages, memory);
        r = efi_allocate_pages(type, memory_type, pages, memory);
        return EFI_EXIT(r);
 }
@@ -251,11 +239,11 @@ static efi_status_t EFIAPI efi_allocate_pages_ext(int type, int memory_type,
  * @return     status code
  */
 static efi_status_t EFIAPI efi_free_pages_ext(uint64_t memory,
-                                             unsigned long pages)
+                                             efi_uintn_t pages)
 {
        efi_status_t r;
 
-       EFI_ENTRY("%"PRIx64", 0x%lx", memory, pages);
+       EFI_ENTRY("%"PRIx64", 0x%zx", memory, pages);
        r = efi_free_pages(memory, pages);
        return EFI_EXIT(r);
 }
@@ -276,10 +264,10 @@ static efi_status_t EFIAPI efi_free_pages_ext(uint64_t memory,
  * @return             status code
  */
 static efi_status_t EFIAPI efi_get_memory_map_ext(
-                                       unsigned long *memory_map_size,
+                                       efi_uintn_t *memory_map_size,
                                        struct efi_mem_desc *memory_map,
-                                       unsigned long *map_key,
-                                       unsigned long *descriptor_size,
+                                       efi_uintn_t *map_key,
+                                       efi_uintn_t *descriptor_size,
                                        uint32_t *descriptor_version)
 {
        efi_status_t r;
@@ -304,12 +292,12 @@ static efi_status_t EFIAPI efi_get_memory_map_ext(
  * @return     status code
  */
 static efi_status_t EFIAPI efi_allocate_pool_ext(int pool_type,
-                                                unsigned long size,
+                                                efi_uintn_t size,
                                                 void **buffer)
 {
        efi_status_t r;
 
-       EFI_ENTRY("%d, %ld, %p", pool_type, size, buffer);
+       EFI_ENTRY("%d, %zd, %p", pool_type, size, buffer);
        r = efi_allocate_pool(pool_type, size, buffer);
        return EFI_EXIT(r);
 }
@@ -333,7 +321,30 @@ static efi_status_t EFIAPI efi_free_pool_ext(void *buffer)
        return EFI_EXIT(r);
 }
 
-static efi_status_t efi_create_handle(void **handle)
+/*
+ * Add a new object to the object list.
+ *
+ * The protocols list is initialized.
+ * The object handle is set.
+ *
+ * @obj        object to be added
+ */
+void efi_add_handle(struct efi_object *obj)
+{
+       if (!obj)
+               return;
+       INIT_LIST_HEAD(&obj->protocols);
+       obj->handle = obj;
+       list_add_tail(&obj->link, &efi_obj_list);
+}
+
+/*
+ * Create handle.
+ *
+ * @handle     new handle
+ * @return     status code
+ */
+efi_status_t efi_create_handle(void **handle)
 {
        struct efi_object *obj;
        efi_status_t r;
@@ -343,10 +354,8 @@ static efi_status_t efi_create_handle(void **handle)
                              (void **)&obj);
        if (r != EFI_SUCCESS)
                return r;
-       memset(obj, 0, sizeof(struct efi_object));
-       obj->handle = obj;
-       list_add_tail(&obj->link, &efi_obj_list);
-       *handle = obj;
+       efi_add_handle(obj);
+       *handle = obj->handle;
        return r;
 }
 
@@ -371,7 +380,7 @@ static struct efi_event efi_events[16];
  * @event              created event
  * @return             status code
  */
-efi_status_t efi_create_event(uint32_t type, UINTN notify_tpl,
+efi_status_t efi_create_event(uint32_t type, efi_uintn_t notify_tpl,
                              void (EFIAPI *notify_function) (
                                        struct efi_event *event,
                                        void *context),
@@ -421,7 +430,7 @@ efi_status_t efi_create_event(uint32_t type, UINTN notify_tpl,
  * @return             status code
  */
 static efi_status_t EFIAPI efi_create_event_ext(
-                       uint32_t type, UINTN notify_tpl,
+                       uint32_t type, efi_uintn_t notify_tpl,
                        void (EFIAPI *notify_function) (
                                        struct efi_event *event,
                                        void *context),
@@ -551,13 +560,13 @@ static efi_status_t EFIAPI efi_set_timer_ext(struct efi_event *event,
  * @index      index of the event that was signaled
  * @return     status code
  */
-static efi_status_t EFIAPI efi_wait_for_event(unsigned long num_events,
+static efi_status_t EFIAPI efi_wait_for_event(efi_uintn_t num_events,
                                              struct efi_event **event,
-                                             size_t *index)
+                                             efi_uintn_t *index)
 {
        int i, j;
 
-       EFI_ENTRY("%ld, %p, %p", num_events, event, index);
+       EFI_ENTRY("%zd, %p, %p", num_events, event, index);
 
        /* Check parameters */
        if (!num_events || !event)
@@ -691,75 +700,137 @@ static efi_status_t EFIAPI efi_check_event(struct efi_event *event)
 }
 
 /*
- * Install protocol interface.
+ * Find the internal EFI object for a handle.
+ *
+ * @handle     handle to find
+ * @return     EFI object
+ */
+struct efi_object *efi_search_obj(const void *handle)
+{
+       struct efi_object *efiobj;
+
+       list_for_each_entry(efiobj, &efi_obj_list, link) {
+               if (efiobj->handle == handle)
+                       return efiobj;
+       }
+
+       return NULL;
+}
+
+/*
+ * Find a protocol on a handle.
  *
- * This is the function for internal calls. For the API implementation of the
- * InstallProtocolInterface service see function
- * efi_install_protocol_interface_ext.
+ * @handle             handle
+ * @protocol_guid      GUID of the protocol
+ * @handler            reference to the protocol
+ * @return             status code
+ */
+efi_status_t efi_search_protocol(const void *handle,
+                                const efi_guid_t *protocol_guid,
+                                struct efi_handler **handler)
+{
+       struct efi_object *efiobj;
+       struct list_head *lhandle;
+
+       if (!handle || !protocol_guid)
+               return EFI_INVALID_PARAMETER;
+       efiobj = efi_search_obj(handle);
+       if (!efiobj)
+               return EFI_INVALID_PARAMETER;
+       list_for_each(lhandle, &efiobj->protocols) {
+               struct efi_handler *protocol;
+
+               protocol = list_entry(lhandle, struct efi_handler, link);
+               if (!guidcmp(protocol->guid, protocol_guid)) {
+                       if (handler)
+                               *handler = protocol;
+                       return EFI_SUCCESS;
+               }
+       }
+       return EFI_NOT_FOUND;
+}
+
+/*
+ * Install new protocol on a handle.
  *
  * @handle                     handle on which the protocol shall be installed
  * @protocol                   GUID of the protocol to be installed
- * @protocol_interface_type    type of the interface to be installed,
- *                             always EFI_NATIVE_INTERFACE
  * @protocol_interface         interface of the protocol implementation
  * @return                     status code
  */
-static efi_status_t EFIAPI efi_install_protocol_interface(void **handle,
-                       const efi_guid_t *protocol, int protocol_interface_type,
-                       void *protocol_interface)
+efi_status_t efi_add_protocol(const void *handle, const efi_guid_t *protocol,
+                             void *protocol_interface)
 {
-       struct list_head *lhandle;
-       int i;
-       efi_status_t r;
+       struct efi_object *efiobj;
+       struct efi_handler *handler;
+       efi_status_t ret;
 
-       if (!handle || !protocol ||
-           protocol_interface_type != EFI_NATIVE_INTERFACE) {
-               r = EFI_INVALID_PARAMETER;
-               goto out;
-       }
+       efiobj = efi_search_obj(handle);
+       if (!efiobj)
+               return EFI_INVALID_PARAMETER;
+       ret = efi_search_protocol(handle, protocol, NULL);
+       if (ret != EFI_NOT_FOUND)
+               return EFI_INVALID_PARAMETER;
+       handler = calloc(1, sizeof(struct efi_handler));
+       if (!handler)
+               return EFI_OUT_OF_RESOURCES;
+       handler->guid = protocol;
+       handler->protocol_interface = protocol_interface;
+       list_add_tail(&handler->link, &efiobj->protocols);
+       return EFI_SUCCESS;
+}
 
-       /* Create new handle if requested. */
-       if (!*handle) {
-               r = efi_create_handle(handle);
-               if (r != EFI_SUCCESS)
-                       goto out;
-       }
-       /* Find object. */
-       list_for_each(lhandle, &efi_obj_list) {
-               struct efi_object *efiobj;
-               efiobj = list_entry(lhandle, struct efi_object, link);
+/*
+ * Delete protocol from a handle.
+ *
+ * @handle                     handle from which the protocol shall be deleted
+ * @protocol                   GUID of the protocol to be deleted
+ * @protocol_interface         interface of the protocol implementation
+ * @return                     status code
+ */
+efi_status_t efi_remove_protocol(const void *handle, const efi_guid_t *protocol,
+                                void *protocol_interface)
+{
+       struct efi_handler *handler;
+       efi_status_t ret;
 
-               if (efiobj->handle != *handle)
-                       continue;
-               /* Check if protocol is already installed on the handle. */
-               for (i = 0; i < ARRAY_SIZE(efiobj->protocols); i++) {
-                       struct efi_handler *handler = &efiobj->protocols[i];
-
-                       if (!handler->guid)
-                               continue;
-                       if (!guidcmp(handler->guid, protocol)) {
-                               r = EFI_INVALID_PARAMETER;
-                               goto out;
-                       }
-               }
-               /* Install protocol in first empty slot. */
-               for (i = 0; i < ARRAY_SIZE(efiobj->protocols); i++) {
-                       struct efi_handler *handler = &efiobj->protocols[i];
+       ret = efi_search_protocol(handle, protocol, &handler);
+       if (ret != EFI_SUCCESS)
+               return ret;
+       if (guidcmp(handler->guid, protocol))
+               return EFI_INVALID_PARAMETER;
+       list_del(&handler->link);
+       free(handler);
+       return EFI_SUCCESS;
+}
 
-                       if (handler->guid)
-                               continue;
+/*
+ * Delete all protocols from a handle.
+ *
+ * @handle                     handle from which the protocols shall be deleted
+ * @return                     status code
+ */
+efi_status_t efi_remove_all_protocols(const void *handle)
+{
+       struct efi_object *efiobj;
+       struct list_head *lhandle;
+       struct list_head *pos;
 
-                       handler->guid = protocol;
-                       handler->protocol_interface = protocol_interface;
-                       r = EFI_SUCCESS;
-                       goto out;
-               }
-               r = EFI_OUT_OF_RESOURCES;
-               goto out;
+       efiobj = efi_search_obj(handle);
+       if (!efiobj)
+               return EFI_INVALID_PARAMETER;
+       list_for_each_safe(lhandle, pos, &efiobj->protocols) {
+               struct efi_handler *protocol;
+               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)
+                       return ret;
        }
-       r = EFI_INVALID_PARAMETER;
-out:
-       return r;
+       return EFI_SUCCESS;
 }
 
 /*
@@ -776,16 +847,36 @@ out:
  * @protocol_interface         interface of the protocol implementation
  * @return                     status code
  */
-static efi_status_t EFIAPI efi_install_protocol_interface_ext(void **handle,
-                       const efi_guid_t *protocol, int protocol_interface_type,
-                       void *protocol_interface)
+static efi_status_t EFIAPI efi_install_protocol_interface(
+                       void **handle, const efi_guid_t *protocol,
+                       int protocol_interface_type, void *protocol_interface)
 {
+       efi_status_t r;
+
        EFI_ENTRY("%p, %pUl, %d, %p", handle, protocol, protocol_interface_type,
                  protocol_interface);
 
-       return EFI_EXIT(efi_install_protocol_interface(handle, protocol,
-                                                      protocol_interface_type,
-                                                      protocol_interface));
+       if (!handle || !protocol ||
+           protocol_interface_type != EFI_NATIVE_INTERFACE) {
+               r = EFI_INVALID_PARAMETER;
+               goto out;
+       }
+
+       /* Create new handle if requested. */
+       if (!*handle) {
+               r = efi_create_handle(handle);
+               if (r != EFI_SUCCESS)
+                       goto out;
+               debug("%sEFI: new handle %p\n", indent_string(nesting_level),
+                     *handle);
+       } else {
+               debug("%sEFI: handle %p\n", indent_string(nesting_level),
+                     *handle);
+       }
+       /* Add new protocol */
+       r = efi_add_protocol(*handle, protocol, protocol_interface);
+out:
+       return EFI_EXIT(r);
 }
 
 /*
@@ -814,75 +905,41 @@ static efi_status_t EFIAPI efi_reinstall_protocol_interface(void *handle,
 /*
  * Uninstall protocol interface.
  *
- * This is the function for internal calls. For the API implementation of the
- * UninstallProtocolInterface service see function
- * efi_uninstall_protocol_interface_ext.
+ * This function implements the UninstallProtocolInterface service.
+ * See the Unified Extensible Firmware Interface (UEFI) specification
+ * for details.
  *
  * @handle                     handle from which the protocol shall be removed
  * @protocol                   GUID of the protocol to be removed
  * @protocol_interface         interface to be removed
  * @return                     status code
  */
-static efi_status_t EFIAPI efi_uninstall_protocol_interface(void *handle,
-                       const efi_guid_t *protocol, void *protocol_interface)
+static efi_status_t EFIAPI efi_uninstall_protocol_interface(
+                               void *handle, const efi_guid_t *protocol,
+                               void *protocol_interface)
 {
-       struct list_head *lhandle;
-       int i;
-       efi_status_t r = EFI_NOT_FOUND;
+       struct efi_handler *handler;
+       efi_status_t r;
+
+       EFI_ENTRY("%p, %pUl, %p", handle, protocol, protocol_interface);
 
        if (!handle || !protocol) {
                r = EFI_INVALID_PARAMETER;
                goto out;
        }
 
-       list_for_each(lhandle, &efi_obj_list) {
-               struct efi_object *efiobj;
-               efiobj = list_entry(lhandle, struct efi_object, link);
-
-               if (efiobj->handle != handle)
-                       continue;
-
-               for (i = 0; i < ARRAY_SIZE(efiobj->protocols); i++) {
-                       struct efi_handler *handler = &efiobj->protocols[i];
-                       const efi_guid_t *hprotocol = handler->guid;
-
-                       if (!hprotocol)
-                               continue;
-                       if (!guidcmp(hprotocol, protocol)) {
-                               if (handler->protocol_interface) {
-                                       r = EFI_ACCESS_DENIED;
-                               } else {
-                                       handler->guid = 0;
-                                       r = EFI_SUCCESS;
-                               }
-                               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 */
+               r =  EFI_ACCESS_DENIED;
+       } else {
+               r = efi_remove_protocol(handle, protocol, protocol_interface);
        }
-
 out:
-       return r;
-}
-
-/*
- * Uninstall protocol interface.
- *
- * This function implements the UninstallProtocolInterface service.
- * See the Unified Extensible Firmware Interface (UEFI) specification
- * for details.
- *
- * @handle                     handle from which the protocol shall be removed
- * @protocol                   GUID of the protocol to be removed
- * @protocol_interface         interface to be removed
- * @return                     status code
- */
-static efi_status_t EFIAPI efi_uninstall_protocol_interface_ext(void *handle,
-                       const efi_guid_t *protocol, void *protocol_interface)
-{
-       EFI_ENTRY("%p, %pUl, %p", handle, protocol, protocol_interface);
-
-       return EFI_EXIT(efi_uninstall_protocol_interface(handle, protocol,
-                                                        protocol_interface));
+       return EFI_EXIT(r);
 }
 
 /*
@@ -922,23 +979,21 @@ static int efi_search(enum efi_locate_search_type search_type,
                      const efi_guid_t *protocol, void *search_key,
                      struct efi_object *efiobj)
 {
-       int i;
+       efi_status_t ret;
 
        switch (search_type) {
-       case all_handles:
+       case ALL_HANDLES:
                return 0;
-       case by_register_notify:
+       case BY_REGISTER_NOTIFY:
+               /* TODO: RegisterProtocolNotify is not implemented yet */
                return -1;
-       case by_protocol:
-               for (i = 0; i < ARRAY_SIZE(efiobj->protocols); i++) {
-                       const efi_guid_t *guid = efiobj->protocols[i].guid;
-                       if (guid && !guidcmp(guid, protocol))
-                               return 0;
-               }
+       case BY_PROTOCOL:
+               ret = efi_search_protocol(efiobj->handle, protocol, NULL);
+               return (ret != EFI_SUCCESS);
+       default:
+               /* Invalid search type */
                return -1;
        }
-
-       return -1;
 }
 
 /*
@@ -957,18 +1012,40 @@ static int efi_search(enum efi_locate_search_type search_type,
 static efi_status_t efi_locate_handle(
                        enum efi_locate_search_type search_type,
                        const efi_guid_t *protocol, void *search_key,
-                       unsigned long *buffer_size, efi_handle_t *buffer)
+                       efi_uintn_t *buffer_size, efi_handle_t *buffer)
 {
-       struct list_head *lhandle;
-       unsigned long size = 0;
+       struct efi_object *efiobj;
+       efi_uintn_t size = 0;
+
+       /* Check parameters */
+       switch (search_type) {
+       case ALL_HANDLES:
+               break;
+       case BY_REGISTER_NOTIFY:
+               if (!search_key)
+                       return EFI_INVALID_PARAMETER;
+               /* RegisterProtocolNotify is not implemented yet */
+               return EFI_UNSUPPORTED;
+       case BY_PROTOCOL:
+               if (!protocol)
+                       return EFI_INVALID_PARAMETER;
+               break;
+       default:
+               return EFI_INVALID_PARAMETER;
+       }
+
+       /*
+        * efi_locate_handle_buffer uses this function for
+        * the calculation of the necessary buffer size.
+        * So do not require a buffer for buffersize == 0.
+        */
+       if (!buffer_size || (*buffer_size && !buffer))
+               return EFI_INVALID_PARAMETER;
 
        /* Count how much space we need */
-       list_for_each(lhandle, &efi_obj_list) {
-               struct efi_object *efiobj;
-               efiobj = list_entry(lhandle, struct efi_object, link);
-               if (!efi_search(search_type, protocol, search_key, efiobj)) {
+       list_for_each_entry(efiobj, &efi_obj_list, link) {
+               if (!efi_search(search_type, protocol, search_key, efiobj))
                        size += sizeof(void*);
-               }
        }
 
        if (*buffer_size < size) {
@@ -981,12 +1058,9 @@ static efi_status_t efi_locate_handle(
                return EFI_NOT_FOUND;
 
        /* Then fill the array */
-       list_for_each(lhandle, &efi_obj_list) {
-               struct efi_object *efiobj;
-               efiobj = list_entry(lhandle, struct efi_object, link);
-               if (!efi_search(search_type, protocol, search_key, efiobj)) {
-                       *(buffer++) = efiobj->handle;
-               }
+       list_for_each_entry(efiobj, &efi_obj_list, link) {
+               if (!efi_search(search_type, protocol, search_key, efiobj))
+                       *buffer++ = efiobj->handle;
        }
 
        return EFI_SUCCESS;
@@ -1009,7 +1083,7 @@ static efi_status_t efi_locate_handle(
 static efi_status_t EFIAPI efi_locate_handle_ext(
                        enum efi_locate_search_type search_type,
                        const efi_guid_t *protocol, void *search_key,
-                       unsigned long *buffer_size, efi_handle_t *buffer)
+                       efi_uintn_t *buffer_size, efi_handle_t *buffer)
 {
        EFI_ENTRY("%d, %pUl, %p, %p, %p", search_type, protocol, search_key,
                  buffer_size, buffer);
@@ -1018,36 +1092,6 @@ static efi_status_t EFIAPI efi_locate_handle_ext(
                        buffer_size, buffer));
 }
 
-/*
- * Get the device path and handle of an device implementing a protocol.
- *
- * This function implements the LocateDevicePath service.
- * See the Unified Extensible Firmware Interface (UEFI) specification
- * for details.
- *
- * @protocol           GUID of the protocol
- * @device_path                device path
- * @device             handle of the device
- * @return             status code
- */
-static efi_status_t EFIAPI efi_locate_device_path(
-                       const efi_guid_t *protocol,
-                       struct efi_device_path **device_path,
-                       efi_handle_t *device)
-{
-       struct efi_object *efiobj;
-
-       EFI_ENTRY("%pUl, %p, %p", protocol, device_path, device);
-
-       efiobj = efi_dp_find_obj(*device_path, device_path);
-       if (!efiobj)
-               return EFI_EXIT(EFI_NOT_FOUND);
-
-       *device = efiobj->handle;
-
-       return EFI_EXIT(EFI_SUCCESS);
-}
-
 /* Collapses configuration table entries, removing index i */
 static void efi_remove_configuration_table(int i)
 {
@@ -1131,34 +1175,47 @@ void efi_setup_loaded_image(struct efi_loaded_image *info, struct efi_object *ob
                            struct efi_device_path *device_path,
                            struct efi_device_path *file_path)
 {
+       efi_status_t ret;
+
+       /* Add internal object to object list */
+       efi_add_handle(obj);
+       /* efi_exit() assumes that the handle points to the info */
        obj->handle = info;
 
+       info->file_path = file_path;
+       if (device_path)
+               info->device_handle = efi_dp_find_obj(device_path, NULL);
+
        /*
         * When asking for the device path interface, return
         * bootefi_device_path
         */
-       obj->protocols[0].guid = &efi_guid_device_path;
-       obj->protocols[0].protocol_interface = device_path;
+       ret = efi_add_protocol(obj->handle, &efi_guid_device_path, device_path);
+       if (ret != EFI_SUCCESS)
+               goto failure;
 
        /*
         * When asking for the loaded_image interface, just
         * return handle which points to loaded_image_info
         */
-       obj->protocols[1].guid = &efi_guid_loaded_image;
-       obj->protocols[1].protocol_interface = info;
-
-       obj->protocols[2].guid = &efi_guid_console_control;
-       obj->protocols[2].protocol_interface = (void *)&efi_console_control;
+       ret = efi_add_protocol(obj->handle, &efi_guid_loaded_image, info);
+       if (ret != EFI_SUCCESS)
+               goto failure;
 
-       obj->protocols[3].guid = &efi_guid_device_path_to_text_protocol;
-       obj->protocols[3].protocol_interface =
-               (void *)&efi_device_path_to_text;
+       ret = efi_add_protocol(obj->handle, &efi_guid_console_control,
+                              (void *)&efi_console_control);
+       if (ret != EFI_SUCCESS)
+               goto failure;
 
-       info->file_path = file_path;
-       if (device_path)
-               info->device_handle = efi_dp_find_obj(device_path, NULL);
+       ret = efi_add_protocol(obj->handle,
+                              &efi_guid_device_path_to_text_protocol,
+                              (void *)&efi_device_path_to_text);
+       if (ret != EFI_SUCCESS)
+               goto failure;
 
-       list_add_tail(&obj->link, &efi_obj_list);
+       return;
+failure:
+       printf("ERROR: Failure to install protocols for loaded image\n");
 }
 
 /*
@@ -1273,7 +1330,9 @@ static efi_status_t EFIAPI efi_load_image(bool boot_policy,
                return EFI_EXIT(EFI_UNSUPPORTED);
        }
 
-       *image_handle = info;
+       info->system_table = &systab;
+       info->parent_handle = parent_image;
+       *image_handle = obj->handle;
 
        return EFI_EXIT(EFI_SUCCESS);
 }
@@ -1335,6 +1394,17 @@ static efi_status_t EFIAPI efi_exit(efi_handle_t image_handle,
                        efi_status_t exit_status, unsigned long exit_data_size,
                        int16_t *exit_data)
 {
+       /*
+        * We require that the handle points to the original loaded
+        * image protocol interface.
+        *
+        * For getting the longjmp address this is safer than locating
+        * the protocol because the protocol may have been reinstalled
+        * pointing to another memory location.
+        *
+        * TODO: We should call the unload procedure of the loaded
+        *       image protocol.
+        */
        struct efi_loaded_image *loaded_image_info = (void*)image_handle;
 
        EFI_ENTRY("%p, %ld, %ld, %p", image_handle, exit_status,
@@ -1355,26 +1425,6 @@ static efi_status_t EFIAPI efi_exit(efi_handle_t image_handle,
        panic("EFI application exited");
 }
 
-/*
- * Find the internal EFI object for a handle.
- *
- * @handle     handle to find
- * @return     EFI object
- */
-static struct efi_object *efi_search_obj(void *handle)
-{
-       struct list_head *lhandle;
-
-       list_for_each(lhandle, &efi_obj_list) {
-               struct efi_object *efiobj;
-               efiobj = list_entry(lhandle, struct efi_object, link);
-               if (efiobj->handle == handle)
-                       return efiobj;
-       }
-
-       return NULL;
-}
-
 /*
  * Unload an EFI image.
  *
@@ -1450,6 +1500,7 @@ static efi_status_t EFIAPI efi_exit_boot_services(void *image_handle,
        bootm_disable_interrupts();
 
        /* Give the payload some time to boot */
+       efi_set_watchdog(0);
        WATCHDOG_RESET();
 
        return EFI_EXIT(EFI_SUCCESS);
@@ -1493,7 +1544,7 @@ static efi_status_t EFIAPI efi_stall(unsigned long microseconds)
 /*
  * Reset the watchdog timer.
  *
- * This function implements the WatchdogTimer service.
+ * This function implements the SetWatchdogTimer service.
  * See the Unified Extensible Firmware Interface (UEFI) specification
  * for details.
  *
@@ -1510,7 +1561,7 @@ static efi_status_t EFIAPI efi_set_watchdog_timer(unsigned long timeout,
 {
        EFI_ENTRY("%ld, 0x%"PRIx64", %ld, %p", timeout, watchdog_code,
                  data_size, watchdog_data);
-       return efi_unsupported(__func__);
+       return EFI_EXIT(efi_set_watchdog(timeout));
 }
 
 /*
@@ -1597,7 +1648,7 @@ static efi_status_t EFIAPI efi_close_protocol(void *handle,
 static efi_status_t EFIAPI efi_open_protocol_information(efi_handle_t handle,
                        const efi_guid_t *protocol,
                        struct efi_open_protocol_info_entry **entry_buffer,
-                       unsigned long *entry_count)
+                       efi_uintn_t *entry_count)
 {
        EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, entry_buffer,
                  entry_count);
@@ -1618,12 +1669,11 @@ static efi_status_t EFIAPI efi_open_protocol_information(efi_handle_t handle,
  */
 static efi_status_t EFIAPI efi_protocols_per_handle(void *handle,
                        efi_guid_t ***protocol_buffer,
-                       unsigned long *protocol_buffer_count)
+                       efi_uintn_t *protocol_buffer_count)
 {
        unsigned long buffer_size;
        struct efi_object *efiobj;
-       unsigned long i, j;
-       struct list_head *lhandle;
+       struct list_head *protocol_handle;
        efi_status_t r;
 
        EFI_ENTRY("%p, %p, %p", handle, protocol_buffer,
@@ -1634,36 +1684,33 @@ static efi_status_t EFIAPI efi_protocols_per_handle(void *handle,
 
        *protocol_buffer = NULL;
        *protocol_buffer_count = 0;
-       list_for_each(lhandle, &efi_obj_list) {
-               efiobj = list_entry(lhandle, struct efi_object, link);
 
-               if (efiobj->handle != handle)
-                       continue;
+       efiobj = efi_search_obj(handle);
+       if (!efiobj)
+               return EFI_EXIT(EFI_INVALID_PARAMETER);
 
-               /* Count protocols */
-               for (i = 0; i < ARRAY_SIZE(efiobj->protocols); i++) {
-                       if (efiobj->protocols[i].guid)
-                               ++*protocol_buffer_count;
-               }
-               /* Copy guids */
-               if (*protocol_buffer_count) {
-                       buffer_size = sizeof(efi_guid_t *) *
-                                       *protocol_buffer_count;
-                       r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES,
-                                             buffer_size,
-                                             (void **)protocol_buffer);
-                       if (r != EFI_SUCCESS)
-                               return EFI_EXIT(r);
-                       j = 0;
-                       for (i = 0; i < ARRAY_SIZE(efiobj->protocols); ++i) {
-                               if (efiobj->protocols[i].guid) {
-                                       (*protocol_buffer)[j] = (void *)
-                                               efiobj->protocols[i].guid;
-                                       ++j;
-                               }
-                       }
+       /* Count protocols */
+       list_for_each(protocol_handle, &efiobj->protocols) {
+               ++*protocol_buffer_count;
+       }
+
+       /* Copy guids */
+       if (*protocol_buffer_count) {
+               size_t j = 0;
+
+               buffer_size = sizeof(efi_guid_t *) * *protocol_buffer_count;
+               r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, buffer_size,
+                                     (void **)protocol_buffer);
+               if (r != EFI_SUCCESS)
+                       return EFI_EXIT(r);
+               list_for_each(protocol_handle, &efiobj->protocols) {
+                       struct efi_handler *protocol;
+
+                       protocol = list_entry(protocol_handle,
+                                             struct efi_handler, link);
+                       (*protocol_buffer)[j] = (void *)protocol->guid;
+                       ++j;
                }
-               break;
        }
 
        return EFI_EXIT(EFI_SUCCESS);
@@ -1686,10 +1733,10 @@ static efi_status_t EFIAPI efi_protocols_per_handle(void *handle,
 static efi_status_t EFIAPI efi_locate_handle_buffer(
                        enum efi_locate_search_type search_type,
                        const efi_guid_t *protocol, void *search_key,
-                       unsigned long *no_handles, efi_handle_t **buffer)
+                       efi_uintn_t *no_handles, efi_handle_t **buffer)
 {
        efi_status_t r;
-       unsigned long buffer_size = 0;
+       efi_uintn_t buffer_size = 0;
 
        EFI_ENTRY("%d, %pUl, %p, %p, %p", search_type, protocol, search_key,
                  no_handles, buffer);
@@ -1733,29 +1780,23 @@ static efi_status_t EFIAPI efi_locate_protocol(const efi_guid_t *protocol,
                                               void **protocol_interface)
 {
        struct list_head *lhandle;
-       int i;
+       efi_status_t ret;
 
        EFI_ENTRY("%pUl, %p, %p", protocol, registration, protocol_interface);
 
        if (!protocol || !protocol_interface)
                return EFI_EXIT(EFI_INVALID_PARAMETER);
 
-       EFI_PRINT_GUID("protocol", protocol);
-
        list_for_each(lhandle, &efi_obj_list) {
                struct efi_object *efiobj;
+               struct efi_handler *handler;
 
                efiobj = list_entry(lhandle, struct efi_object, link);
-               for (i = 0; i < ARRAY_SIZE(efiobj->protocols); i++) {
-                       struct efi_handler *handler = &efiobj->protocols[i];
-
-                       if (!handler->guid)
-                               continue;
-                       if (!guidcmp(handler->guid, protocol)) {
-                               *protocol_interface =
-                                       handler->protocol_interface;
-                               return EFI_EXIT(EFI_SUCCESS);
-                       }
+
+               ret = efi_search_protocol(efiobj->handle, protocol, &handler);
+               if (ret == EFI_SUCCESS) {
+                       *protocol_interface = handler->protocol_interface;
+                       return EFI_EXIT(EFI_SUCCESS);
                }
        }
        *protocol_interface = NULL;
@@ -1763,6 +1804,82 @@ static efi_status_t EFIAPI efi_locate_protocol(const efi_guid_t *protocol,
        return EFI_EXIT(EFI_NOT_FOUND);
 }
 
+/*
+ * Get the device path and handle of an device implementing a protocol.
+ *
+ * This function implements the LocateDevicePath service.
+ * See the Unified Extensible Firmware Interface (UEFI) specification
+ * for details.
+ *
+ * @protocol           GUID of the protocol
+ * @device_path                device path
+ * @device             handle of the device
+ * @return             status code
+ */
+static efi_status_t EFIAPI efi_locate_device_path(
+                       const efi_guid_t *protocol,
+                       struct efi_device_path **device_path,
+                       efi_handle_t *device)
+{
+       struct efi_device_path *dp;
+       size_t i;
+       struct efi_handler *handler;
+       efi_handle_t *handles;
+       size_t len, len_dp;
+       size_t len_best = 0;
+       efi_uintn_t no_handles;
+       u8 *remainder;
+       efi_status_t ret;
+
+       EFI_ENTRY("%pUl, %p, %p", protocol, device_path, device);
+
+       if (!protocol || !device_path || !*device_path || !device) {
+               ret = EFI_INVALID_PARAMETER;
+               goto out;
+       }
+
+       /* Find end of device path */
+       len = efi_dp_size(*device_path);
+
+       /* Get all handles implementing the protocol */
+       ret = EFI_CALL(efi_locate_handle_buffer(BY_PROTOCOL, protocol, NULL,
+                                               &no_handles, &handles));
+       if (ret != EFI_SUCCESS)
+               goto out;
+
+       for (i = 0; i < no_handles; ++i) {
+               /* Find the device path protocol */
+               ret = efi_search_protocol(handles[i], &efi_guid_device_path,
+                                         &handler);
+               if (ret != EFI_SUCCESS)
+                       continue;
+               dp = (struct efi_device_path *)handler->protocol_interface;
+               len_dp = efi_dp_size(dp);
+               /*
+                * This handle can only be a better fit
+                * if its device path length is longer than the best fit and
+                * if its device path length is shorter of equal the searched
+                * device path.
+                */
+               if (len_dp <= len_best || len_dp > len)
+                       continue;
+               /* Check if dp is a subpath of device_path */
+               if (memcmp(*device_path, dp, len_dp))
+                       continue;
+               *device = handles[i];
+               len_best = len_dp;
+       }
+       if (len_best) {
+               remainder = (u8 *)*device_path + len_best;
+               *device_path = (struct efi_device_path *)remainder;
+               ret = EFI_SUCCESS;
+       } else {
+               ret = EFI_NOT_FOUND;
+       }
+out:
+       return EFI_EXIT(ret);
+}
+
 /*
  * Install multiple protocol interfaces.
  *
@@ -1795,9 +1912,10 @@ static efi_status_t EFIAPI efi_install_multiple_protocol_interfaces(
                if (!protocol)
                        break;
                protocol_interface = va_arg(argptr, void*);
-               r = efi_install_protocol_interface(handle, protocol,
-                                                  EFI_NATIVE_INTERFACE,
-                                                  protocol_interface);
+               r = EFI_CALL(efi_install_protocol_interface(
+                                               handle, protocol,
+                                               EFI_NATIVE_INTERFACE,
+                                               protocol_interface));
                if (r != EFI_SUCCESS)
                        break;
                i++;
@@ -1806,13 +1924,13 @@ static efi_status_t EFIAPI efi_install_multiple_protocol_interfaces(
        if (r == EFI_SUCCESS)
                return EFI_EXIT(r);
 
-       /* If an error occured undo all changes. */
+       /* If an error occurred undo all changes. */
        va_start(argptr, handle);
        for (; i; --i) {
                protocol = va_arg(argptr, efi_guid_t*);
                protocol_interface = va_arg(argptr, void*);
-               efi_uninstall_protocol_interface(handle, protocol,
-                                                protocol_interface);
+               EFI_CALL(efi_uninstall_protocol_interface(handle, protocol,
+                                                         protocol_interface));
        }
        va_end(argptr);
 
@@ -1835,7 +1953,45 @@ static efi_status_t EFIAPI efi_uninstall_multiple_protocol_interfaces(
                        void *handle, ...)
 {
        EFI_ENTRY("%p", handle);
-       return EFI_EXIT(EFI_INVALID_PARAMETER);
+
+       va_list argptr;
+       const efi_guid_t *protocol;
+       void *protocol_interface;
+       efi_status_t r = EFI_SUCCESS;
+       size_t i = 0;
+
+       if (!handle)
+               return EFI_EXIT(EFI_INVALID_PARAMETER);
+
+       va_start(argptr, handle);
+       for (;;) {
+               protocol = va_arg(argptr, efi_guid_t*);
+               if (!protocol)
+                       break;
+               protocol_interface = va_arg(argptr, void*);
+               r = EFI_CALL(efi_uninstall_protocol_interface(
+                                               handle, protocol,
+                                               protocol_interface));
+               if (r != EFI_SUCCESS)
+                       break;
+               i++;
+       }
+       va_end(argptr);
+       if (r == EFI_SUCCESS)
+               return EFI_EXIT(r);
+
+       /* If an error occurred undo all changes. */
+       va_start(argptr, handle);
+       for (; i; --i) {
+               protocol = va_arg(argptr, efi_guid_t*);
+               protocol_interface = va_arg(argptr, void*);
+               EFI_CALL(efi_install_protocol_interface(&handle, protocol,
+                                                       EFI_NATIVE_INTERFACE,
+                                                       protocol_interface));
+       }
+       va_end(argptr);
+
+       return EFI_EXIT(r);
 }
 
 /*
@@ -1916,8 +2072,7 @@ static efi_status_t EFIAPI efi_open_protocol(
                        void **protocol_interface, void *agent_handle,
                        void *controller_handle, uint32_t attributes)
 {
-       struct list_head *lhandle;
-       int i;
+       struct efi_handler *handler;
        efi_status_t r = EFI_INVALID_PARAMETER;
 
        EFI_ENTRY("%p, %pUl, %p, %p, %p, 0x%x", handle, protocol,
@@ -1930,8 +2085,6 @@ static efi_status_t EFIAPI efi_open_protocol(
                goto out;
        }
 
-       EFI_PRINT_GUID("protocol", protocol);
-
        switch (attributes) {
        case EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL:
        case EFI_OPEN_PROTOCOL_GET_PROTOCOL:
@@ -1952,33 +2105,12 @@ static efi_status_t EFIAPI efi_open_protocol(
                goto out;
        }
 
-       list_for_each(lhandle, &efi_obj_list) {
-               struct efi_object *efiobj;
-               efiobj = list_entry(lhandle, struct efi_object, link);
-
-               if (efiobj->handle != handle)
-                       continue;
-
-               for (i = 0; i < ARRAY_SIZE(efiobj->protocols); i++) {
-                       struct efi_handler *handler = &efiobj->protocols[i];
-                       const efi_guid_t *hprotocol = handler->guid;
-                       if (!hprotocol)
-                               continue;
-                       if (!guidcmp(hprotocol, protocol)) {
-                               if (attributes !=
-                                   EFI_OPEN_PROTOCOL_TEST_PROTOCOL) {
-                                       *protocol_interface =
-                                               handler->protocol_interface;
-                               }
-                               r = EFI_SUCCESS;
-                               goto out;
-                       }
-               }
-               goto unsupported;
-       }
+       r = efi_search_protocol(handle, protocol, &handler);
+       if (r != EFI_SUCCESS)
+               goto out;
 
-unsupported:
-       r = EFI_UNSUPPORTED;
+       if (attributes != EFI_OPEN_PROTOCOL_TEST_PROTOCOL)
+               *protocol_interface = handler->protocol_interface;
 out:
        return EFI_EXIT(r);
 }
@@ -2020,9 +2152,9 @@ static const struct efi_boot_services efi_boot_services = {
        .signal_event = efi_signal_event_ext,
        .close_event = efi_close_event,
        .check_event = efi_check_event,
-       .install_protocol_interface = efi_install_protocol_interface_ext,
+       .install_protocol_interface = efi_install_protocol_interface,
        .reinstall_protocol_interface = efi_reinstall_protocol_interface,
-       .uninstall_protocol_interface = efi_uninstall_protocol_interface_ext,
+       .uninstall_protocol_interface = efi_uninstall_protocol_interface,
        .handle_protocol = efi_handle_protocol,
        .reserved = NULL,
        .register_protocol_notify = efi_register_protocol_notify,
index 01732aafeade6264a34237f2f0d5d244763cc322..98497db612e341b6983c2afa4b2195681ea9ce87 100644 (file)
@@ -46,6 +46,10 @@ static struct cout_mode efi_cout_modes[] = {
 };
 
 const efi_guid_t efi_guid_console_control = CONSOLE_CONTROL_GUID;
+const efi_guid_t efi_guid_text_output_protocol =
+                       EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID;
+const efi_guid_t efi_guid_text_input_protocol =
+                       EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID;
 
 #define cESC '\x1b'
 #define ESC "\x1b"
@@ -81,7 +85,7 @@ static efi_status_t EFIAPI efi_cin_lock_std_in(
        return EFI_EXIT(EFI_UNSUPPORTED);
 }
 
-const struct efi_console_control_protocol efi_console_control = {
+struct efi_console_control_protocol efi_console_control = {
        .get_mode = efi_cin_get_mode,
        .set_mode = efi_cin_set_mode,
        .lock_std_in = efi_cin_lock_std_in,
@@ -374,7 +378,7 @@ static efi_status_t EFIAPI efi_cout_enable_cursor(
        return EFI_EXIT(EFI_SUCCESS);
 }
 
-const struct efi_simple_text_output_protocol efi_con_out = {
+struct efi_simple_text_output_protocol efi_con_out = {
        .reset = efi_cout_reset,
        .output_string = efi_cout_output_string,
        .test_string = efi_cout_test_string,
@@ -490,23 +494,38 @@ static void EFIAPI efi_console_timer_notify(struct efi_event *event,
 }
 
 
-static struct efi_object efi_console_control_obj =
-       EFI_PROTOCOL_OBJECT(efi_guid_console_control, &efi_console_control);
-static struct efi_object efi_console_output_obj =
-       EFI_PROTOCOL_OBJECT(EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID, &efi_con_out);
-static struct efi_object efi_console_input_obj =
-       EFI_PROTOCOL_OBJECT(EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID, &efi_con_in);
-
 /* This gets called from do_bootefi_exec(). */
 int efi_console_register(void)
 {
        efi_status_t r;
+       struct efi_object *efi_console_control_obj;
+       struct efi_object *efi_console_output_obj;
+       struct efi_object *efi_console_input_obj;
 
-       /* Hook up to the device list */
-       list_add_tail(&efi_console_control_obj.link, &efi_obj_list);
-       list_add_tail(&efi_console_output_obj.link, &efi_obj_list);
-       list_add_tail(&efi_console_input_obj.link, &efi_obj_list);
+       /* Create handles */
+       r = efi_create_handle((void **)&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);
+       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);
+       if (r != EFI_SUCCESS)
+               goto out_of_memory;
+       r = efi_add_protocol(efi_console_input_obj->handle,
+                            &efi_guid_text_input_protocol, &efi_con_in);
+       if (r != EFI_SUCCESS)
+               goto out_of_memory;
 
+       /* Create console events */
        r = efi_create_event(EVT_NOTIFY_WAIT, TPL_CALLBACK,
                             efi_key_notify, NULL, &efi_con_in.wait_for_key);
        if (r != EFI_SUCCESS) {
@@ -525,4 +544,7 @@ int efi_console_register(void)
        if (r != EFI_SUCCESS)
                printf("ERROR: Failed to set console timer\n");
        return r;
+out_of_memory:
+       printf("ERROR: Out of meemory\n");
+       return r;
 }
index f6e368e029bdf37a768d54b9291c104fda8a30db..b4e2f933cb602113af249c3e9d7aa92b5981440b 100644 (file)
@@ -68,7 +68,8 @@ struct efi_device_path *efi_dp_next(const struct efi_device_path *dp)
  * representing a device with one representing a file on the device, or
  * a device with a parent device.
  */
-int efi_dp_match(struct efi_device_path *a, struct efi_device_path *b)
+int efi_dp_match(const struct efi_device_path *a,
+                const struct efi_device_path *b)
 {
        while (1) {
                int ret;
@@ -127,32 +128,27 @@ static struct efi_object *find_obj(struct efi_device_path *dp, bool short_path,
        struct efi_object *efiobj;
 
        list_for_each_entry(efiobj, &efi_obj_list, link) {
-               int i;
-
-               for (i = 0; i < ARRAY_SIZE(efiobj->protocols); i++) {
-                       struct efi_handler *handler = &efiobj->protocols[i];
-                       struct efi_device_path *obj_dp;
-
-                       if (!handler->guid)
-                               break;
-
-                       if (guidcmp(handler->guid, &efi_guid_device_path))
-                               continue;
-
-                       obj_dp = handler->protocol_interface;
-
-                       do {
-                               if (efi_dp_match(dp, obj_dp) == 0) {
-                                       if (rem) {
-                                               *rem = ((void *)dp) +
-                                                       efi_dp_size(obj_dp);
-                                       }
-                                       return efiobj;
+               struct efi_handler *handler;
+               struct efi_device_path *obj_dp;
+               efi_status_t ret;
+
+               ret = efi_search_protocol(efiobj->handle,
+                                         &efi_guid_device_path, &handler);
+               if (ret != EFI_SUCCESS)
+                       continue;
+               obj_dp = handler->protocol_interface;
+
+               do {
+                       if (efi_dp_match(dp, obj_dp) == 0) {
+                               if (rem) {
+                                       *rem = ((void *)dp) +
+                                               efi_dp_size(obj_dp);
                                }
+                               return efiobj;
+                       }
 
-                               obj_dp = shorten_path(efi_dp_next(obj_dp));
-                       } while (short_path && obj_dp);
-               }
+                       obj_dp = shorten_path(efi_dp_next(obj_dp));
+               } while (short_path && obj_dp);
        }
 
        return NULL;
@@ -427,10 +423,27 @@ static void *dp_part_fill(void *buf, struct blk_desc *desc, int part)
                        hddp->partmap_type = 2;
                else
                        hddp->partmap_type = 1;
-               hddp->signature_type = desc->sig_type;
-               if (hddp->signature_type != 0)
+
+               switch (desc->sig_type) {
+               case SIG_TYPE_NONE:
+               default:
+                       hddp->signature_type = 0;
+                       memset(hddp->partition_signature, 0,
+                              sizeof(hddp->partition_signature));
+                       break;
+               case SIG_TYPE_MBR:
+                       hddp->signature_type = 1;
+                       memset(hddp->partition_signature, 0,
+                              sizeof(hddp->partition_signature));
+                       memcpy(hddp->partition_signature, &desc->mbr_sig,
+                              sizeof(desc->mbr_sig));
+                       break;
+               case SIG_TYPE_GUID:
+                       hddp->signature_type = 2;
                        memcpy(hddp->partition_signature, &desc->guid_sig,
                               sizeof(hddp->partition_signature));
+                       break;
+               }
 
                buf = &hddp[1];
        }
index 62771338f0383a9850dc11de7f2d2d6a6247a04f..7159c974d4d39b7ecef46616d38184ee6bf3ec79 100644 (file)
 #define MAC_OUTPUT_LEN 22
 #define UNKNOWN_OUTPUT_LEN 23
 
+#define MAX_NODE_LEN 512
+#define MAX_PATH_LEN 1024
+
 const efi_guid_t efi_guid_device_path_to_text_protocol =
                EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID;
 
+static u16 *efi_str_to_u16(char *str)
+{
+       efi_uintn_t len;
+       u16 *out;
+       efi_status_t ret;
+
+       len = strlen(str) + 1;
+       ret = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, len * sizeof(u16),
+                               (void **)&out);
+       if (ret != EFI_SUCCESS)
+               return NULL;
+       ascii2unicode(out, str);
+       out[len - 1] = 0;
+       return out;
+}
+
 static char *dp_unknown(char *s, struct efi_device_path *dp)
 {
-       s += sprintf(s, "/UNKNOWN(%04x,%04x)", dp->type, dp->sub_type);
+       s += sprintf(s, "UNKNOWN(%04x,%04x)", dp->type, dp->sub_type);
        return s;
 }
 
@@ -27,7 +46,7 @@ static char *dp_hardware(char *s, struct efi_device_path *dp)
        case DEVICE_PATH_SUB_TYPE_MEMORY: {
                struct efi_device_path_memory *mdp =
                        (struct efi_device_path_memory *)dp;
-               s += sprintf(s, "/MemoryMapped(0x%x,0x%llx,0x%llx)",
+               s += sprintf(s, "MemoryMapped(0x%x,0x%llx,0x%llx)",
                             mdp->memory_type,
                             mdp->start_address,
                             mdp->end_address);
@@ -36,7 +55,7 @@ static char *dp_hardware(char *s, struct efi_device_path *dp)
        case DEVICE_PATH_SUB_TYPE_VENDOR: {
                struct efi_device_path_vendor *vdp =
                        (struct efi_device_path_vendor *)dp;
-               s += sprintf(s, "/VenHw(%pUl)", &vdp->guid);
+               s += sprintf(s, "VenHw(%pUl)", &vdp->guid);
                break;
        }
        default:
@@ -52,7 +71,7 @@ static char *dp_acpi(char *s, struct efi_device_path *dp)
        case DEVICE_PATH_SUB_TYPE_ACPI_DEVICE: {
                struct efi_device_path_acpi_path *adp =
                        (struct efi_device_path_acpi_path *)dp;
-               s += sprintf(s, "/Acpi(PNP%04x", EISA_PNP_NUM(adp->hid));
+               s += sprintf(s, "Acpi(PNP%04x", EISA_PNP_NUM(adp->hid));
                if (adp->uid)
                        s += sprintf(s, ",%d", adp->uid);
                s += sprintf(s, ")");
@@ -71,7 +90,7 @@ static char *dp_msging(char *s, struct efi_device_path *dp)
        case DEVICE_PATH_SUB_TYPE_MSG_USB: {
                struct efi_device_path_usb *udp =
                        (struct efi_device_path_usb *)dp;
-               s += sprintf(s, "/Usb(0x%x,0x%x)", udp->parent_port_number,
+               s += sprintf(s, "Usb(0x%x,0x%x)", udp->parent_port_number,
                             udp->usb_interface);
                break;
        }
@@ -82,7 +101,7 @@ static char *dp_msging(char *s, struct efi_device_path *dp)
                if (mdp->if_type != 0 && mdp->if_type != 1)
                        break;
 
-               s += sprintf(s, "/MAC(%02x%02x%02x%02x%02x%02x,0x%1x)",
+               s += sprintf(s, "MAC(%02x%02x%02x%02x%02x%02x,0x%1x)",
                        mdp->mac.addr[0], mdp->mac.addr[1],
                        mdp->mac.addr[2], mdp->mac.addr[3],
                        mdp->mac.addr[4], mdp->mac.addr[5],
@@ -94,7 +113,7 @@ static char *dp_msging(char *s, struct efi_device_path *dp)
                struct efi_device_path_usb_class *ucdp =
                        (struct efi_device_path_usb_class *)dp;
 
-               s += sprintf(s, "/USBClass(%x,%x,%x,%x,%x)",
+               s += sprintf(s, "USBClass(%x,%x,%x,%x,%x)",
                        ucdp->vendor_id, ucdp->product_id,
                        ucdp->device_class, ucdp->device_subclass,
                        ucdp->device_protocol);
@@ -108,7 +127,7 @@ static char *dp_msging(char *s, struct efi_device_path *dp)
                                        "SDCard" : "MMC";
                struct efi_device_path_sd_mmc_path *sddp =
                        (struct efi_device_path_sd_mmc_path *)dp;
-               s += sprintf(s, "/%s(Slot%u)", typename, sddp->slot_number);
+               s += sprintf(s, "%s(Slot%u)", typename, sddp->slot_number);
                break;
        }
        default:
@@ -128,17 +147,19 @@ static char *dp_media(char *s, struct efi_device_path *dp)
 
                switch (hddp->signature_type) {
                case SIG_TYPE_MBR:
-                       s += sprintf(s, "/HD(Part%d,Sig%08x)",
+                       s += sprintf(s, "HD(Part%d,Sig%08x)",
                                     hddp->partition_number,
                                     *(uint32_t *)sig);
                        break;
                case SIG_TYPE_GUID:
-                       s += sprintf(s, "/HD(Part%d,Sig%pUl)",
+                       s += sprintf(s, "HD(Part%d,Sig%pUl)",
                                     hddp->partition_number, sig);
+                       break;
                default:
-                       s += sprintf(s, "/HD(Part%d,MBRType=%02x,SigType=%02x)",
+                       s += sprintf(s, "HD(Part%d,MBRType=%02x,SigType=%02x)",
                                     hddp->partition_number, hddp->partmap_type,
                                     hddp->signature_type);
+                       break;
                }
 
                break;
@@ -146,14 +167,16 @@ static char *dp_media(char *s, struct efi_device_path *dp)
        case DEVICE_PATH_SUB_TYPE_CDROM_PATH: {
                struct efi_device_path_cdrom_path *cddp =
                        (struct efi_device_path_cdrom_path *)dp;
-               s += sprintf(s, "/CDROM(0x%x)", cddp->boot_entry);
+               s += sprintf(s, "CDROM(0x%x)", cddp->boot_entry);
                break;
        }
        case DEVICE_PATH_SUB_TYPE_FILE_PATH: {
                struct efi_device_path_file_path *fp =
                        (struct efi_device_path_file_path *)dp;
                int slen = (dp->length - sizeof(*dp)) / 2;
-               s += sprintf(s, "/%-*ls", slen, fp->str);
+               if (slen > MAX_NODE_LEN - 2)
+                       slen = MAX_NODE_LEN - 2;
+               s += sprintf(s, "%-.*ls", slen, fp->str);
                break;
        }
        default:
@@ -163,95 +186,119 @@ static char *dp_media(char *s, struct efi_device_path *dp)
        return s;
 }
 
-static uint16_t *efi_convert_device_node_to_text(
-               struct efi_device_path *dp,
-               bool display_only,
-               bool allow_shortcuts)
+/*
+ * Converts a single node to a char string.
+ *
+ * @buffer             output buffer
+ * @dp                 device path or node
+ * @return             end of string
+ */
+static char *efi_convert_single_device_node_to_text(
+               char *buffer,
+               struct efi_device_path *dp)
 {
-       unsigned long len;
-       efi_status_t r;
-       char buf[512];  /* this ought be be big enough for worst case */
-       char *str = buf;
-       uint16_t *out;
-
-       while (dp) {
-               switch (dp->type) {
-               case DEVICE_PATH_TYPE_HARDWARE_DEVICE:
-                       str = dp_hardware(str, dp);
-                       break;
-               case DEVICE_PATH_TYPE_ACPI_DEVICE:
-                       str = dp_acpi(str, dp);
-                       break;
-               case DEVICE_PATH_TYPE_MESSAGING_DEVICE:
-                       str = dp_msging(str, dp);
-                       break;
-               case DEVICE_PATH_TYPE_MEDIA_DEVICE:
-                       str = dp_media(str, dp);
-                       break;
-               default:
-                       str = dp_unknown(str, dp);
-               }
+       char *str = buffer;
 
-               dp = efi_dp_next(dp);
+       switch (dp->type) {
+       case DEVICE_PATH_TYPE_HARDWARE_DEVICE:
+               str = dp_hardware(str, dp);
+               break;
+       case DEVICE_PATH_TYPE_ACPI_DEVICE:
+               str = dp_acpi(str, dp);
+               break;
+       case DEVICE_PATH_TYPE_MESSAGING_DEVICE:
+               str = dp_msging(str, dp);
+               break;
+       case DEVICE_PATH_TYPE_MEDIA_DEVICE:
+               str = dp_media(str, dp);
+               break;
+       default:
+               str = dp_unknown(str, dp);
        }
 
-       *str++ = '\0';
-
-       len = str - buf;
-       r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, 2 * len, (void **)&out);
-       if (r != EFI_SUCCESS)
-               return NULL;
-
-       ascii2unicode(out, buf);
-       out[len - 1] = 0;
-
-       return out;
+       *str = '\0';
+       return str;
 }
 
-/* helper for debug prints.. efi_free_pool() the result. */
-uint16_t *efi_dp_str(struct efi_device_path *dp)
-{
-       return efi_convert_device_node_to_text(dp, true, true);
-}
-
-
-static uint16_t EFIAPI *efi_convert_device_node_to_text_ext(
+/*
+ * This function implements the ConvertDeviceNodeToText service of the
+ * EFI_DEVICE_PATH_TO_TEXT_PROTOCOL.
+ * See the Unified Extensible Firmware Interface (UEFI) specification
+ * for details.
+ *
+ * device_node         device node to be converted
+ * display_only                true if the shorter text represenation shall be used
+ * allow_shortcuts     true if shortcut forms may be used
+ * @return             text represenation of the device path
+ *                     NULL if out of memory of device_path is NULL
+ */
+static uint16_t EFIAPI *efi_convert_device_node_to_text(
                struct efi_device_path *device_node,
                bool display_only,
                bool allow_shortcuts)
 {
-       uint16_t *buffer;
+       char str[MAX_NODE_LEN];
+       uint16_t *text = NULL;
 
        EFI_ENTRY("%p, %d, %d", device_node, display_only, allow_shortcuts);
 
-       buffer = efi_convert_device_node_to_text(device_node, display_only,
-                                                allow_shortcuts);
+       if (!device_node)
+               goto out;
+       efi_convert_single_device_node_to_text(str, device_node);
+
+       text = efi_str_to_u16(str);
 
+out:
        EFI_EXIT(EFI_SUCCESS);
-       return buffer;
+       return text;
 }
 
+/*
+ * This function implements the ConvertDevicePathToText service of the
+ * EFI_DEVICE_PATH_TO_TEXT_PROTOCOL.
+ * See the Unified Extensible Firmware Interface (UEFI) specification
+ * for details.
+ *
+ * device_path         device path to be converted
+ * display_only                true if the shorter text represenation shall be used
+ * allow_shortcuts     true if shortcut forms may be used
+ * @return             text represenation of the device path
+ *                     NULL if out of memory of device_path is NULL
+ */
 static uint16_t EFIAPI *efi_convert_device_path_to_text(
                struct efi_device_path *device_path,
                bool display_only,
                bool allow_shortcuts)
 {
-       uint16_t *buffer;
+       uint16_t *text = NULL;
+       char buffer[MAX_PATH_LEN];
+       char *str = buffer;
 
        EFI_ENTRY("%p, %d, %d", device_path, display_only, allow_shortcuts);
 
-       /*
-        * Our device paths are all of depth one. So its is sufficient to
-        * to convert the first node.
-        */
-       buffer = efi_convert_device_node_to_text(device_path, display_only,
-                                                allow_shortcuts);
+       if (!device_path)
+               goto out;
+       while (device_path &&
+              str + MAX_NODE_LEN < buffer + MAX_PATH_LEN) {
+               *str++ = '/';
+               str = efi_convert_single_device_node_to_text(str, device_path);
+               device_path = efi_dp_next(device_path);
+       }
+
+       text = efi_str_to_u16(buffer);
 
+out:
        EFI_EXIT(EFI_SUCCESS);
-       return buffer;
+       return text;
+}
+
+/* helper for debug prints.. efi_free_pool() the result. */
+uint16_t *efi_dp_str(struct efi_device_path *dp)
+{
+       return EFI_CALL(efi_convert_device_path_to_text(dp, true, true));
 }
 
 const struct efi_device_path_to_text_protocol efi_device_path_to_text = {
-       .convert_device_node_to_text = efi_convert_device_node_to_text_ext,
+       .convert_device_node_to_text = efi_convert_device_node_to_text,
        .convert_device_path_to_text = efi_convert_device_path_to_text,
 };
index e61dbc80580b61ae6e0351be68d77fd8eeca0eeb..4e457a841bdbe71cebc0680bc125cfe95912c115 100644 (file)
@@ -196,6 +196,15 @@ efi_fs_from_path(struct efi_device_path *fp)
        return diskobj->volume;
 }
 
+/*
+ * Create a device for a disk
+ *
+ * @name       not used
+ * @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
+ */
 static void efi_disk_add_dev(const char *name,
                             const char *if_typename,
                             struct blk_desc *desc,
@@ -204,29 +213,39 @@ static void efi_disk_add_dev(const char *name,
                             unsigned int part)
 {
        struct efi_disk_obj *diskobj;
+       efi_status_t ret;
 
        /* Don't add empty devices */
        if (!desc->lba)
                return;
 
        diskobj = calloc(1, sizeof(*diskobj));
+       if (!diskobj)
+               goto out_of_memory;
+
+       /* Hook up to the device list */
+       efi_add_handle(&diskobj->parent);
 
        /* Fill in object data */
        diskobj->dp = efi_dp_from_part(desc, part);
        diskobj->part = part;
-       diskobj->parent.protocols[0].guid = &efi_block_io_guid;
-       diskobj->parent.protocols[0].protocol_interface = &diskobj->ops;
-       diskobj->parent.protocols[1].guid = &efi_guid_device_path;
-       diskobj->parent.protocols[1].protocol_interface = diskobj->dp;
+       ret = efi_add_protocol(diskobj->parent.handle, &efi_block_io_guid,
+                              &diskobj->ops);
+       if (ret != EFI_SUCCESS)
+               goto out_of_memory;
+       ret = efi_add_protocol(diskobj->parent.handle, &efi_guid_device_path,
+                              diskobj->dp);
+       if (ret != EFI_SUCCESS)
+               goto out_of_memory;
        if (part >= 1) {
                diskobj->volume = efi_simple_file_system(desc, part,
                                                         diskobj->dp);
-               diskobj->parent.protocols[2].guid =
-                       &efi_simple_file_system_protocol_guid;
-               diskobj->parent.protocols[2].protocol_interface =
-                       diskobj->volume;
+               ret = efi_add_protocol(diskobj->parent.handle,
+                                      &efi_simple_file_system_protocol_guid,
+                                      &diskobj->volume);
+               if (ret != EFI_SUCCESS)
+                       goto out_of_memory;
        }
-       diskobj->parent.handle = diskobj;
        diskobj->ops = block_io_disk_template;
        diskobj->ifname = if_typename;
        diskobj->dev_index = dev_index;
@@ -240,26 +259,22 @@ static void efi_disk_add_dev(const char *name,
        diskobj->media.io_align = desc->blksz;
        diskobj->media.last_block = desc->lba - offset;
        diskobj->ops.media = &diskobj->media;
-
-       /* Hook up to the device list */
-       list_add_tail(&diskobj->parent.link, &efi_obj_list);
+       return;
+out_of_memory:
+       printf("ERROR: Out of memory\n");
 }
 
-static int efi_disk_create_eltorito(struct blk_desc *desc,
-                                   const char *if_typename,
-                                   int diskid,
-                                   const char *pdevname)
+static int efi_disk_create_partitions(struct blk_desc *desc,
+                                     const char *if_typename,
+                                     int diskid,
+                                     const char *pdevname)
 {
        int disks = 0;
-#if CONFIG_IS_ENABLED(ISO_PARTITION)
        char devname[32] = { 0 }; /* dp->str is u16[32] long */
        disk_partition_t info;
        int part;
 
-       if (desc->part_type != PART_TYPE_ISO)
-               return 0;
-
-       /* and devices for each partition: */
+       /* Add devices for each partition */
        for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
                if (part_get_info(desc, part, &info))
                        continue;
@@ -270,10 +285,6 @@ static int efi_disk_create_eltorito(struct blk_desc *desc,
                disks++;
        }
 
-       /* ... and add block device: */
-       efi_disk_add_dev(devname, if_typename, desc, diskid, 0, 0);
-#endif
-
        return disks;
 }
 
@@ -299,31 +310,18 @@ int efi_disk_register(void)
             uclass_next_device_check(&dev)) {
                struct blk_desc *desc = dev_get_uclass_platdata(dev);
                const char *if_typename = dev->driver->name;
-               disk_partition_t info;
-               int part;
 
                printf("Scanning disk %s...\n", dev->name);
 
-               /* add devices for each partition: */
-               for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
-                       if (part_get_info(desc, part, &info))
-                               continue;
-                       efi_disk_add_dev(dev->name, if_typename, desc,
-                                        desc->devnum, 0, part);
-               }
-
-               /* ... and add block device: */
+               /* Add block device for the full device */
                efi_disk_add_dev(dev->name, if_typename, desc,
                                 desc->devnum, 0, 0);
 
                disks++;
 
-               /*
-               * El Torito images show up as block devices in an EFI world,
-               * so let's create them here
-               */
-               disks += efi_disk_create_eltorito(desc, if_typename,
-                                                 desc->devnum, dev->name);
+               /* Partitions show up as block devices in EFI */
+               disks += efi_disk_create_partitions(desc, if_typename,
+                                                   desc->devnum, dev->name);
        }
 #else
        int i, if_type;
@@ -342,8 +340,6 @@ int efi_disk_register(void)
                for (i = 0; i < 4; i++) {
                        struct blk_desc *desc;
                        char devname[32] = { 0 }; /* dp->str is u16[32] long */
-                       disk_partition_t info;
-                       int part;
 
                        desc = blk_get_devnum_by_type(if_type, i);
                        if (!desc)
@@ -354,24 +350,13 @@ int efi_disk_register(void)
                        snprintf(devname, sizeof(devname), "%s%d",
                                 if_typename, i);
 
-                       /* add devices for each partition: */
-                       for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
-                               if (part_get_info(desc, part, &info))
-                                       continue;
-                               efi_disk_add_dev(devname, if_typename, desc,
-                                                i, 0, part);
-                       }
-
-                       /* ... and add block device: */
+                       /* Add block device for the full device */
                        efi_disk_add_dev(devname, if_typename, desc, i, 0, 0);
                        disks++;
 
-                       /*
-                        * El Torito images show up as block devices
-                        * in an EFI world, so let's create them here
-                        */
-                       disks += efi_disk_create_eltorito(desc, if_typename,
-                                                         i, devname);
+                       /* Partitions show up as block devices in EFI */
+                       disks += efi_disk_create_partitions(desc, if_typename,
+                                                           i, devname);
                }
        }
 #endif
index 411a8c9226154d922ddcc948c96f1ab7660f7c23..3caddd5f8442cf97a96a7301e647a2e6581a8017 100644 (file)
@@ -32,7 +32,7 @@ struct efi_gop_obj {
 };
 
 static efi_status_t EFIAPI gop_query_mode(struct efi_gop *this, u32 mode_number,
-                                         unsigned long *size_of_info,
+                                         efi_uintn_t *size_of_info,
                                          struct efi_gop_mode_info **info)
 {
        struct efi_gop_obj *gopobj;
@@ -56,17 +56,17 @@ static efi_status_t EFIAPI gop_set_mode(struct efi_gop *this, u32 mode_number)
        return EFI_EXIT(EFI_SUCCESS);
 }
 
-static efi_status_t EFIAPI gop_blt(struct efi_gop *this, void *buffer,
-                                  unsigned long operation, unsigned long sx,
-                                  unsigned long sy, unsigned long dx,
-                                  unsigned long dy, unsigned long width,
-                                  unsigned long height, unsigned long delta)
+efi_status_t EFIAPI gop_blt(struct efi_gop *this, void *buffer,
+                           u32 operation, efi_uintn_t sx,
+                           efi_uintn_t sy, efi_uintn_t dx,
+                           efi_uintn_t dy, efi_uintn_t width,
+                           efi_uintn_t height, efi_uintn_t delta)
 {
        struct efi_gop_obj *gopobj = container_of(this, struct efi_gop_obj, ops);
        int i, j, line_len16, line_len32;
        void *fb;
 
-       EFI_ENTRY("%p, %p, %lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx", this,
+       EFI_ENTRY("%p, %p, %u, %zu, %zu, %zu, %zu, %zu, %zu, %zu", this,
                  buffer, operation, sx, sy, dx, dy, width, height, delta);
 
        if (operation != EFI_BLT_BUFFER_TO_VIDEO)
@@ -132,6 +132,7 @@ int efi_gop_register(void)
        u32 bpix, col, row;
        u64 fb_base, fb_size;
        void *fb;
+       efi_status_t ret;
 
 #ifdef CONFIG_DM_VIDEO
        struct udevice *vdev;
@@ -173,11 +174,21 @@ int efi_gop_register(void)
        }
 
        gopobj = calloc(1, sizeof(*gopobj));
+       if (!gopobj) {
+               printf("ERROR: Out of memory\n");
+               return 1;
+       }
+
+       /* Hook up to the device list */
+       efi_add_handle(&gopobj->parent);
 
        /* Fill in object data */
-       gopobj->parent.protocols[0].guid = &efi_gop_guid;
-       gopobj->parent.protocols[0].protocol_interface = &gopobj->ops;
-       gopobj->parent.handle = &gopobj->ops;
+       ret = efi_add_protocol(gopobj->parent.handle, &efi_gop_guid,
+                              &gopobj->ops);
+       if (ret != EFI_SUCCESS) {
+               printf("ERROR: Out of memory\n");
+               return 1;
+       }
        gopobj->ops.query_mode = gop_query_mode;
        gopobj->ops.set_mode = gop_set_mode;
        gopobj->ops.blt = gop_blt;
@@ -206,8 +217,5 @@ int efi_gop_register(void)
        gopobj->bpix = bpix;
        gopobj->fb = fb;
 
-       /* Hook up to the device list */
-       list_add_tail(&gopobj->parent.link, &efi_obj_list);
-
        return 0;
 }
index d47759e08edc62104db13b0c4cef4ae9234abf82..0aa3e0881d43ec1d451897ab76ffdbd673d49f82 100644 (file)
@@ -276,7 +276,7 @@ static uint64_t efi_find_free_memory(uint64_t len, uint64_t max_addr)
 }
 
 efi_status_t efi_allocate_pages(int type, int memory_type,
-                               unsigned long pages, uint64_t *memory)
+                               efi_uintn_t pages, uint64_t *memory)
 {
        u64 len = pages << EFI_PAGE_SHIFT;
        efi_status_t r = EFI_SUCCESS;
@@ -338,7 +338,7 @@ void *efi_alloc(uint64_t len, int memory_type)
        return NULL;
 }
 
-efi_status_t efi_free_pages(uint64_t memory, unsigned long pages)
+efi_status_t efi_free_pages(uint64_t memory, efi_uintn_t pages)
 {
        uint64_t r = 0;
 
@@ -351,7 +351,7 @@ efi_status_t efi_free_pages(uint64_t memory, unsigned long pages)
        return EFI_NOT_FOUND;
 }
 
-efi_status_t efi_allocate_pool(int pool_type, unsigned long size,
+efi_status_t efi_allocate_pool(int pool_type, efi_uintn_t size,
                               void **buffer)
 {
        efi_status_t r;
@@ -392,16 +392,16 @@ efi_status_t efi_free_pool(void *buffer)
        return r;
 }
 
-efi_status_t efi_get_memory_map(unsigned long *memory_map_size,
-                              struct efi_mem_desc *memory_map,
-                              unsigned long *map_key,
-                              unsigned long *descriptor_size,
-                              uint32_t *descriptor_version)
+efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size,
+                               struct efi_mem_desc *memory_map,
+                               efi_uintn_t *map_key,
+                               efi_uintn_t *descriptor_size,
+                               uint32_t *descriptor_version)
 {
-       ulong map_size = 0;
+       efi_uintn_t map_size = 0;
        int map_entries = 0;
        struct list_head *lhandle;
-       unsigned long provided_map_size = *memory_map_size;
+       efi_uintn_t provided_map_size = *memory_map_size;
 
        list_for_each(lhandle, &efi_mem)
                map_entries++;
index 432d9a99a2bf5393009064297e7bc18b3690f75e..8c5d5b492cab03df847ea6a443c3919cbe592a5b 100644 (file)
@@ -292,16 +292,25 @@ int efi_net_register(void)
 
        /* We only expose the "active" eth device, so one is enough */
        netobj = calloc(1, sizeof(*netobj));
+       if (!netobj)
+               goto out_of_memory;
+
+       /* Hook net up to the device list */
+       efi_add_handle(&netobj->parent);
 
        /* Fill in object data */
-       netobj->parent.protocols[0].guid = &efi_net_guid;
-       netobj->parent.protocols[0].protocol_interface = &netobj->net;
-       netobj->parent.protocols[1].guid = &efi_guid_device_path;
-       netobj->parent.protocols[1].protocol_interface =
-               efi_dp_from_eth();
-       netobj->parent.protocols[2].guid = &efi_pxe_guid;
-       netobj->parent.protocols[2].protocol_interface = &netobj->pxe;
-       netobj->parent.handle = &netobj->net;
+       r = efi_add_protocol(netobj->parent.handle, &efi_net_guid,
+                            &netobj->net);
+       if (r != EFI_SUCCESS)
+               goto out_of_memory;
+       r = efi_add_protocol(netobj->parent.handle, &efi_guid_device_path,
+                            efi_dp_from_eth());
+       if (r != EFI_SUCCESS)
+               goto out_of_memory;
+       r = efi_add_protocol(netobj->parent.handle, &efi_pxe_guid,
+                            &netobj->pxe);
+       if (r != EFI_SUCCESS)
+               goto out_of_memory;
        netobj->net.revision = EFI_SIMPLE_NETWORK_PROTOCOL_REVISION;
        netobj->net.start = efi_net_start;
        netobj->net.stop = efi_net_stop;
@@ -326,9 +335,6 @@ int efi_net_register(void)
        if (dhcp_ack)
                netobj->pxe_mode.dhcp_ack = *dhcp_ack;
 
-       /* Hook net up to the device list */
-       list_add_tail(&netobj->parent.link, &efi_obj_list);
-
        /*
         * Create WaitForPacket event.
         */
@@ -361,4 +367,7 @@ int efi_net_register(void)
        }
 
        return 0;
+out_of_memory:
+       printf("ERROR: Out of memory\n");
+       return 1;
 }
diff --git a/lib/efi_loader/efi_watchdog.c b/lib/efi_loader/efi_watchdog.c
new file mode 100644 (file)
index 0000000..35a45de
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ *  EFI watchdog
+ *
+ *  Copyright (c) 2017 Heinrich Schuchardt
+ *
+ *  SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+#include <efi_loader.h>
+
+/* Conversion factor from seconds to multiples of 100ns */
+#define EFI_SECONDS_TO_100NS 10000000ULL
+
+static struct efi_event *watchdog_timer_event;
+
+/*
+ * Reset the system when the watchdog event is notified.
+ *
+ * @event:     the watchdog event
+ * @context:   not used
+ */
+static void EFIAPI efi_watchdog_timer_notify(struct efi_event *event,
+                                            void *context)
+{
+       EFI_ENTRY("%p, %p", event, context);
+
+       printf("\nEFI: Watchdog timeout\n");
+       EFI_CALL_VOID(efi_runtime_services.reset_system(EFI_RESET_COLD,
+                                                       EFI_SUCCESS, 0, NULL));
+
+       EFI_EXIT(EFI_UNSUPPORTED);
+}
+
+/*
+ * Reset the watchdog timer.
+ *
+ * This function is used by the SetWatchdogTimer service.
+ *
+ * @timeout:           seconds before reset by watchdog
+ * @return:            status code
+ */
+efi_status_t efi_set_watchdog(unsigned long timeout)
+{
+       efi_status_t r;
+
+       if (timeout)
+               /* Reset watchdog */
+               r = efi_set_timer(watchdog_timer_event, EFI_TIMER_RELATIVE,
+                                 EFI_SECONDS_TO_100NS * timeout);
+       else
+               /* Deactivate watchdog */
+               r = efi_set_timer(watchdog_timer_event, EFI_TIMER_STOP, 0);
+       return r;
+}
+
+/*
+ * Initialize the EFI watchdog.
+ *
+ * This function is called by efi_init_obj_list()
+ */
+int efi_watchdog_register(void)
+{
+       efi_status_t r;
+
+       /*
+        * Create a timer event.
+        */
+       r = efi_create_event(EVT_TIMER | EVT_NOTIFY_SIGNAL, TPL_CALLBACK,
+                            efi_watchdog_timer_notify, NULL,
+                            &watchdog_timer_event);
+       if (r != EFI_SUCCESS) {
+               printf("ERROR: Failed to register watchdog event\n");
+               return r;
+       }
+       /*
+        * The UEFI standard requires that the watchdog timer is set to five
+        * minutes when invoking an EFI boot option.
+        *
+        * Unified Extensible Firmware Interface (UEFI), version 2.7 Errata A
+        * 7.5. Miscellaneous Boot Services - EFI_BOOT_SERVICES.SetWatchdogTimer
+        */
+       r = efi_set_watchdog(300);
+       if (r != EFI_SUCCESS) {
+               printf("ERROR: Failed to set watchdog timer\n");
+               return r;
+       }
+       return 0;
+}
index 03e65ab1336dcc44b8a350f6c70e7b8472816f78..e59c24c7881b5b8466f32ec8dfd116b73aadcce7 100644 (file)
@@ -5,20 +5,52 @@
  * Written by Simon Glass <sjg@chromium.org>
  *
  * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * This program demonstrates calling a boottime service.
+ * It writes a greeting and the load options to the console.
  */
 
 #include <common.h>
-#include <part_efi.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;
        struct efi_boot_services *boottime = systable->boottime;
+       struct efi_loaded_image *loaded_image;
+       const efi_guid_t loaded_image_guid = LOADED_IMAGE_GUID;
+       efi_status_t ret;
 
        con_out->output_string(con_out, L"Hello, world!\n");
-       boottime->exit(handle, 0, 0, NULL);
 
-       return EFI_SUCCESS;
+       /* Get the loaded image protocol */
+       ret = boottime->handle_protocol(handle, &loaded_image_guid,
+                                       (void **)&loaded_image);
+       if (ret != EFI_SUCCESS) {
+               con_out->output_string(con_out,
+                                      L"Cannot open loaded image protocol\n");
+               goto out;
+       }
+       /* Output the load options */
+       con_out->output_string(con_out, L"Load options: ");
+       if (loaded_image->load_options_size && loaded_image->load_options)
+               con_out->output_string(con_out,
+                                      (u16 *)loaded_image->load_options);
+       else
+               con_out->output_string(con_out, L"<none>");
+       con_out->output_string(con_out, L"\n");
+
+out:
+       boottime->exit(handle, ret, 0, NULL);
+
+       /* We should never arrive here */
+       return ret;
 }
index e446046e0220b2329da36ec0004b3a2ea1920dcf..837e86228ea4d9fbb0ac55f920333708610c8375 100644 (file)
@@ -7,26 +7,16 @@
 # This file only gets included with CONFIG_EFI_LOADER set, so all
 # object inclusion implicitly depends on it
 
-CFLAGS_efi_selftest.o := $(CFLAGS_EFI)
-CFLAGS_REMOVE_efi_selftest.o := $(CFLAGS_NON_EFI)
-CFLAGS_efi_selftest_console.o := $(CFLAGS_EFI)
-CFLAGS_REMOVE_efi_selftest_console.o := $(CFLAGS_NON_EFI)
-CFLAGS_efi_selftest_events.o := $(CFLAGS_EFI)
-CFLAGS_REMOVE_efi_selftest_events.o := $(CFLAGS_NON_EFI)
-CFLAGS_efi_selftest_exitbootservices.o := $(CFLAGS_EFI)
-CFLAGS_REMOVE_efi_selftest_exitbootservices.o := $(CFLAGS_NON_EFI)
-CFLAGS_efi_selftest_snp.o := $(CFLAGS_EFI)
-CFLAGS_REMOVE_efi_selftest_snp.o := $(CFLAGS_NON_EFI)
-CFLAGS_efi_selftest_tpl.o := $(CFLAGS_EFI)
-CFLAGS_REMOVE_efi_selftest_tpl.o := $(CFLAGS_NON_EFI)
-CFLAGS_efi_selftest_util.o := $(CFLAGS_EFI)
-CFLAGS_REMOVE_efi_selftest_util.o := $(CFLAGS_NON_EFI)
-
 obj-$(CONFIG_CMD_BOOTEFI_SELFTEST) += \
 efi_selftest.o \
 efi_selftest_console.o \
+efi_selftest_devicepath.o \
 efi_selftest_events.o \
 efi_selftest_exitbootservices.o \
+efi_selftest_gop.o \
+efi_selftest_manageprotocols.o \
 efi_selftest_snp.o \
+efi_selftest_textoutput.o \
 efi_selftest_tpl.o \
-efi_selftest_util.o
+efi_selftest_util.o \
+efi_selftest_watchdog.o
index 45d8d3d384c1814ea7e5fdff88c8994b51e3f9e7..4e5a12c47cae33543b15c230675467f040bca52e 100644 (file)
@@ -9,6 +9,13 @@
 #include <efi_selftest.h>
 #include <vsprintf.h>
 
+/*
+ * Constants for test step bitmap
+ */
+#define EFI_ST_SETUP   1
+#define EFI_ST_EXECUTE 2
+#define EFI_ST_TEARDOWN        4
+
 static const struct efi_system_table *systable;
 static const struct efi_boot_services *boottime;
 static const struct efi_runtime_services *runtime;
@@ -25,9 +32,9 @@ static u16 reset_message[] = L"Selftest completed";
  */
 void efi_st_exit_boot_services(void)
 {
-       unsigned long  map_size = 0;
-       unsigned long  map_key;
-       unsigned long desc_size;
+       efi_uintn_t map_size = 0;
+       efi_uintn_t map_key;
+       efi_uintn_t desc_size;
        u32 desc_version;
        efi_status_t ret;
        struct efi_mem_desc *memory_map;
@@ -133,6 +140,70 @@ static int teardown(struct efi_unit_test *test, unsigned int *failures)
        return ret;
 }
 
+/*
+ * Check that a test exists.
+ *
+ * @testname:  name of the test
+ * @return:    test
+ */
+static struct efi_unit_test *find_test(const u16 *testname)
+{
+       struct efi_unit_test *test;
+
+       for (test = ll_entry_start(struct efi_unit_test, efi_unit_test);
+            test < ll_entry_end(struct efi_unit_test, efi_unit_test); ++test) {
+               if (!efi_st_strcmp_16_8(testname, test->name))
+                       return test;
+       }
+       efi_st_printf("\nTest '%ps' not found\n", testname);
+       return NULL;
+}
+
+/*
+ * List all available tests.
+ */
+static void list_all_tests(void)
+{
+       struct efi_unit_test *test;
+
+       /* List all tests */
+       efi_st_printf("\nAvailable tests:\n");
+       for (test = ll_entry_start(struct efi_unit_test, efi_unit_test);
+            test < ll_entry_end(struct efi_unit_test, efi_unit_test); ++test) {
+               efi_st_printf("'%s'%s\n", test->name,
+                             test->on_request ? " - on request" : "");
+       }
+}
+
+/*
+ * Execute test steps of one phase.
+ *
+ * @testname   name of a single selected test or NULL
+ * @phase      test phase
+ * @steps      steps to execute
+ * failures    returns EFI_ST_SUCCESS if all test steps succeeded
+ */
+void efi_st_do_tests(const u16 *testname, unsigned int phase,
+                    unsigned int steps, unsigned int *failures)
+{
+       struct efi_unit_test *test;
+
+       for (test = ll_entry_start(struct efi_unit_test, efi_unit_test);
+            test < ll_entry_end(struct efi_unit_test, efi_unit_test); ++test) {
+               if (testname ?
+                   efi_st_strcmp_16_8(testname, test->name) : test->on_request)
+                       continue;
+               if (test->phase != phase)
+                       continue;
+               if (steps & EFI_ST_SETUP)
+                       setup(test, failures);
+               if (steps & EFI_ST_EXECUTE)
+                       execute(test, failures);
+               if (steps & EFI_ST_TEARDOWN)
+                       teardown(test, failures);
+       }
+}
+
 /*
  * Execute selftest of the EFI API
  *
@@ -153,8 +224,10 @@ static int teardown(struct efi_unit_test *test, unsigned int *failures)
 efi_status_t EFIAPI efi_selftest(efi_handle_t image_handle,
                                 struct efi_system_table *systab)
 {
-       struct efi_unit_test *test;
        unsigned int failures = 0;
+       const u16 *testname = NULL;
+       struct efi_loaded_image *loaded_image;
+       efi_status_t ret;
 
        systable = systab;
        boottime = systable->boottime;
@@ -163,47 +236,59 @@ efi_status_t EFIAPI efi_selftest(efi_handle_t image_handle,
        con_out = systable->con_out;
        con_in = systable->con_in;
 
-       efi_st_printf("\nTesting EFI API implementation\n");
+       ret = boottime->handle_protocol(image_handle, &efi_guid_loaded_image,
+                                       (void **)&loaded_image);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Cannot open loaded image protocol\n");
+               return ret;
+       }
 
-       efi_st_printf("\nNumber of tests to execute: %u\n",
-                     ll_entry_count(struct efi_unit_test, efi_unit_test));
+       if (loaded_image->load_options)
+               testname = (u16 *)loaded_image->load_options;
 
-       /* Execute boottime tests */
-       for (test = ll_entry_start(struct efi_unit_test, efi_unit_test);
-            test < ll_entry_end(struct efi_unit_test, efi_unit_test); ++test) {
-               if (test->phase == EFI_EXECUTE_BEFORE_BOOTTIME_EXIT) {
-                       setup(test, &failures);
-                       execute(test, &failures);
-                       teardown(test, &failures);
+       if (testname) {
+               if (!efi_st_strcmp_16_8(testname, "list") ||
+                   !find_test(testname)) {
+                       list_all_tests();
+                       /*
+                        * TODO:
+                        * Once the Exit boottime service is correctly
+                        * implemented we should call
+                        *   boottime->exit(image_handle, EFI_SUCCESS, 0, NULL);
+                        * here, cf.
+                        * https://lists.denx.de/pipermail/u-boot/2017-October/308720.html
+                        */
+                       return EFI_SUCCESS;
                }
        }
 
+       efi_st_printf("\nTesting EFI API implementation\n");
+
+       if (testname)
+               efi_st_printf("\nSelected test: '%ps'\n", testname);
+       else
+               efi_st_printf("\nNumber of tests to execute: %u\n",
+                             ll_entry_count(struct efi_unit_test,
+                                            efi_unit_test));
+
+       /* Execute boottime tests */
+       efi_st_do_tests(testname, EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+                       EFI_ST_SETUP | EFI_ST_EXECUTE | EFI_ST_TEARDOWN,
+                       &failures);
+
        /* Execute mixed tests */
-       for (test = ll_entry_start(struct efi_unit_test, efi_unit_test);
-            test < ll_entry_end(struct efi_unit_test, efi_unit_test); ++test) {
-               if (test->phase == EFI_SETUP_BEFORE_BOOTTIME_EXIT)
-                       setup(test, &failures);
-       }
+       efi_st_do_tests(testname, EFI_SETUP_BEFORE_BOOTTIME_EXIT,
+                       EFI_ST_SETUP, &failures);
 
        efi_st_exit_boot_services();
 
-       for (test = ll_entry_start(struct efi_unit_test, efi_unit_test);
-            test < ll_entry_end(struct efi_unit_test, efi_unit_test); ++test) {
-               if (test->phase == EFI_SETUP_BEFORE_BOOTTIME_EXIT) {
-                       execute(test, &failures);
-                       teardown(test, &failures);
-               }
-       }
+       efi_st_do_tests(testname, EFI_SETUP_BEFORE_BOOTTIME_EXIT,
+                       EFI_ST_EXECUTE | EFI_ST_TEARDOWN, &failures);
 
        /* Execute runtime tests */
-       for (test = ll_entry_start(struct efi_unit_test, efi_unit_test);
-            test < ll_entry_end(struct efi_unit_test, efi_unit_test); ++test) {
-               if (test->phase == EFI_SETUP_AFTER_BOOTTIME_EXIT) {
-                       setup(test, &failures);
-                       execute(test, &failures);
-                       teardown(test, &failures);
-               }
-       }
+       efi_st_do_tests(testname, EFI_SETUP_AFTER_BOOTTIME_EXIT,
+                       EFI_ST_SETUP | EFI_ST_EXECUTE | EFI_ST_TEARDOWN,
+                       &failures);
 
        /* Give feedback */
        efi_st_printf("\nSummary: %u failures\n\n", failures);
index 840e2290c60c05684c6afb898e4c66db42c374da..6a7fd20da5c51b008fd0794b07c96345c50225cc 100644 (file)
@@ -142,6 +142,7 @@ void efi_st_printf(const char *fmt, ...)
        const char *c;
        u16 *pos = buf;
        const char *s;
+       const u16 *u;
 
        va_start(args, fmt);
 
@@ -179,9 +180,18 @@ void efi_st_printf(const char *fmt, ...)
                        case 'p':
                                ++c;
                                switch (*c) {
+                               /* MAC address */
                                case 'm':
                                        mac(va_arg(args, void*), &pos);
                                        break;
+
+                               /* u16 string */
+                               case 's':
+                                       u = va_arg(args, u16*);
+                                       /* Ensure string fits into buffer */
+                                       for (; *u && pos < buf + 120; ++u)
+                                               *pos++ = *u;
+                                       break;
                                default:
                                        --c;
                                        pointer(va_arg(args, void*), &pos);
diff --git a/lib/efi_selftest/efi_selftest_devicepath.c b/lib/efi_selftest/efi_selftest_devicepath.c
new file mode 100644 (file)
index 0000000..1ab54eb
--- /dev/null
@@ -0,0 +1,390 @@
+/*
+ * efi_selftest_devicepath
+ *
+ * Copyright (c) 2017 Heinrich Schuchardt <xypron.glpk@gmx.de>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * This unit test checks the following protocol services:
+ * DevicePathToText
+ */
+
+#include <efi_selftest.h>
+
+static struct efi_boot_services *boottime;
+
+static efi_handle_t handle1;
+static efi_handle_t handle2;
+static efi_handle_t handle3;
+
+struct interface {
+       void (EFIAPI * inc)(void);
+} interface;
+
+static efi_guid_t guid_device_path = DEVICE_PATH_GUID;
+
+static efi_guid_t guid_device_path_to_text_protocol =
+       EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID;
+
+static efi_guid_t guid_protocol =
+       EFI_GUID(0xdbca4c98, 0x6cb0, 0x694d,
+                0x08, 0x72, 0x81, 0x9c, 0x65, 0x0c, 0xbb, 0x7d);
+
+static efi_guid_t guid_vendor1 =
+       EFI_GUID(0xdbca4c98, 0x6cb0, 0x694d,
+                0x08, 0x72, 0x81, 0x9c, 0x65, 0x0c, 0xbb, 0xb1);
+
+static efi_guid_t guid_vendor2 =
+       EFI_GUID(0xdbca4c98, 0x6cb0, 0x694d,
+                0x08, 0x72, 0x81, 0x9c, 0x65, 0x0c, 0xbb, 0xa2);
+
+static efi_guid_t guid_vendor3 =
+       EFI_GUID(0xdbca4c98, 0x6cb0, 0x694d,
+                0x08, 0x72, 0x81, 0x9c, 0x65, 0x0c, 0xbb, 0xc3);
+
+static u8 *dp1;
+static u8 *dp2;
+static u8 *dp3;
+
+struct efi_device_path_to_text_protocol *device_path_to_text;
+
+/*
+ * Setup unit test.
+ *
+ * Create three handles. Install a new protocol on two of them and
+ * provice device paths.
+ *
+ * handle1
+ *   guid interface
+ * handle2
+ *   guid interface
+ * handle3
+ *
+ * @handle:    handle of the loaded image
+ * @systable:  system table
+ */
+static int setup(const efi_handle_t img_handle,
+                const struct efi_system_table *systable)
+{
+       struct efi_device_path_vendor vendor_node;
+       struct efi_device_path end_node;
+       efi_status_t ret;
+
+       boottime = systable->boottime;
+
+       ret = boottime->locate_protocol(&guid_device_path_to_text_protocol,
+                                       NULL, (void **)&device_path_to_text);
+       if (ret != EFI_SUCCESS) {
+               device_path_to_text = NULL;
+               efi_st_error(
+                       "Device path to text protocol is not available.\n");
+               return EFI_ST_FAILURE;
+       }
+
+       ret = boottime->allocate_pool(EFI_LOADER_DATA,
+                                     sizeof(struct efi_device_path_vendor) +
+                                     sizeof(struct efi_device_path),
+                                     (void **)&dp1);
+       if (ret != EFI_SUCCESS)
+               goto out_of_memory;
+
+       ret = boottime->allocate_pool(EFI_LOADER_DATA, 2 *
+                                     sizeof(struct efi_device_path_vendor) +
+                                     sizeof(struct efi_device_path),
+                                     (void **)&dp2);
+       if (ret != EFI_SUCCESS)
+               goto out_of_memory;
+
+       ret = boottime->allocate_pool(EFI_LOADER_DATA, 3 *
+                                     sizeof(struct efi_device_path_vendor) +
+                                     sizeof(struct efi_device_path),
+                                     (void **)&dp3);
+       if (ret != EFI_SUCCESS)
+               goto out_of_memory;
+
+       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_vendor1,
+                          sizeof(efi_guid_t));
+       boottime->copy_mem(dp1, &vendor_node,
+                          sizeof(struct efi_device_path_vendor));
+       boottime->copy_mem(dp2, &vendor_node,
+                          sizeof(struct efi_device_path_vendor));
+       boottime->copy_mem(dp3, &vendor_node,
+                          sizeof(struct efi_device_path_vendor));
+
+       boottime->copy_mem(&vendor_node.guid, &guid_vendor2,
+                          sizeof(efi_guid_t));
+       boottime->copy_mem(dp2 + sizeof(struct efi_device_path_vendor),
+                          &vendor_node, sizeof(struct efi_device_path_vendor));
+       boottime->copy_mem(dp3 + sizeof(struct efi_device_path_vendor),
+                          &vendor_node, sizeof(struct efi_device_path_vendor));
+
+       boottime->copy_mem(&vendor_node.guid, &guid_vendor3,
+                          sizeof(efi_guid_t));
+       boottime->copy_mem(dp3 + 2 * sizeof(struct efi_device_path_vendor),
+                          &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(dp1 + sizeof(struct efi_device_path_vendor),
+                          &end_node, sizeof(struct efi_device_path));
+       boottime->copy_mem(dp2 + 2 * sizeof(struct efi_device_path_vendor),
+                          &end_node, sizeof(struct efi_device_path));
+       boottime->copy_mem(dp3 + 3 * sizeof(struct efi_device_path_vendor),
+                          &end_node, sizeof(struct efi_device_path));
+
+       ret = boottime->install_protocol_interface(&handle1,
+                                                  &guid_device_path,
+                                                  EFI_NATIVE_INTERFACE,
+                                                  dp1);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("InstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = boottime->install_protocol_interface(&handle1,
+                                                  &guid_protocol,
+                                                  EFI_NATIVE_INTERFACE,
+                                                  &interface);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("InstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = boottime->install_protocol_interface(&handle2,
+                                                  &guid_device_path,
+                                                  EFI_NATIVE_INTERFACE,
+                                                  dp2);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("InstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = boottime->install_protocol_interface(&handle2,
+                                                  &guid_protocol,
+                                                  EFI_NATIVE_INTERFACE,
+                                                  &interface);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("InstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = boottime->install_protocol_interface(&handle3,
+                                                  &guid_device_path,
+                                                  EFI_NATIVE_INTERFACE,
+                                                  dp3);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("InstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
+       }
+       return EFI_ST_SUCCESS;
+
+out_of_memory:
+       efi_st_error("Out of memory\n");
+       return EFI_ST_FAILURE;
+}
+
+/*
+ * Tear down unit test.
+ *
+ */
+static int teardown(void)
+{
+       efi_status_t ret;
+
+       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,
+                                                    &guid_protocol,
+                                                    &interface);
+       if (ret != EFI_SUCCESS)
+               efi_st_todo("UninstallProtocolInterface failed\n");
+       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,
+                                                    &guid_protocol,
+                                                    &interface);
+       if (ret != EFI_SUCCESS)
+               efi_st_todo("UninstallProtocolInterface failed\n");
+       ret = boottime->uninstall_protocol_interface(&handle3,
+                                                    &guid_device_path,
+                                                    dp3);
+       if (ret != EFI_SUCCESS)
+               efi_st_todo("UninstallProtocolInterface failed\n");
+       if (dp1) {
+               ret = boottime->free_pool(dp1);
+               if (ret != EFI_SUCCESS) {
+                       efi_st_error("FreePool failed\n");
+                       return EFI_ST_FAILURE;
+               }
+       }
+       if (dp2) {
+               ret = boottime->free_pool(dp2);
+               if (ret != EFI_SUCCESS) {
+                       efi_st_error("FreePool failed\n");
+                       return EFI_ST_FAILURE;
+               }
+       }
+       if (dp3) {
+               ret = boottime->free_pool(dp3);
+               if (ret != EFI_SUCCESS) {
+                       efi_st_error("FreePool failed\n");
+                       return EFI_ST_FAILURE;
+               }
+       }
+       return EFI_ST_SUCCESS;
+}
+
+/*
+ * Execute unit test.
+ *
+ */
+static int execute(void)
+{
+       struct efi_device_path *remaining_dp;
+       void *handle;
+       /*
+        * This device path node ends with the letter 't' of 'u-boot'.
+        * The following '.bin' does not belong to the node but is
+        * helps to test the correct truncation.
+        */
+       struct {
+               struct efi_device_path dp;
+               u16 text[12];
+       } __packed dp_node = {
+                       { DEVICE_PATH_TYPE_MEDIA_DEVICE,
+                         DEVICE_PATH_SUB_TYPE_FILE_PATH,
+                         sizeof(struct efi_device_path) + 12},
+                       L"u-boot.bin",
+               };
+       u16 *string;
+       efi_status_t ret;
+       efi_uintn_t i, no_handles;
+       efi_handle_t *handles;
+       struct efi_device_path *dp;
+
+       /* Display all available device paths */
+       ret = boottime->locate_handle_buffer(BY_PROTOCOL,
+                                            &guid_device_path,
+                                            NULL, &no_handles, &handles);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Cannot retrieve device path protocols.\n");
+               return EFI_ST_FAILURE;
+       }
+
+       efi_st_printf("Installed device path protocols:\n");
+       for (i = 0; i < no_handles; ++i) {
+               ret = boottime->open_protocol(handles[i], &guid_device_path,
+                                             (void **)&dp, NULL, NULL,
+                                             EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+               if (ret != EFI_SUCCESS) {
+                       efi_st_error("Cannot open device path protocol.\n");
+                       return EFI_ST_FAILURE;
+               }
+               string = device_path_to_text->convert_device_path_to_text(
+                                       dp, true, false);
+               if (!string) {
+                       efi_st_error("ConvertDevicePathToText failed\n");
+                       return EFI_ST_FAILURE;
+               }
+               efi_st_printf("%ps\n", string);
+               ret = boottime->free_pool(string);
+               if (ret != EFI_SUCCESS) {
+                       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");
+       }
+       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(
+                       (struct efi_device_path *)dp2, true, false);
+       if (!string) {
+               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_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");
+               return EFI_ST_FAILURE;
+       }
+
+       /* Test ConvertDeviceNodeToText */
+       string = device_path_to_text->convert_device_node_to_text(
+                       (struct efi_device_path *)&dp_node, true, false);
+       if (!string) {
+               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_error(
+                       "Incorrect conversion by ConvertDeviceNodeToText\n");
+               return EFI_ST_FAILURE;
+       }
+
+       /* Test LocateDevicePath */
+       remaining_dp = (struct efi_device_path *)dp3;
+       ret = boottime->locate_device_path(&guid_protocol, &remaining_dp,
+                                          &handle);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("LocateDevicePath failed\n");
+               return EFI_ST_FAILURE;
+       }
+       if (handle != handle2) {
+               efi_st_error("LocateDevicePath returned wrong handle\n");
+               return EFI_ST_FAILURE;
+       }
+       string = device_path_to_text->convert_device_path_to_text(remaining_dp,
+                                                                 true, false);
+       if (!string) {
+               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_error("LocateDevicePath: wrong remaining device path\n");
+               return EFI_ST_FAILURE;
+       }
+
+       return EFI_ST_SUCCESS;
+}
+
+EFI_UNIT_TEST(devicepath) = {
+       .name = "device path",
+       .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+       .setup = setup,
+       .execute = execute,
+       .teardown = teardown,
+};
index 081f31257fbd60f66f1eff515fdeacdd39b7ffd9..ad9490bd250ca5e2a4ada2e1c0214331aeb59059 100644 (file)
@@ -108,7 +108,7 @@ static int teardown(void)
  */
 static int execute(void)
 {
-       size_t index;
+       efi_uintn_t index;
        efi_status_t ret;
 
        /* Set 10 ms timer */
diff --git a/lib/efi_selftest/efi_selftest_gop.c b/lib/efi_selftest/efi_selftest_gop.c
new file mode 100644 (file)
index 0000000..2a0553b
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * efi_selftest_gop
+ *
+ * Copyright (c) 2017 Heinrich Schuchardt <xypron.glpk@gmx.de>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * Test the graphical output protocol.
+ */
+
+#include <efi_selftest.h>
+
+static struct efi_boot_services *boottime;
+static efi_guid_t efi_gop_guid = EFI_GOP_GUID;
+static struct efi_gop *gop;
+
+/*
+ * 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;
+
+       boottime = systable->boottime;
+
+       ret = boottime->locate_protocol(&efi_gop_guid, NULL, (void **)&gop);
+       if (ret != EFI_SUCCESS) {
+               gop = NULL;
+               efi_st_printf("Graphical output protocol is not available.\n");
+       }
+
+       return EFI_ST_SUCCESS;
+}
+
+/*
+ * Tear down unit test.
+ *
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int teardown(void)
+{
+       return EFI_ST_SUCCESS;
+}
+
+/*
+ * Execute unit test.
+ *
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int execute(void)
+{
+       efi_status_t ret;
+       u32 i, max_mode;
+       efi_uintn_t size;
+       struct efi_gop_mode_info *info;
+
+       if (!gop)
+               return EFI_ST_SUCCESS;
+
+       if (!gop->mode) {
+               efi_st_error("EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE missing\n");
+               return EFI_ST_FAILURE;
+       }
+       max_mode = gop->mode->max_mode;
+       if (!max_mode) {
+               efi_st_error("No graphical mode available\n");
+               return EFI_ST_FAILURE;
+       }
+       efi_st_printf("Number of available modes: %u\n", max_mode);
+
+       for (i = 0; i < max_mode; ++i) {
+               ret = gop->query_mode(gop, i, &size, &info);
+               if (ret != EFI_SUCCESS) {
+                       efi_st_printf("Could not query mode %u\n", i);
+                       return EFI_ST_FAILURE;
+               }
+               efi_st_printf("Mode %u: %u x %u\n",
+                             i, info->width, info->height);
+       }
+
+       return EFI_ST_SUCCESS;
+}
+
+EFI_UNIT_TEST(gop) = {
+       .name = "graphical output",
+       .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+       .setup = setup,
+       .execute = execute,
+       .teardown = teardown,
+};
diff --git a/lib/efi_selftest/efi_selftest_manageprotocols.c b/lib/efi_selftest/efi_selftest_manageprotocols.c
new file mode 100644 (file)
index 0000000..f20f152
--- /dev/null
@@ -0,0 +1,354 @@
+/*
+ * efi_selftest_manageprotocols
+ *
+ * Copyright (c) 2017 Heinrich Schuchardt <xypron.glpk@gmx.de>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * This unit test checks the following protocol services:
+ * InstallProtocolInterface, UninstallProtocolInterface,
+ * InstallMultipleProtocolsInterfaces, UninstallMultipleProtocolsInterfaces,
+ * HandleProtocol, ProtocolsPerHandle,
+ * LocateHandle, LocateHandleBuffer.
+ */
+
+#include <efi_selftest.h>
+
+/*
+ * The test currently does not actually call the interface function.
+ * So this is just a dummy structure.
+ */
+struct interface {
+       void (EFIAPI * inc)(void);
+};
+
+static struct efi_boot_services *boottime;
+static efi_guid_t guid1 =
+       EFI_GUID(0x2e7ca819, 0x21d3, 0x0a3a,
+                0xf7, 0x91, 0x82, 0x1f, 0x7a, 0x83, 0x67, 0xaf);
+static efi_guid_t guid2 =
+       EFI_GUID(0xf909f2bb, 0x90a8, 0x0d77,
+                0x94, 0x0c, 0x3e, 0xa8, 0xea, 0x38, 0xd6, 0x6f);
+static efi_guid_t guid3 =
+       EFI_GUID(0x06d641a3, 0xf4e7, 0xe0c9,
+                0xe7, 0x8d, 0x41, 0x2d, 0x72, 0xa6, 0xb1, 0x24);
+static efi_handle_t handle1;
+static efi_handle_t handle2;
+static struct interface interface1;
+static struct interface interface2;
+static struct interface interface3;
+static struct interface interface4;
+
+/*
+ * Find a handle in an array.
+ *
+ * @handle:    handle to find
+ * @count:     number of entries in the array
+ * @buffer:    array to search
+ */
+efi_status_t find_in_buffer(efi_handle_t handle, size_t count,
+                           efi_handle_t *buffer)
+{
+       size_t i;
+
+       for (i = 0; i < count; ++i) {
+               if (buffer[i] == handle)
+                       return EFI_SUCCESS;
+       }
+       return EFI_NOT_FOUND;
+}
+
+/*
+ * Setup unit test.
+ *
+ * Create two handles and install two out of three protocol interfaces on each
+ * of them:
+ *
+ * handle1
+ *   guid1 interface1
+ *   guid3 interface3
+ * handle2
+ *   guid1 interface4
+ *   guid2 interface2
+ *
+ * @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;
+       efi_handle_t handle;
+
+       boottime = systable->boottime;
+
+       ret = boottime->install_protocol_interface(&handle1, &guid3,
+                                                  EFI_NATIVE_INTERFACE,
+                                                  &interface3);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("InstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
+       }
+       if (!handle1) {
+               efi_st_error("InstallProtocolInterface failed to create handle\n");
+               return EFI_ST_FAILURE;
+       }
+       handle = handle1;
+       ret = boottime->install_protocol_interface(&handle1, &guid1,
+                                                  EFI_NATIVE_INTERFACE,
+                                                  &interface1);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("InstallProtocolInterface failed\n");
+               return EFI_ST_FAILURE;
+       }
+       if (handle != handle1) {
+               efi_st_error("InstallProtocolInterface failed to use handle\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = boottime->install_multiple_protocol_interfaces(&handle2,
+                       &guid1, &interface4, &guid2, &interface2, NULL);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("InstallMultipleProtocolInterfaces failed\n");
+               return EFI_ST_FAILURE;
+       }
+       if (!handle2 || handle1 == handle2) {
+               efi_st_error("InstallMultipleProtocolInterfaces failed to create handle\n");
+               return EFI_ST_FAILURE;
+       }
+
+       return EFI_ST_SUCCESS;
+}
+
+/*
+ * Tear down unit test.
+ *
+ */
+static int teardown(void)
+{
+       return EFI_ST_SUCCESS;
+}
+
+/*
+ * Execute unit test.
+ *
+ */
+static int execute(void)
+{
+       struct interface *interface;
+       efi_status_t ret;
+       efi_handle_t *buffer;
+       size_t buffer_size;
+       efi_uintn_t count = 0;
+       efi_guid_t **prot_buffer;
+       efi_uintn_t prot_count;
+
+       /*
+        * Test HandleProtocol
+        */
+       ret = boottime->handle_protocol(handle1, &guid3, (void **)&interface);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("HandleProtocol failed to retrieve interface\n");
+               return EFI_ST_FAILURE;
+       }
+       if (interface != &interface3) {
+               efi_st_error("HandleProtocol returned wrong interface\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = boottime->handle_protocol(handle1, &guid2, (void **)&interface);
+       if (ret == EFI_SUCCESS) {
+               efi_st_error("HandleProtocol returned not installed interface\n");
+               return EFI_ST_FAILURE;
+       }
+
+       /*
+        * Test LocateHandleBuffer with AllHandles
+        */
+       ret = boottime->locate_handle_buffer(ALL_HANDLES, NULL, NULL,
+                                            &count, &buffer);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("LocateHandleBuffer with AllHandles failed\n");
+               return EFI_ST_FAILURE;
+       }
+       buffer_size = count;
+       ret = find_in_buffer(handle1, count, buffer);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("LocateHandleBuffer failed to locate new handle\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = find_in_buffer(handle2, count, buffer);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("LocateHandleBuffer failed to locate new handle\n");
+               return EFI_ST_FAILURE;
+       }
+       boottime->set_mem(buffer, sizeof(efi_handle_t) * buffer_size, 0);
+
+       /*
+        * Test error handling in UninstallMultipleProtocols
+        *
+        * Try to uninstall more protocols than there are installed.
+        */
+       ret = boottime->uninstall_multiple_protocol_interfaces(
+                                               handle2,
+                                               &guid1, &interface4,
+                                               &guid2, &interface2,
+                                               &guid3, &interface3,
+                                               NULL);
+       if (ret == EFI_SUCCESS) {
+               efi_st_todo("UninstallMultipleProtocolInterfaces did not catch error\n");
+               return EFI_ST_FAILURE;
+       }
+
+       /*
+        * Test LocateHandleBuffer with ByProtocol
+        */
+       count = buffer_size;
+       ret = boottime->locate_handle_buffer(BY_PROTOCOL, &guid1, NULL,
+                                            &count, &buffer);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("LocateHandleBuffer failed to locate new handles\n");
+               return EFI_ST_FAILURE;
+       }
+       if (count != 2) {
+               efi_st_error("LocateHandleBuffer failed to locate new handles\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = find_in_buffer(handle1, count, buffer);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("LocateHandleBuffer failed to locate new handle\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = find_in_buffer(handle2, count, buffer);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("LocateHandleBuffer failed to locate new handle\n");
+               return EFI_ST_FAILURE;
+       }
+       boottime->set_mem(buffer, sizeof(efi_handle_t) * buffer_size, 0);
+
+       /*
+        * Test LocateHandle with ByProtocol
+        */
+       count = buffer_size * sizeof(efi_handle_t);
+       ret = boottime->locate_handle(BY_PROTOCOL, &guid1, NULL,
+                                     &count, buffer);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("LocateHandle with ByProtocol failed\n");
+               return EFI_ST_FAILURE;
+       }
+       if (count / sizeof(efi_handle_t) != 2) {
+               efi_st_error("LocateHandle failed to locate new handles\n");
+               return EFI_ST_FAILURE;
+       }
+       buffer_size = count;
+       ret = find_in_buffer(handle1, count, buffer);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("LocateHandle failed to locate new handles\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = find_in_buffer(handle2, count, buffer);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("LocateHandle failed to locate new handles\n");
+               return EFI_ST_FAILURE;
+       }
+       boottime->set_mem(buffer, sizeof(efi_handle_t) * buffer_size, 0);
+
+       /*
+        * Test LocateProtocol
+        */
+       ret = boottime->locate_protocol(&guid1, NULL, (void **)&interface);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("LocateProtocol failed\n");
+               return EFI_ST_FAILURE;
+       }
+       if (interface != &interface1 && interface != &interface4) {
+               efi_st_error("LocateProtocol failed to locate protocol\n");
+               return EFI_ST_FAILURE;
+       }
+
+       /*
+        * Test UninstallMultipleProtocols
+        */
+       ret = boottime->uninstall_multiple_protocol_interfaces(
+                                               handle2,
+                                               &guid1, &interface4,
+                                               &guid2, &interface2,
+                                               NULL);
+       if (ret != EFI_SUCCESS) {
+               efi_st_todo("UninstallMultipleProtocolInterfaces failed\n");
+               /* This test is known to fail due to missing implementation */
+       }
+       /*
+        * Check that the protocols are really uninstalled.
+        */
+       count = buffer_size;
+       ret = boottime->locate_handle_buffer(BY_PROTOCOL, &guid1, NULL,
+                                            &count, &buffer);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("LocateHandleBuffer failed\n");
+               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 */
+       }
+       ret = find_in_buffer(handle1, count, buffer);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to locate new handle\n");
+               return EFI_ST_FAILURE;
+       }
+       boottime->set_mem(buffer, sizeof(efi_handle_t) * buffer_size, 0);
+
+       /*
+        * Test ProtocolsPerHandle
+        */
+       ret = boottime->protocols_per_handle(handle1,
+                                            &prot_buffer, &prot_count);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to get protocols per handle\n");
+               return EFI_ST_FAILURE;
+       }
+       if (prot_count != 2) {
+               efi_st_error("Failed to get protocols per handle\n");
+               return EFI_ST_FAILURE;
+       }
+       if (efi_st_memcmp(prot_buffer[0], &guid1, 16) &&
+           efi_st_memcmp(prot_buffer[1], &guid1, 16)) {
+               efi_st_error("Failed to get protocols per handle\n");
+               return EFI_ST_FAILURE;
+       }
+       if (efi_st_memcmp(prot_buffer[0], &guid3, 16) &&
+           efi_st_memcmp(prot_buffer[1], &guid3, 16)) {
+               efi_st_error("Failed to get protocols per handle\n");
+               return EFI_ST_FAILURE;
+       }
+
+       /*
+        * Uninstall remaining protocols
+        */
+       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 */
+       }
+       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 */
+       }
+       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 */
+       }
+
+       return EFI_ST_SUCCESS;
+}
+
+EFI_UNIT_TEST(protserv) = {
+       .name = "manage protocols",
+       .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+       .setup = setup,
+       .execute = execute,
+       .teardown = teardown,
+};
index bdd6ce20da61245eaaacf79498dd03ea1a463cc3..cc0705fb59fbab3ad14c664ebaacc5cab4efcaa0 100644 (file)
@@ -260,7 +260,7 @@ static int execute(void)
 {
        efi_status_t ret;
        struct efi_event *events[2];
-       size_t index;
+       efi_uintn_t index;
        union {
                struct dhcp p;
                u8 b[PKTSIZE];
diff --git a/lib/efi_selftest/efi_selftest_textoutput.c b/lib/efi_selftest/efi_selftest_textoutput.c
new file mode 100644 (file)
index 0000000..6e8c90c
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * efi_selftest_textoutput
+ *
+ * Copyright (c) 2017 Heinrich Schuchardt <xypron.glpk@gmx.de>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * Test the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.
+ *
+ * The following services are tested:
+ * OutputString, TestString, SetAttribute.
+ */
+
+#include <efi_selftest.h>
+
+/*
+ * Execute unit test.
+ *
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int execute(void)
+{
+       size_t foreground;
+       size_t background;
+       size_t attrib;
+       efi_status_t ret;
+
+       /* SetAttribute */
+       efi_st_printf("\nColor palette\n");
+       for (foreground = 0; foreground < 0x10; ++foreground) {
+               for (background = 0; background < 0x80; background += 0x10) {
+                       attrib = foreground | background;
+                       con_out->set_attribute(con_out, attrib);
+                       efi_st_printf("%p", (void *)attrib);
+               }
+               con_out->set_attribute(con_out, 0);
+               efi_st_printf("\n");
+       }
+       /* TestString */
+       ret = con_out->test_string(con_out,
+                       L" !\"#$%&'()*+,-./0-9:;<=>?@A-Z[\\]^_`a-z{|}~\n");
+       if (ret != EFI_ST_SUCCESS) {
+               efi_st_error("TestString failed for ANSI characters\n");
+               return EFI_ST_FAILURE;
+       }
+       return EFI_ST_SUCCESS;
+}
+
+EFI_UNIT_TEST(textoutput) = {
+       .name = "text output",
+       .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+       .execute = execute,
+};
index ddb67ed268ba4af25f8a789d319740f46230690d..6ea0bb7177f402e0fde6766d7e45a596ac07dc87 100644 (file)
@@ -111,9 +111,9 @@ static int teardown(void)
  */
 static int execute(void)
 {
-       size_t index;
+       efi_uintn_t index;
        efi_status_t ret;
-       UINTN old_tpl;
+       efi_uintn_t old_tpl;
 
        /* Set 10 ms timer */
        notification_count = 0;
index 5cffe383d8d317190581c09ae73390895ee1da2e..1b17bf4d4bc4c290a539f41f275cd6832c6627a9 100644 (file)
@@ -21,5 +21,14 @@ int efi_st_memcmp(const void *buf1, const void *buf2, size_t length)
                ++pos1;
                ++pos2;
        }
-       return EFI_ST_SUCCESS;
+       return 0;
+}
+
+int efi_st_strcmp_16_8(const u16 *buf1, const char *buf2)
+{
+       for (; *buf1 || *buf2; ++buf1, ++buf2) {
+               if (*buf1 != *buf2)
+                       return *buf1 - *buf2;
+       }
+       return 0;
 }
diff --git a/lib/efi_selftest/efi_selftest_watchdog.c b/lib/efi_selftest/efi_selftest_watchdog.c
new file mode 100644 (file)
index 0000000..e4af384
--- /dev/null
@@ -0,0 +1,231 @@
+/*
+ * efi_selftest_watchdog
+ *
+ * Copyright (c) 2017 Heinrich Schuchardt <xypron.glpk@gmx.de>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ *
+ * The 'watchdog timer' unit test checks that the watchdog timer
+ * will not cause a system restart during the timeout period after
+ * a timer reset.
+ *
+ * The 'watchdog reboot' unit test checks that the watchdog timer
+ * actually reboots the system after a timeout. The test is only
+ * executed on explicit request. Use the following commands:
+ *
+ *     setenv efi_selftest watchdog reboot
+ *     bootefi selftest
+ */
+
+#include <efi_selftest.h>
+
+/*
+ * This is the communication structure for the notification function.
+ */
+struct notify_context {
+       /* Status code returned when resetting watchdog */
+       efi_status_t status;
+       /* Number of invocations of the notification function */
+       unsigned int timer_ticks;
+};
+
+static struct efi_event *event_notify;
+static struct efi_event *event_wait;
+static struct efi_boot_services *boottime;
+static struct notify_context notification_context;
+static bool watchdog_reset;
+
+/*
+ * Notification function, increments the notfication count if parameter
+ * context is provided.
+ *
+ * @event      notified event
+ * @context    pointer to the timeout
+ */
+static void EFIAPI notify(struct efi_event *event, void *context)
+{
+       struct notify_context *notify_context = context;
+       efi_status_t ret = EFI_SUCCESS;
+
+       if (!notify_context)
+               return;
+
+       /* Reset watchdog timer to one second */
+       ret = boottime->set_watchdog_timer(1, 0, 0, NULL);
+       if (ret != EFI_SUCCESS)
+               notify_context->status = ret;
+       /* Count number of calls */
+       notify_context->timer_ticks++;
+}
+
+/*
+ * Setup unit test.
+ *
+ * Create two timer events.
+ * One with EVT_NOTIFY_SIGNAL, the other with EVT_NOTIFY_WAIT.
+ *
+ * @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;
+
+       boottime = systable->boottime;
+
+       notification_context.status = EFI_SUCCESS;
+       notification_context.timer_ticks = 0;
+       ret = boottime->create_event(EVT_TIMER | EVT_NOTIFY_SIGNAL,
+                                    TPL_CALLBACK, notify,
+                                    (void *)&notification_context,
+                                    &event_notify);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("could not create event\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = boottime->create_event(EVT_TIMER | EVT_NOTIFY_WAIT,
+                                    TPL_CALLBACK, notify, NULL, &event_wait);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("could not create event\n");
+               return EFI_ST_FAILURE;
+       }
+       return EFI_ST_SUCCESS;
+}
+
+/*
+ * Execute the test resetting the watchdog in a timely manner. No reboot occurs.
+ *
+ * @handle:    handle of the loaded image
+ * @systable:  system table
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int setup_timer(const efi_handle_t handle,
+                      const struct efi_system_table *systable)
+{
+       watchdog_reset = true;
+       return setup(handle, systable);
+}
+
+/*
+ * Execute the test without resetting the watchdog. A system reboot occurs.
+ *
+ * @handle:    handle of the loaded image
+ * @systable:  system table
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int setup_reboot(const efi_handle_t handle,
+                       const struct efi_system_table *systable)
+{
+       watchdog_reset = false;
+       return setup(handle, systable);
+}
+
+/*
+ * Tear down unit test.
+ *
+ * Close the events created in setup.
+ *
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int teardown(void)
+{
+       efi_status_t ret;
+
+       /* Set the watchdog timer to the five minute default value */
+       ret = boottime->set_watchdog_timer(300, 0, 0, NULL);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Setting watchdog timer failed\n");
+               return EFI_ST_FAILURE;
+       }
+       if (event_notify) {
+               ret = boottime->close_event(event_notify);
+               event_notify = NULL;
+               if (ret != EFI_SUCCESS) {
+                       efi_st_error("Could not close event\n");
+                       return EFI_ST_FAILURE;
+               }
+       }
+       if (event_wait) {
+               ret = boottime->close_event(event_wait);
+               event_wait = NULL;
+               if (ret != EFI_SUCCESS) {
+                       efi_st_error("Could not close event\n");
+                       return EFI_ST_FAILURE;
+               }
+       }
+       return EFI_ST_SUCCESS;
+}
+
+/*
+ * Execute unit test.
+ *
+ * Run a 600 ms periodic timer that resets the watchdog to one second
+ * on every timer tick.
+ *
+ * Run a 1350 ms single shot timer and check that the 600ms timer has
+ * been called 2 times.
+ *
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int execute(void)
+{
+       size_t index;
+       efi_status_t ret;
+
+       /* Set the watchdog timeout to one second */
+       ret = boottime->set_watchdog_timer(1, 0, 0, NULL);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Setting watchdog timer failed\n");
+               return EFI_ST_FAILURE;
+       }
+       if (watchdog_reset) {
+               /* Set 600 ms timer */
+               ret = boottime->set_timer(event_notify, EFI_TIMER_PERIODIC,
+                                         6000000);
+               if (ret != EFI_SUCCESS) {
+                       efi_st_error("Could not set timer\n");
+                       return EFI_ST_FAILURE;
+               }
+       }
+       /* Set 1350 ms timer */
+       ret = boottime->set_timer(event_wait, EFI_TIMER_RELATIVE, 13500000);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Could not set timer\n");
+               return EFI_ST_FAILURE;
+       }
+
+       ret = boottime->wait_for_event(1, &event_wait, &index);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Could not wait for event\n");
+               return EFI_ST_FAILURE;
+       }
+       if (notification_context.status != EFI_SUCCESS) {
+               efi_st_error("Setting watchdog timer failed\n");
+               return EFI_ST_FAILURE;
+       }
+       if (notification_context.timer_ticks != 2) {
+               efi_st_error("The timer was called %u times, expected 2.\n",
+                            notification_context.timer_ticks);
+               return EFI_ST_FAILURE;
+       }
+       return EFI_ST_SUCCESS;
+}
+
+EFI_UNIT_TEST(watchdog1) = {
+       .name = "watchdog timer",
+       .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+       .setup = setup_timer,
+       .execute = execute,
+       .teardown = teardown,
+};
+
+EFI_UNIT_TEST(watchdog2) = {
+       .name = "watchdog reboot",
+       .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+       .setup = setup_reboot,
+       .execute = execute,
+       .teardown = teardown,
+       .on_request = true,
+};
index 8fef0c34127d2a635cbe83db5895ad1f819ff8a9..6c7902ad0c7ba85bd078fbc0aa6bd2adf53eff37 100644 (file)
 #include <asm/gpio.h>
 #endif
 
-#ifdef CONFIG_LOGBUFFER
-#include <logbuff.h>
-#endif
-
 DECLARE_GLOBAL_DATA_PTR;
 
 #define POST_MAX_NUMBER                32
@@ -407,13 +403,8 @@ int post_log(char *format, ...)
        vsprintf(printbuffer, format, args);
        va_end(args);
 
-#ifdef CONFIG_LOGBUFFER
-       /* Send to the logbuffer */
-       logbuff_log(printbuffer);
-#else
        /* Send to the stdout file */
        puts(printbuffer);
-#endif
 
        return 0;
 }
index bc8e39805157da8431f82d84e5c63e0afdb1563c..473c0ea1e1d04aa468ecf62cab39d31bb10c1de4 100644 (file)
@@ -3,10 +3,6 @@
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
  * SPDX-License-Identifier:    GPL-2.0+
- *
- * Be sure to mark tests to be run before relocation as such with the
- * CONFIG_SYS_POST_PREREL flag so that logging is done correctly if the
- * logbuffer support is enabled.
  */
 
 #include <common.h>
index c2fe81e5520fd846e6034f12ae05139d7cf8b64d..2b926f7415936ed417ae977196f34d1fbf29651a 100644 (file)
@@ -45,18 +45,12 @@ CONFIG_APUS_FAST_EXCEPT
 CONFIG_AP_SH4A_4A
 CONFIG_ARCH_ADPAG101P
 CONFIG_ARCH_CPU_INIT
-CONFIG_ARCH_CSB226
 CONFIG_ARCH_HAS_ILOG2_U32
 CONFIG_ARCH_HAS_ILOG2_U64
-CONFIG_ARCH_INNOKOM
 CONFIG_ARCH_KIRKWOOD
-CONFIG_ARCH_LUBBOCK
 CONFIG_ARCH_MAP_SYSMEM
 CONFIG_ARCH_OMAP4
 CONFIG_ARCH_ORION5X
-CONFIG_ARCH_PLEB
-CONFIG_ARCH_PXA_CERF
-CONFIG_ARCH_PXA_IDP
 CONFIG_ARCH_RMOBILE_BOARD_STRING
 CONFIG_ARCH_RMOBILE_EXTRAM_BOOT
 CONFIG_ARCH_TEGRA
@@ -492,7 +486,6 @@ CONFIG_DWC2_ULPI_FS_LS
 CONFIG_DWC2_UTMI_WIDTH
 CONFIG_DWCDDR21MCTL
 CONFIG_DWCDDR21MCTL_BASE
-CONFIG_DWC_AHSATA
 CONFIG_DWC_AHSATA_BASE_ADDR
 CONFIG_DWC_AHSATA_PORT_ID
 CONFIG_DW_ALTDESCRIPTOR
@@ -754,7 +747,6 @@ CONFIG_FSL_PMIC_MODE
 CONFIG_FSL_QIXIS
 CONFIG_FSL_QIXIS_CLOCK_MEASUREMENT
 CONFIG_FSL_QIXIS_V2
-CONFIG_FSL_SATA
 CONFIG_FSL_SATA_V2
 CONFIG_FSL_SDHC_V2_3
 CONFIG_FSL_SDRAM_TYPE
@@ -1247,7 +1239,6 @@ CONFIG_LEGACY_BOOTCMD_ENV
 CONFIG_LG4573
 CONFIG_LG4573_BUS
 CONFIG_LG4573_CS
-CONFIG_LIBATA
 CONFIG_LIB_HW_RAND
 CONFIG_LIB_UUID
 CONFIG_LINUX
@@ -1258,7 +1249,6 @@ CONFIG_LMS283GF05
 CONFIG_LOADADDR
 CONFIG_LOADCMD
 CONFIG_LOADS_ECHO
-CONFIG_LOGBUFFER
 CONFIG_LOWPOWER_ADDR
 CONFIG_LOWPOWER_FLAG
 CONFIG_LOW_MCFCLK
@@ -1460,7 +1450,6 @@ CONFIG_MVGBE
 CONFIG_MVGBE_PORTS
 CONFIG_MVMFP_V2
 CONFIG_MVS
-CONFIG_MVSATA_IDE
 CONFIG_MVSATA_IDE_USE_PORT0
 CONFIG_MVSATA_IDE_USE_PORT1
 CONFIG_MV_ETH_RXQ
@@ -1904,9 +1893,6 @@ CONFIG_SAR2_REG
 CONFIG_SAR_REG
 CONFIG_SATA1
 CONFIG_SATA2
-CONFIG_SATA_MV
-CONFIG_SATA_SIL
-CONFIG_SATA_SIL3114
 CONFIG_SATA_ULI5288
 CONFIG_SBC8349
 CONFIG_SBC8548
@@ -1916,7 +1902,6 @@ CONFIG_SCIF
 CONFIG_SCIF_A
 CONFIG_SCIF_EXT_CLOCK
 CONFIG_SCIF_USE_EXT_CLK
-CONFIG_SCSI_AHCI
 CONFIG_SCSI_AHCI_PLAT
 CONFIG_SCSI_DEV_LIST
 CONFIG_SC_TIMER_CLK
index 6305afb21196859f9c0a65b09c3c0873bd0e6644..40f2244b79b36d1a228bfa0448f82618341aa14f 100644 (file)
@@ -10,3 +10,4 @@ obj-$(CONFIG_SANDBOX) += command_ut.o
 obj-$(CONFIG_SANDBOX) += compression.o
 obj-$(CONFIG_SANDBOX) += print_ut.o
 obj-$(CONFIG_UT_TIME) += time_ut.o
+obj-$(CONFIG_$(SPL_)LOG) += log/
diff --git a/test/log/Makefile b/test/log/Makefile
new file mode 100644 (file)
index 0000000..b0da8de
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# Copyright (c) 2017 Google, Inc
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-$(CONFIG_LOG_TEST) += log_test.o
diff --git a/test/log/log_test.c b/test/log/log_test.c
new file mode 100644 (file)
index 0000000..2c62277
--- /dev/null
@@ -0,0 +1,205 @@
+/*
+ * Logging support test program
+ *
+ * Copyright (c) 2017 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+
+/* emit some sample log records in different ways, for testing */
+static int log_run(enum uclass_id cat, const char *file)
+{
+       int i;
+
+       debug("debug\n");
+       for (i = LOGL_FIRST; i < LOGL_COUNT; i++) {
+               log(cat, i, "log %d\n", i);
+               _log(log_uc_cat(cat), i, file, 100 + i, "func", "_log %d\n",
+                    i);
+       }
+
+       return 0;
+}
+
+static int log_test(int testnum)
+{
+       int ret;
+
+       printf("test %d\n", testnum);
+       switch (testnum) {
+       case 0: {
+               /* Check a category filter using the first category */
+               enum log_category_t cat_list[] = {
+                       log_uc_cat(UCLASS_MMC), log_uc_cat(UCLASS_SPI),
+                       LOGC_NONE, LOGC_END
+               };
+
+               ret = log_add_filter("console", cat_list, LOGL_MAX, NULL);
+               if (ret < 0)
+                       return ret;
+               log_run(UCLASS_MMC, "file");
+               ret = log_remove_filter("console", ret);
+               if (ret < 0)
+                       return ret;
+               break;
+       }
+       case 1: {
+               /* Check a category filter using the second category */
+               enum log_category_t cat_list[] = {
+                       log_uc_cat(UCLASS_MMC), log_uc_cat(UCLASS_SPI), LOGC_END
+               };
+
+               ret = log_add_filter("console", cat_list, LOGL_MAX, NULL);
+               if (ret < 0)
+                       return ret;
+               log_run(UCLASS_SPI, "file");
+               ret = log_remove_filter("console", ret);
+               if (ret < 0)
+                       return ret;
+               break;
+       }
+       case 2: {
+               /* Check a category filter that should block log entries */
+               enum log_category_t cat_list[] = {
+                       log_uc_cat(UCLASS_MMC),  LOGC_NONE, LOGC_END
+               };
+
+               ret = log_add_filter("console", cat_list, LOGL_MAX, NULL);
+               if (ret < 0)
+                       return ret;
+               log_run(UCLASS_SPI, "file");
+               ret = log_remove_filter("console", ret);
+               if (ret < 0)
+                       return ret;
+               break;
+       }
+       case 3: {
+               /* Check a passing file filter */
+               ret = log_add_filter("console", NULL, LOGL_MAX, "file");
+               if (ret < 0)
+                       return ret;
+               log_run(UCLASS_SPI, "file");
+               ret = log_remove_filter("console", ret);
+               if (ret < 0)
+                       return ret;
+               break;
+       }
+       case 4: {
+               /* Check a failing file filter */
+               ret = log_add_filter("console", NULL, LOGL_MAX, "file");
+               if (ret < 0)
+                       return ret;
+               log_run(UCLASS_SPI, "file2");
+               ret = log_remove_filter("console", ret);
+               if (ret < 0)
+                       return ret;
+               break;
+       }
+       case 5: {
+               /* Check a passing file filter (second in list) */
+               ret = log_add_filter("console", NULL, LOGL_MAX, "file,file2");
+               if (ret < 0)
+                       return ret;
+               log_run(UCLASS_SPI, "file2");
+               ret = log_remove_filter("console", ret);
+               if (ret < 0)
+                       return ret;
+               break;
+       }
+       case 6: {
+               /* Check a passing file filter */
+               ret = log_add_filter("console", NULL, LOGL_MAX,
+                                    "file,file2,log/log_test.c");
+               if (ret < 0)
+                       return ret;
+               log_run(UCLASS_SPI, "file2");
+               ret = log_remove_filter("console", ret);
+               if (ret < 0)
+                       return ret;
+               break;
+       }
+       case 7: {
+               /* Check a log level filter */
+               ret = log_add_filter("console", NULL, LOGL_WARNING, NULL);
+               if (ret < 0)
+                       return ret;
+               log_run(UCLASS_SPI, "file");
+               ret = log_remove_filter("console", ret);
+               if (ret < 0)
+                       return ret;
+               break;
+       }
+       case 8: {
+               /* Check two filters, one of which passes everything */
+               int filt1, filt2;
+
+               ret = log_add_filter("console", NULL, LOGL_WARNING, NULL);
+               if (ret < 0)
+                       return ret;
+               filt1 = ret;
+               ret = log_add_filter("console", NULL, LOGL_MAX, NULL);
+               if (ret < 0)
+                       return ret;
+               filt2 = ret;
+               log_run(UCLASS_SPI, "file");
+               ret = log_remove_filter("console", filt1);
+               if (ret < 0)
+                       return ret;
+               ret = log_remove_filter("console", filt2);
+               if (ret < 0)
+                       return ret;
+               break;
+       }
+       case 9: {
+               /* Check three filters, which together pass everything */
+               int filt1, filt2, filt3;
+
+               ret = log_add_filter("console", NULL, LOGL_MAX, "file)");
+               if (ret < 0)
+                       return ret;
+               filt1 = ret;
+               ret = log_add_filter("console", NULL, LOGL_MAX, "file2");
+               if (ret < 0)
+                       return ret;
+               filt2 = ret;
+               ret = log_add_filter("console", NULL, LOGL_MAX,
+                                    "log/log_test.c");
+               if (ret < 0)
+                       return ret;
+               filt3 = ret;
+               log_run(UCLASS_SPI, "file2");
+               ret = log_remove_filter("console", filt1);
+               if (ret < 0)
+                       return ret;
+               ret = log_remove_filter("console", filt2);
+               if (ret < 0)
+                       return ret;
+               ret = log_remove_filter("console", filt3);
+               if (ret < 0)
+                       return ret;
+               break;
+       }
+       }
+
+       return 0;
+}
+
+#ifdef CONFIG_LOG_TEST
+int do_log_test(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
+{
+       int testnum = 0;
+       int ret;
+
+       if (argc > 1)
+               testnum = simple_strtoul(argv[1], NULL, 10);
+
+       ret = log_test(testnum);
+       if (ret)
+               printf("Test failure (err=%d)\n", ret);
+
+       return ret ? CMD_RET_FAILURE : 0;
+}
+#endif
index 5d7f5dbfb23ce74f7e368ac3ff1f6312d8960368..906ef2feaaa20838c79a2b7e1d53eb7e74be7d69 100644 (file)
@@ -12,7 +12,7 @@ import u_boot_utils
 
 """
 Note: This test relies on boardenv_* containing configuration values to define
-which the network environment available for testing. Without this, the parts
+which network environment is available for testing. Without this, the parts
 that rely on network will be automatically skipped.
 
 For example:
@@ -154,6 +154,8 @@ def test_efi_helloworld_net(u_boot_console):
     output = u_boot_console.run_command('bootefi %x' % addr)
     expected_text = 'Hello, world'
     assert expected_text in output
+    expected_text = '## Application terminated, r = 0'
+    assert expected_text in output
 
 @pytest.mark.buildconfigspec('cmd_bootefi_hello')
 def test_efi_helloworld_builtin(u_boot_console):
index 76e282a6c7261d6b2a8009bae24285857fadaf76..66b799bed6695a381c60b1c15a10d2f095f5a08b 100644 (file)
@@ -1,4 +1,3 @@
-# Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
 # Copyright (c) 2017, Heinrich Schuchardt <xypron.glpk@gmx.de>
 #
 # SPDX-License-Identifier: GPL-2.0
@@ -14,6 +13,7 @@ def test_efi_selftest(u_boot_console):
        Run bootefi selftest
        """
 
+       u_boot_console.run_command(cmd='setenv efi_selftest')
        u_boot_console.run_command(cmd='bootefi selftest', wait_for_prompt=False)
        m = u_boot_console.p.expect(['Summary: 0 failures', 'Press any key'])
        if m != 0:
@@ -23,3 +23,15 @@ def test_efi_selftest(u_boot_console):
        if m != 0:
                raise Exception('Reset failed during the EFI selftest')
        u_boot_console.restart_uboot();
+
+@pytest.mark.buildconfigspec('cmd_bootefi_selftest')
+def test_efi_selftest_watchdog_reboot(u_boot_console):
+       u_boot_console.run_command(cmd='setenv efi_selftest list')
+       output = u_boot_console.run_command('bootefi selftest')
+       assert '\'watchdog reboot\'' in output
+       u_boot_console.run_command(cmd='setenv efi_selftest watchdog reboot')
+       u_boot_console.run_command(cmd='bootefi selftest', wait_for_prompt=False)
+       m = u_boot_console.p.expect(['resetting', 'U-Boot'])
+       if m != 0:
+               raise Exception('Reset failed in \'watchdog reboot\' test')
+       u_boot_console.restart_uboot();
index 4329b69b7adda59f8c1d0bf495e096d6d026e24d..886df43f8bf86e2061b10a44080940584778034d 100644 (file)
@@ -44,9 +44,11 @@ class GptTestDiskImage(object):
                 cmd = ('sgdisk', '-U', '375a56f7-d6c9-4e81-b5f0-09d41ca89efe',
                     persistent)
                 u_boot_utils.run_and_log(u_boot_console, cmd)
-                cmd = ('sgdisk', '--new=1:2048:2560', '-c 1:part1', persistent)
+                # part1 offset 1MB size 1MB
+                cmd = ('sgdisk', '--new=1:2048:4095', '-c 1:part1', persistent)
+                # part2 offset 2MB size 1.5MB
                 u_boot_utils.run_and_log(u_boot_console, cmd)
-                cmd = ('sgdisk', '--new=2:4096:4608', '-c 2:part2', persistent)
+                cmd = ('sgdisk', '--new=2:4096:7167', '-c 2:part2', persistent)
                 u_boot_utils.run_and_log(u_boot_console, cmd)
                 cmd = ('sgdisk', '-l', persistent)
                 u_boot_utils.run_and_log(u_boot_console, cmd)
@@ -76,13 +78,13 @@ def test_gpt_read(state_disk_image, u_boot_console):
 
     u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
     output = u_boot_console.run_command('gpt read host 0')
-    assert 'Start 1MiB, size 0MiB' in output
+    assert 'Start 1MiB, size 1MiB' in output
     assert 'Block size 512, name part1' in output
-    assert 'Start 2MiB, size 0MiB' in output
+    assert 'Start 2MiB, size 1MiB' in output
     assert 'Block size 512, name part2' in output
     output = u_boot_console.run_command('part list host 0')
-    assert '0x00000800 0x00000a00      "part1"' in output
-    assert '0x00001000 0x00001200      "part2"' in output
+    assert '0x00000800 0x00000fff      "part1"' in output
+    assert '0x00001000 0x00001bff      "part2"' in output
 
 @pytest.mark.boardspec('sandbox')
 @pytest.mark.buildconfigspec('cmd_gpt')
@@ -133,8 +135,8 @@ def test_gpt_rename_partition(state_disk_image, u_boot_console):
     output = u_boot_console.run_command('gpt read host 0')
     assert 'name second' in output
     output = u_boot_console.run_command('part list host 0')
-    assert '0x00000800 0x00000a00      "first"' in output
-    assert '0x00001000 0x00001200      "second"' in output
+    assert '0x00000800 0x00000fff      "first"' in output
+    assert '0x00001000 0x00001bff      "second"' in output
 
 @pytest.mark.boardspec('sandbox')
 @pytest.mark.buildconfigspec('cmd_gpt')
@@ -146,12 +148,12 @@ def test_gpt_swap_partitions(state_disk_image, u_boot_console):
 
     u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
     output = u_boot_console.run_command('part list host 0')
-    assert '0x00000800 0x00000a00      "first"' in output
-    assert '0x00001000 0x00001200      "second"' in output
+    assert '0x00000800 0x00000fff      "first"' in output
+    assert '0x00001000 0x00001bff      "second"' in output
     u_boot_console.run_command('gpt swap host 0 first second')
     output = u_boot_console.run_command('part list host 0')
-    assert '0x00000800 0x00000a00      "second"' in output
-    assert '0x00001000 0x00001200      "first"' in output
+    assert '0x00000800 0x00000fff      "second"' in output
+    assert '0x00001000 0x00001bff      "first"' in output
 
 @pytest.mark.boardspec('sandbox')
 @pytest.mark.buildconfigspec('cmd_gpt')
@@ -165,10 +167,10 @@ def test_gpt_write(state_disk_image, u_boot_console):
     assert 'Writing GPT: success!' in output
     output = u_boot_console.run_command('part list host 0')
     assert '0x00000022 0x00001fde      "all"' in output
-    output = u_boot_console.run_command('gpt write host 0 "uuid_disk=375a56f7-d6c9-4e81-b5f0-09d41ca89efe;name=first,start=0x100000,size=0x40200;name=second,start=0x200000,size=0x40200;"')
+    output = u_boot_console.run_command('gpt write host 0 "uuid_disk=375a56f7-d6c9-4e81-b5f0-09d41ca89efe;name=first,start=1M,size=1M;name=second,start=0x200000,size=0x180000;"')
     assert 'Writing GPT: success!' in output
     output = u_boot_console.run_command('part list host 0')
-    assert '0x00000800 0x00000a00      "first"' in output
-    assert '0x00001000 0x00001200      "second"' in output
+    assert '0x00000800 0x00000fff      "first"' in output
+    assert '0x00001000 0x00001bff      "second"' in output
     output = u_boot_console.run_command('gpt guid host 0')
     assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output
diff --git a/test/py/tests/test_log.py b/test/py/tests/test_log.py
new file mode 100644 (file)
index 0000000..fa9a25e
--- /dev/null
@@ -0,0 +1,101 @@
+# Copyright (c) 2016, Google Inc.
+#
+# SPDX-License-Identifier:      GPL-2.0+
+#
+# U-Boot Verified Boot Test
+
+"""
+This tests U-Boot logging. It uses the 'log test' command with various options
+and checks that the output is correct.
+"""
+
+import pytest
+
+LOGL_FIRST, LOGL_WARNING, LOGL_INFO = (0, 4, 6)
+
+@pytest.mark.buildconfigspec('log')
+def test_log(u_boot_console):
+    """Test that U-Boot logging works correctly."""
+    def check_log_entries(lines, mask, max_level=LOGL_INFO):
+        """Check that the expected log records appear in the output
+
+        Args:
+            lines: iterator containing lines to check
+            mask: bit mask to select which lines to check for:
+                bit 0: standard log line
+                bit 1: _log line
+            max_level: maximum log level to expect in the output
+        """
+        for i in range(max_level):
+            if mask & 1:
+                assert 'log %d' % i == lines.next()
+            if mask & 3:
+                assert '_log %d' % i == lines.next()
+
+    def run_test(testnum):
+        """Run a particular test number (the 'log test' command)
+
+        Args:
+            testnum: Test number to run
+        Returns:
+            iterator containing the lines output from the command
+        """
+
+        with cons.log.section('basic'):
+           output = u_boot_console.run_command('log test %d' % testnum)
+        split = output.replace('\r', '').splitlines()
+        lines = iter(split)
+        assert 'test %d' % testnum == lines.next()
+        return lines
+
+    def test0():
+        lines = run_test(0)
+        check_log_entries(lines, 3)
+
+    def test1():
+        lines = run_test(1)
+        check_log_entries(lines, 3)
+
+    def test2():
+        lines = run_test(2)
+
+    def test3():
+        lines = run_test(3)
+        check_log_entries(lines, 2)
+
+    def test4():
+        lines = run_test(4)
+        assert next(lines, None) == None
+
+    def test5():
+        lines = run_test(5)
+        check_log_entries(lines, 2)
+
+    def test6():
+        lines = run_test(6)
+        check_log_entries(lines, 3)
+
+    def test7():
+        lines = run_test(7)
+        check_log_entries(lines, 3, LOGL_WARNING)
+
+    def test8():
+        lines = run_test(8)
+        check_log_entries(lines, 3)
+
+    def test9():
+        lines = run_test(9)
+        check_log_entries(lines, 3)
+
+    # TODO(sjg@chromium.org): Consider structuring this as separate tests
+    cons = u_boot_console
+    test0()
+    test1()
+    test2()
+    test3()
+    test4()
+    test5()
+    test6()
+    test7()
+    test8()
+    test9()
index 64e0571326224ba42322c780974e7281f1ce1367..ccef24d7f7b84e80847961afa79356c6b8538249 100644 (file)
@@ -5,10 +5,23 @@
 import pytest
 import time
 
+"""
+Note: This test doesn't rely on boardenv_* configuration values but they can
+change test behavior.
+
+# Setup env__sleep_accurate to False if time is not accurate on your platform
+env__sleep_accurate = False
+
+"""
+
 def test_sleep(u_boot_console):
     """Test the sleep command, and validate that it sleeps for approximately
     the correct amount of time."""
 
+    sleep_skip = u_boot_console.config.env.get('env__sleep_accurate', True)
+    if not sleep_skip:
+        pytest.skip('sleep is not accurate')
+
     if u_boot_console.config.buildconfig.get('config_cmd_misc', 'n') != 'y':
         pytest.skip('sleep command not supported')
     # 3s isn't too long, but is enough to cross a few second boundaries.
index e31b94ae4f72d2e05c90781d5d9d0e67b9b9a81d..e7c46388f4f375dbb2ecc78a6184365ee3860979 100644 (file)
@@ -20,6 +20,8 @@
 #include "gpheader.h"
 #include "omapimage.h"
 
+#define DIV_ROUND_UP(n, d)     (((n) + (d) - 1) / (d))
+
 /* Header size is CH header rounded up to 512 bytes plus GP header */
 #define OMAP_CH_HDR_SIZE 512
 #define OMAP_FILE_HDR_SIZE (OMAP_CH_HDR_SIZE + GPIMAGE_HDR_SIZE)
@@ -150,8 +152,10 @@ static void omapimage_set_header(void *ptr, struct stat *sbuf, int ifd,
                do_swap32 = 1;
                int swapped = 0;
                uint32_t *data = (uint32_t *)ptr;
+               const off_t size_in_words =
+                       DIV_ROUND_UP(sbuf->st_size, sizeof(uint32_t));
 
-               while (swapped <= (sbuf->st_size / sizeof(uint32_t))) {
+               while (swapped < size_in_words) {
                        *data = cpu_to_be32(*data);
                        swapped++;
                        data++;