Merge tag 'xilinx-for-v2021.01' of https://gitlab.denx.de/u-boot/custodians/u-boot...
authorTom Rini <trini@konsulko.com>
Thu, 24 Sep 2020 12:33:47 +0000 (08:33 -0400)
committerTom Rini <trini@konsulko.com>
Thu, 24 Sep 2020 12:33:47 +0000 (08:33 -0400)
Xilinx changes for v2021.01

arm64:
- Support for bigger U-Boot images compiled with PIE

microblaze:
- Extend support for LE/BE systems

zynqmp:
- Refactor silicon ID detection code with using firmware interface
- Add support for saving variables based on bootmode

zynqmp-r5:
- Fix MPU mapping and defconfig setting.

xilinx:
- Minor driver changes: names alignment
- Enable UBIFS
- Minor DT and macros fixes
- Fix boot with appended DT
- Fix distro boot

cmd:
- pxe: Add fixing for platforms with manual relocation support

clk:
- fixed_rate: Add DM flag to support early boot on r5

fpga:
- zynqmppl: Use only firmware interface and enable SPL build

serial:
- uartlite: Enable for ARM systems and support endians

mmc:
- zynq: Fix indentation

net:
- gem: Support for multiple phys
- emac: Fix 64bit support and enable it for arm64

kconfig:
- Setup default values for Xilinx platforms
- Fix dependecies for Xilinx drivers
- Source board Kconfig only when platform is enabled
- Fix FPGA Kconfig entry with SPL
- Change some defconfig values

bindings:
- Add binding doc for vsc8531

432 files changed:
Kconfig
MAINTAINERS
Makefile
api/api_platform-mips.c
api/api_platform-powerpc.c
arch/arm/Kconfig
arch/arm/dts/Makefile
arch/arm/dts/am335x-icev2.dts
arch/arm/dts/ast2500-u-boot.dtsi
arch/arm/dts/k3-j7200-common-proc-board-u-boot.dtsi
arch/arm/dts/k3-j7200-common-proc-board.dts
arch/arm/dts/k3-j7200-main.dtsi
arch/arm/dts/k3-j7200-mcu-wakeup.dtsi
arch/arm/dts/k3-j7200-r5-common-proc-board.dts
arch/arm/dts/k3-j721e-main.dtsi
arch/arm/dts/qcom-ipq4019.dtsi
arch/arm/dts/sunxi-u-boot.dtsi
arch/arm/mach-aspeed/ast2500/sdram_ast2500.c
arch/arm/mach-ipq40xx/clock-ipq4019.c
arch/arm/mach-k3/arm64-mmu.c
arch/arm/mach-k3/include/mach/j721e_spl.h
arch/arm/mach-meson/board-gx.c
arch/arm/mach-omap2/am33xx/board.c
arch/mips/lib/boot.c
arch/mips/lib/bootm.c
arch/powerpc/cpu/mpc83xx/Kconfig
arch/powerpc/cpu/mpc83xx/Makefile
arch/powerpc/cpu/mpc83xx/cpu_init.c
arch/powerpc/cpu/mpc83xx/fdt.c
arch/powerpc/cpu/mpc83xx/qe_io.c
arch/powerpc/cpu/mpc83xx/traps.c
arch/powerpc/cpu/mpc85xx/Kconfig
arch/powerpc/cpu/mpc85xx/fdt.c
arch/powerpc/cpu/mpc85xx/traps.c
arch/powerpc/cpu/mpc86xx/fdt.c
arch/powerpc/cpu/mpc86xx/traps.c
arch/powerpc/cpu/mpc8xx/fdt.c
arch/powerpc/cpu/mpc8xxx/cpu.c
arch/powerpc/dts/Makefile
arch/powerpc/dts/km8309-uboot.dtsi [new file with mode: 0644]
arch/powerpc/dts/km8321-uboot.dtsi [new file with mode: 0644]
arch/powerpc/dts/km8321.dtsi [new file with mode: 0644]
arch/powerpc/dts/km836x-uboot.dtsi [new file with mode: 0644]
arch/powerpc/dts/km836x.dtsi [new file with mode: 0644]
arch/powerpc/dts/kmcoge5ne-uboot.dtsi [new file with mode: 0644]
arch/powerpc/dts/kmcoge5ne.dts [new file with mode: 0644]
arch/powerpc/dts/kmeter1-uboot.dtsi [new file with mode: 0644]
arch/powerpc/dts/kmeter1.dts [new file with mode: 0644]
arch/powerpc/dts/kmopti2.dts [new file with mode: 0644]
arch/powerpc/dts/kmsupc5.dts [new file with mode: 0644]
arch/powerpc/dts/kmsupm5.dts [new file with mode: 0644]
arch/powerpc/dts/kmtegr1.dts [new file with mode: 0644]
arch/powerpc/dts/kmtepr2.dts [new file with mode: 0644]
arch/powerpc/dts/kmtuge1.dts [new file with mode: 0644]
arch/powerpc/dts/kmtuxa1.dts [new file with mode: 0644]
arch/powerpc/dts/p1010rdb-pa.dts
arch/powerpc/dts/p1010rdb-pa_36b.dts
arch/powerpc/dts/p1010rdb.dtsi
arch/powerpc/dts/p1010si-post.dtsi
arch/powerpc/dts/p1020-post.dtsi
arch/powerpc/dts/p1020rdb-pc.dts
arch/powerpc/dts/p1020rdb-pc.dtsi [new file with mode: 0644]
arch/powerpc/dts/p1020rdb-pc_36b.dts
arch/powerpc/dts/p1020rdb-pd.dts
arch/powerpc/dts/p2020-post.dtsi
arch/powerpc/dts/p2020rdb-pc.dts
arch/powerpc/dts/p2020rdb-pc.dtsi [new file with mode: 0644]
arch/powerpc/dts/p2020rdb-pc_36b.dts
arch/powerpc/dts/p2041.dtsi
arch/powerpc/dts/p2041rdb.dts
arch/powerpc/dts/p3041.dtsi
arch/powerpc/dts/p3041ds.dts
arch/powerpc/dts/p4080.dtsi
arch/powerpc/dts/p4080ds.dts
arch/powerpc/dts/p5040.dtsi
arch/powerpc/dts/p5040ds.dts
arch/powerpc/dts/pq3-etsec1-0.dtsi [new file with mode: 0644]
arch/powerpc/dts/pq3-etsec1-1.dtsi [new file with mode: 0644]
arch/powerpc/dts/pq3-etsec1-2.dtsi [new file with mode: 0644]
arch/powerpc/dts/pq3-etsec1-3.dtsi [new file with mode: 0644]
arch/powerpc/dts/pq3-etsec2-0.dtsi [new file with mode: 0644]
arch/powerpc/dts/pq3-etsec2-1.dtsi [new file with mode: 0644]
arch/powerpc/dts/pq3-etsec2-2.dtsi [new file with mode: 0644]
arch/powerpc/dts/pq3-etsec2-grp2-0.dtsi [new file with mode: 0644]
arch/powerpc/dts/pq3-etsec2-grp2-1.dtsi [new file with mode: 0644]
arch/powerpc/dts/pq3-etsec2-grp2-2.dtsi [new file with mode: 0644]
arch/powerpc/dts/t1024rdb.dts
arch/powerpc/dts/t102x.dtsi
arch/powerpc/dts/t1042d4rdb.dts
arch/powerpc/dts/t104x.dtsi
arch/powerpc/dts/t2080.dtsi
arch/powerpc/dts/t2080qds.dts
arch/powerpc/dts/t2080rdb.dts
arch/powerpc/dts/t4240.dtsi
arch/powerpc/dts/t4240rdb.dts
arch/powerpc/lib/bootm.c
arch/riscv/lib/fdt_fixup.c
arch/x86/cpu/broadwell/cpu_from_spl.c
arch/xtensa/lib/Makefile
arch/xtensa/lib/bdinfo.c [deleted file]
arch/xtensa/lib/bootm.c
board/Arcturus/ucp1020/spl.c
board/broadcom/bcmns3/Kconfig
board/broadcom/bcmns3/ns3.c
board/cadence/xtfpga/xtfpga.c
board/freescale/common/Makefile
board/freescale/corenet_ds/Kconfig
board/freescale/corenet_ds/MAINTAINERS
board/freescale/corenet_ds/Makefile
board/freescale/corenet_ds/p5020ds_ddr.c [deleted file]
board/freescale/corenet_ds/rcw_p5020ds.cfg [deleted file]
board/freescale/p1010rdb/MAINTAINERS
board/freescale/p1010rdb/p1010rdb.c
board/freescale/p1010rdb/spl.c
board/freescale/p1023rdb/Kconfig [deleted file]
board/freescale/p1023rdb/MAINTAINERS [deleted file]
board/freescale/p1023rdb/Makefile [deleted file]
board/freescale/p1023rdb/ddr.c [deleted file]
board/freescale/p1023rdb/law.c [deleted file]
board/freescale/p1023rdb/p1023rdb.c [deleted file]
board/freescale/p1023rdb/tlb.c [deleted file]
board/freescale/p1_p2_rdb_pc/Kconfig
board/freescale/p1_p2_rdb_pc/MAINTAINERS
board/freescale/p1_p2_rdb_pc/README
board/freescale/p1_p2_rdb_pc/ddr.c
board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c
board/freescale/p1_p2_rdb_pc/spl.c
board/freescale/p1_p2_rdb_pc/tlb.c
board/freescale/t102xrdb/spl.c
board/freescale/t104xrdb/spl.c
board/freescale/t208xqds/spl.c
board/freescale/t208xrdb/spl.c
board/freescale/t4rdb/spl.c
board/keymile/km83xx/Kconfig
board/keymile/km83xx/MAINTAINERS
board/keymile/km83xx/km83xx.c
board/sunxi/board.c
board/sunxi/mksunxi_fit_atf.sh [deleted file]
board/ti/am335x/MAINTAINERS
board/ti/j721e/evm.c
board/xilinx/zynqmp/zynqmp.c
cmd/Makefile
cmd/bdinfo.c
cmd/bedbug.c
cmd/broadcom/Makefile [new file with mode: 0644]
cmd/broadcom/chimp_boot.c [new file with mode: 0644]
cmd/broadcom/chimp_handshake.c [new file with mode: 0644]
cmd/broadcom/nitro_image_load.c [new file with mode: 0644]
common/board_f.c
common/image.c
common/init/handoff.c
common/log.c
common/log_syslog.c
configs/P1010RDB-PA_36BIT_NAND_SECBOOT_defconfig [deleted file]
configs/P1010RDB-PA_36BIT_NAND_defconfig
configs/P1010RDB-PA_36BIT_NOR_SECBOOT_defconfig [deleted file]
configs/P1010RDB-PA_36BIT_NOR_defconfig
configs/P1010RDB-PA_36BIT_SDCARD_defconfig
configs/P1010RDB-PA_36BIT_SPIFLASH_SECBOOT_defconfig [deleted file]
configs/P1010RDB-PA_36BIT_SPIFLASH_defconfig
configs/P1010RDB-PA_NAND_SECBOOT_defconfig [deleted file]
configs/P1010RDB-PA_NAND_defconfig
configs/P1010RDB-PA_NOR_SECBOOT_defconfig [deleted file]
configs/P1010RDB-PA_NOR_defconfig
configs/P1010RDB-PA_SDCARD_defconfig
configs/P1010RDB-PA_SPIFLASH_SECBOOT_defconfig [deleted file]
configs/P1010RDB-PA_SPIFLASH_defconfig
configs/P1010RDB-PB_36BIT_NAND_SECBOOT_defconfig [deleted file]
configs/P1010RDB-PB_36BIT_NAND_defconfig
configs/P1010RDB-PB_36BIT_NOR_SECBOOT_defconfig [deleted file]
configs/P1010RDB-PB_36BIT_NOR_defconfig
configs/P1010RDB-PB_36BIT_SDCARD_defconfig
configs/P1010RDB-PB_36BIT_SPIFLASH_SECBOOT_defconfig [deleted file]
configs/P1010RDB-PB_36BIT_SPIFLASH_defconfig
configs/P1010RDB-PB_NAND_SECBOOT_defconfig [deleted file]
configs/P1010RDB-PB_NAND_defconfig
configs/P1010RDB-PB_NOR_SECBOOT_defconfig [deleted file]
configs/P1010RDB-PB_NOR_defconfig
configs/P1010RDB-PB_SDCARD_defconfig
configs/P1010RDB-PB_SPIFLASH_SECBOOT_defconfig [deleted file]
configs/P1010RDB-PB_SPIFLASH_defconfig
configs/P1020MBG-PC_36BIT_SDCARD_defconfig [deleted file]
configs/P1020MBG-PC_36BIT_defconfig [deleted file]
configs/P1020MBG-PC_SDCARD_defconfig [deleted file]
configs/P1020MBG-PC_defconfig [deleted file]
configs/P1020RDB-PC_36BIT_NAND_defconfig
configs/P1020RDB-PC_36BIT_SDCARD_defconfig
configs/P1020RDB-PC_36BIT_SPIFLASH_defconfig
configs/P1020RDB-PC_36BIT_defconfig
configs/P1020RDB-PC_NAND_defconfig
configs/P1020RDB-PC_SDCARD_defconfig
configs/P1020RDB-PC_SPIFLASH_defconfig
configs/P1020RDB-PC_defconfig
configs/P1020RDB-PD_NAND_defconfig
configs/P1020RDB-PD_SDCARD_defconfig
configs/P1020RDB-PD_SPIFLASH_defconfig
configs/P1020RDB-PD_defconfig
configs/P1020UTM-PC_36BIT_SDCARD_defconfig [deleted file]
configs/P1020UTM-PC_36BIT_defconfig [deleted file]
configs/P1020UTM-PC_SDCARD_defconfig [deleted file]
configs/P1020UTM-PC_defconfig [deleted file]
configs/P1021RDB-PC_36BIT_NAND_defconfig [deleted file]
configs/P1021RDB-PC_36BIT_SDCARD_defconfig [deleted file]
configs/P1021RDB-PC_36BIT_SPIFLASH_defconfig [deleted file]
configs/P1021RDB-PC_36BIT_defconfig [deleted file]
configs/P1021RDB-PC_NAND_defconfig [deleted file]
configs/P1021RDB-PC_SDCARD_defconfig [deleted file]
configs/P1021RDB-PC_SPIFLASH_defconfig [deleted file]
configs/P1021RDB-PC_defconfig [deleted file]
configs/P1023RDB_defconfig [deleted file]
configs/P1024RDB_36BIT_defconfig [deleted file]
configs/P1024RDB_NAND_defconfig [deleted file]
configs/P1024RDB_SDCARD_defconfig [deleted file]
configs/P1024RDB_SPIFLASH_defconfig [deleted file]
configs/P1024RDB_defconfig [deleted file]
configs/P1025RDB_36BIT_defconfig [deleted file]
configs/P1025RDB_NAND_defconfig [deleted file]
configs/P1025RDB_SDCARD_defconfig [deleted file]
configs/P1025RDB_SPIFLASH_defconfig [deleted file]
configs/P1025RDB_defconfig [deleted file]
configs/P2020RDB-PC_36BIT_NAND_defconfig
configs/P2020RDB-PC_36BIT_SDCARD_defconfig
configs/P2020RDB-PC_36BIT_SPIFLASH_defconfig
configs/P2020RDB-PC_36BIT_defconfig
configs/P2020RDB-PC_NAND_defconfig
configs/P2020RDB-PC_SDCARD_defconfig
configs/P2020RDB-PC_SPIFLASH_defconfig
configs/P2020RDB-PC_defconfig
configs/P2041RDB_NAND_defconfig
configs/P2041RDB_SDCARD_defconfig
configs/P2041RDB_SPIFLASH_defconfig
configs/P2041RDB_defconfig
configs/P3041DS_NAND_SECURE_BOOT_defconfig [deleted file]
configs/P3041DS_NAND_defconfig
configs/P3041DS_SDCARD_defconfig
configs/P3041DS_SECURE_BOOT_defconfig [deleted file]
configs/P3041DS_SPIFLASH_defconfig
configs/P3041DS_defconfig
configs/P4080DS_SDCARD_defconfig
configs/P4080DS_SECURE_BOOT_defconfig [deleted file]
configs/P4080DS_SPIFLASH_defconfig
configs/P4080DS_defconfig
configs/P5020DS_NAND_SECURE_BOOT_defconfig [deleted file]
configs/P5020DS_NAND_defconfig [deleted file]
configs/P5020DS_SDCARD_defconfig [deleted file]
configs/P5020DS_SECURE_BOOT_defconfig [deleted file]
configs/P5020DS_SPIFLASH_defconfig [deleted file]
configs/P5020DS_SRIO_PCIE_BOOT_defconfig [deleted file]
configs/P5020DS_defconfig [deleted file]
configs/P5040DS_NAND_SECURE_BOOT_defconfig [deleted file]
configs/P5040DS_NAND_defconfig
configs/P5040DS_SDCARD_defconfig
configs/P5040DS_SECURE_BOOT_defconfig [deleted file]
configs/P5040DS_SPIFLASH_defconfig
configs/P5040DS_defconfig
configs/T1024RDB_NAND_defconfig
configs/T1024RDB_SDCARD_defconfig
configs/T1024RDB_SECURE_BOOT_defconfig
configs/T1024RDB_SPIFLASH_defconfig
configs/T1024RDB_defconfig
configs/T1042D4RDB_NAND_defconfig
configs/T1042D4RDB_SDCARD_defconfig
configs/T1042D4RDB_SPIFLASH_defconfig
configs/T1042D4RDB_defconfig
configs/T2080QDS_NAND_defconfig
configs/T2080QDS_SDCARD_defconfig
configs/T2080QDS_SECURE_BOOT_defconfig
configs/T2080QDS_SPIFLASH_defconfig
configs/T2080QDS_SRIO_PCIE_BOOT_defconfig
configs/T2080QDS_defconfig
configs/T2080RDB_NAND_defconfig
configs/T2080RDB_SDCARD_defconfig
configs/T2080RDB_SPIFLASH_defconfig
configs/T2080RDB_defconfig
configs/T4240RDB_SDCARD_defconfig
configs/T4240RDB_defconfig
configs/am335x_evm_spiboot_defconfig [new file with mode: 0644]
configs/j7200_evm_a72_defconfig
configs/j7200_evm_r5_defconfig
configs/kmcoge5ne_defconfig
configs/kmeter1_defconfig
configs/kmopti2_defconfig
configs/kmsupx5_defconfig
configs/kmtegr1_defconfig
configs/kmtepr2_defconfig
configs/ls1021atsn_qspi_defconfig
configs/ls1021atsn_sdcard_defconfig
configs/ls1021atwr_nor_SECURE_BOOT_defconfig
configs/ls1021atwr_nor_defconfig
configs/ls1021atwr_nor_lpuart_defconfig
configs/ls1021atwr_qspi_defconfig
configs/ls1021atwr_sdcard_ifc_SECURE_BOOT_defconfig
configs/ls1021atwr_sdcard_ifc_defconfig
configs/ls1021atwr_sdcard_qspi_defconfig
configs/tuge1_defconfig
configs/tuxx1_defconfig
doc/device-tree-bindings/net/fsl-tsec-phy.txt
doc/device-tree-bindings/remoteproc/ti,k3-r5f-rproc.txt
doc/device-tree-bindings/soc/fsl/cpm_qe/qe/ucc.txt [new file with mode: 0644]
drivers/ata/dwc_ahci.c
drivers/clk/aspeed/clk_ast2500.c
drivers/core/of_access.c
drivers/core/ofnode.c
drivers/core/syscon-uclass.c
drivers/net/Kconfig
drivers/net/Makefile
drivers/net/fsl_mdio.c
drivers/net/phy/phy.c
drivers/net/qe/Kconfig [new file with mode: 0644]
drivers/net/qe/Makefile [new file with mode: 0644]
drivers/net/qe/dm_qe_uec.c [new file with mode: 0644]
drivers/net/qe/dm_qe_uec.h [new file with mode: 0644]
drivers/net/qe/dm_qe_uec_phy.c [new file with mode: 0644]
drivers/net/qe/uccf.c [new file with mode: 0644]
drivers/net/qe/uccf.h [new file with mode: 0644]
drivers/net/qe/uec.h [new file with mode: 0644]
drivers/net/tsec.c
drivers/pci/pci-uclass.c
drivers/phy/Kconfig
drivers/phy/Makefile
drivers/phy/phy-qcom-ipq4019-usb.c [new file with mode: 0644]
drivers/phy/phy-uclass.c
drivers/pinctrl/Kconfig
drivers/pinctrl/Makefile
drivers/pinctrl/pinctrl-qe-io.c [new file with mode: 0644]
drivers/qe/Kconfig
drivers/qe/qe.c
drivers/qe/uccf.c
drivers/qe/uccf.h
drivers/qe/uec.c
drivers/qe/uec.h
drivers/qe/uec_phy.c
drivers/qe/uec_phy.h
drivers/remoteproc/ti_k3_r5f_rproc.c
drivers/reset/Kconfig
drivers/reset/Makefile
drivers/reset/reset-ipq4019.c [new file with mode: 0644]
drivers/smem/Kconfig
drivers/spi/omap3_spi.c
drivers/spi/spi-uclass.c
drivers/usb/dwc3/dwc3-generic.c
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ohci-generic.c
drivers/usb/musb-new/sunxi.c
drivers/video/cfb_console.c
fs/btrfs/Makefile
fs/btrfs/btrfs.c
fs/btrfs/btrfs.h
fs/btrfs/btrfs_tree.h [deleted file]
fs/btrfs/chunk-map.c [deleted file]
fs/btrfs/common/rbtree-utils.c [new file with mode: 0644]
fs/btrfs/common/rbtree-utils.h [new file with mode: 0644]
fs/btrfs/compat.h [new file with mode: 0644]
fs/btrfs/compression.c
fs/btrfs/crypto/hash.c [new file with mode: 0644]
fs/btrfs/crypto/hash.h [new file with mode: 0644]
fs/btrfs/ctree.c
fs/btrfs/ctree.h
fs/btrfs/dir-item.c
fs/btrfs/disk-io.c [new file with mode: 0644]
fs/btrfs/disk-io.h [new file with mode: 0644]
fs/btrfs/extent-cache.c [new file with mode: 0644]
fs/btrfs/extent-cache.h [new file with mode: 0644]
fs/btrfs/extent-io.c
fs/btrfs/extent-io.h [new file with mode: 0644]
fs/btrfs/hash.c [deleted file]
fs/btrfs/inode.c
fs/btrfs/kernel-shared/btrfs_tree.h [new file with mode: 0644]
fs/btrfs/root-tree.c [new file with mode: 0644]
fs/btrfs/root.c [deleted file]
fs/btrfs/subvolume.c
fs/btrfs/super.c [deleted file]
fs/btrfs/volumes.c [new file with mode: 0644]
fs/btrfs/volumes.h [new file with mode: 0644]
include/asm-generic/u-boot.h
include/broadcom/chimp.h
include/configs/P1023RDB.h [deleted file]
include/configs/P5020DS.h [deleted file]
include/configs/am335x_evm.h
include/configs/j721e_evm.h
include/configs/km/km-mpc832x.h
include/configs/km/km-mpc8360.h
include/configs/km/km-mpc83xx.h
include/configs/p1_p2_rdb_pc.h
include/dm/device.h
include/dm/of_access.h
include/dt-bindings/clock/aspeed-clock.h [new file with mode: 0644]
include/dt-bindings/clock/ast2500-scu.h [deleted file]
include/dt-bindings/clock/qcom,ipq4019-gcc.h [new file with mode: 0644]
include/dt-bindings/reset/qcom,ipq4019-reset.h [new file with mode: 0644]
include/environment/ti/mmc.h
include/fdtdec.h
include/fsl_mdio.h
include/fsl_qe.h
include/handoff.h
include/omap3_spi.h [new file with mode: 0644]
include/tsec.h
lib/fdtdec.c
lib/lmb.c
lib/optee/optee.c
scripts/dtc/pylibfdt/libfdt.i_shipped
test/dm/fdtdec.c
tools/binman/README
tools/binman/README.entries
tools/binman/control.py
tools/binman/elf.py
tools/binman/elf_test.py
tools/binman/entry.py
tools/binman/etype/atf_bl31.py [new file with mode: 0644]
tools/binman/etype/blob.py
tools/binman/etype/blob_ext.py
tools/binman/etype/blob_named_by_arg.py
tools/binman/etype/cros_ec_rw.py
tools/binman/etype/fit.py
tools/binman/etype/section.py
tools/binman/ftest.py
tools/binman/missing-blob-help [new file with mode: 0644]
tools/binman/test/165_section_ignore_hash_signature.dts [new file with mode: 0644]
tools/binman/test/166_pad_in_sections.dts [new file with mode: 0644]
tools/binman/test/167_fit_image_subentry_alignment.dts [new file with mode: 0644]
tools/binman/test/168_fit_missing_blob.dts [new file with mode: 0644]
tools/binman/test/169_atf_bl31.dts [new file with mode: 0644]
tools/binman/test/171_fit_fdt_missing_prop.dts [new file with mode: 0644]
tools/binman/test/172_fit_fdt.dts [new file with mode: 0644]
tools/binman/test/Makefile
tools/buildman/builder.py
tools/buildman/func_test.py
tools/buildman/test.py
tools/dtoc/fdt_util.py
tools/patman/gitutil.py
tools/patman/tools.py
tools/rmboard.py

diff --git a/Kconfig b/Kconfig
index 883e3f7..837b2f5 100644 (file)
--- a/Kconfig
+++ b/Kconfig
@@ -659,12 +659,11 @@ config SPL_FIT_SOURCE
 
 config USE_SPL_FIT_GENERATOR
        bool "Use a script to generate the .its script"
-       default y if SPL_FIT
+       default y if SPL_FIT && !ARCH_SUNXI
 
 config SPL_FIT_GENERATOR
        string ".its file generator script for U-Boot FIT image"
        depends on USE_SPL_FIT_GENERATOR
-       default "board/sunxi/mksunxi_fit_atf.sh" if SPL_LOAD_FIT && ARCH_SUNXI
        default "arch/arm/mach-rockchip/make_fit_atf.py" if SPL_LOAD_FIT && ARCH_ROCKCHIP
        default "arch/arm/mach-zynqmp/mkimage_fit_atf.sh" if SPL_LOAD_FIT && ARCH_ZYNQMP
        default "arch/riscv/lib/mkimage_fit_opensbi.sh" if SPL_LOAD_FIT && RISCV
index 7e46470..c96b8b6 100644 (file)
@@ -237,6 +237,10 @@ M: Luka Kovacic <luka.kovacic@sartura.hr>
 M:     Luka Perkov <luka.perkov@sartura.hr>
 S:     Maintained
 F:     arch/arm/mach-ipq40xx/
+F:     include/dt-bindings/clock/qcom,ipq4019-gcc.h
+F:     include/dt-bindings/reset/qcom,ipq4019-reset.h
+F:     drivers/reset/reset-ipq4019.c
+F:     drivers/phy/phy-qcom-ipq4019-usb.c
 
 ARM MARVELL KIRKWOOD ARMADA-XP ARMADA-38X ARMADA-37XX ARMADA-7K/8K
 M:     Stefan Roese <sr@denx.de>
@@ -599,6 +603,8 @@ F:  tools/binman/
 
 BTRFS
 M:     Marek Behun <marek.behun@nic.cz>
+R:     Qu Wenruo <wqu@suse.com>
+L:     linux-btrfs@vger.kernel.org
 S:     Maintained
 F:     cmd/btrfs.c
 F:     fs/btrfs/
@@ -1005,6 +1011,10 @@ F:       arch/arm/dts/ns3-board.dts
 F:     arch/arm/dts/ns3.dtsi
 F:     arch/arm/cpu/armv8/bcmns3
 F:     arch/arm/include/asm/arch-bcmns3/
+F:     cmd/broadcom/Makefile
+F:     cmd/broadcom/chimp_boot.c
+F:     cmd/broadcom/nitro_image_load.c
+F:     cmd/broadcom/chimp_handshake.c
 
 TDA19988 HDMI ENCODER
 M:     Liviu Dudau <liviu.dudau@foss.arm.com>
index dd98b43..2de0527 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -923,11 +923,6 @@ INPUTS-$(CONFIG_REMAKE_ELF) += u-boot.elf
 INPUTS-$(CONFIG_EFI_APP) += u-boot-app.efi
 INPUTS-$(CONFIG_EFI_STUB) += u-boot-payload.efi
 
-# Build a combined spl + u-boot image for sunxi
-ifeq ($(CONFIG_ARCH_SUNXI)$(CONFIG_ARM64)$(CONFIG_SPL),yyy)
-INPUTS-y += u-boot-sunxi-with-spl.bin
-endif
-
 # Generate this input file for binman
 ifeq ($(CONFIG_SPL),)
 INPUTS-$(CONFIG_ARCH_MEDIATEK) += u-boot-mtk.bin
@@ -1024,13 +1019,9 @@ PHONY += inputs
 inputs: $(INPUTS-y)
 
 all: .binman_stamp inputs
-# Hack for sunxi which doesn't have a proper binman definition for
-# 64-bit boards
-ifneq ($(CONFIG_ARCH_SUNXI)$(CONFIG_ARM64),yy)
 ifeq ($(CONFIG_BINMAN),y)
        $(call if_changed,binman)
 endif
-endif
 
 # Timestamp file to make sure that binman always runs
 .binman_stamp: FORCE
@@ -1330,13 +1321,16 @@ u-boot.ldr:     u-boot
 # binman
 # ---------------------------------------------------------------------------
 # Use 'make BINMAN_DEBUG=1' to enable debugging
+default_dt := $(if $(DEVICE_TREE),$(DEVICE_TREE),$(CONFIG_DEFAULT_DEVICE_TREE))
 quiet_cmd_binman = BINMAN  $@
 cmd_binman = $(srctree)/tools/binman/binman $(if $(BINMAN_DEBUG),-D) \
                 --toolpath $(objtree)/tools \
                $(if $(BINMAN_VERBOSE),-v$(BINMAN_VERBOSE)) \
-               build -u -d u-boot.dtb -O . \
-               $(if $(BUILD_ROM),,-m --allow-missing) \
+               build -u -d u-boot.dtb -O . -m --allow-missing \
                -I . -I $(srctree) -I $(srctree)/board/$(BOARDDIR) \
+               -I arch/$(ARCH)/dts -a of-list=$(CONFIG_OF_LIST) \
+               -a atf-bl31-path=${BL31} \
+               -a default-dt=$(default_dt) \
                $(BINMAN_$(@F))
 
 OBJCOPYFLAGS_u-boot.ldr.hex := -I binary -O ihex
@@ -1626,13 +1620,6 @@ u-boot-x86-reset16.bin: u-boot FORCE
 
 endif # CONFIG_X86
 
-ifneq ($(CONFIG_ARCH_SUNXI),)
-ifeq ($(CONFIG_ARM64),y)
-u-boot-sunxi-with-spl.bin: spl/sunxi-spl.bin u-boot.itb FORCE
-       $(call if_changed,cat)
-endif
-endif
-
 OBJCOPYFLAGS_u-boot-app.efi := $(OBJCOPYFLAGS_EFI)
 u-boot-app.efi: u-boot FORCE
        $(call if_changed,zobjcopy)
index 51cd328..e150966 100644 (file)
@@ -24,8 +24,7 @@ DECLARE_GLOBAL_DATA_PTR;
 int platform_sys_info(struct sys_info *si)
 {
 
-       platform_set_mr(si, gd->bd->bi_memstart,
-                       gd->bd->bi_memsize, MR_ATTR_DRAM);
+       platform_set_mr(si, gd->ram_base, gd->ram_size, MR_ATTR_DRAM);
 
        return 1;
 }
index 15930cf..847a4a3 100644 (file)
@@ -42,7 +42,7 @@ int platform_sys_info(struct sys_info *si)
        si->bar = 0;
 #endif
 
-       platform_set_mr(si, gd->bd->bi_memstart, gd->bd->bi_memsize, MR_ATTR_DRAM);
+       platform_set_mr(si, gd->ram_base, gd->ram_size, MR_ATTR_DRAM);
        platform_set_mr(si, gd->bd->bi_flashstart, gd->bd->bi_flashsize, MR_ATTR_FLASH);
        platform_set_mr(si, gd->bd->bi_sramstart, gd->bd->bi_sramsize, MR_ATTR_SRAM);
 
index 24202bc..6a02278 100644 (file)
@@ -767,8 +767,11 @@ config ARCH_IPQ40XX
        select DM
        select DM_GPIO
        select DM_SERIAL
+       select DM_RESET
+       select MSM_SMEM
        select PINCTRL
        select CLK
+       select SMEM
        select OF_CONTROL
        imply CMD_DM
 
index f8f5294..72b6fe1 100644 (file)
@@ -938,7 +938,7 @@ dtb-$(CONFIG_ARCH_BCM6858) += \
 
 dtb-$(CONFIG_TARGET_BCMNS3) += ns3-board.dtb
 
-dtb-$(CONFIG_ARCH_ASPEED) += ast2500-evb.dtb
+dtb-$(CONFIG_ASPEED_AST2500) += ast2500-evb.dtb
 
 dtb-$(CONFIG_ARCH_STI) += stih410-b2260.dtb
 
index 37484cb..2a1b3a5 100644 (file)
                reg = <3>;
        };
 };
+
+&spi0 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&spi0_pins_default>;
+
+       sn65hvs882@1 {
+               compatible = "pisosr-gpio";
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               load-gpios = <&gpio3 18 GPIO_ACTIVE_LOW>;
+
+               reg = <1>;
+               spi-max-frequency = <1000000>;
+               spi-cpol;
+       };
+
+       spi_nor: flash@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "winbond,w25q64", "jedec,spi-nor";
+               spi-max-frequency = <80000000>;
+               m25p,fast-read;
+               reg = <0>;
+
+               partition@0 {
+                       label = "u-boot-spl";
+                       reg = <0x0 0x80000>;
+                       read-only;
+               };
+
+               partition@1 {
+                       label = "u-boot";
+                       reg = <0x80000 0x100000>;
+                       read-only;
+               };
+
+               partition@2 {
+                       label = "u-boot-env";
+                       reg = <0x180000 0x20000>;
+                       read-only;
+               };
+
+               partition@3 {
+                       label = "misc";
+                       reg = <0x1A0000 0x660000>;
+               };
+       };
+};
index 8ac4215..51a5244 100644 (file)
@@ -1,4 +1,5 @@
-#include <dt-bindings/clock/ast2500-scu.h>
+// SPDX-License-Identifier: GPL-2.0
+#include <dt-bindings/clock/aspeed-clock.h>
 #include <dt-bindings/reset/ast2500-reset.h>
 
 #include "ast2500.dtsi"
@@ -25,7 +26,7 @@
                reg = <0x1e6e0000 0x174
                        0x1e6e0200 0x1d4 >;
                #reset-cells = <1>;
-               clocks = <&scu PLL_MPLL>;
+               clocks = <&scu ASPEED_CLK_MPLL>;
                resets = <&rst AST_RESET_SDRAM>;
        };
 
@@ -39,7 +40,7 @@
                                compatible = "aspeed,ast2500-sdhci";
                                reg = <0x1e740100>;
                                #reset-cells = <1>;
-                               clocks = <&scu BCLK_SDCLK>;
+                               clocks = <&scu ASPEED_CLK_SDIO>;
                                resets = <&rst AST_RESET_SDIO>;
                        };
 
@@ -47,7 +48,7 @@
                                compatible = "aspeed,ast2500-sdhci";
                                reg = <0x1e740200>;
                                #reset-cells = <1>;
-                               clocks = <&scu BCLK_SDCLK>;
+                               clocks = <&scu ASPEED_CLK_SDIO>;
                                resets = <&rst AST_RESET_SDIO>;
                        };
                };
 };
 
 &uart1 {
-       clocks = <&scu PCLK_UART1>;
+       clocks = <&scu ASPEED_CLK_GATE_UART1CLK>;
 };
 
 &uart2 {
-       clocks = <&scu PCLK_UART2>;
+       clocks = <&scu ASPEED_CLK_GATE_UART2CLK>;
 };
 
 &uart3 {
-       clocks = <&scu PCLK_UART3>;
+       clocks = <&scu ASPEED_CLK_GATE_UART3CLK>;
 };
 
 &uart4 {
-       clocks = <&scu PCLK_UART4>;
+       clocks = <&scu ASPEED_CLK_GATE_UART4CLK>;
 };
 
 &uart5 {
-       clocks = <&scu PCLK_UART5>;
+       clocks = <&scu ASPEED_CLK_GATE_UART5CLK>;
 };
 
 &timer {
@@ -80,9 +81,9 @@
 };
 
 &mac0 {
-       clocks = <&scu PCLK_MAC1>, <&scu PLL_D2PLL>;
+       clocks = <&scu ASPEED_CLK_GATE_MAC1CLK>, <&scu ASPEED_CLK_D2PLL>;
 };
 
 &mac1 {
-       clocks = <&scu PCLK_MAC2>, <&scu PLL_D2PLL>;
+       clocks = <&scu ASPEED_CLK_GATE_MAC1CLK>, <&scu ASPEED_CLK_D2PLL>;
 };
index 4972a75..0a5faa2 100644 (file)
        dr_mode = "peripheral";
        u-boot,dm-spl;
 };
+
+&wkup_gpio_pins_default {
+       u-boot,dm-spl;
+};
+
+&wkup_gpio0 {
+       u-boot,dm-spl;
+};
+
+&mcu_fss0_hpb0_pins_default {
+       u-boot,dm-spl;
+};
+
+&fss {
+       u-boot,dm-spl;
+};
+
+&hbmc {
+       u-boot,dm-spl;
+
+       flash@0,0 {
+               u-boot,dm-spl;
+       };
+};
+
+&hbmc_mux {
+       u-boot,dm-spl;
+};
index 3f1d03c..cc3d933 100644 (file)
                stdout-path = "serial2:115200n8";
                bootargs = "console=ttyS2,115200n8 earlycon=ns16550a,mmio32,0x02800000";
        };
+
+       aliases {
+               remoteproc0 = &mcu_r5fss0_core0;
+               remoteproc1 = &mcu_r5fss0_core1;
+               remoteproc2 = &main_r5fss0_core0;
+               remoteproc3 = &main_r5fss0_core1;
+       };
 };
 
 &wkup_pmx0 {
index aaa1fdd..c25f03c 100644 (file)
                        dr_mode = "otg";
                };
        };
+
+       main_r5fss0: r5fss@5c00000 {
+               compatible = "ti,j7200-r5fss";
+               lockstep-mode = <0>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0x5c00000 0x00 0x5c00000 0x20000>,
+                        <0x5d00000 0x00 0x5d00000 0x20000>;
+               power-domains = <&k3_pds 243 TI_SCI_PD_EXCLUSIVE>;
+
+               main_r5fss0_core0: r5f@5c00000 {
+                       compatible = "ti,j7200-r5f";
+                       reg = <0x5c00000 0x00010000>,
+                             <0x5c10000 0x00010000>;
+                       reg-names = "atcm", "btcm";
+                       ti,sci = <&dmsc>;
+                       ti,sci-dev-id = <245>;
+                       ti,sci-proc-ids = <0x06 0xFF>;
+                       resets = <&k3_reset 245 1>;
+                       firmware-name = "j7200-main-r5f0_0-fw";
+                       atcm-enable = <1>;
+                       btcm-enable = <1>;
+                       loczrama = <1>;
+               };
+
+               main_r5fss0_core1: r5f@5d00000 {
+                       compatible = "ti,j7200-r5f";
+                       reg = <0x5d00000 0x00008000>,
+                             <0x5d10000 0x00008000>;
+                       reg-names = "atcm", "btcm";
+                       ti,sci = <&dmsc>;
+                       ti,sci-dev-id = <246>;
+                       ti,sci-proc-ids = <0x07 0xFF>;
+                       resets = <&k3_reset 246 1>;
+                       firmware-name = "j7200-main-r5f0_1-fw";
+                       atcm-enable = <1>;
+                       btcm-enable = <1>;
+                       loczrama = <1>;
+               };
+       };
 };
index 4c899c8..75c0c85 100644 (file)
                        ti,cpts-periodic-outputs = <2>;
                };
        };
+
+       mcu_r5fss0: r5fss@41000000 {
+               compatible = "ti,j7200-r5fss";
+               lockstep-mode = <1>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0x41000000 0x00 0x41000000 0x20000>,
+                        <0x41400000 0x00 0x41400000 0x20000>;
+               power-domains = <&k3_pds 249 TI_SCI_PD_EXCLUSIVE>;
+
+               mcu_r5fss0_core0: r5f@41000000 {
+                       compatible = "ti,j7200-r5f";
+                       reg = <0x41000000 0x00010000>,
+                             <0x41010000 0x00010000>;
+                       reg-names = "atcm", "btcm";
+                       ti,sci = <&dmsc>;
+                       ti,sci-dev-id = <250>;
+                       ti,sci-proc-ids = <0x01 0xff>;
+                       resets = <&k3_reset 250 1>;
+                       firmware-name = "j7200-mcu-r5f0_0-fw";
+                       atcm-enable = <1>;
+                       btcm-enable = <1>;
+                       loczrama = <1>;
+               };
+
+               mcu_r5fss0_core1: r5f@41400000 {
+                       compatible = "ti,j7200-r5f";
+                       reg = <0x41400000 0x00008000>,
+                             <0x41410000 0x00008000>;
+                       reg-names = "atcm", "btcm";
+                       ti,sci = <&dmsc>;
+                       ti,sci-dev-id = <251>;
+                       ti,sci-proc-ids = <0x02 0xff>;
+                       resets = <&k3_reset 251 1>;
+                       firmware-name = "j7200-mcu-r5f0_1-fw";
+                       atcm-enable = <1>;
+                       btcm-enable = <1>;
+                       loczrama = <1>;
+               };
+       };
 };
index f5e4166..db63d93 100644 (file)
        chosen {
                stdout-path = &main_uart0;
                tick-timer = &timer1;
+               firmware-loader = &fs_loader0;
+       };
+
+       fs_loader0: fs_loader@0 {
+               u-boot,dm-pre-reloc;
+               compatible = "u-boot,fs-loader";
        };
 
        a72_0: a72@0 {
                        J721E_WKUP_IOPAD(0x104, PIN_INPUT_PULLUP, 0) /* (H21) WKUP_I2C0_SDA */
                >;
        };
+
+       mcu_fss0_hpb0_pins_default: mcu-fss0-hpb0-pins-default {
+               pinctrl-single,pins = <
+                       J721E_WKUP_IOPAD(0x0, PIN_OUTPUT, 1) /* (E20) MCU_OSPI0_CLK.MCU_HYPERBUS0_CK */
+                       J721E_WKUP_IOPAD(0x4, PIN_OUTPUT, 1) /* (C21) MCU_OSPI0_LBCLKO.MCU_HYPERBUS0_CKn */
+                       J721E_WKUP_IOPAD(0x2c, PIN_OUTPUT, 1) /* (F19) MCU_OSPI0_CSn0.MCU_HYPERBUS0_CSn0 */
+                       J721E_WKUP_IOPAD(0x54, PIN_OUTPUT, 3) /* (E22) MCU_OSPI1_CSn1.MCU_HYPERBUS0_CSn1 */
+                       J721E_WKUP_IOPAD(0x30, PIN_OUTPUT, 1) /* (E19) MCU_OSPI0_CSn1.MCU_HYPERBUS0_RESETn */
+                       J721E_WKUP_IOPAD(0x8, PIN_INPUT, 1) /* (D21) MCU_OSPI0_DQS.MCU_HYPERBUS0_RWDS */
+                       J721E_WKUP_IOPAD(0xc, PIN_INPUT, 1) /* (D20) MCU_OSPI0_D0.MCU_HYPERBUS0_DQ0 */
+                       J721E_WKUP_IOPAD(0x10, PIN_INPUT, 1) /* (G19) MCU_OSPI0_D1.MCU_HYPERBUS0_DQ1 */
+                       J721E_WKUP_IOPAD(0x14, PIN_INPUT, 1) /* (G20) MCU_OSPI0_D2.MCU_HYPERBUS0_DQ2 */
+                       J721E_WKUP_IOPAD(0x18, PIN_INPUT, 1) /* (F20) MCU_OSPI0_D3.MCU_HYPERBUS0_DQ3 */
+                       J721E_WKUP_IOPAD(0x1c, PIN_INPUT, 1) /* (F21) MCU_OSPI0_D4.MCU_HYPERBUS0_DQ4 */
+                       J721E_WKUP_IOPAD(0x20, PIN_INPUT, 1) /* (E21) MCU_OSPI0_D5.MCU_HYPERBUS0_DQ5 */
+                       J721E_WKUP_IOPAD(0x24, PIN_INPUT, 1) /* (B22) MCU_OSPI0_D6.MCU_HYPERBUS0_DQ6 */
+                       J721E_WKUP_IOPAD(0x28, PIN_INPUT, 1) /* (G21) MCU_OSPI0_D7.MCU_HYPERBUS0_DQ7 */
+               >;
+       };
+
+       wkup_gpio_pins_default: wkup-gpio-pins-default {
+               pinctrl-single,pins = <
+                       J721E_WKUP_IOPAD(0xd8, PIN_INPUT, 7) /* (C14) WKUP_GPIO0_6 */
+               >;
+       };
 };
 
 &main_pmx0 {
        maximum-speed = "high-speed";
 };
 
+&hbmc {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&mcu_fss0_hpb0_pins_default>;
+       reg = <0x0 0x47040000 0x0 0x100>,
+             <0x0 0x50000000 0x0 0x8000000>;
+       ranges = <0x0 0x0 0x0 0x50000000 0x4000000>, /* 64MB Flash on CS0 */
+                <0x1 0x0 0x0 0x54000000 0x800000>; /* 8MB flash on CS1 */
+
+       flash@0,0 {
+               compatible = "cypress,hyperflash", "cfi-flash";
+               reg = <0x0 0x0 0x4000000>;
+       };
+};
+
 #include "k3-j7200-common-proc-board-u-boot.dtsi"
index a285b1a..33db74a 100644 (file)
 
        main_r5fss1: r5fss@5e00000 {
                compatible = "ti,j721e-r5fss";
-               lockstep-mode = <1>;
+               lockstep-mode = <0>;
                #address-cells = <1>;
                #size-cells = <1>;
                ranges = <0x5e00000 0x00 0x5e00000 0x20000>,
index 5f78bc5..e0e4188 100644 (file)
@@ -10,6 +10,8 @@
 #include "skeleton.dtsi"
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/pinctrl/pinctrl-snapdragon.h>
+#include <dt-bindings/clock/qcom,ipq4019-gcc.h>
+#include <dt-bindings/reset/qcom,ipq4019-reset.h>
 
 / {
        #address-cells = <1>;
                };
        };
 
+       smem {
+               compatible = "qcom,smem";
+               memory-region = <&smem_mem>;
+       };
+
        soc: soc {
                #address-cells = <1>;
                #size-cells = <1>;
                        u-boot,dm-pre-reloc;
                };
 
+               reset: gcc-reset@1800000 {
+                       compatible = "qcom,gcc-reset-ipq4019";
+                       reg = <0x1800000 0x60000>;
+                       #clock-cells = <1>;
+                       #reset-cells = <1>;
+                       u-boot,dm-pre-reloc;
+               };
+
                pinctrl: qcom,tlmm@1000000 {
                        compatible = "qcom,tlmm-ipq4019";
                        reg = <0x1000000 0x300000>;
@@ -61,7 +76,7 @@
                blsp1_uart1: serial@78af000 {
                        compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
                        reg = <0x78af000 0x200>;
-                       clock = <&gcc 26>;
+                       clock = <&gcc GCC_BLSP1_UART1_APPS_CLK>;
                        bit-rate = <0xFF>;
                        status = "disabled";
                        u-boot,dm-pre-reloc;
                        gpio-bank-name="soc";
                        #gpio-cells = <2>;
                };
+
+               usb3_ss_phy: ssphy@9a000 {
+                       compatible = "qcom,usb-ss-ipq4019-phy";
+                       #phy-cells = <0>;
+                       reg = <0x9a000 0x800>;
+                       reg-names = "phy_base";
+                       resets = <&reset USB3_UNIPHY_PHY_ARES>;
+                       reset-names = "por_rst";
+                       status = "disabled";
+               };
+
+               usb3_hs_phy: hsphy@a6000 {
+                       compatible = "qcom,usb-hs-ipq4019-phy";
+                       #phy-cells = <0>;
+                       reg = <0xa6000 0x40>;
+                       reg-names = "phy_base";
+                       resets = <&reset USB3_HSPHY_POR_ARES>, <&reset USB3_HSPHY_S_ARES>;
+                       reset-names = "por_rst", "srif_rst";
+                       status = "disabled";
+               };
+
+               usb3: usb3@8af8800 {
+                       compatible = "qcom,dwc3";
+                       reg = <0x8af8800 0x100>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       clocks = <&gcc GCC_USB3_MASTER_CLK>,
+                                <&gcc GCC_USB3_SLEEP_CLK>,
+                                <&gcc GCC_USB3_MOCK_UTMI_CLK>;
+                       clock-names = "master", "sleep", "mock_utmi";
+                       ranges;
+                       status = "disabled";
+
+                       dwc3@8a00000 {
+                               compatible = "snps,dwc3";
+                               reg = <0x8a00000 0xf8000>;
+                               phys = <&usb3_hs_phy>, <&usb3_ss_phy>;
+                               phy-names = "usb2-phy", "usb3-phy";
+                               dr_mode = "host";
+                               maximum-speed = "super-speed";
+                               snps,dis_u2_susphy_quirk;
+                       };
+               };
+
+               usb2_hs_phy: hsphy@a8000 {
+                       compatible = "qcom,usb-hs-ipq4019-phy";
+                       #phy-cells = <0>;
+                       reg = <0xa8000 0x40>;
+                       reg-names = "phy_base";
+                       resets = <&reset USB2_HSPHY_POR_ARES>, <&reset USB2_HSPHY_S_ARES>;
+                       reset-names = "por_rst", "srif_rst";
+                       status = "disabled";
+               };
+
+               usb2: usb2@60f8800 {
+                       compatible = "qcom,dwc3";
+                       reg = <0x60f8800 0x100>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       clocks = <&gcc GCC_USB2_MASTER_CLK>,
+                                <&gcc GCC_USB2_SLEEP_CLK>,
+                                <&gcc GCC_USB2_MOCK_UTMI_CLK>;
+                       clock-names = "master", "sleep", "mock_utmi";
+                       ranges;
+                       status = "disabled";
+
+                       dwc3@6000000 {
+                               compatible = "snps,dwc3";
+                               reg = <0x6000000 0xf8000>;
+                               phys = <&usb2_hs_phy>;
+                               phy-names = "usb2-phy";
+                               dr_mode = "host";
+                               maximum-speed = "high-speed";
+                               snps,dis_u2_susphy_quirk;
+                       };
+               };
        };
 };
index fdd4c80..c97943b 100644 (file)
@@ -5,14 +5,74 @@
                mmc1 = &mmc2;
        };
 
-       binman {
+       binman: binman {
+               multiple-images;
+       };
+};
+
+&binman {
+       u-boot-sunxi-with-spl {
                filename = "u-boot-sunxi-with-spl.bin";
                pad-byte = <0xff>;
                blob {
                        filename = "spl/sunxi-spl.bin";
                };
+#ifdef CONFIG_ARM64
+               fit {
+                       description = "Configuration to load ATF before U-Boot";
+                       #address-cells = <1>;
+                       fit,fdt-list = "of-list";
+
+                       images {
+                               uboot {
+                                       description = "U-Boot (64-bit)";
+                                       type = "standalone";
+                                       arch = "arm64";
+                                       compression = "none";
+                                       load = <0x4a000000>;
+
+                                       u-boot-nodtb {
+                                       };
+                               };
+                               atf {
+                                       description = "ARM Trusted Firmware";
+                                       type = "firmware";
+                                       arch = "arm64";
+                                       compression = "none";
+/* TODO: Do this with an overwrite in this board's dtb? */
+#ifdef CONFIG_MACH_SUN50I_H6
+                                       load = <0x104000>;
+                                       entry = <0x104000>;
+#else
+                                       load = <0x44000>;
+                                       entry = <0x44000>;
+#endif
+                                       atf-bl31 {
+                                               missing-msg = "atf-bl31-sunxi";
+                                       };
+                               };
+
+                               @fdt-SEQ {
+                                       description = "NAME";
+                                       type = "flat_dt";
+                                       compression = "none";
+                               };
+                       };
+
+                       configurations {
+                               default = "config-1";
+                               @config-SEQ {
+                                       description = "NAME";
+                                       firmware = "uboot";
+                                       loadables = "atf";
+                                       fdt = "fdt-SEQ";
+                               };
+                       };
+               };
+#else
                u-boot-img {
                        offset = <CONFIG_SPL_PAD_TO>;
                };
+#endif
        };
 };
index a3adaa8..8536a70 100644 (file)
@@ -19,7 +19,7 @@
 #include <asm/arch/wdt.h>
 #include <linux/err.h>
 #include <linux/kernel.h>
-#include <dt-bindings/clock/ast2500-scu.h>
+#include <dt-bindings/clock/aspeed-clock.h>
 
 /* These configuration parameters are taken from Aspeed SDK */
 #define DDR4_MR46_MODE         0x08000000
index 7cf98a2..83a688e 100644 (file)
@@ -13,6 +13,8 @@
 #include <dm.h>
 #include <errno.h>
 
+#include <dt-bindings/clock/qcom,ipq4019-gcc.h>
+
 struct msm_clk_priv {
        phys_addr_t base;
 };
@@ -20,7 +22,7 @@ struct msm_clk_priv {
 ulong msm_set_rate(struct clk *clk, ulong rate)
 {
        switch (clk->id) {
-       case 26: /*UART1*/
+       case GCC_BLSP1_UART1_APPS_CLK: /*UART1*/
                /* This clock is already initialized by SBL1 */
                return 0; 
                break;
index 95f830b..a0da3df 100644 (file)
@@ -2,8 +2,9 @@
 /*
  * K3: ARM64 MMU setup
  *
- * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com/
+ * Copyright (C) 2018-2020 Texas Instruments Incorporated - https://www.ti.com/
  *     Lokesh Vutla <lokeshvutla@ti.com>
+ *     Suman Anna <s-anna@ti.com>
  * (This file is derived from arch/arm/mach-zynqmp/cpu.c)
  *
  */
@@ -66,6 +67,8 @@ struct mm_region *mem_map = am654_mem_map;
 #endif /* CONFIG_SOC_K3_AM6 */
 
 #ifdef CONFIG_SOC_K3_J721E
+
+#ifdef CONFIG_TARGET_J721E_A72_EVM
 /* NR_DRAM_BANKS + 32bit IO + 64bit IO + terminator */
 #define NR_MMU_REGIONS (CONFIG_NR_DRAM_BANKS + 6)
 
@@ -122,4 +125,58 @@ struct mm_region j721e_mem_map[NR_MMU_REGIONS] = {
 };
 
 struct mm_region *mem_map = j721e_mem_map;
+#endif /* CONFIG_TARGET_J721E_A72_EVM */
+
+#ifdef CONFIG_TARGET_J7200_A72_EVM
+#define NR_MMU_REGIONS (CONFIG_NR_DRAM_BANKS + 5)
+
+/* ToDo: Add 64bit IO */
+struct mm_region j7200_mem_map[NR_MMU_REGIONS] = {
+       {
+               .virt = 0x0UL,
+               .phys = 0x0UL,
+               .size = 0x80000000UL,
+               .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+                        PTE_BLOCK_NON_SHARE |
+                        PTE_BLOCK_PXN | PTE_BLOCK_UXN
+       }, {
+               .virt = 0x80000000UL,
+               .phys = 0x80000000UL,
+               .size = 0x20000000UL,
+               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
+                        PTE_BLOCK_INNER_SHARE
+       }, {
+               .virt = 0xa0000000UL,
+               .phys = 0xa0000000UL,
+               .size = 0x04800000UL,
+               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL_NC) |
+                        PTE_BLOCK_NON_SHARE
+       }, {
+               .virt = 0xa4800000UL,
+               .phys = 0xa4800000UL,
+               .size = 0x5b800000UL,
+               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
+                        PTE_BLOCK_INNER_SHARE
+       }, {
+               .virt = 0x880000000UL,
+               .phys = 0x880000000UL,
+               .size = 0x80000000UL,
+               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
+                        PTE_BLOCK_INNER_SHARE
+       }, {
+               .virt = 0x500000000UL,
+               .phys = 0x500000000UL,
+               .size = 0x400000000UL,
+               .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+                        PTE_BLOCK_NON_SHARE |
+                        PTE_BLOCK_PXN | PTE_BLOCK_UXN
+       }, {
+               /* List terminator */
+               0,
+       }
+};
+
+struct mm_region *mem_map = j7200_mem_map;
+#endif /* CONFIG_TARGET_J7200_A72_EVM */
+
 #endif /* CONFIG_SOC_K3_J721E */
index 3fa85ca..e894791 100644 (file)
@@ -15,6 +15,7 @@
 #define BOOT_DEVICE_ETHERNET           0x04
 #define BOOT_DEVICE_I2C                        0x06
 #define BOOT_DEVICE_UART               0x07
+#define BOOT_DEVICE_NOR                        BOOT_DEVICE_HYPERFLASH
 
 /* With BootMode B = 1 */
 #define BOOT_DEVICE_MMC2               0x10
index c4cc11f..b4fde46 100644 (file)
@@ -196,8 +196,8 @@ int board_usb_init(int index, enum usb_init_type init)
        for (i = 0; i < 2; i++) {
                ret = generic_phy_init(&usb_phys[i]);
                if (ret) {
-                       pr_err("Can't init USB PHY%d for %s\n",
-                              i, ofnode_get_name(dwc2_node));
+                       pr_debug("Can't init USB PHY%d for %s\n",
+                                i, ofnode_get_name(dwc2_node));
                        return ret;
                }
        }
@@ -205,8 +205,8 @@ int board_usb_init(int index, enum usb_init_type init)
        for (i = 0; i < 2; i++) {
                ret = generic_phy_power_on(&usb_phys[i]);
                if (ret) {
-                       pr_err("Can't power USB PHY%d for %s\n",
-                              i, ofnode_get_name(dwc2_node));
+                       pr_debug("Can't power USB PHY%d for %s\n",
+                                i, ofnode_get_name(dwc2_node));
                        return ret;
                }
        }
index a7b56b6..2888390 100644 (file)
@@ -14,6 +14,7 @@
 #include <init.h>
 #include <net.h>
 #include <ns16550.h>
+#include <omap3_spi.h>
 #include <spl.h>
 #include <asm/arch/cpu.h>
 #include <asm/arch/hardware.h>
 #define AM43XX_READ_WRITE_LEVELING_CTRL_OFFSET         0xDC
 #define AM43XX_RDWRLVLFULL_START                       0x80000000
 
+/* SPI flash. */
+#if CONFIG_IS_ENABLED(DM_SPI) && !CONFIG_IS_ENABLED(OF_CONTROL)
+#define AM33XX_SPI0_BASE       0x48030000
+#define AM33XX_SPI0_OFFSET     (AM33XX_SPI0_BASE + OMAP4_MCSPI_REG_OFFSET)
+#endif
+
 DECLARE_GLOBAL_DATA_PTR;
 
 int dram_init(void)
@@ -142,6 +149,17 @@ U_BOOT_DEVICES(am33xx_gpios) = {
 #endif
 };
 #endif
+#if CONFIG_IS_ENABLED(DM_SPI) && !CONFIG_IS_ENABLED(OF_CONTROL)
+static const struct omap3_spi_plat omap3_spi_pdata = {
+       .regs = (struct mcspi *)AM33XX_SPI0_OFFSET,
+       .pin_dir = MCSPI_PINDIR_D0_IN_D1_OUT,
+};
+
+U_BOOT_DEVICE(am33xx_spi) = {
+       .name = "omap3_spi",
+       .platdata = &omap3_spi_pdata,
+};
+#endif
 #endif
 
 #if !CONFIG_IS_ENABLED(DM_GPIO)
index db862f6..6ef9109 100644 (file)
@@ -17,7 +17,7 @@ unsigned long do_go_exec(ulong (*entry)(int, char * const []),
         * whole SDRAM area, since we don't know the size of the image
         * that was loaded.
         */
-       flush_cache(gd->bd->bi_memstart, gd->ram_top - gd->bd->bi_memstart);
+       flush_cache(gd->ram_base, gd->ram_top - gd->ram_base);
 
        return entry(argc, argv);
 }
index 0a13f6e..d5c99d8 100644 (file)
@@ -242,7 +242,7 @@ static int boot_reloc_fdt(bootm_headers_t *images)
 #if CONFIG_IS_ENABLED(MIPS_BOOT_FDT) && CONFIG_IS_ENABLED(OF_LIBFDT)
 int arch_fixup_fdt(void *blob)
 {
-       u64 mem_start = virt_to_phys((void *)gd->bd->bi_memstart);
+       u64 mem_start = virt_to_phys((void *)gd->ram_base);
        u64 mem_size = gd->ram_size;
 
        return fdt_fixup_memory_banks(blob, &mem_start, &mem_size, 1);
index 18808da..2bae08e 100644 (file)
@@ -101,34 +101,42 @@ config TARGET_IDS8313
 config TARGET_KMETER1
        bool "Support kmeter1"
        select VENDOR_KM
+       select KM_ENABLE_FULL_DM_DTS_SUPPORT
 
 config TARGET_KMCOGE5NE
        bool "Support kmcoge5ne"
        select VENDOR_KM
+       select KM_ENABLE_FULL_DM_DTS_SUPPORT
 
 config TARGET_KMTEGR1
        bool "Support kmtegr1"
        select VENDOR_KM
+       select KM_ENABLE_FULL_DM_DTS_SUPPORT
 
 config TARGET_TUXX1
        bool "Support tuxx1"
        select VENDOR_KM
+       select KM_ENABLE_FULL_DM_DTS_SUPPORT
 
 config TARGET_KMSUPX5
        bool "Support kmsupx5"
        select VENDOR_KM
+       select KM_ENABLE_FULL_DM_DTS_SUPPORT
 
 config TARGET_TUGE1
        bool "Support tuge1"
        select VENDOR_KM
+       select KM_ENABLE_FULL_DM_DTS_SUPPORT
 
 config TARGET_KMOPTI2
        bool "Support kmopti2"
        select VENDOR_KM
+       select KM_ENABLE_FULL_DM_DTS_SUPPORT
 
 config TARGET_KMTEPR2
        bool "Support kmtepr2"
        select VENDOR_KM
+       select KM_ENABLE_FULL_DM_DTS_SUPPORT
 
 config TARGET_TQM834X
        bool "Support TQM834x"
index 3040299..aeb42b1 100644 (file)
@@ -27,7 +27,9 @@ obj-y += cpu_init.o
 obj-y += speed.o
 obj-y += interrupts.o
 obj-y += ecc.o
+ifndef CONFIG_PINCTRL
 obj-$(CONFIG_QE) += qe_io.o
+endif
 obj-$(CONFIG_FSL_SERDES) += serdes.o
 ifndef CONFIG_ARCH_MPC8308
 obj-$(CONFIG_PCI) += pci.o
index 438b14b..840f907 100644 (file)
@@ -9,10 +9,14 @@
 #include <ioports.h>
 #include <asm/io.h>
 #include <asm/processor.h>
+#include <fsl_qe.h>
 #ifdef CONFIG_USB_EHCI_FSL
 #include <usb/ehci-ci.h>
 #endif
 #include <linux/delay.h>
+#ifdef CONFIG_QE
+#include <fsl_qe.h>
+#endif
 
 #include "lblaw/lblaw.h"
 #include "elbc/elbc.h"
@@ -26,9 +30,8 @@ DECLARE_GLOBAL_DATA_PTR;
 extern qe_iop_conf_t qe_iop_conf_tab[];
 extern void qe_config_iopin(u8 port, u8 pin, int dir,
                         int open_drain, int assign);
-extern void qe_init(uint qe_base);
-extern void qe_reset(void);
 
+#if !defined(CONFIG_PINCTRL)
 static void config_qe_ioports(void)
 {
        u8      port, pin;
@@ -45,6 +48,7 @@ static void config_qe_ioports(void)
        }
 }
 #endif
+#endif
 
 /*
  * Breathe some life into the CPU...
@@ -191,10 +195,13 @@ void cpu_init_f (volatile immap_t * im)
        __raw_writel(CONFIG_SYS_OBIR, &im->sysconf.obir);
 #endif
 
+#if !defined(CONFIG_PINCTRL)
 #ifdef CONFIG_QE
        /* Config QE ioports */
        config_qe_ioports();
 #endif
+#endif
+
        /* Set up preliminary BR/OR regs */
        init_early_memctl_regs();
 
index ebdedb2..4ea7b27 100644 (file)
@@ -121,7 +121,7 @@ void ft_cpu_setup(void *blob, struct bd_info *bd)
                 "clock-frequency", get_serial_clock(), 1);
 #endif
 
-       fdt_fixup_memory(blob, (u64)bd->bi_memstart, (u64)bd->bi_memsize);
+       fdt_fixup_memory(blob, (u64)gd->ram_base, (u64)gd->ram_size);
 
 #if defined(CONFIG_BOOTCOUNT_LIMIT) && \
        (defined(CONFIG_QE) && !defined(CONFIG_ARCH_MPC831X))
index 88aa689..5236070 100644 (file)
 #include <asm/immap_83xx.h>
 
 #define        NUM_OF_PINS     32
-void qe_config_iopin(u8 port, u8 pin, int dir, int open_drain, int assign)
+
+/** qe_cfg_iopin configure one io pin setting
+ *
+ * @par_io:    pointer to parallel I/O base
+ * @port:      io pin port
+ * @pin:       io pin number which get configured
+ * @dir:       direction of io pin 2 bits valid
+ *             00 = pin disabled
+ *             01 = output
+ *             10 = input
+ *             11 = pin is I/O
+ * @open_drain:        is pin open drain
+ * @assign:    pin assignment registers select the function of the pin
+ */
+static void qe_cfg_iopin(qepio83xx_t *par_io, u8 port, u8 pin, int dir,
+                        int open_drain, int assign)
 {
-       u32                     pin_2bit_mask;
-       u32                     pin_2bit_dir;
-       u32                     pin_2bit_assign;
-       u32                     pin_1bit_mask;
-       u32                     tmp_val;
-       volatile immap_t        *im = (volatile immap_t *)CONFIG_SYS_IMMR;
-       volatile qepio83xx_t    *par_io = (volatile qepio83xx_t *)&im->qepio;
+       u32     dbit_mask;
+       u32     dbit_dir;
+       u32     dbit_asgn;
+       u32     bit_mask;
+       u32     tmp_val;
+       int     offset;
+
+       offset = (NUM_OF_PINS - (pin % (NUM_OF_PINS / 2) + 1) * 2);
 
        /* Calculate pin location and 2bit mask and dir */
-       pin_2bit_mask = (u32)(0x3 << (NUM_OF_PINS-(pin%(NUM_OF_PINS/2)+1)*2));
-       pin_2bit_dir = (u32)(dir << (NUM_OF_PINS-(pin%(NUM_OF_PINS/2)+1)*2));
+       dbit_mask = (u32)(0x3 << offset);
+       dbit_dir = (u32)(dir << offset);
 
        /* Setup the direction */
-       tmp_val = (pin > (NUM_OF_PINS/2) - 1) ? \
+       tmp_val = (pin > (NUM_OF_PINS / 2) - 1) ?
                in_be32(&par_io->ioport[port].dir2) :
                in_be32(&par_io->ioport[port].dir1);
 
-       if (pin > (NUM_OF_PINS/2) -1) {
-               out_be32(&par_io->ioport[port].dir2, ~pin_2bit_mask & tmp_val);
-               out_be32(&par_io->ioport[port].dir2, pin_2bit_dir | tmp_val);
+       if (pin > (NUM_OF_PINS / 2) - 1) {
+               out_be32(&par_io->ioport[port].dir2, ~dbit_mask & tmp_val);
+               out_be32(&par_io->ioport[port].dir2, dbit_dir | tmp_val);
        } else {
-               out_be32(&par_io->ioport[port].dir1, ~pin_2bit_mask & tmp_val);
-               out_be32(&par_io->ioport[port].dir1, pin_2bit_dir | tmp_val);
+               out_be32(&par_io->ioport[port].dir1, ~dbit_mask & tmp_val);
+               out_be32(&par_io->ioport[port].dir1, dbit_dir | tmp_val);
        }
 
        /* Calculate pin location for 1bit mask */
-       pin_1bit_mask = (u32)(1 << (NUM_OF_PINS - (pin+1)));
+       bit_mask = (u32)(1 << (NUM_OF_PINS - (pin + 1)));
 
        /* Setup the open drain */
        tmp_val = in_be32(&par_io->ioport[port].podr);
-       if (open_drain) {
-               out_be32(&par_io->ioport[port].podr, pin_1bit_mask | tmp_val);
-       } else {
-               out_be32(&par_io->ioport[port].podr, ~pin_1bit_mask & tmp_val);
-       }
+       if (open_drain)
+               out_be32(&par_io->ioport[port].podr, bit_mask | tmp_val);
+       else
+               out_be32(&par_io->ioport[port].podr, ~bit_mask & tmp_val);
 
        /* Setup the assignment */
-       tmp_val = (pin > (NUM_OF_PINS/2) - 1) ?
-               in_be32(&par_io->ioport[port].ppar2):
+       tmp_val = (pin > (NUM_OF_PINS / 2) - 1) ?
+               in_be32(&par_io->ioport[port].ppar2) :
                in_be32(&par_io->ioport[port].ppar1);
-       pin_2bit_assign = (u32)(assign
-                               << (NUM_OF_PINS - (pin%(NUM_OF_PINS/2)+1)*2));
+       dbit_asgn = (u32)(assign << offset);
 
        /* Clear and set 2 bits mask */
-       if (pin > (NUM_OF_PINS/2) - 1) {
-               out_be32(&par_io->ioport[port].ppar2, ~pin_2bit_mask & tmp_val);
-               out_be32(&par_io->ioport[port].ppar2, pin_2bit_assign | tmp_val);
+       if (pin > (NUM_OF_PINS / 2) - 1) {
+               out_be32(&par_io->ioport[port].ppar2, ~dbit_mask & tmp_val);
+               out_be32(&par_io->ioport[port].ppar2, dbit_asgn | tmp_val);
        } else {
-               out_be32(&par_io->ioport[port].ppar1, ~pin_2bit_mask & tmp_val);
-               out_be32(&par_io->ioport[port].ppar1, pin_2bit_assign | tmp_val);
+               out_be32(&par_io->ioport[port].ppar1, ~dbit_mask & tmp_val);
+               out_be32(&par_io->ioport[port].ppar1, dbit_asgn | tmp_val);
        }
 }
+
+#if !defined(CONFIG_PINCTRL)
+/** qe_config_iopin configure one io pin setting
+ *
+ * @port:      io pin port
+ * @pin:       io pin number which get configured
+ * @dir:       direction of io pin 2 bits valid
+ *             00 = pin disabled
+ *             01 = output
+ *             10 = input
+ *             11 = pin is I/O
+ * @open_drain:        is pin open drain
+ * @assign:    pin assignment registers select the function of the pin
+ */
+void qe_config_iopin(u8 port, u8 pin, int dir, int open_drain, int assign)
+{
+       immap_t        *im = (immap_t *)CONFIG_SYS_IMMR;
+       qepio83xx_t    *par_io = (qepio83xx_t *)&im->qepio;
+
+       qe_cfg_iopin(par_io, port, pin, dir, open_drain, assign);
+}
+#endif
index c3cc119..ea8bc6c 100644 (file)
@@ -23,7 +23,7 @@ DECLARE_GLOBAL_DATA_PTR;
 /* Returns 0 if exception not found and fixup otherwise.  */
 extern unsigned long search_exception_table(unsigned long);
 
-#define END_OF_MEM     (gd->bd->bi_memstart + gd->bd->bi_memsize)
+#define END_OF_MEM     (gd->ram_base + gd->ram_size)
 
 /*
  * Trap & Exception support
index 753d075..54c7fd9 100644 (file)
@@ -40,14 +40,6 @@ config TARGET_P4080DS
        imply CMD_SATA
        imply PANIC_HANG
 
-config TARGET_P5020DS
-       bool "Support P5020DS"
-       select PHYS_64BIT
-       select ARCH_P5020
-       select BOARD_LATE_INIT if CHAIN_OF_TRUST
-       imply CMD_SATA
-       imply PANIC_HANG
-
 config TARGET_P5040DS
        bool "Support P5040DS"
        select PHYS_64BIT
@@ -109,22 +101,6 @@ config TARGET_P1010RDB_PB
        imply CMD_SATA
        imply PANIC_HANG
 
-config TARGET_P1023RDB
-       bool "Support P1023RDB"
-       select ARCH_P1023
-       select FSL_DDR_INTERACTIVE
-       imply CMD_EEPROM
-       imply PANIC_HANG
-
-config TARGET_P1020MBG
-       bool "Support P1020MBG-PC"
-       select SUPPORT_SPL
-       select SUPPORT_TPL
-       select ARCH_P1020
-       imply CMD_EEPROM
-       imply CMD_SATA
-       imply PANIC_HANG
-
 config TARGET_P1020RDB_PC
        bool "Support P1020RDB-PC"
        select SUPPORT_SPL
@@ -143,42 +119,6 @@ config TARGET_P1020RDB_PD
        imply CMD_SATA
        imply PANIC_HANG
 
-config TARGET_P1020UTM
-       bool "Support P1020UTM"
-       select SUPPORT_SPL
-       select SUPPORT_TPL
-       select ARCH_P1020
-       imply CMD_EEPROM
-       imply CMD_SATA
-       imply PANIC_HANG
-
-config TARGET_P1021RDB
-       bool "Support P1021RDB"
-       select SUPPORT_SPL
-       select SUPPORT_TPL
-       select ARCH_P1021
-       imply CMD_EEPROM
-       imply CMD_SATA
-       imply PANIC_HANG
-
-config TARGET_P1024RDB
-       bool "Support P1024RDB"
-       select SUPPORT_SPL
-       select SUPPORT_TPL
-       select ARCH_P1024
-       imply CMD_EEPROM
-       imply CMD_SATA
-       imply PANIC_HANG
-
-config TARGET_P1025RDB
-       bool "Support P1025RDB"
-       select SUPPORT_SPL
-       select SUPPORT_TPL
-       select ARCH_P1025
-       imply CMD_EEPROM
-       imply CMD_SATA
-       imply SATA_SIL
-
 config TARGET_P2020RDB
        bool "Support P2020RDB-PC"
        select SUPPORT_SPL
@@ -1506,7 +1446,6 @@ source "board/freescale/mpc8568mds/Kconfig"
 source "board/freescale/mpc8569mds/Kconfig"
 source "board/freescale/mpc8572ds/Kconfig"
 source "board/freescale/p1010rdb/Kconfig"
-source "board/freescale/p1023rdb/Kconfig"
 source "board/freescale/p1_p2_rdb_pc/Kconfig"
 source "board/freescale/p2041rdb/Kconfig"
 source "board/freescale/qemu-ppce500/Kconfig"
index 9569c1a..0d8353c 100644 (file)
@@ -672,10 +672,10 @@ void ft_cpu_setup(void *blob, struct bd_info *bd)
                "clock-frequency", get_bus_freq(0), 1);
 #endif
 
-       fdt_fixup_memory(blob, (u64)bd->bi_memstart, (u64)bd->bi_memsize);
+       fdt_fixup_memory(blob, (u64)gd->ram_base, (u64)gd->ram_size);
 
 #ifdef CONFIG_MP
-       ft_fixup_cpu(blob, (u64)bd->bi_memstart + (u64)bd->bi_memsize);
+       ft_fixup_cpu(blob, (u64)gd->ram_base + (u64)gd->ram_size);
        ft_fixup_num_cores(blob);
 #endif
 
index f37a45e..db6ed1f 100644 (file)
@@ -37,7 +37,7 @@ extern unsigned long search_exception_table(unsigned long);
  * amount of memory on the system if we're unable to keep all
  * the memory mapped in.
  */
-#define END_OF_MEM (gd->bd->bi_memstart + get_effective_memsize())
+#define END_OF_MEM     (gd->ram_base + get_effective_memsize())
 
 static __inline__ void set_tsr(unsigned long val)
 {
index 24e5311..010b6d4 100644 (file)
@@ -8,6 +8,8 @@
 #include <fdt_support.h>
 #include <asm/mp.h>
 
+DECLARE_GLOBAL_DATA_PTR;
+
 extern void ft_fixup_num_cores(void *blob);
 extern void ft_srio_setup(void *blob);
 
@@ -27,7 +29,7 @@ void ft_cpu_setup(void *blob, struct bd_info *bd)
        do_fixup_by_prop_u32(blob, "device_type", "soc", 4,
                             "bus-frequency", bd->bi_busfreq, 1);
 
-       fdt_fixup_memory(blob, (u64)bd->bi_memstart, (u64)bd->bi_memsize);
+       fdt_fixup_memory(blob, (u64)gd->ram_base, (u64)gd->ram_size);
 
 #ifdef CONFIG_SYS_NS16550
        do_fixup_by_compat_u32(blob, "ns16550",
index c0161e3..3ee0ec8 100644 (file)
@@ -30,7 +30,7 @@ extern unsigned long search_exception_table(unsigned long);
  * amount of memory on the system if we're unable to keep all
  * the memory mapped in.
  */
-#define END_OF_MEM (gd->bd->bi_memstart + get_effective_memsize())
+#define END_OF_MEM     (gd->ram_base + get_effective_memsize())
 
 /*
  * Trap & Exception support
index 4d952a3..226e258 100644 (file)
@@ -25,5 +25,5 @@ void ft_cpu_setup(void *blob, struct bd_info *bd)
        do_fixup_by_compat_u32(blob, "fsl,cpm-brg", "clock-frequency",
                               gd->arch.brg_clk, 1);
 
-       fdt_fixup_memory(blob, (u64)bd->bi_memstart, (u64)bd->bi_memsize);
+       fdt_fixup_memory(blob, (u64)gd->ram_base, (u64)gd->ram_size);
 }
index 2b24e75..b2d1dc5 100644 (file)
@@ -343,6 +343,7 @@ int fixup_cpu(void)
        return 0;
 }
 
+#ifndef CONFIG_DM_ETH
 /*
  * Initializes on-chip ethernet controllers.
  * to override, implement board_eth_init()
@@ -370,3 +371,4 @@ int cpu_eth_init(struct bd_info *bis)
 #endif
        return 0;
 }
+#endif
index 7eb005f..266d345 100644 (file)
@@ -1,5 +1,11 @@
 # SPDX-License-Identifier: GPL-2.0+
 
+dtb-$(CONFIG_TARGET_KMCOGE5NE) += kmcoge5ne.dtb
+dtb-$(CONFIG_TARGET_KMETER1) += kmeter1.dtb
+dtb-$(CONFIG_TARGET_KMOPTI2) += kmopti2.dtb
+dtb-$(CONFIG_TARGET_KMSUPX5) += kmsupc5.dtb kmsupm5.dtb
+dtb-$(CONFIG_TARGET_KMTEGR1) += kmtegr1.dtb
+dtb-$(CONFIG_TARGET_KMTEPR2) += kmtepr2.dtb
 dtb-$(CONFIG_TARGET_MPC8548CDS) += mpc8548cds.dtb mpc8548cds_36b.dtb
 dtb-$(CONFIG_TARGET_P1010RDB_PA) += p1010rdb-pa.dtb p1010rdb-pa_36b.dtb
 dtb-$(CONFIG_TARGET_P1010RDB_PB) += p1010rdb-pb.dtb p1010rdb-pb_36b.dtb
@@ -16,6 +22,8 @@ dtb-$(CONFIG_TARGET_T1042D4RDB) += t1042d4rdb.dtb
 dtb-$(CONFIG_TARGET_T2080QDS) += t2080qds.dtb
 dtb-$(CONFIG_TARGET_T2080RDB) += t2080rdb.dtb
 dtb-$(CONFIG_TARGET_T4240RDB) += t4240rdb.dtb
+dtb-$(CONFIG_TARGET_TUGE1) += kmtuge1.dtb
+dtb-$(CONFIG_TARGET_TUXX1) += kmtuxa1.dtb
 dtb-$(CONFIG_TARGET_MCR3000) += mcr3000.dtb
 dtb-$(CONFIG_TARGET_GAZERBEAM) += gazerbeam.dtb
 
diff --git a/arch/powerpc/dts/km8309-uboot.dtsi b/arch/powerpc/dts/km8309-uboot.dtsi
new file mode 100644 (file)
index 0000000..c44ce7d
--- /dev/null
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * ABB PGGA 8309 U-Boot specific Device Tree Source parts
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ *
+ */
+
+/ {
+       cpus {
+               u-boot,dm-pre-reloc;
+               PowerPC,8309@0 {
+                       u-boot,dm-pre-reloc;
+               };
+       };
+
+       chosen {
+               stdout-path = &serial0;
+       };
+};
+
+&qe {
+       compatible = "fsl,qe", "simple-bus";
+};
+
+&soc {
+       u-boot,dm-pre-reloc;
+};
+
+&serial0 {
+       clock-frequency = <132000000>;
+       u-boot,dm-pre-reloc;
+};
diff --git a/arch/powerpc/dts/km8321-uboot.dtsi b/arch/powerpc/dts/km8321-uboot.dtsi
new file mode 100644 (file)
index 0000000..3488260
--- /dev/null
@@ -0,0 +1,67 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * ABB PGGA 8321 U-Boot specific Device Tree Source parts
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ *
+ */
+
+/ {
+       cpus {
+               u-boot,dm-pre-reloc;
+               PowerPC,8321@0 {
+                       u-boot,dm-pre-reloc;
+               };
+       };
+
+       chosen {
+               stdout-path = &serial0;
+       };
+};
+
+&enet_piggy2 {
+       status = "okay";
+};
+
+&qe {
+       compatible = "fsl,qe", "simple-bus";
+};
+
+&serial0 {
+       clock-frequency = <132000000>;
+       u-boot,dm-pre-reloc;
+};
+
+&soc {
+       u-boot,dm-pre-reloc;
+
+       par_io@1400 {
+               compatible = "fsl,mpc8360-par_io";
+               u-boot,dm-pre-reloc;
+
+               serial_pin@0 {
+                       u-boot,dm-pre-reloc;
+               };
+               ucc_pin@0 {
+                       u-boot,dm-pre-reloc;
+               };
+               ucc_pin@1 {
+                       u-boot,dm-pre-reloc;
+               };
+               ucc_pin@3 {
+                       u-boot,dm-pre-reloc;
+               };
+               ucc_pin@4 {
+                       u-boot,dm-pre-reloc;
+               };
+               ucc_pin@5 {
+                       u-boot,dm-pre-reloc;
+               };
+               ucc_pin@6 {
+                       u-boot,dm-pre-reloc;
+               };
+               ucc_pin@7 {
+                       u-boot,dm-pre-reloc;
+               };
+       };
+};
diff --git a/arch/powerpc/dts/km8321.dtsi b/arch/powerpc/dts/km8321.dtsi
new file mode 100644 (file)
index 0000000..e493613
--- /dev/null
@@ -0,0 +1,220 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * ABB PGGA km8321 common ports Device Tree Source
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ *
+ */
+
+/dts-v1/;
+
+/ {
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               PowerPC,8321@0 {
+                       device_type = "cpu";
+                       reg = <0x0>;
+                       d-cache-line-size = <32>;       // 32 bytes
+                       i-cache-line-size = <32>;       // 32 bytes
+                       d-cache-size = <16384>;         // L1, 16K
+                       i-cache-size = <16384>;         // L1, 16K
+                       timebase-frequency = <66000000>;
+                       bus-frequency = <264000000>;
+                       clock-frequency = <528000000>;
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0x00000000 0x10000000>;
+       };
+
+       soc: soc8321@e0000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               device_type = "soc";
+               compatible = "simple-bus";
+               ranges = <0x0 0xe0000000 0x00100000>;
+               reg = <0xe0000000 0x00000200>;
+               bus-frequency = <264000000>;
+
+               i2c0: i2c@3000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <0>;
+                       compatible = "fsl,mpc8313-i2c","fsl-i2c";
+                       reg = <0x3000 0x100>;
+                       interrupts = <14 0x8>;
+                       interrupt-parent = <&ipic>;
+                       clock-frequency = <100000>;
+               };
+
+               serial0: serial@4500 {
+                       cell-index = <0>;
+                       device_type = "serial";
+                       compatible = "fsl,ns16550", "ns16550";
+                       reg = <0x4500 0x100>;
+                       clock-frequency = <264000000>;
+                       interrupts = <9 0x8>;
+                       interrupt-parent = <&ipic>;
+               };
+
+               dma@82a8 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,mpc8321-dma", "fsl,elo-dma";
+                       reg = <0x82a8 4>;
+                       ranges = <0 0x8100 0x1a8>;
+                       interrupt-parent = <&ipic>;
+                       interrupts = <71 8>;
+                       cell-index = <0>;
+                       dma-channel@0 {
+                               compatible = "fsl,mpc8321-dma-channel",
+                                            "fsl,elo-dma-channel";
+                               reg = <0 0x80>;
+                               interrupt-parent = <&ipic>;
+                               interrupts = <71 8>;
+                       };
+                       dma-channel@80 {
+                               compatible = "fsl,mpc8321-dma-channel",
+                                            "fsl,elo-dma-channel";
+                               reg = <0x80 0x80>;
+                               interrupt-parent = <&ipic>;
+                               interrupts = <71 8>;
+                       };
+                       dma-channel@100 {
+                               compatible = "fsl,mpc8321-dma-channel",
+                                            "fsl,elo-dma-channel";
+                               reg = <0x100 0x80>;
+                               interrupt-parent = <&ipic>;
+                               interrupts = <71 8>;
+                       };
+                       dma-channel@180 {
+                               compatible = "fsl,mpc8321-dma-channel",
+                                            "fsl,elo-dma-channel";
+                               reg = <0x180 0x28>;
+                               interrupt-parent = <&ipic>;
+                               interrupts = <71 8>;
+                       };
+               };
+
+               ipic: pic@700 {
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       compatible = "fsl,pq2pro-pic", "fsl,ipic";
+                       interrupt-controller;
+                       reg = <0x700 0x100>;
+                       device_type = "ipic";
+               };
+
+               par_io: par_io@1400 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg = <0x1400 0x100>;
+                       ranges;
+                       device_type = "par_io";
+                       num-ports = <7>;
+
+                       qe_pio_d: gpio-controller@48 {
+                               #gpio-cells = <2>;
+                               compatible = "fsl,mpc8360-qe-pario-bank",
+                                            "fsl,mpc8323-qe-pario-bank";
+                               reg = <0x1448 0x18>;
+                               gpio-controller;
+                       };
+               };
+       };
+
+       qe: qe@e0100000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               device_type = "qe";
+               compatible = "fsl,qe";
+               ranges = <0x0 0xe0100000 0x00100000>;
+               reg = <0xe0100000 0x480>;
+               brg-frequency = <0>;
+               bus-frequency = <396000000>;
+
+               muram@10000 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,qe-muram", "fsl,cpm-muram";
+                       ranges = <0x0 0x00010000 0x00004000>;
+
+                       data-only@0 {
+                               compatible = "fsl,qe-muram-data",
+                                            "fsl,cpm-muram-data";
+                               reg = <0x0 0x4000>;
+                       };
+               };
+
+               /* Piggy2 (UCC4, MDIO 0x00, RMII) */
+               enet_piggy2: ucc@3200 {
+                       device_type = "network";
+                       compatible = "ucc_geth";
+                       cell-index = <4>;
+                       reg = <0x3200 0x200>;
+                       interrupts = <35>;
+                       interrupt-parent = <&qeic>;
+                       local-mac-address = [ 00 00 00 00 00 00 ];
+                       rx-clock-name = "none";
+                       tx-clock-name = "clk17";
+                       phy-handle = <&phy_piggy2>;
+                       phy-connection-type = "rmii";
+                       pio-handle = <&pio_ucc4>;
+               };
+
+               mdio: mdio@3320 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0x3320 0x18>;
+                       compatible = "fsl,ucc-mdio";
+
+                       /* Piggy2 (UCC4, MDIO 0x00, RMII) */
+                       phy_piggy2: ethernet-phy@00 {
+                               reg = <0x0>;
+                               device_type = "ethernet-phy";
+                       };
+               };
+
+               qeic: interrupt-controller@80 {
+                       interrupt-controller;
+                       compatible = "fsl,qe-ic";
+                       #address-cells = <0>;
+                       #interrupt-cells = <1>;
+                       reg = <0x80 0x80>;
+                       big-endian;
+                       interrupts = <32 8 33 8>;
+                       interrupt-parent = <&ipic>;
+               };
+               bootcount@0x13ff8 {
+                       device_type = "bootcount";
+                       compatible = "u-boot,bootcount";
+                       reg = <0x13ff8 0x08>;
+               };
+
+               spi0: spi@4c0 {
+                       cell-index = <0>;
+                       compatible = "fsl,spi";
+                       reg = <0x4c0 0x40>;
+                       interrupts = <2>;
+                       interrupt-parent = <&qeic>;
+                       mode = "qe";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       pio-handle = <&pio_spi>;
+               };
+       };
+
+       localbus: localbus@e0005000 {
+               #address-cells = <2>;
+               #size-cells = <1>;
+               compatible = "fsl,mpc8321-localbus", "fsl,pq2pro-localbus",
+                            "simple-bus";
+               reg = <0xe0005000 0xd8>;
+       };
+};
+
+#include "km8321-uboot.dtsi"
diff --git a/arch/powerpc/dts/km836x-uboot.dtsi b/arch/powerpc/dts/km836x-uboot.dtsi
new file mode 100644 (file)
index 0000000..ac5339e
--- /dev/null
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * ABB PGGA km836x U-Boot specific Device Tree Source parts
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ *
+ */
+
+/ {
+       cpus {
+               u-boot,dm-pre-reloc;
+               PowerPC,8360@0 {
+                       u-boot,dm-pre-reloc;
+               };
+       };
+
+       chosen {
+               stdout-path = &serial0;
+       };
+};
+
+&qe {
+       compatible = "fsl,qe", "simple-bus";
+};
+
+&soc {
+       u-boot,dm-pre-reloc;
+
+       par_io@1400 {
+               u-boot,dm-pre-reloc;
+
+               serial_pin@0 {
+                       u-boot,dm-pre-reloc;
+               };
+               ucc_pin@0 {
+                       u-boot,dm-pre-reloc;
+               };
+               ucc_pin@1 {
+                       u-boot,dm-pre-reloc;
+               };
+               ucc_pin@3 {
+                       u-boot,dm-pre-reloc;
+               };
+               ucc_pin@4 {
+                       u-boot,dm-pre-reloc;
+               };
+               ucc_pin@5 {
+                       u-boot,dm-pre-reloc;
+               };
+               ucc_pin@6 {
+                       u-boot,dm-pre-reloc;
+               };
+               ucc_pin@7 {
+                       u-boot,dm-pre-reloc;
+               };
+       };
+};
+
+&serial0 {
+       u-boot,dm-pre-reloc;
+};
diff --git a/arch/powerpc/dts/km836x.dtsi b/arch/powerpc/dts/km836x.dtsi
new file mode 100644 (file)
index 0000000..a8c83fc
--- /dev/null
@@ -0,0 +1,182 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * ABB PGGA km836x common ports Device Tree Source
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ *
+ */
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               PowerPC,8360@0 {
+                       device_type = "cpu";
+                       reg = <0x0>;
+                       d-cache-line-size = <32>;       /* 32 bytes */
+                       i-cache-line-size = <32>;       /* 32 bytes */
+                       d-cache-size = <32768>; /* L1, 32K */
+                       i-cache-size = <32768>; /* L1, 32K */
+                       timebase-frequency = <0>; /* Filled in by U-Boot */
+                       bus-frequency = <0>; /* Filled in by U-Boot */
+                       clock-frequency = <0>; /* Filled in by U-Boot */
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0 0>;            /* Filled in by U-Boot */
+       };
+
+       soc: soc8360@e0000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               device_type = "soc";
+               compatible = "fsl,mpc8360-immr", "simple-bus";
+               ranges = <0x0 0xe0000000 0x00200000>;
+               reg = <0xe0000000 0x00000200>;
+               bus-frequency = <0>;/* Filled in by U-Boot */
+
+               /* power management control module*/
+               pmc: power@b00 {
+                       compatible = "fsl,mpc8360-pmc", "fsl,mpc8349-pmc";
+                       reg = <0xb00 0x100 0xa00 0x100>;
+                       interrupts = <80 0x8>;
+                       interrupt-parent = <&ipic>;
+               };
+
+               i2c0: i2c@3000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <0>;
+                       compatible = "fsl,mpc8313-i2c","fsl-i2c";
+                       reg = <0x3000 0x100>;
+                       interrupts = <14 0x8>;
+                       interrupt-parent = <&ipic>;
+                       clock-frequency = <100000>;
+               };
+
+               serial0: serial@4500 {
+                       cell-index = <0>;
+                       device_type = "serial";
+                       compatible = "fsl,ns16550", "ns16550";
+                       reg = <0x4500 0x100>;
+                       clock-frequency = <264000000>;
+                       interrupts = <9 0x8>;
+                       interrupt-parent = <&ipic>;
+                       status = "disabled";
+               };
+
+               serial1: serial@4600 {
+                       cell-index = <1>;
+                       device_type = "serial";
+                       compatible = "fsl,ns16550", "ns16550";
+                       reg = <0x4600 0x100>;
+                       clock-frequency = <133333333>;
+                       interrupts = <10 0x8>;
+                       interrupt-parent = <&ipic>;
+                       status = "disabled";
+               };
+
+               ipic: pic@700 {
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       compatible = "fsl,pq2pro-pic", "fsl,ipic";
+                       interrupt-controller;
+                       reg = <0x700 0x100>;
+               };
+
+               par_io: par_io@1400 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg = <0x1400 0x100>;
+                       ranges;
+                       compatible = "fsl,mpc8360-par_io";
+                       device_type = "par_io";
+                       num-ports = <7>;
+
+                       qe_pio_c: gpio-controller@30 {
+                               #gpio-cells = <2>;
+                               compatible = "fsl,mpc8360-qe-pario-bank",
+                                            "fsl,mpc8323-qe-pario-bank";
+                               reg = <0x1430 0x18>;
+                               gpio-controller;
+                       };
+               };
+
+               qe: qe@100000 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,qe";
+                       ranges = <0x0 0x100000 0x100000>;
+                       reg = <0x100000 0x480>;
+                       clock-frequency = <0>;  /* Filled in by U-Boot */
+                       brg-frequency = <0>;    /* Filled in by U-Boot */
+                       bus-frequency = <0>;    /* Filled in by U-Boot */
+
+                       muram@10000 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               compatible = "fsl,qe-muram", "fsl,cpm-muram";
+                               ranges = <0x0 0x00010000 0x0000c000>;
+
+                               data-only@0 {
+                                       compatible = "fsl,qe-muram-data",
+                                                    "fsl,cpm-muram-data";
+                                       reg = <0x0 0xc000>;
+                               };
+                       };
+
+                       qeic: interrupt-controller@80 {
+                               interrupt-controller;
+                               compatible = "fsl,qe-ic";
+                               #address-cells = <0>;
+                               #interrupt-cells = <1>;
+                               reg = <0x80 0x80>;
+                               big-endian;
+                               interrupts = <
+                                       32 0x8 /* ucc1 */
+                                       33 0x8 /* ucc2 */
+                                       34 0x8 /* ucc3 */
+                                       35 0x8 /* ucc4 */
+                                       40 0x8 /* ucc1 */
+                               >;
+                               interrupt-parent = <&ipic>;
+                       };
+
+                       spi0: spi@4c0 {
+                               cell-index = <0>;
+                               compatible = "fsl,spi";
+                               reg = <0x4c0 0x40>;
+                               interrupts = <2>;
+                               interrupt-parent = <&qeic>;
+                               mode = "qe";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               pio-handle = <&pio_spi>;
+                       };
+
+                       bootcount@0x1bff8 {
+                               device_type = "bootcount";
+                               compatible = "u-boot,bootcount";
+                               reg = <0x1bff8 0x08>;
+                       };
+               };
+       };
+
+       localbus: localbus@e0005000 {
+               #address-cells = <2>;
+               #size-cells = <1>;
+               compatible = "fsl,mpc8360-localbus", "fsl,pq2pro-localbus",
+                            "simple-bus";
+               reg = <0xe0005000 0xd8>;
+       };
+};
+
+#include "km836x-uboot.dtsi"
diff --git a/arch/powerpc/dts/kmcoge5ne-uboot.dtsi b/arch/powerpc/dts/kmcoge5ne-uboot.dtsi
new file mode 100644 (file)
index 0000000..6a5e74f
--- /dev/null
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * ABB PGGA kmcoge5ne U-Boot specific Device Tree Source parts
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ *
+ */
+
+/ {
+       aliases {
+               /delete-property/ ethernet1;
+               /delete-property/ ethernet2;
+       };
+};
+
+&enet_switch {
+       status = "disabled";
+};
+
+&enet_mate {
+       status = "disabled";
+};
diff --git a/arch/powerpc/dts/kmcoge5ne.dts b/arch/powerpc/dts/kmcoge5ne.dts
new file mode 100644 (file)
index 0000000..467e5bd
--- /dev/null
@@ -0,0 +1,320 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * ABB PGGA KMCOGE5ne Device Tree Source
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ *
+ */
+
+/dts-v1/;
+
+#include "km836x.dtsi"
+
+/ {
+       model = "kmcoge5ne";
+       compatible = "ABB,kmcoge5ne";
+
+       aliases {
+               ethernet0 = &enet_admin;
+               ethernet1 = &enet_mate;
+               ethernet2 = &enet_switch;
+               serial0 = &serial0;
+       };
+};
+
+&soc {
+       /* brg for hdlc clk */
+       brg@0 {
+               compatible = "fsl,mpc-brg";
+               brg-name = "brg16";
+               brg-frequency = <20000000>; /* 20 MHz */
+               pio-handle =  <&pio_brg>;
+       };
+};
+
+&i2c0 {
+       mux@70 {
+               compatible = "nxp,pca9547";
+               reg = <0x70>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               i2c@1 {
+                       reg = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       /* Inventory EEPROM of the unit itself */
+                       ivm@50 {
+                               label = "MAIN_CTRL";
+                               compatible = "dummy";
+                               reg = <0x50>;
+                       };
+               };
+
+               i2c@2 {
+                       reg = <2>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       /* Inventory EEPROM of the fan unit */
+                       fanu-ivm@50 {
+                               label = "FANUV";
+                               compatible = "dummy";
+                               reg = <0x50>;
+                       };
+
+                       /* fan unit (GPIOs and so on) */
+                       fanu@20 {
+                               label = "FANUV_CTRL";
+                               compatible = "dummy";
+                               reg = <0x20>;
+                       };
+               };
+
+               i2c@3 {
+                       reg = <3>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       backplane@50 {
+                               label = "BP_CTRL";
+                               compatible = "dummy";
+                               reg = <0x50>;
+                       };
+               };
+       };
+};
+
+&serial0 {
+       status = "okay";
+};
+
+&par_io {
+       pio_ucc1: ucc_pin@0 { /* RGMII mng-switch */
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       0   1  3  0  2  0       /* MDIO   (PA1,   bi, f2) */
+                       0   2  1  0  1  0       /* MDC    (PA2,   in, f1) */
+
+                       0   3  1  0  1  0       /* TxD0   (PA3,   in, f1) */
+                       0   4  1  0  1  0       /* TxD1   (PA4,   in, f1) */
+                       0   5  1  0  1  0       /* TxD2   (PA5,   in, f1) */
+                       0   6  1  0  1  0       /* TxD3   (PA6,   in, f1) */
+                       0   9  2  0  1  0       /* RxD0   (PA9,  out, f1) */
+                       0  10  2  0  1  0       /* RxD1   (PA10, out, f1) */
+                       0  11  2  0  1  0       /* RxD2   (PA11, out, f1) */
+                       0  12  2  0  1  0       /* RxD3   (PA12, out, f1) */
+                       0   7  1  0  1  0       /* TX_EN  (PA7,   in, f1) */
+                       0  15  2  0  1  0       /* RX_DV  (PA15, out, f1) */
+                       0   0  2  0  1  0       /* RX_CLK (PA0,  out, f1) */
+                       2   9  1  0  3  0       /* GTX_CLK        (CLK10) */
+                       2   8  2  0  1  0       /* GTX125          (CLK9) */
+               >;
+       };
+
+       pio_ucc4: ucc_pin@3 { /* RMII, admin front port */
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       0   1  3  0  2  0       /* MDIO   (PA1,   bi, f2) */
+                       0   2  1  0  1  0       /* MDC    (PA2,   in, f1) */
+
+                       1  14  1  0  1  0       /* TxD0   (PB14, out, f1) */
+                       1  15  1  0  1  0       /* TxD1   (PB15, out, f1) */
+                       1  20  2  0  1  0       /* RxD0   (PB20, in,  f1) */
+                       1  21  2  0  1  0       /* RxD1   (PB21, in,  f1) */
+                       1  18  1  0  1  0       /* TX_EN  (PB18, out, f1) */
+                       1  26  2  0  1  0       /* RX_DV  (PB26, in,  f1) */
+                       1  27  2  0  1  0       /* RX_ER  (PB27, in,  f1) */
+
+                       2  16  2  0  1  0       /* UCC4_RMII_CLK  (CLK17) */
+               >;
+       };
+
+       pio_ucc5: ucc_pin@4 { /* RMII, mate backplane port */
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       0   1  3  0  2  0       /* MDIO  (PA1,   bi, f2) */
+                       0   2  1  0  1  0       /* MDC   (PA2,   in, f1) */
+
+                       3   0  1  0  1  0       /* TxD0  (PD0,  out, f1) */
+                       3   1  1  0  1  0       /* TxD1  (PD1,  out, f1) */
+                       3   6  2  0  1  0       /* RxD0  (PD6,   in, f1) */
+                       3   7  2  0  1  0       /* RxD1  (PD7,   in, f1) */
+                       3   4  1  0  1  0       /* TX_EN (PD4,  out, f1) */
+                       3  12  2  0  1  0       /* RX_DV (PD12,  in, f1) */
+                       3  13  2  0  1  0       /* RX_ER (PD13,  in, f1) */
+
+                       2  15  2  0  1  0       /* UCCx_RMII_CLK  (CLK16) */
+               >;
+       };
+
+       pio_spi: spi_pin@01 {
+               pio-map = <
+                       /* port  pin  dir  open_drain  assignment  has_irq  */
+                       4  28  3  0  3  0       /* SPI_MOSI (PE28, out, f3) */
+                       4  29  3  0  3  0       /* SPI_MISO (PE29, out, f3) */
+                       4  30  3  0  3  0       /* SPI_CLK  (PE30, out, f3) */
+               >;
+       };
+
+       pio_brg: brg_pin@0 {
+               pio-map = <
+                       /* port  pin  dir  open_drain  assignment  has_irq  */
+                       2  25  1  0  1  0       /* BRG     (PC25, out, f1) */
+               >;
+       };
+
+       pio_tdm: tdm_pin@00 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       /* TDMa */
+                       0  8  3  0  2  0        /* RxD0    (PA8,  bi, f2) */
+                       0  13 3  0  2  0        /* TxD0    (PA13, bi, f2) */
+                       0  14 2  0  2  0        /* RSync0  (PA14, in, f2) */
+                       2  7  2  0  1  0        /* RxClk8  (PC7,  in, f1) */
+                       /* TDMb */
+                       0  27 3  0  2  0        /* RxD1    (PA27, bi, f2) */
+                       0  22 3  0  2  0        /* TxD1    (PA22, bi, f2) */
+                       0  28 2  0  2  0        /* RSync1  (PA28, in, f2) */
+                       2  1  2  0  1  0        /* RxClk2  (PC1,  in, f1) */
+                       /* TDMc */
+                       1  5  3  0  2  0        /* RxD2    (PB5,  bi, f2) */
+                       1  8  3  0  2  0        /* TxD2    (PB8,  bi, f2) */
+                       1  2  2  0  3  0        /* RSync2  (PB2,  in, f3) */
+                       2  6  2  0  1  0        /* RxClk7  (PC6,  in, f1) */
+                       /* TDMd */
+                       1  22 3  0  2  0        /* RxD3    (PB22, bi, f2) */
+                       1  19 3  0  1  0        /* TxD3    (PB19, bi, f1) */
+                       1  16 2  0  2  0        /* RSync3  (PB16, in, f2) */
+                       2  13 2  0  1  0        /* RxClk14 (PC13, in, f1) */
+                       /* TDMe */
+                       3  8  3  0  2  0        /* RxD4    (PD8,  bi, f2) */
+                       3  5  3  0  2  0        /* TxD4    (PD5,  bi, f2) */
+                       3  2  2  0  2  0        /* RSync4  (PD2 , in, f2) */
+                       2  22 2  0  1  0        /* RxClk23 (PC22, in, f1) */
+                       /* TDMf */
+                       3  19 3  0  2  0        /* RxD5    (PD19, bi, f2) */
+                       3  22 3  0  2  0        /* TxD5    (PD22, bi, f2) */
+                       3  16 2  0  1  0        /* RSync5  (PD16, in, f1) */
+                       2  17 2  0  1  0        /* RxClk18 (PC17, in, f1) */
+                       /* TDMg */
+                       4  8  3  0  2  0        /* RxD6    (PE8,  bi, f2) */
+                       4  5  3  0  2  0        /* TxD6    (PE5,  bi, f2) */
+                       4  2  2  0  1  0        /* RSync6  (PE2,  in, f1) */
+                       2  19 2  0  1  0        /* RxClk20 (PC19, in, f1) */
+                       /* TDMh */
+                       4  19 3  0  2  0        /* RxD7    (PE19, bi, f2) */
+                       4  22 3  0  3  0        /* TxD7    (PE22, bi, f3) */
+                       4  16 2  0  2  0        /* RSync7  (PE16, in, f2) */
+                       2  21 2  0  1  0        /* RxClk22 (PC21, in, f1) */
+                       /* RxTxClk0/1 */
+                       2  0  2  0  1  0        /* Clk1    (PC0,  in, f1) */
+                       2  23 2  0  1  0        /* Clk24   (PC23, in, f1) */
+                       /* RxTxSync0/1 */
+                       2  10 2  0  1  0        /* Clk11   (PC10, in, f1) */
+                       2  20 2  0  1  0>;      /* Clk21   (PC20, in, f1) */
+       };
+};
+
+&qe {
+       /* mng-switch port (UCC1, MDIO 0x10, RGMII) */
+       enet_switch: ethernet@2000 {
+               device_type = "network";
+               compatible = "ucc_geth";
+               cell-index = <1>;
+               reg = <0x2000 0x200>;
+               interrupts = <32>;
+               interrupt-parent = <&qeic>;
+               local-mac-address = [ 00 00 00 00 00 00 ];
+               rx-clock-name = "none";
+               tx-clock-name = "clk9";
+               /*id=0, full-dup, 1G, no-pause, no-asym_p*/
+               fixed-link = <0 1 1000 0 0>;
+               phy-connection-type = "rgmii-id";
+               pio-handle = <&pio_ucc1>;
+       };
+
+       /* admin and debug port (UCC4, MDIO 0x00, RMII) */
+       enet_admin: ucc@3200 {
+               device_type = "network";
+               compatible = "ucc_geth";
+               cell-index = <4>;
+               reg = <0x3200 0x200>;
+               interrupts = <35>;
+               interrupt-parent = <&qeic>;
+               local-mac-address = [ 00 00 00 00 00 00 ];
+               rx-clock-name = "none";
+               tx-clock-name = "clk17";
+               phy-handle = <&phy_admin>;
+               phy-connection-type = "rmii";
+               pio-handle = <&pio_ucc4>;
+       };
+
+       /* mate backplane port (UCC5, MDIO 0x08, RMII) */
+       enet_mate: ucc@2400 {
+               device_type = "network";
+               compatible = "ucc_geth";
+               cell-index = <5>;
+               reg = <0x2400 0x200>;
+               interrupts = <40>;
+               interrupt-parent = <&qeic>;
+               local-mac-address = [ 00 00 00 00 00 00 ];
+               rx-clock-name = "none";
+               tx-clock-name = "clk16";
+               phy-handle = <&phy_mate>;
+               phy-connection-type = "rmii";
+               pio-handle = <&pio_ucc5>;
+       };
+
+       mdio@3320 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               reg = <0x3320 0x18>;
+               compatible = "fsl,ucc-mdio";
+
+               /* admin front port (UCC4, MDIO 0x00, RMII) */
+               phy_admin: ethernet-phy@00 {
+                       reg = <0x0>;
+               };
+
+               /* mate bp port (UCC5, MDIO 0x08, RMII) */
+               phy_mate: ethernet-phy@08 {
+                       reg = <0x08>;
+               };
+       };
+};
+
+&localbus {
+       ranges = <0 0 0xf0000000 0x04000000
+                  1 0 0xe8000000 0x01000000
+                  3 0 0xa0000000 0x10000000
+                  4 0 0xb0000000 0x10000000>;
+
+       flash@0,0 {
+               compatible = "cfi-flash";
+               reg = <0 0 0x04000000>;
+               nornand = "nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               bank-width = <2>;
+               partition@0 { /* 768KB */
+                       label = "u-boot";
+                       reg = <0 0xC0000>;
+               };
+               partition@c0000 { /* 128KB */
+                       label = "env";
+                       reg = <0xC0000 0x20000>;
+               };
+               partition@e0000 { /* 128KB */
+                       label = "envred";
+                       reg = <0xE0000 0x20000>;
+               };
+               partition@100000 { /* 64512KB */
+                       label = "ubi0";
+                       reg = <0x100000 0x3F00000>;
+               };
+       };
+};
+
+#include "kmcoge5ne-uboot.dtsi"
diff --git a/arch/powerpc/dts/kmeter1-uboot.dtsi b/arch/powerpc/dts/kmeter1-uboot.dtsi
new file mode 100644 (file)
index 0000000..898fa7d
--- /dev/null
@@ -0,0 +1,42 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * ABB PGGA kmeter1 U-Boot specific Device Tree Source parts
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ *
+ */
+
+/ {
+       aliases {
+               /delete-property/ ethernet1;
+               /delete-property/ ethernet2;
+               /delete-property/ ethernet3;
+               /delete-property/ ethernet4;
+               /delete-property/ ethernet5;
+               /delete-property/ ethernet6;
+       };
+};
+
+&enet_estar1 {
+       status = "disabled";
+};
+
+&enet_estar2 {
+       status = "disabled";
+};
+
+&enet_eth1 {
+       status = "disabled";
+};
+
+&enet_eth2 {
+       status = "disabled";
+};
+
+&enet_eth3 {
+       status = "disabled";
+};
+
+&enet_eth4 {
+       status = "disabled";
+};
diff --git a/arch/powerpc/dts/kmeter1.dts b/arch/powerpc/dts/kmeter1.dts
new file mode 100644 (file)
index 0000000..f1f7995
--- /dev/null
@@ -0,0 +1,480 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * ABB PGGA KMETER1 Device Tree Source
+ *
+ * 2008-2011 DENX Software Engineering GmbH
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ */
+
+/dts-v1/;
+
+#include "km836x.dtsi"
+
+/ {
+       model = "KMETER1";
+       compatible = "ABB,KMETER1";
+
+       aliases {
+               ethernet0 = &enet_piggy2;
+               ethernet1 = &enet_estar1;
+               ethernet2 = &enet_estar2;
+               ethernet3 = &enet_eth1;
+               ethernet4 = &enet_eth2;
+               ethernet5 = &enet_eth3;
+               ethernet6 = &enet_eth4;
+               serial0 = &serial0;
+       };
+};
+
+&i2c0 {
+       mux@70 {
+               compatible = "nxp,pca9547";
+               reg = <0x70>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               i2c@1 {
+                       reg = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       /* Inventory EEPROM of the unit itself */
+                       ivm@50 {
+                               label = "MAIN_CTRL";
+                               compatible = "dummy";
+                               reg = <0x50>;
+                       };
+               };
+
+               i2c@2 {
+                       reg = <2>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       /* Temperature sensors */
+                       temp@48 {
+                               label = "Top";
+                               compatible = "national,lm75";
+                               reg = <0x48>;
+                       };
+
+                       temp@49 {
+                               label = "Control";
+                               compatible = "national,lm75";
+                               reg = <0x49>;
+                       };
+
+                       temp@4a {
+                               label = "Power";
+                               compatible = "national,lm75";
+                               reg = <0x4a>;
+                       };
+
+                       temp@4b {
+                               label = "Front";
+                               compatible = "national,lm75";
+                               reg = <0x4b>;
+                       };
+               };
+       };
+};
+
+&serial0 {
+       status = "okay";
+};
+
+&par_io {
+       pio_ucc1: ucc_pin@0 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       0   1  3  0  2  0       /* MDIO   */
+                       0   2  1  0  1  0       /* MDC    */
+
+                       0   3  1  0  1  0       /* TxD0   */
+                       0   4  1  0  1  0       /* TxD1   */
+                       0   5  1  0  1  0       /* TxD2   */
+                       0   6  1  0  1  0       /* TxD3   */
+                       0   9  2  0  1  0       /* RxD0   */
+                       0  10  2  0  1  0       /* RxD1   */
+                       0  11  2  0  1  0       /* RxD2   */
+                       0  12  2  0  1  0       /* RxD3   */
+                       0   7  1  0  1  0       /* TX_EN  */
+                       0   8  1  0  1  0       /* TX_ER  */
+                       0  15  2  0  1  0       /* RX_DV  */
+                       0  16  2  0  1  0       /* RX_ER  */
+                       0   0  2  0  1  0       /* RX_CLK */
+                       2   9  1  0  3  0       /* GTX_CLK - CLK10 */
+                       2   8  2  0  1  0       /* GTX125  - CLK9  */
+               >;
+       };
+
+       pio_ucc2: ucc_pin@1 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       0   1  3  0  2  0       /* MDIO   */
+                       0   2  1  0  1  0       /* MDC    */
+
+                       0  17  1  0  1  0       /* TxD0   */
+                       0  18  1  0  1  0       /* TxD1   */
+                       0  19  1  0  1  0       /* TxD2   */
+                       0  20  1  0  1  0       /* TxD3   */
+                       0  23  2  0  1  0       /* RxD0   */
+                       0  24  2  0  1  0       /* RxD1   */
+                       0  25  2  0  1  0       /* RxD2   */
+                       0  26  2  0  1  0       /* RxD3   */
+                       0  21  1  0  1  0       /* TX_EN  */
+                       0  22  1  0  1  0       /* TX_ER  */
+                       0  29  2  0  1  0       /* RX_DV  */
+                       0  30  2  0  1  0       /* RX_ER  */
+                       0  31  2  0  1  0       /* RX_CLK */
+                       2  2   1  0  2  0       /* GTX_CLK - CLK3  */
+                       2  3   2  0  1  0       /* GTX125  - CLK4  */
+               >;
+       };
+
+       pio_ucc4: ucc_pin@3 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       0   1  3  0  2  0       /* MDIO */
+                       0   2  1  0  1  0       /* MDC  */
+
+                       1  14  1  0  1  0       /* TxD0   (PB14, out, f1) */
+                       1  15  1  0  1  0       /* TxD1   (PB15, out, f1) */
+                       1  20  2  0  1  0       /* RxD0   (PB20, in,  f1) */
+                       1  21  2  0  1  0       /* RxD1   (PB21, in,  f1) */
+                       1  18  1  0  1  0       /* TX_EN  (PB18, out, f1) */
+                       1  26  2  0  1  0       /* RX_DV  (PB26, in,  f1) */
+                       1  27  2  0  1  0       /* RX_ER  (PB27, in,  f1) */
+
+                       2  16  2  0  1  0       /* UCC4_RMII_CLK (CLK17) */
+               >;
+       };
+
+       pio_ucc5: ucc_pin@4 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       0   1  3  0  2  0       /* MDIO */
+                       0   2  1  0  1  0       /* MDC  */
+
+                       3   0  1  0  1  0       /* TxD0  (PD0,  out, f1) */
+                       3   1  1  0  1  0       /* TxD1  (PD1,  out, f1) */
+                       3   6  2  0  1  0       /* RxD0  (PD6,   in, f1) */
+                       3   7  2  0  1  0       /* RxD1  (PD7,   in, f1) */
+                       3   4  1  0  1  0       /* TX_EN (PD4,  out, f1) */
+                       3  12  2  0  1  0       /* RX_DV (PD12,  in, f1) */
+                       3  13  2  0  1  0       /* RX_ER (PD13,  in, f1) */
+               >;
+       };
+
+       pio_ucc6: ucc_pin@5 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       0   1  3  0  2  0       /* MDIO */
+                       0   2  1  0  1  0       /* MDC  */
+
+                       3  14  1  0  1  0       /* TxD0   (PD14, out, f1) */
+                       3  15  1  0  1  0       /* TxD1   (PD15, out, f1) */
+                       3  20  2  0  1  0       /* RxD0   (PD20, in,  f1) */
+                       3  21  2  0  1  0       /* RxD1   (PD21, in,  f1) */
+                       3  18  1  0  1  0       /* TX_EN  (PD18, out, f1) */
+                       3  26  2  0  1  0       /* RX_DV  (PD26, in,  f1) */
+                       3  27  2  0  1  0       /* RX_ER  (PD27, in,  f1) */
+               >;
+       };
+
+       pio_ucc7: ucc_pin@6 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       0   1  3  0  2  0       /* MDIO */
+                       0   2  1  0  1  0       /* MDC  */
+
+                       4   0  1  0  1  0       /* TxD0   (PE0,  out, f1) */
+                       4   1  1  0  1  0       /* TxD1   (PE1,  out, f1) */
+                       4   6  2  0  1  0       /* RxD0   (PE6,   in, f1) */
+                       4   7  2  0  1  0       /* RxD1   (PE7,   in, f1) */
+                       4   4  1  0  1  0       /* TX_EN  (PE4,  out, f1) */
+                       4  12  2  0  1  0       /* RX_DV  (PE12,  in, f1) */
+                       4  13  2  0  1  0       /* RX_ER  (PE13,  in, f1) */
+               >;
+       };
+
+       pio_ucc8: ucc_pin@7 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       0   1  3  0  2  0       /* MDIO */
+                       0   2  1  0  1  0       /* MDC  */
+
+                       4  14  1  0  2  0       /* TxD0   (PE14, out, f2) */
+                       4  15  1  0  1  0       /* TxD1   (PE15, out, f1) */
+                       4  20  2  0  1  0       /* RxD0   (PE20, in,  f1) */
+                       4  21  2  0  1  0       /* RxD1   (PE21, in,  f1) */
+                       4  18  1  0  1  0       /* TX_EN  (PE18, out, f1) */
+                       4  26  2  0  1  0       /* RX_DV  (PE26, in,  f1) */
+                       4  27  2  0  1  0       /* RX_ER  (PE27, in,  f1) */
+
+                       2  15  2  0  1  0       /* UCCx_RMII_CLK (CLK16) */
+               >;
+       };
+
+       pio_spi: spi_pin@01 {
+               pio-map = <
+                       /* port  pin  dir  open_drain  assignment  has_irq  */
+                       4  28  3  0  3  0       /* SPI_MOSI (PE28, out, f3  */
+                       4  30  3  0  3  0       /* SPI_CLK  (PE30, out, f3  */
+               >;
+       };
+
+       /* UCC3 as HDLC controller for ICN */
+       pio5: ucc_pin@02 {
+               pio-map = <
+                       /* port  pin  dir  open_drain  assignment  has_irq */
+                       1   0  1  0  1  0   /* TxD0 */
+                       1   6  2  0  1  0   /* RxD0 */
+                       1  12  2  0  1  0   /* CTS */
+                       2  11  2  0  1  0   /* TX-CLK12 */
+               >;
+       };
+
+       pio_tdm: tdm_pin@00 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       /* TDMa */
+                       0  8  3  0  2  0        /* RxD0    (PA8,  bi, f2) */
+                       0  13 3  0  2  0        /* TxD0    (PA13, bi, f2) */
+                       0  14 2  0  2  0        /* RSync0  (PA14, in, f2) */
+                       2  7  2  0  1  0        /* RxClk8  (PC7,  in, f1) */
+                       /* TDMb */
+                       0  27 3  0  2  0        /* RxD1    (PA27, bi, f2) */
+                       0  22 3  0  2  0        /* TxD1    (PA22, bi, f2) */
+                       0  28 2  0  2  0        /* RSync1  (PA28, in, f2) */
+                       2  1  2  0  1  0        /* RxClk2  (PC1,  in, f1) */
+                       /* TDMc */
+                       1  5  3  0  2  0        /* RxD2    (PB5,  bi, f2) */
+                       1  8  3  0  2  0        /* TxD2    (PB8,  bi, f2) */
+                       1  2  2  0  3  0        /* RSync2  (PB2,  in, f3) */
+                       2  6  2  0  1  0        /* RxClk7  (PC6,  in, f1) */
+                       /* TDMd */
+                       1  22 3  0  2  0        /* RxD3    (PB22, bi, f2) */
+                       1  19 3  0  1  0        /* TxD3    (PB19, bi, f1) */
+                       1  16 2  0  2  0        /* RSync3  (PB16, in, f2) */
+                       2  13 2  0  1  0        /* RxClk14 (PC13, in, f1) */
+                       /* TDMe */
+                       3  8  3  0  2  0        /* RxD4    (PD8,  bi, f2) */
+                       3  5  3  0  2  0        /* TxD4    (PD5,  bi, f2) */
+                       3  2  2  0  2  0        /* RSync4  (PD2 , in, f2) */
+                       2  22 2  0  1  0        /* RxClk23 (PC22, in, f1) */
+                       /* TDMf */
+                       3  19 3  0  2  0        /* RxD5    (PD19, bi, f2) */
+                       3  22 3  0  2  0        /* TxD5    (PD22, bi, f2) */
+                       3  16 2  0  1  0        /* RSync5  (PD16, in, f1) */
+                       2  17 2  0  1  0        /* RxClk18 (PC17, in, f1) */
+                       /* TDMg */
+                       4  8  3  0  2  0        /* RxD6    (PE8,  bi, f2) */
+                       4  5  3  0  2  0        /* TxD6    (PE5,  bi, f2) */
+                       4  2  2  0  1  0        /* RSync6  (PE2,  in, f1) */
+                       2  19 2  0  1  0        /* RxClk20 (PC19, in, f1) */
+                       /* TDMh */
+                       4  19 3  0  2  0        /* RxD7    (PE19, bi, f2) */
+                       4  22 3  0  3  0        /* TxD7    (PE22, bi, f3) */
+                       4  16 2  0  2  0        /* RSync7  (PE16, in, f2) */
+                       2  21 2  0  1  0        /* RxClk22 (PC21, in, f1) */
+                       /* RxTxClk0/1 */
+                       2  0  2  0  1  0        /* Clk1    (PC0,  in, f1) */
+                       2  23 2  0  1  0        /* Clk24   (PC23, in, f1) */
+                       /* RxTxSync0/1 */
+                       2  10 2  0  1  0        /* Clk11   (PC10, in, f1) */
+                       2  20 2  0  1  0>;      /* Clk21   (PC20, in, f1) */
+       };
+};
+
+&qe {
+       /* ESTAR-1 (UCC1, MDIO 0x10, RGMII) */
+       enet_estar1: ucc@2000 {
+               device_type = "network";
+               compatible = "ucc_geth";
+               cell-index = <1>;
+               reg = <0x2000 0x200>;
+               interrupts = <32>;
+               interrupt-parent = <&qeic>;
+               local-mac-address = [ 00 00 00 00 00 00 ];
+               rx-clock-name = "none";
+               tx-clock-name = "clk9";
+               phy-handle = <&phy_estar1>;
+               phy-connection-type = "rgmii-id";
+               pio-handle = <&pio_ucc1>;
+       };
+
+       /* ESTAR-2 (UCC2, MDIO 0x11, RGMII) */
+       enet_estar2: ucc@3000 {
+               device_type = "network";
+               compatible = "ucc_geth";
+               cell-index = <2>;
+               reg = <0x3000 0x200>;
+               interrupts = <33>;
+               interrupt-parent = <&qeic>;
+               local-mac-address = [ 00 00 00 00 00 00 ];
+               rx-clock-name = "none";
+               tx-clock-name = "clk4";
+               phy-handle = <&phy_estar2>;
+               phy-connection-type = "rgmii-id";
+               pio-handle = <&pio_ucc2>;
+       };
+
+       /* Piggy2 (UCC4, MDIO 0x00, RMII) */
+       enet_piggy2: ucc@3200 {
+               device_type = "network";
+               compatible = "ucc_geth";
+               cell-index = <4>;
+               reg = <0x3200 0x200>;
+               interrupts = <35>;
+               interrupt-parent = <&qeic>;
+               local-mac-address = [ 00 00 00 00 00 00 ];
+               rx-clock-name = "none";
+               tx-clock-name = "clk17";
+               phy-handle = <&phy_piggy2>;
+               phy-connection-type = "rmii";
+               pio-handle = <&pio_ucc4>;
+       };
+
+       /* Eth-1 (UCC5, MDIO 0x08, RMII) */
+       enet_eth1: ucc@2400 {
+               device_type = "network";
+               compatible = "ucc_geth";
+               cell-index = <5>;
+               reg = <0x2400 0x200>;
+               interrupts = <40>;
+               interrupt-parent = <&qeic>;
+               local-mac-address = [ 00 00 00 00 00 00 ];
+               rx-clock-name = "none";
+               tx-clock-name = "clk16";
+               phy-handle = <&phy_eth1>;
+               phy-connection-type = "rmii";
+               pio-handle = <&pio_ucc5>;
+       };
+
+       /* Eth-2 (UCC6, MDIO 0x09, RMII) */
+       enet_eth2: ucc@3400 {
+               device_type = "network";
+               compatible = "ucc_geth";
+               cell-index = <6>;
+               reg = <0x3400 0x200>;
+               interrupts = <41>;
+               interrupt-parent = <&qeic>;
+               local-mac-address = [ 00 00 00 00 00 00 ];
+               rx-clock-name = "none";
+               tx-clock-name = "clk16";
+               phy-handle = <&phy_eth2>;
+               phy-connection-type = "rmii";
+               pio-handle = <&pio_ucc6>;
+       };
+
+       /* Eth-3 (UCC7, MDIO 0x0a, RMII) */
+       enet_eth3: ucc@2600 {
+               device_type = "network";
+               compatible = "ucc_geth";
+               cell-index = <7>;
+               reg = <0x2600 0x200>;
+               interrupts = <42>;
+               interrupt-parent = <&qeic>;
+               local-mac-address = [ 00 00 00 00 00 00 ];
+               rx-clock-name = "none";
+               tx-clock-name = "clk16";
+               phy-handle = <&phy_eth3>;
+               phy-connection-type = "rmii";
+               pio-handle = <&pio_ucc7>;
+       };
+
+       /* Eth-4 (UCC8, MDIO 0x0b, RMII) */
+       enet_eth4: ucc@3600 {
+               device_type = "network";
+               compatible = "ucc_geth";
+               cell-index = <8>;
+               reg = <0x3600 0x200>;
+               interrupts = <43>;
+               interrupt-parent = <&qeic>;
+               local-mac-address = [ 00 00 00 00 00 00 ];
+               rx-clock-name = "none";
+               tx-clock-name = "clk16";
+               phy-handle = <&phy_eth4>;
+               phy-connection-type = "rmii";
+               pio-handle = <&pio_ucc8>;
+       };
+
+       mdio@3320 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               reg = <0x3320 0x18>;
+               compatible = "fsl,ucc-mdio";
+
+               /* Piggy2 (UCC4, MDIO 0x00, RMII) */
+               phy_piggy2: ethernet-phy@0 {
+                       reg = <0x0>;
+               };
+
+               /* Eth-1 (UCC5, MDIO 0x08, RMII) */
+               phy_eth1: ethernet-phy@8 {
+                       reg = <0x08>;
+               };
+
+               /* Eth-2 (UCC6, MDIO 0x09, RMII) */
+               phy_eth2: ethernet-phy@9 {
+                       reg = <0x09>;
+               };
+
+               /* Eth-3 (UCC7, MDIO 0x0a, RMII) */
+               phy_eth3: ethernet-phy@a {
+                       reg = <0x0a>;
+               };
+
+               /* Eth-4 (UCC8, MDIO 0x0b, RMII) */
+               phy_eth4: ethernet-phy@b {
+                       reg = <0x0b>;
+               };
+
+               /* ESTAR-1 (UCC1, MDIO 0x10, RGMII) */
+               phy_estar1: ethernet-phy@10 {
+                       interrupt-parent = <&ipic>;
+                       interrupts = <17 0x8>;
+                       reg = <0x10>;
+               };
+
+               /* ESTAR-2 (UCC2, MDIO 0x11, RGMII) */
+               phy_estar2: ethernet-phy@11 {
+                       interrupt-parent = <&ipic>;
+                       interrupts = <18 0x8>;
+                       reg = <0x11>;
+               };
+       };
+};
+
+&localbus {
+       ranges = <0 0 0xf0000000 0x04000000     /* LB 0 */
+                 1 0 0xe8000000 0x01000000     /* LB 1 */
+                 3 0 0xa0000000 0x10000000>;   /* LB 3 */
+
+       flash@0,0 {
+               compatible = "cfi-flash";
+               reg = <0 0 0x04000000>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               bank-width = <2>;
+               partition@0 { /* 768KB */
+                       label = "u-boot";
+                       reg = <0 0xC0000>;
+               };
+               partition@c0000 { /* 128KB */
+                       label = "env";
+                       reg = <0xC0000 0x20000>;
+               };
+               partition@e0000 { /* 128KB */
+                       label = "envred";
+                       reg = <0xE0000 0x20000>;
+               };
+               partition@100000 { /* 64512KB */
+                       label = "ubi0";
+                       reg = <0x100000 0x3F00000>;
+               };
+       };
+};
+
+#include "kmeter1-uboot.dtsi"
diff --git a/arch/powerpc/dts/kmopti2.dts b/arch/powerpc/dts/kmopti2.dts
new file mode 100644 (file)
index 0000000..23e3187
--- /dev/null
@@ -0,0 +1,161 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * ABB PGGA OPTI2 Device Tree Source
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ *
+ */
+
+/dts-v1/;
+
+#include "km8321.dtsi"
+
+/ {
+       model = "KMOPTI2";
+       compatible = "ABB,kmpbec8321";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       aliases {
+               ethernet0 = &enet_piggy2;
+               serial0 = &serial0;
+       };
+};
+
+&i2c0 {
+       mux@70 {
+               compatible = "nxp,pca9547";
+               reg = <0x70>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               i2c@1 {
+                       reg = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       /* Inventory EEPROM of the unit itself */
+                       ivm@50 {
+                               label = "MAIN_CTRL";
+                               compatible = "dummy";
+                               reg = <0x50>;
+                       };
+               };
+
+               i2c@2 {
+                       reg = <2>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       /* Temperature sensors */
+                       temp@49 {
+                               label = "board";
+                               compatible = "national,lm75";
+                               reg = <0x49>;
+                       };
+
+                       temp@4a {
+                               label = "power";
+                               compatible = "national,lm75";
+                               reg = <0x4a>;
+                       };
+               };
+
+               i2c@6 {
+                       reg = <6>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
+               i2c@5 {
+                       reg = <5>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
+               i2c@4 {
+                       reg = <4>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
+               i2c@3 {
+                       reg = <3>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+       };
+};
+
+&par_io {
+       /* UCC5 as HDLC controller for ICN */
+       pio_ucc5: ucc_pin@04 {
+               pio-map = <
+                       /* port  pin  dir  open_drain  assignment  has_irq */
+                       2   0  1  0  2  0 /* TxD0 */
+                       2   8  2  0  2  0 /* RxD0 */
+                       2  29  2  0  2  0 /* CTS */
+                       3  30  2  0  1  0 /* ICN CLK */
+                       >;
+       };
+
+       /* UCC4 Piggy Ethernet */
+       pio_ucc4: ucc_pin@03 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       3   4  3  0  2  0 /* MDIO */
+                       3   5  1  0  2  0 /* MDC  */
+
+                       1 18  1  0  1  0 /* TxD0 */
+                       1 19  1  0  1  0 /* TxD1 */
+                       1 22  2  0  1  0 /* RxD0 */
+                       1 23  2  0  1  0 /* RxD1 */
+                       1 26  2  0  1  0 /* RX_ER */
+                       1 28  2  0  1  0 /* RX_DV */
+                       1 30  1  0  1  0 /* TX_EN */
+                       1 31  2  0  1  0 /* CRS */
+                       3 10  2  0  3  0 /* UCC4_RMII_CLK (CLK17) */
+               >;
+       };
+
+       pio_spi: spi_pin@01 {
+               pio-map = <
+                       /* port  pin  dir  open_drain  assignment  has_irq  */
+                       3  0  3  0  1  0 /* SPI_MOSI (PD0, bi, f3)  */
+                       3  1  3  0  1  0 /* SPI_MISO (PD1, bi, f3)  */
+                       3  2  3  0  1  0 /* SPI_CLK  (PD2, bi, f3)  */
+               >;
+       };
+};
+
+&localbus {
+       ranges = <0 0 0xf0000000 0x04000000 /* LB 0 Flash (boot) */
+               1 0 0xe8000000 0x01000000 /* LB 1 PRIO1 and Piggy */
+               2 0 0xa0000000 0x10000000 /* LB 2 PAXE */
+               3 0 0xb0000000 0x10000000>; /* LB 3 OPI2 */
+
+       flash@0,0 {
+               compatible = "cfi-flash";
+               reg = <0 0x00000000 0x04000000>;
+               bank-width = <2>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               use-advanced-sector-protection;
+               partition@0 { /* 768KB */
+                       label = "u-boot";
+                       reg = <0 0xC0000>;
+               };
+               partition@c0000 { /* 128KB */
+                       label = "env";
+                       reg = <0xc0000 0x20000>;
+               };
+               partition@e0000 { /* 128KB */
+                       label = "envred";
+                       reg = <0xe0000 0x20000>;
+               };
+               partition@100000 { /* 64512KB */
+                       label = "ubi0";
+                       reg = <0x100000 0x3F00000>;
+               };
+       };
+};
diff --git a/arch/powerpc/dts/kmsupc5.dts b/arch/powerpc/dts/kmsupc5.dts
new file mode 100644 (file)
index 0000000..60ca0d3
--- /dev/null
@@ -0,0 +1,139 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * ABB PGGA SUPC5 Device Tree Source
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ *
+ */
+
+/dts-v1/;
+
+#include "km8321.dtsi"
+
+/ {
+       model = "SUPC5";
+       compatible = "ABB,kmpbec8321";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       aliases {
+               ethernet0 = &enet_piggy2;
+               serial0 = &serial0;
+       };
+};
+
+&i2c0 {
+       mux@70 {
+               compatible = "nxp,pca9547";
+               reg = <0x70>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               i2c@1 {
+                       reg = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       /* Inventory EEPROM of the unit itself */
+                       ivm@50 {
+                               label = "MAIN_CTRL";
+                               compatible = "dummy";
+                               reg = <0x50>;
+                       };
+               };
+
+               i2c@2 {
+                       reg = <2>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       /* Temperature sensors */
+                       temp@49 {
+                               label = "board";
+                               compatible = "national,lm75";
+                               reg = <0x49>;
+                       };
+               };
+       };
+};
+
+&par_io {
+       /* UCC5 as HDLC controller for ICN */
+       pio_ucc5: ucc_pin@04 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       2   0  1  0  2  0       /* TxD0 */
+                       2   8  2  0  2  0       /* RxD0 */
+                       2  29  2  0  2  0       /* CTS */
+                       3  30  2  0  1  0       /* ICN CLK */
+                       >;
+       };
+
+       /* UCC4 Piggy Ethernet */
+       pio_ucc4: ucc_pin@03 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       3   4  3  0  2  0       /* MDIO */
+                       3   5  1  0  2  0       /* MDC  */
+
+                       1 18  1  0  1  0        /* TxD0 */
+                       1 19  1  0  1  0        /* TxD1 */
+                       1 22  2  0  1  0        /* RxD0 */
+                       1 23  2  0  1  0        /* RxD1 */
+                       1 26  2  0  1  0        /* RX_ER */
+                       1 28  2  0  1  0        /* RX_DV */
+                       1 30  1  0  1  0        /* TX_EN */
+                       1 31  2  0  1  0        /* CRS */
+                       /* UCC4_RMII_CLK (CLK17) */
+                       3 10  2  0  3  0
+               >;
+       };
+
+       pio_spi: spi_pin@01 {
+               pio-map = <
+                       /*
+                        * port  pin  dir  open_drain  assignment  has_irq
+                        * SPI_MOSI (PD0, bi, f3)
+                        */
+                       3  0  3  0  1  0
+                       /* SPI_MISO (PD1, bi, f3) */
+                       3  1  3  0  1  0
+                       /* SPI_CLK  (PD2, bi, f3) */
+                       3  2  3  0  1  0
+               >;
+       };
+};
+
+&spi0 {
+       pio-handle = <&pio_spi>;
+};
+
+&localbus {
+       ranges = <0 0 0xf0000000 0x04000000     /* LB 0 Flash (boot) */
+                 1 0 0xe8000000 0x01000000     /* LB 1 PRIO1 and Piggy */
+                 2 0 0xa0000000 0x10000000>;   /* LB 2 LPXF */
+
+       flash@0,0 {
+               compatible = "cfi-flash";
+               reg = <0 0x00000000 0x04000000>;
+               bank-width = <2>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               partition@0 { /* 768KB */
+                       label = "u-boot";
+                       reg = <0 0xC0000>;
+               };
+               partition@c0000 { /* 128KB */
+                       label = "env";
+                       reg = <0xc0000 0x20000>;
+               };
+               partition@e0000 { /* 128KB */
+                       label = "envred";
+                       reg = <0xe0000 0x20000>;
+               };
+               partition@100000 { /* 64512KB */
+                       label = "ubi0";
+                       reg = <0x100000 0x3F00000>;
+               };
+       };
+};
diff --git a/arch/powerpc/dts/kmsupm5.dts b/arch/powerpc/dts/kmsupm5.dts
new file mode 100644 (file)
index 0000000..1cd11c3
--- /dev/null
@@ -0,0 +1,129 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * ABB PGGA SUPM5 Device Tree Source
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ *
+ */
+
+/dts-v1/;
+
+#include "km8321.dtsi"
+
+/ {
+       model = "SUPM5";
+       compatible = "ABB,kmpbec8321";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       aliases {
+               ethernet0 = &enet_piggy2;
+               serial0 = &serial0;
+       };
+};
+
+&i2c0 {
+       mux@70 {
+               compatible = "nxp,pca9547";
+               reg = <0x70>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               i2c@1 {
+                       reg = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       /* Inventory EEPROM of the unit itself */
+                       ivm@50 {
+                               label = "MAIN_CTRL";
+                               compatible = "dummy";
+                               reg = <0x50>;
+                       };
+               };
+
+               i2c@2 {
+                       reg = <2>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       /* Temperature sensors */
+                       temp@49 {
+                               label = "board";
+                               compatible = "national,lm75";
+                               reg = <0x49>;
+                       };
+               };
+       };
+};
+
+&par_io {
+       /* UCC5 as HDLC controller for ICN */
+       pio_ucc5: ucc_pin@04 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       2   0  1  0  2  0       /* TxD0 */
+                       2   8  2  0  2  0       /* RxD0 */
+                       2  29  2  0  2  0       /* CTS */
+                       3  30  2  0  1  0       /* ICN CLK */
+                       >;
+       };
+
+       /* UCC4 Piggy Ethernet */
+       pio_ucc4: ucc_pin@03 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       3   4  3  0  2  0       /* MDIO */
+                       3   5  1  0  2  0       /* MDC  */
+
+                       1 18  1  0  1  0        /* TxD0 */
+                       1 19  1  0  1  0        /* TxD1 */
+                       1 22  2  0  1  0        /* RxD0 */
+                       1 23  2  0  1  0        /* RxD1 */
+                       1 26  2  0  1  0        /* RX_ER */
+                       1 28  2  0  1  0        /* RX_DV */
+                       1 30  1  0  1  0        /* TX_EN */
+                       1 31  2  0  1  0        /* CRS */
+                       3 10  2  0  3  0 /* UCC4_RMII_CLK (CLK17) */
+               >;
+       };
+
+       pio_spi: spi_pin@01 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       3  0  3  0  1  0 /* SPI_MOSI (PD0, bi, f3)  */
+                       3  1  3  0  1  0 /* SPI_MISO (PD1, bi, f3)  */
+                       3  2  3  0  1  0 /* SPI_CLK  (PD2, bi, f3)  */
+               >;
+       };
+};
+
+&localbus {
+       ranges = <0 0 0xf0000000 0x04000000     /* LB 0 Flash (boot) */
+                 1 0 0xe8000000 0x01000000     /* LB 1 PRIO1 and Piggy */
+                 2 0 0xa0000000 0x10000000>;   /* LB 2 LPXF */
+
+       flash@0,0 {
+               compatible = "cfi-flash";
+               reg = <0 0x00000000 0x04000000>;
+               bank-width = <2>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               partition@0 { /* 768KB */
+                       label = "u-boot";
+                       reg = <0 0xC0000>;
+               };
+               partition@c0000 { /* 128KB */
+                       label = "env";
+                       reg = <0xc0000 0x20000>;
+               };
+               partition@e0000 { /* 128KB */
+                       label = "envred";
+                       reg = <0xe0000 0x20000>;
+               };
+               partition@100000 { /* 64512KB */
+                       label = "ubi0";
+                       reg = <0x100000 0x3F00000>;
+               };
+       };
+};
diff --git a/arch/powerpc/dts/kmtegr1.dts b/arch/powerpc/dts/kmtegr1.dts
new file mode 100644 (file)
index 0000000..c9b21cf
--- /dev/null
@@ -0,0 +1,392 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * ABB PGGA TEGR1 Device Tree Source
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ *
+ */
+
+/dts-v1/;
+
+/ {
+       model = "KMTEGR1";
+       compatible = "ABB,kmpbec8309";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       aliases {
+               ethernet0 = &enet_zynq;
+               ethernet1 = &enet_piggy2;
+               serial0 = &serial0;
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               PowerPC,8309@0 {
+                       device_type = "cpu";
+                       reg = <0x0>;
+                       d-cache-line-size = <32>;       // 32 bytes
+                       i-cache-line-size = <32>;       // 32 bytes
+                       d-cache-size = <16384>;         // L1, 16K
+                       i-cache-size = <16384>;         // L1, 16K
+                       timebase-frequency = <66000000>;
+                       bus-frequency = <264000000>;
+                       clock-frequency = <264000000>;
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0x00000000 0x10000000>;
+       };
+
+       soc: soc8309@e0000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               device_type = "soc";
+               compatible = "simple-bus";
+               ranges = <0x0 0xe0000000 0x00100000>;
+               reg = <0xe0000000 0x00000200>;
+               bus-frequency = <264000000>;
+
+               i2c@3000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       cell-index = <0>;
+                       compatible = "fsl,mpc8313-i2c","fsl-i2c";
+                       reg = <0x3000 0x100>;
+                       interrupts = <14 0x8>;
+                       interrupt-parent = <&ipic>;
+                       clock-frequency = <400000>;
+
+                       mux@70 {
+                               compatible = "nxp,pca9547";
+                               reg = <0x70>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               i2c@1 {
+                                       reg = <1>;
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                                       /*
+                                        * Inventory EEPROM of the
+                                        * unit itself
+                                        */
+                                       ivm@50 {
+                                               label = "MAIN_CTRL";
+                                               compatible = "dummy";
+                                               reg = <0x50>;
+                                       };
+                               };
+
+                               i2c@2 {
+                                       reg = <2>;
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                                       /* Temperature sensors */
+                                       temp@48 {
+                                               label = "front";
+                                               compatible = "national,lm75";
+                                               reg = <0x48>;
+                                       };
+
+                                       temp@49 {
+                                               label = "board";
+                                               compatible = "national,lm75";
+                                               reg = <0x49>;
+                                       };
+
+                                       temp@4a {
+                                               label = "power";
+                                               compatible = "national,lm75";
+                                               reg = <0x4a>;
+                                       };
+
+                                       temp@4b {
+                                               label = "bottom";
+                                               compatible = "national,lm75";
+                                               reg = <0x4b>;
+                                       };
+                               };
+
+                               i2c@6 {
+                                       reg = <6>;
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                               };
+
+                               i2c@5 {
+                                       reg = <5>;
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                               };
+
+                               i2c@7 {
+                                       reg = <7>;
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                               };
+
+                               i2c@3 {
+                                       reg = <3>;
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                               };
+                       };
+               };
+
+               serial0: serial@4500 {
+                       cell-index = <0>;
+                       device_type = "serial";
+                       compatible = "fsl,ns16550", "ns16550";
+                       reg = <0x4500 0x100>;
+                       clock-frequency = <264000000>;
+                       interrupts = <9 0x8>;
+                       interrupt-parent = <&ipic>;
+               };
+
+               dma@82a8 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,mpc8309-dma", "fsl,elo-dma";
+                       reg = <0x82a8 4>;
+                       ranges = <0 0x8100 0x1a8>;
+                       interrupt-parent = <&ipic>;
+                       interrupts = <71 8>;
+                       cell-index = <0>;
+                       dma-channel@0 {
+                               compatible = "fsl,mpc8309-dma-channel",
+                                               "fsl,elo-dma-channel";
+                               reg = <0 0x80>;
+                               interrupt-parent = <&ipic>;
+                               interrupts = <71 8>;
+                       };
+                       dma-channel@80 {
+                               compatible = "fsl,mpc8309-dma-channel",
+                                               "fsl,elo-dma-channel";
+                               reg = <0x80 0x80>;
+                               interrupt-parent = <&ipic>;
+                               interrupts = <71 8>;
+                       };
+                       dma-channel@100 {
+                               compatible = "fsl,mpc8309-dma-channel",
+                                               "fsl,elo-dma-channel";
+                               reg = <0x100 0x80>;
+                               interrupt-parent = <&ipic>;
+                               interrupts = <71 8>;
+                       };
+                       dma-channel@180 {
+                               compatible = "fsl,mpc8309-dma-channel",
+                                               "fsl,elo-dma-channel";
+                               reg = <0x180 0x28>;
+                               interrupt-parent = <&ipic>;
+                               interrupts = <71 8>;
+                       };
+               };
+
+               ipic: pic@700 {
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       compatible = "fsl,pq2pro-pic", "fsl,ipic";
+                       interrupt-controller;
+                       reg = <0x700 0x100>;
+                       device_type = "ipic";
+               };
+
+               gpio1: gpio-controller@c00 {
+                       #gpio-cells = <2>;
+                       compatible = "fsl,mpc8309-gpio", "fsl,mpc8349-gpio";
+                       reg = <0xc00 0x100>;
+                       interrupts = <75 0x8>;
+                       interrupt-parent = <&ipic>;
+                       gpio-controller;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio2: gpio-controller@d00 {
+                       #gpio-cells = <2>;
+                       compatible = "fsl,mpc8309-gpio", "fsl,mpc8349-gpio";
+                       reg = <0xd00 0x100>;
+                       interrupts = <75 0x8>;
+                       interrupt-parent = <&ipic>;
+                       gpio-controller;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               spi@7000 {
+                       cell-index = <0>;
+                       compatible = "fsl,spi";
+                       reg = <0x7000 0x1000>;
+                       interrupts = <16 0x8>;
+                       interrupt-parent = <&ipic>;
+                       mode = "cpu";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       /* GPIO_15 chipselect for ZYNQ flash */
+                       gpios = <&gpio1 15 0>;
+
+                       zynq_flash@0 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               compatible = "spansion,m25p80";
+                               reg = <0>;
+                               spi-max-frequency = <4000000>;
+                               m25p,fast-read;
+                               partition@0 {
+                                       label = "bootloader";
+                                       reg = <0x0 0x01000000>;
+                               };
+                       };
+               };
+       };
+
+       qe: qe@e0100000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               device_type = "qe";
+               compatible = "fsl,qe";
+               ranges = <0x0 0xe0100000 0x00100000>;
+               reg = <0xe0100000 0x480>;
+               brg-frequency = <0>;
+               bus-frequency = <396000000>;
+               fsl,qe-num-snums = <32>;
+
+               muram@10000 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,qe-muram", "fsl,cpm-muram";
+                       ranges = <0x0 0x00010000 0x00004000>;
+
+                       data-only@0 {
+                               compatible = "fsl,qe-muram-data",
+                                            "fsl,cpm-muram-data";
+                               reg = <0x0 0x4000>;
+                       };
+               };
+
+               /* ZYNQ (UCC1, MDIO 0x10, MII) */
+               enet_zynq: ethernet@2000 {
+                       device_type = "network";
+                       compatible = "ucc_geth";
+                       cell-index = <1>;
+                       reg = <0x2000 0x200>;
+                       interrupts = <32>;
+                       interrupt-parent = <&qeic>;
+                       local-mac-address = [ 00 00 00 00 00 00 ];
+                       /*id=0, full-dup, 100M, no-pause, no-asym_p*/
+                       fixed-link = <0 1 100 0 0>;
+                       rx-clock-name = "clk9";
+                       tx-clock-name = "clk10";
+                       phy-connection-type = "mii";
+               };
+
+               /* Piggy2 (UCC3, MDIO 0x00, RMII) */
+               enet_piggy2: ucc@2200 {
+                       device_type = "network";
+                       compatible = "ucc_geth";
+                       cell-index = <3>;
+                       reg = <0x2200 0x200>;
+                       interrupts = <34>;
+                       interrupt-parent = <&qeic>;
+                       local-mac-address = [ 00 00 00 00 00 00 ];
+                       rx-clock-name = "none";
+                       tx-clock-name = "clk12";
+                       phy-handle = <&phy_piggy2>;
+                       phy-connection-type = "rmii";
+               };
+
+               mdio@2320 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0x2320 0x38>;
+                       compatible = "fsl,ucc-mdio";
+
+                       /* Piggy2 (UCC3, MDIO 0x00, RMII) */
+                       phy_piggy2: ethernet-phy@0 {
+                               reg = <0x0>;
+                               device_type = "ethernet-phy";
+                       };
+
+                       /* Explicitly set the tbi-phy to a non-zero address
+                        * so that it does not conflict with phy_piggy2 that
+                        * is unfortunately at address 0
+                        */
+                       tbi1: tbi-phy@1 {
+                               reg = <0x1>;
+                               device_type = "tbi-phy";
+                       };
+               };
+
+               qeic: interrupt-controller@80 {
+                       interrupt-controller;
+                       compatible = "fsl,qe-ic";
+                       #address-cells = <0>;
+                       #interrupt-cells = <1>;
+                       reg = <0x80 0x80>;
+                       big-endian;
+                       interrupts = <32 8 33 8>;
+                       interrupt-parent = <&ipic>;
+               };
+               bootcount@0x13ff8 {
+                       device_type = "bootcount";
+                       compatible = "u-boot,bootcount";
+                       reg = <0x13ff8 0x08>;
+               };
+
+       };
+       localbus@e0005000 {
+               #address-cells = <2>;
+               #size-cells = <1>;
+               compatible = "fsl,mpc8309-localbus", "fsl,pq2pro-localbus",
+                            "simple-bus";
+               reg = <0xe0005000 0xd8>;
+               ranges = <0 0 0xf0000000 0x04000000
+                       1 0 0xe8000000 0x01000000
+                       2 0 0xe0000000 0x10000000
+                       3 0 0xb0000000 0x10000000>;
+
+               flash@0,0 {
+                       compatible = "cfi-flash";
+                       reg = <0 0x00000000 0x04000000>;
+                       bank-width = <2>;
+                       nornand = "nor";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       use-advanced-sector-protection;
+                       partition@0 { /* 768KB */
+                               label = "u-boot";
+                               reg = <0 0xc0000>;
+                       };
+                       partition@c0000 { /* 256KB */
+                               label = "qe-fw";
+                               reg = <0xc0000 0x40000>;
+                       };
+                       partition@100000 { /* 128KB */
+                               label = "env";
+                               reg = <0x100000 0x20000>;
+                       };
+                       partition@120000 { /* 128KB */
+                               label = "envred";
+                               reg = <0x120000 0x20000>;
+                       };
+                       partition@140000 { /* 64256KB */
+                               label = "ubi0";
+                               reg = <0x140000 0x3EC0000>;
+                       };
+               };
+       };
+};
+
+#include "km8309-uboot.dtsi"
diff --git a/arch/powerpc/dts/kmtepr2.dts b/arch/powerpc/dts/kmtepr2.dts
new file mode 100644 (file)
index 0000000..5a272ec
--- /dev/null
@@ -0,0 +1,142 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * ABB PGGA TEPR2 Device Tree Source
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ *
+ */
+
+/dts-v1/;
+
+#include "km8321.dtsi"
+
+/ {
+       model = "KMTEPR2";
+       compatible = "ABB,kmpbec8321";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       aliases {
+               ethernet0 = &enet_piggy2;
+               serial0 = &serial0;
+       };
+};
+
+&i2c0 {
+       mux@70 {
+               compatible = "nxp,pca9547";
+               reg = <0x70>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               i2c@1 {
+                       reg = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       /* Inventory EEPROM of the unit itself */
+                       ivm@50 {
+                               label = "MAIN_CTRL";
+                               compatible = "dummy";
+                               reg = <0x50>;
+                       };
+               };
+
+               i2c@2 {
+                       reg = <2>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       /* Temperature sensors */
+                       temp@49 {
+                               label = "board";
+                               compatible = "national,lm75";
+                               reg = <0x49>;
+                       };
+
+                       temp@4a {
+                               label = "power";
+                               compatible = "national,lm75";
+                               reg = <0x4a>;
+                       };
+               };
+       };
+};
+
+&par_io {
+       /* UCC5 as HDLC controller for ICN */
+       pio_ucc5: ucc_pin@04 {
+               pio-map = <
+                       /* port  pin  dir  open_drain  assignment  has_irq */
+                       2   0  1  0  2  0   /* TxD0 */
+                       2   8  2  0  2  0   /* RxD0 */
+                       2  29  2  0  2  0   /* CTS */
+                       3  30  2  0  1  0   /* ICN CLK */
+                       >;
+       };
+
+       /* UCC4 Piggy Ethernet */
+       pio_ucc4: ucc_pin@03 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       3   4  3  0  2  0       /* MDIO */
+                       3   5  1  0  2  0       /* MDC  */
+
+                       1 18  1  0  1  0        /* TxD0 */
+                       1 19  1  0  1  0        /* TxD1 */
+                       1 22  2  0  1  0        /* RxD0 */
+                       1 23  2  0  1  0        /* RxD1 */
+                       1 26  2  0  1  0        /* RX_ER */
+                       1 28  2  0  1  0        /* RX_DV */
+                       1 30  1  0  1  0        /* TX_EN */
+                       1 31  2  0  1  0        /* CRS */
+                       3 10  2  0  3  0        /* UCC4_RMII_CLK (CLK17) */
+               >;
+       };
+
+       pio_spi: spi_pin@01 {
+               pio-map = <
+                       /*
+                        *port pin dir open_drain assignment has_irq
+                        * SPI_MOSI (PD0, bi, f3)
+                        */
+                       3  0  3  0  1  0
+                       /* SPI_MISO (PD1, bi, f3) */
+                       3  1  3  0  1  0
+                       /* SPI_CLK  (PD2, bi, f3) */
+                       3  2  3  0  1  0
+               >;
+       };
+};
+
+&localbus {
+       ranges = <0 0 0xf0000000 0x04000000 /* LB 0 Flash (boot) */
+               1 0 0xe8000000 0x01000000 /* LB 1 PRIO1 and Piggy */
+               2 0 0xa0000000 0x10000000 /* LB 2 NVSRAM */
+               3 0 0xb0000000 0x10000000>; /* LB 3 TEP2 */
+
+       flash@0,0 {
+               compatible = "cfi-flash";
+               reg = <0 0x00000000 0x04000000>;
+               bank-width = <2>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               use-advanced-sector-protection;
+               partition@0 { /* 768KB */
+                       label = "u-boot";
+                       reg = <0 0xC0000>;
+               };
+               partition@c0000 { /* 128KB */
+                       label = "env";
+                       reg = <0xc0000 0x20000>;
+               };
+               partition@e0000 { /* 128KB */
+                       label = "envred";
+                       reg = <0xe0000 0x20000>;
+               };
+               partition@100000 { /* 64512KB */
+                       label = "ubi0";
+                       reg = <0x100000 0x3F00000>;
+               };
+       };
+};
diff --git a/arch/powerpc/dts/kmtuge1.dts b/arch/powerpc/dts/kmtuge1.dts
new file mode 100644 (file)
index 0000000..8a7b5a4
--- /dev/null
@@ -0,0 +1,100 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * ABB PGGA TUGE1 Device Tree Source
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ *
+ */
+
+/dts-v1/;
+
+#include "km8321.dtsi"
+
+/ {
+       model = "TUGE1";
+       compatible = "ABB,kmpbec8321";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       aliases {
+               ethernet0 = &enet_piggy2;
+               serial0 = &serial0;
+       };
+};
+
+&par_io {
+       /* UCC5 as HDLC controller for ICN */
+       pio_ucc5: ucc_pin@04 {
+               pio-map = <
+                       /* port  pin  dir  open_drain  assignment  has_irq */
+                       2   0  1  0  2  0   /* TxD0 */
+                       2   8  2  0  2  0   /* RxD0 */
+                       2  29  2  0  2  0   /* CTS */
+                       3  30  2  0  1  0   /* ICN CLK */
+                       >;
+       };
+
+       /* UCC4 Piggy Ethernet */
+       pio_ucc4: ucc_pin@03 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       3   4  3  0  2  0       /* MDIO */
+                       3   5  1  0  2  0       /* MDC  */
+
+                       1 18  1  0  1  0        /* TxD0 */
+                       1 19  1  0  1  0        /* TxD1 */
+                       1 22  2  0  1  0        /* RxD0 */
+                       1 23  2  0  1  0        /* RxD1 */
+                       1 26  2  0  1  0        /* RX_ER */
+                       1 28  2  0  1  0        /* RX_DV */
+                       1 30  1  0  1  0        /* TX_EN */
+                       1 31  2  0  1  0        /* CRS */
+                       3  10  2  0  3  0 /* UCC4_RMII_CLK (CLK17) */
+               >;
+       };
+
+       pio_spi: spi_pin@01 {
+               pio-map = <
+                       /*
+                        *port pin dir open_drain assignment has_irq
+                        * SPI_MOSI (PD0, bi, f3)
+                        */
+                       3  0  3  0  1  0
+                       /* SPI_MISO (PD1, bi, f3) */
+                       3  1  3  0  1  0
+                       /* SPI_CLK  (PD2, bi, f3) */
+                       3  2  3  0  1  0
+               >;
+       };
+};
+
+&localbus {
+       ranges = <0 0 0xf0000000 0x04000000     /* LB 0 Flash (boot) */
+                 1 0 0xe8000000 0x01000000     /* LB 1 PRIO1 and Piggy */
+                 2 0 0xa0000000 0x10000000>;   /* LB 2 PAXI */
+
+       flash@0,0 {
+               compatible = "cfi-flash";
+               reg = <0 0x00000000 0x04000000>;
+               bank-width = <2>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+
+               partition@0 { /* 768KB */
+                       label = "u-boot";
+                       reg = <0 0xC0000>;
+               };
+               partition@c0000 { /* 128KB */
+                       label = "env";
+                       reg = <0xc0000 0x20000>;
+               };
+               partition@e0000 { /* 128KB */
+                       label = "envred";
+                       reg = <0xe0000 0x20000>;
+               };
+               partition@100000 { /* 64512KB */
+                       label = "ubi0";
+                       reg = <0x100000 0x3F00000>;
+               };
+       };
+};
diff --git a/arch/powerpc/dts/kmtuxa1.dts b/arch/powerpc/dts/kmtuxa1.dts
new file mode 100644 (file)
index 0000000..c2681c5
--- /dev/null
@@ -0,0 +1,100 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * ABB PGGA TUXA1 Device Tree Source
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ *
+ */
+
+/dts-v1/;
+
+#include "km8321.dtsi"
+
+/ {
+       model = "TUXA1";
+       compatible = "ABB,kmpbec8321";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       aliases {
+               ethernet0 = &enet_piggy2;
+               serial0 = &serial0;
+       };
+};
+
+&par_io {
+       /* UCC5 as HDLC controller for ICN */
+       pio_ucc5: ucc_pin@04 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       2   0  1  0  2  0   /* TxD0 */
+                       2   8  2  0  2  0   /* RxD0 */
+                       2  29  2  0  2  0   /* CTS */
+                       3  30  2  0  1  0   /* ICN CLK */
+               >;
+       };
+
+       /* UCC4 Piggy Ethernet */
+       pio_ucc4: ucc_pin@03 {
+               pio-map = <
+                       /* port pin dir open_drain assignment has_irq */
+                       3   4  3  0  2  0       /* MDIO */
+                       3   5  1  0  2  0       /* MDC  */
+
+                       1 18  1  0  1  0        /* TxD0 */
+                       1 19  1  0  1  0        /* TxD1 */
+                       1 22  2  0  1  0        /* RxD0 */
+                       1 23  2  0  1  0        /* RxD1 */
+                       1 26  2  0  1  0        /* RX_ER */
+                       1 28  2  0  1  0        /* RX_DV */
+                       1 30  1  0  1  0        /* TX_EN */
+                       1 31  2  0  1  0        /* CRS */
+                       3 10  2  0  3  0 /* UCC4_RMII_CLK (CLK17) */
+               >;
+       };
+
+       pio_spi: spi_pin@01 {
+               pio-map = <
+                       /*
+                        *port  pin  dir  open_drain  assignment  has_irq
+                        * SPI_MOSI (PD0, bi, f3)
+                        */
+                       3  0  3  0  1  0
+                       /* SPI_MISO (PD1, bi, f3) */
+                       3  1  3  0  1  0
+                       /* SPI_CLK  (PD2, bi, f3) */
+                       3  2  3  0  1  0
+               >;
+       };
+};
+
+&localbus {
+       ranges = <0 0 0xf0000000 0x04000000     /* LB 0 Flash (boot) */
+                 1 0 0xe8000000 0x01000000     /* LB 1 PRIO1 and Piggy */
+                 2 0 0xa0000000 0x10000000     /* LB 2 LPXF */
+                 3 0 0xb0000000 0x10000000>;   /* LB 3 PINC2 */
+
+       flash@0,0 {
+               compatible = "cfi-flash";
+               reg = <0 0x00000000 0x04000000>;
+               bank-width = <2>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               partition@0 { /* 768KB */
+                       label = "u-boot";
+                       reg = <0 0xC0000>;
+               };
+               partition@c0000 { /* 128KB */
+                       label = "env";
+                       reg = <0xc0000 0x20000>;
+               };
+               partition@e0000 { /* 128KB */
+                       label = "envred";
+                       reg = <0xe0000 0x20000>;
+               };
+               partition@100000 { /* 64512KB */
+                       label = "ubi0";
+                       reg = <0x100000 0x3F00000>;
+               };
+       };
+};
index c66c492..360d254 100644 (file)
@@ -15,3 +15,4 @@
 };
 
 /include/ "p1010si-post.dtsi"
+/include/ "p1010rdb.dtsi"
index b943de7..062086a 100644 (file)
@@ -15,3 +15,4 @@
 };
 
 /include/ "p1010si-post.dtsi"
+/include/ "p1010rdb.dtsi"
index 4f58ee2..c2aecde 100644 (file)
@@ -4,11 +4,78 @@
  *
  * Copyright 2020 NXP
  */
+/ {
+       aliases {
+               spi0 = &espi0;
+       };
+};
+
 &soc {
+       mdio@24000 {
+               phy0: ethernet-phy@0 {
+                       reg = <0x1>;
+               };
+
+               phy1: ethernet-phy@1 {
+                       reg = <0x0>;
+               };
+
+               phy2: ethernet-phy@2 {
+                       reg = <0x2>;
+               };
+
+               tbi-phy@3 {
+                       device_type = "tbi-phy";
+                       reg = <0x3>;
+               };
+       };
+
+       mdio@25000 {
+               tbi0: tbi-phy@11 {
+                       reg = <0x11>;
+                       device_type = "tbi-phy";
+               };
+       };
+
+       mdio@26000 {
+               tbi1: tbi-phy@11 {
+                       reg = <0x11>;
+                       device_type = "tbi-phy";
+               };
+       };
+
+       enet0: ethernet@b0000 {
+               phy-handle = <&phy0>;
+               phy-connection-type = "rgmii-id";
+       };
+
+       enet1: ethernet@b1000 {
+               phy-handle = <&phy1>;
+               tbi-handle = <&tbi0>;
+               phy-connection-type = "sgmii";
+       };
+
+       enet2: ethernet@b2000 {
+               phy-handle = <&phy2>;
+               tbi-handle = <&tbi1>;
+               phy-connection-type = "sgmii";
+       };
+
        i2c@3000 {
                rtc@68 {
                        compatible = "pericom,pt7c4338";
                        reg = <0x68>;
                };
        };
+
+       spi@7000 {
+               status = "okay";
+               flash@0 {
+                       compatible = "jedec,spi-nor";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg = <0>;
+                       spi-max-frequency = <10000000>; /* input clock */
+               };
+       };
 };
index 0289441..2e7eb0e 100644 (file)
                single-cpu-affinity;
                last-interrupt-source = <255>;
        };
+
+       espi0: spi@7000 {
+               compatible = "fsl,mpc8536-espi";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               reg = <0x7000 0x1000>;
+               fsl,espi-num-chipselects = <1>;
+               status = "disabled";
+       };
+
 /include/ "pq3-i2c-0.dtsi"
 /include/ "pq3-i2c-1.dtsi"
+
+/include/ "pq3-etsec2-0.dtsi"
+       enet0: ethernet@b0000 {
+               queue-group@b0000 {
+                       fsl,rx-bit-map = <0xff>;
+                       fsl,tx-bit-map = <0xff>;
+               };
+       };
+
+/include/ "pq3-etsec2-1.dtsi"
+       enet1: ethernet@b1000 {
+               queue-group@b1000 {
+                       fsl,rx-bit-map = <0xff>;
+                       fsl,tx-bit-map = <0xff>;
+               };
+       };
+
+/include/ "pq3-etsec2-2.dtsi"
+       enet2: ethernet@b2000 {
+               queue-group@b2000 {
+                       fsl,rx-bit-map = <0xff>;
+                       fsl,tx-bit-map = <0xff>;
+               };
+
+       };
 };
 
 /* controller at 0x9000 */
index 1dce8e8..03b6886 100644 (file)
                clock-frequency = <0>;
        };
 
-       /include/ "pq3-i2c-0.dtsi"
-       /include/ "pq3-i2c-1.dtsi"
+       espi0: spi@7000 {
+               compatible = "fsl,mpc8536-espi";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               reg = <0x7000 0x1000>;
+               fsl,espi-num-chipselects = <4>;
+               status = "disabled";
+       };
+
+/include/ "pq3-i2c-0.dtsi"
+/include/ "pq3-i2c-1.dtsi"
+
+/include/ "pq3-etsec2-0.dtsi"
+       enet0: enet0_grp2: ethernet@b0000 {
+       };
+
+/include/ "pq3-etsec2-1.dtsi"
+       enet1: enet1_grp2: ethernet@b1000 {
+       };
+
+/include/ "pq3-etsec2-2.dtsi"
+       enet2: enet2_grp2: ethernet@b2000 {
+       };
 };
 
+/include/ "pq3-etsec2-grp2-0.dtsi"
+/include/ "pq3-etsec2-grp2-1.dtsi"
+/include/ "pq3-etsec2-grp2-2.dtsi"
+
 /* PCIe controller base address 0x9000 */
 &pci1 {
        compatible = "fsl,pcie-p1_p2", "fsl,pcie-fsl-qoriq";
index 7ebaa61..ab42325 100644 (file)
                ranges = <0x01000000 0x0 0x00000000 0x0 0xffc00000 0x0 0x00010000   /* downstream I/O */
                          0x02000000 0x0 0x80000000 0x0 0x80000000 0x0 0x20000000>; /* non-prefetchable memory */
        };
+
+       aliases {
+               spi0 = &espi0;
+       };
 };
 
+/include/ "p1020rdb-pc.dtsi"
 /include/ "p1020-post.dtsi"
+
+&espi0 {
+       status = "okay";
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+               spi-max-frequency = <10000000>; /* input clock */
+       };
+};
diff --git a/arch/powerpc/dts/p1020rdb-pc.dtsi b/arch/powerpc/dts/p1020rdb-pc.dtsi
new file mode 100644 (file)
index 0000000..6bf424f
--- /dev/null
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * P1020 RDB-PC Device Tree Source stub (no addresses or top-level ranges)
+ *
+ * Copyright 2012 Freescale Semiconductor Inc.
+ * Copyright 2020 NXP
+ */
+
+&soc {
+       mdio@24000 {
+               phy0: ethernet-phy@0 {
+                       interrupt-parent = <&mpic>;
+                       interrupts = <3 1 0 0>;
+                       reg = <0x0>;
+               };
+
+               phy1: ethernet-phy@1 {
+                       interrupt-parent = <&mpic>;
+                       interrupts = <2 1 0 0>;
+                       reg = <0x1>;
+               };
+
+               tbi0: tbi-phy@11 {
+                       device_type = "tbi-phy";
+                       reg = <0x11>;
+               };
+       };
+
+       mdio@25000 {
+               tbi1: tbi-phy@11 {
+                       reg = <0x11>;
+                       device_type = "tbi-phy";
+               };
+       };
+
+       enet0: ethernet@b0000 {
+               phy-connection-type = "rgmii-id";
+               fixed-link {
+                       speed = <1000>;
+                       full-duplex;
+               };
+
+       };
+
+       enet1: ethernet@b1000 {
+               phy-handle = <&phy0>;
+               tbi-handle = <&tbi1>;
+               phy-connection-type = "sgmii";
+       };
+
+       enet2: ethernet@b2000 {
+               phy-handle = <&phy1>;
+               phy-connection-type = "rgmii-id";
+       };
+};
index c0e5ef4..708f9a9 100644 (file)
                ranges = <0x01000000 0x0 0x00000000 0xf 0xffc00000 0x0 0x00010000   /* downstream I/O */
                          0x02000000 0x0 0x80000000 0xc 0x00000000 0x0 0x20000000>; /* non-prefetchable memory */
        };
+
+       aliases {
+               spi0 = &espi0;
+       };
 };
 
+/include/ "p1020rdb-pc.dtsi"
 /include/ "p1020-post.dtsi"
+
+&espi0 {
+       status = "okay";
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+               spi-max-frequency = <10000000>; /* input clock */
+       };
+};
index 21174a0..b05f3de 100644 (file)
 
        soc: soc@ffe00000 {
                ranges = <0x0 0x0 0xffe00000 0x100000>;
+
+               mdio@24000 {
+                       phy0: ethernet-phy@0 {
+                               interrupts = <3 1 0 0>;
+                               reg = <0x0>;
+                       };
+
+                       phy1: ethernet-phy@1 {
+                               interrupts = <2 1 0 0>;
+                               reg = <0x1>;
+                       };
+               };
+
+               mdio@25000 {
+                       tbi1: tbi-phy@11 {
+                               reg = <0x11>;
+                               device_type = "tbi-phy";
+                       };
+               };
+
+               mdio@26000 {
+                       tbi2: tbi-phy@11 {
+                               reg = <0x11>;
+                               device_type = "tbi-phy";
+                       };
+               };
+
+               enet0: ethernet@b0000 {
+                       phy-connection-type = "rgmii-id";
+                       fixed-link {
+                               speed = <1000>;
+                               full-duplex;
+                       };
+               };
+
+               enet1: ethernet@b1000 {
+                       phy-handle = <&phy0>;
+                       tbi-handle = <&tbi1>;
+                       phy-connection-type = "sgmii";
+               };
+
+               enet2: ethernet@b2000 {
+                       phy-handle = <&phy1>;
+                       phy-connection-type = "rgmii-id";
+               };
        };
 
        pci1: pcie@ffe09000 {
                ranges = <0x01000000 0x0 0x00000000 0x0 0xffc00000 0x0 0x00010000   /* downstream I/O */
                          0x02000000 0x0 0x80000000 0x0 0x80000000 0x0 0x20000000>; /* non-prefetchable memory */
        };
+
+       aliases {
+               spi0 = &espi0;
+       };
 };
 
 /include/ "p1020-post.dtsi"
+
+&espi0 {
+       status = "okay";
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+               spi-max-frequency = <10000000>; /* input clock */
+       };
+};
index 4ed093d..6d46f7d 100644 (file)
                clock-frequency = <0>;
        };
 
-       /include/ "pq3-i2c-0.dtsi"
-       /include/ "pq3-i2c-1.dtsi"
+       espi0: spi@7000 {
+               compatible = "fsl,mpc8536-espi";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               reg = <0x7000 0x1000>;
+               fsl,espi-num-chipselects = <4>;
+               status = "disabled";
+       };
+
+/include/ "pq3-i2c-0.dtsi"
+/include/ "pq3-i2c-1.dtsi"
+
+/include/ "pq3-etsec1-0.dtsi"
+/include/ "pq3-etsec1-1.dtsi"
+/include/ "pq3-etsec1-2.dtsi"
 };
 
 /* PCIe controller base address 0x8000 */
index 08befd4..b37931a 100644 (file)
                ranges = <0x01000000 0x0 0x00000000 0x0 0xffc00000 0x0 0x00010000   /* downstream I/O */
                          0x02000000 0x0 0x80000000 0x0 0x80000000 0x0 0x20000000>; /* non-prefetchable memory */
        };
+
+       aliases {
+               spi0 = &espi0;
+       };
 };
 
+/include/ "p2020rdb-pc.dtsi"
 /include/ "p2020-post.dtsi"
+
+&espi0 {
+       status = "okay";
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+               spi-max-frequency = <10000000>; /* input clock */
+       };
+};
diff --git a/arch/powerpc/dts/p2020rdb-pc.dtsi b/arch/powerpc/dts/p2020rdb-pc.dtsi
new file mode 100644 (file)
index 0000000..0d2acc7
--- /dev/null
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * P2020 RDB-PC Device Tree Source stub (no addresses or top-level ranges)
+ *
+ * Copyright 2011 Freescale Semiconductor Inc.
+ * Copyright 2020 NXP
+ */
+
+&soc {
+       mdio@24520 {
+               phy0: ethernet-phy@0 {
+                       interrupts = <3 1 0 0>;
+                       reg = <0x0>;
+                       };
+               phy1: ethernet-phy@1 {
+                       interrupts = <2 1 0 0>;
+                       reg = <0x1>;
+                       };
+       };
+
+       mdio@25520 {
+               tbi0: tbi-phy@11 {
+                       reg = <0x11>;
+                       device_type = "tbi-phy";
+               };
+       };
+
+       mdio@26520 {
+               status = "disabled";
+       };
+
+       enet0: ethernet@24000 {
+               phy-connection-type = "rgmii-id";
+               fixed-link {
+                       speed = <1000>;
+                       full-duplex;
+               };
+       };
+
+       enet1: ethernet@25000 {
+               tbi-handle = <&tbi0>;
+               phy-handle = <&phy0>;
+               phy-connection-type = "sgmii";
+       };
+
+       enet2: ethernet@26000 {
+               phy-handle = <&phy1>;
+               phy-connection-type = "rgmii-id";
+       };
+};
index 04b2519..ecdc022 100644 (file)
                ranges = <0x01000000 0x0 0x00000000 0xf 0xffc00000 0x0 0x00010000   /* downstream I/O */
                          0x02000000 0x0 0x80000000 0xc 0x00000000 0x0 0x20000000>; /* non-prefetchable memory */
        };
+
+       aliases {
+               spi0 = &espi0;
+       };
 };
 
+/include/ "p2020rdb-pc.dtsi"
 /include/ "p2020-post.dtsi"
+
+&espi0 {
+       status = "okay";
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+               spi-max-frequency = <10000000>; /* input clock */
+       };
+};
index 95931e2..ad09b13 100644 (file)
                        clock-frequency = <0x0>;
                };
 
+               espi0: spi@110000 {
+                       compatible = "fsl,mpc8536-espi";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0x110000 0x1000>;
+                       fsl,espi-num-chipselects = <4>;
+                       status = "disabled";
+               };
+
                usb0: usb@210000 {
                        compatible = "fsl-usb2-mph";
                        reg = <0x210000 0x1000>;
index 9d59f9c..0fa1f09 100644 (file)
@@ -26,6 +26,7 @@
                phy_sgmii_1e = &phy_sgmii_1e;
                phy_sgmii_1f = &phy_sgmii_1f;
                phy_xgmii_2 = &phy_xgmii_2;
+               spi0 = &espi0;
        };
 
        soc: soc@ffe000000 {
        };
 };
 
+&espi0 {
+       status = "okay";
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+               /* input clock */
+               spi-max-frequency = <10000000>;
+       };
+};
+
 /include/ "p2041si-post.dtsi"
index 3152683..e34117b 100644 (file)
                        clock-frequency = <0x0>;
                };
 
+               espi0: spi@110000 {
+                       compatible = "fsl,mpc8536-espi";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0x110000 0x1000>;
+                       fsl,espi-num-chipselects = <4>;
+                       status = "disabled";
+               };
+
                usb0: usb@fe210000 {
                        compatible = "fsl-usb2-mph";
                        reg = <0x210000 0x1000>;
index b984dde..069dae3 100644 (file)
@@ -27,6 +27,7 @@
                emi1_rgmii = &hydra_mdio_rgmii;
                emi1_sgmii = &hydra_mdio_sgmii;
                emi2_xgmii = &hydra_mdio_xgmii;
+               spi0 = &espi0;
        };
 
        soc: soc@ffe000000 {
        };
 };
 
+&espi0 {
+       status = "okay";
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+               /* input clock */
+               spi-max-frequency = <10000000>;
+       };
+};
+
 /include/ "p3041si-post.dtsi"
index 4a80561..8ab5cf5 100644 (file)
                        clock-frequency = <0x0>;
                };
 
+               espi0: spi@110000 {
+                       compatible = "fsl,mpc8536-espi";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0x110000 0x1000>;
+                       fsl,espi-num-chipselects = <4>;
+                       status = "disabled";
+               };
+
                esdhc: esdhc@114000 {
                        compatible = "fsl,esdhc";
                        reg = <0x114000 0x1000>;
index 53c51d4..d5618f1 100644 (file)
@@ -27,6 +27,7 @@
                emi1_rgmii = &p4080mdio0;
                emi2_slot4 = &p4080xmdio1;
                emi2_slot5 = &p4080xmdio3;
+               spi0 = &espi0;
        };
 
        soc: soc@ffe000000 {
        };
 };
 
+&espi0 {
+       status = "okay";
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+               /* input clock */
+               spi-max-frequency = <10000000>;
+       };
+};
+
 /include/ "p4080si-post.dtsi"
index 4598857..10402cf 100644 (file)
                        clock-frequency = <0x0>;
                };
 
+               espi0: spi@110000 {
+                       compatible = "fsl,mpc8536-espi";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0x110000 0x1000>;
+                       fsl,espi-num-chipselects = <4>;
+                       status = "disabled";
+               };
+
                usb@210000 {
                        compatible = "fsl-usb2-mph";
                        reg = <0x210000 0x1000>;
index 6ebc801..c2ec765 100644 (file)
@@ -39,6 +39,7 @@
                hydra_sg_slot6 = &hydra_sg_slot6;
                hydra_xg_slot1 = &hydra_xg_slot1;
                hydra_xg_slot2 = &hydra_xg_slot2;
+               spi0 = &espi0;
        };
 
        soc: soc@ffe000000 {
        };
 };
 
+&espi0 {
+       status = "okay";
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+               /* input clock */
+               spi-max-frequency = <10000000>;
+       };
+};
+
 /include/ "p5040si-post.dtsi"
diff --git a/arch/powerpc/dts/pq3-etsec1-0.dtsi b/arch/powerpc/dts/pq3-etsec1-0.dtsi
new file mode 100644 (file)
index 0000000..8800243
--- /dev/null
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * PQ3 eTSEC device tree stub [ @ offsets 0x24000 ]
+ *
+ * Copyright 2011-2012 Freescale Semiconductor Inc.
+ * Copyright 2020 NXP
+ */
+
+ethernet@24000 {
+       #address-cells = <1>;
+       #size-cells = <1>;
+       cell-index = <0>;
+       device_type = "network";
+       model = "eTSEC";
+       compatible = "gianfar";
+       reg = <0x24000 0x1000>;
+       ranges = <0x0 0x24000 0x1000>;
+       fsl,magic-packet;
+       local-mac-address = [ 00 00 00 00 00 00 ];
+       interrupts = <29 2 0 0 30 2 0 0 34 2 0 0>;
+};
+
+mdio@24520 {
+       #address-cells = <1>;
+       #size-cells = <0>;
+       compatible = "fsl,gianfar-mdio";
+       reg = <0x24520 0x20>;
+};
diff --git a/arch/powerpc/dts/pq3-etsec1-1.dtsi b/arch/powerpc/dts/pq3-etsec1-1.dtsi
new file mode 100644 (file)
index 0000000..2bc62d1
--- /dev/null
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * PQ3 eTSEC device tree stub [ @ offsets 0x25000 ]
+ *
+ * Copyright 2011-2012 Freescale Semiconductor Inc.
+ * Copyright 2020 NXP
+ */
+
+ethernet@25000 {
+       #address-cells = <1>;
+       #size-cells = <1>;
+       cell-index = <1>;
+       device_type = "network";
+       model = "eTSEC";
+       compatible = "gianfar";
+       reg = <0x25000 0x1000>;
+       ranges = <0x0 0x25000 0x1000>;
+       fsl,magic-packet;
+       local-mac-address = [ 00 00 00 00 00 00 ];
+       interrupts = <35 2 0 0 36 2 0 0 40 2 0 0>;
+};
+
+mdio@25520 {
+       #address-cells = <1>;
+       #size-cells = <0>;
+       compatible = "fsl,gianfar-tbi";
+       reg = <0x25520 0x20>;
+};
diff --git a/arch/powerpc/dts/pq3-etsec1-2.dtsi b/arch/powerpc/dts/pq3-etsec1-2.dtsi
new file mode 100644 (file)
index 0000000..d45865f
--- /dev/null
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * PQ3 eTSEC device tree stub [ @ offsets 0x26000 ]
+ *
+ * Copyright 2011-2012 Freescale Semiconductor Inc.
+ * Copyright 2020 NXP
+ */
+
+ethernet@26000 {
+       #address-cells = <1>;
+       #size-cells = <1>;
+       cell-index = <2>;
+       device_type = "network";
+       model = "eTSEC";
+       compatible = "gianfar";
+       reg = <0x26000 0x1000>;
+       ranges = <0x0 0x26000 0x1000>;
+       fsl,magic-packet;
+       local-mac-address = [ 00 00 00 00 00 00 ];
+       interrupts = <31 2 0 0 32 2 0 0 33 2 0 0>;
+};
+
+mdio@26520 {
+       #address-cells = <1>;
+       #size-cells = <0>;
+       compatible = "fsl,gianfar-tbi";
+       reg = <0x26520 0x20>;
+};
diff --git a/arch/powerpc/dts/pq3-etsec1-3.dtsi b/arch/powerpc/dts/pq3-etsec1-3.dtsi
new file mode 100644 (file)
index 0000000..853a273
--- /dev/null
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * PQ3 eTSEC device tree stub [ @ offsets 0x27000 ]
+ *
+ * Copyright 2011-2012 Freescale Semiconductor Inc.
+ * Copyright 2020 NXP
+ */
+
+ethernet@27000 {
+       #address-cells = <1>;
+       #size-cells = <1>;
+       cell-index = <3>;
+       device_type = "network";
+       model = "eTSEC";
+       compatible = "gianfar";
+       reg = <0x27000 0x1000>;
+       ranges = <0x0 0x27000 0x1000>;
+       fsl,magic-packet;
+       local-mac-address = [ 00 00 00 00 00 00 ];
+       interrupts = <37 2 0 0 38 2 0 0 39 2 0 0>;
+};
+
+mdio@27520 {
+       #address-cells = <1>;
+       #size-cells = <0>;
+       compatible = "fsl,gianfar-tbi";
+       reg = <0x27520 0x20>;
+};
diff --git a/arch/powerpc/dts/pq3-etsec2-0.dtsi b/arch/powerpc/dts/pq3-etsec2-0.dtsi
new file mode 100644 (file)
index 0000000..f9d3d04
--- /dev/null
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * PQ3 eTSEC2 device tree stub [ @ offsets 0x24000/0xb0000 ]
+ *
+ * Copyright 2011 Freescale Semiconductor Inc.
+ * Copyright 2020 NXP
+ */
+
+mdio@24000 {
+       #address-cells = <1>;
+       #size-cells = <0>;
+       compatible = "fsl,etsec2-mdio";
+       reg = <0x24000 0x1000 0xb0030 0x4>;
+};
+
+ethernet@b0000 {
+       #address-cells = <1>;
+       #size-cells = <1>;
+       device_type = "network";
+       model = "eTSEC";
+       compatible = "fsl,etsec2";
+       reg = <0xb0000 0x1000>;
+       fsl,num_rx_queues = <0x8>;
+       fsl,num_tx_queues = <0x8>;
+       fsl,magic-packet;
+       local-mac-address = [ 00 00 00 00 00 00 ];
+       ranges;
+
+       queue-group@b0000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0xb0000 0x1000>;
+               interrupts = <29 2 0 0 30 2 0 0 34 2 0 0>;
+       };
+};
diff --git a/arch/powerpc/dts/pq3-etsec2-1.dtsi b/arch/powerpc/dts/pq3-etsec2-1.dtsi
new file mode 100644 (file)
index 0000000..6c01481
--- /dev/null
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * PQ3 eTSEC2 device tree stub [ @ offsets 0x25000/0xb1000 ]
+ *
+ * Copyright 2011 Freescale Semiconductor Inc.
+ * Copyright 2020 NXP
+ */
+
+mdio@25000 {
+       #address-cells = <1>;
+       #size-cells = <0>;
+       compatible = "fsl,etsec2-tbi";
+       reg = <0x25000 0x1000 0xb1030 0x4>;
+};
+
+ethernet@b1000 {
+       #address-cells = <1>;
+       #size-cells = <1>;
+       device_type = "network";
+       model = "eTSEC";
+       compatible = "fsl,etsec2";
+       reg = <0xb1000 0x1000>;
+       fsl,num_rx_queues = <0x8>;
+       fsl,num_tx_queues = <0x8>;
+       fsl,magic-packet;
+       local-mac-address = [ 00 00 00 00 00 00 ];
+       ranges;
+
+       queue-group@b1000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0xb1000 0x1000>;
+               interrupts = <35 2 0 0 36 2 0 0 40 2 0 0>;
+       };
+};
diff --git a/arch/powerpc/dts/pq3-etsec2-2.dtsi b/arch/powerpc/dts/pq3-etsec2-2.dtsi
new file mode 100644 (file)
index 0000000..2a597c0
--- /dev/null
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * PQ3 eTSEC2 device tree stub [ @ offsets 0x26000/0xb2000 ]
+ *
+ * Copyright 2011 Freescale Semiconductor Inc.
+ * Copyright 2020 NXP
+ */
+
+mdio@26000 {
+       #address-cells = <1>;
+       #size-cells = <0>;
+       compatible = "fsl,etsec2-tbi";
+       reg = <0x26000 0x1000 0xb1030 0x4>;
+};
+
+ethernet@b2000 {
+       #address-cells = <1>;
+       #size-cells = <1>;
+       device_type = "network";
+       model = "eTSEC";
+       compatible = "fsl,etsec2";
+       reg = <0xb2000 0x1000>;
+       fsl,num_rx_queues = <0x8>;
+       fsl,num_tx_queues = <0x8>;
+       fsl,magic-packet;
+       local-mac-address = [ 00 00 00 00 00 00 ];
+       ranges;
+
+       queue-group@b2000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0xb2000 0x1000>;
+               interrupts = <31 2 0 0 32 2 0 0 33 2 0 0>;
+       };
+};
diff --git a/arch/powerpc/dts/pq3-etsec2-grp2-0.dtsi b/arch/powerpc/dts/pq3-etsec2-grp2-0.dtsi
new file mode 100644 (file)
index 0000000..16752a7
--- /dev/null
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * PQ3 eTSEC2 Group 2 device tree stub [ @ offsets 0xb4000 ]
+ *
+ * Copyright 2011 Freescale Semiconductor Inc.
+ * Copyright 2020 NXP
+ */
+
+&enet0_grp2 {
+       queue-group@b4000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0xb4000 0x1000>;
+               interrupts = <17 2 0 0 18 2 0 0 24 2 0 0>;
+       };
+};
diff --git a/arch/powerpc/dts/pq3-etsec2-grp2-1.dtsi b/arch/powerpc/dts/pq3-etsec2-grp2-1.dtsi
new file mode 100644 (file)
index 0000000..0464938
--- /dev/null
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * PQ3 eTSEC2 Group 2 device tree stub [ @ offsets 0xb5000 ]
+ *
+ * Copyright 2011 Freescale Semiconductor Inc.
+ * Copyright 2020 NXP
+ */
+
+&enet1_grp2 {
+       queue-group@b5000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0xb5000 0x1000>;
+               interrupts = <51 2 0 0 52 2 0 0 67 2 0 0>;
+       };
+};
diff --git a/arch/powerpc/dts/pq3-etsec2-grp2-2.dtsi b/arch/powerpc/dts/pq3-etsec2-grp2-2.dtsi
new file mode 100644 (file)
index 0000000..fe8003c
--- /dev/null
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: GPL-2.0+ OR X11
+/*
+ * PQ3 eTSEC2 Group 2 device tree stub [ @ offsets 0xb6000 ]
+ *
+ * Copyright 2011 Freescale Semiconductor Inc.
+ * Copyright 2020 NXP
+ */
+
+&enet2_grp2 {
+       queue-group@b6000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0xb6000 0x1000>;
+               interrupts = <25 2 0 0 26 2 0 0 27 2 0 0>;
+       };
+};
index 32aaa4a..eeba99f 100644 (file)
@@ -17,6 +17,7 @@
 
        aliases {
                sg_2500_aqr105_phy4 = &sg_2500_aqr105_phy4;
+               spi0 = &espi0;
        };
 
        soc: soc@ffe000000 {
                        };
                };
        };
+};
 
+&espi0 {
+       status = "okay";
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+               /* input clock */
+               spi-max-frequency = <10000000>;
+       };
 };
 
 #include "t1024si-post.dtsi"
index 521825d..cf8962a 100644 (file)
                        clock-frequency = <0x0>;
                };
 
+               espi0: spi@110000 {
+                       compatible = "fsl,mpc8536-espi";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0x110000 0x1000>;
+                       fsl,espi-num-chipselects = <4>;
+                       status = "disabled";
+               };
+
                usb0@210000 {
                        compatible = "fsl-usb2-mph";
                        reg = <0x210000 0x1000>;
index 16a8ed4..3584c06 100644 (file)
        #address-cells = <2>;
        #size-cells = <2>;
        interrupt-parent = <&mpic>;
+
+       aliases {
+               spi0 = &espi0;
+       };
+};
+
+&espi0 {
+       status = "okay";
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+               spi-max-frequency = <10000000>; /* input clock */
+       };
 };
index 0a08a69..2c7e5b4 100644 (file)
                        clock-frequency = <0x0>;
                };
 
+               espi0: spi@110000 {
+                       compatible = "fsl,mpc8536-espi";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0x110000 0x1000>;
+                       fsl,espi-num-chipselects = <4>;
+                       status = "disabled";
+               };
+
                usb0@210000 {
                        compatible = "fsl-usb2-mph";
                        reg = <0x210000 0x1000>;
index a9e9b40..7e446b1 100644 (file)
                        voltage-ranges = <1800 1800 3300 3300>;
                };
 
+               espi0: spi@110000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "fsl,mpc8536-espi";
+                       reg = <0x110000 0x1000>;
+                       interrupts = <53 0x2 0 0>;
+                       fsl,espi-num-chipselects = <4>;
+                       status = "disabled";
+               };
+
                usb0: usb@210000 {
                        compatible = "fsl-usb2-mph";
                        reg = <0x210000 0x1000>;
index 1819a08..f9e786b 100644 (file)
        #address-cells = <2>;
        #size-cells = <2>;
        interrupt-parent = <&mpic>;
+
+       aliases {
+               spi0 = &espi0;
+       };
+};
+
+&espi0 {
+
+       status = "okay";
+       flash@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "micron,n25q128a11", "jedec,spi-nor"; /* 16MB */
+               reg = <0>;
+               spi-max-frequency = <10000000>;
+       };
+
+       flash@1 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "sst,sst25wf040", "jedec,spi-nor";
+               reg = <1>;
+               spi-max-frequency = <10000000>;
+       };
+
+       flash@2 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "eon,en25s64", "jedec,spi-nor";
+               reg = <2>;
+               spi-max-frequency = <10000000>;
+       };
+
 };
index 49c1765..34ec6a7 100644 (file)
        #address-cells = <2>;
        #size-cells = <2>;
        interrupt-parent = <&mpic>;
+
+       aliases {
+               spi0 = &espi0;
+       };
+};
+
+&espi0 {
+       status = "okay";
+       flash@0 {
+               compatible = "jedec,spi-nor"; /* 16MB */
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+               spi-max-frequency = <10000000>; /* input clock */
+       };
 };
index 9b5902f..498da4f 100644 (file)
                        clock-frequency = <0x0>;
                };
 
+               espi0: spi@110000 {
+                       compatible = "fsl,mpc8536-espi";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0x110000 0x1000>;
+                       fsl,espi-num-chipselects = <4>;
+                       status = "disabled";
+               };
+
                usb@210000 {
                        compatible = "fsl-usb2-mph";
                        reg = <0x210000 0x1000>;
index f67d7ce..635065a 100644 (file)
        #address-cells = <2>;
        #size-cells = <2>;
        interrupt-parent = <&mpic>;
+
+       aliases {
+               spi0 = &espi0;
+       };
+};
+
+&espi0 {
+       status = "okay";
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+               spi-max-frequency = <10000000>; /* input clock */
+       };
 };
index 8c8ed99..b903e6e 100644 (file)
@@ -298,8 +298,8 @@ void boot_prep_vxworks(bootm_headers_t *images)
        if (!images->ft_addr)
                return;
 
-       base = (u64)gd->bd->bi_memstart;
-       size = (u64)gd->bd->bi_memsize;
+       base = (u64)gd->ram_base;
+       size = (u64)gd->ram_size;
 
        off = fdt_path_offset(images->ft_addr, "/memory");
        if (off < 0)
index 5b24202..d02062f 100644 (file)
@@ -75,7 +75,7 @@ int riscv_fdt_copy_resv_mem_node(const void *src, void *dst)
                pmp_mem.start = addr;
                pmp_mem.end = addr + size - 1;
                err = fdtdec_add_reserved_memory(dst, basename, &pmp_mem,
-                                                &phandle);
+                                                &phandle, false);
                if (err < 0 && err != -FDT_ERR_EXISTS) {
                        log_err("failed to add reserved memory: %d\n", err);
                        return err;
index 6567d50..4d4cdaf 100644 (file)
@@ -53,14 +53,12 @@ void board_debug_uart_init(void)
 
 int dram_init_banksize(void)
 {
-#ifdef CONFIG_NR_DRAM_BANKS
        struct spl_handoff *ho;
 
        ho = bloblist_find(BLOBLISTT_SPL_HANDOFF, sizeof(*ho));
        if (!ho)
                return log_msg_ret("Missing SPL hand-off info", -ENOENT);
        handoff_load_dram_banks(ho);
-#endif
 
        return 0;
 }
index ceee59b..c59df7d 100644 (file)
@@ -5,4 +5,4 @@
 
 obj-$(CONFIG_CMD_BOOTM) += bootm.o
 
-obj-y  += cache.o misc.o relocate.o time.o bdinfo.o
+obj-y  += cache.o misc.o relocate.o time.o
diff --git a/arch/xtensa/lib/bdinfo.c b/arch/xtensa/lib/bdinfo.c
deleted file mode 100644 (file)
index 4ec8529..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * XTENSA-specific information for the 'bd' command
- *
- * (C) Copyright 2003
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- */
-
-#include <common.h>
-#include <init.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-int arch_setup_bdinfo(void)
-{
-       struct bd_info *bd = gd->bd;
-
-       bd->bi_memstart = PHYSADDR(CONFIG_SYS_SDRAM_BASE);
-       bd->bi_memsize = CONFIG_SYS_SDRAM_SIZE;
-
-       return 0;
-}
index 458eaf9..0e56450 100644 (file)
@@ -41,15 +41,14 @@ static struct bp_tag *setup_last_tag(struct bp_tag *params)
 
 static struct bp_tag *setup_memory_tag(struct bp_tag *params)
 {
-       struct bd_info *bd = gd->bd;
        struct meminfo *mem;
 
        params->id = BP_TAG_MEMORY;
        params->size = sizeof(struct meminfo);
        mem = (struct meminfo *)params->data;
        mem->type = MEMORY_TYPE_CONVENTIONAL;
-       mem->start = bd->bi_memstart;
-       mem->end = bd->bi_memstart + bd->bi_memsize;
+       mem->start = PHYSADDR(gd->ram_base);
+       mem->end = PHYSADDR(gd->ram_base + gd->ram_size);
 
        printf("   MEMORY:          tag:0x%04x, type:0X%lx, start:0X%lx, end:0X%lx\n",
               BP_TAG_MEMORY, mem->type, mem->start, mem->end);
index 5416a5b..0fd9532 100644 (file)
@@ -83,8 +83,6 @@ void board_init_r(gd_t *gd, ulong dest_addr)
        bd = (struct bd_info *)(CONFIG_SPL_GD_ADDR + sizeof(gd_t));
        memset(bd, 0, sizeof(struct bd_info));
        gd->bd = bd;
-       bd->bi_memstart = CONFIG_SYS_INIT_L2_ADDR;
-       bd->bi_memsize = CONFIG_SYS_L2_SIZE;
 
        arch_cpu_init();
        get_clocks();
index 8ce21f9..cb73f98 100644 (file)
@@ -12,4 +12,11 @@ config SYS_SOC
 config SYS_CONFIG_NAME
        default "bcm_ns3"
 
+config CMD_BCM_EXT_UTILS
+       bool "Enable Broadcom-specific U-Boot commands"
+       default y
+       help
+         Enable Broadcom specific U-Boot commands such as error log setup
+         command or any other commands specific to NS3 platform.
+
 endif
index 0357cd0..10ae344 100644 (file)
@@ -12,6 +12,7 @@
 #include <asm/armv8/mmu.h>
 #include <asm/arch-bcmns3/bl33_info.h>
 #include <dt-bindings/memory/bcm-ns3-mc.h>
+#include <broadcom/chimp.h>
 
 /* Default reset-level = 3 and strap-val = 0 */
 #define L3_RESET       30
@@ -210,8 +211,24 @@ void reset_cpu(ulong level)
 #ifdef CONFIG_OF_BOARD_SETUP
 int ft_board_setup(void *fdt, struct bd_info *bd)
 {
+       u32 chimp_hs = CHIMP_HANDSHAKE_WAIT_TIMEOUT;
+
        gic_lpi_tables_init();
 
+       /*
+        * Check for chimp handshake status.
+        * Zero timeout value will actually fall to default timeout.
+        *
+        * System boot is independent of chimp handshake.
+        * chimp handshake failure is not a catastrophic error.
+        * Hence continue booting if chimp handshake fails.
+        */
+       chimp_handshake_status_optee(0, &chimp_hs);
+       if (chimp_hs == CHIMP_HANDSHAKE_SUCCESS)
+               printf("ChiMP handshake successful\n");
+       else
+               printf("ERROR: ChiMP handshake status 0x%x\n", chimp_hs);
+
        return mem_info_parse_fixup(fdt);
 }
 #endif /* CONFIG_OF_BOARD_SETUP */
index 4b49b6e..5811c43 100644 (file)
@@ -49,11 +49,6 @@ int checkboard(void)
        return 0;
 }
 
-int dram_init_banksize(void)
-{
-       return 0;
-}
-
 int board_postclk_init(void)
 {
        /*
index b0e109f..04e04a6 100644 (file)
@@ -53,7 +53,6 @@ obj-$(CONFIG_TARGET_P1022DS)          += ics307_clk.o
 obj-$(CONFIG_P2020DS)          += ics307_clk.o
 obj-$(CONFIG_TARGET_P3041DS)           += ics307_clk.o
 obj-$(CONFIG_TARGET_P4080DS)           += ics307_clk.o
-obj-$(CONFIG_TARGET_P5020DS)           += ics307_clk.o
 obj-$(CONFIG_TARGET_P5040DS)           += ics307_clk.o
 obj-$(CONFIG_VSC_CROSSBAR)    += vsc3316_3308.o
 obj-$(CONFIG_IDT8T49N222A)     += idt8t49n222a_serdes_clk.o
index 98b1add..e92b0d0 100644 (file)
@@ -28,21 +28,6 @@ source "board/freescale/common/Kconfig"
 
 endif
 
-if TARGET_P5020DS
-
-config SYS_BOARD
-       default "corenet_ds"
-
-config SYS_VENDOR
-       default "freescale"
-
-config SYS_CONFIG_NAME
-       default "P5020DS"
-
-source "board/freescale/common/Kconfig"
-
-endif
-
 if TARGET_P5040DS
 
 config SYS_BOARD
index 708e812..e22cf70 100644 (file)
@@ -6,22 +6,13 @@ F:    include/configs/P3041DS.h
 F:     configs/P3041DS_defconfig
 F:     configs/P3041DS_NAND_defconfig
 F:     configs/P3041DS_SDCARD_defconfig
-F:     configs/P3041DS_SECURE_BOOT_defconfig
 F:     configs/P3041DS_SPIFLASH_defconfig
 F:     configs/P3041DS_SRIO_PCIE_BOOT_defconfig
 F:     include/configs/P4080DS.h
 F:     configs/P4080DS_defconfig
 F:     configs/P4080DS_SDCARD_defconfig
-F:     configs/P4080DS_SECURE_BOOT_defconfig
 F:     configs/P4080DS_SPIFLASH_defconfig
 F:     configs/P4080DS_SRIO_PCIE_BOOT_defconfig
-F:     include/configs/P5020DS.h
-F:     configs/P5020DS_defconfig
-F:     configs/P5020DS_NAND_defconfig
-F:     configs/P5020DS_SDCARD_defconfig
-F:     configs/P5020DS_SECURE_BOOT_defconfig
-F:     configs/P5020DS_SPIFLASH_defconfig
-F:     configs/P5020DS_SRIO_PCIE_BOOT_defconfig
 F:     include/configs/P5040DS.h
 F:     configs/P5040DS_defconfig
 F:     configs/P5040DS_NAND_defconfig
@@ -33,5 +24,4 @@ CORENET_DS_SECURE_BOOT BOARD
 M:     Ruchika Gupta <ruchika.gupta@nxp.com>
 S:     Maintained
 F:     configs/P3041DS_NAND_SECURE_BOOT_defconfig
-F:     configs/P5020DS_NAND_SECURE_BOOT_defconfig
 F:     configs/P5040DS_NAND_SECURE_BOOT_defconfig
index 98322b2..4d62fc9 100644 (file)
@@ -8,9 +8,7 @@ obj-y   += corenet_ds.o
 obj-y  += ddr.o
 obj-$(CONFIG_TARGET_P3041DS)   += eth_hydra.o
 obj-$(CONFIG_TARGET_P4080DS)   += eth_p4080.o
-obj-$(CONFIG_TARGET_P5020DS)   += eth_hydra.o
 obj-$(CONFIG_TARGET_P5040DS)   += eth_superhydra.o
 obj-$(CONFIG_TARGET_P3041DS)   += p3041ds_ddr.o
 obj-$(CONFIG_TARGET_P4080DS)   += p4080ds_ddr.o
-obj-$(CONFIG_TARGET_P5020DS)   += p5020ds_ddr.o
 obj-$(CONFIG_TARGET_P5040DS)   += p5040ds_ddr.o
diff --git a/board/freescale/corenet_ds/p5020ds_ddr.c b/board/freescale/corenet_ds/p5020ds_ddr.c
deleted file mode 100644 (file)
index 112733b..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright 2009-2010 Freescale Semiconductor, Inc.
- */
-
-#include <common.h>
-#include <fsl_ddr_sdram.h>
-
-fixed_ddr_parm_t fixed_ddr_parm_0[] = {
-       {0, 0, NULL}
-};
-
-fixed_ddr_parm_t fixed_ddr_parm_1[] = {
-       {0, 0, NULL}
-};
diff --git a/board/freescale/corenet_ds/rcw_p5020ds.cfg b/board/freescale/corenet_ds/rcw_p5020ds.cfg
deleted file mode 100644 (file)
index b09e409..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#
-# Default RCW for P5020DS.
-#
-
-#PBL preamble and RCW header
-aa55aa55 010e0100
-#64 bytes RCW data
-0C540000 00000000 1E120000 00000000
-D8984A01 03002000 58000000 41000000
-00000000 00000000 00000000 10070000
-00000000 00000000 00000000 00000000
index c9f7fa3..6e940dd 100644 (file)
@@ -4,30 +4,18 @@ S:    Maintained
 F:     board/freescale/p1010rdb/
 F:     include/configs/P1010RDB.h
 F:     configs/P1010RDB-PA_36BIT_NAND_defconfig
-F:     configs/P1010RDB-PA_36BIT_NAND_SECBOOT_defconfig
 F:     configs/P1010RDB-PA_36BIT_NOR_defconfig
-F:     configs/P1010RDB-PA_36BIT_NOR_SECBOOT_defconfig
 F:     configs/P1010RDB-PA_36BIT_SDCARD_defconfig
 F:     configs/P1010RDB-PA_36BIT_SPIFLASH_defconfig
-F:     configs/P1010RDB-PA_36BIT_SPIFLASH_SECBOOT_defconfig
 F:     configs/P1010RDB-PA_NAND_defconfig
-F:     configs/P1010RDB-PA_NAND_SECBOOT_defconfig
 F:     configs/P1010RDB-PA_NOR_defconfig
-F:     configs/P1010RDB-PA_NOR_SECBOOT_defconfig
 F:     configs/P1010RDB-PA_SDCARD_defconfig
 F:     configs/P1010RDB-PA_SPIFLASH_defconfig
-F:     configs/P1010RDB-PA_SPIFLASH_SECBOOT_defconfig
 F:     configs/P1010RDB-PB_36BIT_NAND_defconfig
-F:     configs/P1010RDB-PB_36BIT_NAND_SECBOOT_defconfig
 F:     configs/P1010RDB-PB_36BIT_NOR_defconfig
-F:     configs/P1010RDB-PB_36BIT_NOR_SECBOOT_defconfig
 F:     configs/P1010RDB-PB_36BIT_SDCARD_defconfig
 F:     configs/P1010RDB-PB_36BIT_SPIFLASH_defconfig
-F:     configs/P1010RDB-PB_36BIT_SPIFLASH_SECBOOT_defconfig
 F:     configs/P1010RDB-PB_NAND_defconfig
-F:     configs/P1010RDB-PB_NAND_SECBOOT_defconfig
 F:     configs/P1010RDB-PB_NOR_defconfig
-F:     configs/P1010RDB-PB_NOR_SECBOOT_defconfig
 F:     configs/P1010RDB-PB_SDCARD_defconfig
 F:     configs/P1010RDB-PB_SPIFLASH_defconfig
-F:     configs/P1010RDB-PB_SPIFLASH_SECBOOT_defconfig
index accf2f2..4c3a03e 100644 (file)
@@ -484,6 +484,7 @@ int checkboard(void)
        return 0;
 }
 
+#ifndef CONFIG_DM_ETH
 int board_eth_init(struct bd_info *bis)
 {
 #ifdef CONFIG_TSEC_ENET
@@ -524,6 +525,7 @@ int board_eth_init(struct bd_info *bis)
 
        return pci_eth_init(bis);
 }
+#endif
 
 #if defined(CONFIG_OF_BOARD_SETUP)
 void fdt_del_flexcan(void *blob)
index 4ee4573..fbaa6a6 100644 (file)
@@ -69,8 +69,6 @@ void board_init_r(gd_t *gd, ulong dest_addr)
        bd = (struct bd_info *)(CONFIG_SPL_GD_ADDR + sizeof(gd_t));
        memset(bd, 0, sizeof(struct bd_info));
        gd->bd = bd;
-       bd->bi_memstart = CONFIG_SYS_INIT_L2_ADDR;
-       bd->bi_memsize = CONFIG_SYS_L2_SIZE;
 
        arch_cpu_init();
        get_clocks();
diff --git a/board/freescale/p1023rdb/Kconfig b/board/freescale/p1023rdb/Kconfig
deleted file mode 100644 (file)
index 1e4cd10..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-if TARGET_P1023RDB
-
-config SYS_BOARD
-       default "p1023rdb"
-
-config SYS_VENDOR
-       default "freescale"
-
-config SYS_CONFIG_NAME
-       default "P1023RDB"
-
-endif
diff --git a/board/freescale/p1023rdb/MAINTAINERS b/board/freescale/p1023rdb/MAINTAINERS
deleted file mode 100644 (file)
index c06bac6..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-P1023RDB BOARD
-#M:    -
-S:     Maintained
-F:     board/freescale/p1023rdb/
-F:     include/configs/P1023RDB.h
-F:     configs/P1023RDB_defconfig
diff --git a/board/freescale/p1023rdb/Makefile b/board/freescale/p1023rdb/Makefile
deleted file mode 100644 (file)
index 78dc5d5..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0+
-#
-# Copyright 2013 Freescale Semiconductor, Inc.
-
-obj-y  += p1023rdb.o
-obj-y  += ddr.o
-obj-y  += law.o
-obj-y  += tlb.o
diff --git a/board/freescale/p1023rdb/ddr.c b/board/freescale/p1023rdb/ddr.c
deleted file mode 100644 (file)
index dc7a909..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Copyright 2013 Freescale Semiconductor, Inc.
- */
-
-#include <common.h>
-#include <asm/mmu.h>
-#include <asm/immap_85xx.h>
-#include <asm/processor.h>
-#include <fsl_ddr_sdram.h>
-#include <fsl_ddr_dimm_params.h>
-#include <asm/io.h>
-#include <asm/fsl_law.h>
-
-/* CONFIG_SYS_DDR_RAW_TIMING */
-/*
- * Hynix H5TQ1G83TFR-H9C
- */
-dimm_params_t ddr_raw_timing = {
-       .n_ranks = 1,
-       .rank_density = 536870912u,
-       .capacity = 536870912u,
-       .primary_sdram_width = 32,
-       .ec_sdram_width = 0,
-       .registered_dimm = 0,
-       .mirrored_dimm = 0,
-       .n_row_addr = 14,
-       .n_col_addr = 10,
-       .n_banks_per_sdram_device = 8,
-       .edc_config = 0,
-       .burst_lengths_bitmask = 0x0c,
-
-       .tckmin_x_ps = 1875,
-       .caslat_x = 0x1e << 4,  /* 5,6,7,8 */
-       .taa_ps = 13125,
-       .twr_ps = 18000,
-       .trcd_ps = 13125,
-       .trrd_ps = 7500,
-       .trp_ps = 13125,
-       .tras_ps = 37500,
-       .trc_ps = 50625,
-       .trfc_ps = 160000,
-       .twtr_ps = 7500,
-       .trtp_ps = 7500,
-       .refresh_rate_ps = 7800000,
-       .tfaw_ps = 37500,
-};
-
-int fsl_ddr_get_dimm_params(dimm_params_t *pdimm,
-               unsigned int controller_number,
-               unsigned int dimm_number)
-{
-       const char dimm_model[] = "Fixed DDR on board";
-
-       if ((controller_number == 0) && (dimm_number == 0)) {
-               memcpy(pdimm, &ddr_raw_timing, sizeof(dimm_params_t));
-               memset(pdimm->mpart, 0, sizeof(pdimm->mpart));
-               memcpy(pdimm->mpart, dimm_model, sizeof(dimm_model) - 1);
-       }
-
-       return 0;
-}
-
-void fsl_ddr_board_options(memctl_options_t *popts,
-                               dimm_params_t *pdimm,
-                               unsigned int ctrl_num)
-{
-       int i;
-       popts->clk_adjust = 6;
-       popts->cpo_override = 0x1f;
-       popts->write_data_delay = 2;
-       popts->half_strength_driver_enable = 1;
-       /* Write leveling override */
-       popts->wrlvl_en = 1;
-       popts->wrlvl_override = 1;
-       popts->wrlvl_sample = 0xf;
-       popts->wrlvl_start = 0x8;
-       popts->trwt_override = 1;
-       popts->trwt = 0;
-
-       for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
-               popts->cs_local_opts[i].odt_rd_cfg = FSL_DDR_ODT_NEVER;
-               popts->cs_local_opts[i].odt_wr_cfg = FSL_DDR_ODT_CS;
-       }
-}
diff --git a/board/freescale/p1023rdb/law.c b/board/freescale/p1023rdb/law.c
deleted file mode 100644 (file)
index 405fcd7..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Copyright 2013 Freescale Semiconductor, Inc.
- */
-
-#include <common.h>
-#include <asm/fsl_law.h>
-#include <asm/mmu.h>
-
-struct law_entry law_table[] = {
-       SET_LAW(CONFIG_SYS_NAND_BASE_PHYS, LAW_SIZE_1M, LAW_TRGT_IF_LBC),
-       SET_LAW(CONFIG_SYS_QMAN_MEM_PHYS, LAW_SIZE_4M,
-               LAW_TRGT_IF_DPAA_SWP_SRAM),
-       SET_LAW(CONFIG_SYS_FLASH_BASE_PHYS, LAW_SIZE_256M, LAW_TRGT_IF_LBC),
-};
-
-int num_law_entries = ARRAY_SIZE(law_table);
diff --git a/board/freescale/p1023rdb/p1023rdb.c b/board/freescale/p1023rdb/p1023rdb.c
deleted file mode 100644 (file)
index b70ff68..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Copyright 2013 Freescale Semiconductor, Inc.
- *
- * Authors:  Roy Zang <tie-fei.zang@freescale.com>
- *           Chunhe Lan <Chunhe.Lan@freescale.com>
- */
-
-#include <common.h>
-#include <command.h>
-#include <env.h>
-#include <image.h>
-#include <init.h>
-#include <net.h>
-#include <pci.h>
-#include <asm/io.h>
-#include <asm/cache.h>
-#include <asm/processor.h>
-#include <asm/mmu.h>
-#include <asm/immap_85xx.h>
-#include <asm/fsl_pci.h>
-#include <fsl_ddr_sdram.h>
-#include <asm/fsl_portals.h>
-#include <fsl_qbman.h>
-#include <linux/libfdt.h>
-#include <fdt_support.h>
-#include <netdev.h>
-#include <malloc.h>
-#include <fm_eth.h>
-#include <fsl_mdio.h>
-#include <miiphy.h>
-#include <phy.h>
-#include <fsl_dtsec.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-int board_early_init_f(void)
-{
-       fsl_lbc_t *lbc = LBC_BASE_ADDR;
-
-       /* Set ABSWP to implement conversion of addresses in the LBC */
-       setbits_be32(&lbc->lbcr, CONFIG_SYS_LBC_LBCR);
-
-       return 0;
-}
-
-int checkboard(void)
-{
-       printf("Board: P1023 RDB\n");
-
-       return 0;
-}
-
-#ifdef CONFIG_PCI
-void pci_init_board(void)
-{
-       fsl_pcie_init_board(0);
-}
-#endif
-
-int board_early_init_r(void)
-{
-       const unsigned int flashbase = CONFIG_SYS_FLASH_BASE;
-       int flash_esel = find_tlb_idx((void *)flashbase, 1);
-
-       /*
-        * Remap Boot flash + PROMJET region to caching-inhibited
-        * so that flash can be erased properly.
-        */
-
-       /* Flush d-cache and invalidate i-cache of any FLASH data */
-       flush_dcache();
-       invalidate_icache();
-
-       if (flash_esel == -1) {
-               /* very unlikely unless something is messed up */
-               puts("Error: Could not find TLB for FLASH BASE\n");
-               flash_esel = 2; /* give our best effort to continue */
-       } else {
-               /* invalidate existing TLB entry for flash + promjet */
-               disable_tlb(flash_esel);
-       }
-
-       set_tlb(1, flashbase, CONFIG_SYS_FLASH_BASE_PHYS,
-               MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
-               0, flash_esel, BOOKE_PAGESZ_256M, 1);
-
-       setup_qbman_portals();
-
-       return 0;
-}
-
-unsigned long get_board_sys_clk(ulong dummy)
-{
-       return gd->bus_clk;
-}
-
-unsigned long get_board_ddr_clk(ulong dummy)
-{
-       return gd->mem_clk;
-}
-
-int board_eth_init(struct bd_info *bis)
-{
-       ccsr_gur_t *gur = (ccsr_gur_t *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
-       struct fsl_pq_mdio_info dtsec_mdio_info;
-
-       /*
-        * Need to set dTSEC 1 pin multiplexing to TSEC. The default setting
-        * is not correct.
-        */
-       setbits_be32(&gur->pmuxcr, MPC85xx_PMUXCR_TSEC1_1);
-
-       dtsec_mdio_info.regs =
-               (struct tsec_mii_mng *)CONFIG_SYS_FM1_DTSEC1_MDIO_ADDR;
-       dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME;
-
-       /* Register the 1G MDIO bus */
-       fsl_pq_mdio_init(bis, &dtsec_mdio_info);
-
-       fm_info_set_phy_address(FM1_DTSEC1, CONFIG_SYS_FM1_DTSEC1_PHY_ADDR);
-       fm_info_set_phy_address(FM1_DTSEC2, CONFIG_SYS_FM1_DTSEC2_PHY_ADDR);
-
-       fm_info_set_mdio(FM1_DTSEC1,
-                        miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME));
-       fm_info_set_mdio(FM1_DTSEC2,
-                        miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME));
-
-#ifdef CONFIG_FMAN_ENET
-       cpu_eth_init(bis);
-#endif
-
-       return pci_eth_init(bis);
-}
-
-#if defined(CONFIG_OF_BOARD_SETUP)
-int ft_board_setup(void *blob, struct bd_info *bd)
-{
-       phys_addr_t base;
-       phys_size_t size;
-
-       ft_cpu_setup(blob, bd);
-
-       base = env_get_bootm_low();
-       size = env_get_bootm_size();
-
-       fdt_fixup_memory(blob, (u64)base, (u64)size);
-
-#ifdef CONFIG_HAS_FSL_DR_USB
-       fsl_fdt_fixup_dr_usb(blob, bd);
-#endif
-
-#ifdef CONFIG_SYS_DPAA_FMAN
-#ifndef CONFIG_DM_ETH
-       fdt_fixup_fman_ethernet(blob);
-#endif
-#endif
-       return 0;
-}
-#endif
diff --git a/board/freescale/p1023rdb/tlb.c b/board/freescale/p1023rdb/tlb.c
deleted file mode 100644 (file)
index 9f0314d..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Copyright 2013 Freescale Semiconductor, Inc.
- */
-
-#include <common.h>
-#include <asm/mmu.h>
-
-struct fsl_e_tlb_entry tlb_table[] = {
-       /* TLB 0 - for temp stack in cache */
-       SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR, CONFIG_SYS_INIT_RAM_ADDR,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
-                     0, 0, BOOKE_PAGESZ_4K, 0),
-       SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 4 * 1024,
-                     CONFIG_SYS_INIT_RAM_ADDR + 4 * 1024,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
-                     0, 0, BOOKE_PAGESZ_4K, 0),
-       SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 8 * 1024,
-                     CONFIG_SYS_INIT_RAM_ADDR + 8 * 1024,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
-                     0, 0, BOOKE_PAGESZ_4K, 0),
-       SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 12 * 1024,
-                     CONFIG_SYS_INIT_RAM_ADDR + 12 * 1024,
-                     MAS3_SX|MAS3_SW|MAS3_SR, 0,
-                     0, 0, BOOKE_PAGESZ_4K, 0),
-
-       /* TLB 1 */
-       /* *I*** - Covers boot page */
-       SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000,
-                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I,
-                     0, 0, BOOKE_PAGESZ_4K, 1),
-
-       /* *I*G* - CCSRBAR */
-       SET_TLB_ENTRY(1, CONFIG_SYS_CCSRBAR, CONFIG_SYS_CCSRBAR_PHYS,
-                     MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
-                     0, 1, BOOKE_PAGESZ_4M, 1),
-
-       /* W**G* - Flash, localbus */
-       /* This will be changed to *I*G* after relocation to RAM. */
-       SET_TLB_ENTRY(1, CONFIG_SYS_FLASH_BASE, CONFIG_SYS_FLASH_BASE_PHYS,
-                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_W|MAS2_G,
-                     0, 2, BOOKE_PAGESZ_256M, 1),
-
-       /* *I*G* - PCI */
-       SET_TLB_ENTRY(1, CONFIG_SYS_PCIE3_MEM_VIRT, CONFIG_SYS_PCIE3_MEM_PHYS,
-                     MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
-                     0, 3, BOOKE_PAGESZ_1G, 1),
-
-       /* *I*G* - PCI */
-       SET_TLB_ENTRY(1, CONFIG_SYS_PCIE3_MEM_VIRT + 0x40000000,
-                     CONFIG_SYS_PCIE3_MEM_PHYS + 0x40000000,
-                     MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
-                     0, 4, BOOKE_PAGESZ_256M, 1),
-
-       SET_TLB_ENTRY(1, CONFIG_SYS_PCIE3_MEM_VIRT + 0x50000000,
-                     CONFIG_SYS_PCIE3_MEM_PHYS + 0x50000000,
-                     MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
-                     0, 5, BOOKE_PAGESZ_256M, 1),
-
-       /* *I*G* - PCI I/O */
-       SET_TLB_ENTRY(1, CONFIG_SYS_PCIE3_IO_VIRT, CONFIG_SYS_PCIE3_IO_PHYS,
-                     MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
-                     0, 6, BOOKE_PAGESZ_256K, 1),
-
-       /* Bman/Qman */
-       SET_TLB_ENTRY(1, CONFIG_SYS_BMAN_MEM_BASE, CONFIG_SYS_BMAN_MEM_PHYS,
-                     MAS3_SW|MAS3_SR, 0,
-                     0, 7, BOOKE_PAGESZ_1M, 1),
-       SET_TLB_ENTRY(1, CONFIG_SYS_BMAN_MEM_BASE + 0x00100000,
-                     CONFIG_SYS_BMAN_MEM_PHYS + 0x00100000,
-                     MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
-                     0, 8, BOOKE_PAGESZ_1M, 1),
-       SET_TLB_ENTRY(1, CONFIG_SYS_QMAN_MEM_BASE, CONFIG_SYS_QMAN_MEM_PHYS,
-                     MAS3_SW|MAS3_SR, MAS2_M,
-                     0, 9, BOOKE_PAGESZ_1M, 1),
-       SET_TLB_ENTRY(1, CONFIG_SYS_QMAN_MEM_BASE + 0x00100000,
-                     CONFIG_SYS_QMAN_MEM_PHYS + 0x00100000,
-                     MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
-                     0, 10, BOOKE_PAGESZ_1M, 1),
-
-       SET_TLB_ENTRY(1, CONFIG_SYS_NAND_BASE, CONFIG_SYS_NAND_BASE_PHYS,
-                     MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
-                     0, 11, BOOKE_PAGESZ_16K, 1),
-
-#ifdef CONFIG_SYS_RAMBOOT
-       SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE,
-                     CONFIG_SYS_DDR_SDRAM_BASE,
-                     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, MAS2_M,
-                     0, 13, BOOKE_PAGESZ_256M, 1),
-#endif
-};
-
-int num_tlb_entries = ARRAY_SIZE(tlb_table);
index 2f9640b..cd36150 100644 (file)
@@ -1,10 +1,5 @@
-if TARGET_P1020MBG             || \
-       TARGET_P1020RDB_PC      || \
+if     TARGET_P1020RDB_PC      || \
        TARGET_P1020RDB_PD      || \
-       TARGET_P1020UTM         || \
-       TARGET_P1021RDB         || \
-       TARGET_P1024RDB         || \
-       TARGET_P1025RDB         || \
        TARGET_P2020RDB
 
 config SYS_BOARD
index c2e9247..b737b09 100644 (file)
@@ -3,10 +3,6 @@ P1_P2_RDB_PC BOARD
 S:     Maintained
 F:     board/freescale/p1_p2_rdb_pc/
 F:     include/configs/p1_p2_rdb_pc.h
-F:     configs/P1020MBG-PC_defconfig
-F:     configs/P1020MBG-PC_36BIT_defconfig
-F:     configs/P1020MBG-PC_36BIT_SDCARD_defconfig
-F:     configs/P1020MBG-PC_SDCARD_defconfig
 F:     configs/P1020RDB-PC_defconfig
 F:     configs/P1020RDB-PC_36BIT_defconfig
 F:     configs/P1020RDB-PC_36BIT_NAND_defconfig
@@ -19,28 +15,6 @@ F:   configs/P1020RDB-PD_defconfig
 F:     configs/P1020RDB-PD_NAND_defconfig
 F:     configs/P1020RDB-PD_SDCARD_defconfig
 F:     configs/P1020RDB-PD_SPIFLASH_defconfig
-F:     configs/P1020UTM-PC_defconfig
-F:     configs/P1020UTM-PC_36BIT_defconfig
-F:     configs/P1020UTM-PC_36BIT_SDCARD_defconfig
-F:     configs/P1020UTM-PC_SDCARD_defconfig
-F:     configs/P1021RDB-PC_defconfig
-F:     configs/P1021RDB-PC_36BIT_defconfig
-F:     configs/P1021RDB-PC_36BIT_NAND_defconfig
-F:     configs/P1021RDB-PC_36BIT_SDCARD_defconfig
-F:     configs/P1021RDB-PC_36BIT_SPIFLASH_defconfig
-F:     configs/P1021RDB-PC_NAND_defconfig
-F:     configs/P1021RDB-PC_SDCARD_defconfig
-F:     configs/P1021RDB-PC_SPIFLASH_defconfig
-F:     configs/P1024RDB_defconfig
-F:     configs/P1024RDB_36BIT_defconfig
-F:     configs/P1024RDB_NAND_defconfig
-F:     configs/P1024RDB_SDCARD_defconfig
-F:     configs/P1024RDB_SPIFLASH_defconfig
-F:     configs/P1025RDB_defconfig
-F:     configs/P1025RDB_36BIT_defconfig
-F:     configs/P1025RDB_NAND_defconfig
-F:     configs/P1025RDB_SDCARD_defconfig
-F:     configs/P1025RDB_SPIFLASH_defconfig
 F:     configs/P2020RDB-PC_defconfig
 F:     configs/P2020RDB-PC_36BIT_defconfig
 F:     configs/P2020RDB-PC_36BIT_NAND_defconfig
index b85cf02..86ff04e 100644 (file)
@@ -4,10 +4,8 @@ P1_P2_RDB_PC represents a set of boards including
     P1020MSBG-PC
     P1020RDB-PC
     P1020RDB-PD
-    P1020UTM-PC
     P1021RDB-PC
     P1024RDB
-    P1025RDB
     P2020RDB-PC
 
 They have similar design of P1020RDB but have DDR3 instead of DDR2. P2020RDB-PC
index 2346f6a..be803dd 100644 (file)
@@ -14,9 +14,7 @@
 #include <asm/fsl_law.h>
 
 #ifdef CONFIG_SYS_DDR_RAW_TIMING
-#if    defined(CONFIG_P1020RDB_PROTO) || \
-       defined(CONFIG_TARGET_P1021RDB) || \
-       defined(CONFIG_TARGET_P1020UTM)
+#if    defined(CONFIG_P1020RDB_PROTO)
 /* Micron MT41J256M8_187E */
 dimm_params_t ddr_raw_timing = {
        .n_ranks = 1,
@@ -146,8 +144,7 @@ dimm_params_t ddr_raw_timing = {
        .refresh_rate_ps = 7800000,
        .tfaw_ps = 37500,
 };
-#elif  defined(CONFIG_TARGET_P1024RDB) || \
-       defined(CONFIG_TARGET_P1025RDB)
+#elif  defined(CONFIG_TARGET_P1024RDB)
 /*
  * Samsung K4B2G0846C-HCH9
  * The following timing are for "downshift"
index 7c703b3..4584f01 100644 (file)
 #define GPIO_SLIC_PIN          30
 #define GPIO_SLIC_DATA         (1 << (31 - GPIO_SLIC_PIN))
 
-#if defined(CONFIG_TARGET_P1021RDB) && !defined(CONFIG_SYS_RAMBOOT)
-#define GPIO_DDR_RST_PORT      1
-#define GPIO_DDR_RST_PIN       8
-#define GPIO_DDR_RST_DATA      (1 << (31 - GPIO_DDR_RST_PIN))
-
-#define GPIO_2BIT_MASK         (0x3 << (32 - (GPIO_DDR_RST_PIN + 1) * 2))
-#endif
-
-#if defined(CONFIG_TARGET_P1025RDB) || defined(CONFIG_TARGET_P1021RDB)
-#define PCA_IOPORT_I2C_ADDR            0x23
-#define PCA_IOPORT_OUTPUT_CMD          0x2
-#define PCA_IOPORT_CFG_CMD             0x6
-#define PCA_IOPORT_QE_PIN_ENABLE       0xf8
-#define PCA_IOPORT_QE_TDM_ENABLE       0xf6
-#endif
-
 const qe_iop_conf_t qe_iop_conf_tab[] = {
        /* GPIO */
        {1,   1, 2, 0, 0}, /* GPIO7/PB1   - LOAD_DEFAULT_N */
-#if defined(CONFIG_TARGET_P1021RDB) && !defined(CONFIG_SYS_RAMBOOT)
-       {1,   8, 1, 1, 0}, /* GPIO10/PB8  - DDR_RST */
-#endif
        {0,  15, 1, 0, 0}, /* GPIO11/A15  - WDI */
        {GPIO_GETH_SW_PORT, GPIO_GETH_SW_PIN, 1, 0, 0}, /* RST_GETH_SW_N */
        {GPIO_SLIC_PORT, GPIO_SLIC_PIN, 1, 0, 0},       /* RST_SLIC_N */
-
-#ifdef CONFIG_TARGET_P1025RDB
-       /* QE_MUX_MDC */
-       {1,  19, 1, 0, 1}, /* QE_MUX_MDC               */
-
-       /* QE_MUX_MDIO */
-       {1,  20, 3, 0, 1}, /* QE_MUX_MDIO              */
-
-       /* UCC_1_MII */
-       {0, 23, 2, 0, 2}, /* CLK12 */
-       {0, 24, 2, 0, 1}, /* CLK9 */
-       {0,  7, 1, 0, 2}, /* ENET1_TXD0_SER1_TXD0      */
-       {0,  9, 1, 0, 2}, /* ENET1_TXD1_SER1_TXD1      */
-       {0, 11, 1, 0, 2}, /* ENET1_TXD2_SER1_TXD2      */
-       {0, 12, 1, 0, 2}, /* ENET1_TXD3_SER1_TXD3      */
-       {0,  6, 2, 0, 2}, /* ENET1_RXD0_SER1_RXD0      */
-       {0, 10, 2, 0, 2}, /* ENET1_RXD1_SER1_RXD1      */
-       {0, 14, 2, 0, 2}, /* ENET1_RXD2_SER1_RXD2      */
-       {0, 15, 2, 0, 2}, /* ENET1_RXD3_SER1_RXD3      */
-       {0,  5, 1, 0, 2}, /* ENET1_TX_EN_SER1_RTS_B    */
-       {0, 13, 1, 0, 2}, /* ENET1_TX_ER               */
-       {0,  4, 2, 0, 2}, /* ENET1_RX_DV_SER1_CTS_B    */
-       {0,  8, 2, 0, 2}, /* ENET1_RX_ER_SER1_CD_B    */
-       {0, 17, 2, 0, 2}, /* ENET1_CRS    */
-       {0, 16, 2, 0, 2}, /* ENET1_COL    */
-
-       /* UCC_5_RMII */
-       {1, 11, 2, 0, 1}, /* CLK13 */
-       {1, 7,  1, 0, 2}, /* ENET5_TXD0_SER5_TXD0      */
-       {1, 10, 1, 0, 2}, /* ENET5_TXD1_SER5_TXD1      */
-       {1, 6, 2, 0, 2}, /* ENET5_RXD0_SER5_RXD0      */
-       {1, 9, 2, 0, 2}, /* ENET5_RXD1_SER5_RXD1      */
-       {1, 5, 1, 0, 2}, /* ENET5_TX_EN_SER5_RTS_B    */
-       {1, 4, 2, 0, 2}, /* ENET5_RX_DV_SER5_CTS_B    */
-       {1, 8, 2, 0, 2}, /* ENET5_RX_ER_SER5_CD_B    */
-#endif
-
        {0,  0, 0, 0, QE_IOP_TAB_END} /* END of table */
 };
 #endif
@@ -156,16 +100,6 @@ void board_gpio_init(void)
        ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
        par_io_t *par_io = (par_io_t *) &(gur->qe_par_io);
 
-#if defined(CONFIG_TARGET_P1021RDB) && !defined(CONFIG_SYS_RAMBOOT)
-       /* reset DDR3 */
-       setbits_be32(&par_io[GPIO_DDR_RST_PORT].cpdat, GPIO_DDR_RST_DATA);
-       udelay(1000);
-       clrbits_be32(&par_io[GPIO_DDR_RST_PORT].cpdat, GPIO_DDR_RST_DATA);
-       udelay(1000);
-       setbits_be32(&par_io[GPIO_DDR_RST_PORT].cpdat, GPIO_DDR_RST_DATA);
-       /* disable CE_PB8 */
-       clrbits_be32(&par_io[GPIO_DDR_RST_PORT].cpdir1, GPIO_2BIT_MASK);
-#endif
        /* Enable VSC7385 switch */
        setbits_be32(&par_io[GPIO_GETH_SW_PORT].cpdat, GPIO_GETH_SW_DATA);
 
@@ -316,6 +250,10 @@ int board_early_init_r(void)
 {
        const unsigned int flashbase = CONFIG_SYS_FLASH_BASE;
        int flash_esel = find_tlb_idx((void *)flashbase, 1);
+#ifdef CONFIG_VSC7385_ENET
+       unsigned int vscfw_addr;
+       char *tmp;
+#endif
 
        /*
         * Remap Boot flash region to caching-inhibited
@@ -338,9 +276,24 @@ int board_early_init_r(void)
        set_tlb(1, flashbase, CONFIG_SYS_FLASH_BASE_PHYS, /* tlb, epn, rpn */
                MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,/* perms, wimge */
                0, flash_esel, BOOKE_PAGESZ_64M, 1);/* ts, esel, tsize, iprot */
+
+#ifdef CONFIG_VSC7385_ENET
+       /* If a VSC7385 microcode image is present, then upload it. */
+       tmp = env_get("vscfw_addr");
+       if (tmp) {
+               vscfw_addr = simple_strtoul(tmp, NULL, 16);
+               printf("uploading VSC7385 microcode from %x\n", vscfw_addr);
+               if (vsc7385_upload_firmware((void *)vscfw_addr,
+                                           CONFIG_VSC7385_IMAGE_SIZE))
+                       puts("Failure uploading VSC7385 microcode.\n");
+       } else {
+               puts("No address specified for VSC7385 microcode.\n");
+       }
+#endif
        return 0;
 }
 
+#ifndef CONFIG_DM_ETH
 int board_eth_init(struct bd_info *bis)
 {
        struct fsl_pq_mdio_info mdio_info;
@@ -348,10 +301,6 @@ int board_eth_init(struct bd_info *bis)
        ccsr_gur_t *gur __attribute__((unused)) =
                (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
        int num = 0;
-#ifdef CONFIG_VSC7385_ENET
-       char *tmp;
-       unsigned int vscfw_addr;
-#endif
 
 #ifdef CONFIG_TSEC1
        SET_STD_TSEC_INFO(tsec_info[num], 1);
@@ -375,19 +324,6 @@ int board_eth_init(struct bd_info *bis)
                return 0;
        }
 
-#ifdef CONFIG_VSC7385_ENET
-       /* If a VSC7385 microcode image is present, then upload it. */
-       tmp = env_get("vscfw_addr");
-       if (tmp) {
-               vscfw_addr = simple_strtoul(tmp, NULL, 16);
-               printf("uploading VSC7385 microcode from %x\n", vscfw_addr);
-               if (vsc7385_upload_firmware((void *) vscfw_addr,
-                                       CONFIG_VSC7385_IMAGE_SIZE))
-                       puts("Failure uploading VSC7385 microcode.\n");
-       } else
-               puts("No address specified for VSC7385 microcode.\n");
-#endif
-
        mdio_info.regs = TSEC_GET_MDIO_REGS_BASE(1);
        mdio_info.name = DEFAULT_MII_NAME;
 
@@ -405,50 +341,6 @@ int board_eth_init(struct bd_info *bis)
 
        return pci_eth_init(bis);
 }
-
-#if defined(CONFIG_QE) && \
-       (defined(CONFIG_TARGET_P1025RDB) || defined(CONFIG_TARGET_P1021RDB))
-static void fdt_board_fixup_qe_pins(void *blob)
-{
-       unsigned int oldbus;
-       u8 val8;
-       int node;
-       fsl_lbc_t *lbc = LBC_BASE_ADDR;
-
-       if (hwconfig("qe")) {
-               /* For QE and eLBC pins multiplexing,
-                * there is a PCA9555 device on P1025RDB.
-                * It control the multiplex pins' functions,
-                * and setting the PCA9555 can switch the
-                * function between QE and eLBC.
-                */
-               oldbus = i2c_get_bus_num();
-               i2c_set_bus_num(0);
-               if (hwconfig("tdm"))
-                       val8 = PCA_IOPORT_QE_TDM_ENABLE;
-               else
-                       val8 = PCA_IOPORT_QE_PIN_ENABLE;
-               i2c_write(PCA_IOPORT_I2C_ADDR, PCA_IOPORT_CFG_CMD,
-                               1, &val8, 1);
-               i2c_write(PCA_IOPORT_I2C_ADDR, PCA_IOPORT_OUTPUT_CMD,
-                               1, &val8, 1);
-               i2c_set_bus_num(oldbus);
-               /* if run QE TDM, Set ABSWP to implement
-                * conversion of addresses in the eLBC.
-                */
-               if (hwconfig("tdm")) {
-                       set_lbc_or(2, CONFIG_PMC_OR_PRELIM);
-                       set_lbc_br(2, CONFIG_PMC_BR_PRELIM);
-                       setbits_be32(&lbc->lbcr, CONFIG_SYS_LBC_LBCR);
-               }
-       } else {
-               node = fdt_path_offset(blob, "/qe");
-               if (node >= 0)
-                       fdt_del_node(blob, node);
-       }
-
-       return;
-}
 #endif
 
 #ifdef CONFIG_OF_BOARD_SETUP
@@ -478,9 +370,6 @@ int ft_board_setup(void *blob, struct bd_info *bd)
 #ifdef CONFIG_QE
        do_fixup_by_compat(blob, "fsl,qe", "status", "okay",
                        sizeof("okay"), 0);
-#if defined(CONFIG_TARGET_P1025RDB) || defined(CONFIG_TARGET_P1021RDB)
-       fdt_board_fixup_qe_pins(blob);
-#endif
 #endif
 
 #if defined(CONFIG_HAS_FSL_DR_USB)
index e76c3e8..8aceceb 100644 (file)
@@ -75,8 +75,6 @@ void board_init_r(gd_t *gd, ulong dest_addr)
        bd = (struct bd_info *)(CONFIG_SPL_GD_ADDR + sizeof(gd_t));
        memset(bd, 0, sizeof(struct bd_info));
        gd->bd = bd;
-       bd->bi_memstart = CONFIG_SYS_INIT_L2_ADDR;
-       bd->bi_memsize = CONFIG_SYS_L2_SIZE;
 
        arch_cpu_init();
        get_clocks();
index 14971f0..fcd7a55 100644 (file)
@@ -84,13 +84,13 @@ struct fsl_e_tlb_entry tlb_table[] = {
                        MAS3_SX|MAS3_SW|MAS3_SR, MAS2_M,
                        0, 8, BOOKE_PAGESZ_1G, 1),
 
-#if defined(CONFIG_TARGET_P1020MBG) || defined(CONFIG_TARGET_P1020RDB_PD)
+#if defined(CONFIG_TARGET_P1020RDB_PD)
        /* 2G DDR on P1020MBG, map the second 1G */
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
                        CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
                        MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
                        0, 9, BOOKE_PAGESZ_1G, 1),
-#endif /* TARGET_P1020MBG */
+#endif
 #endif /* RAMBOOT/SPL */
 
 #ifdef CONFIG_SYS_INIT_L2_ADDR
index da442fc..09dd88a 100644 (file)
@@ -103,8 +103,6 @@ void board_init_r(gd_t *gd, ulong dest_addr)
        bd = (struct bd_info *)(gd + sizeof(gd_t));
        memset(bd, 0, sizeof(struct bd_info));
        gd->bd = bd;
-       bd->bi_memstart = CONFIG_SYS_INIT_L3_ADDR;
-       bd->bi_memsize = CONFIG_SYS_L3_SIZE;
 
        arch_cpu_init();
        get_clocks();
index f83d69b..e792295 100644 (file)
@@ -94,8 +94,6 @@ void board_init_r(gd_t *gd, ulong dest_addr)
        bd = (struct bd_info *)(gd + sizeof(gd_t));
        memset(bd, 0, sizeof(struct bd_info));
        gd->bd = bd;
-       bd->bi_memstart = CONFIG_SYS_INIT_L3_ADDR;
-       bd->bi_memsize = CONFIG_SYS_L3_SIZE;
 
        arch_cpu_init();
        get_clocks();
index c197884..d8c2bbe 100644 (file)
@@ -102,8 +102,6 @@ void board_init_r(gd_t *gd, ulong dest_addr)
        bd = (struct bd_info *)(gd + sizeof(gd_t));
        memset(bd, 0, sizeof(struct bd_info));
        gd->bd = bd;
-       bd->bi_memstart = CONFIG_SYS_INIT_L3_ADDR;
-       bd->bi_memsize = CONFIG_SYS_L3_SIZE;
 
        arch_cpu_init();
        get_clocks();
index 07aab63..c64bd87 100644 (file)
@@ -72,8 +72,6 @@ void board_init_r(gd_t *gd, ulong dest_addr)
        bd = (struct bd_info *)(gd + sizeof(gd_t));
        memset(bd, 0, sizeof(struct bd_info));
        gd->bd = bd;
-       bd->bi_memstart = CONFIG_SYS_INIT_L3_ADDR;
-       bd->bi_memsize = CONFIG_SYS_L3_SIZE;
 
        arch_cpu_init();
        get_clocks();
index 64d2753..9aa0a9b 100644 (file)
@@ -75,8 +75,6 @@ void board_init_r(gd_t *gd, ulong dest_addr)
        bd = (struct bd_info *)(gd + sizeof(gd_t));
        memset(bd, 0, sizeof(struct bd_info));
        gd->bd = bd;
-       bd->bi_memstart = CONFIG_SYS_INIT_L3_ADDR;
-       bd->bi_memsize = CONFIG_SYS_L3_SIZE;
 
        arch_cpu_init();
        get_clocks();
index 94075ce..bbafabd 100644 (file)
@@ -1,3 +1,20 @@
+menu "KM 83xx Options"
+       depends on MPC83xx
+
+config KM_ENABLE_FULL_DM_DTS_SUPPORT
+       bool "enable full DM/DTS support for KM 83xx boards"
+       default y
+       select CMD_DM
+       select DM
+       select DM_ETH
+       select DM_MDIO
+       select DM_SERIAL
+       select OF_CONTROL
+       select PINCTRL
+       select PINCTRL_QE
+       select PHYLIB
+endmenu
+
 if TARGET_KMETER1
 
 config SYS_BOARD
index d9483c7..9268719 100644 (file)
@@ -1,5 +1,6 @@
 KM83XX BOARD
 M:     Holger Brunck <holger.brunck@hitachi-powergrids.com>
+M:     Heiko Schocher <hs@denx.de>
 S:     Maintained
 F:     board/keymile/km83xx/
 F:     include/configs/km8360.h
@@ -7,12 +8,24 @@ F:    configs/kmcoge5ne_defconfig
 F:     configs/kmeter1_defconfig
 F:     include/configs/tuxx1.h
 F:     configs/kmopti2_defconfig
+F:     configs/kmsupx5_defconfig
 F:     configs/kmtepr2_defconfig
 F:     configs/kmtegr1_defconfig
 F:     configs/tuge1_defconfig
 F:     configs/tuxx1_defconfig
-
-KMSUPX5 BOARD
-M:     Heiko Schocher <hs@denx.de>
-S:     Maintained
-F:     configs/kmsupx5_defconfig
+F:     arch/powerpc/dts/km8309-uboot.dtsi
+F:     arch/powerpc/dts/km8321-uboot.dtsi
+F:     arch/powerpc/dts/km8321.dtsi
+F:     arch/powerpc/dts/km836x-uboot.dtsi
+F:     arch/powerpc/dts/km836x.dtsi
+F:     arch/powerpc/dts/kmcoge5ne-uboot.dtsi
+F:     arch/powerpc/dts/kmcoge5ne.dts
+F:     arch/powerpc/dts/kmeter1-uboot.dtsi
+F:     arch/powerpc/dts/kmeter1.dts
+F:     arch/powerpc/dts/kmopti2.dts
+F:     arch/powerpc/dts/kmsupc5.dts
+F:     arch/powerpc/dts/kmsupm5.dts
+F:     arch/powerpc/dts/kmtegr1.dts
+F:     arch/powerpc/dts/kmtepr2.dts
+F:     arch/powerpc/dts/kmtuge1.dts
+F:     arch/powerpc/dts/kmtuxa1.dts
index 0aad452..8669715 100644 (file)
@@ -36,70 +36,6 @@ DECLARE_GLOBAL_DATA_PTR;
 
 static uchar ivm_content[CONFIG_SYS_IVM_EEPROM_MAX_LEN];
 
-const qe_iop_conf_t qe_iop_conf_tab[] = {
-       /* port pin dir open_drain assign */
-#if defined(CONFIG_ARCH_MPC8360)
-       /* MDIO */
-       {0,  1, 3, 0, 2}, /* MDIO */
-       {0,  2, 1, 0, 1}, /* MDC */
-
-       /* UCC4 - UEC */
-       {1, 14, 1, 0, 1}, /* TxD0 */
-       {1, 15, 1, 0, 1}, /* TxD1 */
-       {1, 20, 2, 0, 1}, /* RxD0 */
-       {1, 21, 2, 0, 1}, /* RxD1 */
-       {1, 18, 1, 0, 1}, /* TX_EN */
-       {1, 26, 2, 0, 1}, /* RX_DV */
-       {1, 27, 2, 0, 1}, /* RX_ER */
-       {1, 24, 2, 0, 1}, /* COL */
-       {1, 25, 2, 0, 1}, /* CRS */
-       {2, 15, 2, 0, 1}, /* TX_CLK - CLK16 */
-       {2, 16, 2, 0, 1}, /* RX_CLK - CLK17 */
-
-       /* DUART - UART2 */
-       {5,  0, 1, 0, 2}, /* UART2_SOUT */
-       {5,  2, 1, 0, 1}, /* UART2_RTS */
-       {5,  3, 2, 0, 2}, /* UART2_SIN */
-       {5,  1, 2, 0, 3}, /* UART2_CTS */
-#elif !defined(CONFIG_ARCH_MPC8309)
-       /* Local Bus */
-       {0, 16, 1, 0, 3}, /* LA00 */
-       {0, 17, 1, 0, 3}, /* LA01 */
-       {0, 18, 1, 0, 3}, /* LA02 */
-       {0, 19, 1, 0, 3}, /* LA03 */
-       {0, 20, 1, 0, 3}, /* LA04 */
-       {0, 21, 1, 0, 3}, /* LA05 */
-       {0, 22, 1, 0, 3}, /* LA06 */
-       {0, 23, 1, 0, 3}, /* LA07 */
-       {0, 24, 1, 0, 3}, /* LA08 */
-       {0, 25, 1, 0, 3}, /* LA09 */
-       {0, 26, 1, 0, 3}, /* LA10 */
-       {0, 27, 1, 0, 3}, /* LA11 */
-       {0, 28, 1, 0, 3}, /* LA12 */
-       {0, 29, 1, 0, 3}, /* LA13 */
-       {0, 30, 1, 0, 3}, /* LA14 */
-       {0, 31, 1, 0, 3}, /* LA15 */
-
-       /* MDIO */
-       {3,  4, 3, 0, 2}, /* MDIO */
-       {3,  5, 1, 0, 2}, /* MDC */
-
-       /* UCC4 - UEC */
-       {1, 18, 1, 0, 1}, /* TxD0 */
-       {1, 19, 1, 0, 1}, /* TxD1 */
-       {1, 22, 2, 0, 1}, /* RxD0 */
-       {1, 23, 2, 0, 1}, /* RxD1 */
-       {1, 26, 2, 0, 1}, /* RxER */
-       {1, 28, 2, 0, 1}, /* Rx_DV */
-       {1, 30, 1, 0, 1}, /* TxEN */
-       {1, 31, 2, 0, 1}, /* CRS */
-       {3, 10, 2, 0, 3}, /* TxCLK->CLK17 */
-#endif
-
-       /* END of table */
-       {0,  0, 0, 0, QE_IOP_TAB_END},
-};
-
 static int piggy_present(void)
 {
        struct km_bec_fpga __iomem *base =
index 71e2b75..a5cf0b6 100644 (file)
@@ -711,7 +711,7 @@ int g_dnl_board_usb_cable_connected(void)
 
        ret = generic_phy_init(&phy);
        if (ret) {
-               pr_err("failed to init %s USB PHY\n", dev->name);
+               pr_debug("failed to init %s USB PHY\n", dev->name);
                return ret;
        }
 
diff --git a/board/sunxi/mksunxi_fit_atf.sh b/board/sunxi/mksunxi_fit_atf.sh
deleted file mode 100755 (executable)
index 88ad719..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/bin/sh
-#
-# script to generate FIT image source for 64-bit sunxi boards with
-# ARM Trusted Firmware and multiple device trees (given on the command line)
-#
-# usage: $0 <dt_name> [<dt_name> [<dt_name] ...]
-
-[ -z "$BL31" ] && BL31="bl31.bin"
-
-if [ ! -f $BL31 ]; then
-       echo "WARNING: BL31 file $BL31 NOT found, resulting binary is non-functional" >&2
-       echo "Please read the section on ARM Trusted Firmware (ATF) in board/sunxi/README.sunxi64" >&2
-       BL31=/dev/null
-fi
-
-if grep -q "^CONFIG_MACH_SUN50I_H6=y" .config; then
-       BL31_ADDR=0x104000
-else
-       BL31_ADDR=0x44000
-fi
-
-cat << __HEADER_EOF
-/dts-v1/;
-
-/ {
-       description = "Configuration to load ATF before U-Boot";
-       #address-cells = <1>;
-
-       images {
-               uboot {
-                       description = "U-Boot (64-bit)";
-                       data = /incbin/("u-boot-nodtb.bin");
-                       type = "standalone";
-                       arch = "arm64";
-                       compression = "none";
-                       load = <0x4a000000>;
-               };
-               atf {
-                       description = "ARM Trusted Firmware";
-                       data = /incbin/("$BL31");
-                       type = "firmware";
-                       arch = "arm64";
-                       compression = "none";
-                       load = <$BL31_ADDR>;
-                       entry = <$BL31_ADDR>;
-               };
-__HEADER_EOF
-
-cnt=1
-for dtname in $*
-do
-       cat << __FDT_IMAGE_EOF
-               fdt_$cnt {
-                       description = "$(basename $dtname .dtb)";
-                       data = /incbin/("$dtname");
-                       type = "flat_dt";
-                       compression = "none";
-               };
-__FDT_IMAGE_EOF
-       cnt=$((cnt+1))
-done
-
-cat << __CONF_HEADER_EOF
-       };
-       configurations {
-               default = "config_1";
-
-__CONF_HEADER_EOF
-
-cnt=1
-for dtname in $*
-do
-       cat << __CONF_SECTION_EOF
-               config_$cnt {
-                       description = "$(basename $dtname .dtb)";
-                       firmware = "uboot";
-                       loadables = "atf";
-                       fdt = "fdt_$cnt";
-               };
-__CONF_SECTION_EOF
-       cnt=$((cnt+1))
-done
-
-cat << __ITS_EOF
-       };
-};
-__ITS_EOF
index e100adf..219c871 100644 (file)
@@ -5,3 +5,4 @@ F:      board/ti/am335x/
 F:     include/configs/am335x_evm.h
 F:     configs/am335x_boneblack_vboot_defconfig
 F:     configs/am335x_evm_defconfig
+F:     configs/am335x_evm_spiboot_defconfig
index ebaa6fa..7925b76 100644 (file)
@@ -117,6 +117,13 @@ static void __maybe_unused detect_enable_hyperflash(void *blob)
 }
 #endif
 
+#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_TARGET_J7200_A72_EVM)
+void spl_perform_fixups(struct spl_image_info *spl_image)
+{
+       detect_enable_hyperflash(spl_image->fdt_addr);
+}
+#endif
+
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
 int ft_board_setup(void *blob, struct bd_info *bd)
 {
index 30f7576..28f067a 100644 (file)
@@ -407,10 +407,8 @@ int dram_init(void)
 #else
 int dram_init_banksize(void)
 {
-#if defined(CONFIG_NR_DRAM_BANKS)
        gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
        gd->bd->bi_dram[0].size = get_effective_memsize();
-#endif
 
        mem_map_fill();
 
index 3a9c974..c7a08ed 100644 (file)
@@ -197,6 +197,8 @@ obj-$(CONFIG_$(SPL_)CMD_TLV_EEPROM) += tlv_eeprom.o
 # core command
 obj-y += nvedit.o
 
+obj-$(CONFIG_CMD_BCM_EXT_UTILS) += broadcom/
+
 obj-$(CONFIG_TI_COMMON_CMD_OPTIONS) += ti/
 
 filechk_data_gz = (echo "static const char data_gz[] ="; cat $< | scripts/bin2c; echo ";")
index 9593b34..0229846 100644 (file)
@@ -34,12 +34,6 @@ static void print_eth(int idx)
        printf("%-12s= %s\n", name, val);
 }
 
-static void print_phys_addr(const char *name, phys_addr_t value)
-{
-       printf("%-12s= 0x%.*llx\n", name, 2 * (int)sizeof(ulong),
-              (unsigned long long)value);
-}
-
 void bdinfo_print_mhz(const char *name, unsigned long hz)
 {
        char buf[32];
@@ -49,7 +43,6 @@ void bdinfo_print_mhz(const char *name, unsigned long hz)
 
 static void print_bi_dram(const struct bd_info *bd)
 {
-#ifdef CONFIG_NR_DRAM_BANKS
        int i;
 
        for (i = 0; i < CONFIG_NR_DRAM_BANKS; ++i) {
@@ -59,7 +52,6 @@ static void print_bi_dram(const struct bd_info *bd)
                        bdinfo_print_num("-> size",     bd->bi_dram[i].size);
                }
        }
-#endif
 }
 
 __weak void arch_print_bdinfo(void)
@@ -75,8 +67,6 @@ int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 #endif
        bdinfo_print_num("boot_params", (ulong)bd->bi_boot_params);
        print_bi_dram(bd);
-       bdinfo_print_num("memstart", (ulong)bd->bi_memstart);
-       print_phys_addr("memsize", bd->bi_memsize);
        if (IS_ENABLED(CONFIG_SYS_HAS_SRAM)) {
                bdinfo_print_num("sramstart", (ulong)bd->bi_sramstart);
                bdinfo_print_num("sramsize", (ulong)bd->bi_sramsize);
index 81ce256..684e4a9 100644 (file)
@@ -348,7 +348,7 @@ int do_bedbug_stack(struct cmd_tbl *cmdtp, int flag, int argc,
                return 1;
        }
 
-       top = gd->bd->bi_memstart + gd->bd->bi_memsize;
+       top = gd->ram_start + gd->ram_size;
        depth = 0;
 
        printf ("Depth     PC\n");
diff --git a/cmd/broadcom/Makefile b/cmd/broadcom/Makefile
new file mode 100644 (file)
index 0000000..62268d9
--- /dev/null
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright 2020 Broadcom
+
+obj-y += chimp_boot.o
+obj-y += nitro_image_load.o
+obj-y += chimp_handshake.o
diff --git a/cmd/broadcom/chimp_boot.c b/cmd/broadcom/chimp_boot.c
new file mode 100644 (file)
index 0000000..16f2b61
--- /dev/null
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2020 Broadcom
+ */
+
+#include <common.h>
+#include <command.h>
+#include <broadcom/chimp.h>
+
+static int do_chimp_fastboot_secure(struct cmd_tbl *cmdtp, int flag, int argc,
+                                   char *const argv[])
+{
+       u32 health = 0;
+
+       if (chimp_health_status_optee(&health)) {
+               pr_err("Chimp health command fail\n");
+               return CMD_RET_FAILURE;
+       }
+
+       if (health == BCM_CHIMP_RUNNIG_GOOD) {
+               printf("skip fastboot...\n");
+               return CMD_RET_SUCCESS;
+       }
+
+       if (chimp_fastboot_optee()) {
+               pr_err("Failed to load secure ChiMP image\n");
+               return CMD_RET_FAILURE;
+       }
+
+       return CMD_RET_SUCCESS;
+}
+
+U_BOOT_CMD
+       (chimp_ld_secure, 1, 0, do_chimp_fastboot_secure,
+        "Invoke chimp fw load via optee",
+        "chimp_ld_secure\n"
+);
diff --git a/cmd/broadcom/chimp_handshake.c b/cmd/broadcom/chimp_handshake.c
new file mode 100644 (file)
index 0000000..a90a73a
--- /dev/null
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2020 Broadcom
+ */
+
+#include <common.h>
+#include <command.h>
+#include <broadcom/chimp.h>
+
+/* This command should be called after loading the nitro binaries */
+static int do_chimp_hs(struct cmd_tbl *cmdtp, int flag, int argc,
+                      char *const argv[])
+{
+       int ret = CMD_RET_USAGE;
+       u32 hstatus;
+
+       /* Returns 1, if handshake call is success */
+       if (chimp_handshake_status_optee(0, &hstatus))
+               ret = CMD_RET_SUCCESS;
+
+       if (hstatus == CHIMP_HANDSHAKE_SUCCESS)
+               printf("ChiMP Handshake successful\n");
+       else
+               printf("ERROR: ChiMP Handshake status 0x%x\n", hstatus);
+
+       return ret;
+}
+
+U_BOOT_CMD
+       (chimp_hs, 1, 1, do_chimp_hs,
+        "Verify the Chimp handshake",
+        "chimp_hs\n"
+);
diff --git a/cmd/broadcom/nitro_image_load.c b/cmd/broadcom/nitro_image_load.c
new file mode 100644 (file)
index 0000000..4a36b30
--- /dev/null
@@ -0,0 +1,125 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2020 Broadcom
+ */
+
+#include <common.h>
+#include <command.h>
+
+#define FW_IMAGE_SIG   0xff123456
+#define CFG_IMAGE_SIG  0xcf54321a
+
+/*
+ * structure for bin file
+ *  signature: fw itb file
+ *  size: fw itb file
+ *  signature: NS3 config file
+ *  size: NS3 config file
+ *  Data: fw itb file
+ *  ............................
+ *  ............................
+ *  Data: NS3 config file
+ *  ............................
+ *  ............................
+ */
+
+static struct img_header {
+       u32 bin_sig;
+       u32 bin_size;
+       u32 cfg1_sig;
+       u32 cfg1_size;
+} *img_header;
+
+static int env_set_val(const char *varname, ulong val)
+{
+       int ret;
+
+       ret = env_set_hex(varname, val);
+       if (ret)
+               pr_err("Failed to %s env var\n", varname);
+
+       return ret;
+}
+
+static int do_spi_images_addr(struct cmd_tbl *cmdtp, int flag, int argc,
+                             char *const argv[])
+{
+       uintptr_t images_load_addr;
+       uintptr_t spi_load_addr;
+       u32 len;
+       u32 spi_data_offset = sizeof(struct img_header);
+
+       if (argc != 3)
+               return CMD_RET_USAGE;
+
+       /* convert command parameter to fastboot address (base 16), i.e. hex */
+       images_load_addr = simple_strtoul(argv[1], NULL, 16);
+       if (!images_load_addr) {
+               pr_err("Invalid load address\n");
+               return CMD_RET_USAGE;
+       }
+
+       spi_load_addr = simple_strtoul(argv[2], NULL, 16);
+       if (!spi_load_addr) {
+               pr_err("Invalid spi load address\n");
+               return CMD_RET_USAGE;
+       }
+
+       img_header = (struct img_header *)images_load_addr;
+
+       if (img_header->bin_sig != FW_IMAGE_SIG) {
+               pr_err("Invalid Nitro bin file\n");
+               goto error;
+       }
+
+       if (env_set_val("spi_nitro_fw_itb_start_addr", 0))
+               goto error;
+
+       if (env_set_val("spi_nitro_fw_itb_len", 0))
+               goto error;
+
+       if (env_set_val("spi_nitro_fw_ns3_cfg_start_addr", 0))
+               goto error;
+
+       if (env_set_val("spi_nitro_fw_ns3_cfg_len", 0))
+               goto error;
+
+       len = img_header->bin_size;
+
+       if (env_set_val("spi_nitro_fw_itb_start_addr",
+                       (spi_load_addr + spi_data_offset)))
+               goto error;
+
+       if (env_set_val("spi_nitro_fw_itb_len", img_header->bin_size))
+               goto error;
+
+       spi_data_offset += len;
+
+       if (img_header->cfg1_sig == CFG_IMAGE_SIG) {
+               len = img_header->cfg1_size;
+
+               if (env_set_val("spi_nitro_fw_ns3_cfg_start_addr",
+                               (spi_load_addr + spi_data_offset)))
+                       goto error;
+
+               if (env_set_val("spi_nitro_fw_ns3_cfg_len", len))
+                       goto error;
+
+               spi_data_offset += len;
+       }
+
+       /* disable secure boot */
+       if (env_set_val("nitro_fastboot_secure", 0))
+               goto error;
+
+       return CMD_RET_SUCCESS;
+
+error:
+       return CMD_RET_FAILURE;
+}
+
+U_BOOT_CMD
+       (spi_nitro_images_addr, 3, 1, do_spi_images_addr,
+        "Load the bnxt bin header and sets envs ",
+        "spi_nitro_images_addr <load_addr> <spi_base_addr>\n"
+);
index d3444c7..62473ab 100644 (file)
@@ -215,8 +215,6 @@ static int announce_dram_init(void)
 static int show_dram_config(void)
 {
        unsigned long long size;
-
-#ifdef CONFIG_NR_DRAM_BANKS
        int i;
 
        debug("\nRAM Configuration:\n");
@@ -229,9 +227,6 @@ static int show_dram_config(void)
 #endif
        }
        debug("\nDRAM:  ");
-#else
-       size = gd->ram_size;
-#endif
 
        print_size(size, "");
        board_add_ram_info(0);
@@ -242,10 +237,8 @@ static int show_dram_config(void)
 
 __weak int dram_init_banksize(void)
 {
-#if defined(CONFIG_NR_DRAM_BANKS) && defined(CONFIG_SYS_SDRAM_BASE)
-       gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
+       gd->bd->bi_dram[0].start = gd->ram_base;
        gd->bd->bi_dram[0].size = get_effective_memsize();
-#endif
 
        return 0;
 }
@@ -603,9 +596,6 @@ int setup_bdinfo(void)
 {
        struct bd_info *bd = gd->bd;
 
-       bd->bi_memstart = gd->ram_base;  /* start of memory */
-       bd->bi_memsize = gd->ram_size;   /* size in bytes */
-
        if (IS_ENABLED(CONFIG_SYS_HAS_SRAM)) {
                bd->bi_sramstart = CONFIG_SYS_SRAM_BASE; /* start of SRAM */
                bd->bi_sramsize = CONFIG_SYS_SRAM_SIZE;  /* size  of SRAM */
index da8bccd..645bfef 100644 (file)
@@ -685,14 +685,8 @@ phys_size_t env_get_bootm_size(void)
                return tmp;
        }
 
-#if (defined(CONFIG_ARM) || defined(CONFIG_MICROBLAZE)) && \
-     defined(CONFIG_NR_DRAM_BANKS)
-       start = gd->bd->bi_dram[0].start;
-       size = gd->bd->bi_dram[0].size;
-#else
-       start = gd->bd->bi_memstart;
-       size = gd->bd->bi_memsize;
-#endif
+       start = gd->ram_base;
+       size = gd->ram_size;
 
        if (start + size > gd->ram_top)
                size = gd->ram_top - start;
index e00b43e..62071bd 100644 (file)
@@ -12,18 +12,15 @@ DECLARE_GLOBAL_DATA_PTR;
 
 void handoff_save_dram(struct spl_handoff *ho)
 {
+       struct bd_info *bd = gd->bd;
+       int i;
+
        ho->ram_size = gd->ram_size;
-#ifdef CONFIG_NR_DRAM_BANKS
-       {
-               struct bd_info *bd = gd->bd;
-               int i;
-
-               for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
-                       ho->ram_bank[i].start = bd->bi_dram[i].start;
-                       ho->ram_bank[i].size = bd->bi_dram[i].size;
-               }
+
+       for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
+               ho->ram_bank[i].start = bd->bi_dram[i].start;
+               ho->ram_bank[i].size = bd->bi_dram[i].size;
        }
-#endif
 }
 
 void handoff_load_dram_size(struct spl_handoff *ho)
@@ -33,15 +30,11 @@ void handoff_load_dram_size(struct spl_handoff *ho)
 
 void handoff_load_dram_banks(struct spl_handoff *ho)
 {
-#ifdef CONFIG_NR_DRAM_BANKS
-       {
-               struct bd_info *bd = gd->bd;
-               int i;
-
-               for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
-                       bd->bi_dram[i].start = ho->ram_bank[i].start;
-                       bd->bi_dram[i].size = ho->ram_bank[i].size;
-               }
+       struct bd_info *bd = gd->bd;
+       int i;
+
+       for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
+               bd->bi_dram[i].start = ho->ram_bank[i].start;
+               bd->bi_dram[i].size = ho->ram_bank[i].size;
        }
-#endif
 }
index 734d26d..9a5f100 100644 (file)
@@ -191,12 +191,23 @@ static bool log_passes_filters(struct log_device *ldev, struct log_rec *rec)
 static int log_dispatch(struct log_rec *rec)
 {
        struct log_device *ldev;
+       static int processing_msg;
 
+       /*
+        * When a log driver writes messages (e.g. via the network stack) this
+        * may result in further generated messages. We cannot process them here
+        * as this might result in infinite recursion.
+        */
+       if (processing_msg)
+               return 0;
+
+       /* Emit message */
+       processing_msg = 1;
        list_for_each_entry(ldev, &gd->log_head, sibling_node) {
                if (log_passes_filters(ldev, rec))
                        ldev->drv->emit(ldev, rec);
        }
-
+       processing_msg = 0;
        return 0;
 }
 
index 149ff5a..2ae703f 100644 (file)
@@ -35,16 +35,9 @@ static int log_syslog_emit(struct log_device *ldev, struct log_rec *rec)
        char *log_msg;
        int eth_hdr_size;
        struct in_addr bcast_ip;
-       static int processing_msg;
        unsigned int log_level;
        char *log_hostname;
 
-       /* Fend off messages from the network stack while writing a message */
-       if (processing_msg)
-               return 0;
-
-       processing_msg = 1;
-
        /* Setup packet buffers */
        net_init();
        /* Disable hardware and put it into the reset state */
@@ -108,7 +101,6 @@ static int log_syslog_emit(struct log_device *ldev, struct log_rec *rec)
        net_send_packet((uchar *)msg, ptr - msg);
 
 out:
-       processing_msg = 0;
        return ret;
 }
 
diff --git a/configs/P1010RDB-PA_36BIT_NAND_SECBOOT_defconfig b/configs/P1010RDB-PA_36BIT_NAND_SECBOOT_defconfig
deleted file mode 100644 (file)
index d0c8732..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11000000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P1010RDB_PA=y
-# CONFIG_SYS_MALLOC_F is not set
-CONFIG_PHYS_64BIT=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="NAND_SECBOOT"
-CONFIG_BOOTDELAY=10
-CONFIG_SYS_CONSOLE_IS_IN_ENV=y
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_MTDIDS_DEFAULT="nand0=ff800000.flash"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=ff800000.flash:2m(uboot-env),1m(dtb),5m(kernel),56m(fs),-(usr)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
index b77a5d0..dcd13b3 100644 (file)
@@ -49,6 +49,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_FSL_ESDHC=y
@@ -73,8 +75,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
diff --git a/configs/P1010RDB-PA_36BIT_NOR_SECBOOT_defconfig b/configs/P1010RDB-PA_36BIT_NOR_SECBOOT_defconfig
deleted file mode 100644 (file)
index 8534015..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P1010RDB_PA=y
-# CONFIG_SYS_MALLOC_F is not set
-CONFIG_PHYS_64BIT=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=10
-CONFIG_SYS_CONSOLE_IS_IN_ENV=y
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_MTDIDS_DEFAULT="nand0=ff800000.flash"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=ff800000.flash:2m(uboot-env),1m(dtb),5m(kernel),56m(fs),-(usr)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
index 1ea7e3e..b3ee604 100644 (file)
@@ -32,6 +32,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_ENV_ADDR=0xEFF20000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_FSL_ESDHC=y
@@ -55,8 +57,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
index 7b6b70f..cc9e7f5 100644 (file)
@@ -44,6 +44,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_FSL_ESDHC=y
@@ -67,8 +69,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
diff --git a/configs/P1010RDB-PA_36BIT_SPIFLASH_SECBOOT_defconfig b/configs/P1010RDB-PA_36BIT_SPIFLASH_SECBOOT_defconfig
deleted file mode 100644 (file)
index 2949654..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11000000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P1010RDB_PA=y
-# CONFIG_SYS_MALLOC_F is not set
-CONFIG_PHYS_64BIT=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="SPIFLASH"
-CONFIG_BOOTDELAY=10
-CONFIG_SYS_CONSOLE_IS_IN_ENV=y
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_MTDIDS_DEFAULT="nand0=ff800000.flash"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=ff800000.flash:2m(uboot-env),1m(dtb),5m(kernel),56m(fs),-(usr)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
index 4bc60f1..6321780 100644 (file)
@@ -46,6 +46,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_FSL_ESDHC=y
@@ -69,8 +71,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
diff --git a/configs/P1010RDB-PA_NAND_SECBOOT_defconfig b/configs/P1010RDB-PA_NAND_SECBOOT_defconfig
deleted file mode 100644 (file)
index 8c7460f..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11000000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P1010RDB_PA=y
-# 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_SYS_EXTRA_OPTIONS="NAND_SECBOOT"
-CONFIG_BOOTDELAY=10
-CONFIG_SYS_CONSOLE_IS_IN_ENV=y
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_MTDIDS_DEFAULT="nand0=ff800000.flash"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=ff800000.flash:2m(uboot-env),1m(dtb),5m(kernel),56m(fs),-(usr)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
index ea9f905..63d0529 100644 (file)
@@ -48,6 +48,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_FSL_ESDHC=y
@@ -72,8 +74,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
diff --git a/configs/P1010RDB-PA_NOR_SECBOOT_defconfig b/configs/P1010RDB-PA_NOR_SECBOOT_defconfig
deleted file mode 100644 (file)
index 098c017..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P1010RDB_PA=y
-# 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_BOOTDELAY=10
-CONFIG_SYS_CONSOLE_IS_IN_ENV=y
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_MTDIDS_DEFAULT="nand0=ff800000.flash"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=ff800000.flash:2m(uboot-env),1m(dtb),5m(kernel),56m(fs),-(usr)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
index f8093c1..82f0cb8 100644 (file)
@@ -31,6 +31,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_ENV_ADDR=0xEFF20000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_FSL_ESDHC=y
@@ -54,8 +56,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
index e0a75a1..d5bdc8c 100644 (file)
@@ -43,6 +43,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_FSL_ESDHC=y
@@ -66,8 +68,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
diff --git a/configs/P1010RDB-PA_SPIFLASH_SECBOOT_defconfig b/configs/P1010RDB-PA_SPIFLASH_SECBOOT_defconfig
deleted file mode 100644 (file)
index ac5c31f..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11000000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P1010RDB_PA=y
-# 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_SYS_EXTRA_OPTIONS="SPIFLASH"
-CONFIG_BOOTDELAY=10
-CONFIG_SYS_CONSOLE_IS_IN_ENV=y
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_MTDIDS_DEFAULT="nand0=ff800000.flash"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=ff800000.flash:2m(uboot-env),1m(dtb),5m(kernel),56m(fs),-(usr)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
index c8212d7..1ab6342 100644 (file)
@@ -45,6 +45,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_FSL_ESDHC=y
@@ -68,8 +70,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
diff --git a/configs/P1010RDB-PB_36BIT_NAND_SECBOOT_defconfig b/configs/P1010RDB-PB_36BIT_NAND_SECBOOT_defconfig
deleted file mode 100644 (file)
index 51057f8..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11000000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P1010RDB_PB=y
-# CONFIG_SYS_MALLOC_F is not set
-CONFIG_PHYS_64BIT=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="NAND_SECBOOT"
-CONFIG_BOOTDELAY=10
-CONFIG_SYS_CONSOLE_IS_IN_ENV=y
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_MTDIDS_DEFAULT="nand0=ff800000.flash"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=ff800000.flash:2m(uboot-env),1m(dtb),5m(kernel),56m(fs),-(usr)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
index e109e9c..0b418bc 100644 (file)
@@ -49,6 +49,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_FSL_ESDHC=y
@@ -73,8 +75,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
diff --git a/configs/P1010RDB-PB_36BIT_NOR_SECBOOT_defconfig b/configs/P1010RDB-PB_36BIT_NOR_SECBOOT_defconfig
deleted file mode 100644 (file)
index 0984b3f..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P1010RDB_PB=y
-# CONFIG_SYS_MALLOC_F is not set
-CONFIG_PHYS_64BIT=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=10
-CONFIG_SYS_CONSOLE_IS_IN_ENV=y
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_MTDIDS_DEFAULT="nand0=ff800000.flash"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=ff800000.flash:2m(uboot-env),1m(dtb),5m(kernel),56m(fs),-(usr)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
index 0e01e2b..6e3511b 100644 (file)
@@ -32,6 +32,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_ENV_ADDR=0xEFF20000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_FSL_ESDHC=y
@@ -55,8 +57,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
index c4f052b..58b39f4 100644 (file)
@@ -44,6 +44,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_FSL_ESDHC=y
@@ -67,8 +69,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
diff --git a/configs/P1010RDB-PB_36BIT_SPIFLASH_SECBOOT_defconfig b/configs/P1010RDB-PB_36BIT_SPIFLASH_SECBOOT_defconfig
deleted file mode 100644 (file)
index fad3f91..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11000000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P1010RDB_PB=y
-# CONFIG_SYS_MALLOC_F is not set
-CONFIG_PHYS_64BIT=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="SPIFLASH"
-CONFIG_BOOTDELAY=10
-CONFIG_SYS_CONSOLE_IS_IN_ENV=y
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_MTDIDS_DEFAULT="nand0=ff800000.flash"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=ff800000.flash:2m(uboot-env),1m(dtb),5m(kernel),56m(fs),-(usr)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
index 57d0687..0b9ae9c 100644 (file)
@@ -46,6 +46,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_FSL_ESDHC=y
@@ -69,8 +71,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
diff --git a/configs/P1010RDB-PB_NAND_SECBOOT_defconfig b/configs/P1010RDB-PB_NAND_SECBOOT_defconfig
deleted file mode 100644 (file)
index a0a0b54..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11000000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P1010RDB_PB=y
-# 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_SYS_EXTRA_OPTIONS="NAND_SECBOOT"
-CONFIG_BOOTDELAY=10
-CONFIG_SYS_CONSOLE_IS_IN_ENV=y
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_MTDIDS_DEFAULT="nand0=ff800000.flash"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=ff800000.flash:2m(uboot-env),1m(dtb),5m(kernel),56m(fs),-(usr)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
index 37eddf6..96d2dbe 100644 (file)
@@ -48,6 +48,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_FSL_ESDHC=y
@@ -72,8 +74,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
diff --git a/configs/P1010RDB-PB_NOR_SECBOOT_defconfig b/configs/P1010RDB-PB_NOR_SECBOOT_defconfig
deleted file mode 100644 (file)
index ab2a339..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P1010RDB_PB=y
-# 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_BOOTDELAY=10
-CONFIG_SYS_CONSOLE_IS_IN_ENV=y
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_MTDIDS_DEFAULT="nand0=ff800000.flash"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=ff800000.flash:2m(uboot-env),1m(dtb),5m(kernel),56m(fs),-(usr)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
index 31e5157..4e9acbf 100644 (file)
@@ -31,6 +31,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_ENV_ADDR=0xEFF20000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_FSL_ESDHC=y
@@ -54,8 +56,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
index 2cf26ab..a6efea4 100644 (file)
@@ -43,6 +43,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_FSL_ESDHC=y
@@ -66,8 +68,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
diff --git a/configs/P1010RDB-PB_SPIFLASH_SECBOOT_defconfig b/configs/P1010RDB-PB_SPIFLASH_SECBOOT_defconfig
deleted file mode 100644 (file)
index c77d8e8..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11000000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P1010RDB_PB=y
-# 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_SYS_EXTRA_OPTIONS="SPIFLASH"
-CONFIG_BOOTDELAY=10
-CONFIG_SYS_CONSOLE_IS_IN_ENV=y
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_MTDIDS_DEFAULT="nand0=ff800000.flash"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=ff800000.flash:2m(uboot-env),1m(dtb),5m(kernel),56m(fs),-(usr)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
index 5f578bd..f31b3bd 100644 (file)
@@ -45,6 +45,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_FSL_ESDHC=y
@@ -68,8 +70,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
diff --git a/configs/P1020MBG-PC_36BIT_SDCARD_defconfig b/configs/P1020MBG-PC_36BIT_SDCARD_defconfig
deleted file mode 100644 (file)
index b5ef395..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11001000
-CONFIG_SPL_LIBCOMMON_SUPPORT=y
-CONFIG_SPL_LIBGENERIC_SUPPORT=y
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_OFFSET=0x0
-CONFIG_SPL_TEXT_BASE=0xf8f81000
-CONFIG_SPL_MMC_SUPPORT=y
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_SPL=y
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1020MBG=y
-CONFIG_PHYS_64BIT=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="SDCARD"
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-# CONFIG_SPL_FRAMEWORK is not set
-CONFIG_SPL_MMC_BOOT=y
-CONFIG_SPL_ENV_SUPPORT=y
-CONFIG_SPL_I2C_SUPPORT=y
-CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_MMC=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1020MBG-PC_36BIT_defconfig b/configs/P1020MBG-PC_36BIT_defconfig
deleted file mode 100644 (file)
index 39abe1f..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_SECT_SIZE=0x20000
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1020MBG=y
-CONFIG_PHYS_64BIT=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_FLASH=y
-CONFIG_ENV_ADDR=0xEFF20000
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1020MBG-PC_SDCARD_defconfig b/configs/P1020MBG-PC_SDCARD_defconfig
deleted file mode 100644 (file)
index 12b0175..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11001000
-CONFIG_SPL_LIBCOMMON_SUPPORT=y
-CONFIG_SPL_LIBGENERIC_SUPPORT=y
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_OFFSET=0x0
-CONFIG_SPL_TEXT_BASE=0xf8f81000
-CONFIG_SPL_MMC_SUPPORT=y
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_SPL=y
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1020MBG=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="SDCARD"
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-# CONFIG_SPL_FRAMEWORK is not set
-CONFIG_SPL_MMC_BOOT=y
-CONFIG_SPL_ENV_SUPPORT=y
-CONFIG_SPL_I2C_SUPPORT=y
-CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_MMC=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1020MBG-PC_defconfig b/configs/P1020MBG-PC_defconfig
deleted file mode 100644 (file)
index 71ad06c..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_SECT_SIZE=0x20000
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1020MBG=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_FLASH=y
-CONFIG_ENV_ADDR=0xEFF20000
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_OF_LIBFDT=y
index 6db4bd7..623e6d7 100644 (file)
@@ -49,6 +49,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -62,6 +64,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -73,8 +76,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -83,5 +88,6 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
index cacce4d..523d308 100644 (file)
@@ -45,6 +45,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -57,6 +59,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -68,8 +71,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -78,5 +83,6 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
index 3c9e491..092c0db 100644 (file)
@@ -47,6 +47,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -59,6 +61,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -70,8 +73,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -80,5 +85,6 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
index 5c68ea0..2aeada2 100644 (file)
@@ -34,6 +34,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_ENV_ADDR=0xEFF20000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -46,6 +48,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -57,8 +60,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -67,5 +72,6 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
index 9883204..8c099f2 100644 (file)
@@ -48,6 +48,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -61,6 +63,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -72,8 +75,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -82,4 +87,5 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
index 22ba4f6..e54e662 100644 (file)
@@ -44,6 +44,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -56,6 +58,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -67,8 +70,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -77,4 +82,5 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
index 250b56d..32ca2b5 100644 (file)
@@ -46,6 +46,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -58,6 +60,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -69,8 +72,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -79,4 +84,5 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
index 329bd72..f0c9c82 100644 (file)
@@ -33,6 +33,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_ENV_ADDR=0xEFF20000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -45,6 +47,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -56,8 +59,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -66,4 +71,5 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
index 5d7f16a..32cf0d6 100644 (file)
@@ -51,6 +51,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -65,6 +67,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -76,8 +79,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -86,4 +91,5 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
index 12d70e8..e9dd3bd 100644 (file)
@@ -47,6 +47,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -60,6 +62,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -71,8 +74,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -81,4 +86,5 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
index 6da7157..14c040f 100644 (file)
@@ -49,6 +49,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -62,6 +64,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -73,8 +76,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -83,4 +88,5 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
index c39509e..4018f3c 100644 (file)
@@ -36,6 +36,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_ENV_ADDR=0xEFF20000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -49,6 +51,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -60,8 +63,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -70,4 +75,5 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
diff --git a/configs/P1020UTM-PC_36BIT_SDCARD_defconfig b/configs/P1020UTM-PC_36BIT_SDCARD_defconfig
deleted file mode 100644 (file)
index d0b5065..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11001000
-CONFIG_SPL_LIBCOMMON_SUPPORT=y
-CONFIG_SPL_LIBGENERIC_SUPPORT=y
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_OFFSET=0x0
-CONFIG_SPL_TEXT_BASE=0xf8f81000
-CONFIG_SPL_MMC_SUPPORT=y
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_SPL=y
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1020UTM=y
-CONFIG_PHYS_64BIT=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="SDCARD"
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-# CONFIG_SPL_FRAMEWORK is not set
-CONFIG_SPL_MMC_BOOT=y
-CONFIG_SPL_ENV_SUPPORT=y
-CONFIG_SPL_I2C_SUPPORT=y
-CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_MMC=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1020UTM-PC_36BIT_defconfig b/configs/P1020UTM-PC_36BIT_defconfig
deleted file mode 100644 (file)
index 5e3a92d..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_SECT_SIZE=0x20000
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1020UTM=y
-CONFIG_PHYS_64BIT=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_FLASH=y
-CONFIG_ENV_ADDR=0xEFF20000
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1020UTM-PC_SDCARD_defconfig b/configs/P1020UTM-PC_SDCARD_defconfig
deleted file mode 100644 (file)
index 6c06815..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11001000
-CONFIG_SPL_LIBCOMMON_SUPPORT=y
-CONFIG_SPL_LIBGENERIC_SUPPORT=y
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_OFFSET=0x0
-CONFIG_SPL_TEXT_BASE=0xf8f81000
-CONFIG_SPL_MMC_SUPPORT=y
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_SPL=y
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1020UTM=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="SDCARD"
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-# CONFIG_SPL_FRAMEWORK is not set
-CONFIG_SPL_MMC_BOOT=y
-CONFIG_SPL_ENV_SUPPORT=y
-CONFIG_SPL_I2C_SUPPORT=y
-CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_MMC=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1020UTM-PC_defconfig b/configs/P1020UTM-PC_defconfig
deleted file mode 100644 (file)
index 69744a3..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_SECT_SIZE=0x20000
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1020UTM=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_FLASH=y
-CONFIG_ENV_ADDR=0xEFF20000
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1021RDB-PC_36BIT_NAND_defconfig b/configs/P1021RDB-PC_36BIT_NAND_defconfig
deleted file mode 100644 (file)
index ca5baae..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11001000
-CONFIG_ENV_SIZE=0x4000
-CONFIG_ENV_OFFSET=0x100000
-CONFIG_SPL_TEXT_BASE=0xFF800000
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_TPL_LIBCOMMON_SUPPORT=y
-CONFIG_TPL_LIBGENERIC_SUPPORT=y
-CONFIG_SPL=y
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1021RDB=y
-CONFIG_PHYS_64BIT=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/powerpc/cpu/mpc85xx/u-boot-nand.lds"
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-# CONFIG_SPL_FRAMEWORK is not set
-CONFIG_SPL_NAND_BOOT=y
-CONFIG_SPL_NAND_SUPPORT=y
-CONFIG_TPL=y
-CONFIG_TPL_ENV_SUPPORT=y
-CONFIG_TPL_I2C_SUPPORT=y
-CONFIG_TPL_MPC8XXX_INIT_DDR_SUPPORT=y
-CONFIG_TPL_NAND_SUPPORT=y
-CONFIG_TPL_SERIAL_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_PCI=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_CMD_MTDPARTS=y
-CONFIG_MTDIDS_DEFAULT="nor0=fef000000.nor"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=fef000000.nor:256k(vsc7385-firmware),256k(dtb),4608k(kernel),9728k(fs),256k(qe-ucode-firmware),1280k(u-boot)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_NAND=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_FLASH_CFI_MTD=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_MTD_RAW_NAND=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1021RDB-PC_36BIT_SDCARD_defconfig b/configs/P1021RDB-PC_36BIT_SDCARD_defconfig
deleted file mode 100644 (file)
index 7a64eec..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11001000
-CONFIG_SPL_LIBCOMMON_SUPPORT=y
-CONFIG_SPL_LIBGENERIC_SUPPORT=y
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_OFFSET=0x0
-CONFIG_SPL_TEXT_BASE=0xf8f81000
-CONFIG_SPL_MMC_SUPPORT=y
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_SPL=y
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1021RDB=y
-CONFIG_PHYS_64BIT=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="SDCARD"
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-# CONFIG_SPL_FRAMEWORK is not set
-CONFIG_SPL_MMC_BOOT=y
-CONFIG_SPL_ENV_SUPPORT=y
-CONFIG_SPL_I2C_SUPPORT=y
-CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_PCI=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_CMD_MTDPARTS=y
-CONFIG_MTDIDS_DEFAULT="nor0=fef000000.nor"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=fef000000.nor:256k(vsc7385-firmware),256k(dtb),4608k(kernel),9728k(fs),256k(qe-ucode-firmware),1280k(u-boot)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_MMC=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_FLASH_CFI_MTD=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1021RDB-PC_36BIT_SPIFLASH_defconfig b/configs/P1021RDB-PC_36BIT_SPIFLASH_defconfig
deleted file mode 100644 (file)
index cc0fc1e..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11001000
-CONFIG_SPL_LIBCOMMON_SUPPORT=y
-CONFIG_SPL_LIBGENERIC_SUPPORT=y
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_OFFSET=0x100000
-CONFIG_ENV_SECT_SIZE=0x10000
-CONFIG_SPL_TEXT_BASE=0xf8f81000
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_SPL=y
-CONFIG_SPL_SPI_FLASH_SUPPORT=y
-CONFIG_SPL_SPI_SUPPORT=y
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1021RDB=y
-CONFIG_PHYS_64BIT=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="SPIFLASH"
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-# CONFIG_SPL_FRAMEWORK is not set
-CONFIG_SPL_SPI_BOOT=y
-CONFIG_SPL_ENV_SUPPORT=y
-CONFIG_SPL_I2C_SUPPORT=y
-CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_PCI=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_CMD_MTDPARTS=y
-CONFIG_MTDIDS_DEFAULT="nor0=fef000000.nor"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=fef000000.nor:256k(vsc7385-firmware),256k(dtb),4608k(kernel),9728k(fs),256k(qe-ucode-firmware),1280k(u-boot)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_FLASH_CFI_MTD=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1021RDB-PC_36BIT_defconfig b/configs/P1021RDB-PC_36BIT_defconfig
deleted file mode 100644 (file)
index 58cdba9..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_SECT_SIZE=0x20000
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1021RDB=y
-CONFIG_PHYS_64BIT=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_PCI=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_CMD_MTDPARTS=y
-CONFIG_MTDIDS_DEFAULT="nor0=fef000000.nor"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=fef000000.nor:256k(vsc7385-firmware),256k(dtb),4608k(kernel),9728k(fs),256k(qe-ucode-firmware),1280k(u-boot)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_FLASH=y
-CONFIG_ENV_ADDR=0xEFF20000
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_FLASH_CFI_MTD=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1021RDB-PC_NAND_defconfig b/configs/P1021RDB-PC_NAND_defconfig
deleted file mode 100644 (file)
index e8f99f0..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11001000
-CONFIG_ENV_SIZE=0x4000
-CONFIG_ENV_OFFSET=0x100000
-CONFIG_SPL_TEXT_BASE=0xFF800000
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_TPL_LIBCOMMON_SUPPORT=y
-CONFIG_TPL_LIBGENERIC_SUPPORT=y
-CONFIG_SPL=y
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1021RDB=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/powerpc/cpu/mpc85xx/u-boot-nand.lds"
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-# CONFIG_SPL_FRAMEWORK is not set
-CONFIG_SPL_NAND_BOOT=y
-CONFIG_SPL_NAND_SUPPORT=y
-CONFIG_TPL=y
-CONFIG_TPL_ENV_SUPPORT=y
-CONFIG_TPL_I2C_SUPPORT=y
-CONFIG_TPL_MPC8XXX_INIT_DDR_SUPPORT=y
-CONFIG_TPL_NAND_SUPPORT=y
-CONFIG_TPL_SERIAL_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_PCI=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_CMD_MTDPARTS=y
-CONFIG_MTDIDS_DEFAULT="nor0=ef000000.nor"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=ef000000.nor:256k(vsc7385-firmware),256k(dtb),4608k(kernel),9728k(fs),256k(qe-ucode-firmware),1280k(u-boot)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_NAND=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_FLASH_CFI_MTD=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_MTD_RAW_NAND=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1021RDB-PC_SDCARD_defconfig b/configs/P1021RDB-PC_SDCARD_defconfig
deleted file mode 100644 (file)
index e285c01..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11001000
-CONFIG_SPL_LIBCOMMON_SUPPORT=y
-CONFIG_SPL_LIBGENERIC_SUPPORT=y
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_OFFSET=0x0
-CONFIG_SPL_TEXT_BASE=0xf8f81000
-CONFIG_SPL_MMC_SUPPORT=y
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_SPL=y
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1021RDB=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="SDCARD"
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-# CONFIG_SPL_FRAMEWORK is not set
-CONFIG_SPL_MMC_BOOT=y
-CONFIG_SPL_ENV_SUPPORT=y
-CONFIG_SPL_I2C_SUPPORT=y
-CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_PCI=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_CMD_MTDPARTS=y
-CONFIG_MTDIDS_DEFAULT="nor0=ef000000.nor"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=ef000000.nor:256k(vsc7385-firmware),256k(dtb),4608k(kernel),9728k(fs),256k(qe-ucode-firmware),1280k(u-boot)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_MMC=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_FLASH_CFI_MTD=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1021RDB-PC_SPIFLASH_defconfig b/configs/P1021RDB-PC_SPIFLASH_defconfig
deleted file mode 100644 (file)
index 3c1b4c8..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11001000
-CONFIG_SPL_LIBCOMMON_SUPPORT=y
-CONFIG_SPL_LIBGENERIC_SUPPORT=y
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_OFFSET=0x100000
-CONFIG_ENV_SECT_SIZE=0x10000
-CONFIG_SPL_TEXT_BASE=0xf8f81000
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_SPL=y
-CONFIG_SPL_SPI_FLASH_SUPPORT=y
-CONFIG_SPL_SPI_SUPPORT=y
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1021RDB=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="SPIFLASH"
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-# CONFIG_SPL_FRAMEWORK is not set
-CONFIG_SPL_SPI_BOOT=y
-CONFIG_SPL_ENV_SUPPORT=y
-CONFIG_SPL_I2C_SUPPORT=y
-CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_PCI=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_CMD_MTDPARTS=y
-CONFIG_MTDIDS_DEFAULT="nor0=ef000000.nor"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=ef000000.nor:256k(vsc7385-firmware),256k(dtb),4608k(kernel),9728k(fs),256k(qe-ucode-firmware),1280k(u-boot)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_FLASH_CFI_MTD=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1021RDB-PC_defconfig b/configs/P1021RDB-PC_defconfig
deleted file mode 100644 (file)
index 4b2083c..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_SECT_SIZE=0x20000
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1021RDB=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_PCI=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_CMD_MTDPARTS=y
-CONFIG_MTDIDS_DEFAULT="nor0=ef000000.nor"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=ef000000.nor:256k(vsc7385-firmware),256k(dtb),4608k(kernel),9728k(fs),256k(qe-ucode-firmware),1280k(u-boot)"
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_FLASH=y
-CONFIG_ENV_ADDR=0xEFF20000
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_FLASH_CFI_MTD=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1023RDB_defconfig b/configs/P1023RDB_defconfig
deleted file mode 100644 (file)
index a8bb576..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_SECT_SIZE=0x20000
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1023RDB=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=-1
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_REGINFO=y
-CONFIG_CMD_IMLS=y
-# CONFIG_CMD_EEPROM is not set
-CONFIG_CMD_I2C=y
-CONFIG_CMD_NAND=y
-CONFIG_CMD_PCI=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_FLASH=y
-CONFIG_ENV_ADDR=0xEFF20000
-# CONFIG_MMC is not set
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_MTD_RAW_NAND=y
-CONFIG_PHYLIB=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_FMAN_ENET=y
-CONFIG_MII=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1024RDB_36BIT_defconfig b/configs/P1024RDB_36BIT_defconfig
deleted file mode 100644 (file)
index e74fc7f..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_SECT_SIZE=0x20000
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1024RDB=y
-CONFIG_PHYS_64BIT=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_FLASH=y
-CONFIG_ENV_ADDR=0xEFF20000
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1024RDB_NAND_defconfig b/configs/P1024RDB_NAND_defconfig
deleted file mode 100644 (file)
index d1e91d3..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11001000
-CONFIG_ENV_SIZE=0x4000
-CONFIG_ENV_OFFSET=0x100000
-CONFIG_SPL_TEXT_BASE=0xFF800000
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_TPL_LIBCOMMON_SUPPORT=y
-CONFIG_TPL_LIBGENERIC_SUPPORT=y
-CONFIG_SPL=y
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1024RDB=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/powerpc/cpu/mpc85xx/u-boot-nand.lds"
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-# CONFIG_SPL_FRAMEWORK is not set
-CONFIG_SPL_NAND_BOOT=y
-CONFIG_SPL_NAND_SUPPORT=y
-CONFIG_TPL=y
-CONFIG_TPL_ENV_SUPPORT=y
-CONFIG_TPL_I2C_SUPPORT=y
-CONFIG_TPL_MPC8XXX_INIT_DDR_SUPPORT=y
-CONFIG_TPL_NAND_SUPPORT=y
-CONFIG_TPL_SERIAL_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_NAND=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_MTD_RAW_NAND=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1024RDB_SDCARD_defconfig b/configs/P1024RDB_SDCARD_defconfig
deleted file mode 100644 (file)
index e803ed8..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11001000
-CONFIG_SPL_LIBCOMMON_SUPPORT=y
-CONFIG_SPL_LIBGENERIC_SUPPORT=y
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_OFFSET=0x0
-CONFIG_SPL_TEXT_BASE=0xf8f81000
-CONFIG_SPL_MMC_SUPPORT=y
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_SPL=y
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1024RDB=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="SDCARD"
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-# CONFIG_SPL_FRAMEWORK is not set
-CONFIG_SPL_MMC_BOOT=y
-CONFIG_SPL_ENV_SUPPORT=y
-CONFIG_SPL_I2C_SUPPORT=y
-CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_MMC=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1024RDB_SPIFLASH_defconfig b/configs/P1024RDB_SPIFLASH_defconfig
deleted file mode 100644 (file)
index ffabd5e..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11001000
-CONFIG_SPL_LIBCOMMON_SUPPORT=y
-CONFIG_SPL_LIBGENERIC_SUPPORT=y
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_OFFSET=0x100000
-CONFIG_ENV_SECT_SIZE=0x10000
-CONFIG_SPL_TEXT_BASE=0xf8f81000
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_SPL=y
-CONFIG_SPL_SPI_FLASH_SUPPORT=y
-CONFIG_SPL_SPI_SUPPORT=y
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1024RDB=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="SPIFLASH"
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-# CONFIG_SPL_FRAMEWORK is not set
-CONFIG_SPL_SPI_BOOT=y
-CONFIG_SPL_ENV_SUPPORT=y
-CONFIG_SPL_I2C_SUPPORT=y
-CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1024RDB_defconfig b/configs/P1024RDB_defconfig
deleted file mode 100644 (file)
index e4adc0f..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_SECT_SIZE=0x20000
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1024RDB=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_FLASH=y
-CONFIG_ENV_ADDR=0xEFF20000
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1025RDB_36BIT_defconfig b/configs/P1025RDB_36BIT_defconfig
deleted file mode 100644 (file)
index d0fc144..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_SECT_SIZE=0x20000
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1025RDB=y
-CONFIG_PHYS_64BIT=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_PCI=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_FLASH=y
-CONFIG_ENV_ADDR=0xEFF20000
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1025RDB_NAND_defconfig b/configs/P1025RDB_NAND_defconfig
deleted file mode 100644 (file)
index 58efd11..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11001000
-CONFIG_ENV_SIZE=0x4000
-CONFIG_ENV_OFFSET=0x100000
-CONFIG_SPL_TEXT_BASE=0xFF800000
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_TPL_LIBCOMMON_SUPPORT=y
-CONFIG_TPL_LIBGENERIC_SUPPORT=y
-CONFIG_SPL=y
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1025RDB=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/powerpc/cpu/mpc85xx/u-boot-nand.lds"
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-# CONFIG_SPL_FRAMEWORK is not set
-CONFIG_SPL_NAND_BOOT=y
-CONFIG_SPL_NAND_SUPPORT=y
-CONFIG_TPL=y
-CONFIG_TPL_ENV_SUPPORT=y
-CONFIG_TPL_I2C_SUPPORT=y
-CONFIG_TPL_MPC8XXX_INIT_DDR_SUPPORT=y
-CONFIG_TPL_NAND_SUPPORT=y
-CONFIG_TPL_SERIAL_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_NAND=y
-CONFIG_CMD_PCI=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_NAND=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_MTD_RAW_NAND=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1025RDB_SDCARD_defconfig b/configs/P1025RDB_SDCARD_defconfig
deleted file mode 100644 (file)
index dad06be..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11001000
-CONFIG_SPL_LIBCOMMON_SUPPORT=y
-CONFIG_SPL_LIBGENERIC_SUPPORT=y
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_OFFSET=0x0
-CONFIG_SPL_TEXT_BASE=0xf8f81000
-CONFIG_SPL_MMC_SUPPORT=y
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_SPL=y
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1025RDB=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="SDCARD"
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-# CONFIG_SPL_FRAMEWORK is not set
-CONFIG_SPL_MMC_BOOT=y
-CONFIG_SPL_ENV_SUPPORT=y
-CONFIG_SPL_I2C_SUPPORT=y
-CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_PCI=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_MMC=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1025RDB_SPIFLASH_defconfig b/configs/P1025RDB_SPIFLASH_defconfig
deleted file mode 100644 (file)
index 48e3540..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0x11001000
-CONFIG_SPL_LIBCOMMON_SUPPORT=y
-CONFIG_SPL_LIBGENERIC_SUPPORT=y
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_OFFSET=0x100000
-CONFIG_ENV_SECT_SIZE=0x10000
-CONFIG_SPL_TEXT_BASE=0xf8f81000
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_SPL=y
-CONFIG_SPL_SPI_FLASH_SUPPORT=y
-CONFIG_SPL_SPI_SUPPORT=y
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1025RDB=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="SPIFLASH"
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-# CONFIG_SPL_FRAMEWORK is not set
-CONFIG_SPL_SPI_BOOT=y
-CONFIG_SPL_ENV_SUPPORT=y
-CONFIG_SPL_I2C_SUPPORT=y
-CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_PCI=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P1025RDB_defconfig b/configs/P1025RDB_defconfig
deleted file mode 100644 (file)
index 7164526..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_SECT_SIZE=0x20000
-CONFIG_MPC85xx=y
-# CONFIG_CMD_ERRATA is not set
-CONFIG_TARGET_P1025RDB=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=10
-# CONFIG_MISC_INIT_R is not set
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-# CONFIG_AUTO_COMPLETE is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_PCI=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_DATE=y
-CONFIG_MP=y
-# CONFIG_CMD_HASH is not set
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_FLASH=y
-CONFIG_ENV_ADDR=0xEFF20000
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_ATHEROS=y
-CONFIG_PHY_BROADCOM=y
-CONFIG_PHY_DAVICOM=y
-CONFIG_PHY_LXT=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_NATSEMI=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_SMSC=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_MII=y
-CONFIG_TSEC_ENET=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_OF_LIBFDT=y
index 1e0bd20..130b08e 100644 (file)
@@ -53,6 +53,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -67,6 +69,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -78,8 +81,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -88,5 +93,6 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
index df57340..31e9528 100644 (file)
@@ -49,6 +49,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -62,6 +64,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -73,8 +76,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -83,5 +88,6 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
index 1b25021..352b35c 100644 (file)
@@ -51,6 +51,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -64,6 +66,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -75,8 +78,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -85,5 +90,6 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
index e5573cd..68ccadb 100644 (file)
@@ -38,6 +38,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_ENV_ADDR=0xEFF20000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -51,6 +53,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -62,8 +65,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -72,5 +77,6 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
index 6232b18..853698d 100644 (file)
@@ -52,6 +52,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -66,6 +68,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -77,8 +80,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -87,4 +92,5 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
index 4d3b872..919a7a7 100644 (file)
@@ -48,6 +48,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -61,6 +63,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -72,8 +75,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
index 7b97d91..882bab0 100644 (file)
@@ -50,6 +50,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -63,6 +65,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -74,8 +77,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -84,4 +89,5 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
index 3a1f668..f0b39b1 100644 (file)
@@ -37,6 +37,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_ENV_ADDR=0xEFF20000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
 CONFIG_FSL_ESDHC=y
@@ -50,6 +52,7 @@ CONFIG_SPI_FLASH=y
 CONFIG_SF_DEFAULT_MODE=0
 CONFIG_SF_DEFAULT_SPEED=10000000
 CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_PHY_FIXED=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_DAVICOM=y
@@ -61,8 +64,10 @@ CONFIG_PHY_SMSC=y
 CONFIG_PHY_VITESSE=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
+CONFIG_DM_ETH=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
+CONFIG_DM_MDIO=y
 CONFIG_DM_PCI=y
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCIE_FSL=y
@@ -71,4 +76,5 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
index 711b2ce..41f5f1e 100644 (file)
@@ -33,6 +33,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -65,6 +67,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
index 98432e7..bd1a052 100644 (file)
@@ -33,6 +33,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -64,6 +66,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
index 6bfc4fa..2149012 100644 (file)
@@ -34,6 +34,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -65,6 +67,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
index 1d6b011..9952f48 100644 (file)
@@ -32,6 +32,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_ENV_ADDR=0xEFF20000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -63,6 +65,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
diff --git a/configs/P3041DS_NAND_SECURE_BOOT_defconfig b/configs/P3041DS_NAND_SECURE_BOOT_defconfig
deleted file mode 100644 (file)
index bfe374d..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xFFF40000
-CONFIG_ENV_SIZE=0x20000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P3041DS=y
-# 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_SYS_EXTRA_OPTIONS="RAMBOOT_PBL"
-CONFIG_BOOTDELAY=10
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_GREPENV=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_MP=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_MTD_RAW_NAND=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHYLIB=y
-CONFIG_PHYLIB_10G=y
-CONFIG_PHY_TERANETICS=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_FMAN_ENET=y
-CONFIG_MII=y
-CONFIG_SYS_QE_FMAN_FW_IN_NAND=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_SYS_NUM_ADDR_MAP=64
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
index 403eb92..f52f52a 100644 (file)
@@ -32,6 +32,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -62,6 +64,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
index 316d7e7..edbd4d2 100644 (file)
@@ -32,6 +32,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -61,6 +63,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
diff --git a/configs/P3041DS_SECURE_BOOT_defconfig b/configs/P3041DS_SECURE_BOOT_defconfig
deleted file mode 100644 (file)
index 893162f..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P3041DS=y
-# 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_BOOTDELAY=10
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_GREPENV=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_MP=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHYLIB=y
-CONFIG_PHYLIB_10G=y
-CONFIG_PHY_TERANETICS=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_FMAN_ENET=y
-CONFIG_MII=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_SYS_NUM_ADDR_MAP=64
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
index 6b5e8c4..1a3342c 100644 (file)
@@ -33,6 +33,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -62,6 +64,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
index 98c1b95..7fed793 100644 (file)
@@ -31,6 +31,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_ENV_ADDR=0xEFF20000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -60,6 +62,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
index 2f635bd..0f9a472 100644 (file)
@@ -32,6 +32,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -60,6 +62,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
diff --git a/configs/P4080DS_SECURE_BOOT_defconfig b/configs/P4080DS_SECURE_BOOT_defconfig
deleted file mode 100644 (file)
index e2f5ac2..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P4080DS=y
-# 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_BOOTDELAY=10
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_GREPENV=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_MP=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHYLIB=y
-CONFIG_PHYLIB_10G=y
-CONFIG_PHY_TERANETICS=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_FMAN_ENET=y
-CONFIG_MII=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_SYS_NUM_ADDR_MAP=64
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
index 5908914..ad001f7 100644 (file)
@@ -33,6 +33,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -61,6 +63,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
index 344ca5f..4cfb5ec 100644 (file)
@@ -31,6 +31,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_ENV_ADDR=0xEFF20000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -59,6 +61,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
diff --git a/configs/P5020DS_NAND_SECURE_BOOT_defconfig b/configs/P5020DS_NAND_SECURE_BOOT_defconfig
deleted file mode 100644 (file)
index b781667..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xFFF40000
-CONFIG_ENV_SIZE=0x20000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P5020DS=y
-# 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_SYS_EXTRA_OPTIONS="RAMBOOT_PBL"
-CONFIG_BOOTDELAY=10
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_GREPENV=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_NAND=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_MP=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_MTD_RAW_NAND=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHYLIB=y
-CONFIG_PHYLIB_10G=y
-CONFIG_PHY_TERANETICS=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_FMAN_ENET=y
-CONFIG_MII=y
-CONFIG_SYS_QE_FMAN_FW_IN_NAND=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_SYS_NUM_ADDR_MAP=64
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P5020DS_NAND_defconfig b/configs/P5020DS_NAND_defconfig
deleted file mode 100644 (file)
index e5ea166..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xFFF40000
-CONFIG_ENV_SIZE=0x20000
-CONFIG_ENV_OFFSET=0xE0000
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P5020DS=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="RAMBOOT_PBL"
-CONFIG_BOOTDELAY=10
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_GREPENV=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_NAND=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_MP=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_NAND=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_CAAM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_MTD_RAW_NAND=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHYLIB=y
-CONFIG_PHYLIB_10G=y
-CONFIG_PHY_TERANETICS=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_FMAN_ENET=y
-CONFIG_MII=y
-CONFIG_SYS_QE_FMAN_FW_IN_NAND=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_SYS_NUM_ADDR_MAP=64
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P5020DS_SDCARD_defconfig b/configs/P5020DS_SDCARD_defconfig
deleted file mode 100644 (file)
index 6bf1e9d..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xFFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_OFFSET=0xCF400
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P5020DS=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="RAMBOOT_PBL,SDCARD"
-CONFIG_BOOTDELAY=10
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_GREPENV=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_MP=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_MMC=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_CAAM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHYLIB=y
-CONFIG_PHYLIB_10G=y
-CONFIG_PHY_TERANETICS=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_FMAN_ENET=y
-CONFIG_MII=y
-CONFIG_SYS_QE_FMAN_FW_IN_MMC=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_SYS_NUM_ADDR_MAP=64
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P5020DS_SECURE_BOOT_defconfig b/configs/P5020DS_SECURE_BOOT_defconfig
deleted file mode 100644 (file)
index aae9a7d..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P5020DS=y
-# 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_BOOTDELAY=10
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_GREPENV=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_MP=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHYLIB=y
-CONFIG_PHYLIB_10G=y
-CONFIG_PHY_TERANETICS=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_FMAN_ENET=y
-CONFIG_MII=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_SYS_NUM_ADDR_MAP=64
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P5020DS_SPIFLASH_defconfig b/configs/P5020DS_SPIFLASH_defconfig
deleted file mode 100644 (file)
index 683751a..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xFFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_OFFSET=0x100000
-CONFIG_ENV_SECT_SIZE=0x10000
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P5020DS=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="RAMBOOT_PBL,SPIFLASH"
-CONFIG_BOOTDELAY=10
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_GREPENV=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_MP=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_FSL_CAAM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHYLIB=y
-CONFIG_PHYLIB_10G=y
-CONFIG_PHY_TERANETICS=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_FMAN_ENET=y
-CONFIG_MII=y
-CONFIG_SYS_QE_FMAN_FW_IN_SPIFLASH=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_SYS_NUM_ADDR_MAP=64
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P5020DS_SRIO_PCIE_BOOT_defconfig b/configs/P5020DS_SRIO_PCIE_BOOT_defconfig
deleted file mode 100644 (file)
index 631f7ab..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xFFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P5020DS=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_SYS_EXTRA_OPTIONS="SRIO_PCIE_BOOT_SLAVE"
-CONFIG_BOOTDELAY=10
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_GREPENV=y
-# CONFIG_CMD_FLASH is not set
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_MP=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_REMOTE=y
-CONFIG_ENV_ADDR=0xFFE20000
-CONFIG_FSL_CAAM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHYLIB=y
-CONFIG_PHYLIB_10G=y
-CONFIG_PHY_TERANETICS=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_FMAN_ENET=y
-CONFIG_MII=y
-CONFIG_SYS_QE_FMAN_FW_IN_REMOTE=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_SYS_NUM_ADDR_MAP=64
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P5020DS_defconfig b/configs/P5020DS_defconfig
deleted file mode 100644 (file)
index 73c3ed6..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_ENV_SECT_SIZE=0x20000
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P5020DS=y
-CONFIG_FIT=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_OF_BOARD_SETUP=y
-CONFIG_OF_STDOUT_VIA_ALIAS=y
-CONFIG_BOOTDELAY=10
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_GREPENV=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_MP=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_ENV_IS_IN_FLASH=y
-CONFIG_ENV_ADDR=0xEFF20000
-CONFIG_FSL_CAAM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHYLIB=y
-CONFIG_PHYLIB_10G=y
-CONFIG_PHY_TERANETICS=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_FMAN_ENET=y
-CONFIG_MII=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_SYS_NUM_ADDR_MAP=64
-CONFIG_OF_LIBFDT=y
diff --git a/configs/P5040DS_NAND_SECURE_BOOT_defconfig b/configs/P5040DS_NAND_SECURE_BOOT_defconfig
deleted file mode 100644 (file)
index c6d0e68..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xFFF40000
-CONFIG_ENV_SIZE=0x20000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P5040DS=y
-# 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_SYS_EXTRA_OPTIONS="RAMBOOT_PBL"
-CONFIG_BOOTDELAY=10
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_GREPENV=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_NAND=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_MP=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_MTD_RAW_NAND=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHYLIB=y
-CONFIG_PHYLIB_10G=y
-CONFIG_PHY_TERANETICS=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_FMAN_ENET=y
-CONFIG_MII=y
-CONFIG_SYS_QE_FMAN_FW_IN_NAND=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_SYS_NUM_ADDR_MAP=64
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
index c8bed42..9964481 100644 (file)
@@ -33,6 +33,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -63,6 +65,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
index a7d1122..c3d37df 100644 (file)
@@ -32,6 +32,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -61,6 +63,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
diff --git a/configs/P5040DS_SECURE_BOOT_defconfig b/configs/P5040DS_SECURE_BOOT_defconfig
deleted file mode 100644 (file)
index b11a221..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-CONFIG_PPC=y
-CONFIG_SYS_TEXT_BASE=0xEFF40000
-CONFIG_ENV_SIZE=0x2000
-CONFIG_NXP_ESBC=y
-CONFIG_MPC85xx=y
-CONFIG_TARGET_P5040DS=y
-# 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_BOOTDELAY=10
-CONFIG_BOARD_EARLY_INIT_F=y
-CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_GREPENV=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_MP=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
-CONFIG_ENV_OVERWRITE=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_DM=y
-CONFIG_FSL_ESDHC=y
-CONFIG_MTD=y
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_SPI_FLASH=y
-CONFIG_SF_DEFAULT_MODE=0
-CONFIG_SF_DEFAULT_SPEED=10000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHYLIB=y
-CONFIG_PHYLIB_10G=y
-CONFIG_PHY_TERANETICS=y
-CONFIG_PHY_VITESSE=y
-CONFIG_PHY_GIGE=y
-CONFIG_E1000=y
-CONFIG_FMAN_ENET=y
-CONFIG_MII=y
-CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
-CONFIG_SYS_NS16550=y
-CONFIG_SPI=y
-CONFIG_FSL_ESPI=y
-CONFIG_USB=y
-CONFIG_USB_STORAGE=y
-CONFIG_ADDR_MAP=y
-CONFIG_SYS_NUM_ADDR_MAP=64
-CONFIG_RSA=y
-CONFIG_SPL_RSA=y
-CONFIG_RSA_SOFTWARE_EXP=y
-CONFIG_OF_LIBFDT=y
index 8ed9749..498ea8c 100644 (file)
@@ -33,6 +33,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -62,6 +64,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
index 5bb9ace..0c3c28a 100644 (file)
@@ -31,6 +31,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_ENV_ADDR=0xEFF20000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -60,6 +62,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
index b754817..b1e7d83 100644 (file)
@@ -87,6 +87,9 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
index bf2895d..55bac9d 100644 (file)
@@ -84,6 +84,9 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
index 55c10ce..95bac27 100644 (file)
@@ -69,3 +69,5 @@ CONFIG_SYS_NUM_ADDR_MAP=64
 CONFIG_RSA=y
 CONFIG_SPL_RSA=y
 CONFIG_RSA_SOFTWARE_EXP=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
index 31cbc7a..a051bda 100644 (file)
@@ -87,6 +87,9 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
index fb396c0..3822194 100644 (file)
@@ -72,6 +72,9 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
index 90ebc6c..9bf068d 100644 (file)
@@ -51,6 +51,8 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -82,6 +84,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_VIDEO=y
 CONFIG_CFB_CONSOLE_ANSI=y
index ffbaff5..7a5ab27 100644 (file)
@@ -49,6 +49,8 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -79,6 +81,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_VIDEO=y
 CONFIG_CFB_CONSOLE_ANSI=y
index e670f06..07d24fc 100644 (file)
@@ -52,6 +52,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_ENV_ADDR=0xFFFC9000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -82,6 +84,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_VIDEO=y
 CONFIG_CFB_CONSOLE_ANSI=y
index 9906bf8..ebed19a 100644 (file)
@@ -37,6 +37,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_ENV_ADDR=0xEFF20000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -67,6 +69,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_VIDEO=y
 CONFIG_CFB_CONSOLE_ANSI=y
index 88ae7ac..4e45940 100644 (file)
@@ -84,3 +84,5 @@ CONFIG_DM_USB=y
 CONFIG_USB_STORAGE=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
index e1ab189..41fb354 100644 (file)
@@ -81,3 +81,5 @@ CONFIG_DM_USB=y
 CONFIG_USB_STORAGE=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
index 14a7b1e..c2d67e3 100644 (file)
@@ -71,3 +71,5 @@ CONFIG_SYS_NUM_ADDR_MAP=64
 CONFIG_RSA=y
 CONFIG_SPL_RSA=y
 CONFIG_RSA_SOFTWARE_EXP=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
index 0e787ea..1c7acd3 100644 (file)
@@ -84,3 +84,5 @@ CONFIG_DM_USB=y
 CONFIG_USB_STORAGE=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
index 4628124..dd91435 100644 (file)
@@ -61,3 +61,5 @@ CONFIG_DM_USB=y
 CONFIG_USB_STORAGE=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
index cfac994..70ff72e 100644 (file)
@@ -69,3 +69,5 @@ CONFIG_DM_USB=y
 CONFIG_USB_STORAGE=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
index 9809c3c..32eb602 100644 (file)
@@ -51,6 +51,8 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -82,6 +84,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
index 2cc7ee2..7f8a398 100644 (file)
@@ -49,6 +49,8 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -79,6 +81,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
index 62cbab1..fc12766 100644 (file)
@@ -52,6 +52,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_ENV_ADDR=0xFFFC9000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -82,6 +84,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
index e066e98..9c85e1b 100644 (file)
@@ -37,6 +37,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_ENV_ADDR=0xEFF20000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -66,6 +68,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
index f39fde6..389b1e6 100644 (file)
@@ -42,6 +42,8 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -72,6 +74,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
index ae47aeb..c5b2ad6 100644 (file)
@@ -30,6 +30,8 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_ENV_ADDR=0xEFF20000
 CONFIG_DM=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
 CONFIG_FSL_CAAM=y
 CONFIG_DM_I2C=y
 CONFIG_DM_MMC=y
@@ -60,6 +62,7 @@ CONFIG_SYS_NS16550=y
 CONFIG_SPI=y
 CONFIG_FSL_ESPI=y
 CONFIG_USB=y
+CONFIG_USB_STORAGE=y
 CONFIG_DM_USB=y
 CONFIG_ADDR_MAP=y
 CONFIG_SYS_NUM_ADDR_MAP=64
diff --git a/configs/am335x_evm_spiboot_defconfig b/configs/am335x_evm_spiboot_defconfig
new file mode 100644 (file)
index 0000000..d71a7ce
--- /dev/null
@@ -0,0 +1,93 @@
+CONFIG_ARM=y
+CONFIG_ARCH_CPU_INIT=y
+CONFIG_ARCH_OMAP2PLUS=y
+CONFIG_TI_COMMON_CMD_OPTIONS=y
+CONFIG_ENV_OFFSET=0x100000
+CONFIG_SYS_SPI_U_BOOT_OFFS=0x20000
+CONFIG_SPL_DM_SPI=y
+CONFIG_AM33XX=y
+# CONFIG_SPL_MMC_SUPPORT is not set
+CONFIG_SPL=y
+CONFIG_SPL_SPI_FLASH_SUPPORT=y
+CONFIG_SPL_SPI_SUPPORT=y
+CONFIG_DEFAULT_DEVICE_TREE="am335x-evm"
+CONFIG_DISTRO_DEFAULTS=y
+CONFIG_SPL_LOAD_FIT=y
+CONFIG_OF_BOARD_SETUP=y
+CONFIG_BOOTCOMMAND="if test ${boot_fit} -eq 1; then run update_to_fit; fi; run findfdt; run init_console; run envboot; run distro_bootcmd"
+CONFIG_LOGLEVEL=3
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+CONFIG_VERSION_VARIABLE=y
+CONFIG_ARCH_MISC_INIT=y
+CONFIG_SPL_FIT_IMAGE_TINY=y
+# CONFIG_SPL_FS_EXT4 is not set
+CONFIG_SPL_MTD_SUPPORT=y
+# CONFIG_SPL_NAND_SUPPORT is not set
+CONFIG_SPL_DM_SPI_FLASH=y
+CONFIG_SPL_SPI_LOAD=y
+CONFIG_CMD_SPL=y
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_NAND=y
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_BOOTP_DNS2=y
+CONFIG_CMD_MTDPARTS=y
+# CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_OF_CONTROL=y
+CONFIG_OF_LIST="am335x-evm am335x-bone am335x-boneblack am335x-evmsk am335x-bonegreen am335x-icev2 am335x-pocketbeagle"
+CONFIG_ENV_OVERWRITE=y
+# CONFIG_ENV_IS_IN_FAT is not set
+CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
+CONFIG_SPL_ENV_IS_NOWHERE=y
+CONFIG_BOOTP_SEND_HOSTNAME=y
+CONFIG_BOOTCOUNT_LIMIT=y
+CONFIG_CLK=y
+CONFIG_CLK_CDCE9XX=y
+CONFIG_DFU_TFTP=y
+CONFIG_DFU_MMC=y
+CONFIG_DFU_NAND=y
+CONFIG_DFU_RAM=y
+CONFIG_USB_FUNCTION_FASTBOOT=y
+CONFIG_FASTBOOT_FLASH=y
+CONFIG_FASTBOOT_FLASH_MMC_DEV=1
+CONFIG_FASTBOOT_CMD_OEM_FORMAT=y
+CONFIG_DM_I2C=y
+CONFIG_MISC=y
+CONFIG_DM_MMC=y
+# CONFIG_SPL_DM_MMC is not set
+# CONFIG_MMC_HW_PARTITIONING is not set
+CONFIG_MMC_OMAP_HS=y
+CONFIG_MTD=y
+CONFIG_MTD_RAW_NAND=y
+# CONFIG_SPL_NAND_AM33XX_BCH is not set
+CONFIG_DM_SPI_FLASH=y
+CONFIG_SF_DEFAULT_SPEED=24000000
+CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_PHY_ATHEROS=y
+CONFIG_PHY_SMSC=y
+CONFIG_DM_ETH=y
+CONFIG_MII=y
+CONFIG_DRIVER_TI_CPSW=y
+CONFIG_SPI=y
+CONFIG_DM_SPI=y
+CONFIG_OMAP3_SPI=y
+CONFIG_TIMER=y
+CONFIG_OMAP_TIMER=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_DM_USB_GADGET=y
+CONFIG_USB_MUSB_HOST=y
+CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_MUSB_TI=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
+CONFIG_USB_GADGET_VENDOR_NUM=0x0451
+CONFIG_USB_GADGET_PRODUCT_NUM=0xd022
+CONFIG_USB_ETHER=y
+CONFIG_WDT=y
+# CONFIG_SPL_WDT is not set
+CONFIG_DYNAMIC_CRC_TABLE=y
+CONFIG_RSA=y
+CONFIG_LZO=y
+# CONFIG_OF_LIBFDT_OVERLAY is not set
index 2f7f93a..7c900b1 100644 (file)
@@ -30,7 +30,7 @@ CONFIG_SPL_LOAD_FIT=y
 CONFIG_SPL_LOAD_FIT_ADDRESS=0x81000000
 # CONFIG_USE_SPL_FIT_GENERATOR is not set
 CONFIG_OF_BOARD_SETUP=y
-CONFIG_BOOTCOMMAND="run findfdt; run envboot; run init_${boot}; run get_kern_${boot}; run get_fdt_${boot}; run get_overlay_${boot}; run run_kern"
+CONFIG_BOOTCOMMAND="run findfdt; run envboot; run init_${boot}; run boot_rprocs; run get_kern_${boot}; run get_fdt_${boot}; run get_overlay_${boot}; run run_kern"
 CONFIG_SPL_BOARD_INIT=y
 CONFIG_SPL_SYS_MALLOC_SIMPLE=y
 CONFIG_SPL_STACK_R=y
@@ -41,7 +41,9 @@ CONFIG_SPL_DMA=y
 CONFIG_SPL_ENV_SUPPORT=y
 CONFIG_SPL_I2C_SUPPORT=y
 CONFIG_SPL_DM_MAILBOX=y
+CONFIG_SPL_MTD_SUPPORT=y
 CONFIG_SPL_DM_SPI_FLASH=y
+CONFIG_SPL_NOR_SUPPORT=y
 CONFIG_SPL_DM_RESET=y
 CONFIG_SPL_POWER_SUPPORT=y
 CONFIG_SPL_POWER_DOMAIN=y
@@ -61,6 +63,7 @@ CONFIG_CMD_GPT=y
 CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
 CONFIG_CMD_MTD=y
+CONFIG_CMD_REMOTEPROC=y
 CONFIG_CMD_UFS=y
 CONFIG_CMD_USB=y
 CONFIG_CMD_USB_MASS_STORAGE=y
@@ -87,6 +90,7 @@ CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_REGMAP=y
 CONFIG_SPL_REGMAP=y
 CONFIG_SYSCON=y
+CONFIG_SPL_SYSCON=y
 CONFIG_SPL_OF_TRANSLATE=y
 CONFIG_CLK=y
 CONFIG_SPL_CLK=y
@@ -140,6 +144,7 @@ CONFIG_POWER_DOMAIN=y
 CONFIG_TI_SCI_POWER_DOMAIN=y
 CONFIG_RAM=y
 CONFIG_SPL_RAM=y
+CONFIG_REMOTEPROC_TI_K3_R5F=y
 CONFIG_DM_RESET=y
 CONFIG_RESET_TI_SCI=y
 CONFIG_SCSI=y
index 2908bc3..3820fc5 100644 (file)
@@ -1,5 +1,6 @@
 CONFIG_ARM=y
 CONFIG_ARCH_K3=y
+CONFIG_SPL_GPIO_SUPPORT=y
 CONFIG_SPL_LIBCOMMON_SUPPORT=y
 CONFIG_SPL_LIBGENERIC_SUPPORT=y
 CONFIG_SYS_MALLOC_F_LEN=0x70000
@@ -37,7 +38,9 @@ CONFIG_SPL_ENV_SUPPORT=y
 CONFIG_SPL_FS_EXT4=y
 CONFIG_SPL_I2C_SUPPORT=y
 CONFIG_SPL_DM_MAILBOX=y
+CONFIG_SPL_MTD_SUPPORT=y
 CONFIG_SPL_DM_SPI_FLASH=y
+CONFIG_SPL_NOR_SUPPORT=y
 CONFIG_SPL_DM_RESET=y
 CONFIG_SPL_POWER_SUPPORT=y
 CONFIG_SPL_POWER_DOMAIN=y
@@ -67,6 +70,8 @@ CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_REGMAP=y
 CONFIG_SPL_REGMAP=y
+CONFIG_SYSCON=y
+CONFIG_SPL_SYSCON=y
 CONFIG_SPL_OF_TRANSLATE=y
 CONFIG_CLK=y
 CONFIG_SPL_CLK=y
@@ -81,12 +86,21 @@ CONFIG_I2C_SET_DEFAULT_BUS_NUM=y
 CONFIG_SYS_I2C_OMAP24XX=y
 CONFIG_DM_MAILBOX=y
 CONFIG_K3_SEC_PROXY=y
+CONFIG_FS_LOADER=y
 CONFIG_DM_MMC=y
 CONFIG_SUPPORT_EMMC_BOOT=y
 CONFIG_MMC_SDHCI=y
 CONFIG_SPL_MMC_SDHCI_ADMA=y
 CONFIG_MMC_SDHCI_AM654=y
 CONFIG_MTD=y
+CONFIG_DM_MTD=y
+CONFIG_MTD_NOR_FLASH=y
+CONFIG_FLASH_CFI_DRIVER=y
+CONFIG_CFI_FLASH=y
+CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
+CONFIG_FLASH_CFI_MTD=y
+CONFIG_SYS_FLASH_CFI=y
+CONFIG_HBMC_AM654=y
 CONFIG_DM_SPI_FLASH=y
 CONFIG_SPI_FLASH_SFDP_SUPPORT=y
 CONFIG_SPI_FLASH_STMICRO=y
index 733e7f3..1be9e1c 100644 (file)
@@ -4,8 +4,8 @@ CONFIG_KM_DEF_NETDEV="eth1"
 CONFIG_ENV_SIZE=0x4000
 CONFIG_ENV_SECT_SIZE=0x20000
 CONFIG_BOOTCOUNT_BOOTLIMIT=3
-CONFIG_SYS_BOOTCOUNT_ADDR=0xE011BFF8
 CONFIG_SYS_CLK_FREQ=66000000
+CONFIG_DEFAULT_DEVICE_TREE="kmcoge5ne"
 CONFIG_MPC83xx=y
 CONFIG_HIGH_BATS=y
 CONFIG_TARGET_KMCOGE5NE=y
@@ -156,7 +156,6 @@ CONFIG_ACR_PARKM_USB_I2C1_BOOT=y
 CONFIG_LCRR_DBYP_PLL_BYPASSED=y
 CONFIG_LCRR_EADC_2=y
 CONFIG_LCRR_CLKDIV_4=y
-# CONFIG_SYS_MALLOC_F is not set
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_OF_STDOUT_VIA_ALIAS=y
 CONFIG_MISC_INIT_R=y
@@ -173,6 +172,7 @@ CONFIG_CMD_GREPENV=y
 CONFIG_CMD_EEPROM=y
 CONFIG_CMD_I2C=y
 CONFIG_CMD_NAND=y
+# CONFIG_CMD_PINMUX is not set
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
@@ -186,8 +186,9 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
 CONFIG_ENV_ADDR=0xF00C0000
 CONFIG_ENV_ADDR_REDUND=0xF00E0000
-CONFIG_DM=y
 CONFIG_BOOTCOUNT_LIMIT=y
+CONFIG_DM_BOOTCOUNT=y
+CONFIG_BOOTCOUNT_MEM=y
 # CONFIG_MMC is not set
 CONFIG_MTD=y
 CONFIG_MTD_NOR_FLASH=y
@@ -197,8 +198,10 @@ CONFIG_FLASH_CFI_MTD=y
 CONFIG_SYS_FLASH_PROTECTION=y
 CONFIG_SYS_FLASH_CFI=y
 CONFIG_MTD_RAW_NAND=y
+CONFIG_DM_ETH_PHY=y
+CONFIG_QE_UEC=y
 # CONFIG_PCI is not set
+# CONFIG_PINCTRL_FULL is not set
 CONFIG_QE=y
 CONFIG_SYS_NS16550=y
 CONFIG_BCH=y
-CONFIG_OF_LIBFDT=y
index ecaeb5d..f24b7aa 100644 (file)
@@ -4,8 +4,8 @@ CONFIG_KM_DEF_NETDEV="eth2"
 CONFIG_ENV_SIZE=0x4000
 CONFIG_ENV_SECT_SIZE=0x20000
 CONFIG_BOOTCOUNT_BOOTLIMIT=3
-CONFIG_SYS_BOOTCOUNT_ADDR=0xE011BFF8
 CONFIG_SYS_CLK_FREQ=66000000
+CONFIG_DEFAULT_DEVICE_TREE="kmeter1"
 CONFIG_MPC83xx=y
 CONFIG_HIGH_BATS=y
 CONFIG_TARGET_KMETER1=y
@@ -120,7 +120,6 @@ CONFIG_ACR_PARKM_USB_I2C1_BOOT=y
 CONFIG_LCRR_DBYP_PLL_BYPASSED=y
 CONFIG_LCRR_EADC_2=y
 CONFIG_LCRR_CLKDIV_4=y
-# CONFIG_SYS_MALLOC_F is not set
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_OF_STDOUT_VIA_ALIAS=y
 CONFIG_MISC_INIT_R=y
@@ -136,6 +135,7 @@ CONFIG_CMD_ASKENV=y
 CONFIG_CMD_GREPENV=y
 CONFIG_CMD_EEPROM=y
 CONFIG_CMD_I2C=y
+# CONFIG_CMD_PINMUX is not set
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
@@ -149,8 +149,9 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
 CONFIG_ENV_ADDR=0xF00C0000
 CONFIG_ENV_ADDR_REDUND=0xF00E0000
-CONFIG_DM=y
 CONFIG_BOOTCOUNT_LIMIT=y
+CONFIG_DM_BOOTCOUNT=y
+CONFIG_BOOTCOUNT_MEM=y
 # CONFIG_MMC is not set
 CONFIG_MTD=y
 CONFIG_MTD_NOR_FLASH=y
@@ -159,7 +160,8 @@ CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
 CONFIG_FLASH_CFI_MTD=y
 CONFIG_SYS_FLASH_PROTECTION=y
 CONFIG_SYS_FLASH_CFI=y
+CONFIG_DM_ETH_PHY=y
+CONFIG_QE_UEC=y
 # CONFIG_PCI is not set
 CONFIG_QE=y
 CONFIG_SYS_NS16550=y
-CONFIG_OF_LIBFDT=y
index 302fdef..b74ea4b 100644 (file)
@@ -3,8 +3,8 @@ CONFIG_SYS_TEXT_BASE=0xF0000000
 CONFIG_ENV_SIZE=0x4000
 CONFIG_ENV_SECT_SIZE=0x20000
 CONFIG_BOOTCOUNT_BOOTLIMIT=3
-CONFIG_SYS_BOOTCOUNT_ADDR=0xE0113FF8
 CONFIG_SYS_CLK_FREQ=66000000
+CONFIG_DEFAULT_DEVICE_TREE="kmopti2"
 CONFIG_MPC83xx=y
 CONFIG_HIGH_BATS=y
 CONFIG_TARGET_KMOPTI2=y
@@ -139,7 +139,6 @@ CONFIG_ACR_APARK_MASTER=y
 CONFIG_ACR_PARKM_USB_I2C1_BOOT=y
 CONFIG_LCRR_EADC_1=y
 CONFIG_LCRR_CLKDIV_2=y
-# CONFIG_SYS_MALLOC_F is not set
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_OF_STDOUT_VIA_ALIAS=y
 CONFIG_MISC_INIT_R=y
@@ -155,6 +154,7 @@ CONFIG_CMD_ASKENV=y
 CONFIG_CMD_GREPENV=y
 CONFIG_CMD_EEPROM=y
 CONFIG_CMD_I2C=y
+# CONFIG_CMD_PINMUX is not set
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
@@ -168,8 +168,9 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
 CONFIG_ENV_ADDR=0xF00C0000
 CONFIG_ENV_ADDR_REDUND=0xF00E0000
-CONFIG_DM=y
 CONFIG_BOOTCOUNT_LIMIT=y
+CONFIG_DM_BOOTCOUNT=y
+CONFIG_BOOTCOUNT_MEM=y
 # CONFIG_MMC is not set
 CONFIG_MTD=y
 CONFIG_MTD_NOR_FLASH=y
@@ -178,7 +179,9 @@ CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
 CONFIG_FLASH_CFI_MTD=y
 CONFIG_SYS_FLASH_PROTECTION=y
 CONFIG_SYS_FLASH_CFI=y
+CONFIG_DM_ETH_PHY=y
+CONFIG_QE_UEC=y
 # CONFIG_PCI is not set
+# CONFIG_PINCTRL_FULL is not set
 CONFIG_QE=y
 CONFIG_SYS_NS16550=y
-CONFIG_OF_LIBFDT=y
index 222a700..bf613a6 100644 (file)
@@ -3,8 +3,8 @@ CONFIG_SYS_TEXT_BASE=0xF0000000
 CONFIG_ENV_SIZE=0x4000
 CONFIG_ENV_SECT_SIZE=0x20000
 CONFIG_BOOTCOUNT_BOOTLIMIT=3
-CONFIG_SYS_BOOTCOUNT_ADDR=0xE0113FF8
 CONFIG_SYS_CLK_FREQ=66000000
+CONFIG_DEFAULT_DEVICE_TREE="kmsupm5"
 CONFIG_MPC83xx=y
 CONFIG_HIGH_BATS=y
 CONFIG_TARGET_KMSUPX5=y
@@ -119,7 +119,6 @@ CONFIG_ACR_APARK_MASTER=y
 CONFIG_ACR_PARKM_USB_I2C1_BOOT=y
 CONFIG_LCRR_EADC_1=y
 CONFIG_LCRR_CLKDIV_2=y
-# CONFIG_SYS_MALLOC_F is not set
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_OF_STDOUT_VIA_ALIAS=y
 CONFIG_MISC_INIT_R=y
@@ -148,8 +147,9 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
 CONFIG_ENV_ADDR=0xF00C0000
 CONFIG_ENV_ADDR_REDUND=0xF00E0000
-CONFIG_DM=y
 CONFIG_BOOTCOUNT_LIMIT=y
+CONFIG_DM_BOOTCOUNT=y
+CONFIG_BOOTCOUNT_MEM=y
 # CONFIG_MMC is not set
 CONFIG_MTD=y
 CONFIG_MTD_NOR_FLASH=y
@@ -158,7 +158,9 @@ CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
 CONFIG_FLASH_CFI_MTD=y
 CONFIG_SYS_FLASH_PROTECTION=y
 CONFIG_SYS_FLASH_CFI=y
+CONFIG_DM_ETH_PHY=y
+CONFIG_QE_UEC=y
 # CONFIG_PCI is not set
+# CONFIG_PINCTRL_FULL is not set
 CONFIG_QE=y
 CONFIG_SYS_NS16550=y
-CONFIG_OF_LIBFDT=y
index 58674c6..8fb4699 100644 (file)
@@ -4,8 +4,8 @@ CONFIG_KM_DEF_NETDEV="eth1"
 CONFIG_ENV_SIZE=0x4000
 CONFIG_ENV_SECT_SIZE=0x20000
 CONFIG_BOOTCOUNT_BOOTLIMIT=3
-CONFIG_SYS_BOOTCOUNT_ADDR=0xE0113FF8
 CONFIG_SYS_CLK_FREQ=66000000
+CONFIG_DEFAULT_DEVICE_TREE="kmtegr1"
 CONFIG_MPC83xx=y
 CONFIG_HIGH_BATS=y
 CONFIG_TARGET_KMTEGR1=y
@@ -118,7 +118,6 @@ CONFIG_ACR_APARK_MASTER=y
 CONFIG_ACR_PARKM_USB_I2C1_BOOT=y
 CONFIG_LCRR_EADC_1=y
 CONFIG_LCRR_CLKDIV_2=y
-# CONFIG_SYS_MALLOC_F is not set
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_OF_STDOUT_VIA_ALIAS=y
 CONFIG_SYS_EXTRA_OPTIONS="KMTEGR1"
@@ -150,8 +149,9 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
 CONFIG_ENV_ADDR=0xF0100000
 CONFIG_ENV_ADDR_REDUND=0xF0120000
-CONFIG_DM=y
 CONFIG_BOOTCOUNT_LIMIT=y
+CONFIG_DM_BOOTCOUNT=y
+CONFIG_BOOTCOUNT_MEM=y
 # CONFIG_MMC is not set
 CONFIG_MTD=y
 CONFIG_MTD_NOR_FLASH=y
@@ -161,9 +161,13 @@ CONFIG_FLASH_CFI_MTD=y
 CONFIG_SYS_FLASH_PROTECTION=y
 CONFIG_SYS_FLASH_CFI=y
 CONFIG_MTD_RAW_NAND=y
+CONFIG_PHY_SMSC=y
+CONFIG_PHY_FIXED=y
+CONFIG_DM_ETH_PHY=y
+CONFIG_QE_UEC=y
 # CONFIG_PCI is not set
+# CONFIG_PINCTRL_FULL is not set
 CONFIG_QE=y
 CONFIG_SYS_QE_FMAN_FW_IN_NOR=y
 CONFIG_SYS_NS16550=y
 CONFIG_BCH=y
-CONFIG_OF_LIBFDT=y
index 36d02e1..3f94db6 100644 (file)
@@ -3,8 +3,8 @@ CONFIG_SYS_TEXT_BASE=0xF0000000
 CONFIG_ENV_SIZE=0x4000
 CONFIG_ENV_SECT_SIZE=0x20000
 CONFIG_BOOTCOUNT_BOOTLIMIT=3
-CONFIG_SYS_BOOTCOUNT_ADDR=0xE0113FF8
 CONFIG_SYS_CLK_FREQ=66000000
+CONFIG_DEFAULT_DEVICE_TREE="kmtepr2"
 CONFIG_MPC83xx=y
 CONFIG_HIGH_BATS=y
 CONFIG_TARGET_KMTEPR2=y
@@ -139,7 +139,6 @@ CONFIG_ACR_APARK_MASTER=y
 CONFIG_ACR_PARKM_USB_I2C1_BOOT=y
 CONFIG_LCRR_EADC_1=y
 CONFIG_LCRR_CLKDIV_2=y
-# CONFIG_SYS_MALLOC_F is not set
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_OF_STDOUT_VIA_ALIAS=y
 CONFIG_MISC_INIT_R=y
@@ -168,8 +167,9 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
 CONFIG_ENV_ADDR=0xF00C0000
 CONFIG_ENV_ADDR_REDUND=0xF00E0000
-CONFIG_DM=y
 CONFIG_BOOTCOUNT_LIMIT=y
+CONFIG_DM_BOOTCOUNT=y
+CONFIG_BOOTCOUNT_MEM=y
 # CONFIG_MMC is not set
 CONFIG_MTD=y
 CONFIG_MTD_NOR_FLASH=y
@@ -178,7 +178,9 @@ CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
 CONFIG_FLASH_CFI_MTD=y
 CONFIG_SYS_FLASH_PROTECTION=y
 CONFIG_SYS_FLASH_CFI=y
+CONFIG_DM_ETH_PHY=y
+CONFIG_QE_UEC=y
 # CONFIG_PCI is not set
+# CONFIG_PINCTRL_FULL is not set
 CONFIG_QE=y
 CONFIG_SYS_NS16550=y
-CONFIG_OF_LIBFDT=y
index 06a139b..43f9e51 100644 (file)
@@ -44,6 +44,7 @@ CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_FIXED=y
 CONFIG_DM_ETH=y
+CONFIG_DM_MDIO=y
 CONFIG_PHY_GIGE=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
index 8046f64..49197ee 100644 (file)
@@ -55,6 +55,7 @@ CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_BROADCOM=y
 CONFIG_PHY_FIXED=y
 CONFIG_DM_ETH=y
+CONFIG_DM_MDIO=y
 CONFIG_PHY_GIGE=y
 CONFIG_MII=y
 CONFIG_TSEC_ENET=y
index 30511dd..d62dcfa 100644 (file)
@@ -46,6 +46,7 @@ CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
 CONFIG_SYS_FLASH_CFI=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_DM_ETH=y
+CONFIG_DM_MDIO=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
 CONFIG_MII=y
index 60622b1..f49a882 100644 (file)
@@ -48,6 +48,7 @@ CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
 CONFIG_SYS_FLASH_CFI=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_DM_ETH=y
+CONFIG_DM_MDIO=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
 CONFIG_MII=y
index fa0a118..e75c7b4 100644 (file)
@@ -50,6 +50,7 @@ CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
 CONFIG_SYS_FLASH_CFI=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_DM_ETH=y
+CONFIG_DM_MDIO=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
 CONFIG_MII=y
index 30c1079..767c364 100644 (file)
@@ -49,6 +49,7 @@ CONFIG_SPI_FLASH_ATMEL=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_DM_ETH=y
+CONFIG_DM_MDIO=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
 CONFIG_MII=y
index 0911b9c..5b3ac2a 100644 (file)
@@ -61,6 +61,7 @@ CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
 CONFIG_SYS_FLASH_CFI=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_DM_ETH=y
+CONFIG_DM_MDIO=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
 CONFIG_MII=y
index eaf5b98..5cc0b90 100644 (file)
@@ -63,6 +63,7 @@ CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
 CONFIG_SYS_FLASH_CFI=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_DM_ETH=y
+CONFIG_DM_MDIO=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
 CONFIG_MII=y
index 2743848..e3e64f9 100644 (file)
@@ -60,6 +60,7 @@ CONFIG_SPI_FLASH_ATMEL=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_DM_ETH=y
+CONFIG_DM_MDIO=y
 CONFIG_PHY_GIGE=y
 CONFIG_E1000=y
 CONFIG_MII=y
index 13a4051..7a46f9c 100644 (file)
@@ -3,8 +3,8 @@ CONFIG_SYS_TEXT_BASE=0xF0000000
 CONFIG_ENV_SIZE=0x4000
 CONFIG_ENV_SECT_SIZE=0x20000
 CONFIG_BOOTCOUNT_BOOTLIMIT=3
-CONFIG_SYS_BOOTCOUNT_ADDR=0xE0113FF8
 CONFIG_SYS_CLK_FREQ=66000000
+CONFIG_DEFAULT_DEVICE_TREE="kmtuge1"
 CONFIG_MPC83xx=y
 CONFIG_HIGH_BATS=y
 CONFIG_TARGET_TUGE1=y
@@ -119,7 +119,6 @@ CONFIG_ACR_APARK_MASTER=y
 CONFIG_ACR_PARKM_USB_I2C1_BOOT=y
 CONFIG_LCRR_EADC_1=y
 CONFIG_LCRR_CLKDIV_2=y
-# CONFIG_SYS_MALLOC_F is not set
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_OF_STDOUT_VIA_ALIAS=y
 CONFIG_MISC_INIT_R=y
@@ -148,8 +147,9 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
 CONFIG_ENV_ADDR=0xF00C0000
 CONFIG_ENV_ADDR_REDUND=0xF00E0000
-CONFIG_DM=y
 CONFIG_BOOTCOUNT_LIMIT=y
+CONFIG_DM_BOOTCOUNT=y
+CONFIG_BOOTCOUNT_MEM=y
 # CONFIG_MMC is not set
 CONFIG_MTD=y
 CONFIG_MTD_NOR_FLASH=y
@@ -158,7 +158,9 @@ CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
 CONFIG_FLASH_CFI_MTD=y
 CONFIG_SYS_FLASH_PROTECTION=y
 CONFIG_SYS_FLASH_CFI=y
+CONFIG_DM_ETH_PHY=y
+CONFIG_QE_UEC=y
 # CONFIG_PCI is not set
+# CONFIG_PINCTRL_FULL is not set
 CONFIG_QE=y
 CONFIG_SYS_NS16550=y
-CONFIG_OF_LIBFDT=y
index 343e11a..ada9b0c 100644 (file)
@@ -3,8 +3,8 @@ CONFIG_SYS_TEXT_BASE=0xF0000000
 CONFIG_ENV_SIZE=0x4000
 CONFIG_ENV_SECT_SIZE=0x20000
 CONFIG_BOOTCOUNT_BOOTLIMIT=3
-CONFIG_SYS_BOOTCOUNT_ADDR=0xE0113FF8
 CONFIG_SYS_CLK_FREQ=66000000
+CONFIG_DEFAULT_DEVICE_TREE="kmtuxa1"
 CONFIG_MPC83xx=y
 CONFIG_HIGH_BATS=y
 CONFIG_TARGET_TUXX1=y
@@ -141,7 +141,6 @@ CONFIG_ACR_APARK_MASTER=y
 CONFIG_ACR_PARKM_USB_I2C1_BOOT=y
 CONFIG_LCRR_EADC_1=y
 CONFIG_LCRR_CLKDIV_2=y
-# CONFIG_SYS_MALLOC_F is not set
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_OF_STDOUT_VIA_ALIAS=y
 CONFIG_MISC_INIT_R=y
@@ -170,8 +169,9 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
 CONFIG_ENV_ADDR=0xF00C0000
 CONFIG_ENV_ADDR_REDUND=0xF00E0000
-CONFIG_DM=y
 CONFIG_BOOTCOUNT_LIMIT=y
+CONFIG_DM_BOOTCOUNT=y
+CONFIG_BOOTCOUNT_MEM=y
 # CONFIG_MMC is not set
 CONFIG_MTD=y
 CONFIG_MTD_NOR_FLASH=y
@@ -180,7 +180,10 @@ CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
 CONFIG_FLASH_CFI_MTD=y
 CONFIG_SYS_FLASH_PROTECTION=y
 CONFIG_SYS_FLASH_CFI=y
+CONFIG_PHY_SMSC=y
+CONFIG_DM_ETH_PHY=y
+CONFIG_QE_UEC=y
 # CONFIG_PCI is not set
+# CONFIG_PINCTRL_FULL is not set
 CONFIG_QE=y
 CONFIG_SYS_NS16550=y
-CONFIG_OF_LIBFDT=y
index 8e8574b..a44c5fd 100644 (file)
@@ -2,7 +2,7 @@
 
 Properties:
 
-  - compatible : Should be "fsl,etsec2"
+  - compatible : Should be "fsl,etsec2" or "gianfar"
   - reg : Offset and length of the register set for the device
   - phy-handle : See ethernet.txt file in the same directory.
   - phy-connection-type : See ethernet.txt file in the same directory. This
index c2fa6e8..5708c23 100644 (file)
@@ -25,6 +25,8 @@ The following are the mandatory properties:
                                               K3 AM65x SoCs
                            "ti,j721e-r5fss" for R5F clusters/subsystems on
                                               K3 J721E SoCs
+                           "ti,j7200-r5fss" for R5F clusters/subsystems on
+                                              K3 J7200 SoCs
 - power-domains:       Should contain a phandle to a PM domain provider node
                        and an args specifier containing the R5FSS device id
                        value. This property is as per the binding,
@@ -56,6 +58,7 @@ The following are the mandatory properties:
 - compatible:          Should be one of the following,
                            "ti,am654-r5f" for the R5F cores in K3 AM65x SoCs
                            "ti,j721e-r5f" for the R5F cores in K3 J721E SOCs
+                           "ti,j7200-r5f" for the R5F cores in K3 J7200 SOCs
 - reg:                 Should contain an entry for each value in 'reg-names'.
                        Each entry should have the memory region's start address
                        and the size of the region, the representation matching
@@ -79,7 +82,7 @@ The following are the mandatory properties:
                        specifier. Please refer to the following reset bindings
                        for the reset argument specifier,
                        Documentation/devicetree/bindings/reset/ti,sci-reset.txt
-                           for AM65x and J721E SoCs
+                           for AM65x, J721E and J7200 SoCs
 
 Optional properties:
 --------------------
diff --git a/doc/device-tree-bindings/soc/fsl/cpm_qe/qe/ucc.txt b/doc/device-tree-bindings/soc/fsl/cpm_qe/qe/ucc.txt
new file mode 100644 (file)
index 0000000..2758f86
--- /dev/null
@@ -0,0 +1,53 @@
+* UCC (Unified Communications Controllers)
+
+Required properties:
+- compatible : ucc_geth
+- cell-index : the ucc number(1-8), corresponding to UCCx in UM.
+- reg : Offset and length of the register set for the device
+- rx-clock-name: the UCC receive clock source
+  "none": clock source is disabled
+  "brg1" through "brg16": clock source is BRG1-BRG16, respectively
+  "clk1" through "clk24": clock source is CLK1-CLK24, respectively
+- tx-clock-name: the UCC transmit clock source
+  "none": clock source is disabled
+  "brg1" through "brg16": clock source is BRG1-BRG16, respectively
+  "clk1" through "clk24": clock source is CLK1-CLK24, respectively
+The following two properties are deprecated.  rx-clock has been replaced
+with rx-clock-name, and tx-clock has been replaced with tx-clock-name.
+Drivers that currently use the deprecated properties should continue to
+do so, in order to support older device trees, but they should be updated
+to check for the new properties first.
+- rx-clock : represents the UCC receive clock source.
+  0x00 : clock source is disabled;
+  0x1~0x10 : clock source is BRG1~BRG16 respectively;
+  0x11~0x28: clock source is QE_CLK1~QE_CLK24 respectively.
+- tx-clock: represents the UCC transmit clock source;
+  0x00 : clock source is disabled;
+  0x1~0x10 : clock source is BRG1~BRG16 respectively;
+  0x11~0x28: clock source is QE_CLK1~QE_CLK24 respectively.
+- phy-handle : The phandle for the PHY connected to this controller.
+- phy-connection-type : a string naming the controller/PHY interface type,
+  i.e., "mii" (default), "rmii", "gmii", "rgmii", "rgmii-id" (Internal
+  Delay), "rgmii-txid" (delay on TX only), "rgmii-rxid" (delay on RX only),
+  "tbi", or "rtbi".
+- pio-handle : The phandle for the Parallel I/O port configuration.
+
+Deprecated properties:
+- device-id : the ucc number(1-8), corresponding to UCCx in UM.
+    you should use cell-index
+
+Example:
+        ucc@2000 {
+                device_type = "network";
+                compatible = "ucc_geth";
+                cell-index = <1>;
+                reg = <2000 200>;
+                interrupts = <a0 0>;
+                interrupt-parent = <700>;
+                mac-address = [ 00 04 9f 00 23 23 ];
+                rx-clock = "none";
+                tx-clock = "clk9";
+                phy-handle = <212000>;
+                phy-connection-type = "gmii";
+                pio-handle = <140001>;
+        };
index 825fe57..ed0527c 100644 (file)
@@ -62,13 +62,13 @@ static int dwc_ahci_probe(struct udevice *dev)
 
        ret = generic_phy_init(&phy);
        if (ret) {
-               pr_err("unable to initialize the sata phy\n");
+               pr_debug("unable to initialize the sata phy\n");
                return ret;
        }
 
        ret = generic_phy_power_on(&phy);
        if (ret) {
-               pr_err("unable to power on the sata phy\n");
+               pr_debug("unable to power on the sata phy\n");
                return ret;
        }
 
index d1940f1..aab7d14 100644 (file)
@@ -10,7 +10,7 @@
 #include <asm/io.h>
 #include <asm/arch/scu_ast2500.h>
 #include <dm/lists.h>
-#include <dt-bindings/clock/ast2500-scu.h>
+#include <dt-bindings/clock/aspeed-clock.h>
 #include <linux/delay.h>
 #include <linux/err.h>
 
@@ -122,8 +122,7 @@ static ulong ast2500_clk_get_rate(struct clk *clk)
        ulong rate;
 
        switch (clk->id) {
-       case PLL_HPLL:
-       case ARMCLK:
+       case ASPEED_CLK_HPLL:
                /*
                 * This ignores dynamic/static slowdown of ARMCLK and may
                 * be inaccurate.
@@ -131,11 +130,11 @@ static ulong ast2500_clk_get_rate(struct clk *clk)
                rate = ast2500_get_hpll_rate(clkin,
                                             readl(&priv->scu->h_pll_param));
                break;
-       case MCLK_DDR:
+       case ASPEED_CLK_MPLL:
                rate = ast2500_get_mpll_rate(clkin,
                                             readl(&priv->scu->m_pll_param));
                break;
-       case BCLK_PCLK:
+       case ASPEED_CLK_APB:
                {
                        ulong apb_div = 4 + 4 * ((readl(&priv->scu->clk_sel1)
                                                  & SCU_PCLK_DIV_MASK)
@@ -146,7 +145,7 @@ static ulong ast2500_clk_get_rate(struct clk *clk)
                        rate = rate / apb_div;
                }
                break;
-       case BCLK_SDCLK:
+       case ASPEED_CLK_SDIO:
                {
                        ulong apb_div = 4 + 4 * ((readl(&priv->scu->clk_sel1)
                                                  & SCU_SDCLK_DIV_MASK)
@@ -157,19 +156,19 @@ static ulong ast2500_clk_get_rate(struct clk *clk)
                        rate = rate / apb_div;
                }
                break;
-       case PCLK_UART1:
+       case ASPEED_CLK_GATE_UART1CLK:
                rate = ast2500_get_uart_clk_rate(priv->scu, 1);
                break;
-       case PCLK_UART2:
+       case ASPEED_CLK_GATE_UART2CLK:
                rate = ast2500_get_uart_clk_rate(priv->scu, 2);
                break;
-       case PCLK_UART3:
+       case ASPEED_CLK_GATE_UART3CLK:
                rate = ast2500_get_uart_clk_rate(priv->scu, 3);
                break;
-       case PCLK_UART4:
+       case ASPEED_CLK_GATE_UART4CLK:
                rate = ast2500_get_uart_clk_rate(priv->scu, 4);
                break;
-       case PCLK_UART5:
+       case ASPEED_CLK_GATE_UART5CLK:
                rate = ast2500_get_uart_clk_rate(priv->scu, 5);
                break;
        default:
@@ -431,11 +430,10 @@ static ulong ast2500_clk_set_rate(struct clk *clk, ulong rate)
 
        ulong new_rate;
        switch (clk->id) {
-       case PLL_MPLL:
-       case MCLK_DDR:
+       case ASPEED_CLK_MPLL:
                new_rate = ast2500_configure_ddr(priv->scu, rate);
                break;
-       case PLL_D2PLL:
+       case ASPEED_CLK_D2PLL:
                new_rate = ast2500_configure_d2pll(priv->scu, rate);
                break;
        default:
@@ -450,7 +448,7 @@ static int ast2500_clk_enable(struct clk *clk)
        struct ast2500_clk_priv *priv = dev_get_priv(clk->dev);
 
        switch (clk->id) {
-       case BCLK_SDCLK:
+       case ASPEED_CLK_SDIO:
                if (readl(&priv->scu->clk_stop_ctrl1) & SCU_CLKSTOP_SDCLK) {
                        ast_scu_unlock(priv->scu);
 
@@ -471,13 +469,13 @@ static int ast2500_clk_enable(struct clk *clk)
         * configured based on whether RGMII or RMII mode has been selected
         * through hardware strapping.
         */
-       case PCLK_MAC1:
+       case ASPEED_CLK_GATE_MAC1CLK:
                ast2500_configure_mac(priv->scu, 1);
                break;
-       case PCLK_MAC2:
+       case ASPEED_CLK_GATE_MAC2CLK:
                ast2500_configure_mac(priv->scu, 2);
                break;
-       case PLL_D2PLL:
+       case ASPEED_CLK_D2PLL:
                ast2500_configure_d2pll(priv->scu, D2PLL_DEFAULT_RATE);
                break;
        default:
@@ -497,9 +495,9 @@ static int ast2500_clk_ofdata_to_platdata(struct udevice *dev)
 {
        struct ast2500_clk_priv *priv = dev_get_priv(dev);
 
-       priv->scu = dev_read_addr_ptr(dev);
-       if (!priv->scu)
-               return -EINVAL;
+       priv->scu = devfdt_get_addr_ptr(dev);
+       if (IS_ERR(priv->scu))
+               return PTR_ERR(priv->scu);
 
        return 0;
 }
index 922e78f..bcf1644 100644 (file)
@@ -745,13 +745,14 @@ struct device_node *of_parse_phandle(const struct device_node *np,
 
 int of_parse_phandle_with_args(const struct device_node *np,
                               const char *list_name, const char *cells_name,
-                              int index, struct of_phandle_args *out_args)
+                              int cell_count, int index,
+                              struct of_phandle_args *out_args)
 {
        if (index < 0)
                return -EINVAL;
 
-       return __of_parse_phandle_with_args(np, list_name, cells_name, 0,
-                                           index, out_args);
+       return __of_parse_phandle_with_args(np, list_name, cells_name,
+                                           cell_count, index, out_args);
 }
 
 int of_count_phandle_with_args(const struct device_node *np,
index d02d8d3..79fcdf5 100644 (file)
@@ -409,7 +409,8 @@ int ofnode_parse_phandle_with_args(ofnode node, const char *list_name,
                int ret;
 
                ret = of_parse_phandle_with_args(ofnode_to_np(node),
-                                                list_name, cells_name, index,
+                                                list_name, cells_name,
+                                                cell_count, index,
                                                 &args);
                if (ret)
                        return ret;
index b5cd763..9cbda4e 100644 (file)
 
 /*
  * Caution:
- * This API requires the given device has alerady been bound to syscon driver.
- * For example,
+ * This API requires the given device has already been bound to the syscon
+ * driver. For example,
+ *
  *    compatible = "syscon", "simple-mfd";
+ *
  * works, but
+ *
  *    compatible = "simple-mfd", "syscon";
- * does not.  The behavior is different from Linux.
+ *
+ * does not. The behavior is different from Linux.
  */
 struct regmap *syscon_get_regmap(struct udevice *dev)
 {
index 039f9fb..a0d2d21 100644 (file)
@@ -432,6 +432,8 @@ config PCNET
          This driver supports AMD PCnet series fast ethernet family of
          PCI chipsets/adapters.
 
+source "drivers/net/qe/Kconfig"
+
 config RTL8139
        bool "Realtek 8139 series Ethernet controller driver"
        help
index 1ecdc40..03f0192 100644 (file)
@@ -78,6 +78,7 @@ obj-$(CONFIG_VSC9953) += vsc9953.o
 obj-$(CONFIG_PIC32_ETH) += pic32_mdio.o pic32_eth.o
 obj-$(CONFIG_DWC_ETH_QOS) += dwc_eth_qos.o
 obj-$(CONFIG_FSL_PFE) += pfe_eth/
+obj-y += qe/
 obj-$(CONFIG_SNI_AVE) += sni_ave.o
 obj-y += ti/
 obj-$(CONFIG_MEDIATEK_ETH) += mtk_eth.o
index d2edd17..77f1a96 100644 (file)
@@ -11,6 +11,7 @@
 #include <fsl_mdio.h>
 #include <asm/io.h>
 #include <linux/errno.h>
+#include <tsec.h>
 
 #ifdef CONFIG_DM_MDIO
 struct tsec_mdio_priv {
@@ -190,17 +191,30 @@ static const struct mdio_ops tsec_mdio_ops = {
        .reset = tsec_mdio_reset,
 };
 
+static struct fsl_pq_mdio_data etsec2_data = {
+       .mdio_regs_off = TSEC_MDIO_REGS_OFFSET,
+};
+
+static struct fsl_pq_mdio_data gianfar_data = {
+       .mdio_regs_off = 0x0,
+};
+
+static struct fsl_pq_mdio_data fman_data = {
+       .mdio_regs_off = 0x0,
+};
+
 static const struct udevice_id tsec_mdio_ids[] = {
-       { .compatible = "fsl,gianfar-tbi" },
-       { .compatible = "fsl,gianfar-mdio" },
-       { .compatible = "fsl,etsec2-tbi" },
-       { .compatible = "fsl,etsec2-mdio" },
-       { .compatible = "fsl,fman-mdio" },
+       { .compatible = "fsl,gianfar-tbi", .data = (ulong)&gianfar_data },
+       { .compatible = "fsl,gianfar-mdio", .data = (ulong)&gianfar_data },
+       { .compatible = "fsl,etsec2-tbi", .data = (ulong)&etsec2_data },
+       { .compatible = "fsl,etsec2-mdio", .data = (ulong)&etsec2_data },
+       { .compatible = "fsl,fman-mdio", .data = (ulong)&fman_data },
        {}
 };
 
 static int tsec_mdio_probe(struct udevice *dev)
 {
+       struct fsl_pq_mdio_data *data;
        struct tsec_mdio_priv *priv = (dev) ? dev_get_priv(dev) : NULL;
        struct mdio_perdev_priv *pdata = (dev) ? dev_get_uclass_priv(dev) :
                                                 NULL;
@@ -213,7 +227,9 @@ static int tsec_mdio_probe(struct udevice *dev)
                printf("dev_get_priv(dev %p) = NULL\n", dev);
                return -1;
        }
-       priv->regs = (void *)(uintptr_t)dev_read_addr(dev);
+
+       data = (struct fsl_pq_mdio_data *)dev_get_driver_data(dev);
+       priv->regs = dev_remap_addr(dev) + data->mdio_regs_off;
        debug("%s priv %p @ regs %p, pdata %p\n", __func__,
              priv, priv->regs, pdata);
 
index 6778989..9587e6b 100644 (file)
@@ -664,7 +664,7 @@ static struct phy_device *phy_device_create(struct mii_dev *bus, int addr,
        dev = malloc(sizeof(*dev));
        if (!dev) {
                printf("Failed to allocate PHY device for %s:%d\n",
-                      bus->name, addr);
+                      bus ? bus->name : "(null bus)", addr);
                return NULL;
        }
 
@@ -692,7 +692,7 @@ static struct phy_device *phy_device_create(struct mii_dev *bus, int addr,
                return NULL;
        }
 
-       if (addr >= 0 && addr < PHY_MAX_ADDR)
+       if (addr >= 0 && addr < PHY_MAX_ADDR && phy_id != PHY_FIXED_ID)
                bus->phymap[addr] = dev;
 
        return dev;
diff --git a/drivers/net/qe/Kconfig b/drivers/net/qe/Kconfig
new file mode 100644 (file)
index 0000000..dec88de
--- /dev/null
@@ -0,0 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+
+config QE_UEC
+       bool "NXP QE UEC Ethernet controller"
+       depends on DM_ETH
+       help
+         This driver supports the NXP QE UEC ethernet controller
diff --git a/drivers/net/qe/Makefile b/drivers/net/qe/Makefile
new file mode 100644 (file)
index 0000000..7d84757
--- /dev/null
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+
+obj-$(CONFIG_QE_UEC) += dm_qe_uec.o dm_qe_uec_phy.o uccf.o
diff --git a/drivers/net/qe/dm_qe_uec.c b/drivers/net/qe/dm_qe_uec.c
new file mode 100644 (file)
index 0000000..3482b3f
--- /dev/null
@@ -0,0 +1,1167 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * QE UEC ethernet controller driver
+ *
+ * based on drivers/qe/uec.c from NXP
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <memalign.h>
+#include <miiphy.h>
+#include <asm/io.h>
+
+#include "dm_qe_uec.h"
+
+#define QE_UEC_DRIVER_NAME     "ucc_geth"
+
+/* Default UTBIPAR SMI address */
+#ifndef CONFIG_UTBIPAR_INIT_TBIPA
+#define CONFIG_UTBIPAR_INIT_TBIPA 0x1F
+#endif
+
+static int uec_mac_enable(struct uec_priv *uec, comm_dir_e mode)
+{
+       uec_t           *uec_regs;
+       u32             maccfg1;
+
+       uec_regs = uec->uec_regs;
+       maccfg1 = in_be32(&uec_regs->maccfg1);
+
+       if (mode & COMM_DIR_TX) {
+               maccfg1 |= MACCFG1_ENABLE_TX;
+               out_be32(&uec_regs->maccfg1, maccfg1);
+               uec->mac_tx_enabled = 1;
+       }
+
+       if (mode & COMM_DIR_RX) {
+               maccfg1 |= MACCFG1_ENABLE_RX;
+               out_be32(&uec_regs->maccfg1, maccfg1);
+               uec->mac_rx_enabled = 1;
+       }
+
+       return 0;
+}
+
+static int uec_mac_disable(struct uec_priv *uec, comm_dir_e mode)
+{
+       uec_t           *uec_regs;
+       u32             maccfg1;
+
+       uec_regs = uec->uec_regs;
+       maccfg1 = in_be32(&uec_regs->maccfg1);
+
+       if (mode & COMM_DIR_TX) {
+               maccfg1 &= ~MACCFG1_ENABLE_TX;
+               out_be32(&uec_regs->maccfg1, maccfg1);
+               uec->mac_tx_enabled = 0;
+       }
+
+       if (mode & COMM_DIR_RX) {
+               maccfg1 &= ~MACCFG1_ENABLE_RX;
+               out_be32(&uec_regs->maccfg1, maccfg1);
+               uec->mac_rx_enabled = 0;
+       }
+
+       return 0;
+}
+
+static int uec_restart_tx(struct uec_priv *uec)
+{
+       struct uec_inf  *ui = uec->uec_info;
+       u32             cecr_subblock;
+
+       cecr_subblock = ucc_fast_get_qe_cr_subblock(ui->uf_info.ucc_num);
+       qe_issue_cmd(QE_RESTART_TX, cecr_subblock,
+                    (u8)QE_CR_PROTOCOL_ETHERNET, 0);
+
+       uec->grace_stopped_tx = 0;
+
+       return 0;
+}
+
+static int uec_restart_rx(struct uec_priv *uec)
+{
+       struct uec_inf  *ui = uec->uec_info;
+       u32             cecr_subblock;
+
+       cecr_subblock = ucc_fast_get_qe_cr_subblock(ui->uf_info.ucc_num);
+       qe_issue_cmd(QE_RESTART_RX, cecr_subblock,
+                    (u8)QE_CR_PROTOCOL_ETHERNET, 0);
+
+       uec->grace_stopped_rx = 0;
+
+       return 0;
+}
+
+static int uec_open(struct uec_priv *uec, comm_dir_e mode)
+{
+       struct ucc_fast_priv    *uccf;
+
+       uccf = uec->uccf;
+
+       /* check if the UCC number is in range. */
+       if (uec->uec_info->uf_info.ucc_num >= UCC_MAX_NUM) {
+               printf("%s: ucc_num out of range.\n", __func__);
+               return -EINVAL;
+       }
+
+       /* Enable MAC */
+       uec_mac_enable(uec, mode);
+
+       /* Enable UCC fast */
+       ucc_fast_enable(uccf, mode);
+
+       /* RISC microcode start */
+       if ((mode & COMM_DIR_TX) && uec->grace_stopped_tx)
+               uec_restart_tx(uec);
+
+       if ((mode & COMM_DIR_RX) && uec->grace_stopped_rx)
+               uec_restart_rx(uec);
+
+       return 0;
+}
+
+static int uec_set_mac_if_mode(struct uec_priv *uec)
+{
+       struct uec_inf          *uec_info = uec->uec_info;
+       phy_interface_t         enet_if_mode;
+       uec_t                   *uec_regs;
+       u32                     upsmr;
+       u32                     maccfg2;
+
+       uec_regs = uec->uec_regs;
+       enet_if_mode = uec_info->enet_interface_type;
+
+       maccfg2 = in_be32(&uec_regs->maccfg2);
+       maccfg2 &= ~MACCFG2_INTERFACE_MODE_MASK;
+
+       upsmr = in_be32(&uec->uccf->uf_regs->upsmr);
+       upsmr &= ~(UPSMR_RPM | UPSMR_TBIM | UPSMR_R10M | UPSMR_RMM);
+
+       switch (uec_info->speed) {
+       case SPEED_10:
+               maccfg2 |= MACCFG2_INTERFACE_MODE_NIBBLE;
+               switch (enet_if_mode) {
+               case PHY_INTERFACE_MODE_MII:
+                       break;
+               case PHY_INTERFACE_MODE_RGMII:
+                       upsmr |= (UPSMR_RPM | UPSMR_R10M);
+                       break;
+               case PHY_INTERFACE_MODE_RMII:
+                       upsmr |= (UPSMR_R10M | UPSMR_RMM);
+                       break;
+               default:
+                       return -EINVAL;
+               }
+               break;
+       case SPEED_100:
+               maccfg2 |= MACCFG2_INTERFACE_MODE_NIBBLE;
+               switch (enet_if_mode) {
+               case PHY_INTERFACE_MODE_MII:
+                       break;
+               case PHY_INTERFACE_MODE_RGMII:
+                       upsmr |= UPSMR_RPM;
+                       break;
+               case PHY_INTERFACE_MODE_RMII:
+                       upsmr |= UPSMR_RMM;
+                       break;
+               default:
+                       return -EINVAL;
+       }
+       break;
+       case SPEED_1000:
+               maccfg2 |= MACCFG2_INTERFACE_MODE_BYTE;
+               switch (enet_if_mode) {
+               case PHY_INTERFACE_MODE_GMII:
+                       break;
+               case PHY_INTERFACE_MODE_TBI:
+                       upsmr |= UPSMR_TBIM;
+                       break;
+               case PHY_INTERFACE_MODE_RTBI:
+                       upsmr |= (UPSMR_RPM | UPSMR_TBIM);
+                       break;
+               case PHY_INTERFACE_MODE_RGMII_RXID:
+               case PHY_INTERFACE_MODE_RGMII_TXID:
+               case PHY_INTERFACE_MODE_RGMII_ID:
+               case PHY_INTERFACE_MODE_RGMII:
+                       upsmr |= UPSMR_RPM;
+                       break;
+               case PHY_INTERFACE_MODE_SGMII:
+                       upsmr |= UPSMR_SGMM;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       out_be32(&uec_regs->maccfg2, maccfg2);
+       out_be32(&uec->uccf->uf_regs->upsmr, upsmr);
+
+       return 0;
+}
+
+static int qe_uec_start(struct udevice *dev)
+{
+       struct qe_uec_priv *priv = dev_get_priv(dev);
+       struct uec_priv         *uec = priv->uec;
+       struct phy_device       *phydev = priv->phydev;
+       struct uec_inf          *uec_info = uec->uec_info;
+       int                     err;
+
+       if (!phydev)
+               return -ENODEV;
+
+       /* Setup MAC interface mode */
+       genphy_update_link(phydev);
+       genphy_parse_link(phydev);
+       uec_info->speed = phydev->speed;
+       uec_set_mac_if_mode(uec);
+
+       err = uec_open(uec, COMM_DIR_RX_AND_TX);
+       if (err) {
+               printf("%s: cannot enable UEC device\n", dev->name);
+               return -EINVAL;
+       }
+
+       return (phydev->link ? 0 : -EINVAL);
+}
+
+static int qe_uec_send(struct udevice *dev, void *packet, int length)
+{
+       struct qe_uec_priv *priv = dev_get_priv(dev);
+       struct uec_priv         *uec = priv->uec;
+       struct ucc_fast_priv    *uccf = uec->uccf;
+       struct buffer_descriptor        *bd;
+       u16                     status;
+       int                     i;
+       int                     result = 0;
+
+       uccf = uec->uccf;
+       bd = uec->tx_bd;
+
+       /* Find an empty TxBD */
+       for (i = 0; BD_STATUS(bd) & TX_BD_READY; i++) {
+               if (i > 0x100000) {
+                       printf("%s: tx buffer not ready\n", dev->name);
+                       return result;
+               }
+       }
+
+       /* Init TxBD */
+       BD_DATA_SET(bd, packet);
+       BD_LENGTH_SET(bd, length);
+       status = BD_STATUS(bd);
+       status &= BD_WRAP;
+       status |= (TX_BD_READY | TX_BD_LAST);
+       BD_STATUS_SET(bd, status);
+
+       /* Tell UCC to transmit the buffer */
+       ucc_fast_transmit_on_demand(uccf);
+
+       /* Wait for buffer to be transmitted */
+       for (i = 0; BD_STATUS(bd) & TX_BD_READY; i++) {
+               if (i > 0x100000) {
+                       printf("%s: tx error\n", dev->name);
+                       return result;
+               }
+       }
+
+       /* Ok, the buffer be transimitted */
+       BD_ADVANCE(bd, status, uec->p_tx_bd_ring);
+       uec->tx_bd = bd;
+       result = 1;
+
+       return result;
+}
+
+/*
+ * Receive frame:
+ * - wait for the next BD to get ready bit set
+ * - clean up the descriptor
+ * - move on and indicate to HW that the cleaned BD is available for Rx
+ */
+static int qe_uec_recv(struct udevice *dev, int flags, uchar **packetp)
+{
+       struct qe_uec_priv *priv = dev_get_priv(dev);
+       struct uec_priv         *uec = priv->uec;
+       struct buffer_descriptor        *bd;
+       u16                     status;
+       u16                     len = 0;
+       u8                      *data;
+
+       *packetp = memalign(ARCH_DMA_MINALIGN, MAX_RXBUF_LEN);
+       if (*packetp == 0) {
+               printf("%s: error allocating packetp\n", __func__);
+               return -ENOMEM;
+       }
+
+       bd = uec->rx_bd;
+       status = BD_STATUS(bd);
+
+       while (!(status & RX_BD_EMPTY)) {
+               if (!(status & RX_BD_ERROR)) {
+                       data = BD_DATA(bd);
+                       len = BD_LENGTH(bd);
+                       memcpy(*packetp, (char *)data, len);
+               } else {
+                       printf("%s: Rx error\n", dev->name);
+               }
+               status &= BD_CLEAN;
+               BD_LENGTH_SET(bd, 0);
+               BD_STATUS_SET(bd, status | RX_BD_EMPTY);
+               BD_ADVANCE(bd, status, uec->p_rx_bd_ring);
+               status = BD_STATUS(bd);
+       }
+       uec->rx_bd = bd;
+
+       return len;
+}
+
+static int uec_graceful_stop_tx(struct uec_priv *uec)
+{
+       ucc_fast_t              *uf_regs;
+       u32                     cecr_subblock;
+       u32                     ucce;
+
+       uf_regs = uec->uccf->uf_regs;
+
+       /* Clear the grace stop event */
+       out_be32(&uf_regs->ucce, UCCE_GRA);
+
+       /* Issue host command */
+       cecr_subblock =
+                ucc_fast_get_qe_cr_subblock(uec->uec_info->uf_info.ucc_num);
+       qe_issue_cmd(QE_GRACEFUL_STOP_TX, cecr_subblock,
+                    (u8)QE_CR_PROTOCOL_ETHERNET, 0);
+
+       /* Wait for command to complete */
+       do {
+               ucce = in_be32(&uf_regs->ucce);
+       } while (!(ucce & UCCE_GRA));
+
+       uec->grace_stopped_tx = 1;
+
+       return 0;
+}
+
+static int uec_graceful_stop_rx(struct uec_priv *uec)
+{
+       u32             cecr_subblock;
+       u8              ack;
+
+       if (!uec->p_rx_glbl_pram) {
+               printf("%s: No init rx global parameter\n", __func__);
+               return -EINVAL;
+       }
+
+       /* Clear acknowledge bit */
+       ack = uec->p_rx_glbl_pram->rxgstpack;
+       ack &= ~GRACEFUL_STOP_ACKNOWLEDGE_RX;
+       uec->p_rx_glbl_pram->rxgstpack = ack;
+
+       /* Keep issuing cmd and checking ack bit until it is asserted */
+       do {
+               /* Issue host command */
+               cecr_subblock =
+               ucc_fast_get_qe_cr_subblock(uec->uec_info->uf_info.ucc_num);
+               qe_issue_cmd(QE_GRACEFUL_STOP_RX, cecr_subblock,
+                            (u8)QE_CR_PROTOCOL_ETHERNET, 0);
+               ack = uec->p_rx_glbl_pram->rxgstpack;
+       } while (!(ack & GRACEFUL_STOP_ACKNOWLEDGE_RX));
+
+       uec->grace_stopped_rx = 1;
+
+       return 0;
+}
+
+static int uec_stop(struct uec_priv *uec, comm_dir_e mode)
+{
+       /* check if the UCC number is in range. */
+       if (uec->uec_info->uf_info.ucc_num >= UCC_MAX_NUM) {
+               printf("%s: ucc_num out of range.\n", __func__);
+               return -EINVAL;
+       }
+       /* Stop any transmissions */
+       if ((mode & COMM_DIR_TX) && !uec->grace_stopped_tx)
+               uec_graceful_stop_tx(uec);
+
+       /* Stop any receptions */
+       if ((mode & COMM_DIR_RX) && !uec->grace_stopped_rx)
+               uec_graceful_stop_rx(uec);
+
+       /* Disable the UCC fast */
+       ucc_fast_disable(uec->uccf, mode);
+
+       /* Disable the MAC */
+       uec_mac_disable(uec, mode);
+
+       return 0;
+}
+
+static void qe_uec_stop(struct udevice *dev)
+{
+       struct qe_uec_priv *priv = dev_get_priv(dev);
+       struct uec_priv         *uec = priv->uec;
+
+       uec_stop(uec, COMM_DIR_RX_AND_TX);
+}
+
+static int qe_uec_set_hwaddr(struct udevice *dev)
+{
+       struct qe_uec_priv *priv = dev_get_priv(dev);
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+       struct uec_priv *uec = priv->uec;
+       uec_t *uec_regs = uec->uec_regs;
+       uchar *mac = pdata->enetaddr;
+       u32             mac_addr1;
+       u32             mac_addr2;
+
+       /*
+        * if a station address of 0x12345678ABCD, perform a write to
+        * MACSTNADDR1 of 0xCDAB7856,
+        * MACSTNADDR2 of 0x34120000
+        */
+
+       mac_addr1 = (mac[5] << 24) | (mac[4] << 16) |
+                       (mac[3] << 8)  | (mac[2]);
+       out_be32(&uec_regs->macstnaddr1, mac_addr1);
+
+       mac_addr2 = ((mac[1] << 24) | (mac[0] << 16)) & 0xffff0000;
+       out_be32(&uec_regs->macstnaddr2, mac_addr2);
+
+       return 0;
+}
+
+static int qe_uec_free_pkt(struct udevice *dev, uchar *packet, int length)
+{
+       if (packet)
+               free(packet);
+
+       return 0;
+}
+
+static const struct eth_ops qe_uec_eth_ops = {
+       .start          = qe_uec_start,
+       .send           = qe_uec_send,
+       .recv           = qe_uec_recv,
+       .free_pkt       = qe_uec_free_pkt,
+       .stop           = qe_uec_stop,
+       .write_hwaddr   = qe_uec_set_hwaddr,
+};
+
+static int uec_convert_threads_num(enum uec_num_of_threads threads_num,
+                                  int *threads_num_ret)
+{
+       int     num_threads_numerica;
+
+       switch (threads_num) {
+       case UEC_NUM_OF_THREADS_1:
+               num_threads_numerica = 1;
+               break;
+       case UEC_NUM_OF_THREADS_2:
+               num_threads_numerica = 2;
+               break;
+       case UEC_NUM_OF_THREADS_4:
+               num_threads_numerica = 4;
+               break;
+       case UEC_NUM_OF_THREADS_6:
+               num_threads_numerica = 6;
+               break;
+       case UEC_NUM_OF_THREADS_8:
+               num_threads_numerica = 8;
+               break;
+       default:
+               printf("%s: Bad number of threads value.",
+                      __func__);
+               return -EINVAL;
+       }
+
+       *threads_num_ret = num_threads_numerica;
+
+       return 0;
+}
+
+static void uec_init_tx_parameter(struct uec_priv *uec, int num_threads_tx)
+{
+       struct uec_inf  *uec_info;
+       u32             end_bd;
+       u8              bmrx = 0;
+       int             i;
+
+       uec_info = uec->uec_info;
+
+       /* Alloc global Tx parameter RAM page */
+       uec->tx_glbl_pram_offset =
+               qe_muram_alloc(sizeof(struct uec_tx_global_pram),
+                              UEC_TX_GLOBAL_PRAM_ALIGNMENT);
+       uec->p_tx_glbl_pram = (struct uec_tx_global_pram *)
+                               qe_muram_addr(uec->tx_glbl_pram_offset);
+
+       /* Zero the global Tx prameter RAM */
+       memset(uec->p_tx_glbl_pram, 0, sizeof(struct uec_tx_global_pram));
+
+       /* Init global Tx parameter RAM */
+
+       /* TEMODER, RMON statistics disable, one Tx queue */
+       out_be16(&uec->p_tx_glbl_pram->temoder, TEMODER_INIT_VALUE);
+
+       /* SQPTR */
+       uec->send_q_mem_reg_offset =
+               qe_muram_alloc(sizeof(struct uec_send_queue_qd),
+                              UEC_SEND_QUEUE_QUEUE_DESCRIPTOR_ALIGNMENT);
+       uec->p_send_q_mem_reg = (struct uec_send_queue_mem_region *)
+                               qe_muram_addr(uec->send_q_mem_reg_offset);
+       out_be32(&uec->p_tx_glbl_pram->sqptr, uec->send_q_mem_reg_offset);
+
+       /* Setup the table with TxBDs ring */
+       end_bd = (u32)uec->p_tx_bd_ring + (uec_info->tx_bd_ring_len - 1)
+                                        * SIZEOFBD;
+       out_be32(&uec->p_send_q_mem_reg->sqqd[0].bd_ring_base,
+                (u32)(uec->p_tx_bd_ring));
+       out_be32(&uec->p_send_q_mem_reg->sqqd[0].last_bd_completed_address,
+                end_bd);
+
+       /* Scheduler Base Pointer, we have only one Tx queue, no need it */
+       out_be32(&uec->p_tx_glbl_pram->schedulerbasepointer, 0);
+
+       /* TxRMON Base Pointer, TxRMON disable, we don't need it */
+       out_be32(&uec->p_tx_glbl_pram->txrmonbaseptr, 0);
+
+       /* TSTATE, global snooping, big endian, the CSB bus selected */
+       bmrx = BMR_INIT_VALUE;
+       out_be32(&uec->p_tx_glbl_pram->tstate, ((u32)(bmrx) << BMR_SHIFT));
+
+       /* IPH_Offset */
+       for (i = 0; i < MAX_IPH_OFFSET_ENTRY; i++)
+               out_8(&uec->p_tx_glbl_pram->iphoffset[i], 0);
+
+       /* VTAG table */
+       for (i = 0; i < UEC_TX_VTAG_TABLE_ENTRY_MAX; i++)
+               out_be32(&uec->p_tx_glbl_pram->vtagtable[i], 0);
+
+       /* TQPTR */
+       uec->thread_dat_tx_offset =
+               qe_muram_alloc(num_threads_tx *
+                              sizeof(struct uec_thread_data_tx) +
+                              32 * (num_threads_tx == 1),
+                              UEC_THREAD_DATA_ALIGNMENT);
+
+       uec->p_thread_data_tx = (struct uec_thread_data_tx *)
+                               qe_muram_addr(uec->thread_dat_tx_offset);
+       out_be32(&uec->p_tx_glbl_pram->tqptr, uec->thread_dat_tx_offset);
+}
+
+static void uec_init_rx_parameter(struct uec_priv *uec, int num_threads_rx)
+{
+       u8      bmrx = 0;
+       int     i;
+       struct uec_82xx_add_filtering_pram      *p_af_pram;
+
+       /* Allocate global Rx parameter RAM page */
+       uec->rx_glbl_pram_offset =
+               qe_muram_alloc(sizeof(struct uec_rx_global_pram),
+                              UEC_RX_GLOBAL_PRAM_ALIGNMENT);
+       uec->p_rx_glbl_pram = (struct uec_rx_global_pram *)
+                               qe_muram_addr(uec->rx_glbl_pram_offset);
+
+       /* Zero Global Rx parameter RAM */
+       memset(uec->p_rx_glbl_pram, 0, sizeof(struct uec_rx_global_pram));
+
+       /* Init global Rx parameter RAM */
+       /*
+        * REMODER, Extended feature mode disable, VLAN disable,
+        * LossLess flow control disable, Receive firmware statisic disable,
+        * Extended address parsing mode disable, One Rx queues,
+        * Dynamic maximum/minimum frame length disable, IP checksum check
+        * disable, IP address alignment disable
+        */
+       out_be32(&uec->p_rx_glbl_pram->remoder, REMODER_INIT_VALUE);
+
+       /* RQPTR */
+       uec->thread_dat_rx_offset =
+               qe_muram_alloc(num_threads_rx *
+                              sizeof(struct uec_thread_data_rx),
+                              UEC_THREAD_DATA_ALIGNMENT);
+       uec->p_thread_data_rx = (struct uec_thread_data_rx *)
+                               qe_muram_addr(uec->thread_dat_rx_offset);
+       out_be32(&uec->p_rx_glbl_pram->rqptr, uec->thread_dat_rx_offset);
+
+       /* Type_or_Len */
+       out_be16(&uec->p_rx_glbl_pram->typeorlen, 3072);
+
+       /* RxRMON base pointer, we don't need it */
+       out_be32(&uec->p_rx_glbl_pram->rxrmonbaseptr, 0);
+
+       /* IntCoalescingPTR, we don't need it, no interrupt */
+       out_be32(&uec->p_rx_glbl_pram->intcoalescingptr, 0);
+
+       /* RSTATE, global snooping, big endian, the CSB bus selected */
+       bmrx = BMR_INIT_VALUE;
+       out_8(&uec->p_rx_glbl_pram->rstate, bmrx);
+
+       /* MRBLR */
+       out_be16(&uec->p_rx_glbl_pram->mrblr, MAX_RXBUF_LEN);
+
+       /* RBDQPTR */
+       uec->rx_bd_qs_tbl_offset =
+               qe_muram_alloc(sizeof(struct uec_rx_bd_queues_entry) +
+                              sizeof(struct uec_rx_pref_bds),
+                              UEC_RX_BD_QUEUES_ALIGNMENT);
+       uec->p_rx_bd_qs_tbl = (struct uec_rx_bd_queues_entry *)
+                               qe_muram_addr(uec->rx_bd_qs_tbl_offset);
+
+       /* Zero it */
+       memset(uec->p_rx_bd_qs_tbl, 0, sizeof(struct uec_rx_bd_queues_entry) +
+              sizeof(struct uec_rx_pref_bds));
+       out_be32(&uec->p_rx_glbl_pram->rbdqptr, uec->rx_bd_qs_tbl_offset);
+       out_be32(&uec->p_rx_bd_qs_tbl->externalbdbaseptr,
+                (u32)uec->p_rx_bd_ring);
+
+       /* MFLR */
+       out_be16(&uec->p_rx_glbl_pram->mflr, MAX_FRAME_LEN);
+       /* MINFLR */
+       out_be16(&uec->p_rx_glbl_pram->minflr, MIN_FRAME_LEN);
+       /* MAXD1 */
+       out_be16(&uec->p_rx_glbl_pram->maxd1, MAX_DMA1_LEN);
+       /* MAXD2 */
+       out_be16(&uec->p_rx_glbl_pram->maxd2, MAX_DMA2_LEN);
+       /* ECAM_PTR */
+       out_be32(&uec->p_rx_glbl_pram->ecamptr, 0);
+       /* L2QT */
+       out_be32(&uec->p_rx_glbl_pram->l2qt, 0);
+       /* L3QT */
+       for (i = 0; i < 8; i++)
+               out_be32(&uec->p_rx_glbl_pram->l3qt[i], 0);
+
+       /* VLAN_TYPE */
+       out_be16(&uec->p_rx_glbl_pram->vlantype, 0x8100);
+       /* TCI */
+       out_be16(&uec->p_rx_glbl_pram->vlantci, 0);
+
+       /* Clear PQ2 style address filtering hash table */
+       p_af_pram = (struct uec_82xx_add_filtering_pram *)
+                       uec->p_rx_glbl_pram->addressfiltering;
+
+       p_af_pram->iaddr_h = 0;
+       p_af_pram->iaddr_l = 0;
+       p_af_pram->gaddr_h = 0;
+       p_af_pram->gaddr_l = 0;
+}
+
+static int uec_issue_init_enet_rxtx_cmd(struct uec_priv *uec,
+                                       int thread_tx, int thread_rx)
+{
+       struct uec_init_cmd_pram                *p_init_enet_param;
+       u32                             init_enet_param_offset;
+       struct uec_inf                  *uec_info;
+       struct ucc_fast_inf                     *uf_info;
+       int                             i;
+       int                             snum;
+       u32                             off;
+       u32                             entry_val;
+       u32                             command;
+       u32                             cecr_subblock;
+
+       uec_info = uec->uec_info;
+       uf_info = &uec_info->uf_info;
+
+       /* Allocate init enet command parameter */
+       uec->init_enet_param_offset =
+               qe_muram_alloc(sizeof(struct uec_init_cmd_pram), 4);
+       init_enet_param_offset = uec->init_enet_param_offset;
+       uec->p_init_enet_param = (struct uec_init_cmd_pram *)
+                               qe_muram_addr(uec->init_enet_param_offset);
+
+       /* Zero init enet command struct */
+       memset((void *)uec->p_init_enet_param, 0,
+              sizeof(struct uec_init_cmd_pram));
+
+       /* Init the command struct */
+       p_init_enet_param = uec->p_init_enet_param;
+       p_init_enet_param->resinit0 = ENET_INIT_PARAM_MAGIC_RES_INIT0;
+       p_init_enet_param->resinit1 = ENET_INIT_PARAM_MAGIC_RES_INIT1;
+       p_init_enet_param->resinit2 = ENET_INIT_PARAM_MAGIC_RES_INIT2;
+       p_init_enet_param->resinit3 = ENET_INIT_PARAM_MAGIC_RES_INIT3;
+       p_init_enet_param->resinit4 = ENET_INIT_PARAM_MAGIC_RES_INIT4;
+       p_init_enet_param->largestexternallookupkeysize = 0;
+
+       p_init_enet_param->rgftgfrxglobal |= ((u32)uec_info->num_threads_rx)
+                                        << ENET_INIT_PARAM_RGF_SHIFT;
+       p_init_enet_param->rgftgfrxglobal |= ((u32)uec_info->num_threads_tx)
+                                        << ENET_INIT_PARAM_TGF_SHIFT;
+
+       /* Init Rx global parameter pointer */
+       p_init_enet_param->rgftgfrxglobal |= uec->rx_glbl_pram_offset |
+                                                (u32)uec_info->risc_rx;
+
+       /* Init Rx threads */
+       for (i = 0; i < (thread_rx + 1); i++) {
+               snum = qe_get_snum();
+               if (snum < 0) {
+                       printf("%s can not get snum\n", __func__);
+                       return -ENOMEM;
+               }
+
+               if (i == 0) {
+                       off = 0;
+               } else {
+                       off = qe_muram_alloc(sizeof(struct uec_thread_rx_pram),
+                                            UEC_THREAD_RX_PRAM_ALIGNMENT);
+               }
+
+               entry_val = ((u32)snum << ENET_INIT_PARAM_SNUM_SHIFT) |
+                                off | (u32)uec_info->risc_rx;
+               p_init_enet_param->rxthread[i] = entry_val;
+       }
+
+       /* Init Tx global parameter pointer */
+       p_init_enet_param->txglobal = uec->tx_glbl_pram_offset |
+                                        (u32)uec_info->risc_tx;
+
+       /* Init Tx threads */
+       for (i = 0; i < thread_tx; i++) {
+               snum = qe_get_snum();
+               if (snum  < 0)  {
+                       printf("%s can not get snum\n", __func__);
+                       return -ENOMEM;
+               }
+
+               off = qe_muram_alloc(sizeof(struct uec_thread_tx_pram),
+                                    UEC_THREAD_TX_PRAM_ALIGNMENT);
+
+               entry_val = ((u32)snum << ENET_INIT_PARAM_SNUM_SHIFT) |
+                                off | (u32)uec_info->risc_tx;
+               p_init_enet_param->txthread[i] = entry_val;
+       }
+
+       __asm__ __volatile__("sync");
+
+       /* Issue QE command */
+       command = QE_INIT_TX_RX;
+       cecr_subblock = ucc_fast_get_qe_cr_subblock(uf_info->ucc_num);
+       qe_issue_cmd(command, cecr_subblock, (u8)QE_CR_PROTOCOL_ETHERNET,
+                    init_enet_param_offset);
+
+       return 0;
+}
+
+static int uec_startup(struct udevice *dev)
+{
+       struct qe_uec_priv *priv = dev_get_priv(dev);
+       struct uec_priv *uec = priv->uec;
+       struct uec_inf                  *uec_info;
+       struct ucc_fast_inf                     *uf_info;
+       struct ucc_fast_priv            *uccf;
+       ucc_fast_t                      *uf_regs;
+       uec_t                           *uec_regs;
+       int                             num_threads_tx;
+       int                             num_threads_rx;
+       u32                             utbipar;
+       u32                             length;
+       u32                             align;
+       struct buffer_descriptor        *bd;
+       u8                              *buf;
+       int                             i;
+
+       uec_info = uec->uec_info;
+       uf_info = &uec_info->uf_info;
+
+       /* Check if Rx BD ring len is illegal */
+       if (uec_info->rx_bd_ring_len < UEC_RX_BD_RING_SIZE_MIN ||
+           uec_info->rx_bd_ring_len % UEC_RX_BD_RING_SIZE_ALIGNMENT) {
+               printf("%s: Rx BD ring len must be multiple of 4, and > 8.\n",
+                      __func__);
+               return -EINVAL;
+       }
+
+       /* Check if Tx BD ring len is illegal */
+       if (uec_info->tx_bd_ring_len < UEC_TX_BD_RING_SIZE_MIN) {
+               printf("%s: Tx BD ring length must not be smaller than 2.\n",
+                      __func__);
+               return -EINVAL;
+       }
+
+       /* Check if MRBLR is illegal */
+       if (MAX_RXBUF_LEN == 0 || (MAX_RXBUF_LEN  % UEC_MRBLR_ALIGNMENT)) {
+               printf("%s: max rx buffer length must be mutliple of 128.\n",
+                      __func__);
+               return -EINVAL;
+       }
+
+       /* Both Rx and Tx are stopped */
+       uec->grace_stopped_rx = 1;
+       uec->grace_stopped_tx = 1;
+
+       /* Init UCC fast */
+       if (ucc_fast_init(uf_info, &uccf)) {
+               printf("%s: failed to init ucc fast\n", __func__);
+               return -ENOMEM;
+       }
+
+       /* Save uccf */
+       uec->uccf = uccf;
+
+       /* Convert the Tx threads number */
+       if (uec_convert_threads_num(uec_info->num_threads_tx,
+                                   &num_threads_tx))
+               return -EINVAL;
+
+       /* Convert the Rx threads number */
+       if (uec_convert_threads_num(uec_info->num_threads_rx,
+                                   &num_threads_rx))
+               return -EINVAL;
+
+       uf_regs = uccf->uf_regs;
+
+       /* UEC register is following UCC fast registers */
+       uec_regs = (uec_t *)(&uf_regs->ucc_eth);
+
+       /* Save the UEC register pointer to UEC private struct */
+       uec->uec_regs = uec_regs;
+
+       /* Init UPSMR, enable hardware statistics (UCC) */
+       out_be32(&uec->uccf->uf_regs->upsmr, UPSMR_INIT_VALUE);
+
+       /* Init MACCFG1, flow control disable, disable Tx and Rx */
+       out_be32(&uec_regs->maccfg1, MACCFG1_INIT_VALUE);
+
+       /* Init MACCFG2, length check, MAC PAD and CRC enable */
+       out_be32(&uec_regs->maccfg2, MACCFG2_INIT_VALUE);
+
+       /* Setup UTBIPAR */
+       utbipar = in_be32(&uec_regs->utbipar);
+       utbipar &= ~UTBIPAR_PHY_ADDRESS_MASK;
+
+       /* Initialize UTBIPAR address to CONFIG_UTBIPAR_INIT_TBIPA for ALL UEC.
+        * This frees up the remaining SMI addresses for use.
+        */
+       utbipar |= CONFIG_UTBIPAR_INIT_TBIPA << UTBIPAR_PHY_ADDRESS_SHIFT;
+       out_be32(&uec_regs->utbipar, utbipar);
+
+       /* Allocate Tx BDs */
+       length = ((uec_info->tx_bd_ring_len * SIZEOFBD) /
+                UEC_TX_BD_RING_SIZE_MEMORY_ALIGNMENT) *
+                UEC_TX_BD_RING_SIZE_MEMORY_ALIGNMENT;
+       if ((uec_info->tx_bd_ring_len * SIZEOFBD) %
+           UEC_TX_BD_RING_SIZE_MEMORY_ALIGNMENT)
+               length += UEC_TX_BD_RING_SIZE_MEMORY_ALIGNMENT;
+
+       align = UEC_TX_BD_RING_ALIGNMENT;
+       uec->tx_bd_ring_offset = (u32)malloc((u32)(length + align));
+       if (uec->tx_bd_ring_offset != 0)
+               uec->p_tx_bd_ring = (u8 *)((uec->tx_bd_ring_offset + align)
+                                          & ~(align - 1));
+
+       /* Zero all of Tx BDs */
+       memset((void *)(uec->tx_bd_ring_offset), 0, length + align);
+
+       /* Allocate Rx BDs */
+       length = uec_info->rx_bd_ring_len * SIZEOFBD;
+       align = UEC_RX_BD_RING_ALIGNMENT;
+       uec->rx_bd_ring_offset = (u32)(malloc((u32)(length + align)));
+       if (uec->rx_bd_ring_offset != 0)
+               uec->p_rx_bd_ring = (u8 *)((uec->rx_bd_ring_offset + align)
+                                          & ~(align - 1));
+
+       /* Zero all of Rx BDs */
+       memset((void *)(uec->rx_bd_ring_offset), 0, length + align);
+
+       /* Allocate Rx buffer */
+       length = uec_info->rx_bd_ring_len * MAX_RXBUF_LEN;
+       align = UEC_RX_DATA_BUF_ALIGNMENT;
+       uec->rx_buf_offset = (u32)malloc(length + align);
+       if (uec->rx_buf_offset != 0)
+               uec->p_rx_buf = (u8 *)((uec->rx_buf_offset + align)
+                                      & ~(align - 1));
+
+       /* Zero all of the Rx buffer */
+       memset((void *)(uec->rx_buf_offset), 0, length + align);
+
+       /* Init TxBD ring */
+       bd = (struct buffer_descriptor *)uec->p_tx_bd_ring;
+       uec->tx_bd = bd;
+
+       for (i = 0; i < uec_info->tx_bd_ring_len; i++) {
+               BD_DATA_CLEAR(bd);
+               BD_STATUS_SET(bd, 0);
+               BD_LENGTH_SET(bd, 0);
+               bd++;
+       }
+       BD_STATUS_SET((--bd), TX_BD_WRAP);
+
+       /* Init RxBD ring */
+       bd = (struct buffer_descriptor *)uec->p_rx_bd_ring;
+       uec->rx_bd = bd;
+       buf = uec->p_rx_buf;
+       for (i = 0; i < uec_info->rx_bd_ring_len; i++) {
+               BD_DATA_SET(bd, buf);
+               BD_LENGTH_SET(bd, 0);
+               BD_STATUS_SET(bd, RX_BD_EMPTY);
+               buf += MAX_RXBUF_LEN;
+               bd++;
+       }
+       BD_STATUS_SET((--bd), RX_BD_WRAP | RX_BD_EMPTY);
+
+       /* Init global Tx parameter RAM */
+       uec_init_tx_parameter(uec, num_threads_tx);
+
+       /* Init global Rx parameter RAM */
+       uec_init_rx_parameter(uec, num_threads_rx);
+
+       /* Init ethernet Tx and Rx parameter command */
+       if (uec_issue_init_enet_rxtx_cmd(uec, num_threads_tx,
+                                        num_threads_rx)) {
+               printf("%s issue init enet cmd failed\n", __func__);
+               return -ENOMEM;
+       }
+       return 0;
+}
+
+/* Convert a string to a QE clock source enum
+ *
+ * This function takes a string, typically from a property in the device
+ * tree, and returns the corresponding "enum qe_clock" value.
+ */
+enum qe_clock qe_clock_source(const char *source)
+{
+       unsigned int i;
+
+       if (strcasecmp(source, "none") == 0)
+               return QE_CLK_NONE;
+
+       if (strncasecmp(source, "brg", 3) == 0) {
+               i = simple_strtoul(source + 3, NULL, 10);
+               if (i >= 1 && i <= 16)
+                       return (QE_BRG1 - 1) + i;
+               else
+                       return QE_CLK_DUMMY;
+       }
+
+       if (strncasecmp(source, "clk", 3) == 0) {
+               i = simple_strtoul(source + 3, NULL, 10);
+               if (i >= 1 && i <= 24)
+                       return (QE_CLK1 - 1) + i;
+               else
+                       return QE_CLK_DUMMY;
+       }
+
+       return QE_CLK_DUMMY;
+}
+
+static void qe_uec_set_eth_type(struct udevice *dev)
+{
+       struct qe_uec_priv *priv = dev_get_priv(dev);
+       struct uec_priv         *uec = priv->uec;
+       struct uec_inf *uec_info  = uec->uec_info;
+       struct ucc_fast_inf *uf_info = &uec_info->uf_info;
+
+       switch (uec_info->enet_interface_type) {
+       case PHY_INTERFACE_MODE_GMII:
+       case PHY_INTERFACE_MODE_RGMII:
+       case PHY_INTERFACE_MODE_RGMII_ID:
+       case PHY_INTERFACE_MODE_RGMII_RXID:
+       case PHY_INTERFACE_MODE_RGMII_TXID:
+       case PHY_INTERFACE_MODE_TBI:
+       case PHY_INTERFACE_MODE_RTBI:
+       case PHY_INTERFACE_MODE_SGMII:
+               uf_info->eth_type = GIGA_ETH;
+               break;
+       default:
+               uf_info->eth_type = FAST_ETH;
+               break;
+       }
+}
+
+static int qe_uec_set_uec_info(struct udevice *dev)
+{
+       struct qe_uec_priv *priv = dev_get_priv(dev);
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+       struct uec_priv *uec = priv->uec;
+       struct uec_inf *uec_info;
+       struct ucc_fast_inf *uf_info;
+       const char *s;
+       int ret;
+       u32 val;
+
+       uec_info = (struct uec_inf *)malloc(sizeof(struct uec_inf));
+       if (!uec_info)
+               return -ENOMEM;
+
+       uf_info = &uec_info->uf_info;
+
+       ret = dev_read_u32(dev, "cell-index", &val);
+       if (ret) {
+               ret = dev_read_u32(dev, "device-id", &val);
+               if (ret) {
+                       pr_err("no cell-index nor device-id found!");
+                       goto out;
+               }
+       }
+
+       uf_info->ucc_num = val - 1;
+       if (uf_info->ucc_num < 0 || uf_info->ucc_num > 7) {
+               ret = -ENODEV;
+               goto out;
+       }
+
+       ret = dev_read_string_index(dev, "rx-clock-name", 0, &s);
+       if (!ret) {
+               uf_info->rx_clock = qe_clock_source(s);
+               if (uf_info->rx_clock < QE_CLK_NONE ||
+                   uf_info->rx_clock > QE_CLK24) {
+                       pr_err("invalid rx-clock-name property\n");
+                       ret = -EINVAL;
+                       goto out;
+               }
+       } else {
+               ret = dev_read_u32(dev, "rx-clock", &val);
+               if (ret) {
+                       /*
+                        * If both rx-clock-name and rx-clock are missing,
+                        * we want to tell people to use rx-clock-name.
+                        */
+                       pr_err("missing rx-clock-name property\n");
+                       goto out;
+               }
+               if (val < QE_CLK_NONE || val > QE_CLK24) {
+                       pr_err("invalid rx-clock property\n");
+                       ret = -EINVAL;
+                       goto out;
+               }
+               uf_info->rx_clock = val;
+       }
+
+       ret = dev_read_string_index(dev, "tx-clock-name", 0, &s);
+       if (!ret) {
+               uf_info->tx_clock = qe_clock_source(s);
+               if (uf_info->tx_clock < QE_CLK_NONE ||
+                   uf_info->tx_clock > QE_CLK24) {
+                       pr_err("invalid tx-clock-name property\n");
+                       ret = -EINVAL;
+                       goto out;
+               }
+       } else {
+               ret = dev_read_u32(dev, "tx-clock", &val);
+               if (ret) {
+                       pr_err("missing tx-clock-name property\n");
+                       goto out;
+               }
+               if (val < QE_CLK_NONE || val > QE_CLK24) {
+                       pr_err("invalid tx-clock property\n");
+                       ret = -EINVAL;
+                       goto out;
+               }
+               uf_info->tx_clock = val;
+       }
+
+       uec_info->num_threads_tx = UEC_NUM_OF_THREADS_1;
+       uec_info->num_threads_rx = UEC_NUM_OF_THREADS_1;
+       uec_info->risc_tx = QE_RISC_ALLOCATION_RISC1_AND_RISC2;
+       uec_info->risc_rx = QE_RISC_ALLOCATION_RISC1_AND_RISC2;
+       uec_info->tx_bd_ring_len = 16;
+       uec_info->rx_bd_ring_len = 16;
+#if (MAX_QE_RISC == 4)
+       uec_info->risc_tx = QE_RISC_ALLOCATION_FOUR_RISCS;
+       uec_info->risc_rx = QE_RISC_ALLOCATION_FOUR_RISCS;
+#endif
+
+       uec_info->enet_interface_type = pdata->phy_interface;
+
+       uec->uec_info = uec_info;
+       qe_uec_set_eth_type(dev);
+
+       return 0;
+out:
+       free(uec_info);
+       return ret;
+}
+
+static int qe_uec_probe(struct udevice *dev)
+{
+       struct qe_uec_priv *priv = dev_get_priv(dev);
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+       struct uec_priv         *uec;
+       int ret;
+
+       /* Allocate the UEC private struct */
+       uec = (struct uec_priv *)malloc(sizeof(struct uec_priv));
+       if (!uec)
+               return -ENOMEM;
+
+       memset(uec, 0, sizeof(struct uec_priv));
+       priv->uec = uec;
+       uec->uec_regs = (uec_t *)pdata->iobase;
+
+       /* setup uec info struct */
+       ret = qe_uec_set_uec_info(dev);
+       if (ret) {
+               free(uec);
+               return ret;
+       }
+
+       ret = uec_startup(dev);
+       if (ret) {
+               free(uec->uec_info);
+               free(uec);
+               return ret;
+       }
+
+       priv->phydev = dm_eth_phy_connect(dev);
+       return 0;
+}
+
+/*
+ * Remove the driver from an interface:
+ * - free up allocated memory
+ */
+static int qe_uec_remove(struct udevice *dev)
+{
+       struct qe_uec_priv *priv = dev_get_priv(dev);
+
+       free(priv->uec);
+       return 0;
+}
+
+static int qe_uec_ofdata_to_platdata(struct udevice *dev)
+{
+       struct eth_pdata *pdata = dev_get_platdata(dev);
+       const char *phy_mode;
+
+       pdata->iobase = (phys_addr_t)devfdt_get_addr(dev);
+
+       pdata->phy_interface = -1;
+       phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev),
+                              "phy-connection-type", NULL);
+       if (phy_mode)
+               pdata->phy_interface = phy_get_interface_by_name(phy_mode);
+       if (pdata->phy_interface == -1) {
+               debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static const struct udevice_id qe_uec_ids[] = {
+       { .compatible = QE_UEC_DRIVER_NAME },
+       { }
+};
+
+U_BOOT_DRIVER(eth_qe_uec) = {
+       .name   = QE_UEC_DRIVER_NAME,
+       .id     = UCLASS_ETH,
+       .of_match = qe_uec_ids,
+       .ofdata_to_platdata = qe_uec_ofdata_to_platdata,
+       .probe  = qe_uec_probe,
+       .remove = qe_uec_remove,
+       .ops    = &qe_uec_eth_ops,
+       .priv_auto_alloc_size = sizeof(struct qe_uec_priv),
+       .platdata_auto_alloc_size = sizeof(struct eth_pdata),
+};
diff --git a/drivers/net/qe/dm_qe_uec.h b/drivers/net/qe/dm_qe_uec.h
new file mode 100644 (file)
index 0000000..690093c
--- /dev/null
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0+
+ *
+ * QE UEC ethernet controller driver
+ *
+ * based on drivers/qe/uec.c from NXP
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ */
+
+#ifndef _DM_QE_UEC_H
+#define _DM_QE_UEC_H
+
+#define qe_uec_dbg(dev, fmt, args...)  debug("%s:" fmt, dev->name, ##args)
+
+#include "uec.h"
+
+/* QE UEC private structure */
+struct qe_uec_priv {
+       struct uec_priv *uec;
+       struct phy_device *phydev;
+};
+#endif
diff --git a/drivers/net/qe/dm_qe_uec_phy.c b/drivers/net/qe/dm_qe_uec_phy.c
new file mode 100644 (file)
index 0000000..02ce08e
--- /dev/null
@@ -0,0 +1,163 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * QE UEC ethernet phy controller driver
+ *
+ * based on phy parts of drivers/qe/uec.c and drivers/qe/uec_phy.c
+ * from NXP
+ *
+ * Copyright (C) 2020 Heiko Schocher <hs@denx.de>
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <miiphy.h>
+#include <phy.h>
+#include <asm/io.h>
+#include <linux/ioport.h>
+
+#include "dm_qe_uec.h"
+
+struct qe_uec_mdio_priv {
+       struct ucc_mii_mng *base;
+};
+
+static int
+qe_uec_mdio_read(struct udevice *dev, int addr, int devad, int reg)
+{
+       struct qe_uec_mdio_priv *priv = dev_get_priv(dev);
+       struct ucc_mii_mng *regs = priv->base;
+       u32 tmp_reg;
+       u16 value;
+
+       debug("%s: regs: %p addr: %x devad: %x reg: %x\n", __func__, regs,
+             addr, devad, reg);
+       /* Setting up the MII management Address Register */
+       tmp_reg = ((u32)addr << MIIMADD_PHY_ADDRESS_SHIFT) | reg;
+       out_be32(&regs->miimadd, tmp_reg);
+
+       /* clear MII management command cycle */
+       out_be32(&regs->miimcom, 0);
+       sync();
+
+       /* Perform an MII management read cycle */
+       out_be32(&regs->miimcom, MIIMCOM_READ_CYCLE);
+
+       /* Wait till MII management write is complete */
+       while ((in_be32(&regs->miimind)) &
+              (MIIMIND_NOT_VALID | MIIMIND_BUSY))
+               ;
+
+       /* Read MII management status  */
+       value = (u16)in_be32(&regs->miimstat);
+       if (value == 0xffff)
+               return -EINVAL;
+
+       return value;
+};
+
+static int
+qe_uec_mdio_write(struct udevice *dev, int addr, int devad, int reg,
+                 u16 value)
+{
+       struct qe_uec_mdio_priv *priv = dev_get_priv(dev);
+       struct ucc_mii_mng *regs = priv->base;
+       u32 tmp_reg;
+
+       debug("%s: regs: %p addr: %x devad: %x reg: %x val: %x\n", __func__,
+             regs, addr, devad, reg, value);
+
+       /* Stop the MII management read cycle */
+       out_be32(&regs->miimcom, 0);
+       /* Setting up the MII management Address Register */
+       tmp_reg = ((u32)addr << MIIMADD_PHY_ADDRESS_SHIFT) | reg;
+       out_be32(&regs->miimadd, tmp_reg);
+
+       /* Setting up the MII management Control Register with the value */
+       out_be32(&regs->miimcon, (u32)value);
+       sync();
+
+       /* Wait till MII management write is complete */
+       while ((in_be32(&regs->miimind)) & MIIMIND_BUSY)
+               ;
+
+       return 0;
+};
+
+static const struct mdio_ops qe_uec_mdio_ops = {
+       .read = qe_uec_mdio_read,
+       .write = qe_uec_mdio_write,
+};
+
+static int qe_uec_mdio_probe(struct udevice *dev)
+{
+       struct qe_uec_mdio_priv *priv = dev_get_priv(dev);
+       fdt_size_t base;
+       ofnode node;
+       u32 num = 0;
+       int ret = -ENODEV;
+
+       priv->base = (struct ucc_mii_mng *)dev_read_addr(dev);
+       base = (fdt_size_t)priv->base;
+
+       /*
+        * idea from linux:
+        * drivers/net/ethernet/freescale/fsl_pq_mdio.c
+        *
+        * Find the UCC node that controls the given MDIO node
+        *
+        * For some reason, the QE MDIO nodes are not children of the UCC
+        * devices that control them.  Therefore, we need to scan all UCC
+        * nodes looking for the one that encompases the given MDIO node.
+        * We do this by comparing physical addresses.  The 'start' and
+        * 'end' addresses of the MDIO node are passed, and the correct
+        * UCC node will cover the entire address range.
+        */
+       node = ofnode_by_compatible(ofnode_null(), "ucc_geth");
+       while (ofnode_valid(node)) {
+               fdt_size_t size;
+               fdt_addr_t addr;
+
+               addr = ofnode_get_addr_index(node, 0);
+               ret = ofnode_get_addr_size_index(node, 0, &size);
+
+               if (addr == FDT_ADDR_T_NONE) {
+                       node = ofnode_by_compatible(node, "ucc_geth");
+                       continue;
+               }
+
+               /* check if priv->base in start end */
+               if (base > addr && base < (addr + size)) {
+                       ret = ofnode_read_u32(node, "cell-index", &num);
+                       if (ret)
+                               ret = ofnode_read_u32(node, "device-id",
+                                                     &num);
+                       break;
+               }
+               node = ofnode_by_compatible(node, "ucc_geth");
+       }
+
+       if (ret) {
+               printf("%s: no cell-index nor device-id found!", __func__);
+               return ret;
+       }
+
+       /* Setup MII master clock source */
+       qe_set_mii_clk_src(num - 1);
+
+       return 0;
+}
+
+static const struct udevice_id qe_uec_mdio_ids[] = {
+       { .compatible = "fsl,ucc-mdio" },
+       { }
+};
+
+U_BOOT_DRIVER(mvmdio) = {
+       .name                   = "qe_uec_mdio",
+       .id                     = UCLASS_MDIO,
+       .of_match               = qe_uec_mdio_ids,
+       .probe                  = qe_uec_mdio_probe,
+       .ops                    = &qe_uec_mdio_ops,
+       .priv_auto_alloc_size   = sizeof(struct qe_uec_mdio_priv),
+};
diff --git a/drivers/net/qe/uccf.c b/drivers/net/qe/uccf.c
new file mode 100644 (file)
index 0000000..306f1ea
--- /dev/null
@@ -0,0 +1,507 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2006 Freescale Semiconductor, Inc.
+ *
+ * Dave Liu <daveliu@freescale.com>
+ * based on source code of Shlomi Gridish
+ */
+
+#include <common.h>
+#include <malloc.h>
+#include <linux/errno.h>
+#include <asm/io.h>
+#include <linux/immap_qe.h>
+#include "uccf.h"
+#include <fsl_qe.h>
+
+void ucc_fast_transmit_on_demand(struct ucc_fast_priv *uccf)
+{
+       out_be16(&uccf->uf_regs->utodr, UCC_FAST_TOD);
+}
+
+u32 ucc_fast_get_qe_cr_subblock(int ucc_num)
+{
+       switch (ucc_num) {
+       case 0:
+               return QE_CR_SUBBLOCK_UCCFAST1;
+       case 1:
+               return QE_CR_SUBBLOCK_UCCFAST2;
+       case 2:
+               return QE_CR_SUBBLOCK_UCCFAST3;
+       case 3:
+               return QE_CR_SUBBLOCK_UCCFAST4;
+       case 4:
+               return QE_CR_SUBBLOCK_UCCFAST5;
+       case 5:
+               return QE_CR_SUBBLOCK_UCCFAST6;
+       case 6:
+               return QE_CR_SUBBLOCK_UCCFAST7;
+       case 7:
+               return QE_CR_SUBBLOCK_UCCFAST8;
+       default:
+               return QE_CR_SUBBLOCK_INVALID;
+       }
+}
+
+static void ucc_get_cmxucr_reg(int ucc_num, u32 **p_cmxucr,
+                              u8 *reg_num, u8 *shift)
+{
+       switch (ucc_num) {
+       case 0: /* UCC1 */
+               *p_cmxucr  = &qe_immr->qmx.cmxucr1;
+               *reg_num = 1;
+               *shift  = 16;
+               break;
+       case 2: /* UCC3 */
+               *p_cmxucr  = &qe_immr->qmx.cmxucr1;
+               *reg_num = 1;
+               *shift  = 0;
+               break;
+       case 4: /* UCC5 */
+               *p_cmxucr  = &qe_immr->qmx.cmxucr2;
+               *reg_num = 2;
+               *shift  = 16;
+               break;
+       case 6: /* UCC7 */
+               *p_cmxucr  = &qe_immr->qmx.cmxucr2;
+               *reg_num = 2;
+               *shift  = 0;
+               break;
+       case 1: /* UCC2 */
+               *p_cmxucr  = &qe_immr->qmx.cmxucr3;
+               *reg_num = 3;
+               *shift  = 16;
+               break;
+       case 3: /* UCC4 */
+               *p_cmxucr  = &qe_immr->qmx.cmxucr3;
+               *reg_num = 3;
+               *shift  = 0;
+               break;
+       case 5: /* UCC6 */
+               *p_cmxucr  = &qe_immr->qmx.cmxucr4;
+               *reg_num = 4;
+               *shift  = 16;
+               break;
+       case 7: /* UCC8 */
+               *p_cmxucr  = &qe_immr->qmx.cmxucr4;
+               *reg_num = 4;
+               *shift  = 0;
+               break;
+       default:
+               break;
+       }
+}
+
+static int ucc_set_clk_src(int ucc_num, qe_clock_e clock, comm_dir_e mode)
+{
+       u32     *p_cmxucr = NULL;
+       u8      reg_num = 0;
+       u8      shift = 0;
+       u32     clk_bits;
+       u32     clk_mask;
+       int     source = -1;
+
+       /* check if the UCC number is in range. */
+       if ((ucc_num > UCC_MAX_NUM - 1) || ucc_num < 0)
+               return -EINVAL;
+
+       if (!(mode == COMM_DIR_RX || mode == COMM_DIR_TX)) {
+               printf("%s: bad comm mode type passed\n", __func__);
+               return -EINVAL;
+       }
+
+       ucc_get_cmxucr_reg(ucc_num, &p_cmxucr, &reg_num, &shift);
+
+       switch (reg_num) {
+       case 1:
+               switch (clock) {
+               case QE_BRG1:
+                       source = 1;
+                       break;
+               case QE_BRG2:
+                       source = 2;
+                       break;
+               case QE_BRG7:
+                       source = 3;
+                       break;
+               case QE_BRG8:
+                       source = 4;
+                       break;
+               case QE_CLK9:
+                       source = 5;
+                       break;
+               case QE_CLK10:
+                       source = 6;
+                       break;
+               case QE_CLK11:
+                       source = 7;
+                       break;
+               case QE_CLK12:
+                       source = 8;
+                       break;
+               case QE_CLK15:
+                       source = 9;
+                       break;
+               case QE_CLK16:
+                       source = 10;
+                       break;
+               default:
+                       source = -1;
+                       break;
+               }
+               break;
+       case 2:
+               switch (clock) {
+               case QE_BRG5:
+                       source = 1;
+                       break;
+               case QE_BRG6:
+                       source = 2;
+                       break;
+               case QE_BRG7:
+                       source = 3;
+                       break;
+               case QE_BRG8:
+                       source = 4;
+                       break;
+               case QE_CLK13:
+                       source = 5;
+                       break;
+               case QE_CLK14:
+                       source = 6;
+                       break;
+               case QE_CLK19:
+                       source = 7;
+                       break;
+               case QE_CLK20:
+                       source = 8;
+                       break;
+               case QE_CLK15:
+                       source = 9;
+                       break;
+               case QE_CLK16:
+                       source = 10;
+                       break;
+               default:
+                       source = -1;
+                       break;
+               }
+               break;
+       case 3:
+               switch (clock) {
+               case QE_BRG9:
+                       source = 1;
+                       break;
+               case QE_BRG10:
+                       source = 2;
+                       break;
+               case QE_BRG15:
+                       source = 3;
+                       break;
+               case QE_BRG16:
+                       source = 4;
+                       break;
+               case QE_CLK3:
+                       source = 5;
+                       break;
+               case QE_CLK4:
+                       source = 6;
+                       break;
+               case QE_CLK17:
+                       source = 7;
+                       break;
+               case QE_CLK18:
+                       source = 8;
+                       break;
+               case QE_CLK7:
+                       source = 9;
+                       break;
+               case QE_CLK8:
+                       source = 10;
+                       break;
+               case QE_CLK16:
+                       source = 11;
+                       break;
+               default:
+                       source = -1;
+                       break;
+               }
+               break;
+       case 4:
+               switch (clock) {
+               case QE_BRG13:
+                       source = 1;
+                       break;
+               case QE_BRG14:
+                       source = 2;
+                       break;
+               case QE_BRG15:
+                       source = 3;
+                       break;
+               case QE_BRG16:
+                       source = 4;
+                       break;
+               case QE_CLK5:
+                       source = 5;
+                       break;
+               case QE_CLK6:
+                       source = 6;
+                       break;
+               case QE_CLK21:
+                       source = 7;
+                       break;
+               case QE_CLK22:
+                       source = 8;
+                       break;
+               case QE_CLK7:
+                       source = 9;
+                       break;
+               case QE_CLK8:
+                       source = 10;
+                       break;
+               case QE_CLK16:
+                       source = 11;
+                       break;
+               default:
+                       source = -1;
+                       break;
+               }
+               break;
+       default:
+               source = -1;
+               break;
+       }
+
+       if (source == -1) {
+               printf("%s: Bad combination of clock and UCC\n", __func__);
+               return -ENOENT;
+       }
+
+       clk_bits = (u32)source;
+       clk_mask = QE_CMXUCR_TX_CLK_SRC_MASK;
+       if (mode == COMM_DIR_RX) {
+               clk_bits <<= 4; /* Rx field is 4 bits to left of Tx field */
+               clk_mask <<= 4; /* Rx field is 4 bits to left of Tx field */
+       }
+       clk_bits <<= shift;
+       clk_mask <<= shift;
+
+       out_be32(p_cmxucr, (in_be32(p_cmxucr) & ~clk_mask) | clk_bits);
+
+       return 0;
+}
+
+static uint ucc_get_reg_baseaddr(int ucc_num)
+{
+       uint base = 0;
+
+       /* check if the UCC number is in range */
+       if ((ucc_num > UCC_MAX_NUM - 1) || ucc_num < 0) {
+               printf("%s: the UCC num not in ranges\n", __func__);
+               return 0;
+       }
+
+       switch (ucc_num) {
+       case 0:
+               base = 0x00002000;
+               break;
+       case 1:
+               base = 0x00003000;
+               break;
+       case 2:
+               base = 0x00002200;
+               break;
+       case 3:
+               base = 0x00003200;
+               break;
+       case 4:
+               base = 0x00002400;
+               break;
+       case 5:
+               base = 0x00003400;
+               break;
+       case 6:
+               base = 0x00002600;
+               break;
+       case 7:
+               base = 0x00003600;
+               break;
+       default:
+               break;
+       }
+
+       base = (uint)qe_immr + base;
+       return base;
+}
+
+void ucc_fast_enable(struct ucc_fast_priv *uccf, comm_dir_e mode)
+{
+       ucc_fast_t      *uf_regs;
+       u32             gumr;
+
+       uf_regs = uccf->uf_regs;
+
+       /* Enable reception and/or transmission on this UCC. */
+       gumr = in_be32(&uf_regs->gumr);
+       if (mode & COMM_DIR_TX) {
+               gumr |= UCC_FAST_GUMR_ENT;
+               uccf->enabled_tx = 1;
+       }
+       if (mode & COMM_DIR_RX) {
+               gumr |= UCC_FAST_GUMR_ENR;
+               uccf->enabled_rx = 1;
+       }
+       out_be32(&uf_regs->gumr, gumr);
+}
+
+void ucc_fast_disable(struct ucc_fast_priv *uccf, comm_dir_e mode)
+{
+       ucc_fast_t      *uf_regs;
+       u32             gumr;
+
+       uf_regs = uccf->uf_regs;
+
+       /* Disable reception and/or transmission on this UCC. */
+       gumr = in_be32(&uf_regs->gumr);
+       if (mode & COMM_DIR_TX) {
+               gumr &= ~UCC_FAST_GUMR_ENT;
+               uccf->enabled_tx = 0;
+       }
+       if (mode & COMM_DIR_RX) {
+               gumr &= ~UCC_FAST_GUMR_ENR;
+               uccf->enabled_rx = 0;
+       }
+       out_be32(&uf_regs->gumr, gumr);
+}
+
+int ucc_fast_init(struct ucc_fast_inf *uf_info,
+                 struct ucc_fast_priv **uccf_ret)
+{
+       struct ucc_fast_priv    *uccf;
+       ucc_fast_t              *uf_regs;
+
+       if (!uf_info)
+               return -EINVAL;
+
+       if (uf_info->ucc_num < 0 || (uf_info->ucc_num > UCC_MAX_NUM - 1)) {
+               printf("%s: Illagal UCC number!\n", __func__);
+               return -EINVAL;
+       }
+
+       uccf = (struct ucc_fast_priv *)malloc(sizeof(struct ucc_fast_priv));
+       if (!uccf) {
+               printf("%s: No memory for UCC fast data structure!\n",
+                      __func__);
+               return -ENOMEM;
+       }
+       memset(uccf, 0, sizeof(struct ucc_fast_priv));
+
+       /* Save fast UCC structure */
+       uccf->uf_info   = uf_info;
+       uccf->uf_regs   = (ucc_fast_t *)ucc_get_reg_baseaddr(uf_info->ucc_num);
+
+       if (!uccf->uf_regs) {
+               printf("%s: No memory map for UCC fast controller!\n",
+                      __func__);
+               return -ENOMEM;
+       }
+
+       uccf->enabled_tx        = 0;
+       uccf->enabled_rx        = 0;
+
+       uf_regs                 = uccf->uf_regs;
+       uccf->p_ucce            = (u32 *)&uf_regs->ucce;
+       uccf->p_uccm            = (u32 *)&uf_regs->uccm;
+
+       /* Init GUEMR register, UCC both Rx and Tx is Fast protocol */
+       out_8(&uf_regs->guemr, UCC_GUEMR_SET_RESERVED3 | UCC_GUEMR_MODE_FAST_RX
+                                | UCC_GUEMR_MODE_FAST_TX);
+
+       /* Set GUMR, disable UCC both Rx and Tx, Ethernet protocol */
+       out_be32(&uf_regs->gumr, UCC_FAST_GUMR_ETH);
+
+       /* Set the Giga ethernet VFIFO stuff */
+       if (uf_info->eth_type == GIGA_ETH) {
+               /* Allocate memory for Tx Virtual Fifo */
+               uccf->ucc_fast_tx_virtual_fifo_base_offset =
+               qe_muram_alloc(UCC_GETH_UTFS_GIGA_INIT,
+                              UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
+
+               /* Allocate memory for Rx Virtual Fifo */
+               uccf->ucc_fast_rx_virtual_fifo_base_offset =
+               qe_muram_alloc(UCC_GETH_URFS_GIGA_INIT +
+                              UCC_FAST_RX_VIRTUAL_FIFO_SIZE_PAD,
+                              UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
+
+               /* utfb, urfb are offsets from MURAM base */
+               out_be32(&uf_regs->utfb,
+                        uccf->ucc_fast_tx_virtual_fifo_base_offset);
+               out_be32(&uf_regs->urfb,
+                        uccf->ucc_fast_rx_virtual_fifo_base_offset);
+
+               /* Set Virtual Fifo registers */
+               out_be16(&uf_regs->urfs, UCC_GETH_URFS_GIGA_INIT);
+               out_be16(&uf_regs->urfet, UCC_GETH_URFET_GIGA_INIT);
+               out_be16(&uf_regs->urfset, UCC_GETH_URFSET_GIGA_INIT);
+               out_be16(&uf_regs->utfs, UCC_GETH_UTFS_GIGA_INIT);
+               out_be16(&uf_regs->utfet, UCC_GETH_UTFET_GIGA_INIT);
+               out_be16(&uf_regs->utftt, UCC_GETH_UTFTT_GIGA_INIT);
+       }
+
+       /* Set the Fast ethernet VFIFO stuff */
+       if (uf_info->eth_type == FAST_ETH) {
+               /* Allocate memory for Tx Virtual Fifo */
+               uccf->ucc_fast_tx_virtual_fifo_base_offset =
+               qe_muram_alloc(UCC_GETH_UTFS_INIT,
+                              UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
+
+               /* Allocate memory for Rx Virtual Fifo */
+               uccf->ucc_fast_rx_virtual_fifo_base_offset =
+               qe_muram_alloc(UCC_GETH_URFS_INIT +
+                                UCC_FAST_RX_VIRTUAL_FIFO_SIZE_PAD,
+                               UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
+
+               /* utfb, urfb are offsets from MURAM base */
+               out_be32(&uf_regs->utfb,
+                        uccf->ucc_fast_tx_virtual_fifo_base_offset);
+               out_be32(&uf_regs->urfb,
+                        uccf->ucc_fast_rx_virtual_fifo_base_offset);
+
+               /* Set Virtual Fifo registers */
+               out_be16(&uf_regs->urfs, UCC_GETH_URFS_INIT);
+               out_be16(&uf_regs->urfet, UCC_GETH_URFET_INIT);
+               out_be16(&uf_regs->urfset, UCC_GETH_URFSET_INIT);
+               out_be16(&uf_regs->utfs, UCC_GETH_UTFS_INIT);
+               out_be16(&uf_regs->utfet, UCC_GETH_UTFET_INIT);
+               out_be16(&uf_regs->utftt, UCC_GETH_UTFTT_INIT);
+       }
+
+       /* Rx clock routing */
+       if (uf_info->rx_clock != QE_CLK_NONE) {
+               if (ucc_set_clk_src(uf_info->ucc_num,
+                                   uf_info->rx_clock, COMM_DIR_RX)) {
+                       printf("%s: Illegal value for parameter 'RxClock'.\n",
+                              __func__);
+                       return -EINVAL;
+               }
+       }
+
+       /* Tx clock routing */
+       if (uf_info->tx_clock != QE_CLK_NONE) {
+               if (ucc_set_clk_src(uf_info->ucc_num,
+                                   uf_info->tx_clock, COMM_DIR_TX)) {
+                       printf("%s: Illegal value for parameter 'TxClock'.\n",
+                              __func__);
+                       return -EINVAL;
+               }
+       }
+
+       /* Clear interrupt mask register to disable all of interrupts */
+       out_be32(&uf_regs->uccm, 0x0);
+
+       /* Writing '1' to clear all of envents */
+       out_be32(&uf_regs->ucce, 0xffffffff);
+
+       *uccf_ret = uccf;
+       return 0;
+}
diff --git a/drivers/net/qe/uccf.h b/drivers/net/qe/uccf.h
new file mode 100644 (file)
index 0000000..99f8458
--- /dev/null
@@ -0,0 +1,119 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2006 Freescale Semiconductor, Inc.
+ *
+ * Dave Liu <daveliu@freescale.com>
+ * based on source code of Shlomi Gridish
+ */
+
+#ifndef __UCCF_H__
+#define __UCCF_H__
+
+#include "common.h"
+#include "linux/immap_qe.h"
+#include <fsl_qe.h>
+
+/* Fast or Giga ethernet */
+enum enet_type {
+       FAST_ETH,
+       GIGA_ETH,
+};
+
+/* General UCC Extended Mode Register */
+#define UCC_GUEMR_MODE_MASK_RX         0x02
+#define UCC_GUEMR_MODE_MASK_TX         0x01
+#define UCC_GUEMR_MODE_FAST_RX         0x02
+#define UCC_GUEMR_MODE_FAST_TX         0x01
+#define UCC_GUEMR_MODE_SLOW_RX         0x00
+#define UCC_GUEMR_MODE_SLOW_TX         0x00
+/* Bit 3 must be set 1 */
+#define UCC_GUEMR_SET_RESERVED3                0x10
+
+/* General UCC FAST Mode Register */
+#define UCC_FAST_GUMR_TCI              0x20000000
+#define UCC_FAST_GUMR_TRX              0x10000000
+#define UCC_FAST_GUMR_TTX              0x08000000
+#define UCC_FAST_GUMR_CDP              0x04000000
+#define UCC_FAST_GUMR_CTSP             0x02000000
+#define UCC_FAST_GUMR_CDS              0x01000000
+#define UCC_FAST_GUMR_CTSS             0x00800000
+#define UCC_FAST_GUMR_TXSY             0x00020000
+#define UCC_FAST_GUMR_RSYN             0x00010000
+#define UCC_FAST_GUMR_RTSM             0x00002000
+#define UCC_FAST_GUMR_REVD             0x00000400
+#define UCC_FAST_GUMR_ENR              0x00000020
+#define UCC_FAST_GUMR_ENT              0x00000010
+
+/* GUMR [MODE] bit maps */
+#define UCC_FAST_GUMR_HDLC             0x00000000
+#define UCC_FAST_GUMR_QMC              0x00000002
+#define UCC_FAST_GUMR_UART             0x00000004
+#define UCC_FAST_GUMR_BISYNC           0x00000008
+#define UCC_FAST_GUMR_ATM              0x0000000a
+#define UCC_FAST_GUMR_ETH              0x0000000c
+
+/* Transmit On Demand (UTORD) */
+#define UCC_SLOW_TOD                   0x8000
+#define UCC_FAST_TOD                   0x8000
+
+/* Fast Ethernet (10/100 Mbps) */
+/* Rx virtual FIFO size */
+#define UCC_GETH_URFS_INIT             512
+/* 1/2 urfs */
+#define UCC_GETH_URFET_INIT            256
+/* 3/4 urfs */
+#define UCC_GETH_URFSET_INIT           384
+/* Tx virtual FIFO size */
+#define UCC_GETH_UTFS_INIT             512
+/* 1/2 utfs */
+#define UCC_GETH_UTFET_INIT            256
+#define UCC_GETH_UTFTT_INIT            128
+
+/* Gigabit Ethernet (1000 Mbps) */
+/* Rx virtual FIFO size */
+#define UCC_GETH_URFS_GIGA_INIT                4096/*2048*/
+/* 1/2 urfs */
+#define UCC_GETH_URFET_GIGA_INIT       2048/*1024*/
+/* 3/4 urfs */
+#define UCC_GETH_URFSET_GIGA_INIT      3072/*1536*/
+/* Tx virtual FIFO size */
+#define UCC_GETH_UTFS_GIGA_INIT                8192/*2048*/
+/* 1/2 utfs */
+#define UCC_GETH_UTFET_GIGA_INIT       4096/*1024*/
+#define UCC_GETH_UTFTT_GIGA_INIT       0x400/*0x40*/
+
+/* UCC fast alignment */
+#define UCC_FAST_RX_ALIGN                      4
+#define UCC_FAST_MRBLR_ALIGNMENT               4
+#define UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT      8
+
+/* Sizes */
+#define UCC_FAST_RX_VIRTUAL_FIFO_SIZE_PAD      8
+
+/* UCC fast structure. */
+struct ucc_fast_inf {
+       int             ucc_num;
+       qe_clock_e      rx_clock;
+       qe_clock_e      tx_clock;
+       enum enet_type  eth_type;
+};
+
+struct ucc_fast_priv {
+       struct ucc_fast_inf     *uf_info;
+       ucc_fast_t      *uf_regs; /* a pointer to memory map of UCC regs */
+       u32             *p_ucce; /* a pointer to the event register */
+       u32             *p_uccm; /* a pointer to the mask register */
+       int             enabled_tx; /* whether UCC is enabled for Tx (ENT) */
+       int             enabled_rx; /* whether UCC is enabled for Rx (ENR) */
+       u32             ucc_fast_tx_virtual_fifo_base_offset;
+       u32             ucc_fast_rx_virtual_fifo_base_offset;
+};
+
+void ucc_fast_transmit_on_demand(struct ucc_fast_priv *uccf);
+u32 ucc_fast_get_qe_cr_subblock(int ucc_num);
+void ucc_fast_enable(struct ucc_fast_priv *uccf, comm_dir_e mode);
+void ucc_fast_disable(struct ucc_fast_priv *uccf, comm_dir_e mode);
+int ucc_fast_init(struct ucc_fast_inf *uf_info,
+                 struct ucc_fast_priv **uccf_ret);
+
+#endif /* __UCCF_H__ */
diff --git a/drivers/net/qe/uec.h b/drivers/net/qe/uec.h
new file mode 100644 (file)
index 0000000..7cd4b87
--- /dev/null
@@ -0,0 +1,693 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2006-2010 Freescale Semiconductor, Inc.
+ *
+ * Dave Liu <daveliu@freescale.com>
+ * based on source code of Shlomi Gridish
+ */
+
+#ifndef __UEC_H__
+#define __UEC_H__
+
+#include "uccf.h"
+#include <fsl_qe.h>
+#include <phy.h>
+
+#define MAX_TX_THREADS                         8
+#define MAX_RX_THREADS                         8
+#define MAX_TX_QUEUES                          8
+#define MAX_RX_QUEUES                          8
+#define MAX_PREFETCHED_BDS                     4
+#define MAX_IPH_OFFSET_ENTRY                   8
+#define MAX_ENET_INIT_PARAM_ENTRIES_RX         9
+#define MAX_ENET_INIT_PARAM_ENTRIES_TX         8
+
+/* UEC UPSMR (Protocol Specific Mode Register)
+ */
+#define UPSMR_ECM      0x04000000 /* Enable CAM Miss               */
+#define UPSMR_HSE      0x02000000 /* Hardware Statistics Enable    */
+#define UPSMR_PRO      0x00400000 /* Promiscuous                   */
+#define UPSMR_CAP      0x00200000 /* CAM polarity                  */
+#define UPSMR_RSH      0x00100000 /* Receive Short Frames          */
+#define UPSMR_RPM      0x00080000 /* Reduced Pin Mode interfaces   */
+#define UPSMR_R10M     0x00040000 /* RGMII/RMII 10 Mode            */
+#define UPSMR_RLPB     0x00020000 /* RMII Loopback Mode            */
+#define UPSMR_TBIM     0x00010000 /* Ten-bit Interface Mode        */
+#define UPSMR_RMM      0x00001000 /* RMII/RGMII Mode               */
+#define UPSMR_CAM      0x00000400 /* CAM Address Matching          */
+#define UPSMR_BRO      0x00000200 /* Broadcast Address             */
+#define UPSMR_RES1     0x00002000 /* Reserved feild - must be 1    */
+#define UPSMR_SGMM     0x00000020 /* SGMII mode    */
+
+#define UPSMR_INIT_VALUE       (UPSMR_HSE | UPSMR_RES1)
+
+/* UEC MACCFG1 (MAC Configuration 1 Register)
+ */
+#define MACCFG1_FLOW_RX                        0x00000020 /* Flow Control Rx */
+#define MACCFG1_FLOW_TX                        0x00000010 /* Flow Control Tx */
+#define MACCFG1_ENABLE_SYNCHED_RX      0x00000008 /* Enable Rx Sync  */
+#define MACCFG1_ENABLE_RX              0x00000004 /* Enable Rx       */
+#define MACCFG1_ENABLE_SYNCHED_TX      0x00000002 /* Enable Tx Sync  */
+#define MACCFG1_ENABLE_TX              0x00000001 /* Enable Tx       */
+
+#define MACCFG1_INIT_VALUE             (0)
+
+/* UEC MACCFG2 (MAC Configuration 2 Register)
+ */
+#define MACCFG2_PREL                           0x00007000
+#define MACCFG2_PREL_SHIFT                     (31 - 19)
+#define MACCFG2_PREL_MASK                      0x0000f000
+#define MACCFG2_SRP                            0x00000080
+#define MACCFG2_STP                            0x00000040
+#define MACCFG2_RESERVED_1                     0x00000020 /* must be set  */
+#define MACCFG2_LC                             0x00000010 /* Length Check */
+#define MACCFG2_MPE                            0x00000008
+#define MACCFG2_FDX                            0x00000001 /* Full Duplex  */
+#define MACCFG2_FDX_MASK                       0x00000001
+#define MACCFG2_PAD_CRC                                0x00000004
+#define MACCFG2_CRC_EN                         0x00000002
+#define MACCFG2_PAD_AND_CRC_MODE_NONE          0x00000000
+#define MACCFG2_PAD_AND_CRC_MODE_CRC_ONLY      0x00000002
+#define MACCFG2_PAD_AND_CRC_MODE_PAD_AND_CRC   0x00000004
+#define MACCFG2_INTERFACE_MODE_NIBBLE          0x00000100
+#define MACCFG2_INTERFACE_MODE_BYTE            0x00000200
+#define MACCFG2_INTERFACE_MODE_MASK            0x00000300
+
+#define MACCFG2_INIT_VALUE     (MACCFG2_PREL | MACCFG2_RESERVED_1 | \
+                                MACCFG2_LC | MACCFG2_PAD_CRC | MACCFG2_FDX)
+
+/* UEC Event Register */
+#define UCCE_MPD                               0x80000000
+#define UCCE_SCAR                              0x40000000
+#define UCCE_GRA                               0x20000000
+#define UCCE_CBPR                              0x10000000
+#define UCCE_BSY                               0x08000000
+#define UCCE_RXC                               0x04000000
+#define UCCE_TXC                               0x02000000
+#define UCCE_TXE                               0x01000000
+#define UCCE_TXB7                              0x00800000
+#define UCCE_TXB6                              0x00400000
+#define UCCE_TXB5                              0x00200000
+#define UCCE_TXB4                              0x00100000
+#define UCCE_TXB3                              0x00080000
+#define UCCE_TXB2                              0x00040000
+#define UCCE_TXB1                              0x00020000
+#define UCCE_TXB0                              0x00010000
+#define UCCE_RXB7                              0x00008000
+#define UCCE_RXB6                              0x00004000
+#define UCCE_RXB5                              0x00002000
+#define UCCE_RXB4                              0x00001000
+#define UCCE_RXB3                              0x00000800
+#define UCCE_RXB2                              0x00000400
+#define UCCE_RXB1                              0x00000200
+#define UCCE_RXB0                              0x00000100
+#define UCCE_RXF7                              0x00000080
+#define UCCE_RXF6                              0x00000040
+#define UCCE_RXF5                              0x00000020
+#define UCCE_RXF4                              0x00000010
+#define UCCE_RXF3                              0x00000008
+#define UCCE_RXF2                              0x00000004
+#define UCCE_RXF1                              0x00000002
+#define UCCE_RXF0                              0x00000001
+
+#define UCCE_TXB       (UCCE_TXB7 | UCCE_TXB6 | UCCE_TXB5 | UCCE_TXB4 | \
+                        UCCE_TXB3 | UCCE_TXB2 | UCCE_TXB1 | UCCE_TXB0)
+#define UCCE_RXB       (UCCE_RXB7 | UCCE_RXB6 | UCCE_RXB5 | UCCE_RXB4 | \
+                        UCCE_RXB3 | UCCE_RXB2 | UCCE_RXB1 | UCCE_RXB0)
+#define UCCE_RXF       (UCCE_RXF7 | UCCE_RXF6 | UCCE_RXF5 | UCCE_RXF4 | \
+                        UCCE_RXF3 | UCCE_RXF2 | UCCE_RXF1 | UCCE_RXF0)
+#define UCCE_OTHER     (UCCE_SCAR | UCCE_GRA  | UCCE_CBPR | UCCE_BSY  | \
+                        UCCE_RXC  | UCCE_TXC  | UCCE_TXE)
+
+/* UEC TEMODR Register */
+#define TEMODER_SCHEDULER_ENABLE               0x2000
+#define TEMODER_IP_CHECKSUM_GENERATE           0x0400
+#define TEMODER_PERFORMANCE_OPTIMIZATION_MODE1 0x0200
+#define TEMODER_RMON_STATISTICS                        0x0100
+#define TEMODER_NUM_OF_QUEUES_SHIFT            (15 - 15)
+
+#define TEMODER_INIT_VALUE                     0xc000
+
+/* UEC REMODR Register */
+#define REMODER_RX_RMON_STATISTICS_ENABLE      0x00001000
+#define REMODER_RX_EXTENDED_FEATURES           0x80000000
+#define REMODER_VLAN_OPERATION_TAGGED_SHIFT    (31 - 9)
+#define REMODER_VLAN_OPERATION_NON_TAGGED_SHIFT        (31 - 10)
+#define REMODER_RX_QOS_MODE_SHIFT              (31 - 15)
+#define REMODER_RMON_STATISTICS                        0x00001000
+#define REMODER_RX_EXTENDED_FILTERING          0x00000800
+#define REMODER_NUM_OF_QUEUES_SHIFT            (31 - 23)
+#define REMODER_DYNAMIC_MAX_FRAME_LENGTH       0x00000008
+#define REMODER_DYNAMIC_MIN_FRAME_LENGTH       0x00000004
+#define REMODER_IP_CHECKSUM_CHECK              0x00000002
+#define REMODER_IP_ADDRESS_ALIGNMENT           0x00000001
+
+#define REMODER_INIT_VALUE                     0
+
+/* BMRx - Bus Mode Register */
+#define BMR_GLB                                        0x20
+#define BMR_BO_BE                              0x10
+#define BMR_DTB_SECONDARY_BUS                  0x02
+#define BMR_BDB_SECONDARY_BUS                  0x01
+
+#define BMR_SHIFT                              24
+#define BMR_INIT_VALUE                         (BMR_GLB | BMR_BO_BE)
+
+/* UEC UCCS (Ethernet Status Register)
+ */
+#define UCCS_BPR                               0x02
+#define UCCS_PAU                               0x02
+#define UCCS_MPD                               0x01
+
+/* UEC MIIMCFG (MII Management Configuration Register)
+ */
+#define MIIMCFG_RESET_MANAGEMENT               0x80000000
+#define MIIMCFG_NO_PREAMBLE                    0x00000010
+#define MIIMCFG_CLOCK_DIVIDE_SHIFT             (31 - 31)
+#define MIIMCFG_CLOCK_DIVIDE_MASK              0x0000000f
+#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_4   0x00000001
+#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_6   0x00000002
+#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_8   0x00000003
+#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_10  0x00000004
+#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_14  0x00000005
+#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_20  0x00000006
+#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_28  0x00000007
+
+#define MIIMCFG_MNGMNT_CLC_DIV_INIT_VALUE      \
+       MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_10
+
+/* UEC MIIMCOM (MII Management Command Register)
+ */
+#define MIIMCOM_SCAN_CYCLE                     0x00000002 /* Scan cycle */
+#define MIIMCOM_READ_CYCLE                     0x00000001 /* Read cycle */
+
+/* UEC MIIMADD (MII Management Address Register)
+ */
+#define MIIMADD_PHY_ADDRESS_SHIFT              (31 - 23)
+#define MIIMADD_PHY_REGISTER_SHIFT             (31 - 31)
+
+/* UEC MIIMCON (MII Management Control Register)
+ */
+#define MIIMCON_PHY_CONTROL_SHIFT              (31 - 31)
+#define MIIMCON_PHY_STATUS_SHIFT               (31 - 31)
+
+/* UEC MIIMIND (MII Management Indicator Register)
+ */
+#define MIIMIND_NOT_VALID                      0x00000004
+#define MIIMIND_SCAN                           0x00000002
+#define MIIMIND_BUSY                           0x00000001
+
+/* UEC UTBIPAR (Ten Bit Interface Physical Address Register)
+ */
+#define UTBIPAR_PHY_ADDRESS_SHIFT              (31 - 31)
+#define UTBIPAR_PHY_ADDRESS_MASK               0x0000001f
+
+/* UEC UESCR (Ethernet Statistics Control Register)
+ */
+#define UESCR_AUTOZ                            0x8000
+#define UESCR_CLRCNT                           0x4000
+#define UESCR_MAXCOV_SHIFT                     (15 -  7)
+#define UESCR_SCOV_SHIFT                       (15 - 15)
+
+/****** Tx data struct collection ******/
+/* Tx thread data, each Tx thread has one this struct. */
+struct uec_thread_data_tx {
+       u8   res0[136];
+} __packed;
+
+/* Tx thread parameter, each Tx thread has one this struct. */
+struct uec_thread_tx_pram {
+       u8   res0[64];
+} __packed;
+
+/* Send queue queue-descriptor, each Tx queue has one this QD */
+struct uec_send_queue_qd {
+       u32    bd_ring_base; /* pointer to BD ring base address */
+       u8     res0[0x8];
+       u32    last_bd_completed_address; /* last entry in BD ring */
+       u8     res1[0x30];
+} __packed;
+
+/* Send queue memory region */
+struct uec_send_queue_mem_region {
+       struct uec_send_queue_qd   sqqd[MAX_TX_QUEUES];
+} __packed;
+
+/* Scheduler struct */
+struct uec_scheduler {
+       u16  cpucount0;        /* CPU packet counter */
+       u16  cpucount1;        /* CPU packet counter */
+       u16  cecount0;         /* QE  packet counter */
+       u16  cecount1;         /* QE  packet counter */
+       u16  cpucount2;        /* CPU packet counter */
+       u16  cpucount3;        /* CPU packet counter */
+       u16  cecount2;         /* QE  packet counter */
+       u16  cecount3;         /* QE  packet counter */
+       u16  cpucount4;        /* CPU packet counter */
+       u16  cpucount5;        /* CPU packet counter */
+       u16  cecount4;         /* QE  packet counter */
+       u16  cecount5;         /* QE  packet counter */
+       u16  cpucount6;        /* CPU packet counter */
+       u16  cpucount7;        /* CPU packet counter */
+       u16  cecount6;         /* QE  packet counter */
+       u16  cecount7;         /* QE  packet counter */
+       u32  weightstatus[MAX_TX_QUEUES]; /* accumulated weight factor */
+       u32  rtsrshadow;       /* temporary variable handled by QE */
+       u32  time;             /* temporary variable handled by QE */
+       u32  ttl;              /* temporary variable handled by QE */
+       u32  mblinterval;      /* max burst length interval        */
+       u16  nortsrbytetime;   /* normalized value of byte time in tsr units */
+       u8   fracsiz;
+       u8   res0[1];
+       u8   strictpriorityq;  /* Strict Priority Mask register */
+       u8   txasap;           /* Transmit ASAP register        */
+       u8   extrabw;          /* Extra BandWidth register      */
+       u8   oldwfqmask;       /* temporary variable handled by QE */
+       u8   weightfactor[MAX_TX_QUEUES]; /**< weight factor for queues */
+       u32  minw;             /* temporary variable handled by QE */
+       u8   res1[0x70 - 0x64];
+} __packed;
+
+/* Tx firmware counters */
+struct uec_tx_firmware_statistics_pram {
+       u32  sicoltx;            /* single collision */
+       u32  mulcoltx;           /* multiple collision */
+       u32  latecoltxfr;        /* late collision */
+       u32  frabortduecol;      /* frames aborted due to tx collision */
+       u32  frlostinmactxer;    /* frames lost due to internal MAC error tx */
+       u32  carriersenseertx;   /* carrier sense error */
+       u32  frtxok;             /* frames transmitted OK */
+       u32  txfrexcessivedefer;
+       u32  txpkts256;          /* total packets(including bad) 256~511 B */
+       u32  txpkts512;          /* total packets(including bad) 512~1023B */
+       u32  txpkts1024;         /* total packets(including bad) 1024~1518B */
+       u32  txpktsjumbo;        /* total packets(including bad)  >1024 */
+} __packed;
+
+/* Tx global parameter table */
+struct uec_tx_global_pram {
+       u16  temoder;
+       u8   res0[0x38 - 0x02];
+       u32  sqptr;
+       u32  schedulerbasepointer;
+       u32  txrmonbaseptr;
+       u32  tstate;
+       u8   iphoffset[MAX_IPH_OFFSET_ENTRY];
+       u32  vtagtable[0x8];
+       u32  tqptr;
+       u8   res2[0x80 - 0x74];
+} __packed;
+
+/****** Rx data struct collection ******/
+/* Rx thread data, each Rx thread has one this struct. */
+struct uec_thread_data_rx {
+       u8   res0[40];
+} __packed;
+
+/* Rx thread parameter, each Rx thread has one this struct. */
+struct uec_thread_rx_pram {
+       u8   res0[128];
+} __packed;
+
+/* Rx firmware counters */
+struct uec_rx_firmware_statistics_pram {
+       u32   frrxfcser;         /* frames with crc error */
+       u32   fraligner;         /* frames with alignment error */
+       u32   inrangelenrxer;    /* in range length error */
+       u32   outrangelenrxer;   /* out of range length error */
+       u32   frtoolong;         /* frame too long */
+       u32   runt;              /* runt */
+       u32   verylongevent;     /* very long event */
+       u32   symbolerror;       /* symbol error */
+       u32   dropbsy;           /* drop because of BD not ready */
+       u8    res0[0x8];
+       u32   mismatchdrop;      /* drop because of MAC filtering */
+       u32   underpkts;         /* total frames less than 64 octets */
+       u32   pkts256;           /* total frames(including bad)256~511 B */
+       u32   pkts512;           /* total frames(including bad)512~1023 B */
+       u32   pkts1024;          /* total frames(including bad)1024~1518 B */
+       u32   pktsjumbo;         /* total frames(including bad) >1024 B */
+       u32   frlossinmacer;
+       u32   pausefr;           /* pause frames */
+       u8    res1[0x4];
+       u32   removevlan;
+       u32   replacevlan;
+       u32   insertvlan;
+} __packed;
+
+/* Rx interrupt coalescing entry, each Rx queue has one this entry. */
+struct uec_rx_interrupt_coalescing_entry {
+       u32   maxvalue;
+       u32   counter;
+} __packed;
+
+struct uec_rx_interrupt_coalescing_table {
+       struct uec_rx_interrupt_coalescing_entry   entry[MAX_RX_QUEUES];
+} __packed;
+
+/* RxBD queue entry, each Rx queue has one this entry. */
+struct uec_rx_bd_queues_entry {
+       u32   bdbaseptr;         /* BD base pointer          */
+       u32   bdptr;             /* BD pointer               */
+       u32   externalbdbaseptr; /* external BD base pointer */
+       u32   externalbdptr;     /* external BD pointer      */
+} __packed;
+
+/* Rx global parameter table */
+struct uec_rx_global_pram {
+       u32  remoder;             /* ethernet mode reg. */
+       u32  rqptr;               /* base pointer to the Rx Queues */
+       u32  res0[0x1];
+       u8   res1[0x20 - 0xc];
+       u16  typeorlen;
+       u8   res2[0x1];
+       u8   rxgstpack;           /* ack on GRACEFUL STOP RX command */
+       u32  rxrmonbaseptr;       /* Rx RMON statistics base */
+       u8   res3[0x30 - 0x28];
+       u32  intcoalescingptr;    /* Interrupt coalescing table pointer */
+       u8   res4[0x36 - 0x34];
+       u8   rstate;
+       u8   res5[0x46 - 0x37];
+       u16  mrblr;               /* max receive buffer length reg. */
+       u32  rbdqptr;             /* RxBD parameter table description */
+       u16  mflr;                /* max frame length reg. */
+       u16  minflr;              /* min frame length reg. */
+       u16  maxd1;               /* max dma1 length reg. */
+       u16  maxd2;               /* max dma2 length reg. */
+       u32  ecamptr;             /* external CAM address */
+       u32  l2qt;                /* VLAN priority mapping table. */
+       u32  l3qt[0x8];           /* IP   priority mapping table. */
+       u16  vlantype;            /* vlan type */
+       u16  vlantci;             /* default vlan tci */
+       u8   addressfiltering[64];/* address filtering data structure */
+       u32  exf_global_param;      /* extended filtering global parameters */
+       u8   res6[0x100 - 0xc4];    /* Initialize to zero */
+} __packed;
+
+#define GRACEFUL_STOP_ACKNOWLEDGE_RX            0x01
+
+/****** UEC common ******/
+/* UCC statistics - hardware counters */
+struct uec_hardware_statistics {
+       u32 tx64;
+       u32 tx127;
+       u32 tx255;
+       u32 rx64;
+       u32 rx127;
+       u32 rx255;
+       u32 txok;
+       u16 txcf;
+       u32 tmca;
+       u32 tbca;
+       u32 rxfok;
+       u32 rxbok;
+       u32 rbyt;
+       u32 rmca;
+       u32 rbca;
+} __packed;
+
+/* InitEnet command parameter */
+struct uec_init_cmd_pram {
+       u8   resinit0;
+       u8   resinit1;
+       u8   resinit2;
+       u8   resinit3;
+       u16  resinit4;
+       u8   res1[0x1];
+       u8   largestexternallookupkeysize;
+       u32  rgftgfrxglobal;
+       u32  rxthread[MAX_ENET_INIT_PARAM_ENTRIES_RX]; /* rx threads */
+       u8   res2[0x38 - 0x30];
+       u32  txglobal;                             /* tx global  */
+       u32  txthread[MAX_ENET_INIT_PARAM_ENTRIES_TX]; /* tx threads */
+       u8   res3[0x1];
+} __packed;
+
+#define ENET_INIT_PARAM_RGF_SHIFT              (32 - 4)
+#define ENET_INIT_PARAM_TGF_SHIFT              (32 - 8)
+
+#define ENET_INIT_PARAM_RISC_MASK              0x0000003f
+#define ENET_INIT_PARAM_PTR_MASK               0x00ffffc0
+#define ENET_INIT_PARAM_SNUM_MASK              0xff000000
+#define ENET_INIT_PARAM_SNUM_SHIFT             24
+
+#define ENET_INIT_PARAM_MAGIC_RES_INIT0                0x06
+#define ENET_INIT_PARAM_MAGIC_RES_INIT1                0x30
+#define ENET_INIT_PARAM_MAGIC_RES_INIT2                0xff
+#define ENET_INIT_PARAM_MAGIC_RES_INIT3                0x00
+#define ENET_INIT_PARAM_MAGIC_RES_INIT4                0x0400
+
+/* structure representing 82xx Address Filtering Enet Address in PRAM */
+struct uec_82xx_enet_addr {
+       u8   res1[0x2];
+       u16  h;       /* address (MSB) */
+       u16  m;       /* address       */
+       u16  l;       /* address (LSB) */
+} __packed;
+
+/* structure representing 82xx Address Filtering PRAM */
+struct uec_82xx_add_filtering_pram {
+       u32  iaddr_h;        /* individual address filter, high */
+       u32  iaddr_l;        /* individual address filter, low  */
+       u32  gaddr_h;        /* group address filter, high      */
+       u32  gaddr_l;        /* group address filter, low       */
+       struct uec_82xx_enet_addr    taddr;
+       struct uec_82xx_enet_addr    paddr[4];
+       u8                         res0[0x40 - 0x38];
+} __packed;
+
+/* Buffer Descriptor */
+struct buffer_descriptor {
+       u16 status;
+       u16 len;
+       u32 data;
+} __packed;
+
+#define        SIZEOFBD        sizeof(struct buffer_descriptor)
+
+/* Common BD flags */
+#define BD_WRAP                        0x2000
+#define BD_INT                 0x1000
+#define BD_LAST                        0x0800
+#define BD_CLEAN               0x3000
+
+/* TxBD status flags */
+#define TX_BD_READY            0x8000
+#define TX_BD_PADCRC           0x4000
+#define TX_BD_WRAP             BD_WRAP
+#define TX_BD_INT              BD_INT
+#define TX_BD_LAST             BD_LAST
+#define TX_BD_TXCRC            0x0400
+#define TX_BD_DEF              0x0200
+#define TX_BD_PP                       0x0100
+#define TX_BD_LC                       0x0080
+#define TX_BD_RL                       0x0040
+#define TX_BD_RC                       0x003C
+#define TX_BD_UNDERRUN         0x0002
+#define TX_BD_TRUNC            0x0001
+
+#define TX_BD_ERROR            (TX_BD_UNDERRUN | TX_BD_TRUNC)
+
+/* RxBD status flags */
+#define RX_BD_EMPTY            0x8000
+#define RX_BD_OWNER            0x4000
+#define RX_BD_WRAP             BD_WRAP
+#define RX_BD_INT              BD_INT
+#define RX_BD_LAST             BD_LAST
+#define RX_BD_FIRST            0x0400
+#define RX_BD_CMR              0x0200
+#define RX_BD_MISS             0x0100
+#define RX_BD_BCAST            0x0080
+#define RX_BD_MCAST            0x0040
+#define RX_BD_LG                       0x0020
+#define RX_BD_NO                       0x0010
+#define RX_BD_SHORT            0x0008
+#define RX_BD_CRCERR           0x0004
+#define RX_BD_OVERRUN          0x0002
+#define RX_BD_IPCH             0x0001
+
+#define RX_BD_ERROR            (RX_BD_LG | RX_BD_NO | RX_BD_SHORT | \
+                                RX_BD_CRCERR | RX_BD_OVERRUN)
+
+/* BD access macros */
+#define BD_STATUS(_bd)         (in_be16(&((_bd)->status)))
+#define BD_STATUS_SET(_bd, _v) (out_be16(&((_bd)->status), _v))
+#define BD_LENGTH(_bd)         (in_be16(&((_bd)->len)))
+#define BD_LENGTH_SET(_bd, _v) (out_be16(&((_bd)->len), _v))
+#define BD_DATA_CLEAR(_bd)     (out_be32(&((_bd)->data), 0))
+#define BD_DATA(_bd)           ((u8 *)(((_bd)->data)))
+#define BD_DATA_SET(_bd, _data)        (out_be32(&((_bd)->data), (u32)_data))
+#define BD_ADVANCE(_bd, _status, _base)        \
+       (((_status) & BD_WRAP) ? (_bd) = \
+        ((struct buffer_descriptor *)(_base)) : ++(_bd))
+
+/* Rx Prefetched BDs */
+struct uec_rx_pref_bds {
+       struct buffer_descriptor   bd[MAX_PREFETCHED_BDS]; /* prefetched bd */
+} __packed;
+
+/* Alignments */
+#define UEC_RX_GLOBAL_PRAM_ALIGNMENT                           64
+#define UEC_TX_GLOBAL_PRAM_ALIGNMENT                           64
+#define UEC_THREAD_RX_PRAM_ALIGNMENT                           128
+#define UEC_THREAD_TX_PRAM_ALIGNMENT                           64
+#define UEC_THREAD_DATA_ALIGNMENT                              256
+#define UEC_SEND_QUEUE_QUEUE_DESCRIPTOR_ALIGNMENT              32
+#define UEC_SCHEDULER_ALIGNMENT                                        4
+#define UEC_TX_STATISTICS_ALIGNMENT                            4
+#define UEC_RX_STATISTICS_ALIGNMENT                            4
+#define UEC_RX_INTERRUPT_COALESCING_ALIGNMENT                  4
+#define UEC_RX_BD_QUEUES_ALIGNMENT                             8
+#define UEC_RX_PREFETCHED_BDS_ALIGNMENT                                128
+#define UEC_RX_EXTENDED_FILTERING_GLOBAL_PARAMETERS_ALIGNMENT  4
+#define UEC_RX_BD_RING_ALIGNMENT                               32
+#define UEC_TX_BD_RING_ALIGNMENT                               32
+#define UEC_MRBLR_ALIGNMENT                                    128
+#define UEC_RX_BD_RING_SIZE_ALIGNMENT                          4
+#define UEC_TX_BD_RING_SIZE_MEMORY_ALIGNMENT                   32
+#define UEC_RX_DATA_BUF_ALIGNMENT                              64
+
+#define UEC_VLAN_PRIORITY_MAX                                  8
+#define UEC_IP_PRIORITY_MAX                                    64
+#define UEC_TX_VTAG_TABLE_ENTRY_MAX                            8
+#define UEC_RX_BD_RING_SIZE_MIN                                        8
+#define UEC_TX_BD_RING_SIZE_MIN                                        2
+
+/* TBI / MII Set Register */
+enum enet_tbi_mii_reg {
+       ENET_TBI_MII_CR        = 0x00,
+       ENET_TBI_MII_SR        = 0x01,
+       ENET_TBI_MII_ANA       = 0x04,
+       ENET_TBI_MII_ANLPBPA   = 0x05,
+       ENET_TBI_MII_ANEX      = 0x06,
+       ENET_TBI_MII_ANNPT     = 0x07,
+       ENET_TBI_MII_ANLPANP   = 0x08,
+       ENET_TBI_MII_EXST      = 0x0F,
+       ENET_TBI_MII_JD        = 0x10,
+       ENET_TBI_MII_TBICON    = 0x11
+};
+
+/* TBI MDIO register bit fields*/
+#define TBICON_CLK_SELECT      0x0020
+#define TBIANA_ASYMMETRIC_PAUSE        0x0100
+#define TBIANA_SYMMETRIC_PAUSE 0x0080
+#define TBIANA_HALF_DUPLEX     0x0040
+#define TBIANA_FULL_DUPLEX     0x0020
+#define TBICR_PHY_RESET                0x8000
+#define TBICR_ANEG_ENABLE      0x1000
+#define TBICR_RESTART_ANEG     0x0200
+#define TBICR_FULL_DUPLEX      0x0100
+#define TBICR_SPEED1_SET       0x0040
+
+#define TBIANA_SETTINGS ( \
+               TBIANA_ASYMMETRIC_PAUSE \
+               | TBIANA_SYMMETRIC_PAUSE \
+               | TBIANA_FULL_DUPLEX \
+               )
+
+#define TBICR_SETTINGS ( \
+               TBICR_PHY_RESET \
+               | TBICR_ANEG_ENABLE \
+               | TBICR_FULL_DUPLEX \
+               | TBICR_SPEED1_SET \
+               )
+
+/* UEC number of threads */
+enum uec_num_of_threads {
+       UEC_NUM_OF_THREADS_1  = 0x1,  /* 1 */
+       UEC_NUM_OF_THREADS_2  = 0x2,  /* 2 */
+       UEC_NUM_OF_THREADS_4  = 0x0,  /* 4 */
+       UEC_NUM_OF_THREADS_6  = 0x3,  /* 6 */
+       UEC_NUM_OF_THREADS_8  = 0x4   /* 8 */
+};
+
+/* UEC initialization info struct */
+#define STD_UEC_INFO(num) \
+{                      \
+       .uf_info                = {     \
+               .ucc_num        = CONFIG_SYS_UEC##num##_UCC_NUM,\
+               .rx_clock       = CONFIG_SYS_UEC##num##_RX_CLK, \
+               .tx_clock       = CONFIG_SYS_UEC##num##_TX_CLK, \
+               .eth_type       = CONFIG_SYS_UEC##num##_ETH_TYPE,\
+       },      \
+       .num_threads_tx         = UEC_NUM_OF_THREADS_1, \
+       .num_threads_rx         = UEC_NUM_OF_THREADS_1, \
+       .risc_tx                = QE_RISC_ALLOCATION_RISC1_AND_RISC2, \
+       .risc_rx                = QE_RISC_ALLOCATION_RISC1_AND_RISC2, \
+       .tx_bd_ring_len         = 16,   \
+       .rx_bd_ring_len         = 16,   \
+       .phy_address            = CONFIG_SYS_UEC##num##_PHY_ADDR, \
+       .enet_interface_type    = CONFIG_SYS_UEC##num##_INTERFACE_TYPE, \
+       .speed                  = CONFIG_SYS_UEC##num##_INTERFACE_SPEED, \
+}
+
+struct uec_inf {
+       struct ucc_fast_inf             uf_info;
+       enum uec_num_of_threads         num_threads_tx;
+       enum uec_num_of_threads         num_threads_rx;
+       unsigned int                    risc_tx;
+       unsigned int                    risc_rx;
+       u16                             rx_bd_ring_len;
+       u16                             tx_bd_ring_len;
+       u8                              phy_address;
+       phy_interface_t                 enet_interface_type;
+       int                             speed;
+};
+
+/* UEC driver initialized info */
+#define MAX_RXBUF_LEN                  1536
+#define MAX_FRAME_LEN                  1518
+#define MIN_FRAME_LEN                  64
+#define MAX_DMA1_LEN                   1520
+#define MAX_DMA2_LEN                   1520
+
+/* UEC driver private struct */
+struct uec_priv {
+       struct uec_inf                  *uec_info;
+       struct ucc_fast_priv            *uccf;
+       struct eth_device               *dev;
+       uec_t                           *uec_regs;
+       /* enet init command parameter */
+       struct uec_init_cmd_pram                *p_init_enet_param;
+       u32                             init_enet_param_offset;
+       /* Rx and Tx parameter */
+       struct uec_rx_global_pram               *p_rx_glbl_pram;
+       u32                             rx_glbl_pram_offset;
+       struct uec_tx_global_pram               *p_tx_glbl_pram;
+       u32                             tx_glbl_pram_offset;
+       struct uec_send_queue_mem_region        *p_send_q_mem_reg;
+       u32                             send_q_mem_reg_offset;
+       struct uec_thread_data_tx               *p_thread_data_tx;
+       u32                             thread_dat_tx_offset;
+       struct uec_thread_data_rx               *p_thread_data_rx;
+       u32                             thread_dat_rx_offset;
+       struct uec_rx_bd_queues_entry   *p_rx_bd_qs_tbl;
+       u32                             rx_bd_qs_tbl_offset;
+       /* BDs specific */
+       u8                              *p_tx_bd_ring;
+       u32                             tx_bd_ring_offset;
+       u8                              *p_rx_bd_ring;
+       u32                             rx_bd_ring_offset;
+       u8                              *p_rx_buf;
+       u32                             rx_buf_offset;
+       struct buffer_descriptor        *tx_bd;
+       struct buffer_descriptor        *rx_bd;
+       /* Status */
+       int                             mac_tx_enabled;
+       int                             mac_rx_enabled;
+       int                             grace_stopped_tx;
+       int                             grace_stopped_rx;
+       int                             the_first_run;
+#if !defined(COFIG_DM)
+       /* PHY specific */
+       struct uec_mii_info             *mii_info;
+       int                             oldspeed;
+       int                             oldduplex;
+       int                             oldlink;
+#endif
+};
+
+int uec_initialize(struct bd_info *bis, struct uec_inf *uec_info);
+int uec_eth_init(struct bd_info *bis, struct uec_inf *uecs, int num);
+int uec_standard_init(struct bd_info *bis);
+#endif /* __UEC_H__ */
index 5d12e4b..c436b83 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/bitops.h>
 #include <linux/delay.h>
 #include <linux/errno.h>
+#include <miiphy.h>
 #include <asm/processor.h>
 #include <asm/io.h>
 
@@ -681,8 +682,15 @@ static int init_phy(struct tsec_private *priv)
        if (priv->interface == PHY_INTERFACE_MODE_SGMII)
                tsec_configure_serdes(priv);
 
+#if defined(CONFIG_DM_ETH) && defined(CONFIG_DM_MDIO)
+       if (ofnode_valid(ofnode_find_subnode(priv->dev->node, "fixed-link")))
+               phydev = phy_connect(NULL, 0, priv->dev, priv->interface);
+       else
+               phydev = dm_eth_phy_connect(priv->dev);
+#else
        phydev = phy_connect(priv->bus, priv->phyaddr, priv->dev,
                             priv->interface);
+#endif
        if (!phydev)
                return 0;
 
@@ -793,43 +801,19 @@ int tsec_probe(struct udevice *dev)
 {
        struct eth_pdata *pdata = dev_get_platdata(dev);
        struct tsec_private *priv = dev_get_priv(dev);
-       struct tsec_mii_mng __iomem *ext_phyregs_mii;
        struct ofnode_phandle_args phandle_args;
        u32 tbiaddr = CONFIG_SYS_TBIPA_VALUE;
-       struct fsl_pq_mdio_info mdio_info;
+       struct tsec_data *data;
        const char *phy_mode;
        fdt_addr_t reg;
        ofnode parent;
        int ret;
 
+       data = (struct tsec_data *)dev_get_driver_data(dev);
+
        pdata->iobase = (phys_addr_t)dev_read_addr(dev);
        priv->regs = dev_remap_addr(dev);
 
-       if (dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0,
-                                      &phandle_args)) {
-               printf("phy-handle does not exist under tsec %s\n", dev->name);
-               return -ENOENT;
-       } else {
-               int reg = ofnode_read_u32_default(phandle_args.node, "reg", 0);
-
-               priv->phyaddr = reg;
-       }
-
-       parent = ofnode_get_parent(phandle_args.node);
-       if (!ofnode_valid(parent)) {
-               printf("No parent node for PHY?\n");
-               return -ENOENT;
-       }
-
-       reg = ofnode_get_addr_index(parent, 0);
-       if (reg == FDT_ADDR_T_NONE) {
-               printf("No 'reg' property of MII for external PHY\n");
-               return -ENOENT;
-       }
-
-       ext_phyregs_mii = map_physmem(reg + TSEC_MDIO_REGS_OFFSET, 0,
-                                     MAP_NOCACHE);
-
        ret = dev_read_phandle_with_args(dev, "tbi-handle", NULL, 0, 0,
                                         &phandle_args);
        if (ret == 0) {
@@ -847,7 +831,7 @@ int tsec_probe(struct udevice *dev)
                        return -ENOENT;
                }
 
-               priv->phyregs_sgmii = map_physmem(reg + TSEC_MDIO_REGS_OFFSET,
+               priv->phyregs_sgmii = map_physmem(reg + data->mdio_regs_off,
                                                  0, MAP_NOCACHE);
        }
 
@@ -867,12 +851,6 @@ int tsec_probe(struct udevice *dev)
        if (priv->interface == PHY_INTERFACE_MODE_SGMII)
                priv->flags |= TSEC_SGMII;
 
-       mdio_info.regs = ext_phyregs_mii;
-       mdio_info.name = (char *)dev->name;
-       ret = fsl_pq_mdio_init(NULL, &mdio_info);
-       if (ret)
-               return ret;
-
        /* Reset the MAC */
        setbits_be32(&priv->regs->maccfg1, MACCFG1_SOFT_RESET);
        udelay(2);  /* Soft Reset must be asserted for 3 TX clocks */
@@ -905,8 +883,17 @@ static const struct eth_ops tsec_ops = {
        .mcast = tsec_mcast_addr,
 };
 
+static struct tsec_data etsec2_data = {
+       .mdio_regs_off = TSEC_MDIO_REGS_OFFSET,
+};
+
+static struct tsec_data gianfar_data = {
+       .mdio_regs_off = 0x0,
+};
+
 static const struct udevice_id tsec_ids[] = {
-       { .compatible = "fsl,etsec2" },
+       { .compatible = "fsl,etsec2", .data = (ulong)&etsec2_data },
+       { .compatible = "gianfar", .data = (ulong)&gianfar_data },
        { }
 };
 
index d8a6647..eb07d25 100644 (file)
@@ -911,8 +911,8 @@ static void decode_regions(struct pci_controller *hose, ofnode parent_node,
                           ofnode node)
 {
        int pci_addr_cells, addr_cells, size_cells;
-       struct bd_info *bd = gd->bd;
        int cells_per_record;
+       struct bd_info *bd;
        const u32 *prop;
        int max_regions;
        int len;
@@ -989,6 +989,7 @@ static void decode_regions(struct pci_controller *hose, ofnode parent_node,
        }
 
        /* Add a region for our local memory */
+       bd = gd->bd;
        if (!bd)
                return;
 
index 9c77510..8da00a2 100644 (file)
@@ -125,6 +125,12 @@ config STI_USB_PHY
          used by USB2 and USB3 Host controllers available on
          STiH407 SoC families.
 
+config PHY_QCOM_IPQ4019_USB
+       tristate "Qualcomm IPQ4019 USB PHY driver"
+       depends on PHY && ARCH_IPQ40XX
+       help
+         Support for the USB PHY-s on Qualcomm IPQ40xx SoC-s.
+
 config PHY_RCAR_GEN2
        tristate "Renesas R-Car Gen2 USB PHY"
        depends on PHY && RCAR_GEN2
index 74e8d93..009f353 100644 (file)
@@ -13,6 +13,7 @@ obj-$(CONFIG_PHY_SANDBOX) += sandbox-phy.o
 obj-$(CONFIG_$(SPL_)PIPE3_PHY) += ti-pipe3-phy.o
 obj-$(CONFIG_AM654_PHY) += phy-ti-am654.o
 obj-$(CONFIG_STI_USB_PHY) += sti_usb_phy.o
+obj-$(CONFIG_PHY_QCOM_IPQ4019_USB) += phy-qcom-ipq4019-usb.o
 obj-$(CONFIG_PHY_RCAR_GEN2) += phy-rcar-gen2.o
 obj-$(CONFIG_PHY_RCAR_GEN3) += phy-rcar-gen3.o
 obj-$(CONFIG_PHY_STM32_USBPHYC) += phy-stm32-usbphyc.o
diff --git a/drivers/phy/phy-qcom-ipq4019-usb.c b/drivers/phy/phy-qcom-ipq4019-usb.c
new file mode 100644 (file)
index 0000000..465f0d3
--- /dev/null
@@ -0,0 +1,145 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2019 Sartura Ltd.
+ *
+ * Author: Robert Marko <robert.marko@sartura.hr>
+ *
+ * Based on Linux driver
+ */
+
+#include <clk.h>
+#include <common.h>
+#include <dm.h>
+#include <generic-phy.h>
+#include <log.h>
+#include <reset.h>
+#include <asm/io.h>
+#include <linux/delay.h>
+
+struct ipq4019_usb_phy {
+       phys_addr_t                     base;
+       struct reset_ctl        por_rst;
+       struct reset_ctl        srif_rst;
+};
+
+static int ipq4019_ss_phy_power_off(struct phy *_phy)
+{
+       struct ipq4019_usb_phy *phy = dev_get_priv(_phy->dev);
+
+       reset_assert(&phy->por_rst);
+       mdelay(10);
+
+       return 0;
+}
+
+static int ipq4019_ss_phy_power_on(struct phy *_phy)
+{
+       struct ipq4019_usb_phy *phy = dev_get_priv(_phy->dev);
+
+       ipq4019_ss_phy_power_off(_phy);
+
+       reset_deassert(&phy->por_rst);
+
+       return 0;
+}
+
+static struct phy_ops ipq4019_usb_ss_phy_ops = {
+       .power_on = ipq4019_ss_phy_power_on,
+       .power_off = ipq4019_ss_phy_power_off,
+};
+
+static int ipq4019_usb_ss_phy_probe(struct udevice *dev)
+{
+       struct ipq4019_usb_phy *phy = dev_get_priv(dev);
+       int ret;
+
+       phy->base = dev_read_addr(dev);
+       if (phy->base == FDT_ADDR_T_NONE)
+               return -EINVAL;
+
+       ret = reset_get_by_name(dev, "por_rst", &phy->por_rst);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static const struct udevice_id ipq4019_usb_ss_phy_ids[] = {
+       { .compatible = "qcom,usb-ss-ipq4019-phy" },
+       { }
+};
+
+U_BOOT_DRIVER(ipq4019_usb_ss_phy) = {
+       .name           = "ipq4019-usb-ss-phy",
+       .id             = UCLASS_PHY,
+       .of_match       = ipq4019_usb_ss_phy_ids,
+       .ops            = &ipq4019_usb_ss_phy_ops,
+       .probe          = ipq4019_usb_ss_phy_probe,
+       .priv_auto_alloc_size = sizeof(struct ipq4019_usb_phy),
+};
+
+static int ipq4019_hs_phy_power_off(struct phy *_phy)
+{
+       struct ipq4019_usb_phy *phy = dev_get_priv(_phy->dev);
+
+       reset_assert(&phy->por_rst);
+       mdelay(10);
+
+       reset_assert(&phy->srif_rst);
+       mdelay(10);
+
+       return 0;
+}
+
+static int ipq4019_hs_phy_power_on(struct phy *_phy)
+{
+       struct ipq4019_usb_phy *phy = dev_get_priv(_phy->dev);
+
+       ipq4019_hs_phy_power_off(_phy);
+
+       reset_deassert(&phy->srif_rst);
+       mdelay(10);
+
+       reset_deassert(&phy->por_rst);
+
+       return 0;
+}
+
+static struct phy_ops ipq4019_usb_hs_phy_ops = {
+       .power_on = ipq4019_hs_phy_power_on,
+       .power_off = ipq4019_hs_phy_power_off,
+};
+
+static int ipq4019_usb_hs_phy_probe(struct udevice *dev)
+{
+       struct ipq4019_usb_phy *phy = dev_get_priv(dev);
+       int ret;
+
+       phy->base = dev_read_addr(dev);
+       if (phy->base == FDT_ADDR_T_NONE)
+               return -EINVAL;
+
+       ret = reset_get_by_name(dev, "por_rst", &phy->por_rst);
+       if (ret)
+               return ret;
+
+       ret = reset_get_by_name(dev, "srif_rst", &phy->srif_rst);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static const struct udevice_id ipq4019_usb_hs_phy_ids[] = {
+       { .compatible = "qcom,usb-hs-ipq4019-phy" },
+       { }
+};
+
+U_BOOT_DRIVER(ipq4019_usb_hs_phy) = {
+       .name           = "ipq4019-usb-hs-phy",
+       .id             = UCLASS_PHY,
+       .of_match       = ipq4019_usb_hs_phy_ids,
+       .ops            = &ipq4019_usb_hs_phy_ops,
+       .probe          = ipq4019_usb_hs_phy_probe,
+       .priv_auto_alloc_size = sizeof(struct ipq4019_usb_phy),
+};
index db7f39c..8f456f3 100644 (file)
@@ -117,56 +117,91 @@ int generic_phy_get_by_name(struct udevice *dev, const char *phy_name,
 int generic_phy_init(struct phy *phy)
 {
        struct phy_ops const *ops;
+       int ret;
 
        if (!generic_phy_valid(phy))
                return 0;
        ops = phy_dev_ops(phy->dev);
+       if (!ops->init)
+               return 0;
+       ret = ops->init(phy);
+       if (ret)
+               dev_err(phy->dev, "PHY: Failed to init %s: %d.\n",
+                       phy->dev->name, ret);
 
-       return ops->init ? ops->init(phy) : 0;
+       return ret;
 }
 
 int generic_phy_reset(struct phy *phy)
 {
        struct phy_ops const *ops;
+       int ret;
 
        if (!generic_phy_valid(phy))
                return 0;
        ops = phy_dev_ops(phy->dev);
+       if (!ops->reset)
+               return 0;
+       ret = ops->reset(phy);
+       if (ret)
+               dev_err(phy->dev, "PHY: Failed to reset %s: %d.\n",
+                       phy->dev->name, ret);
 
-       return ops->reset ? ops->reset(phy) : 0;
+       return ret;
 }
 
 int generic_phy_exit(struct phy *phy)
 {
        struct phy_ops const *ops;
+       int ret;
 
        if (!generic_phy_valid(phy))
                return 0;
        ops = phy_dev_ops(phy->dev);
+       if (!ops->exit)
+               return 0;
+       ret = ops->exit(phy);
+       if (ret)
+               dev_err(phy->dev, "PHY: Failed to exit %s: %d.\n",
+                       phy->dev->name, ret);
 
-       return ops->exit ? ops->exit(phy) : 0;
+       return ret;
 }
 
 int generic_phy_power_on(struct phy *phy)
 {
        struct phy_ops const *ops;
+       int ret;
 
        if (!generic_phy_valid(phy))
                return 0;
        ops = phy_dev_ops(phy->dev);
+       if (!ops->power_on)
+               return 0;
+       ret = ops->power_on(phy);
+       if (ret)
+               dev_err(phy->dev, "PHY: Failed to power on %s: %d.\n",
+                       phy->dev->name, ret);
 
-       return ops->power_on ? ops->power_on(phy) : 0;
+       return ret;
 }
 
 int generic_phy_power_off(struct phy *phy)
 {
        struct phy_ops const *ops;
+       int ret;
 
        if (!generic_phy_valid(phy))
                return 0;
        ops = phy_dev_ops(phy->dev);
+       if (!ops->power_off)
+               return 0;
+       ret = ops->power_off(phy);
+       if (ret)
+               dev_err(phy->dev, "PHY: Failed to power off %s: %d.\n",
+                       phy->dev->name, ret);
 
-       return ops->power_off ? ops->power_off(phy) : 0;
+       return ret;
 }
 
 int generic_phy_get_bulk(struct udevice *dev, struct phy_bulk *bulk)
index cdbccfd..048583f 100644 (file)
@@ -205,6 +205,13 @@ config PINCTRL_QCA953X
          the GPIO definitions and pin control functions for each available
          multiplex function.
 
+config PINCTRL_QE
+       bool "QE based pinctrl driver, like on mpc83xx"
+       depends on DM
+       help
+         This option is to enable the QE pinctrl driver for QE based io
+         controller.
+
 config PINCTRL_ROCKCHIP_RV1108
        bool "Rockchip rv1108 pin control driver"
        depends on DM
index 92cff1b..507dd3a 100644 (file)
@@ -22,6 +22,7 @@ obj-$(CONFIG_PINCTRL_MTK)     += mediatek/
 obj-$(CONFIG_PINCTRL_MSCC)     += mscc/
 obj-$(CONFIG_ARCH_MVEBU)       += mvebu/
 obj-$(CONFIG_ARCH_NEXELL)      += nexell/
+obj-$(CONFIG_PINCTRL_QE)       += pinctrl-qe-io.o
 obj-$(CONFIG_PINCTRL_SINGLE)   += pinctrl-single.o
 obj-$(CONFIG_PINCTRL_STI)      += pinctrl-sti.o
 obj-$(CONFIG_PINCTRL_STM32)    += pinctrl_stm32.o
diff --git a/drivers/pinctrl/pinctrl-qe-io.c b/drivers/pinctrl/pinctrl-qe-io.c
new file mode 100644 (file)
index 0000000..85521ea
--- /dev/null
@@ -0,0 +1,255 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2006 Freescale Semiconductor, Inc.
+ *
+ * Dave Liu <daveliu@freescale.com>
+ * based on source code of Shlomi Gridish
+ */
+
+#include <common.h>
+#include <linux/errno.h>
+#include <asm/io.h>
+#include <asm/immap_83xx.h>
+
+#if defined(CONFIG_PINCTRL)
+#include <dm.h>
+#include <dm/device_compat.h>
+#include <dm/pinctrl.h>
+#include <linux/ioport.h>
+
+/**
+ * struct qe_io_platdata
+ *
+ * @base:              Base register address
+ * @num_par_io_ports   number of io ports
+ */
+struct qe_io_platdata {
+       qepio83xx_t *base;
+       u32 num_io_ports;
+};
+#endif
+
+#define        NUM_OF_PINS     32
+
+/** qe_cfg_iopin configure one io pin setting
+ *
+ * @par_io:    pointer to parallel I/O base
+ * @port:      io pin port
+ * @pin:       io pin number which get configured
+ * @dir:       direction of io pin 2 bits valid
+ *             00 = pin disabled
+ *             01 = output
+ *             10 = input
+ *             11 = pin is I/O
+ * @open_drain:        is pin open drain
+ * @assign:    pin assignment registers select the function of the pin
+ */
+static void qe_cfg_iopin(qepio83xx_t *par_io, u8 port, u8 pin, int dir,
+                        int open_drain, int assign)
+{
+       u32     dbit_mask;
+       u32     dbit_dir;
+       u32     dbit_asgn;
+       u32     bit_mask;
+       u32     tmp_val;
+       int     offset;
+
+       offset = (NUM_OF_PINS - (pin % (NUM_OF_PINS / 2) + 1) * 2);
+
+       /* Calculate pin location and 2bit mask and dir */
+       dbit_mask = (u32)(0x3 << offset);
+       dbit_dir = (u32)(dir << offset);
+
+       /* Setup the direction */
+       tmp_val = (pin > (NUM_OF_PINS / 2) - 1) ?
+               in_be32(&par_io->ioport[port].dir2) :
+               in_be32(&par_io->ioport[port].dir1);
+
+       if (pin > (NUM_OF_PINS / 2) - 1) {
+               out_be32(&par_io->ioport[port].dir2, ~dbit_mask & tmp_val);
+               out_be32(&par_io->ioport[port].dir2, dbit_dir | tmp_val);
+       } else {
+               out_be32(&par_io->ioport[port].dir1, ~dbit_mask & tmp_val);
+               out_be32(&par_io->ioport[port].dir1, dbit_dir | tmp_val);
+       }
+
+       /* Calculate pin location for 1bit mask */
+       bit_mask = (u32)(1 << (NUM_OF_PINS - (pin + 1)));
+
+       /* Setup the open drain */
+       tmp_val = in_be32(&par_io->ioport[port].podr);
+       if (open_drain)
+               out_be32(&par_io->ioport[port].podr, bit_mask | tmp_val);
+       else
+               out_be32(&par_io->ioport[port].podr, ~bit_mask & tmp_val);
+
+       /* Setup the assignment */
+       tmp_val = (pin > (NUM_OF_PINS / 2) - 1) ?
+               in_be32(&par_io->ioport[port].ppar2) :
+               in_be32(&par_io->ioport[port].ppar1);
+       dbit_asgn = (u32)(assign << offset);
+
+       /* Clear and set 2 bits mask */
+       if (pin > (NUM_OF_PINS / 2) - 1) {
+               out_be32(&par_io->ioport[port].ppar2, ~dbit_mask & tmp_val);
+               out_be32(&par_io->ioport[port].ppar2, dbit_asgn | tmp_val);
+       } else {
+               out_be32(&par_io->ioport[port].ppar1, ~dbit_mask & tmp_val);
+               out_be32(&par_io->ioport[port].ppar1, dbit_asgn | tmp_val);
+       }
+}
+
+#if !defined(CONFIG_PINCTRL)
+/** qe_config_iopin configure one io pin setting
+ *
+ * @port:      io pin port
+ * @pin:       io pin number which get configured
+ * @dir:       direction of io pin 2 bits valid
+ *             00 = pin disabled
+ *             01 = output
+ *             10 = input
+ *             11 = pin is I/O
+ * @open_drain:        is pin open drain
+ * @assign:    pin assignment registers select the function of the pin
+ */
+void qe_config_iopin(u8 port, u8 pin, int dir, int open_drain, int assign)
+{
+       immap_t        *im = (immap_t *)CONFIG_SYS_IMMR;
+       qepio83xx_t    *par_io = (qepio83xx_t *)&im->qepio;
+
+       qe_cfg_iopin(par_io, port, pin, dir, open_drain, assign);
+}
+#else
+static int qe_io_ofdata_to_platdata(struct udevice *dev)
+{
+       struct qe_io_platdata *plat = dev->platdata;
+       fdt_addr_t addr;
+
+       addr = dev_read_addr(dev);
+       if (addr == FDT_ADDR_T_NONE)
+               return -EINVAL;
+
+       plat->base = (qepio83xx_t *)addr;
+       if (dev_read_u32(dev, "num-ports", &plat->num_io_ports))
+               return -EINVAL;
+
+       return 0;
+}
+
+/**
+ * par_io_of_config_node       config
+ * @dev:       pointer to pinctrl device
+ * @pio:       ofnode of pinconfig property
+ */
+static int par_io_of_config_node(struct udevice *dev, ofnode pio)
+{
+       struct qe_io_platdata *plat = dev->platdata;
+       qepio83xx_t *par_io = plat->base;
+       const unsigned int *pio_map;
+       int pio_map_len;
+
+       pio_map = ofnode_get_property(pio, "pio-map", &pio_map_len);
+       if (!pio_map)
+               return -ENOENT;
+
+       pio_map_len /= sizeof(unsigned int);
+       if ((pio_map_len % 6) != 0) {
+               dev_err(dev, "%s: pio-map format wrong!\n", __func__);
+               return -EINVAL;
+       }
+
+       while (pio_map_len > 0) {
+               /*
+                * column pio_map[5] from linux (has_irq) not
+                * supported in u-boot yet.
+                */
+               qe_cfg_iopin(par_io, (u8)pio_map[0], (u8)pio_map[1],
+                            (int)pio_map[2], (int)pio_map[3],
+                            (int)pio_map[4]);
+               pio_map += 6;
+               pio_map_len -= 6;
+       }
+       return 0;
+}
+
+int par_io_of_config(struct udevice *dev)
+{
+       u32 phandle;
+       ofnode pio;
+       int err;
+
+       err = ofnode_read_u32(dev_ofnode(dev), "pio-handle", &phandle);
+       if (err) {
+               dev_err(dev, "%s: pio-handle not available\n", __func__);
+               return err;
+       }
+
+       pio = ofnode_get_by_phandle(phandle);
+       if (!ofnode_valid(pio)) {
+               dev_err(dev, "%s: unable to find node\n", __func__);
+               return -EINVAL;
+       }
+
+       /* To Do: find pinctrl device and pass it */
+       return par_io_of_config_node(NULL, pio);
+}
+
+/*
+ * This is not nice!
+ * pinsettings should work with "pinctrl-" properties.
+ * Unfortunately on mpc83xx powerpc linux device trees
+ * devices handle this with "pio-handle" properties ...
+ *
+ * Even worser, old board code inits all par_io
+ * pins in one step, if U-Boot uses the device
+ * or not. So init all par_io definitions here too
+ * as linux does this also.
+ */
+static void config_qe_ioports(struct udevice *dev)
+{
+       ofnode ofn;
+
+       for (ofn = dev_read_first_subnode(dev); ofnode_valid(ofn);
+            ofn = dev_read_next_subnode(ofn)) {
+               /*
+                * ignore errors here, as may the subnode
+                * has no pio-handle
+                */
+               par_io_of_config_node(dev, ofn);
+       }
+}
+
+static int par_io_pinctrl_probe(struct udevice *dev)
+{
+       config_qe_ioports(dev);
+
+       return 0;
+}
+
+static int par_io_pinctrl_set_state(struct udevice *dev, struct udevice *config)
+{
+       return 0;
+}
+
+const struct pinctrl_ops par_io_pinctrl_ops = {
+       .set_state = par_io_pinctrl_set_state,
+};
+
+static const struct udevice_id par_io_pinctrl_match[] = {
+       { .compatible = "fsl,mpc8360-par_io"},
+       { /* sentinel */ }
+};
+
+U_BOOT_DRIVER(par_io_pinctrl) = {
+       .name = "par-io-pinctrl",
+       .id = UCLASS_PINCTRL,
+       .of_match = of_match_ptr(par_io_pinctrl_match),
+       .probe = par_io_pinctrl_probe,
+       .ofdata_to_platdata = qe_io_ofdata_to_platdata,
+       .platdata_auto_alloc_size = sizeof(struct qe_io_platdata),
+       .ops = &par_io_pinctrl_ops,
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
+       .flags  = DM_FLAG_PRE_RELOC,
+#endif
+};
+#endif
index 44c9f01..864b36b 100644 (file)
@@ -3,7 +3,7 @@
 #
 config QE
        bool "Enable support for QUICC Engine"
-       depends on PPC && !DM_ETH
+       depends on PPC
        default y if ARCH_T1040 || ARCH_T1042 || ARCH_T1024 || ARCH_P1021 \
                || ARCH_P1025
        help
index 61ca476..1a829b5 100644 (file)
@@ -26,7 +26,7 @@
 
 #define MPC85xx_DEVDISR_QE_DISABLE     0x1
 
-qe_map_t               *qe_immr = NULL;
+qe_map_t               *qe_immr;
 #ifdef CONFIG_QE
 static qe_snum_t       snums[QE_NUM_OF_SNUM];
 #endif
@@ -38,18 +38,16 @@ void qe_issue_cmd(uint cmd, uint sbc, u8 mcn, u32 cmd_data)
        u32 cecr;
 
        if (cmd == QE_RESET) {
-               out_be32(&qe_immr->cp.cecr,(u32) (cmd | QE_CR_FLG));
+               out_be32(&qe_immr->cp.cecr, (u32)(cmd | QE_CR_FLG));
        } else {
                out_be32(&qe_immr->cp.cecdr, cmd_data);
                out_be32(&qe_immr->cp.cecr, (sbc | QE_CR_FLG |
-                        ((u32) mcn<<QE_CR_PROTOCOL_SHIFT) | cmd));
+                        ((u32)mcn << QE_CR_PROTOCOL_SHIFT) | cmd));
        }
        /* Wait for the QE_CR_FLG to clear */
        do {
                cecr = in_be32(&qe_immr->cp.cecr);
        } while (cecr & QE_CR_FLG);
-
-       return;
 }
 
 #ifdef CONFIG_QE
@@ -66,12 +64,13 @@ uint qe_muram_alloc(uint size, uint align)
        if (off != 0)
                gd->arch.mp_alloc_base += (align - off);
 
-       if ((off = size & align_mask) != 0)
+       off = size & align_mask;
+       if (off != 0)
                size += (align - off);
 
        if ((gd->arch.mp_alloc_base + size) >= gd->arch.mp_alloc_top) {
                gd->arch.mp_alloc_base = savebase;
-               printf("%s: ran out of ram.\n",  __FUNCTION__);
+               printf("%s: ran out of ram.\n",  __func__);
        }
 
        retloc = gd->arch.mp_alloc_base;
@@ -93,10 +92,10 @@ void *qe_muram_addr(uint offset)
 #ifdef CONFIG_QE
 static void qe_sdma_init(void)
 {
-       volatile sdma_t *p;
-       uint            sdma_buffer_base;
+       sdma_t  *p;
+       uint    sdma_buffer_base;
 
-       p = (volatile sdma_t *)&qe_immr->sdma;
+       p = (sdma_t *)&qe_immr->sdma;
 
        /* All of DMA transaction in bus 1 */
        out_be32(&p->sdaqr, 0);
@@ -212,7 +211,7 @@ void qe_init(uint qe_base)
        qe_upload_firmware((const void *)CONFIG_SYS_QE_FW_ADDR);
 
        /* enable the microcode in IRAM */
-       out_be32(&qe_immr->iram.iready,QE_IRAM_READY);
+       out_be32(&qe_immr->iram.iready, QE_IRAM_READY);
 #endif
 
        gd->arch.mp_alloc_base = QE_DATAONLY_BASE;
@@ -235,10 +234,12 @@ void u_qe_init(void)
        void *addr = (void *)CONFIG_SYS_QE_FW_ADDR;
 
        if (src == BOOT_SOURCE_IFC_NOR)
-               addr = (void *)(CONFIG_SYS_QE_FW_ADDR + CONFIG_SYS_FSL_IFC_BASE);
+               addr = (void *)(CONFIG_SYS_QE_FW_ADDR +
+                               CONFIG_SYS_FSL_IFC_BASE);
 
        if (src == BOOT_SOURCE_QSPI_NOR)
-               addr = (void *)(CONFIG_SYS_QE_FW_ADDR + CONFIG_SYS_FSL_QSPI_BASE);
+               addr = (void *)(CONFIG_SYS_QE_FW_ADDR +
+                               CONFIG_SYS_FSL_QSPI_BASE);
 
        if (src == BOOT_SOURCE_SD_MMC) {
                int dev = CONFIG_SYS_MMC_ENV_DEV;
@@ -320,7 +321,7 @@ void u_qe_resume(void)
 void qe_reset(void)
 {
        qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
-                        (u8) QE_CR_PROTOCOL_UNSPECIFIED, 0);
+                    (u8)QE_CR_PROTOCOL_UNSPECIFIED, 0);
 }
 
 #ifdef CONFIG_QE
@@ -329,24 +330,22 @@ void qe_assign_page(uint snum, uint para_ram_base)
        u32     cecr;
 
        out_be32(&qe_immr->cp.cecdr, para_ram_base);
-       out_be32(&qe_immr->cp.cecr, ((u32) snum<<QE_CR_ASSIGN_PAGE_SNUM_SHIFT)
+       out_be32(&qe_immr->cp.cecr, ((u32)snum << QE_CR_ASSIGN_PAGE_SNUM_SHIFT)
                                         | QE_CR_FLG | QE_ASSIGN_PAGE);
 
        /* Wait for the QE_CR_FLG to clear */
        do {
                cecr = in_be32(&qe_immr->cp.cecr);
-       } while (cecr & QE_CR_FLG );
-
-       return;
+       } while (cecr & QE_CR_FLG);
 }
 #endif
 
 /*
  * brg: 0~15 as BRG1~BRG16
  rate: baud rate
* rate: baud rate
  * BRG input clock comes from the BRGCLK (internal clock generated from
  the QE clock, it is one-half of the QE clock), If need the clock source
  from CLKn pin, we have te change the function.
* the QE clock, it is one-half of the QE clock), If need the clock source
* from CLKn pin, we have te change the function.
  */
 
 #define BRG_CLK                (gd->arch.brg_clk)
@@ -354,12 +353,14 @@ void qe_assign_page(uint snum, uint para_ram_base)
 #ifdef CONFIG_QE
 int qe_set_brg(uint brg, uint rate)
 {
-       volatile uint   *bp;
-       u32             divisor;
-       int             div16 = 0;
+       uint    *bp;
+       u32     divisor;
+       u32     val;
+       int     div16 = 0;
 
        if (brg >= QE_NUM_OF_BRGS)
                return -EINVAL;
+
        bp = (uint *)&qe_immr->brg.brgc1;
        bp += brg;
 
@@ -369,33 +370,37 @@ int qe_set_brg(uint brg, uint rate)
                divisor /= 16;
        }
 
-       *bp = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | QE_BRGC_ENABLE;
-       __asm__ __volatile__("sync");
+       /* CHECK TODO */
+       /*
+        * was
+        * *bp = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | QE_BRGC_ENABLE;
+        * __asm__ __volatile__("sync");
+        */
 
-       if (div16) {
-               *bp |= QE_BRGC_DIV16;
-               __asm__ __volatile__("sync");
-       }
+       val = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | QE_BRGC_ENABLE;
+       if (div16)
+               val |= QE_BRGC_DIV16;
+
+       out_be32(bp, val);
 
        return 0;
 }
 #endif
 
-/* Set ethernet MII clock master
-*/
+/* Set ethernet MII clock master */
 int qe_set_mii_clk_src(int ucc_num)
 {
        u32     cmxgcr;
 
        /* check if the UCC number is in range. */
-       if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0)) {
-               printf("%s: ucc num not in ranges\n", __FUNCTION__);
+       if ((ucc_num > UCC_MAX_NUM - 1) || ucc_num < 0) {
+               printf("%s: ucc num not in ranges\n", __func__);
                return -EINVAL;
        }
 
        cmxgcr = in_be32(&qe_immr->qmx.cmxgcr);
        cmxgcr &= ~QE_CMXGCR_MII_ENET_MNG_MASK;
-       cmxgcr |= (ucc_num <<QE_CMXGCR_MII_ENET_MNG_SHIFT);
+       cmxgcr |= (ucc_num << QE_CMXGCR_MII_ENET_MNG_SHIFT);
        out_be32(&qe_immr->qmx.cmxgcr, cmxgcr);
 
        return 0;
@@ -417,7 +422,7 @@ static int qe_firmware_uploaded;
  * the actual uploading of the microcode.
  */
 static void qe_upload_microcode(const void *base,
-       const struct qe_microcode *ucode)
+                               const struct qe_microcode *ucode)
 {
        const u32 *code = base + be32_to_cpu(ucode->code_offset);
        unsigned int i;
@@ -494,7 +499,7 @@ int qe_upload_firmware(const struct qe_firmware *firmware)
        }
 
        /* Validate some of the fields */
-       if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
+       if (firmware->count < 1 || firmware->count > MAX_QE_RISC) {
                printf("Invalid data\n");
                return -EINVAL;
        }
@@ -522,7 +527,7 @@ int qe_upload_firmware(const struct qe_firmware *firmware)
         * function isn't available unless you turn on JFFS support.
         */
        crc = be32_to_cpu(*(u32 *)((void *)firmware + calc_size));
-       if (crc != (crc32(-1, (const void *) firmware, calc_size) ^ -1)) {
+       if (crc != (crc32(-1, (const void *)firmware, calc_size) ^ -1)) {
                printf("Firmware CRC is invalid\n");
                return -EIO;
        }
@@ -532,12 +537,12 @@ int qe_upload_firmware(const struct qe_firmware *firmware)
         */
        if (!firmware->split) {
                out_be16(&qe_immr->cp.cercr,
-                       in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR);
+                        in_be16(&qe_immr->cp.cercr) | QE_CP_CERCR_CIR);
        }
 
        if (firmware->soc.model)
                printf("Firmware '%s' for %u V%u.%u\n",
-                       firmware->id, be16_to_cpu(firmware->soc.model),
+                      firmware->id, be16_to_cpu(firmware->soc.model),
                        firmware->soc.major, firmware->soc.minor);
        else
                printf("Firmware '%s'\n", firmware->id);
@@ -550,7 +555,7 @@ int qe_upload_firmware(const struct qe_firmware *firmware)
        strncpy(qe_firmware_info.id, (char *)firmware->id, 62);
        qe_firmware_info.extended_modes = firmware->extended_modes;
        memcpy(qe_firmware_info.vtraps, firmware->vtraps,
-               sizeof(firmware->vtraps));
+              sizeof(firmware->vtraps));
        qe_firmware_uploaded = 1;
 
        /* Loop through each microcode. */
@@ -634,7 +639,7 @@ int u_qe_upload_firmware(const struct qe_firmware *firmware)
        }
 
        /* Validate some of the fields */
-       if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) {
+       if (firmware->count < 1 || firmware->count > MAX_QE_RISC) {
                printf("Invalid data\n");
                return -EINVAL;
        }
@@ -803,7 +808,7 @@ static int qe_cmd(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 
                if (argc > 3) {
                        ulong length = simple_strtoul(argv[3], NULL, 16);
-                       struct qe_firmware *firmware = (void *) addr;
+                       struct qe_firmware *firmware = (void *)addr;
 
                        if (length != be32_to_cpu(firmware->header.length)) {
                                printf("Length mismatch\n");
@@ -811,7 +816,7 @@ static int qe_cmd(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
                        }
                }
 
-               return qe_upload_firmware((const struct qe_firmware *) addr);
+               return qe_upload_firmware((const struct qe_firmware *)addr);
        }
 
        return cmd_usage(cmdtp);
@@ -820,7 +825,6 @@ static int qe_cmd(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 U_BOOT_CMD(
        qe, 4, 0, qe_cmd,
        "QUICC Engine commands",
-       "fw <addr> [<length>] - Upload firmware binary at address <addr> to "
-               "the QE,\n"
+       "fw <addr> [<length>] - Upload firmware binary at address <addr> to the QE,\n"
        "\twith optional length <length> verification."
 );
index 9beb5d9..d5d7344 100644 (file)
@@ -14,7 +14,8 @@
 #include "uccf.h"
 #include <fsl_qe.h>
 
-void ucc_fast_transmit_on_demand(ucc_fast_private_t *uccf)
+#if !defined(CONFIG_DM_ETH)
+void ucc_fast_transmit_on_demand(struct ucc_fast_priv *uccf)
 {
        out_be16(&uccf->uf_regs->utodr, UCC_FAST_TOD);
 }
@@ -22,170 +23,271 @@ void ucc_fast_transmit_on_demand(ucc_fast_private_t *uccf)
 u32 ucc_fast_get_qe_cr_subblock(int ucc_num)
 {
        switch (ucc_num) {
-               case 0: return QE_CR_SUBBLOCK_UCCFAST1;
-               case 1: return QE_CR_SUBBLOCK_UCCFAST2;
-               case 2: return QE_CR_SUBBLOCK_UCCFAST3;
-               case 3: return QE_CR_SUBBLOCK_UCCFAST4;
-               case 4: return QE_CR_SUBBLOCK_UCCFAST5;
-               case 5: return QE_CR_SUBBLOCK_UCCFAST6;
-               case 6: return QE_CR_SUBBLOCK_UCCFAST7;
-               case 7: return QE_CR_SUBBLOCK_UCCFAST8;
-               default:        return QE_CR_SUBBLOCK_INVALID;
+       case 0:
+               return QE_CR_SUBBLOCK_UCCFAST1;
+       case 1:
+               return QE_CR_SUBBLOCK_UCCFAST2;
+       case 2:
+               return QE_CR_SUBBLOCK_UCCFAST3;
+       case 3:
+               return QE_CR_SUBBLOCK_UCCFAST4;
+       case 4:
+               return QE_CR_SUBBLOCK_UCCFAST5;
+       case 5:
+               return QE_CR_SUBBLOCK_UCCFAST6;
+       case 6:
+               return QE_CR_SUBBLOCK_UCCFAST7;
+       case 7:
+               return QE_CR_SUBBLOCK_UCCFAST8;
+       default:
+               return QE_CR_SUBBLOCK_INVALID;
        }
 }
 
-static void ucc_get_cmxucr_reg(int ucc_num, volatile u32 **p_cmxucr,
-                                u8 *reg_num, u8 *shift)
+static void ucc_get_cmxucr_reg(int ucc_num, u32 **p_cmxucr,
+                              u8 *reg_num, u8 *shift)
 {
        switch (ucc_num) {
-               case 0: /* UCC1 */
-                       *p_cmxucr  = &(qe_immr->qmx.cmxucr1);
-                       *reg_num = 1;
-                       *shift  = 16;
-                       break;
-               case 2: /* UCC3 */
-                       *p_cmxucr  = &(qe_immr->qmx.cmxucr1);
-                       *reg_num = 1;
-                       *shift  = 0;
-                       break;
-               case 4: /* UCC5 */
-                       *p_cmxucr  = &(qe_immr->qmx.cmxucr2);
-                       *reg_num = 2;
-                       *shift  = 16;
-                       break;
-               case 6: /* UCC7 */
-                       *p_cmxucr  = &(qe_immr->qmx.cmxucr2);
-                       *reg_num = 2;
-                       *shift  = 0;
-                       break;
-               case 1: /* UCC2 */
-                       *p_cmxucr  = &(qe_immr->qmx.cmxucr3);
-                       *reg_num = 3;
-                       *shift  = 16;
-                       break;
-               case 3: /* UCC4 */
-                       *p_cmxucr  = &(qe_immr->qmx.cmxucr3);
-                       *reg_num = 3;
-                       *shift  = 0;
-                       break;
-               case 5: /* UCC6 */
-                       *p_cmxucr  = &(qe_immr->qmx.cmxucr4);
-                       *reg_num = 4;
-                       *shift  = 16;
-                       break;
-               case 7: /* UCC8 */
-                       *p_cmxucr  = &(qe_immr->qmx.cmxucr4);
-                       *reg_num = 4;
-                       *shift  = 0;
-                       break;
-               default:
-                       break;
+       case 0: /* UCC1 */
+               *p_cmxucr  = &qe_immr->qmx.cmxucr1;
+               *reg_num = 1;
+               *shift  = 16;
+               break;
+       case 2: /* UCC3 */
+               *p_cmxucr  = &qe_immr->qmx.cmxucr1;
+               *reg_num = 1;
+               *shift  = 0;
+               break;
+       case 4: /* UCC5 */
+               *p_cmxucr  = &qe_immr->qmx.cmxucr2;
+               *reg_num = 2;
+               *shift  = 16;
+               break;
+       case 6: /* UCC7 */
+               *p_cmxucr  = &qe_immr->qmx.cmxucr2;
+               *reg_num = 2;
+               *shift  = 0;
+               break;
+       case 1: /* UCC2 */
+               *p_cmxucr  = &qe_immr->qmx.cmxucr3;
+               *reg_num = 3;
+               *shift  = 16;
+               break;
+       case 3: /* UCC4 */
+               *p_cmxucr  = &qe_immr->qmx.cmxucr3;
+               *reg_num = 3;
+               *shift  = 0;
+               break;
+       case 5: /* UCC6 */
+               *p_cmxucr  = &qe_immr->qmx.cmxucr4;
+               *reg_num = 4;
+               *shift  = 16;
+               break;
+       case 7: /* UCC8 */
+               *p_cmxucr  = &qe_immr->qmx.cmxucr4;
+               *reg_num = 4;
+               *shift  = 0;
+               break;
+       default:
+               break;
        }
 }
 
 static int ucc_set_clk_src(int ucc_num, qe_clock_e clock, comm_dir_e mode)
 {
-       volatile u32    *p_cmxucr = NULL;
-       u8              reg_num = 0;
-       u8              shift = 0;
-       u32             clockBits;
-       u32             clockMask;
-       int             source = -1;
+       u32     *p_cmxucr = NULL;
+       u8      reg_num = 0;
+       u8      shift = 0;
+       u32     clk_bits;
+       u32     clk_mask;
+       int     source = -1;
 
        /* check if the UCC number is in range. */
-       if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0))
+       if ((ucc_num > UCC_MAX_NUM - 1) || ucc_num < 0)
                return -EINVAL;
 
-       if (! ((mode == COMM_DIR_RX) || (mode == COMM_DIR_TX))) {
-               printf("%s: bad comm mode type passed\n", __FUNCTION__);
+       if (!(mode == COMM_DIR_RX || mode == COMM_DIR_TX)) {
+               printf("%s: bad comm mode type passed\n", __func__);
                return -EINVAL;
        }
 
        ucc_get_cmxucr_reg(ucc_num, &p_cmxucr, &reg_num, &shift);
 
        switch (reg_num) {
-               case 1:
-                       switch (clock) {
-                               case QE_BRG1:   source = 1; break;
-                               case QE_BRG2:   source = 2; break;
-                               case QE_BRG7:   source = 3; break;
-                               case QE_BRG8:   source = 4; break;
-                               case QE_CLK9:   source = 5; break;
-                               case QE_CLK10:  source = 6; break;
-                               case QE_CLK11:  source = 7; break;
-                               case QE_CLK12:  source = 8; break;
-                               case QE_CLK15:  source = 9; break;
-                               case QE_CLK16:  source = 10; break;
-                               default:        source = -1; break;
-                       }
-                       break;
-               case 2:
-                       switch (clock) {
-                               case QE_BRG5:   source = 1; break;
-                               case QE_BRG6:   source = 2; break;
-                               case QE_BRG7:   source = 3; break;
-                               case QE_BRG8:   source = 4; break;
-                               case QE_CLK13:  source = 5; break;
-                               case QE_CLK14:  source = 6; break;
-                               case QE_CLK19:  source = 7; break;
-                               case QE_CLK20:  source = 8; break;
-                               case QE_CLK15:  source = 9; break;
-                               case QE_CLK16:  source = 10; break;
-                               default:        source = -1; break;
-                       }
-                       break;
-               case 3:
-                       switch (clock) {
-                               case QE_BRG9:   source = 1; break;
-                               case QE_BRG10:  source = 2; break;
-                               case QE_BRG15:  source = 3; break;
-                               case QE_BRG16:  source = 4; break;
-                               case QE_CLK3:   source = 5; break;
-                               case QE_CLK4:   source = 6; break;
-                               case QE_CLK17:  source = 7; break;
-                               case QE_CLK18:  source = 8; break;
-                               case QE_CLK7:   source = 9; break;
-                               case QE_CLK8:   source = 10; break;
-                               case QE_CLK16:  source = 11; break;
-                               default:        source = -1; break;
-                       }
-                       break;
-               case 4:
-                       switch (clock) {
-                               case QE_BRG13:  source = 1; break;
-                               case QE_BRG14:  source = 2; break;
-                               case QE_BRG15:  source = 3; break;
-                               case QE_BRG16:  source = 4; break;
-                               case QE_CLK5:   source = 5; break;
-                               case QE_CLK6:   source = 6; break;
-                               case QE_CLK21:  source = 7; break;
-                               case QE_CLK22:  source = 8; break;
-                               case QE_CLK7:   source = 9; break;
-                               case QE_CLK8:   source = 10; break;
-                               case QE_CLK16:  source = 11; break;
-                               default:        source = -1; break;
-                       }
+       case 1:
+               switch (clock) {
+               case QE_BRG1:
+                       source = 1;
+                       break;
+               case QE_BRG2:
+                       source = 2;
+                       break;
+               case QE_BRG7:
+                       source = 3;
+                       break;
+               case QE_BRG8:
+                       source = 4;
+                       break;
+               case QE_CLK9:
+                       source = 5;
+                       break;
+               case QE_CLK10:
+                       source = 6;
+                       break;
+               case QE_CLK11:
+                       source = 7;
+                       break;
+               case QE_CLK12:
+                       source = 8;
+                       break;
+               case QE_CLK15:
+                       source = 9;
+                       break;
+               case QE_CLK16:
+                       source = 10;
+                       break;
+               default:
+                       source = -1;
+                       break;
+               }
+               break;
+       case 2:
+               switch (clock) {
+               case QE_BRG5:
+                       source = 1;
+                       break;
+               case QE_BRG6:
+                       source = 2;
+                       break;
+               case QE_BRG7:
+                       source = 3;
+                       break;
+               case QE_BRG8:
+                       source = 4;
+                       break;
+               case QE_CLK13:
+                       source = 5;
+                       break;
+               case QE_CLK14:
+                       source = 6;
+                       break;
+               case QE_CLK19:
+                       source = 7;
+                       break;
+               case QE_CLK20:
+                       source = 8;
+                       break;
+               case QE_CLK15:
+                       source = 9;
+                       break;
+               case QE_CLK16:
+                       source = 10;
                        break;
                default:
                        source = -1;
                        break;
+               }
+               break;
+       case 3:
+               switch (clock) {
+               case QE_BRG9:
+                       source = 1;
+                       break;
+               case QE_BRG10:
+                       source = 2;
+                       break;
+               case QE_BRG15:
+                       source = 3;
+                       break;
+               case QE_BRG16:
+                       source = 4;
+                       break;
+               case QE_CLK3:
+                       source = 5;
+                       break;
+               case QE_CLK4:
+                       source = 6;
+                       break;
+               case QE_CLK17:
+                       source = 7;
+                       break;
+               case QE_CLK18:
+                       source = 8;
+                       break;
+               case QE_CLK7:
+                       source = 9;
+                       break;
+               case QE_CLK8:
+                       source = 10;
+                       break;
+               case QE_CLK16:
+                       source = 11;
+                       break;
+               default:
+                       source = -1;
+                       break;
+               }
+               break;
+       case 4:
+               switch (clock) {
+               case QE_BRG13:
+                       source = 1;
+                       break;
+               case QE_BRG14:
+                       source = 2;
+                       break;
+               case QE_BRG15:
+                       source = 3;
+                       break;
+               case QE_BRG16:
+                       source = 4;
+                       break;
+               case QE_CLK5:
+                       source = 5;
+                       break;
+               case QE_CLK6:
+                       source = 6;
+                       break;
+               case QE_CLK21:
+                       source = 7;
+                       break;
+               case QE_CLK22:
+                       source = 8;
+                       break;
+               case QE_CLK7:
+                       source = 9;
+                       break;
+               case QE_CLK8:
+                       source = 10;
+                       break;
+               case QE_CLK16:
+                       source = 11;
+                       break;
+               default:
+                       source = -1;
+                       break;
+               }
+               break;
+       default:
+               source = -1;
+               break;
        }
 
        if (source == -1) {
-               printf("%s: Bad combination of clock and UCC\n", __FUNCTION__);
+               printf("%s: Bad combination of clock and UCC\n", __func__);
                return -ENOENT;
        }
 
-       clockBits = (u32) source;
-       clockMask = QE_CMXUCR_TX_CLK_SRC_MASK;
+       clk_bits = (u32)source;
+       clk_mask = QE_CMXUCR_TX_CLK_SRC_MASK;
        if (mode == COMM_DIR_RX) {
-               clockBits <<= 4; /* Rx field is 4 bits to left of Tx field */
-               clockMask <<= 4; /* Rx field is 4 bits to left of Tx field */
+               clk_bits <<= 4; /* Rx field is 4 bits to left of Tx field */
+               clk_mask <<= 4; /* Rx field is 4 bits to left of Tx field */
        }
-       clockBits <<= shift;
-       clockMask <<= shift;
+       clk_bits <<= shift;
+       clk_mask <<= shift;
 
-       out_be32(p_cmxucr, (in_be32(p_cmxucr) & ~clockMask) | clockBits);
+       out_be32(p_cmxucr, (in_be32(p_cmxucr) & ~clk_mask) | clk_bits);
 
        return 0;
 }
@@ -195,28 +297,45 @@ static uint ucc_get_reg_baseaddr(int ucc_num)
        uint base = 0;
 
        /* check if the UCC number is in range */
-       if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0)) {
-               printf("%s: the UCC num not in ranges\n", __FUNCTION__);
+       if ((ucc_num > UCC_MAX_NUM - 1) || ucc_num < 0) {
+               printf("%s: the UCC num not in ranges\n", __func__);
                return 0;
        }
 
        switch (ucc_num) {
-               case 0: base = 0x00002000; break;
-               case 1: base = 0x00003000; break;
-               case 2: base = 0x00002200; break;
-               case 3: base = 0x00003200; break;
-               case 4: base = 0x00002400; break;
-               case 5: base = 0x00003400; break;
-               case 6: base = 0x00002600; break;
-               case 7: base = 0x00003600; break;
-               default: break;
+       case 0:
+               base = 0x00002000;
+               break;
+       case 1:
+               base = 0x00003000;
+               break;
+       case 2:
+               base = 0x00002200;
+               break;
+       case 3:
+               base = 0x00003200;
+               break;
+       case 4:
+               base = 0x00002400;
+               break;
+       case 5:
+               base = 0x00003400;
+               break;
+       case 6:
+               base = 0x00002600;
+               break;
+       case 7:
+               base = 0x00003600;
+               break;
+       default:
+               break;
        }
 
        base = (uint)qe_immr + base;
        return base;
 }
 
-void ucc_fast_enable(ucc_fast_private_t *uccf, comm_dir_e mode)
+void ucc_fast_enable(struct ucc_fast_priv *uccf, comm_dir_e mode)
 {
        ucc_fast_t      *uf_regs;
        u32             gumr;
@@ -236,7 +355,7 @@ void ucc_fast_enable(ucc_fast_private_t *uccf, comm_dir_e mode)
        out_be32(&uf_regs->gumr, gumr);
 }
 
-void ucc_fast_disable(ucc_fast_private_t *uccf, comm_dir_e mode)
+void ucc_fast_disable(struct ucc_fast_priv *uccf, comm_dir_e mode)
 {
        ucc_fast_t      *uf_regs;
        u32             gumr;
@@ -256,34 +375,35 @@ void ucc_fast_disable(ucc_fast_private_t *uccf, comm_dir_e mode)
        out_be32(&uf_regs->gumr, gumr);
 }
 
-int ucc_fast_init(ucc_fast_info_t *uf_info, ucc_fast_private_t  **uccf_ret)
+int ucc_fast_init(struct ucc_fast_inf *uf_info,
+                 struct ucc_fast_priv **uccf_ret)
 {
-       ucc_fast_private_t      *uccf;
+       struct ucc_fast_priv    *uccf;
        ucc_fast_t              *uf_regs;
 
        if (!uf_info)
                return -EINVAL;
 
-       if ((uf_info->ucc_num < 0) || (uf_info->ucc_num > UCC_MAX_NUM - 1)) {
-               printf("%s: Illagal UCC number!\n", __FUNCTION__);
+       if (uf_info->ucc_num < 0 || (uf_info->ucc_num > UCC_MAX_NUM - 1)) {
+               printf("%s: Illagal UCC number!\n", __func__);
                return -EINVAL;
        }
 
-       uccf = (ucc_fast_private_t *)malloc(sizeof(ucc_fast_private_t));
+       uccf = (struct ucc_fast_priv *)malloc(sizeof(struct ucc_fast_priv));
        if (!uccf) {
                printf("%s: No memory for UCC fast data structure!\n",
-                        __FUNCTION__);
+                      __func__);
                return -ENOMEM;
        }
-       memset(uccf, 0, sizeof(ucc_fast_private_t));
+       memset(uccf, 0, sizeof(struct ucc_fast_priv));
 
        /* Save fast UCC structure */
        uccf->uf_info   = uf_info;
        uccf->uf_regs   = (ucc_fast_t *)ucc_get_reg_baseaddr(uf_info->ucc_num);
 
-       if (uccf->uf_regs == NULL) {
+       if (!uccf->uf_regs) {
                printf("%s: No memory map for UCC fast controller!\n",
-                        __FUNCTION__);
+                      __func__);
                return -ENOMEM;
        }
 
@@ -291,8 +411,8 @@ int ucc_fast_init(ucc_fast_info_t *uf_info, ucc_fast_private_t  **uccf_ret)
        uccf->enabled_rx        = 0;
 
        uf_regs                 = uccf->uf_regs;
-       uccf->p_ucce            = (u32 *) &(uf_regs->ucce);
-       uccf->p_uccm            = (u32 *) &(uf_regs->uccm);
+       uccf->p_ucce            = (u32 *)&uf_regs->ucce;
+       uccf->p_uccm            = (u32 *)&uf_regs->uccm;
 
        /* Init GUEMR register, UCC both Rx and Tx is Fast protocol */
        out_8(&uf_regs->guemr, UCC_GUEMR_SET_RESERVED3 | UCC_GUEMR_MODE_FAST_RX
@@ -306,13 +426,13 @@ int ucc_fast_init(ucc_fast_info_t *uf_info, ucc_fast_private_t  **uccf_ret)
                /* Allocate memory for Tx Virtual Fifo */
                uccf->ucc_fast_tx_virtual_fifo_base_offset =
                qe_muram_alloc(UCC_GETH_UTFS_GIGA_INIT,
-                                UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
+                              UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
 
                /* Allocate memory for Rx Virtual Fifo */
                uccf->ucc_fast_rx_virtual_fifo_base_offset =
                qe_muram_alloc(UCC_GETH_URFS_GIGA_INIT +
-                                UCC_FAST_RX_VIRTUAL_FIFO_SIZE_PAD,
-                               UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
+                              UCC_FAST_RX_VIRTUAL_FIFO_SIZE_PAD,
+                              UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
 
                /* utfb, urfb are offsets from MURAM base */
                out_be32(&uf_regs->utfb,
@@ -334,7 +454,7 @@ int ucc_fast_init(ucc_fast_info_t *uf_info, ucc_fast_private_t  **uccf_ret)
                /* Allocate memory for Tx Virtual Fifo */
                uccf->ucc_fast_tx_virtual_fifo_base_offset =
                qe_muram_alloc(UCC_GETH_UTFS_INIT,
-                                UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
+                              UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
 
                /* Allocate memory for Rx Virtual Fifo */
                uccf->ucc_fast_rx_virtual_fifo_base_offset =
@@ -360,9 +480,9 @@ int ucc_fast_init(ucc_fast_info_t *uf_info, ucc_fast_private_t  **uccf_ret)
        /* Rx clock routing */
        if (uf_info->rx_clock != QE_CLK_NONE) {
                if (ucc_set_clk_src(uf_info->ucc_num,
-                        uf_info->rx_clock, COMM_DIR_RX)) {
+                                   uf_info->rx_clock, COMM_DIR_RX)) {
                        printf("%s: Illegal value for parameter 'RxClock'.\n",
-                                __FUNCTION__);
+                              __func__);
                        return -EINVAL;
                }
        }
@@ -370,9 +490,9 @@ int ucc_fast_init(ucc_fast_info_t *uf_info, ucc_fast_private_t  **uccf_ret)
        /* Tx clock routing */
        if (uf_info->tx_clock != QE_CLK_NONE) {
                if (ucc_set_clk_src(uf_info->ucc_num,
-                        uf_info->tx_clock, COMM_DIR_TX)) {
+                                   uf_info->tx_clock, COMM_DIR_TX)) {
                        printf("%s: Illegal value for parameter 'TxClock'.\n",
-                                __FUNCTION__);
+                              __func__);
                        return -EINVAL;
                }
        }
@@ -386,3 +506,4 @@ int ucc_fast_init(ucc_fast_info_t *uf_info, ucc_fast_private_t  **uccf_ret)
        *uccf_ret = uccf;
        return 0;
 }
+#endif
index 4098c66..99f8458 100644 (file)
 #include "linux/immap_qe.h"
 #include <fsl_qe.h>
 
-/* Fast or Giga ethernet
-*/
-typedef enum enet_type {
+/* Fast or Giga ethernet */
+enum enet_type {
        FAST_ETH,
        GIGA_ETH,
-} enet_type_e;
+};
 
-/* General UCC Extended Mode Register
-*/
+/* General UCC Extended Mode Register */
 #define UCC_GUEMR_MODE_MASK_RX         0x02
 #define UCC_GUEMR_MODE_MASK_TX         0x01
 #define UCC_GUEMR_MODE_FAST_RX         0x02
 #define UCC_GUEMR_MODE_FAST_TX         0x01
 #define UCC_GUEMR_MODE_SLOW_RX         0x00
 #define UCC_GUEMR_MODE_SLOW_TX         0x00
-#define UCC_GUEMR_SET_RESERVED3                0x10 /* Bit 3 must be set 1 */
+/* Bit 3 must be set 1 */
+#define UCC_GUEMR_SET_RESERVED3                0x10
 
-/* General UCC FAST Mode Register
-*/
+/* General UCC FAST Mode Register */
 #define UCC_FAST_GUMR_TCI              0x20000000
 #define UCC_FAST_GUMR_TRX              0x10000000
 #define UCC_FAST_GUMR_TTX              0x08000000
@@ -46,8 +44,7 @@ typedef enum enet_type {
 #define UCC_FAST_GUMR_ENR              0x00000020
 #define UCC_FAST_GUMR_ENT              0x00000010
 
-/* GUMR [MODE] bit maps
-*/
+/* GUMR [MODE] bit maps */
 #define UCC_FAST_GUMR_HDLC             0x00000000
 #define UCC_FAST_GUMR_QMC              0x00000002
 #define UCC_FAST_GUMR_UART             0x00000004
@@ -55,50 +52,54 @@ typedef enum enet_type {
 #define UCC_FAST_GUMR_ATM              0x0000000a
 #define UCC_FAST_GUMR_ETH              0x0000000c
 
-/* Transmit On Demand (UTORD)
-*/
+/* Transmit On Demand (UTORD) */
 #define UCC_SLOW_TOD                   0x8000
 #define UCC_FAST_TOD                   0x8000
 
-/* Fast Ethernet (10/100 Mbps)
-*/
-#define UCC_GETH_URFS_INIT             512        /* Rx virtual FIFO size */
-#define UCC_GETH_URFET_INIT            256        /* 1/2 urfs */
-#define UCC_GETH_URFSET_INIT           384        /* 3/4 urfs */
-#define UCC_GETH_UTFS_INIT             512        /* Tx virtual FIFO size */
-#define UCC_GETH_UTFET_INIT            256        /* 1/2 utfs */
+/* Fast Ethernet (10/100 Mbps) */
+/* Rx virtual FIFO size */
+#define UCC_GETH_URFS_INIT             512
+/* 1/2 urfs */
+#define UCC_GETH_URFET_INIT            256
+/* 3/4 urfs */
+#define UCC_GETH_URFSET_INIT           384
+/* Tx virtual FIFO size */
+#define UCC_GETH_UTFS_INIT             512
+/* 1/2 utfs */
+#define UCC_GETH_UTFET_INIT            256
 #define UCC_GETH_UTFTT_INIT            128
 
-/* Gigabit Ethernet (1000 Mbps)
-*/
-#define UCC_GETH_URFS_GIGA_INIT                4096/*2048*/    /* Rx virtual FIFO size */
-#define UCC_GETH_URFET_GIGA_INIT       2048/*1024*/    /* 1/2 urfs */
-#define UCC_GETH_URFSET_GIGA_INIT      3072/*1536*/    /* 3/4 urfs */
-#define UCC_GETH_UTFS_GIGA_INIT                8192/*2048*/    /* Tx virtual FIFO size */
-#define UCC_GETH_UTFET_GIGA_INIT       4096/*1024*/    /* 1/2 utfs */
-#define UCC_GETH_UTFTT_GIGA_INIT       0x400/*0x40*/   /*  */
+/* Gigabit Ethernet (1000 Mbps) */
+/* Rx virtual FIFO size */
+#define UCC_GETH_URFS_GIGA_INIT                4096/*2048*/
+/* 1/2 urfs */
+#define UCC_GETH_URFET_GIGA_INIT       2048/*1024*/
+/* 3/4 urfs */
+#define UCC_GETH_URFSET_GIGA_INIT      3072/*1536*/
+/* Tx virtual FIFO size */
+#define UCC_GETH_UTFS_GIGA_INIT                8192/*2048*/
+/* 1/2 utfs */
+#define UCC_GETH_UTFET_GIGA_INIT       4096/*1024*/
+#define UCC_GETH_UTFTT_GIGA_INIT       0x400/*0x40*/
 
-/* UCC fast alignment
-*/
+/* UCC fast alignment */
 #define UCC_FAST_RX_ALIGN                      4
 #define UCC_FAST_MRBLR_ALIGNMENT               4
 #define UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT      8
 
-/* Sizes
-*/
+/* Sizes */
 #define UCC_FAST_RX_VIRTUAL_FIFO_SIZE_PAD      8
 
-/* UCC fast structure.
-*/
-typedef struct ucc_fast_info {
+/* UCC fast structure. */
+struct ucc_fast_inf {
        int             ucc_num;
        qe_clock_e      rx_clock;
        qe_clock_e      tx_clock;
-       enet_type_e     eth_type;
-} ucc_fast_info_t;
+       enum enet_type  eth_type;
+};
 
-typedef struct ucc_fast_private {
-       ucc_fast_info_t *uf_info;
+struct ucc_fast_priv {
+       struct ucc_fast_inf     *uf_info;
        ucc_fast_t      *uf_regs; /* a pointer to memory map of UCC regs */
        u32             *p_ucce; /* a pointer to the event register */
        u32             *p_uccm; /* a pointer to the mask register */
@@ -106,12 +107,13 @@ typedef struct ucc_fast_private {
        int             enabled_rx; /* whether UCC is enabled for Rx (ENR) */
        u32             ucc_fast_tx_virtual_fifo_base_offset;
        u32             ucc_fast_rx_virtual_fifo_base_offset;
-} ucc_fast_private_t;
+};
 
-void ucc_fast_transmit_on_demand(ucc_fast_private_t *uccf);
+void ucc_fast_transmit_on_demand(struct ucc_fast_priv *uccf);
 u32 ucc_fast_get_qe_cr_subblock(int ucc_num);
-void ucc_fast_enable(ucc_fast_private_t *uccf, comm_dir_e mode);
-void ucc_fast_disable(ucc_fast_private_t *uccf, comm_dir_e mode);
-int ucc_fast_init(ucc_fast_info_t *uf_info, ucc_fast_private_t **uccf_ret);
+void ucc_fast_enable(struct ucc_fast_priv *uccf, comm_dir_e mode);
+void ucc_fast_disable(struct ucc_fast_priv *uccf, comm_dir_e mode);
+int ucc_fast_init(struct ucc_fast_inf *uf_info,
+                 struct ucc_fast_priv **uccf_ret);
 
 #endif /* __UCCF_H__ */
index 0143454..5da971d 100644 (file)
 #include <fsl_qe.h>
 #include <phy.h>
 
+#if !defined(CONFIG_DM_ETH)
 /* Default UTBIPAR SMI address */
 #ifndef CONFIG_UTBIPAR_INIT_TBIPA
 #define CONFIG_UTBIPAR_INIT_TBIPA 0x1F
 #endif
 
-static uec_info_t uec_info[] = {
+static struct uec_inf uec_info[] = {
 #ifdef CONFIG_UEC_ETH1
        STD_UEC_INFO(1),        /* UEC1 */
 #endif
@@ -56,13 +57,13 @@ static uec_info_t uec_info[] = {
 
 static struct eth_device *devlist[MAXCONTROLLERS];
 
-static int uec_mac_enable(uec_private_t *uec, comm_dir_e mode)
+static int uec_mac_enable(struct uec_priv *uec, comm_dir_e mode)
 {
        uec_t           *uec_regs;
        u32             maccfg1;
 
        if (!uec) {
-               printf("%s: uec not initial\n", __FUNCTION__);
+               printf("%s: uec not initial\n", __func__);
                return -EINVAL;
        }
        uec_regs = uec->uec_regs;
@@ -84,13 +85,13 @@ static int uec_mac_enable(uec_private_t *uec, comm_dir_e mode)
        return 0;
 }
 
-static int uec_mac_disable(uec_private_t *uec, comm_dir_e mode)
+static int uec_mac_disable(struct uec_priv *uec, comm_dir_e mode)
 {
        uec_t           *uec_regs;
        u32             maccfg1;
 
        if (!uec) {
-               printf("%s: uec not initial\n", __FUNCTION__);
+               printf("%s: uec not initial\n", __func__);
                return -EINVAL;
        }
        uec_regs = uec->uec_regs;
@@ -112,14 +113,14 @@ static int uec_mac_disable(uec_private_t *uec, comm_dir_e mode)
        return 0;
 }
 
-static int uec_graceful_stop_tx(uec_private_t *uec)
+static int uec_graceful_stop_tx(struct uec_priv *uec)
 {
        ucc_fast_t              *uf_regs;
        u32                     cecr_subblock;
        u32                     ucce;
 
        if (!uec || !uec->uccf) {
-               printf("%s: No handle passed.\n", __FUNCTION__);
+               printf("%s: No handle passed.\n", __func__);
                return -EINVAL;
        }
 
@@ -132,30 +133,30 @@ static int uec_graceful_stop_tx(uec_private_t *uec)
        cecr_subblock =
                 ucc_fast_get_qe_cr_subblock(uec->uec_info->uf_info.ucc_num);
        qe_issue_cmd(QE_GRACEFUL_STOP_TX, cecr_subblock,
-                        (u8)QE_CR_PROTOCOL_ETHERNET, 0);
+                    (u8)QE_CR_PROTOCOL_ETHERNET, 0);
 
        /* Wait for command to complete */
        do {
                ucce = in_be32(&uf_regs->ucce);
-       } while (! (ucce & UCCE_GRA));
+       } while (!(ucce & UCCE_GRA));
 
        uec->grace_stopped_tx = 1;
 
        return 0;
 }
 
-static int uec_graceful_stop_rx(uec_private_t *uec)
+static int uec_graceful_stop_rx(struct uec_priv *uec)
 {
        u32             cecr_subblock;
        u8              ack;
 
        if (!uec) {
-               printf("%s: No handle passed.\n", __FUNCTION__);
+               printf("%s: No handle passed.\n", __func__);
                return -EINVAL;
        }
 
        if (!uec->p_rx_glbl_pram) {
-               printf("%s: No init rx global parameter\n", __FUNCTION__);
+               printf("%s: No init rx global parameter\n", __func__);
                return -EINVAL;
        }
 
@@ -170,66 +171,66 @@ static int uec_graceful_stop_rx(uec_private_t *uec)
                cecr_subblock =
                 ucc_fast_get_qe_cr_subblock(uec->uec_info->uf_info.ucc_num);
                qe_issue_cmd(QE_GRACEFUL_STOP_RX, cecr_subblock,
-                                (u8)QE_CR_PROTOCOL_ETHERNET, 0);
+                            (u8)QE_CR_PROTOCOL_ETHERNET, 0);
                ack = uec->p_rx_glbl_pram->rxgstpack;
-       } while (! (ack & GRACEFUL_STOP_ACKNOWLEDGE_RX ));
+       } while (!(ack & GRACEFUL_STOP_ACKNOWLEDGE_RX));
 
        uec->grace_stopped_rx = 1;
 
        return 0;
 }
 
-static int uec_restart_tx(uec_private_t *uec)
+static int uec_restart_tx(struct uec_priv *uec)
 {
        u32             cecr_subblock;
 
        if (!uec || !uec->uec_info) {
-               printf("%s: No handle passed.\n", __FUNCTION__);
+               printf("%s: No handle passed.\n", __func__);
                return -EINVAL;
        }
 
        cecr_subblock =
         ucc_fast_get_qe_cr_subblock(uec->uec_info->uf_info.ucc_num);
        qe_issue_cmd(QE_RESTART_TX, cecr_subblock,
-                        (u8)QE_CR_PROTOCOL_ETHERNET, 0);
+                    (u8)QE_CR_PROTOCOL_ETHERNET, 0);
 
        uec->grace_stopped_tx = 0;
 
        return 0;
 }
 
-static int uec_restart_rx(uec_private_t *uec)
+static int uec_restart_rx(struct uec_priv *uec)
 {
        u32             cecr_subblock;
 
        if (!uec || !uec->uec_info) {
-               printf("%s: No handle passed.\n", __FUNCTION__);
+               printf("%s: No handle passed.\n", __func__);
                return -EINVAL;
        }
 
        cecr_subblock =
         ucc_fast_get_qe_cr_subblock(uec->uec_info->uf_info.ucc_num);
        qe_issue_cmd(QE_RESTART_RX, cecr_subblock,
-                        (u8)QE_CR_PROTOCOL_ETHERNET, 0);
+                    (u8)QE_CR_PROTOCOL_ETHERNET, 0);
 
        uec->grace_stopped_rx = 0;
 
        return 0;
 }
 
-static int uec_open(uec_private_t *uec, comm_dir_e mode)
+static int uec_open(struct uec_priv *uec, comm_dir_e mode)
 {
-       ucc_fast_private_t      *uccf;
+       struct ucc_fast_priv    *uccf;
 
        if (!uec || !uec->uccf) {
-               printf("%s: No handle passed.\n", __FUNCTION__);
+               printf("%s: No handle passed.\n", __func__);
                return -EINVAL;
        }
        uccf = uec->uccf;
 
        /* check if the UCC number is in range. */
        if (uec->uec_info->uf_info.ucc_num >= UCC_MAX_NUM) {
-               printf("%s: ucc_num out of range.\n", __FUNCTION__);
+               printf("%s: ucc_num out of range.\n", __func__);
                return -EINVAL;
        }
 
@@ -240,36 +241,33 @@ static int uec_open(uec_private_t *uec, comm_dir_e mode)
        ucc_fast_enable(uccf, mode);
 
        /* RISC microcode start */
-       if ((mode & COMM_DIR_TX) && uec->grace_stopped_tx) {
+       if ((mode & COMM_DIR_TX) && uec->grace_stopped_tx)
                uec_restart_tx(uec);
-       }
-       if ((mode & COMM_DIR_RX) && uec->grace_stopped_rx) {
+       if ((mode & COMM_DIR_RX) && uec->grace_stopped_rx)
                uec_restart_rx(uec);
-       }
 
        return 0;
 }
 
-static int uec_stop(uec_private_t *uec, comm_dir_e mode)
+static int uec_stop(struct uec_priv *uec, comm_dir_e mode)
 {
        if (!uec || !uec->uccf) {
-               printf("%s: No handle passed.\n", __FUNCTION__);
+               printf("%s: No handle passed.\n", __func__);
                return -EINVAL;
        }
 
        /* check if the UCC number is in range. */
        if (uec->uec_info->uf_info.ucc_num >= UCC_MAX_NUM) {
-               printf("%s: ucc_num out of range.\n", __FUNCTION__);
+               printf("%s: ucc_num out of range.\n", __func__);
                return -EINVAL;
        }
        /* Stop any transmissions */
-       if ((mode & COMM_DIR_TX) && !uec->grace_stopped_tx) {
+       if ((mode & COMM_DIR_TX) && !uec->grace_stopped_tx)
                uec_graceful_stop_tx(uec);
-       }
+
        /* Stop any receptions */
-       if ((mode & COMM_DIR_RX) && !uec->grace_stopped_rx) {
+       if ((mode & COMM_DIR_RX) && !uec->grace_stopped_rx)
                uec_graceful_stop_rx(uec);
-       }
 
        /* Disable the UCC fast */
        ucc_fast_disable(uec->uccf, mode);
@@ -280,13 +278,13 @@ static int uec_stop(uec_private_t *uec, comm_dir_e mode)
        return 0;
 }
 
-static int uec_set_mac_duplex(uec_private_t *uec, int duplex)
+static int uec_set_mac_duplex(struct uec_priv *uec, int duplex)
 {
        uec_t           *uec_regs;
        u32             maccfg2;
 
        if (!uec) {
-               printf("%s: uec not initial\n", __FUNCTION__);
+               printf("%s: uec not initial\n", __func__);
                return -EINVAL;
        }
        uec_regs = uec->uec_regs;
@@ -306,8 +304,8 @@ static int uec_set_mac_duplex(uec_private_t *uec, int duplex)
        return 0;
 }
 
-static int uec_set_mac_if_mode(uec_private_t *uec,
-               phy_interface_t if_mode, int speed)
+static int uec_set_mac_if_mode(struct uec_priv *uec,
+                              phy_interface_t if_mode, int speed)
 {
        phy_interface_t         enet_if_mode;
        uec_t                   *uec_regs;
@@ -315,7 +313,7 @@ static int uec_set_mac_if_mode(uec_private_t *uec,
        u32                     maccfg2;
 
        if (!uec) {
-               printf("%s: uec not initial\n", __FUNCTION__);
+               printf("%s: uec not initial\n", __func__);
                return -EINVAL;
        }
 
@@ -329,66 +327,62 @@ static int uec_set_mac_if_mode(uec_private_t *uec,
        upsmr &= ~(UPSMR_RPM | UPSMR_TBIM | UPSMR_R10M | UPSMR_RMM);
 
        switch (speed) {
-               case SPEED_10:
-                       maccfg2 |= MACCFG2_INTERFACE_MODE_NIBBLE;
-                       switch (enet_if_mode) {
-                               case PHY_INTERFACE_MODE_MII:
-                                       break;
-                               case PHY_INTERFACE_MODE_RGMII:
-                                       upsmr |= (UPSMR_RPM | UPSMR_R10M);
-                                       break;
-                               case PHY_INTERFACE_MODE_RMII:
-                                       upsmr |= (UPSMR_R10M | UPSMR_RMM);
-                                       break;
-                               default:
-                                       return -EINVAL;
-                                       break;
-                       }
+       case SPEED_10:
+               maccfg2 |= MACCFG2_INTERFACE_MODE_NIBBLE;
+               switch (enet_if_mode) {
+               case PHY_INTERFACE_MODE_MII:
                        break;
-               case SPEED_100:
-                       maccfg2 |= MACCFG2_INTERFACE_MODE_NIBBLE;
-                       switch (enet_if_mode) {
-                               case PHY_INTERFACE_MODE_MII:
-                                       break;
-                               case PHY_INTERFACE_MODE_RGMII:
-                                       upsmr |= UPSMR_RPM;
-                                       break;
-                               case PHY_INTERFACE_MODE_RMII:
-                                       upsmr |= UPSMR_RMM;
-                                       break;
-                               default:
-                                       return -EINVAL;
-                                       break;
-                       }
+               case PHY_INTERFACE_MODE_RGMII:
+                       upsmr |= (UPSMR_RPM | UPSMR_R10M);
                        break;
-               case SPEED_1000:
-                       maccfg2 |= MACCFG2_INTERFACE_MODE_BYTE;
-                       switch (enet_if_mode) {
-                               case PHY_INTERFACE_MODE_GMII:
-                                       break;
-                               case PHY_INTERFACE_MODE_TBI:
-                                       upsmr |= UPSMR_TBIM;
-                                       break;
-                               case PHY_INTERFACE_MODE_RTBI:
-                                       upsmr |= (UPSMR_RPM | UPSMR_TBIM);
-                                       break;
-                               case PHY_INTERFACE_MODE_RGMII_RXID:
-                               case PHY_INTERFACE_MODE_RGMII_TXID:
-                               case PHY_INTERFACE_MODE_RGMII_ID:
-                               case PHY_INTERFACE_MODE_RGMII:
-                                       upsmr |= UPSMR_RPM;
-                                       break;
-                               case PHY_INTERFACE_MODE_SGMII:
-                                       upsmr |= UPSMR_SGMM;
-                                       break;
-                               default:
-                                       return -EINVAL;
-                                       break;
-                       }
+               case PHY_INTERFACE_MODE_RMII:
+                       upsmr |= (UPSMR_R10M | UPSMR_RMM);
                        break;
                default:
                        return -EINVAL;
+               }
+               break;
+       case SPEED_100:
+               maccfg2 |= MACCFG2_INTERFACE_MODE_NIBBLE;
+               switch (enet_if_mode) {
+               case PHY_INTERFACE_MODE_MII:
+                       break;
+               case PHY_INTERFACE_MODE_RGMII:
+                       upsmr |= UPSMR_RPM;
+                       break;
+               case PHY_INTERFACE_MODE_RMII:
+                       upsmr |= UPSMR_RMM;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+               break;
+       case SPEED_1000:
+               maccfg2 |= MACCFG2_INTERFACE_MODE_BYTE;
+               switch (enet_if_mode) {
+               case PHY_INTERFACE_MODE_GMII:
+                       break;
+               case PHY_INTERFACE_MODE_TBI:
+                       upsmr |= UPSMR_TBIM;
+                       break;
+               case PHY_INTERFACE_MODE_RTBI:
+                       upsmr |= (UPSMR_RPM | UPSMR_TBIM);
+                       break;
+               case PHY_INTERFACE_MODE_RGMII_RXID:
+               case PHY_INTERFACE_MODE_RGMII_TXID:
+               case PHY_INTERFACE_MODE_RGMII_ID:
+               case PHY_INTERFACE_MODE_RGMII:
+                       upsmr |= UPSMR_RPM;
                        break;
+               case PHY_INTERFACE_MODE_SGMII:
+                       upsmr |= UPSMR_SGMM;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+               break;
+       default:
+               return -EINVAL;
        }
 
        out_be32(&uec_regs->maccfg2, maccfg2);
@@ -407,9 +401,10 @@ static int init_mii_management_configuration(uec_mii_t *uec_mii_regs)
        out_be32(&uec_mii_regs->miimcfg, miimcfg);
 
        /* Wait until the bus is free */
-       while ((in_be32(&uec_mii_regs->miimcfg) & MIIMIND_BUSY) && timeout--);
+       while ((in_be32(&uec_mii_regs->miimcfg) & MIIMIND_BUSY) && timeout--)
+               ;
        if (timeout <= 0) {
-               printf("%s: The MII Bus is stuck!", __FUNCTION__);
+               printf("%s: The MII Bus is stuck!", __func__);
                return -ETIMEDOUT;
        }
 
@@ -418,13 +413,13 @@ static int init_mii_management_configuration(uec_mii_t *uec_mii_regs)
 
 static int init_phy(struct eth_device *dev)
 {
-       uec_private_t           *uec;
+       struct uec_priv         *uec;
        uec_mii_t               *umii_regs;
        struct uec_mii_info     *mii_info;
        struct phy_info         *curphy;
        int                     err;
 
-       uec = (uec_private_t *)dev->priv;
+       uec = (struct uec_priv *)dev->priv;
        umii_regs = uec->uec_mii_regs;
 
        uec->oldlink = 0;
@@ -438,11 +433,10 @@ static int init_phy(struct eth_device *dev)
        }
        memset(mii_info, 0, sizeof(*mii_info));
 
-       if (uec->uec_info->uf_info.eth_type == GIGA_ETH) {
+       if (uec->uec_info->uf_info.eth_type == GIGA_ETH)
                mii_info->speed = SPEED_1000;
-       } else {
+       else
                mii_info->speed = SPEED_100;
-       }
 
        mii_info->duplex = DUPLEX_FULL;
        mii_info->pause = 0;
@@ -498,15 +492,14 @@ bus_fail:
 
 static void adjust_link(struct eth_device *dev)
 {
-       uec_private_t           *uec = (uec_private_t *)dev->priv;
+       struct uec_priv         *uec = (struct uec_priv *)dev->priv;
        struct uec_mii_info     *mii_info = uec->mii_info;
 
-       extern void change_phy_interface_mode(struct eth_device *dev,
-                                phy_interface_t mode, int speed);
-
        if (mii_info->link) {
-               /* Now we make sure that we can be in full duplex mode.
-               * If not, we operate in half-duplex mode. */
+               /*
+                * Now we make sure that we can be in full duplex mode.
+                * If not, we operate in half-duplex mode.
+                */
                if (mii_info->duplex != uec->oldduplex) {
                        if (!(mii_info->duplex)) {
                                uec_set_mac_duplex(uec, DUPLEX_HALF);
@@ -526,16 +519,16 @@ static void adjust_link(struct eth_device *dev)
                                case SPEED_1000:
                                        break;
                                case SPEED_100:
-                                       printf ("switching to rgmii 100\n");
+                                       printf("switching to rgmii 100\n");
                                        mode = PHY_INTERFACE_MODE_RGMII;
                                        break;
                                case SPEED_10:
-                                       printf ("switching to rgmii 10\n");
+                                       printf("switching to rgmii 10\n");
                                        mode = PHY_INTERFACE_MODE_RGMII;
                                        break;
                                default:
                                        printf("%s: Ack,Speed(%d)is illegal\n",
-                                               dev->name, mii_info->speed);
+                                              dev->name, mii_info->speed);
                                        break;
                                }
                        }
@@ -566,12 +559,12 @@ static void adjust_link(struct eth_device *dev)
 
 static void phy_change(struct eth_device *dev)
 {
-       uec_private_t   *uec = (uec_private_t *)dev->priv;
+       struct uec_priv *uec = (struct uec_priv *)dev->priv;
 
 #if defined(CONFIG_ARCH_P1021) || defined(CONFIG_ARCH_P1025)
        ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
 
-       /* QE9 and QE12 need to be set for enabling QE MII managment signals */
+       /* QE9 and QE12 need to be set for enabling QE MII management signals */
        setbits_be32(&gur->pmuxcr, MPC85xx_PMUXCR_QE9);
        setbits_be32(&gur->pmuxcr, MPC85xx_PMUXCR_QE12);
 #endif
@@ -604,14 +597,14 @@ static int uec_miiphy_find_dev_by_name(const char *devname)
        int i;
 
        for (i = 0; i < MAXCONTROLLERS; i++) {
-               if (strncmp(devname, devlist[i]->name, strlen(devname)) == 0) {
+               if (strncmp(devname, devlist[i]->name, strlen(devname)) == 0)
                        break;
-               }
        }
 
        /* If device cannot be found, returns -1 */
        if (i == MAXCONTROLLERS) {
-               debug ("%s: device %s not found in devlist\n", __FUNCTION__, devname);
+               debug("%s: device %s not found in devlist\n", __func__,
+                     devname);
                i = -1;
        }
 
@@ -629,13 +622,12 @@ static int uec_miiphy_read(struct mii_dev *bus, int addr, int devad, int reg)
        unsigned short value = 0;
        int devindex = 0;
 
-       if (bus->name == NULL) {
-               debug("%s: NULL pointer given\n", __FUNCTION__);
+       if (!bus->name) {
+               debug("%s: NULL pointer given\n", __func__);
        } else {
                devindex = uec_miiphy_find_dev_by_name(bus->name);
-               if (devindex >= 0) {
+               if (devindex >= 0)
                        value = uec_read_phy_reg(devlist[devindex], addr, reg);
-               }
        }
        return value;
 }
@@ -651,36 +643,37 @@ static int uec_miiphy_write(struct mii_dev *bus, int addr, int devad, int reg,
 {
        int devindex = 0;
 
-       if (bus->name == NULL) {
-               debug("%s: NULL pointer given\n", __FUNCTION__);
+       if (!bus->name) {
+               debug("%s: NULL pointer given\n", __func__);
        } else {
                devindex = uec_miiphy_find_dev_by_name(bus->name);
-               if (devindex >= 0) {
+               if (devindex >= 0)
                        uec_write_phy_reg(devlist[devindex], addr, reg, value);
-               }
        }
        return 0;
 }
 #endif
 
-static int uec_set_mac_address(uec_private_t *uec, u8 *mac_addr)
+static int uec_set_mac_address(struct uec_priv *uec, u8 *mac_addr)
 {
        uec_t           *uec_regs;
        u32             mac_addr1;
        u32             mac_addr2;
 
        if (!uec) {
-               printf("%s: uec not initial\n", __FUNCTION__);
+               printf("%s: uec not initial\n", __func__);
                return -EINVAL;
        }
 
        uec_regs = uec->uec_regs;
 
-       /* if a station address of 0x12345678ABCD, perform a write to
-       MACSTNADDR1 of 0xCDAB7856,
-       MACSTNADDR2 of 0x34120000 */
+       /*
+        * if a station address of 0x12345678ABCD, perform a write to
+        * MACSTNADDR1 of 0xCDAB7856,
+        * MACSTNADDR2 of 0x34120000
+        */
 
-       mac_addr1 = (mac_addr[5] << 24) | (mac_addr[4] << 16) | \
+       mac_addr1 = (mac_addr[5] << 24) | (mac_addr[4] << 16) |
                        (mac_addr[3] << 8)  | (mac_addr[2]);
        out_be32(&uec_regs->macstnaddr1, mac_addr1);
 
@@ -690,31 +683,31 @@ static int uec_set_mac_address(uec_private_t *uec, u8 *mac_addr)
        return 0;
 }
 
-static int uec_convert_threads_num(uec_num_of_threads_e threads_num,
-                                        int *threads_num_ret)
+static int uec_convert_threads_num(enum uec_num_of_threads threads_num,
+                                  int *threads_num_ret)
 {
        int     num_threads_numerica;
 
        switch (threads_num) {
-               case UEC_NUM_OF_THREADS_1:
-                       num_threads_numerica = 1;
-                       break;
-               case UEC_NUM_OF_THREADS_2:
-                       num_threads_numerica = 2;
-                       break;
-               case UEC_NUM_OF_THREADS_4:
-                       num_threads_numerica = 4;
-                       break;
-               case UEC_NUM_OF_THREADS_6:
-                       num_threads_numerica = 6;
-                       break;
-               case UEC_NUM_OF_THREADS_8:
-                       num_threads_numerica = 8;
-                       break;
-               default:
-                       printf("%s: Bad number of threads value.",
-                                __FUNCTION__);
-                       return -EINVAL;
+       case UEC_NUM_OF_THREADS_1:
+               num_threads_numerica = 1;
+               break;
+       case UEC_NUM_OF_THREADS_2:
+               num_threads_numerica = 2;
+               break;
+       case UEC_NUM_OF_THREADS_4:
+               num_threads_numerica = 4;
+               break;
+       case UEC_NUM_OF_THREADS_6:
+               num_threads_numerica = 6;
+               break;
+       case UEC_NUM_OF_THREADS_8:
+               num_threads_numerica = 8;
+               break;
+       default:
+               printf("%s: Bad number of threads value.",
+                      __func__);
+               return -EINVAL;
        }
 
        *threads_num_ret = num_threads_numerica;
@@ -722,9 +715,9 @@ static int uec_convert_threads_num(uec_num_of_threads_e threads_num,
        return 0;
 }
 
-static void uec_init_tx_parameter(uec_private_t *uec, int num_threads_tx)
+static void uec_init_tx_parameter(struct uec_priv *uec, int num_threads_tx)
 {
-       uec_info_t      *uec_info;
+       struct uec_inf  *uec_info;
        u32             end_bd;
        u8              bmrx = 0;
        int             i;
@@ -732,14 +725,14 @@ static void uec_init_tx_parameter(uec_private_t *uec, int num_threads_tx)
        uec_info = uec->uec_info;
 
        /* Alloc global Tx parameter RAM page */
-       uec->tx_glbl_pram_offset = qe_muram_alloc(
-                               sizeof(uec_tx_global_pram_t),
-                                UEC_TX_GLOBAL_PRAM_ALIGNMENT);
-       uec->p_tx_glbl_pram = (uec_tx_global_pram_t *)
+       uec->tx_glbl_pram_offset =
+               qe_muram_alloc(sizeof(struct uec_tx_global_pram),
+                              UEC_TX_GLOBAL_PRAM_ALIGNMENT);
+       uec->p_tx_glbl_pram = (struct uec_tx_global_pram *)
                                qe_muram_addr(uec->tx_glbl_pram_offset);
 
        /* Zero the global Tx prameter RAM */
-       memset(uec->p_tx_glbl_pram, 0, sizeof(uec_tx_global_pram_t));
+       memset(uec->p_tx_glbl_pram, 0, sizeof(struct uec_tx_global_pram));
 
        /* Init global Tx parameter RAM */
 
@@ -747,10 +740,10 @@ static void uec_init_tx_parameter(uec_private_t *uec, int num_threads_tx)
        out_be16(&uec->p_tx_glbl_pram->temoder, TEMODER_INIT_VALUE);
 
        /* SQPTR */
-       uec->send_q_mem_reg_offset = qe_muram_alloc(
-                               sizeof(uec_send_queue_qd_t),
-                                UEC_SEND_QUEUE_QUEUE_DESCRIPTOR_ALIGNMENT);
-       uec->p_send_q_mem_reg = (uec_send_queue_mem_region_t *)
+       uec->send_q_mem_reg_offset =
+               qe_muram_alloc(sizeof(struct uec_send_queue_qd),
+                              UEC_SEND_QUEUE_QUEUE_DESCRIPTOR_ALIGNMENT);
+       uec->p_send_q_mem_reg = (struct uec_send_queue_mem_region *)
                                qe_muram_addr(uec->send_q_mem_reg_offset);
        out_be32(&uec->p_tx_glbl_pram->sqptr, uec->send_q_mem_reg_offset);
 
@@ -758,9 +751,9 @@ static void uec_init_tx_parameter(uec_private_t *uec, int num_threads_tx)
        end_bd = (u32)uec->p_tx_bd_ring + (uec_info->tx_bd_ring_len - 1)
                                         * SIZEOFBD;
        out_be32(&uec->p_send_q_mem_reg->sqqd[0].bd_ring_base,
-                                (u32)(uec->p_tx_bd_ring));
+                (u32)(uec->p_tx_bd_ring));
        out_be32(&uec->p_send_q_mem_reg->sqqd[0].last_bd_completed_address,
-                                                end_bd);
+                end_bd);
 
        /* Scheduler Base Pointer, we have only one Tx queue, no need it */
        out_be32(&uec->p_tx_glbl_pram->schedulerbasepointer, 0);
@@ -773,54 +766,57 @@ static void uec_init_tx_parameter(uec_private_t *uec, int num_threads_tx)
        out_be32(&uec->p_tx_glbl_pram->tstate, ((u32)(bmrx) << BMR_SHIFT));
 
        /* IPH_Offset */
-       for (i = 0; i < MAX_IPH_OFFSET_ENTRY; i++) {
+       for (i = 0; i < MAX_IPH_OFFSET_ENTRY; i++)
                out_8(&uec->p_tx_glbl_pram->iphoffset[i], 0);
-       }
 
        /* VTAG table */
-       for (i = 0; i < UEC_TX_VTAG_TABLE_ENTRY_MAX; i++) {
+       for (i = 0; i < UEC_TX_VTAG_TABLE_ENTRY_MAX; i++)
                out_be32(&uec->p_tx_glbl_pram->vtagtable[i], 0);
-       }
 
        /* TQPTR */
-       uec->thread_dat_tx_offset = qe_muram_alloc(
-               num_threads_tx * sizeof(uec_thread_data_tx_t) +
-                32 *(num_threads_tx == 1), UEC_THREAD_DATA_ALIGNMENT);
+       uec->thread_dat_tx_offset =
+               qe_muram_alloc(num_threads_tx *
+                              sizeof(struct uec_thread_data_tx) +
+                              32 * (num_threads_tx == 1),
+                              UEC_THREAD_DATA_ALIGNMENT);
 
-       uec->p_thread_data_tx = (uec_thread_data_tx_t *)
+       uec->p_thread_data_tx = (struct uec_thread_data_tx *)
                                qe_muram_addr(uec->thread_dat_tx_offset);
        out_be32(&uec->p_tx_glbl_pram->tqptr, uec->thread_dat_tx_offset);
 }
 
-static void uec_init_rx_parameter(uec_private_t *uec, int num_threads_rx)
+static void uec_init_rx_parameter(struct uec_priv *uec, int num_threads_rx)
 {
        u8      bmrx = 0;
        int     i;
-       uec_82xx_address_filtering_pram_t       *p_af_pram;
+       struct uec_82xx_add_filtering_pram      *p_af_pram;
 
        /* Allocate global Rx parameter RAM page */
-       uec->rx_glbl_pram_offset = qe_muram_alloc(
-               sizeof(uec_rx_global_pram_t), UEC_RX_GLOBAL_PRAM_ALIGNMENT);
-       uec->p_rx_glbl_pram = (uec_rx_global_pram_t *)
+       uec->rx_glbl_pram_offset =
+               qe_muram_alloc(sizeof(struct uec_rx_global_pram),
+                              UEC_RX_GLOBAL_PRAM_ALIGNMENT);
+       uec->p_rx_glbl_pram = (struct uec_rx_global_pram *)
                                qe_muram_addr(uec->rx_glbl_pram_offset);
 
        /* Zero Global Rx parameter RAM */
-       memset(uec->p_rx_glbl_pram, 0, sizeof(uec_rx_global_pram_t));
+       memset(uec->p_rx_glbl_pram, 0, sizeof(struct uec_rx_global_pram));
 
        /* Init global Rx parameter RAM */
-       /* REMODER, Extended feature mode disable, VLAN disable,
-        LossLess flow control disable, Receive firmware statisic disable,
-        Extended address parsing mode disable, One Rx queues,
-        Dynamic maximum/minimum frame length disable, IP checksum check
-        disable, IP address alignment disable
-       */
+       /*
+        * REMODER, Extended feature mode disable, VLAN disable,
+        * LossLess flow control disable, Receive firmware statisic disable,
+        * Extended address parsing mode disable, One Rx queues,
+        * Dynamic maximum/minimum frame length disable, IP checksum check
+        * disable, IP address alignment disable
+        */
        out_be32(&uec->p_rx_glbl_pram->remoder, REMODER_INIT_VALUE);
 
        /* RQPTR */
-       uec->thread_dat_rx_offset = qe_muram_alloc(
-                       num_threads_rx * sizeof(uec_thread_data_rx_t),
-                        UEC_THREAD_DATA_ALIGNMENT);
-       uec->p_thread_data_rx = (uec_thread_data_rx_t *)
+       uec->thread_dat_rx_offset =
+               qe_muram_alloc(num_threads_rx *
+                              sizeof(struct uec_thread_data_rx),
+                              UEC_THREAD_DATA_ALIGNMENT);
+       uec->p_thread_data_rx = (struct uec_thread_data_rx *)
                                qe_muram_addr(uec->thread_dat_rx_offset);
        out_be32(&uec->p_rx_glbl_pram->rqptr, uec->thread_dat_rx_offset);
 
@@ -841,16 +837,16 @@ static void uec_init_rx_parameter(uec_private_t *uec, int num_threads_rx)
        out_be16(&uec->p_rx_glbl_pram->mrblr, MAX_RXBUF_LEN);
 
        /* RBDQPTR */
-       uec->rx_bd_qs_tbl_offset = qe_muram_alloc(
-                               sizeof(uec_rx_bd_queues_entry_t) + \
-                               sizeof(uec_rx_prefetched_bds_t),
-                                UEC_RX_BD_QUEUES_ALIGNMENT);
-       uec->p_rx_bd_qs_tbl = (uec_rx_bd_queues_entry_t *)
+       uec->rx_bd_qs_tbl_offset =
+               qe_muram_alloc(sizeof(struct uec_rx_bd_queues_entry) +
+                              sizeof(struct uec_rx_pref_bds),
+                              UEC_RX_BD_QUEUES_ALIGNMENT);
+       uec->p_rx_bd_qs_tbl = (struct uec_rx_bd_queues_entry *)
                                qe_muram_addr(uec->rx_bd_qs_tbl_offset);
 
        /* Zero it */
-       memset(uec->p_rx_bd_qs_tbl, 0, sizeof(uec_rx_bd_queues_entry_t) + \
-                                       sizeof(uec_rx_prefetched_bds_t));
+       memset(uec->p_rx_bd_qs_tbl, 0, sizeof(struct uec_rx_bd_queues_entry) +
+              sizeof(struct uec_rx_pref_bds));
        out_be32(&uec->p_rx_glbl_pram->rbdqptr, uec->rx_bd_qs_tbl_offset);
        out_be32(&uec->p_rx_bd_qs_tbl->externalbdbaseptr,
                 (u32)uec->p_rx_bd_ring);
@@ -868,9 +864,8 @@ static void uec_init_rx_parameter(uec_private_t *uec, int num_threads_rx)
        /* L2QT */
        out_be32(&uec->p_rx_glbl_pram->l2qt, 0);
        /* L3QT */
-       for (i = 0; i < 8; i++) {
+       for (i = 0; i < 8; i++)
                out_be32(&uec->p_rx_glbl_pram->l3qt[i], 0);
-       }
 
        /* VLAN_TYPE */
        out_be16(&uec->p_rx_glbl_pram->vlantype, 0x8100);
@@ -878,7 +873,7 @@ static void uec_init_rx_parameter(uec_private_t *uec, int num_threads_rx)
        out_be16(&uec->p_rx_glbl_pram->vlantci, 0);
 
        /* Clear PQ2 style address filtering hash table */
-       p_af_pram = (uec_82xx_address_filtering_pram_t *) \
+       p_af_pram = (struct uec_82xx_add_filtering_pram *)
                        uec->p_rx_glbl_pram->addressfiltering;
 
        p_af_pram->iaddr_h = 0;
@@ -887,30 +882,33 @@ static void uec_init_rx_parameter(uec_private_t *uec, int num_threads_rx)
        p_af_pram->gaddr_l = 0;
 }
 
-static int uec_issue_init_enet_rxtx_cmd(uec_private_t *uec,
-                                        int thread_tx, int thread_rx)
+static int uec_issue_init_enet_rxtx_cmd(struct uec_priv *uec,
+                                       int thread_tx, int thread_rx)
 {
-       uec_init_cmd_pram_t             *p_init_enet_param;
+       struct uec_init_cmd_pram                *p_init_enet_param;
        u32                             init_enet_param_offset;
-       uec_info_t                      *uec_info;
+       struct uec_inf                  *uec_info;
+       struct ucc_fast_inf                     *uf_info;
        int                             i;
        int                             snum;
-       u32                             init_enet_offset;
+       u32                             off;
        u32                             entry_val;
        u32                             command;
        u32                             cecr_subblock;
 
        uec_info = uec->uec_info;
+       uf_info = &uec_info->uf_info;
 
        /* Allocate init enet command parameter */
-       uec->init_enet_param_offset = qe_muram_alloc(
-                                       sizeof(uec_init_cmd_pram_t), 4);
+       uec->init_enet_param_offset =
+               qe_muram_alloc(sizeof(struct uec_init_cmd_pram), 4);
        init_enet_param_offset = uec->init_enet_param_offset;
-       uec->p_init_enet_param = (uec_init_cmd_pram_t *)
+       uec->p_init_enet_param = (struct uec_init_cmd_pram *)
                                qe_muram_addr(uec->init_enet_param_offset);
 
        /* Zero init enet command struct */
-       memset((void *)uec->p_init_enet_param, 0, sizeof(uec_init_cmd_pram_t));
+       memset((void *)uec->p_init_enet_param, 0,
+              sizeof(struct uec_init_cmd_pram));
 
        /* Init the command struct */
        p_init_enet_param = uec->p_init_enet_param;
@@ -932,21 +930,21 @@ static int uec_issue_init_enet_rxtx_cmd(uec_private_t *uec,
 
        /* Init Rx threads */
        for (i = 0; i < (thread_rx + 1); i++) {
-               if ((snum = qe_get_snum()) < 0) {
-                       printf("%s can not get snum\n", __FUNCTION__);
+               snum = qe_get_snum();
+               if (snum < 0) {
+                       printf("%s can not get snum\n", __func__);
                        return -ENOMEM;
                }
 
-               if (i==0) {
-                       init_enet_offset = 0;
+               if (i == 0) {
+                       off = 0;
                } else {
-                       init_enet_offset = qe_muram_alloc(
-                                       sizeof(uec_thread_rx_pram_t),
-                                        UEC_THREAD_RX_PRAM_ALIGNMENT);
+                       off = qe_muram_alloc(sizeof(struct uec_thread_rx_pram),
+                                            UEC_THREAD_RX_PRAM_ALIGNMENT);
                }
 
                entry_val = ((u32)snum << ENET_INIT_PARAM_SNUM_SHIFT) |
-                                init_enet_offset | (u32)uec_info->risc_rx;
+                                off | (u32)uec_info->risc_rx;
                p_init_enet_param->rxthread[i] = entry_val;
        }
 
@@ -956,16 +954,17 @@ static int uec_issue_init_enet_rxtx_cmd(uec_private_t *uec,
 
        /* Init Tx threads */
        for (i = 0; i < thread_tx; i++) {
-               if ((snum = qe_get_snum()) < 0) {
-                       printf("%s can not get snum\n", __FUNCTION__);
+               snum = qe_get_snum();
+               if (snum  < 0)  {
+                       printf("%s can not get snum\n", __func__);
                        return -ENOMEM;
                }
 
-               init_enet_offset = qe_muram_alloc(sizeof(uec_thread_tx_pram_t),
-                                                UEC_THREAD_TX_PRAM_ALIGNMENT);
+               off = qe_muram_alloc(sizeof(struct uec_thread_tx_pram),
+                                    UEC_THREAD_TX_PRAM_ALIGNMENT);
 
                entry_val = ((u32)snum << ENET_INIT_PARAM_SNUM_SHIFT) |
-                                init_enet_offset | (u32)uec_info->risc_tx;
+                                off | (u32)uec_info->risc_tx;
                p_init_enet_param->txthread[i] = entry_val;
        }
 
@@ -973,19 +972,18 @@ static int uec_issue_init_enet_rxtx_cmd(uec_private_t *uec,
 
        /* Issue QE command */
        command = QE_INIT_TX_RX;
-       cecr_subblock = ucc_fast_get_qe_cr_subblock(
-                               uec->uec_info->uf_info.ucc_num);
-       qe_issue_cmd(command, cecr_subblock, (u8) QE_CR_PROTOCOL_ETHERNET,
-                                                init_enet_param_offset);
+       cecr_subblock = ucc_fast_get_qe_cr_subblock(uf_info->ucc_num);
+       qe_issue_cmd(command, cecr_subblock, (u8)QE_CR_PROTOCOL_ETHERNET,
+                    init_enet_param_offset);
 
        return 0;
 }
 
-static int uec_startup(uec_private_t *uec)
+static int uec_startup(struct uec_priv *uec)
 {
-       uec_info_t                      *uec_info;
-       ucc_fast_info_t                 *uf_info;
-       ucc_fast_private_t              *uccf;
+       struct uec_inf                  *uec_info;
+       struct ucc_fast_inf             *uf_info;
+       struct ucc_fast_priv            *uccf;
        ucc_fast_t                      *uf_regs;
        uec_t                           *uec_regs;
        int                             num_threads_tx;
@@ -993,37 +991,37 @@ static int uec_startup(uec_private_t *uec)
        u32                             utbipar;
        u32                             length;
        u32                             align;
-       qe_bd_t                         *bd;
+       struct buffer_descriptor        *bd;
        u8                              *buf;
        int                             i;
 
        if (!uec || !uec->uec_info) {
-               printf("%s: uec or uec_info not initial\n", __FUNCTION__);
+               printf("%s: uec or uec_info not initial\n", __func__);
                return -EINVAL;
        }
 
        uec_info = uec->uec_info;
-       uf_info = &(uec_info->uf_info);
+       uf_info = &uec_info->uf_info;
 
        /* Check if Rx BD ring len is illegal */
-       if ((uec_info->rx_bd_ring_len < UEC_RX_BD_RING_SIZE_MIN) || \
-               (uec_info->rx_bd_ring_len % UEC_RX_BD_RING_SIZE_ALIGNMENT)) {
+       if (uec_info->rx_bd_ring_len < UEC_RX_BD_RING_SIZE_MIN ||
+           (uec_info->rx_bd_ring_len % UEC_RX_BD_RING_SIZE_ALIGNMENT)) {
                printf("%s: Rx BD ring len must be multiple of 4, and > 8.\n",
-                        __FUNCTION__);
+                      __func__);
                return -EINVAL;
        }
 
        /* Check if Tx BD ring len is illegal */
        if (uec_info->tx_bd_ring_len < UEC_TX_BD_RING_SIZE_MIN) {
                printf("%s: Tx BD ring length must not be smaller than 2.\n",
-                        __FUNCTION__);
+                      __func__);
                return -EINVAL;
        }
 
        /* Check if MRBLR is illegal */
-       if ((MAX_RXBUF_LEN == 0) || (MAX_RXBUF_LEN  % UEC_MRBLR_ALIGNMENT)) {
+       if (MAX_RXBUF_LEN == 0 || MAX_RXBUF_LEN  % UEC_MRBLR_ALIGNMENT) {
                printf("%s: max rx buffer length must be mutliple of 128.\n",
-                        __FUNCTION__);
+                      __func__);
                return -EINVAL;
        }
 
@@ -1033,7 +1031,7 @@ static int uec_startup(uec_private_t *uec)
 
        /* Init UCC fast */
        if (ucc_fast_init(uf_info, &uccf)) {
-               printf("%s: failed to init ucc fast\n", __FUNCTION__);
+               printf("%s: failed to init ucc fast\n", __func__);
                return -ENOMEM;
        }
 
@@ -1042,13 +1040,13 @@ static int uec_startup(uec_private_t *uec)
 
        /* Convert the Tx threads number */
        if (uec_convert_threads_num(uec_info->num_threads_tx,
-                                        &num_threads_tx)) {
+                                   &num_threads_tx)) {
                return -EINVAL;
        }
 
        /* Convert the Rx threads number */
        if (uec_convert_threads_num(uec_info->num_threads_rx,
-                                        &num_threads_rx)) {
+                                   &num_threads_rx)) {
                return -EINVAL;
        }
 
@@ -1070,13 +1068,14 @@ static int uec_startup(uec_private_t *uec)
        out_be32(&uec_regs->maccfg2, MACCFG2_INIT_VALUE);
 
        /* Setup MAC interface mode */
-       uec_set_mac_if_mode(uec, uec_info->enet_interface_type, uec_info->speed);
+       uec_set_mac_if_mode(uec, uec_info->enet_interface_type,
+                           uec_info->speed);
 
        /* Setup MII management base */
 #ifndef CONFIG_eTSEC_MDIO_BUS
        uec->uec_mii_regs = (uec_mii_t *)(&uec_regs->miimcfg);
 #else
-       uec->uec_mii_regs = (uec_mii_t *) CONFIG_MIIM_ADDRESS;
+       uec->uec_mii_regs = (uec_mii_t *)CONFIG_MIIM_ADDRESS;
 #endif
 
        /* Setup MII master clock source */
@@ -1093,16 +1092,16 @@ static int uec_startup(uec_private_t *uec)
        out_be32(&uec_regs->utbipar, utbipar);
 
        /* Configure the TBI for SGMII operation */
-       if ((uec->uec_info->enet_interface_type == PHY_INTERFACE_MODE_SGMII) &&
-          (uec->uec_info->speed == SPEED_1000)) {
+       if (uec->uec_info->enet_interface_type == PHY_INTERFACE_MODE_SGMII &&
+           uec->uec_info->speed == SPEED_1000) {
                uec_write_phy_reg(uec->dev, uec_regs->utbipar,
-                       ENET_TBI_MII_ANA, TBIANA_SETTINGS);
+                                 ENET_TBI_MII_ANA, TBIANA_SETTINGS);
 
                uec_write_phy_reg(uec->dev, uec_regs->utbipar,
-                       ENET_TBI_MII_TBICON, TBICON_CLK_SELECT);
+                                 ENET_TBI_MII_TBICON, TBICON_CLK_SELECT);
 
                uec_write_phy_reg(uec->dev, uec_regs->utbipar,
-                       ENET_TBI_MII_CR, TBICR_SETTINGS);
+                                 ENET_TBI_MII_CR, TBICR_SETTINGS);
        }
 
        /* Allocate Tx BDs */
@@ -1149,29 +1148,29 @@ static int uec_startup(uec_private_t *uec)
        memset((void *)(uec->rx_buf_offset), 0, length + align);
 
        /* Init TxBD ring */
-       bd = (qe_bd_t *)uec->p_tx_bd_ring;
-       uec->txBd = bd;
+       bd = (struct buffer_descriptor *)uec->p_tx_bd_ring;
+       uec->tx_bd = bd;
 
        for (i = 0; i < uec_info->tx_bd_ring_len; i++) {
                BD_DATA_CLEAR(bd);
                BD_STATUS_SET(bd, 0);
                BD_LENGTH_SET(bd, 0);
-               bd ++;
+               bd++;
        }
-       BD_STATUS_SET((--bd), TxBD_WRAP);
+       BD_STATUS_SET((--bd), TX_BD_WRAP);
 
        /* Init RxBD ring */
-       bd = (qe_bd_t *)uec->p_rx_bd_ring;
-       uec->rxBd = bd;
+       bd = (struct buffer_descriptor *)uec->p_rx_bd_ring;
+       uec->rx_bd = bd;
        buf = uec->p_rx_buf;
        for (i = 0; i < uec_info->rx_bd_ring_len; i++) {
                BD_DATA_SET(bd, buf);
                BD_LENGTH_SET(bd, 0);
-               BD_STATUS_SET(bd, RxBD_EMPTY);
+               BD_STATUS_SET(bd, RX_BD_EMPTY);
                buf += MAX_RXBUF_LEN;
-               bd ++;
+               bd++;
        }
-       BD_STATUS_SET((--bd), RxBD_WRAP | RxBD_EMPTY);
+       BD_STATUS_SET((--bd), RX_BD_WRAP | RX_BD_EMPTY);
 
        /* Init global Tx parameter RAM */
        uec_init_tx_parameter(uec, num_threads_tx);
@@ -1182,29 +1181,32 @@ static int uec_startup(uec_private_t *uec)
        /* Init ethernet Tx and Rx parameter command */
        if (uec_issue_init_enet_rxtx_cmd(uec, num_threads_tx,
                                         num_threads_rx)) {
-               printf("%s issue init enet cmd failed\n", __FUNCTION__);
+               printf("%s issue init enet cmd failed\n", __func__);
                return -ENOMEM;
        }
 
        return 0;
 }
 
-static int uec_init(struct eth_devicedev, struct bd_info *bd)
+static int uec_init(struct eth_device *dev, struct bd_info *bd)
 {
-       uec_private_t           *uec;
+       struct uec_priv         *uec;
        int                     err, i;
        struct phy_info         *curphy;
 #if defined(CONFIG_ARCH_P1021) || defined(CONFIG_ARCH_P1025)
        ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
 #endif
 
-       uec = (uec_private_t *)dev->priv;
+       uec = (struct uec_priv *)dev->priv;
 
-       if (uec->the_first_run == 0) {
+       if (!uec->the_first_run) {
 #if defined(CONFIG_ARCH_P1021) || defined(CONFIG_ARCH_P1025)
-       /* QE9 and QE12 need to be set for enabling QE MII managment signals */
-       setbits_be32(&gur->pmuxcr, MPC85xx_PMUXCR_QE9);
-       setbits_be32(&gur->pmuxcr, MPC85xx_PMUXCR_QE12);
+               /*
+                * QE9 and QE12 need to be set for enabling QE MII
+                * management signals
+                */
+               setbits_be32(&gur->pmuxcr, MPC85xx_PMUXCR_QE9);
+               setbits_be32(&gur->pmuxcr, MPC85xx_PMUXCR_QE12);
 #endif
 
                err = init_phy(dev);
@@ -1230,7 +1232,7 @@ static int uec_init(struct eth_device* dev, struct bd_info *bd)
                        err = curphy->read_status(uec->mii_info);
                        if (!(((i-- > 0) && !uec->mii_info->link) || err))
                                break;
-                       udelay(100000);
+                       mdelay(100);
                } while (1);
 
 #if defined(CONFIG_ARCH_P1021) || defined(CONFIG_ARCH_P1025)
@@ -1248,12 +1250,11 @@ static int uec_init(struct eth_device* dev, struct bd_info *bd)
        /* Set up the MAC address */
        if (dev->enetaddr[0] & 0x01) {
                printf("%s: MacAddress is multcast address\n",
-                        __FUNCTION__);
+                      __func__);
                return -1;
        }
        uec_set_mac_address(uec, dev->enetaddr);
 
-
        err = uec_open(uec, COMM_DIR_RX_AND_TX);
        if (err) {
                printf("%s: cannot enable UEC device\n", dev->name);
@@ -1262,30 +1263,31 @@ static int uec_init(struct eth_device* dev, struct bd_info *bd)
 
        phy_change(dev);
 
-       return (uec->mii_info->link ? 0 : -1);
+       return uec->mii_info->link ? 0 : -1;
 }
 
-static void uec_halt(struct eth_devicedev)
+static void uec_halt(struct eth_device *dev)
 {
-       uec_private_t   *uec = (uec_private_t *)dev->priv;
+       struct uec_priv *uec = (struct uec_priv *)dev->priv;
+
        uec_stop(uec, COMM_DIR_RX_AND_TX);
 }
 
 static int uec_send(struct eth_device *dev, void *buf, int len)
 {
-       uec_private_t           *uec;
-       ucc_fast_private_t      *uccf;
-       volatile qe_bd_t        *bd;
+       struct uec_priv         *uec;
+       struct ucc_fast_priv    *uccf;
+       struct buffer_descriptor        *bd;
        u16                     status;
        int                     i;
        int                     result = 0;
 
-       uec = (uec_private_t *)dev->priv;
+       uec = (struct uec_priv *)dev->priv;
        uccf = uec->uccf;
-       bd = uec->txBd;
+       bd = uec->tx_bd;
 
        /* Find an empty TxBD */
-       for (i = 0; bd->status & TxBD_READY; i++) {
+       for (i = 0; BD_STATUS(bd) & TX_BD_READY; i++) {
                if (i > 0x100000) {
                        printf("%s: tx buffer not ready\n", dev->name);
                        return result;
@@ -1295,16 +1297,16 @@ static int uec_send(struct eth_device *dev, void *buf, int len)
        /* Init TxBD */
        BD_DATA_SET(bd, buf);
        BD_LENGTH_SET(bd, len);
-       status = bd->status;
+       status = BD_STATUS(bd);
        status &= BD_WRAP;
-       status |= (TxBD_READY | TxBD_LAST);
+       status |= (TX_BD_READY | TX_BD_LAST);
        BD_STATUS_SET(bd, status);
 
        /* Tell UCC to transmit the buffer */
        ucc_fast_transmit_on_demand(uccf);
 
        /* Wait for buffer to be transmitted */
-       for (i = 0; bd->status & TxBD_READY; i++) {
+       for (i = 0; BD_STATUS(bd) & TX_BD_READY; i++) {
                if (i > 0x100000) {
                        printf("%s: tx error\n", dev->name);
                        return result;
@@ -1313,25 +1315,25 @@ static int uec_send(struct eth_device *dev, void *buf, int len)
 
        /* Ok, the buffer be transimitted */
        BD_ADVANCE(bd, status, uec->p_tx_bd_ring);
-       uec->txBd = bd;
+       uec->tx_bd = bd;
        result = 1;
 
        return result;
 }
 
-static int uec_recv(struct eth_devicedev)
+static int uec_recv(struct eth_device *dev)
 {
-       uec_private_t           *uec = dev->priv;
-       volatile qe_bd_t        *bd;
+       struct uec_priv         *uec = dev->priv;
+       struct buffer_descriptor        *bd;
        u16                     status;
        u16                     len;
        u8                      *data;
 
-       bd = uec->rxBd;
-       status = bd->status;
+       bd = uec->rx_bd;
+       status = BD_STATUS(bd);
 
-       while (!(status & RxBD_EMPTY)) {
-               if (!(status & RxBD_ERROR)) {
+       while (!(status & RX_BD_EMPTY)) {
+               if (!(status & RX_BD_ERROR)) {
                        data = BD_DATA(bd);
                        len = BD_LENGTH(bd);
                        net_process_received_packet(data, len);
@@ -1340,20 +1342,20 @@ static int uec_recv(struct eth_device* dev)
                }
                status &= BD_CLEAN;
                BD_LENGTH_SET(bd, 0);
-               BD_STATUS_SET(bd, status | RxBD_EMPTY);
+               BD_STATUS_SET(bd, status | RX_BD_EMPTY);
                BD_ADVANCE(bd, status, uec->p_rx_bd_ring);
-               status = bd->status;
+               status = BD_STATUS(bd);
        }
-       uec->rxBd = bd;
+       uec->rx_bd = bd;
 
        return 1;
 }
 
-int uec_initialize(struct bd_info *bis, uec_info_t *uec_info)
+int uec_initialize(struct bd_info *bis, struct uec_inf *uec_info)
 {
        struct eth_device       *dev;
        int                     i;
-       uec_private_t           *uec;
+       struct uec_priv         *uec;
        int                     err;
 
        dev = (struct eth_device *)malloc(sizeof(struct eth_device));
@@ -1362,11 +1364,11 @@ int uec_initialize(struct bd_info *bis, uec_info_t *uec_info)
        memset(dev, 0, sizeof(struct eth_device));
 
        /* Allocate the UEC private struct */
-       uec = (uec_private_t *)malloc(sizeof(uec_private_t));
-       if (!uec) {
+       uec = (struct uec_priv *)malloc(sizeof(struct uec_priv));
+       if (!uec)
                return -ENOMEM;
-       }
-       memset(uec, 0, sizeof(uec_private_t));
+
+       memset(uec, 0, sizeof(struct uec_priv));
 
        /* Adjust uec_info */
 #if (MAX_QE_RISC == 4)
@@ -1395,13 +1397,14 @@ int uec_initialize(struct bd_info *bis, uec_info_t *uec_info)
 
        err = uec_startup(uec);
        if (err) {
-               printf("%s: Cannot configure net device, aborting.",dev->name);
+               printf("%s: Cannot configure net device, aborting.", dev->name);
                return err;
        }
 
 #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
        int retval;
        struct mii_dev *mdiodev = mdio_alloc();
+
        if (!mdiodev)
                return -ENOMEM;
        strncpy(mdiodev->name, dev->name, MDIO_NAME_LEN);
@@ -1416,7 +1419,7 @@ int uec_initialize(struct bd_info *bis, uec_info_t *uec_info)
        return 1;
 }
 
-int uec_eth_init(struct bd_info *bis, uec_info_t *uecs, int num)
+int uec_eth_init(struct bd_info *bis, struct uec_inf *uecs, int num)
 {
        int i;
 
@@ -1430,3 +1433,4 @@ int uec_standard_init(struct bd_info *bis)
 {
        return uec_eth_init(bis, uec_info, ARRAY_SIZE(uec_info));
 }
+#endif
index 6de2ac4..83461c0 100644 (file)
@@ -76,8 +76,7 @@
 #define MACCFG2_INIT_VALUE     (MACCFG2_PREL | MACCFG2_RESERVED_1 | \
                                 MACCFG2_LC | MACCFG2_PAD_CRC | MACCFG2_FDX)
 
-/* UEC Event Register
-*/
+/* UEC Event Register */
 #define UCCE_MPD                               0x80000000
 #define UCCE_SCAR                              0x40000000
 #define UCCE_GRA                               0x20000000
 #define UCCE_OTHER     (UCCE_SCAR | UCCE_GRA  | UCCE_CBPR | UCCE_BSY  | \
                         UCCE_RXC  | UCCE_TXC  | UCCE_TXE)
 
-/* UEC TEMODR Register
-*/
+/* UEC TEMODR Register */
 #define TEMODER_SCHEDULER_ENABLE               0x2000
 #define TEMODER_IP_CHECKSUM_GENERATE           0x0400
 #define TEMODER_PERFORMANCE_OPTIMIZATION_MODE1 0x0200
 #define TEMODER_RMON_STATISTICS                        0x0100
-#define TEMODER_NUM_OF_QUEUES_SHIFT            (15-15)
+#define TEMODER_NUM_OF_QUEUES_SHIFT            (15 - 15)
 
 #define TEMODER_INIT_VALUE                     0xc000
 
-/* UEC REMODR Register
-*/
+/* UEC REMODR Register */
 #define REMODER_RX_RMON_STATISTICS_ENABLE      0x00001000
 #define REMODER_RX_EXTENDED_FEATURES           0x80000000
-#define REMODER_VLAN_OPERATION_TAGGED_SHIFT    (31-9 )
-#define REMODER_VLAN_OPERATION_NON_TAGGED_SHIFT        (31-10)
-#define REMODER_RX_QOS_MODE_SHIFT              (31-15)
+#define REMODER_VLAN_OPERATION_TAGGED_SHIFT    (31 - 9)
+#define REMODER_VLAN_OPERATION_NON_TAGGED_SHIFT        (31 - 10)
+#define REMODER_RX_QOS_MODE_SHIFT              (31 - 15)
 #define REMODER_RMON_STATISTICS                        0x00001000
 #define REMODER_RX_EXTENDED_FILTERING          0x00000800
-#define REMODER_NUM_OF_QUEUES_SHIFT            (31-23)
+#define REMODER_NUM_OF_QUEUES_SHIFT            (31 - 23)
 #define REMODER_DYNAMIC_MAX_FRAME_LENGTH       0x00000008
 #define REMODER_DYNAMIC_MIN_FRAME_LENGTH       0x00000004
 #define REMODER_IP_CHECKSUM_CHECK              0x00000002
 #define UESCR_SCOV_SHIFT                       (15 - 15)
 
 /****** Tx data struct collection ******/
-/* Tx thread data, each Tx thread has one this struct.
-*/
-typedef struct uec_thread_data_tx {
+/* Tx thread data, each Tx thread has one this struct. */
+struct uec_thread_data_tx {
        u8   res0[136];
-} __attribute__ ((packed)) uec_thread_data_tx_t;
+} __packed;
 
-/* Tx thread parameter, each Tx thread has one this struct.
-*/
-typedef struct uec_thread_tx_pram {
+/* Tx thread parameter, each Tx thread has one this struct. */
+struct uec_thread_tx_pram {
        u8   res0[64];
-} __attribute__ ((packed)) uec_thread_tx_pram_t;
+} __packed;
 
-/* Send queue queue-descriptor, each Tx queue has one this QD
-*/
-typedef struct uec_send_queue_qd {
+/* Send queue queue-descriptor, each Tx queue has one this QD */
+struct uec_send_queue_qd {
        u32    bd_ring_base; /* pointer to BD ring base address */
        u8     res0[0x8];
        u32    last_bd_completed_address; /* last entry in BD ring */
        u8     res1[0x30];
-} __attribute__ ((packed)) uec_send_queue_qd_t;
+} __packed;
 
 /* Send queue memory region */
-typedef struct uec_send_queue_mem_region {
-       uec_send_queue_qd_t   sqqd[MAX_TX_QUEUES];
-} __attribute__ ((packed)) uec_send_queue_mem_region_t;
+struct uec_send_queue_mem_region {
+       struct uec_send_queue_qd   sqqd[MAX_TX_QUEUES];
+} __packed;
 
-/* Scheduler struct
-*/
-typedef struct uec_scheduler {
+/* Scheduler struct */
+struct uec_scheduler {
        u16  cpucount0;        /* CPU packet counter */
        u16  cpucount1;        /* CPU packet counter */
        u16  cecount0;         /* QE  packet counter */
@@ -272,12 +265,11 @@ typedef struct uec_scheduler {
        u8   oldwfqmask;       /* temporary variable handled by QE */
        u8   weightfactor[MAX_TX_QUEUES]; /**< weight factor for queues */
        u32  minw;             /* temporary variable handled by QE */
-       u8   res1[0x70-0x64];
-} __attribute__ ((packed)) uec_scheduler_t;
+       u8   res1[0x70 - 0x64];
+} __packed;
 
-/* Tx firmware counters
-*/
-typedef struct uec_tx_firmware_statistics_pram {
+/* Tx firmware counters */
+struct uec_tx_firmware_statistics_pram {
        u32  sicoltx;            /* single collision */
        u32  mulcoltx;           /* multiple collision */
        u32  latecoltxfr;        /* late collision */
@@ -290,13 +282,12 @@ typedef struct uec_tx_firmware_statistics_pram {
        u32  txpkts512;          /* total packets(including bad) 512~1023B */
        u32  txpkts1024;         /* total packets(including bad) 1024~1518B */
        u32  txpktsjumbo;        /* total packets(including bad)  >1024 */
-} __attribute__ ((packed)) uec_tx_firmware_statistics_pram_t;
+} __packed;
 
-/* Tx global parameter table
-*/
-typedef struct uec_tx_global_pram {
+/* Tx global parameter table */
+struct uec_tx_global_pram {
        u16  temoder;
-       u8   res0[0x38-0x02];
+       u8   res0[0x38 - 0x02];
        u32  sqptr;
        u32  schedulerbasepointer;
        u32  txrmonbaseptr;
@@ -304,26 +295,22 @@ typedef struct uec_tx_global_pram {
        u8   iphoffset[MAX_IPH_OFFSET_ENTRY];
        u32  vtagtable[0x8];
        u32  tqptr;
-       u8   res2[0x80-0x74];
-} __attribute__ ((packed)) uec_tx_global_pram_t;
-
+       u8   res2[0x80 - 0x74];
+} __packed;
 
 /****** Rx data struct collection ******/
-/* Rx thread data, each Rx thread has one this struct.
-*/
-typedef struct uec_thread_data_rx {
+/* Rx thread data, each Rx thread has one this struct. */
+struct uec_thread_data_rx {
        u8   res0[40];
-} __attribute__ ((packed)) uec_thread_data_rx_t;
+} __packed;
 
-/* Rx thread parameter, each Rx thread has one this struct.
-*/
-typedef struct uec_thread_rx_pram {
+/* Rx thread parameter, each Rx thread has one this struct. */
+struct uec_thread_rx_pram {
        u8   res0[128];
-} __attribute__ ((packed)) uec_thread_rx_pram_t;
+} __packed;
 
-/* Rx firmware counters
-*/
-typedef struct uec_rx_firmware_statistics_pram {
+/* Rx firmware counters */
+struct uec_rx_firmware_statistics_pram {
        u32   frrxfcser;         /* frames with crc error */
        u32   fraligner;         /* frames with alignment error */
        u32   inrangelenrxer;    /* in range length error */
@@ -346,44 +333,41 @@ typedef struct uec_rx_firmware_statistics_pram {
        u32   removevlan;
        u32   replacevlan;
        u32   insertvlan;
-} __attribute__ ((packed)) uec_rx_firmware_statistics_pram_t;
+} __packed;
 
-/* Rx interrupt coalescing entry, each Rx queue has one this entry.
-*/
-typedef struct uec_rx_interrupt_coalescing_entry {
+/* Rx interrupt coalescing entry, each Rx queue has one this entry. */
+struct uec_rx_interrupt_coalescing_entry {
        u32   maxvalue;
        u32   counter;
-} __attribute__ ((packed)) uec_rx_interrupt_coalescing_entry_t;
+} __packed;
 
-typedef struct uec_rx_interrupt_coalescing_table {
-       uec_rx_interrupt_coalescing_entry_t   entry[MAX_RX_QUEUES];
-} __attribute__ ((packed)) uec_rx_interrupt_coalescing_table_t;
+struct uec_rx_interrupt_coalescing_table {
+       struct uec_rx_interrupt_coalescing_entry   entry[MAX_RX_QUEUES];
+} __packed;
 
-/* RxBD queue entry, each Rx queue has one this entry.
-*/
-typedef struct uec_rx_bd_queues_entry {
+/* RxBD queue entry, each Rx queue has one this entry. */
+struct uec_rx_bd_queues_entry {
        u32   bdbaseptr;         /* BD base pointer          */
        u32   bdptr;             /* BD pointer               */
        u32   externalbdbaseptr; /* external BD base pointer */
        u32   externalbdptr;     /* external BD pointer      */
-} __attribute__ ((packed)) uec_rx_bd_queues_entry_t;
+} __packed;
 
-/* Rx global paramter table
-*/
-typedef struct uec_rx_global_pram {
+/* Rx global parameter table */
+struct uec_rx_global_pram {
        u32  remoder;             /* ethernet mode reg. */
        u32  rqptr;               /* base pointer to the Rx Queues */
        u32  res0[0x1];
-       u8   res1[0x20-0xC];
+       u8   res1[0x20 - 0xc];
        u16  typeorlen;
        u8   res2[0x1];
        u8   rxgstpack;           /* ack on GRACEFUL STOP RX command */
        u32  rxrmonbaseptr;       /* Rx RMON statistics base */
-       u8   res3[0x30-0x28];
+       u8   res3[0x30 - 0x28];
        u32  intcoalescingptr;    /* Interrupt coalescing table pointer */
-       u8   res4[0x36-0x34];
+       u8   res4[0x36 - 0x34];
        u8   rstate;
-       u8   res5[0x46-0x37];
+       u8   res5[0x46 - 0x37];
        u16  mrblr;               /* max receive buffer length reg. */
        u32  rbdqptr;             /* RxBD parameter table description */
        u16  mflr;                /* max frame length reg. */
@@ -396,17 +380,15 @@ typedef struct uec_rx_global_pram {
        u16  vlantype;            /* vlan type */
        u16  vlantci;             /* default vlan tci */
        u8   addressfiltering[64];/* address filtering data structure */
-       u32  exfGlobalParam;      /* extended filtering global parameters */
-       u8   res6[0x100-0xC4];    /* Initialize to zero */
-} __attribute__ ((packed)) uec_rx_global_pram_t;
+       u32  exf_global_param;      /* extended filtering global parameters */
+       u8   res6[0x100 - 0xc4];    /* Initialize to zero */
+} __packed;
 
 #define GRACEFUL_STOP_ACKNOWLEDGE_RX            0x01
 
-
 /****** UEC common ******/
-/* UCC statistics - hardware counters
-*/
-typedef struct uec_hardware_statistics {
+/* UCC statistics - hardware counters */
+struct uec_hardware_statistics {
        u32 tx64;
        u32 tx127;
        u32 tx255;
@@ -422,11 +404,10 @@ typedef struct uec_hardware_statistics {
        u32 rbyt;
        u32 rmca;
        u32 rbca;
-} __attribute__ ((packed)) uec_hardware_statistics_t;
+} __packed;
 
-/* InitEnet command parameter
-*/
-typedef struct uec_init_cmd_pram {
+/* InitEnet command parameter */
+struct uec_init_cmd_pram {
        u8   resinit0;
        u8   resinit1;
        u8   resinit2;
@@ -440,7 +421,7 @@ typedef struct uec_init_cmd_pram {
        u32  txglobal;                             /* tx global  */
        u32  txthread[MAX_ENET_INIT_PARAM_ENTRIES_TX]; /* tx threads */
        u8   res3[0x1];
-} __attribute__ ((packed)) uec_init_cmd_pram_t;
+} __packed;
 
 #define ENET_INIT_PARAM_RGF_SHIFT              (32 - 4)
 #define ENET_INIT_PARAM_TGF_SHIFT              (32 - 8)
@@ -456,105 +437,96 @@ typedef struct uec_init_cmd_pram {
 #define ENET_INIT_PARAM_MAGIC_RES_INIT3                0x00
 #define ENET_INIT_PARAM_MAGIC_RES_INIT4                0x0400
 
-/* structure representing 82xx Address Filtering Enet Address in PRAM
-*/
-typedef struct uec_82xx_enet_address {
+/* structure representing 82xx Address Filtering Enet Address in PRAM */
+struct uec_82xx_enet_addr {
        u8   res1[0x2];
        u16  h;       /* address (MSB) */
        u16  m;       /* address       */
        u16  l;       /* address (LSB) */
-} __attribute__ ((packed)) uec_82xx_enet_address_t;
+} __packed;
 
-/* structure representing 82xx Address Filtering PRAM
-*/
-typedef struct uec_82xx_address_filtering_pram {
+/* structure representing 82xx Address Filtering PRAM */
+struct uec_82xx_add_filtering_pram {
        u32  iaddr_h;        /* individual address filter, high */
        u32  iaddr_l;        /* individual address filter, low  */
        u32  gaddr_h;        /* group address filter, high      */
        u32  gaddr_l;        /* group address filter, low       */
-       uec_82xx_enet_address_t    taddr;
-       uec_82xx_enet_address_t    paddr[4];
-       u8                         res0[0x40-0x38];
-} __attribute__ ((packed)) uec_82xx_address_filtering_pram_t;
-
-/* Buffer Descriptor
-*/
-typedef struct buffer_descriptor {
+       struct uec_82xx_enet_addr    taddr;
+       struct uec_82xx_enet_addr    paddr[4];
+       u8                         res0[0x40 - 0x38];
+} __packed;
+
+/* Buffer Descriptor */
+struct buffer_descriptor {
        u16 status;
        u16 len;
        u32 data;
-} __attribute__ ((packed)) qe_bd_t, *p_bd_t;
+} __packed;
 
-#define        SIZEOFBD                sizeof(qe_bd_t)
+#define        SIZEOFBD        sizeof(struct buffer_descriptor)
 
-/* Common BD flags
-*/
+/* Common BD flags */
 #define BD_WRAP                        0x2000
 #define BD_INT                 0x1000
 #define BD_LAST                        0x0800
 #define BD_CLEAN               0x3000
 
-/* TxBD status flags
-*/
-#define TxBD_READY             0x8000
-#define TxBD_PADCRC            0x4000
-#define TxBD_WRAP              BD_WRAP
-#define TxBD_INT               BD_INT
-#define TxBD_LAST              BD_LAST
-#define TxBD_TXCRC             0x0400
-#define TxBD_DEF               0x0200
-#define TxBD_PP                        0x0100
-#define TxBD_LC                        0x0080
-#define TxBD_RL                        0x0040
-#define TxBD_RC                        0x003C
-#define TxBD_UNDERRUN          0x0002
-#define TxBD_TRUNC             0x0001
-
-#define TxBD_ERROR             (TxBD_UNDERRUN | TxBD_TRUNC)
-
-/* RxBD status flags
-*/
-#define RxBD_EMPTY             0x8000
-#define RxBD_OWNER             0x4000
-#define RxBD_WRAP              BD_WRAP
-#define RxBD_INT               BD_INT
-#define RxBD_LAST              BD_LAST
-#define RxBD_FIRST             0x0400
-#define RxBD_CMR               0x0200
-#define RxBD_MISS              0x0100
-#define RxBD_BCAST             0x0080
-#define RxBD_MCAST             0x0040
-#define RxBD_LG                        0x0020
-#define RxBD_NO                        0x0010
-#define RxBD_SHORT             0x0008
-#define RxBD_CRCERR            0x0004
-#define RxBD_OVERRUN           0x0002
-#define RxBD_IPCH              0x0001
-
-#define RxBD_ERROR             (RxBD_LG | RxBD_NO | RxBD_SHORT | \
-                                RxBD_CRCERR | RxBD_OVERRUN)
-
-/* BD access macros
-*/
-#define BD_STATUS(_bd)                 (((p_bd_t)(_bd))->status)
-#define BD_STATUS_SET(_bd, _val)       (((p_bd_t)(_bd))->status = _val)
-#define BD_LENGTH(_bd)                 (((p_bd_t)(_bd))->len)
-#define BD_LENGTH_SET(_bd, _val)       (((p_bd_t)(_bd))->len = _val)
-#define BD_DATA_CLEAR(_bd)             (((p_bd_t)(_bd))->data = 0)
-#define BD_IS_DATA(_bd)                        (((p_bd_t)(_bd))->data)
-#define BD_DATA(_bd)                   ((u8 *)(((p_bd_t)(_bd))->data))
-#define BD_DATA_SET(_bd, _data)                (((p_bd_t)(_bd))->data = (u32)(_data))
-#define BD_ADVANCE(_bd,_status,_base)  \
-       (((_status) & BD_WRAP) ? (_bd) = ((p_bd_t)(_base)) : ++(_bd))
-
-/* Rx Prefetched BDs
-*/
-typedef struct uec_rx_prefetched_bds {
-    qe_bd_t   bd[MAX_PREFETCHED_BDS]; /* prefetched bd */
-} __attribute__ ((packed)) uec_rx_prefetched_bds_t;
-
-/* Alignments
- */
+/* TxBD status flags */
+#define TX_BD_READY            0x8000
+#define TX_BD_PADCRC           0x4000
+#define TX_BD_WRAP             BD_WRAP
+#define TX_BD_INT              BD_INT
+#define TX_BD_LAST             BD_LAST
+#define TX_BD_TXCRC            0x0400
+#define TX_BD_DEF              0x0200
+#define TX_BD_PP                       0x0100
+#define TX_BD_LC                       0x0080
+#define TX_BD_RL                       0x0040
+#define TX_BD_RC                       0x003C
+#define TX_BD_UNDERRUN         0x0002
+#define TX_BD_TRUNC            0x0001
+
+#define TX_BD_ERROR            (TX_BD_UNDERRUN | TX_BD_TRUNC)
+
+/* RxBD status flags */
+#define RX_BD_EMPTY            0x8000
+#define RX_BD_OWNER            0x4000
+#define RX_BD_WRAP             BD_WRAP
+#define RX_BD_INT              BD_INT
+#define RX_BD_LAST             BD_LAST
+#define RX_BD_FIRST            0x0400
+#define RX_BD_CMR              0x0200
+#define RX_BD_MISS             0x0100
+#define RX_BD_BCAST            0x0080
+#define RX_BD_MCAST            0x0040
+#define RX_BD_LG                       0x0020
+#define RX_BD_NO                       0x0010
+#define RX_BD_SHORT            0x0008
+#define RX_BD_CRCERR           0x0004
+#define RX_BD_OVERRUN          0x0002
+#define RX_BD_IPCH             0x0001
+
+#define RX_BD_ERROR            (RX_BD_LG | RX_BD_NO | RX_BD_SHORT | \
+                                RX_BD_CRCERR | RX_BD_OVERRUN)
+
+/* BD access macros */
+#define BD_STATUS(_bd)         (in_be16(&((_bd)->status)))
+#define BD_STATUS_SET(_bd, _v) (out_be16(&((_bd)->status), _v))
+#define BD_LENGTH(_bd)         (in_be16(&((_bd)->len)))
+#define BD_LENGTH_SET(_bd, _v) (out_be16(&((_bd)->len), _v))
+#define BD_DATA_CLEAR(_bd)     (out_be32(&((_bd)->data), 0))
+#define BD_DATA(_bd)           ((u8 *)(((_bd)->data)))
+#define BD_DATA_SET(_bd, _data)        (out_be32(&((_bd)->data), (u32)_data))
+#define BD_ADVANCE(_bd, _status, _base)        \
+       (((_status) & BD_WRAP) ? (_bd) = \
+        ((struct buffer_descriptor *)(_base)) : ++(_bd))
+
+/* Rx Prefetched BDs */
+struct uec_rx_pref_bds {
+       struct buffer_descriptor   bd[MAX_PREFETCHED_BDS]; /* prefetched bd */
+} __packed;
+
+/* Alignments */
 #define UEC_RX_GLOBAL_PRAM_ALIGNMENT                           64
 #define UEC_TX_GLOBAL_PRAM_ALIGNMENT                           64
 #define UEC_THREAD_RX_PRAM_ALIGNMENT                           128
@@ -581,25 +553,8 @@ typedef struct uec_rx_prefetched_bds {
 #define UEC_RX_BD_RING_SIZE_MIN                                        8
 #define UEC_TX_BD_RING_SIZE_MIN                                        2
 
-/* Ethernet speed
-*/
-typedef enum enet_speed {
-       ENET_SPEED_10BT,   /* 10 Base T */
-       ENET_SPEED_100BT,  /* 100 Base T */
-       ENET_SPEED_1000BT  /* 1000 Base T */
-} enet_speed_e;
-
-/* Ethernet Address Type.
-*/
-typedef enum enet_addr_type {
-       ENET_ADDR_TYPE_INDIVIDUAL,
-       ENET_ADDR_TYPE_GROUP,
-       ENET_ADDR_TYPE_BROADCAST
-} enet_addr_type_e;
-
-/* TBI / MII Set Register
-*/
-typedef enum enet_tbi_mii_reg {
+/* TBI / MII Set Register */
+enum enet_tbi_mii_reg {
        ENET_TBI_MII_CR        = 0x00,
        ENET_TBI_MII_SR        = 0x01,
        ENET_TBI_MII_ANA       = 0x04,
@@ -610,7 +565,7 @@ typedef enum enet_tbi_mii_reg {
        ENET_TBI_MII_EXST      = 0x0F,
        ENET_TBI_MII_JD        = 0x10,
        ENET_TBI_MII_TBICON    = 0x11
-} enet_tbi_mii_reg_e;
+};
 
 /* TBI MDIO register bit fields*/
 #define TBICON_CLK_SELECT      0x0020
@@ -637,18 +592,16 @@ typedef enum enet_tbi_mii_reg {
                | TBICR_SPEED1_SET \
                )
 
-/* UEC number of threads
-*/
-typedef enum uec_num_of_threads {
+/* UEC number of threads */
+enum uec_num_of_threads {
        UEC_NUM_OF_THREADS_1  = 0x1,  /* 1 */
        UEC_NUM_OF_THREADS_2  = 0x2,  /* 2 */
        UEC_NUM_OF_THREADS_4  = 0x0,  /* 4 */
        UEC_NUM_OF_THREADS_6  = 0x3,  /* 6 */
        UEC_NUM_OF_THREADS_8  = 0x4   /* 8 */
-} uec_num_of_threads_e;
+};
 
-/* UEC initialization info struct
-*/
+/* UEC initialization info struct */
 #define STD_UEC_INFO(num) \
 {                      \
        .uf_info                = {     \
@@ -668,10 +621,10 @@ typedef enum uec_num_of_threads {
        .speed                  = CONFIG_SYS_UEC##num##_INTERFACE_SPEED, \
 }
 
-typedef struct uec_info {
-       ucc_fast_info_t                 uf_info;
-       uec_num_of_threads_e            num_threads_tx;
-       uec_num_of_threads_e            num_threads_rx;
+struct uec_inf {
+       struct ucc_fast_inf             uf_info;
+       enum uec_num_of_threads         num_threads_tx;
+       enum uec_num_of_threads         num_threads_rx;
        unsigned int                    risc_tx;
        unsigned int                    risc_rx;
        u16                             rx_bd_ring_len;
@@ -679,39 +632,37 @@ typedef struct uec_info {
        u8                              phy_address;
        phy_interface_t                 enet_interface_type;
        int                             speed;
-} uec_info_t;
+};
 
-/* UEC driver initialized info
-*/
+/* UEC driver initialized info */
 #define MAX_RXBUF_LEN                  1536
 #define MAX_FRAME_LEN                  1518
 #define MIN_FRAME_LEN                  64
 #define MAX_DMA1_LEN                   1520
 #define MAX_DMA2_LEN                   1520
 
-/* UEC driver private struct
-*/
-typedef struct uec_private {
-       uec_info_t                      *uec_info;
-       ucc_fast_private_t              *uccf;
+/* UEC driver private struct */
+struct uec_priv {
+       struct uec_inf                  *uec_info;
+       struct ucc_fast_priv            *uccf;
        struct eth_device               *dev;
        uec_t                           *uec_regs;
        uec_mii_t                       *uec_mii_regs;
        /* enet init command parameter */
-       uec_init_cmd_pram_t             *p_init_enet_param;
+       struct uec_init_cmd_pram                *p_init_enet_param;
        u32                             init_enet_param_offset;
-       /* Rx and Tx paramter */
-       uec_rx_global_pram_t            *p_rx_glbl_pram;
+       /* Rx and Tx parameter */
+       struct uec_rx_global_pram               *p_rx_glbl_pram;
        u32                             rx_glbl_pram_offset;
-       uec_tx_global_pram_t            *p_tx_glbl_pram;
+       struct uec_tx_global_pram               *p_tx_glbl_pram;
        u32                             tx_glbl_pram_offset;
-       uec_send_queue_mem_region_t     *p_send_q_mem_reg;
+       struct uec_send_queue_mem_region        *p_send_q_mem_reg;
        u32                             send_q_mem_reg_offset;
-       uec_thread_data_tx_t            *p_thread_data_tx;
+       struct uec_thread_data_tx               *p_thread_data_tx;
        u32                             thread_dat_tx_offset;
-       uec_thread_data_rx_t            *p_thread_data_rx;
+       struct uec_thread_data_rx               *p_thread_data_rx;
        u32                             thread_dat_rx_offset;
-       uec_rx_bd_queues_entry_t        *p_rx_bd_qs_tbl;
+       struct uec_rx_bd_queues_entry   *p_rx_bd_qs_tbl;
        u32                             rx_bd_qs_tbl_offset;
        /* BDs specific */
        u8                              *p_tx_bd_ring;
@@ -720,8 +671,8 @@ typedef struct uec_private {
        u32                             rx_bd_ring_offset;
        u8                              *p_rx_buf;
        u32                             rx_buf_offset;
-       volatile qe_bd_t                *txBd;
-       volatile qe_bd_t                *rxBd;
+       struct buffer_descriptor        *tx_bd;
+       struct buffer_descriptor        *rx_bd;
        /* Status */
        int                             mac_tx_enabled;
        int                             mac_rx_enabled;
@@ -733,9 +684,9 @@ typedef struct uec_private {
        int                             oldspeed;
        int                             oldduplex;
        int                             oldlink;
-} uec_private_t;
+};
 
-int uec_initialize(struct bd_info *bis, uec_info_t *uec_info);
-int uec_eth_init(struct bd_info *bis, uec_info_t *uecs, int num);
+int uec_initialize(struct bd_info *bis, struct uec_inf *uec_info);
+int uec_eth_init(struct bd_info *bis, struct uec_inf *uecs, int num);
 int uec_standard_init(struct bd_info *bis);
 #endif /* __UEC_H__ */
index 69c22dd..9d429c8 100644 (file)
 #include <fsl_qe.h>
 #include <phy.h>
 
+#if !defined(CONFIG_DM_ETH)
+
 #define ugphy_printk(format, arg...)  \
        printf(format "\n", ## arg)
 
 #define ugphy_dbg(format, arg...)           \
-       ugphy_printk(format , ## arg)
+       ugphy_printk(format, ## arg)
 #define ugphy_err(format, arg...)           \
-       ugphy_printk(format , ## arg)
+       ugphy_printk(format, ## arg)
 #define ugphy_info(format, arg...)          \
-       ugphy_printk(format , ## arg)
+       ugphy_printk(format, ## arg)
 #define ugphy_warn(format, arg...)          \
-       ugphy_printk(format , ## arg)
+       ugphy_printk(format, ## arg)
 
 #ifdef UEC_VERBOSE_DEBUG
 #define ugphy_vdbg ugphy_dbg
 #define ugphy_vdbg(ugeth, fmt, args...) do { } while (0)
 #endif /* UEC_VERBOSE_DEBUG */
 
-/*--------------------------------------------------------------------+
+/*
+ * --------------------------------------------------------------------
  * Fixed PHY (PHY-less) support for Ethernet Ports.
  *
  * Copied from arch/powerpc/cpu/ppc4xx/4xx_enet.c
- *--------------------------------------------------------------------*/
-
-/*
+ *--------------------------------------------------------------------
+ *
  * Some boards do not have a PHY for each ethernet port. These ports are known
  * as Fixed PHY (or PHY-less) ports. For such ports, set the appropriate
  * CONFIG_SYS_UECx_PHY_ADDR equal to CONFIG_FIXED_PHY_ADDR (an unused address)
@@ -90,54 +92,58 @@ static const struct fixed_phy_port fixed_phy_port[] = {
        CONFIG_SYS_FIXED_PHY_PORTS /* defined in board configuration file */
 };
 
-/*--------------------------------------------------------------------+
+/*
+ * -------------------------------------------------------------------
  * BitBang MII support for ethernet ports
  *
  * Based from MPC8560ADS implementation
- *--------------------------------------------------------------------*/
-/*
+ *--------------------------------------------------------------------
+ *
  * Example board header file to define bitbang ethernet ports:
  *
  * #define CONFIG_SYS_BITBANG_PHY_PORT(name) name,
  * #define CONFIG_SYS_BITBANG_PHY_PORTS CONFIG_SYS_BITBANG_PHY_PORT("UEC0")
-*/
+ */
 #ifndef CONFIG_SYS_BITBANG_PHY_PORTS
 #define CONFIG_SYS_BITBANG_PHY_PORTS   /* default is an empty array */
 #endif
 
 #if defined(CONFIG_BITBANGMII)
-static const char *bitbang_phy_port[] = {
+static const char * const bitbang_phy_port[] = {
        CONFIG_SYS_BITBANG_PHY_PORTS /* defined in board configuration file */
 };
 #endif /* CONFIG_BITBANGMII */
 
-static void config_genmii_advert (struct uec_mii_info *mii_info);
-static void genmii_setup_forced (struct uec_mii_info *mii_info);
-static void genmii_restart_aneg (struct uec_mii_info *mii_info);
-static int gbit_config_aneg (struct uec_mii_info *mii_info);
-static int genmii_config_aneg (struct uec_mii_info *mii_info);
-static int genmii_update_link (struct uec_mii_info *mii_info);
-static int genmii_read_status (struct uec_mii_info *mii_info);
-u16 uec_phy_read(struct uec_mii_info *mii_info, u16 regnum);
-void uec_phy_write(struct uec_mii_info *mii_info, u16 regnum, u16 val);
-
-/* Write value to the PHY for this device to the register at regnum, */
-/* waiting until the write is done before it returns.  All PHY */
-/* configuration has to be done through the TSEC1 MIIM regs */
-void uec_write_phy_reg (struct eth_device *dev, int mii_id, int regnum, int value)
-{
-       uec_private_t *ugeth = (uec_private_t *) dev->priv;
+static void config_genmii_advert(struct uec_mii_info *mii_info);
+static void genmii_setup_forced(struct uec_mii_info *mii_info);
+static void genmii_restart_aneg(struct uec_mii_info *mii_info);
+static int gbit_config_aneg(struct uec_mii_info *mii_info);
+static int genmii_config_aneg(struct uec_mii_info *mii_info);
+static int genmii_update_link(struct uec_mii_info *mii_info);
+static int genmii_read_status(struct uec_mii_info *mii_info);
+static u16 uec_phy_read(struct uec_mii_info *mii_info, u16 regnum);
+static void uec_phy_write(struct uec_mii_info *mii_info, u16 regnum,
+                         u16 val);
+
+/*
+ * Write value to the PHY for this device to the register at regnum,
+ * waiting until the write is done before it returns.  All PHY
+ * configuration has to be done through the TSEC1 MIIM regs
+ */
+void uec_write_phy_reg(struct eth_device *dev, int mii_id, int regnum,
+                      int value)
+{
+       struct uec_priv *ugeth = (struct uec_priv *)dev->priv;
        uec_mii_t *ug_regs;
-       enet_tbi_mii_reg_e mii_reg = (enet_tbi_mii_reg_e) regnum;
+       enum enet_tbi_mii_reg mii_reg = (enum enet_tbi_mii_reg)regnum;
        u32 tmp_reg;
 
-
 #if defined(CONFIG_BITBANGMII)
        u32 i = 0;
 
        for (i = 0; i < ARRAY_SIZE(bitbang_phy_port); i++) {
                if (strncmp(dev->name, bitbang_phy_port[i],
-                       sizeof(dev->name)) == 0) {
+                           sizeof(dev->name)) == 0) {
                        (void)bb_miiphy_write(NULL, mii_id, regnum, value);
                        return;
                }
@@ -148,46 +154,48 @@ void uec_write_phy_reg (struct eth_device *dev, int mii_id, int regnum, int valu
 
        /* Stop the MII management read cycle */
        out_be32 (&ug_regs->miimcom, 0);
-       /* Setting up the MII Mangement Address Register */
-       tmp_reg = ((u32) mii_id << MIIMADD_PHY_ADDRESS_SHIFT) | mii_reg;
+       /* Setting up the MII Management Address Register */
+       tmp_reg = ((u32)mii_id << MIIMADD_PHY_ADDRESS_SHIFT) | mii_reg;
        out_be32 (&ug_regs->miimadd, tmp_reg);
 
-       /* Setting up the MII Mangement Control Register with the value */
-       out_be32 (&ug_regs->miimcon, (u32) value);
+       /* Setting up the MII Management Control Register with the value */
+       out_be32 (&ug_regs->miimcon, (u32)value);
        sync();
 
        /* Wait till MII management write is complete */
-       while ((in_be32 (&ug_regs->miimind)) & MIIMIND_BUSY);
+       while ((in_be32 (&ug_regs->miimind)) & MIIMIND_BUSY)
+               ;
 }
 
-/* Reads from register regnum in the PHY for device dev, */
-/* returning the value.  Clears miimcom first.  All PHY */
-/* configuration has to be done through the TSEC1 MIIM regs */
-int uec_read_phy_reg (struct eth_device *dev, int mii_id, int regnum)
+/*
+ * Reads from register regnum in the PHY for device dev,
+ * returning the value.  Clears miimcom first.  All PHY
+ * configuration has to be done through the TSEC1 MIIM regs
+ */
+int uec_read_phy_reg(struct eth_device *dev, int mii_id, int regnum)
 {
-       uec_private_t *ugeth = (uec_private_t *) dev->priv;
+       struct uec_priv *ugeth = (struct uec_priv *)dev->priv;
        uec_mii_t *ug_regs;
-       enet_tbi_mii_reg_e mii_reg = (enet_tbi_mii_reg_e) regnum;
+       enum enet_tbi_mii_reg mii_reg = (enum enet_tbi_mii_reg)regnum;
        u32 tmp_reg;
        u16 value;
 
-
 #if defined(CONFIG_BITBANGMII)
        u32 i = 0;
 
        for (i = 0; i < ARRAY_SIZE(bitbang_phy_port); i++) {
                if (strncmp(dev->name, bitbang_phy_port[i],
-                       sizeof(dev->name)) == 0) {
+                           sizeof(dev->name)) == 0) {
                        (void)bb_miiphy_read(NULL, mii_id, regnum, &value);
-                       return (value);
+                       return value;
                }
        }
 #endif /* CONFIG_BITBANGMII */
 
        ug_regs = ugeth->uec_mii_regs;
 
-       /* Setting up the MII Mangement Address Register */
-       tmp_reg = ((u32) mii_id << MIIMADD_PHY_ADDRESS_SHIFT) | mii_reg;
+       /* Setting up the MII Management Address Register */
+       tmp_reg = ((u32)mii_id << MIIMADD_PHY_ADDRESS_SHIFT) | mii_reg;
        out_be32 (&ug_regs->miimadd, tmp_reg);
 
        /* clear MII management command cycle */
@@ -199,37 +207,38 @@ int uec_read_phy_reg (struct eth_device *dev, int mii_id, int regnum)
 
        /* Wait till MII management write is complete */
        while ((in_be32 (&ug_regs->miimind)) &
-              (MIIMIND_NOT_VALID | MIIMIND_BUSY));
+              (MIIMIND_NOT_VALID | MIIMIND_BUSY))
+               ;
 
        /* Read MII management status  */
-       value = (u16) in_be32 (&ug_regs->miimstat);
+       value = (u16)in_be32 (&ug_regs->miimstat);
        if (value == 0xffff)
                ugphy_vdbg
                        ("read wrong value : mii_id %d,mii_reg %d, base %08x",
-                        mii_id, mii_reg, (u32) & (ug_regs->miimcfg));
+                        mii_id, mii_reg, (u32)&ug_regs->miimcfg);
 
-       return (value);
+       return value;
 }
 
-void mii_clear_phy_interrupt (struct uec_mii_info *mii_info)
+void mii_clear_phy_interrupt(struct uec_mii_info *mii_info)
 {
        if (mii_info->phyinfo->ack_interrupt)
-               mii_info->phyinfo->ack_interrupt (mii_info);
+               mii_info->phyinfo->ack_interrupt(mii_info);
 }
 
-void mii_configure_phy_interrupt (struct uec_mii_info *mii_info,
-                                 u32 interrupts)
+void mii_configure_phy_interrupt(struct uec_mii_info *mii_info,
+                                u32 interrupts)
 {
        mii_info->interrupts = interrupts;
        if (mii_info->phyinfo->config_intr)
-               mii_info->phyinfo->config_intr (mii_info);
+               mii_info->phyinfo->config_intr(mii_info);
 }
 
 /* Writes MII_ADVERTISE with the appropriate values, after
  * sanitizing advertise to make sure only supported features
  * are advertised
  */
-static void config_genmii_advert (struct uec_mii_info *mii_info)
+static void config_genmii_advert(struct uec_mii_info *mii_info)
 {
        u32 advertise;
        u16 adv;
@@ -252,7 +261,7 @@ static void config_genmii_advert (struct uec_mii_info *mii_info)
        uec_phy_write(mii_info, MII_ADVERTISE, adv);
 }
 
-static void genmii_setup_forced (struct uec_mii_info *mii_info)
+static void genmii_setup_forced(struct uec_mii_info *mii_info)
 {
        u16 ctrl;
        u32 features = mii_info->phyinfo->features;
@@ -283,7 +292,7 @@ static void genmii_setup_forced (struct uec_mii_info *mii_info)
                                | SUPPORTED_10baseT_Full))
                        break;
        default:                /* Unsupported speed! */
-               ugphy_err ("%s: Bad speed!", mii_info->dev->name);
+               ugphy_err("%s: Bad speed!", mii_info->dev->name);
                break;
        }
 
@@ -291,7 +300,7 @@ static void genmii_setup_forced (struct uec_mii_info *mii_info)
 }
 
 /* Enable and Restart Autonegotiation */
-static void genmii_restart_aneg (struct uec_mii_info *mii_info)
+static void genmii_restart_aneg(struct uec_mii_info *mii_info)
 {
        u16 ctl;
 
@@ -300,14 +309,14 @@ static void genmii_restart_aneg (struct uec_mii_info *mii_info)
        uec_phy_write(mii_info, MII_BMCR, ctl);
 }
 
-static int gbit_config_aneg (struct uec_mii_info *mii_info)
+static int gbit_config_aneg(struct uec_mii_info *mii_info)
 {
        u16 adv;
        u32 advertise;
 
        if (mii_info->autoneg) {
                /* Configure the ADVERTISE register */
-               config_genmii_advert (mii_info);
+               config_genmii_advert(mii_info);
                advertise = mii_info->advertising;
 
                adv = uec_phy_read(mii_info, MII_CTRL1000);
@@ -320,18 +329,21 @@ static int gbit_config_aneg (struct uec_mii_info *mii_info)
                uec_phy_write(mii_info, MII_CTRL1000, adv);
 
                /* Start/Restart aneg */
-               genmii_restart_aneg (mii_info);
-       } else
-               genmii_setup_forced (mii_info);
+               genmii_restart_aneg(mii_info);
+       } else {
+               genmii_setup_forced(mii_info);
+       }
 
        return 0;
 }
 
-static int marvell_config_aneg (struct uec_mii_info *mii_info)
+static int marvell_config_aneg(struct uec_mii_info *mii_info)
 {
-       /* The Marvell PHY has an errata which requires
+       /*
+        * The Marvell PHY has an errata which requires
         * that certain registers get written in order
-        * to restart autonegotiation */
+        * to restart autonegotiation
+        */
        uec_phy_write(mii_info, MII_BMCR, BMCR_RESET);
 
        uec_phy_write(mii_info, 0x1d, 0x1f);
@@ -340,16 +352,18 @@ static int marvell_config_aneg (struct uec_mii_info *mii_info)
        uec_phy_write(mii_info, 0x1e, 0);
        uec_phy_write(mii_info, 0x1e, 0x100);
 
-       gbit_config_aneg (mii_info);
+       gbit_config_aneg(mii_info);
 
        return 0;
 }
 
-static int genmii_config_aneg (struct uec_mii_info *mii_info)
+static int genmii_config_aneg(struct uec_mii_info *mii_info)
 {
        if (mii_info->autoneg) {
-               /* Speed up the common case, if link is already up, speed and
-                  duplex match, skip auto neg as it already matches */
+               /*
+                * Speed up the common case, if link is already up, speed and
+                * duplex match, skip auto neg as it already matches
+                */
                if (!genmii_read_status(mii_info) && mii_info->link)
                        if (mii_info->duplex == DUPLEX_FULL &&
                            mii_info->speed == SPEED_100)
@@ -357,15 +371,16 @@ static int genmii_config_aneg (struct uec_mii_info *mii_info)
                                    ADVERTISED_100baseT_Full)
                                        return 0;
 
-               config_genmii_advert (mii_info);
-               genmii_restart_aneg (mii_info);
-       } else
-               genmii_setup_forced (mii_info);
+               config_genmii_advert(mii_info);
+               genmii_restart_aneg(mii_info);
+       } else {
+               genmii_setup_forced(mii_info);
+       }
 
        return 0;
 }
 
-static int genmii_update_link (struct uec_mii_info *mii_info)
+static int genmii_update_link(struct uec_mii_info *mii_info)
 {
        u16 status;
 
@@ -377,8 +392,8 @@ static int genmii_update_link (struct uec_mii_info *mii_info)
         * (ie - we're capable and it's not done)
         */
        status = uec_phy_read(mii_info, MII_BMSR);
-       if ((status & BMSR_LSTATUS) && (status & BMSR_ANEGCAPABLE)
-           && !(status & BMSR_ANEGCOMPLETE)) {
+       if ((status & BMSR_LSTATUS) && (status & BMSR_ANEGCAPABLE) &&
+           !(status & BMSR_ANEGCOMPLETE)) {
                int i = 0;
 
                while (!(status & BMSR_ANEGCOMPLETE)) {
@@ -405,14 +420,13 @@ static int genmii_update_link (struct uec_mii_info *mii_info)
        return 0;
 }
 
-static int genmii_read_status (struct uec_mii_info *mii_info)
+static int genmii_read_status(struct uec_mii_info *mii_info)
 {
        u16 status;
        int err;
 
-       /* Update the link, but return if there
-        * was an error */
-       err = genmii_update_link (mii_info);
+       /* Update the link, but return if there was an error */
+       err = genmii_update_link(mii_info);
        if (err)
                return err;
 
@@ -449,13 +463,13 @@ static int genmii_read_status (struct uec_mii_info *mii_info)
 static int bcm_init(struct uec_mii_info *mii_info)
 {
        struct eth_device *edev = mii_info->dev;
-       uec_private_t *uec = edev->priv;
+       struct uec_priv *uec = edev->priv;
 
        gbit_config_aneg(mii_info);
 
-       if ((uec->uec_info->enet_interface_type ==
-                               PHY_INTERFACE_MODE_RGMII_RXID) &&
-                       (uec->uec_info->speed == SPEED_1000)) {
+       if (uec->uec_info->enet_interface_type ==
+                               PHY_INTERFACE_MODE_RGMII_RXID &&
+                       uec->uec_info->speed == SPEED_1000) {
                u16 val;
                int cnt = 50;
 
@@ -476,18 +490,18 @@ static int bcm_init(struct uec_mii_info *mii_info)
                uec_phy_write(mii_info, 0x18, val);
        }
 
-        return 0;
+       return 0;
 }
 
 static int uec_marvell_init(struct uec_mii_info *mii_info)
 {
        struct eth_device *edev = mii_info->dev;
-       uec_private_t *uec = edev->priv;
+       struct uec_priv *uec = edev->priv;
        phy_interface_t iface = uec->uec_info->enet_interface_type;
        int     speed = uec->uec_info->speed;
 
-       if ((speed == SPEED_1000) &&
-          (iface == PHY_INTERFACE_MODE_RGMII_ID ||
+       if (speed == SPEED_1000 &&
+           (iface == PHY_INTERFACE_MODE_RGMII_ID ||
            iface == PHY_INTERFACE_MODE_RGMII_RXID ||
            iface == PHY_INTERFACE_MODE_RGMII_TXID)) {
                int temp;
@@ -515,20 +529,21 @@ static int uec_marvell_init(struct uec_mii_info *mii_info)
        return 0;
 }
 
-static int marvell_read_status (struct uec_mii_info *mii_info)
+static int marvell_read_status(struct uec_mii_info *mii_info)
 {
        u16 status;
        int err;
 
-       /* Update the link, but return if there
-        * was an error */
-       err = genmii_update_link (mii_info);
+       /* Update the link, but return if there was an error */
+       err = genmii_update_link(mii_info);
        if (err)
                return err;
 
-       /* If the link is up, read the speed and duplex */
-       /* If we aren't autonegotiating, assume speeds
-        * are as set */
+       /*
+        * If the link is up, read the speed and duplex
+        * If we aren't autonegotiating, assume speeds
+        * are as set
+        */
        if (mii_info->autoneg && mii_info->link) {
                int speed;
 
@@ -559,7 +574,7 @@ static int marvell_read_status (struct uec_mii_info *mii_info)
        return 0;
 }
 
-static int marvell_ack_interrupt (struct uec_mii_info *mii_info)
+static int marvell_ack_interrupt(struct uec_mii_info *mii_info)
 {
        /* Clear the interrupts by reading the reg */
        uec_phy_read(mii_info, MII_M1011_IEVENT);
@@ -567,18 +582,18 @@ static int marvell_ack_interrupt (struct uec_mii_info *mii_info)
        return 0;
 }
 
-static int marvell_config_intr (struct uec_mii_info *mii_info)
+static int marvell_config_intr(struct uec_mii_info *mii_info)
 {
        if (mii_info->interrupts == MII_INTERRUPT_ENABLED)
                uec_phy_write(mii_info, MII_M1011_IMASK, MII_M1011_IMASK_INIT);
        else
                uec_phy_write(mii_info, MII_M1011_IMASK,
-                               MII_M1011_IMASK_CLEAR);
+                             MII_M1011_IMASK_CLEAR);
 
        return 0;
 }
 
-static int dm9161_init (struct uec_mii_info *mii_info)
+static int dm9161_init(struct uec_mii_info *mii_info)
 {
        /* Reset the PHY */
        uec_phy_write(mii_info, MII_BMCR, uec_phy_read(mii_info, MII_BMCR) |
@@ -589,29 +604,31 @@ static int dm9161_init (struct uec_mii_info *mii_info)
 
        uec_phy_write(mii_info, MII_DM9161_SCR, MII_DM9161_SCR_INIT);
 
-       config_genmii_advert (mii_info);
+       config_genmii_advert(mii_info);
        /* Start/restart aneg */
-       genmii_config_aneg (mii_info);
+       genmii_config_aneg(mii_info);
 
        return 0;
 }
 
-static int dm9161_config_aneg (struct uec_mii_info *mii_info)
+static int dm9161_config_aneg(struct uec_mii_info *mii_info)
 {
        return 0;
 }
 
-static int dm9161_read_status (struct uec_mii_info *mii_info)
+static int dm9161_read_status(struct uec_mii_info *mii_info)
 {
        u16 status;
        int err;
 
        /* Update the link, but return if there was an error */
-       err = genmii_update_link (mii_info);
+       err = genmii_update_link(mii_info);
        if (err)
                return err;
-       /* If the link is up, read the speed and duplex
-          If we aren't autonegotiating assume speeds are as set */
+       /*
+        * If the link is up, read the speed and duplex
+        * If we aren't autonegotiating assume speeds are as set
+        */
        if (mii_info->autoneg && mii_info->link) {
                status = uec_phy_read(mii_info, MII_DM9161_SCSR);
                if (status & (MII_DM9161_SCSR_100F | MII_DM9161_SCSR_100H))
@@ -628,7 +645,7 @@ static int dm9161_read_status (struct uec_mii_info *mii_info)
        return 0;
 }
 
-static int dm9161_ack_interrupt (struct uec_mii_info *mii_info)
+static int dm9161_ack_interrupt(struct uec_mii_info *mii_info)
 {
        /* Clear the interrupt by reading the reg */
        uec_phy_read(mii_info, MII_DM9161_INTR);
@@ -636,7 +653,7 @@ static int dm9161_ack_interrupt (struct uec_mii_info *mii_info)
        return 0;
 }
 
-static int dm9161_config_intr (struct uec_mii_info *mii_info)
+static int dm9161_config_intr(struct uec_mii_info *mii_info)
 {
        if (mii_info->interrupts == MII_INTERRUPT_ENABLED)
                uec_phy_write(mii_info, MII_DM9161_INTR, MII_DM9161_INTR_INIT);
@@ -646,23 +663,23 @@ static int dm9161_config_intr (struct uec_mii_info *mii_info)
        return 0;
 }
 
-static void dm9161_close (struct uec_mii_info *mii_info)
+static void dm9161_close(struct uec_mii_info *mii_info)
 {
 }
 
-static int fixed_phy_aneg (struct uec_mii_info *mii_info)
+static int fixed_phy_aneg(struct uec_mii_info *mii_info)
 {
        mii_info->autoneg = 0; /* Turn off auto negotiation for fixed phy */
        return 0;
 }
 
-static int fixed_phy_read_status (struct uec_mii_info *mii_info)
+static int fixed_phy_read_status(struct uec_mii_info *mii_info)
 {
        int i = 0;
 
        for (i = 0; i < ARRAY_SIZE(fixed_phy_port); i++) {
                if (strncmp(mii_info->dev->name, fixed_phy_port[i].name,
-                               strlen(mii_info->dev->name)) == 0) {
+                           strlen(mii_info->dev->name)) == 0) {
                        mii_info->speed = fixed_phy_port[i].speed;
                        mii_info->duplex = fixed_phy_port[i].duplex;
                        mii_info->link = 1; /* Link is always UP */
@@ -673,25 +690,26 @@ static int fixed_phy_read_status (struct uec_mii_info *mii_info)
        return 0;
 }
 
-static int smsc_config_aneg (struct uec_mii_info *mii_info)
+static int smsc_config_aneg(struct uec_mii_info *mii_info)
 {
        return 0;
 }
 
-static int smsc_read_status (struct uec_mii_info *mii_info)
+static int smsc_read_status(struct uec_mii_info *mii_info)
 {
        u16 status;
        int err;
 
-       /* Update the link, but return if there
-        * was an error */
-       err = genmii_update_link (mii_info);
+       /* Update the link, but return if there was an error */
+       err = genmii_update_link(mii_info);
        if (err)
                return err;
 
-       /* If the link is up, read the speed and duplex */
-       /* If we aren't autonegotiating, assume speeds
-        * are as set */
+       /*
+        * If the link is up, read the speed and duplex
+        * If we aren't autonegotiating, assume speeds
+        * are as set
+        */
        if (mii_info->autoneg && mii_info->link) {
                int     val;
 
@@ -699,22 +717,22 @@ static int smsc_read_status (struct uec_mii_info *mii_info)
                val = (status & 0x1c) >> 2;
 
                switch (val) {
-                       case 1:
-                               mii_info->duplex = DUPLEX_HALF;
-                               mii_info->speed = SPEED_10;
-                               break;
-                       case 5:
-                               mii_info->duplex = DUPLEX_FULL;
-                               mii_info->speed = SPEED_10;
-                               break;
-                       case 2:
-                               mii_info->duplex = DUPLEX_HALF;
-                               mii_info->speed = SPEED_100;
-                               break;
-                       case 6:
-                               mii_info->duplex = DUPLEX_FULL;
-                               mii_info->speed = SPEED_100;
-                               break;
+               case 1:
+                       mii_info->duplex = DUPLEX_HALF;
+                       mii_info->speed = SPEED_10;
+                       break;
+               case 5:
+                       mii_info->duplex = DUPLEX_FULL;
+                       mii_info->speed = SPEED_10;
+                       break;
+               case 2:
+                       mii_info->duplex = DUPLEX_HALF;
+                       mii_info->speed = SPEED_100;
+                       break;
+               case 6:
+                       mii_info->duplex = DUPLEX_FULL;
+                       mii_info->speed = SPEED_100;
+                       break;
                }
                mii_info->pause = 0;
        }
@@ -803,25 +821,25 @@ static struct phy_info *phy_info[] = {
        NULL
 };
 
-u16 uec_phy_read(struct uec_mii_info *mii_info, u16 regnum)
+static u16 uec_phy_read(struct uec_mii_info *mii_info, u16 regnum)
 {
-       return mii_info->mdio_read (mii_info->dev, mii_info->mii_id, regnum);
+       return mii_info->mdio_read(mii_info->dev, mii_info->mii_id, regnum);
 }
 
-void uec_phy_write(struct uec_mii_info *mii_info, u16 regnum, u16 val)
+static void uec_phy_write(struct uec_mii_info *mii_info, u16 regnum, u16 val)
 {
-       mii_info->mdio_write (mii_info->dev, mii_info->mii_id, regnum, val);
+       mii_info->mdio_write(mii_info->dev, mii_info->mii_id, regnum, val);
 }
 
 /* Use the PHY ID registers to determine what type of PHY is attached
  * to device dev.  return a struct phy_info structure describing that PHY
  */
-struct phy_info *uec_get_phy_info (struct uec_mii_info *mii_info)
+struct phy_info *uec_get_phy_info(struct uec_mii_info *mii_info)
 {
        u16 phy_reg;
        u32 phy_ID;
        int i;
-       struct phy_info *theInfo = NULL;
+       struct phy_info *info = NULL;
 
        /* Grab the bits from PHYIR1, and put them in the upper half */
        phy_reg = uec_phy_read(mii_info, MII_PHYSID1);
@@ -836,30 +854,29 @@ struct phy_info *uec_get_phy_info (struct uec_mii_info *mii_info)
        for (i = 0; phy_info[i]; i++)
                if (phy_info[i]->phy_id ==
                    (phy_ID & phy_info[i]->phy_id_mask)) {
-                       theInfo = phy_info[i];
+                       info = phy_info[i];
                        break;
                }
 
        /* This shouldn't happen, as we have generic PHY support */
-       if (theInfo == NULL) {
-               ugphy_info ("UEC: PHY id %x is not supported!", phy_ID);
+       if (!info) {
+               ugphy_info("UEC: PHY id %x is not supported!", phy_ID);
                return NULL;
-       } else {
-               ugphy_info ("UEC: PHY is %s (%x)", theInfo->name, phy_ID);
        }
+       ugphy_info("UEC: PHY is %s (%x)", info->name, phy_ID);
 
-       return theInfo;
+       return info;
 }
 
 void marvell_phy_interface_mode(struct eth_device *dev, phy_interface_t type,
-               int speed)
+                               int speed)
 {
-       uec_private_t *uec = (uec_private_t *) dev->priv;
+       struct uec_priv *uec = (struct uec_priv *)dev->priv;
        struct uec_mii_info *mii_info;
        u16 status;
 
        if (!uec->mii_info) {
-               printf ("%s: the PHY not initialized\n", __FUNCTION__);
+               printf("%s: the PHY not initialized\n", __func__);
                return;
        }
        mii_info = uec->mii_info;
@@ -903,10 +920,11 @@ void marvell_phy_interface_mode(struct eth_device *dev, phy_interface_t type,
        /* now the B2 will correctly report autoneg completion status */
 }
 
-void change_phy_interface_mode (struct eth_device *dev,
-                               phy_interface_t type, int speed)
+void change_phy_interface_mode(struct eth_device *dev,
+                              phy_interface_t type, int speed)
 {
 #ifdef CONFIG_PHY_MODE_NEED_CHANGE
-       marvell_phy_interface_mode (dev, type, speed);
+       marvell_phy_interface_mode(dev, type, speed);
 #endif
 }
+#endif
index 83a7ccd..7fd0e2c 100644 (file)
@@ -11,6 +11,8 @@
 #ifndef __UEC_PHY_H__
 #define __UEC_PHY_H__
 
+#include <linux/bitops.h>
+
 #define MII_end ((u32)-2)
 #define MII_read ((u32)-1)
 
@@ -93,8 +95,8 @@
 #define MII_DM9161_INTR_LINK_CHANGE    0x0004
 #define MII_DM9161_INTR_INIT           0x0000
 #define MII_DM9161_INTR_STOP   \
-(MII_DM9161_INTR_DPLX_MASK | MII_DM9161_INTR_SPD_MASK \
| MII_DM9161_INTR_LINK_MASK | MII_DM9161_INTR_MASK)
+               (MII_DM9161_INTR_DPLX_MASK | MII_DM9161_INTR_SPD_MASK | \
               MII_DM9161_INTR_LINK_MASK | MII_DM9161_INTR_MASK)
 
 /* DM9161 10BT Configuration/Status */
 #define MII_DM9161_10BTCSR             0x12
 #define DUPLEX_HALF            0x00
 #define DUPLEX_FULL            0x01
 
-/* Indicates what features are supported by the interface. */
-#define SUPPORTED_10baseT_Half         (1 << 0)
-#define SUPPORTED_10baseT_Full         (1 << 1)
-#define SUPPORTED_100baseT_Half                (1 << 2)
-#define SUPPORTED_100baseT_Full                (1 << 3)
-#define SUPPORTED_1000baseT_Half       (1 << 4)
-#define SUPPORTED_1000baseT_Full       (1 << 5)
-#define SUPPORTED_Autoneg              (1 << 6)
-#define SUPPORTED_TP                   (1 << 7)
-#define SUPPORTED_AUI                  (1 << 8)
-#define SUPPORTED_MII                  (1 << 9)
-#define SUPPORTED_FIBRE                        (1 << 10)
-#define SUPPORTED_BNC                  (1 << 11)
-#define SUPPORTED_10000baseT_Full      (1 << 12)
-
-#define ADVERTISED_10baseT_Half                (1 << 0)
-#define ADVERTISED_10baseT_Full                (1 << 1)
-#define ADVERTISED_100baseT_Half       (1 << 2)
-#define ADVERTISED_100baseT_Full       (1 << 3)
-#define ADVERTISED_1000baseT_Half      (1 << 4)
-#define ADVERTISED_1000baseT_Full      (1 << 5)
-#define ADVERTISED_Autoneg             (1 << 6)
-#define ADVERTISED_TP                  (1 << 7)
-#define ADVERTISED_AUI                 (1 << 8)
-#define ADVERTISED_MII                 (1 << 9)
-#define ADVERTISED_FIBRE               (1 << 10)
-#define ADVERTISED_BNC                 (1 << 11)
-#define ADVERTISED_10000baseT_Full     (1 << 12)
-
 /* Taken from mii_if_info and sungem_phy.h */
 struct uec_mii_info {
        /* Information about the PHY type */
@@ -184,9 +157,9 @@ struct uec_mii_info {
        void *priv;
 
        /* Provided by ethernet driver */
-       int (*mdio_read) (struct eth_device * dev, int mii_id, int reg);
-       void (*mdio_write) (struct eth_device * dev, int mii_id, int reg,
-                           int val);
+       int (*mdio_read)(struct eth_device *dev, int mii_id, int reg);
+       void (*mdio_write)(struct eth_device *dev, int mii_id, int reg,
+                          int val);
 };
 
 /* struct phy_info: a structure which defines attributes for a PHY
@@ -208,32 +181,34 @@ struct phy_info {
        u32 features;
 
        /* Called to initialize the PHY */
-       int (*init) (struct uec_mii_info * mii_info);
+       int (*init)(struct uec_mii_info *mii_info);
 
        /* Called to suspend the PHY for power */
-       int (*suspend) (struct uec_mii_info * mii_info);
+       int (*suspend)(struct uec_mii_info *mii_info);
 
        /* Reconfigures autonegotiation (or disables it) */
-       int (*config_aneg) (struct uec_mii_info * mii_info);
+       int (*config_aneg)(struct uec_mii_info *mii_info);
 
        /* Determines the negotiated speed and duplex */
-       int (*read_status) (struct uec_mii_info * mii_info);
+       int (*read_status)(struct uec_mii_info *mii_info);
 
        /* Clears any pending interrupts */
-       int (*ack_interrupt) (struct uec_mii_info * mii_info);
+       int (*ack_interrupt)(struct uec_mii_info *mii_info);
 
        /* Enables or disables interrupts */
-       int (*config_intr) (struct uec_mii_info * mii_info);
+       int (*config_intr)(struct uec_mii_info *mii_info);
 
        /* Clears up any memory if needed */
-       void (*close) (struct uec_mii_info * mii_info);
+       void (*close)(struct uec_mii_info *mii_info);
 };
 
-struct phy_info *uec_get_phy_info (struct uec_mii_info *mii_info);
-void uec_write_phy_reg (struct eth_device *dev, int mii_id, int regnum,
-                   int value);
-int uec_read_phy_reg (struct eth_device *dev, int mii_id, int regnum);
-void mii_clear_phy_interrupt (struct uec_mii_info *mii_info);
-void mii_configure_phy_interrupt (struct uec_mii_info *mii_info,
-                                 u32 interrupts);
+struct phy_info *uec_get_phy_info(struct uec_mii_info *mii_info);
+void uec_write_phy_reg(struct eth_device *dev, int mii_id, int regnum,
+                      int value);
+int uec_read_phy_reg(struct eth_device *dev, int mii_id, int regnum);
+void mii_clear_phy_interrupt(struct uec_mii_info *mii_info);
+void mii_configure_phy_interrupt(struct uec_mii_info *mii_info,
+                                u32 interrupts);
+void change_phy_interface_mode(struct eth_device *dev,
+                              phy_interface_t type, int speed);
 #endif /* __UEC_PHY_H__ */
index 1a7f1f8..8e21a38 100644 (file)
@@ -2,8 +2,9 @@
 /*
  * Texas Instruments' K3 R5 Remoteproc driver
  *
- * Copyright (C) 2018-2019 Texas Instruments Incorporated - http://www.ti.com/
+ * Copyright (C) 2018-2020 Texas Instruments Incorporated - https://www.ti.com/
  *     Lokesh Vutla <lokeshvutla@ti.com>
+ *     Suman Anna <s-anna@ti.com>
  */
 
 #include <common.h>
@@ -37,6 +38,8 @@
 #define PROC_BOOT_CFG_FLAG_R5_BTCM_EN                  0x00001000
 #define PROC_BOOT_CFG_FLAG_R5_ATCM_EN                  0x00002000
 #define PROC_BOOT_CFG_FLAG_GEN_IGN_BOOTVECTOR          0x10000000
+/* Available from J7200 SoCs onwards */
+#define PROC_BOOT_CFG_FLAG_R5_MEM_INIT_DIS             0x00004000
 
 /* R5 TI-SCI Processor Control Flags */
 #define PROC_BOOT_CTRL_FLAG_R5_CORE_HALT               0x00000001
@@ -55,6 +58,16 @@ enum cluster_mode {
 };
 
 /**
+ * struct k3_r5f_ip_data - internal data structure used for IP variations
+ * @tcm_is_double: flag to denote the larger unified TCMs in certain modes
+ * @tcm_ecc_autoinit: flag to denote the auto-initialization of TCMs for ECC
+ */
+struct k3_r5f_ip_data {
+       bool tcm_is_double;
+       bool tcm_ecc_autoinit;
+};
+
+/**
  * struct k3_r5_mem - internal memory structure
  * @cpu_addr: MPU virtual address of the memory region
  * @bus_addr: Bus address used to access the memory region
@@ -74,6 +87,7 @@ struct k3_r5f_mem {
  * @cluster: pointer to the parent cluster.
  * @reset: reset control handle
  * @tsp: TI-SCI processor control handle
+ * @ipdata: cached pointer to R5F IP specific feature data
  * @mem: Array of available internal memories
  * @num_mem: Number of available memories
  * @atcm_enable: flag to control ATCM enablement
@@ -86,6 +100,7 @@ struct k3_r5f_core {
        struct k3_r5f_cluster *cluster;
        struct reset_ctl reset;
        struct ti_sci_proc tsp;
+       struct k3_r5f_ip_data *ipdata;
        struct k3_r5f_mem *mem;
        int num_mems;
        u32 atcm_enable;
@@ -257,6 +272,18 @@ static int k3_r5f_core_sanity_check(struct k3_r5f_core *core)
        return 0;
 }
 
+/* Zero out TCMs so that ECC can be effective on all TCM addresses */
+void k3_r5f_init_tcm_memories(struct k3_r5f_core *core, bool auto_inited)
+{
+       if (core->ipdata->tcm_ecc_autoinit && auto_inited)
+               return;
+
+       if (core->atcm_enable)
+               memset(core->mem[0].cpu_addr, 0x00, core->mem[0].size);
+       if (core->btcm_enable)
+               memset(core->mem[1].cpu_addr, 0x00, core->mem[1].size);
+}
+
 /**
  * k3_r5f_load() - Load up the Remote processor image
  * @dev:       rproc device pointer
@@ -268,7 +295,9 @@ static int k3_r5f_core_sanity_check(struct k3_r5f_core *core)
 static int k3_r5f_load(struct udevice *dev, ulong addr, ulong size)
 {
        struct k3_r5f_core *core = dev_get_priv(dev);
-       u32 boot_vector;
+       u64 boot_vector;
+       u32 ctrl, sts, cfg = 0;
+       bool mem_auto_init;
        int ret;
 
        dev_dbg(dev, "%s addr = 0x%lx, size = 0x%lx\n", __func__, addr, size);
@@ -281,6 +310,12 @@ static int k3_r5f_load(struct udevice *dev, ulong addr, ulong size)
        if (ret)
                return ret;
 
+       ret = ti_sci_proc_get_status(&core->tsp, &boot_vector, &cfg, &ctrl,
+                                    &sts);
+       if (ret)
+               return ret;
+       mem_auto_init = !(cfg & PROC_BOOT_CFG_FLAG_R5_MEM_INIT_DIS);
+
        ret = k3_r5f_prepare(dev);
        if (ret) {
                dev_err(dev, "R5f prepare failed for core %d\n",
@@ -288,11 +323,7 @@ static int k3_r5f_load(struct udevice *dev, ulong addr, ulong size)
                goto proc_release;
        }
 
-       /* Zero out TCMs so that ECC can be effective on all TCM addresses */
-       if (core->atcm_enable)
-               memset(core->mem[0].cpu_addr, 0x00, core->mem[0].size);
-       if (core->btcm_enable)
-               memset(core->mem[1].cpu_addr, 0x00, core->mem[1].size);
+       k3_r5f_init_tcm_memories(core, mem_auto_init);
 
        ret = rproc_elf_load_image(dev, addr, size);
        if (ret < 0) {
@@ -302,7 +333,7 @@ static int k3_r5f_load(struct udevice *dev, ulong addr, ulong size)
 
        boot_vector = rproc_elf_get_boot_addr(dev, addr);
 
-       dev_dbg(dev, "%s: Boot vector = 0x%x\n", __func__, boot_vector);
+       dev_dbg(dev, "%s: Boot vector = 0x%llx\n", __func__, boot_vector);
 
        ret = ti_sci_proc_set_config(&core->tsp, boot_vector, 0, 0);
 
@@ -657,6 +688,8 @@ static int k3_r5f_of_to_priv(struct k3_r5f_core *core)
                return ret;
        }
 
+       core->ipdata = (struct k3_r5f_ip_data *)dev_get_driver_data(core->dev);
+
        return 0;
 }
 
@@ -702,6 +735,38 @@ static int k3_r5f_core_of_get_memories(struct k3_r5f_core *core)
        return 0;
 }
 
+/*
+ * Each R5F core within a typical R5FSS instance has a total of 64 KB of TCMs,
+ * split equally into two 32 KB banks between ATCM and BTCM. The TCMs from both
+ * cores are usable in Split-mode, but only the Core0 TCMs can be used in
+ * LockStep-mode. The newer revisions of the R5FSS IP maximizes these TCMs by
+ * leveraging the Core1 TCMs as well in certain modes where they would have
+ * otherwise been unusable (Eg: LockStep-mode on J7200 SoCs). This is done by
+ * making a Core1 TCM visible immediately after the corresponding Core0 TCM.
+ * The SoC memory map uses the larger 64 KB sizes for the Core0 TCMs, and the
+ * dts representation reflects this increased size on supported SoCs. The Core0
+ * TCM sizes therefore have to be adjusted to only half the original size in
+ * Split mode.
+ */
+static void k3_r5f_core_adjust_tcm_sizes(struct k3_r5f_core *core)
+{
+       struct k3_r5f_cluster *cluster = core->cluster;
+
+       if (cluster->mode == CLUSTER_MODE_LOCKSTEP)
+               return;
+
+       if (!core->ipdata->tcm_is_double)
+               return;
+
+       if (core == cluster->cores[0]) {
+               core->mem[0].size /= 2;
+               core->mem[1].size /= 2;
+
+               dev_dbg(core->dev, "adjusted TCM sizes, ATCM = 0x%zx BTCM = 0x%zx\n",
+                       core->mem[0].size, core->mem[1].size);
+       }
+}
+
 /**
  * k3_r5f_probe() - Basic probe
  * @dev:       corresponding k3 remote processor device
@@ -755,6 +820,8 @@ static int k3_r5f_probe(struct udevice *dev)
                return ret;
        }
 
+       k3_r5f_core_adjust_tcm_sizes(core);
+
        dev_dbg(dev, "Remoteproc successfully probed\n");
 
        return 0;
@@ -771,9 +838,20 @@ static int k3_r5f_remove(struct udevice *dev)
        return 0;
 }
 
+static const struct k3_r5f_ip_data k3_data = {
+       .tcm_is_double = false,
+       .tcm_ecc_autoinit = false,
+};
+
+static const struct k3_r5f_ip_data j7200_data = {
+       .tcm_is_double = true,
+       .tcm_ecc_autoinit = true,
+};
+
 static const struct udevice_id k3_r5f_rproc_ids[] = {
-       { .compatible = "ti,am654-r5f"},
-       { .compatible = "ti,j721e-r5f"},
+       { .compatible = "ti,am654-r5f", .data = (ulong)&k3_data, },
+       { .compatible = "ti,j721e-r5f", .data = (ulong)&k3_data, },
+       { .compatible = "ti,j7200-r5f", .data = (ulong)&j7200_data, },
        {}
 };
 
@@ -810,6 +888,7 @@ static int k3_r5f_cluster_probe(struct udevice *dev)
 static const struct udevice_id k3_r5fss_ids[] = {
        { .compatible = "ti,am654-r5fss"},
        { .compatible = "ti,j721e-r5fss"},
+       { .compatible = "ti,j7200-r5fss"},
        {}
 };
 
index 253902f..3fdfe4a 100644 (file)
@@ -148,6 +148,14 @@ config RESET_IMX7
        help
          Support for reset controller on i.MX7/8 SoCs.
 
+config RESET_IPQ419
+       bool "Reset driver for Qualcomm IPQ40xx SoCs"
+       depends on DM_RESET && ARCH_IPQ40XX
+       default y
+       help
+         Support for reset controller on Qualcomm
+         IPQ40xx SoCs.
+
 config RESET_SIFIVE
        bool "Reset Driver for SiFive SoC's"
        depends on DM_RESET && CLK_SIFIVE_FU540_PRCI && TARGET_SIFIVE_FU540
index 3c7f066..5176da5 100644 (file)
@@ -23,6 +23,7 @@ obj-$(CONFIG_RESET_MTMIPS) += reset-mtmips.o
 obj-$(CONFIG_RESET_SUNXI) += reset-sunxi.o
 obj-$(CONFIG_RESET_HISILICON) += reset-hisilicon.o
 obj-$(CONFIG_RESET_IMX7) += reset-imx7.o
+obj-$(CONFIG_RESET_IPQ419) += reset-ipq4019.o
 obj-$(CONFIG_RESET_SIFIVE) += reset-sifive.o
 obj-$(CONFIG_RESET_SYSCON) += reset-syscon.o
 obj-$(CONFIG_RESET_RASPBERRYPI) += reset-raspberrypi.o
diff --git a/drivers/reset/reset-ipq4019.c b/drivers/reset/reset-ipq4019.c
new file mode 100644 (file)
index 0000000..f216db4
--- /dev/null
@@ -0,0 +1,173 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2020 Sartura Ltd.
+ *
+ * Author: Robert Marko <robert.marko@sartura.hr>
+ *
+ * Based on Linux driver
+ */
+
+#include <asm/io.h>
+#include <common.h>
+#include <dm.h>
+#include <dt-bindings/reset/qcom,ipq4019-reset.h>
+#include <reset-uclass.h>
+#include <linux/bitops.h>
+#include <malloc.h>
+
+struct ipq4019_reset_priv {
+       phys_addr_t base;
+};
+
+struct qcom_reset_map {
+       unsigned int reg;
+       u8 bit;
+};
+
+static const struct qcom_reset_map gcc_ipq4019_resets[] = {
+       [WIFI0_CPU_INIT_RESET] = { 0x1f008, 5 },
+       [WIFI0_RADIO_SRIF_RESET] = { 0x1f008, 4 },
+       [WIFI0_RADIO_WARM_RESET] = { 0x1f008, 3 },
+       [WIFI0_RADIO_COLD_RESET] = { 0x1f008, 2 },
+       [WIFI0_CORE_WARM_RESET] = { 0x1f008, 1 },
+       [WIFI0_CORE_COLD_RESET] = { 0x1f008, 0 },
+       [WIFI1_CPU_INIT_RESET] = { 0x20008, 5 },
+       [WIFI1_RADIO_SRIF_RESET] = { 0x20008, 4 },
+       [WIFI1_RADIO_WARM_RESET] = { 0x20008, 3 },
+       [WIFI1_RADIO_COLD_RESET] = { 0x20008, 2 },
+       [WIFI1_CORE_WARM_RESET] = { 0x20008, 1 },
+       [WIFI1_CORE_COLD_RESET] = { 0x20008, 0 },
+       [USB3_UNIPHY_PHY_ARES] = { 0x1e038, 5 },
+       [USB3_HSPHY_POR_ARES] = { 0x1e038, 4 },
+       [USB3_HSPHY_S_ARES] = { 0x1e038, 2 },
+       [USB2_HSPHY_POR_ARES] = { 0x1e01c, 4 },
+       [USB2_HSPHY_S_ARES] = { 0x1e01c, 2 },
+       [PCIE_PHY_AHB_ARES] = { 0x1d010, 11 },
+       [PCIE_AHB_ARES] = { 0x1d010, 10 },
+       [PCIE_PWR_ARES] = { 0x1d010, 9 },
+       [PCIE_PIPE_STICKY_ARES] = { 0x1d010, 8 },
+       [PCIE_AXI_M_STICKY_ARES] = { 0x1d010, 7 },
+       [PCIE_PHY_ARES] = { 0x1d010, 6 },
+       [PCIE_PARF_XPU_ARES] = { 0x1d010, 5 },
+       [PCIE_AXI_S_XPU_ARES] = { 0x1d010, 4 },
+       [PCIE_AXI_M_VMIDMT_ARES] = { 0x1d010, 3 },
+       [PCIE_PIPE_ARES] = { 0x1d010, 2 },
+       [PCIE_AXI_S_ARES] = { 0x1d010, 1 },
+       [PCIE_AXI_M_ARES] = { 0x1d010, 0 },
+       [ESS_RESET] = { 0x12008, 0},
+       [GCC_BLSP1_BCR] = {0x01000, 0},
+       [GCC_BLSP1_QUP1_BCR] = {0x02000, 0},
+       [GCC_BLSP1_UART1_BCR] = {0x02038, 0},
+       [GCC_BLSP1_QUP2_BCR] = {0x03008, 0},
+       [GCC_BLSP1_UART2_BCR] = {0x03028, 0},
+       [GCC_BIMC_BCR] = {0x04000, 0},
+       [GCC_TLMM_BCR] = {0x05000, 0},
+       [GCC_IMEM_BCR] = {0x0E000, 0},
+       [GCC_ESS_BCR] = {0x12008, 0},
+       [GCC_PRNG_BCR] = {0x13000, 0},
+       [GCC_BOOT_ROM_BCR] = {0x13008, 0},
+       [GCC_CRYPTO_BCR] = {0x16000, 0},
+       [GCC_SDCC1_BCR] = {0x18000, 0},
+       [GCC_SEC_CTRL_BCR] = {0x1A000, 0},
+       [GCC_AUDIO_BCR] = {0x1B008, 0},
+       [GCC_QPIC_BCR] = {0x1C000, 0},
+       [GCC_PCIE_BCR] = {0x1D000, 0},
+       [GCC_USB2_BCR] = {0x1E008, 0},
+       [GCC_USB2_PHY_BCR] = {0x1E018, 0},
+       [GCC_USB3_BCR] = {0x1E024, 0},
+       [GCC_USB3_PHY_BCR] = {0x1E034, 0},
+       [GCC_SYSTEM_NOC_BCR] = {0x21000, 0},
+       [GCC_PCNOC_BCR] = {0x2102C, 0},
+       [GCC_DCD_BCR] = {0x21038, 0},
+       [GCC_SNOC_BUS_TIMEOUT0_BCR] = {0x21064, 0},
+       [GCC_SNOC_BUS_TIMEOUT1_BCR] = {0x2106C, 0},
+       [GCC_SNOC_BUS_TIMEOUT2_BCR] = {0x21074, 0},
+       [GCC_SNOC_BUS_TIMEOUT3_BCR] = {0x2107C, 0},
+       [GCC_PCNOC_BUS_TIMEOUT0_BCR] = {0x21084, 0},
+       [GCC_PCNOC_BUS_TIMEOUT1_BCR] = {0x2108C, 0},
+       [GCC_PCNOC_BUS_TIMEOUT2_BCR] = {0x21094, 0},
+       [GCC_PCNOC_BUS_TIMEOUT3_BCR] = {0x2109C, 0},
+       [GCC_PCNOC_BUS_TIMEOUT4_BCR] = {0x210A4, 0},
+       [GCC_PCNOC_BUS_TIMEOUT5_BCR] = {0x210AC, 0},
+       [GCC_PCNOC_BUS_TIMEOUT6_BCR] = {0x210B4, 0},
+       [GCC_PCNOC_BUS_TIMEOUT7_BCR] = {0x210BC, 0},
+       [GCC_PCNOC_BUS_TIMEOUT8_BCR] = {0x210C4, 0},
+       [GCC_PCNOC_BUS_TIMEOUT9_BCR] = {0x210CC, 0},
+       [GCC_TCSR_BCR] = {0x22000, 0},
+       [GCC_MPM_BCR] = {0x24000, 0},
+       [GCC_SPDM_BCR] = {0x25000, 0},
+};
+
+static int ipq4019_reset_assert(struct reset_ctl *rst)
+{
+       struct ipq4019_reset_priv *priv = dev_get_priv(rst->dev);
+       const struct qcom_reset_map *reset_map = gcc_ipq4019_resets;
+       const struct qcom_reset_map *map;
+       u32 value;
+
+       map = &reset_map[rst->id];
+
+       value = readl(priv->base + map->reg);
+       value |= BIT(map->bit);
+       writel(value, priv->base + map->reg);
+
+       return 0;
+}
+
+static int ipq4019_reset_deassert(struct reset_ctl *rst)
+{
+       struct ipq4019_reset_priv *priv = dev_get_priv(rst->dev);
+       const struct qcom_reset_map *reset_map = gcc_ipq4019_resets;
+       const struct qcom_reset_map *map;
+       u32 value;
+
+       map = &reset_map[rst->id];
+
+       value = readl(priv->base + map->reg);
+       value &= ~BIT(map->bit);
+       writel(value, priv->base + map->reg);
+
+       return 0;
+}
+
+static int ipq4019_reset_free(struct reset_ctl *rst)
+{
+       return 0;
+}
+
+static int ipq4019_reset_request(struct reset_ctl *rst)
+{
+       return 0;
+}
+
+static const struct reset_ops ipq4019_reset_ops = {
+       .request = ipq4019_reset_request,
+       .rfree = ipq4019_reset_free,
+       .rst_assert = ipq4019_reset_assert,
+       .rst_deassert = ipq4019_reset_deassert,
+};
+
+static const struct udevice_id ipq4019_reset_ids[] = {
+       { .compatible = "qcom,gcc-reset-ipq4019" },
+       { }
+};
+
+static int ipq4019_reset_probe(struct udevice *dev)
+{
+       struct ipq4019_reset_priv *priv = dev_get_priv(dev);
+
+       priv->base = dev_read_addr(dev);
+       if (priv->base == FDT_ADDR_T_NONE)
+               return -EINVAL;
+
+       return 0;
+}
+
+U_BOOT_DRIVER(ipq4019_reset) = {
+       .name = "ipq4019_reset",
+       .id = UCLASS_RESET,
+       .of_match = ipq4019_reset_ids,
+       .ops = &ipq4019_reset_ops,
+       .probe = ipq4019_reset_probe,
+       .priv_auto_alloc_size = sizeof(struct ipq4019_reset_priv),
+};
index 7169d0f..73d51b3 100644 (file)
@@ -15,7 +15,7 @@ config SANDBOX_SMEM
 config MSM_SMEM
     bool "Qualcomm Shared Memory Manager (SMEM)"
     depends on DM
-    depends on ARCH_SNAPDRAGON
+    depends on ARCH_SNAPDRAGON || ARCH_IPQ40XX
     help
       Enable support for the Qualcomm Shared Memory Manager.
       The driver provides an interface to items in a heap shared among all
index fbf9575..56cb217 100644 (file)
 #include <malloc.h>
 #include <asm/io.h>
 #include <linux/bitops.h>
+#include <omap3_spi.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define OMAP4_MCSPI_REG_OFFSET 0x100
-
 struct omap2_mcspi_platform_config {
        unsigned int regs_offset;
 };
 
-/* per-register bitmasks */
-#define OMAP3_MCSPI_SYSCONFIG_SMARTIDLE (2 << 3)
-#define OMAP3_MCSPI_SYSCONFIG_ENAWAKEUP BIT(2)
-#define OMAP3_MCSPI_SYSCONFIG_AUTOIDLE BIT(0)
-#define OMAP3_MCSPI_SYSCONFIG_SOFTRESET BIT(1)
-
-#define OMAP3_MCSPI_SYSSTATUS_RESETDONE BIT(0)
-
-#define OMAP3_MCSPI_MODULCTRL_SINGLE   BIT(0)
-#define OMAP3_MCSPI_MODULCTRL_MS       BIT(2)
-#define OMAP3_MCSPI_MODULCTRL_STEST    BIT(3)
-
-#define OMAP3_MCSPI_CHCONF_PHA         BIT(0)
-#define OMAP3_MCSPI_CHCONF_POL         BIT(1)
-#define OMAP3_MCSPI_CHCONF_CLKD_MASK   GENMASK(5, 2)
-#define OMAP3_MCSPI_CHCONF_EPOL                BIT(6)
-#define OMAP3_MCSPI_CHCONF_WL_MASK     GENMASK(11, 7)
-#define OMAP3_MCSPI_CHCONF_TRM_RX_ONLY BIT(12)
-#define OMAP3_MCSPI_CHCONF_TRM_TX_ONLY BIT(13)
-#define OMAP3_MCSPI_CHCONF_TRM_MASK    GENMASK(13, 12)
-#define OMAP3_MCSPI_CHCONF_DMAW                BIT(14)
-#define OMAP3_MCSPI_CHCONF_DMAR                BIT(15)
-#define OMAP3_MCSPI_CHCONF_DPE0                BIT(16)
-#define OMAP3_MCSPI_CHCONF_DPE1                BIT(17)
-#define OMAP3_MCSPI_CHCONF_IS          BIT(18)
-#define OMAP3_MCSPI_CHCONF_TURBO       BIT(19)
-#define OMAP3_MCSPI_CHCONF_FORCE       BIT(20)
-
-#define OMAP3_MCSPI_CHSTAT_RXS         BIT(0)
-#define OMAP3_MCSPI_CHSTAT_TXS         BIT(1)
-#define OMAP3_MCSPI_CHSTAT_EOT         BIT(2)
-
-#define OMAP3_MCSPI_CHCTRL_EN          BIT(0)
-#define OMAP3_MCSPI_CHCTRL_DIS         (0 << 0)
-
-#define OMAP3_MCSPI_WAKEUPENABLE_WKEN  BIT(0)
-#define MCSPI_PINDIR_D0_IN_D1_OUT      0
-#define MCSPI_PINDIR_D0_OUT_D1_IN      1
-
-#define OMAP3_MCSPI_MAX_FREQ           48000000
-#define SPI_WAIT_TIMEOUT               10
-
-/* OMAP3 McSPI registers */
-struct mcspi_channel {
-       unsigned int chconf;            /* 0x2C, 0x40, 0x54, 0x68 */
-       unsigned int chstat;            /* 0x30, 0x44, 0x58, 0x6C */
-       unsigned int chctrl;            /* 0x34, 0x48, 0x5C, 0x70 */
-       unsigned int tx;                /* 0x38, 0x4C, 0x60, 0x74 */
-       unsigned int rx;                /* 0x3C, 0x50, 0x64, 0x78 */
-};
-
-struct mcspi {
-       unsigned char res1[0x10];
-       unsigned int sysconfig;         /* 0x10 */
-       unsigned int sysstatus;         /* 0x14 */
-       unsigned int irqstatus;         /* 0x18 */
-       unsigned int irqenable;         /* 0x1C */
-       unsigned int wakeupenable;      /* 0x20 */
-       unsigned int syst;              /* 0x24 */
-       unsigned int modulctrl;         /* 0x28 */
-       struct mcspi_channel channel[4];
-       /* channel0: 0x2C - 0x3C, bus 0 & 1 & 2 & 3 */
-       /* channel1: 0x40 - 0x50, bus 0 & 1 */
-       /* channel2: 0x54 - 0x64, bus 0 & 1 */
-       /* channel3: 0x68 - 0x78, bus 0 */
-};
-
 struct omap3_spi_priv {
        struct mcspi *regs;
        unsigned int cs;
@@ -482,17 +414,10 @@ static int omap3_spi_set_wordlen(struct udevice *dev, unsigned int wordlen)
 static int omap3_spi_probe(struct udevice *dev)
 {
        struct omap3_spi_priv *priv = dev_get_priv(dev);
-       const void *blob = gd->fdt_blob;
-       int node = dev_of_offset(dev);
-
-       struct omap2_mcspi_platform_config* data =
-               (struct omap2_mcspi_platform_config*)dev_get_driver_data(dev);
+       struct omap3_spi_plat *plat = dev_get_platdata(dev);
 
-       priv->regs = (struct mcspi *)(dev_read_addr(dev) + data->regs_offset);
-       if (fdtdec_get_bool(blob, node, "ti,pindir-d0-out-d1-in"))
-               priv->pin_dir = MCSPI_PINDIR_D0_OUT_D1_IN;
-       else
-               priv->pin_dir = MCSPI_PINDIR_D0_IN_D1_OUT;
+       priv->regs = plat->regs;
+       priv->pin_dir = plat->pin_dir;
        priv->wordlen = SPI_DEFAULT_WORDLEN;
 
        spi_reset(priv->regs);
@@ -544,6 +469,7 @@ static const struct dm_spi_ops omap3_spi_ops = {
         */
 };
 
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
 static struct omap2_mcspi_platform_config omap2_pdata = {
        .regs_offset = 0,
 };
@@ -552,16 +478,37 @@ static struct omap2_mcspi_platform_config omap4_pdata = {
        .regs_offset = OMAP4_MCSPI_REG_OFFSET,
 };
 
+static int omap3_spi_ofdata_to_platdata(struct udevice *dev)
+{
+       struct omap2_mcspi_platform_config *data =
+               (struct omap2_mcspi_platform_config *)dev_get_driver_data(dev);
+       struct omap3_spi_plat *plat = dev_get_platdata(dev);
+
+       plat->regs = (struct mcspi *)(dev_read_addr(dev) + data->regs_offset);
+
+       if (dev_read_bool(dev, "ti,pindir-d0-out-d1-in"))
+               plat->pin_dir = MCSPI_PINDIR_D0_OUT_D1_IN;
+       else
+               plat->pin_dir = MCSPI_PINDIR_D0_IN_D1_OUT;
+
+       return 0;
+}
+
 static const struct udevice_id omap3_spi_ids[] = {
        { .compatible = "ti,omap2-mcspi", .data = (ulong)&omap2_pdata },
        { .compatible = "ti,omap4-mcspi", .data = (ulong)&omap4_pdata },
        { }
 };
-
+#endif
 U_BOOT_DRIVER(omap3_spi) = {
        .name   = "omap3_spi",
        .id     = UCLASS_SPI,
+       .flags  = DM_FLAG_PRE_RELOC,
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
        .of_match = omap3_spi_ids,
+       .ofdata_to_platdata = omap3_spi_ofdata_to_platdata,
+       .platdata_auto_alloc_size = sizeof(struct omap3_spi_plat),
+#endif
        .probe = omap3_spi_probe,
        .ops    = &omap3_spi_ops,
        .priv_auto_alloc_size = sizeof(struct omap3_spi_priv),
index cffd9cf..55a8eed 100644 (file)
@@ -497,7 +497,7 @@ UCLASS_DRIVER(spi) = {
        .id             = UCLASS_SPI,
        .name           = "spi",
        .flags          = DM_UC_FLAG_SEQ_ALIAS,
-#if !CONFIG_IS_ENABLED(OF_PLATDATA)
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
        .post_bind      = dm_scan_fdt_dev,
 #endif
        .post_probe     = spi_post_probe,
index 551f682..7fbf250 100644 (file)
@@ -449,6 +449,7 @@ static const struct udevice_id dwc3_glue_ids[] = {
        { .compatible = "ti,am654-dwc3" },
        { .compatible = "rockchip,rk3328-dwc3" },
        { .compatible = "rockchip,rk3399-dwc3" },
+       { .compatible = "qcom,dwc3" },
        { }
 };
 
index f79f063..8933f60 100644 (file)
@@ -1762,13 +1762,13 @@ int ehci_setup_phy(struct udevice *dev, struct phy *phy, int index)
        } else {
                ret = generic_phy_init(phy);
                if (ret) {
-                       dev_err(dev, "failed to init usb phy\n");
+                       dev_dbg(dev, "failed to init usb phy\n");
                        return ret;
                }
 
                ret = generic_phy_power_on(phy);
                if (ret) {
-                       dev_err(dev, "failed to power on usb phy\n");
+                       dev_dbg(dev, "failed to power on usb phy\n");
                        return generic_phy_exit(phy);
                }
        }
@@ -1786,13 +1786,13 @@ int ehci_shutdown_phy(struct udevice *dev, struct phy *phy)
        if (generic_phy_valid(phy)) {
                ret = generic_phy_power_off(phy);
                if (ret) {
-                       dev_err(dev, "failed to power off usb phy\n");
+                       dev_dbg(dev, "failed to power off usb phy\n");
                        return ret;
                }
 
                ret = generic_phy_exit(phy);
                if (ret) {
-                       dev_err(dev, "failed to power off usb phy\n");
+                       dev_dbg(dev, "failed to power off usb phy\n");
                        return ret;
                }
        }
index b84bf8a..ed5e500 100644 (file)
@@ -41,13 +41,13 @@ static int ohci_setup_phy(struct udevice *dev, int index)
        } else {
                ret = generic_phy_init(&priv->phy);
                if (ret) {
-                       dev_err(dev, "failed to init usb phy\n");
+                       dev_dbg(dev, "failed to init usb phy\n");
                        return ret;
                }
 
                ret = generic_phy_power_on(&priv->phy);
                if (ret) {
-                       dev_err(dev, "failed to power on usb phy\n");
+                       dev_dbg(dev, "failed to power on usb phy\n");
                        return generic_phy_exit(&priv->phy);
                }
        }
@@ -63,13 +63,13 @@ static int ohci_shutdown_phy(struct udevice *dev)
        if (generic_phy_valid(&priv->phy)) {
                ret = generic_phy_power_off(&priv->phy);
                if (ret) {
-                       dev_err(dev, "failed to power off usb phy\n");
+                       dev_dbg(dev, "failed to power off usb phy\n");
                        return ret;
                }
 
                ret = generic_phy_exit(&priv->phy);
                if (ret) {
-                       dev_err(dev, "failed to power off usb phy\n");
+                       dev_dbg(dev, "failed to power off usb phy\n");
                        return ret;
                }
        }
index 53c336f..06a55bf 100644 (file)
@@ -257,7 +257,7 @@ static int sunxi_musb_enable(struct musb *musb)
 
                ret = generic_phy_power_on(&glue->phy);
                if (ret) {
-                       pr_err("failed to power on USB PHY\n");
+                       pr_debug("failed to power on USB PHY\n");
                        return ret;
                }
        }
@@ -281,7 +281,7 @@ static void sunxi_musb_disable(struct musb *musb)
        if (is_host_enabled(musb)) {
                ret = generic_phy_power_off(&glue->phy);
                if (ret) {
-                       pr_err("failed to power off USB PHY\n");
+                       pr_debug("failed to power off USB PHY\n");
                        return;
                }
        }
@@ -315,7 +315,7 @@ static int sunxi_musb_init(struct musb *musb)
 
        ret = generic_phy_init(&glue->phy);
        if (ret) {
-               dev_err(dev, "failed to init USB PHY\n");
+               dev_dbg(dev, "failed to init USB PHY\n");
                goto err_rst;
        }
 
@@ -352,7 +352,7 @@ static int sunxi_musb_exit(struct musb *musb)
        if (generic_phy_valid(&glue->phy)) {
                ret = generic_phy_exit(&glue->phy);
                if (ret) {
-                       dev_err(dev, "failed to power off usb phy\n");
+                       dev_dbg(dev, "failed to power off usb phy\n");
                        return ret;
                }
        }
index badade3..3f07f4e 100644 (file)
@@ -1983,8 +1983,6 @@ static void *video_logo(void)
 static int cfb_fb_is_in_dram(void)
 {
        struct bd_info *bd = gd->bd;
-#if defined(CONFIG_ARM) || defined(CONFIG_NDS32) || \
-defined(CONFIG_SANDBOX) || defined(CONFIG_X86)
        ulong start, end;
        int i;
 
@@ -1995,11 +1993,7 @@ defined(CONFIG_SANDBOX) || defined(CONFIG_X86)
                    (ulong)video_fb_address < end)
                        return 1;
        }
-#else
-       if ((ulong)video_fb_address >= bd->bi_memstart &&
-           (ulong)video_fb_address < bd->bi_memstart + bd->bi_memsize)
-               return 1;
-#endif
+
        return 0;
 }
 
index 9b31592..fc074c8 100644 (file)
@@ -2,5 +2,6 @@
 #
 # 2017 Marek Behun, CZ.NIC, marek.behun@nic.cz
 
-obj-y := btrfs.o chunk-map.o compression.o ctree.o dev.o dir-item.o \
-       extent-io.o hash.o inode.o root.o subvolume.o super.o
+obj-y := btrfs.o compression.o ctree.o dev.o dir-item.o \
+       extent-io.o inode.o subvolume.o crypto/hash.o disk-io.o \
+       common/rbtree-utils.o extent-cache.o volumes.o root-tree.o
index de16217..cbf9dcf 100644 (file)
  * 2017 Marek Behun, CZ.NIC, marek.behun@nic.cz
  */
 
-#include "btrfs.h"
 #include <config.h>
 #include <malloc.h>
 #include <uuid.h>
 #include <linux/time.h>
+#include "btrfs.h"
+#include "crypto/hash.h"
+#include "disk-io.h"
 
-struct btrfs_info btrfs_info;
+struct btrfs_fs_info *current_fs_info;
 
-static int readdir_callback(const struct btrfs_root *root,
-                           struct btrfs_dir_item *item)
+static int show_dir(struct btrfs_root *root, struct extent_buffer *eb,
+                   struct btrfs_dir_item *di)
 {
-       static const char typestr[BTRFS_FT_MAX][4] = {
-               [BTRFS_FT_UNKNOWN]  = " ? ",
-               [BTRFS_FT_REG_FILE] = "   ",
-               [BTRFS_FT_DIR]      = "DIR",
-               [BTRFS_FT_CHRDEV]   = "CHR",
-               [BTRFS_FT_BLKDEV]   = "BLK",
-               [BTRFS_FT_FIFO]     = "FIF",
-               [BTRFS_FT_SOCK]     = "SCK",
-               [BTRFS_FT_SYMLINK]  = "SYM",
-               [BTRFS_FT_XATTR]    = " ? ",
+       struct btrfs_fs_info *fs_info = root->fs_info;
+       struct btrfs_inode_item ii;
+       struct btrfs_key key;
+       static const char* dir_item_str[] = {
+               [BTRFS_FT_REG_FILE]     = "FILE",
+               [BTRFS_FT_DIR]          = "DIR",
+               [BTRFS_FT_CHRDEV]       = "CHRDEV",
+               [BTRFS_FT_BLKDEV]       = "BLKDEV",
+               [BTRFS_FT_FIFO]         = "FIFO",
+               [BTRFS_FT_SOCK]         = "SOCK",
+               [BTRFS_FT_SYMLINK]      = "SYMLINK",
+               [BTRFS_FT_XATTR]        = "XATTR"
        };
-       struct btrfs_inode_item inode;
-       const char *name = (const char *) (item + 1);
-       char filetime[32], *target = NULL;
+       u8 type = btrfs_dir_type(eb, di);
+       char namebuf[BTRFS_NAME_LEN];
+       char *target = NULL;
+       char filetime[32];
        time_t mtime;
+       int ret;
 
-       if (btrfs_lookup_inode(root, &item->location, &inode, NULL)) {
-               printf("%s: Cannot find inode item for directory entry %.*s!\n",
-                      __func__, item->name_len, name);
-               return 0;
-       }
-
-       mtime = inode.mtime.sec;
-       ctime_r(&mtime, filetime);
+       btrfs_dir_item_key_to_cpu(eb, di, &key);
 
-       if (item->type == BTRFS_FT_SYMLINK) {
-               target = malloc(min(inode.size + 1,
-                                   (u64) btrfs_info.sb.sectorsize));
+       if (key.type == BTRFS_ROOT_ITEM_KEY) {
+               struct btrfs_root *subvol;
 
-               if (target && btrfs_readlink(root, item->location.objectid,
-                                            target)) {
-                       free(target);
-                       target = NULL;
+               /* It's a subvolume, get its mtime from root item */
+               subvol = btrfs_read_fs_root(fs_info, &key);
+               if (IS_ERR(subvol)) {
+                       ret = PTR_ERR(subvol);
+                       error("Can't find root %llu", key.objectid);
+                       return ret;
                }
+               mtime = btrfs_stack_timespec_sec(&subvol->root_item.otime);
+       } else {
+               struct btrfs_path path;
+
+               /* It's regular inode, get its mtime from inode item */
+               btrfs_init_path(&path);
+               ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
+               if (ret > 0)
+                       ret = -ENOENT;
+               if (ret < 0) {
+                       error("Can't find inode %llu", key.objectid);
+                       btrfs_release_path(&path);
+                       return ret;
+               }
+               read_extent_buffer(path.nodes[0], &ii,
+                       btrfs_item_ptr_offset(path.nodes[0], path.slots[0]),
+                       sizeof(ii));
+               btrfs_release_path(&path);
+               mtime = btrfs_stack_timespec_sec(&ii.mtime);
+       }
+       ctime_r(&mtime, filetime);
 
-               if (!target)
-                       printf("%s: Cannot read symlink target!\n", __func__);
+       if (type == BTRFS_FT_SYMLINK) {
+               target = malloc(fs_info->sectorsize);
+               if (!target) {
+                       error("Can't alloc memory for symlink %llu",
+                               key.objectid);
+                       return -ENOMEM;
+               }
+               ret = btrfs_readlink(root, key.objectid, target);
+               if (ret < 0) {
+                       error("Failed to read symlink %llu", key.objectid);
+                       goto out;
+               }
+               target[ret] = '\0';
        }
 
-       printf("<%s> ", typestr[item->type]);
-       if (item->type == BTRFS_FT_CHRDEV || item->type == BTRFS_FT_BLKDEV)
-               printf("%4u,%5u  ", (unsigned int) (inode.rdev >> 20),
-                       (unsigned int) (inode.rdev & 0xfffff));
+       if (type < ARRAY_SIZE(dir_item_str) && dir_item_str[type])
+               printf("<%s> ", dir_item_str[type]);
        else
-               printf("%10llu  ", inode.size);
-
-       printf("%24.24s  %.*s", filetime, item->name_len, name);
-
-       if (item->type == BTRFS_FT_SYMLINK) {
-               printf(" -> %s", target ? target : "?");
-               if (target)
-                       free(target);
+               printf("DIR_ITEM.%u", type);
+       if (type == BTRFS_FT_CHRDEV || type == BTRFS_FT_BLKDEV) {
+               ASSERT(key.type == BTRFS_INODE_ITEM_KEY);
+               printf("%4llu,%5llu  ", btrfs_stack_inode_rdev(&ii) >> 20,
+                               btrfs_stack_inode_rdev(&ii) & 0xfffff);
+       } else {
+               if (key.type == BTRFS_INODE_ITEM_KEY)
+                       printf("%10llu  ", btrfs_stack_inode_size(&ii));
+               else
+                       printf("%10llu  ", 0ULL);
        }
 
+       read_extent_buffer(eb, namebuf, (unsigned long)(di + 1),
+                          btrfs_dir_name_len(eb, di));
+       printf("%24.24s  %.*s", filetime, btrfs_dir_name_len(eb, di), namebuf);
+       if (type == BTRFS_FT_SYMLINK)
+               printf(" -> %s", target ? target : "?");
        printf("\n");
-
-       return 0;
+out:
+       free(target);
+       return ret;
 }
 
 int btrfs_probe(struct blk_desc *fs_dev_desc,
                struct disk_partition *fs_partition)
 {
-       btrfs_blk_desc = fs_dev_desc;
-       btrfs_part_info = fs_partition;
-
-       memset(&btrfs_info, 0, sizeof(btrfs_info));
+       struct btrfs_fs_info *fs_info;
+       int ret = -1;
 
        btrfs_hash_init();
-       if (btrfs_read_superblock())
-               return -1;
-
-       if (btrfs_chunk_map_init()) {
-               printf("%s: failed to init chunk map\n", __func__);
-               return -1;
+       fs_info = open_ctree_fs_info(fs_dev_desc, fs_partition);
+       if (fs_info) {
+               current_fs_info = fs_info;
+               ret = 0;
        }
-
-       btrfs_info.tree_root.objectid = 0;
-       btrfs_info.tree_root.bytenr = btrfs_info.sb.root;
-       btrfs_info.chunk_root.objectid = 0;
-       btrfs_info.chunk_root.bytenr = btrfs_info.sb.chunk_root;
-
-       if (btrfs_read_chunk_tree()) {
-               printf("%s: failed to read chunk tree\n", __func__);
-               return -1;
-       }
-
-       if (btrfs_find_root(btrfs_get_default_subvol_objectid(),
-                           &btrfs_info.fs_root, NULL)) {
-               printf("%s: failed to find default subvolume\n", __func__);
-               return -1;
-       }
-
-       return 0;
+       return ret;
 }
 
 int btrfs_ls(const char *path)
 {
-       struct btrfs_root root = btrfs_info.fs_root;
-       u64 inr;
+       struct btrfs_fs_info *fs_info = current_fs_info;
+       struct btrfs_root *root = fs_info->fs_root;
+       u64 ino = BTRFS_FIRST_FREE_OBJECTID;
        u8 type;
+       int ret;
 
-       inr = btrfs_lookup_path(&root, root.root_dirid, path, &type, NULL, 40);
-
-       if (inr == -1ULL) {
+       ASSERT(fs_info);
+       ret = btrfs_lookup_path(fs_info->fs_root, BTRFS_FIRST_FREE_OBJECTID,
+                               path, &root, &ino, &type, 40);
+       if (ret < 0) {
                printf("Cannot lookup path %s\n", path);
-               return -1;
+               return ret;
        }
 
        if (type != BTRFS_FT_DIR) {
-               printf("Not a directory: %s\n", path);
-               return -1;
+               error("Not a directory: %s", path);
+               return -ENOENT;
        }
-
-       if (btrfs_readdir(&root, inr, readdir_callback)) {
-               printf("An error occured while listing directory %s\n", path);
-               return -1;
+       ret = btrfs_iter_dir(root, ino, show_dir);
+       if (ret < 0) {
+               error("An error occured while listing directory %s", path);
+               return ret;
        }
-
        return 0;
 }
 
 int btrfs_exists(const char *file)
 {
-       struct btrfs_root root = btrfs_info.fs_root;
-       u64 inr;
+       struct btrfs_fs_info *fs_info = current_fs_info;
+       struct btrfs_root *root;
+       u64 ino;
        u8 type;
+       int ret;
 
-       inr = btrfs_lookup_path(&root, root.root_dirid, file, &type, NULL, 40);
+       ASSERT(fs_info);
 
-       return (inr != -1ULL && type == BTRFS_FT_REG_FILE);
+       ret = btrfs_lookup_path(fs_info->fs_root, BTRFS_FIRST_FREE_OBJECTID,
+                               file, &root, &ino, &type, 40);
+       if (ret < 0)
+               return 0;
+
+       if (type == BTRFS_FT_REG_FILE)
+               return 1;
+       return 0;
 }
 
 int btrfs_size(const char *file, loff_t *size)
 {
-       struct btrfs_root root = btrfs_info.fs_root;
-       struct btrfs_inode_item inode;
-       u64 inr;
+       struct btrfs_fs_info *fs_info = current_fs_info;
+       struct btrfs_inode_item *ii;
+       struct btrfs_root *root;
+       struct btrfs_path path;
+       struct btrfs_key key;
+       u64 ino;
        u8 type;
+       int ret;
 
-       inr = btrfs_lookup_path(&root, root.root_dirid, file, &type, &inode,
-                               40);
-
-       if (inr == -1ULL) {
+       ret = btrfs_lookup_path(fs_info->fs_root, BTRFS_FIRST_FREE_OBJECTID,
+                               file, &root, &ino, &type, 40);
+       if (ret < 0) {
                printf("Cannot lookup file %s\n", file);
-               return -1;
+               return ret;
        }
-
        if (type != BTRFS_FT_REG_FILE) {
                printf("Not a regular file: %s\n", file);
-               return -1;
+               return -ENOENT;
        }
-
-       *size = inode.size;
-       return 0;
+       btrfs_init_path(&path);
+       key.objectid = ino;
+       key.type = BTRFS_INODE_ITEM_KEY;
+       key.offset = 0;
+
+       ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
+       if (ret < 0) {
+               printf("Cannot lookup ino %llu\n", ino);
+               return ret;
+       }
+       if (ret > 0) {
+               printf("Ino %llu does not exist\n", ino);
+               ret = -ENOENT;
+               goto out;
+       }
+       ii = btrfs_item_ptr(path.nodes[0], path.slots[0],
+                           struct btrfs_inode_item);
+       *size = btrfs_inode_size(path.nodes[0], ii);
+out:
+       btrfs_release_path(&path);
+       return ret;
 }
 
 int btrfs_read(const char *file, void *buf, loff_t offset, loff_t len,
               loff_t *actread)
 {
-       struct btrfs_root root = btrfs_info.fs_root;
-       struct btrfs_inode_item inode;
-       u64 inr, rd;
+       struct btrfs_fs_info *fs_info = current_fs_info;
+       struct btrfs_root *root;
+       loff_t real_size = 0;
+       u64 ino;
        u8 type;
-
-       inr = btrfs_lookup_path(&root, root.root_dirid, file, &type, &inode,
-                               40);
-
-       if (inr == -1ULL) {
-               printf("Cannot lookup file %s\n", file);
-               return -1;
+       int ret;
+
+       ASSERT(fs_info);
+       ret = btrfs_lookup_path(fs_info->fs_root, BTRFS_FIRST_FREE_OBJECTID,
+                               file, &root, &ino, &type, 40);
+       if (ret < 0) {
+               error("Cannot lookup file %s", file);
+               return ret;
        }
 
        if (type != BTRFS_FT_REG_FILE) {
-               printf("Not a regular file: %s\n", file);
-               return -1;
+               error("Not a regular file: %s", file);
+               return -EINVAL;
        }
 
-       if (!len)
-               len = inode.size;
+       if (!len) {
+               ret = btrfs_size(file, &real_size);
+               if (ret < 0) {
+                       error("Failed to get inode size: %s", file);
+                       return ret;
+               }
+               len = real_size;
+       }
 
-       if (len > inode.size - offset)
-               len = inode.size - offset;
+       if (len > real_size - offset)
+               len = real_size - offset;
 
-       rd = btrfs_file_read(&root, inr, offset, len, buf);
-       if (rd == -1ULL) {
-               printf("An error occured while reading file %s\n", file);
-               return -1;
+       ret = btrfs_file_read(root, ino, offset, len, buf);
+       if (ret < 0) {
+               error("An error occured while reading file %s", file);
+               return ret;
        }
 
-       *actread = rd;
+       *actread = len;
        return 0;
 }
 
 void btrfs_close(void)
 {
-       btrfs_chunk_map_exit();
+       if (current_fs_info) {
+               close_ctree_fs_info(current_fs_info);
+               current_fs_info = NULL;
+       }
 }
 
 int btrfs_uuid(char *uuid_str)
 {
 #ifdef CONFIG_LIB_UUID
-       uuid_bin_to_str(btrfs_info.sb.fsid, uuid_str, UUID_STR_FORMAT_STD);
+       if (current_fs_info)
+               uuid_bin_to_str(current_fs_info->super_copy->fsid, uuid_str,
+                               UUID_STR_FORMAT_STD);
        return 0;
 #endif
        return -ENOSYS;
index 25a8cf6..7d8b395 100644 (file)
 #include <linux/rbtree.h>
 #include "conv-funcs.h"
 
-struct btrfs_info {
-       struct btrfs_super_block sb;
-
-       struct btrfs_root tree_root;
-       struct btrfs_root fs_root;
-       struct btrfs_root chunk_root;
-
-       struct rb_root chunks_root;
-};
-
 extern struct btrfs_info btrfs_info;
-
-/* hash.c */
-void btrfs_hash_init(void);
-u32 btrfs_crc32c(u32, const void *, size_t);
-u32 btrfs_csum_data(char *, u32, size_t);
-void btrfs_csum_final(u32, void *);
-
-static inline u64 btrfs_name_hash(const char *name, int len)
-{
-       return btrfs_crc32c((u32) ~1, name, len);
-}
-
-/* dev.c */
-extern struct blk_desc *btrfs_blk_desc;
-extern struct disk_partition *btrfs_part_info;
-
-int btrfs_devread(u64, int, void *);
-
-/* chunk-map.c */
-u64 btrfs_map_logical_to_physical(u64);
-int btrfs_chunk_map_init(void);
-void btrfs_chunk_map_exit(void);
-int btrfs_read_chunk_tree(void);
+extern struct btrfs_fs_info *current_fs_info;
 
 /* compression.c */
 u32 btrfs_decompress(u8 type, const char *, u32, char *, u32);
 
-/* super.c */
-int btrfs_read_superblock(void);
-
-/* dir-item.c */
-typedef int (*btrfs_readdir_callback_t)(const struct btrfs_root *,
-                                       struct btrfs_dir_item *);
-
-int btrfs_lookup_dir_item(const struct btrfs_root *, u64, const char *, int,
-                          struct btrfs_dir_item *);
-int btrfs_readdir(const struct btrfs_root *, u64, btrfs_readdir_callback_t);
-
-/* root.c */
-int btrfs_find_root(u64, struct btrfs_root *, struct btrfs_root_item *);
-u64 btrfs_lookup_root_ref(u64, struct btrfs_root_ref *, char *);
-
 /* inode.c */
-u64 btrfs_lookup_inode_ref(struct btrfs_root *, u64, struct btrfs_inode_ref *,
-                           char *);
-int btrfs_lookup_inode(const struct btrfs_root *, struct btrfs_key *,
-                       struct btrfs_inode_item *, struct btrfs_root *);
-int btrfs_readlink(const struct btrfs_root *, u64, char *);
-u64 btrfs_lookup_path(struct btrfs_root *, u64, const char *, u8 *,
-                      struct btrfs_inode_item *, int);
-u64 btrfs_file_read(const struct btrfs_root *, u64, u64, u64, char *);
+int btrfs_readlink(struct btrfs_root *root, u64 ino, char *target);
+int btrfs_file_read(struct btrfs_root *root, u64 ino, u64 file_offset, u64 len,
+                   char *dest);
 
 /* subvolume.c */
 u64 btrfs_get_default_subvol_objectid(void);
 
-/* extent-io.c */
-u64 btrfs_read_extent_inline(struct btrfs_path *,
-                             struct btrfs_file_extent_item *, u64, u64,
-                             char *);
-u64 btrfs_read_extent_reg(struct btrfs_path *, struct btrfs_file_extent_item *,
-                          u64, u64, char *);
-
 #endif /* !__BTRFS_BTRFS_H__ */
diff --git a/fs/btrfs/btrfs_tree.h b/fs/btrfs/btrfs_tree.h
deleted file mode 100644 (file)
index aa0f3d6..0000000
+++ /dev/null
@@ -1,766 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * From linux/include/uapi/linux/btrfs_tree.h
- */
-
-#ifndef __BTRFS_BTRFS_TREE_H__
-#define __BTRFS_BTRFS_TREE_H__
-
-#include <common.h>
-
-#define BTRFS_VOL_NAME_MAX 255
-#define BTRFS_NAME_MAX 255
-#define BTRFS_LABEL_SIZE 256
-#define BTRFS_FSID_SIZE 16
-#define BTRFS_UUID_SIZE 16
-
-/*
- * This header contains the structure definitions and constants used
- * by file system objects that can be retrieved using
- * the BTRFS_IOC_SEARCH_TREE ioctl.  That means basically anything that
- * is needed to describe a leaf node's key or item contents.
- */
-
-/* holds pointers to all of the tree roots */
-#define BTRFS_ROOT_TREE_OBJECTID 1ULL
-
-/* stores information about which extents are in use, and reference counts */
-#define BTRFS_EXTENT_TREE_OBJECTID 2ULL
-
-/*
- * chunk tree stores translations from logical -> physical block numbering
- * the super block points to the chunk tree
- */
-#define BTRFS_CHUNK_TREE_OBJECTID 3ULL
-
-/*
- * stores information about which areas of a given device are in use.
- * one per device.  The tree of tree roots points to the device tree
- */
-#define BTRFS_DEV_TREE_OBJECTID 4ULL
-
-/* one per subvolume, storing files and directories */
-#define BTRFS_FS_TREE_OBJECTID 5ULL
-
-/* directory objectid inside the root tree */
-#define BTRFS_ROOT_TREE_DIR_OBJECTID 6ULL
-
-/* holds checksums of all the data extents */
-#define BTRFS_CSUM_TREE_OBJECTID 7ULL
-
-/* holds quota configuration and tracking */
-#define BTRFS_QUOTA_TREE_OBJECTID 8ULL
-
-/* for storing items that use the BTRFS_UUID_KEY* types */
-#define BTRFS_UUID_TREE_OBJECTID 9ULL
-
-/* tracks free space in block groups. */
-#define BTRFS_FREE_SPACE_TREE_OBJECTID 10ULL
-
-/* device stats in the device tree */
-#define BTRFS_DEV_STATS_OBJECTID 0ULL
-
-/* for storing balance parameters in the root tree */
-#define BTRFS_BALANCE_OBJECTID -4ULL
-
-/* orhpan objectid for tracking unlinked/truncated files */
-#define BTRFS_ORPHAN_OBJECTID -5ULL
-
-/* does write ahead logging to speed up fsyncs */
-#define BTRFS_TREE_LOG_OBJECTID -6ULL
-#define BTRFS_TREE_LOG_FIXUP_OBJECTID -7ULL
-
-/* for space balancing */
-#define BTRFS_TREE_RELOC_OBJECTID -8ULL
-#define BTRFS_DATA_RELOC_TREE_OBJECTID -9ULL
-
-/*
- * extent checksums all have this objectid
- * this allows them to share the logging tree
- * for fsyncs
- */
-#define BTRFS_EXTENT_CSUM_OBJECTID -10ULL
-
-/* For storing free space cache */
-#define BTRFS_FREE_SPACE_OBJECTID -11ULL
-
-/*
- * The inode number assigned to the special inode for storing
- * free ino cache
- */
-#define BTRFS_FREE_INO_OBJECTID -12ULL
-
-/* dummy objectid represents multiple objectids */
-#define BTRFS_MULTIPLE_OBJECTIDS -255ULL
-
-/*
- * All files have objectids in this range.
- */
-#define BTRFS_FIRST_FREE_OBJECTID 256ULL
-#define BTRFS_LAST_FREE_OBJECTID -256ULL
-#define BTRFS_FIRST_CHUNK_TREE_OBJECTID 256ULL
-
-
-/*
- * the device items go into the chunk tree.  The key is in the form
- * [ 1 BTRFS_DEV_ITEM_KEY device_id ]
- */
-#define BTRFS_DEV_ITEMS_OBJECTID 1ULL
-
-#define BTRFS_BTREE_INODE_OBJECTID 1
-
-#define BTRFS_EMPTY_SUBVOL_DIR_OBJECTID 2
-
-#define BTRFS_DEV_REPLACE_DEVID 0ULL
-
-/*
- * inode items have the data typically returned from stat and store other
- * info about object characteristics.  There is one for every file and dir in
- * the FS
- */
-#define BTRFS_INODE_ITEM_KEY           1
-#define BTRFS_INODE_REF_KEY            12
-#define BTRFS_INODE_EXTREF_KEY         13
-#define BTRFS_XATTR_ITEM_KEY           24
-#define BTRFS_ORPHAN_ITEM_KEY          48
-/* reserve 2-15 close to the inode for later flexibility */
-
-/*
- * dir items are the name -> inode pointers in a directory.  There is one
- * for every name in a directory.
- */
-#define BTRFS_DIR_LOG_ITEM_KEY  60
-#define BTRFS_DIR_LOG_INDEX_KEY 72
-#define BTRFS_DIR_ITEM_KEY     84
-#define BTRFS_DIR_INDEX_KEY    96
-/*
- * extent data is for file data
- */
-#define BTRFS_EXTENT_DATA_KEY  108
-
-/*
- * extent csums are stored in a separate tree and hold csums for
- * an entire extent on disk.
- */
-#define BTRFS_EXTENT_CSUM_KEY  128
-
-/*
- * root items point to tree roots.  They are typically in the root
- * tree used by the super block to find all the other trees
- */
-#define BTRFS_ROOT_ITEM_KEY    132
-
-/*
- * root backrefs tie subvols and snapshots to the directory entries that
- * reference them
- */
-#define BTRFS_ROOT_BACKREF_KEY 144
-
-/*
- * root refs make a fast index for listing all of the snapshots and
- * subvolumes referenced by a given root.  They point directly to the
- * directory item in the root that references the subvol
- */
-#define BTRFS_ROOT_REF_KEY     156
-
-/*
- * extent items are in the extent map tree.  These record which blocks
- * are used, and how many references there are to each block
- */
-#define BTRFS_EXTENT_ITEM_KEY  168
-
-/*
- * The same as the BTRFS_EXTENT_ITEM_KEY, except it's metadata we already know
- * the length, so we save the level in key->offset instead of the length.
- */
-#define BTRFS_METADATA_ITEM_KEY        169
-
-#define BTRFS_TREE_BLOCK_REF_KEY       176
-
-#define BTRFS_EXTENT_DATA_REF_KEY      178
-
-#define BTRFS_EXTENT_REF_V0_KEY                180
-
-#define BTRFS_SHARED_BLOCK_REF_KEY     182
-
-#define BTRFS_SHARED_DATA_REF_KEY      184
-
-/*
- * block groups give us hints into the extent allocation trees.  Which
- * blocks are free etc etc
- */
-#define BTRFS_BLOCK_GROUP_ITEM_KEY 192
-
-/*
- * Every block group is represented in the free space tree by a free space info
- * item, which stores some accounting information. It is keyed on
- * (block_group_start, FREE_SPACE_INFO, block_group_length).
- */
-#define BTRFS_FREE_SPACE_INFO_KEY 198
-
-/*
- * A free space extent tracks an extent of space that is free in a block group.
- * It is keyed on (start, FREE_SPACE_EXTENT, length).
- */
-#define BTRFS_FREE_SPACE_EXTENT_KEY 199
-
-/*
- * When a block group becomes very fragmented, we convert it to use bitmaps
- * instead of extents. A free space bitmap is keyed on
- * (start, FREE_SPACE_BITMAP, length); the corresponding item is a bitmap with
- * (length / sectorsize) bits.
- */
-#define BTRFS_FREE_SPACE_BITMAP_KEY 200
-
-#define BTRFS_DEV_EXTENT_KEY   204
-#define BTRFS_DEV_ITEM_KEY     216
-#define BTRFS_CHUNK_ITEM_KEY   228
-
-/*
- * Records the overall state of the qgroups.
- * There's only one instance of this key present,
- * (0, BTRFS_QGROUP_STATUS_KEY, 0)
- */
-#define BTRFS_QGROUP_STATUS_KEY         240
-/*
- * Records the currently used space of the qgroup.
- * One key per qgroup, (0, BTRFS_QGROUP_INFO_KEY, qgroupid).
- */
-#define BTRFS_QGROUP_INFO_KEY           242
-/*
- * Contains the user configured limits for the qgroup.
- * One key per qgroup, (0, BTRFS_QGROUP_LIMIT_KEY, qgroupid).
- */
-#define BTRFS_QGROUP_LIMIT_KEY          244
-/*
- * Records the child-parent relationship of qgroups. For
- * each relation, 2 keys are present:
- * (childid, BTRFS_QGROUP_RELATION_KEY, parentid)
- * (parentid, BTRFS_QGROUP_RELATION_KEY, childid)
- */
-#define BTRFS_QGROUP_RELATION_KEY       246
-
-/*
- * Obsolete name, see BTRFS_TEMPORARY_ITEM_KEY.
- */
-#define BTRFS_BALANCE_ITEM_KEY 248
-
-/*
- * The key type for tree items that are stored persistently, but do not need to
- * exist for extended period of time. The items can exist in any tree.
- *
- * [subtype, BTRFS_TEMPORARY_ITEM_KEY, data]
- *
- * Existing items:
- *
- * - balance status item
- *   (BTRFS_BALANCE_OBJECTID, BTRFS_TEMPORARY_ITEM_KEY, 0)
- */
-#define BTRFS_TEMPORARY_ITEM_KEY       248
-
-/*
- * Obsolete name, see BTRFS_PERSISTENT_ITEM_KEY
- */
-#define BTRFS_DEV_STATS_KEY            249
-
-/*
- * The key type for tree items that are stored persistently and usually exist
- * for a long period, eg. filesystem lifetime. The item kinds can be status
- * information, stats or preference values. The item can exist in any tree.
- *
- * [subtype, BTRFS_PERSISTENT_ITEM_KEY, data]
- *
- * Existing items:
- *
- * - device statistics, store IO stats in the device tree, one key for all
- *   stats
- *   (BTRFS_DEV_STATS_OBJECTID, BTRFS_DEV_STATS_KEY, 0)
- */
-#define BTRFS_PERSISTENT_ITEM_KEY      249
-
-/*
- * Persistantly stores the device replace state in the device tree.
- * The key is built like this: (0, BTRFS_DEV_REPLACE_KEY, 0).
- */
-#define BTRFS_DEV_REPLACE_KEY  250
-
-/*
- * Stores items that allow to quickly map UUIDs to something else.
- * These items are part of the filesystem UUID tree.
- * The key is built like this:
- * (UUID_upper_64_bits, BTRFS_UUID_KEY*, UUID_lower_64_bits).
- */
-#if BTRFS_UUID_SIZE != 16
-#error "UUID items require BTRFS_UUID_SIZE == 16!"
-#endif
-#define BTRFS_UUID_KEY_SUBVOL  251     /* for UUIDs assigned to subvols */
-#define BTRFS_UUID_KEY_RECEIVED_SUBVOL 252     /* for UUIDs assigned to
-                                                * received subvols */
-
-/*
- * string items are for debugging.  They just store a short string of
- * data in the FS
- */
-#define BTRFS_STRING_ITEM_KEY  253
-
-
-
-/* 32 bytes in various csum fields */
-#define BTRFS_CSUM_SIZE 32
-
-/* csum types */
-#define BTRFS_CSUM_TYPE_CRC32  0
-
-/*
- * flags definitions for directory entry item type
- *
- * Used by:
- * struct btrfs_dir_item.type
- */
-#define BTRFS_FT_UNKNOWN       0
-#define BTRFS_FT_REG_FILE      1
-#define BTRFS_FT_DIR           2
-#define BTRFS_FT_CHRDEV                3
-#define BTRFS_FT_BLKDEV                4
-#define BTRFS_FT_FIFO          5
-#define BTRFS_FT_SOCK          6
-#define BTRFS_FT_SYMLINK       7
-#define BTRFS_FT_XATTR         8
-#define BTRFS_FT_MAX           9
-
-/*
- * The key defines the order in the tree, and so it also defines (optimal)
- * block layout.
- *
- * objectid corresponds to the inode number.
- *
- * type tells us things about the object, and is a kind of stream selector.
- * so for a given inode, keys with type of 1 might refer to the inode data,
- * type of 2 may point to file data in the btree and type == 3 may point to
- * extents.
- *
- * offset is the starting byte offset for this key in the stream.
- */
-
-struct btrfs_key {
-       __u64 objectid;
-       __u8 type;
-       __u64 offset;
-} __attribute__ ((__packed__));
-
-struct btrfs_dev_item {
-       /* the internal btrfs device id */
-       __u64 devid;
-
-       /* size of the device */
-       __u64 total_bytes;
-
-       /* bytes used */
-       __u64 bytes_used;
-
-       /* optimal io alignment for this device */
-       __u32 io_align;
-
-       /* optimal io width for this device */
-       __u32 io_width;
-
-       /* minimal io size for this device */
-       __u32 sector_size;
-
-       /* type and info about this device */
-       __u64 type;
-
-       /* expected generation for this device */
-       __u64 generation;
-
-       /*
-        * starting byte of this partition on the device,
-        * to allow for stripe alignment in the future
-        */
-       __u64 start_offset;
-
-       /* grouping information for allocation decisions */
-       __u32 dev_group;
-
-       /* seek speed 0-100 where 100 is fastest */
-       __u8 seek_speed;
-
-       /* bandwidth 0-100 where 100 is fastest */
-       __u8 bandwidth;
-
-       /* btrfs generated uuid for this device */
-       __u8 uuid[BTRFS_UUID_SIZE];
-
-       /* uuid of FS who owns this device */
-       __u8 fsid[BTRFS_UUID_SIZE];
-} __attribute__ ((__packed__));
-
-struct btrfs_stripe {
-       __u64 devid;
-       __u64 offset;
-       __u8 dev_uuid[BTRFS_UUID_SIZE];
-} __attribute__ ((__packed__));
-
-struct btrfs_chunk {
-       /* size of this chunk in bytes */
-       __u64 length;
-
-       /* objectid of the root referencing this chunk */
-       __u64 owner;
-
-       __u64 stripe_len;
-       __u64 type;
-
-       /* optimal io alignment for this chunk */
-       __u32 io_align;
-
-       /* optimal io width for this chunk */
-       __u32 io_width;
-
-       /* minimal io size for this chunk */
-       __u32 sector_size;
-
-       /* 2^16 stripes is quite a lot, a second limit is the size of a single
-        * item in the btree
-        */
-       __u16 num_stripes;
-
-       /* sub stripes only matter for raid10 */
-       __u16 sub_stripes;
-       struct btrfs_stripe stripe;
-       /* additional stripes go here */
-} __attribute__ ((__packed__));
-
-#define BTRFS_FREE_SPACE_EXTENT        1
-#define BTRFS_FREE_SPACE_BITMAP        2
-
-struct btrfs_free_space_entry {
-       __u64 offset;
-       __u64 bytes;
-       __u8 type;
-} __attribute__ ((__packed__));
-
-struct btrfs_free_space_header {
-       struct btrfs_key location;
-       __u64 generation;
-       __u64 num_entries;
-       __u64 num_bitmaps;
-} __attribute__ ((__packed__));
-
-#define BTRFS_HEADER_FLAG_WRITTEN      (1ULL << 0)
-#define BTRFS_HEADER_FLAG_RELOC                (1ULL << 1)
-
-/* Super block flags */
-/* Errors detected */
-#define BTRFS_SUPER_FLAG_ERROR         (1ULL << 2)
-
-#define BTRFS_SUPER_FLAG_SEEDING       (1ULL << 32)
-#define BTRFS_SUPER_FLAG_METADUMP      (1ULL << 33)
-
-
-/*
- * items in the extent btree are used to record the objectid of the
- * owner of the block and the number of references
- */
-
-struct btrfs_extent_item {
-       __u64 refs;
-       __u64 generation;
-       __u64 flags;
-} __attribute__ ((__packed__));
-
-
-#define BTRFS_EXTENT_FLAG_DATA         (1ULL << 0)
-#define BTRFS_EXTENT_FLAG_TREE_BLOCK   (1ULL << 1)
-
-/* following flags only apply to tree blocks */
-
-/* use full backrefs for extent pointers in the block */
-#define BTRFS_BLOCK_FLAG_FULL_BACKREF  (1ULL << 8)
-
-/*
- * this flag is only used internally by scrub and may be changed at any time
- * it is only declared here to avoid collisions
- */
-#define BTRFS_EXTENT_FLAG_SUPER                (1ULL << 48)
-
-struct btrfs_tree_block_info {
-       struct btrfs_key key;
-       __u8 level;
-} __attribute__ ((__packed__));
-
-struct btrfs_extent_data_ref {
-       __u64 root;
-       __u64 objectid;
-       __u64 offset;
-       __u32 count;
-} __attribute__ ((__packed__));
-
-struct btrfs_shared_data_ref {
-       __u32 count;
-} __attribute__ ((__packed__));
-
-struct btrfs_extent_inline_ref {
-       __u8 type;
-       __u64 offset;
-} __attribute__ ((__packed__));
-
-/* dev extents record free space on individual devices.  The owner
- * field points back to the chunk allocation mapping tree that allocated
- * the extent.  The chunk tree uuid field is a way to double check the owner
- */
-struct btrfs_dev_extent {
-       __u64 chunk_tree;
-       __u64 chunk_objectid;
-       __u64 chunk_offset;
-       __u64 length;
-       __u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
-} __attribute__ ((__packed__));
-
-struct btrfs_inode_ref {
-       __u64 index;
-       __u16 name_len;
-       /* name goes here */
-} __attribute__ ((__packed__));
-
-struct btrfs_inode_extref {
-       __u64 parent_objectid;
-       __u64 index;
-       __u16 name_len;
-       __u8   name[0];
-       /* name goes here */
-} __attribute__ ((__packed__));
-
-struct btrfs_timespec {
-       __u64 sec;
-       __u32 nsec;
-} __attribute__ ((__packed__));
-
-struct btrfs_inode_item {
-       /* nfs style generation number */
-       __u64 generation;
-       /* transid that last touched this inode */
-       __u64 transid;
-       __u64 size;
-       __u64 nbytes;
-       __u64 block_group;
-       __u32 nlink;
-       __u32 uid;
-       __u32 gid;
-       __u32 mode;
-       __u64 rdev;
-       __u64 flags;
-
-       /* modification sequence number for NFS */
-       __u64 sequence;
-
-       /*
-        * a little future expansion, for more than this we can
-        * just grow the inode item and version it
-        */
-       __u64 reserved[4];
-       struct btrfs_timespec atime;
-       struct btrfs_timespec ctime;
-       struct btrfs_timespec mtime;
-       struct btrfs_timespec otime;
-} __attribute__ ((__packed__));
-
-struct btrfs_dir_log_item {
-       __u64 end;
-} __attribute__ ((__packed__));
-
-struct btrfs_dir_item {
-       struct btrfs_key location;
-       __u64 transid;
-       __u16 data_len;
-       __u16 name_len;
-       __u8 type;
-} __attribute__ ((__packed__));
-
-#define BTRFS_ROOT_SUBVOL_RDONLY       (1ULL << 0)
-
-/*
- * Internal in-memory flag that a subvolume has been marked for deletion but
- * still visible as a directory
- */
-#define BTRFS_ROOT_SUBVOL_DEAD         (1ULL << 48)
-
-struct btrfs_root_item {
-       struct btrfs_inode_item inode;
-       __u64 generation;
-       __u64 root_dirid;
-       __u64 bytenr;
-       __u64 byte_limit;
-       __u64 bytes_used;
-       __u64 last_snapshot;
-       __u64 flags;
-       __u32 refs;
-       struct btrfs_key drop_progress;
-       __u8 drop_level;
-       __u8 level;
-
-       /*
-        * The following fields appear after subvol_uuids+subvol_times
-        * were introduced.
-        */
-
-       /*
-        * This generation number is used to test if the new fields are valid
-        * and up to date while reading the root item. Every time the root item
-        * is written out, the "generation" field is copied into this field. If
-        * anyone ever mounted the fs with an older kernel, we will have
-        * mismatching generation values here and thus must invalidate the
-        * new fields. See btrfs_update_root and btrfs_find_last_root for
-        * details.
-        * the offset of generation_v2 is also used as the start for the memset
-        * when invalidating the fields.
-        */
-       __u64 generation_v2;
-       __u8 uuid[BTRFS_UUID_SIZE];
-       __u8 parent_uuid[BTRFS_UUID_SIZE];
-       __u8 received_uuid[BTRFS_UUID_SIZE];
-       __u64 ctransid; /* updated when an inode changes */
-       __u64 otransid; /* trans when created */
-       __u64 stransid; /* trans when sent. non-zero for received subvol */
-       __u64 rtransid; /* trans when received. non-zero for received subvol */
-       struct btrfs_timespec ctime;
-       struct btrfs_timespec otime;
-       struct btrfs_timespec stime;
-       struct btrfs_timespec rtime;
-       __u64 reserved[8]; /* for future */
-} __attribute__ ((__packed__));
-
-/*
- * this is used for both forward and backward root refs
- */
-struct btrfs_root_ref {
-       __u64 dirid;
-       __u64 sequence;
-       __u16 name_len;
-} __attribute__ ((__packed__));
-
-#define BTRFS_FILE_EXTENT_INLINE 0
-#define BTRFS_FILE_EXTENT_REG 1
-#define BTRFS_FILE_EXTENT_PREALLOC 2
-
-enum btrfs_compression_type {
-       BTRFS_COMPRESS_NONE  = 0,
-       BTRFS_COMPRESS_ZLIB  = 1,
-       BTRFS_COMPRESS_LZO   = 2,
-       BTRFS_COMPRESS_ZSTD  = 3,
-       BTRFS_COMPRESS_TYPES = 3,
-       BTRFS_COMPRESS_LAST  = 4,
-};
-
-struct btrfs_file_extent_item {
-       /*
-        * transaction id that created this extent
-        */
-       __u64 generation;
-       /*
-        * max number of bytes to hold this extent in ram
-        * when we split a compressed extent we can't know how big
-        * each of the resulting pieces will be.  So, this is
-        * an upper limit on the size of the extent in ram instead of
-        * an exact limit.
-        */
-       __u64 ram_bytes;
-
-       /*
-        * 32 bits for the various ways we might encode the data,
-        * including compression and encryption.  If any of these
-        * are set to something a given disk format doesn't understand
-        * it is treated like an incompat flag for reading and writing,
-        * but not for stat.
-        */
-       __u8 compression;
-       __u8 encryption;
-       __u16 other_encoding; /* spare for later use */
-
-       /* are we inline data or a real extent? */
-       __u8 type;
-
-       /*
-        * disk space consumed by the extent, checksum blocks are included
-        * in these numbers
-        *
-        * At this offset in the structure, the inline extent data start.
-        */
-       __u64 disk_bytenr;
-       __u64 disk_num_bytes;
-       /*
-        * the logical offset in file blocks (no csums)
-        * this extent record is for.  This allows a file extent to point
-        * into the middle of an existing extent on disk, sharing it
-        * between two snapshots (useful if some bytes in the middle of the
-        * extent have changed
-        */
-       __u64 offset;
-       /*
-        * the logical number of file blocks (no csums included).  This
-        * always reflects the size uncompressed and without encoding.
-        */
-       __u64 num_bytes;
-
-} __attribute__ ((__packed__));
-
-struct btrfs_csum_item {
-       __u8 csum;
-} __attribute__ ((__packed__));
-
-/* different types of block groups (and chunks) */
-#define BTRFS_BLOCK_GROUP_DATA         (1ULL << 0)
-#define BTRFS_BLOCK_GROUP_SYSTEM       (1ULL << 1)
-#define BTRFS_BLOCK_GROUP_METADATA     (1ULL << 2)
-#define BTRFS_BLOCK_GROUP_RAID0                (1ULL << 3)
-#define BTRFS_BLOCK_GROUP_RAID1                (1ULL << 4)
-#define BTRFS_BLOCK_GROUP_DUP          (1ULL << 5)
-#define BTRFS_BLOCK_GROUP_RAID10       (1ULL << 6)
-#define BTRFS_BLOCK_GROUP_RAID5         (1ULL << 7)
-#define BTRFS_BLOCK_GROUP_RAID6         (1ULL << 8)
-#define BTRFS_BLOCK_GROUP_RESERVED     (BTRFS_AVAIL_ALLOC_BIT_SINGLE | \
-                                        BTRFS_SPACE_INFO_GLOBAL_RSV)
-
-enum btrfs_raid_types {
-       BTRFS_RAID_RAID10,
-       BTRFS_RAID_RAID1,
-       BTRFS_RAID_DUP,
-       BTRFS_RAID_RAID0,
-       BTRFS_RAID_SINGLE,
-       BTRFS_RAID_RAID5,
-       BTRFS_RAID_RAID6,
-       BTRFS_NR_RAID_TYPES
-};
-
-#define BTRFS_BLOCK_GROUP_TYPE_MASK    (BTRFS_BLOCK_GROUP_DATA |    \
-                                        BTRFS_BLOCK_GROUP_SYSTEM |  \
-                                        BTRFS_BLOCK_GROUP_METADATA)
-
-#define BTRFS_BLOCK_GROUP_PROFILE_MASK (BTRFS_BLOCK_GROUP_RAID0 |   \
-                                        BTRFS_BLOCK_GROUP_RAID1 |   \
-                                        BTRFS_BLOCK_GROUP_RAID5 |   \
-                                        BTRFS_BLOCK_GROUP_RAID6 |   \
-                                        BTRFS_BLOCK_GROUP_DUP |     \
-                                        BTRFS_BLOCK_GROUP_RAID10)
-#define BTRFS_BLOCK_GROUP_RAID56_MASK  (BTRFS_BLOCK_GROUP_RAID5 |   \
-                                        BTRFS_BLOCK_GROUP_RAID6)
-
-/*
- * We need a bit for restriper to be able to tell when chunks of type
- * SINGLE are available.  This "extended" profile format is used in
- * fs_info->avail_*_alloc_bits (in-memory) and balance item fields
- * (on-disk).  The corresponding on-disk bit in chunk.type is reserved
- * to avoid remappings between two formats in future.
- */
-#define BTRFS_AVAIL_ALLOC_BIT_SINGLE   (1ULL << 48)
-
-/*
- * A fake block group type that is used to communicate global block reserve
- * size to userspace via the SPACE_INFO ioctl.
- */
-#define BTRFS_SPACE_INFO_GLOBAL_RSV    (1ULL << 49)
-
-#define BTRFS_EXTENDED_PROFILE_MASK    (BTRFS_BLOCK_GROUP_PROFILE_MASK | \
-                                        BTRFS_AVAIL_ALLOC_BIT_SINGLE)
-
-#endif /* __BTRFS_BTRFS_TREE_H__ */
diff --git a/fs/btrfs/chunk-map.c b/fs/btrfs/chunk-map.c
deleted file mode 100644 (file)
index 2e5be65..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * BTRFS filesystem implementation for U-Boot
- *
- * 2017 Marek Behun, CZ.NIC, marek.behun@nic.cz
- */
-
-#include "btrfs.h"
-#include <log.h>
-#include <malloc.h>
-
-struct chunk_map_item {
-       struct rb_node node;
-       u64 logical;
-       u64 length;
-       u64 physical;
-};
-
-static int add_chunk_mapping(struct btrfs_key *key, struct btrfs_chunk *chunk)
-{
-       struct btrfs_stripe *stripe;
-       u64 block_profile = chunk->type & BTRFS_BLOCK_GROUP_PROFILE_MASK;
-       struct rb_node **new = &(btrfs_info.chunks_root.rb_node), *prnt = NULL;
-       struct chunk_map_item *map_item;
-
-       if (block_profile && block_profile != BTRFS_BLOCK_GROUP_DUP) {
-               printf("%s: unsupported chunk profile %llu\n", __func__,
-                      block_profile);
-               return -1;
-       } else if (!chunk->length) {
-               printf("%s: zero length chunk\n", __func__);
-               return -1;
-       }
-
-       stripe = &chunk->stripe;
-       btrfs_stripe_to_cpu(stripe);
-
-       while (*new) {
-               struct chunk_map_item *this;
-
-               this = rb_entry(*new, struct chunk_map_item, node);
-
-               prnt = *new;
-               if (key->offset < this->logical) {
-                       new = &((*new)->rb_left);
-               } else if (key->offset > this->logical) {
-                       new = &((*new)->rb_right);
-               } else {
-                       debug("%s: Logical address %llu already in map!\n",
-                             __func__, key->offset);
-                       return 0;
-               }
-       }
-
-       map_item = malloc(sizeof(struct chunk_map_item));
-       if (!map_item)
-               return -1;
-
-       map_item->logical = key->offset;
-       map_item->length = chunk->length;
-       map_item->physical = le64_to_cpu(chunk->stripe.offset);
-       rb_link_node(&map_item->node, prnt, new);
-       rb_insert_color(&map_item->node, &btrfs_info.chunks_root);
-
-       debug("%s: Mapping %llu to %llu\n", __func__, map_item->logical,
-             map_item->physical);
-
-       return 0;
-}
-
-u64 btrfs_map_logical_to_physical(u64 logical)
-{
-       struct rb_node *node = btrfs_info.chunks_root.rb_node;
-
-       while (node) {
-               struct chunk_map_item *item;
-
-               item = rb_entry(node, struct chunk_map_item, node);
-
-               if (item->logical > logical)
-                       node = node->rb_left;
-               else if (logical >= item->logical + item->length)
-                       node = node->rb_right;
-               else
-                       return item->physical + logical - item->logical;
-       }
-
-       printf("%s: Cannot map logical address %llu to physical\n", __func__,
-              logical);
-
-       return -1ULL;
-}
-
-void btrfs_chunk_map_exit(void)
-{
-       struct rb_node *now, *next;
-       struct chunk_map_item *item;
-
-       for (now = rb_first_postorder(&btrfs_info.chunks_root); now; now = next)
-       {
-               item = rb_entry(now, struct chunk_map_item, node);
-               next = rb_next_postorder(now);
-               free(item);
-       }
-}
-
-int btrfs_chunk_map_init(void)
-{
-       u8 sys_chunk_array_copy[sizeof(btrfs_info.sb.sys_chunk_array)];
-       u8 * const start = sys_chunk_array_copy;
-       u8 * const end = start + btrfs_info.sb.sys_chunk_array_size;
-       u8 *cur;
-       struct btrfs_key *key;
-       struct btrfs_chunk *chunk;
-
-       btrfs_info.chunks_root = RB_ROOT;
-
-       memcpy(sys_chunk_array_copy, btrfs_info.sb.sys_chunk_array,
-              sizeof(sys_chunk_array_copy));
-
-       for (cur = start; cur < end;) {
-               key = (struct btrfs_key *) cur;
-               cur += sizeof(struct btrfs_key);
-               chunk = (struct btrfs_chunk *) cur;
-
-               btrfs_key_to_cpu(key);
-               btrfs_chunk_to_cpu(chunk);
-
-               if (key->type != BTRFS_CHUNK_ITEM_KEY) {
-                       printf("%s: invalid key type %u\n", __func__,
-                              key->type);
-                       return -1;
-               }
-
-               if (add_chunk_mapping(key, chunk))
-                       return -1;
-
-               cur += sizeof(struct btrfs_chunk);
-               cur += sizeof(struct btrfs_stripe) * (chunk->num_stripes - 1);
-       }
-
-       return 0;
-}
-
-int btrfs_read_chunk_tree(void)
-{
-       struct btrfs_path path;
-       struct btrfs_key key, *found_key;
-       struct btrfs_chunk *chunk;
-       int res = 0;
-
-       key.objectid = BTRFS_FIRST_CHUNK_TREE_OBJECTID;
-       key.type = BTRFS_CHUNK_ITEM_KEY;
-       key.offset = 0;
-
-       if (btrfs_search_tree(&btrfs_info.chunk_root, &key, &path))
-               return -1;
-
-       do {
-               found_key = btrfs_path_leaf_key(&path);
-               if (btrfs_comp_keys_type(&key, found_key))
-                       continue;
-
-               chunk = btrfs_path_item_ptr(&path, struct btrfs_chunk);
-               btrfs_chunk_to_cpu(chunk);
-               if (add_chunk_mapping(found_key, chunk)) {
-                       res = -1;
-                       break;
-               }
-       } while (!(res = btrfs_next_slot(&path)));
-
-       btrfs_free_path(&path);
-
-       if (res < 0)
-               return -1;
-
-       return 0;
-}
diff --git a/fs/btrfs/common/rbtree-utils.c b/fs/btrfs/common/rbtree-utils.c
new file mode 100644 (file)
index 0000000..7a7d7e8
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2014 Facebook.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License v2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 021110-1307, USA.
+ */
+
+#include <linux/errno.h>
+#include "rbtree-utils.h"
+
+int rb_insert(struct rb_root *root, struct rb_node *node,
+             rb_compare_nodes comp)
+{
+       struct rb_node **p = &root->rb_node;
+       struct rb_node *parent = NULL;
+       int ret;
+
+       while(*p) {
+               parent = *p;
+
+               ret = comp(parent, node);
+               if (ret < 0)
+                       p = &(*p)->rb_left;
+               else if (ret > 0)
+                       p = &(*p)->rb_right;
+               else
+                       return -EEXIST;
+       }
+
+       rb_link_node(node, parent, p);
+       rb_insert_color(node, root);
+       return 0;
+}
+
+struct rb_node *rb_search(struct rb_root *root, void *key, rb_compare_keys comp,
+                         struct rb_node **next_ret)
+{
+       struct rb_node *n = root->rb_node;
+       struct rb_node *parent = NULL;
+       int ret = 0;
+
+       while(n) {
+               parent = n;
+
+               ret = comp(n, key);
+               if (ret < 0)
+                       n = n->rb_left;
+               else if (ret > 0)
+                       n = n->rb_right;
+               else
+                       return n;
+       }
+
+       if (!next_ret)
+               return NULL;
+
+       if (parent && ret > 0)
+               parent = rb_next(parent);
+
+       *next_ret = parent;
+       return NULL;
+}
+
+void rb_free_nodes(struct rb_root *root, rb_free_node free_node)
+{
+       struct rb_node *node;
+
+       while ((node = rb_first(root))) {
+               rb_erase(node, root);
+               free_node(node);
+       }
+}
diff --git a/fs/btrfs/common/rbtree-utils.h b/fs/btrfs/common/rbtree-utils.h
new file mode 100644 (file)
index 0000000..d977cfd
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2014 Facebook.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License v2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 021110-1307, USA.
+ */
+
+#ifndef __RBTREE_UTILS__
+#define __RBTREE_UTILS__
+
+#include <linux/rbtree.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The common insert/search/free functions */
+typedef int (*rb_compare_nodes)(struct rb_node *node1, struct rb_node *node2);
+typedef int (*rb_compare_keys)(struct rb_node *node, void *key);
+typedef void (*rb_free_node)(struct rb_node *node);
+
+int rb_insert(struct rb_root *root, struct rb_node *node,
+             rb_compare_nodes comp);
+/*
+ * In some cases, we need return the next node if we don't find the node we
+ * specify. At this time, we can use next_ret.
+ */
+struct rb_node *rb_search(struct rb_root *root, void *key, rb_compare_keys comp,
+                         struct rb_node **next_ret);
+void rb_free_nodes(struct rb_root *root, rb_free_node free_node);
+
+#define FREE_RB_BASED_TREE(name, free_func)            \
+static void free_##name##_tree(struct rb_root *root)   \
+{                                                      \
+       rb_free_nodes(root, free_func);                 \
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/fs/btrfs/compat.h b/fs/btrfs/compat.h
new file mode 100644 (file)
index 0000000..9cf8a10
--- /dev/null
@@ -0,0 +1,82 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+#ifndef __BTRFS_COMPAT_H__
+#define __BTRFS_COMPAT_H__
+
+#include <linux/errno.h>
+#include <fs_internal.h>
+#include <uuid.h>
+
+/* Provide a compatibility layer to make code syncing easier */
+
+/* A simple wraper to for error() used in btrfs-progs */
+#define error(fmt, ...)                pr_err("BTRFS: " fmt "\n", ##__VA_ARGS__)
+
+#define ASSERT(c) assert(c)
+
+#define BTRFS_UUID_UNPARSED_SIZE       37
+
+/* No <linux/limits.h> so have to define it here */
+#define XATTR_NAME_MAX         255
+#define PATH_MAX               4096
+
+/*
+ * Macros to generate set/get funcs for the struct fields
+ * assume there is a lefoo_to_cpu for every type, so lets make a simple
+ * one for u8:
+ */
+#define le8_to_cpu(v) (v)
+#define cpu_to_le8(v) (v)
+#define __le8 u8
+
+/*
+ * Macros to generate set/get funcs for the struct fields
+ * assume there is a lefoo_to_cpu for every type, so lets make a simple
+ * one for u8:
+ */
+#define le8_to_cpu(v) (v)
+#define cpu_to_le8(v) (v)
+#define __le8 u8
+
+#define get_unaligned_le8(p) (*((u8 *)(p)))
+#define get_unaligned_8(p) (*((u8 *)(p)))
+#define put_unaligned_le8(val,p) ((*((u8 *)(p))) = (val))
+#define put_unaligned_8(val,p) ((*((u8 *)(p))) = (val))
+
+/*
+ * Read data from device specified by @desc and @part
+ *
+ * U-boot equivalent of pread().
+ *
+ * Return the bytes of data read.
+ * Return <0 for error.
+ */
+static inline int __btrfs_devread(struct blk_desc *desc,
+                                 struct disk_partition *part,
+                                 void *buf, size_t size, u64 offset)
+{
+       lbaint_t sector;
+       int byte_offset;
+       int ret;
+
+       sector = offset >> desc->log2blksz;
+       byte_offset = offset % desc->blksz;
+
+       /* fs_devread() return 0 for error, >0 for success */
+       ret = fs_devread(desc, part, sector, byte_offset, size, buf);
+       if (!ret)
+               return -EIO;
+       return size;
+}
+
+static inline void uuid_unparse(const u8 *uuid, char *out)
+{
+       return uuid_bin_to_str((unsigned char *)uuid, out, 0);
+}
+
+static inline int is_power_of_2(unsigned long n)
+{
+       return (n != 0 && ((n & (n - 1)) == 0));
+}
+
+#endif
index 59e4a94..23efefa 100644 (file)
@@ -115,7 +115,7 @@ static u32 decompress_zlib(const u8 *_cbuf, u32 clen, u8 *dbuf, u32 dlen)
        while (stream.total_in < clen) {
                stream.next_in = cbuf + stream.total_in;
                stream.avail_in = min((u32) (clen - stream.total_in),
-                                     (u32) btrfs_info.sb.sectorsize);
+                                       current_fs_info->sectorsize);
 
                ret = inflate(&stream, Z_NO_FLUSH);
                if (ret != Z_OK)
diff --git a/fs/btrfs/crypto/hash.c b/fs/btrfs/crypto/hash.c
new file mode 100644 (file)
index 0000000..fb51f63
--- /dev/null
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+#include <linux/xxhash.h>
+#include <linux/unaligned/access_ok.h>
+#include <linux/types.h>
+#include <u-boot/sha256.h>
+#include <u-boot/crc.h>
+
+static u32 btrfs_crc32c_table[256];
+
+void btrfs_hash_init(void)
+{
+       static int inited = 0;
+
+       if (!inited) {
+               crc32c_init(btrfs_crc32c_table, 0x82F63B78);
+               inited = 1;
+       }
+}
+
+int hash_sha256(const u8 *buf, size_t length, u8 *out)
+{
+       sha256_context ctx;
+
+       sha256_starts(&ctx);
+       sha256_update(&ctx, buf, length);
+       sha256_finish(&ctx, out);
+
+       return 0;
+}
+
+int hash_xxhash(const u8 *buf, size_t length, u8 *out)
+{
+       u64 hash;
+
+       hash = xxh64(buf, length, 0);
+       put_unaligned_le64(hash, out);
+
+       return 0;
+}
+
+int hash_crc32c(const u8 *buf, size_t length, u8 *out)
+{
+       u32 crc;
+
+       crc = crc32c_cal((u32)~0, (char *)buf, length, btrfs_crc32c_table);
+       put_unaligned_le32(~crc, out);
+
+       return 0;
+}
+
+u32 crc32c(u32 seed, const void * data, size_t len)
+{
+       return crc32c_cal(seed, data, len, btrfs_crc32c_table);
+}
diff --git a/fs/btrfs/crypto/hash.h b/fs/btrfs/crypto/hash.h
new file mode 100644 (file)
index 0000000..d1ba1fa
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef CRYPTO_HASH_H
+#define CRYPTO_HASH_H
+
+#include <linux/types.h>
+
+#define CRYPTO_HASH_SIZE_MAX   32
+
+void btrfs_hash_init(void);
+int hash_crc32c(const u8 *buf, size_t length, u8 *out);
+int hash_xxhash(const u8 *buf, size_t length, u8 *out);
+int hash_sha256(const u8 *buf, size_t length, u8 *out);
+
+u32 crc32c(u32 seed, const void * data, size_t len);
+
+/* Blake2B is not yet supported due to lack of library */
+
+#endif
index 28f98d4..5ffced9 100644 (file)
  * 2017 Marek Behun, CZ.NIC, marek.behun@nic.cz
  */
 
-#include "btrfs.h"
+#include <linux/kernel.h>
 #include <log.h>
 #include <malloc.h>
 #include <memalign.h>
+#include "btrfs.h"
+#include "disk-io.h"
+
+static const struct btrfs_csum {
+       u16 size;
+       const char name[14];
+} btrfs_csums[] = {
+       [BTRFS_CSUM_TYPE_CRC32]         = {  4, "crc32c" },
+       [BTRFS_CSUM_TYPE_XXHASH]        = {  8, "xxhash64" },
+       [BTRFS_CSUM_TYPE_SHA256]        = { 32, "sha256" },
+       [BTRFS_CSUM_TYPE_BLAKE2]        = { 32, "blake2" },
+};
+
+u16 btrfs_super_csum_size(const struct btrfs_super_block *sb)
+{
+       const u16 csum_type = btrfs_super_csum_type(sb);
+
+       return btrfs_csums[csum_type].size;
+}
+
+const char *btrfs_super_csum_name(u16 csum_type)
+{
+       return btrfs_csums[csum_type].name;
+}
+
+size_t btrfs_super_num_csums(void)
+{
+       return ARRAY_SIZE(btrfs_csums);
+}
+
+u16 btrfs_csum_type_size(u16 csum_type)
+{
+       return btrfs_csums[csum_type].size;
+}
+
+struct btrfs_path *btrfs_alloc_path(void)
+{
+       struct btrfs_path *path;
+       path = kzalloc(sizeof(struct btrfs_path), GFP_NOFS);
+       return path;
+}
+
+void btrfs_free_path(struct btrfs_path *p)
+{
+       if (!p)
+               return;
+       btrfs_release_path(p);
+       kfree(p);
+}
+
+void btrfs_release_path(struct btrfs_path *p)
+{
+       int i;
+       for (i = 0; i < BTRFS_MAX_LEVEL; i++) {
+               if (!p->nodes[i])
+                       continue;
+               free_extent_buffer(p->nodes[i]);
+       }
+       memset(p, 0, sizeof(*p));
+}
 
-int btrfs_comp_keys(struct btrfs_key *a, struct btrfs_key *b)
+int btrfs_comp_cpu_keys(const struct btrfs_key *k1, const struct btrfs_key *k2)
 {
-       if (a->objectid > b->objectid)
+       if (k1->objectid > k2->objectid)
                return 1;
-       if (a->objectid < b->objectid)
+       if (k1->objectid < k2->objectid)
                return -1;
-       if (a->type > b->type)
+       if (k1->type > k2->type)
                return 1;
-       if (a->type < b->type)
+       if (k1->type < k2->type)
                return -1;
-       if (a->offset > b->offset)
+       if (k1->offset > k2->offset)
                return 1;
-       if (a->offset < b->offset)
+       if (k1->offset < k2->offset)
                return -1;
        return 0;
 }
 
-int btrfs_comp_keys_type(struct btrfs_key *a, struct btrfs_key *b)
+static int btrfs_comp_keys(struct btrfs_disk_key *disk,
+                            const struct btrfs_key *k2)
 {
-       if (a->objectid > b->objectid)
-               return 1;
-       if (a->objectid < b->objectid)
-               return -1;
-       if (a->type > b->type)
-               return 1;
-       if (a->type < b->type)
-               return -1;
-       return 0;
+       struct btrfs_key k1;
+
+       btrfs_disk_key_to_cpu(&k1, disk);
+       return btrfs_comp_cpu_keys(&k1, k2);
 }
 
-static int generic_bin_search(void *addr, int item_size, struct btrfs_key *key,
-                             int max, int *slot)
+enum btrfs_tree_block_status
+btrfs_check_node(struct btrfs_fs_info *fs_info,
+                struct btrfs_disk_key *parent_key, struct extent_buffer *buf)
 {
-       int low = 0, high = max, mid, ret;
-       struct btrfs_key *tmp;
+       int i;
+       struct btrfs_key cpukey;
+       struct btrfs_disk_key key;
+       u32 nritems = btrfs_header_nritems(buf);
+       enum btrfs_tree_block_status ret = BTRFS_TREE_BLOCK_INVALID_NRITEMS;
+
+       if (nritems == 0 || nritems > BTRFS_NODEPTRS_PER_BLOCK(fs_info))
+               goto fail;
+
+       ret = BTRFS_TREE_BLOCK_INVALID_PARENT_KEY;
+       if (parent_key && parent_key->type) {
+               btrfs_node_key(buf, &key, 0);
+               if (memcmp(parent_key, &key, sizeof(key)))
+                       goto fail;
+       }
+       ret = BTRFS_TREE_BLOCK_BAD_KEY_ORDER;
+       for (i = 0; nritems > 1 && i < nritems - 2; i++) {
+               btrfs_node_key(buf, &key, i);
+               btrfs_node_key_to_cpu(buf, &cpukey, i + 1);
+               if (btrfs_comp_keys(&key, &cpukey) >= 0)
+                       goto fail;
+       }
+       return BTRFS_TREE_BLOCK_CLEAN;
+fail:
+       return ret;
+}
+
+enum btrfs_tree_block_status
+btrfs_check_leaf(struct btrfs_fs_info *fs_info,
+                struct btrfs_disk_key *parent_key, struct extent_buffer *buf)
+{
+       int i;
+       struct btrfs_key cpukey;
+       struct btrfs_disk_key key;
+       u32 nritems = btrfs_header_nritems(buf);
+       enum btrfs_tree_block_status ret = BTRFS_TREE_BLOCK_INVALID_NRITEMS;
+
+       if (nritems * sizeof(struct btrfs_item) > buf->len)  {
+               fprintf(stderr, "invalid number of items %llu\n",
+                       (unsigned long long)buf->start);
+               goto fail;
+       }
+
+       if (btrfs_header_level(buf) != 0) {
+               ret = BTRFS_TREE_BLOCK_INVALID_LEVEL;
+               fprintf(stderr, "leaf is not a leaf %llu\n",
+                      (unsigned long long)btrfs_header_bytenr(buf));
+               goto fail;
+       }
+       if (btrfs_leaf_free_space(buf) < 0) {
+               ret = BTRFS_TREE_BLOCK_INVALID_FREE_SPACE;
+               fprintf(stderr, "leaf free space incorrect %llu %d\n",
+                       (unsigned long long)btrfs_header_bytenr(buf),
+                       btrfs_leaf_free_space(buf));
+               goto fail;
+       }
 
-       while (low < high) {
+       if (nritems == 0)
+               return BTRFS_TREE_BLOCK_CLEAN;
+
+       btrfs_item_key(buf, &key, 0);
+       if (parent_key && parent_key->type &&
+           memcmp(parent_key, &key, sizeof(key))) {
+               ret = BTRFS_TREE_BLOCK_INVALID_PARENT_KEY;
+               fprintf(stderr, "leaf parent key incorrect %llu\n",
+                      (unsigned long long)btrfs_header_bytenr(buf));
+               goto fail;
+       }
+       for (i = 0; nritems > 1 && i < nritems - 1; i++) {
+               btrfs_item_key(buf, &key, i);
+               btrfs_item_key_to_cpu(buf, &cpukey, i + 1);
+               if (btrfs_comp_keys(&key, &cpukey) >= 0) {
+                       ret = BTRFS_TREE_BLOCK_BAD_KEY_ORDER;
+                       fprintf(stderr, "bad key ordering %d %d\n", i, i+1);
+                       goto fail;
+               }
+               if (btrfs_item_offset_nr(buf, i) !=
+                       btrfs_item_end_nr(buf, i + 1)) {
+                       ret = BTRFS_TREE_BLOCK_INVALID_OFFSETS;
+                       fprintf(stderr, "incorrect offsets %u %u\n",
+                               btrfs_item_offset_nr(buf, i),
+                               btrfs_item_end_nr(buf, i + 1));
+                       goto fail;
+               }
+               if (i == 0 && btrfs_item_end_nr(buf, i) !=
+                   BTRFS_LEAF_DATA_SIZE(fs_info)) {
+                       ret = BTRFS_TREE_BLOCK_INVALID_OFFSETS;
+                       fprintf(stderr, "bad item end %u wanted %u\n",
+                               btrfs_item_end_nr(buf, i),
+                               (unsigned)BTRFS_LEAF_DATA_SIZE(fs_info));
+                       goto fail;
+               }
+       }
+
+       for (i = 0; i < nritems; i++) {
+               if (btrfs_item_end_nr(buf, i) >
+                               BTRFS_LEAF_DATA_SIZE(fs_info)) {
+                       btrfs_item_key(buf, &key, 0);
+                       ret = BTRFS_TREE_BLOCK_INVALID_OFFSETS;
+                       fprintf(stderr, "slot end outside of leaf %llu > %llu\n",
+                               (unsigned long long)btrfs_item_end_nr(buf, i),
+                               (unsigned long long)BTRFS_LEAF_DATA_SIZE(
+                                       fs_info));
+                       goto fail;
+               }
+       }
+
+       return BTRFS_TREE_BLOCK_CLEAN;
+fail:
+       return ret;
+}
+
+static int noinline check_block(struct btrfs_fs_info *fs_info,
+                               struct btrfs_path *path, int level)
+{
+       struct btrfs_disk_key key;
+       struct btrfs_disk_key *key_ptr = NULL;
+       struct extent_buffer *parent;
+       enum btrfs_tree_block_status ret;
+
+       if (path->nodes[level + 1]) {
+               parent = path->nodes[level + 1];
+               btrfs_node_key(parent, &key, path->slots[level + 1]);
+               key_ptr = &key;
+       }
+       if (level == 0)
+               ret = btrfs_check_leaf(fs_info, key_ptr, path->nodes[0]);
+       else
+               ret = btrfs_check_node(fs_info, key_ptr, path->nodes[level]);
+       if (ret == BTRFS_TREE_BLOCK_CLEAN)
+               return 0;
+       return -EIO;
+}
+
+/*
+ * search for key in the extent_buffer.  The items start at offset p,
+ * and they are item_size apart.  There are 'max' items in p.
+ *
+ * the slot in the array is returned via slot, and it points to
+ * the place where you would insert key if it is not found in
+ * the array.
+ *
+ * slot may point to max if the key is bigger than all of the keys
+ */
+static int generic_bin_search(struct extent_buffer *eb, unsigned long p,
+                             int item_size, const struct btrfs_key *key,
+                             int max, int *slot)
+{
+       int low = 0;
+       int high = max;
+       int mid;
+       int ret;
+       unsigned long offset;
+       struct btrfs_disk_key *tmp;
+
+       while(low < high) {
                mid = (low + high) / 2;
+               offset = p + mid * item_size;
 
-               tmp = (struct btrfs_key *) ((u8 *) addr + mid*item_size);
+               tmp = (struct btrfs_disk_key *)(eb->data + offset);
                ret = btrfs_comp_keys(tmp, key);
 
-               if (ret < 0) {
+               if (ret < 0)
                        low = mid + 1;
-               } else if (ret > 0) {
+               else if (ret > 0)
                        high = mid;
-               else {
+               else {
                        *slot = mid;
                        return 0;
                }
        }
-
        *slot = low;
        return 1;
 }
 
-int btrfs_bin_search(union btrfs_tree_node *p, struct btrfs_key *key,
+/*
+ * simple bin_search frontend that does the right thing for
+ * leaves vs nodes
+ */
+int btrfs_bin_search(struct extent_buffer *eb, const struct btrfs_key *key,
                     int *slot)
 {
-       void *addr;
-       unsigned long size;
-
-       if (p->header.level) {
-               addr = p->node.ptrs;
-               size = sizeof(struct btrfs_key_ptr);
-       } else {
-               addr = p->leaf.items;
-               size = sizeof(struct btrfs_item);
-       }
-
-       return generic_bin_search(addr, size, key, p->header.nritems, slot);
+       if (btrfs_header_level(eb) == 0)
+               return generic_bin_search(eb,
+                                         offsetof(struct btrfs_leaf, items),
+                                         sizeof(struct btrfs_item),
+                                         key, btrfs_header_nritems(eb),
+                                         slot);
+       else
+               return generic_bin_search(eb,
+                                         offsetof(struct btrfs_node, ptrs),
+                                         sizeof(struct btrfs_key_ptr),
+                                         key, btrfs_header_nritems(eb),
+                                         slot);
 }
 
-static void clear_path(struct btrfs_path *p)
+struct extent_buffer *read_node_slot(struct btrfs_fs_info *fs_info,
+                                  struct extent_buffer *parent, int slot)
 {
-       int i;
-
-       for (i = 0; i < BTRFS_MAX_LEVEL; ++i) {
-               p->nodes[i] = NULL;
-               p->slots[i] = 0;
+       struct extent_buffer *ret;
+       int level = btrfs_header_level(parent);
+
+       if (slot < 0)
+               return NULL;
+       if (slot >= btrfs_header_nritems(parent))
+               return NULL;
+
+       if (level == 0)
+               return NULL;
+
+       ret = read_tree_block(fs_info, btrfs_node_blockptr(parent, slot),
+                      btrfs_node_ptr_generation(parent, slot));
+       if (!extent_buffer_uptodate(ret))
+               return ERR_PTR(-EIO);
+
+       if (btrfs_header_level(ret) != level - 1) {
+               error("child eb corrupted: parent bytenr=%llu item=%d parent level=%d child level=%d",
+                     btrfs_header_bytenr(parent), slot,
+                     btrfs_header_level(parent), btrfs_header_level(ret));
+               free_extent_buffer(ret);
+               return ERR_PTR(-EIO);
        }
+       return ret;
 }
 
-void btrfs_free_path(struct btrfs_path *p)
+int btrfs_find_item(struct btrfs_root *fs_root, struct btrfs_path *found_path,
+               u64 iobjectid, u64 ioff, u8 key_type,
+               struct btrfs_key *found_key)
 {
-       int i;
+       int ret;
+       struct btrfs_key key;
+       struct extent_buffer *eb;
+       struct btrfs_path *path;
+
+       key.type = key_type;
+       key.objectid = iobjectid;
+       key.offset = ioff;
+
+       if (found_path == NULL) {
+               path = btrfs_alloc_path();
+               if (!path)
+                       return -ENOMEM;
+       } else
+               path = found_path;
+
+       ret = btrfs_search_slot(NULL, fs_root, &key, path, 0, 0);
+       if ((ret < 0) || (found_key == NULL))
+               goto out;
+
+       eb = path->nodes[0];
+       if (ret && path->slots[0] >= btrfs_header_nritems(eb)) {
+               ret = btrfs_next_leaf(fs_root, path);
+               if (ret)
+                       goto out;
+               eb = path->nodes[0];
+       }
 
-       for (i = 0; i < BTRFS_MAX_LEVEL; ++i) {
-               if (p->nodes[i])
-                       free(p->nodes[i]);
+       btrfs_item_key_to_cpu(eb, found_key, path->slots[0]);
+       if (found_key->type != key.type ||
+                       found_key->objectid != key.objectid) {
+               ret = 1;
+               goto out;
        }
 
-       clear_path(p);
+out:
+       if (path != found_path)
+               btrfs_free_path(path);
+       return ret;
 }
 
-static int read_tree_node(u64 physical, union btrfs_tree_node **buf)
+/*
+ * look for key in the tree.  path is filled in with nodes along the way
+ * if key is found, we return zero and you can find the item in the leaf
+ * level of the path (level 0)
+ *
+ * If the key isn't found, the path points to the slot where it should
+ * be inserted, and 1 is returned.  If there are other errors during the
+ * search a negative error number is returned.
+ *
+ * if ins_len > 0, nodes and leaves will be split as we walk down the
+ * tree.  if ins_len < 0, nodes will be merged as we walk down the tree (if
+ * possible)
+ *
+ * NOTE: This version has no COW ability, thus we expect trans == NULL,
+ * ins_len == 0 and cow == 0.
+ */
+int btrfs_search_slot(struct btrfs_trans_handle *trans,
+               struct btrfs_root *root, const struct btrfs_key *key,
+               struct btrfs_path *p, int ins_len, int cow)
 {
-       ALLOC_CACHE_ALIGN_BUFFER(struct btrfs_header, hdr,
-                                sizeof(struct btrfs_header));
-       unsigned long size, offset = sizeof(*hdr);
-       union btrfs_tree_node *res;
-       u32 i;
-
-       if (!btrfs_devread(physical, sizeof(*hdr), hdr))
-               return -1;
-
-       btrfs_header_to_cpu(hdr);
-
-       if (hdr->level)
-               size = sizeof(struct btrfs_node)
-                      + hdr->nritems * sizeof(struct btrfs_key_ptr);
-       else
-               size = btrfs_info.sb.nodesize;
-
-       res = malloc_cache_aligned(size);
-       if (!res) {
-               debug("%s: malloc failed\n", __func__);
-               return -1;
-       }
-
-       if (!btrfs_devread(physical + offset, size - offset,
-                          ((u8 *) res) + offset)) {
-               free(res);
-               return -1;
+       struct extent_buffer *b;
+       int slot;
+       int ret;
+       int level;
+       struct btrfs_fs_info *fs_info = root->fs_info;
+       u8 lowest_level = 0;
+
+       assert(trans == NULL && ins_len == 0 && cow == 0);
+       lowest_level = p->lowest_level;
+       WARN_ON(lowest_level && ins_len > 0);
+       WARN_ON(p->nodes[0] != NULL);
+
+       b = root->node;
+       extent_buffer_get(b);
+       while (b) {
+               level = btrfs_header_level(b);
+               /*
+               if (cow) {
+                       int wret;
+                       wret = btrfs_cow_block(trans, root, b,
+                                              p->nodes[level + 1],
+                                              p->slots[level + 1],
+                                              &b);
+                       if (wret) {
+                               free_extent_buffer(b);
+                               return wret;
+                       }
+               }
+               */
+               BUG_ON(!cow && ins_len);
+               if (level != btrfs_header_level(b))
+                       WARN_ON(1);
+               level = btrfs_header_level(b);
+               p->nodes[level] = b;
+               ret = check_block(fs_info, p, level);
+               if (ret)
+                       return -1;
+               ret = btrfs_bin_search(b, key, &slot);
+               if (level != 0) {
+                       if (ret && slot > 0)
+                               slot -= 1;
+                       p->slots[level] = slot;
+                       /*
+                       if ((p->search_for_split || ins_len > 0) &&
+                           btrfs_header_nritems(b) >=
+                           BTRFS_NODEPTRS_PER_BLOCK(fs_info) - 3) {
+                               int sret = split_node(trans, root, p, level);
+                               BUG_ON(sret > 0);
+                               if (sret)
+                                       return sret;
+                               b = p->nodes[level];
+                               slot = p->slots[level];
+                       } else if (ins_len < 0) {
+                               int sret = balance_level(trans, root, p,
+                                                        level);
+                               if (sret)
+                                       return sret;
+                               b = p->nodes[level];
+                               if (!b) {
+                                       btrfs_release_path(p);
+                                       goto again;
+                               }
+                               slot = p->slots[level];
+                               BUG_ON(btrfs_header_nritems(b) == 1);
+                       }
+                       */
+                       /* this is only true while dropping a snapshot */
+                       if (level == lowest_level)
+                               break;
+
+                       b = read_node_slot(fs_info, b, slot);
+                       if (!extent_buffer_uptodate(b))
+                               return -EIO;
+               } else {
+                       p->slots[level] = slot;
+                       /*
+                       if (ins_len > 0 &&
+                           ins_len > btrfs_leaf_free_space(b)) {
+                               int sret = split_leaf(trans, root, key,
+                                                     p, ins_len, ret == 0);
+                               BUG_ON(sret > 0);
+                               if (sret)
+                                       return sret;
+                       }
+                       */
+                       return ret;
+               }
        }
-
-       memcpy(&res->header, hdr, sizeof(*hdr));
-       if (hdr->level)
-               for (i = 0; i < hdr->nritems; ++i)
-                       btrfs_key_ptr_to_cpu(&res->node.ptrs[i]);
-       else
-               for (i = 0; i < hdr->nritems; ++i)
-                       btrfs_item_to_cpu(&res->leaf.items[i]);
-
-       *buf = res;
-
-       return 0;
+       return 1;
 }
 
-int btrfs_search_tree(const struct btrfs_root *root, struct btrfs_key *key,
-                     struct btrfs_path *p)
+/*
+ * Helper to use instead of search slot if no exact match is needed but
+ * instead the next or previous item should be returned.
+ * When find_higher is true, the next higher item is returned, the next lower
+ * otherwise.
+ * When return_any and find_higher are both true, and no higher item is found,
+ * return the next lower instead.
+ * When return_any is true and find_higher is false, and no lower item is found,
+ * return the next higher instead.
+ * It returns 0 if any item is found, 1 if none is found (tree empty), and
+ * < 0 on error
+ */
+int btrfs_search_slot_for_read(struct btrfs_root *root,
+                              const struct btrfs_key *key,
+                              struct btrfs_path *p, int find_higher,
+                              int return_any)
 {
-       u8 lvl, prev_lvl;
-       int i, slot, ret;
-       u64 logical, physical;
-       union btrfs_tree_node *buf;
-
-       clear_path(p);
-
-       logical = root->bytenr;
-
-       for (i = 0; i < BTRFS_MAX_LEVEL; ++i) {
-               physical = btrfs_map_logical_to_physical(logical);
-               if (physical == -1ULL)
-                       goto err;
-
-               if (read_tree_node(physical, &buf))
-                       goto err;
-
-               lvl = buf->header.level;
-               if (i && prev_lvl != lvl + 1) {
-                       printf("%s: invalid level in header at %llu\n",
-                              __func__, logical);
-                       goto err;
+       int ret;
+       struct extent_buffer *leaf;
+
+again:
+       ret = btrfs_search_slot(NULL, root, key, p, 0, 0);
+       if (ret <= 0)
+                return ret;
+       /*
+        * A return value of 1 means the path is at the position where the item
+        * should be inserted. Normally this is the next bigger item, but in
+        * case the previous item is the last in a leaf, path points to the
+        * first free slot in the previous leaf, i.e. at an invalid item.
+        */
+       leaf = p->nodes[0];
+
+       if (find_higher) {
+               if (p->slots[0] >= btrfs_header_nritems(leaf)) {
+                       ret = btrfs_next_leaf(root, p);
+                       if (ret <= 0)
+                               return ret;
+                       if (!return_any)
+                               return 1;
+                       /*
+                        * No higher item found, return the next lower instead
+                        */
+                       return_any = 0;
+                       find_higher = 0;
+                       btrfs_release_path(p);
+                       goto again;
                }
-               prev_lvl = lvl;
-
-               ret = btrfs_bin_search(buf, key, &slot);
-               if (ret < 0)
-                       goto err;
-               if (ret && slot > 0 && lvl)
-                       slot -= 1;
-
-               p->slots[lvl] = slot;
-               p->nodes[lvl] = buf;
-
-               if (lvl) {
-                       logical = buf->node.ptrs[slot].blockptr;
-               } else {
+       } else {
+               if (p->slots[0] == 0) {
+                       ret = btrfs_prev_leaf(root, p);
+                       if (ret < 0)
+                               return ret;
+                       if (!ret) {
+                               leaf = p->nodes[0];
+                               if (p->slots[0] == btrfs_header_nritems(leaf))
+                                       p->slots[0]--;
+                               return 0;
+                       }
+                       if (!return_any)
+                               return 1;
                        /*
-                        * The path might be invalid if:
-                        *   cur leaf max < searched value < next leaf min
-                        *
-                        * Jump to the next valid element if it exists.
+                        * No lower item found, return the next higher instead
                         */
-                       if (slot >= buf->header.nritems)
-                               if (btrfs_next_slot(p) < 0)
-                                       goto err;
-                       break;
+                       return_any = 0;
+                       find_higher = 1;
+                       btrfs_release_path(p);
+                       goto again;
+               } else {
+                       --p->slots[0];
                }
        }
-
        return 0;
-err:
-       btrfs_free_path(p);
-       return -1;
 }
 
-static int jump_leaf(struct btrfs_path *path, int dir)
+/*
+ * how many bytes are required to store the items in a leaf.  start
+ * and nr indicate which items in the leaf to check.  This totals up the
+ * space used both by the item structs and the item data
+ */
+static int leaf_space_used(struct extent_buffer *l, int start, int nr)
 {
-       struct btrfs_path p;
-       u32 slot;
-       int level = 1, from_level, i;
-
-       dir = dir >= 0 ? 1 : -1;
+       int data_len;
+       int nritems = btrfs_header_nritems(l);
+       int end = min(nritems, start + nr) - 1;
+
+       if (!nr)
+               return 0;
+       data_len = btrfs_item_end_nr(l, start);
+       data_len = data_len - btrfs_item_offset_nr(l, end);
+       data_len += sizeof(struct btrfs_item) * nr;
+       WARN_ON(data_len < 0);
+       return data_len;
+}
 
-       p = *path;
+/*
+ * The space between the end of the leaf items and
+ * the start of the leaf data.  IOW, how much room
+ * the leaf has left for both items and data
+ */
+int btrfs_leaf_free_space(struct extent_buffer *leaf)
+{
+       int nritems = btrfs_header_nritems(leaf);
+       u32 leaf_data_size;
+       int ret;
+
+       BUG_ON(leaf->fs_info && leaf->fs_info->nodesize != leaf->len);
+       leaf_data_size = __BTRFS_LEAF_DATA_SIZE(leaf->len);
+       ret = leaf_data_size - leaf_space_used(leaf, 0 ,nritems);
+       if (ret < 0) {
+               printk("leaf free space ret %d, leaf data size %u, used %d nritems %d\n",
+                      ret, leaf_data_size, leaf_space_used(leaf, 0, nritems),
+                      nritems);
+       }
+       return ret;
+}
 
-       while (level < BTRFS_MAX_LEVEL) {
-               if (!p.nodes[level])
+/*
+ * walk up the tree as far as required to find the previous leaf.
+ * returns 0 if it found something or 1 if there are no lesser leaves.
+ * returns < 0 on io errors.
+ */
+int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path)
+{
+       int slot;
+       int level = 1;
+       struct extent_buffer *c;
+       struct extent_buffer *next = NULL;
+       struct btrfs_fs_info *fs_info = root->fs_info;
+
+       while(level < BTRFS_MAX_LEVEL) {
+               if (!path->nodes[level])
                        return 1;
 
-               slot = p.slots[level];
-               if ((dir > 0 && slot + dir >= p.nodes[level]->header.nritems)
-                   || (dir < 0 && !slot))
+               slot = path->slots[level];
+               c = path->nodes[level];
+               if (slot == 0) {
                        level++;
-               else
-                       break;
-       }
-
-       if (level == BTRFS_MAX_LEVEL)
-               return 1;
-
-       p.slots[level] = slot + dir;
-       level--;
-       from_level = level;
-
-       while (level >= 0) {
-               u64 logical, physical;
-
-               slot = p.slots[level + 1];
-               logical = p.nodes[level + 1]->node.ptrs[slot].blockptr;
-               physical = btrfs_map_logical_to_physical(logical);
-               if (physical == -1ULL)
-                       goto err;
-
-               if (read_tree_node(physical, &p.nodes[level]))
-                       goto err;
+                       if (level == BTRFS_MAX_LEVEL)
+                               return 1;
+                       continue;
+               }
+               slot--;
 
-               if (dir > 0)
-                       p.slots[level] = 0;
-               else
-                       p.slots[level] = p.nodes[level]->header.nritems - 1;
+               next = read_node_slot(fs_info, c, slot);
+               if (!extent_buffer_uptodate(next)) {
+                       if (IS_ERR(next))
+                               return PTR_ERR(next);
+                       return -EIO;
+               }
+               break;
+       }
+       path->slots[level] = slot;
+       while(1) {
                level--;
+               c = path->nodes[level];
+               free_extent_buffer(c);
+               slot = btrfs_header_nritems(next);
+               if (slot != 0)
+                       slot--;
+               path->nodes[level] = next;
+               path->slots[level] = slot;
+               if (!level)
+                       break;
+               next = read_node_slot(fs_info, next, slot);
+               if (!extent_buffer_uptodate(next)) {
+                       if (IS_ERR(next))
+                               return PTR_ERR(next);
+                       return -EIO;
+               }
        }
-
-       /* Free rewritten nodes in path */
-       for (i = 0; i <= from_level; ++i)
-               free(path->nodes[i]);
-
-       *path = p;
        return 0;
-
-err:
-       /* Free rewritten nodes in p */
-       for (i = level + 1; i <= from_level; ++i)
-               free(p.nodes[i]);
-       return -1;
 }
 
-int btrfs_prev_slot(struct btrfs_path *p)
+/*
+ * Walk up the tree as far as necessary to find the next sibling tree block.
+ * More generic version of btrfs_next_leaf(), as it could find sibling nodes
+ * if @path->lowest_level is not 0.
+ *
+ * returns 0 if it found something or 1 if there are no greater leaves.
+ * returns < 0 on io errors.
+ */
+int btrfs_next_sibling_tree_block(struct btrfs_fs_info *fs_info,
+                                 struct btrfs_path *path)
 {
-       if (!p->slots[0])
-               return jump_leaf(p, -1);
+       int slot;
+       int level = path->lowest_level + 1;
+       struct extent_buffer *c;
+       struct extent_buffer *next = NULL;
+
+       BUG_ON(path->lowest_level + 1 >= BTRFS_MAX_LEVEL);
+       do {
+               if (!path->nodes[level])
+                       return 1;
 
-       p->slots[0]--;
+               slot = path->slots[level] + 1;
+               c = path->nodes[level];
+               if (slot >= btrfs_header_nritems(c)) {
+                       level++;
+                       if (level == BTRFS_MAX_LEVEL)
+                               return 1;
+                       continue;
+               }
+
+               next = read_node_slot(fs_info, c, slot);
+               if (!extent_buffer_uptodate(next))
+                       return -EIO;
+               break;
+       } while (level < BTRFS_MAX_LEVEL);
+       path->slots[level] = slot;
+       while(1) {
+               level--;
+               c = path->nodes[level];
+               free_extent_buffer(c);
+               path->nodes[level] = next;
+               path->slots[level] = 0;
+               if (level == path->lowest_level)
+                       break;
+               next = read_node_slot(fs_info, next, 0);
+               if (!extent_buffer_uptodate(next))
+                       return -EIO;
+       }
        return 0;
 }
 
-int btrfs_next_slot(struct btrfs_path *p)
+int btrfs_previous_item(struct btrfs_root *root,
+                       struct btrfs_path *path, u64 min_objectid,
+                       int type)
 {
-       struct btrfs_leaf *leaf = &p->nodes[0]->leaf;
-
-       if (p->slots[0] + 1 >= leaf->header.nritems)
-               return jump_leaf(p, 1);
+       struct btrfs_key found_key;
+       struct extent_buffer *leaf;
+       u32 nritems;
+       int ret;
+
+       while(1) {
+               if (path->slots[0] == 0) {
+                       ret = btrfs_prev_leaf(root, path);
+                       if (ret != 0)
+                               return ret;
+               } else {
+                       path->slots[0]--;
+               }
+               leaf = path->nodes[0];
+               nritems = btrfs_header_nritems(leaf);
+               if (nritems == 0)
+                       return 1;
+               if (path->slots[0] == nritems)
+                       path->slots[0]--;
 
-       p->slots[0]++;
-       return 0;
+               btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
+               if (found_key.objectid < min_objectid)
+                       break;
+               if (found_key.type == type)
+                       return 0;
+               if (found_key.objectid == min_objectid &&
+                   found_key.type < type)
+                       break;
+       }
+       return 1;
 }
index 65c152a..219c410 100644 (file)
 
 #include <common.h>
 #include <compiler.h>
-#include "btrfs_tree.h"
-
-#define BTRFS_MAGIC 0x4D5F53665248425FULL /* ascii _BHRfS_M, no null */
+#include <linux/rbtree.h>
+#include <linux/bug.h>
+#include <linux/unaligned/le_byteshift.h>
+#include <u-boot/crc.h>
+#include "kernel-shared/btrfs_tree.h"
+#include "crypto/hash.h"
+#include "compat.h"
+#include "extent-io.h"
 
 #define BTRFS_MAX_MIRRORS 3
 
-#define BTRFS_MAX_LEVEL 8
-
-#define BTRFS_COMPAT_EXTENT_TREE_V0
-
 /*
  * the max metadata block size.  This limit is somewhat artificial,
  * but the memmove costs go through the roof for larger blocks.
 #define BTRFS_MAX_METADATA_BLOCKSIZE 65536
 
 /*
- * we can actually store much bigger names, but lets not confuse the rest
- * of linux
- */
-#define BTRFS_NAME_LEN 255
-
-/*
  * Theoretical limit is larger, but we keep this down to a sane
  * value. That should limit greatly the possibility of collisions on
  * inode ref items.
  */
 #define BTRFS_LINK_MAX 65535U
 
-static const int btrfs_csum_sizes[] = { 4 };
-
 /* four bytes for CRC32 */
 #define BTRFS_EMPTY_DIR_SIZE 0
 
+struct btrfs_mapping_tree {
+       struct cache_tree cache_tree;
+};
+
+static inline unsigned long btrfs_chunk_item_size(int num_stripes)
+{
+       BUG_ON(num_stripes == 0);
+       return sizeof(struct btrfs_chunk) +
+               sizeof(struct btrfs_stripe) * (num_stripes - 1);
+}
+
+#define __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct btrfs_header))
+#define BTRFS_LEAF_DATA_SIZE(fs_info) \
+                               (__BTRFS_LEAF_DATA_SIZE(fs_info->nodesize))
+
+struct btrfs_path {
+       struct extent_buffer *nodes[BTRFS_MAX_LEVEL];
+       int slots[BTRFS_MAX_LEVEL];
+
+       /* keep some upper locks as we walk down */
+       u8 lowest_level;
+};
+
 /* ioprio of readahead is set to idle */
 #define BTRFS_IOPRIO_READA (IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, 0))
 
@@ -52,6 +68,92 @@ static const int btrfs_csum_sizes[] = { 4 };
 
 #define BTRFS_MAX_EXTENT_SIZE SZ_128M
 
+enum btrfs_tree_block_status {
+       BTRFS_TREE_BLOCK_CLEAN,
+       BTRFS_TREE_BLOCK_INVALID_NRITEMS,
+       BTRFS_TREE_BLOCK_INVALID_PARENT_KEY,
+       BTRFS_TREE_BLOCK_BAD_KEY_ORDER,
+       BTRFS_TREE_BLOCK_INVALID_LEVEL,
+       BTRFS_TREE_BLOCK_INVALID_FREE_SPACE,
+       BTRFS_TREE_BLOCK_INVALID_OFFSETS,
+};
+
+struct btrfs_root {
+       struct extent_buffer *node;
+       struct btrfs_root_item root_item;
+       struct btrfs_key root_key;
+       struct btrfs_fs_info *fs_info;
+       u64 objectid;
+       u64 last_trans;
+
+       int ref_cows;
+       int track_dirty;
+
+       u32 type;
+       u64 last_inode_alloc;
+
+       struct rb_node rb_node;
+};
+
+struct btrfs_trans_handle;
+struct btrfs_device;
+struct btrfs_fs_devices;
+struct btrfs_fs_info {
+       u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
+       u8 *new_chunk_tree_uuid;
+       struct btrfs_root *fs_root;
+       struct btrfs_root *tree_root;
+       struct btrfs_root *chunk_root;
+       struct btrfs_root *csum_root;
+
+       struct rb_root fs_root_tree;
+
+       struct extent_io_tree extent_cache;
+
+       /* logical->physical extent mapping */
+       struct btrfs_mapping_tree mapping_tree;
+
+       u64 last_trans_committed;
+
+       struct btrfs_super_block *super_copy;
+
+       struct btrfs_fs_devices *fs_devices;
+
+       /* Cached block sizes */
+       u32 nodesize;
+       u32 sectorsize;
+       u32 stripesize;
+};
+
+static inline u32 BTRFS_MAX_ITEM_SIZE(const struct btrfs_fs_info *info)
+{
+       return BTRFS_LEAF_DATA_SIZE(info) - sizeof(struct btrfs_item);
+}
+
+static inline u32 BTRFS_NODEPTRS_PER_BLOCK(const struct btrfs_fs_info *info)
+{
+       return BTRFS_LEAF_DATA_SIZE(info) / sizeof(struct btrfs_key_ptr);
+}
+
+static inline u32 BTRFS_NODEPTRS_PER_EXTENT_BUFFER(const struct extent_buffer *eb)
+{
+       BUG_ON(eb->fs_info && eb->fs_info->nodesize != eb->len);
+       return __BTRFS_LEAF_DATA_SIZE(eb->len) / sizeof(struct btrfs_key_ptr);
+}
+
+#define BTRFS_FILE_EXTENT_INLINE_DATA_START            \
+       (offsetof(struct btrfs_file_extent_item, disk_bytenr))
+static inline u32 BTRFS_MAX_INLINE_DATA_SIZE(const struct btrfs_fs_info *info)
+{
+       return BTRFS_MAX_ITEM_SIZE(info) -
+               BTRFS_FILE_EXTENT_INLINE_DATA_START;
+}
+
+static inline u32 BTRFS_MAX_XATTR_SIZE(const struct btrfs_fs_info *info)
+{
+       return BTRFS_MAX_ITEM_SIZE(info) - sizeof(struct btrfs_dir_item);
+}
+
 /*
  * File system states
  */
@@ -61,273 +163,1136 @@ static const int btrfs_csum_sizes[] = { 4 };
 #define BTRFS_FS_STATE_DEV_REPLACING   3
 #define BTRFS_FS_STATE_DUMMY_FS_INFO   4
 
-#define BTRFS_BACKREF_REV_MAX          256
-#define BTRFS_BACKREF_REV_SHIFT                56
-#define BTRFS_BACKREF_REV_MASK         (((u64)BTRFS_BACKREF_REV_MAX - 1) << \
-                                        BTRFS_BACKREF_REV_SHIFT)
+#define read_eb_member(eb, ptr, type, member, result) (                        \
+       read_extent_buffer(eb, (char *)(result),                        \
+                          ((unsigned long)(ptr)) +                     \
+                           offsetof(type, member),                     \
+                          sizeof(((type *)0)->member)))
 
-#define BTRFS_OLD_BACKREF_REV          0
-#define BTRFS_MIXED_BACKREF_REV                1
+#define write_eb_member(eb, ptr, type, member, result) (               \
+       write_extent_buffer(eb, (char *)(result),                       \
+                          ((unsigned long)(ptr)) +                     \
+                           offsetof(type, member),                     \
+                          sizeof(((type *)0)->member)))
 
-/*
- * every tree block (leaf or node) starts with this header.
- */
-struct btrfs_header {
-       /* these first four must match the super block */
-       __u8 csum[BTRFS_CSUM_SIZE];
-       __u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */
-       __u64 bytenr; /* which block this node is supposed to live in */
-       __u64 flags;
-
-       /* allowed to be different from the super from here on down */
-       __u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
-       __u64 generation;
-       __u64 owner;
-       __u32 nritems;
-       __u8 level;
-} __attribute__ ((__packed__));
+#define BTRFS_SETGET_HEADER_FUNCS(name, type, member, bits)            \
+static inline u##bits btrfs_##name(const struct extent_buffer *eb)     \
+{                                                                      \
+       const struct btrfs_header *h = (struct btrfs_header *)eb->data; \
+       return le##bits##_to_cpu(h->member);                            \
+}                                                                      \
+static inline void btrfs_set_##name(struct extent_buffer *eb,          \
+                                   u##bits val)                        \
+{                                                                      \
+       struct btrfs_header *h = (struct btrfs_header *)eb->data;       \
+       h->member = cpu_to_le##bits(val);                               \
+}
 
-/*
- * this is a very generous portion of the super block, giving us
- * room to translate 14 chunks with 3 stripes each.
- */
-#define BTRFS_SYSTEM_CHUNK_ARRAY_SIZE 2048
+#define BTRFS_SETGET_FUNCS(name, type, member, bits)                   \
+static inline u##bits btrfs_##name(const struct extent_buffer *eb,     \
+                                  const type *s)                       \
+{                                                                      \
+       unsigned long offset = (unsigned long)s;                        \
+       const type *p = (type *) (eb->data + offset);                   \
+       return get_unaligned_le##bits(&p->member);                      \
+}                                                                      \
+static inline void btrfs_set_##name(struct extent_buffer *eb,          \
+                                   type *s, u##bits val)               \
+{                                                                      \
+       unsigned long offset = (unsigned long)s;                        \
+       type *p = (type *) (eb->data + offset);                         \
+       put_unaligned_le##bits(val, &p->member);                        \
+}
 
-/*
- * just in case we somehow lose the roots and are not able to mount,
- * we store an array of the roots from previous transactions
- * in the super.
- */
-#define BTRFS_NUM_BACKUP_ROOTS 4
-struct btrfs_root_backup {
-       __u64 tree_root;
-       __u64 tree_root_gen;
-
-       __u64 chunk_root;
-       __u64 chunk_root_gen;
-
-       __u64 extent_root;
-       __u64 extent_root_gen;
-
-       __u64 fs_root;
-       __u64 fs_root_gen;
-
-       __u64 dev_root;
-       __u64 dev_root_gen;
-
-       __u64 csum_root;
-       __u64 csum_root_gen;
-
-       __u64 total_bytes;
-       __u64 bytes_used;
-       __u64 num_devices;
-       /* future */
-       __u64 unused_64[4];
-
-       __u8 tree_root_level;
-       __u8 chunk_root_level;
-       __u8 extent_root_level;
-       __u8 fs_root_level;
-       __u8 dev_root_level;
-       __u8 csum_root_level;
-       /* future and to align */
-       __u8 unused_8[10];
-} __attribute__ ((__packed__));
+#define BTRFS_SETGET_STACK_FUNCS(name, type, member, bits)             \
+static inline u##bits btrfs_##name(const type *s)                      \
+{                                                                      \
+       return le##bits##_to_cpu(s->member);                            \
+}                                                                      \
+static inline void btrfs_set_##name(type *s, u##bits val)              \
+{                                                                      \
+       s->member = cpu_to_le##bits(val);                               \
+}
 
-/*
- * the super block basically lists the main trees of the FS
- * it currently lacks any block count etc etc
- */
-struct btrfs_super_block {
-       __u8 csum[BTRFS_CSUM_SIZE];
-       /* the first 4 fields must match struct btrfs_header */
-       __u8 fsid[BTRFS_FSID_SIZE];    /* FS specific uuid */
-       __u64 bytenr; /* this block number */
-       __u64 flags;
-
-       /* allowed to be different from the btrfs_header from here own down */
-       __u64 magic;
-       __u64 generation;
-       __u64 root;
-       __u64 chunk_root;
-       __u64 log_root;
-
-       /* this will help find the new super based on the log root */
-       __u64 log_root_transid;
-       __u64 total_bytes;
-       __u64 bytes_used;
-       __u64 root_dir_objectid;
-       __u64 num_devices;
-       __u32 sectorsize;
-       __u32 nodesize;
-       __u32 __unused_leafsize;
-       __u32 stripesize;
-       __u32 sys_chunk_array_size;
-       __u64 chunk_root_generation;
-       __u64 compat_flags;
-       __u64 compat_ro_flags;
-       __u64 incompat_flags;
-       __u16 csum_type;
-       __u8 root_level;
-       __u8 chunk_root_level;
-       __u8 log_root_level;
-       struct btrfs_dev_item dev_item;
-
-       char label[BTRFS_LABEL_SIZE];
-
-       __u64 cache_generation;
-       __u64 uuid_tree_generation;
-
-       /* future expansion */
-       __u64 reserved[30];
-       __u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
-       struct btrfs_root_backup super_roots[BTRFS_NUM_BACKUP_ROOTS];
-} __attribute__ ((__packed__));
+BTRFS_SETGET_FUNCS(device_type, struct btrfs_dev_item, type, 64);
+BTRFS_SETGET_FUNCS(device_total_bytes, struct btrfs_dev_item, total_bytes, 64);
+BTRFS_SETGET_FUNCS(device_bytes_used, struct btrfs_dev_item, bytes_used, 64);
+BTRFS_SETGET_FUNCS(device_io_align, struct btrfs_dev_item, io_align, 32);
+BTRFS_SETGET_FUNCS(device_io_width, struct btrfs_dev_item, io_width, 32);
+BTRFS_SETGET_FUNCS(device_start_offset, struct btrfs_dev_item,
+                  start_offset, 64);
+BTRFS_SETGET_FUNCS(device_sector_size, struct btrfs_dev_item, sector_size, 32);
+BTRFS_SETGET_FUNCS(device_id, struct btrfs_dev_item, devid, 64);
+BTRFS_SETGET_FUNCS(device_group, struct btrfs_dev_item, dev_group, 32);
+BTRFS_SETGET_FUNCS(device_seek_speed, struct btrfs_dev_item, seek_speed, 8);
+BTRFS_SETGET_FUNCS(device_bandwidth, struct btrfs_dev_item, bandwidth, 8);
+BTRFS_SETGET_FUNCS(device_generation, struct btrfs_dev_item, generation, 64);
 
-/*
- * Compat flags that we support.  If any incompat flags are set other than the
- * ones specified below then we will fail to mount
- */
-#define BTRFS_FEATURE_COMPAT_SUPP              0ULL
-#define BTRFS_FEATURE_COMPAT_SAFE_SET          0ULL
-#define BTRFS_FEATURE_COMPAT_SAFE_CLEAR                0ULL
-
-#define BTRFS_FEATURE_COMPAT_RO_SUPP                   \
-       (BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE |      \
-        BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID)
-
-#define BTRFS_FEATURE_COMPAT_RO_SAFE_SET       0ULL
-#define BTRFS_FEATURE_COMPAT_RO_SAFE_CLEAR     0ULL
-
-#define BTRFS_FEATURE_INCOMPAT_SUPP                    \
-       (BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF |         \
-        BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL |        \
-        BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS |          \
-        BTRFS_FEATURE_INCOMPAT_BIG_METADATA |          \
-        BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO |          \
-        BTRFS_FEATURE_INCOMPAT_RAID56 |                \
-        BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF |         \
-        BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA |       \
-        BTRFS_FEATURE_INCOMPAT_NO_HOLES)
-
-#define BTRFS_FEATURE_INCOMPAT_SAFE_SET                        \
-       (BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF)
-#define BTRFS_FEATURE_INCOMPAT_SAFE_CLEAR              0ULL
+BTRFS_SETGET_STACK_FUNCS(stack_device_type, struct btrfs_dev_item, type, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_device_total_bytes, struct btrfs_dev_item,
+                        total_bytes, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_device_bytes_used, struct btrfs_dev_item,
+                        bytes_used, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_device_io_align, struct btrfs_dev_item,
+                        io_align, 32);
+BTRFS_SETGET_STACK_FUNCS(stack_device_io_width, struct btrfs_dev_item,
+                        io_width, 32);
+BTRFS_SETGET_STACK_FUNCS(stack_device_sector_size, struct btrfs_dev_item,
+                        sector_size, 32);
+BTRFS_SETGET_STACK_FUNCS(stack_device_id, struct btrfs_dev_item, devid, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_device_group, struct btrfs_dev_item,
+                        dev_group, 32);
+BTRFS_SETGET_STACK_FUNCS(stack_device_seek_speed, struct btrfs_dev_item,
+                        seek_speed, 8);
+BTRFS_SETGET_STACK_FUNCS(stack_device_bandwidth, struct btrfs_dev_item,
+                        bandwidth, 8);
+BTRFS_SETGET_STACK_FUNCS(stack_device_generation, struct btrfs_dev_item,
+                        generation, 64);
 
-/*
- * A leaf is full of items. offset and size tell us where to find
- * the item in the leaf (relative to the start of the data area)
- */
-struct btrfs_item {
-       struct btrfs_key key;
-       __u32 offset;
-       __u32 size;
-} __attribute__ ((__packed__));
+static inline char *btrfs_device_uuid(struct btrfs_dev_item *d)
+{
+       return (char *)d + offsetof(struct btrfs_dev_item, uuid);
+}
 
-/*
- * leaves have an item area and a data area:
- * [item0, item1....itemN] [free space] [dataN...data1, data0]
- *
- * The data is separate from the items to get the keys closer together
- * during searches.
- */
-struct btrfs_leaf {
-       struct btrfs_header header;
-       struct btrfs_item items[];
-} __attribute__ ((__packed__));
+static inline char *btrfs_device_fsid(struct btrfs_dev_item *d)
+{
+       return (char *)d + offsetof(struct btrfs_dev_item, fsid);
+}
+
+BTRFS_SETGET_FUNCS(chunk_length, struct btrfs_chunk, length, 64);
+BTRFS_SETGET_FUNCS(chunk_owner, struct btrfs_chunk, owner, 64);
+BTRFS_SETGET_FUNCS(chunk_stripe_len, struct btrfs_chunk, stripe_len, 64);
+BTRFS_SETGET_FUNCS(chunk_io_align, struct btrfs_chunk, io_align, 32);
+BTRFS_SETGET_FUNCS(chunk_io_width, struct btrfs_chunk, io_width, 32);
+BTRFS_SETGET_FUNCS(chunk_sector_size, struct btrfs_chunk, sector_size, 32);
+BTRFS_SETGET_FUNCS(chunk_type, struct btrfs_chunk, type, 64);
+BTRFS_SETGET_FUNCS(chunk_num_stripes, struct btrfs_chunk, num_stripes, 16);
+BTRFS_SETGET_FUNCS(chunk_sub_stripes, struct btrfs_chunk, sub_stripes, 16);
+BTRFS_SETGET_FUNCS(stripe_devid, struct btrfs_stripe, devid, 64);
+BTRFS_SETGET_FUNCS(stripe_offset, struct btrfs_stripe, offset, 64);
+
+static inline char *btrfs_stripe_dev_uuid(struct btrfs_stripe *s)
+{
+       return (char *)s + offsetof(struct btrfs_stripe, dev_uuid);
+}
+
+BTRFS_SETGET_STACK_FUNCS(stack_chunk_length, struct btrfs_chunk, length, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_chunk_owner, struct btrfs_chunk, owner, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_chunk_stripe_len, struct btrfs_chunk,
+                        stripe_len, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_chunk_io_align, struct btrfs_chunk,
+                        io_align, 32);
+BTRFS_SETGET_STACK_FUNCS(stack_chunk_io_width, struct btrfs_chunk,
+                        io_width, 32);
+BTRFS_SETGET_STACK_FUNCS(stack_chunk_sector_size, struct btrfs_chunk,
+                        sector_size, 32);
+BTRFS_SETGET_STACK_FUNCS(stack_chunk_type, struct btrfs_chunk, type, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_chunk_num_stripes, struct btrfs_chunk,
+                        num_stripes, 16);
+BTRFS_SETGET_STACK_FUNCS(stack_chunk_sub_stripes, struct btrfs_chunk,
+                        sub_stripes, 16);
+BTRFS_SETGET_STACK_FUNCS(stack_stripe_devid, struct btrfs_stripe, devid, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_stripe_offset, struct btrfs_stripe, offset, 64);
+
+static inline struct btrfs_stripe *btrfs_stripe_nr(struct btrfs_chunk *c,
+                                                  int nr)
+{
+       unsigned long offset = (unsigned long)c;
+       offset += offsetof(struct btrfs_chunk, stripe);
+       offset += nr * sizeof(struct btrfs_stripe);
+       return (struct btrfs_stripe *)offset;
+}
+
+static inline char *btrfs_stripe_dev_uuid_nr(struct btrfs_chunk *c, int nr)
+{
+       return btrfs_stripe_dev_uuid(btrfs_stripe_nr(c, nr));
+}
+
+static inline u64 btrfs_stripe_offset_nr(struct extent_buffer *eb,
+                                        struct btrfs_chunk *c, int nr)
+{
+       return btrfs_stripe_offset(eb, btrfs_stripe_nr(c, nr));
+}
+
+static inline void btrfs_set_stripe_offset_nr(struct extent_buffer *eb,
+                                            struct btrfs_chunk *c, int nr,
+                                            u64 val)
+{
+       btrfs_set_stripe_offset(eb, btrfs_stripe_nr(c, nr), val);
+}
+
+static inline u64 btrfs_stripe_devid_nr(struct extent_buffer *eb,
+                                        struct btrfs_chunk *c, int nr)
+{
+       return btrfs_stripe_devid(eb, btrfs_stripe_nr(c, nr));
+}
+
+static inline void btrfs_set_stripe_devid_nr(struct extent_buffer *eb,
+                                            struct btrfs_chunk *c, int nr,
+                                            u64 val)
+{
+       btrfs_set_stripe_devid(eb, btrfs_stripe_nr(c, nr), val);
+}
+
+/* struct btrfs_block_group_item */
+BTRFS_SETGET_STACK_FUNCS(block_group_used, struct btrfs_block_group_item,
+                        used, 64);
+BTRFS_SETGET_FUNCS(disk_block_group_used, struct btrfs_block_group_item,
+                        used, 64);
+BTRFS_SETGET_STACK_FUNCS(block_group_chunk_objectid,
+                       struct btrfs_block_group_item, chunk_objectid, 64);
+
+BTRFS_SETGET_FUNCS(disk_block_group_chunk_objectid,
+                  struct btrfs_block_group_item, chunk_objectid, 64);
+BTRFS_SETGET_FUNCS(disk_block_group_flags,
+                  struct btrfs_block_group_item, flags, 64);
+BTRFS_SETGET_STACK_FUNCS(block_group_flags,
+                       struct btrfs_block_group_item, flags, 64);
+
+/* struct btrfs_free_space_info */
+BTRFS_SETGET_FUNCS(free_space_extent_count, struct btrfs_free_space_info,
+                  extent_count, 32);
+BTRFS_SETGET_FUNCS(free_space_flags, struct btrfs_free_space_info, flags, 32);
+
+/* struct btrfs_inode_ref */
+BTRFS_SETGET_FUNCS(inode_ref_name_len, struct btrfs_inode_ref, name_len, 16);
+BTRFS_SETGET_STACK_FUNCS(stack_inode_ref_name_len, struct btrfs_inode_ref, name_len, 16);
+BTRFS_SETGET_FUNCS(inode_ref_index, struct btrfs_inode_ref, index, 64);
+
+/* struct btrfs_inode_extref */
+BTRFS_SETGET_FUNCS(inode_extref_parent, struct btrfs_inode_extref,
+                  parent_objectid, 64);
+BTRFS_SETGET_FUNCS(inode_extref_name_len, struct btrfs_inode_extref,
+                  name_len, 16);
+BTRFS_SETGET_FUNCS(inode_extref_index, struct btrfs_inode_extref, index, 64);
+
+/* struct btrfs_inode_item */
+BTRFS_SETGET_FUNCS(inode_generation, struct btrfs_inode_item, generation, 64);
+BTRFS_SETGET_FUNCS(inode_sequence, struct btrfs_inode_item, sequence, 64);
+BTRFS_SETGET_FUNCS(inode_transid, struct btrfs_inode_item, transid, 64);
+BTRFS_SETGET_FUNCS(inode_size, struct btrfs_inode_item, size, 64);
+BTRFS_SETGET_FUNCS(inode_nbytes, struct btrfs_inode_item, nbytes, 64);
+BTRFS_SETGET_FUNCS(inode_block_group, struct btrfs_inode_item, block_group, 64);
+BTRFS_SETGET_FUNCS(inode_nlink, struct btrfs_inode_item, nlink, 32);
+BTRFS_SETGET_FUNCS(inode_uid, struct btrfs_inode_item, uid, 32);
+BTRFS_SETGET_FUNCS(inode_gid, struct btrfs_inode_item, gid, 32);
+BTRFS_SETGET_FUNCS(inode_mode, struct btrfs_inode_item, mode, 32);
+BTRFS_SETGET_FUNCS(inode_rdev, struct btrfs_inode_item, rdev, 64);
+BTRFS_SETGET_FUNCS(inode_flags, struct btrfs_inode_item, flags, 64);
+
+BTRFS_SETGET_STACK_FUNCS(stack_inode_generation,
+                        struct btrfs_inode_item, generation, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_inode_sequence,
+                        struct btrfs_inode_item, sequence, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_inode_transid,
+                        struct btrfs_inode_item, transid, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_inode_size,
+                        struct btrfs_inode_item, size, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_inode_nbytes,
+                        struct btrfs_inode_item, nbytes, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_inode_block_group,
+                        struct btrfs_inode_item, block_group, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_inode_nlink,
+                        struct btrfs_inode_item, nlink, 32);
+BTRFS_SETGET_STACK_FUNCS(stack_inode_uid,
+                        struct btrfs_inode_item, uid, 32);
+BTRFS_SETGET_STACK_FUNCS(stack_inode_gid,
+                        struct btrfs_inode_item, gid, 32);
+BTRFS_SETGET_STACK_FUNCS(stack_inode_mode,
+                        struct btrfs_inode_item, mode, 32);
+BTRFS_SETGET_STACK_FUNCS(stack_inode_rdev,
+                        struct btrfs_inode_item, rdev, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_inode_flags,
+                        struct btrfs_inode_item, flags, 64);
+
+static inline struct btrfs_timespec *
+btrfs_inode_atime(struct btrfs_inode_item *inode_item)
+{
+       unsigned long ptr = (unsigned long)inode_item;
+       ptr += offsetof(struct btrfs_inode_item, atime);
+       return (struct btrfs_timespec *)ptr;
+}
+
+static inline struct btrfs_timespec *
+btrfs_inode_mtime(struct btrfs_inode_item *inode_item)
+{
+       unsigned long ptr = (unsigned long)inode_item;
+       ptr += offsetof(struct btrfs_inode_item, mtime);
+       return (struct btrfs_timespec *)ptr;
+}
+
+static inline struct btrfs_timespec *
+btrfs_inode_ctime(struct btrfs_inode_item *inode_item)
+{
+       unsigned long ptr = (unsigned long)inode_item;
+       ptr += offsetof(struct btrfs_inode_item, ctime);
+       return (struct btrfs_timespec *)ptr;
+}
+
+static inline struct btrfs_timespec *
+btrfs_inode_otime(struct btrfs_inode_item *inode_item)
+{
+       unsigned long ptr = (unsigned long)inode_item;
+       ptr += offsetof(struct btrfs_inode_item, otime);
+       return (struct btrfs_timespec *)ptr;
+}
+
+BTRFS_SETGET_FUNCS(timespec_sec, struct btrfs_timespec, sec, 64);
+BTRFS_SETGET_FUNCS(timespec_nsec, struct btrfs_timespec, nsec, 32);
+BTRFS_SETGET_STACK_FUNCS(stack_timespec_sec, struct btrfs_timespec,
+                        sec, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_timespec_nsec, struct btrfs_timespec,
+                        nsec, 32);
+
+/* struct btrfs_dev_extent */
+BTRFS_SETGET_FUNCS(dev_extent_chunk_tree, struct btrfs_dev_extent,
+                  chunk_tree, 64);
+BTRFS_SETGET_FUNCS(dev_extent_chunk_objectid, struct btrfs_dev_extent,
+                  chunk_objectid, 64);
+BTRFS_SETGET_FUNCS(dev_extent_chunk_offset, struct btrfs_dev_extent,
+                  chunk_offset, 64);
+BTRFS_SETGET_FUNCS(dev_extent_length, struct btrfs_dev_extent, length, 64);
+
+BTRFS_SETGET_STACK_FUNCS(stack_dev_extent_length, struct btrfs_dev_extent,
+                        length, 64);
+
+static inline u8 *btrfs_dev_extent_chunk_tree_uuid(struct btrfs_dev_extent *dev)
+{
+       unsigned long ptr = offsetof(struct btrfs_dev_extent, chunk_tree_uuid);
+       return (u8 *)((unsigned long)dev + ptr);
+}
+
+
+/* struct btrfs_extent_item */
+BTRFS_SETGET_FUNCS(extent_refs, struct btrfs_extent_item, refs, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_extent_refs, struct btrfs_extent_item, refs, 64);
+BTRFS_SETGET_FUNCS(extent_generation, struct btrfs_extent_item,
+                  generation, 64);
+BTRFS_SETGET_FUNCS(extent_flags, struct btrfs_extent_item, flags, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_extent_flags, struct btrfs_extent_item, flags, 64);
+
+BTRFS_SETGET_FUNCS(extent_refs_v0, struct btrfs_extent_item_v0, refs, 32);
+
+BTRFS_SETGET_FUNCS(tree_block_level, struct btrfs_tree_block_info, level, 8);
+
+static inline void btrfs_tree_block_key(struct extent_buffer *eb,
+                                       struct btrfs_tree_block_info *item,
+                                       struct btrfs_disk_key *key)
+{
+       read_eb_member(eb, item, struct btrfs_tree_block_info, key, key);
+}
+
+static inline void btrfs_set_tree_block_key(struct extent_buffer *eb,
+                                           struct btrfs_tree_block_info *item,
+                                           struct btrfs_disk_key *key)
+{
+       write_eb_member(eb, item, struct btrfs_tree_block_info, key, key);
+}
+
+BTRFS_SETGET_FUNCS(extent_data_ref_root, struct btrfs_extent_data_ref,
+                  root, 64);
+BTRFS_SETGET_FUNCS(extent_data_ref_objectid, struct btrfs_extent_data_ref,
+                  objectid, 64);
+BTRFS_SETGET_FUNCS(extent_data_ref_offset, struct btrfs_extent_data_ref,
+                  offset, 64);
+BTRFS_SETGET_FUNCS(extent_data_ref_count, struct btrfs_extent_data_ref,
+                  count, 32);
+
+BTRFS_SETGET_FUNCS(shared_data_ref_count, struct btrfs_shared_data_ref,
+                  count, 32);
+
+BTRFS_SETGET_FUNCS(extent_inline_ref_type, struct btrfs_extent_inline_ref,
+                  type, 8);
+BTRFS_SETGET_FUNCS(extent_inline_ref_offset, struct btrfs_extent_inline_ref,
+                  offset, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_extent_inline_ref_type,
+                        struct btrfs_extent_inline_ref, type, 8);
+BTRFS_SETGET_STACK_FUNCS(stack_extent_inline_ref_offset,
+                        struct btrfs_extent_inline_ref, offset, 64);
+
+static inline u32 btrfs_extent_inline_ref_size(int type)
+{
+       if (type == BTRFS_TREE_BLOCK_REF_KEY ||
+           type == BTRFS_SHARED_BLOCK_REF_KEY)
+               return sizeof(struct btrfs_extent_inline_ref);
+       if (type == BTRFS_SHARED_DATA_REF_KEY)
+               return sizeof(struct btrfs_shared_data_ref) +
+                      sizeof(struct btrfs_extent_inline_ref);
+       if (type == BTRFS_EXTENT_DATA_REF_KEY)
+               return sizeof(struct btrfs_extent_data_ref) +
+                      offsetof(struct btrfs_extent_inline_ref, offset);
+       BUG();
+       return 0;
+}
+
+BTRFS_SETGET_FUNCS(ref_root_v0, struct btrfs_extent_ref_v0, root, 64);
+BTRFS_SETGET_FUNCS(ref_generation_v0, struct btrfs_extent_ref_v0,
+                  generation, 64);
+BTRFS_SETGET_FUNCS(ref_objectid_v0, struct btrfs_extent_ref_v0, objectid, 64);
+BTRFS_SETGET_FUNCS(ref_count_v0, struct btrfs_extent_ref_v0, count, 32);
+
+/* struct btrfs_node */
+BTRFS_SETGET_FUNCS(key_blockptr, struct btrfs_key_ptr, blockptr, 64);
+BTRFS_SETGET_FUNCS(key_generation, struct btrfs_key_ptr, generation, 64);
+
+static inline u64 btrfs_node_blockptr(struct extent_buffer *eb, int nr)
+{
+       unsigned long ptr;
+       ptr = offsetof(struct btrfs_node, ptrs) +
+               sizeof(struct btrfs_key_ptr) * nr;
+       return btrfs_key_blockptr(eb, (struct btrfs_key_ptr *)ptr);
+}
+
+static inline void btrfs_set_node_blockptr(struct extent_buffer *eb,
+                                          int nr, u64 val)
+{
+       unsigned long ptr;
+       ptr = offsetof(struct btrfs_node, ptrs) +
+               sizeof(struct btrfs_key_ptr) * nr;
+       btrfs_set_key_blockptr(eb, (struct btrfs_key_ptr *)ptr, val);
+}
+
+static inline u64 btrfs_node_ptr_generation(struct extent_buffer *eb, int nr)
+{
+       unsigned long ptr;
+       ptr = offsetof(struct btrfs_node, ptrs) +
+               sizeof(struct btrfs_key_ptr) * nr;
+       return btrfs_key_generation(eb, (struct btrfs_key_ptr *)ptr);
+}
+
+static inline void btrfs_set_node_ptr_generation(struct extent_buffer *eb,
+                                                int nr, u64 val)
+{
+       unsigned long ptr;
+       ptr = offsetof(struct btrfs_node, ptrs) +
+               sizeof(struct btrfs_key_ptr) * nr;
+       btrfs_set_key_generation(eb, (struct btrfs_key_ptr *)ptr, val);
+}
+
+static inline unsigned long btrfs_node_key_ptr_offset(int nr)
+{
+       return offsetof(struct btrfs_node, ptrs) +
+               sizeof(struct btrfs_key_ptr) * nr;
+}
+
+static inline void btrfs_node_key(struct extent_buffer *eb,
+                                 struct btrfs_disk_key *disk_key, int nr)
+{
+       unsigned long ptr;
+       ptr = btrfs_node_key_ptr_offset(nr);
+       read_eb_member(eb, (struct btrfs_key_ptr *)ptr,
+                      struct btrfs_key_ptr, key, disk_key);
+}
+
+static inline void btrfs_set_node_key(struct extent_buffer *eb,
+                                     struct btrfs_disk_key *disk_key, int nr)
+{
+       unsigned long ptr;
+       ptr = btrfs_node_key_ptr_offset(nr);
+       write_eb_member(eb, (struct btrfs_key_ptr *)ptr,
+                      struct btrfs_key_ptr, key, disk_key);
+}
+
+/* struct btrfs_item */
+BTRFS_SETGET_FUNCS(item_offset, struct btrfs_item, offset, 32);
+BTRFS_SETGET_FUNCS(item_size, struct btrfs_item, size, 32);
+
+static inline unsigned long btrfs_item_nr_offset(int nr)
+{
+       return offsetof(struct btrfs_leaf, items) +
+               sizeof(struct btrfs_item) * nr;
+}
+
+static inline struct btrfs_item *btrfs_item_nr(int nr)
+{
+       return (struct btrfs_item *)btrfs_item_nr_offset(nr);
+}
+
+static inline u32 btrfs_item_end(struct extent_buffer *eb,
+                                struct btrfs_item *item)
+{
+       return btrfs_item_offset(eb, item) + btrfs_item_size(eb, item);
+}
+
+static inline u32 btrfs_item_end_nr(struct extent_buffer *eb, int nr)
+{
+       return btrfs_item_end(eb, btrfs_item_nr(nr));
+}
+
+static inline u32 btrfs_item_offset_nr(const struct extent_buffer *eb, int nr)
+{
+       return btrfs_item_offset(eb, btrfs_item_nr(nr));
+}
+
+static inline u32 btrfs_item_size_nr(struct extent_buffer *eb, int nr)
+{
+       return btrfs_item_size(eb, btrfs_item_nr(nr));
+}
+
+static inline void btrfs_item_key(struct extent_buffer *eb,
+                          struct btrfs_disk_key *disk_key, int nr)
+{
+       struct btrfs_item *item = btrfs_item_nr(nr);
+       read_eb_member(eb, item, struct btrfs_item, key, disk_key);
+}
+
+static inline void btrfs_set_item_key(struct extent_buffer *eb,
+                              struct btrfs_disk_key *disk_key, int nr)
+{
+       struct btrfs_item *item = btrfs_item_nr(nr);
+       write_eb_member(eb, item, struct btrfs_item, key, disk_key);
+}
+
+BTRFS_SETGET_FUNCS(dir_log_end, struct btrfs_dir_log_item, end, 64);
 
 /*
- * all non-leaf blocks are nodes, they hold only keys and pointers to
- * other blocks
+ * struct btrfs_root_ref
  */
-struct btrfs_key_ptr {
-       struct btrfs_key key;
-       __u64 blockptr;
-       __u64 generation;
-} __attribute__ ((__packed__));
+BTRFS_SETGET_FUNCS(root_ref_dirid, struct btrfs_root_ref, dirid, 64);
+BTRFS_SETGET_FUNCS(root_ref_sequence, struct btrfs_root_ref, sequence, 64);
+BTRFS_SETGET_FUNCS(root_ref_name_len, struct btrfs_root_ref, name_len, 16);
 
-struct btrfs_node {
-       struct btrfs_header header;
-       struct btrfs_key_ptr ptrs[];
-} __attribute__ ((__packed__));
+BTRFS_SETGET_STACK_FUNCS(stack_root_ref_dirid, struct btrfs_root_ref, dirid, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_root_ref_sequence, struct btrfs_root_ref, sequence, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_root_ref_name_len, struct btrfs_root_ref, name_len, 16);
 
-union btrfs_tree_node {
-       struct btrfs_header header;
-       struct btrfs_leaf leaf;
-       struct btrfs_node node;
-};
+/* struct btrfs_dir_item */
+BTRFS_SETGET_FUNCS(dir_data_len, struct btrfs_dir_item, data_len, 16);
+BTRFS_SETGET_FUNCS(dir_type, struct btrfs_dir_item, type, 8);
+BTRFS_SETGET_FUNCS(dir_name_len, struct btrfs_dir_item, name_len, 16);
+BTRFS_SETGET_FUNCS(dir_transid, struct btrfs_dir_item, transid, 64);
 
-typedef __u8 u8;
-typedef __u16 u16;
-typedef __u32 u32;
-typedef __u64 u64;
+BTRFS_SETGET_STACK_FUNCS(stack_dir_data_len, struct btrfs_dir_item, data_len, 16);
+BTRFS_SETGET_STACK_FUNCS(stack_dir_type, struct btrfs_dir_item, type, 8);
+BTRFS_SETGET_STACK_FUNCS(stack_dir_name_len, struct btrfs_dir_item, name_len, 16);
+BTRFS_SETGET_STACK_FUNCS(stack_dir_transid, struct btrfs_dir_item, transid, 64);
 
-struct btrfs_path {
-       union btrfs_tree_node *nodes[BTRFS_MAX_LEVEL];
-       u32 slots[BTRFS_MAX_LEVEL];
-};
+static inline void btrfs_dir_item_key(struct extent_buffer *eb,
+                                     struct btrfs_dir_item *item,
+                                     struct btrfs_disk_key *key)
+{
+       read_eb_member(eb, item, struct btrfs_dir_item, location, key);
+}
 
-struct btrfs_root {
-       u64 objectid;
-       u64 bytenr;
-       u64 root_dirid;
-};
+static inline void btrfs_set_dir_item_key(struct extent_buffer *eb,
+                                         struct btrfs_dir_item *item,
+                                         struct btrfs_disk_key *key)
+{
+       write_eb_member(eb, item, struct btrfs_dir_item, location, key);
+}
+
+/* struct btrfs_free_space_header */
+BTRFS_SETGET_FUNCS(free_space_entries, struct btrfs_free_space_header,
+                  num_entries, 64);
+BTRFS_SETGET_FUNCS(free_space_bitmaps, struct btrfs_free_space_header,
+                  num_bitmaps, 64);
+BTRFS_SETGET_FUNCS(free_space_generation, struct btrfs_free_space_header,
+                  generation, 64);
+
+static inline void btrfs_free_space_key(struct extent_buffer *eb,
+                                       struct btrfs_free_space_header *h,
+                                       struct btrfs_disk_key *key)
+{
+       read_eb_member(eb, h, struct btrfs_free_space_header, location, key);
+}
+
+static inline void btrfs_set_free_space_key(struct extent_buffer *eb,
+                                           struct btrfs_free_space_header *h,
+                                           struct btrfs_disk_key *key)
+{
+       write_eb_member(eb, h, struct btrfs_free_space_header, location, key);
+}
+
+/* struct btrfs_disk_key */
+BTRFS_SETGET_STACK_FUNCS(disk_key_objectid, struct btrfs_disk_key,
+                        objectid, 64);
+BTRFS_SETGET_STACK_FUNCS(disk_key_offset, struct btrfs_disk_key, offset, 64);
+BTRFS_SETGET_STACK_FUNCS(disk_key_type, struct btrfs_disk_key, type, 8);
+
+static inline void btrfs_disk_key_to_cpu(struct btrfs_key *cpu,
+                                        struct btrfs_disk_key *disk)
+{
+       cpu->offset = le64_to_cpu(disk->offset);
+       cpu->type = disk->type;
+       cpu->objectid = le64_to_cpu(disk->objectid);
+}
+
+static inline void btrfs_cpu_key_to_disk(struct btrfs_disk_key *disk,
+                                        const struct btrfs_key *cpu)
+{
+       disk->offset = cpu_to_le64(cpu->offset);
+       disk->type = cpu->type;
+       disk->objectid = cpu_to_le64(cpu->objectid);
+}
+
+static inline void btrfs_node_key_to_cpu(struct extent_buffer *eb,
+                                 struct btrfs_key *key, int nr)
+{
+       struct btrfs_disk_key disk_key;
+       btrfs_node_key(eb, &disk_key, nr);
+       btrfs_disk_key_to_cpu(key, &disk_key);
+}
+
+static inline void btrfs_item_key_to_cpu(struct extent_buffer *eb,
+                                 struct btrfs_key *key, int nr)
+{
+       struct btrfs_disk_key disk_key;
+       btrfs_item_key(eb, &disk_key, nr);
+       btrfs_disk_key_to_cpu(key, &disk_key);
+}
+
+static inline void btrfs_dir_item_key_to_cpu(struct extent_buffer *eb,
+                                     struct btrfs_dir_item *item,
+                                     struct btrfs_key *key)
+{
+       struct btrfs_disk_key disk_key;
+       btrfs_dir_item_key(eb, item, &disk_key);
+       btrfs_disk_key_to_cpu(key, &disk_key);
+}
+
+/* struct btrfs_header */
+BTRFS_SETGET_HEADER_FUNCS(header_bytenr, struct btrfs_header, bytenr, 64);
+BTRFS_SETGET_HEADER_FUNCS(header_generation, struct btrfs_header,
+                         generation, 64);
+BTRFS_SETGET_HEADER_FUNCS(header_owner, struct btrfs_header, owner, 64);
+BTRFS_SETGET_HEADER_FUNCS(header_nritems, struct btrfs_header, nritems, 32);
+BTRFS_SETGET_HEADER_FUNCS(header_flags, struct btrfs_header, flags, 64);
+BTRFS_SETGET_HEADER_FUNCS(header_level, struct btrfs_header, level, 8);
+BTRFS_SETGET_STACK_FUNCS(stack_header_bytenr, struct btrfs_header, bytenr, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_header_nritems, struct btrfs_header, nritems,
+                        32);
+BTRFS_SETGET_STACK_FUNCS(stack_header_owner, struct btrfs_header, owner, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_header_generation, struct btrfs_header,
+                        generation, 64);
+
+static inline int btrfs_header_flag(struct extent_buffer *eb, u64 flag)
+{
+       return (btrfs_header_flags(eb) & flag) == flag;
+}
+
+static inline int btrfs_set_header_flag(struct extent_buffer *eb, u64 flag)
+{
+       u64 flags = btrfs_header_flags(eb);
+       btrfs_set_header_flags(eb, flags | flag);
+       return (flags & flag) == flag;
+}
+
+static inline int btrfs_clear_header_flag(struct extent_buffer *eb, u64 flag)
+{
+       u64 flags = btrfs_header_flags(eb);
+       btrfs_set_header_flags(eb, flags & ~flag);
+       return (flags & flag) == flag;
+}
+
+static inline int btrfs_header_backref_rev(struct extent_buffer *eb)
+{
+       u64 flags = btrfs_header_flags(eb);
+       return flags >> BTRFS_BACKREF_REV_SHIFT;
+}
+
+static inline void btrfs_set_header_backref_rev(struct extent_buffer *eb,
+                                               int rev)
+{
+       u64 flags = btrfs_header_flags(eb);
+       flags &= ~BTRFS_BACKREF_REV_MASK;
+       flags |= (u64)rev << BTRFS_BACKREF_REV_SHIFT;
+       btrfs_set_header_flags(eb, flags);
+}
+
+static inline unsigned long btrfs_header_fsid(void)
+{
+       return offsetof(struct btrfs_header, fsid);
+}
+
+static inline unsigned long btrfs_header_chunk_tree_uuid(struct extent_buffer *eb)
+{
+       return offsetof(struct btrfs_header, chunk_tree_uuid);
+}
 
-int btrfs_comp_keys(struct btrfs_key *, struct btrfs_key *);
-int btrfs_comp_keys_type(struct btrfs_key *, struct btrfs_key *);
-int btrfs_bin_search(union btrfs_tree_node *, struct btrfs_key *, int *);
-void btrfs_free_path(struct btrfs_path *);
-int btrfs_search_tree(const struct btrfs_root *, struct btrfs_key *,
-                     struct btrfs_path *);
-int btrfs_prev_slot(struct btrfs_path *);
-int btrfs_next_slot(struct btrfs_path *);
+static inline u8 *btrfs_header_csum(struct extent_buffer *eb)
+{
+       unsigned long ptr = offsetof(struct btrfs_header, csum);
+       return (u8 *)ptr;
+}
+
+static inline int btrfs_is_leaf(struct extent_buffer *eb)
+{
+       return (btrfs_header_level(eb) == 0);
+}
+
+/* struct btrfs_root_item */
+BTRFS_SETGET_FUNCS(disk_root_generation, struct btrfs_root_item,
+                  generation, 64);
+BTRFS_SETGET_FUNCS(disk_root_refs, struct btrfs_root_item, refs, 32);
+BTRFS_SETGET_FUNCS(disk_root_bytenr, struct btrfs_root_item, bytenr, 64);
+BTRFS_SETGET_FUNCS(disk_root_level, struct btrfs_root_item, level, 8);
+
+BTRFS_SETGET_STACK_FUNCS(root_generation, struct btrfs_root_item,
+                        generation, 64);
+BTRFS_SETGET_STACK_FUNCS(root_bytenr, struct btrfs_root_item, bytenr, 64);
+BTRFS_SETGET_STACK_FUNCS(root_level, struct btrfs_root_item, level, 8);
+BTRFS_SETGET_STACK_FUNCS(root_dirid, struct btrfs_root_item, root_dirid, 64);
+BTRFS_SETGET_STACK_FUNCS(root_refs, struct btrfs_root_item, refs, 32);
+BTRFS_SETGET_STACK_FUNCS(root_flags, struct btrfs_root_item, flags, 64);
+BTRFS_SETGET_STACK_FUNCS(root_used, struct btrfs_root_item, bytes_used, 64);
+BTRFS_SETGET_STACK_FUNCS(root_limit, struct btrfs_root_item, byte_limit, 64);
+BTRFS_SETGET_STACK_FUNCS(root_last_snapshot, struct btrfs_root_item,
+                        last_snapshot, 64);
+BTRFS_SETGET_STACK_FUNCS(root_generation_v2, struct btrfs_root_item,
+                        generation_v2, 64);
+BTRFS_SETGET_STACK_FUNCS(root_ctransid, struct btrfs_root_item,
+                        ctransid, 64);
+BTRFS_SETGET_STACK_FUNCS(root_otransid, struct btrfs_root_item,
+                        otransid, 64);
+BTRFS_SETGET_STACK_FUNCS(root_stransid, struct btrfs_root_item,
+                        stransid, 64);
+BTRFS_SETGET_STACK_FUNCS(root_rtransid, struct btrfs_root_item,
+                        rtransid, 64);
+
+static inline struct btrfs_timespec* btrfs_root_ctime(
+               struct btrfs_root_item *root_item)
+{
+       unsigned long ptr = (unsigned long)root_item;
+       ptr += offsetof(struct btrfs_root_item, ctime);
+       return (struct btrfs_timespec *)ptr;
+}
+
+static inline struct btrfs_timespec* btrfs_root_otime(
+               struct btrfs_root_item *root_item)
+{
+       unsigned long ptr = (unsigned long)root_item;
+       ptr += offsetof(struct btrfs_root_item, otime);
+       return (struct btrfs_timespec *)ptr;
+}
+
+static inline struct btrfs_timespec* btrfs_root_stime(
+               struct btrfs_root_item *root_item)
+{
+       unsigned long ptr = (unsigned long)root_item;
+       ptr += offsetof(struct btrfs_root_item, stime);
+       return (struct btrfs_timespec *)ptr;
+}
+
+static inline struct btrfs_timespec* btrfs_root_rtime(
+               struct btrfs_root_item *root_item)
+{
+       unsigned long ptr = (unsigned long)root_item;
+       ptr += offsetof(struct btrfs_root_item, rtime);
+       return (struct btrfs_timespec *)ptr;
+}
+
+/* struct btrfs_root_backup */
+BTRFS_SETGET_STACK_FUNCS(backup_tree_root, struct btrfs_root_backup,
+                  tree_root, 64);
+BTRFS_SETGET_STACK_FUNCS(backup_tree_root_gen, struct btrfs_root_backup,
+                  tree_root_gen, 64);
+BTRFS_SETGET_STACK_FUNCS(backup_tree_root_level, struct btrfs_root_backup,
+                  tree_root_level, 8);
+
+BTRFS_SETGET_STACK_FUNCS(backup_chunk_root, struct btrfs_root_backup,
+                  chunk_root, 64);
+BTRFS_SETGET_STACK_FUNCS(backup_chunk_root_gen, struct btrfs_root_backup,
+                  chunk_root_gen, 64);
+BTRFS_SETGET_STACK_FUNCS(backup_chunk_root_level, struct btrfs_root_backup,
+                  chunk_root_level, 8);
+
+BTRFS_SETGET_STACK_FUNCS(backup_extent_root, struct btrfs_root_backup,
+                  extent_root, 64);
+BTRFS_SETGET_STACK_FUNCS(backup_extent_root_gen, struct btrfs_root_backup,
+                  extent_root_gen, 64);
+BTRFS_SETGET_STACK_FUNCS(backup_extent_root_level, struct btrfs_root_backup,
+                  extent_root_level, 8);
+
+BTRFS_SETGET_STACK_FUNCS(backup_fs_root, struct btrfs_root_backup,
+                  fs_root, 64);
+BTRFS_SETGET_STACK_FUNCS(backup_fs_root_gen, struct btrfs_root_backup,
+                  fs_root_gen, 64);
+BTRFS_SETGET_STACK_FUNCS(backup_fs_root_level, struct btrfs_root_backup,
+                  fs_root_level, 8);
+
+BTRFS_SETGET_STACK_FUNCS(backup_dev_root, struct btrfs_root_backup,
+                  dev_root, 64);
+BTRFS_SETGET_STACK_FUNCS(backup_dev_root_gen, struct btrfs_root_backup,
+                  dev_root_gen, 64);
+BTRFS_SETGET_STACK_FUNCS(backup_dev_root_level, struct btrfs_root_backup,
+                  dev_root_level, 8);
+
+BTRFS_SETGET_STACK_FUNCS(backup_csum_root, struct btrfs_root_backup,
+                  csum_root, 64);
+BTRFS_SETGET_STACK_FUNCS(backup_csum_root_gen, struct btrfs_root_backup,
+                  csum_root_gen, 64);
+BTRFS_SETGET_STACK_FUNCS(backup_csum_root_level, struct btrfs_root_backup,
+                  csum_root_level, 8);
+BTRFS_SETGET_STACK_FUNCS(backup_total_bytes, struct btrfs_root_backup,
+                  total_bytes, 64);
+BTRFS_SETGET_STACK_FUNCS(backup_bytes_used, struct btrfs_root_backup,
+                  bytes_used, 64);
+BTRFS_SETGET_STACK_FUNCS(backup_num_devices, struct btrfs_root_backup,
+                  num_devices, 64);
+
+/* struct btrfs_super_block */
+
+BTRFS_SETGET_STACK_FUNCS(super_bytenr, struct btrfs_super_block, bytenr, 64);
+BTRFS_SETGET_STACK_FUNCS(super_flags, struct btrfs_super_block, flags, 64);
+BTRFS_SETGET_STACK_FUNCS(super_generation, struct btrfs_super_block,
+                        generation, 64);
+BTRFS_SETGET_STACK_FUNCS(super_root, struct btrfs_super_block, root, 64);
+BTRFS_SETGET_STACK_FUNCS(super_sys_array_size,
+                        struct btrfs_super_block, sys_chunk_array_size, 32);
+BTRFS_SETGET_STACK_FUNCS(super_chunk_root_generation,
+                        struct btrfs_super_block, chunk_root_generation, 64);
+BTRFS_SETGET_STACK_FUNCS(super_root_level, struct btrfs_super_block,
+                        root_level, 8);
+BTRFS_SETGET_STACK_FUNCS(super_chunk_root, struct btrfs_super_block,
+                        chunk_root, 64);
+BTRFS_SETGET_STACK_FUNCS(super_chunk_root_level, struct btrfs_super_block,
+                        chunk_root_level, 8);
+BTRFS_SETGET_STACK_FUNCS(super_log_root, struct btrfs_super_block,
+                        log_root, 64);
+BTRFS_SETGET_STACK_FUNCS(super_log_root_transid, struct btrfs_super_block,
+                        log_root_transid, 64);
+BTRFS_SETGET_STACK_FUNCS(super_log_root_level, struct btrfs_super_block,
+                        log_root_level, 8);
+BTRFS_SETGET_STACK_FUNCS(super_total_bytes, struct btrfs_super_block,
+                        total_bytes, 64);
+BTRFS_SETGET_STACK_FUNCS(super_bytes_used, struct btrfs_super_block,
+                        bytes_used, 64);
+BTRFS_SETGET_STACK_FUNCS(super_sectorsize, struct btrfs_super_block,
+                        sectorsize, 32);
+BTRFS_SETGET_STACK_FUNCS(super_nodesize, struct btrfs_super_block,
+                        nodesize, 32);
+BTRFS_SETGET_STACK_FUNCS(super_stripesize, struct btrfs_super_block,
+                        stripesize, 32);
+BTRFS_SETGET_STACK_FUNCS(super_root_dir, struct btrfs_super_block,
+                        root_dir_objectid, 64);
+BTRFS_SETGET_STACK_FUNCS(super_num_devices, struct btrfs_super_block,
+                        num_devices, 64);
+BTRFS_SETGET_STACK_FUNCS(super_compat_flags, struct btrfs_super_block,
+                        compat_flags, 64);
+BTRFS_SETGET_STACK_FUNCS(super_compat_ro_flags, struct btrfs_super_block,
+                        compat_ro_flags, 64);
+BTRFS_SETGET_STACK_FUNCS(super_incompat_flags, struct btrfs_super_block,
+                        incompat_flags, 64);
+BTRFS_SETGET_STACK_FUNCS(super_csum_type, struct btrfs_super_block,
+                        csum_type, 16);
+BTRFS_SETGET_STACK_FUNCS(super_cache_generation, struct btrfs_super_block,
+                        cache_generation, 64);
+BTRFS_SETGET_STACK_FUNCS(super_uuid_tree_generation, struct btrfs_super_block,
+                        uuid_tree_generation, 64);
+BTRFS_SETGET_STACK_FUNCS(super_magic, struct btrfs_super_block, magic, 64);
+
+static inline unsigned long btrfs_leaf_data(struct extent_buffer *l)
+{
+       return offsetof(struct btrfs_leaf, items);
+}
+
+/* struct btrfs_file_extent_item */
+BTRFS_SETGET_FUNCS(file_extent_type, struct btrfs_file_extent_item, type, 8);
+BTRFS_SETGET_STACK_FUNCS(stack_file_extent_type, struct btrfs_file_extent_item, type, 8);
+
+static inline unsigned long btrfs_file_extent_inline_start(struct
+                                                  btrfs_file_extent_item *e)
+{
+       unsigned long offset = (unsigned long)e;
+       offset += offsetof(struct btrfs_file_extent_item, disk_bytenr);
+       return offset;
+}
+
+static inline u32 btrfs_file_extent_calc_inline_size(u32 datasize)
+{
+       return offsetof(struct btrfs_file_extent_item, disk_bytenr) + datasize;
+}
+
+BTRFS_SETGET_FUNCS(file_extent_disk_bytenr, struct btrfs_file_extent_item,
+                  disk_bytenr, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_file_extent_disk_bytenr, struct btrfs_file_extent_item,
+                  disk_bytenr, 64);
+BTRFS_SETGET_FUNCS(file_extent_generation, struct btrfs_file_extent_item,
+                  generation, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_file_extent_generation, struct btrfs_file_extent_item,
+                  generation, 64);
+BTRFS_SETGET_FUNCS(file_extent_disk_num_bytes, struct btrfs_file_extent_item,
+                  disk_num_bytes, 64);
+BTRFS_SETGET_FUNCS(file_extent_offset, struct btrfs_file_extent_item,
+                 offset, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_file_extent_offset, struct btrfs_file_extent_item,
+                 offset, 64);
+BTRFS_SETGET_FUNCS(file_extent_num_bytes, struct btrfs_file_extent_item,
+                  num_bytes, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_file_extent_num_bytes, struct btrfs_file_extent_item,
+                  num_bytes, 64);
+BTRFS_SETGET_FUNCS(file_extent_ram_bytes, struct btrfs_file_extent_item,
+                  ram_bytes, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_file_extent_ram_bytes, struct btrfs_file_extent_item,
+                  ram_bytes, 64);
+BTRFS_SETGET_FUNCS(file_extent_compression, struct btrfs_file_extent_item,
+                  compression, 8);
+BTRFS_SETGET_STACK_FUNCS(stack_file_extent_compression, struct btrfs_file_extent_item,
+                  compression, 8);
+BTRFS_SETGET_FUNCS(file_extent_encryption, struct btrfs_file_extent_item,
+                  encryption, 8);
+BTRFS_SETGET_FUNCS(file_extent_other_encoding, struct btrfs_file_extent_item,
+                  other_encoding, 16);
+
+/* btrfs_qgroup_status_item */
+BTRFS_SETGET_FUNCS(qgroup_status_version, struct btrfs_qgroup_status_item,
+                  version, 64);
+BTRFS_SETGET_FUNCS(qgroup_status_generation, struct btrfs_qgroup_status_item,
+                  generation, 64);
+BTRFS_SETGET_FUNCS(qgroup_status_flags, struct btrfs_qgroup_status_item,
+                  flags, 64);
+BTRFS_SETGET_FUNCS(qgroup_status_rescan, struct btrfs_qgroup_status_item,
+                  rescan, 64);
+
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_status_version,
+                        struct btrfs_qgroup_status_item, version, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_status_generation,
+                        struct btrfs_qgroup_status_item, generation, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_status_flags,
+                        struct btrfs_qgroup_status_item, flags, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_status_rescan,
+                        struct btrfs_qgroup_status_item, rescan, 64);
+
+/* btrfs_qgroup_info_item */
+BTRFS_SETGET_FUNCS(qgroup_info_generation, struct btrfs_qgroup_info_item,
+                  generation, 64);
+BTRFS_SETGET_FUNCS(qgroup_info_referenced, struct btrfs_qgroup_info_item,
+                  rfer, 64);
+BTRFS_SETGET_FUNCS(qgroup_info_referenced_compressed,
+                  struct btrfs_qgroup_info_item, rfer_cmpr, 64);
+BTRFS_SETGET_FUNCS(qgroup_info_exclusive, struct btrfs_qgroup_info_item,
+                  excl, 64);
+BTRFS_SETGET_FUNCS(qgroup_info_exclusive_compressed,
+                  struct btrfs_qgroup_info_item, excl_cmpr, 64);
 
-static inline struct btrfs_key *btrfs_path_leaf_key(struct btrfs_path *p) {
-       return &p->nodes[0]->leaf.items[p->slots[0]].key;
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_generation,
+                        struct btrfs_qgroup_info_item, generation, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_referenced,
+                        struct btrfs_qgroup_info_item, rfer, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_referenced_compressed,
+                  struct btrfs_qgroup_info_item, rfer_cmpr, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_exclusive,
+                        struct btrfs_qgroup_info_item, excl, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_info_exclusive_compressed,
+                  struct btrfs_qgroup_info_item, excl_cmpr, 64);
+
+/* btrfs_qgroup_limit_item */
+BTRFS_SETGET_FUNCS(qgroup_limit_flags, struct btrfs_qgroup_limit_item,
+                  flags, 64);
+BTRFS_SETGET_FUNCS(qgroup_limit_max_referenced, struct btrfs_qgroup_limit_item,
+                  max_rfer, 64);
+BTRFS_SETGET_FUNCS(qgroup_limit_max_exclusive, struct btrfs_qgroup_limit_item,
+                  max_excl, 64);
+BTRFS_SETGET_FUNCS(qgroup_limit_rsv_referenced, struct btrfs_qgroup_limit_item,
+                  rsv_rfer, 64);
+BTRFS_SETGET_FUNCS(qgroup_limit_rsv_exclusive, struct btrfs_qgroup_limit_item,
+                  rsv_excl, 64);
+
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_limit_flags,
+                        struct btrfs_qgroup_limit_item, flags, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_limit_max_referenced,
+                        struct btrfs_qgroup_limit_item, max_rfer, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_limit_max_exclusive,
+                        struct btrfs_qgroup_limit_item, max_excl, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_limit_rsv_referenced,
+                        struct btrfs_qgroup_limit_item, rsv_rfer, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_limit_rsv_exclusive,
+                        struct btrfs_qgroup_limit_item, rsv_excl, 64);
+
+/* btrfs_balance_item */
+BTRFS_SETGET_FUNCS(balance_item_flags, struct btrfs_balance_item, flags, 64);
+
+static inline struct btrfs_disk_balance_args* btrfs_balance_item_data(
+               struct extent_buffer *eb, struct btrfs_balance_item *bi)
+{
+       unsigned long offset = (unsigned long)bi;
+       struct btrfs_balance_item *p;
+       p = (struct btrfs_balance_item *)(eb->data + offset);
+       return &p->data;
 }
 
-static inline struct btrfs_key *
-btrfs_search_tree_key_type(const struct btrfs_root *root, u64 objectid,
-                          u8 type, struct btrfs_path *path)
+static inline struct btrfs_disk_balance_args* btrfs_balance_item_meta(
+               struct extent_buffer *eb, struct btrfs_balance_item *bi)
 {
-       struct btrfs_key key, *res;
+       unsigned long offset = (unsigned long)bi;
+       struct btrfs_balance_item *p;
+       p = (struct btrfs_balance_item *)(eb->data + offset);
+       return &p->meta;
+}
 
-       key.objectid = objectid;
-       key.type = type;
-       key.offset = 0;
+static inline struct btrfs_disk_balance_args* btrfs_balance_item_sys(
+               struct extent_buffer *eb, struct btrfs_balance_item *bi)
+{
+       unsigned long offset = (unsigned long)bi;
+       struct btrfs_balance_item *p;
+       p = (struct btrfs_balance_item *)(eb->data + offset);
+       return &p->sys;
+}
 
-       if (btrfs_search_tree(root, &key, path))
-               return NULL;
+static inline u64 btrfs_dev_stats_value(const struct extent_buffer *eb,
+                                       const struct btrfs_dev_stats_item *ptr,
+                                       int index)
+{
+       u64 val;
 
-       res = btrfs_path_leaf_key(path);
-       if (btrfs_comp_keys_type(&key, res)) {
-               btrfs_free_path(path);
-               return NULL;
-       }
+       read_extent_buffer(eb, &val,
+                          offsetof(struct btrfs_dev_stats_item, values) +
+                           ((unsigned long)ptr) + (index * sizeof(u64)),
+                          sizeof(val));
+       return val;
+}
 
-       return res;
+/*
+ * this returns the number of bytes used by the item on disk, minus the
+ * size of any extent headers.  If a file is compressed on disk, this is
+ * the compressed size
+ */
+static inline u32 btrfs_file_extent_inline_item_len(struct extent_buffer *eb,
+                                                   struct btrfs_item *e)
+{
+       unsigned long offset;
+       offset = offsetof(struct btrfs_file_extent_item, disk_bytenr);
+       return btrfs_item_size(eb, e) - offset;
 }
 
-static inline u32 btrfs_path_item_size(struct btrfs_path *p)
+#define btrfs_fs_incompat(fs_info, opt) \
+       __btrfs_fs_incompat((fs_info), BTRFS_FEATURE_INCOMPAT_##opt)
+
+static inline bool __btrfs_fs_incompat(struct btrfs_fs_info *fs_info, u64 flag)
 {
-       return p->nodes[0]->leaf.items[p->slots[0]].size;
+       struct btrfs_super_block *disk_super;
+       disk_super = fs_info->super_copy;
+       return !!(btrfs_super_incompat_flags(disk_super) & flag);
 }
 
-static inline void *btrfs_leaf_data(struct btrfs_leaf *leaf, u32 slot)
+#define btrfs_fs_compat_ro(fs_info, opt) \
+       __btrfs_fs_compat_ro((fs_info), BTRFS_FEATURE_COMPAT_RO_##opt)
+
+static inline int __btrfs_fs_compat_ro(struct btrfs_fs_info *fs_info, u64 flag)
 {
-       return ((u8 *) leaf) + sizeof(struct btrfs_header)
-              + leaf->items[slot].offset;
+       struct btrfs_super_block *disk_super;
+       disk_super = fs_info->super_copy;
+       return !!(btrfs_super_compat_ro_flags(disk_super) & flag);
 }
 
-static inline void *btrfs_path_leaf_data(struct btrfs_path *p)
+/* helper function to cast into the data area of the leaf. */
+#define btrfs_item_ptr(leaf, slot, type) \
+       ((type *)(btrfs_leaf_data(leaf) + \
+       btrfs_item_offset_nr(leaf, slot)))
+
+#define btrfs_item_ptr_offset(leaf, slot) \
+       ((unsigned long)(btrfs_leaf_data(leaf) + \
+       btrfs_item_offset_nr(leaf, slot)))
+
+static inline u64 btrfs_name_hash(const char *name, int len)
 {
-       return btrfs_leaf_data(&p->nodes[0]->leaf, p->slots[0]);
+       return (u64)crc32c((u32)~1, (u8 *)name, len);
 }
 
-#define btrfs_item_ptr(l,s,t)                  \
-       ((t *) btrfs_leaf_data((l),(s)))
+/*
+ * Figure the key offset of an extended inode ref
+ */
+static inline u64 btrfs_extref_hash(u64 parent_objectid, const char *name,
+                                   int len)
+{
+       return crc32(parent_objectid, (u8 *)name, len);
+}
+
+union btrfs_tree_node {
+       struct btrfs_header header;
+       struct btrfs_leaf leaf;
+       struct btrfs_node node;
+};
 
 #define btrfs_path_item_ptr(p,t)               \
        ((t *) btrfs_path_leaf_data((p)))
 
+u16 btrfs_super_csum_size(const struct btrfs_super_block *s);
+const char *btrfs_super_csum_name(u16 csum_type);
+u16 btrfs_csum_type_size(u16 csum_type);
+size_t btrfs_super_num_csums(void);
+
+/* root-tree.c */
+int btrfs_find_last_root(struct btrfs_root *root, u64 objectid,
+                       struct btrfs_root_item *item, struct btrfs_key *key);
+
+/* dir-item.c */
+struct btrfs_dir_item *btrfs_lookup_dir_item(struct btrfs_trans_handle *trans,
+                                            struct btrfs_root *root,
+                                            struct btrfs_path *path, u64 dir,
+                                            const char *name, int name_len,
+                                            int mod);
+typedef int (*btrfs_iter_dir_callback_t)(struct btrfs_root *root,
+                                        struct extent_buffer *eb,
+                                        struct btrfs_dir_item *di);
+int btrfs_iter_dir(struct btrfs_root *root, u64 ino,
+                  btrfs_iter_dir_callback_t callback);
+/* inode.c */
+int btrfs_lookup_path(struct btrfs_root *root, u64 ino, const char *filename,
+                       struct btrfs_root **root_ret, u64 *ino_ret,
+                       u8 *type_ret, int symlink_limit);
+int btrfs_read_extent_inline(struct btrfs_path *path,
+                            struct btrfs_file_extent_item *fi, char *dest);
+int btrfs_read_extent_reg(struct btrfs_path *path,
+                         struct btrfs_file_extent_item *fi, u64 offset,
+                         int len, char *dest);
+
+/* ctree.c */
+int btrfs_comp_cpu_keys(const struct btrfs_key *k1, const struct btrfs_key *k2);
+enum btrfs_tree_block_status
+btrfs_check_node(struct btrfs_fs_info *fs_info,
+                struct btrfs_disk_key *parent_key, struct extent_buffer *buf);
+enum btrfs_tree_block_status
+btrfs_check_leaf(struct btrfs_fs_info *fs_info,
+                struct btrfs_disk_key *parent_key, struct extent_buffer *buf);
+struct extent_buffer *read_node_slot(struct btrfs_fs_info *fs_info,
+                                  struct extent_buffer *parent, int slot);
+int btrfs_previous_item(struct btrfs_root *root,
+                       struct btrfs_path *path, u64 min_objectid,
+                       int type);
+int btrfs_next_sibling_tree_block(struct btrfs_fs_info *fs_info,
+                                 struct btrfs_path *path);
+/*
+ * Walk up the tree as far as necessary to find the next leaf.
+ *
+ * returns 0 if it found something or 1 if there are no greater leaves.
+ * returns < 0 on io errors.
+ */
+static inline int btrfs_next_leaf(struct btrfs_root *root,
+                                 struct btrfs_path *path)
+{
+       path->lowest_level = 0;
+       return btrfs_next_sibling_tree_block(root->fs_info, path);
+}
+
+static inline int btrfs_next_item(struct btrfs_root *root,
+                                 struct btrfs_path *p)
+{
+       ++p->slots[0];
+       if (p->slots[0] >= btrfs_header_nritems(p->nodes[0]))
+               return btrfs_next_leaf(root, p);
+       return 0;
+}
+
+int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path);
+int btrfs_leaf_free_space(struct extent_buffer *leaf);
+int btrfs_search_slot(struct btrfs_trans_handle *trans,
+               struct btrfs_root *root, const struct btrfs_key *key,
+               struct btrfs_path *p, int ins_len, int cow);
+int btrfs_search_slot_for_read(struct btrfs_root *root,
+                              const struct btrfs_key *key,
+                              struct btrfs_path *p, int find_higher,
+                              int return_any);
+void btrfs_release_path(struct btrfs_path *p);
+struct btrfs_path *btrfs_alloc_path(void);
+void btrfs_free_path(struct btrfs_path *p);
+static inline void btrfs_init_path(struct btrfs_path *p)
+{
+       memset(p, 0, sizeof(*p));
+}
+int btrfs_bin_search(struct extent_buffer *eb, const struct btrfs_key *key,
+                    int *slot);
+int btrfs_find_item(struct btrfs_root *fs_root, struct btrfs_path *found_path,
+               u64 iobjectid, u64 ioff, u8 key_type,
+               struct btrfs_key *found_key);
 #endif /* __BTRFS_CTREE_H__ */
index 63b5bf0..aab197a 100644 (file)
  */
 
 #include "btrfs.h"
+#include "disk-io.h"
 
-static int verify_dir_item(struct btrfs_dir_item *item, u32 start, u32 total)
+static int verify_dir_item(struct btrfs_root *root,
+                   struct extent_buffer *leaf,
+                   struct btrfs_dir_item *dir_item)
 {
-       u16 max_len = BTRFS_NAME_LEN;
-       u32 end;
+       u16 namelen = BTRFS_NAME_LEN;
+       u8 type = btrfs_dir_type(leaf, dir_item);
 
-       if (item->type >= BTRFS_FT_MAX) {
-               printf("%s: invalid dir item type: %i\n", __func__, item->type);
+       if (type == BTRFS_FT_XATTR)
+               namelen = XATTR_NAME_MAX;
+
+       if (btrfs_dir_name_len(leaf, dir_item) > namelen) {
+               fprintf(stderr, "invalid dir item name len: %u\n",
+                       (unsigned)btrfs_dir_data_len(leaf, dir_item));
                return 1;
        }
 
-       if (item->type == BTRFS_FT_XATTR)
-               max_len = 255; /* XATTR_NAME_MAX */
-
-       end = start + sizeof(*item) + item->name_len;
-       if (item->name_len > max_len || end > total) {
-               printf("%s: invalid dir item name len: %u\n", __func__,
-                      item->name_len);
+       /* BTRFS_MAX_XATTR_SIZE is the same for all dir items */
+       if ((btrfs_dir_data_len(leaf, dir_item) +
+            btrfs_dir_name_len(leaf, dir_item)) >
+                       BTRFS_MAX_XATTR_SIZE(root->fs_info)) {
+               fprintf(stderr, "invalid dir item name + data len: %u + %u\n",
+                       (unsigned)btrfs_dir_name_len(leaf, dir_item),
+                       (unsigned)btrfs_dir_data_len(leaf, dir_item));
                return 1;
        }
 
        return 0;
 }
 
-static struct btrfs_dir_item *
-btrfs_match_dir_item_name(struct btrfs_path *path, const char *name,
-                         int name_len)
+struct btrfs_dir_item *btrfs_match_dir_item_name(struct btrfs_root *root,
+                             struct btrfs_path *path,
+                             const char *name, int name_len)
 {
-       struct btrfs_dir_item *item;
-       u32 total_len, cur = 0, this_len;
-       const char *name_ptr;
-
-       item = btrfs_path_item_ptr(path, struct btrfs_dir_item);
-
-       total_len = btrfs_path_item_size(path);
+       struct btrfs_dir_item *dir_item;
+       unsigned long name_ptr;
+       u32 total_len;
+       u32 cur = 0;
+       u32 this_len;
+       struct extent_buffer *leaf;
+
+       leaf = path->nodes[0];
+       dir_item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_dir_item);
+       total_len = btrfs_item_size_nr(leaf, path->slots[0]);
+       if (verify_dir_item(root, leaf, dir_item))
+               return NULL;
+
+       while(cur < total_len) {
+               this_len = sizeof(*dir_item) +
+                       btrfs_dir_name_len(leaf, dir_item) +
+                       btrfs_dir_data_len(leaf, dir_item);
+               if (this_len > (total_len - cur)) {
+                       fprintf(stderr, "invalid dir item size\n");
+                       return NULL;
+               }
 
-       while (cur < total_len) {
-               btrfs_dir_item_to_cpu(item);
-               this_len = sizeof(*item) + item->name_len + item->data_len;
-               name_ptr = (const char *) (item + 1);
+               name_ptr = (unsigned long)(dir_item + 1);
 
-               if (verify_dir_item(item, cur, total_len))
-                       return NULL;
-               if (item->name_len == name_len && !memcmp(name_ptr, name,
-                                                         name_len))
-                       return item;
+               if (btrfs_dir_name_len(leaf, dir_item) == name_len &&
+                   memcmp_extent_buffer(leaf, name, name_ptr, name_len) == 0)
+                       return dir_item;
 
                cur += this_len;
-               item = (struct btrfs_dir_item *) ((u8 *) item + this_len);
+               dir_item = (struct btrfs_dir_item *)((char *)dir_item +
+                                                    this_len);
        }
-
        return NULL;
 }
 
-int btrfs_lookup_dir_item(const struct btrfs_root *root, u64 dir,
-                         const char *name, int name_len,
-                         struct btrfs_dir_item *item)
+struct btrfs_dir_item *btrfs_lookup_dir_item(struct btrfs_trans_handle *trans,
+                                            struct btrfs_root *root,
+                                            struct btrfs_path *path, u64 dir,
+                                            const char *name, int name_len,
+                                            int mod)
 {
-       struct btrfs_path path;
+       int ret;
        struct btrfs_key key;
-       struct btrfs_dir_item *res = NULL;
+       int ins_len = mod < 0 ? -1 : 0;
+       int cow = mod != 0;
+       struct btrfs_key found_key;
+       struct extent_buffer *leaf;
 
        key.objectid = dir;
        key.type = BTRFS_DIR_ITEM_KEY;
+
        key.offset = btrfs_name_hash(name, name_len);
 
-       if (btrfs_search_tree(root, &key, &path))
-               return -1;
+       ret = btrfs_search_slot(trans, root, &key, path, ins_len, cow);
+       if (ret < 0)
+               return ERR_PTR(ret);
+       if (ret > 0) {
+               if (path->slots[0] == 0)
+                       return NULL;
+               path->slots[0]--;
+       }
 
-       if (btrfs_comp_keys_type(&key, btrfs_path_leaf_key(&path)))
-               goto out;
+       leaf = path->nodes[0];
+       btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
 
-       res = btrfs_match_dir_item_name(&path, name, name_len);
-       if (res)
-               *item = *res;
-out:
-       btrfs_free_path(&path);
-       return res ? 0 : -1;
+       if (found_key.objectid != dir ||
+           found_key.type != BTRFS_DIR_ITEM_KEY ||
+           found_key.offset != key.offset)
+               return NULL;
+
+       return btrfs_match_dir_item_name(root, path, name, name_len);
 }
 
-int btrfs_readdir(const struct btrfs_root *root, u64 dir,
-                 btrfs_readdir_callback_t callback)
+int btrfs_iter_dir(struct btrfs_root *root, u64 ino,
+                  btrfs_iter_dir_callback_t callback)
 {
        struct btrfs_path path;
-       struct btrfs_key key, *found_key;
-       struct btrfs_dir_item *item;
-       int res = 0;
+       struct btrfs_key key;
+       int ret;
 
-       key.objectid = dir;
+       btrfs_init_path(&path);
+       key.objectid = ino;
        key.type = BTRFS_DIR_INDEX_KEY;
        key.offset = 0;
 
-       if (btrfs_search_tree(root, &key, &path))
-               return -1;
-
+       ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
+       if (ret < 0)
+               return ret;
+       /* Should not happen */
+       if (ret == 0) {
+               ret = -EUCLEAN;
+               goto out;
+       }
+       if (path.slots[0] >= btrfs_header_nritems(path.nodes[0])) {
+               ret = btrfs_next_leaf(root, &path);
+               if (ret < 0)
+                       goto out;
+               if (ret > 0) {
+                       ret = 0;
+                       goto out;
+               }
+       }
        do {
-               found_key = btrfs_path_leaf_key(&path);
-               if (btrfs_comp_keys_type(&key, found_key))
-                       break;
-
-               item = btrfs_path_item_ptr(&path, struct btrfs_dir_item);
-               btrfs_dir_item_to_cpu(item);
-
-               if (verify_dir_item(item, 0, sizeof(*item) + item->name_len))
-                       continue;
-               if (item->type == BTRFS_FT_XATTR)
-                       continue;
+               struct btrfs_dir_item *di;
 
-               if (callback(root, item))
+               btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
+               if (key.objectid != ino || key.type != BTRFS_DIR_INDEX_KEY)
                        break;
-       } while (!(res = btrfs_next_slot(&path)));
-
-       btrfs_free_path(&path);
-
-       return res < 0 ? -1 : 0;
+               di = btrfs_item_ptr(path.nodes[0], path.slots[0],
+                                   struct btrfs_dir_item);
+               if (verify_dir_item(root, path.nodes[0], di)) {
+                       ret = -EUCLEAN;
+                       goto out;
+               }
+               ret = callback(root, path.nodes[0], di);
+               if (ret < 0)
+                       goto out;
+       } while (!(ret = btrfs_next_item(root, &path)));
+
+       if (ret > 0)
+               ret = 0;
+out:
+       btrfs_release_path(&path);
+       return ret;
 }
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
new file mode 100644 (file)
index 0000000..01e7cee
--- /dev/null
@@ -0,0 +1,1062 @@
+// SPDX-License-Identifier: GPL-2.0+
+#include <common.h>
+#include <fs_internal.h>
+#include <uuid.h>
+#include <memalign.h>
+#include "kernel-shared/btrfs_tree.h"
+#include "common/rbtree-utils.h"
+#include "disk-io.h"
+#include "ctree.h"
+#include "btrfs.h"
+#include "volumes.h"
+#include "extent-io.h"
+#include "crypto/hash.h"
+
+/* specified errno for check_tree_block */
+#define BTRFS_BAD_BYTENR               (-1)
+#define BTRFS_BAD_FSID                 (-2)
+#define BTRFS_BAD_LEVEL                        (-3)
+#define BTRFS_BAD_NRITEMS              (-4)
+
+/* Calculate max possible nritems for a leaf/node */
+static u32 max_nritems(u8 level, u32 nodesize)
+{
+
+       if (level == 0)
+               return ((nodesize - sizeof(struct btrfs_header)) /
+                       sizeof(struct btrfs_item));
+       return ((nodesize - sizeof(struct btrfs_header)) /
+               sizeof(struct btrfs_key_ptr));
+}
+
+static int check_tree_block(struct btrfs_fs_info *fs_info,
+                           struct extent_buffer *buf)
+{
+
+       struct btrfs_fs_devices *fs_devices = fs_info->fs_devices;
+       u32 nodesize = fs_info->nodesize;
+       bool fsid_match = false;
+       int ret = BTRFS_BAD_FSID;
+
+       if (buf->start != btrfs_header_bytenr(buf))
+               return BTRFS_BAD_BYTENR;
+       if (btrfs_header_level(buf) >= BTRFS_MAX_LEVEL)
+               return BTRFS_BAD_LEVEL;
+       if (btrfs_header_nritems(buf) > max_nritems(btrfs_header_level(buf),
+                                                   nodesize))
+               return BTRFS_BAD_NRITEMS;
+
+       /* Only leaf can be empty */
+       if (btrfs_header_nritems(buf) == 0 &&
+           btrfs_header_level(buf) != 0)
+               return BTRFS_BAD_NRITEMS;
+
+       while (fs_devices) {
+               /*
+                * Checking the incompat flag is only valid for the current
+                * fs. For seed devices it's forbidden to have their uuid
+                * changed so reading ->fsid in this case is fine
+                */
+               if (fs_devices == fs_info->fs_devices &&
+                   btrfs_fs_incompat(fs_info, METADATA_UUID))
+                       fsid_match = !memcmp_extent_buffer(buf,
+                                                  fs_devices->metadata_uuid,
+                                                  btrfs_header_fsid(),
+                                                  BTRFS_FSID_SIZE);
+               else
+                       fsid_match = !memcmp_extent_buffer(buf,
+                                                   fs_devices->fsid,
+                                                   btrfs_header_fsid(),
+                                                   BTRFS_FSID_SIZE);
+
+
+               if (fsid_match) {
+                       ret = 0;
+                       break;
+               }
+               fs_devices = fs_devices->seed;
+       }
+       return ret;
+}
+
+static void print_tree_block_error(struct btrfs_fs_info *fs_info,
+                               struct extent_buffer *eb,
+                               int err)
+{
+       char fs_uuid[BTRFS_UUID_UNPARSED_SIZE] = {'\0'};
+       char found_uuid[BTRFS_UUID_UNPARSED_SIZE] = {'\0'};
+       u8 buf[BTRFS_UUID_SIZE];
+
+       if (!err)
+               return;
+
+       fprintf(stderr, "bad tree block %llu, ", eb->start);
+       switch (err) {
+       case BTRFS_BAD_FSID:
+               read_extent_buffer(eb, buf, btrfs_header_fsid(),
+                                  BTRFS_UUID_SIZE);
+               uuid_unparse(buf, found_uuid);
+               uuid_unparse(fs_info->fs_devices->metadata_uuid, fs_uuid);
+               fprintf(stderr, "fsid mismatch, want=%s, have=%s\n",
+                       fs_uuid, found_uuid);
+               break;
+       case BTRFS_BAD_BYTENR:
+               fprintf(stderr, "bytenr mismatch, want=%llu, have=%llu\n",
+                       eb->start, btrfs_header_bytenr(eb));
+               break;
+       case BTRFS_BAD_LEVEL:
+               fprintf(stderr, "bad level, %u > %d\n",
+                       btrfs_header_level(eb), BTRFS_MAX_LEVEL);
+               break;
+       case BTRFS_BAD_NRITEMS:
+               fprintf(stderr, "invalid nr_items: %u\n",
+                       btrfs_header_nritems(eb));
+               break;
+       }
+}
+
+int btrfs_csum_data(u16 csum_type, const u8 *data, u8 *out, size_t len)
+{
+       memset(out, 0, BTRFS_CSUM_SIZE);
+
+       switch (csum_type) {
+       case BTRFS_CSUM_TYPE_CRC32:
+               return hash_crc32c(data, len, out);
+       case BTRFS_CSUM_TYPE_XXHASH:
+               return hash_xxhash(data, len, out);
+       case BTRFS_CSUM_TYPE_SHA256:
+               return hash_sha256(data, len, out);
+       default:
+               printf("Unknown csum type %d\n", csum_type);
+               return -EINVAL;
+       }
+}
+
+/*
+ * Check if the super is valid:
+ * - nodesize/sectorsize - minimum, maximum, alignment
+ * - tree block starts   - alignment
+ * - number of devices   - something sane
+ * - sys array size      - maximum
+ */
+static int btrfs_check_super(struct btrfs_super_block *sb)
+{
+       u8 result[BTRFS_CSUM_SIZE];
+       u16 csum_type;
+       int csum_size;
+       u8 *metadata_uuid;
+
+       if (btrfs_super_magic(sb) != BTRFS_MAGIC)
+               return -EIO;
+
+       csum_type = btrfs_super_csum_type(sb);
+       if (csum_type >= btrfs_super_num_csums()) {
+               error("unsupported checksum algorithm %u", csum_type);
+               return -EIO;
+       }
+       csum_size = btrfs_super_csum_size(sb);
+
+       btrfs_csum_data(csum_type, (u8 *)sb + BTRFS_CSUM_SIZE,
+                       result, BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE);
+
+       if (memcmp(result, sb->csum, csum_size)) {
+               error("superblock checksum mismatch");
+               return -EIO;
+       }
+       if (btrfs_super_root_level(sb) >= BTRFS_MAX_LEVEL) {
+               error("tree_root level too big: %d >= %d",
+                       btrfs_super_root_level(sb), BTRFS_MAX_LEVEL);
+               goto error_out;
+       }
+       if (btrfs_super_chunk_root_level(sb) >= BTRFS_MAX_LEVEL) {
+               error("chunk_root level too big: %d >= %d",
+                       btrfs_super_chunk_root_level(sb), BTRFS_MAX_LEVEL);
+               goto error_out;
+       }
+       if (btrfs_super_log_root_level(sb) >= BTRFS_MAX_LEVEL) {
+               error("log_root level too big: %d >= %d",
+                       btrfs_super_log_root_level(sb), BTRFS_MAX_LEVEL);
+               goto error_out;
+       }
+
+       if (!IS_ALIGNED(btrfs_super_root(sb), 4096)) {
+               error("tree_root block unaligned: %llu", btrfs_super_root(sb));
+               goto error_out;
+       }
+       if (!IS_ALIGNED(btrfs_super_chunk_root(sb), 4096)) {
+               error("chunk_root block unaligned: %llu",
+                       btrfs_super_chunk_root(sb));
+               goto error_out;
+       }
+       if (!IS_ALIGNED(btrfs_super_log_root(sb), 4096)) {
+               error("log_root block unaligned: %llu",
+                       btrfs_super_log_root(sb));
+               goto error_out;
+       }
+       if (btrfs_super_nodesize(sb) < 4096) {
+               error("nodesize too small: %u < 4096",
+                       btrfs_super_nodesize(sb));
+               goto error_out;
+       }
+       if (!IS_ALIGNED(btrfs_super_nodesize(sb), 4096)) {
+               error("nodesize unaligned: %u", btrfs_super_nodesize(sb));
+               goto error_out;
+       }
+       if (btrfs_super_sectorsize(sb) < 4096) {
+               error("sectorsize too small: %u < 4096",
+                       btrfs_super_sectorsize(sb));
+               goto error_out;
+       }
+       if (!IS_ALIGNED(btrfs_super_sectorsize(sb), 4096)) {
+               error("sectorsize unaligned: %u", btrfs_super_sectorsize(sb));
+               goto error_out;
+       }
+       if (btrfs_super_total_bytes(sb) == 0) {
+               error("invalid total_bytes 0");
+               goto error_out;
+       }
+       if (btrfs_super_bytes_used(sb) < 6 * btrfs_super_nodesize(sb)) {
+               error("invalid bytes_used %llu", btrfs_super_bytes_used(sb));
+               goto error_out;
+       }
+       if ((btrfs_super_stripesize(sb) != 4096)
+               && (btrfs_super_stripesize(sb) != btrfs_super_sectorsize(sb))) {
+               error("invalid stripesize %u", btrfs_super_stripesize(sb));
+               goto error_out;
+       }
+
+       if (btrfs_super_incompat_flags(sb) & BTRFS_FEATURE_INCOMPAT_METADATA_UUID)
+               metadata_uuid = sb->metadata_uuid;
+       else
+               metadata_uuid = sb->fsid;
+
+       if (memcmp(metadata_uuid, sb->dev_item.fsid, BTRFS_FSID_SIZE) != 0) {
+               char fsid[BTRFS_UUID_UNPARSED_SIZE];
+               char dev_fsid[BTRFS_UUID_UNPARSED_SIZE];
+
+               uuid_unparse(sb->metadata_uuid, fsid);
+               uuid_unparse(sb->dev_item.fsid, dev_fsid);
+               error("dev_item UUID does not match fsid: %s != %s",
+                       dev_fsid, fsid);
+               goto error_out;
+       }
+
+       /*
+        * Hint to catch really bogus numbers, bitflips or so
+        */
+       if (btrfs_super_num_devices(sb) > (1UL << 31)) {
+               error("suspicious number of devices: %llu",
+                       btrfs_super_num_devices(sb));
+       }
+
+       if (btrfs_super_num_devices(sb) == 0) {
+               error("number of devices is 0");
+               goto error_out;
+       }
+
+       /*
+        * Obvious sys_chunk_array corruptions, it must hold at least one key
+        * and one chunk
+        */
+       if (btrfs_super_sys_array_size(sb) > BTRFS_SYSTEM_CHUNK_ARRAY_SIZE) {
+               error("system chunk array too big %u > %u",
+                     btrfs_super_sys_array_size(sb),
+                     BTRFS_SYSTEM_CHUNK_ARRAY_SIZE);
+               goto error_out;
+       }
+       if (btrfs_super_sys_array_size(sb) < sizeof(struct btrfs_disk_key)
+                       + sizeof(struct btrfs_chunk)) {
+               error("system chunk array too small %u < %zu",
+                     btrfs_super_sys_array_size(sb),
+                     sizeof(struct btrfs_disk_key) +
+                     sizeof(struct btrfs_chunk));
+               goto error_out;
+       }
+
+       return 0;
+
+error_out:
+       error("superblock checksum matches but it has invalid members");
+       return -EIO;
+}
+
+/*
+ * btrfs_read_dev_super - read a valid primary superblock from a block device
+ * @desc,@part:        file descriptor of the device
+ * @sb:                buffer where the superblock is going to be read in
+ *
+ * Unlike the btrfs-progs/kernel version, here we ony care about the first
+ * super block, thus it's much simpler.
+ */
+int btrfs_read_dev_super(struct blk_desc *desc, struct disk_partition *part,
+                        struct btrfs_super_block *sb)
+{
+       char tmp[BTRFS_SUPER_INFO_SIZE];
+       struct btrfs_super_block *buf = (struct btrfs_super_block *)tmp;
+       int ret;
+
+       ret = __btrfs_devread(desc, part, tmp, BTRFS_SUPER_INFO_SIZE,
+                             BTRFS_SUPER_INFO_OFFSET);
+       if (ret < BTRFS_SUPER_INFO_SIZE)
+               return -EIO;
+
+       if (btrfs_super_bytenr(buf) != BTRFS_SUPER_INFO_OFFSET)
+               return -EIO;
+
+       if (btrfs_check_super(buf))
+               return -EIO;
+
+       memcpy(sb, buf, BTRFS_SUPER_INFO_SIZE);
+       return 0;
+}
+
+static int __csum_tree_block_size(struct extent_buffer *buf, u16 csum_size,
+                                 int verify, int silent, u16 csum_type)
+{
+       u8 result[BTRFS_CSUM_SIZE];
+       u32 len;
+
+       len = buf->len - BTRFS_CSUM_SIZE;
+       btrfs_csum_data(csum_type, (u8 *)buf->data + BTRFS_CSUM_SIZE,
+                       result, len);
+
+       if (verify) {
+               if (memcmp_extent_buffer(buf, result, 0, csum_size)) {
+                       /* FIXME: format */
+                       if (!silent)
+                               printk("checksum verify failed on %llu found %08X wanted %08X\n",
+                                      (unsigned long long)buf->start,
+                                      result[0],
+                                      buf->data[0]);
+                       return 1;
+               }
+       } else {
+               write_extent_buffer(buf, result, 0, csum_size);
+       }
+       return 0;
+}
+
+int csum_tree_block_size(struct extent_buffer *buf, u16 csum_size, int verify,
+                        u16 csum_type)
+{
+       return __csum_tree_block_size(buf, csum_size, verify, 0, csum_type);
+}
+
+static int csum_tree_block(struct btrfs_fs_info *fs_info,
+                          struct extent_buffer *buf, int verify)
+{
+       u16 csum_size = btrfs_super_csum_size(fs_info->super_copy);
+       u16 csum_type = btrfs_super_csum_type(fs_info->super_copy);
+
+       return csum_tree_block_size(buf, csum_size, verify, csum_type);
+}
+
+struct extent_buffer *btrfs_find_tree_block(struct btrfs_fs_info *fs_info,
+                                           u64 bytenr, u32 blocksize)
+{
+       return find_extent_buffer(&fs_info->extent_cache,
+                                 bytenr, blocksize);
+}
+
+struct extent_buffer* btrfs_find_create_tree_block(
+               struct btrfs_fs_info *fs_info, u64 bytenr)
+{
+       return alloc_extent_buffer(fs_info, bytenr, fs_info->nodesize);
+}
+
+static int verify_parent_transid(struct extent_io_tree *io_tree,
+                                struct extent_buffer *eb, u64 parent_transid,
+                                int ignore)
+{
+       int ret;
+
+       if (!parent_transid || btrfs_header_generation(eb) == parent_transid)
+               return 0;
+
+       if (extent_buffer_uptodate(eb) &&
+           btrfs_header_generation(eb) == parent_transid) {
+               ret = 0;
+               goto out;
+       }
+       printk("parent transid verify failed on %llu wanted %llu found %llu\n",
+              (unsigned long long)eb->start,
+              (unsigned long long)parent_transid,
+              (unsigned long long)btrfs_header_generation(eb));
+       if (ignore) {
+               eb->flags |= EXTENT_BAD_TRANSID;
+               printk("Ignoring transid failure\n");
+               return 0;
+       }
+
+       ret = 1;
+out:
+       clear_extent_buffer_uptodate(eb);
+       return ret;
+
+}
+
+int read_whole_eb(struct btrfs_fs_info *info, struct extent_buffer *eb, int mirror)
+{
+       unsigned long offset = 0;
+       struct btrfs_multi_bio *multi = NULL;
+       struct btrfs_device *device;
+       int ret = 0;
+       u64 read_len;
+       unsigned long bytes_left = eb->len;
+
+       while (bytes_left) {
+               read_len = bytes_left;
+               device = NULL;
+
+               ret = btrfs_map_block(info, READ, eb->start + offset,
+                                     &read_len, &multi, mirror, NULL);
+               if (ret) {
+                       printk("Couldn't map the block %Lu\n", eb->start + offset);
+                       kfree(multi);
+                       return -EIO;
+               }
+               device = multi->stripes[0].dev;
+
+               if (!device->desc || !device->part) {
+                       kfree(multi);
+                       return -EIO;
+               }
+
+               if (read_len > bytes_left)
+                       read_len = bytes_left;
+
+               ret = read_extent_from_disk(device->desc, device->part,
+                                           multi->stripes[0].physical, eb,
+                                           offset, read_len);
+               kfree(multi);
+               multi = NULL;
+
+               if (ret)
+                       return -EIO;
+               offset += read_len;
+               bytes_left -= read_len;
+       }
+       return 0;
+}
+
+struct extent_buffer* read_tree_block(struct btrfs_fs_info *fs_info, u64 bytenr,
+               u64 parent_transid)
+{
+       int ret;
+       struct extent_buffer *eb;
+       u64 best_transid = 0;
+       u32 sectorsize = fs_info->sectorsize;
+       int mirror_num = 1;
+       int good_mirror = 0;
+       int candidate_mirror = 0;
+       int num_copies;
+       int ignore = 0;
+
+       /*
+        * Don't even try to create tree block for unaligned tree block
+        * bytenr.
+        * Such unaligned tree block will free overlapping extent buffer,
+        * causing use-after-free bugs for fuzzed images.
+        */
+       if (bytenr < sectorsize || !IS_ALIGNED(bytenr, sectorsize)) {
+               error("tree block bytenr %llu is not aligned to sectorsize %u",
+                     bytenr, sectorsize);
+               return ERR_PTR(-EIO);
+       }
+
+       eb = btrfs_find_create_tree_block(fs_info, bytenr);
+       if (!eb)
+               return ERR_PTR(-ENOMEM);
+
+       if (btrfs_buffer_uptodate(eb, parent_transid))
+               return eb;
+
+       num_copies = btrfs_num_copies(fs_info, eb->start, eb->len);
+       while (1) {
+               ret = read_whole_eb(fs_info, eb, mirror_num);
+               if (ret == 0 && csum_tree_block(fs_info, eb, 1) == 0 &&
+                   check_tree_block(fs_info, eb) == 0 &&
+                   verify_parent_transid(&fs_info->extent_cache, eb,
+                                         parent_transid, ignore) == 0) {
+                       /*
+                        * check_tree_block() is less strict to allow btrfs
+                        * check to get raw eb with bad key order and fix it.
+                        * But we still need to try to get a good copy if
+                        * possible, or bad key order can go into tools like
+                        * btrfs ins dump-tree.
+                        */
+                       if (btrfs_header_level(eb))
+                               ret = btrfs_check_node(fs_info, NULL, eb);
+                       else
+                               ret = btrfs_check_leaf(fs_info, NULL, eb);
+                       if (!ret || candidate_mirror == mirror_num) {
+                               btrfs_set_buffer_uptodate(eb);
+                               return eb;
+                       }
+                       if (candidate_mirror <= 0)
+                               candidate_mirror = mirror_num;
+               }
+               if (ignore) {
+                       if (candidate_mirror > 0) {
+                               mirror_num = candidate_mirror;
+                               continue;
+                       }
+                       if (check_tree_block(fs_info, eb))
+                               print_tree_block_error(fs_info, eb,
+                                               check_tree_block(fs_info, eb));
+                       else
+                               fprintf(stderr, "Csum didn't match\n");
+                       ret = -EIO;
+                       break;
+               }
+               if (num_copies == 1) {
+                       ignore = 1;
+                       continue;
+               }
+               if (btrfs_header_generation(eb) > best_transid) {
+                       best_transid = btrfs_header_generation(eb);
+                       good_mirror = mirror_num;
+               }
+               mirror_num++;
+               if (mirror_num > num_copies) {
+                       if (candidate_mirror > 0)
+                               mirror_num = candidate_mirror;
+                       else
+                               mirror_num = good_mirror;
+                       ignore = 1;
+                       continue;
+               }
+       }
+       /*
+        * We failed to read this tree block, it be should deleted right now
+        * to avoid stale cache populate the cache.
+        */
+       free_extent_buffer(eb);
+       return ERR_PTR(ret);
+}
+
+int read_extent_data(struct btrfs_fs_info *fs_info, char *data, u64 logical,
+                    u64 *len, int mirror)
+{
+       u64 offset = 0;
+       struct btrfs_multi_bio *multi = NULL;
+       struct btrfs_device *device;
+       int ret = 0;
+       u64 max_len = *len;
+
+       ret = btrfs_map_block(fs_info, READ, logical, len, &multi, mirror,
+                             NULL);
+       if (ret) {
+               fprintf(stderr, "Couldn't map the block %llu\n",
+                               logical + offset);
+               goto err;
+       }
+       device = multi->stripes[0].dev;
+
+       if (*len > max_len)
+               *len = max_len;
+       if (!device->desc || !device->part) {
+               ret = -EIO;
+               goto err;
+       }
+
+       ret = __btrfs_devread(device->desc, device->part, data, *len,
+                             multi->stripes[0].physical);
+       if (ret != *len)
+               ret = -EIO;
+       else
+               ret = 0;
+err:
+       kfree(multi);
+       return ret;
+}
+
+void btrfs_setup_root(struct btrfs_root *root, struct btrfs_fs_info *fs_info,
+                     u64 objectid)
+{
+       root->node = NULL;
+       root->track_dirty = 0;
+
+       root->fs_info = fs_info;
+       root->objectid = objectid;
+       root->last_trans = 0;
+       root->last_inode_alloc = 0;
+
+       memset(&root->root_key, 0, sizeof(root->root_key));
+       memset(&root->root_item, 0, sizeof(root->root_item));
+       root->root_key.objectid = objectid;
+}
+
+static int find_and_setup_root(struct btrfs_root *tree_root,
+                              struct btrfs_fs_info *fs_info,
+                              u64 objectid, struct btrfs_root *root)
+{
+       int ret;
+       u64 generation;
+
+       btrfs_setup_root(root, fs_info, objectid);
+       ret = btrfs_find_last_root(tree_root, objectid,
+                                  &root->root_item, &root->root_key);
+       if (ret)
+               return ret;
+
+       generation = btrfs_root_generation(&root->root_item);
+       root->node = read_tree_block(fs_info,
+                       btrfs_root_bytenr(&root->root_item), generation);
+       if (!extent_buffer_uptodate(root->node))
+               return -EIO;
+
+       return 0;
+}
+
+int btrfs_free_fs_root(struct btrfs_root *root)
+{
+       if (root->node)
+               free_extent_buffer(root->node);
+       kfree(root);
+       return 0;
+}
+
+static void __free_fs_root(struct rb_node *node)
+{
+       struct btrfs_root *root;
+
+       root = container_of(node, struct btrfs_root, rb_node);
+       btrfs_free_fs_root(root);
+}
+
+FREE_RB_BASED_TREE(fs_roots, __free_fs_root);
+
+struct btrfs_root *btrfs_read_fs_root_no_cache(struct btrfs_fs_info *fs_info,
+                                              struct btrfs_key *location)
+{
+       struct btrfs_root *root;
+       struct btrfs_root *tree_root = fs_info->tree_root;
+       struct btrfs_path *path;
+       struct extent_buffer *l;
+       u64 generation;
+       int ret = 0;
+
+       root = calloc(1, sizeof(*root));
+       if (!root)
+               return ERR_PTR(-ENOMEM);
+       if (location->offset == (u64)-1) {
+               ret = find_and_setup_root(tree_root, fs_info,
+                                         location->objectid, root);
+               if (ret) {
+                       free(root);
+                       return ERR_PTR(ret);
+               }
+               goto insert;
+       }
+
+       btrfs_setup_root(root, fs_info,
+                        location->objectid);
+
+       path = btrfs_alloc_path();
+       if (!path) {
+               free(root);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       ret = btrfs_search_slot(NULL, tree_root, location, path, 0, 0);
+       if (ret != 0) {
+               if (ret > 0)
+                       ret = -ENOENT;
+               goto out;
+       }
+       l = path->nodes[0];
+       read_extent_buffer(l, &root->root_item,
+              btrfs_item_ptr_offset(l, path->slots[0]),
+              sizeof(root->root_item));
+       memcpy(&root->root_key, location, sizeof(*location));
+
+       /* If this root is already an orphan, no need to read */
+       if (btrfs_root_refs(&root->root_item) == 0) {
+               ret = -ENOENT;
+               goto out;
+       }
+       ret = 0;
+out:
+       btrfs_free_path(path);
+       if (ret) {
+               free(root);
+               return ERR_PTR(ret);
+       }
+       generation = btrfs_root_generation(&root->root_item);
+       root->node = read_tree_block(fs_info,
+                       btrfs_root_bytenr(&root->root_item), generation);
+       if (!extent_buffer_uptodate(root->node)) {
+               free(root);
+               return ERR_PTR(-EIO);
+       }
+insert:
+       root->ref_cows = 1;
+       return root;
+}
+
+static int btrfs_fs_roots_compare_objectids(struct rb_node *node,
+                                           void *data)
+{
+       u64 objectid = *((u64 *)data);
+       struct btrfs_root *root;
+
+       root = rb_entry(node, struct btrfs_root, rb_node);
+       if (objectid > root->objectid)
+               return 1;
+       else if (objectid < root->objectid)
+               return -1;
+       else
+               return 0;
+}
+
+int btrfs_fs_roots_compare_roots(struct rb_node *node1, struct rb_node *node2)
+{
+       struct btrfs_root *root;
+
+       root = rb_entry(node2, struct btrfs_root, rb_node);
+       return btrfs_fs_roots_compare_objectids(node1, (void *)&root->objectid);
+}
+
+struct btrfs_root *btrfs_read_fs_root(struct btrfs_fs_info *fs_info,
+                                     struct btrfs_key *location)
+{
+       struct btrfs_root *root;
+       struct rb_node *node;
+       int ret;
+       u64 objectid = location->objectid;
+
+       if (location->objectid == BTRFS_ROOT_TREE_OBJECTID)
+               return fs_info->tree_root;
+       if (location->objectid == BTRFS_CHUNK_TREE_OBJECTID)
+               return fs_info->chunk_root;
+       if (location->objectid == BTRFS_CSUM_TREE_OBJECTID)
+               return fs_info->csum_root;
+       BUG_ON(location->objectid == BTRFS_TREE_RELOC_OBJECTID ||
+              location->offset != (u64)-1);
+
+       node = rb_search(&fs_info->fs_root_tree, (void *)&objectid,
+                        btrfs_fs_roots_compare_objectids, NULL);
+       if (node)
+               return container_of(node, struct btrfs_root, rb_node);
+
+       root = btrfs_read_fs_root_no_cache(fs_info, location);
+       if (IS_ERR(root))
+               return root;
+
+       ret = rb_insert(&fs_info->fs_root_tree, &root->rb_node,
+                       btrfs_fs_roots_compare_roots);
+       BUG_ON(ret);
+       return root;
+}
+
+void btrfs_free_fs_info(struct btrfs_fs_info *fs_info)
+{
+       free(fs_info->tree_root);
+       free(fs_info->chunk_root);
+       free(fs_info->csum_root);
+       free(fs_info->super_copy);
+       free(fs_info);
+}
+
+struct btrfs_fs_info *btrfs_new_fs_info(void)
+{
+       struct btrfs_fs_info *fs_info;
+
+       fs_info = calloc(1, sizeof(struct btrfs_fs_info));
+       if (!fs_info)
+               return NULL;
+
+       fs_info->tree_root = calloc(1, sizeof(struct btrfs_root));
+       fs_info->chunk_root = calloc(1, sizeof(struct btrfs_root));
+       fs_info->csum_root = calloc(1, sizeof(struct btrfs_root));
+       fs_info->super_copy = calloc(1, BTRFS_SUPER_INFO_SIZE);
+
+       if (!fs_info->tree_root || !fs_info->chunk_root ||
+           !fs_info->csum_root || !fs_info->super_copy)
+               goto free_all;
+
+       extent_io_tree_init(&fs_info->extent_cache);
+
+       fs_info->fs_root_tree = RB_ROOT;
+       cache_tree_init(&fs_info->mapping_tree.cache_tree);
+
+       mutex_init(&fs_info->fs_mutex);
+
+       return fs_info;
+free_all:
+       btrfs_free_fs_info(fs_info);
+       return NULL;
+}
+
+static int setup_root_or_create_block(struct btrfs_fs_info *fs_info,
+                                     struct btrfs_root *info_root,
+                                     u64 objectid, char *str)
+{
+       struct btrfs_root *root = fs_info->tree_root;
+       int ret;
+
+       ret = find_and_setup_root(root, fs_info, objectid, info_root);
+       if (ret) {
+               error("could not setup %s tree", str);
+               return -EIO;
+       }
+
+       return 0;
+}
+
+int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info)
+{
+       struct btrfs_super_block *sb = fs_info->super_copy;
+       struct btrfs_root *root;
+       struct btrfs_key key;
+       u64 root_tree_bytenr;
+       u64 generation;
+       int ret;
+
+       root = fs_info->tree_root;
+       btrfs_setup_root(root, fs_info, BTRFS_ROOT_TREE_OBJECTID);
+       generation = btrfs_super_generation(sb);
+
+       root_tree_bytenr = btrfs_super_root(sb);
+
+       root->node = read_tree_block(fs_info, root_tree_bytenr, generation);
+       if (!extent_buffer_uptodate(root->node)) {
+               fprintf(stderr, "Couldn't read tree root\n");
+               return -EIO;
+       }
+
+       ret = setup_root_or_create_block(fs_info, fs_info->csum_root,
+                                        BTRFS_CSUM_TREE_OBJECTID, "csum");
+       if (ret)
+               return ret;
+       fs_info->csum_root->track_dirty = 1;
+
+       fs_info->last_trans_committed = generation;
+
+       key.objectid = BTRFS_FS_TREE_OBJECTID;
+       key.type = BTRFS_ROOT_ITEM_KEY;
+       key.offset = (u64)-1;
+       fs_info->fs_root = btrfs_read_fs_root(fs_info, &key);
+
+       if (IS_ERR(fs_info->fs_root))
+               return -EIO;
+       return 0;
+}
+
+void btrfs_release_all_roots(struct btrfs_fs_info *fs_info)
+{
+       if (fs_info->csum_root)
+               free_extent_buffer(fs_info->csum_root->node);
+       if (fs_info->tree_root)
+               free_extent_buffer(fs_info->tree_root->node);
+       if (fs_info->chunk_root)
+               free_extent_buffer(fs_info->chunk_root->node);
+}
+
+static void free_map_lookup(struct cache_extent *ce)
+{
+       struct map_lookup *map;
+
+       map = container_of(ce, struct map_lookup, ce);
+       kfree(map);
+}
+
+FREE_EXTENT_CACHE_BASED_TREE(mapping_cache, free_map_lookup);
+
+void btrfs_cleanup_all_caches(struct btrfs_fs_info *fs_info)
+{
+       free_mapping_cache_tree(&fs_info->mapping_tree.cache_tree);
+       extent_io_tree_cleanup(&fs_info->extent_cache);
+}
+
+static int btrfs_scan_fs_devices(struct blk_desc *desc,
+                                struct disk_partition *part,
+                                struct btrfs_fs_devices **fs_devices)
+{
+       u64 total_devs;
+       int ret;
+
+       if (round_up(BTRFS_SUPER_INFO_SIZE + BTRFS_SUPER_INFO_OFFSET,
+                    desc->blksz) > (part->size << desc->log2blksz)) {
+               error("superblock end %u is larger than device size " LBAFU,
+                               BTRFS_SUPER_INFO_SIZE + BTRFS_SUPER_INFO_OFFSET,
+                               part->size << desc->log2blksz);
+               return -EINVAL;
+       }
+
+       ret = btrfs_scan_one_device(desc, part, fs_devices, &total_devs);
+       if (ret) {
+               fprintf(stderr, "No valid Btrfs found\n");
+               return ret;
+       }
+       return 0;
+}
+
+int btrfs_check_fs_compatibility(struct btrfs_super_block *sb)
+{
+       u64 features;
+
+       features = btrfs_super_incompat_flags(sb) &
+                  ~BTRFS_FEATURE_INCOMPAT_SUPP;
+       if (features) {
+               printk("couldn't open because of unsupported "
+                      "option features (%llx).\n",
+                      (unsigned long long)features);
+               return -ENOTSUPP;
+       }
+
+       features = btrfs_super_incompat_flags(sb);
+       if (!(features & BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF)) {
+               features |= BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF;
+               btrfs_set_super_incompat_flags(sb, features);
+       }
+
+       return 0;
+}
+
+static int btrfs_setup_chunk_tree_and_device_map(struct btrfs_fs_info *fs_info)
+{
+       struct btrfs_super_block *sb = fs_info->super_copy;
+       u64 chunk_root_bytenr;
+       u64 generation;
+       int ret;
+
+       btrfs_setup_root(fs_info->chunk_root, fs_info,
+                       BTRFS_CHUNK_TREE_OBJECTID);
+
+       ret = btrfs_read_sys_array(fs_info);
+       if (ret)
+               return ret;
+
+       generation = btrfs_super_chunk_root_generation(sb);
+       chunk_root_bytenr = btrfs_super_chunk_root(sb);
+
+       fs_info->chunk_root->node = read_tree_block(fs_info,
+                                                   chunk_root_bytenr,
+                                                   generation);
+       if (!extent_buffer_uptodate(fs_info->chunk_root->node)) {
+               error("cannot read chunk root");
+               return -EIO;
+       }
+
+       ret = btrfs_read_chunk_tree(fs_info);
+       if (ret) {
+               fprintf(stderr, "Couldn't read chunk tree\n");
+               return ret;
+       }
+       return 0;
+}
+
+struct btrfs_fs_info *open_ctree_fs_info(struct blk_desc *desc,
+                                        struct disk_partition *part)
+{
+       struct btrfs_fs_info *fs_info;
+       struct btrfs_super_block *disk_super;
+       struct btrfs_fs_devices *fs_devices = NULL;
+       struct extent_buffer *eb;
+       int ret;
+
+       fs_info = btrfs_new_fs_info();
+       if (!fs_info) {
+               fprintf(stderr, "Failed to allocate memory for fs_info\n");
+               return NULL;
+       }
+
+       ret = btrfs_scan_fs_devices(desc, part, &fs_devices);
+       if (ret)
+               goto out;
+
+       fs_info->fs_devices = fs_devices;
+
+       ret = btrfs_open_devices(fs_devices);
+       if (ret)
+               goto out;
+
+       disk_super = fs_info->super_copy;
+       ret = btrfs_read_dev_super(desc, part, disk_super);
+       if (ret) {
+               printk("No valid btrfs found\n");
+               goto out_devices;
+       }
+
+       if (btrfs_super_flags(disk_super) & BTRFS_SUPER_FLAG_CHANGING_FSID) {
+               fprintf(stderr, "ERROR: Filesystem UUID change in progress\n");
+               goto out_devices;
+       }
+
+       ASSERT(!memcmp(disk_super->fsid, fs_devices->fsid, BTRFS_FSID_SIZE));
+       if (btrfs_fs_incompat(fs_info, METADATA_UUID))
+               ASSERT(!memcmp(disk_super->metadata_uuid,
+                              fs_devices->metadata_uuid, BTRFS_FSID_SIZE));
+
+       fs_info->sectorsize = btrfs_super_sectorsize(disk_super);
+       fs_info->nodesize = btrfs_super_nodesize(disk_super);
+       fs_info->stripesize = btrfs_super_stripesize(disk_super);
+
+       ret = btrfs_check_fs_compatibility(fs_info->super_copy);
+       if (ret)
+               goto out_devices;
+
+       ret = btrfs_setup_chunk_tree_and_device_map(fs_info);
+       if (ret)
+               goto out_chunk;
+
+       /* Chunk tree root is unable to read, return directly */
+       if (!fs_info->chunk_root)
+               return fs_info;
+
+       eb = fs_info->chunk_root->node;
+       read_extent_buffer(eb, fs_info->chunk_tree_uuid,
+                          btrfs_header_chunk_tree_uuid(eb),
+                          BTRFS_UUID_SIZE);
+
+       ret = btrfs_setup_all_roots(fs_info);
+       if (ret)
+               goto out_chunk;
+
+       return fs_info;
+
+out_chunk:
+       btrfs_release_all_roots(fs_info);
+       btrfs_cleanup_all_caches(fs_info);
+out_devices:
+       btrfs_close_devices(fs_devices);
+out:
+       btrfs_free_fs_info(fs_info);
+       return NULL;
+}
+
+int close_ctree_fs_info(struct btrfs_fs_info *fs_info)
+{
+       int ret;
+       int err = 0;
+
+       free_fs_roots_tree(&fs_info->fs_root_tree);
+
+       btrfs_release_all_roots(fs_info);
+       ret = btrfs_close_devices(fs_info->fs_devices);
+       btrfs_cleanup_all_caches(fs_info);
+       btrfs_free_fs_info(fs_info);
+       if (!err)
+               err = ret;
+       return err;
+}
+
+int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid)
+{
+       int ret;
+
+       ret = extent_buffer_uptodate(buf);
+       if (!ret)
+               return ret;
+
+       ret = verify_parent_transid(&buf->fs_info->extent_cache, buf,
+                                   parent_transid, 1);
+       return !ret;
+}
+
+int btrfs_set_buffer_uptodate(struct extent_buffer *eb)
+{
+       return set_extent_buffer_uptodate(eb);
+}
diff --git a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h
new file mode 100644 (file)
index 0000000..a347912
--- /dev/null
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: GPL-2.0+
+#ifndef __BTRFS_DISK_IO_H__
+#define __BTRFS_DISK_IO_H__
+
+#include <linux/sizes.h>
+#include <fs_internal.h>
+#include "ctree.h"
+#include "disk-io.h"
+
+#define BTRFS_SUPER_INFO_OFFSET SZ_64K
+#define BTRFS_SUPER_INFO_SIZE  SZ_4K
+
+/* From btrfs-progs */
+int read_whole_eb(struct btrfs_fs_info *info, struct extent_buffer *eb, int mirror);
+struct extent_buffer* read_tree_block(struct btrfs_fs_info *fs_info, u64 bytenr,
+               u64 parent_transid);
+
+int read_extent_data(struct btrfs_fs_info *fs_info, char *data, u64 logical,
+                    u64 *len, int mirror);
+struct extent_buffer* btrfs_find_create_tree_block(
+               struct btrfs_fs_info *fs_info, u64 bytenr);
+struct extent_buffer *btrfs_find_tree_block(struct btrfs_fs_info *fs_info,
+                                           u64 bytenr, u32 blocksize);
+struct btrfs_root *btrfs_read_fs_root_no_cache(struct btrfs_fs_info *fs_info,
+                                              struct btrfs_key *location);
+struct btrfs_root *btrfs_read_fs_root(struct btrfs_fs_info *fs_info,
+                                     struct btrfs_key *location);
+
+void btrfs_setup_root(struct btrfs_root *root, struct btrfs_fs_info *fs_info,
+                     u64 objectid);
+
+void btrfs_free_fs_info(struct btrfs_fs_info *fs_info);
+struct btrfs_fs_info *btrfs_new_fs_info(void);
+int btrfs_check_fs_compatibility(struct btrfs_super_block *sb);
+int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info);
+void btrfs_release_all_roots(struct btrfs_fs_info *fs_info);
+void btrfs_cleanup_all_caches(struct btrfs_fs_info *fs_info);
+
+struct btrfs_fs_info *open_ctree_fs_info(struct blk_desc *desc,
+                                        struct disk_partition *part);
+int close_ctree_fs_info(struct btrfs_fs_info *fs_info);
+
+int btrfs_read_dev_super(struct blk_desc *desc, struct disk_partition *part,
+                        struct btrfs_super_block *sb);
+int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid);
+int btrfs_set_buffer_uptodate(struct extent_buffer *buf);
+int btrfs_csum_data(u16 csum_type, const u8 *data, u8 *out, size_t len);
+int csum_tree_block_size(struct extent_buffer *buf, u16 csum_sectorsize,
+                        int verify, u16 csum_type);
+#endif
diff --git a/fs/btrfs/extent-cache.c b/fs/btrfs/extent-cache.c
new file mode 100644 (file)
index 0000000..bc8cf3a
--- /dev/null
@@ -0,0 +1,318 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/*
+ * Crossported from the same named file of btrfs-progs.
+ *
+ * Minor modification to include headers.
+ */
+#include <linux/kernel.h>
+#include <linux/rbtree.h>
+#include <linux/errno.h>
+#include <linux/bug.h>
+#include <stdlib.h>
+#include "extent-cache.h"
+#include "common/rbtree-utils.h"
+
+struct cache_extent_search_range {
+       u64 objectid;
+       u64 start;
+       u64 size;
+};
+
+static int cache_tree_comp_range(struct rb_node *node, void *data)
+{
+       struct cache_extent *entry;
+       struct cache_extent_search_range *range;
+
+       range = (struct cache_extent_search_range *)data;
+       entry = rb_entry(node, struct cache_extent, rb_node);
+
+       if (entry->start + entry->size <= range->start)
+               return 1;
+       else if (range->start + range->size <= entry->start)
+               return -1;
+       else
+               return 0;
+}
+
+static int cache_tree_comp_nodes(struct rb_node *node1, struct rb_node *node2)
+{
+       struct cache_extent *entry;
+       struct cache_extent_search_range range;
+
+       entry = rb_entry(node2, struct cache_extent, rb_node);
+       range.start = entry->start;
+       range.size = entry->size;
+
+       return cache_tree_comp_range(node1, (void *)&range);
+}
+
+static int cache_tree_comp_range2(struct rb_node *node, void *data)
+{
+       struct cache_extent *entry;
+       struct cache_extent_search_range *range;
+
+       range = (struct cache_extent_search_range *)data;
+       entry = rb_entry(node, struct cache_extent, rb_node);
+
+       if (entry->objectid < range->objectid)
+               return 1;
+       else if (entry->objectid > range->objectid)
+               return -1;
+       else if (entry->start + entry->size <= range->start)
+               return 1;
+       else if (range->start + range->size <= entry->start)
+               return -1;
+       else
+               return 0;
+}
+
+static int cache_tree_comp_nodes2(struct rb_node *node1, struct rb_node *node2)
+{
+       struct cache_extent *entry;
+       struct cache_extent_search_range range;
+
+       entry = rb_entry(node2, struct cache_extent, rb_node);
+       range.objectid = entry->objectid;
+       range.start = entry->start;
+       range.size = entry->size;
+
+       return cache_tree_comp_range2(node1, (void *)&range);
+}
+
+void cache_tree_init(struct cache_tree *tree)
+{
+       tree->root = RB_ROOT;
+}
+
+static struct cache_extent *alloc_cache_extent(u64 start, u64 size)
+{
+       struct cache_extent *pe = malloc(sizeof(*pe));
+
+       if (!pe)
+               return pe;
+
+       pe->objectid = 0;
+       pe->start = start;
+       pe->size = size;
+       return pe;
+}
+
+int add_cache_extent(struct cache_tree *tree, u64 start, u64 size)
+{
+       struct cache_extent *pe = alloc_cache_extent(start, size);
+       int ret;
+
+       if (!pe)
+               return -ENOMEM;
+
+       ret = insert_cache_extent(tree, pe);
+       if (ret)
+               free(pe);
+
+       return ret;
+}
+
+int insert_cache_extent(struct cache_tree *tree, struct cache_extent *pe)
+{
+       return rb_insert(&tree->root, &pe->rb_node, cache_tree_comp_nodes);
+}
+
+int insert_cache_extent2(struct cache_tree *tree, struct cache_extent *pe)
+{
+       return rb_insert(&tree->root, &pe->rb_node, cache_tree_comp_nodes2);
+}
+
+struct cache_extent *lookup_cache_extent(struct cache_tree *tree,
+                                        u64 start, u64 size)
+{
+       struct rb_node *node;
+       struct cache_extent *entry;
+       struct cache_extent_search_range range;
+
+       range.start = start;
+       range.size = size;
+       node = rb_search(&tree->root, &range, cache_tree_comp_range, NULL);
+       if (!node)
+               return NULL;
+
+       entry = rb_entry(node, struct cache_extent, rb_node);
+       return entry;
+}
+
+struct cache_extent *lookup_cache_extent2(struct cache_tree *tree,
+                                        u64 objectid, u64 start, u64 size)
+{
+       struct rb_node *node;
+       struct cache_extent *entry;
+       struct cache_extent_search_range range;
+
+       range.objectid = objectid;
+       range.start = start;
+       range.size = size;
+       node = rb_search(&tree->root, &range, cache_tree_comp_range2, NULL);
+       if (!node)
+               return NULL;
+
+       entry = rb_entry(node, struct cache_extent, rb_node);
+       return entry;
+}
+
+struct cache_extent *search_cache_extent(struct cache_tree *tree, u64 start)
+{
+       struct rb_node *next;
+       struct rb_node *node;
+       struct cache_extent *entry;
+       struct cache_extent_search_range range;
+
+       range.start = start;
+       range.size = 1;
+       node = rb_search(&tree->root, &range, cache_tree_comp_range, &next);
+       if (!node)
+               node = next;
+       if (!node)
+               return NULL;
+
+       entry = rb_entry(node, struct cache_extent, rb_node);
+       return entry;
+}
+
+struct cache_extent *search_cache_extent2(struct cache_tree *tree,
+                                        u64 objectid, u64 start)
+{
+       struct rb_node *next;
+       struct rb_node *node;
+       struct cache_extent *entry;
+       struct cache_extent_search_range range;
+
+       range.objectid = objectid;
+       range.start = start;
+       range.size = 1;
+       node = rb_search(&tree->root, &range, cache_tree_comp_range2, &next);
+       if (!node)
+               node = next;
+       if (!node)
+               return NULL;
+
+       entry = rb_entry(node, struct cache_extent, rb_node);
+       return entry;
+}
+
+struct cache_extent *first_cache_extent(struct cache_tree *tree)
+{
+       struct rb_node *node = rb_first(&tree->root);
+
+       if (!node)
+               return NULL;
+       return rb_entry(node, struct cache_extent, rb_node);
+}
+
+struct cache_extent *last_cache_extent(struct cache_tree *tree)
+{
+       struct rb_node *node = rb_last(&tree->root);
+
+       if (!node)
+               return NULL;
+       return rb_entry(node, struct cache_extent, rb_node);
+}
+
+struct cache_extent *prev_cache_extent(struct cache_extent *pe)
+{
+       struct rb_node *node = rb_prev(&pe->rb_node);
+
+       if (!node)
+               return NULL;
+       return rb_entry(node, struct cache_extent, rb_node);
+}
+
+struct cache_extent *next_cache_extent(struct cache_extent *pe)
+{
+       struct rb_node *node = rb_next(&pe->rb_node);
+
+       if (!node)
+               return NULL;
+       return rb_entry(node, struct cache_extent, rb_node);
+}
+
+void remove_cache_extent(struct cache_tree *tree, struct cache_extent *pe)
+{
+       rb_erase(&pe->rb_node, &tree->root);
+}
+
+void cache_tree_free_extents(struct cache_tree *tree,
+                            free_cache_extent free_func)
+{
+       struct cache_extent *ce;
+
+       while ((ce = first_cache_extent(tree))) {
+               remove_cache_extent(tree, ce);
+               free_func(ce);
+       }
+}
+
+static void free_extent_cache(struct cache_extent *pe)
+{
+       free(pe);
+}
+
+void free_extent_cache_tree(struct cache_tree *tree)
+{
+       cache_tree_free_extents(tree, free_extent_cache);
+}
+
+int add_merge_cache_extent(struct cache_tree *tree, u64 start, u64 size)
+{
+       struct cache_extent *cache;
+       struct cache_extent *next = NULL;
+       struct cache_extent *prev = NULL;
+       int next_merged = 0;
+       int prev_merged = 0;
+       int ret = 0;
+
+       if (cache_tree_empty(tree))
+               goto insert;
+
+       cache = search_cache_extent(tree, start);
+       if (!cache) {
+               /*
+                * Either the tree is completely empty, or the no range after
+                * start.
+                * Either way, the last cache_extent should be prev.
+                */
+               prev = last_cache_extent(tree);
+       } else if (start <= cache->start) {
+               next = cache;
+               prev = prev_cache_extent(cache);
+       } else {
+               prev = cache;
+               next = next_cache_extent(cache);
+       }
+
+       /*
+        * Ensure the range to be inserted won't cover with existings
+        * Or we will need extra loop to do merge
+        */
+       BUG_ON(next && start + size > next->start);
+       BUG_ON(prev && prev->start + prev->size > start);
+
+       if (next && start + size == next->start) {
+               next_merged = 1;
+               next->size = next->start + next->size - start;
+               next->start = start;
+       }
+       if (prev && prev->start + prev->size == start) {
+               prev_merged = 1;
+               if (next_merged) {
+                       next->size = next->start + next->size - prev->start;
+                       next->start = prev->start;
+                       remove_cache_extent(tree, prev);
+                       free(prev);
+               } else {
+                       prev->size = start + size - prev->start;
+               }
+       }
+insert:
+       if (!prev_merged && !next_merged)
+               ret = add_cache_extent(tree, start, size);
+       return ret;
+}
diff --git a/fs/btrfs/extent-cache.h b/fs/btrfs/extent-cache.h
new file mode 100644 (file)
index 0000000..2fee81a
--- /dev/null
@@ -0,0 +1,104 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/*
+ * Crossported from the same named file of btrfs-progs.
+ *
+ * Minor modification to include headers.
+ */
+#ifndef __BTRFS_EXTENT_CACHE_H__
+#define __BTRFS_EXTENT_CACHE_H__
+
+#include <linux/rbtree.h>
+#include <linux/types.h>
+
+struct cache_tree {
+       struct rb_root root;
+};
+
+struct cache_extent {
+       struct rb_node rb_node;
+       u64 objectid;
+       u64 start;
+       u64 size;
+};
+
+void cache_tree_init(struct cache_tree *tree);
+
+struct cache_extent *first_cache_extent(struct cache_tree *tree);
+struct cache_extent *last_cache_extent(struct cache_tree *tree);
+struct cache_extent *prev_cache_extent(struct cache_extent *pe);
+struct cache_extent *next_cache_extent(struct cache_extent *pe);
+
+/*
+ * Find a cache_extent which covers start.
+ *
+ * If not found, return next cache_extent if possible.
+ */
+struct cache_extent *search_cache_extent(struct cache_tree *tree, u64 start);
+
+/*
+ * Find a cache_extent which restrictly covers start.
+ *
+ * If not found, return NULL.
+ */
+struct cache_extent *lookup_cache_extent(struct cache_tree *tree,
+                                        u64 start, u64 size);
+
+/*
+ * Add an non-overlap extent into cache tree
+ *
+ * If [start, start+size) overlap with existing one, it will return -EEXIST.
+ */
+int add_cache_extent(struct cache_tree *tree, u64 start, u64 size);
+
+/*
+ * Same with add_cache_extent, but with cache_extent strcut.
+ */
+int insert_cache_extent(struct cache_tree *tree, struct cache_extent *pe);
+void remove_cache_extent(struct cache_tree *tree, struct cache_extent *pe);
+
+static inline int cache_tree_empty(struct cache_tree *tree)
+{
+       return RB_EMPTY_ROOT(&tree->root);
+}
+
+typedef void (*free_cache_extent)(struct cache_extent *pe);
+
+void cache_tree_free_extents(struct cache_tree *tree,
+                            free_cache_extent free_func);
+
+#define FREE_EXTENT_CACHE_BASED_TREE(name, free_func)          \
+static void free_##name##_tree(struct cache_tree *tree)                \
+{                                                              \
+       cache_tree_free_extents(tree, free_func);               \
+}
+
+void free_extent_cache_tree(struct cache_tree *tree);
+
+/*
+ * Search a cache_extent with same objectid, and covers start.
+ *
+ * If not found, return next if possible.
+ */
+struct cache_extent *search_cache_extent2(struct cache_tree *tree,
+                                         u64 objectid, u64 start);
+/*
+ * Search a cache_extent with same objectid, and covers the range
+ * [start, start + size)
+ *
+ * If not found, return next cache_extent if possible.
+ */
+struct cache_extent *lookup_cache_extent2(struct cache_tree *tree,
+                                         u64 objectid, u64 start, u64 size);
+int insert_cache_extent2(struct cache_tree *tree, struct cache_extent *pe);
+
+/*
+ * Insert a cache_extent range [start, start + size).
+ *
+ * This function may merge with existing cache_extent.
+ * NOTE: caller must ensure the inserted range won't cover with any existing
+ * range.
+ */
+int add_merge_cache_extent(struct cache_tree *tree, u64 start, u64 size);
+
+#endif
index 2e4599c..774e29e 100644 (file)
  * 2017 Marek Behun, CZ.NIC, marek.behun@nic.cz
  */
 
-#include "btrfs.h"
+#include <linux/kernel.h>
+#include <linux/bug.h>
 #include <malloc.h>
 #include <memalign.h>
+#include "btrfs.h"
+#include "ctree.h"
+#include "extent-io.h"
+#include "disk-io.h"
+
+void extent_io_tree_init(struct extent_io_tree *tree)
+{
+       cache_tree_init(&tree->state);
+       cache_tree_init(&tree->cache);
+       tree->cache_size = 0;
+}
+
+static struct extent_state *alloc_extent_state(void)
+{
+       struct extent_state *state;
+
+       state = malloc(sizeof(*state));
+       if (!state)
+               return NULL;
+       state->cache_node.objectid = 0;
+       state->refs = 1;
+       state->state = 0;
+       state->xprivate = 0;
+       return state;
+}
+
+static void btrfs_free_extent_state(struct extent_state *state)
+{
+       state->refs--;
+       BUG_ON(state->refs < 0);
+       if (state->refs == 0)
+               free(state);
+}
 
-u64 btrfs_read_extent_inline(struct btrfs_path *path,
-                            struct btrfs_file_extent_item *extent, u64 offset,
-                            u64 size, char *out)
+static void free_extent_state_func(struct cache_extent *cache)
 {
-       u32 clen, dlen, orig_size = size, res;
-       const char *cbuf;
-       char *dbuf;
-       const int data_off = offsetof(struct btrfs_file_extent_item,
-                                     disk_bytenr);
+       struct extent_state *es;
+
+       es = container_of(cache, struct extent_state, cache_node);
+       btrfs_free_extent_state(es);
+}
 
-       clen = btrfs_path_item_size(path) - data_off;
-       cbuf = (const char *) extent + data_off;
-       dlen = extent->ram_bytes;
+static void free_extent_buffer_final(struct extent_buffer *eb);
+void extent_io_tree_cleanup(struct extent_io_tree *tree)
+{
+       cache_tree_free_extents(&tree->state, free_extent_state_func);
+}
 
-       if (offset > dlen)
-               return -1ULL;
+static inline void update_extent_state(struct extent_state *state)
+{
+       state->cache_node.start = state->start;
+       state->cache_node.size = state->end + 1 - state->start;
+}
+
+/*
+ * Utility function to look for merge candidates inside a given range.
+ * Any extents with matching state are merged together into a single
+ * extent in the tree. Extents with EXTENT_IO in their state field are
+ * not merged
+ */
+static int merge_state(struct extent_io_tree *tree,
+                      struct extent_state *state)
+{
+       struct extent_state *other;
+       struct cache_extent *other_node;
 
-       if (size > dlen - offset)
-               size = dlen - offset;
+       if (state->state & EXTENT_IOBITS)
+               return 0;
 
-       if (extent->compression == BTRFS_COMPRESS_NONE) {
-               memcpy(out, cbuf + offset, size);
-               return size;
+       other_node = prev_cache_extent(&state->cache_node);
+       if (other_node) {
+               other = container_of(other_node, struct extent_state,
+                                    cache_node);
+               if (other->end == state->start - 1 &&
+                   other->state == state->state) {
+                       state->start = other->start;
+                       update_extent_state(state);
+                       remove_cache_extent(&tree->state, &other->cache_node);
+                       btrfs_free_extent_state(other);
+               }
        }
+       other_node = next_cache_extent(&state->cache_node);
+       if (other_node) {
+               other = container_of(other_node, struct extent_state,
+                                    cache_node);
+               if (other->start == state->end + 1 &&
+                   other->state == state->state) {
+                       other->start = state->start;
+                       update_extent_state(other);
+                       remove_cache_extent(&tree->state, &state->cache_node);
+                       btrfs_free_extent_state(state);
+               }
+       }
+       return 0;
+}
+
+/*
+ * insert an extent_state struct into the tree.  'bits' are set on the
+ * struct before it is inserted.
+ */
+static int insert_state(struct extent_io_tree *tree,
+                       struct extent_state *state, u64 start, u64 end,
+                       int bits)
+{
+       int ret;
+
+       BUG_ON(end < start);
+       state->state |= bits;
+       state->start = start;
+       state->end = end;
+       update_extent_state(state);
+       ret = insert_cache_extent(&tree->state, &state->cache_node);
+       BUG_ON(ret);
+       merge_state(tree, state);
+       return 0;
+}
+
+/*
+ * split a given extent state struct in two, inserting the preallocated
+ * struct 'prealloc' as the newly created second half.  'split' indicates an
+ * offset inside 'orig' where it should be split.
+ */
+static int split_state(struct extent_io_tree *tree, struct extent_state *orig,
+                      struct extent_state *prealloc, u64 split)
+{
+       int ret;
+       prealloc->start = orig->start;
+       prealloc->end = split - 1;
+       prealloc->state = orig->state;
+       update_extent_state(prealloc);
+       orig->start = split;
+       update_extent_state(orig);
+       ret = insert_cache_extent(&tree->state, &prealloc->cache_node);
+       BUG_ON(ret);
+       return 0;
+}
+
+/*
+ * clear some bits on a range in the tree.
+ */
+static int clear_state_bit(struct extent_io_tree *tree,
+                           struct extent_state *state, int bits)
+{
+       int ret = state->state & bits;
 
-       if (dlen > orig_size) {
-               dbuf = malloc(dlen);
-               if (!dbuf)
-                       return -1ULL;
+       state->state &= ~bits;
+       if (state->state == 0) {
+               remove_cache_extent(&tree->state, &state->cache_node);
+               btrfs_free_extent_state(state);
        } else {
-               dbuf = out;
+               merge_state(tree, state);
+       }
+       return ret;
+}
+
+/*
+ * extent_buffer_bitmap_set - set an area of a bitmap
+ * @eb: the extent buffer
+ * @start: offset of the bitmap item in the extent buffer
+ * @pos: bit number of the first bit
+ * @len: number of bits to set
+ */
+void extent_buffer_bitmap_set(struct extent_buffer *eb, unsigned long start,
+                             unsigned long pos, unsigned long len)
+{
+       u8 *p = (u8 *)eb->data + start + BIT_BYTE(pos);
+       const unsigned int size = pos + len;
+       int bits_to_set = BITS_PER_BYTE - (pos % BITS_PER_BYTE);
+       u8 mask_to_set = BITMAP_FIRST_BYTE_MASK(pos);
+
+       while (len >= bits_to_set) {
+               *p |= mask_to_set;
+               len -= bits_to_set;
+               bits_to_set = BITS_PER_BYTE;
+               mask_to_set = ~0;
+               p++;
+       }
+       if (len) {
+               mask_to_set &= BITMAP_LAST_BYTE_MASK(size);
+               *p |= mask_to_set;
+       }
+}
+
+/*
+ * extent_buffer_bitmap_clear - clear an area of a bitmap
+ * @eb: the extent buffer
+ * @start: offset of the bitmap item in the extent buffer
+ * @pos: bit number of the first bit
+ * @len: number of bits to clear
+ */
+void extent_buffer_bitmap_clear(struct extent_buffer *eb, unsigned long start,
+                               unsigned long pos, unsigned long len)
+{
+       u8 *p = (u8 *)eb->data + start + BIT_BYTE(pos);
+       const unsigned int size = pos + len;
+       int bits_to_clear = BITS_PER_BYTE - (pos % BITS_PER_BYTE);
+       u8 mask_to_clear = BITMAP_FIRST_BYTE_MASK(pos);
+
+       while (len >= bits_to_clear) {
+               *p &= ~mask_to_clear;
+               len -= bits_to_clear;
+               bits_to_clear = BITS_PER_BYTE;
+               mask_to_clear = ~0;
+               p++;
+       }
+       if (len) {
+               mask_to_clear &= BITMAP_LAST_BYTE_MASK(size);
+               *p &= ~mask_to_clear;
+       }
+}
+
+/*
+ * clear some bits on a range in the tree.
+ */
+int clear_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, int bits)
+{
+       struct extent_state *state;
+       struct extent_state *prealloc = NULL;
+       struct cache_extent *node;
+       u64 last_end;
+       int err;
+       int set = 0;
+
+again:
+       if (!prealloc) {
+               prealloc = alloc_extent_state();
+               if (!prealloc)
+                       return -ENOMEM;
+       }
+
+       /*
+        * this search will find the extents that end after
+        * our range starts
+        */
+       node = search_cache_extent(&tree->state, start);
+       if (!node)
+               goto out;
+       state = container_of(node, struct extent_state, cache_node);
+       if (state->start > end)
+               goto out;
+       last_end = state->end;
+
+       /*
+        *     | ---- desired range ---- |
+        *  | state | or
+        *  | ------------- state -------------- |
+        *
+        * We need to split the extent we found, and may flip
+        * bits on second half.
+        *
+        * If the extent we found extends past our range, we
+        * just split and search again.  It'll get split again
+        * the next time though.
+        *
+        * If the extent we found is inside our range, we clear
+        * the desired bit on it.
+        */
+       if (state->start < start) {
+               err = split_state(tree, state, prealloc, start);
+               BUG_ON(err == -EEXIST);
+               prealloc = NULL;
+               if (err)
+                       goto out;
+               if (state->end <= end) {
+                       set |= clear_state_bit(tree, state, bits);
+                       if (last_end == (u64)-1)
+                               goto out;
+                       start = last_end + 1;
+               } else {
+                       start = state->start;
+               }
+               goto search_again;
+       }
+       /*
+        * | ---- desired range ---- |
+        *                        | state |
+        * We need to split the extent, and clear the bit
+        * on the first half
+        */
+       if (state->start <= end && state->end > end) {
+               err = split_state(tree, state, prealloc, end + 1);
+               BUG_ON(err == -EEXIST);
+
+               set |= clear_state_bit(tree, prealloc, bits);
+               prealloc = NULL;
+               goto out;
+       }
+
+       start = state->end + 1;
+       set |= clear_state_bit(tree, state, bits);
+       if (last_end == (u64)-1)
+               goto out;
+       start = last_end + 1;
+       goto search_again;
+out:
+       if (prealloc)
+               btrfs_free_extent_state(prealloc);
+       return set;
+
+search_again:
+       if (start > end)
+               goto out;
+       goto again;
+}
+
+/*
+ * set some bits on a range in the tree.
+ */
+int set_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, int bits)
+{
+       struct extent_state *state;
+       struct extent_state *prealloc = NULL;
+       struct cache_extent *node;
+       int err = 0;
+       u64 last_start;
+       u64 last_end;
+again:
+       if (!prealloc) {
+               prealloc = alloc_extent_state();
+               if (!prealloc)
+                       return -ENOMEM;
+       }
+
+       /*
+        * this search will find the extents that end after
+        * our range starts
+        */
+       node = search_cache_extent(&tree->state, start);
+       if (!node) {
+               err = insert_state(tree, prealloc, start, end, bits);
+               BUG_ON(err == -EEXIST);
+               prealloc = NULL;
+               goto out;
+       }
+
+       state = container_of(node, struct extent_state, cache_node);
+       last_start = state->start;
+       last_end = state->end;
+
+       /*
+        * | ---- desired range ---- |
+        * | state |
+        *
+        * Just lock what we found and keep going
+        */
+       if (state->start == start && state->end <= end) {
+               state->state |= bits;
+               merge_state(tree, state);
+               if (last_end == (u64)-1)
+                       goto out;
+               start = last_end + 1;
+               goto search_again;
+       }
+       /*
+        *     | ---- desired range ---- |
+        * | state |
+        *   or
+        * | ------------- state -------------- |
+        *
+        * We need to split the extent we found, and may flip bits on
+        * second half.
+        *
+        * If the extent we found extends past our
+        * range, we just split and search again.  It'll get split
+        * again the next time though.
+        *
+        * If the extent we found is inside our range, we set the
+        * desired bit on it.
+        */
+       if (state->start < start) {
+               err = split_state(tree, state, prealloc, start);
+               BUG_ON(err == -EEXIST);
+               prealloc = NULL;
+               if (err)
+                       goto out;
+               if (state->end <= end) {
+                       state->state |= bits;
+                       start = state->end + 1;
+                       merge_state(tree, state);
+                       if (last_end == (u64)-1)
+                               goto out;
+                       start = last_end + 1;
+               } else {
+                       start = state->start;
+               }
+               goto search_again;
+       }
+       /*
+        * | ---- desired range ---- |
+        *     | state | or               | state |
+        *
+        * There's a hole, we need to insert something in it and
+        * ignore the extent we found.
+        */
+       if (state->start > start) {
+               u64 this_end;
+               if (end < last_start)
+                       this_end = end;
+               else
+                       this_end = last_start -1;
+               err = insert_state(tree, prealloc, start, this_end,
+                               bits);
+               BUG_ON(err == -EEXIST);
+               prealloc = NULL;
+               if (err)
+                       goto out;
+               start = this_end + 1;
+               goto search_again;
+       }
+       /*
+        * | ---- desired range ---- |
+        * | ---------- state ---------- |
+        * We need to split the extent, and set the bit
+        * on the first half
+        */
+       err = split_state(tree, state, prealloc, end + 1);
+       BUG_ON(err == -EEXIST);
+
+       state->state |= bits;
+       merge_state(tree, prealloc);
+       prealloc = NULL;
+out:
+       if (prealloc)
+               btrfs_free_extent_state(prealloc);
+       return err;
+search_again:
+       if (start > end)
+               goto out;
+       goto again;
+}
+
+int set_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end)
+{
+       return set_extent_bits(tree, start, end, EXTENT_DIRTY);
+}
+
+int clear_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end)
+{
+       return clear_extent_bits(tree, start, end, EXTENT_DIRTY);
+}
+
+int find_first_extent_bit(struct extent_io_tree *tree, u64 start,
+                         u64 *start_ret, u64 *end_ret, int bits)
+{
+       struct cache_extent *node;
+       struct extent_state *state;
+       int ret = 1;
+
+       /*
+        * this search will find all the extents that end after
+        * our range starts.
+        */
+       node = search_cache_extent(&tree->state, start);
+       if (!node)
+               goto out;
+
+       while(1) {
+               state = container_of(node, struct extent_state, cache_node);
+               if (state->end >= start && (state->state & bits)) {
+                       *start_ret = state->start;
+                       *end_ret = state->end;
+                       ret = 0;
+                       break;
+               }
+               node = next_cache_extent(node);
+               if (!node)
+                       break;
+       }
+out:
+       return ret;
+}
+
+int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end,
+                  int bits, int filled)
+{
+       struct extent_state *state = NULL;
+       struct cache_extent *node;
+       int bitset = 0;
+
+       node = search_cache_extent(&tree->state, start);
+       while (node && start <= end) {
+               state = container_of(node, struct extent_state, cache_node);
+
+               if (filled && state->start > start) {
+                       bitset = 0;
+                       break;
+               }
+               if (state->start > end)
+                       break;
+               if (state->state & bits) {
+                       bitset = 1;
+                       if (!filled)
+                               break;
+               } else if (filled) {
+                       bitset = 0;
+                       break;
+               }
+               start = state->end + 1;
+               if (start > end)
+                       break;
+               node = next_cache_extent(node);
+               if (!node) {
+                       if (filled)
+                               bitset = 0;
+                       break;
+               }
+       }
+       return bitset;
+}
+
+int set_state_private(struct extent_io_tree *tree, u64 start, u64 private)
+{
+       struct cache_extent *node;
+       struct extent_state *state;
+       int ret = 0;
+
+       node = search_cache_extent(&tree->state, start);
+       if (!node) {
+               ret = -ENOENT;
+               goto out;
+       }
+       state = container_of(node, struct extent_state, cache_node);
+       if (state->start != start) {
+               ret = -ENOENT;
+               goto out;
+       }
+       state->xprivate = private;
+out:
+       return ret;
+}
+
+int get_state_private(struct extent_io_tree *tree, u64 start, u64 *private)
+{
+       struct cache_extent *node;
+       struct extent_state *state;
+       int ret = 0;
+
+       node = search_cache_extent(&tree->state, start);
+       if (!node) {
+               ret = -ENOENT;
+               goto out;
+       }
+       state = container_of(node, struct extent_state, cache_node);
+       if (state->start != start) {
+               ret = -ENOENT;
+               goto out;
+       }
+       *private = state->xprivate;
+out:
+       return ret;
+}
+
+static struct extent_buffer *__alloc_extent_buffer(struct btrfs_fs_info *info,
+                                                  u64 bytenr, u32 blocksize)
+{
+       struct extent_buffer *eb;
+
+       eb = calloc(1, sizeof(struct extent_buffer));
+       if (!eb)
+               return NULL;
+       eb->data = malloc_cache_aligned(blocksize);
+       if (!eb->data) {
+               free(eb);
+               return NULL;
+       }
+
+       eb->start = bytenr;
+       eb->len = blocksize;
+       eb->refs = 1;
+       eb->flags = 0;
+       eb->cache_node.start = bytenr;
+       eb->cache_node.size = blocksize;
+       eb->fs_info = info;
+       memset_extent_buffer(eb, 0, 0, blocksize);
+
+       return eb;
+}
+
+struct extent_buffer *btrfs_clone_extent_buffer(struct extent_buffer *src)
+{
+       struct extent_buffer *new;
+
+       new = __alloc_extent_buffer(src->fs_info, src->start, src->len);
+       if (!new)
+               return NULL;
+
+       copy_extent_buffer(new, src, 0, 0, src->len);
+       new->flags |= EXTENT_BUFFER_DUMMY;
+
+       return new;
+}
+
+static void free_extent_buffer_final(struct extent_buffer *eb)
+{
+       BUG_ON(eb->refs);
+       if (!(eb->flags & EXTENT_BUFFER_DUMMY)) {
+               struct extent_io_tree *tree = &eb->fs_info->extent_cache;
+
+               remove_cache_extent(&tree->cache, &eb->cache_node);
+               BUG_ON(tree->cache_size < eb->len);
+               tree->cache_size -= eb->len;
        }
+       free(eb->data);
+       free(eb);
+}
 
-       res = btrfs_decompress(extent->compression, cbuf, clen, dbuf, dlen);
-       if (res == -1 || res != dlen)
-               goto err;
+static void free_extent_buffer_internal(struct extent_buffer *eb, bool free_now)
+{
+       if (!eb || IS_ERR(eb))
+               return;
 
-       if (dlen > orig_size) {
-               memcpy(out, dbuf + offset, size);
-               free(dbuf);
-       } else if (offset) {
-               memmove(out, dbuf + offset, size);
+       eb->refs--;
+       BUG_ON(eb->refs < 0);
+       if (eb->refs == 0) {
+               if (eb->flags & EXTENT_DIRTY) {
+                       error(
+                       "dirty eb leak (aborted trans): start %llu len %u",
+                               eb->start, eb->len);
+               }
+               if (eb->flags & EXTENT_BUFFER_DUMMY || free_now)
+                       free_extent_buffer_final(eb);
        }
+}
+
+void free_extent_buffer(struct extent_buffer *eb)
+{
+       free_extent_buffer_internal(eb, 1);
+}
 
-       return size;
+struct extent_buffer *find_extent_buffer(struct extent_io_tree *tree,
+                                        u64 bytenr, u32 blocksize)
+{
+       struct extent_buffer *eb = NULL;
+       struct cache_extent *cache;
 
-err:
-       if (dlen > orig_size)
-               free(dbuf);
-       return -1ULL;
+       cache = lookup_cache_extent(&tree->cache, bytenr, blocksize);
+       if (cache && cache->start == bytenr &&
+           cache->size == blocksize) {
+               eb = container_of(cache, struct extent_buffer, cache_node);
+               eb->refs++;
+       }
+       return eb;
 }
 
-u64 btrfs_read_extent_reg(struct btrfs_path *path,
-                         struct btrfs_file_extent_item *extent, u64 offset,
-                         u64 size, char *out)
+struct extent_buffer *find_first_extent_buffer(struct extent_io_tree *tree,
+                                              u64 start)
 {
-       u64 physical, clen, dlen, orig_size = size;
-       u32 res;
-       char *cbuf, *dbuf;
+       struct extent_buffer *eb = NULL;
+       struct cache_extent *cache;
 
-       clen = extent->disk_num_bytes;
-       dlen = extent->num_bytes;
+       cache = search_cache_extent(&tree->cache, start);
+       if (cache) {
+               eb = container_of(cache, struct extent_buffer, cache_node);
+               eb->refs++;
+       }
+       return eb;
+}
 
-       if (offset > dlen)
-               return -1ULL;
+struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
+                                         u64 bytenr, u32 blocksize)
+{
+       struct extent_buffer *eb;
+       struct extent_io_tree *tree = &fs_info->extent_cache;
+       struct cache_extent *cache;
 
-       if (size > dlen - offset)
-               size = dlen - offset;
+       cache = lookup_cache_extent(&tree->cache, bytenr, blocksize);
+       if (cache && cache->start == bytenr &&
+           cache->size == blocksize) {
+               eb = container_of(cache, struct extent_buffer, cache_node);
+               eb->refs++;
+       } else {
+               int ret;
 
-       /* sparse extent */
-       if (extent->disk_bytenr == 0) {
-               memset(out, 0, size);
-               return size;
+               if (cache) {
+                       eb = container_of(cache, struct extent_buffer,
+                                         cache_node);
+                       free_extent_buffer(eb);
+               }
+               eb = __alloc_extent_buffer(fs_info, bytenr, blocksize);
+               if (!eb)
+                       return NULL;
+               ret = insert_cache_extent(&tree->cache, &eb->cache_node);
+               if (ret) {
+                       free(eb);
+                       return NULL;
+               }
+               tree->cache_size += blocksize;
        }
+       return eb;
+}
 
-       physical = btrfs_map_logical_to_physical(extent->disk_bytenr);
-       if (physical == -1ULL)
-               return -1ULL;
+/*
+ * Allocate a dummy extent buffer which won't be inserted into extent buffer
+ * cache.
+ *
+ * This mostly allows super block read write using existing eb infrastructure
+ * without pulluting the eb cache.
+ *
+ * This is especially important to avoid injecting eb->start == SZ_64K, as
+ * fuzzed image could have invalid tree bytenr covers super block range,
+ * and cause ref count underflow.
+ */
+struct extent_buffer *alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info,
+                                               u64 bytenr, u32 blocksize)
+{
+       struct extent_buffer *ret;
 
-       if (extent->compression == BTRFS_COMPRESS_NONE) {
-               physical += extent->offset + offset;
-               if (!btrfs_devread(physical, size, out))
-                       return -1ULL;
+       ret = __alloc_extent_buffer(fs_info, bytenr, blocksize);
+       if (!ret)
+               return NULL;
+
+       ret->flags |= EXTENT_BUFFER_DUMMY;
+
+       return ret;
+}
+
+int read_extent_from_disk(struct blk_desc *desc, struct disk_partition *part,
+                         u64 physical, struct extent_buffer *eb,
+                         unsigned long offset, unsigned long len)
+{
+       int ret;
 
-               return size;
+       ret = __btrfs_devread(desc, part, eb->data + offset, len, physical);
+       if (ret < 0)
+               goto out;
+       if (ret != len) {
+               ret = -EIO;
+               goto out;
        }
+       ret = 0;
+out:
+       return ret;
+}
+
+int memcmp_extent_buffer(const struct extent_buffer *eb, const void *ptrv,
+                        unsigned long start, unsigned long len)
+{
+       return memcmp(eb->data + start, ptrv, len);
+}
 
-       cbuf = malloc_cache_aligned(dlen > size ? clen + dlen : clen);
-       if (!cbuf)
-               return -1ULL;
+void read_extent_buffer(const struct extent_buffer *eb, void *dst,
+                       unsigned long start, unsigned long len)
+{
+       memcpy(dst, eb->data + start, len);
+}
 
-       if (dlen > orig_size)
-               dbuf = cbuf + clen;
-       else
-               dbuf = out;
+void write_extent_buffer(struct extent_buffer *eb, const void *src,
+                        unsigned long start, unsigned long len)
+{
+       memcpy(eb->data + start, src, len);
+}
+
+void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src,
+                       unsigned long dst_offset, unsigned long src_offset,
+                       unsigned long len)
+{
+       memcpy(dst->data + dst_offset, src->data + src_offset, len);
+}
 
-       if (!btrfs_devread(physical, clen, cbuf))
-               goto err;
+void memmove_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset,
+                          unsigned long src_offset, unsigned long len)
+{
+       memmove(dst->data + dst_offset, dst->data + src_offset, len);
+}
 
-       res = btrfs_decompress(extent->compression, cbuf, clen, dbuf, dlen);
-       if (res == -1)
-               goto err;
+void memset_extent_buffer(struct extent_buffer *eb, char c,
+                         unsigned long start, unsigned long len)
+{
+       memset(eb->data + start, c, len);
+}
 
-       if (dlen > orig_size)
-               memcpy(out, dbuf + offset, size);
-       else
-               memmove(out, dbuf + offset, size);
+int extent_buffer_test_bit(struct extent_buffer *eb, unsigned long start,
+                          unsigned long nr)
+{
+       return le_test_bit(nr, (u8 *)eb->data + start);
+}
 
-       free(cbuf);
-       return res;
+int set_extent_buffer_dirty(struct extent_buffer *eb)
+{
+       struct extent_io_tree *tree = &eb->fs_info->extent_cache;
+       if (!(eb->flags & EXTENT_DIRTY)) {
+               eb->flags |= EXTENT_DIRTY;
+               set_extent_dirty(tree, eb->start, eb->start + eb->len - 1);
+               extent_buffer_get(eb);
+       }
+       return 0;
+}
 
-err:
-       free(cbuf);
-       return -1ULL;
+int clear_extent_buffer_dirty(struct extent_buffer *eb)
+{
+       struct extent_io_tree *tree = &eb->fs_info->extent_cache;
+       if (eb->flags & EXTENT_DIRTY) {
+               eb->flags &= ~EXTENT_DIRTY;
+               clear_extent_dirty(tree, eb->start, eb->start + eb->len - 1);
+               free_extent_buffer(eb);
+       }
+       return 0;
 }
diff --git a/fs/btrfs/extent-io.h b/fs/btrfs/extent-io.h
new file mode 100644 (file)
index 0000000..6b0c87d
--- /dev/null
@@ -0,0 +1,164 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/*
+ * Crossported from btrfs-progs/extent_io.h
+ *
+ * Modification includes:
+ * - extent_buffer:data
+ *   Use pointer to provide better alignment.
+ * - Remove max_cache_size related interfaces
+ *   Includes free_extent_buffer_nocache()
+ *   As we don't cache eb in U-boot.
+ * - Include headers
+ *
+ * Write related functions are kept as we still need to modify dummy extent
+ * buffers even in RO environment.
+ */
+#ifndef __BTRFS_EXTENT_IO_H__
+#define __BTRFS_EXTENT_IO_H__
+
+#include <linux/types.h>
+#include <linux/list.h>
+#include <linux/err.h>
+#include <linux/bitops.h>
+#include <fs_internal.h>
+#include "extent-cache.h"
+
+#define EXTENT_DIRTY           (1U << 0)
+#define EXTENT_WRITEBACK       (1U << 1)
+#define EXTENT_UPTODATE                (1U << 2)
+#define EXTENT_LOCKED          (1U << 3)
+#define EXTENT_NEW             (1U << 4)
+#define EXTENT_DELALLOC                (1U << 5)
+#define EXTENT_DEFRAG          (1U << 6)
+#define EXTENT_DEFRAG_DONE     (1U << 7)
+#define EXTENT_BUFFER_FILLED   (1U << 8)
+#define EXTENT_CSUM            (1U << 9)
+#define EXTENT_BAD_TRANSID     (1U << 10)
+#define EXTENT_BUFFER_DUMMY    (1U << 11)
+#define EXTENT_IOBITS (EXTENT_LOCKED | EXTENT_WRITEBACK)
+
+#define BLOCK_GROUP_DATA       (1U << 1)
+#define BLOCK_GROUP_METADATA   (1U << 2)
+#define BLOCK_GROUP_SYSTEM     (1U << 4)
+
+/*
+ * The extent buffer bitmap operations are done with byte granularity instead of
+ * word granularity for two reasons:
+ * 1. The bitmaps must be little-endian on disk.
+ * 2. Bitmap items are not guaranteed to be aligned to a word and therefore a
+ *    single word in a bitmap may straddle two pages in the extent buffer.
+ */
+#define BIT_BYTE(nr) ((nr) / BITS_PER_BYTE)
+#define BYTE_MASK ((1 << BITS_PER_BYTE) - 1)
+#define BITMAP_FIRST_BYTE_MASK(start) \
+       ((BYTE_MASK << ((start) & (BITS_PER_BYTE - 1))) & BYTE_MASK)
+#define BITMAP_LAST_BYTE_MASK(nbits) \
+       (BYTE_MASK >> (-(nbits) & (BITS_PER_BYTE - 1)))
+
+static inline int le_test_bit(int nr, const u8 *addr)
+{
+       return 1U & (addr[BIT_BYTE(nr)] >> (nr & (BITS_PER_BYTE-1)));
+}
+
+struct btrfs_fs_info;
+
+struct extent_io_tree {
+       struct cache_tree state;
+       struct cache_tree cache;
+       u64 cache_size;
+};
+
+struct extent_state {
+       struct cache_extent cache_node;
+       u64 start;
+       u64 end;
+       int refs;
+       unsigned long state;
+       u64 xprivate;
+};
+
+struct extent_buffer {
+       struct cache_extent cache_node;
+       u64 start;
+       u32 len;
+       int refs;
+       u32 flags;
+       struct btrfs_fs_info *fs_info;
+       char *data;
+};
+
+static inline void extent_buffer_get(struct extent_buffer *eb)
+{
+       eb->refs++;
+}
+
+void extent_io_tree_init(struct extent_io_tree *tree);
+void extent_io_tree_cleanup(struct extent_io_tree *tree);
+int set_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, int bits);
+int clear_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, int bits);
+int find_first_extent_bit(struct extent_io_tree *tree, u64 start,
+                         u64 *start_ret, u64 *end_ret, int bits);
+int test_range_bit(struct extent_io_tree *tree, u64 start, u64 end,
+                  int bits, int filled);
+int set_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end);
+int clear_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end);
+static inline int set_extent_buffer_uptodate(struct extent_buffer *eb)
+{
+       eb->flags |= EXTENT_UPTODATE;
+       return 0;
+}
+
+static inline int clear_extent_buffer_uptodate(struct extent_buffer *eb)
+{
+       eb->flags &= ~EXTENT_UPTODATE;
+       return 0;
+}
+
+static inline int extent_buffer_uptodate(struct extent_buffer *eb)
+{
+       if (!eb || IS_ERR(eb))
+               return 0;
+       if (eb->flags & EXTENT_UPTODATE)
+               return 1;
+       return 0;
+}
+
+int set_state_private(struct extent_io_tree *tree, u64 start, u64 xprivate);
+int get_state_private(struct extent_io_tree *tree, u64 start, u64 *xprivate);
+struct extent_buffer *find_extent_buffer(struct extent_io_tree *tree,
+                                        u64 bytenr, u32 blocksize);
+struct extent_buffer *find_first_extent_buffer(struct extent_io_tree *tree,
+                                              u64 start);
+struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
+                                         u64 bytenr, u32 blocksize);
+struct extent_buffer *btrfs_clone_extent_buffer(struct extent_buffer *src);
+struct extent_buffer *alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info,
+                                               u64 bytenr, u32 blocksize);
+void free_extent_buffer(struct extent_buffer *eb);
+int read_extent_from_disk(struct blk_desc *desc, struct disk_partition *part,
+                         u64 physical, struct extent_buffer *eb,
+                         unsigned long offset, unsigned long len);
+int memcmp_extent_buffer(const struct extent_buffer *eb, const void *ptrv,
+                        unsigned long start, unsigned long len);
+void read_extent_buffer(const struct extent_buffer *eb, void *dst,
+                       unsigned long start, unsigned long len);
+void write_extent_buffer(struct extent_buffer *eb, const void *src,
+                        unsigned long start, unsigned long len);
+void copy_extent_buffer(struct extent_buffer *dst, struct extent_buffer *src,
+                       unsigned long dst_offset, unsigned long src_offset,
+                       unsigned long len);
+void memmove_extent_buffer(struct extent_buffer *dst, unsigned long dst_offset,
+                          unsigned long src_offset, unsigned long len);
+void memset_extent_buffer(struct extent_buffer *eb, char c,
+                         unsigned long start, unsigned long len);
+int extent_buffer_test_bit(struct extent_buffer *eb, unsigned long start,
+                          unsigned long nr);
+int set_extent_buffer_dirty(struct extent_buffer *eb);
+int clear_extent_buffer_dirty(struct extent_buffer *eb);
+void extent_buffer_bitmap_clear(struct extent_buffer *eb, unsigned long start,
+                               unsigned long pos, unsigned long len);
+void extent_buffer_bitmap_set(struct extent_buffer *eb, unsigned long start,
+                             unsigned long pos, unsigned long len);
+
+#endif
diff --git a/fs/btrfs/hash.c b/fs/btrfs/hash.c
deleted file mode 100644 (file)
index 52a8cea..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * BTRFS filesystem implementation for U-Boot
- *
- * 2017 Marek Behun, CZ.NIC, marek.behun@nic.cz
- */
-
-#include "btrfs.h"
-#include <u-boot/crc.h>
-#include <asm/unaligned.h>
-
-static u32 btrfs_crc32c_table[256];
-
-void btrfs_hash_init(void)
-{
-       static int inited = 0;
-
-       if (!inited) {
-               crc32c_init(btrfs_crc32c_table, 0x82F63B78);
-               inited = 1;
-       }
-}
-
-u32 btrfs_crc32c(u32 crc, const void *data, size_t length)
-{
-       return crc32c_cal(crc, (const char *) data, length,
-                         btrfs_crc32c_table);
-}
-
-u32 btrfs_csum_data(char *data, u32 seed, size_t len)
-{
-       return btrfs_crc32c(seed, data, len);
-}
-
-void btrfs_csum_final(u32 crc, void *result)
-{
-       put_unaligned(cpu_to_le32(~crc), (u32 *)result);
-}
index 991c2f6..ff33028 100644 (file)
  * 2017 Marek Behun, CZ.NIC, marek.behun@nic.cz
  */
 
-#include "btrfs.h"
+#include <linux/kernel.h>
 #include <malloc.h>
+#include <memalign.h>
+#include "btrfs.h"
+#include "disk-io.h"
+#include "volumes.h"
 
-u64 btrfs_lookup_inode_ref(struct btrfs_root *root, u64 inr,
-                          struct btrfs_inode_ref *refp, char *name)
+/*
+ * Read the content of symlink inode @ino of @root, into @target.
+ * NOTE: @target will not be \0 termiated, caller should handle it properly.
+ *
+ * Return the number of read data.
+ * Return <0 for error.
+ */
+int btrfs_readlink(struct btrfs_root *root, u64 ino, char *target)
 {
        struct btrfs_path path;
-       struct btrfs_key *key;
-       struct btrfs_inode_ref *ref;
-       u64 res = -1ULL;
-
-       key = btrfs_search_tree_key_type(root, inr, BTRFS_INODE_REF_KEY,
-                                              &path);
-
-       if (!key)
-               return -1ULL;
-
-       ref = btrfs_path_item_ptr(&path, struct btrfs_inode_ref);
-       btrfs_inode_ref_to_cpu(ref);
-
-       if (refp)
-               *refp = *ref;
+       struct btrfs_key key;
+       struct btrfs_file_extent_item *fi;
+       int ret;
 
-       if (name) {
-               if (ref->name_len > BTRFS_NAME_MAX) {
-                       printf("%s: inode name too long: %u\n", __func__,
-                               ref->name_len);
-                       goto out;
-               }
+       key.objectid = ino;
+       key.type = BTRFS_EXTENT_DATA_KEY;
+       key.offset = 0;
+       btrfs_init_path(&path);
 
-               memcpy(name, ref + 1, ref->name_len);
+       ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
+       if (ret < 0)
+               return ret;
+       if (ret > 0) {
+               ret = -ENOENT;
+               goto out;
        }
-
-       res = key->offset;
-out:
-       btrfs_free_path(&path);
-       return res;
-}
-
-int btrfs_lookup_inode(const struct btrfs_root *root,
-                      struct btrfs_key *location,
-                      struct btrfs_inode_item *item,
-                      struct btrfs_root *new_root)
-{
-       struct btrfs_root tmp_root = *root;
-       struct btrfs_path path;
-       int res = -1;
-
-       if (location->type == BTRFS_ROOT_ITEM_KEY) {
-               if (btrfs_find_root(location->objectid, &tmp_root, NULL))
-                       return -1;
-
-               location->objectid = tmp_root.root_dirid;
-               location->type = BTRFS_INODE_ITEM_KEY;
-               location->offset = 0;
+       fi = btrfs_item_ptr(path.nodes[0], path.slots[0],
+                           struct btrfs_file_extent_item);
+       if (btrfs_file_extent_type(path.nodes[0], fi) !=
+           BTRFS_FILE_EXTENT_INLINE) {
+               ret = -EUCLEAN;
+               error("Extent for symlink %llu must be INLINE type!", ino);
+               goto out;
        }
-
-       if (btrfs_search_tree(&tmp_root, location, &path))
-               return res;
-
-       if (btrfs_comp_keys(location, btrfs_path_leaf_key(&path)))
+       if (btrfs_file_extent_compression(path.nodes[0], fi) !=
+           BTRFS_COMPRESS_NONE) {
+               ret = -EUCLEAN;
+               error("Extent for symlink %llu must not be compressed!", ino);
                goto out;
-
-       if (item) {
-               *item = *btrfs_path_item_ptr(&path, struct btrfs_inode_item);
-               btrfs_inode_item_to_cpu(item);
        }
-
-       if (new_root)
-               *new_root = tmp_root;
-
-       res = 0;
-
+       if (btrfs_file_extent_ram_bytes(path.nodes[0], fi) >=
+           root->fs_info->sectorsize) {
+               ret = -EUCLEAN;
+               error("Symlink %llu extent data too large (%llu)!\n",
+                       ino, btrfs_file_extent_ram_bytes(path.nodes[0], fi));
+               goto out;
+       }
+       read_extent_buffer(path.nodes[0], target,
+                       btrfs_file_extent_inline_start(fi),
+                       btrfs_file_extent_ram_bytes(path.nodes[0], fi));
+       ret = btrfs_file_extent_ram_bytes(path.nodes[0], fi);
 out:
-       btrfs_free_path(&path);
-       return res;
+       btrfs_release_path(&path);
+       return ret;
 }
 
-int btrfs_readlink(const struct btrfs_root *root, u64 inr, char *target)
+static int lookup_root_ref(struct btrfs_fs_info *fs_info,
+                          u64 rootid, u64 *root_ret, u64 *dir_ret)
 {
+       struct btrfs_root *root = fs_info->tree_root;
+       struct btrfs_root_ref *root_ref;
        struct btrfs_path path;
        struct btrfs_key key;
-       struct btrfs_file_extent_item *extent;
-       const char *data_ptr;
-       int res = -1;
-
-       key.objectid = inr;
-       key.type = BTRFS_EXTENT_DATA_KEY;
-       key.offset = 0;
-
-       if (btrfs_search_tree(root, &key, &path))
-               return -1;
-
-       if (btrfs_comp_keys(&key, btrfs_path_leaf_key(&path)))
-               goto out;
-
-       extent = btrfs_path_item_ptr(&path, struct btrfs_file_extent_item);
-       if (extent->type != BTRFS_FILE_EXTENT_INLINE) {
-               printf("%s: Extent for symlink %llu not of INLINE type\n",
-                      __func__, inr);
+       int ret;
+
+       btrfs_init_path(&path);
+       key.objectid = rootid;
+       key.type = BTRFS_ROOT_BACKREF_KEY;
+       key.offset = (u64)-1;
+
+       ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
+       if (ret < 0)
+               return ret;
+       /* Should not happen */
+       if (ret == 0) {
+               ret = -EUCLEAN;
                goto out;
        }
-
-       btrfs_file_extent_item_to_cpu_inl(extent);
-
-       if (extent->compression != BTRFS_COMPRESS_NONE) {
-               printf("%s: Symlink %llu extent data compressed!\n", __func__,
-                      inr);
+       ret = btrfs_previous_item(root, &path, rootid, BTRFS_ROOT_BACKREF_KEY);
+       if (ret < 0)
                goto out;
-       } else if (extent->encryption != 0) {
-               printf("%s: Symlink %llu extent data encrypted!\n", __func__,
-                      inr);
-               goto out;
-       } else if (extent->ram_bytes >= btrfs_info.sb.sectorsize) {
-               printf("%s: Symlink %llu extent data too long (%llu)!\n",
-                      __func__, inr, extent->ram_bytes);
+       if (ret > 0) {
+               ret = -ENOENT;
                goto out;
        }
-
-       data_ptr = (const char *) extent
-                  + offsetof(struct btrfs_file_extent_item, disk_bytenr);
-
-       memcpy(target, data_ptr, extent->ram_bytes);
-       target[extent->ram_bytes] = '\0';
-       res = 0;
+       btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
+       root_ref = btrfs_item_ptr(path.nodes[0], path.slots[0],
+                                 struct btrfs_root_ref);
+       *root_ret = key.offset;
+       *dir_ret = btrfs_root_ref_dirid(path.nodes[0], root_ref);
 out:
-       btrfs_free_path(&path);
-       return res;
+       btrfs_release_path(&path);
+       return ret;
 }
 
-/* inr must be a directory (for regular files with multiple hard links this
-   function returns only one of the parents of the file) */
-static u64 get_parent_inode(struct btrfs_root *root, u64 inr,
-                           struct btrfs_inode_item *inode_item)
+/*
+ * To get the parent inode of @ino of @root.
+ *
+ * @root_ret and @ino_ret will be filled.
+ *
+ * NOTE: This function is not reliable. It can only get one parent inode.
+ * The get the proper parent inode, we need a full VFS inodes stack to
+ * resolve properly.
+ */
+static int get_parent_inode(struct btrfs_root *root, u64 ino,
+                           struct btrfs_root **root_ret, u64 *ino_ret)
 {
+       struct btrfs_fs_info *fs_info = root->fs_info;
+       struct btrfs_path path;
        struct btrfs_key key;
-       u64 res;
-
-       if (inr == BTRFS_FIRST_FREE_OBJECTID) {
-               if (root->objectid != btrfs_info.fs_root.objectid) {
-                       u64 parent;
-                       struct btrfs_root_ref ref;
-
-                       parent = btrfs_lookup_root_ref(root->objectid, &ref,
-                                                      NULL);
-                       if (parent == -1ULL)
-                               return -1ULL;
+       int ret;
 
-                       if (btrfs_find_root(parent, root, NULL))
-                               return -1ULL;
+       if (ino == BTRFS_FIRST_FREE_OBJECTID) {
+               u64 parent_root = -1;
 
-                       inr = ref.dirid;
+               /* It's top level already, no more parent */
+               if (root->root_key.objectid == BTRFS_FS_TREE_OBJECTID) {
+                       *root_ret = fs_info->fs_root;
+                       *ino_ret = BTRFS_FIRST_FREE_OBJECTID;
+                       return 0;
                }
 
-               if (inode_item) {
-                       key.objectid = inr;
-                       key.type = BTRFS_INODE_ITEM_KEY;
-                       key.offset = 0;
+               ret = lookup_root_ref(fs_info, root->root_key.objectid,
+                                     &parent_root, ino_ret);
+               if (ret < 0)
+                       return ret;
 
-                       if (btrfs_lookup_inode(root, &key, inode_item, NULL))
-                               return -1ULL;
-               }
+               key.objectid = parent_root;
+               key.type = BTRFS_ROOT_ITEM_KEY;
+               key.offset = (u64)-1;
+               *root_ret = btrfs_read_fs_root(fs_info, &key);
+               if (IS_ERR(*root_ret))
+                       return PTR_ERR(*root_ret);
 
-               return inr;
+               return 0;
        }
 
-       res = btrfs_lookup_inode_ref(root, inr, NULL, NULL);
-       if (res == -1ULL)
-               return -1ULL;
-
-       if (inode_item) {
-               key.objectid = res;
-               key.type = BTRFS_INODE_ITEM_KEY;
-               key.offset = 0;
-
-               if (btrfs_lookup_inode(root, &key, inode_item, NULL))
-                       return -1ULL;
+       btrfs_init_path(&path);
+       key.objectid = ino;
+       key.type = BTRFS_INODE_REF_KEY;
+       key.offset = (u64)-1;
+
+       ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
+       if (ret < 0)
+               return ret;
+       /* Should not happen */
+       if (ret == 0) {
+               ret = -EUCLEAN;
+               goto out;
        }
-
-       return res;
+       ret = btrfs_previous_item(root, &path, ino, BTRFS_INODE_REF_KEY);
+       if (ret < 0)
+               goto out;
+       if (ret > 0) {
+               ret = -ENOENT;
+               goto out;
+       }
+       btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
+       *root_ret = root;
+       *ino_ret = key.offset;
+out:
+       btrfs_release_path(&path);
+       return ret;
 }
 
 static inline int next_length(const char *path)
 {
        int res = 0;
-       while (*path != '\0' && *path != '/' && res <= BTRFS_NAME_LEN)
-               ++res, ++path;
+       while (*path != '\0' && *path != '/') {
+               ++res;
+               ++path;
+               if (res > BTRFS_NAME_LEN)
+                       break;
+       }
        return res;
 }
 
@@ -209,175 +203,549 @@ static inline const char *skip_current_directories(const char *cur)
        return cur;
 }
 
-u64 btrfs_lookup_path(struct btrfs_root *root, u64 inr, const char *path,
-                     u8 *type_p, struct btrfs_inode_item *inode_item_p,
-                     int symlink_limit)
+/*
+ * Resolve one filename of @ino of @root.
+ *
+ * key_ret:    The child key (either INODE_ITEM or ROOT_ITEM type)
+ * type_ret:   BTRFS_FT_* of the child inode.
+ *
+ * Return 0 with above members filled.
+ * Return <0 for error.
+ */
+static int resolve_one_filename(struct btrfs_root *root, u64 ino,
+                               const char *name, int namelen,
+                               struct btrfs_key *key_ret, u8 *type_ret)
 {
-       struct btrfs_dir_item item;
-       struct btrfs_inode_item inode_item;
-       u8 type = BTRFS_FT_DIR;
-       int len, have_inode = 0;
-       const char *cur = path;
+       struct btrfs_dir_item *dir_item;
+       struct btrfs_path path;
+       int ret = 0;
+
+       btrfs_init_path(&path);
+
+       dir_item = btrfs_lookup_dir_item(NULL, root, &path, ino, name,
+                                        namelen, 0);
+       if (IS_ERR(dir_item)) {
+               ret = PTR_ERR(dir_item);
+               goto out;
+       }
 
+       btrfs_dir_item_key_to_cpu(path.nodes[0], dir_item, key_ret);
+       *type_ret = btrfs_dir_type(path.nodes[0], dir_item);
+out:
+       btrfs_release_path(&path);
+       return ret;
+}
+
+/*
+ * Resolve a full path @filename. The start point is @ino of @root.
+ *
+ * The result will be filled into @root_ret, @ino_ret and @type_ret.
+ */
+int btrfs_lookup_path(struct btrfs_root *root, u64 ino, const char *filename,
+                       struct btrfs_root **root_ret, u64 *ino_ret,
+                       u8 *type_ret, int symlink_limit)
+{
+       struct btrfs_fs_info *fs_info = root->fs_info;
+       struct btrfs_root *next_root;
+       struct btrfs_key key;
+       const char *cur = filename;
+       u64 next_ino;
+       u8 next_type;
+       u8 type;
+       int len;
+       int ret = 0;
+
+       /* If the path is absolute path, also search from fs root */
        if (*cur == '/') {
-               ++cur;
-               inr = root->root_dirid;
+               root = fs_info->fs_root;
+               ino = btrfs_root_dirid(&root->root_item);
+               type = BTRFS_FT_DIR;
        }
 
-       do {
+       while (*cur != '\0') {
                cur = skip_current_directories(cur);
 
                len = next_length(cur);
                if (len > BTRFS_NAME_LEN) {
-                       printf("%s: Name too long at \"%.*s\"\n", __func__,
+                       error("%s: Name too long at \"%.*s\"", __func__,
                               BTRFS_NAME_LEN, cur);
-                       return -1ULL;
+                       return -ENAMETOOLONG;
                }
 
                if (len == 1 && cur[0] == '.')
                        break;
 
                if (len == 2 && cur[0] == '.' && cur[1] == '.') {
-                       cur += 2;
-                       inr = get_parent_inode(root, inr, &inode_item);
-                       if (inr == -1ULL)
-                               return -1ULL;
-
-                       type = BTRFS_FT_DIR;
-                       continue;
+                       /* Go one level up */
+                       ret = get_parent_inode(root, ino, &next_root, &next_ino);
+                       if (ret < 0)
+                               return ret;
+                       root = next_root;
+                       ino = next_ino;
+                       goto next;
                }
 
                if (!*cur)
                        break;
-               
-               if (btrfs_lookup_dir_item(root, inr, cur, len, &item))
-                       return -1ULL;
 
-               type = item.type;
-               have_inode = 1;
-               if (btrfs_lookup_inode(root, &item.location, &inode_item, root))
-                       return -1ULL;
+               ret = resolve_one_filename(root, ino, cur, len, &key, &type);
+               if (ret < 0)
+                       return ret;
+
+               if (key.type == BTRFS_ROOT_ITEM_KEY) {
+                       /* Child inode is a subvolume */
+
+                       next_root = btrfs_read_fs_root(fs_info, &key);
+                       if (IS_ERR(next_root))
+                               return PTR_ERR(next_root);
+                       root = next_root;
+                       ino = btrfs_root_dirid(&root->root_item);
+               } else if (type == BTRFS_FT_SYMLINK && symlink_limit >= 0) {
+                       /* Child inode is a symlink */
 
-               if (item.type == BTRFS_FT_SYMLINK && symlink_limit >= 0) {
                        char *target;
 
-                       if (!symlink_limit) {
-                               printf("%s: Too much symlinks!\n", __func__);
-                               return -1ULL;
+                       if (symlink_limit == 0) {
+                               error("%s: Too much symlinks!", __func__);
+                               return -EMLINK;
                        }
-
-                       target = malloc(min(inode_item.size + 1,
-                                           (u64) btrfs_info.sb.sectorsize));
+                       target = malloc(fs_info->sectorsize);
                        if (!target)
-                               return -1ULL;
-
-                       if (btrfs_readlink(root, item.location.objectid,
-                                          target)) {
+                               return -ENOMEM;
+                       ret = btrfs_readlink(root, key.objectid, target);
+                       if (ret < 0) {
                                free(target);
-                               return -1ULL;
+                               return ret;
                        }
+                       target[ret] = '\0';
+
+                       ret = btrfs_lookup_path(root, ino, target, &next_root,
+                                               &next_ino, &next_type,
+                                               symlink_limit);
+                       if (ret < 0)
+                               return ret;
+                       root = next_root;
+                       ino = next_ino;
+                       type = next_type;
+               } else {
+                       /* Child inode is an inode */
+                       ino = key.objectid;
+               }
+next:
+               cur += len;
+       }
 
-                       inr = btrfs_lookup_path(root, inr, target, &type,
-                                               &inode_item, symlink_limit - 1);
+       if (!ret) {
+               *root_ret = root;
+               *ino_ret = ino;
+               *type_ret = type;
+       }
 
-                       free(target);
+       return ret;
+}
 
-                       if (inr == -1ULL)
-                               return -1ULL;
-               } else if (item.type != BTRFS_FT_DIR && cur[len]) {
-                       printf("%s: \"%.*s\" not a directory\n", __func__,
-                              (int) (cur - path + len), path);
-                       return -1ULL;
-               } else {
-                       inr = item.location.objectid;
-               }
+/*
+ * Read out inline extent.
+ *
+ * Since inline extent should only exist for offset 0, no need for extra
+ * parameters.
+ * Truncating should be handled by the caller.
+ *
+ * Return the number of bytes read.
+ * Return <0 for error.
+ */
+int btrfs_read_extent_inline(struct btrfs_path *path,
+                            struct btrfs_file_extent_item *fi, char *dest)
+{
+       struct extent_buffer *leaf = path->nodes[0];
+       int slot = path->slots[0];
+       char *cbuf = NULL;
+       char *dbuf = NULL;
+       u32 csize;
+       u32 dsize;
+       int ret;
+
+       csize = btrfs_file_extent_inline_item_len(leaf, btrfs_item_nr(slot));
+       if (btrfs_file_extent_compression(leaf, fi) == BTRFS_COMPRESS_NONE) {
+               /* Uncompressed, just read it out */
+               read_extent_buffer(leaf, dest,
+                               btrfs_file_extent_inline_start(fi),
+                               csize);
+               return csize;
+       }
 
-               cur += len;
-       } while (*cur);
+       /* Compressed extent, prepare the compressed and data buffer */
+       dsize = btrfs_file_extent_ram_bytes(leaf, fi);
+       cbuf = malloc(csize);
+       dbuf = malloc(dsize);
+       if (!cbuf || !dbuf) {
+               ret = -ENOMEM;
+               goto out;
+       }
+       read_extent_buffer(leaf, cbuf, btrfs_file_extent_inline_start(fi),
+                          csize);
+       ret = btrfs_decompress(btrfs_file_extent_compression(leaf, fi),
+                              cbuf, csize, dbuf, dsize);
+       if (ret < 0 || ret != dsize) {
+               ret = -EIO;
+               goto out;
+       }
+       memcpy(dest, dbuf, dsize);
+       ret = dsize;
+out:
+       free(cbuf);
+       free(dbuf);
+       return ret;
+}
 
-       if (type_p)
-               *type_p = type;
+/*
+ * Read out regular extent.
+ *
+ * Truncating should be handled by the caller.
+ *
+ * @offset and @len should not cross the extent boundary.
+ * Return the number of bytes read.
+ * Return <0 for error.
+ */
+int btrfs_read_extent_reg(struct btrfs_path *path,
+                         struct btrfs_file_extent_item *fi, u64 offset,
+                         int len, char *dest)
+{
+       struct extent_buffer *leaf = path->nodes[0];
+       struct btrfs_fs_info *fs_info = leaf->fs_info;
+       struct btrfs_key key;
+       u64 extent_num_bytes;
+       u64 disk_bytenr;
+       u64 read;
+       char *cbuf = NULL;
+       char *dbuf = NULL;
+       u32 csize;
+       u32 dsize;
+       bool finished = false;
+       int num_copies;
+       int i;
+       int slot = path->slots[0];
+       int ret;
+
+       btrfs_item_key_to_cpu(leaf, &key, slot);
+       extent_num_bytes = btrfs_file_extent_num_bytes(leaf, fi);
+       ASSERT(IS_ALIGNED(offset, fs_info->sectorsize) &&
+              IS_ALIGNED(len, fs_info->sectorsize));
+       ASSERT(offset >= key.offset &&
+              offset + len <= key.offset + extent_num_bytes);
+
+       /* Preallocated or hole , fill @dest with zero */
+       if (btrfs_file_extent_type(leaf, fi) == BTRFS_FILE_EXTENT_PREALLOC ||
+           btrfs_file_extent_disk_bytenr(leaf, fi) == 0) {
+               memset(dest, 0, len);
+               return len;
+       }
 
-       if (inode_item_p) {
-               if (!have_inode) {
-                       struct btrfs_key key;
+       if (btrfs_file_extent_compression(leaf, fi) == BTRFS_COMPRESS_NONE) {
+               u64 logical;
 
-                       key.objectid = inr;
-                       key.type = BTRFS_INODE_ITEM_KEY;
-                       key.offset = 0;
+               logical = btrfs_file_extent_disk_bytenr(leaf, fi) +
+                         btrfs_file_extent_offset(leaf, fi) +
+                         offset - key.offset;
+               read = len;
 
-                       if (btrfs_lookup_inode(root, &key, &inode_item, NULL))
-                               return -1ULL;
+               num_copies = btrfs_num_copies(fs_info, logical, len);
+               for (i = 1; i <= num_copies; i++) {
+                       ret = read_extent_data(fs_info, dest, logical, &read, i);
+                       if (ret < 0 || read != len)
+                               continue;
+                       finished = true;
+                       break;
                }
+               if (!finished)
+                       return -EIO;
+               return len;
+       }
+
+       csize = btrfs_file_extent_disk_num_bytes(leaf, fi);
+       dsize = btrfs_file_extent_ram_bytes(leaf, fi);
+       disk_bytenr = btrfs_file_extent_disk_bytenr(leaf, fi);
+       num_copies = btrfs_num_copies(fs_info, disk_bytenr, csize);
 
-               *inode_item_p = inode_item;
+       cbuf = malloc_cache_aligned(csize);
+       dbuf = malloc_cache_aligned(dsize);
+       if (!cbuf || !dbuf) {
+               ret = -ENOMEM;
+               goto out;
+       }
+       /* For compressed extent, we must read the whole on-disk extent */
+       for (i = 1; i <= num_copies; i++) {
+               read = csize;
+               ret = read_extent_data(fs_info, cbuf, disk_bytenr,
+                                      &read, i);
+               if (ret < 0 || read != csize)
+                       continue;
+               finished = true;
+               break;
+       }
+       if (!finished) {
+               ret = -EIO;
+               goto out;
        }
 
-       return inr;
+       ret = btrfs_decompress(btrfs_file_extent_compression(leaf, fi), cbuf,
+                              csize, dbuf, dsize);
+       if (ret != dsize) {
+               ret = -EIO;
+               goto out;
+       }
+       /* Then copy the needed part */
+       memcpy(dest, dbuf + btrfs_file_extent_offset(leaf, fi), len);
+       ret = len;
+out:
+       free(cbuf);
+       free(dbuf);
+       return ret;
 }
 
-u64 btrfs_file_read(const struct btrfs_root *root, u64 inr, u64 offset,
-                   u64 size, char *buf)
+/*
+ * Get the first file extent that covers bytenr @file_offset.
+ *
+ * @file_offset must be aligned to sectorsize.
+ *
+ * return 0 for found, and path points to the file extent.
+ * return >0 for not found, and fill @next_offset.
+ * @next_offset can be 0 if there is no next file extent.
+ * return <0 for error.
+ */
+static int lookup_data_extent(struct btrfs_root *root, struct btrfs_path *path,
+                             u64 ino, u64 file_offset, u64 *next_offset)
 {
-       struct btrfs_path path;
        struct btrfs_key key;
-       struct btrfs_file_extent_item *extent;
-       int res = 0;
-       u64 rd, rd_all = -1ULL;
+       struct btrfs_file_extent_item *fi;
+       u8 extent_type;
+       int ret = 0;
 
-       key.objectid = inr;
+       ASSERT(IS_ALIGNED(file_offset, root->fs_info->sectorsize));
+       key.objectid = ino;
        key.type = BTRFS_EXTENT_DATA_KEY;
-       key.offset = offset;
-
-       if (btrfs_search_tree(root, &key, &path))
-               return -1ULL;
-
-       if (btrfs_comp_keys(&key, btrfs_path_leaf_key(&path)) < 0) {
-               if (btrfs_prev_slot(&path))
-                       goto out;
+       key.offset = file_offset;
+
+       ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
+       /* Error or we're already at the file extent */
+       if (ret <= 0)
+               return ret;
+       if (ret > 0) {
+               /* Check previous file extent */
+               ret = btrfs_previous_item(root, path, ino,
+                                         BTRFS_EXTENT_DATA_KEY);
+               if (ret < 0)
+                       return ret;
+               if (ret > 0)
+                       goto check_next;
+       }
+       /* Now the key.offset must be smaller than @file_offset */
+       btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
+       if (key.objectid != ino ||
+           key.type != BTRFS_EXTENT_DATA_KEY)
+               goto check_next;
+
+       fi = btrfs_item_ptr(path->nodes[0], path->slots[0],
+                           struct btrfs_file_extent_item);
+       extent_type = btrfs_file_extent_type(path->nodes[0], fi);
+       if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
+               if (file_offset == 0)
+                       return 0;
+               /* Inline extent should be the only extent, no next extent. */
+               *next_offset = 0;
+               return 1;
+       }
 
-               if (btrfs_comp_keys_type(&key, btrfs_path_leaf_key(&path)))
-                       goto out;
+       /* This file extent covers @file_offset */
+       if (key.offset <= file_offset && key.offset +
+           btrfs_file_extent_num_bytes(path->nodes[0], fi) > file_offset)
+               return 0;
+check_next:
+       ret = btrfs_next_item(root, path);
+       if (ret < 0)
+               return ret;
+       if (ret > 0) {
+               *next_offset = 0;
+               return 1;
        }
 
-       rd_all = 0;
+       btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
+       fi = btrfs_item_ptr(path->nodes[0], path->slots[0],
+                           struct btrfs_file_extent_item);
+       /* Next next data extent */
+       if (key.objectid != ino ||
+           key.type != BTRFS_EXTENT_DATA_KEY) {
+               *next_offset = 0;
+               return 1;
+       }
+       /* Current file extent already beyond @file_offset */
+       if (key.offset > file_offset) {
+               *next_offset = key.offset;
+               return 1;
+       }
+       /* This file extent covers @file_offset */
+       if (key.offset <= file_offset && key.offset +
+           btrfs_file_extent_num_bytes(path->nodes[0], fi) > file_offset)
+               return 0;
+       /* This file extent ends before @file_offset, check next */
+       ret = btrfs_next_item(root, path);
+       if (ret < 0)
+               return ret;
+       if (ret > 0) {
+               *next_offset = 0;
+               return 1;
+       }
+       btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
+       if (key.type != BTRFS_EXTENT_DATA_KEY || key.objectid != ino) {
+               *next_offset = 0;
+               return 1;
+       }
+       *next_offset = key.offset;
+       return 1;
+}
 
-       do {
-               if (btrfs_comp_keys_type(&key, btrfs_path_leaf_key(&path)))
-                       break;
+static int read_and_truncate_page(struct btrfs_path *path,
+                                 struct btrfs_file_extent_item *fi,
+                                 int start, int len, char *dest)
+{
+       struct extent_buffer *leaf = path->nodes[0];
+       struct btrfs_fs_info *fs_info = leaf->fs_info;
+       u64 aligned_start = round_down(start, fs_info->sectorsize);
+       u8 extent_type;
+       char *buf;
+       int page_off = start - aligned_start;
+       int page_len = fs_info->sectorsize - page_off;
+       int ret;
+
+       ASSERT(start + len <= aligned_start + fs_info->sectorsize);
+       buf = malloc_cache_aligned(fs_info->sectorsize);
+       if (!buf)
+               return -ENOMEM;
+
+       extent_type = btrfs_file_extent_type(leaf, fi);
+       if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
+               ret = btrfs_read_extent_inline(path, fi, buf);
+               memcpy(dest, buf + page_off, min(page_len, ret));
+               free(buf);
+               return len;
+       }
 
-               extent = btrfs_path_item_ptr(&path,
-                                            struct btrfs_file_extent_item);
+       ret = btrfs_read_extent_reg(path, fi,
+                       round_down(start, fs_info->sectorsize),
+                       fs_info->sectorsize, buf);
+       if (ret < 0) {
+               free(buf);
+               return ret;
+       }
+       memcpy(dest, buf + page_off, page_len);
+       free(buf);
+       return len;
+}
 
-               if (extent->type == BTRFS_FILE_EXTENT_INLINE) {
-                       btrfs_file_extent_item_to_cpu_inl(extent);
-                       rd = btrfs_read_extent_inline(&path, extent, offset,
-                                                     size, buf);
+int btrfs_file_read(struct btrfs_root *root, u64 ino, u64 file_offset, u64 len,
+                   char *dest)
+{
+       struct btrfs_fs_info *fs_info = root->fs_info;
+       struct btrfs_file_extent_item *fi;
+       struct btrfs_path path;
+       struct btrfs_key key;
+       u64 aligned_start = round_down(file_offset, fs_info->sectorsize);
+       u64 aligned_end = round_down(file_offset + len, fs_info->sectorsize);
+       u64 next_offset;
+       u64 cur = aligned_start;
+       int ret = 0;
+
+       btrfs_init_path(&path);
+
+       /* Set the whole dest all zero, so we won't need to bother holes */
+       memset(dest, 0, len);
+
+       /* Read out the leading unaligned part */
+       if (aligned_start != file_offset) {
+               ret = lookup_data_extent(root, &path, ino, aligned_start,
+                                        &next_offset);
+               if (ret < 0)
+                       goto out;
+               if (ret == 0) {
+                       /* Read the unaligned part out*/
+                       fi = btrfs_item_ptr(path.nodes[0], path.slots[0],
+                                       struct btrfs_file_extent_item);
+                       ret = read_and_truncate_page(&path, fi, file_offset,
+                                       round_up(file_offset, fs_info->sectorsize) -
+                                       file_offset, dest);
+                       if (ret < 0)
+                               goto out;
+                       cur += fs_info->sectorsize;
                } else {
-                       btrfs_file_extent_item_to_cpu(extent);
-                       rd = btrfs_read_extent_reg(&path, extent, offset, size,
-                                                  buf);
+                       /* The whole file is a hole */
+                       if (!next_offset) {
+                               memset(dest, 0, len);
+                               return len;
+                       }
+                       cur = next_offset;
                }
+       }
+
+       /* Read the aligned part */
+       while (cur < aligned_end) {
+               u64 extent_num_bytes;
+               u8 type;
 
-               if (rd == -1ULL) {
-                       printf("%s: Error reading extent\n", __func__);
-                       rd_all = -1;
+               btrfs_release_path(&path);
+               ret = lookup_data_extent(root, &path, ino, cur, &next_offset);
+               if (ret < 0)
                        goto out;
+               if (ret > 0) {
+                       /* No next, direct exit */
+                       if (!next_offset) {
+                               ret = 0;
+                               goto out;
+                       }
+               }
+               fi = btrfs_item_ptr(path.nodes[0], path.slots[0],
+                                   struct btrfs_file_extent_item);
+               btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
+               type = btrfs_file_extent_type(path.nodes[0], fi);
+               if (type == BTRFS_FILE_EXTENT_INLINE) {
+                       ret = btrfs_read_extent_inline(&path, fi, dest);
+                       goto out;
+               }
+               /* Skip holes, as we have zeroed the dest */
+               if (type == BTRFS_FILE_EXTENT_PREALLOC ||
+                   btrfs_file_extent_disk_bytenr(path.nodes[0], fi) == 0) {
+                       cur = key.offset + btrfs_file_extent_num_bytes(
+                                       path.nodes[0], fi);
+                       continue;
                }
 
-               offset = 0;
-               buf += rd;
-               rd_all += rd;
-               size -= rd;
-
-               if (!size)
-                       break;
-       } while (!(res = btrfs_next_slot(&path)));
-
-       if (res)
-               return -1ULL;
+               /* Read the remaining part of the extent */
+               extent_num_bytes = btrfs_file_extent_num_bytes(path.nodes[0],
+                                                              fi);
+               ret = btrfs_read_extent_reg(&path, fi, cur,
+                               min(extent_num_bytes, aligned_end - cur),
+                               dest + cur - file_offset);
+               if (ret < 0)
+                       goto out;
+               cur += min(extent_num_bytes, aligned_end - cur);
+       }
 
+       /* Read the tailing unaligned part*/
+       if (file_offset + len != aligned_end) {
+               btrfs_release_path(&path);
+               ret = lookup_data_extent(root, &path, ino, aligned_end,
+                                        &next_offset);
+               /* <0 is error, >0 means no extent */
+               if (ret)
+                       goto out;
+               fi = btrfs_item_ptr(path.nodes[0], path.slots[0],
+                                   struct btrfs_file_extent_item);
+               ret = read_and_truncate_page(&path, fi, aligned_end,
+                               file_offset + len - aligned_end,
+                               dest + aligned_end - file_offset);
+       }
 out:
-       btrfs_free_path(&path);
-       return rd_all;
+       btrfs_release_path(&path);
+       if (ret < 0)
+               return ret;
+       return len;
 }
diff --git a/fs/btrfs/kernel-shared/btrfs_tree.h b/fs/btrfs/kernel-shared/btrfs_tree.h
new file mode 100644 (file)
index 0000000..6a76d1e
--- /dev/null
@@ -0,0 +1,1333 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+/*
+ * Copied from kernel/include/uapi/linux/btrfs_btree.h.
+ *
+ * Only modified the header.
+ */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+#ifndef __BTRFS_TREE_H__
+#define __BTRFS_TREE_H__
+
+#include <linux/types.h>
+
+#define BTRFS_MAGIC 0x4D5F53665248425FULL /* ascii _BHRfS_M, no null */
+
+/*
+ * The max metadata block size (node size).
+ *
+ * This limit is somewhat artificial. The memmove and tree block locking cost
+ * go up with larger node size.
+ */
+#define BTRFS_MAX_METADATA_BLOCKSIZE 65536
+
+/*
+ * We can actually store much bigger names, but lets not confuse the rest
+ * of linux.
+ *
+ * btrfs_dir_item::name_len follows this limitation.
+ */
+#define BTRFS_NAME_LEN 255
+
+/*
+ * Objectids start from here.
+ *
+ * Check btrfs_disk_key for the meaning of objectids.
+ */
+
+/*
+ * Root tree holds pointers to all of the tree roots.
+ * Without special mention, the root tree contains the root bytenr of all other
+ * trees, except the chunk tree and the log tree.
+ *
+ * The super block contains the root bytenr of this tree.
+ */
+#define BTRFS_ROOT_TREE_OBJECTID 1ULL
+
+/*
+ * Extent tree stores information about which extents are in use, and backrefs
+ * for each extent.
+ */
+#define BTRFS_EXTENT_TREE_OBJECTID 2ULL
+
+/*
+ * Chunk tree stores btrfs logical address -> physical address mapping.
+ *
+ * The super block contains part of chunk tree for bootstrap, and contains
+ * the root bytenr of this tree.
+ */
+#define BTRFS_CHUNK_TREE_OBJECTID 3ULL
+
+/*
+ * Device tree stores info about which areas of a given device are in use,
+ * and physical address -> btrfs logical address mapping.
+ */
+#define BTRFS_DEV_TREE_OBJECTID 4ULL
+
+/* The fs tree is the first subvolume tree, storing files and directories. */
+#define BTRFS_FS_TREE_OBJECTID 5ULL
+
+/* Shows the directory objectid inside the root tree. */
+#define BTRFS_ROOT_TREE_DIR_OBJECTID 6ULL
+
+/* Csum tree holds checksums of all the data extents. */
+#define BTRFS_CSUM_TREE_OBJECTID 7ULL
+
+/* Quota tree holds quota configuration and tracking. */
+#define BTRFS_QUOTA_TREE_OBJECTID 8ULL
+
+/* UUID tree stores items that use the BTRFS_UUID_KEY* types. */
+#define BTRFS_UUID_TREE_OBJECTID 9ULL
+
+/* Free space cache tree (v2 space cache) tracks free space in block groups. */
+#define BTRFS_FREE_SPACE_TREE_OBJECTID 10ULL
+
+/* Indicates device stats in the device tree. */
+#define BTRFS_DEV_STATS_OBJECTID 0ULL
+
+/* For storing balance parameters in the root tree. */
+#define BTRFS_BALANCE_OBJECTID -4ULL
+
+/* Orhpan objectid for tracking unlinked/truncated files. */
+#define BTRFS_ORPHAN_OBJECTID -5ULL
+
+/* Does write ahead logging to speed up fsyncs. */
+#define BTRFS_TREE_LOG_OBJECTID -6ULL
+#define BTRFS_TREE_LOG_FIXUP_OBJECTID -7ULL
+
+/* For space balancing. */
+#define BTRFS_TREE_RELOC_OBJECTID -8ULL
+#define BTRFS_DATA_RELOC_TREE_OBJECTID -9ULL
+
+/* Extent checksums, shared between the csum tree and log trees. */
+#define BTRFS_EXTENT_CSUM_OBJECTID -10ULL
+
+/* For storing free space cache (v1 space cache). */
+#define BTRFS_FREE_SPACE_OBJECTID -11ULL
+
+/* The inode number assigned to the special inode for storing free ino cache. */
+#define BTRFS_FREE_INO_OBJECTID -12ULL
+
+/* Dummy objectid represents multiple objectids. */
+#define BTRFS_MULTIPLE_OBJECTIDS -255ULL
+
+/* All files have objectids in this range. */
+#define BTRFS_FIRST_FREE_OBJECTID 256ULL
+#define BTRFS_LAST_FREE_OBJECTID -256ULL
+#define BTRFS_FIRST_CHUNK_TREE_OBJECTID 256ULL
+
+
+/*
+ * The device items go into the chunk tree.
+ *
+ * The key is in the form
+ * (BTRFS_DEV_ITEMS_OBJECTID, BTRFS_DEV_ITEM_KEY,  <device_id>)
+ */
+#define BTRFS_DEV_ITEMS_OBJECTID 1ULL
+
+#define BTRFS_BTREE_INODE_OBJECTID 1
+
+#define BTRFS_EMPTY_SUBVOL_DIR_OBJECTID 2
+
+#define BTRFS_DEV_REPLACE_DEVID 0ULL
+
+/*
+ * Types start from here.
+ *
+ * Check btrfs_disk_key for details about types.
+ */
+
+/*
+ * Inode items have the data typically returned from stat and store other
+ * info about object characteristics.
+ *
+ * There is one for every file and dir in the FS.
+ */
+#define BTRFS_INODE_ITEM_KEY           1
+/* reserve 2-11 close to the inode for later flexibility */
+#define BTRFS_INODE_REF_KEY            12
+#define BTRFS_INODE_EXTREF_KEY         13
+#define BTRFS_XATTR_ITEM_KEY           24
+#define BTRFS_ORPHAN_ITEM_KEY          48
+
+/*
+ * Dir items are the name -> inode pointers in a directory.
+ *
+ * There is one for every name in a directory.
+ */
+#define BTRFS_DIR_LOG_ITEM_KEY  60
+#define BTRFS_DIR_LOG_INDEX_KEY 72
+#define BTRFS_DIR_ITEM_KEY     84
+#define BTRFS_DIR_INDEX_KEY    96
+
+/* Stores info (position, size ...) about a data extent of a file */
+#define BTRFS_EXTENT_DATA_KEY  108
+
+/*
+ * Extent csums are stored in a separate tree and hold csums for
+ * an entire extent on disk.
+ */
+#define BTRFS_EXTENT_CSUM_KEY  128
+
+/*
+ * Root items point to tree roots.
+ *
+ * They are typically in the root tree used by the super block to find all the
+ * other trees.
+ */
+#define BTRFS_ROOT_ITEM_KEY    132
+
+/*
+ * Root backrefs tie subvols and snapshots to the directory entries that
+ * reference them.
+ */
+#define BTRFS_ROOT_BACKREF_KEY 144
+
+/*
+ * Root refs make a fast index for listing all of the snapshots and
+ * subvolumes referenced by a given root.  They point directly to the
+ * directory item in the root that references the subvol.
+ */
+#define BTRFS_ROOT_REF_KEY     156
+
+/*
+ * Extent items are in the extent tree.
+ *
+ * These record which blocks are used, and how many references there are.
+ */
+#define BTRFS_EXTENT_ITEM_KEY  168
+
+/*
+ * The same as the BTRFS_EXTENT_ITEM_KEY, except it's metadata we already know
+ * the length, so we save the level in key->offset instead of the length.
+ */
+#define BTRFS_METADATA_ITEM_KEY        169
+
+#define BTRFS_TREE_BLOCK_REF_KEY       176
+
+#define BTRFS_EXTENT_DATA_REF_KEY      178
+
+#define BTRFS_EXTENT_REF_V0_KEY                180
+
+#define BTRFS_SHARED_BLOCK_REF_KEY     182
+
+#define BTRFS_SHARED_DATA_REF_KEY      184
+
+/*
+ * Block groups give us hints into the extent allocation trees.
+ *
+ * Stores how many free space there is in a block group.
+ */
+#define BTRFS_BLOCK_GROUP_ITEM_KEY 192
+
+/*
+ * Every block group is represented in the free space tree by a free space info
+ * item, which stores some accounting information. It is keyed on
+ * (block_group_start, FREE_SPACE_INFO, block_group_length).
+ */
+#define BTRFS_FREE_SPACE_INFO_KEY 198
+
+/*
+ * A free space extent tracks an extent of space that is free in a block group.
+ * It is keyed on (start, FREE_SPACE_EXTENT, length).
+ */
+#define BTRFS_FREE_SPACE_EXTENT_KEY 199
+
+/*
+ * When a block group becomes very fragmented, we convert it to use bitmaps
+ * instead of extents.
+ *
+ * A free space bitmap is keyed on (start, FREE_SPACE_BITMAP, length).
+ * The corresponding item is a bitmap with (length / sectorsize) bits.
+ */
+#define BTRFS_FREE_SPACE_BITMAP_KEY 200
+
+#define BTRFS_DEV_EXTENT_KEY   204
+#define BTRFS_DEV_ITEM_KEY     216
+#define BTRFS_CHUNK_ITEM_KEY   228
+
+/*
+ * Records the overall state of the qgroups.
+ *
+ * There's only one instance of this key present,
+ * (0, BTRFS_QGROUP_STATUS_KEY, 0)
+ */
+#define BTRFS_QGROUP_STATUS_KEY         240
+/*
+ * Records the currently used space of the qgroup.
+ *
+ * One key per qgroup, (0, BTRFS_QGROUP_INFO_KEY, qgroupid).
+ */
+#define BTRFS_QGROUP_INFO_KEY           242
+
+/*
+ * Contains the user configured limits for the qgroup.
+ *
+ * One key per qgroup, (0, BTRFS_QGROUP_LIMIT_KEY, qgroupid).
+ */
+#define BTRFS_QGROUP_LIMIT_KEY          244
+
+/*
+ * Records the child-parent relationship of qgroups. For
+ * each relation, 2 keys are present:
+ * (childid, BTRFS_QGROUP_RELATION_KEY, parentid)
+ * (parentid, BTRFS_QGROUP_RELATION_KEY, childid)
+ */
+#define BTRFS_QGROUP_RELATION_KEY       246
+
+/* Obsolete name, see BTRFS_TEMPORARY_ITEM_KEY. */
+#define BTRFS_BALANCE_ITEM_KEY 248
+
+/*
+ * The key type for tree items that are stored persistently, but do not need to
+ * exist for extended period of time. The items can exist in any tree.
+ *
+ * [subtype, BTRFS_TEMPORARY_ITEM_KEY, data]
+ *
+ * Existing items:
+ *
+ * - balance status item
+ *   (BTRFS_BALANCE_OBJECTID, BTRFS_TEMPORARY_ITEM_KEY, 0)
+ */
+#define BTRFS_TEMPORARY_ITEM_KEY       248
+
+/* Obsolete name, see BTRFS_PERSISTENT_ITEM_KEY */
+#define BTRFS_DEV_STATS_KEY            249
+
+/*
+ * The key type for tree items that are stored persistently and usually exist
+ * for a long period, eg. filesystem lifetime. The item kinds can be status
+ * information, stats or preference values. The item can exist in any tree.
+ *
+ * [subtype, BTRFS_PERSISTENT_ITEM_KEY, data]
+ *
+ * Existing items:
+ *
+ * - device statistics, store IO stats in the device tree, one key for all
+ *   stats
+ *   (BTRFS_DEV_STATS_OBJECTID, BTRFS_DEV_STATS_KEY, 0)
+ */
+#define BTRFS_PERSISTENT_ITEM_KEY      249
+
+/*
+ * Persistently stores the device replace state in the device tree.
+ *
+ * The key is built like this: (0, BTRFS_DEV_REPLACE_KEY, 0).
+ */
+#define BTRFS_DEV_REPLACE_KEY  250
+
+/*
+ * Stores items that allow to quickly map UUIDs to something else.
+ *
+ * These items are part of the filesystem UUID tree.
+ * The key is built like this:
+ * (UUID_upper_64_bits, BTRFS_UUID_KEY*, UUID_lower_64_bits).
+ */
+#define BTRFS_UUID_KEY_SUBVOL  251     /* for UUIDs assigned to subvols */
+#define BTRFS_UUID_KEY_RECEIVED_SUBVOL 252     /* for UUIDs assigned to
+                                                * received subvols */
+
+/*
+ * String items are for debugging.
+ *
+ * They just store a short string of data in the FS.
+ */
+#define BTRFS_STRING_ITEM_KEY  253
+
+
+
+/* 32 bytes in various csum fields */
+#define BTRFS_CSUM_SIZE 32
+
+/* Csum types */
+enum btrfs_csum_type {
+       BTRFS_CSUM_TYPE_CRC32   = 0,
+       BTRFS_CSUM_TYPE_XXHASH  = 1,
+       BTRFS_CSUM_TYPE_SHA256  = 2,
+       BTRFS_CSUM_TYPE_BLAKE2  = 3,
+};
+
+/*
+ * Flags definitions for directory entry item type.
+ *
+ * Used by:
+ * struct btrfs_dir_item.type
+ *
+ * Values 0..7 must match common file type values in fs_types.h.
+ */
+#define BTRFS_FT_UNKNOWN       0
+#define BTRFS_FT_REG_FILE      1
+#define BTRFS_FT_DIR           2
+#define BTRFS_FT_CHRDEV                3
+#define BTRFS_FT_BLKDEV                4
+#define BTRFS_FT_FIFO          5
+#define BTRFS_FT_SOCK          6
+#define BTRFS_FT_SYMLINK       7
+#define BTRFS_FT_XATTR         8
+#define BTRFS_FT_MAX           9
+
+#define BTRFS_FSID_SIZE 16
+#define BTRFS_UUID_SIZE 16
+
+/*
+ * The key defines the order in the tree, and so it also defines (optimal)
+ * block layout.
+ *
+ * Objectid and offset are interpreted based on type.
+ * While normally for objectid, it either represents a root number, or an
+ * inode number.
+ *
+ * Type tells us things about the object, and is a kind of stream selector.
+ * Check the following URL for full references about btrfs_disk_key/btrfs_key:
+ * https://btrfs.wiki.kernel.org/index.php/Btree_Items
+ *
+ * btrfs_disk_key is in disk byte order.  struct btrfs_key is always
+ * in cpu native order.  Otherwise they are identical and their sizes
+ * should be the same (ie both packed)
+ */
+struct btrfs_disk_key {
+       __le64 objectid;
+       __u8 type;
+       __le64 offset;
+} __attribute__ ((__packed__));
+
+struct btrfs_key {
+       __u64 objectid;
+       __u8 type;
+       __u64 offset;
+} __attribute__ ((__packed__));
+
+struct btrfs_dev_item {
+       /* The internal btrfs device id */
+       __le64 devid;
+
+       /* Size of the device */
+       __le64 total_bytes;
+
+       /* Bytes used */
+       __le64 bytes_used;
+
+       /* Optimal io alignment for this device */
+       __le32 io_align;
+
+       /* Optimal io width for this device */
+       __le32 io_width;
+
+       /* Minimal io size for this device */
+       __le32 sector_size;
+
+       /* Type and info about this device */
+       __le64 type;
+
+       /* Expected generation for this device */
+       __le64 generation;
+
+       /*
+        * Starting byte of this partition on the device,
+        * to allow for stripe alignment in the future.
+        */
+       __le64 start_offset;
+
+       /* Grouping information for allocation decisions */
+       __le32 dev_group;
+
+       /* Optimal seek speed 0-100 where 100 is fastest */
+       __u8 seek_speed;
+
+       /* Optimal bandwidth 0-100 where 100 is fastest */
+       __u8 bandwidth;
+
+       /* Btrfs generated uuid for this device */
+       __u8 uuid[BTRFS_UUID_SIZE];
+
+       /* UUID of FS who owns this device */
+       __u8 fsid[BTRFS_UUID_SIZE];
+} __attribute__ ((__packed__));
+
+struct btrfs_stripe {
+       __le64 devid;
+       __le64 offset;
+       __u8 dev_uuid[BTRFS_UUID_SIZE];
+} __attribute__ ((__packed__));
+
+struct btrfs_chunk {
+       /* Size of this chunk in bytes */
+       __le64 length;
+
+       /* Objectid of the root referencing this chunk */
+       __le64 owner;
+
+       __le64 stripe_len;
+       __le64 type;
+
+       /* Optimal io alignment for this chunk */
+       __le32 io_align;
+
+       /* Optimal io width for this chunk */
+       __le32 io_width;
+
+       /* Minimal io size for this chunk */
+       __le32 sector_size;
+
+       /*
+        * 2^16 stripes is quite a lot, a second limit is the size of a single
+        * item in the btree.
+        */
+       __le16 num_stripes;
+
+       /* Sub stripes only matter for raid10 */
+       __le16 sub_stripes;
+       struct btrfs_stripe stripe;
+       /* additional stripes go here */
+} __attribute__ ((__packed__));
+
+#define BTRFS_FREE_SPACE_EXTENT        1
+#define BTRFS_FREE_SPACE_BITMAP        2
+
+struct btrfs_free_space_entry {
+       __le64 offset;
+       __le64 bytes;
+       __u8 type;
+} __attribute__ ((__packed__));
+
+struct btrfs_free_space_header {
+       struct btrfs_disk_key location;
+       __le64 generation;
+       __le64 num_entries;
+       __le64 num_bitmaps;
+} __attribute__ ((__packed__));
+
+#define BTRFS_HEADER_FLAG_WRITTEN      (1ULL << 0)
+#define BTRFS_HEADER_FLAG_RELOC                (1ULL << 1)
+
+/* Super block flags */
+/* Errors detected */
+#define BTRFS_SUPER_FLAG_ERROR         (1ULL << 2)
+
+#define BTRFS_SUPER_FLAG_SEEDING       (1ULL << 32)
+#define BTRFS_SUPER_FLAG_METADUMP      (1ULL << 33)
+#define BTRFS_SUPER_FLAG_METADUMP_V2   (1ULL << 34)
+#define BTRFS_SUPER_FLAG_CHANGING_FSID (1ULL << 35)
+#define BTRFS_SUPER_FLAG_CHANGING_FSID_V2 (1ULL << 36)
+
+
+/*
+ * Items in the extent tree are used to record the objectid of the
+ * owner of the block and the number of references.
+ */
+struct btrfs_extent_item {
+       __le64 refs;
+       __le64 generation;
+       __le64 flags;
+} __attribute__ ((__packed__));
+
+struct btrfs_extent_item_v0 {
+       __le32 refs;
+} __attribute__ ((__packed__));
+
+
+#define BTRFS_EXTENT_FLAG_DATA         (1ULL << 0)
+#define BTRFS_EXTENT_FLAG_TREE_BLOCK   (1ULL << 1)
+
+/* Use full backrefs for extent pointers in the block */
+#define BTRFS_BLOCK_FLAG_FULL_BACKREF  (1ULL << 8)
+
+/*
+ * This flag is only used internally by scrub and may be changed at any time
+ * it is only declared here to avoid collisions.
+ */
+#define BTRFS_EXTENT_FLAG_SUPER                (1ULL << 48)
+
+struct btrfs_tree_block_info {
+       struct btrfs_disk_key key;
+       __u8 level;
+} __attribute__ ((__packed__));
+
+struct btrfs_extent_data_ref {
+       __le64 root;
+       __le64 objectid;
+       __le64 offset;
+       __le32 count;
+} __attribute__ ((__packed__));
+
+struct btrfs_shared_data_ref {
+       __le32 count;
+} __attribute__ ((__packed__));
+
+struct btrfs_extent_inline_ref {
+       __u8 type;
+       __le64 offset;
+} __attribute__ ((__packed__));
+
+/* Old style backrefs item */
+struct btrfs_extent_ref_v0 {
+       __le64 root;
+       __le64 generation;
+       __le64 objectid;
+       __le32 count;
+} __attribute__ ((__packed__));
+
+
+/* Dev extents record used space on individual devices.
+ *
+ * The owner field points back to the chunk allocation mapping tree that
+ * allocated the extent.
+ * The chunk tree uuid field is a way to double check the owner.
+ */
+struct btrfs_dev_extent {
+       __le64 chunk_tree;
+       __le64 chunk_objectid;
+       __le64 chunk_offset;
+       __le64 length;
+       __u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
+} __attribute__ ((__packed__));
+
+struct btrfs_inode_ref {
+       __le64 index;
+       __le16 name_len;
+       /* Name goes here */
+} __attribute__ ((__packed__));
+
+struct btrfs_inode_extref {
+       __le64 parent_objectid;
+       __le64 index;
+       __le16 name_len;
+       __u8   name[0];
+       /* Name goes here */
+} __attribute__ ((__packed__));
+
+struct btrfs_timespec {
+       __le64 sec;
+       __le32 nsec;
+} __attribute__ ((__packed__));
+
+/* Inode flags */
+#define BTRFS_INODE_NODATASUM          (1 << 0)
+#define BTRFS_INODE_NODATACOW          (1 << 1)
+#define BTRFS_INODE_READONLY           (1 << 2)
+#define BTRFS_INODE_NOCOMPRESS         (1 << 3)
+#define BTRFS_INODE_PREALLOC           (1 << 4)
+#define BTRFS_INODE_SYNC               (1 << 5)
+#define BTRFS_INODE_IMMUTABLE          (1 << 6)
+#define BTRFS_INODE_APPEND             (1 << 7)
+#define BTRFS_INODE_NODUMP             (1 << 8)
+#define BTRFS_INODE_NOATIME            (1 << 9)
+#define BTRFS_INODE_DIRSYNC            (1 << 10)
+#define BTRFS_INODE_COMPRESS           (1 << 11)
+
+#define BTRFS_INODE_ROOT_ITEM_INIT     (1 << 31)
+
+#define BTRFS_INODE_FLAG_MASK                                          \
+       (BTRFS_INODE_NODATASUM |                                        \
+        BTRFS_INODE_NODATACOW |                                        \
+        BTRFS_INODE_READONLY |                                         \
+        BTRFS_INODE_NOCOMPRESS |                                       \
+        BTRFS_INODE_PREALLOC |                                         \
+        BTRFS_INODE_SYNC |                                             \
+        BTRFS_INODE_IMMUTABLE |                                        \
+        BTRFS_INODE_APPEND |                                           \
+        BTRFS_INODE_NODUMP |                                           \
+        BTRFS_INODE_NOATIME |                                          \
+        BTRFS_INODE_DIRSYNC |                                          \
+        BTRFS_INODE_COMPRESS |                                         \
+        BTRFS_INODE_ROOT_ITEM_INIT)
+
+struct btrfs_inode_item {
+       /* Nfs style generation number */
+       __le64 generation;
+       /* Transid that last touched this inode */
+       __le64 transid;
+       __le64 size;
+       __le64 nbytes;
+       __le64 block_group;
+       __le32 nlink;
+       __le32 uid;
+       __le32 gid;
+       __le32 mode;
+       __le64 rdev;
+       __le64 flags;
+
+       /* Modification sequence number for NFS */
+       __le64 sequence;
+
+       /*
+        * A little future expansion, for more than this we can just grow the
+        * inode item and version it
+        */
+       __le64 reserved[4];
+       struct btrfs_timespec atime;
+       struct btrfs_timespec ctime;
+       struct btrfs_timespec mtime;
+       struct btrfs_timespec otime;
+} __attribute__ ((__packed__));
+
+struct btrfs_dir_log_item {
+       __le64 end;
+} __attribute__ ((__packed__));
+
+struct btrfs_dir_item {
+       struct btrfs_disk_key location;
+       __le64 transid;
+       __le16 data_len;
+       __le16 name_len;
+       __u8 type;
+} __attribute__ ((__packed__));
+
+#define BTRFS_ROOT_SUBVOL_RDONLY       (1ULL << 0)
+
+/*
+ * Internal in-memory flag that a subvolume has been marked for deletion but
+ * still visible as a directory
+ */
+#define BTRFS_ROOT_SUBVOL_DEAD         (1ULL << 48)
+
+struct btrfs_root_item {
+       struct btrfs_inode_item inode;
+       __le64 generation;
+       __le64 root_dirid;
+       __le64 bytenr;
+       __le64 byte_limit;
+       __le64 bytes_used;
+       __le64 last_snapshot;
+       __le64 flags;
+       __le32 refs;
+       struct btrfs_disk_key drop_progress;
+       __u8 drop_level;
+       __u8 level;
+
+       /*
+        * The following fields appear after subvol_uuids+subvol_times
+        * were introduced.
+        */
+
+       /*
+        * This generation number is used to test if the new fields are valid
+        * and up to date while reading the root item. Every time the root item
+        * is written out, the "generation" field is copied into this field. If
+        * anyone ever mounted the fs with an older kernel, we will have
+        * mismatching generation values here and thus must invalidate the
+        * new fields. See btrfs_update_root and btrfs_find_last_root for
+        * details.
+        * The offset of generation_v2 is also used as the start for the memset
+        * when invalidating the fields.
+        */
+       __le64 generation_v2;
+       __u8 uuid[BTRFS_UUID_SIZE];
+       __u8 parent_uuid[BTRFS_UUID_SIZE];
+       __u8 received_uuid[BTRFS_UUID_SIZE];
+       __le64 ctransid; /* Updated when an inode changes */
+       __le64 otransid; /* Trans when created */
+       __le64 stransid; /* Trans when sent. Non-zero for received subvol. */
+       __le64 rtransid; /* Trans when received. Non-zero for received subvol.*/
+       struct btrfs_timespec ctime;
+       struct btrfs_timespec otime;
+       struct btrfs_timespec stime;
+       struct btrfs_timespec rtime;
+       __le64 reserved[8]; /* For future */
+} __attribute__ ((__packed__));
+
+/* This is used for both forward and backward root refs */
+struct btrfs_root_ref {
+       __le64 dirid;
+       __le64 sequence;
+       __le16 name_len;
+} __attribute__ ((__packed__));
+
+struct btrfs_disk_balance_args {
+       /*
+        * Profiles to operate on.
+        *
+        * SINGLE is denoted by BTRFS_AVAIL_ALLOC_BIT_SINGLE.
+        */
+       __le64 profiles;
+
+       /*
+        * Usage filter
+        * BTRFS_BALANCE_ARGS_USAGE with a single value means '0..N'
+        * BTRFS_BALANCE_ARGS_USAGE_RANGE - range syntax, min..max
+        */
+       union {
+               __le64 usage;
+               struct {
+                       __le32 usage_min;
+                       __le32 usage_max;
+               };
+       };
+
+       /* Devid filter */
+       __le64 devid;
+
+       /* Devid subset filter [pstart..pend) */
+       __le64 pstart;
+       __le64 pend;
+
+       /* Btrfs virtual address space subset filter [vstart..vend) */
+       __le64 vstart;
+       __le64 vend;
+
+       /*
+        * Profile to convert to.
+        *
+        * SINGLE is denoted by BTRFS_AVAIL_ALLOC_BIT_SINGLE.
+        */
+       __le64 target;
+
+       /* BTRFS_BALANCE_ARGS_* */
+       __le64 flags;
+
+       /*
+        * BTRFS_BALANCE_ARGS_LIMIT with value 'limit'.
+        * BTRFS_BALANCE_ARGS_LIMIT_RANGE - the extend version can use minimum
+        * and maximum.
+        */
+       union {
+               __le64 limit;
+               struct {
+                       __le32 limit_min;
+                       __le32 limit_max;
+               };
+       };
+
+       /*
+        * Process chunks that cross stripes_min..stripes_max devices,
+        * BTRFS_BALANCE_ARGS_STRIPES_RANGE.
+        */
+       __le32 stripes_min;
+       __le32 stripes_max;
+
+       __le64 unused[6];
+} __attribute__ ((__packed__));
+
+/*
+ * Stores balance parameters to disk so that balance can be properly
+ * resumed after crash or unmount.
+ */
+struct btrfs_balance_item {
+       /* BTRFS_BALANCE_* */
+       __le64 flags;
+
+       struct btrfs_disk_balance_args data;
+       struct btrfs_disk_balance_args meta;
+       struct btrfs_disk_balance_args sys;
+
+       __le64 unused[4];
+} __attribute__ ((__packed__));
+
+enum {
+       BTRFS_FILE_EXTENT_INLINE   = 0,
+       BTRFS_FILE_EXTENT_REG      = 1,
+       BTRFS_FILE_EXTENT_PREALLOC = 2,
+       BTRFS_NR_FILE_EXTENT_TYPES = 3,
+};
+
+enum btrfs_compression_type {
+       BTRFS_COMPRESS_NONE  = 0,
+       BTRFS_COMPRESS_ZLIB  = 1,
+       BTRFS_COMPRESS_LZO   = 2,
+       BTRFS_COMPRESS_ZSTD  = 3,
+       BTRFS_NR_COMPRESS_TYPES = 4,
+};
+
+struct btrfs_file_extent_item {
+       /* Transaction id that created this extent */
+       __le64 generation;
+       /*
+        * Max number of bytes to hold this extent in ram.
+        *
+        * When we split a compressed extent we can't know how big each of the
+        * resulting pieces will be.  So, this is an upper limit on the size of
+        * the extent in ram instead of an exact limit.
+        */
+       __le64 ram_bytes;
+
+       /*
+        * 32 bits for the various ways we might encode the data,
+        * including compression and encryption.  If any of these
+        * are set to something a given disk format doesn't understand
+        * it is treated like an incompat flag for reading and writing,
+        * but not for stat.
+        */
+       __u8 compression;
+       __u8 encryption;
+       __le16 other_encoding; /* Spare for later use */
+
+       /* Are we inline data or a real extent? */
+       __u8 type;
+
+       /*
+        * Disk space consumed by the extent, checksum blocks are not included
+        * in these numbers
+        *
+        * At this offset in the structure, the inline extent data start.
+        */
+       __le64 disk_bytenr;
+       __le64 disk_num_bytes;
+
+       /*
+        * The logical offset inside the file extent.
+        *
+        * This allows a file extent to point into the middle of an existing
+        * extent on disk, sharing it between two snapshots (useful if some
+        * bytes in the middle of the extent have changed).
+        */
+       __le64 offset;
+
+       /*
+        * The logical number of bytes this file extent is referencing (no
+        * csums included).
+        *
+        * This always reflects the size uncompressed and without encoding.
+        */
+       __le64 num_bytes;
+
+} __attribute__ ((__packed__));
+
+struct btrfs_csum_item {
+       __u8 csum;
+} __attribute__ ((__packed__));
+
+enum btrfs_dev_stat_values {
+       /* Disk I/O failure stats */
+       BTRFS_DEV_STAT_WRITE_ERRS, /* EIO or EREMOTEIO from lower layers */
+       BTRFS_DEV_STAT_READ_ERRS, /* EIO or EREMOTEIO from lower layers */
+       BTRFS_DEV_STAT_FLUSH_ERRS, /* EIO or EREMOTEIO from lower layers */
+
+       /* Stats for indirect indications for I/O failures */
+       BTRFS_DEV_STAT_CORRUPTION_ERRS, /* Checksum error, bytenr error or
+                                        * contents is illegal: this is an
+                                        * indication that the block was damaged
+                                        * during read or write, or written to
+                                        * wrong location or read from wrong
+                                        * location */
+       BTRFS_DEV_STAT_GENERATION_ERRS, /* An indication that blocks have not
+                                        * been written */
+
+       BTRFS_DEV_STAT_VALUES_MAX
+};
+
+struct btrfs_dev_stats_item {
+       /*
+        * Grow this item struct at the end for future enhancements and keep
+        * the existing values unchanged.
+        */
+       __le64 values[BTRFS_DEV_STAT_VALUES_MAX];
+} __attribute__ ((__packed__));
+
+#define BTRFS_DEV_REPLACE_ITEM_CONT_READING_FROM_SRCDEV_MODE_ALWAYS    0
+#define BTRFS_DEV_REPLACE_ITEM_CONT_READING_FROM_SRCDEV_MODE_AVOID     1
+
+struct btrfs_dev_replace_item {
+       /*
+        * Grow this item struct at the end for future enhancements and keep
+        * the existing values unchanged.
+        */
+       __le64 src_devid;
+       __le64 cursor_left;
+       __le64 cursor_right;
+       __le64 cont_reading_from_srcdev_mode;
+
+       __le64 replace_state;
+       __le64 time_started;
+       __le64 time_stopped;
+       __le64 num_write_errors;
+       __le64 num_uncorrectable_read_errors;
+} __attribute__ ((__packed__));
+
+/* Different types of block groups (and chunks) */
+#define BTRFS_BLOCK_GROUP_DATA         (1ULL << 0)
+#define BTRFS_BLOCK_GROUP_SYSTEM       (1ULL << 1)
+#define BTRFS_BLOCK_GROUP_METADATA     (1ULL << 2)
+#define BTRFS_BLOCK_GROUP_RAID0                (1ULL << 3)
+#define BTRFS_BLOCK_GROUP_RAID1                (1ULL << 4)
+#define BTRFS_BLOCK_GROUP_DUP          (1ULL << 5)
+#define BTRFS_BLOCK_GROUP_RAID10       (1ULL << 6)
+#define BTRFS_BLOCK_GROUP_RAID5         (1ULL << 7)
+#define BTRFS_BLOCK_GROUP_RAID6         (1ULL << 8)
+#define BTRFS_BLOCK_GROUP_RAID1C3       (1ULL << 9)
+#define BTRFS_BLOCK_GROUP_RAID1C4       (1ULL << 10)
+#define BTRFS_BLOCK_GROUP_RESERVED     (BTRFS_AVAIL_ALLOC_BIT_SINGLE | \
+                                        BTRFS_SPACE_INFO_GLOBAL_RSV)
+
+enum btrfs_raid_types {
+       BTRFS_RAID_RAID10,
+       BTRFS_RAID_RAID1,
+       BTRFS_RAID_DUP,
+       BTRFS_RAID_RAID0,
+       BTRFS_RAID_SINGLE,
+       BTRFS_RAID_RAID5,
+       BTRFS_RAID_RAID6,
+       BTRFS_RAID_RAID1C3,
+       BTRFS_RAID_RAID1C4,
+       BTRFS_NR_RAID_TYPES
+};
+
+#define BTRFS_BLOCK_GROUP_TYPE_MASK    (BTRFS_BLOCK_GROUP_DATA |    \
+                                        BTRFS_BLOCK_GROUP_SYSTEM |  \
+                                        BTRFS_BLOCK_GROUP_METADATA)
+
+#define BTRFS_BLOCK_GROUP_PROFILE_MASK (BTRFS_BLOCK_GROUP_RAID0 |   \
+                                        BTRFS_BLOCK_GROUP_RAID1 |   \
+                                        BTRFS_BLOCK_GROUP_RAID1C3 | \
+                                        BTRFS_BLOCK_GROUP_RAID1C4 | \
+                                        BTRFS_BLOCK_GROUP_RAID5 |   \
+                                        BTRFS_BLOCK_GROUP_RAID6 |   \
+                                        BTRFS_BLOCK_GROUP_DUP |     \
+                                        BTRFS_BLOCK_GROUP_RAID10)
+#define BTRFS_BLOCK_GROUP_RAID56_MASK  (BTRFS_BLOCK_GROUP_RAID5 |   \
+                                        BTRFS_BLOCK_GROUP_RAID6)
+
+#define BTRFS_BLOCK_GROUP_RAID1_MASK   (BTRFS_BLOCK_GROUP_RAID1 |   \
+                                        BTRFS_BLOCK_GROUP_RAID1C3 | \
+                                        BTRFS_BLOCK_GROUP_RAID1C4)
+
+/*
+ * We need a bit for restriper to be able to tell when chunks of type
+ * SINGLE are available.  This "extended" profile format is used in
+ * fs_info->avail_*_alloc_bits (in-memory) and balance item fields
+ * (on-disk).  The corresponding on-disk bit in chunk.type is reserved
+ * to avoid remappings between two formats in future.
+ */
+#define BTRFS_AVAIL_ALLOC_BIT_SINGLE   (1ULL << 48)
+
+/*
+ * A fake block group type that is used to communicate global block reserve
+ * size to userspace via the SPACE_INFO ioctl.
+ */
+#define BTRFS_SPACE_INFO_GLOBAL_RSV    (1ULL << 49)
+
+#define BTRFS_EXTENDED_PROFILE_MASK    (BTRFS_BLOCK_GROUP_PROFILE_MASK | \
+                                        BTRFS_AVAIL_ALLOC_BIT_SINGLE)
+
+static inline __u64 chunk_to_extended(__u64 flags)
+{
+       if ((flags & BTRFS_BLOCK_GROUP_PROFILE_MASK) == 0)
+               flags |= BTRFS_AVAIL_ALLOC_BIT_SINGLE;
+
+       return flags;
+}
+static inline __u64 extended_to_chunk(__u64 flags)
+{
+       return flags & ~BTRFS_AVAIL_ALLOC_BIT_SINGLE;
+}
+
+struct btrfs_block_group_item {
+       __le64 used;
+       __le64 chunk_objectid;
+       __le64 flags;
+} __attribute__ ((__packed__));
+
+struct btrfs_free_space_info {
+       __le32 extent_count;
+       __le32 flags;
+} __attribute__ ((__packed__));
+
+#define BTRFS_FREE_SPACE_USING_BITMAPS (1ULL << 0)
+
+#define BTRFS_QGROUP_LEVEL_SHIFT               48
+static inline __u64 btrfs_qgroup_level(__u64 qgroupid)
+{
+       return qgroupid >> BTRFS_QGROUP_LEVEL_SHIFT;
+}
+
+/* Is subvolume quota turned on? */
+#define BTRFS_QGROUP_STATUS_FLAG_ON            (1ULL << 0)
+
+/* Is qgroup rescan running? */
+#define BTRFS_QGROUP_STATUS_FLAG_RESCAN                (1ULL << 1)
+
+/*
+ * Some qgroup entries are known to be out of date, either because the
+ * configuration has changed in a way that makes a rescan necessary, or
+ * because the fs has been mounted with a non-qgroup-aware version.
+ */
+#define BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT  (1ULL << 2)
+
+#define BTRFS_QGROUP_STATUS_VERSION        1
+
+struct btrfs_qgroup_status_item {
+       __le64 version;
+       /*
+        * The generation is updated during every commit. As older
+        * versions of btrfs are not aware of qgroups, it will be
+        * possible to detect inconsistencies by checking the
+        * generation on mount time.
+        */
+       __le64 generation;
+
+       /* Flag definitions see above */
+       __le64 flags;
+
+       /*
+        * Only used during scanning to record the progress of the scan.
+        * It contains a logical address.
+        */
+       __le64 rescan;
+} __attribute__ ((__packed__));
+
+struct btrfs_qgroup_info_item {
+       __le64 generation;
+       __le64 rfer;
+       __le64 rfer_cmpr;
+       __le64 excl;
+       __le64 excl_cmpr;
+} __attribute__ ((__packed__));
+
+/*
+ * Flags definition for qgroup limits
+ *
+ * Used by:
+ * struct btrfs_qgroup_limit.flags
+ * struct btrfs_qgroup_limit_item.flags
+ */
+#define BTRFS_QGROUP_LIMIT_MAX_RFER    (1ULL << 0)
+#define BTRFS_QGROUP_LIMIT_MAX_EXCL    (1ULL << 1)
+#define BTRFS_QGROUP_LIMIT_RSV_RFER    (1ULL << 2)
+#define BTRFS_QGROUP_LIMIT_RSV_EXCL    (1ULL << 3)
+#define BTRFS_QGROUP_LIMIT_RFER_CMPR   (1ULL << 4)
+#define BTRFS_QGROUP_LIMIT_EXCL_CMPR   (1ULL << 5)
+
+struct btrfs_qgroup_limit_item {
+       /* Only updated when any of the other values change. */
+       __le64 flags;
+       __le64 max_rfer;
+       __le64 max_excl;
+       __le64 rsv_rfer;
+       __le64 rsv_excl;
+} __attribute__ ((__packed__));
+
+/*
+ * Just in case we somehow lose the roots and are not able to mount,
+ * we store an array of the roots from previous transactions in the super.
+ */
+#define BTRFS_NUM_BACKUP_ROOTS 4
+struct btrfs_root_backup {
+       __le64 tree_root;
+       __le64 tree_root_gen;
+
+       __le64 chunk_root;
+       __le64 chunk_root_gen;
+
+       __le64 extent_root;
+       __le64 extent_root_gen;
+
+       __le64 fs_root;
+       __le64 fs_root_gen;
+
+       __le64 dev_root;
+       __le64 dev_root_gen;
+
+       __le64 csum_root;
+       __le64 csum_root_gen;
+
+       __le64 total_bytes;
+       __le64 bytes_used;
+       __le64 num_devices;
+       /* future */
+       __le64 unused_64[4];
+
+       u8 tree_root_level;
+       u8 chunk_root_level;
+       u8 extent_root_level;
+       u8 fs_root_level;
+       u8 dev_root_level;
+       u8 csum_root_level;
+       /* future and to align */
+       u8 unused_8[10];
+} __attribute__ ((__packed__));
+
+/*
+ * This is a very generous portion of the super block, giving us room to
+ * translate 14 chunks with 3 stripes each.
+ */
+#define BTRFS_SYSTEM_CHUNK_ARRAY_SIZE 2048
+
+#define BTRFS_LABEL_SIZE 256
+
+/* The super block basically lists the main trees of the FS. */
+struct btrfs_super_block {
+       /* The first 4 fields must match struct btrfs_header */
+       u8 csum[BTRFS_CSUM_SIZE];
+       /* FS specific UUID, visible to user */
+       u8 fsid[BTRFS_FSID_SIZE];
+       __le64 bytenr; /* this block number */
+       __le64 flags;
+
+       /* Allowed to be different from the btrfs_header from here own down. */
+       __le64 magic;
+       __le64 generation;
+       __le64 root;
+       __le64 chunk_root;
+       __le64 log_root;
+
+       /* This will help find the new super based on the log root. */
+       __le64 log_root_transid;
+       __le64 total_bytes;
+       __le64 bytes_used;
+       __le64 root_dir_objectid;
+       __le64 num_devices;
+       __le32 sectorsize;
+       __le32 nodesize;
+       __le32 __unused_leafsize;
+       __le32 stripesize;
+       __le32 sys_chunk_array_size;
+       __le64 chunk_root_generation;
+       __le64 compat_flags;
+       __le64 compat_ro_flags;
+       __le64 incompat_flags;
+       __le16 csum_type;
+       u8 root_level;
+       u8 chunk_root_level;
+       u8 log_root_level;
+       struct btrfs_dev_item dev_item;
+
+       char label[BTRFS_LABEL_SIZE];
+
+       __le64 cache_generation;
+       __le64 uuid_tree_generation;
+
+       /* The UUID written into btree blocks */
+       u8 metadata_uuid[BTRFS_FSID_SIZE];
+
+       /* Future expansion */
+       __le64 reserved[28];
+       u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE];
+       struct btrfs_root_backup super_roots[BTRFS_NUM_BACKUP_ROOTS];
+} __attribute__ ((__packed__));
+
+/*
+ * Feature flags
+ *
+ * Used by:
+ * struct btrfs_super_block::(compat|compat_ro|incompat)_flags
+ * struct btrfs_ioctl_feature_flags
+ */
+#define BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE                (1ULL << 0)
+
+/*
+ * Older kernels (< 4.9) on big-endian systems produced broken free space tree
+ * bitmaps, and btrfs-progs also used to corrupt the free space tree (versions
+ * < 4.7.3).  If this bit is clear, then the free space tree cannot be trusted.
+ * btrfs-progs can also intentionally clear this bit to ask the kernel to
+ * rebuild the free space tree, however this might not work on older kernels
+ * that do not know about this bit. If not sure, clear the cache manually on
+ * first mount when booting older kernel versions.
+ */
+#define BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID  (1ULL << 1)
+
+#define BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF   (1ULL << 0)
+#define BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL  (1ULL << 1)
+#define BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS    (1ULL << 2)
+#define BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO    (1ULL << 3)
+#define BTRFS_FEATURE_INCOMPAT_COMPRESS_ZSTD   (1ULL << 4)
+
+/*
+ * Older kernels tried to do bigger metadata blocks, but the
+ * code was pretty buggy.  Lets not let them try anymore.
+ */
+#define BTRFS_FEATURE_INCOMPAT_BIG_METADATA    (1ULL << 5)
+
+#define BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF   (1ULL << 6)
+#define BTRFS_FEATURE_INCOMPAT_RAID56          (1ULL << 7)
+#define BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA (1ULL << 8)
+#define BTRFS_FEATURE_INCOMPAT_NO_HOLES                (1ULL << 9)
+#define BTRFS_FEATURE_INCOMPAT_METADATA_UUID   (1ULL << 10)
+#define BTRFS_FEATURE_INCOMPAT_RAID1C34                (1ULL << 11)
+
+/*
+ * Compat flags that we support.
+ *
+ * If any incompat flags are set other than the ones specified below then we
+ * will fail to mount.
+ */
+#define BTRFS_FEATURE_COMPAT_SUPP              0ULL
+#define BTRFS_FEATURE_COMPAT_SAFE_SET          0ULL
+#define BTRFS_FEATURE_COMPAT_SAFE_CLEAR                0ULL
+
+#define BTRFS_FEATURE_COMPAT_RO_SUPP                   \
+       (BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE |      \
+        BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE_VALID)
+
+#define BTRFS_FEATURE_COMPAT_RO_SAFE_SET       0ULL
+#define BTRFS_FEATURE_COMPAT_RO_SAFE_CLEAR     0ULL
+
+#define BTRFS_FEATURE_INCOMPAT_SUPP                    \
+       (BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF |         \
+        BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL |        \
+        BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS |          \
+        BTRFS_FEATURE_INCOMPAT_BIG_METADATA |          \
+        BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO |          \
+        BTRFS_FEATURE_INCOMPAT_COMPRESS_ZSTD |         \
+        BTRFS_FEATURE_INCOMPAT_RAID56 |                \
+        BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF |         \
+        BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA |       \
+        BTRFS_FEATURE_INCOMPAT_NO_HOLES        |       \
+        BTRFS_FEATURE_INCOMPAT_METADATA_UUID   |       \
+        BTRFS_FEATURE_INCOMPAT_RAID1C34)
+
+#define BTRFS_FEATURE_INCOMPAT_SAFE_SET                        \
+       (BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF)
+#define BTRFS_FEATURE_INCOMPAT_SAFE_CLEAR              0ULL
+
+#define BTRFS_BACKREF_REV_MAX          256
+#define BTRFS_BACKREF_REV_SHIFT                56
+#define BTRFS_BACKREF_REV_MASK         (((u64)BTRFS_BACKREF_REV_MAX - 1) << \
+                                        BTRFS_BACKREF_REV_SHIFT)
+
+#define BTRFS_OLD_BACKREF_REV          0
+#define BTRFS_MIXED_BACKREF_REV                1
+
+#define BTRFS_MAX_LEVEL 8
+
+/* Every tree block (leaf or node) starts with this header. */
+struct btrfs_header {
+       /* These first four must match the super block */
+       u8 csum[BTRFS_CSUM_SIZE];
+       u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */
+       __le64 bytenr; /* Which block this node is supposed to live in */
+       __le64 flags;
+
+       /* Allowed to be different from the super from here on down. */
+       u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
+       __le64 generation;
+       __le64 owner;
+       __le32 nritems;
+       u8 level;
+} __attribute__ ((__packed__));
+
+/*
+ * A leaf is full of items. Offset and size tell us where to find
+ * the item in the leaf (relative to the start of the data area).
+ */
+struct btrfs_item {
+       struct btrfs_disk_key key;
+       __le32 offset;
+       __le32 size;
+} __attribute__ ((__packed__));
+
+/*
+ * leaves have an item area and a data area:
+ * [item0, item1....itemN] [free space] [dataN...data1, data0]
+ *
+ * The data is separate from the items to get the keys closer together
+ * during searches.
+ */
+struct btrfs_leaf {
+       struct btrfs_header header;
+       struct btrfs_item items[];
+} __attribute__ ((__packed__));
+
+/*
+ * All non-leaf blocks are nodes, they hold only keys and pointers to children
+ * blocks.
+ */
+struct btrfs_key_ptr {
+       struct btrfs_disk_key key;
+       __le64 blockptr;
+       __le64 generation;
+} __attribute__ ((__packed__));
+
+struct btrfs_node {
+       struct btrfs_header header;
+       struct btrfs_key_ptr ptrs[];
+} __attribute__ ((__packed__));
+
+#endif /* __BTRFS_TREE_H__ */
diff --git a/fs/btrfs/root-tree.c b/fs/btrfs/root-tree.c
new file mode 100644 (file)
index 0000000..a39ad72
--- /dev/null
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+#include "ctree.h"
+
+int btrfs_find_last_root(struct btrfs_root *root, u64 objectid,
+                       struct btrfs_root_item *item, struct btrfs_key *key)
+{
+       struct btrfs_path *path;
+       struct btrfs_key search_key;
+       struct btrfs_key found_key;
+       struct extent_buffer *l;
+       int ret;
+       int slot;
+
+       path = btrfs_alloc_path();
+       if (!path)
+               return -ENOMEM;
+
+       search_key.objectid = objectid;
+       search_key.type = BTRFS_ROOT_ITEM_KEY;
+       search_key.offset = (u64)-1;
+
+       ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0);
+       if (ret < 0)
+               goto out;
+       if (path->slots[0] == 0) {
+               ret = -ENOENT;
+               goto out;
+       }
+
+       BUG_ON(ret == 0);
+       l = path->nodes[0];
+       slot = path->slots[0] - 1;
+       btrfs_item_key_to_cpu(l, &found_key, slot);
+       if (found_key.type != BTRFS_ROOT_ITEM_KEY ||
+           found_key.objectid != objectid) {
+               ret = -ENOENT;
+               goto out;
+       }
+       read_extent_buffer(l, item, btrfs_item_ptr_offset(l, slot),
+                          sizeof(*item));
+       memcpy(key, &found_key, sizeof(found_key));
+       ret = 0;
+out:
+       btrfs_free_path(path);
+       return ret;
+}
diff --git a/fs/btrfs/root.c b/fs/btrfs/root.c
deleted file mode 100644 (file)
index 127b67f..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * BTRFS filesystem implementation for U-Boot
- *
- * 2017 Marek Behun, CZ.NIC, marek.behun@nic.cz
- */
-
-#include "btrfs.h"
-
-static void read_root_item(struct btrfs_path *p, struct btrfs_root_item *item)
-{
-       u32 len;
-       int reset = 0;
-
-       len = btrfs_path_item_size(p);
-       memcpy(item, btrfs_path_item_ptr(p, struct btrfs_root_item), len);
-       btrfs_root_item_to_cpu(item);
-
-       if (len < sizeof(*item))
-               reset = 1;
-       if (!reset && item->generation != item->generation_v2) {
-               if (item->generation_v2 != 0)
-                       printf("%s: generation != generation_v2 in root item",
-                              __func__);
-               reset = 1;
-       }
-       if (reset) {
-               memset(&item->generation_v2, 0,
-                      sizeof(*item) - offsetof(struct btrfs_root_item,
-                                               generation_v2));
-       }
-}
-
-int btrfs_find_root(u64 objectid, struct btrfs_root *root,
-                   struct btrfs_root_item *root_item)
-{
-       struct btrfs_path path;
-       struct btrfs_root_item my_root_item;
-
-       if (!btrfs_search_tree_key_type(&btrfs_info.tree_root, objectid,
-                                       BTRFS_ROOT_ITEM_KEY, &path))
-               return -1;
-
-       if (!root_item)
-               root_item = &my_root_item;
-       read_root_item(&path, root_item);
-
-       if (root) {
-               root->objectid = objectid;
-               root->bytenr = root_item->bytenr;
-               root->root_dirid = root_item->root_dirid;
-       }
-
-       btrfs_free_path(&path);
-       return 0;
-}
-
-u64 btrfs_lookup_root_ref(u64 subvolid, struct btrfs_root_ref *refp, char *name)
-{
-       struct btrfs_path path;
-       struct btrfs_key *key;
-       struct btrfs_root_ref *ref;
-       u64 res = -1ULL;
-
-       key = btrfs_search_tree_key_type(&btrfs_info.tree_root, subvolid,
-                                              BTRFS_ROOT_BACKREF_KEY, &path);
-
-       if (!key)
-               return -1ULL;
-
-       ref = btrfs_path_item_ptr(&path, struct btrfs_root_ref);
-       btrfs_root_ref_to_cpu(ref);
-
-       if (refp)
-               *refp = *ref;
-
-       if (name) {
-               if (ref->name_len > BTRFS_VOL_NAME_MAX) {
-                       printf("%s: volume name too long: %u\n", __func__,
-                              ref->name_len);
-                       goto out;
-               }
-
-               memcpy(name, ref + 1, ref->name_len);
-       }
-
-       res = key->offset;
-out:
-       btrfs_free_path(&path);
-       return res;
-}
-
index 06e54f3..2815673 100644 (file)
  * 2017 Marek Behun, CZ.NIC, marek.behun@nic.cz
  */
 
-#include "btrfs.h"
 #include <malloc.h>
+#include "ctree.h"
+#include "btrfs.h"
+#include "disk-io.h"
 
-static int get_subvol_name(u64 subvolid, char *name, int max_len)
+/*
+ * Resolve the path of ino inside subvolume @root into @path_ret.
+ *
+ * @path_ret must be at least PATH_MAX size.
+ */
+static int get_path_in_subvol(struct btrfs_root *root, u64 ino, char *path_ret)
 {
-       struct btrfs_root_ref rref;
-       struct btrfs_inode_ref iref;
-       struct btrfs_root root;
-       u64 dir;
-       char tmp[max(BTRFS_VOL_NAME_MAX, BTRFS_NAME_MAX)];
-       char *ptr;
-
-       ptr = name + max_len - 1;
-       *ptr = '\0';
-
-       while (subvolid != BTRFS_FS_TREE_OBJECTID) {
-               subvolid = btrfs_lookup_root_ref(subvolid, &rref, tmp);
-
-               if (subvolid == -1ULL)
-                       return -1;
-
-               ptr -= rref.name_len + 1;
-               if (ptr < name)
-                       goto too_long;
-
-               memcpy(ptr + 1, tmp, rref.name_len);
-               *ptr = '/';
-
-               if (btrfs_find_root(subvolid, &root, NULL))
-                       return -1;
-
-               dir = rref.dirid;
-
-               while (dir != BTRFS_FIRST_FREE_OBJECTID) {
-                       dir = btrfs_lookup_inode_ref(&root, dir, &iref, tmp);
-
-                       if (dir == -1ULL)
-                               return -1;
-
-                       ptr -= iref.name_len + 1;
-                       if (ptr < name)
-                               goto too_long;
-
-                       memcpy(ptr + 1, tmp, iref.name_len);
-                       *ptr = '/';
+       struct btrfs_path path;
+       struct btrfs_key key;
+       char *tmp;
+       u64 cur = ino;
+       int ret = 0;
+
+       tmp = malloc(PATH_MAX);
+       if (!tmp)
+               return -ENOMEM;
+       tmp[0] = '\0';
+
+       btrfs_init_path(&path);
+       while (cur != BTRFS_FIRST_FREE_OBJECTID) {
+               struct btrfs_inode_ref *iref;
+               int name_len;
+
+               btrfs_release_path(&path);
+               key.objectid = cur;
+               key.type = BTRFS_INODE_REF_KEY;
+               key.offset = (u64)-1;
+
+               ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
+               /* Impossible */
+               if (ret == 0)
+                       ret = -EUCLEAN;
+               if (ret < 0)
+                       goto out;
+               ret = btrfs_previous_item(root, &path, cur,
+                                         BTRFS_INODE_REF_KEY);
+               if (ret > 0)
+                       ret = -ENOENT;
+               if (ret < 0)
+                       goto out;
+
+               strncpy(tmp, path_ret, PATH_MAX);
+               iref = btrfs_item_ptr(path.nodes[0], path.slots[0],
+                                     struct btrfs_inode_ref);
+               name_len = btrfs_inode_ref_name_len(path.nodes[0],
+                                                   iref);
+               if (name_len > BTRFS_NAME_LEN) {
+                       ret = -ENAMETOOLONG;
+                       goto out;
                }
+               read_extent_buffer(path.nodes[0], path_ret,
+                                  (unsigned long)(iref + 1), name_len);
+               path_ret[name_len] = '/';
+               path_ret[name_len + 1] = '\0';
+               strncat(path_ret, tmp, PATH_MAX);
+
+               btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
+               cur = key.offset;
        }
-
-       if (ptr == name + max_len - 1) {
-               name[0] = '/';
-               name[1] = '\0';
-       } else {
-               memmove(name, ptr, name + max_len - ptr);
-       }
-
-       return 0;
-
-too_long:
-       printf("%s: subvolume name too long\n", __func__);
-       return -1;
+out:
+       btrfs_release_path(&path);
+       free(tmp);
+       return ret;
 }
 
-u64 btrfs_get_default_subvol_objectid(void)
+static int list_one_subvol(struct btrfs_root *root, char *path_ret)
 {
-       struct btrfs_dir_item item;
-
-       if (btrfs_lookup_dir_item(&btrfs_info.tree_root,
-                                 btrfs_info.sb.root_dir_objectid, "default", 7,
-                                 &item))
-               return BTRFS_FS_TREE_OBJECTID;
-       return item.location.objectid;
+       struct btrfs_fs_info *fs_info = root->fs_info;
+       struct btrfs_root *tree_root = fs_info->tree_root;
+       struct btrfs_path path;
+       struct btrfs_key key;
+       char *tmp;
+       u64 cur = root->root_key.objectid;
+       int ret = 0;
+
+       tmp = malloc(PATH_MAX);
+       if (!tmp)
+               return -ENOMEM;
+       tmp[0] = '\0';
+       path_ret[0] = '\0';
+       btrfs_init_path(&path);
+       while (cur != BTRFS_FS_TREE_OBJECTID) {
+               struct btrfs_root_ref *rr;
+               struct btrfs_key location;
+               int name_len;
+               u64 ino;
+
+               key.objectid = cur;
+               key.type = BTRFS_ROOT_BACKREF_KEY;
+               key.offset = (u64)-1;
+               btrfs_release_path(&path);
+
+               ret = btrfs_search_slot(NULL, tree_root, &key, &path, 0, 0);
+               if (ret == 0)
+                       ret = -EUCLEAN;
+               if (ret < 0)
+                       goto out;
+               ret = btrfs_previous_item(tree_root, &path, cur,
+                                         BTRFS_ROOT_BACKREF_KEY);
+               if (ret > 0)
+                       ret = -ENOENT;
+               if (ret < 0)
+                       goto out;
+
+               /* Get the subvolume name */
+               rr = btrfs_item_ptr(path.nodes[0], path.slots[0],
+                                   struct btrfs_root_ref);
+               strncpy(tmp, path_ret, PATH_MAX);
+               name_len = btrfs_root_ref_name_len(path.nodes[0], rr);
+               if (name_len > BTRFS_NAME_LEN) {
+                       ret = -ENAMETOOLONG;
+                       goto out;
+               }
+               ino = btrfs_root_ref_dirid(path.nodes[0], rr);
+               read_extent_buffer(path.nodes[0], path_ret,
+                                  (unsigned long)(rr + 1), name_len);
+               path_ret[name_len] = '/';
+               path_ret[name_len + 1] = '\0';
+               strncat(path_ret, tmp, PATH_MAX);
+
+               /* Get the path inside the parent subvolume */
+               btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
+               location.objectid = key.offset;
+               location.type = BTRFS_ROOT_ITEM_KEY;
+               location.offset = (u64)-1;
+               root = btrfs_read_fs_root(fs_info, &location);
+               if (IS_ERR(root)) {
+                       ret = PTR_ERR(root);
+                       goto out;
+               }
+               ret = get_path_in_subvol(root, ino, path_ret);
+               if (ret < 0)
+                       goto out;
+               cur = key.offset;
+       }
+       /* Add the leading '/' */
+       strncpy(tmp, path_ret, PATH_MAX);
+       strncpy(path_ret, "/", PATH_MAX);
+       strncat(path_ret, tmp, PATH_MAX);
+out:
+       btrfs_release_path(&path);
+       free(tmp);
+       return ret;
 }
 
-static void list_subvols(u64 tree, char *nameptr, int max_name_len, int level)
+static int list_subvolums(struct btrfs_fs_info *fs_info)
 {
-       struct btrfs_key key, *found_key;
+       struct btrfs_root *tree_root = fs_info->tree_root;
+       struct btrfs_root *root;
        struct btrfs_path path;
-       struct btrfs_root_ref *ref;
-       int res;
-
-       key.objectid = tree;
-       key.type = BTRFS_ROOT_REF_KEY;
+       struct btrfs_key key;
+       char *result;
+       int ret = 0;
+
+       result = malloc(PATH_MAX);
+       if (!result)
+               return -ENOMEM;
+
+       ret = list_one_subvol(fs_info->fs_root, result);
+       if (ret < 0)
+               goto out;
+       root = fs_info->fs_root;
+       printf("ID %llu gen %llu path %.*s\n",
+               root->root_key.objectid, btrfs_root_generation(&root->root_item),
+               PATH_MAX, result);
+
+       key.objectid = BTRFS_FIRST_FREE_OBJECTID;
+       key.type = BTRFS_ROOT_ITEM_KEY;
        key.offset = 0;
-
-       if (btrfs_search_tree(&btrfs_info.tree_root, &key, &path))
-               return;
-
-       do {
-               found_key = btrfs_path_leaf_key(&path);
-               if (btrfs_comp_keys_type(&key, found_key))
+       btrfs_init_path(&path);
+       ret = btrfs_search_slot(NULL, tree_root, &key, &path, 0, 0);
+       if (ret < 0)
+               goto out;
+       while (1) {
+               if (path.slots[0] >= btrfs_header_nritems(path.nodes[0]))
+                       goto next;
+
+               btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
+               if (key.objectid > BTRFS_LAST_FREE_OBJECTID)
                        break;
-
-               ref = btrfs_path_item_ptr(&path, struct btrfs_root_ref);
-               btrfs_root_ref_to_cpu(ref);
-
-               printf("ID %llu parent %llu name ", found_key->offset, tree);
-               if (nameptr && !get_subvol_name(found_key->offset, nameptr,
-                                               max_name_len))
-                       printf("%s\n", nameptr);
-               else
-                       printf("%.*s\n", (int) ref->name_len,
-                              (const char *) (ref + 1));
-
-               if (level > 0)
-                       list_subvols(found_key->offset, nameptr, max_name_len,
-                                    level - 1);
-               else
-                       printf("%s: Too much recursion, maybe skipping some "
-                              "subvolumes\n", __func__);
-       } while (!(res = btrfs_next_slot(&path)));
-
-       btrfs_free_path(&path);
+               if (key.objectid < BTRFS_FIRST_FREE_OBJECTID ||
+                   key.type != BTRFS_ROOT_ITEM_KEY)
+                       goto next;
+               key.offset = (u64)-1;
+               root = btrfs_read_fs_root(fs_info, &key);
+               if (IS_ERR(root)) {
+                       ret = PTR_ERR(root);
+                       if (ret == -ENOENT)
+                               goto next;
+               }
+               ret = list_one_subvol(root, result);
+               if (ret < 0)
+                       goto out;
+               printf("ID %llu gen %llu path %.*s\n",
+                       root->root_key.objectid,
+                       btrfs_root_generation(&root->root_item),
+                       PATH_MAX, result);
+next:
+               ret = btrfs_next_item(tree_root, &path);
+               if (ret < 0)
+                       goto out;
+               if (ret > 0) {
+                       ret = 0;
+                       break;
+               }
+       }
+out:
+       free(result);
+       return ret;
 }
 
 void btrfs_list_subvols(void)
 {
-       char *nameptr = malloc(4096);
+       struct btrfs_fs_info *fs_info = current_fs_info;
+       int ret;
 
-       list_subvols(BTRFS_FS_TREE_OBJECTID, nameptr, nameptr ? 4096 : 0, 40);
-
-       if (nameptr)
-               free(nameptr);
+       if (!fs_info)
+               return;
+       ret = list_subvolums(fs_info);
+       if (ret < 0)
+               error("failed to list subvolume: %d", ret);
 }
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
deleted file mode 100644 (file)
index 913a4d4..0000000
+++ /dev/null
@@ -1,257 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * BTRFS filesystem implementation for U-Boot
- *
- * 2017 Marek Behun, CZ.NIC, marek.behun@nic.cz
- */
-
-#include <common.h>
-#include <log.h>
-#include <memalign.h>
-#include <part.h>
-#include <linux/compat.h>
-#include "btrfs.h"
-
-#define BTRFS_SUPER_FLAG_SUPP  (BTRFS_HEADER_FLAG_WRITTEN      \
-                                | BTRFS_HEADER_FLAG_RELOC      \
-                                | BTRFS_SUPER_FLAG_ERROR       \
-                                | BTRFS_SUPER_FLAG_SEEDING     \
-                                | BTRFS_SUPER_FLAG_METADUMP)
-
-#define BTRFS_SUPER_INFO_SIZE  4096
-
-/*
- * checks if a valid root backup is present.
- * considers the case when all root backups empty valid.
- * returns -1 in case of invalid root backup and 0 for valid.
- */
-static int btrfs_check_super_roots(struct btrfs_super_block *sb)
-{
-       struct btrfs_root_backup *root_backup;
-       int i, newest = -1;
-       int num_empty = 0;
-
-       for (i = 0; i < BTRFS_NUM_BACKUP_ROOTS; ++i) {
-               root_backup = sb->super_roots + i;
-
-               if (root_backup->tree_root == 0 && root_backup->tree_root_gen == 0)
-                       num_empty++;
-
-               if (root_backup->tree_root_gen == sb->generation)
-                       newest = i;
-       }
-
-       if (num_empty == BTRFS_NUM_BACKUP_ROOTS) {
-               return 0;
-       } else if (newest >= 0) {
-               return 0;
-       }
-
-       return -1;
-}
-
-static inline int is_power_of_2(u64 x)
-{
-       return !(x & (x - 1));
-}
-
-static int btrfs_check_super_csum(char *raw_disk_sb)
-{
-       struct btrfs_super_block *disk_sb =
-               (struct btrfs_super_block *) raw_disk_sb;
-       u16 csum_type = le16_to_cpu(disk_sb->csum_type);
-
-       if (csum_type == BTRFS_CSUM_TYPE_CRC32) {
-               u32 crc = ~(u32) 0;
-               const int csum_size = sizeof(crc);
-               char result[csum_size];
-
-               crc = btrfs_csum_data(raw_disk_sb + BTRFS_CSUM_SIZE, crc,
-                                     BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE);
-               btrfs_csum_final(crc, result);
-
-               if (memcmp(raw_disk_sb, result, csum_size))
-                       return -1;
-       } else {
-               return -1;
-       }
-
-       return 0;
-}
-
-static int btrfs_check_super(struct btrfs_super_block *sb)
-{
-       int ret = 0;
-
-       if (sb->flags & ~BTRFS_SUPER_FLAG_SUPP) {
-               printf("%s: Unsupported flags: %llu\n", __func__,
-                      sb->flags & ~BTRFS_SUPER_FLAG_SUPP);
-       }
-
-       if (sb->root_level > BTRFS_MAX_LEVEL) {
-               printf("%s: tree_root level too big: %d >= %d\n", __func__,
-                      sb->root_level, BTRFS_MAX_LEVEL);
-               ret = -1;
-       }
-
-       if (sb->chunk_root_level > BTRFS_MAX_LEVEL) {
-               printf("%s: chunk_root level too big: %d >= %d\n", __func__,
-                      sb->chunk_root_level, BTRFS_MAX_LEVEL);
-               ret = -1;
-       }
-
-       if (sb->log_root_level > BTRFS_MAX_LEVEL) {
-               printf("%s: log_root level too big: %d >= %d\n", __func__,
-                      sb->log_root_level, BTRFS_MAX_LEVEL);
-               ret = -1;
-       }
-
-       if (!is_power_of_2(sb->sectorsize) || sb->sectorsize < 4096 ||
-           sb->sectorsize > BTRFS_MAX_METADATA_BLOCKSIZE) {
-               printf("%s: invalid sectorsize %u\n", __func__,
-                      sb->sectorsize);
-               ret = -1;
-       }
-
-       if (!is_power_of_2(sb->nodesize) || sb->nodesize < sb->sectorsize ||
-           sb->nodesize > BTRFS_MAX_METADATA_BLOCKSIZE) {
-               printf("%s: invalid nodesize %u\n", __func__, sb->nodesize);
-               ret = -1;
-       }
-
-       if (sb->nodesize != sb->__unused_leafsize) {
-               printf("%s: invalid leafsize %u, should be %u\n", __func__,
-                      sb->__unused_leafsize, sb->nodesize);
-               ret = -1;
-       }
-
-       if (!IS_ALIGNED(sb->root, sb->sectorsize)) {
-               printf("%s: tree_root block unaligned: %llu\n", __func__,
-                      sb->root);
-               ret = -1;
-       }
-
-       if (!IS_ALIGNED(sb->chunk_root, sb->sectorsize)) {
-               printf("%s: chunk_root block unaligned: %llu\n", __func__,
-                      sb->chunk_root);
-               ret = -1;
-       }
-
-       if (!IS_ALIGNED(sb->log_root, sb->sectorsize)) {
-               printf("%s: log_root block unaligned: %llu\n", __func__,
-                      sb->log_root);
-               ret = -1;
-       }
-
-       if (memcmp(sb->fsid, sb->dev_item.fsid, BTRFS_UUID_SIZE) != 0) {
-               printf("%s: dev_item UUID does not match fsid\n", __func__);
-               ret = -1;
-       }
-
-       if (sb->bytes_used < 6*sb->nodesize) {
-               printf("%s: bytes_used is too small %llu\n", __func__,
-                      sb->bytes_used);
-               ret = -1;
-       }
-
-       if (!is_power_of_2(sb->stripesize)) {
-               printf("%s: invalid stripesize %u\n", __func__, sb->stripesize);
-               ret = -1;
-       }
-
-       if (sb->sys_chunk_array_size > BTRFS_SYSTEM_CHUNK_ARRAY_SIZE) {
-               printf("%s: system chunk array too big %u > %u\n", __func__,
-                      sb->sys_chunk_array_size, BTRFS_SYSTEM_CHUNK_ARRAY_SIZE);
-               ret = -1;
-       }
-
-       if (sb->sys_chunk_array_size < sizeof(struct btrfs_key) +
-           sizeof(struct btrfs_chunk)) {
-               printf("%s: system chunk array too small %u < %zu\n", __func__,
-                      sb->sys_chunk_array_size, sizeof(struct btrfs_key)
-                      + sizeof(struct btrfs_chunk));
-               ret = -1;
-       }
-
-       return ret;
-}
-
-int btrfs_read_superblock(void)
-{
-       const u64 superblock_offsets[4] = {
-               0x10000ull,
-               0x4000000ull,
-               0x4000000000ull,
-               0x4000000000000ull
-       };
-       ALLOC_CACHE_ALIGN_BUFFER(char, raw_sb, BTRFS_SUPER_INFO_SIZE);
-       struct btrfs_super_block *sb = (struct btrfs_super_block *) raw_sb;
-       u64 dev_total_bytes;
-       int i;
-
-       dev_total_bytes = (u64) btrfs_part_info->size * btrfs_part_info->blksz;
-
-       btrfs_info.sb.generation = 0;
-
-       for (i = 0; i < 4; ++i) {
-               if (superblock_offsets[i] + sizeof(sb) > dev_total_bytes)
-                       break;
-
-               if (!btrfs_devread(superblock_offsets[i], BTRFS_SUPER_INFO_SIZE,
-                                  raw_sb))
-                       break;
-
-               if (btrfs_check_super_csum(raw_sb)) {
-                       debug("%s: invalid checksum at superblock mirror %i\n",
-                             __func__, i);
-                       continue;
-               }
-
-               btrfs_super_block_to_cpu(sb);
-
-               if (sb->magic != BTRFS_MAGIC) {
-                       debug("%s: invalid BTRFS magic 0x%016llX at "
-                             "superblock mirror %i\n", __func__, sb->magic, i);
-               } else if (sb->bytenr != superblock_offsets[i]) {
-                       printf("%s: invalid bytenr 0x%016llX (expected "
-                              "0x%016llX) at superblock mirror %i\n",
-                              __func__, sb->bytenr, superblock_offsets[i], i);
-               } else if (btrfs_check_super(sb)) {
-                       printf("%s: Checking superblock mirror %i failed\n",
-                              __func__, i);
-               } else if (sb->generation > btrfs_info.sb.generation) {
-                       memcpy(&btrfs_info.sb, sb, sizeof(*sb));
-               } else {
-                       /* Nothing */
-               }
-       }
-
-       if (!btrfs_info.sb.generation) {
-               debug("%s: No valid BTRFS superblock found!\n", __func__);
-               return -1;
-       }
-
-       if (btrfs_check_super_roots(&btrfs_info.sb)) {
-               printf("%s: No valid root_backup found!\n", __func__);
-               return -1;
-       }
-
-       if (sb->sectorsize != PAGE_SIZE) {
-               printf(
-       "%s: Unsupported sector size (%u), only supports %u as sector size\n",
-                       __func__, sb->sectorsize, PAGE_SIZE);
-               return -1;
-       }
-
-       if (btrfs_info.sb.num_devices != 1) {
-               printf("%s: Unsupported number of devices (%lli). This driver "
-                      "only supports filesystem on one device.\n", __func__,
-                      btrfs_info.sb.num_devices);
-               return -1;
-       }
-
-       debug("Chosen superblock with generation = %llu\n",
-             btrfs_info.sb.generation);
-
-       return 0;
-}
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
new file mode 100644 (file)
index 0000000..fcf52d4
--- /dev/null
@@ -0,0 +1,1173 @@
+// SPDX-License-Identifier: GPL-2.0+
+#include <stdlib.h>
+#include <common.h>
+#include <fs_internal.h>
+#include "ctree.h"
+#include "disk-io.h"
+#include "volumes.h"
+#include "extent-io.h"
+
+const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES] = {
+       [BTRFS_RAID_RAID10] = {
+               .sub_stripes    = 2,
+               .dev_stripes    = 1,
+               .devs_max       = 0,    /* 0 == as many as possible */
+               .devs_min       = 4,
+               .tolerated_failures = 1,
+               .devs_increment = 2,
+               .ncopies        = 2,
+               .nparity        = 0,
+               .raid_name      = "raid10",
+               .bg_flag        = BTRFS_BLOCK_GROUP_RAID10,
+       },
+       [BTRFS_RAID_RAID1] = {
+               .sub_stripes    = 1,
+               .dev_stripes    = 1,
+               .devs_max       = 2,
+               .devs_min       = 2,
+               .tolerated_failures = 1,
+               .devs_increment = 2,
+               .ncopies        = 2,
+               .nparity        = 0,
+               .raid_name      = "raid1",
+               .bg_flag        = BTRFS_BLOCK_GROUP_RAID1,
+       },
+       [BTRFS_RAID_RAID1C3] = {
+               .sub_stripes    = 1,
+               .dev_stripes    = 1,
+               .devs_max       = 3,
+               .devs_min       = 3,
+               .tolerated_failures = 2,
+               .devs_increment = 3,
+               .ncopies        = 3,
+               .raid_name      = "raid1c3",
+               .bg_flag        = BTRFS_BLOCK_GROUP_RAID1C3,
+       },
+       [BTRFS_RAID_RAID1C4] = {
+               .sub_stripes    = 1,
+               .dev_stripes    = 1,
+               .devs_max       = 4,
+               .devs_min       = 4,
+               .tolerated_failures = 3,
+               .devs_increment = 4,
+               .ncopies        = 4,
+               .raid_name      = "raid1c4",
+               .bg_flag        = BTRFS_BLOCK_GROUP_RAID1C4,
+       },
+       [BTRFS_RAID_DUP] = {
+               .sub_stripes    = 1,
+               .dev_stripes    = 2,
+               .devs_max       = 1,
+               .devs_min       = 1,
+               .tolerated_failures = 0,
+               .devs_increment = 1,
+               .ncopies        = 2,
+               .nparity        = 0,
+               .raid_name      = "dup",
+               .bg_flag        = BTRFS_BLOCK_GROUP_DUP,
+       },
+       [BTRFS_RAID_RAID0] = {
+               .sub_stripes    = 1,
+               .dev_stripes    = 1,
+               .devs_max       = 0,
+               .devs_min       = 2,
+               .tolerated_failures = 0,
+               .devs_increment = 1,
+               .ncopies        = 1,
+               .nparity        = 0,
+               .raid_name      = "raid0",
+               .bg_flag        = BTRFS_BLOCK_GROUP_RAID0,
+       },
+       [BTRFS_RAID_SINGLE] = {
+               .sub_stripes    = 1,
+               .dev_stripes    = 1,
+               .devs_max       = 1,
+               .devs_min       = 1,
+               .tolerated_failures = 0,
+               .devs_increment = 1,
+               .ncopies        = 1,
+               .nparity        = 0,
+               .raid_name      = "single",
+               .bg_flag        = 0,
+       },
+       [BTRFS_RAID_RAID5] = {
+               .sub_stripes    = 1,
+               .dev_stripes    = 1,
+               .devs_max       = 0,
+               .devs_min       = 2,
+               .tolerated_failures = 1,
+               .devs_increment = 1,
+               .ncopies        = 1,
+               .nparity        = 1,
+               .raid_name      = "raid5",
+               .bg_flag        = BTRFS_BLOCK_GROUP_RAID5,
+       },
+       [BTRFS_RAID_RAID6] = {
+               .sub_stripes    = 1,
+               .dev_stripes    = 1,
+               .devs_max       = 0,
+               .devs_min       = 3,
+               .tolerated_failures = 2,
+               .devs_increment = 1,
+               .ncopies        = 1,
+               .nparity        = 2,
+               .raid_name      = "raid6",
+               .bg_flag        = BTRFS_BLOCK_GROUP_RAID6,
+       },
+};
+
+struct stripe {
+       struct btrfs_device *dev;
+       u64 physical;
+};
+
+static inline int nr_parity_stripes(struct map_lookup *map)
+{
+       if (map->type & BTRFS_BLOCK_GROUP_RAID5)
+               return 1;
+       else if (map->type & BTRFS_BLOCK_GROUP_RAID6)
+               return 2;
+       else
+               return 0;
+}
+
+static inline int nr_data_stripes(struct map_lookup *map)
+{
+       return map->num_stripes - nr_parity_stripes(map);
+}
+
+#define is_parity_stripe(x) ( ((x) == BTRFS_RAID5_P_STRIPE) || ((x) == BTRFS_RAID6_Q_STRIPE) )
+
+static LIST_HEAD(fs_uuids);
+
+/*
+ * Find a device specified by @devid or @uuid in the list of @fs_devices, or
+ * return NULL.
+ *
+ * If devid and uuid are both specified, the match must be exact, otherwise
+ * only devid is used.
+ */
+static struct btrfs_device *find_device(struct btrfs_fs_devices *fs_devices,
+               u64 devid, u8 *uuid)
+{
+       struct list_head *head = &fs_devices->devices;
+       struct btrfs_device *dev;
+
+       list_for_each_entry(dev, head, dev_list) {
+               if (dev->devid == devid &&
+                   (!uuid || !memcmp(dev->uuid, uuid, BTRFS_UUID_SIZE))) {
+                       return dev;
+               }
+       }
+       return NULL;
+}
+
+static struct btrfs_fs_devices *find_fsid(u8 *fsid, u8 *metadata_uuid)
+{
+       struct btrfs_fs_devices *fs_devices;
+
+       list_for_each_entry(fs_devices, &fs_uuids, list) {
+               if (metadata_uuid && (memcmp(fsid, fs_devices->fsid,
+                                            BTRFS_FSID_SIZE) == 0) &&
+                   (memcmp(metadata_uuid, fs_devices->metadata_uuid,
+                           BTRFS_FSID_SIZE) == 0)) {
+                       return fs_devices;
+               } else if (memcmp(fsid, fs_devices->fsid, BTRFS_FSID_SIZE) == 0){
+                       return fs_devices;
+               }
+       }
+       return NULL;
+}
+
+static int device_list_add(struct btrfs_super_block *disk_super,
+                          u64 devid, struct blk_desc *desc,
+                          struct disk_partition *part,
+                          struct btrfs_fs_devices **fs_devices_ret)
+{
+       struct btrfs_device *device;
+       struct btrfs_fs_devices *fs_devices;
+       u64 found_transid = btrfs_super_generation(disk_super);
+       bool metadata_uuid = (btrfs_super_incompat_flags(disk_super) &
+               BTRFS_FEATURE_INCOMPAT_METADATA_UUID);
+
+       if (metadata_uuid)
+               fs_devices = find_fsid(disk_super->fsid,
+                                      disk_super->metadata_uuid);
+       else
+               fs_devices = find_fsid(disk_super->fsid, NULL);
+
+       if (!fs_devices) {
+               fs_devices = kzalloc(sizeof(*fs_devices), GFP_NOFS);
+               if (!fs_devices)
+                       return -ENOMEM;
+               INIT_LIST_HEAD(&fs_devices->devices);
+               list_add(&fs_devices->list, &fs_uuids);
+               memcpy(fs_devices->fsid, disk_super->fsid, BTRFS_FSID_SIZE);
+               if (metadata_uuid)
+                       memcpy(fs_devices->metadata_uuid,
+                              disk_super->metadata_uuid, BTRFS_FSID_SIZE);
+               else
+                       memcpy(fs_devices->metadata_uuid, fs_devices->fsid,
+                              BTRFS_FSID_SIZE);
+
+               fs_devices->latest_devid = devid;
+               fs_devices->latest_trans = found_transid;
+               fs_devices->lowest_devid = (u64)-1;
+               device = NULL;
+       } else {
+               device = find_device(fs_devices, devid,
+                                   disk_super->dev_item.uuid);
+       }
+       if (!device) {
+               device = kzalloc(sizeof(*device), GFP_NOFS);
+               if (!device) {
+                       /* we can safely leave the fs_devices entry around */
+                       return -ENOMEM;
+               }
+               device->devid = devid;
+               device->desc = desc;
+               device->part = part;
+               device->generation = found_transid;
+               memcpy(device->uuid, disk_super->dev_item.uuid,
+                      BTRFS_UUID_SIZE);
+               device->total_devs = btrfs_super_num_devices(disk_super);
+               device->super_bytes_used = btrfs_super_bytes_used(disk_super);
+               device->total_bytes =
+                       btrfs_stack_device_total_bytes(&disk_super->dev_item);
+               device->bytes_used =
+                       btrfs_stack_device_bytes_used(&disk_super->dev_item);
+               list_add(&device->dev_list, &fs_devices->devices);
+               device->fs_devices = fs_devices;
+       } else if (!device->desc || !device->part) {
+               /*
+                * The existing device has newer generation, so this one could
+                * be a stale one, don't add it.
+                */
+               if (found_transid < device->generation) {
+                       error(
+       "adding devid %llu gen %llu but found an existing device gen %llu",
+                               device->devid, found_transid,
+                               device->generation);
+                       return -EEXIST;
+               } else {
+                       device->desc = desc;
+                       device->part = part;
+               }
+       }
+
+
+       if (found_transid > fs_devices->latest_trans) {
+               fs_devices->latest_devid = devid;
+               fs_devices->latest_trans = found_transid;
+       }
+       if (fs_devices->lowest_devid > devid) {
+               fs_devices->lowest_devid = devid;
+       }
+       *fs_devices_ret = fs_devices;
+       return 0;
+}
+
+int btrfs_close_devices(struct btrfs_fs_devices *fs_devices)
+{
+       struct btrfs_fs_devices *seed_devices;
+       struct btrfs_device *device;
+       int ret = 0;
+
+again:
+       if (!fs_devices)
+               return 0;
+       while (!list_empty(&fs_devices->devices)) {
+               device = list_entry(fs_devices->devices.next,
+                                   struct btrfs_device, dev_list);
+               list_del(&device->dev_list);
+               /* free the memory */
+               free(device);
+       }
+
+       seed_devices = fs_devices->seed;
+       fs_devices->seed = NULL;
+       if (seed_devices) {
+               struct btrfs_fs_devices *orig;
+
+               orig = fs_devices;
+               fs_devices = seed_devices;
+               list_del(&orig->list);
+               free(orig);
+               goto again;
+       } else {
+               list_del(&fs_devices->list);
+               free(fs_devices);
+       }
+
+       return ret;
+}
+
+void btrfs_close_all_devices(void)
+{
+       struct btrfs_fs_devices *fs_devices;
+
+       while (!list_empty(&fs_uuids)) {
+               fs_devices = list_entry(fs_uuids.next, struct btrfs_fs_devices,
+                                       list);
+               btrfs_close_devices(fs_devices);
+       }
+}
+
+int btrfs_open_devices(struct btrfs_fs_devices *fs_devices)
+{
+       struct btrfs_device *device;
+
+       list_for_each_entry(device, &fs_devices->devices, dev_list) {
+               if (!device->desc || !device->part) {
+                       printf("no device found for devid %llu, skip it \n",
+                               device->devid);
+                       continue;
+               }
+       }
+       return 0;
+}
+
+int btrfs_scan_one_device(struct blk_desc *desc, struct disk_partition *part,
+                         struct btrfs_fs_devices **fs_devices_ret,
+                         u64 *total_devs)
+{
+       struct btrfs_super_block *disk_super;
+       char buf[BTRFS_SUPER_INFO_SIZE];
+       int ret;
+       u64 devid;
+
+       disk_super = (struct btrfs_super_block *)buf;
+       ret = btrfs_read_dev_super(desc, part, disk_super);
+       if (ret < 0)
+               return -EIO;
+       devid = btrfs_stack_device_id(&disk_super->dev_item);
+       if (btrfs_super_flags(disk_super) & BTRFS_SUPER_FLAG_METADUMP)
+               *total_devs = 1;
+       else
+               *total_devs = btrfs_super_num_devices(disk_super);
+
+       ret = device_list_add(disk_super, devid, desc, part, fs_devices_ret);
+
+       return ret;
+}
+
+struct btrfs_device *btrfs_find_device(struct btrfs_fs_info *fs_info, u64 devid,
+                                      u8 *uuid, u8 *fsid)
+{
+       struct btrfs_device *device;
+       struct btrfs_fs_devices *cur_devices;
+
+       cur_devices = fs_info->fs_devices;
+       while (cur_devices) {
+               if (!fsid ||
+                  !memcmp(cur_devices->metadata_uuid, fsid, BTRFS_FSID_SIZE)) {
+                       device = find_device(cur_devices, devid, uuid);
+                       if (device)
+                               return device;
+               }
+               cur_devices = cur_devices->seed;
+       }
+       return NULL;
+}
+
+static struct btrfs_device *fill_missing_device(u64 devid)
+{
+       struct btrfs_device *device;
+
+       device = kzalloc(sizeof(*device), GFP_NOFS);
+       return device;
+}
+
+/*
+ * slot == -1: SYSTEM chunk
+ * return -EIO on error, otherwise return 0
+ */
+int btrfs_check_chunk_valid(struct btrfs_fs_info *fs_info,
+                           struct extent_buffer *leaf,
+                           struct btrfs_chunk *chunk,
+                           int slot, u64 logical)
+{
+       u64 length;
+       u64 stripe_len;
+       u16 num_stripes;
+       u16 sub_stripes;
+       u64 type;
+       u32 chunk_ondisk_size;
+       u32 sectorsize = fs_info->sectorsize;
+
+       /*
+        * Basic chunk item size check.  Note that btrfs_chunk already contains
+        * one stripe, so no "==" check.
+        */
+       if (slot >= 0 &&
+           btrfs_item_size_nr(leaf, slot) < sizeof(struct btrfs_chunk)) {
+               error("invalid chunk item size, have %u expect [%zu, %zu)",
+                       btrfs_item_size_nr(leaf, slot),
+                       sizeof(struct btrfs_chunk),
+                       BTRFS_LEAF_DATA_SIZE(fs_info));
+               return -EUCLEAN;
+       }
+       length = btrfs_chunk_length(leaf, chunk);
+       stripe_len = btrfs_chunk_stripe_len(leaf, chunk);
+       num_stripes = btrfs_chunk_num_stripes(leaf, chunk);
+       sub_stripes = btrfs_chunk_sub_stripes(leaf, chunk);
+       type = btrfs_chunk_type(leaf, chunk);
+
+       if (num_stripes == 0) {
+               error("invalid num_stripes, have %u expect non-zero",
+                       num_stripes);
+               return -EUCLEAN;
+       }
+       if (slot >= 0 && btrfs_chunk_item_size(num_stripes) !=
+           btrfs_item_size_nr(leaf, slot)) {
+               error("invalid chunk item size, have %u expect %lu",
+                       btrfs_item_size_nr(leaf, slot),
+                       btrfs_chunk_item_size(num_stripes));
+               return -EUCLEAN;
+       }
+
+       /*
+        * These valid checks may be insufficient to cover every corner cases.
+        */
+       if (!IS_ALIGNED(logical, sectorsize)) {
+               error("invalid chunk logical %llu",  logical);
+               return -EIO;
+       }
+       if (btrfs_chunk_sector_size(leaf, chunk) != sectorsize) {
+               error("invalid chunk sectorsize %llu",
+                     (unsigned long long)btrfs_chunk_sector_size(leaf, chunk));
+               return -EIO;
+       }
+       if (!length || !IS_ALIGNED(length, sectorsize)) {
+               error("invalid chunk length %llu",  length);
+               return -EIO;
+       }
+       if (stripe_len != BTRFS_STRIPE_LEN) {
+               error("invalid chunk stripe length: %llu", stripe_len);
+               return -EIO;
+       }
+       /* Check on chunk item type */
+       if (slot == -1 && (type & BTRFS_BLOCK_GROUP_SYSTEM) == 0) {
+               error("invalid chunk type %llu", type);
+               return -EIO;
+       }
+       if (type & ~(BTRFS_BLOCK_GROUP_TYPE_MASK |
+                    BTRFS_BLOCK_GROUP_PROFILE_MASK)) {
+               error("unrecognized chunk type: %llu",
+                     ~(BTRFS_BLOCK_GROUP_TYPE_MASK |
+                       BTRFS_BLOCK_GROUP_PROFILE_MASK) & type);
+               return -EIO;
+       }
+       if (!(type & BTRFS_BLOCK_GROUP_TYPE_MASK)) {
+               error("missing chunk type flag: %llu", type);
+               return -EIO;
+       }
+       if (!(is_power_of_2(type & BTRFS_BLOCK_GROUP_PROFILE_MASK) ||
+             (type & BTRFS_BLOCK_GROUP_PROFILE_MASK) == 0)) {
+               error("conflicting chunk type detected: %llu", type);
+               return -EIO;
+       }
+       if ((type & BTRFS_BLOCK_GROUP_PROFILE_MASK) &&
+           !is_power_of_2(type & BTRFS_BLOCK_GROUP_PROFILE_MASK)) {
+               error("conflicting chunk profile detected: %llu", type);
+               return -EIO;
+       }
+
+       chunk_ondisk_size = btrfs_chunk_item_size(num_stripes);
+       /*
+        * Btrfs_chunk contains at least one stripe, and for sys_chunk
+        * it can't exceed the system chunk array size
+        * For normal chunk, it should match its chunk item size.
+        */
+       if (num_stripes < 1 ||
+           (slot == -1 && chunk_ondisk_size > BTRFS_SYSTEM_CHUNK_ARRAY_SIZE) ||
+           (slot >= 0 && chunk_ondisk_size > btrfs_item_size_nr(leaf, slot))) {
+               error("invalid num_stripes: %u", num_stripes);
+               return -EIO;
+       }
+       /*
+        * Device number check against profile
+        */
+       if ((type & BTRFS_BLOCK_GROUP_RAID10 && (sub_stripes != 2 ||
+                 !IS_ALIGNED(num_stripes, sub_stripes))) ||
+           (type & BTRFS_BLOCK_GROUP_RAID1 && num_stripes < 1) ||
+           (type & BTRFS_BLOCK_GROUP_RAID1C3 && num_stripes < 3) ||
+           (type & BTRFS_BLOCK_GROUP_RAID1C4 && num_stripes < 4) ||
+           (type & BTRFS_BLOCK_GROUP_RAID5 && num_stripes < 2) ||
+           (type & BTRFS_BLOCK_GROUP_RAID6 && num_stripes < 3) ||
+           (type & BTRFS_BLOCK_GROUP_DUP && num_stripes > 2) ||
+           ((type & BTRFS_BLOCK_GROUP_PROFILE_MASK) == 0 &&
+            num_stripes != 1)) {
+               error("Invalid num_stripes:sub_stripes %u:%u for profile %llu",
+                     num_stripes, sub_stripes,
+                     type & BTRFS_BLOCK_GROUP_PROFILE_MASK);
+               return -EIO;
+       }
+
+       return 0;
+}
+
+/*
+ * Slot is used to verify the chunk item is valid
+ *
+ * For sys chunk in superblock, pass -1 to indicate sys chunk.
+ */
+static int read_one_chunk(struct btrfs_fs_info *fs_info, struct btrfs_key *key,
+                         struct extent_buffer *leaf,
+                         struct btrfs_chunk *chunk, int slot)
+{
+       struct btrfs_mapping_tree *map_tree = &fs_info->mapping_tree;
+       struct map_lookup *map;
+       struct cache_extent *ce;
+       u64 logical;
+       u64 length;
+       u64 devid;
+       u8 uuid[BTRFS_UUID_SIZE];
+       int num_stripes;
+       int ret;
+       int i;
+
+       logical = key->offset;
+       length = btrfs_chunk_length(leaf, chunk);
+       num_stripes = btrfs_chunk_num_stripes(leaf, chunk);
+       /* Validation check */
+       ret = btrfs_check_chunk_valid(fs_info, leaf, chunk, slot, logical);
+       if (ret) {
+               error("%s checksums match, but it has an invalid chunk, %s",
+                     (slot == -1) ? "Superblock" : "Metadata",
+                     (slot == -1) ? "try btrfsck --repair -s <superblock> ie, 0,1,2" : "");
+               return ret;
+       }
+
+       ce = search_cache_extent(&map_tree->cache_tree, logical);
+
+       /* already mapped? */
+       if (ce && ce->start <= logical && ce->start + ce->size > logical) {
+               return 0;
+       }
+
+       map = kmalloc(btrfs_map_lookup_size(num_stripes), GFP_NOFS);
+       if (!map)
+               return -ENOMEM;
+
+       map->ce.start = logical;
+       map->ce.size = length;
+       map->num_stripes = num_stripes;
+       map->io_width = btrfs_chunk_io_width(leaf, chunk);
+       map->io_align = btrfs_chunk_io_align(leaf, chunk);
+       map->sector_size = btrfs_chunk_sector_size(leaf, chunk);
+       map->stripe_len = btrfs_chunk_stripe_len(leaf, chunk);
+       map->type = btrfs_chunk_type(leaf, chunk);
+       map->sub_stripes = btrfs_chunk_sub_stripes(leaf, chunk);
+
+       for (i = 0; i < num_stripes; i++) {
+               map->stripes[i].physical =
+                       btrfs_stripe_offset_nr(leaf, chunk, i);
+               devid = btrfs_stripe_devid_nr(leaf, chunk, i);
+               read_extent_buffer(leaf, uuid, (unsigned long)
+                                  btrfs_stripe_dev_uuid_nr(chunk, i),
+                                  BTRFS_UUID_SIZE);
+               map->stripes[i].dev = btrfs_find_device(fs_info, devid, uuid,
+                                                       NULL);
+               if (!map->stripes[i].dev) {
+                       map->stripes[i].dev = fill_missing_device(devid);
+                       printf("warning, device %llu is missing\n",
+                              (unsigned long long)devid);
+                       list_add(&map->stripes[i].dev->dev_list,
+                                &fs_info->fs_devices->devices);
+               }
+
+       }
+       ret = insert_cache_extent(&map_tree->cache_tree, &map->ce);
+       if (ret < 0) {
+               errno = -ret;
+               error("failed to add chunk map start=%llu len=%llu: %d (%m)",
+                     map->ce.start, map->ce.size, ret);
+       }
+
+       return ret;
+}
+
+static int fill_device_from_item(struct extent_buffer *leaf,
+                                struct btrfs_dev_item *dev_item,
+                                struct btrfs_device *device)
+{
+       unsigned long ptr;
+
+       device->devid = btrfs_device_id(leaf, dev_item);
+       device->total_bytes = btrfs_device_total_bytes(leaf, dev_item);
+       device->bytes_used = btrfs_device_bytes_used(leaf, dev_item);
+       device->type = btrfs_device_type(leaf, dev_item);
+       device->io_align = btrfs_device_io_align(leaf, dev_item);
+       device->io_width = btrfs_device_io_width(leaf, dev_item);
+       device->sector_size = btrfs_device_sector_size(leaf, dev_item);
+
+       ptr = (unsigned long)btrfs_device_uuid(dev_item);
+       read_extent_buffer(leaf, device->uuid, ptr, BTRFS_UUID_SIZE);
+
+       return 0;
+}
+
+static int read_one_dev(struct btrfs_fs_info *fs_info,
+                       struct extent_buffer *leaf,
+                       struct btrfs_dev_item *dev_item)
+{
+       struct btrfs_device *device;
+       u64 devid;
+       int ret = 0;
+       u8 fs_uuid[BTRFS_UUID_SIZE];
+       u8 dev_uuid[BTRFS_UUID_SIZE];
+
+       devid = btrfs_device_id(leaf, dev_item);
+       read_extent_buffer(leaf, dev_uuid,
+                          (unsigned long)btrfs_device_uuid(dev_item),
+                          BTRFS_UUID_SIZE);
+       read_extent_buffer(leaf, fs_uuid,
+                          (unsigned long)btrfs_device_fsid(dev_item),
+                          BTRFS_FSID_SIZE);
+
+       if (memcmp(fs_uuid, fs_info->fs_devices->fsid, BTRFS_UUID_SIZE)) {
+               error("Seed device is not yet supported\n");
+               return -ENOTSUPP;
+       }
+
+       device = btrfs_find_device(fs_info, devid, dev_uuid, fs_uuid);
+       if (!device) {
+               device = kzalloc(sizeof(*device), GFP_NOFS);
+               if (!device)
+                       return -ENOMEM;
+               list_add(&device->dev_list,
+                        &fs_info->fs_devices->devices);
+       }
+
+       fill_device_from_item(leaf, dev_item, device);
+       fs_info->fs_devices->total_rw_bytes +=
+               btrfs_device_total_bytes(leaf, dev_item);
+       return ret;
+}
+
+int btrfs_read_sys_array(struct btrfs_fs_info *fs_info)
+{
+       struct btrfs_super_block *super_copy = fs_info->super_copy;
+       struct extent_buffer *sb;
+       struct btrfs_disk_key *disk_key;
+       struct btrfs_chunk *chunk;
+       u8 *array_ptr;
+       unsigned long sb_array_offset;
+       int ret = 0;
+       u32 num_stripes;
+       u32 array_size;
+       u32 len = 0;
+       u32 cur_offset;
+       struct btrfs_key key;
+
+       if (fs_info->nodesize < BTRFS_SUPER_INFO_SIZE) {
+               printf("ERROR: nodesize %u too small to read superblock\n",
+                               fs_info->nodesize);
+               return -EINVAL;
+       }
+       sb = alloc_dummy_extent_buffer(fs_info, BTRFS_SUPER_INFO_OFFSET,
+                                      BTRFS_SUPER_INFO_SIZE);
+       if (!sb)
+               return -ENOMEM;
+       btrfs_set_buffer_uptodate(sb);
+       write_extent_buffer(sb, super_copy, 0, sizeof(*super_copy));
+       array_size = btrfs_super_sys_array_size(super_copy);
+
+       array_ptr = super_copy->sys_chunk_array;
+       sb_array_offset = offsetof(struct btrfs_super_block, sys_chunk_array);
+       cur_offset = 0;
+
+       while (cur_offset < array_size) {
+               disk_key = (struct btrfs_disk_key *)array_ptr;
+               len = sizeof(*disk_key);
+               if (cur_offset + len > array_size)
+                       goto out_short_read;
+
+               btrfs_disk_key_to_cpu(&key, disk_key);
+
+               array_ptr += len;
+               sb_array_offset += len;
+               cur_offset += len;
+
+               if (key.type == BTRFS_CHUNK_ITEM_KEY) {
+                       chunk = (struct btrfs_chunk *)sb_array_offset;
+                       /*
+                        * At least one btrfs_chunk with one stripe must be
+                        * present, exact stripe count check comes afterwards
+                        */
+                       len = btrfs_chunk_item_size(1);
+                       if (cur_offset + len > array_size)
+                               goto out_short_read;
+
+                       num_stripes = btrfs_chunk_num_stripes(sb, chunk);
+                       if (!num_stripes) {
+                               printk(
+           "ERROR: invalid number of stripes %u in sys_array at offset %u\n",
+                                       num_stripes, cur_offset);
+                               ret = -EIO;
+                               break;
+                       }
+
+                       len = btrfs_chunk_item_size(num_stripes);
+                       if (cur_offset + len > array_size)
+                               goto out_short_read;
+
+                       ret = read_one_chunk(fs_info, &key, sb, chunk, -1);
+                       if (ret)
+                               break;
+               } else {
+                       printk(
+               "ERROR: unexpected item type %u in sys_array at offset %u\n",
+                               (u32)key.type, cur_offset);
+                       ret = -EIO;
+                       break;
+               }
+               array_ptr += len;
+               sb_array_offset += len;
+               cur_offset += len;
+       }
+       free_extent_buffer(sb);
+       return ret;
+
+out_short_read:
+       printk("ERROR: sys_array too short to read %u bytes at offset %u\n",
+                       len, cur_offset);
+       free_extent_buffer(sb);
+       return -EIO;
+}
+
+int btrfs_read_chunk_tree(struct btrfs_fs_info *fs_info)
+{
+       struct btrfs_path *path;
+       struct extent_buffer *leaf;
+       struct btrfs_key key;
+       struct btrfs_key found_key;
+       struct btrfs_root *root = fs_info->chunk_root;
+       int ret;
+       int slot;
+
+       path = btrfs_alloc_path();
+       if (!path)
+               return -ENOMEM;
+
+       /*
+        * Read all device items, and then all the chunk items. All
+        * device items are found before any chunk item (their object id
+        * is smaller than the lowest possible object id for a chunk
+        * item - BTRFS_FIRST_CHUNK_TREE_OBJECTID).
+        */
+       key.objectid = BTRFS_DEV_ITEMS_OBJECTID;
+       key.offset = 0;
+       key.type = 0;
+       ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
+       if (ret < 0)
+               goto error;
+       while(1) {
+               leaf = path->nodes[0];
+               slot = path->slots[0];
+               if (slot >= btrfs_header_nritems(leaf)) {
+                       ret = btrfs_next_leaf(root, path);
+                       if (ret == 0)
+                               continue;
+                       if (ret < 0)
+                               goto error;
+                       break;
+               }
+               btrfs_item_key_to_cpu(leaf, &found_key, slot);
+               if (found_key.type == BTRFS_DEV_ITEM_KEY) {
+                       struct btrfs_dev_item *dev_item;
+                       dev_item = btrfs_item_ptr(leaf, slot,
+                                                 struct btrfs_dev_item);
+                       ret = read_one_dev(fs_info, leaf, dev_item);
+                       if (ret < 0)
+                               goto error;
+               } else if (found_key.type == BTRFS_CHUNK_ITEM_KEY) {
+                       struct btrfs_chunk *chunk;
+                       chunk = btrfs_item_ptr(leaf, slot, struct btrfs_chunk);
+                       ret = read_one_chunk(fs_info, &found_key, leaf, chunk,
+                                            slot);
+                       if (ret < 0)
+                               goto error;
+               }
+               path->slots[0]++;
+       }
+
+       ret = 0;
+error:
+       btrfs_free_path(path);
+       return ret;
+}
+
+/*
+ * Get stripe length from chunk item and its stripe items
+ *
+ * Caller should only call this function after validating the chunk item
+ * by using btrfs_check_chunk_valid().
+ */
+u64 btrfs_stripe_length(struct btrfs_fs_info *fs_info,
+                       struct extent_buffer *leaf,
+                       struct btrfs_chunk *chunk)
+{
+       u64 stripe_len;
+       u64 chunk_len;
+       u32 num_stripes = btrfs_chunk_num_stripes(leaf, chunk);
+       u64 profile = btrfs_chunk_type(leaf, chunk) &
+                     BTRFS_BLOCK_GROUP_PROFILE_MASK;
+
+       chunk_len = btrfs_chunk_length(leaf, chunk);
+
+       switch (profile) {
+       case 0: /* Single profile */
+       case BTRFS_BLOCK_GROUP_RAID1:
+       case BTRFS_BLOCK_GROUP_RAID1C3:
+       case BTRFS_BLOCK_GROUP_RAID1C4:
+       case BTRFS_BLOCK_GROUP_DUP:
+               stripe_len = chunk_len;
+               break;
+       case BTRFS_BLOCK_GROUP_RAID0:
+               stripe_len = chunk_len / num_stripes;
+               break;
+       case BTRFS_BLOCK_GROUP_RAID5:
+               stripe_len = chunk_len / (num_stripes - 1);
+               break;
+       case BTRFS_BLOCK_GROUP_RAID6:
+               stripe_len = chunk_len / (num_stripes - 2);
+               break;
+       case BTRFS_BLOCK_GROUP_RAID10:
+               stripe_len = chunk_len / (num_stripes /
+                               btrfs_chunk_sub_stripes(leaf, chunk));
+               break;
+       default:
+               /* Invalid chunk profile found */
+               BUG_ON(1);
+       }
+       return stripe_len;
+}
+
+int btrfs_num_copies(struct btrfs_fs_info *fs_info, u64 logical, u64 len)
+{
+       struct btrfs_mapping_tree *map_tree = &fs_info->mapping_tree;
+       struct cache_extent *ce;
+       struct map_lookup *map;
+       int ret;
+
+       ce = search_cache_extent(&map_tree->cache_tree, logical);
+       if (!ce) {
+               fprintf(stderr, "No mapping for %llu-%llu\n",
+                       (unsigned long long)logical,
+                       (unsigned long long)logical+len);
+               return 1;
+       }
+       if (ce->start > logical || ce->start + ce->size < logical) {
+               fprintf(stderr, "Invalid mapping for %llu-%llu, got "
+                       "%llu-%llu\n", (unsigned long long)logical,
+                       (unsigned long long)logical+len,
+                       (unsigned long long)ce->start,
+                       (unsigned long long)ce->start + ce->size);
+               return 1;
+       }
+       map = container_of(ce, struct map_lookup, ce);
+
+       if (map->type & (BTRFS_BLOCK_GROUP_DUP | BTRFS_BLOCK_GROUP_RAID1 |
+                        BTRFS_BLOCK_GROUP_RAID1C3 | BTRFS_BLOCK_GROUP_RAID1C4))
+               ret = map->num_stripes;
+       else if (map->type & BTRFS_BLOCK_GROUP_RAID10)
+               ret = map->sub_stripes;
+       else if (map->type & BTRFS_BLOCK_GROUP_RAID5)
+               ret = 2;
+       else if (map->type & BTRFS_BLOCK_GROUP_RAID6)
+               ret = 3;
+       else
+               ret = 1;
+       return ret;
+}
+
+int btrfs_next_bg(struct btrfs_fs_info *fs_info, u64 *logical,
+                 u64 *size, u64 type)
+{
+       struct btrfs_mapping_tree *map_tree = &fs_info->mapping_tree;
+       struct cache_extent *ce;
+       struct map_lookup *map;
+       u64 cur = *logical;
+
+       ce = search_cache_extent(&map_tree->cache_tree, cur);
+
+       while (ce) {
+               /*
+                * only jump to next bg if our cur is not 0
+                * As the initial logical for btrfs_next_bg() is 0, and
+                * if we jump to next bg, we skipped a valid bg.
+                */
+               if (cur) {
+                       ce = next_cache_extent(ce);
+                       if (!ce)
+                               return -ENOENT;
+               }
+
+               cur = ce->start;
+               map = container_of(ce, struct map_lookup, ce);
+               if (map->type & type) {
+                       *logical = ce->start;
+                       *size = ce->size;
+                       return 0;
+               }
+               if (!cur)
+                       ce = next_cache_extent(ce);
+       }
+
+       return -ENOENT;
+}
+
+static inline int parity_smaller(u64 a, u64 b)
+{
+       return a > b;
+}
+
+/* Bubble-sort the stripe set to put the parity/syndrome stripes last */
+static void sort_parity_stripes(struct btrfs_multi_bio *bbio, u64 *raid_map)
+{
+       struct btrfs_bio_stripe s;
+       int i;
+       u64 l;
+       int again = 1;
+
+       while (again) {
+               again = 0;
+               for (i = 0; i < bbio->num_stripes - 1; i++) {
+                       if (parity_smaller(raid_map[i], raid_map[i+1])) {
+                               s = bbio->stripes[i];
+                               l = raid_map[i];
+                               bbio->stripes[i] = bbio->stripes[i+1];
+                               raid_map[i] = raid_map[i+1];
+                               bbio->stripes[i+1] = s;
+                               raid_map[i+1] = l;
+                               again = 1;
+                       }
+               }
+       }
+}
+
+int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
+                     u64 logical, u64 *length, u64 *type,
+                     struct btrfs_multi_bio **multi_ret, int mirror_num,
+                     u64 **raid_map_ret)
+{
+       struct btrfs_mapping_tree *map_tree = &fs_info->mapping_tree;
+       struct cache_extent *ce;
+       struct map_lookup *map;
+       u64 offset;
+       u64 stripe_offset;
+       u64 *raid_map = NULL;
+       int stripe_nr;
+       int stripes_allocated = 8;
+       int stripes_required = 1;
+       int stripe_index;
+       int i;
+       struct btrfs_multi_bio *multi = NULL;
+
+       if (multi_ret && rw == READ) {
+               stripes_allocated = 1;
+       }
+again:
+       ce = search_cache_extent(&map_tree->cache_tree, logical);
+       if (!ce) {
+               kfree(multi);
+               *length = (u64)-1;
+               return -ENOENT;
+       }
+       if (ce->start > logical) {
+               kfree(multi);
+               *length = ce->start - logical;
+               return -ENOENT;
+       }
+
+       if (multi_ret) {
+               multi = kzalloc(btrfs_multi_bio_size(stripes_allocated),
+                               GFP_NOFS);
+               if (!multi)
+                       return -ENOMEM;
+       }
+       map = container_of(ce, struct map_lookup, ce);
+       offset = logical - ce->start;
+
+       if (rw == WRITE) {
+               if (map->type & (BTRFS_BLOCK_GROUP_RAID1 |
+                                BTRFS_BLOCK_GROUP_RAID1C3 |
+                                BTRFS_BLOCK_GROUP_RAID1C4 |
+                                BTRFS_BLOCK_GROUP_DUP)) {
+                       stripes_required = map->num_stripes;
+               } else if (map->type & BTRFS_BLOCK_GROUP_RAID10) {
+                       stripes_required = map->sub_stripes;
+               }
+       }
+       if (map->type & (BTRFS_BLOCK_GROUP_RAID5 | BTRFS_BLOCK_GROUP_RAID6)
+           && multi_ret && ((rw & WRITE) || mirror_num > 1) && raid_map_ret) {
+                   /* RAID[56] write or recovery. Return all stripes */
+                   stripes_required = map->num_stripes;
+
+                   /* Only allocate the map if we've already got a large enough multi_ret */
+                   if (stripes_allocated >= stripes_required) {
+                           raid_map = kmalloc(sizeof(u64) * map->num_stripes, GFP_NOFS);
+                           if (!raid_map) {
+                                   kfree(multi);
+                                   return -ENOMEM;
+                           }
+                   }
+       }
+
+       /* if our multi bio struct is too small, back off and try again */
+       if (multi_ret && stripes_allocated < stripes_required) {
+               stripes_allocated = stripes_required;
+               kfree(multi);
+               multi = NULL;
+               goto again;
+       }
+       stripe_nr = offset;
+       /*
+        * stripe_nr counts the total number of stripes we have to stride
+        * to get to this block
+        */
+       stripe_nr = stripe_nr / map->stripe_len;
+
+       stripe_offset = stripe_nr * map->stripe_len;
+       BUG_ON(offset < stripe_offset);
+
+       /* stripe_offset is the offset of this block in its stripe*/
+       stripe_offset = offset - stripe_offset;
+
+       if (map->type & (BTRFS_BLOCK_GROUP_RAID0 | BTRFS_BLOCK_GROUP_RAID1 |
+                        BTRFS_BLOCK_GROUP_RAID1C3 | BTRFS_BLOCK_GROUP_RAID1C4 |
+                        BTRFS_BLOCK_GROUP_RAID5 | BTRFS_BLOCK_GROUP_RAID6 |
+                        BTRFS_BLOCK_GROUP_RAID10 |
+                        BTRFS_BLOCK_GROUP_DUP)) {
+               /* we limit the length of each bio to what fits in a stripe */
+               *length = min_t(u64, ce->size - offset,
+                             map->stripe_len - stripe_offset);
+       } else {
+               *length = ce->size - offset;
+       }
+
+       if (!multi_ret)
+               goto out;
+
+       multi->num_stripes = 1;
+       stripe_index = 0;
+       if (map->type & (BTRFS_BLOCK_GROUP_RAID1 |
+                        BTRFS_BLOCK_GROUP_RAID1C3 |
+                        BTRFS_BLOCK_GROUP_RAID1C4)) {
+               if (rw == WRITE)
+                       multi->num_stripes = map->num_stripes;
+               else if (mirror_num)
+                       stripe_index = mirror_num - 1;
+               else
+                       stripe_index = stripe_nr % map->num_stripes;
+       } else if (map->type & BTRFS_BLOCK_GROUP_RAID10) {
+               int factor = map->num_stripes / map->sub_stripes;
+
+               stripe_index = stripe_nr % factor;
+               stripe_index *= map->sub_stripes;
+
+               if (rw == WRITE)
+                       multi->num_stripes = map->sub_stripes;
+               else if (mirror_num)
+                       stripe_index += mirror_num - 1;
+
+               stripe_nr = stripe_nr / factor;
+       } else if (map->type & BTRFS_BLOCK_GROUP_DUP) {
+               if (rw == WRITE)
+                       multi->num_stripes = map->num_stripes;
+               else if (mirror_num)
+                       stripe_index = mirror_num - 1;
+       } else if (map->type & (BTRFS_BLOCK_GROUP_RAID5 |
+                               BTRFS_BLOCK_GROUP_RAID6)) {
+
+               if (raid_map) {
+                       int rot;
+                       u64 tmp;
+                       u64 raid56_full_stripe_start;
+                       u64 full_stripe_len = nr_data_stripes(map) * map->stripe_len;
+
+                       /*
+                        * align the start of our data stripe in the logical
+                        * address space
+                        */
+                       raid56_full_stripe_start = offset / full_stripe_len;
+                       raid56_full_stripe_start *= full_stripe_len;
+
+                       /* get the data stripe number */
+                       stripe_nr = raid56_full_stripe_start / map->stripe_len;
+                       stripe_nr = stripe_nr / nr_data_stripes(map);
+
+                       /* Work out the disk rotation on this stripe-set */
+                       rot = stripe_nr % map->num_stripes;
+
+                       /* Fill in the logical address of each stripe */
+                       tmp = stripe_nr * nr_data_stripes(map);
+
+                       for (i = 0; i < nr_data_stripes(map); i++)
+                               raid_map[(i+rot) % map->num_stripes] =
+                                       ce->start + (tmp + i) * map->stripe_len;
+
+                       raid_map[(i+rot) % map->num_stripes] = BTRFS_RAID5_P_STRIPE;
+                       if (map->type & BTRFS_BLOCK_GROUP_RAID6)
+                               raid_map[(i+rot+1) % map->num_stripes] = BTRFS_RAID6_Q_STRIPE;
+
+                       *length = map->stripe_len;
+                       stripe_index = 0;
+                       stripe_offset = 0;
+                       multi->num_stripes = map->num_stripes;
+               } else {
+                       stripe_index = stripe_nr % nr_data_stripes(map);
+                       stripe_nr = stripe_nr / nr_data_stripes(map);
+
+                       /*
+                        * Mirror #0 or #1 means the original data block.
+                        * Mirror #2 is RAID5 parity block.
+                        * Mirror #3 is RAID6 Q block.
+                        */
+                       if (mirror_num > 1)
+                               stripe_index = nr_data_stripes(map) + mirror_num - 2;
+
+                       /* We distribute the parity blocks across stripes */
+                       stripe_index = (stripe_nr + stripe_index) % map->num_stripes;
+               }
+       } else {
+               /*
+                * after this do_div call, stripe_nr is the number of stripes
+                * on this device we have to walk to find the data, and
+                * stripe_index is the number of our device in the stripe array
+                */
+               stripe_index = stripe_nr % map->num_stripes;
+               stripe_nr = stripe_nr / map->num_stripes;
+       }
+       BUG_ON(stripe_index >= map->num_stripes);
+
+       for (i = 0; i < multi->num_stripes; i++) {
+               multi->stripes[i].physical =
+                       map->stripes[stripe_index].physical + stripe_offset +
+                       stripe_nr * map->stripe_len;
+               multi->stripes[i].dev = map->stripes[stripe_index].dev;
+               stripe_index++;
+       }
+       *multi_ret = multi;
+
+       if (type)
+               *type = map->type;
+
+       if (raid_map) {
+               sort_parity_stripes(multi, raid_map);
+               *raid_map_ret = raid_map;
+       }
+out:
+       return 0;
+}
+
+int btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
+                   u64 logical, u64 *length,
+                   struct btrfs_multi_bio **multi_ret, int mirror_num,
+                   u64 **raid_map_ret)
+{
+       return __btrfs_map_block(fs_info, rw, logical, length, NULL,
+                                multi_ret, mirror_num, raid_map_ret);
+}
diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
new file mode 100644 (file)
index 0000000..9d1a07a
--- /dev/null
@@ -0,0 +1,204 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+#ifndef __BTRFS_VOLUMES_H__
+#define __BTRFS_VOLUMES_H__
+
+#include <fs_internal.h>
+#include "ctree.h"
+
+#define BTRFS_STRIPE_LEN       SZ_64K
+
+struct btrfs_device {
+       struct list_head dev_list;
+       struct btrfs_root *dev_root;
+       struct btrfs_fs_devices *fs_devices;
+
+       struct blk_desc *desc;
+       struct disk_partition *part;
+
+       u64 total_devs;
+       u64 super_bytes_used;
+
+       u64 generation;
+
+       /* the internal btrfs device id */
+       u64 devid;
+
+       /* size of the device */
+       u64 total_bytes;
+
+       /* bytes used */
+       u64 bytes_used;
+
+       /* optimal io alignment for this device */
+       u32 io_align;
+
+       /* optimal io width for this device */
+       u32 io_width;
+
+       /* minimal io size for this device */
+       u32 sector_size;
+
+       /* type and info about this device */
+       u64 type;
+
+       /* physical drive uuid (or lvm uuid) */
+       u8 uuid[BTRFS_UUID_SIZE];
+};
+
+struct btrfs_fs_devices {
+       u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */
+       u8 metadata_uuid[BTRFS_FSID_SIZE]; /* FS specific uuid */
+
+       u64 latest_devid;
+       u64 lowest_devid;
+       u64 latest_trans;
+
+       u64 total_rw_bytes;
+
+       struct list_head devices;
+       struct list_head list;
+
+       int seeding;
+       struct btrfs_fs_devices *seed;
+};
+
+struct btrfs_bio_stripe {
+       struct btrfs_device *dev;
+       u64 physical;
+};
+
+struct btrfs_multi_bio {
+       int error;
+       int num_stripes;
+       struct btrfs_bio_stripe stripes[];
+};
+
+struct map_lookup {
+       struct cache_extent ce;
+       u64 type;
+       int io_align;
+       int io_width;
+       int stripe_len;
+       int sector_size;
+       int num_stripes;
+       int sub_stripes;
+       struct btrfs_bio_stripe stripes[];
+};
+
+struct btrfs_raid_attr {
+       int sub_stripes;        /* sub_stripes info for map */
+       int dev_stripes;        /* stripes per dev */
+       int devs_max;           /* max devs to use */
+       int devs_min;           /* min devs needed */
+       int tolerated_failures; /* max tolerated fail devs */
+       int devs_increment;     /* ndevs has to be a multiple of this */
+       int ncopies;            /* how many copies to data has */
+       int nparity;            /* number of stripes worth of bytes to store
+                                * parity information */
+       const char raid_name[8]; /* name of the raid */
+       u64 bg_flag;            /* block group flag of the raid */
+};
+
+extern const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES];
+
+static inline enum btrfs_raid_types btrfs_bg_flags_to_raid_index(u64 flags)
+{
+       if (flags & BTRFS_BLOCK_GROUP_RAID10)
+               return BTRFS_RAID_RAID10;
+       else if (flags & BTRFS_BLOCK_GROUP_RAID1)
+               return BTRFS_RAID_RAID1;
+       else if (flags & BTRFS_BLOCK_GROUP_RAID1C3)
+               return BTRFS_RAID_RAID1C3;
+       else if (flags & BTRFS_BLOCK_GROUP_RAID1C4)
+               return BTRFS_RAID_RAID1C4;
+       else if (flags & BTRFS_BLOCK_GROUP_DUP)
+               return BTRFS_RAID_DUP;
+       else if (flags & BTRFS_BLOCK_GROUP_RAID0)
+               return BTRFS_RAID_RAID0;
+       else if (flags & BTRFS_BLOCK_GROUP_RAID5)
+               return BTRFS_RAID_RAID5;
+       else if (flags & BTRFS_BLOCK_GROUP_RAID6)
+               return BTRFS_RAID_RAID6;
+
+       return BTRFS_RAID_SINGLE; /* BTRFS_BLOCK_GROUP_SINGLE */
+}
+
+#define btrfs_multi_bio_size(n) (sizeof(struct btrfs_multi_bio) + \
+                           (sizeof(struct btrfs_bio_stripe) * (n)))
+#define btrfs_map_lookup_size(n) (sizeof(struct map_lookup) + \
+                                (sizeof(struct btrfs_bio_stripe) * (n)))
+
+#define BTRFS_RAID5_P_STRIPE ((u64)-2)
+#define BTRFS_RAID6_Q_STRIPE ((u64)-1)
+
+static inline u64 calc_stripe_length(u64 type, u64 length, int num_stripes)
+{
+       u64 stripe_size;
+
+       if (type & BTRFS_BLOCK_GROUP_RAID0) {
+               stripe_size = length;
+               stripe_size /= num_stripes;
+       } else if (type & BTRFS_BLOCK_GROUP_RAID10) {
+               stripe_size = length * 2;
+               stripe_size /= num_stripes;
+       } else if (type & BTRFS_BLOCK_GROUP_RAID5) {
+               stripe_size = length;
+               stripe_size /= (num_stripes - 1);
+       } else if (type & BTRFS_BLOCK_GROUP_RAID6) {
+               stripe_size = length;
+               stripe_size /= (num_stripes - 2);
+       } else {
+               stripe_size = length;
+       }
+       return stripe_size;
+}
+
+#ifndef READ
+#define READ 0
+#define WRITE 1
+#define READA 2
+#endif
+
+int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
+                     u64 logical, u64 *length, u64 *type,
+                     struct btrfs_multi_bio **multi_ret, int mirror_num,
+                     u64 **raid_map);
+int btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
+                   u64 logical, u64 *length,
+                   struct btrfs_multi_bio **multi_ret, int mirror_num,
+                   u64 **raid_map_ret);
+int btrfs_next_bg(struct btrfs_fs_info *map_tree, u64 *logical,
+                    u64 *size, u64 type);
+static inline int btrfs_next_bg_metadata(struct btrfs_fs_info *fs_info,
+                                        u64 *logical, u64 *size)
+{
+       return btrfs_next_bg(fs_info, logical, size,
+                       BTRFS_BLOCK_GROUP_METADATA);
+}
+static inline int btrfs_next_bg_system(struct btrfs_fs_info *fs_info,
+                                      u64 *logical, u64 *size)
+{
+       return btrfs_next_bg(fs_info, logical, size,
+                       BTRFS_BLOCK_GROUP_SYSTEM);
+}
+int btrfs_read_sys_array(struct btrfs_fs_info *fs_info);
+int btrfs_read_chunk_tree(struct btrfs_fs_info *fs_info);
+int btrfs_open_devices(struct btrfs_fs_devices *fs_devices);
+int btrfs_close_devices(struct btrfs_fs_devices *fs_devices);
+void btrfs_close_all_devices(void);
+int btrfs_num_copies(struct btrfs_fs_info *fs_info, u64 logical, u64 len);
+int btrfs_scan_one_device(struct blk_desc *desc, struct disk_partition *part,
+                         struct btrfs_fs_devices **fs_devices_ret,
+                         u64 *total_devs);
+struct list_head *btrfs_scanned_uuids(void);
+struct btrfs_device *btrfs_find_device(struct btrfs_fs_info *fs_info, u64 devid,
+                                      u8 *uuid, u8 *fsid);
+int btrfs_check_chunk_valid(struct btrfs_fs_info *fs_info,
+                           struct extent_buffer *leaf,
+                           struct btrfs_chunk *chunk,
+                           int slot, u64 logical);
+u64 btrfs_stripe_length(struct btrfs_fs_info *fs_info,
+                       struct extent_buffer *leaf,
+                       struct btrfs_chunk *chunk);
+#endif
index 62e61d4..637de0c 100644 (file)
@@ -27,8 +27,6 @@
 #include <linux/types.h>
 
 struct bd_info {
-       unsigned long   bi_memstart;    /* start of DRAM memory */
-       phys_size_t     bi_memsize;     /* size  of DRAM memory in bytes */
        unsigned long   bi_flashstart;  /* start of FLASH memory */
        unsigned long   bi_flashsize;   /* size  of FLASH memory */
        unsigned long   bi_flashoffset; /* reserved area for startup monitor */
@@ -70,12 +68,10 @@ struct bd_info {
 #endif
        ulong           bi_arch_number; /* unique id for this board */
        ulong           bi_boot_params; /* where this board expects params */
-#ifdef CONFIG_NR_DRAM_BANKS
        struct {                        /* RAM configuration */
                phys_addr_t start;
                phys_size_t size;
        } bi_dram[CONFIG_NR_DRAM_BANKS];
-#endif /* CONFIG_NR_DRAM_BANKS */
 };
 
 #endif /* __ASSEMBLY__ */
index 7f64152..738f73e 100644 (file)
@@ -9,6 +9,18 @@
 
 #include <linux/compiler.h>
 
+/*
+ * Chimp binary has health status like initialization complete,
+ * crash or running fine
+ */
+#define BCM_CHIMP_RUNNIG_GOOD  0x8000
+
+enum {
+       CHIMP_HANDSHAKE_SUCCESS = 0,
+       CHIMP_HANDSHAKE_WAIT_ERROR,
+       CHIMP_HANDSHAKE_WAIT_TIMEOUT,
+};
+
 /**
  * chimp_fastboot_optee() - api to load bnxt firmware
  *
diff --git a/include/configs/P1023RDB.h b/include/configs/P1023RDB.h
deleted file mode 100644 (file)
index 5c29a4f..0000000
+++ /dev/null
@@ -1,338 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright 2013 Freescale Semiconductor, Inc.
- *
- * Authors:  Roy Zang <tie-fei.zang@freescale.com>
- *          Chunhe Lan <Chunhe.Lan@freescale.com>
- */
-
-#ifndef __CONFIG_H
-#define __CONFIG_H
-
-#include <linux/stringify.h>
-
-#ifndef CONFIG_SYS_MONITOR_BASE
-#define CONFIG_SYS_MONITOR_BASE        CONFIG_SYS_TEXT_BASE    /* start of monitor */
-#endif
-
-#ifndef CONFIG_RESET_VECTOR_ADDRESS
-#define CONFIG_RESET_VECTOR_ADDRESS    0xeffffffc
-#endif
-
-/* High Level Configuration Options */
-
-#define CONFIG_PCI_INDIRECT_BRIDGE     /* indirect PCI bridge support */
-#define CONFIG_PCIE1           /* PCIE controller 1 (slot 1) */
-#define CONFIG_PCIE2           /* PCIE controller 2 (slot 2) */
-#define CONFIG_PCIE3           /* PCIE controller 3 (slot 3) */
-#define CONFIG_FSL_PCI_INIT    /* Use common FSL init code */
-#define CONFIG_SYS_PCI_64BIT   /* enable 64-bit PCI resources */
-
-#ifndef __ASSEMBLY__
-extern unsigned long get_clock_freq(void);
-#endif
-
-#define CONFIG_SYS_CLK_FREQ    66666666
-#define CONFIG_DDR_CLK_FREQ    CONFIG_SYS_CLK_FREQ
-
-/*
- * These can be toggled for performance analysis, otherwise use default.
- */
-#define CONFIG_L2_CACHE                        /* toggle L2 cache */
-#define CONFIG_BTB                     /* toggle branch predition */
-#define CONFIG_HWCONFIG
-
-#define CONFIG_ENABLE_36BIT_PHYS
-
-/* Implement conversion of addresses in the LBC */
-#define CONFIG_SYS_LBC_LBCR            0x00000000
-#define CONFIG_SYS_LBC_LCRR            LCRR_CLKDIV_8
-
-/* DDR Setup */
-#define CONFIG_VERY_BIG_RAM
-#define CONFIG_SYS_DDR_SDRAM_BASE      0x00000000
-#define CONFIG_SYS_SDRAM_BASE          CONFIG_SYS_DDR_SDRAM_BASE
-
-#define CONFIG_DIMM_SLOTS_PER_CTLR     1
-#define CONFIG_CHIP_SELECTS_PER_CTRL   1
-
-#define CONFIG_DDR_SPD
-#define CONFIG_SYS_SDRAM_SIZE          512u    /* DDR is 512M */
-#define CONFIG_SYS_SPD_BUS_NUM          0
-#define SPD_EEPROM_ADDRESS              0x50
-#define CONFIG_SYS_DDR_RAW_TIMING
-
-/*
- * Memory map
- *
- * 0x0000_0000 0x1fff_ffff     DDR                     512M cacheable
- * 0x8000_0000 0xbfff_ffff     PCI Express Mem         1G non-cacheable
- * 0xc000_0000 0xdfff_ffff     PCI                     512M non-cacheable
- * 0xe100_0000 0xe3ff_ffff     PCI IO range            4M non-cacheable
- * 0xff00_0000 0xff3f_ffff     DPAA_QBMAN              4M cacheable
- * 0xff60_0000 0xff7f_ffff     CCSR                    2M non-cacheable
- * 0xffd0_0000 0xffd0_3fff     L1 for stack            16K cacheable TLB0
- *
- * Localbus non-cacheable
- *
- * 0xec00_0000 0xefff_ffff     NOR flash               64M non-cacheable
- * 0xffa0_0000 0xffaf_ffff     NAND                    1M non-cacheable
- */
-
-/*
- * Local Bus Definitions
- */
-#define CONFIG_SYS_FLASH_BASE          0xec000000 /* start of FLASH 64M */
-#define CONFIG_SYS_FLASH_BASE_PHYS     CONFIG_SYS_FLASH_BASE
-
-#define CONFIG_FLASH_BR_PRELIM  (BR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS) \
-                               | BR_PS_16 | BR_V)
-#define CONFIG_FLASH_OR_PRELIM 0xfc000ff7
-
-#define CONFIG_SYS_FLASH_EMPTY_INFO
-#define CONFIG_SYS_MAX_FLASH_BANKS     1       /* number of banks */
-#define CONFIG_SYS_MAX_FLASH_SECT      512     /* sectors per device */
-#define CONFIG_SYS_FLASH_ERASE_TOUT    60000   /* Flash Erase Timeout (ms) */
-#define CONFIG_SYS_FLASH_WRITE_TOUT    500     /* Flash Write Timeout (ms) */
-
-#define CONFIG_SYS_INIT_RAM_LOCK
-#define CONFIG_SYS_INIT_RAM_ADDR       0xffd00000      /* Initial L1 address */
-#define CONFIG_SYS_INIT_RAM_SIZE       0x00004000/* Size of used area in RAM */
-#define CONFIG_SYS_GBL_DATA_OFFSET     (CONFIG_SYS_INIT_RAM_SIZE - \
-                                       GENERATED_GBL_DATA_SIZE)
-#define CONFIG_SYS_INIT_SP_OFFSET      CONFIG_SYS_GBL_DATA_OFFSET
-
-#define CONFIG_SYS_MONITOR_LEN (768 * 1024)      /* Reserve 512 kB for Mon */
-#define CONFIG_SYS_MALLOC_LEN  (6 * 1024 * 1024) /* Reserved for malloc */
-
-#define CONFIG_SYS_NAND_BASE           0xffa00000
-#define CONFIG_SYS_NAND_BASE_PHYS      CONFIG_SYS_NAND_BASE
-
-#define CONFIG_SYS_NAND_BASE_LIST      { CONFIG_SYS_NAND_BASE }
-#define CONFIG_SYS_MAX_NAND_DEVICE     1
-#define CONFIG_NAND_FSL_ELBC
-#define CONFIG_SYS_NAND_BLOCK_SIZE     (128 * 1024)
-
-/* NAND flash config */
-#define CONFIG_SYS_NAND_BR_PRELIM  (BR_PHYS_ADDR(CONFIG_SYS_NAND_BASE_PHYS) \
-                               | (2<<BR_DECC_SHIFT)    /* Use HW ECC */ \
-                               | BR_PS_8               /* Port Size = 8bit */ \
-                               | BR_MS_FCM             /* MSEL = FCM */ \
-                               | BR_V)                 /* valid */
-#define CONFIG_SYS_NAND_OR_PRELIM  (OR_AM_256KB                /* length 256K */ \
-                               | OR_FCM_PGS \
-                               | OR_FCM_CSCT \
-                               | OR_FCM_CST \
-                               | OR_FCM_CHT \
-                               | OR_FCM_SCY_1 \
-                               | OR_FCM_TRLX \
-                               | OR_FCM_EHTR)
-
-#define CONFIG_SYS_BR0_PRELIM  CONFIG_FLASH_BR_PRELIM  /* NOR Base Address */
-#define CONFIG_SYS_OR0_PRELIM  CONFIG_FLASH_OR_PRELIM  /* NOR Options */
-#define CONFIG_SYS_BR1_PRELIM  CONFIG_SYS_NAND_BR_PRELIM
-#define CONFIG_SYS_OR1_PRELIM  CONFIG_SYS_NAND_OR_PRELIM /* NAND Options */
-
-/* Serial Port */
-#undef CONFIG_SERIAL_SOFTWARE_FIFO
-#define CONFIG_SYS_NS16550_SERIAL
-#define CONFIG_SYS_NS16550_REG_SIZE    1
-#define CONFIG_SYS_NS16550_CLK         get_bus_freq(0)
-
-#define CONFIG_SYS_BAUDRATE_TABLE      \
-       {300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200}
-
-#define CONFIG_SYS_NS16550_COM1        (CONFIG_SYS_CCSRBAR + 0x4500)
-#define CONFIG_SYS_NS16550_COM2        (CONFIG_SYS_CCSRBAR + 0x4600)
-
-/* I2C */
-#define CONFIG_SYS_I2C
-#define CONFIG_SYS_I2C_FSL
-#define CONFIG_SYS_FSL_I2C_SPEED       400000
-#define CONFIG_SYS_FSL_I2C_SLAVE       0x7F
-#define CONFIG_SYS_FSL_I2C_OFFSET      0x3000
-#define CONFIG_SYS_FSL_I2C2_SPEED      400000
-#define CONFIG_SYS_FSL_I2C2_SLAVE      0x7F
-#define CONFIG_SYS_FSL_I2C2_OFFSET     0x3100
-
-/*
- * I2C2 EEPROM
- */
-#define CONFIG_ID_EEPROM
-#ifdef CONFIG_ID_EEPROM
-#define CONFIG_SYS_I2C_EEPROM_NXID
-#endif
-#define CONFIG_SYS_I2C_EEPROM_ADDR             0x50
-#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN         1
-#define CONFIG_SYS_EEPROM_BUS_NUM              0
-
-/*
- * General PCI
- * Memory space is mapped 1-1, but I/O space must start from 0.
- */
-
-/* controller 3, Slot 1, tgtid 3, Base address b000 */
-#define CONFIG_SYS_PCIE3_NAME          "Slot 3"
-#define CONFIG_SYS_PCIE3_MEM_VIRT      0x80000000
-#define CONFIG_SYS_PCIE3_MEM_BUS       0x80000000
-#define CONFIG_SYS_PCIE3_MEM_PHYS      0x80000000
-#define CONFIG_SYS_PCIE3_MEM_SIZE      0x20000000      /* 512M */
-#define CONFIG_SYS_PCIE3_IO_VIRT       0xffc00000
-#define CONFIG_SYS_PCIE3_IO_BUS                0x00000000
-#define CONFIG_SYS_PCIE3_IO_PHYS       0xffc00000
-#define CONFIG_SYS_PCIE3_IO_SIZE       0x00010000      /* 64k */
-
-/* controller 2, direct to uli, tgtid 2, Base address 9000 */
-#define CONFIG_SYS_PCIE2_NAME          "Slot 2"
-#define CONFIG_SYS_PCIE2_MEM_VIRT      0xa0000000
-#define CONFIG_SYS_PCIE2_MEM_BUS       0xa0000000
-#define CONFIG_SYS_PCIE2_MEM_PHYS      0xa0000000
-#define CONFIG_SYS_PCIE2_MEM_SIZE      0x20000000      /* 512M */
-#define CONFIG_SYS_PCIE2_IO_VIRT       0xffc10000
-#define CONFIG_SYS_PCIE2_IO_BUS                0x00000000
-#define CONFIG_SYS_PCIE2_IO_PHYS       0xffc10000
-#define CONFIG_SYS_PCIE2_IO_SIZE       0x00010000      /* 64k */
-
-/* controller 1, Slot 2, tgtid 1, Base address a000 */
-#define CONFIG_SYS_PCIE1_NAME          "Slot 1"
-#define CONFIG_SYS_PCIE1_MEM_VIRT      0xc0000000
-#define CONFIG_SYS_PCIE1_MEM_BUS       0xc0000000
-#define CONFIG_SYS_PCIE1_MEM_PHYS      0xc0000000
-#define CONFIG_SYS_PCIE1_MEM_SIZE      0x20000000      /* 512M */
-#define CONFIG_SYS_PCIE1_IO_VIRT       0xffc20000
-#define CONFIG_SYS_PCIE1_IO_BUS                0x00000000
-#define CONFIG_SYS_PCIE1_IO_PHYS       0xffc20000
-#define CONFIG_SYS_PCIE1_IO_SIZE       0x00010000      /* 64k */
-
-#if defined(CONFIG_PCI)
-#define CONFIG_PCI_SCAN_SHOW   /* show pci devices on startup */
-#endif /* CONFIG_PCI */
-
-/*
- * Environment
- */
-
-#define CONFIG_LOADS_ECHO              /* echo on for serial download */
-#define CONFIG_SYS_LOADS_BAUD_CHANGE   /* allow baudrate change */
-
-/*
- * USB
- */
-#define CONFIG_HAS_FSL_DR_USB
-#ifdef CONFIG_HAS_FSL_DR_USB
-#ifdef CONFIG_USB_EHCI_HCD
-#define CONFIG_EHCI_HCD_INIT_AFTER_RESET
-#define CONFIG_USB_EHCI_FSL
-#endif
-#endif
-
-/*
- * Miscellaneous configurable options
- */
-#define CONFIG_SYS_LOAD_ADDR   0x2000000       /* default load address */
-
-/*
- * For booting Linux, the board info and command line data
- * have to be in the first 64 MB of memory, since this is
- * the maximum mapped by the Linux kernel during initialization.
- */
-#define CONFIG_SYS_BOOTMAPSZ   (64 << 20)   /* Initial Memory map for Linux*/
-#define CONFIG_SYS_BOOTM_LEN   (64 << 20)   /* Increase max gunzip size */
-
-/*
- * Environment Configuration
- */
-#define CONFIG_BOOTFILE                "uImage"
-#define CONFIG_UBOOTPATH       (u-boot.bin) /* U-Boot image on TFTP server */
-
-/* default location for tftp and bootm */
-#define CONFIG_LOADADDR                1000000
-
-/* Qman/Bman */
-#define CONFIG_SYS_QMAN_MEM_BASE       0xff000000
-#define CONFIG_SYS_QMAN_MEM_PHYS       CONFIG_SYS_QMAN_MEM_BASE
-#define CONFIG_SYS_QMAN_MEM_SIZE       0x00200000
-#define CONFIG_SYS_QMAN_SP_CENA_SIZE    0x4000
-#define CONFIG_SYS_QMAN_SP_CINH_SIZE    0x1000
-#define CONFIG_SYS_QMAN_CENA_BASE       CONFIG_SYS_QMAN_MEM_BASE
-#define CONFIG_SYS_QMAN_CENA_SIZE       (CONFIG_SYS_QMAN_MEM_SIZE >> 1)
-#define CONFIG_SYS_QMAN_CINH_BASE       (CONFIG_SYS_QMAN_MEM_BASE + \
-                                       CONFIG_SYS_QMAN_CENA_SIZE)
-#define CONFIG_SYS_QMAN_CINH_SIZE       (CONFIG_SYS_QMAN_MEM_SIZE >> 1)
-#define CONFIG_SYS_QMAN_SWP_ISDR_REG   0xE08
-#define CONFIG_SYS_BMAN_MEM_BASE       0xff200000
-#define CONFIG_SYS_BMAN_MEM_PHYS       CONFIG_SYS_BMAN_MEM_BASE
-#define CONFIG_SYS_BMAN_MEM_SIZE       0x00200000
-#define CONFIG_SYS_BMAN_SP_CENA_SIZE    0x4000
-#define CONFIG_SYS_BMAN_SP_CINH_SIZE    0x1000
-#define CONFIG_SYS_BMAN_CENA_BASE       CONFIG_SYS_BMAN_MEM_BASE
-#define CONFIG_SYS_BMAN_CENA_SIZE       (CONFIG_SYS_BMAN_MEM_SIZE >> 1)
-#define CONFIG_SYS_BMAN_CINH_BASE       (CONFIG_SYS_BMAN_MEM_BASE + \
-                                       CONFIG_SYS_BMAN_CENA_SIZE)
-#define CONFIG_SYS_BMAN_CINH_SIZE       (CONFIG_SYS_BMAN_MEM_SIZE >> 1)
-#define CONFIG_SYS_BMAN_SWP_ISDR_REG   0xE08
-
-/* For FM */
-#define CONFIG_SYS_DPAA_FMAN
-
-/* Default address of microcode for the Linux Fman driver */
-/* QE microcode/firmware address */
-#define CONFIG_SYS_FMAN_FW_ADDR        0xEFF00000
-#define CONFIG_SYS_QE_FMAN_FW_LENGTH   0x10000
-#define CONFIG_SYS_FDT_PAD             (0x3000 + CONFIG_SYS_QE_FMAN_FW_LENGTH)
-
-#ifdef CONFIG_FMAN_ENET
-#define CONFIG_SYS_FM1_DTSEC1_PHY_ADDR 0x1
-#define CONFIG_SYS_FM1_DTSEC2_PHY_ADDR 0x2
-
-#define CONFIG_SYS_TBIPA_VALUE 8
-#define CONFIG_ETHPRIME                "FM1@DTSEC1"
-#endif
-
-#define CONFIG_EXTRA_ENV_SETTINGS      \
-       "netdev=eth0\0"                                         \
-       "uboot=" __stringify(CONFIG_UBOOTPATH) "\0"             \
-       "loadaddr=1000000\0"                                    \
-       "ubootaddr=" __stringify(CONFIG_SYS_TEXT_BASE) "\0"     \
-       "tftpflash=tftpboot $loadaddr $uboot; "                 \
-               "protect off $ubootaddr +$filesize; "           \
-               "erase $ubootaddr +$filesize; "                 \
-               "cp.b $loadaddr $ubootaddr $filesize; "         \
-               "protect on $ubootaddr +$filesize; "            \
-               "cmp.b $loadaddr $ubootaddr $filesize\0"        \
-       "consoledev=ttyS0\0"                                    \
-       "ramdiskaddr=2000000\0"                                 \
-       "ramdiskfile=rootfs.ext2.gz.uboot\0"                    \
-       "fdtaddr=1e00000\0"                                     \
-       "fdtfile=p1023rdb.dtb\0"                                \
-       "othbootargs=ramdisk_size=600000\0"                     \
-       "bdev=sda1\0"                                           \
-       "hwconfig=usb1:dr_mode=host,phy_type=ulpi\0"
-
-#define CONFIG_HDBOOT                                  \
-       "setenv bootargs root=/dev/$bdev rw "           \
-       "console=$consoledev,$baudrate $othbootargs;"   \
-       "tftp $loadaddr $bootfile;"                     \
-       "tftp $fdtaddr $fdtfile;"                       \
-       "bootm $loadaddr - $fdtaddr"
-
-#define CONFIG_NFSBOOTCOMMAND                                          \
-       "setenv bootargs root=/dev/nfs rw "                             \
-       "nfsroot=$serverip:$rootpath "                                  \
-       "ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off " \
-       "console=$consoledev,$baudrate $othbootargs;"                   \
-       "tftp $loadaddr $bootfile;"                                     \
-       "tftp $fdtaddr $fdtfile;"                                       \
-       "bootm $loadaddr - $fdtaddr"
-
-#define CONFIG_RAMBOOTCOMMAND                                          \
-       "setenv bootargs root=/dev/ram rw "                             \
-       "console=$consoledev,$baudrate $othbootargs;"                   \
-       "tftp $ramdiskaddr $ramdiskfile;"                               \
-       "tftp $loadaddr $bootfile;"                                     \
-       "tftp $fdtaddr $fdtfile;"                                       \
-       "bootm $loadaddr $ramdiskaddr $fdtaddr"
-
-#define CONFIG_BOOTCOMMAND             CONFIG_RAMBOOTCOMMAND
-
-#endif /* __CONFIG_H */
diff --git a/include/configs/P5020DS.h b/include/configs/P5020DS.h
deleted file mode 100644 (file)
index 873d39a..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright 2009-2011 Freescale Semiconductor, Inc.
- */
-
-/*
- * P5020 DS board configuration file
- * Also supports P5010 DS
- */
-#define CONFIG_FSL_NGPIXIS             /* use common ngPIXIS code */
-
-#define CONFIG_NAND_FSL_ELBC
-#define CONFIG_FSL_SATA_V2
-#define CONFIG_PCIE3
-#define CONFIG_PCIE4
-#define CONFIG_SYS_FSL_RAID_ENGINE
-#define CONFIG_SYS_DPAA_RMAN
-
-#define CONFIG_SYS_SRIO
-#define CONFIG_SRIO1                   /* SRIO port 1 */
-#define CONFIG_SRIO2                   /* SRIO port 2 */
-#define CONFIG_SRIO_PCIE_BOOT_MASTER
-#define CONFIG_ICS307_REFCLK_HZ                25000000  /* ICS307 ref clk freq */
-
-#include "corenet_ds.h"
index 9c4ef36..5af90d9 100644 (file)
 #define BOOTENV_DEV_NAME_NAND(devtypeu, devtypel, instance) \
        #devtypel #instance " "
 
+#if CONFIG_IS_ENABLED(CMD_USB)
+# define BOOT_TARGET_USB(func) func(USB, usb, 0)
+#else
+# define BOOT_TARGET_USB(func)
+#endif
+
 #if CONFIG_IS_ENABLED(CMD_PXE)
 # define BOOT_TARGET_PXE(func) func(PXE, pxe, na)
 #else
@@ -84,6 +90,7 @@
        func(MMC, mmc, 1) \
        func(LEGACY_MMC, legacy_mmc, 1) \
        func(NAND, nand, 0) \
+       BOOT_TARGET_USB(func) \
        BOOT_TARGET_PXE(func) \
        BOOT_TARGET_DHCP(func)
 
 #define CONFIG_SYS_ENV_SECT_SIZE       CONFIG_SYS_NAND_BLOCK_SIZE
 #endif
 
-/* SPI flash. */
-
 /* Network. */
 /* Enable Atheros phy driver */
 
index c8a7603..1b47e18 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * Configuration header file for K3 J721E EVM
  *
- * Copyright (C) 2018-2019 Texas Instruments Incorporated - http://www.ti.com/
+ * Copyright (C) 2018-2020 Texas Instruments Incorporated - https://www.ti.com/
  *     Lokesh Vutla <lokeshvutla@ti.com>
  */
 
 #if defined(CONFIG_TARGET_J721E_A72_EVM) || defined(CONFIG_TARGET_J7200_A72_EVM)
 #define CONFIG_SYS_INIT_SP_ADDR         (CONFIG_SPL_TEXT_BASE +        \
                                         CONFIG_SYS_K3_NON_SECURE_MSRAM_SIZE)
+#define CONFIG_SYS_UBOOT_BASE          0x50280000
 /* Image load address in RAM for DFU boot*/
 #else
+#define CONFIG_SYS_UBOOT_BASE          0x50080000
 /*
  * Maximum size in memory allocated to the SPL BSS. Keep it as tight as
  * possible (to allow the build to go through), as this directly affects
        "uuid_disk=${uuid_gpt_disk};" \
        "name=rootfs,start=0,size=-,uuid=${uuid_gpt_rootfs}\0"
 
+#ifdef CONFIG_SYS_K3_SPL_ATF
+#if defined(CONFIG_TARGET_J721E_R5_EVM)
+#define EXTRA_ENV_R5_SPL_RPROC_FW_ARGS_MMC                             \
+       "addr_mainr5f0_0load=0x88000000\0"                              \
+       "name_mainr5f0_0fw=/lib/firmware/j7-main-r5f0_0-fw\0"           \
+       "addr_mcur5f0_0load=0x89000000\0"                               \
+       "name_mcur5f0_0fw=/lib/firmware/j7-mcu-r5f0_0-fw\0"
+#elif defined(CONFIG_TARGET_J7200_R5_EVM)
+#define EXTRA_ENV_R5_SPL_RPROC_FW_ARGS_MMC                             \
+       "addr_mcur5f0_0load=0x89000000\0"                               \
+       "name_mcur5f0_0fw=/lib/firmware/j7200-mcu-r5f0_0-fw\0"
+#endif /* CONFIG_TARGET_J721E_R5_EVM */
+#else
+#define EXTRA_ENV_R5_SPL_RPROC_FW_ARGS_MMC ""
+#endif /* CONFIG_SYS_K3_SPL_ATF */
+
 /* U-Boot MMC-specific configuration */
 #define EXTRA_ENV_J721E_BOARD_SETTINGS_MMC                             \
        "boot=mmc\0"                                                    \
        "mmcdev=1\0"                                                    \
        "bootpart=1:2\0"                                                \
        "bootdir=/boot\0"                                               \
-       "addr_mainr5f0_0load=88000000\0"                                        \
-       "name_mainr5f0_0fw=/lib/firmware/j7-main-r5f0_0-fw\0"           \
-       "addr_mcur5f0_0load=89000000\0"                                 \
-       "name_mcur5f0_0fw=/lib/firmware/j7-mcu-r5f0_0-fw\0"             \
+       EXTRA_ENV_R5_SPL_RPROC_FW_ARGS_MMC                              \
        "rd_spec=-\0"                                                   \
        "init_mmc=run args_all args_mmc\0"                              \
        "get_fdt_mmc=load mmc ${bootpart} ${fdtaddr} ${bootdir}/${name_fdt}\0" \
                "${bootdir}/${name_fit}\0"                              \
        "partitions=" PARTS_DEFAULT
 
+/* Set the default list of remote processors to boot */
+#if defined(CONFIG_TARGET_J721E_A72_EVM) || defined(CONFIG_TARGET_J7200_A72_EVM)
 #ifdef DEFAULT_RPROCS
 #undef DEFAULT_RPROCS
 #endif
+#endif
+
+#ifdef CONFIG_TARGET_J721E_A72_EVM
 #define DEFAULT_RPROCS ""                                              \
                "3 /lib/firmware/j7-main-r5f0_1-fw "                    \
                "4 /lib/firmware/j7-main-r5f1_0-fw "                    \
+               "5 /lib/firmware/j7-main-r5f1_1-fw "                    \
                "6 /lib/firmware/j7-c66_0-fw "                          \
                "7 /lib/firmware/j7-c66_1-fw "                          \
                "8 /lib/firmware/j7-c71_0-fw "
+#endif /* CONFIG_TARGET_J721E_A72_EVM */
+
+#ifdef CONFIG_TARGET_J7200_A72_EVM
+#define DEFAULT_RPROCS ""                                              \
+               "2 /lib/firmware/j7200-main-r5f0_0-fw "                 \
+               "3 /lib/firmware/j7200-main-r5f0_1-fw "
+#endif /* CONFIG_TARGET_J7200_A72_EVM */
 
 /* set default dfu_bufsiz to 128KB (sector size of OSPI) */
 #define EXTRA_ENV_DFUARGS \
index d7186ab..22dfb5d 100644 (file)
 #define CONFIG_83XX_PCICLK             66000000
 
 /*
- * QE UEC ethernet configuration
- */
-#define CONFIG_UEC_ETH1                /* GETH1 */
-#define UEC_VERBOSE_DEBUG      1
-
-#define CONFIG_SYS_UEC1_UCC_NUM        3       /* UCC4 */
-#define CONFIG_SYS_UEC1_RX_CLK         QE_CLK_NONE /* not used in RMII Mode */
-#define CONFIG_SYS_UEC1_TX_CLK         QE_CLK17
-#define CONFIG_SYS_UEC1_ETH_TYPE       FAST_ETH
-#define CONFIG_SYS_UEC1_PHY_ADDR       0
-#define CONFIG_SYS_UEC1_INTERFACE_TYPE PHY_INTERFACE_MODE_RMII
-#define CONFIG_SYS_UEC1_INTERFACE_SPEED        100
-
-/*
  * System IO Config
  */
 #define CONFIG_SYS_SICRL       SICRL_IRQ_CKS
index bdbb8bf..798b126 100644 (file)
@@ -7,20 +7,6 @@
  */
 
 /*
- * QE UEC ethernet configuration
- */
-#define CONFIG_UEC_ETH1                /* GETH1 */
-#define UEC_VERBOSE_DEBUG      1
-
-#define CONFIG_SYS_UEC1_UCC_NUM        3       /* UCC4 */
-#define CONFIG_SYS_UEC1_RX_CLK         QE_CLK_NONE /* not used in RMII Mode */
-#define CONFIG_SYS_UEC1_TX_CLK         QE_CLK17
-#define CONFIG_SYS_UEC1_ETH_TYPE       FAST_ETH
-#define CONFIG_SYS_UEC1_PHY_ADDR       0
-#define CONFIG_SYS_UEC1_INTERFACE_TYPE PHY_INTERFACE_MODE_RMII
-#define CONFIG_SYS_UEC1_INTERFACE_SPEED        100
-
-/*
  * System IO Setup
  */
 #define CONFIG_SYS_SICRH               (SICRH_UC1EOBI | SICRH_UC2E1OBI)
index 7c7f2d4..7aacd37 100644 (file)
 #define CONFIG_SYS_MAX_FLASH_SECT      512 /* max num of sects on one chip */
 #define CONFIG_SYS_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE }
 
-/*
- * Serial Port
- */
-#define CONFIG_SYS_NS16550_SERIAL
-#define CONFIG_SYS_NS16550_REG_SIZE    1
-#define CONFIG_SYS_NS16550_CLK         get_bus_freq(0)
-
-#define CONFIG_SYS_NS16550_COM1        (CONFIG_SYS_IMMR + 0x4500)
-#define CONFIG_SYS_NS16550_COM2        (CONFIG_SYS_IMMR + 0x4600)
-
 /* I2C */
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_NUM_I2C_BUSES       4
index 1b74177..a9bf213 100644 (file)
 
 #include <linux/stringify.h>
 
-#if defined(CONFIG_TARGET_P1020MBG)
-#define CONFIG_BOARDNAME "P1020MBG-PC"
-#define CONFIG_VSC7385_ENET
-#define CONFIG_SLIC
-#define __SW_BOOT_MASK         0x03
-#define __SW_BOOT_NOR          0xe4
-#define __SW_BOOT_SD           0x54
-#define CONFIG_SYS_L2_SIZE     (256 << 10)
-#endif
-
-#if defined(CONFIG_TARGET_P1020UTM)
-#define CONFIG_BOARDNAME "P1020UTM-PC"
-#define __SW_BOOT_MASK         0x03
-#define __SW_BOOT_NOR          0xe0
-#define __SW_BOOT_SD           0x50
-#define CONFIG_SYS_L2_SIZE     (256 << 10)
-#endif
-
 #if defined(CONFIG_TARGET_P1020RDB_PC)
 #define CONFIG_BOARDNAME "P1020RDB-PC"
 #define CONFIG_NAND_FSL_ELBC
  */
 #endif
 
-#if defined(CONFIG_TARGET_P1021RDB)
-#define CONFIG_BOARDNAME "P1021RDB-PC"
-#define CONFIG_NAND_FSL_ELBC
-#define CONFIG_VSC7385_ENET
-#define CONFIG_SYS_LBC_LBCR    0x00080000      /* Implement conversion of
-                                               addresses in the LBC */
-#define __SW_BOOT_MASK         0x03
-#define __SW_BOOT_NOR          0x5c
-#define __SW_BOOT_SPI          0x1c
-#define __SW_BOOT_SD           0x9c
-#define __SW_BOOT_NAND         0xec
-#define __SW_BOOT_PCIE         0x6c
-#define CONFIG_SYS_L2_SIZE     (256 << 10)
-/*
- * Dynamic MTD Partition support with mtdparts
- */
-#endif
-
-#if defined(CONFIG_TARGET_P1024RDB)
-#define CONFIG_BOARDNAME "P1024RDB"
-#define CONFIG_NAND_FSL_ELBC
-#define CONFIG_SLIC
-#define __SW_BOOT_MASK         0xf3
-#define __SW_BOOT_NOR          0x00
-#define __SW_BOOT_SPI          0x08
-#define __SW_BOOT_SD           0x04
-#define __SW_BOOT_NAND         0x0c
-#define CONFIG_SYS_L2_SIZE     (256 << 10)
-#endif
-
-#if defined(CONFIG_TARGET_P1025RDB)
-#define CONFIG_BOARDNAME "P1025RDB"
-#define CONFIG_NAND_FSL_ELBC
-#define CONFIG_SLIC
-
-#define CONFIG_SYS_LBC_LBCR    0x00080000      /* Implement conversion of
-                                               addresses in the LBC */
-#define __SW_BOOT_MASK         0xf3
-#define __SW_BOOT_NOR          0x00
-#define __SW_BOOT_SPI          0x08
-#define __SW_BOOT_SD           0x04
-#define __SW_BOOT_NAND         0x0c
-#define CONFIG_SYS_L2_SIZE     (256 << 10)
-#endif
-
 #if defined(CONFIG_TARGET_P2020RDB)
 #define CONFIG_BOARDNAME "P2020RDB-PC"
 #define CONFIG_NAND_FSL_ELBC
 #define CONFIG_SYS_SPD_BUS_NUM 1
 #define SPD_EEPROM_ADDRESS 0x52
 
-#if (defined(CONFIG_TARGET_P1020MBG) || defined(CONFIG_TARGET_P1020RDB_PD))
+#if defined(CONFIG_TARGET_P1020RDB_PD)
 #define CONFIG_SYS_SDRAM_SIZE_LAW      LAW_SIZE_2G
 #define CONFIG_CHIP_SELECTS_PER_CTRL   2
 #else
 /*
  * Local Bus Definitions
  */
-#if (defined(CONFIG_TARGET_P1020MBG) || defined(CONFIG_TARGET_P1020RDB_PD))
+#if defined(CONFIG_TARGET_P1020RDB_PD)
 #define CONFIG_SYS_MAX_FLASH_SECT      512     /* 64M */
 #define CONFIG_SYS_FLASH_BASE          0xec000000
-#elif defined(CONFIG_TARGET_P1020UTM)
-#define CONFIG_SYS_MAX_FLASH_SECT      256     /* 32M */
-#define CONFIG_SYS_FLASH_BASE          0xee000000
 #else
 #define CONFIG_SYS_MAX_FLASH_SECT      128     /* 16M */
 #define CONFIG_SYS_FLASH_BASE          0xef000000
 
 /* Vsc7385 switch */
 #ifdef CONFIG_VSC7385_ENET
+#define __VSCFW_ADDR                   "vscfw_addr=ef000000"
 #define CONFIG_SYS_VSC7385_BASE                0xffb00000
 
 #ifdef CONFIG_PHYS_64BIT
 #define CONFIG_SYS_QE_FMAN_FW_LENGTH   0x10000
 #endif /* CONFIG_QE */
 
-#ifdef CONFIG_TARGET_P1025RDB
-/*
- * QE UEC ethernet configuration
- */
-#define CONFIG_MIIM_ADDRESS    (CONFIG_SYS_CCSRBAR + 0x82120)
-
-#undef CONFIG_UEC_ETH
-#define CONFIG_PHY_MODE_NEED_CHANGE
-
-#define CONFIG_UEC_ETH1        /* ETH1 */
-#define CONFIG_HAS_ETH0
-
-#ifdef CONFIG_UEC_ETH1
-#define CONFIG_SYS_UEC1_UCC_NUM        0       /* UCC1 */
-#define CONFIG_SYS_UEC1_RX_CLK QE_CLK12 /* CLK12 for MII */
-#define CONFIG_SYS_UEC1_TX_CLK QE_CLK9 /* CLK9 for MII */
-#define CONFIG_SYS_UEC1_ETH_TYPE       FAST_ETH
-#define CONFIG_SYS_UEC1_PHY_ADDR       0x0     /* 0x0 for MII */
-#define CONFIG_SYS_UEC1_INTERFACE_TYPE PHY_INTERFACE_MODE_RMII
-#define CONFIG_SYS_UEC1_INTERFACE_SPEED        100
-#endif /* CONFIG_UEC_ETH1 */
-
-#define CONFIG_UEC_ETH5        /* ETH5 */
-#define CONFIG_HAS_ETH1
-
-#ifdef CONFIG_UEC_ETH5
-#define CONFIG_SYS_UEC5_UCC_NUM        4       /* UCC5 */
-#define CONFIG_SYS_UEC5_RX_CLK QE_CLK_NONE
-#define CONFIG_SYS_UEC5_TX_CLK QE_CLK13 /* CLK 13 for RMII */
-#define CONFIG_SYS_UEC5_ETH_TYPE       FAST_ETH
-#define CONFIG_SYS_UEC5_PHY_ADDR       0x3     /* 0x3 for RMII */
-#define CONFIG_SYS_UEC5_INTERFACE_TYPE PHY_INTERFACE_MODE_RMII
-#define CONFIG_SYS_UEC5_INTERFACE_SPEED        100
-#endif /* CONFIG_UEC_ETH5 */
-#endif /* CONFIG_TARGET_P1025RDB */
-
 /*
  * Environment
  */
@@ -809,6 +708,7 @@ i2c mw 18 3 __SW_BOOT_MASK 1; reset
 "ramdisk_size=120000\0"        \
 "map_lowernorbank=i2c dev 1; i2c mw 18 1 02 1; i2c mw 18 3 fd 1\0" \
 "map_uppernorbank=i2c dev 1; i2c mw 18 1 00 1; i2c mw 18 3 fd 1\0" \
+__stringify(__VSCFW_ADDR)"\0" \
 __stringify(__NOR_RST_CMD)"\0" \
 __stringify(__SPI_RST_CMD)"\0" \
 __stringify(__SD_RST_CMD)"\0" \
index 953706c..ac3b6c1 100644 (file)
@@ -197,7 +197,7 @@ struct udevice_id {
        ulong data;
 };
 
-#if CONFIG_IS_ENABLED(OF_CONTROL)
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
 #define of_match_ptr(_ptr)     (_ptr)
 #else
 #define of_match_ptr(_ptr)     NULL
index f95a00d..2fa65c9 100644 (file)
@@ -407,6 +407,7 @@ struct device_node *of_parse_phandle(const struct device_node *np,
  * @np:                pointer to a device tree node containing a list
  * @list_name: property name that contains a list
  * @cells_name:        property name that specifies phandles' arguments count
+ * @cells_count: Cell count to use if @cells_name is NULL
  * @index:     index of a phandle to parse out
  * @out_args:  optional pointer to output arguments structure (will be filled)
  * @return 0 on success (with @out_args filled out if not NULL), -ENOENT if
@@ -440,7 +441,8 @@ struct device_node *of_parse_phandle(const struct device_node *np,
  */
 int of_parse_phandle_with_args(const struct device_node *np,
                               const char *list_name, const char *cells_name,
-                              int index, struct of_phandle_args *out_args);
+                              int cells_count, int index,
+                              struct of_phandle_args *out_args);
 
 /**
  * of_count_phandle_with_args() - Count the number of phandle in a list
diff --git a/include/dt-bindings/clock/aspeed-clock.h b/include/dt-bindings/clock/aspeed-clock.h
new file mode 100644 (file)
index 0000000..a1aa8c0
--- /dev/null
@@ -0,0 +1,42 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#define ASPEED_CLK_GATE_ECLK           0
+#define ASPEED_CLK_GATE_GCLK           1
+#define ASPEED_CLK_GATE_MCLK           2
+#define ASPEED_CLK_GATE_VCLK           3
+#define ASPEED_CLK_GATE_BCLK           4
+#define ASPEED_CLK_GATE_DCLK           5
+#define ASPEED_CLK_GATE_REFCLK         6
+#define ASPEED_CLK_GATE_USBPORT2CLK    7
+#define ASPEED_CLK_GATE_LCLK           8
+#define ASPEED_CLK_GATE_USBUHCICLK     9
+#define ASPEED_CLK_GATE_D1CLK          10
+#define ASPEED_CLK_GATE_YCLK           11
+#define ASPEED_CLK_GATE_USBPORT1CLK    12
+#define ASPEED_CLK_GATE_UART1CLK       13
+#define ASPEED_CLK_GATE_UART2CLK       14
+#define ASPEED_CLK_GATE_UART5CLK       15
+#define ASPEED_CLK_GATE_ESPICLK                16
+#define ASPEED_CLK_GATE_MAC1CLK                17
+#define ASPEED_CLK_GATE_MAC2CLK                18
+#define ASPEED_CLK_GATE_RSACLK         19
+#define ASPEED_CLK_GATE_UART3CLK       20
+#define ASPEED_CLK_GATE_UART4CLK       21
+#define ASPEED_CLK_GATE_SDCLK          22
+#define ASPEED_CLK_GATE_LHCCLK         23
+#define ASPEED_CLK_HPLL                        24
+#define ASPEED_CLK_AHB                 25
+#define ASPEED_CLK_APB                 26
+#define ASPEED_CLK_UART                        27
+#define ASPEED_CLK_SDIO                        28
+#define ASPEED_CLK_ECLK                        29
+#define ASPEED_CLK_ECLK_MUX            30
+#define ASPEED_CLK_LHCLK               31
+#define ASPEED_CLK_MAC                 32
+#define ASPEED_CLK_BCLK                        33
+#define ASPEED_CLK_MPLL                        34
+#define ASPEED_CLK_24M                 35
+#define ASPEED_CLK_MAC1RCLK            36
+#define ASPEED_CLK_MAC2RCLK            37
+#define ASPEED_CLK_DPLL                38
+#define ASPEED_CLK_D2PLL       39
diff --git a/include/dt-bindings/clock/ast2500-scu.h b/include/dt-bindings/clock/ast2500-scu.h
deleted file mode 100644 (file)
index 4803abe..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright 2016 Google Inc.
- */
-
-/* Core Clocks */
-#define PLL_HPLL       1
-#define PLL_DPLL       2
-#define PLL_D2PLL      3
-#define PLL_MPLL       4
-#define ARMCLK         5
-
-
-/* Bus Clocks, derived from core clocks */
-#define BCLK_PCLK      101
-#define BCLK_LHCLK     102
-#define BCLK_MACCLK    103
-#define BCLK_SDCLK     104
-#define BCLK_ARMCLK    105
-
-#define MCLK_DDR       201
-
-/* Special clocks */
-#define PCLK_UART1     501
-#define PCLK_UART2     502
-#define PCLK_UART3     503
-#define PCLK_UART4     504
-#define PCLK_UART5     505
-#define PCLK_MAC1      506
-#define PCLK_MAC2      507
diff --git a/include/dt-bindings/clock/qcom,ipq4019-gcc.h b/include/dt-bindings/clock/qcom,ipq4019-gcc.h
new file mode 100644 (file)
index 0000000..7130e22
--- /dev/null
@@ -0,0 +1,96 @@
+/* Copyright (c) 2015 The Linux Foundation. All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+#ifndef __QCOM_CLK_IPQ4019_H__
+#define __QCOM_CLK_IPQ4019_H__
+
+#define GCC_DUMMY_CLK                                  0
+#define AUDIO_CLK_SRC                                  1
+#define BLSP1_QUP1_I2C_APPS_CLK_SRC                    2
+#define BLSP1_QUP1_SPI_APPS_CLK_SRC                    3
+#define BLSP1_QUP2_I2C_APPS_CLK_SRC                    4
+#define BLSP1_QUP2_SPI_APPS_CLK_SRC                    5
+#define BLSP1_UART1_APPS_CLK_SRC                       6
+#define BLSP1_UART2_APPS_CLK_SRC                       7
+#define GCC_USB3_MOCK_UTMI_CLK_SRC                     8
+#define GCC_APPS_CLK_SRC                               9
+#define GCC_APPS_AHB_CLK_SRC                           10
+#define GP1_CLK_SRC                                    11
+#define GP2_CLK_SRC                                    12
+#define GP3_CLK_SRC                                    13
+#define SDCC1_APPS_CLK_SRC                             14
+#define FEPHY_125M_DLY_CLK_SRC                         15
+#define WCSS2G_CLK_SRC                                 16
+#define WCSS5G_CLK_SRC                                 17
+#define GCC_APSS_AHB_CLK                               18
+#define GCC_AUDIO_AHB_CLK                              19
+#define GCC_AUDIO_PWM_CLK                              20
+#define GCC_BLSP1_AHB_CLK                              21
+#define GCC_BLSP1_QUP1_I2C_APPS_CLK                    22
+#define GCC_BLSP1_QUP1_SPI_APPS_CLK                    23
+#define GCC_BLSP1_QUP2_I2C_APPS_CLK                    24
+#define GCC_BLSP1_QUP2_SPI_APPS_CLK                    25
+#define GCC_BLSP1_UART1_APPS_CLK                       26
+#define GCC_BLSP1_UART2_APPS_CLK                       27
+#define GCC_DCD_XO_CLK                                 28
+#define GCC_GP1_CLK                                    29
+#define GCC_GP2_CLK                                    30
+#define GCC_GP3_CLK                                    31
+#define GCC_BOOT_ROM_AHB_CLK                           32
+#define GCC_CRYPTO_AHB_CLK                             33
+#define GCC_CRYPTO_AXI_CLK                             34
+#define GCC_CRYPTO_CLK                                 35
+#define GCC_ESS_CLK                                    36
+#define GCC_IMEM_AXI_CLK                               37
+#define GCC_IMEM_CFG_AHB_CLK                           38
+#define GCC_PCIE_AHB_CLK                               39
+#define GCC_PCIE_AXI_M_CLK                             40
+#define GCC_PCIE_AXI_S_CLK                             41
+#define GCC_PCNOC_AHB_CLK                              42
+#define GCC_PRNG_AHB_CLK                               43
+#define GCC_QPIC_AHB_CLK                               44
+#define GCC_QPIC_CLK                                   45
+#define GCC_SDCC1_AHB_CLK                              46
+#define GCC_SDCC1_APPS_CLK                             47
+#define GCC_SNOC_PCNOC_AHB_CLK                         48
+#define GCC_SYS_NOC_125M_CLK                           49
+#define GCC_SYS_NOC_AXI_CLK                            50
+#define GCC_TCSR_AHB_CLK                               51
+#define GCC_TLMM_AHB_CLK                               52
+#define GCC_USB2_MASTER_CLK                            53
+#define GCC_USB2_SLEEP_CLK                             54
+#define GCC_USB2_MOCK_UTMI_CLK                         55
+#define GCC_USB3_MASTER_CLK                            56
+#define GCC_USB3_SLEEP_CLK                             57
+#define GCC_USB3_MOCK_UTMI_CLK                         58
+#define GCC_WCSS2G_CLK                                 59
+#define GCC_WCSS2G_REF_CLK                             60
+#define GCC_WCSS2G_RTC_CLK                             61
+#define GCC_WCSS5G_CLK                                 62
+#define GCC_WCSS5G_REF_CLK                             63
+#define GCC_WCSS5G_RTC_CLK                             64
+#define GCC_APSS_DDRPLL_VCO                            65
+#define GCC_SDCC_PLLDIV_CLK                            66
+#define GCC_FEPLL_VCO                                  67
+#define GCC_FEPLL125_CLK                               68
+#define GCC_FEPLL125DLY_CLK                            69
+#define GCC_FEPLL200_CLK                               70
+#define GCC_FEPLL500_CLK                               71
+#define GCC_FEPLL_WCSS2G_CLK                           72
+#define GCC_FEPLL_WCSS5G_CLK                           73
+#define GCC_APSS_CPU_PLLDIV_CLK                                74
+#define GCC_PCNOC_AHB_CLK_SRC                          75
+
+#endif
diff --git a/include/dt-bindings/reset/qcom,ipq4019-reset.h b/include/dt-bindings/reset/qcom,ipq4019-reset.h
new file mode 100644 (file)
index 0000000..ed047d7
--- /dev/null
@@ -0,0 +1,92 @@
+/* Copyright (c) 2015 The Linux Foundation. All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+#ifndef __QCOM_RESET_IPQ4019_H__
+#define __QCOM_RESET_IPQ4019_H__
+
+#define WIFI0_CPU_INIT_RESET                           0
+#define WIFI0_RADIO_SRIF_RESET                         1
+#define WIFI0_RADIO_WARM_RESET                         2
+#define WIFI0_RADIO_COLD_RESET                         3
+#define WIFI0_CORE_WARM_RESET                          4
+#define WIFI0_CORE_COLD_RESET                          5
+#define WIFI1_CPU_INIT_RESET                           6
+#define WIFI1_RADIO_SRIF_RESET                         7
+#define WIFI1_RADIO_WARM_RESET                         8
+#define WIFI1_RADIO_COLD_RESET                         9
+#define WIFI1_CORE_WARM_RESET                          10
+#define WIFI1_CORE_COLD_RESET                          11
+#define USB3_UNIPHY_PHY_ARES                           12
+#define USB3_HSPHY_POR_ARES                            13
+#define USB3_HSPHY_S_ARES                              14
+#define USB2_HSPHY_POR_ARES                            15
+#define USB2_HSPHY_S_ARES                              16
+#define PCIE_PHY_AHB_ARES                              17
+#define PCIE_AHB_ARES                                  18
+#define PCIE_PWR_ARES                                  19
+#define PCIE_PIPE_STICKY_ARES                          20
+#define PCIE_AXI_M_STICKY_ARES                         21
+#define PCIE_PHY_ARES                                  22
+#define PCIE_PARF_XPU_ARES                             23
+#define PCIE_AXI_S_XPU_ARES                            24
+#define PCIE_AXI_M_VMIDMT_ARES                         25
+#define PCIE_PIPE_ARES                                 26
+#define PCIE_AXI_S_ARES                                        27
+#define PCIE_AXI_M_ARES                                        28
+#define ESS_RESET                                      29
+#define GCC_BLSP1_BCR                                  30
+#define GCC_BLSP1_QUP1_BCR                             31
+#define GCC_BLSP1_UART1_BCR                            32
+#define GCC_BLSP1_QUP2_BCR                             33
+#define GCC_BLSP1_UART2_BCR                            34
+#define GCC_BIMC_BCR                                   35
+#define GCC_TLMM_BCR                                   36
+#define GCC_IMEM_BCR                                   37
+#define GCC_ESS_BCR                                    38
+#define GCC_PRNG_BCR                                   39
+#define GCC_BOOT_ROM_BCR                               40
+#define GCC_CRYPTO_BCR                                 41
+#define GCC_SDCC1_BCR                                  42
+#define GCC_SEC_CTRL_BCR                               43
+#define GCC_AUDIO_BCR                                  44
+#define GCC_QPIC_BCR                                   45
+#define GCC_PCIE_BCR                                   46
+#define GCC_USB2_BCR                                   47
+#define GCC_USB2_PHY_BCR                               48
+#define GCC_USB3_BCR                                   49
+#define GCC_USB3_PHY_BCR                               50
+#define GCC_SYSTEM_NOC_BCR                             51
+#define GCC_PCNOC_BCR                                  52
+#define GCC_DCD_BCR                                    53
+#define GCC_SNOC_BUS_TIMEOUT0_BCR                      54
+#define GCC_SNOC_BUS_TIMEOUT1_BCR                      55
+#define GCC_SNOC_BUS_TIMEOUT2_BCR                      56
+#define GCC_SNOC_BUS_TIMEOUT3_BCR                      57
+#define GCC_PCNOC_BUS_TIMEOUT0_BCR                     58
+#define GCC_PCNOC_BUS_TIMEOUT1_BCR                     59
+#define GCC_PCNOC_BUS_TIMEOUT2_BCR                     60
+#define GCC_PCNOC_BUS_TIMEOUT3_BCR                     61
+#define GCC_PCNOC_BUS_TIMEOUT4_BCR                     62
+#define GCC_PCNOC_BUS_TIMEOUT5_BCR                     63
+#define GCC_PCNOC_BUS_TIMEOUT6_BCR                     64
+#define GCC_PCNOC_BUS_TIMEOUT7_BCR                     65
+#define GCC_PCNOC_BUS_TIMEOUT8_BCR                     66
+#define GCC_PCNOC_BUS_TIMEOUT9_BCR                     67
+#define GCC_TCSR_BCR                                   68
+#define GCC_QDSS_BCR                                   69
+#define GCC_MPM_BCR                                    70
+#define GCC_SPDM_BCR                                   71
+
+#endif
index 1c8e49a..b86c8dc 100644 (file)
@@ -57,7 +57,7 @@
                "fi;\0" \
        "mmcboot=mmc dev ${mmcdev}; " \
                "devnum=${mmcdev}; " \
-               "setenv devtype mmc; " \
+               "devtype=mmc; " \
                "if mmc rescan; then " \
                        "echo SD/MMC found on device ${mmcdev};" \
                        "if run loadimage; then " \
index 152eb07..62d1660 100644 (file)
@@ -1029,7 +1029,7 @@ static inline int fdtdec_set_phandle(void *blob, int node, uint32_t phandle)
  *     };
  *     uint32_t phandle;
  *
- *     fdtdec_add_reserved_memory(fdt, "framebuffer", &fb, &phandle);
+ *     fdtdec_add_reserved_memory(fdt, "framebuffer", &fb, &phandle, false);
  *
  * This results in the following subnode being added to the top-level
  * /reserved-memory node:
@@ -1056,11 +1056,12 @@ static inline int fdtdec_set_phandle(void *blob, int node, uint32_t phandle)
  * @param carveout     information about the carveout region
  * @param phandlep     return location for the phandle of the carveout region
  *                     can be NULL if no phandle should be added
+ * @param no_map       add "no-map" property if true
  * @return 0 on success or a negative error code on failure
  */
 int fdtdec_add_reserved_memory(void *blob, const char *basename,
                               const struct fdt_memory *carveout,
-                              uint32_t *phandlep);
+                              uint32_t *phandlep, bool no_map);
 
 /**
  * fdtdec_get_carveout() - reads a carveout from an FDT
index 41cb737..b6c02cf 100644 (file)
@@ -55,6 +55,10 @@ int memac_mdio_read(struct mii_dev *bus, int port_addr, int dev_addr,
                int regnum);
 int memac_mdio_reset(struct mii_dev *bus);
 
+struct fsl_pq_mdio_data {
+       u32 mdio_regs_off;
+};
+
 struct fsl_pq_mdio_info {
        struct tsec_mii_mng __iomem *regs;
        char *name;
index 6e44cbd..1c69413 100644 (file)
@@ -296,4 +296,7 @@ int u_qe_firmware_resume(const struct qe_firmware *firmware,
                         qe_map_t *qe_immrr);
 #endif
 
+#if defined(CONFIG_PINCTRL)
+int par_io_of_config(struct udevice *dev);
+#endif
 #endif /* __QE_H__ */
index 75d19b1..070a79c 100644 (file)
 struct spl_handoff {
        struct arch_spl_handoff arch;
        u64 ram_size;
-#ifdef CONFIG_NR_DRAM_BANKS
        struct {
                u64 start;
                u64 size;
        } ram_bank[CONFIG_NR_DRAM_BANKS];
-#endif
 };
 
 void handoff_save_dram(struct spl_handoff *ho);
diff --git a/include/omap3_spi.h b/include/omap3_spi.h
new file mode 100644 (file)
index 0000000..cae3770
--- /dev/null
@@ -0,0 +1,78 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+#ifndef __OMAP3_SPI_H_
+#define __OMAP3_SPI_H_
+
+/* per-register bitmasks */
+#define OMAP3_MCSPI_SYSCONFIG_SMARTIDLE (2 << 3)
+#define OMAP3_MCSPI_SYSCONFIG_ENAWAKEUP BIT(2)
+#define OMAP3_MCSPI_SYSCONFIG_AUTOIDLE BIT(0)
+#define OMAP3_MCSPI_SYSCONFIG_SOFTRESET BIT(1)
+
+#define OMAP3_MCSPI_SYSSTATUS_RESETDONE BIT(0)
+
+#define OMAP3_MCSPI_MODULCTRL_SINGLE   BIT(0)
+#define OMAP3_MCSPI_MODULCTRL_MS       BIT(2)
+#define OMAP3_MCSPI_MODULCTRL_STEST    BIT(3)
+
+#define OMAP3_MCSPI_CHCONF_PHA         BIT(0)
+#define OMAP3_MCSPI_CHCONF_POL         BIT(1)
+#define OMAP3_MCSPI_CHCONF_CLKD_MASK   GENMASK(5, 2)
+#define OMAP3_MCSPI_CHCONF_EPOL                BIT(6)
+#define OMAP3_MCSPI_CHCONF_WL_MASK     GENMASK(11, 7)
+#define OMAP3_MCSPI_CHCONF_TRM_RX_ONLY BIT(12)
+#define OMAP3_MCSPI_CHCONF_TRM_TX_ONLY BIT(13)
+#define OMAP3_MCSPI_CHCONF_TRM_MASK    GENMASK(13, 12)
+#define OMAP3_MCSPI_CHCONF_DMAW                BIT(14)
+#define OMAP3_MCSPI_CHCONF_DMAR                BIT(15)
+#define OMAP3_MCSPI_CHCONF_DPE0                BIT(16)
+#define OMAP3_MCSPI_CHCONF_DPE1                BIT(17)
+#define OMAP3_MCSPI_CHCONF_IS          BIT(18)
+#define OMAP3_MCSPI_CHCONF_TURBO       BIT(19)
+#define OMAP3_MCSPI_CHCONF_FORCE       BIT(20)
+
+#define OMAP3_MCSPI_CHSTAT_RXS         BIT(0)
+#define OMAP3_MCSPI_CHSTAT_TXS         BIT(1)
+#define OMAP3_MCSPI_CHSTAT_EOT         BIT(2)
+
+#define OMAP3_MCSPI_CHCTRL_EN          BIT(0)
+#define OMAP3_MCSPI_CHCTRL_DIS         (0 << 0)
+
+#define OMAP3_MCSPI_WAKEUPENABLE_WKEN  BIT(0)
+#define MCSPI_PINDIR_D0_IN_D1_OUT      0
+#define MCSPI_PINDIR_D0_OUT_D1_IN      1
+
+#define OMAP3_MCSPI_MAX_FREQ           48000000
+#define SPI_WAIT_TIMEOUT               10
+
+#define OMAP4_MCSPI_REG_OFFSET 0x100
+
+/* OMAP3 McSPI registers */
+struct mcspi_channel {
+       unsigned int chconf;            /* 0x2C, 0x40, 0x54, 0x68 */
+       unsigned int chstat;            /* 0x30, 0x44, 0x58, 0x6C */
+       unsigned int chctrl;            /* 0x34, 0x48, 0x5C, 0x70 */
+       unsigned int tx;                /* 0x38, 0x4C, 0x60, 0x74 */
+       unsigned int rx;                /* 0x3C, 0x50, 0x64, 0x78 */
+};
+
+struct mcspi {
+       unsigned char res1[0x10];
+       unsigned int sysconfig;         /* 0x10 */
+       unsigned int sysstatus;         /* 0x14 */
+       unsigned int irqstatus;         /* 0x18 */
+       unsigned int irqenable;         /* 0x1C */
+       unsigned int wakeupenable;      /* 0x20 */
+       unsigned int syst;              /* 0x24 */
+       unsigned int modulctrl;         /* 0x28 */
+       struct mcspi_channel channel[4];
+       /* channel0: 0x2C - 0x3C, bus 0 & 1 & 2 & 3 */
+       /* channel1: 0x40 - 0x50, bus 0 & 1 */
+       /* channel2: 0x54 - 0x64, bus 0 & 1 */
+       /* channel3: 0x68 - 0x78, bus 0 */
+};
+
+struct omap3_spi_plat {
+       struct mcspi *regs;
+       unsigned int pin_dir:1;
+};
+#endif
index 43255e5..5433cfd 100644 (file)
@@ -394,6 +394,10 @@ struct tsec {
 
 #define TX_BUF_CNT     2
 
+struct tsec_data {
+       u32 mdio_regs_off;
+};
+
 struct tsec_private {
        struct txbd8 __iomem txbd[TX_BUF_CNT];
        struct rxbd8 __iomem rxbd[PKTBUFSRX];
index 5f41f58..b8fc5e2 100644 (file)
@@ -1073,8 +1073,6 @@ int fdtdec_setup_mem_size_base(void)
        return 0;
 }
 
-#if defined(CONFIG_NR_DRAM_BANKS)
-
 ofnode get_next_memory_node(ofnode mem)
 {
        do {
@@ -1170,7 +1168,6 @@ int fdtdec_setup_mem_size_base_lowest(void)
 
        return 0;
 }
-#endif
 
 #if CONFIG_IS_ENABLED(MULTI_DTB_FIT)
 # if CONFIG_IS_ENABLED(MULTI_DTB_FIT_GZIP) ||\
@@ -1319,7 +1316,7 @@ static int fdtdec_init_reserved_memory(void *blob)
 
 int fdtdec_add_reserved_memory(void *blob, const char *basename,
                               const struct fdt_memory *carveout,
-                              uint32_t *phandlep)
+                              uint32_t *phandlep, bool no_map)
 {
        fdt32_t cells[4] = {}, *ptr = cells;
        uint32_t upper, lower, phandle;
@@ -1419,6 +1416,12 @@ int fdtdec_add_reserved_memory(void *blob, const char *basename,
        if (err < 0)
                return err;
 
+       if (no_map) {
+               err = fdt_setprop(blob, node, "no-map", NULL, 0);
+               if (err < 0)
+                       return err;
+       }
+
        /* return the phandle for the new node for the caller to use */
        if (phandlep)
                *phandlep = phandle;
@@ -1484,7 +1487,7 @@ int fdtdec_set_carveout(void *blob, const char *node, const char *prop_name,
        fdt32_t value;
        void *prop;
 
-       err = fdtdec_add_reserved_memory(blob, name, carveout, &phandle);
+       err = fdtdec_add_reserved_memory(blob, name, carveout, &phandle, false);
        if (err < 0) {
                debug("failed to add reserved memory: %d\n", err);
                return err;
@@ -1633,7 +1636,6 @@ int fdtdec_resetup(int *rescan)
 }
 #endif
 
-#ifdef CONFIG_NR_DRAM_BANKS
 int fdtdec_decode_ram_size(const void *blob, const char *area, int board_id,
                           phys_addr_t *basep, phys_size_t *sizep,
                           struct bd_info *bd)
@@ -1739,6 +1741,5 @@ int fdtdec_decode_ram_size(const void *blob, const char *area, int board_id,
 
        return 0;
 }
-#endif /* CONFIG_NR_DRAM_BANKS */
 
 #endif /* !USE_HOSTCC */
index 75082f3..d126f8d 100644 (file)
--- a/lib/lmb.c
+++ b/lib/lmb.c
@@ -117,22 +117,17 @@ static void lmb_reserve_common(struct lmb *lmb, void *fdt_blob)
 /* Initialize the struct, add memory and call arch/board reserve functions */
 void lmb_init_and_reserve(struct lmb *lmb, struct bd_info *bd, void *fdt_blob)
 {
-#ifdef CONFIG_NR_DRAM_BANKS
        int i;
-#endif
 
        lmb_init(lmb);
-#ifdef CONFIG_NR_DRAM_BANKS
+
        for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
                if (bd->bi_dram[i].size) {
                        lmb_add(lmb, bd->bi_dram[i].start,
                                bd->bi_dram[i].size);
                }
        }
-#else
-       if (bd->bi_memsize)
-               lmb_add(lmb, bd->bi_memstart, bd->bi_memsize);
-#endif
+
        lmb_reserve_common(lmb, fdt_blob);
 }
 
index 457d4cc..9e66065 100644 (file)
@@ -192,7 +192,7 @@ int optee_copy_fdt_nodes(const void *old_blob, void *new_blob)
                                ret = fdtdec_add_reserved_memory(new_blob,
                                                                 nodename,
                                                                 &carveout,
-                                                                NULL);
+                                                                NULL, true);
                                free(oldname);
 
                                if (ret < 0)
index fae0b27..1d69ad3 100644 (file)
@@ -786,7 +786,8 @@ class FdtSw(FdtRo):
             Fdt object allowing access to the newly created device tree
         """
         fdtsw = bytearray(self._fdt)
-        check_err(fdt_finish(fdtsw))
+        while self.check_space(fdt_finish(fdtsw)):
+            fdtsw = bytearray(self._fdt)
         return Fdt(fdtsw)
 
     def check_space(self, val):
index 716993f..017157a 100644 (file)
@@ -80,7 +80,7 @@ static int dm_test_fdtdec_add_reserved_memory(struct unit_test_state *uts)
        resv.start = 0x1000;
        resv.end = 0x1fff;
        ut_assertok(fdtdec_add_reserved_memory(blob, "rsvd_region",
-                                              &resv, &phandle));
+                                              &resv, &phandle, false));
 
        /* Test /reserve-memory and its subnode should exist */
        parent = fdt_path_offset(blob, "/reserved-memory");
@@ -101,10 +101,13 @@ static int dm_test_fdtdec_add_reserved_memory(struct unit_test_state *uts)
        resv.start = 0x2000;
        resv.end = 0x2fff;
        ut_assertok(fdtdec_add_reserved_memory(blob, "rsvd_region1",
-                                              &resv, &phandle1));
+                                              &resv, &phandle1, true));
        subnode = fdt_path_offset(blob, "/reserved-memory/rsvd_region1");
        ut_assert(subnode > 0);
 
+       /* check that no-map property is present */
+       ut_assert(fdt_getprop(blob, subnode, "no-map", NULL) > 0);
+
        /* phandles must be different */
        ut_assert(phandle != phandle1);
 
@@ -115,7 +118,7 @@ static int dm_test_fdtdec_add_reserved_memory(struct unit_test_state *uts)
        resv.start = 0x1000;
        resv.end = 0x1fff;
        ut_assertok(fdtdec_add_reserved_memory(blob, "rsvd_region2",
-                                              &resv, &phandle1));
+                                              &resv, &phandle1, false));
        subnode = fdt_path_offset(blob, "/reserved-memory/rsvd_region2");
        ut_assert(subnode < 0);
 
index 37ee3fc..fbcfdc7 100644 (file)
@@ -343,6 +343,12 @@ compress:
        Sets the compression algortihm to use (for blobs only). See the entry
        documentation for details.
 
+missing-msg:
+       Sets the tag of the message to show if this entry is missing. This is
+       used for external blobs. When they are missing it is helpful to show
+       information about what needs to be fixed. See missing-blob-help for the
+       message for each tag.
+
 The attributes supported for images and sections are described below. Several
 are similar to those for entries.
 
@@ -884,6 +890,12 @@ the 'tools' module's Run() method. The tools generally must exist on the PATH,
 but the --toolpath option can be used to specify additional search paths to
 use. This option can be specified multiple times to add more than one path.
 
+For some compile tools binman will use the versions specified by commonly-used
+environment variables like CC and HOSTCC for the C compiler, based on whether
+the tool's output will be used for the target or for the host machine. If those
+aren't given, it will also try to derive target-specific versions from the
+CROSS_COMPILE environment variable during a cross-compilation.
+
 
 Code coverage
 -------------
@@ -918,6 +930,24 @@ directories so they can be examined later. Use -X or --test-preserve-dirs for
 this.
 
 
+Running tests on non-x86 architectures
+--------------------------------------
+
+Binman's tests have been written under the assumption that they'll be run on a
+x86-like host and there hasn't been an attempt to make them portable yet.
+However, it's possible to run the tests by cross-compiling to x86.
+
+To install an x86 cross-compiler on Debian-type distributions (e.g. Ubuntu):
+
+  $ sudo apt-get install gcc-x86-64-linux-gnu
+
+Then, you can run the tests under cross-compilation:
+
+  $ CROSS_COMPILE=x86_64-linux-gnu- binman test -T
+
+You can also use gcc-i686-linux-gnu similar to the above.
+
+
 Advanced Features / Technical docs
 ----------------------------------
 
index bf8edce..c1d4365 100644 (file)
@@ -11,6 +11,20 @@ features to produce new behaviours.
 
 
 
+Entry: atf-bl31: Entry containing an ARM Trusted Firmware (ATF) BL31 blob
+-------------------------------------------------------------------------
+
+Properties / Entry arguments:
+    - atf-bl31-path: Filename of file to read into entry. This is typically
+        called bl31.bin or bl31.elf
+
+This entry holds the run-time firmware, typically started by U-Boot SPL.
+See the U-Boot README for your architecture or board for how to use it. See
+https://github.com/ARM-software/arm-trusted-firmware for more information
+about ATF.
+
+
+
 Entry: blob: Entry containing an arbitrary binary blob
 ------------------------------------------------------
 
@@ -60,7 +74,7 @@ Entry: blob-named-by-arg: A blob entry which gets its filename property from its
 
 Properties / Entry arguments:
     - <xxx>-path: Filename containing the contents of this entry (optional,
-        defaults to 0)
+        defaults to None)
 
 where <xxx> is the blob_fname argument to the constructor.
 
@@ -325,6 +339,7 @@ For example, this creates an image containing a FIT with U-Boot SPL:
     binman {
         fit {
             description = "Test FIT";
+            fit,fdt-list = "of-list";
 
             images {
                 kernel@1 {
@@ -343,7 +358,56 @@ For example, this creates an image containing a FIT with U-Boot SPL:
         };
     };
 
-Properties:
+U-Boot supports creating fdt and config nodes automatically. To do this,
+pass an of-list property (e.g. -a of-list=file1 file2). This tells binman
+that you want to generates nodes for two files: file1.dtb and file2.dtb
+The fit,fdt-list property (see above) indicates that of-list should be used.
+If the property is missing you will get an error.
+
+Then add a 'generator node', a node with a name starting with '@':
+
+    images {
+        @fdt-SEQ {
+            description = "fdt-NAME";
+            type = "flat_dt";
+            compression = "none";
+        };
+    };
+
+This tells binman to create nodes fdt-1 and fdt-2 for each of your two
+files. All the properties you specify will be included in the node. This
+node acts like a template to generate the nodes. The generator node itself
+does not appear in the output - it is replaced with what binman generates.
+
+You can create config nodes in a similar way:
+
+    configurations {
+        default = "@config-DEFAULT-SEQ";
+        @config-SEQ {
+            description = "NAME";
+            firmware = "uboot";
+            loadables = "atf";
+            fdt = "fdt-SEQ";
+        };
+    };
+
+This tells binman to create nodes config-1 and config-2, i.e. a config for
+each of your two files.
+
+Available substitutions for '@' nodes are:
+
+    SEQ    Sequence number of the generated fdt (1, 2, ...)
+    NAME   Name of the dtb as provided (i.e. without adding '.dtb')
+
+Note that if no devicetree files are provided (with '-a of-list' as above)
+then no nodes will be generated.
+
+The 'default' property, if present, will be automatically set to the name
+if of configuration whose devicetree matches the 'default-dt' entry
+argument, e.g. with '-a default-dt=sun50i-a64-pine64-lts'.
+
+
+Properties (in the 'fit' node itself):
     fit,external-offset: Indicates that the contents of the FIT are external
         and provides the external offset. This is passsed to mkimage via
         the -E and -p flags.
@@ -691,6 +755,11 @@ Properties / Entry arguments: (see binman README for more information)
     name-prefix: Adds a prefix to the name of every entry in the section
         when writing out the map
 
+Properties:
+    allow_missing: True if this section permits external blobs to be
+        missing their contents. The second will produce an image but of
+        course it will not work.
+
 Since a section is also an entry, it inherits all the properies of entries
 too.
 
index 60e89d3..ee5771e 100644 (file)
@@ -8,6 +8,9 @@
 from collections import OrderedDict
 import glob
 import os
+import pkg_resources
+import re
+
 import sys
 from patman import tools
 
@@ -20,6 +23,11 @@ from patman import tout
 # Make this global so that it can be referenced from tests
 images = OrderedDict()
 
+# Help text for each type of missing blob, dict:
+#    key: Value of the entry's 'missing-msg' or entry name
+#    value: Text for the help
+missing_blob_help = {}
+
 def _ReadImageDesc(binman_node):
     """Read the image descriptions from the /binman node
 
@@ -52,14 +60,74 @@ def _FindBinmanNode(dtb):
             return node
     return None
 
+def _ReadMissingBlobHelp():
+    """Read the missing-blob-help file
+
+    This file containins help messages explaining what to do when external blobs
+    are missing.
+
+    Returns:
+        Dict:
+            key: Message tag (str)
+            value: Message text (str)
+    """
+
+    def _FinishTag(tag, msg, result):
+        if tag:
+            result[tag] = msg.rstrip()
+            tag = None
+            msg = ''
+        return tag, msg
+
+    my_data = pkg_resources.resource_string(__name__, 'missing-blob-help')
+    re_tag = re.compile('^([-a-z0-9]+):$')
+    result = {}
+    tag = None
+    msg = ''
+    for line in my_data.decode('utf-8').splitlines():
+        if not line.startswith('#'):
+            m_tag = re_tag.match(line)
+            if m_tag:
+                _, msg = _FinishTag(tag, msg, result)
+                tag = m_tag.group(1)
+            elif tag:
+                msg += line + '\n'
+    _FinishTag(tag, msg, result)
+    return result
+
+def _ShowBlobHelp(path, text):
+    tout.Warning('\n%s:' % path)
+    for line in text.splitlines():
+        tout.Warning('   %s' % line)
+
+def _ShowHelpForMissingBlobs(missing_list):
+    """Show help for each missing blob to help the user take action
+
+    Args:
+        missing_list: List of Entry objects to show help for
+    """
+    global missing_blob_help
+
+    if not missing_blob_help:
+        missing_blob_help = _ReadMissingBlobHelp()
+
+    for entry in missing_list:
+        tags = entry.GetHelpTags()
+
+        # Show the first match help message
+        for tag in tags:
+            if tag in missing_blob_help:
+                _ShowBlobHelp(entry._node.path, missing_blob_help[tag])
+                break
+
 def GetEntryModules(include_testing=True):
     """Get a set of entry class implementations
 
     Returns:
         Set of paths to entry class filenames
     """
-    our_path = os.path.dirname(os.path.realpath(__file__))
-    glob_list = glob.glob(os.path.join(our_path, 'etype/*.py'))
+    glob_list = pkg_resources.resource_listdir(__name__, 'etype')
+    glob_list = [fname for fname in glob_list if fname.endswith('.py')]
     return set([os.path.splitext(os.path.basename(item))[0]
                 for item in glob_list
                 if include_testing or '_testing' not in item])
@@ -344,6 +412,11 @@ def PrepareImagesAndDtbs(dtb_fname, select_images, update_fdt):
         dtb_fname: Filename of the device tree file to use (.dts or .dtb)
         selected_images: List of images to output, or None for all
         update_fdt: True to update the FDT wth entry offsets, etc.
+
+    Returns:
+        OrderedDict of images:
+            key: Image name (str)
+            value: Image object
     """
     # Import these here in case libfdt.py is not available, in which case
     # the above help option still works.
@@ -471,6 +544,7 @@ def ProcessImage(image, update_fdt, write_map, get_contents=True,
     if missing_list:
         tout.Warning("Image '%s' is missing external blobs and is non-functional: %s" %
                      (image.name, ' '.join([e.name for e in missing_list])))
+        _ShowHelpForMissingBlobs(missing_list)
     return bool(missing_list)
 
 
@@ -556,7 +630,7 @@ def Binman(args):
                 tools.WriteFile(dtb_item._fname, dtb_item.GetContents())
 
             if missing:
-                tout.Warning("Some images are invalid")
+                tout.Warning("\nSome images are invalid")
         finally:
             tools.FinaliseOutputDir()
     finally:
index f88031c..5e566e5 100644 (file)
@@ -234,8 +234,10 @@ SECTIONS
     #   text section at the start
     # -m32: Build for 32-bit x86
     # -T...: Specifies the link script, which sets the start address
-    stdout = command.Output('cc', '-static', '-nostdlib', '-Wl,--build-id=none',
-                            '-m32','-T', lds_file, '-o', elf_fname, s_file)
+    cc, args = tools.GetTargetCompileTool('cc')
+    args += ['-static', '-nostdlib', '-Wl,--build-id=none', '-m32', '-T',
+            lds_file, '-o', elf_fname, s_file]
+    stdout = command.Output(cc, *args)
     shutil.rmtree(outdir)
 
 def DecodeElf(data, location):
index 37e1b42..e3d218a 100644 (file)
@@ -186,7 +186,9 @@ class TestElf(unittest.TestCase):
         # Make an Elf file and then convert it to a fkat binary file. This
         # should produce the original data.
         elf.MakeElf(elf_fname, expected_text, expected_data)
-        stdout = command.Output('objcopy', '-O', 'binary', elf_fname, bin_fname)
+        objcopy, args = tools.GetTargetCompileTool('objcopy')
+        args += ['-O', 'binary', elf_fname, bin_fname]
+        stdout = command.Output(objcopy, *args)
         with open(bin_fname, 'rb') as fd:
             data = fd.read()
         self.assertEqual(expected_text + expected_data, data)
index 3434a3f..f7adc3b 100644 (file)
@@ -16,8 +16,6 @@ from patman import tout
 
 modules = {}
 
-our_path = os.path.dirname(os.path.realpath(__file__))
-
 
 # An argument which can be passed to entries on the command line, in lieu of
 # device-tree properties.
@@ -59,6 +57,10 @@ class Entry(object):
         compress: Compression algoithm used (e.g. 'lz4'), 'none' if none
         orig_offset: Original offset value read from node
         orig_size: Original size value read from node
+        missing: True if this entry is missing its contents
+        allow_missing: Allow children of this entry to be missing (used by
+            subclasses such as Entry_section)
+        external: True if this entry contains an external binary blob
     """
     def __init__(self, section, etype, node, name_prefix=''):
         # Put this here to allow entry-docs and help to work without libfdt
@@ -85,6 +87,8 @@ class Entry(object):
         self._expand_size = False
         self.compress = 'none'
         self.missing = False
+        self.external = False
+        self.allow_missing = False
 
     @staticmethod
     def Lookup(node_path, etype):
@@ -174,6 +178,7 @@ class Entry(object):
         self.align_end = fdt_util.GetInt(self._node, 'align-end')
         self.offset_unset = fdt_util.GetBool(self._node, 'offset-unset')
         self.expand_size = fdt_util.GetBool(self._node, 'expand-size')
+        self.missing_msg = fdt_util.GetString(self._node, 'missing-msg')
 
     def GetDefaultFilename(self):
         return None
@@ -815,3 +820,19 @@ features to produce new behaviours.
         """
         if self.missing:
             missing_list.append(self)
+
+    def GetAllowMissing(self):
+        """Get whether a section allows missing external blobs
+
+        Returns:
+            True if allowed, False if not allowed
+        """
+        return self.allow_missing
+
+    def GetHelpTags(self):
+        """Get the tags use for missing-blob help
+
+        Returns:
+            list of possible tags, most desirable first
+        """
+        return list(filter(None, [self.missing_msg, self.name, self.etype]))
diff --git a/tools/binman/etype/atf_bl31.py b/tools/binman/etype/atf_bl31.py
new file mode 100644 (file)
index 0000000..195adc7
--- /dev/null
@@ -0,0 +1,24 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright 2020 Google LLC
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Entry-type module for Intel Management Engine binary blob
+#
+
+from binman.etype.blob_named_by_arg import Entry_blob_named_by_arg
+
+class Entry_atf_bl31(Entry_blob_named_by_arg):
+    """Entry containing an ARM Trusted Firmware (ATF) BL31 blob
+
+    Properties / Entry arguments:
+        - atf-bl31-path: Filename of file to read into entry. This is typically
+            called bl31.bin or bl31.elf
+
+    This entry holds the run-time firmware, typically started by U-Boot SPL.
+    See the U-Boot README for your architecture or board for how to use it. See
+    https://github.com/ARM-software/arm-trusted-firmware for more information
+    about ATF.
+    """
+    def __init__(self, section, etype, node):
+        super().__init__(section, etype, node, 'atf-bl31')
+        self.external = True
index e507203..c5f97c8 100644 (file)
@@ -37,7 +37,13 @@ class Entry_blob(Entry):
 
     def ObtainContents(self):
         self._filename = self.GetDefaultFilename()
-        self._pathname = tools.GetInputFilename(self._filename)
+        self._pathname = tools.GetInputFilename(self._filename,
+                                                self.section.GetAllowMissing())
+        # Allow the file to be missing
+        if self.external and not self._pathname:
+            self.SetContents(b'')
+            self.missing = True
+            return True
         self.ReadBlobContents()
         return True
 
index 8d64100..e372445 100644 (file)
@@ -26,14 +26,3 @@ class Entry_blob_ext(Entry_blob):
     def __init__(self, section, etype, node):
         Entry_blob.__init__(self, section, etype, node)
         self.external = True
-
-    def ObtainContents(self):
-        self._filename = self.GetDefaultFilename()
-        self._pathname = tools.GetInputFilename(self._filename,
-                                                self.section.GetAllowMissing())
-        # Allow the file to be missing
-        if not self._pathname:
-            self.SetContents(b'')
-            self.missing = True
-            return True
-        return super().ObtainContents()
index e95dabe..7c486b2 100644 (file)
@@ -17,7 +17,7 @@ class Entry_blob_named_by_arg(Entry_blob):
 
     Properties / Entry arguments:
         - <xxx>-path: Filename containing the contents of this entry (optional,
-            defaults to 0)
+            defaults to None)
 
     where <xxx> is the blob_fname argument to the constructor.
 
@@ -28,7 +28,9 @@ class Entry_blob_named_by_arg(Entry_blob):
 
     See cros_ec_rw for an example of this.
     """
-    def __init__(self, section, etype, node, blob_fname):
+    def __init__(self, section, etype, node, blob_fname, required=False):
         super().__init__(section, etype, node)
-        self._filename, = self.GetEntryArgsOrProps(
-            [EntryArg('%s-path' % blob_fname, str)])
+        filename, = self.GetEntryArgsOrProps(
+            [EntryArg('%s-path' % blob_fname, str)], required=required)
+        if filename:
+            self._filename = filename
index 741372e..bf676b2 100644 (file)
@@ -7,7 +7,6 @@
 
 from binman.etype.blob_named_by_arg import Entry_blob_named_by_arg
 
-
 class Entry_cros_ec_rw(Entry_blob_named_by_arg):
     """A blob entry which contains a Chromium OS read-write EC image
 
@@ -18,5 +17,5 @@ class Entry_cros_ec_rw(Entry_blob_named_by_arg):
     updating the EC on startup via software sync.
     """
     def __init__(self, section, etype, node):
-        super().__init__(section, etype, node, 'cros-ec-rw')
+        super().__init__(section, etype, node, 'cros-ec-rw', required=True)
         self.external = True
index 75712f4..de4745c 100644 (file)
@@ -8,7 +8,7 @@
 from collections import defaultdict, OrderedDict
 import libfdt
 
-from binman.entry import Entry
+from binman.entry import Entry, EntryArg
 from dtoc import fdt_util
 from dtoc.fdt import Fdt
 from patman import tools
@@ -27,6 +27,7 @@ class Entry_fit(Entry):
         binman {
             fit {
                 description = "Test FIT";
+                fit,fdt-list = "of-list";
 
                 images {
                     kernel@1 {
@@ -45,7 +46,60 @@ class Entry_fit(Entry):
             };
         };
 
-    Properties:
+    U-Boot supports creating fdt and config nodes automatically. To do this,
+    pass an of-list property (e.g. -a of-list=file1 file2). This tells binman
+    that you want to generates nodes for two files: file1.dtb and file2.dtb
+    The fit,fdt-list property (see above) indicates that of-list should be used.
+    If the property is missing you will get an error.
+
+    Then add a 'generator node', a node with a name starting with '@':
+
+        images {
+            @fdt-SEQ {
+                description = "fdt-NAME";
+                type = "flat_dt";
+                compression = "none";
+            };
+        };
+
+    This tells binman to create nodes fdt-1 and fdt-2 for each of your two
+    files. All the properties you specify will be included in the node. This
+    node acts like a template to generate the nodes. The generator node itself
+    does not appear in the output - it is replaced with what binman generates.
+
+    You can create config nodes in a similar way:
+
+        configurations {
+            default = "@config-DEFAULT-SEQ";
+            @config-SEQ {
+                description = "NAME";
+                firmware = "uboot";
+                loadables = "atf";
+                fdt = "fdt-SEQ";
+            };
+        };
+
+    This tells binman to create nodes config-1 and config-2, i.e. a config for
+    each of your two files.
+
+    Available substitutions for '@' nodes are:
+
+        SEQ    Sequence number of the generated fdt (1, 2, ...)
+        NAME   Name of the dtb as provided (i.e. without adding '.dtb')
+
+    Note that if no devicetree files are provided (with '-a of-list' as above)
+    then no nodes will be generated.
+
+    The 'default' property, if present, will be automatically set to the name
+    if of configuration whose devicetree matches the 'default-dt' entry
+    argument, e.g. with '-a default-dt=sun50i-a64-pine64-lts'.
+
+    Available substitutions for '@' property values are:
+
+        DEFAULT-SEQ  Sequence number of the default fdt,as provided by the
+                     'default-dt' entry argument
+
+    Properties (in the 'fit' node itself):
         fit,external-offset: Indicates that the contents of the FIT are external
             and provides the external offset. This is passsed to mkimage via
             the -E and -p flags.
@@ -55,15 +109,28 @@ class Entry_fit(Entry):
         """
         Members:
             _fit: FIT file being built
-            _fit_content: dict:
+            _fit_sections: dict:
                 key: relative path to entry Node (from the base of the FIT)
-                value: List of Entry objects comprising the contents of this
+                value: Entry_section object comprising the contents of this
                     node
         """
         super().__init__(section, etype, node)
         self._fit = None
-        self._fit_content = defaultdict(list)
+        self._fit_sections = {}
         self._fit_props = {}
+        for pname, prop in self._node.props.items():
+            if pname.startswith('fit,'):
+                self._fit_props[pname] = prop
+
+        self._fdts = None
+        self._fit_list_prop = self._fit_props.get('fit,fdt-list')
+        if self._fit_list_prop:
+            fdts, = self.GetEntryArgsOrProps(
+                [EntryArg(self._fit_list_prop.value, str)])
+            if fdts is not None:
+                self._fdts = fdts.split()
+        self._fit_default_dt = self.GetEntryArgsOrProps([EntryArg('default-dt',
+                                                                  str)])[0]
 
     def ReadNode(self):
         self._ReadSubnodes()
@@ -84,22 +151,71 @@ class Entry_fit(Entry):
                   image
             """
             for pname, prop in node.props.items():
-                if pname.startswith('fit,'):
-                    self._fit_props[pname] = prop
-                else:
+                if not pname.startswith('fit,'):
+                    if pname == 'default':
+                        val = prop.value
+                        # Handle the 'default' property
+                        if val.startswith('@'):
+                            if not self._fdts:
+                                continue
+                            if not self._fit_default_dt:
+                                self.Raise("Generated 'default' node requires default-dt entry argument")
+                            if self._fit_default_dt not in self._fdts:
+                                self.Raise("default-dt entry argument '%s' not found in fdt list: %s" %
+                                           (self._fit_default_dt,
+                                            ', '.join(self._fdts)))
+                            seq = self._fdts.index(self._fit_default_dt)
+                            val = val[1:].replace('DEFAULT-SEQ', str(seq + 1))
+                            fsw.property_string(pname, val)
+                            continue
                     fsw.property(pname, prop.bytes)
 
             rel_path = node.path[len(base_node.path):]
-            has_images = depth == 2 and rel_path.startswith('/images/')
+            in_images = rel_path.startswith('/images')
+            has_images = depth == 2 and in_images
+            if has_images:
+                # This node is a FIT subimage node (e.g. "/images/kernel")
+                # containing content nodes. We collect the subimage nodes and
+                # section entries for them here to merge the content subnodes
+                # together and put the merged contents in the subimage node's
+                # 'data' property later.
+                entry = Entry.Create(self.section, node, etype='section')
+                entry.ReadNode()
+                self._fit_sections[rel_path] = entry
+
             for subnode in node.subnodes:
                 if has_images and not (subnode.name.startswith('hash') or
                                        subnode.name.startswith('signature')):
-                    # This is a content node. We collect all of these together
-                    # and put them in the 'data' property. They do not appear
-                    # in the FIT.
-                    entry = Entry.Create(self.section, subnode)
-                    entry.ReadNode()
-                    self._fit_content[rel_path].append(entry)
+                    # This subnode is a content node not meant to appear in
+                    # the FIT (e.g. "/images/kernel/u-boot"), so don't call
+                    # fsw.add_node() or _AddNode() for it.
+                    pass
+                elif subnode.name.startswith('@'):
+                    if self._fdts:
+                        # Generate notes for each FDT
+                        for seq, fdt_fname in enumerate(self._fdts):
+                            node_name = subnode.name[1:].replace('SEQ',
+                                                                 str(seq + 1))
+                            fname = tools.GetInputFilename(fdt_fname + '.dtb')
+                            with fsw.add_node(node_name):
+                                for pname, prop in subnode.props.items():
+                                    val = prop.bytes.replace(
+                                        b'NAME', tools.ToBytes(fdt_fname))
+                                    val = val.replace(
+                                        b'SEQ', tools.ToBytes(str(seq + 1)))
+                                    fsw.property(pname, val)
+
+                                    # Add data for 'fdt' nodes (but not 'config')
+                                    if depth == 1 and in_images:
+                                        fsw.property('data',
+                                                     tools.ReadFile(fname))
+                    else:
+                        if self._fdts is None:
+                            if self._fit_list_prop:
+                                self.Raise("Generator node requires '%s' entry argument" %
+                                           self._fit_list_prop.value)
+                            else:
+                                self.Raise("Generator node requires 'fit,fdt-list' property")
                 else:
                     with fsw.add_node(subnode.name):
                         _AddNode(base_node, depth + 1, subnode)
@@ -123,9 +239,8 @@ class Entry_fit(Entry):
         This adds the 'data' properties to the input ITB (Image-tree Binary)
         then runs mkimage to process it.
         """
+        # self._BuildInput() either returns bytes or raises an exception.
         data = self._BuildInput(self._fdt)
-        if data == False:
-            return False
         uniq = self.GetUniqueName()
         input_fname = tools.GetOutputFilename('%s.itb' % uniq)
         output_fname = tools.GetOutputFilename('%s.fit' % uniq)
@@ -150,15 +265,30 @@ class Entry_fit(Entry):
         Returns:
             New fdt contents (bytes)
         """
-        for path, entries in self._fit_content.items():
+        for path, section in self._fit_sections.items():
             node = fdt.GetNode(path)
-            data = b''
-            for entry in entries:
-                if not entry.ObtainContents():
-                    return False
-                data += entry.GetData()
+            # Entry_section.ObtainContents() either returns True or
+            # raises an exception.
+            section.ObtainContents()
+            section.Pack(0)
+            data = section.GetData()
             node.AddData('data', data)
 
         fdt.Sync(auto_resize=True)
         data = fdt.GetContents()
         return data
+
+    def CheckMissing(self, missing_list):
+        """Check if any entries in this FIT have missing external blobs
+
+        If there are missing blobs, the entries are added to the list
+
+        Args:
+            missing_list: List of Entry objects to be added to
+        """
+        for path, section in self._fit_sections.items():
+            section.CheckMissing(missing_list)
+
+    def SetAllowMissing(self, allow_missing):
+        for section in self._fit_sections.values():
+            section.SetAllowMissing(allow_missing)
index 73c5553..515c97f 100644 (file)
@@ -35,7 +35,7 @@ class Entry_section(Entry):
             when writing out the map
 
     Properties:
-        _allow_missing: True if this section permits external blobs to be
+        allow_missing: True if this section permits external blobs to be
             missing their contents. The second will produce an image but of
             course it will not work.
 
@@ -54,8 +54,6 @@ class Entry_section(Entry):
         self._sort = False
         self._skip_at_start = None
         self._end_4gb = False
-        self._allow_missing = False
-        self.missing = False
 
     def ReadNode(self):
         """Read properties from the image node"""
@@ -83,7 +81,7 @@ class Entry_section(Entry):
 
     def _ReadEntries(self):
         for node in self._node.subnodes:
-            if node.name == 'hash':
+            if node.name.startswith('hash') or node.name.startswith('signature'):
                 continue
             entry = Entry.Create(self, node)
             entry.ReadNode()
@@ -152,7 +150,7 @@ class Entry_section(Entry):
         for entry in self._entries.values():
             data = entry.GetData()
             base = self.pad_before + (entry.offset or 0) - self._skip_at_start
-            pad = base - len(section_data)
+            pad = base - len(section_data) + (entry.pad_before or 0)
             if pad > 0:
                 section_data += tools.GetBytes(self._pad_byte, pad)
             section_data += data
@@ -549,18 +547,10 @@ class Entry_section(Entry):
         Args:
             allow_missing: True if allowed, False if not allowed
         """
-        self._allow_missing = allow_missing
+        self.allow_missing = allow_missing
         for entry in self._entries.values():
             entry.SetAllowMissing(allow_missing)
 
-    def GetAllowMissing(self):
-        """Get whether a section allows missing external blobs
-
-        Returns:
-            True if allowed, False if not allowed
-        """
-        return self._allow_missing
-
     def CheckMissing(self, missing_list):
         """Check if any entries in this section have missing external blobs
 
index 5f650b5..95b17d0 100644 (file)
@@ -74,6 +74,12 @@ REFCODE_DATA          = b'refcode'
 FSP_M_DATA            = b'fsp_m'
 FSP_S_DATA            = b'fsp_s'
 FSP_T_DATA            = b'fsp_t'
+ATF_BL31_DATA         = b'bl31'
+TEST_FDT1_DATA        = b'fdt1'
+TEST_FDT2_DATA        = b'test-fdt2'
+
+# Subdirectory of the input dir to use to put test FDTs
+TEST_FDT_SUBDIR       = 'fdts'
 
 # The expected size for the device tree in some tests
 EXTRACT_DTB_SIZE = 0x3c9
@@ -167,6 +173,13 @@ class TestFunctional(unittest.TestCase):
                         os.path.join(cls._indir, 'files'))
 
         TestFunctional._MakeInputFile('compress', COMPRESS_DATA)
+        TestFunctional._MakeInputFile('bl31.bin', ATF_BL31_DATA)
+
+        # Add a few .dtb files for testing
+        TestFunctional._MakeInputFile('%s/test-fdt1.dtb' % TEST_FDT_SUBDIR,
+                                      TEST_FDT1_DATA)
+        TestFunctional._MakeInputFile('%s/test-fdt2.dtb' % TEST_FDT_SUBDIR,
+                                      TEST_FDT2_DATA)
 
         # Travis-CI may have an old lz4
         cls.have_lz4 = True
@@ -285,7 +298,7 @@ class TestFunctional(unittest.TestCase):
 
     def _DoTestFile(self, fname, debug=False, map=False, update_dtb=False,
                     entry_args=None, images=None, use_real_dtb=False,
-                    verbosity=None, allow_missing=False):
+                    verbosity=None, allow_missing=False, extra_indirs=None):
         """Run binman with a given test file
 
         Args:
@@ -298,6 +311,14 @@ class TestFunctional(unittest.TestCase):
                 key: arg name
                 value: value of that arg
             images: List of image names to build
+            use_real_dtb: True to use the test file as the contents of
+                the u-boot-dtb entry. Normally this is not needed and the
+                test contents (the U_BOOT_DTB_DATA string) can be used.
+                But in some test we need the real contents.
+            verbosity: Verbosity level to use (0-3, None=don't set it)
+            allow_missing: Set the '--allow-missing' flag so that missing
+                external binaries just produce a warning instead of an error
+            extra_indirs: Extra input directories to add using -I
         """
         args = []
         if debug:
@@ -324,6 +345,9 @@ class TestFunctional(unittest.TestCase):
         if images:
             for image in images:
                 args += ['-i', image]
+        if extra_indirs:
+            for indir in extra_indirs:
+                args += ['-I', indir]
         return self._DoBinman(*args)
 
     def _SetupDtb(self, fname, outfile='u-boot.dtb'):
@@ -357,6 +381,13 @@ class TestFunctional(unittest.TestCase):
         We still want the DTBs for SPL and TPL to be different though, since
         otherwise it is confusing to know which one we are looking at. So add
         an 'spl' or 'tpl' property to the top-level node.
+
+        Args:
+            dtb_data: dtb data to modify (this should be a value devicetree)
+            name: Name of a new property to add
+
+        Returns:
+            New dtb data with the property added
         """
         dtb = fdt.Fdt.FromData(dtb_data)
         dtb.Scan()
@@ -366,7 +397,8 @@ class TestFunctional(unittest.TestCase):
         return dtb.GetContents()
 
     def _DoReadFileDtb(self, fname, use_real_dtb=False, map=False,
-                       update_dtb=False, entry_args=None, reset_dtbs=True):
+                       update_dtb=False, entry_args=None, reset_dtbs=True,
+                       extra_indirs=None):
         """Run binman and return the resulting image
 
         This runs binman with a given test file and then reads the resulting
@@ -384,6 +416,13 @@ class TestFunctional(unittest.TestCase):
             map: True to output map files for the images
             update_dtb: Update the offset and size of each entry in the device
                 tree before packing it into the image
+            entry_args: Dict of entry args to supply to binman
+                key: arg name
+                value: value of that arg
+            reset_dtbs: With use_real_dtb the test dtb is overwritten by this
+                function. If reset_dtbs is True, then the original test dtb
+                is written back before this function finishes
+            extra_indirs: Extra input directories to add using -I
 
         Returns:
             Tuple:
@@ -407,7 +446,8 @@ class TestFunctional(unittest.TestCase):
 
         try:
             retcode = self._DoTestFile(fname, map=map, update_dtb=update_dtb,
-                    entry_args=entry_args, use_real_dtb=use_real_dtb)
+                    entry_args=entry_args, use_real_dtb=use_real_dtb,
+                    extra_indirs=extra_indirs)
             self.assertEqual(0, retcode)
             out_dtb_fname = tools.GetOutputFilename('u-boot.dtb.out')
 
@@ -1382,8 +1422,9 @@ class TestFunctional(unittest.TestCase):
         }
         with self.assertRaises(ValueError) as e:
             self._DoReadFileDtb('064_entry_args_required.dts')
-        self.assertIn("Node '/binman/_testing': Missing required "
-            'properties/entry args: test-str-arg, test-int-fdt, test-int-arg',
+        self.assertIn("Node '/binman/_testing': "
+            'Missing required properties/entry args: test-str-arg, '
+            'test-int-fdt, test-int-arg',
             str(e.exception))
 
     def testEntryArgsInvalidFormat(self):
@@ -1487,8 +1528,7 @@ class TestFunctional(unittest.TestCase):
         entry_args = {
             'cros-ec-rw-path': 'ecrw.bin',
         }
-        data, _, _, _ = self._DoReadFileDtb('068_blob_named_by_arg.dts',
-                                            entry_args=entry_args)
+        self._DoReadFileDtb('068_blob_named_by_arg.dts', entry_args=entry_args)
 
     def testFill(self):
         """Test for an fill entry type"""
@@ -3467,7 +3507,7 @@ class TestFunctional(unittest.TestCase):
         self.assertEqual(len(U_BOOT_SPL_DTB_DATA), int(data_sizes[1].split()[0]))
 
     def testFitExternal(self):
-        """Test an image with an FIT"""
+        """Test an image with an FIT with external images"""
         data = self._DoReadFile('162_fit_external.dts')
         fit_data = data[len(U_BOOT_DATA):-2]  # _testing is 2 bytes
 
@@ -3477,5 +3517,196 @@ class TestFunctional(unittest.TestCase):
         fnode = dtb.GetNode('/images/kernel')
         self.assertNotIn('data', fnode.props)
 
+    def testSectionIgnoreHashSignature(self):
+        """Test that sections ignore hash, signature nodes for its data"""
+        data = self._DoReadFile('165_section_ignore_hash_signature.dts')
+        expected = (U_BOOT_DATA + U_BOOT_DATA)
+        self.assertEqual(expected, data)
+
+    def testPadInSections(self):
+        """Test pad-before, pad-after for entries in sections"""
+        data = self._DoReadFile('166_pad_in_sections.dts')
+        expected = (U_BOOT_DATA + tools.GetBytes(ord('!'), 12) +
+                    U_BOOT_DATA + tools.GetBytes(ord('!'), 6) +
+                    U_BOOT_DATA)
+        self.assertEqual(expected, data)
+
+    def testFitImageSubentryAlignment(self):
+        """Test relative alignability of FIT image subentries"""
+        entry_args = {
+            'test-id': TEXT_DATA,
+        }
+        data, _, _, _ = self._DoReadFileDtb('167_fit_image_subentry_alignment.dts',
+                                            entry_args=entry_args)
+        dtb = fdt.Fdt.FromData(data)
+        dtb.Scan()
+
+        node = dtb.GetNode('/images/kernel')
+        data = dtb.GetProps(node)["data"].bytes
+        align_pad = 0x10 - (len(U_BOOT_SPL_DATA) % 0x10)
+        expected = (tools.GetBytes(0, 0x20) + U_BOOT_SPL_DATA +
+                    tools.GetBytes(0, align_pad) + U_BOOT_DATA)
+        self.assertEqual(expected, data)
+
+        node = dtb.GetNode('/images/fdt-1')
+        data = dtb.GetProps(node)["data"].bytes
+        expected = (U_BOOT_SPL_DTB_DATA + tools.GetBytes(0, 20) +
+                    tools.ToBytes(TEXT_DATA) + tools.GetBytes(0, 30) +
+                    U_BOOT_DTB_DATA)
+        self.assertEqual(expected, data)
+
+    def testFitExtblobMissingOk(self):
+        """Test a FIT with a missing external blob that is allowed"""
+        with test_util.capture_sys_output() as (stdout, stderr):
+            self._DoTestFile('168_fit_missing_blob.dts',
+                             allow_missing=True)
+        err = stderr.getvalue()
+        self.assertRegex(err, "Image 'main-section'.*missing.*: atf-bl31")
+
+    def testBlobNamedByArgMissing(self):
+        """Test handling of a missing entry arg"""
+        with self.assertRaises(ValueError) as e:
+            self._DoReadFile('068_blob_named_by_arg.dts')
+        self.assertIn("Missing required properties/entry args: cros-ec-rw-path",
+                      str(e.exception))
+
+    def testPackBl31(self):
+        """Test that an image with an ATF BL31 binary can be created"""
+        data = self._DoReadFile('169_atf_bl31.dts')
+        self.assertEqual(ATF_BL31_DATA, data[:len(ATF_BL31_DATA)])
+
+    def testFitFdt(self):
+        """Test an image with an FIT with multiple FDT images"""
+        def _CheckFdt(seq, expected_data):
+            """Check the FDT nodes
+
+            Args:
+                seq: Sequence number to check (0 or 1)
+                expected_data: Expected contents of 'data' property
+            """
+            name = 'fdt-%d' % seq
+            fnode = dtb.GetNode('/images/%s' % name)
+            self.assertIsNotNone(fnode)
+            self.assertEqual({'description','type', 'compression', 'data'},
+                             set(fnode.props.keys()))
+            self.assertEqual(expected_data, fnode.props['data'].bytes)
+            self.assertEqual('fdt-test-fdt%d.dtb' % seq,
+                             fnode.props['description'].value)
+
+        def _CheckConfig(seq, expected_data):
+            """Check the configuration nodes
+
+            Args:
+                seq: Sequence number to check (0 or 1)
+                expected_data: Expected contents of 'data' property
+            """
+            cnode = dtb.GetNode('/configurations')
+            self.assertIn('default', cnode.props)
+            self.assertEqual('config-2', cnode.props['default'].value)
+
+            name = 'config-%d' % seq
+            fnode = dtb.GetNode('/configurations/%s' % name)
+            self.assertIsNotNone(fnode)
+            self.assertEqual({'description','firmware', 'loadables', 'fdt'},
+                             set(fnode.props.keys()))
+            self.assertEqual('conf-test-fdt%d.dtb' % seq,
+                             fnode.props['description'].value)
+            self.assertEqual('fdt-%d' % seq, fnode.props['fdt'].value)
+
+        entry_args = {
+            'of-list': 'test-fdt1 test-fdt2',
+            'default-dt': 'test-fdt2',
+        }
+        data = self._DoReadFileDtb(
+            '172_fit_fdt.dts',
+            entry_args=entry_args,
+            extra_indirs=[os.path.join(self._indir, TEST_FDT_SUBDIR)])[0]
+        self.assertEqual(U_BOOT_NODTB_DATA, data[-len(U_BOOT_NODTB_DATA):])
+        fit_data = data[len(U_BOOT_DATA):-len(U_BOOT_NODTB_DATA)]
+
+        dtb = fdt.Fdt.FromData(fit_data)
+        dtb.Scan()
+        fnode = dtb.GetNode('/images/kernel')
+        self.assertIn('data', fnode.props)
+
+        # Check all the properties in fdt-1 and fdt-2
+        _CheckFdt(1, TEST_FDT1_DATA)
+        _CheckFdt(2, TEST_FDT2_DATA)
+
+        # Check configurations
+        _CheckConfig(1, TEST_FDT1_DATA)
+        _CheckConfig(2, TEST_FDT2_DATA)
+
+    def testFitFdtMissingList(self):
+        """Test handling of a missing 'of-list' entry arg"""
+        with self.assertRaises(ValueError) as e:
+            self._DoReadFile('172_fit_fdt.dts')
+        self.assertIn("Generator node requires 'of-list' entry argument",
+                      str(e.exception))
+
+    def testFitFdtEmptyList(self):
+        """Test handling of an empty 'of-list' entry arg"""
+        entry_args = {
+            'of-list': '',
+        }
+        data = self._DoReadFileDtb('170_fit_fdt.dts', entry_args=entry_args)[0]
+
+    def testFitFdtMissingProp(self):
+        """Test handling of a missing 'fit,fdt-list' property"""
+        with self.assertRaises(ValueError) as e:
+            self._DoReadFile('171_fit_fdt_missing_prop.dts')
+        self.assertIn("Generator node requires 'fit,fdt-list' property",
+                      str(e.exception))
+
+    def testFitFdtEmptyList(self):
+        """Test handling of an empty 'of-list' entry arg"""
+        entry_args = {
+            'of-list': '',
+        }
+        data = self._DoReadFileDtb('172_fit_fdt.dts', entry_args=entry_args)[0]
+
+    def testFitFdtMissing(self):
+        """Test handling of a missing 'default-dt' entry arg"""
+        entry_args = {
+            'of-list': 'test-fdt1 test-fdt2',
+        }
+        with self.assertRaises(ValueError) as e:
+            self._DoReadFileDtb(
+                '172_fit_fdt.dts',
+                entry_args=entry_args,
+                extra_indirs=[os.path.join(self._indir, TEST_FDT_SUBDIR)])[0]
+        self.assertIn("Generated 'default' node requires default-dt entry argument",
+                      str(e.exception))
+
+    def testFitFdtNotInList(self):
+        """Test handling of a default-dt that is not in the of-list"""
+        entry_args = {
+            'of-list': 'test-fdt1 test-fdt2',
+            'default-dt': 'test-fdt3',
+        }
+        with self.assertRaises(ValueError) as e:
+            self._DoReadFileDtb(
+                '172_fit_fdt.dts',
+                entry_args=entry_args,
+                extra_indirs=[os.path.join(self._indir, TEST_FDT_SUBDIR)])[0]
+        self.assertIn("default-dt entry argument 'test-fdt3' not found in fdt list: test-fdt1, test-fdt2",
+                      str(e.exception))
+
+    def testFitExtblobMissingHelp(self):
+        """Test display of help messages when an external blob is missing"""
+        control.missing_blob_help = control._ReadMissingBlobHelp()
+        control.missing_blob_help['wibble'] = 'Wibble test'
+        control.missing_blob_help['another'] = 'Another test'
+        with test_util.capture_sys_output() as (stdout, stderr):
+            self._DoTestFile('168_fit_missing_blob.dts',
+                             allow_missing=True)
+        err = stderr.getvalue()
+
+        # We can get the tag from the name, the type or the missing-msg
+        # property. Check all three.
+        self.assertIn('You may need to build ARM Trusted', err)
+        self.assertIn('Wibble test', err)
+        self.assertIn('Another test', err)
+
 if __name__ == "__main__":
     unittest.main()
diff --git a/tools/binman/missing-blob-help b/tools/binman/missing-blob-help
new file mode 100644 (file)
index 0000000..7cf1c34
--- /dev/null
@@ -0,0 +1,15 @@
+# This file contains help messages for missing external blobs. Each message has
+# a tag (MUST be just lower-case text, digits and hyphens) starting in column 1,
+# followed by a colon (:) to indicate its start. The message can include any
+# number of lines, including blank lines.
+#
+# When looking for a tag, Binman uses the value of 'missing-msg' for the entry,
+# the entry name or the entry type, in that order
+
+atf-bl31:
+See the documentation for your board. You may need to build ARM Trusted
+Firmware and build with BL31=/path/to/bl31.bin
+
+atf-bl31-sunxi:
+Please read the section on ARM Trusted Firmware (ATF) in
+board/sunxi/README.sunxi64
diff --git a/tools/binman/test/165_section_ignore_hash_signature.dts b/tools/binman/test/165_section_ignore_hash_signature.dts
new file mode 100644 (file)
index 0000000..8adbe25
--- /dev/null
@@ -0,0 +1,40 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               section@0 {
+                       u-boot {
+                       };
+                       hash {
+                               algo = "sha256";
+                       };
+                       signature {
+                               algo = "sha256,rsa2048";
+                               key-name-hint = "dev";
+                       };
+               };
+               section@1 {
+                       u-boot {
+                       };
+                       hash-1 {
+                               algo = "sha1";
+                       };
+                       hash-2 {
+                               algo = "sha256";
+                       };
+                       signature-1 {
+                               algo = "sha1,rsa2048";
+                               key-name-hint = "dev";
+                       };
+                       signature-2 {
+                               algo = "sha256,rsa2048";
+                               key-name-hint = "dev";
+                       };
+               };
+       };
+};
diff --git a/tools/binman/test/166_pad_in_sections.dts b/tools/binman/test/166_pad_in_sections.dts
new file mode 100644 (file)
index 0000000..f2b327f
--- /dev/null
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               pad-byte = <0x26>;
+               section {
+                       pad-byte = <0x21>;
+
+                       before {
+                               type = "u-boot";
+                       };
+                       u-boot {
+                               pad-before = <12>;
+                               pad-after = <6>;
+                       };
+                       after {
+                               type = "u-boot";
+                       };
+               };
+       };
+};
diff --git a/tools/binman/test/167_fit_image_subentry_alignment.dts b/tools/binman/test/167_fit_image_subentry_alignment.dts
new file mode 100644 (file)
index 0000000..360cac5
--- /dev/null
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               fit {
+                       description = "test-desc";
+                       #address-cells = <1>;
+
+                       images {
+                               kernel {
+                                       description = "Offset-Align Test";
+                                       type = "kernel";
+                                       arch = "arm64";
+                                       os = "linux";
+                                       compression = "none";
+                                       load = <00000000>;
+                                       entry = <00000000>;
+                                       u-boot-spl {
+                                               offset = <0x20>;
+                                       };
+                                       u-boot {
+                                               align = <0x10>;
+                                       };
+                               };
+                               fdt-1 {
+                                       description = "Pad-Before-After Test";
+                                       type = "flat_dt";
+                                       arch = "arm64";
+                                       compression = "none";
+                                       u-boot-spl-dtb {
+                                       };
+                                       text {
+                                               text-label = "test-id";
+                                               pad-before = <20>;
+                                               pad-after = <30>;
+                                       };
+                                       u-boot-dtb {
+                                       };
+                               };
+                       };
+
+                       configurations {
+                               default = "conf-1";
+                               conf-1 {
+                                       description = "Kernel with FDT blob";
+                                       kernel = "kernel";
+                                       fdt = "fdt-1";
+                               };
+                       };
+               };
+       };
+};
diff --git a/tools/binman/test/168_fit_missing_blob.dts b/tools/binman/test/168_fit_missing_blob.dts
new file mode 100644 (file)
index 0000000..15f6cc0
--- /dev/null
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               u-boot {
+               };
+               fit {
+                       description = "test-desc";
+                       #address-cells = <1>;
+                       fit,fdt-list = "of-list";
+
+                       images {
+                               kernel {
+                                       description = "ATF BL31";
+                                       type = "kernel";
+                                       arch = "ppc";
+                                       os = "linux";
+                                       compression = "gzip";
+                                       load = <00000000>;
+                                       entry = <00000000>;
+                                       hash-1 {
+                                               algo = "crc32";
+                                       };
+                                       hash-2 {
+                                               algo = "sha1";
+                                       };
+                                       atf-bl31 {
+                                               filename = "missing";
+                                       };
+                                       cros-ec-rw {
+                                               type = "atf-bl31";
+                                               missing-msg = "wibble";
+                                       };
+                                       another {
+                                               type = "atf-bl31";
+                                       };
+                               };
+                       };
+               };
+               u-boot-nodtb {
+               };
+       };
+};
diff --git a/tools/binman/test/169_atf_bl31.dts b/tools/binman/test/169_atf_bl31.dts
new file mode 100644 (file)
index 0000000..2b7547d
--- /dev/null
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               size = <16>;
+
+               atf-bl31 {
+                       filename = "bl31.bin";
+               };
+       };
+};
diff --git a/tools/binman/test/171_fit_fdt_missing_prop.dts b/tools/binman/test/171_fit_fdt_missing_prop.dts
new file mode 100644 (file)
index 0000000..c361347
--- /dev/null
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               u-boot {
+               };
+               fit {
+                       description = "test-desc";
+                       #address-cells = <1>;
+
+                       images {
+                               kernel {
+                                       description = "Vanilla Linux kernel";
+                                       type = "kernel";
+                                       arch = "ppc";
+                                       os = "linux";
+                                       compression = "gzip";
+                                       load = <00000000>;
+                                       entry = <00000000>;
+                                       hash-1 {
+                                               algo = "crc32";
+                                       };
+                                       hash-2 {
+                                               algo = "sha1";
+                                       };
+                                       u-boot {
+                                       };
+                               };
+                               @fdt-SEQ {
+                                       description = "fdt-NAME.dtb";
+                                       type = "flat_dt";
+                                       compression = "none";
+                               };
+                       };
+
+                       configurations {
+                               default = "config-1";
+                               @config-SEQ {
+                                       description = "conf-NAME.dtb";
+                                       firmware = "uboot";
+                                       loadables = "atf";
+                                       fdt = "fdt-SEQ";
+                               };
+                       };
+               };
+               u-boot-nodtb {
+               };
+       };
+};
diff --git a/tools/binman/test/172_fit_fdt.dts b/tools/binman/test/172_fit_fdt.dts
new file mode 100644 (file)
index 0000000..99d710c
--- /dev/null
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               u-boot {
+               };
+               fit {
+                       description = "test-desc";
+                       #address-cells = <1>;
+                       fit,fdt-list = "of-list";
+
+                       images {
+                               kernel {
+                                       description = "Vanilla Linux kernel";
+                                       type = "kernel";
+                                       arch = "ppc";
+                                       os = "linux";
+                                       compression = "gzip";
+                                       load = <00000000>;
+                                       entry = <00000000>;
+                                       hash-1 {
+                                               algo = "crc32";
+                                       };
+                                       hash-2 {
+                                               algo = "sha1";
+                                       };
+                                       u-boot {
+                                       };
+                               };
+                               @fdt-SEQ {
+                                       description = "fdt-NAME.dtb";
+                                       type = "flat_dt";
+                                       compression = "none";
+                               };
+                       };
+
+                       configurations {
+                               default = "@config-DEFAULT-SEQ";
+                               @config-SEQ {
+                                       description = "conf-NAME.dtb";
+                                       firmware = "uboot";
+                                       loadables = "atf";
+                                       fdt = "fdt-SEQ";
+                               };
+                       };
+               };
+               u-boot-nodtb {
+               };
+       };
+};
index e4fd97b..0b19b7d 100644 (file)
@@ -7,6 +7,19 @@
 # SPDX-License-Identifier:      GPL-2.0+
 #
 
+HOSTARCH := $(shell uname -m | sed -e s/i.86/x86/ )
+ifeq ($(findstring $(HOSTARCH),"x86" "x86_64"),)
+ifeq ($(findstring $(MAKECMDGOALS),"help" "clean"),)
+ifndef CROSS_COMPILE
+$(error Binman tests need to compile to x86, but the CPU arch of your \
+       machine is $(HOSTARCH). Set CROSS_COMPILE to a suitable cross compiler)
+endif
+endif
+endif
+
+CC             = $(CROSS_COMPILE)gcc
+OBJCOPY                = $(CROSS_COMPILE)objcopy
+
 VPATH := $(SRC)
 CFLAGS := -march=i386 -m32 -nostdlib -I $(SRC)../../../include \
        -Wl,--no-dynamic-linker
@@ -32,7 +45,7 @@ bss_data: CFLAGS += $(SRC)bss_data.lds
 bss_data: bss_data.c
 
 u_boot_binman_syms.bin: u_boot_binman_syms
-       objcopy -O binary $< -R .note.gnu.build-id $@
+       $(OBJCOPY) -O binary $< -R .note.gnu.build-id $@
 
 u_boot_binman_syms: CFLAGS += $(LDS_BINMAN)
 u_boot_binman_syms: u_boot_binman_syms.c
index dbb75b3..c939468 100644 (file)
@@ -1541,41 +1541,73 @@ class Builder:
         """Prepare the working directory for a thread.
 
         This clones or fetches the repo into the thread's work directory.
+        Optionally, it can create a linked working tree of the repo in the
+        thread's work directory instead.
 
         Args:
             thread_num: Thread number (0, 1, ...)
-            setup_git: True to set up a git repo clone
+            setup_git:
+               'clone' to set up a git clone
+               'worktree' to set up a git worktree
         """
         thread_dir = self.GetThreadDir(thread_num)
         builderthread.Mkdir(thread_dir)
         git_dir = os.path.join(thread_dir, '.git')
 
-        # Clone the repo if it doesn't already exist
-        # TODO(sjg@chromium): Perhaps some git hackery to symlink instead, so
-        # we have a private index but uses the origin repo's contents?
+        # Create a worktree or a git repo clone for this thread if it
+        # doesn't already exist
         if setup_git and self.git_dir:
             src_dir = os.path.abspath(self.git_dir)
-            if os.path.exists(git_dir):
+            if os.path.isdir(git_dir):
+                # This is a clone of the src_dir repo, we can keep using
+                # it but need to fetch from src_dir.
                 Print('\rFetching repo for thread %d' % thread_num,
                       newline=False)
                 gitutil.Fetch(git_dir, thread_dir)
                 terminal.PrintClear()
-            else:
+            elif os.path.isfile(git_dir):
+                # This is a worktree of the src_dir repo, we don't need to
+                # create it again or update it in any way.
+                pass
+            elif os.path.exists(git_dir):
+                # Don't know what could trigger this, but we probably
+                # can't create a git worktree/clone here.
+                raise ValueError('Git dir %s exists, but is not a file '
+                                 'or a directory.' % git_dir)
+            elif setup_git == 'worktree':
+                Print('\rChecking out worktree for thread %d' % thread_num,
+                      newline=False)
+                gitutil.AddWorktree(src_dir, thread_dir)
+                terminal.PrintClear()
+            elif setup_git == 'clone' or setup_git == True:
                 Print('\rCloning repo for thread %d' % thread_num,
                       newline=False)
                 gitutil.Clone(src_dir, thread_dir)
                 terminal.PrintClear()
+            else:
+                raise ValueError("Can't setup git repo with %s." % setup_git)
 
     def _PrepareWorkingSpace(self, max_threads, setup_git):
         """Prepare the working directory for use.
 
-        Set up the git repo for each thread.
+        Set up the git repo for each thread. Creates a linked working tree
+        if git-worktree is available, or clones the repo if it isn't.
 
         Args:
             max_threads: Maximum number of threads we expect to need.
-            setup_git: True to set up a git repo clone
+            setup_git: True to set up a git worktree or a git clone
         """
         builderthread.Mkdir(self._working_dir)
+        if setup_git and self.git_dir:
+            src_dir = os.path.abspath(self.git_dir)
+            if gitutil.CheckWorktreeIsAvailable(src_dir):
+                setup_git = 'worktree'
+                # If we previously added a worktree but the directory for it
+                # got deleted, we need to prune its files from the repo so
+                # that we can check out another in its place.
+                gitutil.PruneWorktrees(src_dir)
+            else:
+                setup_git = 'clone'
         for thread in range(max_threads):
             self._PrepareThread(thread, setup_git)
 
index 418677f..3dd2e6e 100644 (file)
@@ -319,6 +319,8 @@ class TestFunctional(unittest.TestCase):
             return command.CommandResult(return_code=0)
         elif sub_cmd == 'checkout':
             return command.CommandResult(return_code=0)
+        elif sub_cmd == 'worktree':
+            return command.CommandResult(return_code=0)
 
         # Not handled, so abort
         print('git', git_args, sub_cmd, args)
index 3eaba07..1a259d5 100644 (file)
@@ -9,9 +9,6 @@ import tempfile
 import time
 import unittest
 
-# Bring in the patman libraries
-our_path = os.path.dirname(os.path.realpath(__file__))
-
 from buildman import board
 from buildman import bsettings
 from buildman import builder
index b040793..37e96b9 100644 (file)
@@ -68,22 +68,23 @@ def EnsureCompiled(fname, tmpdir=None, capture_stderr=False):
 
     search_paths = [os.path.join(os.getcwd(), 'include')]
     root, _ = os.path.splitext(fname)
-    args = ['-E', '-P', '-x', 'assembler-with-cpp', '-D__ASSEMBLY__']
+    cc, args = tools.GetTargetCompileTool('cc')
+    args += ['-E', '-P', '-x', 'assembler-with-cpp', '-D__ASSEMBLY__']
     args += ['-Ulinux']
     for path in search_paths:
         args.extend(['-I', path])
     args += ['-o', dts_input, fname]
-    command.Run('cc', *args)
+    command.Run(cc, *args)
 
     # If we don't have a directory, put it in the tools tempdir
     search_list = []
     for path in search_paths:
         search_list.extend(['-i', path])
-    args = ['-I', 'dts', '-o', dtb_output, '-O', 'dtb',
+    dtc, args = tools.GetTargetCompileTool('dtc')
+    args += ['-I', 'dts', '-o', dtb_output, '-O', 'dtb',
             '-W', 'no-unit_address_vs_reg']
     args.extend(search_list)
     args.append(dts_input)
-    dtc = os.environ.get('DTC') or 'dtc'
     command.Run(dtc, *args, capture_stderr=capture_stderr)
     return dtb_output
 
index 192d8e6..27a0a9f 100644 (file)
@@ -259,6 +259,48 @@ def Fetch(git_dir=None, work_tree=None):
     if result.return_code != 0:
         raise OSError('git fetch: %s' % result.stderr)
 
+def CheckWorktreeIsAvailable(git_dir):
+    """Check if git-worktree functionality is available
+
+    Args:
+        git_dir: The repository to test in
+
+    Returns:
+        True if git-worktree commands will work, False otherwise.
+    """
+    pipe = ['git', '--git-dir', git_dir, 'worktree', 'list']
+    result = command.RunPipe([pipe], capture=True, capture_stderr=True,
+                             raise_on_error=False)
+    return result.return_code == 0
+
+def AddWorktree(git_dir, output_dir, commit_hash=None):
+    """Create and checkout a new git worktree for this build
+
+    Args:
+        git_dir: The repository to checkout the worktree from
+        output_dir: Path for the new worktree
+        commit_hash: Commit hash to checkout
+    """
+    # We need to pass --detach to avoid creating a new branch
+    pipe = ['git', '--git-dir', git_dir, 'worktree', 'add', '.', '--detach']
+    if commit_hash:
+        pipe.append(commit_hash)
+    result = command.RunPipe([pipe], capture=True, cwd=output_dir,
+                             capture_stderr=True)
+    if result.return_code != 0:
+        raise OSError('git worktree add: %s' % result.stderr)
+
+def PruneWorktrees(git_dir):
+    """Remove administrative files for deleted worktrees
+
+    Args:
+        git_dir: The repository whose deleted worktrees should be pruned
+    """
+    pipe = ['git', '--git-dir', git_dir, 'worktree', 'prune']
+    result = command.RunPipe([pipe], capture=True, capture_stderr=True)
+    if result.return_code != 0:
+        raise OSError('git worktree prune: %s' % result.stderr)
+
 def CreatePatches(branch, start, count, ignore_binary, series):
     """Create a series of patches from the top of the current branch.
 
index d41115a..bbb157d 100644 (file)
@@ -188,6 +188,120 @@ def PathHasFile(path_spec, fname):
             return True
     return False
 
+def GetHostCompileTool(name):
+    """Get the host-specific version for a compile tool
+
+    This checks the environment variables that specify which version of
+    the tool should be used (e.g. ${HOSTCC}).
+
+    The following table lists the host-specific versions of the tools
+    this function resolves to:
+
+        Compile Tool  | Host version
+        --------------+----------------
+        as            |  ${HOSTAS}
+        ld            |  ${HOSTLD}
+        cc            |  ${HOSTCC}
+        cpp           |  ${HOSTCPP}
+        c++           |  ${HOSTCXX}
+        ar            |  ${HOSTAR}
+        nm            |  ${HOSTNM}
+        ldr           |  ${HOSTLDR}
+        strip         |  ${HOSTSTRIP}
+        objcopy       |  ${HOSTOBJCOPY}
+        objdump       |  ${HOSTOBJDUMP}
+        dtc           |  ${HOSTDTC}
+
+    Args:
+        name: Command name to run
+
+    Returns:
+        host_name: Exact command name to run instead
+        extra_args: List of extra arguments to pass
+    """
+    host_name = None
+    extra_args = []
+    if name in ('as', 'ld', 'cc', 'cpp', 'ar', 'nm', 'ldr', 'strip',
+                'objcopy', 'objdump', 'dtc'):
+        host_name, *host_args = env.get('HOST' + name.upper(), '').split(' ')
+    elif name == 'c++':
+        host_name, *host_args = env.get('HOSTCXX', '').split(' ')
+
+    if host_name:
+        return host_name, extra_args
+    return name, []
+
+def GetTargetCompileTool(name, cross_compile=None):
+    """Get the target-specific version for a compile tool
+
+    This first checks the environment variables that specify which
+    version of the tool should be used (e.g. ${CC}). If those aren't
+    specified, it checks the CROSS_COMPILE variable as a prefix for the
+    tool with some substitutions (e.g. "${CROSS_COMPILE}gcc" for cc).
+
+    The following table lists the target-specific versions of the tools
+    this function resolves to:
+
+        Compile Tool  | First choice   | Second choice
+        --------------+----------------+----------------------------
+        as            |  ${AS}         | ${CROSS_COMPILE}as
+        ld            |  ${LD}         | ${CROSS_COMPILE}ld.bfd
+                      |                |   or ${CROSS_COMPILE}ld
+        cc            |  ${CC}         | ${CROSS_COMPILE}gcc
+        cpp           |  ${CPP}        | ${CROSS_COMPILE}gcc -E
+        c++           |  ${CXX}        | ${CROSS_COMPILE}g++
+        ar            |  ${AR}         | ${CROSS_COMPILE}ar
+        nm            |  ${NM}         | ${CROSS_COMPILE}nm
+        ldr           |  ${LDR}        | ${CROSS_COMPILE}ldr
+        strip         |  ${STRIP}      | ${CROSS_COMPILE}strip
+        objcopy       |  ${OBJCOPY}    | ${CROSS_COMPILE}objcopy
+        objdump       |  ${OBJDUMP}    | ${CROSS_COMPILE}objdump
+        dtc           |  ${DTC}        | (no CROSS_COMPILE version)
+
+    Args:
+        name: Command name to run
+
+    Returns:
+        target_name: Exact command name to run instead
+        extra_args: List of extra arguments to pass
+    """
+    env = dict(os.environ)
+
+    target_name = None
+    extra_args = []
+    if name in ('as', 'ld', 'cc', 'cpp', 'ar', 'nm', 'ldr', 'strip',
+                'objcopy', 'objdump', 'dtc'):
+        target_name, *extra_args = env.get(name.upper(), '').split(' ')
+    elif name == 'c++':
+        target_name, *extra_args = env.get('CXX', '').split(' ')
+
+    if target_name:
+        return target_name, extra_args
+
+    if cross_compile is None:
+        cross_compile = env.get('CROSS_COMPILE', '')
+    if not cross_compile:
+        return name, []
+
+    if name in ('as', 'ar', 'nm', 'ldr', 'strip', 'objcopy', 'objdump'):
+        target_name = cross_compile + name
+    elif name == 'ld':
+        try:
+            if Run(cross_compile + 'ld.bfd', '-v'):
+                target_name = cross_compile + 'ld.bfd'
+        except:
+            target_name = cross_compile + 'ld'
+    elif name == 'cc':
+        target_name = cross_compile + 'gcc'
+    elif name == 'cpp':
+        target_name = cross_compile + 'gcc'
+        extra_args = ['-E']
+    elif name == 'c++':
+        target_name = cross_compile + 'g++'
+    else:
+        target_name = name
+    return target_name, extra_args
+
 def Run(name, *args, **kwargs):
     """Run a tool with some arguments
 
@@ -198,16 +312,27 @@ def Run(name, *args, **kwargs):
     Args:
         name: Command name to run
         args: Arguments to the tool
+        for_host: True to resolve the command to the version for the host
+        for_target: False to run the command as-is, without resolving it
+                   to the version for the compile target
 
     Returns:
         CommandResult object
     """
     try:
         binary = kwargs.get('binary')
+        for_host = kwargs.get('for_host', False)
+        for_target = kwargs.get('for_target', not for_host)
         env = None
         if tool_search_paths:
             env = dict(os.environ)
             env['PATH'] = ':'.join(tool_search_paths) + ':' + env['PATH']
+        if for_target:
+            name, extra_args = GetTargetCompileTool(name)
+            args = tuple(extra_args) + args
+        elif for_host:
+            name, extra_args = GetHostCompileTool(name)
+            args = tuple(extra_args) + args
         all_args = (name,) + args
         result = command.RunPipe([all_args], capture=True, capture_stderr=True,
                                  env=env, raise_on_error=False, binary=binary)
index 06c3562..de68563 100755 (executable)
@@ -28,9 +28,6 @@ import os
 import re
 import sys
 
-# Bring in the patman libraries
-our_path = os.path.dirname(os.path.realpath(__file__))
-
 from patman import command
 
 def rm_kconfig_include(path):