Prepare v2022.01-rc3

-----BEGIN PGP SIGNATURE-----
 
 iQGzBAABCgAdFiEEGjx/cOCPqxcHgJu/FHw5/5Y0tywFAmGk/4sACgkQFHw5/5Y0
 tyyjtgwAo0jCRa1Vyc5z2RrINGdARoPhNcCnBNMYEVTjH9uP0/Mzlpo4i1IWX5qP
 nEuVmP01KjtWDRNy7Cpr45/j2PkTZ0THqXGZKpTG/yALdUKZw0wbzeh/CMllWh0A
 9yJfMbv2/IV79rbb6osxItjusSr5PnrU5fHsR+zUfC8NRZpzWGfpH8a6NpfGvGYo
 3OUKNJrGv930C3MqVnUEHPIuz+vL9fWLSs/rK/JHVZt+ALU45uYtz4cKycMoElVd
 IUJe3mhKhw0k8dO8R+p3UAEFrP+LZdcBLgCt8wRQK6Yl4lcxYOtZgYuJuM9Kp20s
 abqIuky3TWwFjpNM60Gmo63Yf967jOeI/lfITq2juZ5TBlNKOO6Z/NRVUsHkNKFG
 7qJC14/NxuSdN4u9s2h+rJBBGYc+BzWVO/ikigHnsCeFQYfafJpGTnPSJr55OU5X
 eeB6l3blx6jwxOPAz0JhLecZb4e027R+eKionirMEnVPENtnJjF1d+CulkekahUO
 LvdqKaBE
 =h4j5
 -----END PGP SIGNATURE-----

Merge tag 'v2022.01-rc3' into next

Prepare v2022.01-rc3

Signed-off-by: Tom Rini <trini@konsulko.com>
This commit is contained in:
Tom Rini 2021-11-29 12:00:57 -05:00
commit 2402c93130
77 changed files with 2130 additions and 344 deletions

View file

@ -668,6 +668,7 @@ F: drivers/mtd/jedec_flash.c
CLOCK CLOCK
M: Lukasz Majewski <lukma@denx.de> M: Lukasz Majewski <lukma@denx.de>
M: Sean Anderson <seanga2@gmail.com>
S: Maintained S: Maintained
T: git https://source.denx.de/u-boot/custodians/u-boot-clk.git T: git https://source.denx.de/u-boot/custodians/u-boot-clk.git
F: drivers/clk/ F: drivers/clk/
@ -768,6 +769,18 @@ S: Maintained
F: doc/usage/environment.rst F: doc/usage/environment.rst
F: scripts/env2string.awk F: scripts/env2string.awk
FASTBOOT
S: Orphaned
F: cmd/fastboot.c
F: doc/android/fastboot*.rst
F: include/fastboot.h
F: include/fastboot-internal.h
F: include/net/fastboot.h
F: drivers/fastboot/
F: drivers/usb/gadget/f_fastboot.c
F: net/fastboot.c
F: test/dm/fastboot.c
FPGA FPGA
M: Michal Simek <michal.simek@xilinx.com> M: Michal Simek <michal.simek@xilinx.com>
S: Maintained S: Maintained

View file

@ -3,7 +3,7 @@
VERSION = 2022 VERSION = 2022
PATCHLEVEL = 01 PATCHLEVEL = 01
SUBLEVEL = SUBLEVEL =
EXTRAVERSION = -rc2 EXTRAVERSION = -rc3
NAME = NAME =
# *DOCUMENTATION* # *DOCUMENTATION*
@ -1247,7 +1247,7 @@ binary_size_check: u-boot-nodtb.bin FORCE
echo "u-boot.map shows a binary size of $$map_size" >&2 ; \ echo "u-boot.map shows a binary size of $$map_size" >&2 ; \
echo " but u-boot-nodtb.bin shows $$file_size" >&2 ; \ echo " but u-boot-nodtb.bin shows $$file_size" >&2 ; \
exit 1; \ exit 1; \
fi \ fi; \
fi fi
ifeq ($(CONFIG_INIT_SP_RELATIVE)$(CONFIG_OF_SEPARATE),yy) ifeq ($(CONFIG_INIT_SP_RELATIVE)$(CONFIG_OF_SEPARATE),yy)

View file

@ -319,6 +319,7 @@ dtb-$(CONFIG_ARCH_ZYNQMP) += \
avnet-ultra96-rev1.dtb \ avnet-ultra96-rev1.dtb \
avnet-ultrazedev-cc-v1.0-ultrazedev-som-v1.0.dtb \ avnet-ultrazedev-cc-v1.0-ultrazedev-som-v1.0.dtb \
zynqmp-a2197-revA.dtb \ zynqmp-a2197-revA.dtb \
zynqmp-dlc21-revA.dtb \
zynqmp-e-a2197-00-revA.dtb \ zynqmp-e-a2197-00-revA.dtb \
zynqmp-g-a2197-00-revA.dtb \ zynqmp-g-a2197-00-revA.dtb \
zynqmp-m-a2197-01-revA.dtb \ zynqmp-m-a2197-01-revA.dtb \

View file

@ -0,0 +1,221 @@
// SPDX-License-Identifier: GPL-2.0
/*
* dts file for Xilinx ZynqMP DLC21 revA
*
* (C) Copyright 2019 - 2021, Xilinx, Inc.
*
* Michal Simek <michal.simek@xilinx.com>
*/
/dts-v1/;
#include "zynqmp.dtsi"
#include "zynqmp-clk-ccf.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/phy/phy.h>
#include <include/dt-bindings/gpio/gpio.h>
/ {
model = "Smartlynq+ DLC21 RevA";
compatible = "xlnx,zynqmp-dlc21-revA", "xlnx,zynqmp-dlc21",
"xlnx,zynqmp";
aliases {
ethernet0 = &gem0;
gpio0 = &gpio;
i2c0 = &i2c0;
mmc0 = &sdhci0;
mmc1 = &sdhci1;
rtc0 = &rtc;
serial0 = &uart0;
serial2 = &dcc;
usb0 = &usb0;
usb1 = &usb1;
spi0 = &spi0;
nvmem0 = &eeprom;
};
chosen {
bootargs = "earlycon";
stdout-path = "serial0:115200n8";
};
memory@0 {
device_type = "memory";
reg = <0 0 0 0x80000000>, <0x8 0 0x3 0x80000000>;
};
si5332_1: si5332_1 { /* clk0_sgmii - u142 */
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <125000000>;
};
si5332_2: si5332_2 { /* clk1_usb - u142 */
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <26000000>;
};
};
&sdhci0 { /* emmc MIO 13-23 - with some settings 16GB */
status = "okay";
non-removable;
disable-wp;
bus-width = <8>;
xlnx,mio_bank = <0>;
};
&sdhci1 { /* sd1 MIO45-51 cd in place */
status = "okay";
no-1-8-v;
disable-wp;
xlnx,mio_bank = <1>;
};
&psgtr {
status = "okay";
/* sgmii, usb3 */
clocks = <&si5332_1>, <&si5332_2>;
clock-names = "ref0", "ref1";
};
&uart0 { /* uart0 MIO38-39 */
status = "okay";
u-boot,dm-pre-reloc;
};
&gem0 {
status = "okay";
phy-handle = <&phy0>;
phy-mode = "sgmii"; /* DTG generates this properly 1512 */
is-internal-pcspma;
/* phy-reset-gpios = <&gpio 142 GPIO_ACTIVE_LOW>; */
phy0: ethernet-phy@0 {
reg = <0>;
};
};
&gpio {
status = "okay";
gpio-line-names = "", "", "", "", "", /* 0 - 4 */
"", "", "", "", "", /* 5 - 9 */
"", "", "", "EMMC_DAT0", "EMMC_DAT1", /* 10 - 14 */
"EMMC_DAT2", "EMMC_DAT3", "EMMC_DAT4", "EMMC_DAT5", "EMMC_DAT6", /* 15 - 19 */
"EMMC_DAT7", "EMMC_CMD", "EMMC_CLK", "EMMC_RST_B", "", /* 20 - 24 */
"", "DISP_SCL", "DISP_DC_B", "DISP_RES_B", "DISP_CS_B", /* 25 - 29 */
"", "DISP_SDI", "SYSTEM_RST_R_B", "", "I2C0_SCL", /* 30 - 34 */
"I2C0_SDA", "", "", "UART0_RXD_IN", "UART0_TXD_OUT", /* 35 - 39 */
"", "", "ETH_RESET_B", "", "", /* 40 - 44 */
"SD1_CD_B", "SD1_DATA0", "SD1_DATA1", "SD1_DATA2", "SD1_DATA3", /* 45 - 49 */
"SD1_CMD", "SD1_CLK", "USB0_CLK", "USB0_DIR", "USB0_DATA2", /* 50 - 54 */
"USB0_NXT", "USB0_DATA0", "USB0_DATA1", "USB0_STP", "USB0_DATA3", /* 55 - 59 */
"USB0_DATA4", "USB0_DATA5", "USB0_DATA6", "USB0_DATA7", "USB1_CLK", /* 60 - 64 */
"USB1_DIR", "USB1_DATA2", "USB1_NXT", "USB1_DATA0", "USB1_DATA1", /* 65 - 69 */
"USB1_STP", "USB1_DATA3", "USB1_DATA4", "USB1_DATA5", "USB1_DATA6", /* 70 - 74 */
"USB1_DATA7", "ETH_MDC", "ETH_MDIO", /* 75 - 77, MIO end and EMIO start */
"", "", /* 78 - 79 */
"", "", "", "", "", /* 80 - 84 */
"", "", "", "", "", /* 85 -89 */
"", "", "", "", "", /* 90 - 94 */
"", "VCCO_500_RBIAS", "VCCO_501_RBIAS", "VCCO_502_RBIAS", "VCCO_500_RBIAS_LED", /* 95 - 99 */
"VCCO_501_RBIAS_LED", "VCCO_502_RBIAS_LED", "SYSCTLR_VCCINT_EN", "SYSCTLR_VCC_IO_SOC_EN", "SYSCTLR_VCC_PMC_EN", /* 100 - 104 */
"", "", "", "", "", /* 105 - 109 */
"SYSCTLR_VCCO_500_EN", "SYSCTLR_VCCO_501_EN", "SYSCTLR_VCCO_502_EN", "SYSCTLR_VCCO_503_EN", "SYSCTLR_VCC1V8_EN", /* 110 - 114 */
"SYSCTLR_VCC3V3_EN", "SYSCTLR_VCC1V2_DDR4_EN", "SYSCTLR_VCC1V1_LP4_EN", "SYSCTLR_VDD1_1V8_LP4_EN", "SYSCTLR_VADJ_FMC_EN", /* 115 - 119 */
"", "", "", "SYSCTLR_UTIL_1V13_EN", "SYSCTLR_UTIL_1V8_EN", /* 120 - 124 */
"SYSCTLR_UTIL_2V5_EN", "", "", "", "", /* 125 - 129 */
"", "", "SYSCTLR_USBC_SBU1", "SYSCTLR_USBC_SBU2", "", /* 130 - 134 */
"", "SYSCTLR_MIC2005_EN_B", "SYSCTLR_MIC2005_FAULT_B", "SYSCTLR_TUSB320_INT_B", "SYSCTLR_TUSB320_ID", /* 135 - 139 */
"", "", "SYSCTLR_ETH_RESET_B", "", "", /* 140 - 144 */
"", "", "", "", "", /* 145 - 149 */
"", "", "", "", "", /* 150 - 154 */
"", "", "", "", "", /* 155 - 159 */
"", "", "", "", "", /* 160 - 164 */
"", "", "", "", "", /* 165 - 169 */
"", "", "", ""; /* 170 - 174 */
};
&i2c0 { /* MIO34/35 */
status = "okay";
clock-frequency = <400000>;
jtag_vref: mcp4725@62 {
compatible = "microchip,mcp4725";
reg = <0x62>;
vref-millivolt = <3300>;
};
eeprom: eeprom@50 { /* u46 */
compatible = "atmel,24c32";
reg = <0x50>;
};
/* u138 - TUSB320IRWBR - for USB-C */
};
&usb0 {
status = "okay";
xlnx,usb-polarity = <0>;
xlnx,usb-reset-mode = <0>;
};
&dwc3_0 {
status = "okay";
dr_mode = "peripheral";
snps,dis_u2_susphy_quirk;
snps,dis_u3_susphy_quirk;
maximum-speed = "super-speed";
phy-names = "usb3-phy";
phys = <&psgtr 1 PHY_TYPE_USB3 0 1>;
};
&usb1 {
status = "disabled"; /* Any unknown issue with USB-C */
xlnx,usb-polarity = <0>;
xlnx,usb-reset-mode = <0>;
};
&dwc3_1 {
/delete-property/ phy-names ;
/delete-property/ phys ;
dr_mode = "host";
maximum-speed = "high-speed";
snps,dis_u2_susphy_quirk ;
snps,dis_u3_susphy_quirk ;
status = "okay";
};
&xilinx_ams {
status = "okay";
};
&ams_ps {
status = "okay";
};
&ams_pl {
status = "okay";
};
&spi0 {
status = "okay";
is-decoded-cs = <0>;
num-cs = <1>;
u-boot,dm-pre-reloc;
displayspi@0 {
compatible = "syncoam,seps525";
u-boot,dm-pre-reloc;
reg = <0>;
status = "okay";
spi-max-frequency = <10000000>;
spi-cpol;
spi-cpha;
rotate = <0>;
fps = <50>;
buswidth = <8>;
txbuflen = <64000>;
reset-gpios = <&gpio 0x1c GPIO_ACTIVE_LOW>;
dc-gpios = <&gpio 0x1b GPIO_ACTIVE_HIGH>;
debug = <0>;
};
};

View file

@ -46,7 +46,7 @@
si5332_1: si5332_1 { /* clk0_sgmii - u142 */ si5332_1: si5332_1 { /* clk0_sgmii - u142 */
compatible = "fixed-clock"; compatible = "fixed-clock";
#clock-cells = <0>; #clock-cells = <0>;
clock-frequency = <33333333>; /* FIXME */ clock-frequency = <125000000>;
}; };
si5332_2: si5332_2 { /* clk1_usb - u142 */ si5332_2: si5332_2 { /* clk1_usb - u142 */

View file

@ -108,6 +108,10 @@ ENTRY(_main)
bic sp, x0, #0xf /* 16-byte alignment for ABI compliance */ bic sp, x0, #0xf /* 16-byte alignment for ABI compliance */
ldr x18, [x18, #GD_NEW_GD] /* x18 <- gd->new_gd */ ldr x18, [x18, #GD_NEW_GD] /* x18 <- gd->new_gd */
/* Skip relocation in case gd->gd_flags & GD_FLG_SKIP_RELOC */
ldr x0, [x18, #GD_FLAGS] /* x0 <- gd->flags */
tbnz x0, 11, relocation_return /* GD_FLG_SKIP_RELOC is bit 11 */
adr lr, relocation_return adr lr, relocation_return
#if CONFIG_POSITION_INDEPENDENT #if CONFIG_POSITION_INDEPENDENT
/* Add in link-vs-runtime offset */ /* Add in link-vs-runtime offset */

View file

@ -210,7 +210,7 @@ ENTRY(memcpy)
orr r9, r9, ip, lspush #\push orr r9, r9, ip, lspush #\push
mov ip, ip, lspull #\pull mov ip, ip, lspull #\pull
orr ip, ip, lr, lspush #\push orr ip, ip, lr, lspush #\push
str8w r0, r3, r4, r5, r6, r7, r8, r9, ip, , abort=19f str8w r0, r3, r4, r5, r6, r7, r8, r9, ip, abort=19f
bge 12b bge 12b
PLD( cmn r2, #96 ) PLD( cmn r2, #96 )
PLD( bge 13b ) PLD( bge 13b )

View file

@ -569,7 +569,7 @@ config TARGET_KP_IMX6Q_TPC
imply CMD_SPL imply CMD_SPL
config TARGET_TQMA6 config TARGET_TQMA6
bool "TQ Systems TQMa6 board" bool "TQ-Systems TQMa6 board"
select BOARD_EARLY_INIT_F select BOARD_EARLY_INIT_F
select BOARD_LATE_INIT select BOARD_LATE_INIT
select MXC_SPI select MXC_SPI
@ -688,7 +688,7 @@ source "board/somlabs/visionsom-6ull/Kconfig"
source "board/technexion/pico-imx6/Kconfig" source "board/technexion/pico-imx6/Kconfig"
source "board/technexion/pico-imx6ul/Kconfig" source "board/technexion/pico-imx6ul/Kconfig"
source "board/tbs/tbs2910/Kconfig" source "board/tbs/tbs2910/Kconfig"
source "board/tqc/tqma6/Kconfig" source "board/tq/tqma6/Kconfig"
source "board/toradex/apalis_imx6/Kconfig" source "board/toradex/apalis_imx6/Kconfig"
source "board/toradex/colibri_imx6/Kconfig" source "board/toradex/colibri_imx6/Kconfig"
source "board/toradex/colibri-imx6ull/Kconfig" source "board/toradex/colibri-imx6ull/Kconfig"

View file

@ -25,6 +25,7 @@ config SPL_SPI
default y if ZYNQ_QSPI default y if ZYNQ_QSPI
config SYS_BOARD config SYS_BOARD
string "Board name"
default "zynqmp" default "zynqmp"
config SYS_VENDOR config SYS_VENDOR
@ -149,6 +150,14 @@ config SPL_ZYNQMP_ALT_BOOTMODE_ENABLED
Overwrite bootmode selected via boot mode pins to tell SPL what should Overwrite bootmode selected via boot mode pins to tell SPL what should
be the next boot device. be the next boot device.
config SPL_ZYNQMP_RESTORE_JTAG
bool "Restore JTAG"
depends on SPL
help
Booting SPL in secure mode causes the CSU to disable the JTAG interface
even if no eFuses were burnt. This option restores the interface if
possible.
config ZYNQ_SDHCI_MAX_FREQ config ZYNQ_SDHCI_MAX_FREQ
default 200000000 default 200000000

View file

@ -39,20 +39,26 @@
#define RESET_REASON_INTERNAL BIT(1) #define RESET_REASON_INTERNAL BIT(1)
#define RESET_REASON_EXTERNAL BIT(0) #define RESET_REASON_EXTERNAL BIT(0)
#define CRLAPB_DBG_LPD_CTRL_SETUP_CLK 0x01002002
#define CRLAPB_RST_LPD_DBG_RESET 0
struct crlapb_regs { struct crlapb_regs {
u32 reserved0[36]; u32 reserved0[36];
u32 cpu_r5_ctrl; /* 0x90 */ u32 cpu_r5_ctrl; /* 0x90 */
u32 reserved1[37]; u32 reserved1[7];
u32 dbg_lpd_ctrl; /* 0xB0 */
u32 reserved2[29];
u32 timestamp_ref_ctrl; /* 0x128 */ u32 timestamp_ref_ctrl; /* 0x128 */
u32 reserved2[53]; u32 reserved3[53];
u32 boot_mode; /* 0x200 */ u32 boot_mode; /* 0x200 */
u32 reserved3_0[7]; u32 reserved4_0[7];
u32 reset_reason; /* 0x220 */ u32 reset_reason; /* 0x220 */
u32 reserved3_1[6]; u32 reserved4_1[6];
u32 rst_lpd_top; /* 0x23C */ u32 rst_lpd_top; /* 0x23C */
u32 reserved4[4]; u32 rst_lpd_dbg; /* 0x240 */
u32 reserved5[3];
u32 boot_pin_ctrl; /* 0x250 */ u32 boot_pin_ctrl; /* 0x250 */
u32 reserved5[21]; u32 reserved6[21];
}; };
#define crlapb_base ((struct crlapb_regs *)ZYNQMP_CRL_APB_BASEADDR) #define crlapb_base ((struct crlapb_regs *)ZYNQMP_CRL_APB_BASEADDR)
@ -141,12 +147,23 @@ struct apu_regs {
#define ZYNQMP_SILICON_VER_MASK 0xF #define ZYNQMP_SILICON_VER_MASK 0xF
#define ZYNQMP_SILICON_VER_SHIFT 0 #define ZYNQMP_SILICON_VER_SHIFT 0
#define CSU_JTAG_SEC_GATE_DISABLE GENMASK(7, 0)
#define CSU_JTAG_DAP_ENABLE_DEBUG GENMASK(7, 0)
#define CSU_JTAG_CHAIN_WR_SETUP GENMASK(1, 0)
#define CSU_PCAP_PROG_RELEASE_PL BIT(0)
struct csu_regs { struct csu_regs {
u32 reserved0[4]; u32 reserved0[4];
u32 multi_boot; u32 multi_boot;
u32 reserved1[11]; u32 reserved1[7];
u32 jtag_chain_status_wr;
u32 jtag_chain_status;
u32 jtag_sec;
u32 jtag_dap_cfg;
u32 idcode; u32 idcode;
u32 version; u32 version;
u32 reserved2[3055];
u32 pcap_prog;
}; };
#define csu_base ((struct csu_regs *)ZYNQMP_CSU_BASEADDR) #define csu_base ((struct csu_regs *)ZYNQMP_CSU_BASEADDR)

View file

@ -434,8 +434,10 @@ void __efi_runtime EFIAPI efi_reset_system(
efi_status_t reset_status, efi_status_t reset_status,
unsigned long data_size, void *reset_data) unsigned long data_size, void *reset_data)
{ {
os_fd_restore(); if (reset_type == EFI_RESET_SHUTDOWN)
os_relaunch(os_argv); sandbox_exit();
else
sandbox_reset();
} }
void sandbox_reset(void) void sandbox_reset(void)

View file

@ -2,4 +2,3 @@
obj-$(CONFIG_SYS_MTDPARTS_RUNTIME) += qemu_mtdparts.o obj-$(CONFIG_SYS_MTDPARTS_RUNTIME) += qemu_mtdparts.o
obj-$(CONFIG_SET_DFU_ALT_INFO) += qemu_dfu.o obj-$(CONFIG_SET_DFU_ALT_INFO) += qemu_dfu.o
obj-$(CONFIG_EFI_CAPSULE_FIRMWARE_MANAGEMENT) += qemu_capsule.o

View file

@ -82,6 +82,8 @@ int board_init(void)
{ {
gd->bd->bi_boot_params = CONFIG_SYS_LOAD_ADDR + LOAD_OFFSET; gd->bd->bi_boot_params = CONFIG_SYS_LOAD_ADDR + LOAD_OFFSET;
gd->env_addr = (ulong)&default_environment[0];
synquacer_setup_scbm_smmu(); synquacer_setup_scbm_smmu();
return 0; return 0;

View file

@ -4,7 +4,7 @@ config SYS_BOARD
default "tqma6" default "tqma6"
config SYS_VENDOR config SYS_VENDOR
default "tqc" default "tq"
config SYS_CONFIG_NAME config SYS_CONFIG_NAME
default "tqma6" default "tqma6"
@ -89,8 +89,8 @@ config SYS_TEXT_BASE
default 0x4fc00000 if TQMA6Q || TQMA6DL default 0x4fc00000 if TQMA6Q || TQMA6DL
config IMX_CONFIG config IMX_CONFIG
default "board/tqc/tqma6/tqma6q.cfg" if TQMA6Q default "board/tq/tqma6/tqma6q.cfg" if TQMA6Q
default "board/tqc/tqma6/tqma6dl.cfg" if TQMA6DL default "board/tq/tqma6/tqma6dl.cfg" if TQMA6DL
default "board/tqc/tqma6/tqma6s.cfg" if TQMA6S default "board/tq/tqma6/tqma6s.cfg" if TQMA6S
endif endif

View file

@ -1,6 +1,6 @@
TQ SYSTEMS TQMA6 BOARD TQ-SYSTEMS TQMA6 BOARD
M: Markus Niebel <Markus.Niebel@tq-group.com> M: Markus Niebel <Markus.Niebel@tq-group.com>
S: Maintained S: Maintained
F: board/tqc/tqma6/ F: board/tq/tqma6/
F: include/configs/tqma6.h F: include/configs/tqma6.h
F: configs/tqma6*_defconfig F: configs/tqma6*_defconfig

View file

@ -1,7 +1,7 @@
U-Boot for the TQ Systems TQMa6 modules U-Boot for the TQ-Systems TQMa6 modules
This file contains information for the port of This file contains information for the port of
U-Boot to the TQ Systems TQMa6 modules. U-Boot to the TQ-Systems TQMa6 modules.
1. Boot source 1. Boot source
-------------- --------------
@ -14,7 +14,7 @@ The following boot source is supported:
2. Building 2. Building
------------ ------------
To build U-Boot for the TQ Systems TQMa6 modules: To build U-Boot for the TQ-Systems TQMa6 modules:
make tqma6<x>_<baseboard>_<boot>_config make tqma6<x>_<baseboard>_<boot>_config
make make

View file

@ -3,7 +3,7 @@
* Copyright (C) 2012 Freescale Semiconductor, Inc. * Copyright (C) 2012 Freescale Semiconductor, Inc.
* Author: Fabio Estevam <fabio.estevam@freescale.com> * Author: Fabio Estevam <fabio.estevam@freescale.com>
* *
* Copyright (C) 2013, 2014 TQ Systems (ported SabreSD to TQMa6x) * Copyright (C) 2013, 2014 TQ-Systems (ported SabreSD to TQMa6x)
* Author: Markus Niebel <markus.niebel@tq-group.com> * Author: Markus Niebel <markus.niebel@tq-group.com>
*/ */

View file

@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0+ */ /* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* Copyright (C) 2013, 2014 TQ Systems * Copyright (C) 2013, 2014 TQ-Systems
* Author: Markus Niebel <markus.niebel@tq-group.com> * Author: Markus Niebel <markus.niebel@tq-group.com>
*/ */

View file

@ -3,7 +3,7 @@
* Copyright (C) 2012 Freescale Semiconductor, Inc. * Copyright (C) 2012 Freescale Semiconductor, Inc.
* Author: Fabio Estevam <fabio.estevam@freescale.com> * Author: Fabio Estevam <fabio.estevam@freescale.com>
* *
* Copyright (C) 2013, 2014 TQ Systems (ported SabreSD to TQMa6x) * Copyright (C) 2013, 2014 TQ-Systems (ported SabreSD to TQMa6x)
* Author: Markus Niebel <markus.niebel@tq-group.com> * Author: Markus Niebel <markus.niebel@tq-group.com>
*/ */

View file

@ -3,7 +3,7 @@
* Copyright (C) 2012 Freescale Semiconductor, Inc. * Copyright (C) 2012 Freescale Semiconductor, Inc.
* Author: Fabio Estevam <fabio.estevam@freescale.com> * Author: Fabio Estevam <fabio.estevam@freescale.com>
* *
* Copyright (C) 2013, 2014 TQ Systems (ported SabreSD to TQMa6x) * Copyright (C) 2013, 2014 TQ-Systems (ported SabreSD to TQMa6x)
* Author: Markus Niebel <markus.niebel@tq-group.com> * Author: Markus Niebel <markus.niebel@tq-group.com>
* *
* Copyright (C) 2015 Stefan Roese <sr@denx.de> * Copyright (C) 2015 Stefan Roese <sr@denx.de>

View file

@ -0,0 +1,922 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* (c) Copyright 2015 Xilinx, Inc. All rights reserved.
*/
#include <asm/arch/psu_init_gpl.h>
#include <xil_io.h>
static unsigned long psu_pll_init_data(void)
{
psu_mask_write(0xFF5E0034, 0xFE7FEDEFU, 0x7E4B0C62U);
psu_mask_write(0xFF5E0030, 0x00717F00U, 0x00014000U);
psu_mask_write(0xFF5E0030, 0x00000008U, 0x00000008U);
psu_mask_write(0xFF5E0030, 0x00000001U, 0x00000001U);
psu_mask_write(0xFF5E0030, 0x00000001U, 0x00000000U);
mask_poll(0xFF5E0040, 0x00000002U);
psu_mask_write(0xFF5E0030, 0x00000008U, 0x00000000U);
psu_mask_write(0xFF5E0048, 0x00003F00U, 0x00000200U);
psu_mask_write(0xFF5E0038, 0x8000FFFFU, 0x00000000U);
psu_mask_write(0xFF5E0108, 0x013F3F07U, 0x01012300U);
psu_mask_write(0xFF5E0024, 0xFE7FEDEFU, 0x7E4B0C82U);
psu_mask_write(0xFF5E0020, 0x00717F00U, 0x00015A00U);
psu_mask_write(0xFF5E0020, 0x00000008U, 0x00000008U);
psu_mask_write(0xFF5E0020, 0x00000001U, 0x00000001U);
psu_mask_write(0xFF5E0020, 0x00000001U, 0x00000000U);
mask_poll(0xFF5E0040, 0x00000001U);
psu_mask_write(0xFF5E0020, 0x00000008U, 0x00000000U);
psu_mask_write(0xFF5E0044, 0x00003F00U, 0x00000300U);
psu_mask_write(0xFF5E0028, 0x8000FFFFU, 0x00000000U);
psu_mask_write(0xFD1A0024, 0xFE7FEDEFU, 0x7E4B0C62U);
psu_mask_write(0xFD1A0020, 0x00717F00U, 0x00014800U);
psu_mask_write(0xFD1A0020, 0x00000008U, 0x00000008U);
psu_mask_write(0xFD1A0020, 0x00000001U, 0x00000001U);
psu_mask_write(0xFD1A0020, 0x00000001U, 0x00000000U);
mask_poll(0xFD1A0044, 0x00000001U);
psu_mask_write(0xFD1A0020, 0x00000008U, 0x00000000U);
psu_mask_write(0xFD1A0048, 0x00003F00U, 0x00000300U);
psu_mask_write(0xFD1A0028, 0x8000FFFFU, 0x00000000U);
psu_mask_write(0xFD1A0030, 0xFE7FEDEFU, 0x7E4B0C62U);
psu_mask_write(0xFD1A002C, 0x00717F00U, 0x00014000U);
psu_mask_write(0xFD1A002C, 0x00000008U, 0x00000008U);
psu_mask_write(0xFD1A002C, 0x00000001U, 0x00000001U);
psu_mask_write(0xFD1A002C, 0x00000001U, 0x00000000U);
mask_poll(0xFD1A0044, 0x00000002U);
psu_mask_write(0xFD1A002C, 0x00000008U, 0x00000000U);
psu_mask_write(0xFD1A004C, 0x00003F00U, 0x00000200U);
psu_mask_write(0xFD1A0034, 0x8000FFFFU, 0x00000000U);
psu_mask_write(0xFD1A003C, 0xFE7FEDEFU, 0x7E4B0C62U);
psu_mask_write(0xFD1A0038, 0x00717F00U, 0x00014000U);
psu_mask_write(0xFD1A0038, 0x00000008U, 0x00000008U);
psu_mask_write(0xFD1A0038, 0x00000001U, 0x00000001U);
psu_mask_write(0xFD1A0038, 0x00000001U, 0x00000000U);
mask_poll(0xFD1A0044, 0x00000004U);
psu_mask_write(0xFD1A0038, 0x00000008U, 0x00000000U);
psu_mask_write(0xFD1A0050, 0x00003F00U, 0x00000200U);
psu_mask_write(0xFD1A0040, 0x8000FFFFU, 0x00000000U);
return 1;
}
static unsigned long psu_clock_init_data(void)
{
psu_mask_write(0xFF5E0050, 0x063F3F07U, 0x06013C00U);
psu_mask_write(0xFF180360, 0x00000003U, 0x00000001U);
psu_mask_write(0xFF180308, 0x00000006U, 0x00000006U);
psu_mask_write(0xFF5E0100, 0x013F3F07U, 0x01010600U);
psu_mask_write(0xFF5E0060, 0x023F3F07U, 0x02010600U);
psu_mask_write(0xFF5E0064, 0x023F3F07U, 0x02010600U);
psu_mask_write(0xFF5E004C, 0x023F3F07U, 0x02031900U);
psu_mask_write(0xFF5E006C, 0x013F3F07U, 0x01010800U);
psu_mask_write(0xFF5E0070, 0x013F3F07U, 0x01010800U);
psu_mask_write(0xFF18030C, 0x00020003U, 0x00000000U);
psu_mask_write(0xFF5E0074, 0x013F3F07U, 0x01010F00U);
psu_mask_write(0xFF5E0120, 0x013F3F07U, 0x01010F00U);
psu_mask_write(0xFF5E007C, 0x013F3F07U, 0x01010702U);
psu_mask_write(0xFF5E0090, 0x01003F07U, 0x01000302U);
psu_mask_write(0xFF5E009C, 0x01003F07U, 0x01000400U);
psu_mask_write(0xFF5E00A4, 0x01003F07U, 0x01000800U);
psu_mask_write(0xFF5E00A8, 0x01003F07U, 0x01000200U);
psu_mask_write(0xFF5E00AC, 0x01003F07U, 0x01000F02U);
psu_mask_write(0xFF5E00B0, 0x01003F07U, 0x01000602U);
psu_mask_write(0xFF5E00B8, 0x01003F07U, 0x01000200U);
psu_mask_write(0xFF5E00C0, 0x013F3F07U, 0x01010502U);
psu_mask_write(0xFF5E00C4, 0x013F3F07U, 0x01010802U);
psu_mask_write(0xFF5E00C8, 0x013F3F07U, 0x01010402U);
psu_mask_write(0xFF5E00CC, 0x013F3F07U, 0x01030A00U);
psu_mask_write(0xFF5E0108, 0x013F3F07U, 0x01011E02U);
psu_mask_write(0xFF5E0104, 0x00000007U, 0x00000000U);
psu_mask_write(0xFF5E0128, 0x01003F07U, 0x01000104U);
psu_mask_write(0xFD1A0060, 0x03003F07U, 0x03000100U);
psu_mask_write(0xFD1A0068, 0x01003F07U, 0x01000200U);
psu_mask_write(0xFD1A0080, 0x00003F07U, 0x00000200U);
psu_mask_write(0xFD1A0084, 0x07003F07U, 0x07000100U);
psu_mask_write(0xFD1A00B8, 0x01003F07U, 0x01000203U);
psu_mask_write(0xFD1A00BC, 0x01003F07U, 0x01000203U);
psu_mask_write(0xFD1A00C0, 0x01003F07U, 0x01000202U);
psu_mask_write(0xFD1A00C4, 0x01003F07U, 0x01000502U);
psu_mask_write(0xFD1A00F8, 0x00003F07U, 0x00000200U);
psu_mask_write(0xFF180380, 0x000000FFU, 0x00000000U);
psu_mask_write(0xFD610100, 0x00000001U, 0x00000000U);
psu_mask_write(0xFF180300, 0x00000001U, 0x00000000U);
psu_mask_write(0xFF410050, 0x00000001U, 0x00000000U);
return 1;
}
static unsigned long psu_ddr_init_data(void)
{
psu_mask_write(0xFD1A0108, 0x00000008U, 0x00000008U);
psu_mask_write(0xFD070000, 0xE30FBE3DU, 0x43041010U);
psu_mask_write(0xFD070010, 0x8000F03FU, 0x00000030U);
psu_mask_write(0xFD070020, 0x000003F3U, 0x00000200U);
psu_mask_write(0xFD070024, 0xFFFFFFFFU, 0x00800000U);
psu_mask_write(0xFD070030, 0x0000007FU, 0x00000008U);
psu_mask_write(0xFD070034, 0x00FFFF1FU, 0x00408410U);
psu_mask_write(0xFD070050, 0x00F1F1F4U, 0x00210000U);
psu_mask_write(0xFD070054, 0x0FFF0FFFU, 0x00000000U);
psu_mask_write(0xFD070060, 0x00000073U, 0x00000001U);
psu_mask_write(0xFD070064, 0x0FFF83FFU, 0x00818126U);
psu_mask_write(0xFD070070, 0x00000017U, 0x00000010U);
psu_mask_write(0xFD070074, 0x00000003U, 0x00000000U);
psu_mask_write(0xFD0700C4, 0x3F000391U, 0x10000200U);
psu_mask_write(0xFD0700C8, 0x01FF1F3FU, 0x0040051FU);
psu_mask_write(0xFD0700D0, 0xC3FF0FFFU, 0x00020106U);
psu_mask_write(0xFD0700D4, 0x01FF7F0FU, 0x00020000U);
psu_mask_write(0xFD0700D8, 0x0000FF0FU, 0x00002305U);
psu_mask_write(0xFD0700DC, 0xFFFFFFFFU, 0x07300501U);
psu_mask_write(0xFD0700E0, 0xFFFFFFFFU, 0x00200200U);
psu_mask_write(0xFD0700E4, 0x00FF03FFU, 0x00210004U);
psu_mask_write(0xFD0700E8, 0xFFFFFFFFU, 0x00000700U);
psu_mask_write(0xFD0700EC, 0xFFFF0000U, 0x08190000U);
psu_mask_write(0xFD0700F0, 0x0000003FU, 0x00000010U);
psu_mask_write(0xFD0700F4, 0x00000FFFU, 0x0000066FU);
psu_mask_write(0xFD070100, 0x7F3F7F3FU, 0x110C2412U);
psu_mask_write(0xFD070104, 0x001F1F7FU, 0x0004041CU);
psu_mask_write(0xFD070108, 0x3F3F3F3FU, 0x0708060DU);
psu_mask_write(0xFD07010C, 0x3FF3F3FFU, 0x0050400CU);
psu_mask_write(0xFD070110, 0x1F0F0F1FU, 0x08030309U);
psu_mask_write(0xFD070114, 0x0F0F3F1FU, 0x06060403U);
psu_mask_write(0xFD070118, 0x0F0F000FU, 0x01010004U);
psu_mask_write(0xFD07011C, 0x00000F0FU, 0x00000606U);
psu_mask_write(0xFD070120, 0x7F7F7F7FU, 0x04040D0BU);
psu_mask_write(0xFD070124, 0x40070F3FU, 0x0002020BU);
psu_mask_write(0xFD07012C, 0x7F1F031FU, 0x1607010EU);
psu_mask_write(0xFD070130, 0x00030F1FU, 0x00020608U);
psu_mask_write(0xFD070180, 0xF7FF03FFU, 0x81000040U);
psu_mask_write(0xFD070184, 0x3FFFFFFFU, 0x020196E5U);
psu_mask_write(0xFD070190, 0x1FBFBF3FU, 0x048B820BU);
psu_mask_write(0xFD070194, 0xF31F0F0FU, 0x00030304U);
psu_mask_write(0xFD070198, 0x0FF1F1F1U, 0x07000101U);
psu_mask_write(0xFD07019C, 0x000000F1U, 0x00000021U);
psu_mask_write(0xFD0701A0, 0xC3FF03FFU, 0x00400003U);
psu_mask_write(0xFD0701A4, 0x00FF00FFU, 0x00C800FFU);
psu_mask_write(0xFD0701B0, 0x00000007U, 0x00000000U);
psu_mask_write(0xFD0701B4, 0x00003F3FU, 0x00000909U);
psu_mask_write(0xFD0701C0, 0x00000007U, 0x00000001U);
psu_mask_write(0xFD070200, 0x0000001FU, 0x00000018U);
psu_mask_write(0xFD070204, 0x001F1F1FU, 0x001F0909U);
psu_mask_write(0xFD070208, 0x0F0F0F0FU, 0x01010101U);
psu_mask_write(0xFD07020C, 0x0F0F0F0FU, 0x0F010101U);
psu_mask_write(0xFD070210, 0x00000F0FU, 0x00000F0FU);
psu_mask_write(0xFD070214, 0x0F0F0F0FU, 0x070F0707U);
psu_mask_write(0xFD070218, 0x8F0F0F0FU, 0x07070707U);
psu_mask_write(0xFD07021C, 0x00000F0FU, 0x00000F07U);
psu_mask_write(0xFD070220, 0x00001F1FU, 0x00000700U);
psu_mask_write(0xFD070224, 0x0F0F0F0FU, 0x07070707U);
psu_mask_write(0xFD070228, 0x0F0F0F0FU, 0x07070707U);
psu_mask_write(0xFD07022C, 0x0000000FU, 0x00000007U);
psu_mask_write(0xFD070240, 0x0F1F0F7CU, 0x06000600U);
psu_mask_write(0xFD070244, 0x00003333U, 0x00000201U);
psu_mask_write(0xFD070250, 0x7FFF3F07U, 0x01002001U);
psu_mask_write(0xFD070264, 0xFF00FFFFU, 0x08000040U);
psu_mask_write(0xFD07026C, 0xFF00FFFFU, 0x08000040U);
psu_mask_write(0xFD070280, 0xFFFFFFFFU, 0x00000000U);
psu_mask_write(0xFD070284, 0xFFFFFFFFU, 0x00000000U);
psu_mask_write(0xFD070288, 0xFFFFFFFFU, 0x00000000U);
psu_mask_write(0xFD07028C, 0xFFFFFFFFU, 0x00000000U);
psu_mask_write(0xFD070290, 0x0000FFFFU, 0x00000000U);
psu_mask_write(0xFD070294, 0x00000001U, 0x00000001U);
psu_mask_write(0xFD070300, 0x00000011U, 0x00000001U);
psu_mask_write(0xFD07030C, 0x80000033U, 0x00000000U);
psu_mask_write(0xFD070320, 0x00000001U, 0x00000000U);
psu_mask_write(0xFD070400, 0x00000111U, 0x00000101U);
psu_mask_write(0xFD070404, 0x000073FFU, 0x0000200FU);
psu_mask_write(0xFD070408, 0x000073FFU, 0x0000200FU);
psu_mask_write(0xFD070490, 0x00000001U, 0x00000001U);
psu_mask_write(0xFD070494, 0x0033000FU, 0x0020000BU);
psu_mask_write(0xFD070498, 0x07FF07FFU, 0x00000000U);
psu_mask_write(0xFD0704B4, 0x000073FFU, 0x0000200FU);
psu_mask_write(0xFD0704B8, 0x000073FFU, 0x0000200FU);
psu_mask_write(0xFD070540, 0x00000001U, 0x00000001U);
psu_mask_write(0xFD070544, 0x03330F0FU, 0x02000B03U);
psu_mask_write(0xFD070548, 0x07FF07FFU, 0x00000000U);
psu_mask_write(0xFD070564, 0x000073FFU, 0x0000200FU);
psu_mask_write(0xFD070568, 0x000073FFU, 0x0000200FU);
psu_mask_write(0xFD0705F0, 0x00000001U, 0x00000001U);
psu_mask_write(0xFD0705F4, 0x03330F0FU, 0x02000B03U);
psu_mask_write(0xFD0705F8, 0x07FF07FFU, 0x00000000U);
psu_mask_write(0xFD070614, 0x000073FFU, 0x0000200FU);
psu_mask_write(0xFD070618, 0x000073FFU, 0x0000200FU);
psu_mask_write(0xFD0706A0, 0x00000001U, 0x00000001U);
psu_mask_write(0xFD0706A4, 0x0033000FU, 0x00100003U);
psu_mask_write(0xFD0706A8, 0x07FF07FFU, 0x0000004FU);
psu_mask_write(0xFD0706AC, 0x0033000FU, 0x00100003U);
psu_mask_write(0xFD0706B0, 0x000007FFU, 0x0000004FU);
psu_mask_write(0xFD0706C4, 0x000073FFU, 0x0000200FU);
psu_mask_write(0xFD0706C8, 0x000073FFU, 0x0000200FU);
psu_mask_write(0xFD070750, 0x00000001U, 0x00000001U);
psu_mask_write(0xFD070754, 0x0033000FU, 0x00100003U);
psu_mask_write(0xFD070758, 0x07FF07FFU, 0x0000004FU);
psu_mask_write(0xFD07075C, 0x0033000FU, 0x00100003U);
psu_mask_write(0xFD070760, 0x000007FFU, 0x0000004FU);
psu_mask_write(0xFD070774, 0x000073FFU, 0x0000200FU);
psu_mask_write(0xFD070778, 0x000073FFU, 0x0000200FU);
psu_mask_write(0xFD070800, 0x00000001U, 0x00000001U);
psu_mask_write(0xFD070804, 0x0033000FU, 0x00100003U);
psu_mask_write(0xFD070808, 0x07FF07FFU, 0x0000004FU);
psu_mask_write(0xFD07080C, 0x0033000FU, 0x00100003U);
psu_mask_write(0xFD070810, 0x000007FFU, 0x0000004FU);
psu_mask_write(0xFD070F04, 0x000001FFU, 0x00000000U);
psu_mask_write(0xFD070F08, 0x000000FFU, 0x00000000U);
psu_mask_write(0xFD070F0C, 0x000001FFU, 0x00000010U);
psu_mask_write(0xFD070F10, 0x000000FFU, 0x0000000FU);
psu_mask_write(0xFD072190, 0x1FBFBF3FU, 0x07828002U);
psu_mask_write(0xFD1A0108, 0x0000000CU, 0x00000000U);
psu_mask_write(0xFD080010, 0xFFFFFFFFU, 0x07001E00U);
psu_mask_write(0xFD080018, 0xFFFFFFFFU, 0x00F10010U);
psu_mask_write(0xFD08001C, 0xFFFFFFFFU, 0x55AA5480U);
psu_mask_write(0xFD080024, 0xFFFFFFFFU, 0x010100F4U);
psu_mask_write(0xFD080040, 0xFFFFFFFFU, 0x42C21590U);
psu_mask_write(0xFD080044, 0xFFFFFFFFU, 0xD05512C0U);
psu_mask_write(0xFD080068, 0xFFFFFFFFU, 0x01100000U);
psu_mask_write(0xFD080090, 0xFFFFFFFFU, 0x02A04161U);
psu_mask_write(0xFD0800C0, 0xFFFFFFFFU, 0x00000000U);
psu_mask_write(0xFD0800C4, 0xFFFFFFFFU, 0x000000E0U);
psu_mask_write(0xFD080100, 0xFFFFFFFFU, 0x0800040CU);
psu_mask_write(0xFD080110, 0xFFFFFFFFU, 0x06240F08U);
psu_mask_write(0xFD080114, 0xFFFFFFFFU, 0x28170008U);
psu_mask_write(0xFD080118, 0xFFFFFFFFU, 0x000F0300U);
psu_mask_write(0xFD08011C, 0xFFFFFFFFU, 0x83000800U);
psu_mask_write(0xFD080120, 0xFFFFFFFFU, 0x024B2B07U);
psu_mask_write(0xFD080124, 0xFFFFFFFFU, 0x00370F08U);
psu_mask_write(0xFD080128, 0xFFFFFFFFU, 0x00000E0FU);
psu_mask_write(0xFD080140, 0xFFFFFFFFU, 0x08400020U);
psu_mask_write(0xFD080144, 0xFFFFFFFFU, 0x00000C80U);
psu_mask_write(0xFD080150, 0xFFFFFFFFU, 0x00000000U);
psu_mask_write(0xFD080154, 0xFFFFFFFFU, 0x00000200U);
psu_mask_write(0xFD080180, 0xFFFFFFFFU, 0x00000630U);
psu_mask_write(0xFD080184, 0xFFFFFFFFU, 0x00000501U);
psu_mask_write(0xFD080188, 0xFFFFFFFFU, 0x00000020U);
psu_mask_write(0xFD08018C, 0xFFFFFFFFU, 0x00000200U);
psu_mask_write(0xFD080190, 0xFFFFFFFFU, 0x00000000U);
psu_mask_write(0xFD080194, 0xFFFFFFFFU, 0x00000700U);
psu_mask_write(0xFD080198, 0xFFFFFFFFU, 0x00000819U);
psu_mask_write(0xFD0801AC, 0xFFFFFFFFU, 0x00000000U);
psu_mask_write(0xFD0801B0, 0xFFFFFFFFU, 0x0000004DU);
psu_mask_write(0xFD0801B4, 0xFFFFFFFFU, 0x00000008U);
psu_mask_write(0xFD0801B8, 0xFFFFFFFFU, 0x0000004DU);
psu_mask_write(0xFD0801D8, 0xFFFFFFFFU, 0x00000000U);
psu_mask_write(0xFD080200, 0xFFFFFFFFU, 0x810091C7U);
psu_mask_write(0xFD080204, 0xFFFFFFFFU, 0x00030236U);
psu_mask_write(0xFD080240, 0xFFFFFFFFU, 0x00141054U);
psu_mask_write(0xFD080250, 0xFFFFFFFFU, 0x00088000U);
psu_mask_write(0xFD080414, 0xFFFFFFFFU, 0x12344000U);
psu_mask_write(0xFD0804F4, 0xFFFFFFFFU, 0x00000005U);
psu_mask_write(0xFD080500, 0xFFFFFFFFU, 0x30000028U);
psu_mask_write(0xFD080508, 0xFFFFFFFFU, 0x00000000U);
psu_mask_write(0xFD08050C, 0xFFFFFFFFU, 0x00000005U);
psu_mask_write(0xFD080510, 0xFFFFFFFFU, 0x00000000U);
psu_mask_write(0xFD080520, 0xFFFFFFFFU, 0x0300B0CEU);
psu_mask_write(0xFD080528, 0xFFFFFFFFU, 0xF9032019U);
psu_mask_write(0xFD08052C, 0xFFFFFFFFU, 0x07F001E3U);
psu_mask_write(0xFD080544, 0xFFFFFFFFU, 0x00000000U);
psu_mask_write(0xFD080548, 0xFFFFFFFFU, 0x00000000U);
psu_mask_write(0xFD080558, 0xFFFFFFFFU, 0x00000000U);
psu_mask_write(0xFD08055C, 0xFFFFFFFFU, 0x00000000U);
psu_mask_write(0xFD080560, 0xFFFFFFFFU, 0x00000000U);
psu_mask_write(0xFD080564, 0xFFFFFFFFU, 0x00000000U);
psu_mask_write(0xFD080680, 0xFFFFFFFFU, 0x008AAA58U);
psu_mask_write(0xFD080684, 0xFFFFFFFFU, 0x000079DDU);
psu_mask_write(0xFD080694, 0xFFFFFFFFU, 0x01E10210U);
psu_mask_write(0xFD080698, 0xFFFFFFFFU, 0x01E10000U);
psu_mask_write(0xFD0806A4, 0xFFFFFFFFU, 0x000879DBU);
psu_mask_write(0xFD080700, 0xFFFFFFFFU, 0x40800604U);
psu_mask_write(0xFD080704, 0xFFFFFFFFU, 0x00007FFFU);
psu_mask_write(0xFD08070C, 0xFFFFFFFFU, 0x3F000008U);
psu_mask_write(0xFD080710, 0xFFFFFFFFU, 0x0E00B03CU);
psu_mask_write(0xFD080714, 0xFFFFFFFFU, 0x09094F4FU);
psu_mask_write(0xFD080718, 0xFFFFFFFFU, 0x09092B2BU);
psu_mask_write(0xFD080800, 0xFFFFFFFFU, 0x40800604U);
psu_mask_write(0xFD080804, 0xFFFFFFFFU, 0x00007FFFU);
psu_mask_write(0xFD08080C, 0xFFFFFFFFU, 0x3F000008U);
psu_mask_write(0xFD080810, 0xFFFFFFFFU, 0x0E00B03CU);
psu_mask_write(0xFD080814, 0xFFFFFFFFU, 0x09094F4FU);
psu_mask_write(0xFD080818, 0xFFFFFFFFU, 0x09092B2BU);
psu_mask_write(0xFD080900, 0xFFFFFFFFU, 0x40800604U);
psu_mask_write(0xFD080904, 0xFFFFFFFFU, 0x00007FFFU);
psu_mask_write(0xFD08090C, 0xFFFFFFFFU, 0x3F000008U);
psu_mask_write(0xFD080910, 0xFFFFFFFFU, 0x0E00B00CU);
psu_mask_write(0xFD080914, 0xFFFFFFFFU, 0x09094F4FU);
psu_mask_write(0xFD080918, 0xFFFFFFFFU, 0x09092B2BU);
psu_mask_write(0xFD080A00, 0xFFFFFFFFU, 0x40800604U);
psu_mask_write(0xFD080A04, 0xFFFFFFFFU, 0x00007FFFU);
psu_mask_write(0xFD080A0C, 0xFFFFFFFFU, 0x3F000008U);
psu_mask_write(0xFD080A10, 0xFFFFFFFFU, 0x0E00B00CU);
psu_mask_write(0xFD080A14, 0xFFFFFFFFU, 0x09094F4FU);
psu_mask_write(0xFD080A18, 0xFFFFFFFFU, 0x09092B2BU);
psu_mask_write(0xFD080B00, 0xFFFFFFFFU, 0x80803660U);
psu_mask_write(0xFD080B04, 0xFFFFFFFFU, 0x55556000U);
psu_mask_write(0xFD080B08, 0xFFFFFFFFU, 0xAAAAAAAAU);
psu_mask_write(0xFD080B0C, 0xFFFFFFFFU, 0x0029A4A4U);
psu_mask_write(0xFD080B10, 0xFFFFFFFFU, 0x0C00B000U);
psu_mask_write(0xFD080B14, 0xFFFFFFFFU, 0x09094F4FU);
psu_mask_write(0xFD080B18, 0xFFFFFFFFU, 0x09092B2BU);
psu_mask_write(0xFD080C00, 0xFFFFFFFFU, 0x80803660U);
psu_mask_write(0xFD080C04, 0xFFFFFFFFU, 0x55556000U);
psu_mask_write(0xFD080C08, 0xFFFFFFFFU, 0xAAAAAAAAU);
psu_mask_write(0xFD080C0C, 0xFFFFFFFFU, 0x0029A4A4U);
psu_mask_write(0xFD080C10, 0xFFFFFFFFU, 0x0C00B000U);
psu_mask_write(0xFD080C14, 0xFFFFFFFFU, 0x09094F4FU);
psu_mask_write(0xFD080C18, 0xFFFFFFFFU, 0x09092B2BU);
psu_mask_write(0xFD080D00, 0xFFFFFFFFU, 0x80803660U);
psu_mask_write(0xFD080D04, 0xFFFFFFFFU, 0x55556000U);
psu_mask_write(0xFD080D08, 0xFFFFFFFFU, 0xAAAAAAAAU);
psu_mask_write(0xFD080D0C, 0xFFFFFFFFU, 0x0029A4A4U);
psu_mask_write(0xFD080D10, 0xFFFFFFFFU, 0x0C00B000U);
psu_mask_write(0xFD080D14, 0xFFFFFFFFU, 0x09094F4FU);
psu_mask_write(0xFD080D18, 0xFFFFFFFFU, 0x09092B2BU);
psu_mask_write(0xFD080E00, 0xFFFFFFFFU, 0x80803660U);
psu_mask_write(0xFD080E04, 0xFFFFFFFFU, 0x55556000U);
psu_mask_write(0xFD080E08, 0xFFFFFFFFU, 0xAAAAAAAAU);
psu_mask_write(0xFD080E0C, 0xFFFFFFFFU, 0x0029A4A4U);
psu_mask_write(0xFD080E10, 0xFFFFFFFFU, 0x0C00B000U);
psu_mask_write(0xFD080E14, 0xFFFFFFFFU, 0x09094F4FU);
psu_mask_write(0xFD080E18, 0xFFFFFFFFU, 0x09092B2BU);
psu_mask_write(0xFD080F00, 0xFFFFFFFFU, 0x80803660U);
psu_mask_write(0xFD080F04, 0xFFFFFFFFU, 0x55556000U);
psu_mask_write(0xFD080F08, 0xFFFFFFFFU, 0xAAAAAAAAU);
psu_mask_write(0xFD080F0C, 0xFFFFFFFFU, 0x0029A4A4U);
psu_mask_write(0xFD080F10, 0xFFFFFFFFU, 0x0C00B000U);
psu_mask_write(0xFD080F14, 0xFFFFFFFFU, 0x09094F4FU);
psu_mask_write(0xFD080F18, 0xFFFFFFFFU, 0x09092B2BU);
psu_mask_write(0xFD081400, 0xFFFFFFFFU, 0x2A019FFEU);
psu_mask_write(0xFD081404, 0xFFFFFFFFU, 0x01100000U);
psu_mask_write(0xFD08141C, 0xFFFFFFFFU, 0x01264300U);
psu_mask_write(0xFD08142C, 0xFFFFFFFFU, 0x00041800U);
psu_mask_write(0xFD081430, 0xFFFFFFFFU, 0x70800000U);
psu_mask_write(0xFD081440, 0xFFFFFFFFU, 0x2A019FFEU);
psu_mask_write(0xFD081444, 0xFFFFFFFFU, 0x01100000U);
psu_mask_write(0xFD08145C, 0xFFFFFFFFU, 0x01264300U);
psu_mask_write(0xFD08146C, 0xFFFFFFFFU, 0x00041800U);
psu_mask_write(0xFD081470, 0xFFFFFFFFU, 0x70800000U);
psu_mask_write(0xFD081480, 0xFFFFFFFFU, 0x15019FFEU);
psu_mask_write(0xFD081484, 0xFFFFFFFFU, 0x21100000U);
psu_mask_write(0xFD08149C, 0xFFFFFFFFU, 0x01266300U);
psu_mask_write(0xFD0814AC, 0xFFFFFFFFU, 0x00041800U);
psu_mask_write(0xFD0814B0, 0xFFFFFFFFU, 0x70400000U);
psu_mask_write(0xFD0814C0, 0xFFFFFFFFU, 0x15019FFEU);
psu_mask_write(0xFD0814C4, 0xFFFFFFFFU, 0x21100000U);
psu_mask_write(0xFD0814DC, 0xFFFFFFFFU, 0x01266300U);
psu_mask_write(0xFD0814EC, 0xFFFFFFFFU, 0x00041800U);
psu_mask_write(0xFD0814F0, 0xFFFFFFFFU, 0x70400000U);
psu_mask_write(0xFD081500, 0xFFFFFFFFU, 0x15019FFEU);
psu_mask_write(0xFD081504, 0xFFFFFFFFU, 0x21100000U);
psu_mask_write(0xFD08151C, 0xFFFFFFFFU, 0x01266300U);
psu_mask_write(0xFD08152C, 0xFFFFFFFFU, 0x00041800U);
psu_mask_write(0xFD081530, 0xFFFFFFFFU, 0x70400000U);
psu_mask_write(0xFD0817DC, 0xFFFFFFFFU, 0x012643C4U);
return 1;
}
static unsigned long psu_ddr_qos_init_data(void)
{
psu_mask_write(0xFD360008, 0x0000000FU, 0x00000000U);
psu_mask_write(0xFD36001C, 0x0000000FU, 0x00000000U);
psu_mask_write(0xFD370008, 0x0000000FU, 0x00000000U);
psu_mask_write(0xFD37001C, 0x0000000FU, 0x00000000U);
psu_mask_write(0xFD380008, 0x0000000FU, 0x00000000U);
psu_mask_write(0xFD38001C, 0x0000000FU, 0x00000000U);
psu_mask_write(0xFD390008, 0x0000000FU, 0x00000000U);
psu_mask_write(0xFD39001C, 0x0000000FU, 0x00000000U);
psu_mask_write(0xFD3A0008, 0x0000000FU, 0x00000000U);
psu_mask_write(0xFD3A001C, 0x0000000FU, 0x00000000U);
psu_mask_write(0xFD3B0008, 0x0000000FU, 0x00000000U);
psu_mask_write(0xFD3B001C, 0x0000000FU, 0x00000000U);
psu_mask_write(0xFF9B0008, 0x0000000FU, 0x00000000U);
psu_mask_write(0xFF9B001C, 0x0000000FU, 0x00000000U);
return 1;
}
static unsigned long psu_mio_init_data(void)
{
psu_mask_write(0xFF180034, 0x000000FEU, 0x00000008U);
psu_mask_write(0xFF180038, 0x000000FEU, 0x00000008U);
psu_mask_write(0xFF18003C, 0x000000FEU, 0x00000008U);
psu_mask_write(0xFF180040, 0x000000FEU, 0x00000008U);
psu_mask_write(0xFF180044, 0x000000FEU, 0x00000008U);
psu_mask_write(0xFF180048, 0x000000FEU, 0x00000008U);
psu_mask_write(0xFF18004C, 0x000000FEU, 0x00000008U);
psu_mask_write(0xFF180050, 0x000000FEU, 0x00000008U);
psu_mask_write(0xFF180054, 0x000000FEU, 0x00000008U);
psu_mask_write(0xFF180058, 0x000000FEU, 0x00000008U);
psu_mask_write(0xFF18005C, 0x000000FEU, 0x00000008U);
psu_mask_write(0xFF180068, 0x000000FEU, 0x00000080U);
psu_mask_write(0xFF18006C, 0x000000FEU, 0x00000000U);
psu_mask_write(0xFF180070, 0x000000FEU, 0x00000000U);
psu_mask_write(0xFF180074, 0x000000FEU, 0x00000080U);
psu_mask_write(0xFF180078, 0x000000FEU, 0x00000080U);
psu_mask_write(0xFF18007C, 0x000000FEU, 0x00000080U);
psu_mask_write(0xFF180080, 0x000000FEU, 0x00000000U);
psu_mask_write(0xFF180084, 0x000000FEU, 0x00000000U);
psu_mask_write(0xFF180088, 0x000000FEU, 0x00000040U);
psu_mask_write(0xFF18008C, 0x000000FEU, 0x00000040U);
psu_mask_write(0xFF180090, 0x000000FEU, 0x00000000U);
psu_mask_write(0xFF180094, 0x000000FEU, 0x00000000U);
psu_mask_write(0xFF180098, 0x000000FEU, 0x000000C0U);
psu_mask_write(0xFF18009C, 0x000000FEU, 0x000000C0U);
psu_mask_write(0xFF1800A0, 0x000000FEU, 0x00000000U);
psu_mask_write(0xFF1800A4, 0x000000FEU, 0x00000000U);
psu_mask_write(0xFF1800A8, 0x000000FEU, 0x00000000U);
psu_mask_write(0xFF1800AC, 0x000000FEU, 0x00000000U);
psu_mask_write(0xFF1800B0, 0x000000FEU, 0x00000000U);
psu_mask_write(0xFF1800B4, 0x000000FEU, 0x00000010U);
psu_mask_write(0xFF1800B8, 0x000000FEU, 0x00000010U);
psu_mask_write(0xFF1800BC, 0x000000FEU, 0x00000010U);
psu_mask_write(0xFF1800C0, 0x000000FEU, 0x00000010U);
psu_mask_write(0xFF1800C4, 0x000000FEU, 0x00000010U);
psu_mask_write(0xFF1800C8, 0x000000FEU, 0x00000010U);
psu_mask_write(0xFF1800CC, 0x000000FEU, 0x00000010U);
psu_mask_write(0xFF1800D0, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF1800D4, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF1800D8, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF1800DC, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF1800E0, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF1800E4, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF1800E8, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF1800EC, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF1800F0, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF1800F4, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF1800F8, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF1800FC, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF180100, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF180104, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF180108, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF18010C, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF180110, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF180114, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF180118, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF18011C, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF180120, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF180124, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF180128, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF18012C, 0x000000FEU, 0x00000004U);
psu_mask_write(0xFF180130, 0x000000FEU, 0x00000060U);
psu_mask_write(0xFF180134, 0x000000FEU, 0x00000060U);
psu_mask_write(0xFF180204, 0xFCFFE000U, 0x00000000U);
psu_mask_write(0xFF180208, 0xFFFFFFFFU, 0x00B02040U);
psu_mask_write(0xFF18020C, 0x00003FFFU, 0x0000000BU);
psu_mask_write(0xFF180138, 0x03FFFFFFU, 0x03FFFFFFU);
psu_mask_write(0xFF18013C, 0x03FFFFFFU, 0x03FFFFFFU);
psu_mask_write(0xFF180140, 0x03FFFFFFU, 0x033FFFFFU);
psu_mask_write(0xFF180144, 0x03FFFFFFU, 0x03FFFFFFU);
psu_mask_write(0xFF180148, 0x03FFFFFFU, 0x03FFFFFFU);
psu_mask_write(0xFF18014C, 0x03FFFFFFU, 0x03FFFFFFU);
psu_mask_write(0xFF180154, 0x03FFFFFFU, 0x03FFFFFFU);
psu_mask_write(0xFF180158, 0x03FFFFFFU, 0x03FFFFFFU);
psu_mask_write(0xFF18015C, 0x03FFFFFFU, 0x01FF9FFFU);
psu_mask_write(0xFF180160, 0x03FFFFFFU, 0x03FFFFFFU);
psu_mask_write(0xFF180164, 0x03FFFFFFU, 0x03FFFFFFU);
psu_mask_write(0xFF180168, 0x03FFFFFFU, 0x03F76FFFU);
psu_mask_write(0xFF180170, 0x03FFFFFFU, 0x03FFFFFFU);
psu_mask_write(0xFF180174, 0x03FFFFFFU, 0x03FFFFFFU);
psu_mask_write(0xFF180178, 0x03FFFFFFU, 0x02FBFFBFU);
psu_mask_write(0xFF18017C, 0x03FFFFFFU, 0x03FFFFFFU);
psu_mask_write(0xFF180180, 0x03FFFFFFU, 0x03FFFFFFU);
psu_mask_write(0xFF180184, 0x03FFFFFFU, 0x03FF4FF4U);
psu_mask_write(0xFF180200, 0x0000000FU, 0x00000000U);
return 1;
}
static unsigned long psu_peripherals_pre_init_data(void)
{
psu_mask_write(0xFF5E0108, 0x013F3F07U, 0x01012302U);
return 1;
}
static unsigned long psu_peripherals_init_data(void)
{
psu_mask_write(0xFD1A0100, 0x0000807CU, 0x00000000U);
psu_mask_write(0xFF5E0238, 0x001A0000U, 0x00000000U);
psu_mask_write(0xFF5E023C, 0x0093C018U, 0x00000000U);
psu_mask_write(0xFF5E0230, 0x00000001U, 0x00000000U);
psu_mask_write(0xFF5E023C, 0x00000C00U, 0x00000000U);
psu_mask_write(0xFF5E0238, 0x00000060U, 0x00000000U);
psu_mask_write(0xFF180310, 0x00008001U, 0x00000001U);
psu_mask_write(0xFF180320, 0x33843384U, 0x00801284U);
psu_mask_write(0xFF18031C, 0x00007FFEU, 0x00006450U);
psu_mask_write(0xFF180358, 0x00080000U, 0x00080000U);
psu_mask_write(0xFF18031C, 0x7FFE0000U, 0x64500000U);
psu_mask_write(0xFF180358, 0x00000008U, 0x00000008U);
psu_mask_write(0xFF180324, 0x000003C0U, 0x00000000U);
psu_mask_write(0xFF180324, 0x03C00000U, 0x00000000U);
psu_mask_write(0xFF5E0238, 0x00000200U, 0x00000000U);
psu_mask_write(0xFF5E0238, 0x00008000U, 0x00000000U);
psu_mask_write(0xFF5E0238, 0x00000008U, 0x00000000U);
psu_mask_write(0xFF5E0238, 0x00007800U, 0x00000000U);
psu_mask_write(0xFF5E0238, 0x00000002U, 0x00000000U);
psu_mask_write(0xFF000034, 0x000000FFU, 0x00000005U);
psu_mask_write(0xFF000018, 0x0000FFFFU, 0x0000008FU);
psu_mask_write(0xFF000000, 0x000001FFU, 0x00000017U);
psu_mask_write(0xFF000004, 0x000003FFU, 0x00000020U);
psu_mask_write(0xFF5E0238, 0x00040000U, 0x00000000U);
psu_mask_write(0xFF4B0024, 0x000000FFU, 0x000000FFU);
psu_mask_write(0xFFCA5000, 0x00001FFFU, 0x00000000U);
psu_mask_write(0xFD5C0060, 0x000F000FU, 0x00000000U);
psu_mask_write(0xFFA60040, 0x80000000U, 0x80000000U);
psu_mask_write(0xFF260020, 0xFFFFFFFFU, 0x01FC9F08U);
psu_mask_write(0xFF260000, 0x00000001U, 0x00000001U);
psu_mask_write(0xFF5E0250, 0x00000F0FU, 0x00000202U);
mask_delay(1);
psu_mask_write(0xFF5E0250, 0x00000F0FU, 0x00000002U);
mask_delay(5);
psu_mask_write(0xFF5E0250, 0x00000F0FU, 0x00000202U);
return 1;
}
static unsigned long psu_serdes_init_data(void)
{
psu_mask_write(0xFD410000, 0x0000001FU, 0x0000000FU);
psu_mask_write(0xFD410004, 0x0000001FU, 0x00000008U);
psu_mask_write(0xFD402860, 0x00000080U, 0x00000080U);
psu_mask_write(0xFD402864, 0x00000080U, 0x00000080U);
psu_mask_write(0xFD406094, 0x00000010U, 0x00000010U);
psu_mask_write(0xFD406368, 0x000000FFU, 0x00000038U);
psu_mask_write(0xFD40636C, 0x00000007U, 0x00000003U);
psu_mask_write(0xFD406370, 0x000000FFU, 0x000000F4U);
psu_mask_write(0xFD406374, 0x000000FFU, 0x00000031U);
psu_mask_write(0xFD406378, 0x000000FFU, 0x00000002U);
psu_mask_write(0xFD40637C, 0x00000033U, 0x00000030U);
psu_mask_write(0xFD40106C, 0x0000000FU, 0x0000000FU);
psu_mask_write(0xFD4000F4, 0x0000000BU, 0x0000000BU);
psu_mask_write(0xFD40506C, 0x00000003U, 0x00000003U);
psu_mask_write(0xFD4040F4, 0x00000003U, 0x00000003U);
psu_mask_write(0xFD4050CC, 0x00000020U, 0x00000020U);
psu_mask_write(0xFD401074, 0x00000010U, 0x00000010U);
psu_mask_write(0xFD405074, 0x00000010U, 0x00000010U);
psu_mask_write(0xFD409074, 0x00000010U, 0x00000010U);
psu_mask_write(0xFD40D074, 0x00000010U, 0x00000010U);
psu_mask_write(0xFD40189C, 0x00000080U, 0x00000080U);
psu_mask_write(0xFD4018F8, 0x000000FFU, 0x0000007DU);
psu_mask_write(0xFD4018FC, 0x000000FFU, 0x0000007DU);
psu_mask_write(0xFD401990, 0x000000FFU, 0x00000000U);
psu_mask_write(0xFD401924, 0x000000FFU, 0x00000082U);
psu_mask_write(0xFD401928, 0x000000FFU, 0x00000000U);
psu_mask_write(0xFD401900, 0x000000FFU, 0x00000064U);
psu_mask_write(0xFD40192C, 0x000000FFU, 0x00000000U);
psu_mask_write(0xFD401980, 0x000000FFU, 0x000000FFU);
psu_mask_write(0xFD401914, 0x000000FFU, 0x000000FFU);
psu_mask_write(0xFD401918, 0x00000001U, 0x00000001U);
psu_mask_write(0xFD401940, 0x000000FFU, 0x000000FFU);
psu_mask_write(0xFD401944, 0x00000001U, 0x00000001U);
psu_mask_write(0xFD401994, 0x00000007U, 0x00000007U);
psu_mask_write(0xFD40589C, 0x00000080U, 0x00000080U);
psu_mask_write(0xFD4058F8, 0x000000FFU, 0x0000001AU);
psu_mask_write(0xFD4058FC, 0x000000FFU, 0x0000001AU);
psu_mask_write(0xFD405990, 0x000000FFU, 0x00000010U);
psu_mask_write(0xFD405924, 0x000000FFU, 0x000000FEU);
psu_mask_write(0xFD405928, 0x000000FFU, 0x00000000U);
psu_mask_write(0xFD405900, 0x000000FFU, 0x0000001AU);
psu_mask_write(0xFD40592C, 0x000000FFU, 0x00000000U);
psu_mask_write(0xFD405980, 0x000000FFU, 0x000000FFU);
psu_mask_write(0xFD405914, 0x000000FFU, 0x000000F7U);
psu_mask_write(0xFD405918, 0x00000001U, 0x00000001U);
psu_mask_write(0xFD405940, 0x000000FFU, 0x000000F7U);
psu_mask_write(0xFD405944, 0x00000001U, 0x00000001U);
psu_mask_write(0xFD405994, 0x00000007U, 0x00000007U);
psu_mask_write(0xFD409994, 0x00000007U, 0x00000007U);
psu_mask_write(0xFD40D994, 0x00000007U, 0x00000007U);
psu_mask_write(0xFD40107C, 0x0000000FU, 0x00000001U);
psu_mask_write(0xFD40507C, 0x0000000FU, 0x00000001U);
psu_mask_write(0xFD40907C, 0x0000000FU, 0x00000001U);
psu_mask_write(0xFD40D07C, 0x0000000FU, 0x00000001U);
psu_mask_write(0xFD4019A4, 0x000000FFU, 0x000000FFU);
psu_mask_write(0xFD401038, 0x00000040U, 0x00000040U);
psu_mask_write(0xFD40102C, 0x00000040U, 0x00000040U);
psu_mask_write(0xFD4059A4, 0x000000FFU, 0x000000FFU);
psu_mask_write(0xFD405038, 0x00000040U, 0x00000040U);
psu_mask_write(0xFD40502C, 0x00000040U, 0x00000040U);
psu_mask_write(0xFD4099A4, 0x000000FFU, 0x000000FFU);
psu_mask_write(0xFD409038, 0x00000040U, 0x00000040U);
psu_mask_write(0xFD40902C, 0x00000040U, 0x00000040U);
psu_mask_write(0xFD40D9A4, 0x000000FFU, 0x000000FFU);
psu_mask_write(0xFD40D038, 0x00000040U, 0x00000040U);
psu_mask_write(0xFD40D02C, 0x00000040U, 0x00000040U);
psu_mask_write(0xFD4019AC, 0x00000003U, 0x00000000U);
psu_mask_write(0xFD4059AC, 0x00000003U, 0x00000000U);
psu_mask_write(0xFD4099AC, 0x00000003U, 0x00000000U);
psu_mask_write(0xFD40D9AC, 0x00000003U, 0x00000000U);
psu_mask_write(0xFD401978, 0x00000010U, 0x00000010U);
psu_mask_write(0xFD405978, 0x00000010U, 0x00000010U);
psu_mask_write(0xFD409978, 0x00000010U, 0x00000010U);
psu_mask_write(0xFD40D978, 0x00000010U, 0x00000010U);
psu_mask_write(0xFD410010, 0x00000077U, 0x00000035U);
psu_mask_write(0xFD410040, 0x00000003U, 0x00000000U);
psu_mask_write(0xFD410044, 0x00000003U, 0x00000000U);
return 1;
}
static unsigned long psu_resetout_init_data(void)
{
psu_mask_write(0xFF5E023C, 0x00000400U, 0x00000000U);
psu_mask_write(0xFF9D0080, 0x00000001U, 0x00000001U);
psu_mask_write(0xFF9D007C, 0x00000001U, 0x00000000U);
psu_mask_write(0xFF5E023C, 0x00000140U, 0x00000000U);
psu_mask_write(0xFF5E023C, 0x00000800U, 0x00000000U);
psu_mask_write(0xFF9E0080, 0x00000001U, 0x00000001U);
psu_mask_write(0xFF9E007C, 0x00000001U, 0x00000001U);
psu_mask_write(0xFF5E023C, 0x00000280U, 0x00000000U);
psu_mask_write(0xFF5E0230, 0x00000001U, 0x00000000U);
psu_mask_write(0xFE20C200, 0x00023FFFU, 0x00022457U);
psu_mask_write(0xFE20C630, 0x003FFF00U, 0x00000000U);
psu_mask_write(0xFE20C11C, 0x00000600U, 0x00000600U);
psu_mask_write(0xFE20C12C, 0x00004000U, 0x00004000U);
psu_mask_write(0xFE30C200, 0x00023FFFU, 0x00022457U);
psu_mask_write(0xFE30C630, 0x003FFF00U, 0x00000000U);
psu_mask_write(0xFE30C12C, 0x00004000U, 0x00004000U);
psu_mask_write(0xFE30C11C, 0x00000400U, 0x00000400U);
psu_mask_write(0xFD480064, 0x00000200U, 0x00000200U);
mask_poll(0xFD4023E4, 0x00000010U);
mask_poll(0xFD4063E4, 0x00000010U);
return 1;
}
static unsigned long psu_resetin_init_data(void)
{
psu_mask_write(0xFF5E023C, 0x00000540U, 0x00000540U);
psu_mask_write(0xFF5E023C, 0x00000A80U, 0x00000A80U);
psu_mask_write(0xFF5E0230, 0x00000001U, 0x00000001U);
return 1;
}
static unsigned long psu_afi_config(void)
{
psu_mask_write(0xFD1A0100, 0x00001F80U, 0x00000000U);
psu_mask_write(0xFF5E023C, 0x00080000U, 0x00000000U);
psu_mask_write(0xFD615000, 0x00000F00U, 0x00000A00U);
psu_mask_write(0xFF419000, 0x00000300U, 0x00000000U);
psu_mask_write(0xFD360000, 0x00000003U, 0x00000000U);
psu_mask_write(0xFD360014, 0x00000003U, 0x00000000U);
return 1;
}
static unsigned long psu_ddr_phybringup_data(void)
{
unsigned int regval = 0;
unsigned int pll_retry = 10;
unsigned int pll_locked = 0;
int cur_r006_trefprd;
while ((pll_retry > 0) && (!pll_locked)) {
Xil_Out32(0xFD080004, 0x00040010);
Xil_Out32(0xFD080004, 0x00040011);
while ((Xil_In32(0xFD080030) & 0x1) != 1)
;
pll_locked = (Xil_In32(0xFD080030) & 0x80000000)
>> 31;
pll_locked &= (Xil_In32(0xFD0807E0) & 0x10000)
>> 16;
pll_locked &= (Xil_In32(0xFD0809E0) & 0x10000)
>> 16;
pll_retry--;
}
Xil_Out32(0xFD0800C4, Xil_In32(0xFD0800C4) | (pll_retry << 16));
if (!pll_locked)
return 0;
Xil_Out32(0xFD080004U, 0x00040063U);
while ((Xil_In32(0xFD080030U) & 0x0000000FU) != 0x0000000FU)
;
prog_reg(0xFD080004U, 0x00000001U, 0x00000000U, 0x00000001U);
while ((Xil_In32(0xFD080030U) & 0x000000FFU) != 0x0000001FU)
;
Xil_Out32(0xFD0701B0U, 0x00000001U);
Xil_Out32(0xFD070320U, 0x00000001U);
while ((Xil_In32(0xFD070004U) & 0x0000000FU) != 0x00000001U)
;
prog_reg(0xFD080014U, 0x00000040U, 0x00000006U, 0x00000001U);
Xil_Out32(0xFD080004, 0x0004FE01);
regval = Xil_In32(0xFD080030);
while (regval != 0x80000FFF)
regval = Xil_In32(0xFD080030);
regval = ((Xil_In32(0xFD080030) & 0x1FFF0000) >> 18);
if (regval != 0)
return 0;
Xil_Out32(0xFD080200U, 0x110091C7U);
cur_r006_trefprd = (Xil_In32(0xFD080018U) & 0x0003FFFFU) >> 0x00000000U;
prog_reg(0xFD080018, 0x3FFFF, 0x0, cur_r006_trefprd);
prog_reg(0xFD08001CU, 0x00000018U, 0x00000003U, 0x00000003U);
prog_reg(0xFD08142CU, 0x00000030U, 0x00000004U, 0x00000003U);
prog_reg(0xFD08146CU, 0x00000030U, 0x00000004U, 0x00000003U);
prog_reg(0xFD0814ACU, 0x00000030U, 0x00000004U, 0x00000003U);
prog_reg(0xFD0814ECU, 0x00000030U, 0x00000004U, 0x00000003U);
prog_reg(0xFD08152CU, 0x00000030U, 0x00000004U, 0x00000003U);
Xil_Out32(0xFD080004, 0x00060001);
regval = Xil_In32(0xFD080030);
while ((regval & 0x80004001) != 0x80004001)
regval = Xil_In32(0xFD080030);
prog_reg(0xFD08001CU, 0x00000018U, 0x00000003U, 0x00000000U);
prog_reg(0xFD08142CU, 0x00000030U, 0x00000004U, 0x00000000U);
prog_reg(0xFD08146CU, 0x00000030U, 0x00000004U, 0x00000000U);
prog_reg(0xFD0814ACU, 0x00000030U, 0x00000004U, 0x00000000U);
prog_reg(0xFD0814ECU, 0x00000030U, 0x00000004U, 0x00000000U);
prog_reg(0xFD08152CU, 0x00000030U, 0x00000004U, 0x00000000U);
Xil_Out32(0xFD080200U, 0x810091C7U);
prog_reg(0xFD080018, 0x3FFFF, 0x0, cur_r006_trefprd);
Xil_Out32(0xFD080004, 0x0000C001);
regval = Xil_In32(0xFD080030);
while ((regval & 0x80000C01) != 0x80000C01)
regval = Xil_In32(0xFD080030);
Xil_Out32(0xFD070180U, 0x01000040U);
Xil_Out32(0xFD070060U, 0x00000000U);
prog_reg(0xFD080014U, 0x00000040U, 0x00000006U, 0x00000000U);
return 1;
}
static int serdes_enb_coarse_saturation(void)
{
Xil_Out32(0xFD402094, 0x00000010);
Xil_Out32(0xFD406094, 0x00000010);
Xil_Out32(0xFD40A094, 0x00000010);
Xil_Out32(0xFD40E094, 0x00000010);
return 1;
}
static int serdes_fixcal_code(void)
{
int maskstatus = 1;
unsigned int rdata = 0;
unsigned int match_pmos_code[23];
unsigned int match_nmos_code[23];
unsigned int match_ical_code[7];
unsigned int match_rcal_code[7];
unsigned int p_code = 0, n_code = 0, i_code = 0, r_code = 0;
unsigned int repeat_count = 0;
unsigned int L3_TM_CALIB_DIG20 = 0;
unsigned int L3_TM_CALIB_DIG19 = 0;
unsigned int L3_TM_CALIB_DIG18 = 0;
unsigned int L3_TM_CALIB_DIG16 = 0;
unsigned int L3_TM_CALIB_DIG15 = 0;
unsigned int L3_TM_CALIB_DIG14 = 0;
int count = 0, i = 0;
rdata = Xil_In32(0xFD40289C);
rdata = rdata & ~0x03;
rdata = rdata | 0x1;
Xil_Out32(0xFD40289C, rdata);
do {
if (count == 1100000)
break;
rdata = Xil_In32(0xFD402B1C);
count++;
} while ((rdata & 0x0000000E) != 0x0000000E);
for (i = 0; i < 23; i++) {
match_pmos_code[i] = 0;
match_nmos_code[i] = 0;
}
for (i = 0; i < 7; i++) {
match_ical_code[i] = 0;
match_rcal_code[i] = 0;
}
do {
Xil_Out32(0xFD410010, 0x00000000);
Xil_Out32(0xFD410014, 0x00000000);
Xil_Out32(0xFD410010, 0x00000001);
Xil_Out32(0xFD410014, 0x00000000);
maskstatus = mask_poll(0xFD40EF14, 0x2);
if (maskstatus == 0) {
xil_printf("#SERDES initialization timed out\n\r");
return maskstatus;
}
p_code = mask_read(0xFD40EF18, 0xFFFFFFFF);
n_code = mask_read(0xFD40EF1C, 0xFFFFFFFF);
;
i_code = mask_read(0xFD40EF24, 0xFFFFFFFF);
r_code = mask_read(0xFD40EF28, 0xFFFFFFFF);
;
if (p_code >= 0x26 && p_code <= 0x3C)
match_pmos_code[p_code - 0x26] += 1;
if (n_code >= 0x26 && n_code <= 0x3C)
match_nmos_code[n_code - 0x26] += 1;
if (i_code >= 0xC && i_code <= 0x12)
match_ical_code[i_code - 0xc] += 1;
if (r_code >= 0x6 && r_code <= 0xC)
match_rcal_code[r_code - 0x6] += 1;
} while (repeat_count++ < 10);
for (i = 0; i < 23; i++) {
if (match_pmos_code[i] >= match_pmos_code[0]) {
match_pmos_code[0] = match_pmos_code[i];
p_code = 0x26 + i;
}
if (match_nmos_code[i] >= match_nmos_code[0]) {
match_nmos_code[0] = match_nmos_code[i];
n_code = 0x26 + i;
}
}
for (i = 0; i < 7; i++) {
if (match_ical_code[i] >= match_ical_code[0]) {
match_ical_code[0] = match_ical_code[i];
i_code = 0xC + i;
}
if (match_rcal_code[i] >= match_rcal_code[0]) {
match_rcal_code[0] = match_rcal_code[i];
r_code = 0x6 + i;
}
}
L3_TM_CALIB_DIG20 = mask_read(0xFD40EC50, 0xFFFFFFF0);
L3_TM_CALIB_DIG20 = L3_TM_CALIB_DIG20 | 0x8 | ((p_code >> 2) & 0x7);
L3_TM_CALIB_DIG19 = mask_read(0xFD40EC4C, 0xFFFFFF18);
L3_TM_CALIB_DIG19 = L3_TM_CALIB_DIG19 | ((p_code & 0x3) << 6)
| 0x20 | 0x4 | ((n_code >> 3) & 0x3);
L3_TM_CALIB_DIG18 = mask_read(0xFD40EC48, 0xFFFFFF0F);
L3_TM_CALIB_DIG18 = L3_TM_CALIB_DIG18 | ((n_code & 0x7) << 5) | 0x10;
L3_TM_CALIB_DIG16 = mask_read(0xFD40EC40, 0xFFFFFFF8);
L3_TM_CALIB_DIG16 = L3_TM_CALIB_DIG16 | ((r_code >> 1) & 0x7);
L3_TM_CALIB_DIG15 = mask_read(0xFD40EC3C, 0xFFFFFF30);
L3_TM_CALIB_DIG15 = L3_TM_CALIB_DIG15 | ((r_code & 0x1) << 7)
| 0x40 | 0x8 | ((i_code >> 1) & 0x7);
L3_TM_CALIB_DIG14 = mask_read(0xFD40EC38, 0xFFFFFF3F);
L3_TM_CALIB_DIG14 = L3_TM_CALIB_DIG14 | ((i_code & 0x1) << 7) | 0x40;
Xil_Out32(0xFD40EC50, L3_TM_CALIB_DIG20);
Xil_Out32(0xFD40EC4C, L3_TM_CALIB_DIG19);
Xil_Out32(0xFD40EC48, L3_TM_CALIB_DIG18);
Xil_Out32(0xFD40EC40, L3_TM_CALIB_DIG16);
Xil_Out32(0xFD40EC3C, L3_TM_CALIB_DIG15);
Xil_Out32(0xFD40EC38, L3_TM_CALIB_DIG14);
return maskstatus;
}
static int init_serdes(void)
{
int status = 1;
status &= psu_resetin_init_data();
status &= serdes_fixcal_code();
status &= serdes_enb_coarse_saturation();
status &= psu_serdes_init_data();
status &= psu_resetout_init_data();
return status;
}
static void init_peripheral(void)
{
psu_mask_write(0xFD5F0018, 0x8000001FU, 0x8000001FU);
}
int psu_init(void)
{
int status = 1;
status &= psu_mio_init_data();
status &= psu_peripherals_pre_init_data();
status &= psu_pll_init_data();
status &= psu_clock_init_data();
status &= psu_ddr_init_data();
status &= psu_ddr_phybringup_data();
status &= psu_peripherals_init_data();
status &= init_serdes();
init_peripheral();
status &= psu_afi_config();
psu_ddr_qos_init_data();
if (status == 0)
return 1;
return 0;
}

View file

@ -358,6 +358,21 @@ static int multi_boot(void)
return multiboot; return multiboot;
} }
#if defined(CONFIG_SPL_BUILD)
static void restore_jtag(void)
{
if (current_el() != 3)
return;
writel(CSU_JTAG_SEC_GATE_DISABLE, &csu_base->jtag_sec);
writel(CSU_JTAG_DAP_ENABLE_DEBUG, &csu_base->jtag_dap_cfg);
writel(CSU_JTAG_CHAIN_WR_SETUP, &csu_base->jtag_chain_status_wr);
writel(CRLAPB_DBG_LPD_CTRL_SETUP_CLK, &crlapb_base->dbg_lpd_ctrl);
writel(CRLAPB_RST_LPD_DBG_RESET, &crlapb_base->rst_lpd_dbg);
writel(CSU_PCAP_PROG_RELEASE_PL, &csu_base->pcap_prog);
}
#endif
#define PS_SYSMON_ANALOG_BUS_VAL 0x3210 #define PS_SYSMON_ANALOG_BUS_VAL 0x3210
#define PS_SYSMON_ANALOG_BUS_REG 0xFFA50914 #define PS_SYSMON_ANALOG_BUS_REG 0xFFA50914
@ -377,6 +392,10 @@ int board_init(void)
zynqmp_pmufw_load_config_object(zynqmp_pm_cfg_obj, zynqmp_pmufw_load_config_object(zynqmp_pm_cfg_obj,
zynqmp_pm_cfg_obj_size); zynqmp_pm_cfg_obj_size);
printf("Silicon version:\t%d\n", zynqmp_get_silicon_version()); printf("Silicon version:\t%d\n", zynqmp_get_silicon_version());
/* the CSU disables the JTAG interface when secure boot is enabled */
if (CONFIG_IS_ENABLED(ZYNQMP_RESTORE_JTAG))
restore_jtag();
#else #else
if (CONFIG_IS_ENABLED(DM_I2C) && CONFIG_IS_ENABLED(I2C_EEPROM)) if (CONFIG_IS_ENABLED(DM_I2C) && CONFIG_IS_ENABLED(I2C_EEPROM))
xilinx_read_eeprom(); xilinx_read_eeprom();
@ -477,7 +496,7 @@ ulong board_get_usable_ram_top(ulong total_size)
lmb_init(&lmb); lmb_init(&lmb);
lmb_add(&lmb, gd->ram_base, gd->ram_size); lmb_add(&lmb, gd->ram_base, gd->ram_size);
boot_fdt_add_mem_rsv_regions(&lmb, (void *)gd->fdt_blob); boot_fdt_add_mem_rsv_regions(&lmb, (void *)gd->fdt_blob);
size = ALIGN(CONFIG_SYS_MALLOC_LEN + total_size, MMU_SECTION_SIZE), size = ALIGN(CONFIG_SYS_MALLOC_LEN + total_size, MMU_SECTION_SIZE);
reg = lmb_alloc(&lmb, size, MMU_SECTION_SIZE); reg = lmb_alloc(&lmb, size, MMU_SECTION_SIZE);
if (!reg) if (!reg)
@ -621,7 +640,7 @@ int board_late_init(void)
const char *mode; const char *mode;
char *new_targets; char *new_targets;
char *env_targets; char *env_targets;
int ret; int ret, multiboot;
#if defined(CONFIG_USB_ETHER) && !defined(CONFIG_USB_GADGET_DOWNLOAD) #if defined(CONFIG_USB_ETHER) && !defined(CONFIG_USB_GADGET_DOWNLOAD)
usb_ether_init(); usb_ether_init();
@ -639,6 +658,10 @@ int board_late_init(void)
if (ret) if (ret)
return ret; return ret;
multiboot = multi_boot();
if (multiboot >= 0)
env_set_hex("multiboot", multiboot);
bootmode = zynqmp_get_bootmode(); bootmode = zynqmp_get_bootmode();
puts("Bootmode: "); puts("Bootmode: ");
@ -691,7 +714,7 @@ int board_late_init(void)
break; break;
case SD1_LSHFT_MODE: case SD1_LSHFT_MODE:
puts("LVL_SHFT_"); puts("LVL_SHFT_");
/* fall through */ fallthrough;
case SD_MODE1: case SD_MODE1:
puts("SD_MODE1\n"); puts("SD_MODE1\n");
if (uclass_get_device_by_name(UCLASS_MMC, if (uclass_get_device_by_name(UCLASS_MMC,
@ -845,6 +868,10 @@ void set_dfu_alt_info(char *interface, char *devstr)
memset(buf, 0, sizeof(buf)); memset(buf, 0, sizeof(buf));
multiboot = multi_boot(); multiboot = multi_boot();
if (multiboot < 0)
multiboot = 0;
multiboot = env_get_hex("multiboot", multiboot);
debug("Multiboot: %d\n", multiboot); debug("Multiboot: %d\n", multiboot);
switch (zynqmp_get_bootmode()) { switch (zynqmp_get_bootmode()) {
@ -856,20 +883,23 @@ void set_dfu_alt_info(char *interface, char *devstr)
if (!multiboot) if (!multiboot)
snprintf(buf, DFU_ALT_BUF_LEN, snprintf(buf, DFU_ALT_BUF_LEN,
"mmc %d:1=boot.bin fat %d 1;" "mmc %d:1=boot.bin fat %d 1;"
"u-boot.itb fat %d 1", "%s fat %d 1",
bootseq, bootseq, bootseq); bootseq, bootseq,
CONFIG_SPL_FS_LOAD_PAYLOAD_NAME, bootseq);
else else
snprintf(buf, DFU_ALT_BUF_LEN, snprintf(buf, DFU_ALT_BUF_LEN,
"mmc %d:1=boot%04d.bin fat %d 1;" "mmc %d:1=boot%04d.bin fat %d 1;"
"u-boot.itb fat %d 1", "%s fat %d 1",
bootseq, multiboot, bootseq, bootseq); bootseq, multiboot, bootseq,
CONFIG_SPL_FS_LOAD_PAYLOAD_NAME, bootseq);
break; break;
case QSPI_MODE_24BIT: case QSPI_MODE_24BIT:
case QSPI_MODE_32BIT: case QSPI_MODE_32BIT:
snprintf(buf, DFU_ALT_BUF_LEN, snprintf(buf, DFU_ALT_BUF_LEN,
"sf 0:0=boot.bin raw %x 0x1500000;" "sf 0:0=boot.bin raw %x 0x1500000;"
"u-boot.itb raw 0x%x 0x500000", "%s raw 0x%x 0x500000",
multiboot * SZ_32K, CONFIG_SYS_SPI_U_BOOT_OFFS); multiboot * SZ_32K, CONFIG_SPL_FS_LOAD_PAYLOAD_NAME,
CONFIG_SYS_SPI_U_BOOT_OFFS);
break; break;
default: default:
return; return;

View file

@ -14,6 +14,7 @@
#include <env.h> #include <env.h>
#include <fpga.h> #include <fpga.h>
#include <image.h> #include <image.h>
#include <init.h>
#include <mapmem.h> #include <mapmem.h>
#include <rtc.h> #include <rtc.h>
#include <watchdog.h> #include <watchdog.h>

View file

@ -9,6 +9,7 @@
#ifndef USE_HOSTCC #ifndef USE_HOSTCC
#include <common.h> #include <common.h>
#include <env.h> #include <env.h>
#include <init.h>
#include <lmb.h> #include <lmb.h>
#include <log.h> #include <log.h>
#include <malloc.h> #include <malloc.h>
@ -29,11 +30,6 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <asm/io.h> #include <asm/io.h>
#ifdef CONFIG_CMD_BDI
extern int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[]);
#endif
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
/* Set this if we have less than 4 MB of malloc() space */ /* Set this if we have less than 4 MB of malloc() space */

View file

@ -406,9 +406,9 @@ static int do_tpm_load_key_by_sha1(struct cmd_tbl *cmdtp, int flag, int argc,
void *key; void *key;
struct udevice *dev; struct udevice *dev;
rc = get_tpm(&dev); err = get_tpm(&dev);
if (rc) if (err)
return rc; return err;
if (argc < 5) if (argc < 5)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -420,7 +420,7 @@ static int do_tpm_load_key_by_sha1(struct cmd_tbl *cmdtp, int flag, int argc,
return CMD_RET_FAILURE; return CMD_RET_FAILURE;
parse_byte_string(argv[4], usage_auth, NULL); parse_byte_string(argv[4], usage_auth, NULL);
err = tpm_find_key_sha1(usage_auth, parent_hash, &parent_handle); err = tpm1_find_key_sha1(dev, usage_auth, parent_hash, &parent_handle);
if (err) { if (err) {
printf("Could not find matching parent key (err = %d)\n", err); printf("Could not find matching parent key (err = %d)\n", err);
return CMD_RET_FAILURE; return CMD_RET_FAILURE;
@ -428,7 +428,7 @@ static int do_tpm_load_key_by_sha1(struct cmd_tbl *cmdtp, int flag, int argc,
printf("Found parent key %08x\n", parent_handle); printf("Found parent key %08x\n", parent_handle);
err = tpm_load_key2_oiap(parent_handle, key, key_len, usage_auth, err = tpm1_load_key2_oiap(dev, parent_handle, key, key_len, usage_auth,
&key_handle); &key_handle);
if (!err) { if (!err) {
printf("Key handle is 0x%x\n", key_handle); printf("Key handle is 0x%x\n", key_handle);
@ -582,6 +582,7 @@ static int do_tpm_flush(struct cmd_tbl *cmdtp, int flag, int argc,
static int do_tpm_list(struct cmd_tbl *cmdtp, int flag, int argc, static int do_tpm_list(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[]) char *const argv[])
{ {
struct udevice *dev;
int type = 0; int type = 0;
u16 res_count; u16 res_count;
u8 buf[288]; u8 buf[288];
@ -589,6 +590,10 @@ static int do_tpm_list(struct cmd_tbl *cmdtp, int flag, int argc,
int err; int err;
uint i; uint i;
err = get_tpm(&dev);
if (err)
return err;
if (argc != 2) if (argc != 2)
return CMD_RET_USAGE; return CMD_RET_USAGE;
@ -619,7 +624,7 @@ static int do_tpm_list(struct cmd_tbl *cmdtp, int flag, int argc,
} }
/* fetch list of already loaded resources in the TPM */ /* fetch list of already loaded resources in the TPM */
err = tpm_get_capability(TPM_CAP_HANDLE, type, buf, err = tpm_get_capability(dev, TPM_CAP_HANDLE, type, buf,
sizeof(buf)); sizeof(buf));
if (err) { if (err) {
printf("tpm_get_capability returned error %d.\n", err); printf("tpm_get_capability returned error %d.\n", err);

View file

@ -673,30 +673,32 @@ static int reloc_bloblist(void)
static int setup_reloc(void) static int setup_reloc(void)
{ {
if (gd->flags & GD_FLG_SKIP_RELOC) { if (!(gd->flags & GD_FLG_SKIP_RELOC)) {
debug("Skipping relocation due to flag\n");
return 0;
}
#ifdef CONFIG_SYS_TEXT_BASE #ifdef CONFIG_SYS_TEXT_BASE
#ifdef ARM #ifdef ARM
gd->reloc_off = gd->relocaddr - (unsigned long)__image_copy_start; gd->reloc_off = gd->relocaddr - (unsigned long)__image_copy_start;
#elif defined(CONFIG_M68K) #elif defined(CONFIG_M68K)
/* /*
* On all ColdFire arch cpu, monitor code starts always * On all ColdFire arch cpu, monitor code starts always
* just after the default vector table location, so at 0x400 * just after the default vector table location, so at 0x400
*/ */
gd->reloc_off = gd->relocaddr - (CONFIG_SYS_TEXT_BASE + 0x400); gd->reloc_off = gd->relocaddr - (CONFIG_SYS_TEXT_BASE + 0x400);
#elif !defined(CONFIG_SANDBOX) #elif !defined(CONFIG_SANDBOX)
gd->reloc_off = gd->relocaddr - CONFIG_SYS_TEXT_BASE; gd->reloc_off = gd->relocaddr - CONFIG_SYS_TEXT_BASE;
#endif #endif
#endif #endif
}
memcpy(gd->new_gd, (char *)gd, sizeof(gd_t)); memcpy(gd->new_gd, (char *)gd, sizeof(gd_t));
debug("Relocation Offset is: %08lx\n", gd->reloc_off); if (gd->flags & GD_FLG_SKIP_RELOC) {
debug("Relocating to %08lx, new gd at %08lx, sp at %08lx\n", debug("Skipping relocation due to flag\n");
gd->relocaddr, (ulong)map_to_sysmem(gd->new_gd), } else {
gd->start_addr_sp); debug("Relocation Offset is: %08lx\n", gd->reloc_off);
debug("Relocating to %08lx, new gd at %08lx, sp at %08lx\n",
gd->relocaddr, (ulong)map_to_sysmem(gd->new_gd),
gd->start_addr_sp);
}
return 0; return 0;
} }

View file

@ -81,7 +81,7 @@ CONFIG_CMD_MTDPARTS_SHOW_NET_SIZES=y
CONFIG_CMD_UBI=y CONFIG_CMD_UBI=y
CONFIG_PARTITION_TYPE_GUID=y CONFIG_PARTITION_TYPE_GUID=y
CONFIG_SPL_OF_CONTROL=y CONFIG_SPL_OF_CONTROL=y
CONFIG_OF_LIST="avnet-ultra96-rev1 zynqmp-a2197-revA zynqmp-e-a2197-00-revA zynqmp-g-a2197-00-revA zynqmp-m-a2197-01-revA zynqmp-m-a2197-02-revA zynqmp-m-a2197-03-revA zynqmp-p-a2197-00-revA zynqmp-zc1232-revA zynqmp-zc1254-revA zynqmp-zc1751-xm015-dc1 zynqmp-zc1751-xm016-dc2 zynqmp-zc1751-xm017-dc3 zynqmp-zc1751-xm018-dc4 zynqmp-zc1751-xm019-dc5 zynqmp-zcu100-revC zynqmp-zcu102-rev1.1 zynqmp-zcu102-rev1.0 zynqmp-zcu102-revA zynqmp-zcu102-revB zynqmp-zcu104-revA zynqmp-zcu104-revC zynqmp-zcu106-revA zynqmp-zcu111-revA zynqmp-zcu1275-revA zynqmp-zcu1275-revB zynqmp-zcu1285-revA zynqmp-zcu208-revA zynqmp-zcu216-revA zynqmp-topic-miamimp-xilinx-xdp-v1r1 zynqmp-sm-k26-revA zynqmp-smk-k26-revA" CONFIG_OF_LIST="avnet-ultra96-rev1 zynqmp-a2197-revA zynqmp-e-a2197-00-revA zynqmp-g-a2197-00-revA zynqmp-m-a2197-01-revA zynqmp-m-a2197-02-revA zynqmp-m-a2197-03-revA zynqmp-p-a2197-00-revA zynqmp-zc1232-revA zynqmp-zc1254-revA zynqmp-zc1751-xm015-dc1 zynqmp-zc1751-xm016-dc2 zynqmp-zc1751-xm017-dc3 zynqmp-zc1751-xm018-dc4 zynqmp-zc1751-xm019-dc5 zynqmp-zcu100-revC zynqmp-zcu102-rev1.1 zynqmp-zcu102-rev1.0 zynqmp-zcu102-revA zynqmp-zcu102-revB zynqmp-zcu104-revA zynqmp-zcu104-revC zynqmp-zcu106-revA zynqmp-zcu111-revA zynqmp-zcu1275-revA zynqmp-zcu1275-revB zynqmp-zcu1285-revA zynqmp-zcu208-revA zynqmp-zcu216-revA zynqmp-topic-miamimp-xilinx-xdp-v1r1 zynqmp-sm-k26-revA zynqmp-smk-k26-revA zynqmp-dlc21-revA"
CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names interrupt-parent interrupts iommus power-domains" CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names interrupt-parent interrupts iommus power-domains"
CONFIG_ENV_IS_NOWHERE=y CONFIG_ENV_IS_NOWHERE=y
CONFIG_ENV_IS_IN_FAT=y CONFIG_ENV_IS_IN_FAT=y

View file

@ -668,6 +668,13 @@ int part_get_info_by_name_type(struct blk_desc *dev_desc, const char *name,
part_drv = part_driver_lookup_type(dev_desc); part_drv = part_driver_lookup_type(dev_desc);
if (!part_drv) if (!part_drv)
return -1; return -1;
if (!part_drv->get_info) {
log_debug("## Driver %s does not have the get_info() method\n",
part_drv->name);
return -ENOSYS;
}
for (i = 1; i < part_drv->max_entries; i++) { for (i = 1; i < part_drv->max_entries; i++) {
ret = part_drv->get_info(dev_desc, i, info); ret = part_drv->get_info(dev_desc, i, info);
if (ret != 0) { if (ret != 0) {

View file

@ -18,8 +18,8 @@ How it works:
------------- -------------
The USB (at least the USB UHCI) needs a frame list (4k), transfer The USB (at least the USB UHCI) needs a frame list (4k), transfer
descripor and queue headers which are all located in the main memory. descriptor and queue headers which are all located in the main memory.
The UHCI allocates every milisecond the PCI bus and reads the current The UHCI allocates every millisecond the PCI bus and reads the current
frame pointer. This may cause to crash the OS during boot. So the USB frame pointer. This may cause to crash the OS during boot. So the USB
_MUST_ be stopped during OS boot. This is the reason, why the USB is _MUST_ be stopped during OS boot. This is the reason, why the USB is
NOT automatically started during start-up. If someone needs the USB NOT automatically started during start-up. If someone needs the USB
@ -27,10 +27,10 @@ he has to start it and should therefore be aware that he had to stop
it before booting the OS. it before booting the OS.
For USB keyboards this can be done by a script which is automatically For USB keyboards this can be done by a script which is automatically
started after the U-Boot is up and running. To boot an OS with a an started after the U-Boot is up and running. To boot an OS with a
USB keyboard another script is necessary, which first disables the USB keyboard another script is necessary, which first disables the
USB and then executes the boot command. If the boot command fails, USB and then executes the boot command. If the boot command fails,
the script can reenable the USB kbd. the script can re-enable the USB keyboard.
Common USB Commands: Common USB Commands:
- usb start: - usb start:
@ -40,10 +40,10 @@ Common USB Commands:
- usb info [dev]: shows all USB infos of the device dev, or of all - usb info [dev]: shows all USB infos of the device dev, or of all
the devices the devices
- usb stop [f]: stops the USB. If f==1 the USB will also stop if - usb stop [f]: stops the USB. If f==1 the USB will also stop if
an USB keyboard is assigned as stdin. The stdin a USB keyboard is assigned as stdin. The stdin
is then switched to serial input. is then switched to serial input.
Storage USB Commands: Storage USB Commands:
- usb scan: scans the USB for storage devices.The USB must be - usb scan: scans the USB for storage devices. The USB must be
running for this command (usb start) running for this command (usb start)
- usb device [dev]: show or set current USB storage device - usb device [dev]: show or set current USB storage device
- usb part [dev]: print partition table of one or all USB storage - usb part [dev]: print partition table of one or all USB storage
@ -57,7 +57,7 @@ Storage USB Commands:
Config Switches: Config Switches:
---------------- ----------------
CONFIG_CMD_USB enables basic USB support and the usb command CONFIG_CMD_USB enables basic USB support and the usb command
CONFIG_USB_UHCI defines the lowlevel part.A lowlevel part must be defined CONFIG_USB_UHCI defines the lowlevel part. A lowlevel part must be defined
if using CONFIG_CMD_USB if using CONFIG_CMD_USB
CONFIG_USB_KEYBOARD enables the USB Keyboard CONFIG_USB_KEYBOARD enables the USB Keyboard
CONFIG_USB_STORAGE enables the USB storage devices CONFIG_USB_STORAGE enables the USB storage devices
@ -124,7 +124,7 @@ bootp
To enable USB Host Ethernet in U-Boot, your platform must of course To enable USB Host Ethernet in U-Boot, your platform must of course
support USB with CONFIG_CMD_USB enabled and working. You will need to support USB with CONFIG_CMD_USB enabled and working. You will need to
add some config settings to your board config: add some settings to your board configuration:
CONFIG_CMD_USB=y /* the 'usb' interactive command */ CONFIG_CMD_USB=y /* the 'usb' interactive command */
CONFIG_USB_HOST_ETHER=y /* Enable USB Ethernet adapters */ CONFIG_USB_HOST_ETHER=y /* Enable USB Ethernet adapters */
@ -158,7 +158,7 @@ settings should start you off:
You can also set the default IP address of your board and the server You can also set the default IP address of your board and the server
as well as the default file to load when a 'bootp' command is issued. as well as the default file to load when a 'bootp' command is issued.
However note that encoding these individual network settings into a However note that encoding these individual network settings into a
common exectuable is discouraged, as it leads to potential conflicts, common executable is discouraged, as it leads to potential conflicts,
and all the parameters can either get stored in the board's external and all the parameters can either get stored in the board's external
environment, or get obtained from the bootp server if not set. environment, or get obtained from the bootp server if not set.
@ -166,7 +166,6 @@ environment, or get obtained from the bootp server if not set.
#define CONFIG_SERVERIP 10.0.0.1 (replace with your value) #define CONFIG_SERVERIP 10.0.0.1 (replace with your value)
#define CONFIG_BOOTFILE "uImage" #define CONFIG_BOOTFILE "uImage"
The 'usb start' command should identify the adapter something like this: The 'usb start' command should identify the adapter something like this:
CrOS> usb start CrOS> usb start
@ -211,8 +210,8 @@ MAC Addresses
Most Ethernet dongles have a built-in MAC address which is unique in the Most Ethernet dongles have a built-in MAC address which is unique in the
world. This is important so that devices on the network can be world. This is important so that devices on the network can be
distinguised from each other. MAC address conflicts are evil and distinguished from each other. MAC address conflicts are evil and
generally result in strange and eratic behaviour. generally result in strange and erratic behaviour.
Some boards have USB Ethernet chips on-board, and these sometimes do not Some boards have USB Ethernet chips on-board, and these sometimes do not
have an assigned MAC address. In this case it is up to you to assign have an assigned MAC address. In this case it is up to you to assign

View file

@ -10,6 +10,7 @@ U-Boot API documentation
efi efi
getopt getopt
linker_lists linker_lists
lmb
logging logging
pinctrl pinctrl
rng rng

7
doc/api/lmb.rst Normal file
View file

@ -0,0 +1,7 @@
.. SPDX-License-Identifier: GPL-2.0+
Logical memory blocks
=====================
.. kernel-doc:: include/lmb.h
:internal:

View file

@ -49,7 +49,7 @@ OP-TEE:
.. code-block:: text .. code-block:: text
$ make PLATFORM=k3-am65x CFG_ARM64_core=y CFG_TEE_CORE_LOG_LEVEL=2 CFG_CONSOLE_UART=1 $ make PLATFORM=k3-am65x CFG_ARM64_core=y CFG_TEE_CORE_LOG_LEVEL=2 CFG_CONSOLE_UART=1 CFG_USER_TA_TARGETS="ta_arm64"
U-Boot: U-Boot:

View file

@ -4,7 +4,7 @@
Tracing in U-Boot Tracing in U-Boot
================= =================
U-Boot supports a simple tracing feature which allows a record of excecution U-Boot supports a simple tracing feature which allows a record of execution
to be collected and sent to a host machine for analysis. At present the to be collected and sent to a host machine for analysis. At present the
main use for this is to profile boot time. main use for this is to profile boot time.
@ -161,10 +161,10 @@ limit of the trace buffer size you have specified. Once that is exhausted
no more data will be collected. no more data will be collected.
Collecting trace data has an affect on execution time/performance. You Collecting trace data has an affect on execution time/performance. You
will notice this particularly with trvial functions - the overhead of will notice this particularly with trivial functions - the overhead of
recording their execution may even exceed their normal execution time. recording their execution may even exceed their normal execution time.
In practice this doesn't matter much so long as you are aware of the In practice this doesn't matter much so long as you are aware of the
effect. Once you have done your optimisations, turn off tracing before effect. Once you have done your optimizations, turn off tracing before
doing end-to-end timing. doing end-to-end timing.
The best time to start tracing is right at the beginning of U-Boot. The The best time to start tracing is right at the beginning of U-Boot. The
@ -184,7 +184,7 @@ the OS. In practical terms, U-Boot runs the 'fakegocmd' environment
variable at this point. This variable should have a short script which variable at this point. This variable should have a short script which
collects the trace data and writes it somewhere. collects the trace data and writes it somewhere.
Trace data collection relies on a microsecond timer, accesed through Trace data collection relies on a microsecond timer, accessed through
timer_get_us(). So the first think you should do is make sure that timer_get_us(). So the first think you should do is make sure that
this produces sensible results for your board. Suitable sources for this produces sensible results for your board. Suitable sources for
this timer include high resolution timers, PWMs or profile timers if this timer include high resolution timers, PWMs or profile timers if
@ -285,7 +285,7 @@ Options
Specify U-Boot map file Specify U-Boot map file
-p <trace_file> -p <trace_file>
Specifiy profile/trace file Specify profile/trace file
Commands: Commands:
@ -315,11 +315,11 @@ time:
2. Build U-Boot with tracing and run it. Note the difference in boot time 2. Build U-Boot with tracing and run it. Note the difference in boot time
(it is common for tracing to add 10% to the time) (it is common for tracing to add 10% to the time)
3. Collect the trace information as descibed above. Use this to find where 3. Collect the trace information as described above. Use this to find where
all the time is being spent. all the time is being spent.
4. Take a look at that code and see if you can optimise it. Perhaps it is 4. Take a look at that code and see if you can optimize it. Perhaps it is
possible to speed up the initialisation of a device, or remove an unused possible to speed up the initialization of a device, or remove an unused
feature. feature.
5. Rebuild, run and collect again. Compare your results. 5. Rebuild, run and collect again. Compare your results.

View file

@ -29,6 +29,10 @@ static int ipi_req(const u32 *req, size_t req_len, u32 *res, size_t res_maxlen)
{ {
struct zynqmp_ipi_msg msg; struct zynqmp_ipi_msg msg;
int ret; int ret;
u32 buffer[PAYLOAD_ARG_CNT];
if (!res)
res = buffer;
if (req_len > PMUFW_PAYLOAD_ARG_CNT || if (req_len > PMUFW_PAYLOAD_ARG_CNT ||
res_maxlen > PMUFW_PAYLOAD_ARG_CNT) res_maxlen > PMUFW_PAYLOAD_ARG_CNT)
@ -164,6 +168,7 @@ int __maybe_unused xilinx_pm_request(u32 api_id, u32 arg0, u32 arg1, u32 arg2,
* firmware API is limited by the SMC call size * firmware API is limited by the SMC call size
*/ */
u32 regs[] = {api_id, arg0, arg1, arg2, arg3}; u32 regs[] = {api_id, arg0, arg1, arg2, arg3};
int ret;
if (api_id == PM_FPGA_LOAD) { if (api_id == PM_FPGA_LOAD) {
/* Swap addr_hi/low because of incompatibility */ /* Swap addr_hi/low because of incompatibility */
@ -173,7 +178,10 @@ int __maybe_unused xilinx_pm_request(u32 api_id, u32 arg0, u32 arg1, u32 arg2,
regs[2] = temp; regs[2] = temp;
} }
ipi_req(regs, PAYLOAD_ARG_CNT, ret_payload, PAYLOAD_ARG_CNT); ret = ipi_req(regs, PAYLOAD_ARG_CNT, ret_payload,
PAYLOAD_ARG_CNT);
if (ret)
return ret;
#else #else
return -EPERM; return -EPERM;
#endif #endif

View file

@ -69,6 +69,12 @@ __weak int zynqmp_mmio_write(const u32 address, const u32 mask, const u32 value)
return 0; return 0;
} }
__weak int xilinx_pm_request(u32 api_id, u32 arg0, u32 arg1, u32 arg2,
u32 arg3, u32 *ret_payload)
{
return 0;
}
#if defined(CONFIG_ARCH_ZYNQMP) || defined(CONFIG_ARCH_VERSAL) #if defined(CONFIG_ARCH_ZYNQMP) || defined(CONFIG_ARCH_VERSAL)
/* Default settings for ZynqMP Clock Phases */ /* Default settings for ZynqMP Clock Phases */
static const u32 zynqmp_iclk_phases[] = {0, 63, 63, 0, 63, 0, static const u32 zynqmp_iclk_phases[] = {0, 63, 63, 0, 63, 0,

View file

@ -60,6 +60,7 @@
#define ZYNQ_GEM_NWCFG_SPEED100 0x00000001 /* 100 Mbps operation */ #define ZYNQ_GEM_NWCFG_SPEED100 0x00000001 /* 100 Mbps operation */
#define ZYNQ_GEM_NWCFG_SPEED1000 0x00000400 /* 1Gbps operation */ #define ZYNQ_GEM_NWCFG_SPEED1000 0x00000400 /* 1Gbps operation */
#define ZYNQ_GEM_NWCFG_FDEN 0x00000002 /* Full Duplex mode */ #define ZYNQ_GEM_NWCFG_FDEN 0x00000002 /* Full Duplex mode */
#define ZYNQ_GEM_NWCFG_NO_BRDC BIT(5) /* No broadcast */
#define ZYNQ_GEM_NWCFG_FSREM 0x00020000 /* FCS removal */ #define ZYNQ_GEM_NWCFG_FSREM 0x00020000 /* FCS removal */
#define ZYNQ_GEM_NWCFG_SGMII_ENBL 0x08000000 /* SGMII Enable */ #define ZYNQ_GEM_NWCFG_SGMII_ENBL 0x08000000 /* SGMII Enable */
#define ZYNQ_GEM_NWCFG_PCS_SEL 0x00000800 /* PCS select */ #define ZYNQ_GEM_NWCFG_PCS_SEL 0x00000800 /* PCS select */
@ -77,6 +78,7 @@
#define ZYNQ_GEM_NWCFG_INIT (ZYNQ_GEM_DBUS_WIDTH | \ #define ZYNQ_GEM_NWCFG_INIT (ZYNQ_GEM_DBUS_WIDTH | \
ZYNQ_GEM_NWCFG_FDEN | \ ZYNQ_GEM_NWCFG_FDEN | \
ZYNQ_GEM_NWCFG_NO_BRDC | \
ZYNQ_GEM_NWCFG_FSREM | \ ZYNQ_GEM_NWCFG_FSREM | \
ZYNQ_GEM_NWCFG_MDCCLKDIV) ZYNQ_GEM_NWCFG_MDCCLKDIV)

View file

@ -145,7 +145,7 @@ static const struct dm_gpio_ops meson_gx_gpio_ops = {
.direction_output = meson_gpio_direction_output, .direction_output = meson_gpio_direction_output,
}; };
const struct driver meson_gx_gpio_driver = { U_BOOT_DRIVER(meson_gx_gpio_driver) = {
.name = "meson-gx-gpio", .name = "meson-gx-gpio",
.id = UCLASS_GPIO, .id = UCLASS_GPIO,
.probe = meson_gpio_probe, .probe = meson_gpio_probe,

View file

@ -43,6 +43,6 @@ struct meson_gx_pmx_data {
} }
extern const struct pinctrl_ops meson_gx_pinctrl_ops; extern const struct pinctrl_ops meson_gx_pinctrl_ops;
extern const struct driver meson_gx_gpio_driver; extern U_BOOT_DRIVER(meson_gx_gpio_driver);
#endif /* __PINCTRL_MESON_GX_H__ */ #endif /* __PINCTRL_MESON_GX_H__ */

View file

@ -439,7 +439,7 @@ struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
.num_groups = ARRAY_SIZE(meson_gxbb_periphs_groups), .num_groups = ARRAY_SIZE(meson_gxbb_periphs_groups),
.num_funcs = ARRAY_SIZE(meson_gxbb_periphs_functions), .num_funcs = ARRAY_SIZE(meson_gxbb_periphs_functions),
.num_banks = ARRAY_SIZE(meson_gxbb_periphs_banks), .num_banks = ARRAY_SIZE(meson_gxbb_periphs_banks),
.gpio_driver = &meson_gx_gpio_driver, .gpio_driver = DM_DRIVER_REF(meson_gx_gpio_driver),
}; };
struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = { struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
@ -452,7 +452,7 @@ struct meson_pinctrl_data meson_gxbb_aobus_pinctrl_data = {
.num_groups = ARRAY_SIZE(meson_gxbb_aobus_groups), .num_groups = ARRAY_SIZE(meson_gxbb_aobus_groups),
.num_funcs = ARRAY_SIZE(meson_gxbb_aobus_functions), .num_funcs = ARRAY_SIZE(meson_gxbb_aobus_functions),
.num_banks = ARRAY_SIZE(meson_gxbb_aobus_banks), .num_banks = ARRAY_SIZE(meson_gxbb_aobus_banks),
.gpio_driver = &meson_gx_gpio_driver, .gpio_driver = DM_DRIVER_REF(meson_gx_gpio_driver),
}; };
static const struct udevice_id meson_gxbb_pinctrl_match[] = { static const struct udevice_id meson_gxbb_pinctrl_match[] = {

View file

@ -701,7 +701,7 @@ struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
.num_groups = ARRAY_SIZE(meson_gxl_periphs_groups), .num_groups = ARRAY_SIZE(meson_gxl_periphs_groups),
.num_funcs = ARRAY_SIZE(meson_gxl_periphs_functions), .num_funcs = ARRAY_SIZE(meson_gxl_periphs_functions),
.num_banks = ARRAY_SIZE(meson_gxl_periphs_banks), .num_banks = ARRAY_SIZE(meson_gxl_periphs_banks),
.gpio_driver = &meson_gx_gpio_driver, .gpio_driver = DM_DRIVER_REF(meson_gx_gpio_driver),
}; };
struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = { struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
@ -714,7 +714,7 @@ struct meson_pinctrl_data meson_gxl_aobus_pinctrl_data = {
.num_groups = ARRAY_SIZE(meson_gxl_aobus_groups), .num_groups = ARRAY_SIZE(meson_gxl_aobus_groups),
.num_funcs = ARRAY_SIZE(meson_gxl_aobus_functions), .num_funcs = ARRAY_SIZE(meson_gxl_aobus_functions),
.num_banks = ARRAY_SIZE(meson_gxl_aobus_banks), .num_banks = ARRAY_SIZE(meson_gxl_aobus_banks),
.gpio_driver = &meson_gx_gpio_driver, .gpio_driver = DM_DRIVER_REF(meson_gx_gpio_driver),
}; };
static const struct udevice_id meson_gxl_pinctrl_match[] = { static const struct udevice_id meson_gxl_pinctrl_match[] = {

View file

@ -37,6 +37,7 @@
*/ */
#define GQSPI_IXR_TXNFULL_MASK 0x00000004 /* QSPI TX FIFO Overflow */ #define GQSPI_IXR_TXNFULL_MASK 0x00000004 /* QSPI TX FIFO Overflow */
#define GQSPI_IXR_TXFULL_MASK 0x00000008 /* QSPI TX FIFO is full */ #define GQSPI_IXR_TXFULL_MASK 0x00000008 /* QSPI TX FIFO is full */
#define GQSPI_IXR_TXFIFOEMPTY_MASK 0x00000100 /* QSPI TX FIFO is Empty */
#define GQSPI_IXR_RXNEMTY_MASK 0x00000010 /* QSPI RX FIFO Not Empty */ #define GQSPI_IXR_RXNEMTY_MASK 0x00000010 /* QSPI RX FIFO Not Empty */
#define GQSPI_IXR_GFEMTY_MASK 0x00000080 /* QSPI Generic FIFO Empty */ #define GQSPI_IXR_GFEMTY_MASK 0x00000080 /* QSPI Generic FIFO Empty */
#define GQSPI_IXR_GFNFULL_MASK 0x00000200 /* QSPI GENFIFO not full */ #define GQSPI_IXR_GFNFULL_MASK 0x00000200 /* QSPI GENFIFO not full */
@ -279,9 +280,6 @@ static void zynqmp_qspi_chipselect(struct zynqmp_qspi_priv *priv, int is_on)
debug("GFIFO_CMD_CS: 0x%x\n", gqspi_fifo_reg); debug("GFIFO_CMD_CS: 0x%x\n", gqspi_fifo_reg);
/* Dummy generic FIFO entry */
zynqmp_qspi_fill_gen_fifo(priv, 0);
zynqmp_qspi_fill_gen_fifo(priv, gqspi_fifo_reg); zynqmp_qspi_fill_gen_fifo(priv, gqspi_fifo_reg);
} }
@ -470,6 +468,13 @@ static int zynqmp_qspi_fill_tx_fifo(struct zynqmp_qspi_priv *priv, u32 size)
} }
} }
ret = wait_for_bit_le32(&regs->isr, GQSPI_IXR_TXFIFOEMPTY_MASK, 1,
GQSPI_TIMEOUT, 1);
if (ret) {
printf("%s: Timeout\n", __func__);
return ret;
}
priv->tx_buf += len; priv->tx_buf += len;
return 0; return 0;
} }

View file

@ -52,7 +52,10 @@ static int tpm_atmel_twi_close(struct udevice *dev)
*/ */
static int tpm_atmel_twi_get_desc(struct udevice *dev, char *buf, int size) static int tpm_atmel_twi_get_desc(struct udevice *dev, char *buf, int size)
{ {
return 0; if (size < 50)
return -ENOSPC;
return snprintf(buf, size, "Atmel AT97SC3204T I2C 1.2 TPM (%s)", dev->name);
} }
/* /*
@ -81,22 +84,15 @@ static int tpm_atmel_twi_xfer(struct udevice *dev,
print_buffer(0, (void *)sendbuf, 1, send_size, 0); print_buffer(0, (void *)sendbuf, 1, send_size, 0);
#endif #endif
#if !CONFIG_IS_ENABLED(DM_I2C)
res = i2c_write(0x29, 0, 0, (uchar *)sendbuf, send_size);
#else
res = dm_i2c_write(dev, 0, sendbuf, send_size); res = dm_i2c_write(dev, 0, sendbuf, send_size);
#endif
if (res) { if (res) {
printf("i2c_write returned %d\n", res); printf("i2c_write returned %d\n", res);
return -1; return -1;
} }
start = get_timer(0); start = get_timer(0);
#if !CONFIG_IS_ENABLED(DM_I2C)
while ((res = i2c_read(0x29, 0, 0, recvbuf, 10)))
#else
while ((res = dm_i2c_read(dev, 0, recvbuf, 10))) while ((res = dm_i2c_read(dev, 0, recvbuf, 10)))
#endif
{ {
/* TODO Use TIS_TIMEOUT from tpm_tis_infineon.h */ /* TODO Use TIS_TIMEOUT from tpm_tis_infineon.h */
if (get_timer(start) > ATMEL_TPM_TIMEOUT_MS) { if (get_timer(start) > ATMEL_TPM_TIMEOUT_MS) {
@ -116,16 +112,11 @@ static int tpm_atmel_twi_xfer(struct udevice *dev,
return -1; return -1;
} else { } else {
*recv_len = hdr_recv_len; *recv_len = hdr_recv_len;
#if !CONFIG_IS_ENABLED(DM_I2C)
res = i2c_read(0x29, 0, 0, recvbuf, *recv_len);
#else
res = dm_i2c_read(dev, 0, recvbuf, *recv_len); res = dm_i2c_read(dev, 0, recvbuf, *recv_len);
#endif
} }
} }
if (res) { if (res) {
printf("i2c_read returned %d (rlen=%d)\n", res, *recv_len); printf("i2c_read returned %d (rlen=%zu)\n", res, *recv_len);
#ifdef DEBUG #ifdef DEBUG
print_buffer(0, recvbuf, 1, *recv_len, 0); print_buffer(0, recvbuf, 1, *recv_len, 0);
#endif #endif
@ -143,6 +134,7 @@ static int tpm_atmel_twi_xfer(struct udevice *dev,
static int tpm_atmel_twi_probe(struct udevice *dev) static int tpm_atmel_twi_probe(struct udevice *dev)
{ {
i2c_set_chip_offset_len(dev, 0);
return 0; return 0;
} }

View file

@ -140,24 +140,27 @@
"echo Fastboot forced by usb rom boot;" \ "echo Fastboot forced by usb rom boot;" \
"setenv run_fastboot 1;" \ "setenv run_fastboot 1;" \
"fi;" \ "fi;" \
"if gpt verify mmc ${mmcdev} ${partitions}; then; " \ "if test \"${run_fastboot}\" -eq 0; then " \
"else " \ "if gpt verify mmc ${mmcdev} ${partitions}; then; " \
"echo Broken MMC partition scheme;" \ "else " \
"setenv run_fastboot 1;" \ "echo Broken MMC partition scheme;" \
"fi;" \
"if bcb load " __stringify(CONFIG_FASTBOOT_FLASH_MMC_DEV) " " \
CONTROL_PARTITION "; then " \
"if bcb test command = bootonce-bootloader; then " \
"echo BCB: Bootloader boot...; " \
"bcb clear command; bcb store; " \
"setenv run_fastboot 1;" \ "setenv run_fastboot 1;" \
"fi; " \ "fi; " \
"if bcb test command = boot-fastboot; then " \ "fi;" \
"echo BCB: fastboot userspace boot...; " \ "if test \"${run_fastboot}\" -eq 0; then " \
"setenv force_recovery 1;" \ "if bcb load " __stringify(CONFIG_FASTBOOT_FLASH_MMC_DEV) " " \
"fi; " \ CONTROL_PARTITION "; then " \
"else " \ "if bcb test command = bootonce-bootloader; then " \
"echo Warning: BCB is corrupted or does not exist; " \ "echo BCB: Bootloader boot...; " \
"bcb clear command; bcb store; " \
"setenv run_fastboot 1;" \
"elif bcb test command = boot-fastboot; then " \
"echo BCB: fastboot userspace boot...; " \
"setenv force_recovery 1;" \
"fi; " \
"else " \
"echo Warning: BCB is corrupted or does not exist; " \
"fi;" \
"fi;" \ "fi;" \
"if test \"${run_fastboot}\" -eq 1; then " \ "if test \"${run_fastboot}\" -eq 1; then " \
"echo Running Fastboot...;" \ "echo Running Fastboot...;" \
@ -230,16 +233,24 @@
"echo Running Android...;" \ "echo Running Android...;" \
BOOT_CMD \ BOOT_CMD \
"fi;" \ "fi;" \
"echo Failed to boot Android...;" \ "echo Failed to boot Android...;\0"
"reset\0"
#define BOOTENV_DEV_NAME_SYSTEM(devtypeu, devtypel, instance) \ #define BOOTENV_DEV_NAME_SYSTEM(devtypeu, devtypel, instance) \
"system " "system "
#define BOOTENV_DEV_PANIC(devtypeu, devtypel, instance) \
"bootcmd_panic=" \
"fastboot " __stringify(CONFIG_FASTBOOT_USB_DEV) "; " \
"reset\0"
#define BOOTENV_DEV_NAME_PANIC(devtypeu, devtypel, instance) \
"panic "
#define BOOT_TARGET_DEVICES(func) \ #define BOOT_TARGET_DEVICES(func) \
func(FASTBOOT, fastboot, na) \ func(FASTBOOT, fastboot, na) \
func(RECOVERY, recovery, na) \ func(RECOVERY, recovery, na) \
func(SYSTEM, system, na) \ func(SYSTEM, system, na) \
func(PANIC, panic, na) \
#define PREBOOT_LOAD_LOGO \ #define PREBOOT_LOAD_LOGO \
"if test \"${boot_source}\" != \"usb\" && " \ "if test \"${boot_source}\" != \"usb\" && " \

View file

@ -52,7 +52,7 @@
/* #define CONFIG_SYS_PCI_64BIT 1 */ /* #define CONFIG_SYS_PCI_64BIT 1 */
#define DEFAULT_DFU_ALT_INFO "dfu_alt_info=" \ #define DEFAULT_DFU_ALT_INFO "dfu_alt_info=" \
"mtd mx66u51235f=u-boot.bin raw 200000 100000;" \ "mtd nor1=u-boot.bin raw 200000 100000;" \
"fip.bin raw 180000 78000;" \ "fip.bin raw 180000 78000;" \
"optee.bin raw 500000 100000\0" "optee.bin raw 500000 100000\0"

View file

@ -2,7 +2,7 @@
/* /*
* Copyright (C) 2013, 2014, 2017 Markus Niebel <Markus.Niebel@tq-group.com> * Copyright (C) 2013, 2014, 2017 Markus Niebel <Markus.Niebel@tq-group.com>
* *
* Configuration settings for the TQ Systems TQMa6<Q,D,DL,S> module. * Configuration settings for the TQ-Systems TQMa6<Q,D,DL,S> module.
*/ */
#ifndef __CONFIG_H #ifndef __CONFIG_H

View file

@ -2,7 +2,7 @@
/* /*
* Copyright (C) 2013 - 2017 Markus Niebel <Markus.Niebel@tq-group.com> * Copyright (C) 2013 - 2017 Markus Niebel <Markus.Niebel@tq-group.com>
* *
* Configuration settings for the TQ Systems TQMa6<Q,D,DL,S> module on * Configuration settings for the TQ-Systems TQMa6<Q,D,DL,S> module on
* MBa6 starter kit * MBa6 starter kit
*/ */

View file

@ -20,8 +20,8 @@
#include <charset.h> #include <charset.h>
#include <pe.h> #include <pe.h>
/* UEFI spec version 2.8 */ /* UEFI spec version 2.9 */
#define EFI_SPECIFICATION_VERSION (2 << 16 | 80) #define EFI_SPECIFICATION_VERSION (2 << 16 | 90)
/* Types and defines for EFI CreateEvent */ /* Types and defines for EFI CreateEvent */
enum efi_timer_delay { enum efi_timer_delay {
@ -360,10 +360,15 @@ struct efi_runtime_services {
}; };
/* EFI event group GUID definitions */ /* EFI event group GUID definitions */
#define EFI_EVENT_GROUP_EXIT_BOOT_SERVICES \ #define EFI_EVENT_GROUP_EXIT_BOOT_SERVICES \
EFI_GUID(0x27abf055, 0xb1b8, 0x4c26, 0x80, 0x48, \ EFI_GUID(0x27abf055, 0xb1b8, 0x4c26, 0x80, 0x48, \
0x74, 0x8f, 0x37, 0xba, 0xa2, 0xdf) 0x74, 0x8f, 0x37, 0xba, 0xa2, 0xdf)
#define EFI_EVENT_GROUP_BEFORE_EXIT_BOOT_SERVICES \
EFI_GUID(0x8be0e274, 0x3970, 0x4b44, 0x80, 0xc5, \
0x1a, 0xb9, 0x50, 0x2f, 0x3b, 0xfc)
#define EFI_EVENT_GROUP_VIRTUAL_ADDRESS_CHANGE \ #define EFI_EVENT_GROUP_VIRTUAL_ADDRESS_CHANGE \
EFI_GUID(0x13fa7698, 0xc831, 0x49c7, 0x87, 0xea, \ EFI_GUID(0x13fa7698, 0xc831, 0x49c7, 0x87, 0xea, \
0x8f, 0x43, 0xfc, 0xc2, 0x51, 0x96) 0x8f, 0x43, 0xfc, 0xc2, 0x51, 0x96)
@ -376,6 +381,10 @@ struct efi_runtime_services {
EFI_GUID(0x7ce88fb3, 0x4bd7, 0x4679, 0x87, 0xa8, \ EFI_GUID(0x7ce88fb3, 0x4bd7, 0x4679, 0x87, 0xa8, \
0xa8, 0xd8, 0xde, 0xe5, 0x0d, 0x2b) 0xa8, 0xd8, 0xde, 0xe5, 0x0d, 0x2b)
#define EFI_EVENT_GROUP_AFTER_READY_TO_BOOT \
EFI_GUID(0x3a2a00ad, 0x98b9, 0x4cdf, 0xa4, 0x78, \
0x70, 0x27, 0x77, 0xf1, 0xc1, 0xb)
#define EFI_EVENT_GROUP_RESET_SYSTEM \ #define EFI_EVENT_GROUP_RESET_SYSTEM \
EFI_GUID(0x62da6a56, 0x13fb, 0x485a, 0xa8, 0xda, \ EFI_GUID(0x62da6a56, 0x13fb, 0x485a, 0xa8, 0xda, \
0xa3, 0xdd, 0x79, 0x12, 0xcb, 0x6b) 0xa3, 0xdd, 0x79, 0x12, 0xcb, 0x6b)
@ -417,6 +426,15 @@ struct efi_runtime_services {
EFI_GUID(0x1e2ed096, 0x30e2, 0x4254, 0xbd, \ EFI_GUID(0x1e2ed096, 0x30e2, 0x4254, 0xbd, \
0x89, 0x86, 0x3b, 0xbe, 0xf8, 0x23, 0x25) 0x89, 0x86, 0x3b, 0xbe, 0xf8, 0x23, 0x25)
/**
* struct efi_configuration_table - EFI Configuration Table
*
* This table contains a set of GUID/pointer pairs.
* The EFI Configuration Table may contain at most one instance of each table type.
*
* @guid: GUID that uniquely identifies the system configuration table
* @table: A pointer to the table associated with guid
*/
struct efi_configuration_table { struct efi_configuration_table {
efi_guid_t guid; efi_guid_t guid;
void *table; void *table;
@ -424,6 +442,29 @@ struct efi_configuration_table {
#define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL) #define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
/**
* struct efi_system_table - EFI System Table
*
* EFI System Table contains pointers to the runtime and boot services tables.
*
* @hdr: The table header for the EFI System Table
* @fw_vendor: A pointer to a null terminated string that identifies the vendor
* that produces the system firmware
* @fw_revision: The revision of the system firmware
* @con_in_handle: The handle for the active console input device
* @con_in: A pointer to the EFI_SIMPLE_TEXT_INPUT_PROTOCOL interface
* that is associated with con_in_handle
* @con_out_handle: The handle for the active console output device
* @con_out: A pointer to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL interface
* that is associated with con_out_handle
* @stderr_handle: The handle for the active standard error console device
* @std_err: A pointer to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL interface
* that is associated with stderr_handle
* @runtime: A pointer to the EFI Runtime Services Table
* @boottime: A pointer to the EFI Boot Services Table
* @nr_tables: The number of system configuration tables
* @tables: A pointer to the system configuration tables
*/
struct efi_system_table { struct efi_system_table {
struct efi_table_hdr hdr; struct efi_table_hdr hdr;
u16 *fw_vendor; /* physical addr of wchar_t vendor string */ u16 *fw_vendor; /* physical addr of wchar_t vendor string */
@ -870,8 +911,8 @@ struct efi_hii_package_list_header {
* @fields: 'fields' replaces the bit-fields defined in the EFI * @fields: 'fields' replaces the bit-fields defined in the EFI
* specification to to avoid possible compiler incompatibilities:: * specification to to avoid possible compiler incompatibilities::
* *
* u32 length:24; * u32 length:24;
* u32 type:8; * u32 type:8;
*/ */
struct efi_hii_package_header { struct efi_hii_package_header {
u32 fields; u32 fields;
@ -1809,7 +1850,7 @@ struct efi_system_resource_table {
0x34, 0x7d, 0x37, 0x56, 0x65, 0xa7) 0x34, 0x7d, 0x37, 0x56, 0x65, 0xa7)
/** /**
* win_certificate_uefi_guid - A certificate that encapsulates * struct win_certificate_uefi_guid - A certificate that encapsulates
* a GUID-specific signature * a GUID-specific signature
* *
* @hdr: Windows certificate header * @hdr: Windows certificate header
@ -1823,7 +1864,7 @@ struct win_certificate_uefi_guid {
} __attribute__((__packed__)); } __attribute__((__packed__));
/** /**
* efi_variable_authentication_2 - A time-based authentication method * struct efi_variable_authentication_2 - A time-based authentication method
* descriptor * descriptor
* *
* This structure describes an authentication information for * This structure describes an authentication information for
@ -1840,7 +1881,7 @@ struct efi_variable_authentication_2 {
} __attribute__((__packed__)); } __attribute__((__packed__));
/** /**
* efi_firmware_image_authentication - Capsule authentication method * struct efi_firmware_image_authentication - Capsule authentication method
* descriptor * descriptor
* *
* This structure describes an authentication information for * This structure describes an authentication information for
@ -1858,7 +1899,7 @@ struct efi_firmware_image_authentication {
/** /**
* efi_signature_data - A format of signature * struct efi_signature_data - A format of signature
* *
* This structure describes a single signature in signature database. * This structure describes a single signature in signature database.
* *
@ -1871,7 +1912,7 @@ struct efi_signature_data {
} __attribute__((__packed__)); } __attribute__((__packed__));
/** /**
* efi_signature_list - A format of signature database * struct efi_signature_list - A format of signature database
* *
* This structure describes a list of signatures with the same type. * This structure describes a list of signatures with the same type.
* An authenticated variable's value is a concatenation of one or more * An authenticated variable's value is a concatenation of one or more

View file

@ -332,6 +332,8 @@ void bdinfo_print_mhz(const char *name, unsigned long hz);
/* Show arch-specific information for the 'bd' command */ /* Show arch-specific information for the 'bd' command */
void arch_print_bdinfo(void); void arch_print_bdinfo(void);
int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
/* Put only stuff here that the assembler can digest */ /* Put only stuff here that the assembler can digest */

View file

@ -25,8 +25,9 @@ enum lmb_flags {
/** /**
* struct lmb_property - Description of one region. * struct lmb_property - Description of one region.
* *
* @base: Base address of the region. * @base: Base address of the region.
* @size: Size of the region * @size: Size of the region
* @flags: memory region attributes
*/ */
struct lmb_property { struct lmb_property {
phys_addr_t base; phys_addr_t base;
@ -73,64 +74,49 @@ struct lmb {
#endif #endif
}; };
extern void lmb_init(struct lmb *lmb); void lmb_init(struct lmb *lmb);
extern void lmb_init_and_reserve(struct lmb *lmb, struct bd_info *bd, void lmb_init_and_reserve(struct lmb *lmb, struct bd_info *bd, void *fdt_blob);
void *fdt_blob); void lmb_init_and_reserve_range(struct lmb *lmb, phys_addr_t base,
extern void lmb_init_and_reserve_range(struct lmb *lmb, phys_addr_t base, phys_size_t size, void *fdt_blob);
phys_size_t size, void *fdt_blob); long lmb_add(struct lmb *lmb, phys_addr_t base, phys_size_t size);
extern long lmb_add(struct lmb *lmb, phys_addr_t base, phys_size_t size); long lmb_reserve(struct lmb *lmb, phys_addr_t base, phys_size_t size);
extern long lmb_reserve(struct lmb *lmb, phys_addr_t base, phys_size_t size);
/** /**
* lmb_reserve_flags - Reserve one region with a specific flags bitfield. * lmb_reserve_flags - Reserve one region with a specific flags bitfield.
* *
* @lmb the logical memory block struct * @lmb: the logical memory block struct
* @base base address of the memory region * @base: base address of the memory region
* @size size of the memory region * @size: size of the memory region
* @flags flags for the memory region * @flags: flags for the memory region
* @return 0 if OK, > 0 for coalesced region or a negative error code. * Return: 0 if OK, > 0 for coalesced region or a negative error code.
*/ */
long lmb_reserve_flags(struct lmb *lmb, phys_addr_t base, long lmb_reserve_flags(struct lmb *lmb, phys_addr_t base,
phys_size_t size, enum lmb_flags flags); phys_size_t size, enum lmb_flags flags);
extern phys_addr_t lmb_alloc(struct lmb *lmb, phys_size_t size, ulong align); phys_addr_t lmb_alloc(struct lmb *lmb, phys_size_t size, ulong align);
extern phys_addr_t lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, phys_addr_t lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align,
phys_addr_t max_addr); phys_addr_t max_addr);
extern phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align,
phys_addr_t max_addr); phys_addr_t max_addr);
extern phys_addr_t lmb_alloc_addr(struct lmb *lmb, phys_addr_t base, phys_addr_t lmb_alloc_addr(struct lmb *lmb, phys_addr_t base, phys_size_t size);
phys_size_t size); phys_size_t lmb_get_free_size(struct lmb *lmb, phys_addr_t addr);
extern phys_size_t lmb_get_free_size(struct lmb *lmb, phys_addr_t addr); int lmb_is_reserved(struct lmb *lmb, phys_addr_t addr);
extern int lmb_is_reserved(struct lmb *lmb, phys_addr_t addr);
/** /**
* lmb_is_reserved_flags - test if tha address is in reserved region with a bitfield flag * lmb_is_reserved_flags - test if tha address is in reserved region with a bitfield flag
* *
* @lmb the logical memory block struct * @lmb: the logical memory block struct
* @addr address to be tested * @addr: address to be tested
* @flags flags bitfied to be tested * @flags: flags bitfied to be tested
* @return 0 if not reserved or reserved without the requested flag else 1 * Return: if not reserved or reserved without the requested flag else 1
*/ */
int lmb_is_reserved_flags(struct lmb *lmb, phys_addr_t addr, int flags); int lmb_is_reserved_flags(struct lmb *lmb, phys_addr_t addr, int flags);
extern long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size); long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size);
extern void lmb_dump_all(struct lmb *lmb); void lmb_dump_all(struct lmb *lmb);
extern void lmb_dump_all_force(struct lmb *lmb); void lmb_dump_all_force(struct lmb *lmb);
static inline phys_size_t
lmb_size_bytes(struct lmb_region *type, unsigned long region_nr)
{
return type->region[region_nr].size;
}
void board_lmb_reserve(struct lmb *lmb); void board_lmb_reserve(struct lmb *lmb);
void arch_lmb_reserve(struct lmb *lmb); void arch_lmb_reserve(struct lmb *lmb);
void arch_lmb_reserve_generic(struct lmb *lmb, ulong sp, ulong end, ulong align); void arch_lmb_reserve_generic(struct lmb *lmb, ulong sp, ulong end, ulong align);
/* Low level functions */
static inline bool lmb_is_nomap(struct lmb_property *m)
{
return m->flags & LMB_NOMAP;
}
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* _LINUX_LMB_H */ #endif /* _LINUX_LMB_H */

View file

@ -793,7 +793,7 @@ config LMB
Support the library logical memory blocks. Support the library logical memory blocks.
config LMB_USE_MAX_REGIONS config LMB_USE_MAX_REGIONS
bool "Use a commun number of memory and reserved regions in lmb lib" bool "Use a common number of memory and reserved regions in lmb lib"
depends on LMB depends on LMB
default y default y
help help

View file

@ -29,6 +29,9 @@ int main(void)
DEFINE(GD_SIZE, sizeof(struct global_data)); DEFINE(GD_SIZE, sizeof(struct global_data));
DEFINE(GD_BD, offsetof(struct global_data, bd)); DEFINE(GD_BD, offsetof(struct global_data, bd));
DEFINE(GD_FLAGS, offsetof(struct global_data, flags));
#if CONFIG_VAL(SYS_MALLOC_F_LEN) #if CONFIG_VAL(SYS_MALLOC_F_LEN)
DEFINE(GD_MALLOC_BASE, offsetof(struct global_data, malloc_base)); DEFINE(GD_MALLOC_BASE, offsetof(struct global_data, malloc_base));
#endif #endif

View file

@ -71,6 +71,9 @@ const efi_guid_t efi_guid_driver_binding_protocol =
/* event group ExitBootServices() invoked */ /* event group ExitBootServices() invoked */
const efi_guid_t efi_guid_event_group_exit_boot_services = const efi_guid_t efi_guid_event_group_exit_boot_services =
EFI_EVENT_GROUP_EXIT_BOOT_SERVICES; EFI_EVENT_GROUP_EXIT_BOOT_SERVICES;
/* event group before ExitBootServices() invoked */
const efi_guid_t efi_guid_event_group_before_exit_boot_services =
EFI_EVENT_GROUP_BEFORE_EXIT_BOOT_SERVICES;
/* event group SetVirtualAddressMap() invoked */ /* event group SetVirtualAddressMap() invoked */
const efi_guid_t efi_guid_event_group_virtual_address_change = const efi_guid_t efi_guid_event_group_virtual_address_change =
EFI_EVENT_GROUP_VIRTUAL_ADDRESS_CHANGE; EFI_EVENT_GROUP_VIRTUAL_ADDRESS_CHANGE;
@ -2123,6 +2126,16 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
if (!systab.boottime) if (!systab.boottime)
goto out; goto out;
/* Notify EFI_EVENT_GROUP_BEFORE_EXIT_BOOT_SERVICES event group. */
list_for_each_entry(evt, &efi_events, link) {
if (evt->group &&
!guidcmp(evt->group,
&efi_guid_event_group_before_exit_boot_services)) {
efi_signal_event(evt);
break;
}
}
/* Stop all timer related activities */ /* Stop all timer related activities */
timers_enabled = false; timers_enabled = false;
@ -2154,6 +2167,7 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
} }
if (!efi_st_keep_devices) { if (!efi_st_keep_devices) {
bootm_disable_interrupts();
if (IS_ENABLED(CONFIG_USB_DEVICE)) if (IS_ENABLED(CONFIG_USB_DEVICE))
udc_disconnect(); udc_disconnect();
board_quiesce_devices(); board_quiesce_devices();
@ -2166,9 +2180,6 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
/* Fix up caches for EFI payloads if necessary */ /* Fix up caches for EFI payloads if necessary */
efi_exit_caches(); efi_exit_caches();
/* This stops all lingering devices */
bootm_disable_interrupts();
/* Disable boot time services */ /* Disable boot time services */
systab.con_in_handle = NULL; systab.con_in_handle = NULL;
systab.con_in = NULL; systab.con_in = NULL;

View file

@ -1037,30 +1037,45 @@ efi_status_t __weak efi_load_capsule_drivers(void)
} }
/** /**
* check_run_capsules - Check whether capsule update should run * check_run_capsules() - check whether capsule update should run
* *
* The spec says OsIndications must be set in order to run the capsule update * The spec says OsIndications must be set in order to run the capsule update
* on-disk. Since U-Boot doesn't support runtime SetVariable, allow capsules to * on-disk. Since U-Boot doesn't support runtime SetVariable, allow capsules to
* run explicitly if CONFIG_EFI_IGNORE_OSINDICATIONS is selected * run explicitly if CONFIG_EFI_IGNORE_OSINDICATIONS is selected
*
* Return: EFI_SUCCESS if update to run, EFI_NOT_FOUND otherwise
*/ */
static bool check_run_capsules(void) static efi_status_t check_run_capsules(void)
{ {
u64 os_indications; u64 os_indications;
efi_uintn_t size; efi_uintn_t size;
efi_status_t ret; efi_status_t r;
if (IS_ENABLED(CONFIG_EFI_IGNORE_OSINDICATIONS))
return true;
size = sizeof(os_indications); size = sizeof(os_indications);
ret = efi_get_variable_int(L"OsIndications", &efi_global_variable_guid, r = efi_get_variable_int(L"OsIndications", &efi_global_variable_guid,
NULL, &size, &os_indications, NULL); NULL, &size, &os_indications, NULL);
if (ret == EFI_SUCCESS && if (r != EFI_SUCCESS || size != sizeof(os_indications))
(os_indications return EFI_NOT_FOUND;
& EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED))
return true;
return false; if (os_indications &
EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED) {
os_indications &=
~EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED;
r = efi_set_variable_int(L"OsIndications",
&efi_global_variable_guid,
EFI_VARIABLE_NON_VOLATILE |
EFI_VARIABLE_BOOTSERVICE_ACCESS |
EFI_VARIABLE_RUNTIME_ACCESS,
sizeof(os_indications),
&os_indications, false);
if (r != EFI_SUCCESS)
log_err("Setting %ls failed\n", L"OsIndications");
return EFI_SUCCESS;
} else if (IS_ENABLED(CONFIG_EFI_IGNORE_OSINDICATIONS)) {
return EFI_SUCCESS;
} else {
return EFI_NOT_FOUND;
}
} }
/** /**
@ -1078,7 +1093,7 @@ efi_status_t efi_launch_capsules(void)
unsigned int nfiles, index, i; unsigned int nfiles, index, i;
efi_status_t ret; efi_status_t ret;
if (!check_run_capsules()) if (check_run_capsules() != EFI_SUCCESS)
return EFI_SUCCESS; return EFI_SUCCESS;
index = get_last_capsule(); index = get_last_capsule();
@ -1108,13 +1123,13 @@ efi_status_t efi_launch_capsules(void)
log_err("Applying capsule %ls failed\n", log_err("Applying capsule %ls failed\n",
files[i]); files[i]);
/* create CapsuleXXXX */
set_capsule_result(index, capsule, ret);
free(capsule); free(capsule);
} else { } else {
log_err("Reading capsule %ls failed\n", files[i]); log_err("Reading capsule %ls failed\n", files[i]);
} }
/* create CapsuleXXXX */
set_capsule_result(index, capsule, ret);
/* delete a capsule either in case of success or failure */ /* delete a capsule either in case of success or failure */
ret = efi_capsule_delete_file(files[i]); ret = efi_capsule_delete_file(files[i]);
if (ret != EFI_SUCCESS) if (ret != EFI_SUCCESS)

View file

@ -424,7 +424,7 @@ static efi_status_t efi_disk_add_dev(
&efi_block_io_guid, &diskobj->ops, &efi_block_io_guid, &diskobj->ops,
guid, NULL, NULL)); guid, NULL, NULL));
if (ret != EFI_SUCCESS) if (ret != EFI_SUCCESS)
return ret; goto error;
/* /*
* On partitions or whole disks without partitions install the * On partitions or whole disks without partitions install the
@ -573,7 +573,7 @@ efi_status_t efi_disk_register(void)
if (ret) { if (ret) {
log_err("ERROR: failure to add disk device %s, r = %lu\n", log_err("ERROR: failure to add disk device %s, r = %lu\n",
dev->name, ret & ~EFI_ERROR_MASK); dev->name, ret & ~EFI_ERROR_MASK);
return ret; continue;
} }
disks++; disks++;

View file

@ -175,36 +175,6 @@ static efi_status_t efi_init_os_indications(void)
} }
/**
* efi_clear_os_indications() - clear OsIndications
*
* Clear EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED
*/
static efi_status_t efi_clear_os_indications(void)
{
efi_uintn_t size;
u64 os_indications;
efi_status_t ret;
size = sizeof(os_indications);
ret = efi_get_variable_int(L"OsIndications", &efi_global_variable_guid,
NULL, &size, &os_indications, NULL);
if (ret != EFI_SUCCESS)
os_indications = 0;
else
os_indications &=
~EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED;
ret = efi_set_variable_int(L"OsIndications", &efi_global_variable_guid,
EFI_VARIABLE_NON_VOLATILE |
EFI_VARIABLE_BOOTSERVICE_ACCESS |
EFI_VARIABLE_RUNTIME_ACCESS,
sizeof(os_indications), &os_indications,
false);
if (ret != EFI_SUCCESS)
log_err("Setting %ls failed\n", L"OsIndications");
return ret;
}
/** /**
* efi_init_obj_list() - Initialize and populate EFI object list * efi_init_obj_list() - Initialize and populate EFI object list
* *
@ -212,7 +182,7 @@ static efi_status_t efi_clear_os_indications(void)
*/ */
efi_status_t efi_init_obj_list(void) efi_status_t efi_init_obj_list(void)
{ {
efi_status_t r, ret = EFI_SUCCESS; efi_status_t ret = EFI_SUCCESS;
/* Initialize once only */ /* Initialize once only */
if (efi_obj_list_initialized != OBJ_LIST_NOT_INITIALIZED) if (efi_obj_list_initialized != OBJ_LIST_NOT_INITIALIZED)
@ -331,11 +301,7 @@ efi_status_t efi_init_obj_list(void)
if (IS_ENABLED(CONFIG_EFI_CAPSULE_ON_DISK) && if (IS_ENABLED(CONFIG_EFI_CAPSULE_ON_DISK) &&
!IS_ENABLED(CONFIG_EFI_CAPSULE_ON_DISK_EARLY)) !IS_ENABLED(CONFIG_EFI_CAPSULE_ON_DISK_EARLY))
ret = efi_launch_capsules(); ret = efi_launch_capsules();
out: out:
r = efi_clear_os_indications();
if (ret == EFI_SUCCESS)
ret = r;
efi_obj_list_initialized = ret; efi_obj_list_initialized = ret;
return ret; return ret;
} }

View file

@ -18,6 +18,7 @@
#include <smbios.h> #include <smbios.h>
#include <version_string.h> #include <version_string.h>
#include <tpm-v2.h> #include <tpm-v2.h>
#include <tpm_api.h>
#include <u-boot/hash-checksum.h> #include <u-boot/hash-checksum.h>
#include <u-boot/sha1.h> #include <u-boot/sha1.h>
#include <u-boot/sha256.h> #include <u-boot/sha256.h>
@ -27,6 +28,17 @@
#include <linux/unaligned/generic.h> #include <linux/unaligned/generic.h>
#include <hexdump.h> #include <hexdump.h>
/**
* struct event_log_buffer - internal eventlog management structure
*
* @buffer: eventlog buffer
* @final_buffer: finalevent config table buffer
* @pos: current position of 'buffer'
* @final_pos: current position of 'final_buffer'
* @get_event_called: true if GetEventLog has been invoked at least once
* @ebs_called: true if ExitBootServices has been invoked
* @truncated: true if the 'buffer' is truncated
*/
struct event_log_buffer { struct event_log_buffer {
void *buffer; void *buffer;
void *final_buffer; void *final_buffer;
@ -34,6 +46,7 @@ struct event_log_buffer {
size_t final_pos; /* final events config table position */ size_t final_pos; /* final events config table position */
size_t last_event_size; size_t last_event_size;
bool get_event_called; bool get_event_called;
bool ebs_called;
bool truncated; bool truncated;
}; };
@ -186,39 +199,29 @@ static efi_status_t tcg2_pcr_extend(struct udevice *dev, u32 pcr_index,
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/* tcg2_agile_log_append - Append an agile event to out eventlog /* put_event - Append an agile event to an eventlog
* *
* @pcr_index: PCR index * @pcr_index: PCR index
* @event_type: type of event added * @event_type: type of event added
* @digest_list: list of digest algorithms to add * @digest_list: list of digest algorithms to add
* @size: size of event * @size: size of event
* @event: event to add * @event: event to add
* @log: log buffer to append the event
* *
* @Return: status code
*/ */
static efi_status_t tcg2_agile_log_append(u32 pcr_index, u32 event_type, static void put_event(u32 pcr_index, u32 event_type,
struct tpml_digest_values *digest_list, struct tpml_digest_values *digest_list, u32 size,
u32 size, u8 event[]) u8 event[], void *log)
{ {
void *log = (void *)((uintptr_t)event_log.buffer + event_log.pos);
size_t pos; size_t pos;
size_t i; size_t i;
u32 event_size; u32 event_size;
if (event_log.get_event_called)
log = (void *)((uintptr_t)event_log.final_buffer +
event_log.final_pos);
/* /*
* size refers to the length of event[] only, we need to check against * size refers to the length of event[] only, we need to check against
* the final tcg_pcr_event2 size * the final tcg_pcr_event2 size
*/ */
event_size = size + tcg_event_final_size(digest_list); event_size = size + tcg_event_final_size(digest_list);
if (event_log.pos + event_size > TPM2_EVENT_LOG_SIZE ||
event_log.final_pos + event_size > TPM2_EVENT_LOG_SIZE) {
event_log.truncated = true;
return EFI_VOLUME_FULL;
}
put_unaligned_le32(pcr_index, log); put_unaligned_le32(pcr_index, log);
pos = offsetof(struct tcg_pcr_event2, event_type); pos = offsetof(struct tcg_pcr_event2, event_type);
@ -242,25 +245,62 @@ static efi_status_t tcg2_agile_log_append(u32 pcr_index, u32 event_type,
memcpy((void *)((uintptr_t)log + pos), event, size); memcpy((void *)((uintptr_t)log + pos), event, size);
pos += size; pos += size;
/* make sure the calculated buffer is what we checked against */ /*
* make sure the calculated buffer is what we checked against
* This check should never fail. It checks the code above is
* calculating the right length for the event we are adding
*/
if (pos != event_size) if (pos != event_size)
return EFI_INVALID_PARAMETER; log_err("Appending to the EventLog failed\n");
}
/* if GetEventLog hasn't been called update the normal log */ /* tcg2_agile_log_append - Append an agile event to an eventlog
if (!event_log.get_event_called) { *
event_log.pos += pos; * @pcr_index: PCR index
event_log.last_event_size = pos; * @event_type: type of event added
} else { * @digest_list: list of digest algorithms to add
/* if GetEventLog has been called update config table log */ * @size: size of event
struct efi_tcg2_final_events_table *final_event; * @event: event to add
* @log: log buffer to append the event
*
* @Return: status code
*/
static efi_status_t tcg2_agile_log_append(u32 pcr_index, u32 event_type,
struct tpml_digest_values *digest_list,
u32 size, u8 event[])
{
void *log = (void *)((uintptr_t)event_log.buffer + event_log.pos);
u32 event_size = size + tcg_event_final_size(digest_list);
struct efi_tcg2_final_events_table *final_event;
efi_status_t ret = EFI_SUCCESS;
final_event = /* if ExitBootServices hasn't been called update the normal log */
(struct efi_tcg2_final_events_table *)(event_log.final_buffer); if (!event_log.ebs_called) {
final_event->number_of_events++; if (event_log.truncated ||
event_log.final_pos += pos; event_log.pos + event_size > TPM2_EVENT_LOG_SIZE) {
event_log.truncated = true;
return EFI_VOLUME_FULL;
}
put_event(pcr_index, event_type, digest_list, size, event, log);
event_log.pos += event_size;
event_log.last_event_size = event_size;
} }
return EFI_SUCCESS; if (!event_log.get_event_called)
return ret;
/* if GetEventLog has been called update FinalEventLog as well */
if (event_log.final_pos + event_size > TPM2_EVENT_LOG_SIZE)
return EFI_VOLUME_FULL;
log = (void *)((uintptr_t)event_log.final_buffer + event_log.final_pos);
put_event(pcr_index, event_type, digest_list, size, event, log);
final_event = event_log.final_buffer;
final_event->number_of_events++;
event_log.final_pos += event_size;
return ret;
} }
/** /**
@ -1303,6 +1343,7 @@ static efi_status_t efi_init_event_log(void)
event_log.pos = 0; event_log.pos = 0;
event_log.last_event_size = 0; event_log.last_event_size = 0;
event_log.get_event_called = false; event_log.get_event_called = false;
event_log.ebs_called = false;
event_log.truncated = false; event_log.truncated = false;
/* /*
@ -1472,7 +1513,7 @@ static efi_status_t tcg2_measure_boot_variable(struct udevice *dev)
&var_data_size); &var_data_size);
if (!bootvar) { if (!bootvar) {
log_info("%ls not found\n", boot_name); log_debug("%ls not found\n", boot_name);
continue; continue;
} }
@ -1792,6 +1833,7 @@ efi_tcg2_notify_exit_boot_services(struct efi_event *event, void *context)
EFI_ENTRY("%p, %p", event, context); EFI_ENTRY("%p, %p", event, context);
event_log.ebs_called = true;
ret = platform_get_tpm2_device(&dev); ret = platform_get_tpm2_device(&dev);
if (ret != EFI_SUCCESS) if (ret != EFI_SUCCESS)
goto out; goto out;
@ -1902,6 +1944,7 @@ efi_status_t efi_tcg2_register(void)
efi_status_t ret = EFI_SUCCESS; efi_status_t ret = EFI_SUCCESS;
struct udevice *dev; struct udevice *dev;
struct efi_event *event; struct efi_event *event;
u32 err;
ret = platform_get_tpm2_device(&dev); ret = platform_get_tpm2_device(&dev);
if (ret != EFI_SUCCESS) { if (ret != EFI_SUCCESS) {
@ -1909,6 +1952,13 @@ efi_status_t efi_tcg2_register(void)
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/* initialize the TPM as early as possible. */
err = tpm_startup(dev, TPM_ST_CLEAR);
if (err) {
log_err("TPM startup failed\n");
goto fail;
}
ret = efi_init_event_log(); ret = efi_init_event_log();
if (ret != EFI_SUCCESS) if (ret != EFI_SUCCESS)
goto fail; goto fail;

View file

@ -10,9 +10,34 @@
#include <efi_selftest.h> #include <efi_selftest.h>
static efi_guid_t guid_before_exit_boot_services =
EFI_GUID(0x8be0e274, 0x3970, 0x4b44, 0x80, 0xc5,
0x1a, 0xb9, 0x50, 0x2f, 0x3b, 0xfc);
#define CAPACITY 4
struct notification_record {
unsigned int count;
unsigned int type[CAPACITY];
};
struct notification_context {
struct notification_record *record;
unsigned int type;
};
static struct efi_boot_services *boottime; static struct efi_boot_services *boottime;
static struct efi_event *event_notify; static struct efi_event *event_notify;
static unsigned int notification_count; struct notification_record record;
struct notification_context context_before = {
.record = &record,
.type = 1,
};
struct notification_context context = {
.record = &record,
.type = 2,
};
/* /*
* Notification function, increments the notification count. * Notification function, increments the notification count.
@ -20,11 +45,15 @@ static unsigned int notification_count;
* @event notified event * @event notified event
* @context pointer to the notification count * @context pointer to the notification count
*/ */
static void EFIAPI notify(struct efi_event *event, void *context) static void EFIAPI ebs_notify(struct efi_event *event, void *context)
{ {
unsigned int *count = context; struct notification_context *ctx = context;
++*count; if (ctx->record->count >= CAPACITY)
return;
ctx->record->type[ctx->record->count] = ctx->type;
ctx->record->count++;
} }
/* /*
@ -43,15 +72,23 @@ static int setup(const efi_handle_t handle,
boottime = systable->boottime; boottime = systable->boottime;
notification_count = 0;
ret = boottime->create_event(EVT_SIGNAL_EXIT_BOOT_SERVICES, ret = boottime->create_event(EVT_SIGNAL_EXIT_BOOT_SERVICES,
TPL_CALLBACK, notify, TPL_CALLBACK, ebs_notify,
(void *)&notification_count, &context,
&event_notify); &event_notify);
if (ret != EFI_SUCCESS) { if (ret != EFI_SUCCESS) {
efi_st_error("could not create event\n"); efi_st_error("could not create event\n");
return EFI_ST_FAILURE; return EFI_ST_FAILURE;
} }
ret = boottime->create_event_ex(0, TPL_CALLBACK, ebs_notify,
&context_before,
&guid_before_exit_boot_services,
&event_notify);
if (ret != EFI_SUCCESS) {
efi_st_error("could not create event\n");
return EFI_ST_FAILURE;
}
return EFI_ST_SUCCESS; return EFI_ST_SUCCESS;
} }
@ -68,13 +105,21 @@ static int setup(const efi_handle_t handle,
*/ */
static int execute(void) static int execute(void)
{ {
if (notification_count != 1) { if (record.count != 2) {
efi_st_error("ExitBootServices was not notified\n"); efi_st_error("Incorrect event count %u\n", record.count);
return EFI_ST_FAILURE;
}
if (record.type[0] != 1) {
efi_st_error("EFI_GROUP_BEFORE_EXIT_BOOT_SERVICE not notified\n");
return EFI_ST_FAILURE;
}
if (record.type[1] != 2) {
efi_st_error("EVT_SIGNAL_EXIT_BOOT_SERVICES was not notified\n");
return EFI_ST_FAILURE; return EFI_ST_FAILURE;
} }
efi_st_exit_boot_services(); efi_st_exit_boot_services();
if (notification_count != 1) { if (record.count != 2) {
efi_st_error("ExitBootServices was notified twice\n"); efi_st_error("Incorrect event count %u\n", record.count);
return EFI_ST_FAILURE; return EFI_ST_FAILURE;
} }
return EFI_ST_SUCCESS; return EFI_ST_SUCCESS;

View file

@ -23,23 +23,24 @@ static const char *fdt;
static const efi_guid_t fdt_guid = EFI_FDT_GUID; static const efi_guid_t fdt_guid = EFI_FDT_GUID;
static const efi_guid_t acpi_guid = EFI_ACPI_TABLE_GUID; static const efi_guid_t acpi_guid = EFI_ACPI_TABLE_GUID;
/* /**
* Convert FDT value to host endianness. * f2h() - convert FDT value to host endianness.
* *
* @val FDT value * UEFI code is always low endian. The FDT is big endian.
* @return converted value *
* @val: FDT value
* Return: converted value
*/ */
static uint32_t f2h(fdt32_t val) static uint32_t f2h(fdt32_t val)
{ {
char *buf = (char *)&val; char *buf = (char *)&val;
char i; char i;
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
/* Swap the bytes */ /* Swap the bytes */
i = buf[0]; buf[0] = buf[3]; buf[3] = i; i = buf[0]; buf[0] = buf[3]; buf[3] = i;
i = buf[1]; buf[1] = buf[2]; buf[2] = i; i = buf[1]; buf[1] = buf[2]; buf[2] = i;
#endif
return *(uint32_t *)buf; return val;
} }
/** /**

View file

@ -13,6 +13,7 @@
#include <malloc.h> #include <malloc.h>
#include <asm/global_data.h> #include <asm/global_data.h>
#include <asm/sections.h>
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
@ -144,6 +145,10 @@ void arch_lmb_reserve_generic(struct lmb *lmb, ulong sp, ulong end, ulong align)
bank_end = end - 1; bank_end = end - 1;
lmb_reserve(lmb, sp, bank_end - sp + 1); lmb_reserve(lmb, sp, bank_end - sp + 1);
if (gd->flags & GD_FLG_SKIP_RELOC)
lmb_reserve(lmb, (phys_addr_t)(uintptr_t)_start, gd->mon_len);
break; break;
} }
} }

View file

@ -840,7 +840,7 @@ u32 tpm1_find_key_sha1(struct udevice *dev, const u8 auth[20],
unsigned int i; unsigned int i;
/* fetch list of already loaded keys in the TPM */ /* fetch list of already loaded keys in the TPM */
err = tpm_get_capability(dev, TPM_CAP_HANDLE, TPM_RT_KEY, buf, err = tpm1_get_capability(dev, TPM_CAP_HANDLE, TPM_RT_KEY, buf,
sizeof(buf)); sizeof(buf));
if (err) if (err)
return -1; return -1;
@ -852,7 +852,7 @@ u32 tpm1_find_key_sha1(struct udevice *dev, const u8 auth[20],
/* now search a(/ the) key which we can access with the given auth */ /* now search a(/ the) key which we can access with the given auth */
for (i = 0; i < key_count; ++i) { for (i = 0; i < key_count; ++i) {
buf_len = sizeof(buf); buf_len = sizeof(buf);
err = tpm_get_pub_key_oiap(key_handles[i], auth, buf, &buf_len); err = tpm1_get_pub_key_oiap(dev, key_handles[i], auth, buf, &buf_len);
if (err && err != TPM_AUTHFAIL) if (err && err != TPM_AUTHFAIL)
return -1; return -1;
if (err) if (err)

View file

@ -61,7 +61,7 @@ quiet_cmd_autoconf = GEN $@
if [ -n "${KCONFIG_IGNORE_DUPLICATES}" ] || \ if [ -n "${KCONFIG_IGNORE_DUPLICATES}" ] || \
! grep -q "$${line%=*}=" include/config/auto.conf; then \ ! grep -q "$${line%=*}=" include/config/auto.conf; then \
echo "$$line"; \ echo "$$line"; \
fi \ fi; \
done > $@ done > $@
quiet_cmd_u_boot_cfg = CFG $@ quiet_cmd_u_boot_cfg = CFG $@

File diff suppressed because it is too large Load diff

View file

@ -12,6 +12,11 @@
#include <test/test.h> #include <test/test.h>
#include <test/ut.h> #include <test/ut.h>
static inline bool lmb_is_nomap(struct lmb_property *m)
{
return m->flags & LMB_NOMAP;
}
static int check_lmb(struct unit_test_state *uts, struct lmb *lmb, static int check_lmb(struct unit_test_state *uts, struct lmb *lmb,
phys_addr_t ram_base, phys_size_t ram_size, phys_addr_t ram_base, phys_size_t ram_size,
unsigned long num_reserved, unsigned long num_reserved,

View file

@ -31,6 +31,7 @@ static int print_guid(struct unit_test_state *uts)
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
}; };
char str[40]; char str[40];
int ret;
sprintf(str, "%pUb", guid); sprintf(str, "%pUb", guid);
ut_assertok(strcmp("01020304-0506-0708-090a-0b0c0d0e0f10", str)); ut_assertok(strcmp("01020304-0506-0708-090a-0b0c0d0e0f10", str));
@ -40,6 +41,9 @@ static int print_guid(struct unit_test_state *uts)
ut_assertok(strcmp("04030201-0605-0807-090a-0b0c0d0e0f10", str)); ut_assertok(strcmp("04030201-0605-0807-090a-0b0c0d0e0f10", str));
sprintf(str, "%pUL", guid); sprintf(str, "%pUL", guid);
ut_assertok(strcmp("04030201-0605-0807-090A-0B0C0D0E0F10", str)); ut_assertok(strcmp("04030201-0605-0807-090A-0B0C0D0E0F10", str));
ret = snprintf(str, 4, "%pUL", guid);
ut_asserteq(0, str[3]);
ut_asserteq(36, ret);
return 0; return 0;
} }
@ -349,6 +353,20 @@ static int print_itoa(struct unit_test_state *uts)
} }
PRINT_TEST(print_itoa, 0); PRINT_TEST(print_itoa, 0);
static int snprint(struct unit_test_state *uts)
{
char buf[10] = "xxxxxxxxx";
int ret;
ret = snprintf(buf, 4, "%s:%s", "abc", "def");
ut_asserteq(0, buf[3]);
ut_asserteq(7, ret);
ret = snprintf(buf, 4, "%s:%d", "abc", 9999);
ut_asserteq(8, ret);
return 0;
}
PRINT_TEST(snprint, 0);
static int print_xtoa(struct unit_test_state *uts) static int print_xtoa(struct unit_test_state *uts)
{ {
ut_asserteq_str("7f", simple_xtoa(127)); ut_asserteq_str("7f", simple_xtoa(127));

View file

@ -2,8 +2,10 @@
# Copyright (c) 2015 Stephen Warren # Copyright (c) 2015 Stephen Warren
# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved. # Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
# Generate an HTML-formatted log file containing multiple streams of data, """
# each represented in a well-delineated/-structured fashion. Generate an HTML-formatted log file containing multiple streams of data,
each represented in a well-delineated/-structured fashion.
"""
import datetime import datetime
import html import html
@ -180,7 +182,7 @@ class RunAndLog(object):
raise exception raise exception
return output return output
class SectionCtxMgr(object): class SectionCtxMgr:
"""A context manager for Python's "with" statement, which allows a certain """A context manager for Python's "with" statement, which allows a certain
portion of test code to be logged to a separate section of the log file. portion of test code to be logged to a separate section of the log file.
Objects of this type should be created by factory functions in the Logfile Objects of this type should be created by factory functions in the Logfile
@ -208,7 +210,7 @@ class SectionCtxMgr(object):
def __exit__(self, extype, value, traceback): def __exit__(self, extype, value, traceback):
self.log.end_section(self.marker) self.log.end_section(self.marker)
class Logfile(object): class Logfile:
"""Generates an HTML-formatted log file containing multiple streams of """Generates an HTML-formatted log file containing multiple streams of
data, each represented in a well-delineated/-structured fashion.""" data, each represented in a well-delineated/-structured fashion."""
@ -322,8 +324,8 @@ $(document).ready(function () {
# The set of characters that should be represented as hexadecimal codes in # The set of characters that should be represented as hexadecimal codes in
# the log file. # the log file.
_nonprint = {ord('%')} _nonprint = {ord('%')}
_nonprint.update({c for c in range(0, 32) if c not in (9, 10)}) _nonprint.update(c for c in range(0, 32) if c not in (9, 10))
_nonprint.update({c for c in range(127, 256)}) _nonprint.update(range(127, 256))
def _escape(self, data): def _escape(self, data):
"""Render data format suitable for inclusion in an HTML document. """Render data format suitable for inclusion in an HTML document.

View file

@ -6,9 +6,6 @@
# Test efi loader implementation # Test efi loader implementation
import pytest
import u_boot_utils
""" """
Note: This test relies on boardenv_* containing configuration values to define Note: This test relies on boardenv_* containing configuration values to define
which network environment is available for testing. Without this, the parts which network environment is available for testing. Without this, the parts
@ -50,6 +47,9 @@ env__efi_loader_helloworld_file = {
} }
""" """
import pytest
import u_boot_utils
net_set_up = False net_set_up = False
def test_efi_pre_commands(u_boot_console): def test_efi_pre_commands(u_boot_console):
@ -80,7 +80,7 @@ def test_efi_setup_dhcp(u_boot_console):
env_vars = u_boot_console.config.env.get('env__net_static_env_vars', None) env_vars = u_boot_console.config.env.get('env__net_static_env_vars', None)
if not env_vars: if not env_vars:
pytest.skip('No DHCP server available') pytest.skip('No DHCP server available')
return None return
u_boot_console.run_command('setenv autoload no') u_boot_console.run_command('setenv autoload no')
output = u_boot_console.run_command('dhcp') output = u_boot_console.run_command('dhcp')
@ -193,7 +193,7 @@ def test_efi_grub_net(u_boot_console):
check_smbios = u_boot_console.config.env.get('env__efi_loader_check_smbios', False) check_smbios = u_boot_console.config.env.get('env__efi_loader_check_smbios', False)
if check_smbios: if check_smbios:
u_boot_console.wait_for('grub>') u_boot_console.wait_for('grub>')
output = u_boot_console.run_command('lsefisystab', wait_for_prompt=False, wait_for_echo=False) u_boot_console.run_command('lsefisystab', wait_for_prompt=False, wait_for_echo=False)
u_boot_console.wait_for('SMBIOS') u_boot_console.wait_for('SMBIOS')
# Then exit cleanly # Then exit cleanly

View file

@ -73,8 +73,7 @@ def test_efi_selftest_text_input(u_boot_console):
This function calls the text input EFI selftest. This function calls the text input EFI selftest.
""" """
u_boot_console.run_command(cmd='setenv efi_selftest text input') u_boot_console.run_command(cmd='setenv efi_selftest text input')
output = u_boot_console.run_command(cmd='bootefi selftest', u_boot_console.run_command(cmd='bootefi selftest', wait_for_prompt=False)
wait_for_prompt=False)
m = u_boot_console.p.expect([r'To terminate type \'x\'']) m = u_boot_console.p.expect([r'To terminate type \'x\''])
if m != 0: if m != 0:
raise Exception('No prompt for \'text input\' test') raise Exception('No prompt for \'text input\' test')
@ -143,8 +142,7 @@ def test_efi_selftest_text_input_ex(u_boot_console):
This function calls the extended text input EFI selftest. This function calls the extended text input EFI selftest.
""" """
u_boot_console.run_command(cmd='setenv efi_selftest extended text input') u_boot_console.run_command(cmd='setenv efi_selftest extended text input')
output = u_boot_console.run_command(cmd='bootefi selftest', u_boot_console.run_command(cmd='bootefi selftest', wait_for_prompt=False)
wait_for_prompt=False)
m = u_boot_console.p.expect([r'To terminate type \'CTRL\+x\'']) m = u_boot_console.p.expect([r'To terminate type \'CTRL\+x\''])
if m != 0: if m != 0:
raise Exception('No prompt for \'text input\' test') raise Exception('No prompt for \'text input\' test')

View file

@ -2,8 +2,10 @@
# Copyright (c) 2015 Stephen Warren # Copyright (c) 2015 Stephen Warren
# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved. # Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
# Logic to interact with U-Boot running on real hardware, typically via a """
# physical serial port. Logic to interact with U-Boot running on real hardware, typically via a
physical serial port.
"""
import sys import sys
from u_boot_spawn import Spawn from u_boot_spawn import Spawn

View file

@ -2,7 +2,9 @@
# Copyright (c) 2015 Stephen Warren # Copyright (c) 2015 Stephen Warren
# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved. # Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
# Logic to interact with the sandbox port of U-Boot, running as a sub-process. """
Logic to interact with the sandbox port of U-Boot, running as a sub-process.
"""
import time import time
from u_boot_spawn import Spawn from u_boot_spawn import Spawn

View file

@ -1,7 +1,9 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved. # Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
# Logic to spawn a sub-process and interact with its stdio. """
Logic to spawn a sub-process and interact with its stdio.
"""
import os import os
import re import re
@ -9,12 +11,12 @@ import pty
import signal import signal
import select import select
import time import time
import traceback
class Timeout(Exception): class Timeout(Exception):
"""An exception sub-class that indicates that a timeout occurred.""" """An exception sub-class that indicates that a timeout occurred."""
pass
class Spawn(object): class Spawn:
"""Represents the stdio of a freshly created sub-process. Commands may be """Represents the stdio of a freshly created sub-process. Commands may be
sent to the process, and responses waited for. sent to the process, and responses waited for.
@ -58,14 +60,14 @@ class Spawn(object):
os.execvp(args[0], args) os.execvp(args[0], args)
except: except:
print('CHILD EXECEPTION:') print('CHILD EXECEPTION:')
import traceback
traceback.print_exc() traceback.print_exc()
finally: finally:
os._exit(255) os._exit(255)
try: try:
self.poll = select.poll() self.poll = select.poll()
self.poll.register(self.fd, select.POLLIN | select.POLLPRI | select.POLLERR | select.POLLHUP | select.POLLNVAL) self.poll.register(self.fd, select.POLLIN | select.POLLPRI | select.POLLERR |
select.POLLHUP | select.POLLNVAL)
except: except:
self.close() self.close()
raise raise
@ -106,7 +108,7 @@ class Spawn(object):
elif os.WIFSIGNALED(status): elif os.WIFSIGNALED(status):
signum = os.WTERMSIG(status) signum = os.WTERMSIG(status)
self.exit_code = -signum self.exit_code = -signum
self.exit_info = 'signal %d (%s)' % (signum, signal.Signals(signum)) self.exit_info = 'signal %d (%s)' % (signum, signal.Signals(signum).name)
self.waited = True self.waited = True
return False, self.exit_code, self.exit_info return False, self.exit_code, self.exit_info
@ -196,13 +198,11 @@ class Spawn(object):
# shouldn't and explain why. This is much more friendly than # shouldn't and explain why. This is much more friendly than
# just dying with an I/O error # just dying with an I/O error
if err.errno == 5: # Input/output error if err.errno == 5: # Input/output error
alive, exit_code, info = self.checkalive() alive, _, info = self.checkalive()
if alive: if alive:
raise raise err
else: raise ValueError('U-Boot exited with %s' % info)
raise ValueError('U-Boot exited with %s' % info) raise err
else:
raise
if self.logfile_read: if self.logfile_read:
self.logfile_read.write(c) self.logfile_read.write(c)
self.buf += c self.buf += c
@ -227,7 +227,7 @@ class Spawn(object):
""" """
os.close(self.fd) os.close(self.fd)
for i in range(100): for _ in range(100):
if not self.isalive(): if not self.isalive():
break break
time.sleep(0.1) time.sleep(0.1)

View file

@ -1,17 +1,20 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved. # Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
# Utility code shared across multiple tests. """
Utility code shared across multiple tests.
"""
import hashlib import hashlib
import inspect import inspect
import os import os
import os.path import os.path
import pytest import pathlib
import signal import signal
import sys import sys
import time import time
import re import re
import pytest
def md5sum_data(data): def md5sum_data(data):
"""Calculate the MD5 hash of some data. """Calculate the MD5 hash of some data.
@ -48,7 +51,7 @@ def md5sum_file(fn, max_length=None):
data = fh.read(*params) data = fh.read(*params)
return md5sum_data(data) return md5sum_data(data)
class PersistentRandomFile(object): class PersistentRandomFile:
"""Generate and store information about a persistent file containing """Generate and store information about a persistent file containing
random data.""" random data."""
@ -144,7 +147,7 @@ def wait_until_file_open_fails(fn, ignore_errors):
Nothing. Nothing.
""" """
for i in range(100): for _ in range(100):
fh = attempt_to_open_file(fn) fh = attempt_to_open_file(fn)
if not fh: if not fh:
return return
@ -193,9 +196,9 @@ def run_and_log_expect_exception(u_boot_console, cmd, retcode, msg):
try: try:
runner = u_boot_console.log.get_runner(cmd[0], sys.stdout) runner = u_boot_console.log.get_runner(cmd[0], sys.stdout)
runner.run(cmd) runner.run(cmd)
except Exception as e: except Exception:
assert(retcode == runner.exit_status) assert retcode == runner.exit_status
assert(msg in runner.output) assert msg in runner.output
else: else:
raise Exception("Expected an exception with retcode %d message '%s'," raise Exception("Expected an exception with retcode %d message '%s',"
"but it was not raised" % (retcode, msg)) "but it was not raised" % (retcode, msg))
@ -280,17 +283,17 @@ class PersistentFileHelperCtxMgr(object):
if filename_timestamp < self.module_timestamp: if filename_timestamp < self.module_timestamp:
self.log.action('Removing stale generated file ' + self.log.action('Removing stale generated file ' +
self.filename) self.filename)
os.unlink(self.filename) pathlib.Path(self.filename).unlink()
def __exit__(self, extype, value, traceback): def __exit__(self, extype, value, traceback):
if extype: if extype:
try: try:
os.path.unlink(self.filename) pathlib.Path(self.filename).unlink()
except: except Exception:
pass pass
return return
logged = False logged = False
for i in range(20): for _ in range(20):
filename_timestamp = os.path.getmtime(self.filename) filename_timestamp = os.path.getmtime(self.filename)
if filename_timestamp > self.module_timestamp: if filename_timestamp > self.module_timestamp:
break break

View file

@ -63,7 +63,7 @@ int main(int argc, char **argv)
{ {
FILE *f; FILE *f;
int i, num; int i, num;
uint64_t rela_start, rela_end, text_base; uint64_t rela_start, rela_end, text_base, file_size;
if (argc != 5) { if (argc != 5) {
fprintf(stderr, "Statically apply ELF rela relocations\n"); fprintf(stderr, "Statically apply ELF rela relocations\n");
@ -87,8 +87,7 @@ int main(int argc, char **argv)
return 3; return 3;
} }
if (rela_start > rela_end || rela_start < text_base || if (rela_start > rela_end || rela_start < text_base) {
(rela_end - rela_start) % sizeof(Elf64_Rela)) {
fprintf(stderr, "%s: bad rela bounds\n", argv[0]); fprintf(stderr, "%s: bad rela bounds\n", argv[0]);
return 3; return 3;
} }
@ -96,6 +95,21 @@ int main(int argc, char **argv)
rela_start -= text_base; rela_start -= text_base;
rela_end -= text_base; rela_end -= text_base;
fseek(f, 0, SEEK_END);
file_size = ftell(f);
rewind(f);
if (rela_end > file_size) {
// Most likely compiler inserted some section that didn't get
// objcopy-ed into the final binary
rela_end = file_size;
}
if ((rela_end - rela_start) % sizeof(Elf64_Rela)) {
fprintf(stderr, "%s: rela size isn't a multiple of Elf64_Rela\n", argv[0]);
return 3;
}
num = (rela_end - rela_start) / sizeof(Elf64_Rela); num = (rela_end - rela_start) / sizeof(Elf64_Rela);
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {