Merge branch '2018-12-03-master-imports'

- Baltos platform updates
- rtc m41t62 converted to DM.
- PowerPC MPC8xx DM conversion
- Verified boot updates
This commit is contained in:
Tom Rini 2018-12-03 16:23:03 -05:00
commit cf7c6f5333
48 changed files with 1343 additions and 304 deletions

View File

@ -290,6 +290,14 @@ config FIT_SIGNATURE_MAX_SIZE
device memory. Assure this size does not extend past expected storage device memory. Assure this size does not extend past expected storage
space. space.
config FIT_ENABLE_RSASSA_PSS_SUPPORT
bool "Support rsassa-pss signature scheme of FIT image contents"
depends on FIT_SIGNATURE
default n
help
Enable this to support the pss padding algorithm as described
in the rfc8017 (https://tools.ietf.org/html/rfc8017).
config FIT_VERBOSE config FIT_VERBOSE
bool "Show verbose messages when FIT images fail" bool "Show verbose messages when FIT images fail"
help help

View File

@ -0,0 +1,439 @@
/*
* Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
/*
* VScom OnRISC
* http://www.vscom.de
*/
/dts-v1/;
#include "am33xx.dtsi"
#include <dt-bindings/pwm/pwm.h>
/ {
model = "OnRISC Baltos";
compatible = "vscom,onrisc", "ti,am33xx";
chosen {
stdout-path = &uart0;
};
cpus {
cpu@0 {
cpu0-supply = <&vdd1_reg>;
};
};
vbat: fixedregulator@0 {
compatible = "regulator-fixed";
regulator-name = "vbat";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
regulator-boot-on;
};
};
&am33xx_pinmux {
mmc1_pins: pinmux_mmc1_pins {
pinctrl-single,pins = <
0xf0 (MUX_MODE0 | INPUT_EN | PULL_UP) /* mmc0_dat3.mmc0_dat3 */
0xf4 (MUX_MODE0 | INPUT_EN | PULL_UP) /* mmc0_dat2.mmc0_dat2 */
0xf8 (MUX_MODE0 | INPUT_EN | PULL_UP) /* mmc0_dat1.mmc0_dat1 */
0xfc (MUX_MODE0 | INPUT_EN | PULL_UP) /* mmc0_dat0.mmc0_dat0 */
0x100 (MUX_MODE0 | INPUT_EN | PULL_UP) /* mmc0_clk.mmc0_clk */
0x104 (MUX_MODE0 | INPUT_EN | PULL_UP) /* mmc0_cmd.mmc0_cmd */
>;
};
i2c1_pins: pinmux_i2c1_pins {
pinctrl-single,pins = <
0x158 0x2a /* spi0_d1.i2c1_sda_mux3, INPUT | MODE2 */
0x15c 0x2a /* spi0_cs0.i2c1_scl_mux3, INPUT | MODE2 */
>;
};
tps65910_pins: pinmux_tps65910_pins {
pinctrl-single,pins = <
0x078 (PIN_INPUT_PULLUP | MUX_MODE7) /* gpmc_ben1.gpio1[28] */
>;
};
tca6416_pins: pinmux_tca6416_pins {
pinctrl-single,pins = <
AM33XX_IOPAD(0x9b4, PIN_INPUT_PULLUP | MUX_MODE7) /* xdma_event_intr1.gpio0[20] tca6416 stuff */
>;
};
uart0_pins: pinmux_uart0_pins {
pinctrl-single,pins = <
0x170 (PIN_INPUT_PULLUP | MUX_MODE0) /* uart0_rxd.uart0_rxd */
0x174 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* uart0_txd.uart0_txd */
>;
};
cpsw_default: cpsw_default {
pinctrl-single,pins = <
/* Slave 1 */
0x10c (PIN_INPUT_PULLDOWN | MUX_MODE1) /* mii1_crs.rmii1_crs_dv */
0x114 (PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* mii1_tx_en.rmii1_txen */
0x124 (PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* mii1_txd1.rmii1_txd1 */
0x128 (PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* mii1_txd0.rmii1_txd0 */
0x13c (PIN_INPUT_PULLDOWN | MUX_MODE1) /* mii1_rxd1.rmii1_rxd1 */
0x140 (PIN_INPUT_PULLDOWN | MUX_MODE1) /* mii1_rxd0.rmii1_rxd0 */
0x144 (PIN_INPUT_PULLDOWN | MUX_MODE0) /* rmii1_ref_clk.rmii1_refclk */
/* Slave 2 */
0x40 (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* gpmc_a0.rgmii2_tctl */
0x44 (PIN_INPUT_PULLDOWN | MUX_MODE2) /* gpmc_a1.rgmii2_rctl */
0x48 (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* gpmc_a2.rgmii2_td3 */
0x4c (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* gpmc_a3.rgmii2_td2 */
0x50 (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* gpmc_a4.rgmii2_td1 */
0x54 (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* gpmc_a5.rgmii2_td0 */
0x58 (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* gpmc_a6.rgmii2_tclk */
0x5c (PIN_INPUT_PULLDOWN | MUX_MODE2) /* gpmc_a7.rgmii2_rclk */
0x60 (PIN_INPUT_PULLDOWN | MUX_MODE2) /* gpmc_a8.rgmii2_rd3 */
0x64 (PIN_INPUT_PULLDOWN | MUX_MODE2) /* gpmc_a9.rgmii2_rd2 */
0x68 (PIN_INPUT_PULLDOWN | MUX_MODE2) /* gpmc_a10.rgmii2_rd1 */
0x6c (PIN_INPUT_PULLDOWN | MUX_MODE2) /* gpmc_a11.rgmii2_rd0 */
>;
};
cpsw_sleep: cpsw_sleep {
pinctrl-single,pins = <
/* Slave 1 reset value */
0x10c (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x114 (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x124 (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x128 (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x13c (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x140 (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x144 (PIN_INPUT_PULLDOWN | MUX_MODE7)
/* Slave 2 reset value*/
0x40 (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x44 (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x48 (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x4c (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x50 (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x54 (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x58 (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x5c (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x60 (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x64 (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x68 (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x6c (PIN_INPUT_PULLDOWN | MUX_MODE7)
>;
};
davinci_mdio_default: davinci_mdio_default {
pinctrl-single,pins = <
/* MDIO */
0x148 (PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0) /* mdio_data.mdio_data */
0x14c (PIN_OUTPUT_PULLUP | MUX_MODE0) /* mdio_clk.mdio_clk */
>;
};
davinci_mdio_sleep: davinci_mdio_sleep {
pinctrl-single,pins = <
/* MDIO reset value */
0x148 (PIN_INPUT_PULLDOWN | MUX_MODE7)
0x14c (PIN_INPUT_PULLDOWN | MUX_MODE7)
>;
};
nandflash_pins_s0: nandflash_pins_s0 {
pinctrl-single,pins = <
0x0 (PIN_INPUT_PULLUP | MUX_MODE0) /* gpmc_ad0.gpmc_ad0 */
0x4 (PIN_INPUT_PULLUP | MUX_MODE0) /* gpmc_ad1.gpmc_ad1 */
0x8 (PIN_INPUT_PULLUP | MUX_MODE0) /* gpmc_ad2.gpmc_ad2 */
0xc (PIN_INPUT_PULLUP | MUX_MODE0) /* gpmc_ad3.gpmc_ad3 */
0x10 (PIN_INPUT_PULLUP | MUX_MODE0) /* gpmc_ad4.gpmc_ad4 */
0x14 (PIN_INPUT_PULLUP | MUX_MODE0) /* gpmc_ad5.gpmc_ad5 */
0x18 (PIN_INPUT_PULLUP | MUX_MODE0) /* gpmc_ad6.gpmc_ad6 */
0x1c (PIN_INPUT_PULLUP | MUX_MODE0) /* gpmc_ad7.gpmc_ad7 */
0x70 (PIN_INPUT_PULLUP | MUX_MODE0) /* gpmc_wait0.gpmc_wait0 */
0x74 (PIN_INPUT_PULLUP | MUX_MODE7) /* gpmc_wpn.gpio0_30 */
0x7c (PIN_OUTPUT | MUX_MODE0) /* gpmc_csn0.gpmc_csn0 */
0x90 (PIN_OUTPUT | MUX_MODE0) /* gpmc_advn_ale.gpmc_advn_ale */
0x94 (PIN_OUTPUT | MUX_MODE0) /* gpmc_oen_ren.gpmc_oen_ren */
0x98 (PIN_OUTPUT | MUX_MODE0) /* gpmc_wen.gpmc_wen */
0x9c (PIN_OUTPUT | MUX_MODE0) /* gpmc_be0n_cle.gpmc_be0n_cle */
>;
};
};
&elm {
status = "okay";
};
&gpmc {
pinctrl-names = "default";
pinctrl-0 = <&nandflash_pins_s0>;
ranges = <0 0 0x08000000 0x10000000>; /* CS0: NAND */
status = "okay";
nand@0,0 {
reg = <0 0 0>; /* CS0, offset 0 */
nand-bus-width = <8>;
ti,nand-ecc-opt = "bch8";
ti,nand-xfer-type = "polled";
gpmc,device-nand = "true";
gpmc,device-width = <1>;
gpmc,sync-clk-ps = <0>;
gpmc,cs-on-ns = <0>;
gpmc,cs-rd-off-ns = <44>;
gpmc,cs-wr-off-ns = <44>;
gpmc,adv-on-ns = <6>;
gpmc,adv-rd-off-ns = <34>;
gpmc,adv-wr-off-ns = <44>;
gpmc,we-on-ns = <0>;
gpmc,we-off-ns = <40>;
gpmc,oe-on-ns = <0>;
gpmc,oe-off-ns = <54>;
gpmc,access-ns = <64>;
gpmc,rd-cycle-ns = <82>;
gpmc,wr-cycle-ns = <82>;
gpmc,wait-on-read = "true";
gpmc,wait-on-write = "true";
gpmc,bus-turnaround-ns = <0>;
gpmc,cycle2cycle-delay-ns = <0>;
gpmc,clk-activation-ns = <0>;
gpmc,wait-monitoring-ns = <0>;
gpmc,wr-access-ns = <40>;
gpmc,wr-data-mux-bus-ns = <0>;
#address-cells = <1>;
#size-cells = <1>;
elm_id = <&elm>;
boot@0 {
label = "SPL";
reg = <0x0 0x20000>;
};
boot@20000{
label = "SPL.backup1";
reg = <0x20000 0x20000>;
};
boot@40000 {
label = "SPL.backup2";
reg = <0x40000 0x20000>;
};
boot@60000 {
label = "SPL.backup3";
reg = <0x60000 0x20000>;
};
boot@80000 {
label = "u-boot";
reg = <0x80000 0x1e0000>;
};
boot@260000 {
label = "UBI";
reg = <0x260000 0xfda0000>;
};
};
};
&uart0 {
pinctrl-names = "default";
pinctrl-0 = <&uart0_pins>;
status = "okay";
};
&i2c1 {
pinctrl-names = "default";
pinctrl-0 = <&i2c1_pins>;
status = "okay";
clock-frequency = <1000>;
tps: tps@2d {
reg = <0x2d>;
gpio-controller;
#gpio-cells = <2>;
interrupt-parent = <&gpio1>;
interrupts = <28 GPIO_ACTIVE_LOW>;
pinctrl-names = "default";
pinctrl-0 = <&tps65910_pins>;
};
at24@50 {
compatible = "at24,24c02";
pagesize = <8>;
reg = <0x50>;
};
tca6416: gpio@20 {
compatible = "ti,tca6416";
reg = <0x20>;
gpio-controller;
#gpio-cells = <2>;
interrupt-parent = <&gpio0>;
interrupts = <20 GPIO_ACTIVE_LOW>;
pinctrl-names = "default";
pinctrl-0 = <&tca6416_pins>;
};
};
&usb {
status = "okay";
};
&usb_ctrl_mod {
status = "okay";
};
&usb0_phy {
status = "okay";
};
&usb1_phy {
status = "okay";
};
&usb0 {
status = "okay";
dr_mode = "host";
};
&usb1 {
status = "okay";
dr_mode = "host";
};
&cppi41dma {
status = "okay";
};
/include/ "tps65910.dtsi"
&tps {
vcc1-supply = <&vbat>;
vcc2-supply = <&vbat>;
vcc3-supply = <&vbat>;
vcc4-supply = <&vbat>;
vcc5-supply = <&vbat>;
vcc6-supply = <&vbat>;
vcc7-supply = <&vbat>;
vccio-supply = <&vbat>;
ti,en-ck32k-xtal = <1>;
regulators {
vrtc_reg: regulator@0 {
regulator-always-on;
};
vio_reg: regulator@1 {
regulator-always-on;
};
vdd1_reg: regulator@2 {
/* VDD_MPU voltage limits 0.95V - 1.26V with +/-4% tolerance */
regulator-name = "vdd_mpu";
regulator-min-microvolt = <912500>;
regulator-max-microvolt = <1312500>;
regulator-boot-on;
regulator-always-on;
};
vdd2_reg: regulator@3 {
/* VDD_CORE voltage limits 0.95V - 1.1V with +/-4% tolerance */
regulator-name = "vdd_core";
regulator-min-microvolt = <912500>;
regulator-max-microvolt = <1150000>;
regulator-boot-on;
regulator-always-on;
};
vdd3_reg: regulator@4 {
regulator-always-on;
};
vdig1_reg: regulator@5 {
regulator-always-on;
};
vdig2_reg: regulator@6 {
regulator-always-on;
};
vpll_reg: regulator@7 {
regulator-always-on;
};
vdac_reg: regulator@8 {
regulator-always-on;
};
vaux1_reg: regulator@9 {
regulator-always-on;
};
vaux2_reg: regulator@10 {
regulator-always-on;
};
vaux33_reg: regulator@11 {
regulator-always-on;
};
vmmc_reg: regulator@12 {
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
};
};
};
&mac {
pinctrl-names = "default", "sleep";
pinctrl-0 = <&cpsw_default>;
pinctrl-1 = <&cpsw_sleep>;
dual_emac = <1>;
status = "okay";
};
&davinci_mdio {
pinctrl-names = "default", "sleep";
pinctrl-0 = <&davinci_mdio_default>;
pinctrl-1 = <&davinci_mdio_sleep>;
status = "okay";
};
&cpsw_emac0 {
phy_id = <&davinci_mdio>, <0>;
phy-mode = "rmii";
dual_emac_res_vlan = <1>;
};
&cpsw_emac1 {
phy_id = <&davinci_mdio>, <7>;
phy-mode = "rgmii-txid";
dual_emac_res_vlan = <2>;
};
&phy_sel {
rmii-clock-ext = <1>;
};
&mmc1 {
pinctrl-names = "default";
pinctrl-0 = <&mmc1_pins>;
vmmc-supply = <&vmmc_reg>;
status = "okay";
};
&gpio0 {
ti,no-reset-on-init;
};

View File

@ -144,9 +144,11 @@ in_flash:
ori r2, r2, CONFIG_SYS_DER@l ori r2, r2, CONFIG_SYS_DER@l
mtspr DER, r2 mtspr DER, r2
/* set up the stack in internal DPRAM */ /* set up the stack on top of internal DPRAM */
lis r3, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE)@h lis r3, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE)@h
ori r3, r3, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE)@l ori r3, r3, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE)@l
stw r0, -4(r3)
stw r0, -8(r3)
addi r1, r3, -8 addi r1, r3, -8
bl board_init_f_alloc_reserve bl board_init_f_alloc_reserve

View File

@ -1,6 +1,7 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
dtb-$(CONFIG_TARGET_T2080QDS) += t2080qds.dtb dtb-$(CONFIG_TARGET_T2080QDS) += t2080qds.dtb
dtb-$(CONFIG_MCR3000) += mcr3000.dtb
targets += $(dtb-y) targets += $(dtb-y)

View File

@ -0,0 +1,22 @@
/*
* MCR3000 Device Tree Source
*
* Copyright 2017 CS Systemes d'Information
*
* SPDX-License-Identifier: GPL-2.0+
*/
/dts-v1/;
/ {
WDT: watchdog@0 {
compatible = "fsl,pq1-wdt";
};
SERIAL: smc@0 {
compatible = "fsl,pq1-smc";
};
chosen {
stdout-path = &SERIAL;
};
};

View File

@ -12,6 +12,8 @@
#include <mpc8xx.h> #include <mpc8xx.h>
#include <fdt_support.h> #include <fdt_support.h>
#include <asm/io.h> #include <asm/io.h>
#include <dm/uclass.h>
#include <wdt.h>
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
@ -143,3 +145,17 @@ int board_early_init_f(void)
return 0; return 0;
} }
int board_early_init_r(void)
{
struct udevice *watchdog_dev = NULL;
if (uclass_get_device(UCLASS_WDT, 0, &watchdog_dev)) {
puts("Cannot find watchdog!\n");
} else {
puts("Enabling watchdog.\n");
wdt_start(watchdog_dev, 0xffff, 0);
}
return 0;
}

View File

@ -19,7 +19,6 @@ SECTIONS
arch/powerpc/cpu/mpc8xx/start.o (.text) arch/powerpc/cpu/mpc8xx/start.o (.text)
arch/powerpc/cpu/mpc8xx/traps.o (.text*) arch/powerpc/cpu/mpc8xx/traps.o (.text*)
arch/powerpc/lib/built-in.o (.text*) arch/powerpc/lib/built-in.o (.text*)
board/cssi/MCR3000/built-in.o (.text*)
drivers/net/built-in.o (.text*) drivers/net/built-in.o (.text*)
. = DEFINED(env_offset) ? env_offset : .; . = DEFINED(env_offset) ? env_offset : .;
@ -69,6 +68,12 @@ SECTIONS
__ex_table : { *(__ex_table) } __ex_table : { *(__ex_table) }
__stop___ex_table = .; __stop___ex_table = .;
/*
* _end - This is end of u-boot.bin image.
* dtb will be appended here to make u-boot-dtb.bin
*/
_end = .;
. = ALIGN(4096); . = ALIGN(4096);
__init_begin = .; __init_begin = .;
.text.init : { *(.text.init) } .text.init : { *(.text.init) }

View File

@ -27,7 +27,6 @@
#include <i2c.h> #include <i2c.h>
#include <miiphy.h> #include <miiphy.h>
#include <cpsw.h> #include <cpsw.h>
#include <power/tps65217.h>
#include <power/tps65910.h> #include <power/tps65910.h>
#include <environment.h> #include <environment.h>
#include <watchdog.h> #include <watchdog.h>
@ -35,8 +34,7 @@
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
/* GPIO that controls power to DDR on EVM-SK */ /* GPIO that controls DIP switch and mPCIe slot */
#define GPIO_DDR_VTT_EN 7
#define DIP_S1 44 #define DIP_S1 44
#define MPCIE_SW 100 #define MPCIE_SW 100
@ -248,9 +246,6 @@ const struct ctrl_ioregs ioregs_baltos = {
void sdram_init(void) void sdram_init(void)
{ {
gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");
gpio_direction_output(GPIO_DDR_VTT_EN, 1);
config_ddr(400, &ioregs_baltos, config_ddr(400, &ioregs_baltos,
&ddr3_baltos_data, &ddr3_baltos_data,
&ddr3_baltos_cmd_ctrl_data, &ddr3_baltos_cmd_ctrl_data,

View File

@ -34,7 +34,6 @@ static struct module_pin_mux mmc0_pin_mux[] = {
{OFFSET(mmc0_dat0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT0 */ {OFFSET(mmc0_dat0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT0 */
{OFFSET(mmc0_clk), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CLK */ {OFFSET(mmc0_clk), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CLK */
{OFFSET(mmc0_cmd), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CMD */ {OFFSET(mmc0_cmd), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CMD */
//{OFFSET(spi0_cs1), (MODE(5) | RXACTIVE | PULLUP_EN)}, /* MMC0_CD */
{-1}, {-1},
}; };
@ -46,11 +45,6 @@ static struct module_pin_mux i2c1_pin_mux[] = {
{-1}, {-1},
}; };
static struct module_pin_mux gpio0_7_pin_mux[] = {
{OFFSET(ecap0_in_pwm0_out), (MODE(7) | PULLUDEN)}, /* GPIO0_7 */
{-1},
};
static struct module_pin_mux rmii1_pin_mux[] = { static struct module_pin_mux rmii1_pin_mux[] = {
{OFFSET(mii1_crs), MODE(1) | RXACTIVE}, /* RGMII1_TCTL */ {OFFSET(mii1_crs), MODE(1) | RXACTIVE}, /* RGMII1_TCTL */
{OFFSET(mii1_txen), MODE(1)}, /* RGMII1_TCTL */ {OFFSET(mii1_txen), MODE(1)}, /* RGMII1_TCTL */
@ -114,7 +108,6 @@ void enable_i2c1_pin_mux(void)
void enable_board_pin_mux() void enable_board_pin_mux()
{ {
configure_module_pin_mux(i2c1_pin_mux); configure_module_pin_mux(i2c1_pin_mux);
configure_module_pin_mux(gpio0_7_pin_mux);
configure_module_pin_mux(rgmii2_pin_mux); configure_module_pin_mux(rgmii2_pin_mux);
configure_module_pin_mux(rmii1_pin_mux); configure_module_pin_mux(rmii1_pin_mux);
configure_module_pin_mux(mmc0_pin_mux); configure_module_pin_mux(mmc0_pin_mux);

View File

@ -137,6 +137,23 @@ static int eeprom_rw_block(unsigned offset, uchar *addr, unsigned alen,
spi_write(addr, alen, buffer, len); spi_write(addr, alen, buffer, len);
#else /* I2C */ #else /* I2C */
#if defined(CONFIG_DM_I2C) && defined(CONFIG_SYS_I2C_EEPROM_BUS)
struct udevice *dev;
ret = i2c_get_chip_for_busnum(CONFIG_SYS_I2C_EEPROM_BUS, addr[0],
alen - 1, &dev);
if (ret) {
printf("%s: Cannot find udev for a bus %d\n", __func__,
CONFIG_SYS_I2C_EEPROM_BUS);
return CMD_RET_FAILURE;
}
if (read)
ret = dm_i2c_read(dev, offset, buffer, len);
else
ret = dm_i2c_write(dev, offset, buffer, len);
#else /* Non DM I2C support - will be removed */
#if defined(CONFIG_SYS_I2C_EEPROM_BUS) #if defined(CONFIG_SYS_I2C_EEPROM_BUS)
i2c_set_bus_num(CONFIG_SYS_I2C_EEPROM_BUS); i2c_set_bus_num(CONFIG_SYS_I2C_EEPROM_BUS);
#endif #endif
@ -145,10 +162,11 @@ static int eeprom_rw_block(unsigned offset, uchar *addr, unsigned alen,
ret = i2c_read(addr[0], offset, alen - 1, buffer, len); ret = i2c_read(addr[0], offset, alen - 1, buffer, len);
else else
ret = i2c_write(addr[0], offset, alen - 1, buffer, len); ret = i2c_write(addr[0], offset, alen - 1, buffer, len);
if (ret)
ret = 1;
#endif #endif
#endif /* CONFIG_DM_I2C && CONFIG_SYS_I2C_EEPROM_BUS */
if (ret)
ret = CMD_RET_FAILURE;
return ret; return ret;
} }

View File

@ -743,7 +743,7 @@ static init_fnc_t init_sequence_r[] = {
/* initialize higher level parts of CPU like time base and timers */ /* initialize higher level parts of CPU like time base and timers */
cpu_init_r, cpu_init_r,
#endif #endif
#ifdef CONFIG_PPC #if defined(CONFIG_PPC) && !defined(CONFIG_DM_SPI)
initr_spi, initr_spi,
#endif #endif
#ifdef CONFIG_CMD_NAND #ifdef CONFIG_CMD_NAND

View File

@ -165,6 +165,7 @@ static void fit_image_print_data(const void *fit, int noffset, const char *p,
uint8_t *value; uint8_t *value;
int value_len; int value_len;
char *algo; char *algo;
const char *padding;
int required; int required;
int ret, i; int ret, i;
@ -184,6 +185,10 @@ static void fit_image_print_data(const void *fit, int noffset, const char *p,
printf(" (required)"); printf(" (required)");
printf("\n"); printf("\n");
padding = fdt_getprop(fit, noffset, "padding", NULL);
if (padding)
printf("%s %s padding: %s\n", p, type, padding);
ret = fit_image_hash_get_value(fit, noffset, &value, ret = fit_image_hash_get_value(fit, noffset, &value,
&value_len); &value_len);
printf("%s %s value: ", p, type); printf("%s %s value: ", p, type);

View File

@ -71,6 +71,19 @@ struct crypto_algo crypto_algos[] = {
}; };
struct padding_algo padding_algos[] = {
{
.name = "pkcs-1.5",
.verify = padding_pkcs_15_verify,
},
#ifdef CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT
{
.name = "pss",
.verify = padding_pss_verify,
}
#endif /* CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT */
};
struct checksum_algo *image_get_checksum_algo(const char *full_name) struct checksum_algo *image_get_checksum_algo(const char *full_name)
{ {
int i; int i;
@ -106,6 +119,21 @@ struct crypto_algo *image_get_crypto_algo(const char *full_name)
return NULL; return NULL;
} }
struct padding_algo *image_get_padding_algo(const char *name)
{
int i;
if (!name)
return NULL;
for (i = 0; i < ARRAY_SIZE(padding_algos); i++) {
if (!strcmp(padding_algos[i].name, name))
return &padding_algos[i];
}
return NULL;
}
/** /**
* fit_region_make_list() - Make a list of image regions * fit_region_make_list() - Make a list of image regions
* *
@ -155,6 +183,7 @@ static int fit_image_setup_verify(struct image_sign_info *info,
char **err_msgp) char **err_msgp)
{ {
char *algo_name; char *algo_name;
const char *padding_name;
if (fdt_totalsize(fit) > CONFIG_FIT_SIGNATURE_MAX_SIZE) { if (fdt_totalsize(fit) > CONFIG_FIT_SIGNATURE_MAX_SIZE) {
*err_msgp = "Total size too large"; *err_msgp = "Total size too large";
@ -165,6 +194,11 @@ static int fit_image_setup_verify(struct image_sign_info *info,
*err_msgp = "Can't get hash algo property"; *err_msgp = "Can't get hash algo property";
return -1; return -1;
} }
padding_name = fdt_getprop(fit, noffset, "padding", NULL);
if (!padding_name)
padding_name = RSA_DEFAULT_PADDING_NAME;
memset(info, '\0', sizeof(*info)); memset(info, '\0', sizeof(*info));
info->keyname = fdt_getprop(fit, noffset, "key-name-hint", NULL); info->keyname = fdt_getprop(fit, noffset, "key-name-hint", NULL);
info->fit = (void *)fit; info->fit = (void *)fit;
@ -172,6 +206,7 @@ static int fit_image_setup_verify(struct image_sign_info *info,
info->name = algo_name; info->name = algo_name;
info->checksum = image_get_checksum_algo(algo_name); info->checksum = image_get_checksum_algo(algo_name);
info->crypto = image_get_crypto_algo(algo_name); info->crypto = image_get_crypto_algo(algo_name);
info->padding = image_get_padding_algo(padding_name);
info->fdt_blob = gd_fdt_blob(); info->fdt_blob = gd_fdt_blob();
info->required_keynode = required_keynode; info->required_keynode = required_keynode;
printf("%s:%s", algo_name, info->keyname); printf("%s:%s", algo_name, info->keyname);

View File

@ -42,6 +42,7 @@ CONFIG_BOOTDELAY=5
CONFIG_USE_BOOTCOMMAND=y CONFIG_USE_BOOTCOMMAND=y
CONFIG_BOOTCOMMAND="run flashboot" CONFIG_BOOTCOMMAND="run flashboot"
CONFIG_MISC_INIT_R=y CONFIG_MISC_INIT_R=y
CONFIG_BOARD_EARLY_INIT_R=y
CONFIG_HUSH_PARSER=y CONFIG_HUSH_PARSER=y
# CONFIG_AUTO_COMPLETE is not set # CONFIG_AUTO_COMPLETE is not set
CONFIG_SYS_PROMPT="S3K> " CONFIG_SYS_PROMPT="S3K> "
@ -73,3 +74,9 @@ CONFIG_MPC8XX_FEC=y
CONFIG_SHA256=y CONFIG_SHA256=y
CONFIG_LZMA=y CONFIG_LZMA=y
CONFIG_OF_LIBFDT=y CONFIG_OF_LIBFDT=y
CONFIG_DM=y
CONFIG_OF_CONTROL=y
CONFIG_DEFAULT_DEVICE_TREE="mcr3000"
CONFIG_WDT=y
CONFIG_WDT_MPC8xx=y
CONFIG_DM_SERIAL=y

View File

@ -1,6 +1,5 @@
CONFIG_ARM=y CONFIG_ARM=y
CONFIG_ARCH_OMAP2PLUS=y CONFIG_ARCH_OMAP2PLUS=y
CONFIG_SPL_GPIO_SUPPORT=y
CONFIG_SPL_LIBCOMMON_SUPPORT=y CONFIG_SPL_LIBCOMMON_SUPPORT=y
CONFIG_SPL_LIBGENERIC_SUPPORT=y CONFIG_SPL_LIBGENERIC_SUPPORT=y
CONFIG_AM33XX=y CONFIG_AM33XX=y
@ -39,17 +38,26 @@ CONFIG_CMD_MTDPARTS=y
CONFIG_MTDIDS_DEFAULT="nand0=omap2-nand.0" CONFIG_MTDIDS_DEFAULT="nand0=omap2-nand.0"
CONFIG_MTDPARTS_DEFAULT="mtdparts=omap2-nand.0:128k(SPL),128k(SPL.backup1),128k(SPL.backup2),128k(SPL.backup3),1920k(u-boot),-(UBI)" CONFIG_MTDPARTS_DEFAULT="mtdparts=omap2-nand.0:128k(SPL),128k(SPL.backup1),128k(SPL.backup2),128k(SPL.backup3),1920k(u-boot),-(UBI)"
CONFIG_CMD_UBI=y CONFIG_CMD_UBI=y
CONFIG_OF_CONTROL=y
CONFIG_DEFAULT_DEVICE_TREE="am335x-baltos"
CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
CONFIG_BOOTCOUNT_LIMIT=y CONFIG_BOOTCOUNT_LIMIT=y
CONFIG_SYS_OMAP24_I2C_SPEED=1000 CONFIG_SYS_OMAP24_I2C_SPEED=1000
CONFIG_DM_MMC=y
CONFIG_MMC_OMAP_HS=y CONFIG_MMC_OMAP_HS=y
CONFIG_MMC_OMAP_HS_ADMA=y
CONFIG_NAND=y CONFIG_NAND=y
CONFIG_SYS_NAND_U_BOOT_LOCATIONS=y
CONFIG_SYS_NAND_U_BOOT_OFFS=0x00080000
CONFIG_PHY_ADDR_ENABLE=y CONFIG_PHY_ADDR_ENABLE=y
CONFIG_DRIVER_TI_CPSW=y CONFIG_PHY_ATHEROS=y
CONFIG_PHY_SMSC=y
CONFIG_MII=y CONFIG_MII=y
CONFIG_DRIVER_TI_CPSW=y
CONFIG_SPI=y CONFIG_SPI=y
CONFIG_OMAP3_SPI=y CONFIG_OMAP3_SPI=y
CONFIG_USB=y CONFIG_USB=y
CONFIG_DM_USB=y
CONFIG_USB_MUSB_HOST=y CONFIG_USB_MUSB_HOST=y
CONFIG_USB_MUSB_GADGET=y CONFIG_USB_MUSB_GADGET=y
CONFIG_USB_MUSB_DSPS=y CONFIG_USB_MUSB_DSPS=y
@ -59,7 +67,7 @@ CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
CONFIG_USB_GADGET_VENDOR_NUM=0x0403 CONFIG_USB_GADGET_VENDOR_NUM=0x0403
CONFIG_USB_GADGET_PRODUCT_NUM=0xbd00 CONFIG_USB_GADGET_PRODUCT_NUM=0xbd00
CONFIG_USB_GADGET_DOWNLOAD=y CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_USB_FUNCTION_MASS_STORAGE=y
CONFIG_USB_ETHER=y CONFIG_USB_ETHER=y
CONFIG_USBNET_HOST_ADDR="de:ad:be:af:00:00" CONFIG_USBNET_HOST_ADDR="de:ad:be:af:00:00"
CONFIG_FAT_WRITE=y CONFIG_FAT_WRITE=y
CONFIG_OF_LIBFDT=y

View File

@ -40,6 +40,7 @@ CONFIG_SPI_FLASH_MTD=y
CONFIG_PHYLIB=y CONFIG_PHYLIB=y
CONFIG_PHY_MICREL=y CONFIG_PHY_MICREL=y
CONFIG_MII=y CONFIG_MII=y
CONFIG_RTC_M41T62=y
CONFIG_DM_SERIAL=y CONFIG_DM_SERIAL=y
CONFIG_FSL_LPUART=y CONFIG_FSL_LPUART=y
CONFIG_SPI=y CONFIG_SPI=y

View File

@ -49,6 +49,7 @@ CONFIG_NAND=y
CONFIG_NAND_MXC=y CONFIG_NAND_MXC=y
CONFIG_PHYLIB=y CONFIG_PHYLIB=y
CONFIG_PHY_MICREL=y CONFIG_PHY_MICREL=y
CONFIG_RTC_M41T62=y
CONFIG_USB=y CONFIG_USB=y
CONFIG_USB_STORAGE=y CONFIG_USB_STORAGE=y
CONFIG_USB_HOST_ETHER=y CONFIG_USB_HOST_ETHER=y

View File

@ -35,5 +35,6 @@ CONFIG_SYS_NAND_BUSWIDTH_16BIT=y
CONFIG_PHYLIB=y CONFIG_PHYLIB=y
CONFIG_PHY_MICREL=y CONFIG_PHY_MICREL=y
CONFIG_MII=y CONFIG_MII=y
CONFIG_RTC_M41T62=y
CONFIG_DM_SERIAL=y CONFIG_DM_SERIAL=y
CONFIG_FSL_LPUART=y CONFIG_FSL_LPUART=y

View File

@ -5,6 +5,7 @@ CONFIG_DISTRO_DEFAULTS=y
CONFIG_NR_DRAM_BANKS=1 CONFIG_NR_DRAM_BANKS=1
CONFIG_FIT=y CONFIG_FIT=y
CONFIG_FIT_SIGNATURE=y CONFIG_FIT_SIGNATURE=y
CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y
CONFIG_FIT_VERBOSE=y CONFIG_FIT_VERBOSE=y
CONFIG_BOOTSTAGE=y CONFIG_BOOTSTAGE=y
CONFIG_BOOTSTAGE_REPORT=y CONFIG_BOOTSTAGE_REPORT=y

View File

@ -52,6 +52,7 @@ CONFIG_PHY_MICREL=y
CONFIG_PHY_MICREL_KSZ90X1=y CONFIG_PHY_MICREL_KSZ90X1=y
CONFIG_ETH_DESIGNWARE=y CONFIG_ETH_DESIGNWARE=y
CONFIG_MII=y CONFIG_MII=y
CONFIG_RTC_M41T62=y
CONFIG_CONS_INDEX=0 CONFIG_CONS_INDEX=0
CONFIG_USB=y CONFIG_USB=y
CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_HCD=y

View File

@ -106,6 +106,9 @@ When the image is signed, the following properties are optional:
- comment: Additional information about the signer or image - comment: Additional information about the signer or image
- padding: The padding algorithm, it may be pkcs-1.5 or pss,
if no value is provided we assume pkcs-1.5
For config bindings (see Signed Configurations below), the following For config bindings (see Signed Configurations below), the following
additional properties are optional: additional properties are optional:

View File

@ -104,4 +104,10 @@ config RTC_MC146818
clock with a wide array of features and 50 bytes of general-purpose, clock with a wide array of features and 50 bytes of general-purpose,
battery-backed RAM. The driver supports access to the clock and RAM. battery-backed RAM. The driver supports access to the clock and RAM.
config RTC_M41T62
bool "Enable M41T62 driver"
help
Enable driver for ST's M41T62 compatible RTC devices (like RV-4162).
It is a serial (I2C) real-time clock (RTC) with alarm.
endmenu endmenu

View File

@ -1,5 +1,8 @@
// SPDX-License-Identifier: GPL-2.0+ // SPDX-License-Identifier: GPL-2.0+
/* /*
* (C) Copyright 2018
* Lukasz Majewski, DENX Software Engineering, lukma@denx.de.
*
* (C) Copyright 2008 * (C) Copyright 2008
* Stefan Roese, DENX Software Engineering, sr@denx.de. * Stefan Roese, DENX Software Engineering, sr@denx.de.
* *
@ -15,6 +18,7 @@
#include <common.h> #include <common.h>
#include <command.h> #include <command.h>
#include <dm.h>
#include <rtc.h> #include <rtc.h>
#include <i2c.h> #include <i2c.h>
@ -49,12 +53,8 @@
#define M41T80_ALHOUR_HT (1 << 6) /* HT: Halt Update Bit */ #define M41T80_ALHOUR_HT (1 << 6) /* HT: Halt Update Bit */
int rtc_get(struct rtc_time *tm) static void m41t62_update_rtc_time(struct rtc_time *tm, u8 *buf)
{ {
u8 buf[M41T62_DATETIME_REG_SIZE];
i2c_read(CONFIG_SYS_I2C_RTC_ADDR, 0, 1, buf, M41T62_DATETIME_REG_SIZE);
debug("%s: raw read data - sec=%02x, min=%02x, hr=%02x, " debug("%s: raw read data - sec=%02x, min=%02x, hr=%02x, "
"mday=%02x, mon=%02x, year=%02x, wday=%02x, y2k=%02x\n", "mday=%02x, mon=%02x, year=%02x, wday=%02x, y2k=%02x\n",
__FUNCTION__, __FUNCTION__,
@ -77,20 +77,14 @@ int rtc_get(struct rtc_time *tm)
__FUNCTION__, __FUNCTION__,
tm->tm_sec, tm->tm_min, tm->tm_hour, tm->tm_sec, tm->tm_min, tm->tm_hour,
tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday); tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
return 0;
} }
int rtc_set(struct rtc_time *tm) static void m41t62_set_rtc_buf(const struct rtc_time *tm, u8 *buf)
{ {
u8 buf[M41T62_DATETIME_REG_SIZE];
debug("Set DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n", debug("Set DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n",
tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_wday, tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_wday,
tm->tm_hour, tm->tm_min, tm->tm_sec); tm->tm_hour, tm->tm_min, tm->tm_sec);
i2c_read(CONFIG_SYS_I2C_RTC_ADDR, 0, 1, buf, M41T62_DATETIME_REG_SIZE);
/* Merge time-data and register flags into buf[0..7] */ /* Merge time-data and register flags into buf[0..7] */
buf[M41T62_REG_SSEC] = 0; buf[M41T62_REG_SSEC] = 0;
buf[M41T62_REG_SEC] = buf[M41T62_REG_SEC] =
@ -107,8 +101,99 @@ int rtc_set(struct rtc_time *tm)
bin2bcd(tm->tm_mon) | (buf[M41T62_REG_MON] & ~0x1f); bin2bcd(tm->tm_mon) | (buf[M41T62_REG_MON] & ~0x1f);
/* assume 20YY not 19YY */ /* assume 20YY not 19YY */
buf[M41T62_REG_YEAR] = bin2bcd(tm->tm_year % 100); buf[M41T62_REG_YEAR] = bin2bcd(tm->tm_year % 100);
}
if (i2c_write(CONFIG_SYS_I2C_RTC_ADDR, 0, 1, buf, M41T62_DATETIME_REG_SIZE)) { #ifdef CONFIG_DM_RTC
static int m41t62_rtc_get(struct udevice *dev, struct rtc_time *tm)
{
u8 buf[M41T62_DATETIME_REG_SIZE];
int ret;
ret = dm_i2c_read(dev, 0, buf, sizeof(buf));
if (ret)
return ret;
m41t62_update_rtc_time(tm, buf);
return 0;
}
static int m41t62_rtc_set(struct udevice *dev, const struct rtc_time *tm)
{
u8 buf[M41T62_DATETIME_REG_SIZE];
int ret;
ret = dm_i2c_read(dev, 0, buf, sizeof(buf));
if (ret)
return ret;
m41t62_set_rtc_buf(tm, buf);
ret = dm_i2c_write(dev, 0, buf, sizeof(buf));
if (ret) {
printf("I2C write failed in %s()\n", __func__);
return ret;
}
return 0;
}
static int m41t62_rtc_reset(struct udevice *dev)
{
u8 val;
/*
* M41T82: Make sure HT (Halt Update) bit is cleared.
* This bit is 0 in M41T62 so its save to clear it always.
*/
int ret = dm_i2c_read(dev, M41T62_REG_ALARM_HOUR, &val, sizeof(val));
val &= ~M41T80_ALHOUR_HT;
ret |= dm_i2c_write(dev, M41T62_REG_ALARM_HOUR, &val, sizeof(val));
return ret;
}
static const struct rtc_ops m41t62_rtc_ops = {
.get = m41t62_rtc_get,
.set = m41t62_rtc_set,
.reset = m41t62_rtc_reset,
};
static const struct udevice_id m41t62_rtc_ids[] = {
{ .compatible = "st,m41t62" },
{ .compatible = "microcrystal,rv4162" },
{ }
};
U_BOOT_DRIVER(rtc_m41t62) = {
.name = "rtc-m41t62",
.id = UCLASS_RTC,
.of_match = m41t62_rtc_ids,
.ops = &m41t62_rtc_ops,
};
#else /* NON DM RTC code - will be removed */
int rtc_get(struct rtc_time *tm)
{
u8 buf[M41T62_DATETIME_REG_SIZE];
i2c_read(CONFIG_SYS_I2C_RTC_ADDR, 0, 1, buf, M41T62_DATETIME_REG_SIZE);
m41t62_update_rtc_time(tm, buf);
return 0;
}
int rtc_set(struct rtc_time *tm)
{
u8 buf[M41T62_DATETIME_REG_SIZE];
i2c_read(CONFIG_SYS_I2C_RTC_ADDR, 0, 1, buf, M41T62_DATETIME_REG_SIZE);
m41t62_set_rtc_buf(tm, buf);
if (i2c_write(CONFIG_SYS_I2C_RTC_ADDR, 0, 1, buf,
M41T62_DATETIME_REG_SIZE)) {
printf("I2C write failed in %s()\n", __func__); printf("I2C write failed in %s()\n", __func__);
return -1; return -1;
} }
@ -128,3 +213,4 @@ void rtc_reset(void)
val &= ~M41T80_ALHOUR_HT; val &= ~M41T80_ALHOUR_HT;
i2c_write(CONFIG_SYS_I2C_RTC_ADDR, M41T62_REG_ALARM_HOUR, 1, &val, 1); i2c_write(CONFIG_SYS_I2C_RTC_ADDR, M41T62_REG_ALARM_HOUR, 1, &val, 1);
} }
#endif /* CONFIG_DM_RTC */

View File

@ -119,7 +119,6 @@ U_BOOT_ENV_CALLBACK(baudrate, on_baudrate);
serial_initfunc(atmel_serial_initialize); serial_initfunc(atmel_serial_initialize);
serial_initfunc(mcf_serial_initialize); serial_initfunc(mcf_serial_initialize);
serial_initfunc(mpc85xx_serial_initialize); serial_initfunc(mpc85xx_serial_initialize);
serial_initfunc(mpc8xx_serial_initialize);
serial_initfunc(mxc_serial_initialize); serial_initfunc(mxc_serial_initialize);
serial_initfunc(ns16550_serial_initialize); serial_initfunc(ns16550_serial_initialize);
serial_initfunc(pl01x_serial_initialize); serial_initfunc(pl01x_serial_initialize);
@ -173,7 +172,6 @@ void serial_initialize(void)
atmel_serial_initialize(); atmel_serial_initialize();
mcf_serial_initialize(); mcf_serial_initialize();
mpc85xx_serial_initialize(); mpc85xx_serial_initialize();
mpc8xx_serial_initialize();
mxc_serial_initialize(); mxc_serial_initialize();
ns16550_serial_initialize(); ns16550_serial_initialize();
pl01x_serial_initialize(); pl01x_serial_initialize();

View File

@ -6,6 +6,7 @@
#include <common.h> #include <common.h>
#include <command.h> #include <command.h>
#include <dm.h>
#include <serial.h> #include <serial.h>
#include <watchdog.h> #include <watchdog.h>
#include <asm/cpm_8xx.h> #include <asm/cpm_8xx.h>
@ -35,9 +36,9 @@ struct serialbuffer {
uchar txbuf; /* tx buffers */ uchar txbuf; /* tx buffers */
}; };
static void serial_setdivisor(cpm8xx_t __iomem *cp) static void serial_setdivisor(cpm8xx_t __iomem *cp, int baudrate)
{ {
int divisor = (gd->cpu_clk + 8 * gd->baudrate) / 16 / gd->baudrate; int divisor = (gd->cpu_clk + 8 * baudrate) / 16 / baudrate;
if (divisor / 16 > 0x1000) { if (divisor / 16 > 0x1000) {
/* bad divisor, assume 50MHz clock and 9600 baud */ /* bad divisor, assume 50MHz clock and 9600 baud */
@ -58,7 +59,7 @@ static void serial_setdivisor(cpm8xx_t __iomem *cp)
* as serial console interface. * as serial console interface.
*/ */
static void smc_setbrg(void) static int serial_mpc8xx_setbrg(struct udevice *dev, int baudrate)
{ {
immap_t __iomem *im = (immap_t __iomem *)CONFIG_SYS_IMMR; immap_t __iomem *im = (immap_t __iomem *)CONFIG_SYS_IMMR;
cpm8xx_t __iomem *cp = &(im->im_cpm); cpm8xx_t __iomem *cp = &(im->im_cpm);
@ -71,10 +72,12 @@ static void smc_setbrg(void)
out_be32(&cp->cp_simode, 0); out_be32(&cp->cp_simode, 0);
serial_setdivisor(cp); serial_setdivisor(cp, baudrate);
return 0;
} }
static int smc_init(void) static int serial_mpc8xx_probe(struct udevice *dev)
{ {
immap_t __iomem *im = (immap_t __iomem *)CONFIG_SYS_IMMR; immap_t __iomem *im = (immap_t __iomem *)CONFIG_SYS_IMMR;
smc_t __iomem *sp; smc_t __iomem *sp;
@ -139,7 +142,7 @@ static int smc_init(void)
out_8(&sp->smc_smce, 0xff); out_8(&sp->smc_smce, 0xff);
/* Set up the baud rate generator */ /* Set up the baud rate generator */
smc_setbrg(); serial_mpc8xx_setbrg(dev, gd->baudrate);
/* Make the first buffer the only buffer. */ /* Make the first buffer the only buffer. */
setbits_be16(&rtx->txbd.cbd_sc, BD_SC_WRAP); setbits_be16(&rtx->txbd.cbd_sc, BD_SC_WRAP);
@ -166,14 +169,14 @@ static int smc_init(void)
return 0; return 0;
} }
static void smc_putc(const char c) static int serial_mpc8xx_putc(struct udevice *dev, const char c)
{ {
immap_t __iomem *im = (immap_t __iomem *)CONFIG_SYS_IMMR; immap_t __iomem *im = (immap_t __iomem *)CONFIG_SYS_IMMR;
cpm8xx_t __iomem *cpmp = &(im->im_cpm); cpm8xx_t __iomem *cpmp = &(im->im_cpm);
struct serialbuffer __iomem *rtx; struct serialbuffer __iomem *rtx;
if (c == '\n') if (c == '\n')
smc_putc('\r'); serial_mpc8xx_putc(dev, '\r');
rtx = (struct serialbuffer __iomem *)&cpmp->cp_dpmem[CPM_SERIAL_BASE]; rtx = (struct serialbuffer __iomem *)&cpmp->cp_dpmem[CPM_SERIAL_BASE];
@ -184,15 +187,11 @@ static void smc_putc(const char c)
while (in_be16(&rtx->txbd.cbd_sc) & BD_SC_READY) while (in_be16(&rtx->txbd.cbd_sc) & BD_SC_READY)
WATCHDOG_RESET(); WATCHDOG_RESET();
return 0;
} }
static void smc_puts(const char *s) static int serial_mpc8xx_getc(struct udevice *dev)
{
while (*s)
smc_putc(*s++);
}
static int smc_getc(void)
{ {
immap_t __iomem *im = (immap_t __iomem *)CONFIG_SYS_IMMR; immap_t __iomem *im = (immap_t __iomem *)CONFIG_SYS_IMMR;
cpm8xx_t __iomem *cpmp = &(im->im_cpm); cpm8xx_t __iomem *cpmp = &(im->im_cpm);
@ -222,34 +221,37 @@ static int smc_getc(void)
return c; return c;
} }
static int smc_tstc(void) static int serial_mpc8xx_pending(struct udevice *dev, bool input)
{ {
immap_t __iomem *im = (immap_t __iomem *)CONFIG_SYS_IMMR; immap_t __iomem *im = (immap_t __iomem *)CONFIG_SYS_IMMR;
cpm8xx_t __iomem *cpmp = &(im->im_cpm); cpm8xx_t __iomem *cpmp = &(im->im_cpm);
struct serialbuffer __iomem *rtx; struct serialbuffer __iomem *rtx;
if (!input)
return 0;
rtx = (struct serialbuffer __iomem *)&cpmp->cp_dpmem[CPM_SERIAL_BASE]; rtx = (struct serialbuffer __iomem *)&cpmp->cp_dpmem[CPM_SERIAL_BASE];
return !(in_be16(&rtx->rxbd.cbd_sc) & BD_SC_EMPTY); return !(in_be16(&rtx->rxbd.cbd_sc) & BD_SC_EMPTY);
} }
struct serial_device serial_smc_device = { static const struct dm_serial_ops serial_mpc8xx_ops = {
.name = "serial_smc", .putc = serial_mpc8xx_putc,
.start = smc_init, .pending = serial_mpc8xx_pending,
.stop = NULL, .getc = serial_mpc8xx_getc,
.setbrg = smc_setbrg, .setbrg = serial_mpc8xx_setbrg,
.getc = smc_getc,
.tstc = smc_tstc,
.putc = smc_putc,
.puts = smc_puts,
}; };
__weak struct serial_device *default_serial_console(void) static const struct udevice_id serial_mpc8xx_ids[] = {
{ { .compatible = "fsl,pq1-smc" },
return &serial_smc_device; { }
} };
void mpc8xx_serial_initialize(void) U_BOOT_DRIVER(serial_mpc8xx) = {
{ .name = "serial_mpc8xx",
serial_register(&serial_smc_device); .id = UCLASS_SERIAL,
} .of_match = serial_mpc8xx_ids,
.probe = serial_mpc8xx_probe,
.ops = &serial_mpc8xx_ops,
.flags = DM_FLAG_PRE_RELOC,
};

View File

@ -17,64 +17,19 @@
*/ */
#include <common.h> #include <common.h>
#include <dm.h>
#include <mpc8xx.h> #include <mpc8xx.h>
#include <spi.h>
#include <asm/cpm_8xx.h> #include <asm/cpm_8xx.h>
#include <linux/ctype.h> #include <asm/io.h>
#include <malloc.h>
#include <post.h>
#include <serial.h>
#define SPI_EEPROM_WREN 0x06
#define SPI_EEPROM_RDSR 0x05
#define SPI_EEPROM_READ 0x03
#define SPI_EEPROM_WRITE 0x02
/* ---------------------------------------------------------------
* Offset for initial SPI buffers in DPRAM:
* We need a 520 byte scratch DPRAM area to use at an early stage.
* It is used between the two initialization calls (spi_init_f()
* and spi_init_r()).
* The value 0xb00 makes it far enough from the start of the data
* area (as well as from the stack pointer).
* --------------------------------------------------------------- */
#ifndef CONFIG_SYS_SPI_INIT_OFFSET
#define CONFIG_SYS_SPI_INIT_OFFSET 0xB00
#endif
#define CPM_SPI_BASE_RX CPM_SPI_BASE #define CPM_SPI_BASE_RX CPM_SPI_BASE
#define CPM_SPI_BASE_TX (CPM_SPI_BASE + sizeof(cbd_t)) #define CPM_SPI_BASE_TX (CPM_SPI_BASE + sizeof(cbd_t))
/* -------------------
* Function prototypes
* ------------------- */
ssize_t spi_xfer(size_t);
/* -------------------
* Variables
* ------------------- */
#define MAX_BUFFER 0x104 #define MAX_BUFFER 0x104
/* ---------------------------------------------------------------------- static int mpc8xx_spi_probe(struct udevice *dev)
* Initially we place the RX and TX buffers at a fixed location in DPRAM!
* ---------------------------------------------------------------------- */
static uchar *rxbuf =
(uchar *)&((cpm8xx_t *)&((immap_t *)CONFIG_SYS_IMMR)->im_cpm)->cp_dpmem
[CONFIG_SYS_SPI_INIT_OFFSET];
static uchar *txbuf =
(uchar *)&((cpm8xx_t *)&((immap_t *)CONFIG_SYS_IMMR)->im_cpm)->cp_dpmem
[CONFIG_SYS_SPI_INIT_OFFSET+MAX_BUFFER];
/* **************************************************************************
*
* Function: spi_init_f
*
* Description: Init SPI-Controller (ROM part)
*
* return: ---
*
* *********************************************************************** */
void spi_init_f(void)
{ {
immap_t __iomem *immr = (immap_t __iomem *)CONFIG_SYS_IMMR; immap_t __iomem *immr = (immap_t __iomem *)CONFIG_SYS_IMMR;
cpm8xx_t __iomem *cp = &immr->im_cpm; cpm8xx_t __iomem *cp = &immr->im_cpm;
@ -180,117 +135,24 @@ void spi_init_f(void)
clrbits_be16(&tbdf->cbd_sc, BD_SC_READY); clrbits_be16(&tbdf->cbd_sc, BD_SC_READY);
clrbits_be16(&rbdf->cbd_sc, BD_SC_EMPTY); clrbits_be16(&rbdf->cbd_sc, BD_SC_EMPTY);
/* Set the bd's rx and tx buffer address pointers */
out_be32(&rbdf->cbd_bufaddr, (ulong)rxbuf);
out_be32(&tbdf->cbd_bufaddr, (ulong)txbuf);
/* 10 + 11 */ /* 10 + 11 */
out_8(&cp->cp_spim, 0); /* Mask all SPI events */ out_8(&cp->cp_spim, 0); /* Mask all SPI events */
out_8(&cp->cp_spie, SPI_EMASK); /* Clear all SPI events */ out_8(&cp->cp_spie, SPI_EMASK); /* Clear all SPI events */
return; return 0;
} }
/* ************************************************************************** static int mpc8xx_spi_xfer(struct udevice *dev, unsigned int bitlen,
* const void *dout, void *din, unsigned long flags)
* Function: spi_init_r
*
* Description: Init SPI-Controller (RAM part) -
* The malloc engine is ready and we can move our buffers to
* normal RAM
*
* return: ---
*
* *********************************************************************** */
void spi_init_r(void)
{ {
immap_t __iomem *immr = (immap_t __iomem *)CONFIG_SYS_IMMR; immap_t __iomem *immr = (immap_t __iomem *)CONFIG_SYS_IMMR;
cpm8xx_t __iomem *cp = &immr->im_cpm; cpm8xx_t __iomem *cp = &immr->im_cpm;
spi_t __iomem *spi = (spi_t __iomem *)&cp->cp_dparam[PROFF_SPI];
cbd_t __iomem *tbdf, *rbdf;
/* Disable relocation */
out_be16(&spi->spi_rpbase, 0);
/* tx and rx buffer descriptors */
tbdf = (cbd_t __iomem *)&cp->cp_dpmem[CPM_SPI_BASE_TX];
rbdf = (cbd_t __iomem *)&cp->cp_dpmem[CPM_SPI_BASE_RX];
/* Allocate memory for RX and TX buffers */
rxbuf = (uchar *)malloc(MAX_BUFFER);
txbuf = (uchar *)malloc(MAX_BUFFER);
out_be32(&rbdf->cbd_bufaddr, (ulong)rxbuf);
out_be32(&tbdf->cbd_bufaddr, (ulong)txbuf);
return;
}
/****************************************************************************
* Function: spi_write
**************************************************************************** */
ssize_t spi_write(uchar *addr, int alen, uchar *buffer, int len)
{
int i;
memset(rxbuf, 0, MAX_BUFFER);
memset(txbuf, 0, MAX_BUFFER);
*txbuf = SPI_EEPROM_WREN; /* write enable */
spi_xfer(1);
memcpy(txbuf, addr, alen);
*txbuf = SPI_EEPROM_WRITE; /* WRITE memory array */
memcpy(alen + txbuf, buffer, len);
spi_xfer(alen + len);
/* ignore received data */
for (i = 0; i < 1000; i++) {
*txbuf = SPI_EEPROM_RDSR; /* read status */
txbuf[1] = 0;
spi_xfer(2);
if (!(rxbuf[1] & 1))
break;
udelay(1000);
}
if (i >= 1000)
printf("*** spi_write: Time out while writing!\n");
return len;
}
/****************************************************************************
* Function: spi_read
**************************************************************************** */
ssize_t spi_read(uchar *addr, int alen, uchar *buffer, int len)
{
memset(rxbuf, 0, MAX_BUFFER);
memset(txbuf, 0, MAX_BUFFER);
memcpy(txbuf, addr, alen);
*txbuf = SPI_EEPROM_READ; /* READ memory array */
/*
* There is a bug in 860T (?) that cuts the last byte of input
* if we're reading into DPRAM. The solution we choose here is
* to always read len+1 bytes (we have one extra byte at the
* end of the buffer).
*/
spi_xfer(alen + len + 1);
memcpy(buffer, alen + rxbuf, len);
return len;
}
/****************************************************************************
* Function: spi_xfer
**************************************************************************** */
ssize_t spi_xfer(size_t count)
{
immap_t __iomem *immr = (immap_t __iomem *)CONFIG_SYS_IMMR;
cpm8xx_t __iomem *cp = &immr->im_cpm;
spi_t __iomem *spi = (spi_t __iomem *)&cp->cp_dparam[PROFF_SPI];
cbd_t __iomem *tbdf, *rbdf; cbd_t __iomem *tbdf, *rbdf;
int tm; int tm;
size_t count = (bitlen + 7) / 8;
/* Disable relocation */ if (count > MAX_BUFFER)
out_be16(&spi->spi_rpbase, 0); return -EINVAL;
tbdf = (cbd_t __iomem *)&cp->cp_dpmem[CPM_SPI_BASE_TX]; tbdf = (cbd_t __iomem *)&cp->cp_dpmem[CPM_SPI_BASE_TX];
rbdf = (cbd_t __iomem *)&cp->cp_dpmem[CPM_SPI_BASE_RX]; rbdf = (cbd_t __iomem *)&cp->cp_dpmem[CPM_SPI_BASE_RX];
@ -299,10 +161,12 @@ ssize_t spi_xfer(size_t count)
clrbits_be32(&cp->cp_pbdat, 0x0001); clrbits_be32(&cp->cp_pbdat, 0x0001);
/* Setting tx bd status and data length */ /* Setting tx bd status and data length */
out_be32(&tbdf->cbd_bufaddr, (ulong)dout);
out_be16(&tbdf->cbd_sc, BD_SC_READY | BD_SC_LAST | BD_SC_WRAP); out_be16(&tbdf->cbd_sc, BD_SC_READY | BD_SC_LAST | BD_SC_WRAP);
out_be16(&tbdf->cbd_datlen, count); out_be16(&tbdf->cbd_datlen, count);
/* Setting rx bd status and data length */ /* Setting rx bd status and data length */
out_be32(&rbdf->cbd_bufaddr, (ulong)din);
out_be16(&rbdf->cbd_sc, BD_SC_EMPTY | BD_SC_WRAP); out_be16(&rbdf->cbd_sc, BD_SC_EMPTY | BD_SC_WRAP);
out_be16(&rbdf->cbd_datlen, 0); /* rx length has no significance */ out_be16(&rbdf->cbd_datlen, 0); /* rx length has no significance */
@ -333,3 +197,20 @@ ssize_t spi_xfer(size_t count)
return count; return count;
} }
static const struct dm_spi_ops mpc8xx_spi_ops = {
.xfer = mpc8xx_spi_xfer,
};
static const struct udevice_id mpc8xx_spi_ids[] = {
{ .compatible = "fsl,mpc8xx-spi" },
{ }
};
U_BOOT_DRIVER(mpc8xx_spi) = {
.name = "mpc8xx_spi",
.id = UCLASS_SPI,
.of_match = mpc8xx_spi_ids,
.ops = &mpc8xx_spi_ops,
.probe = mpc8xx_spi_probe,
};

View File

@ -144,4 +144,11 @@ config WDT_MT7621
Select this to enable Ralink / Mediatek watchdog timer, Select this to enable Ralink / Mediatek watchdog timer,
which can be found on some MediaTek chips. which can be found on some MediaTek chips.
config WDT_MPC8xx
bool "MPC8xx watchdog timer support"
depends on WDT && MPC8xx
select CONFIG_MPC8xx_WATCHDOG
help
Select this to enable mpc8xx watchdog timer
endmenu endmenu

View File

@ -4,6 +4,8 @@
*/ */
#include <common.h> #include <common.h>
#include <dm.h>
#include <wdt.h>
#include <mpc8xx.h> #include <mpc8xx.h>
#include <asm/cpm_8xx.h> #include <asm/cpm_8xx.h>
#include <asm/io.h> #include <asm/io.h>
@ -16,3 +18,52 @@ void hw_watchdog_reset(void)
out_be16(&immap->im_siu_conf.sc_swsr, 0xaa39); /* write magic2 */ out_be16(&immap->im_siu_conf.sc_swsr, 0xaa39); /* write magic2 */
} }
#ifdef CONFIG_WDT_MPC8xx
static int mpc8xx_wdt_start(struct udevice *dev, u64 timeout, ulong flags)
{
immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
out_be32(&immap->im_siu_conf.sc_sypcr, CONFIG_SYS_SYPCR);
if (!(in_be32(&immap->im_siu_conf.sc_sypcr) & SYPCR_SWE))
return -EBUSY;
return 0;
}
static int mpc8xx_wdt_stop(struct udevice *dev)
{
immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
out_be32(&immap->im_siu_conf.sc_sypcr, CONFIG_SYS_SYPCR & ~SYPCR_SWE);
if (in_be32(&immap->im_siu_conf.sc_sypcr) & SYPCR_SWE)
return -EBUSY;
return 0;
}
static int mpc8xx_wdt_reset(struct udevice *dev)
{
hw_watchdog_reset();
return 0;
}
static const struct wdt_ops mpc8xx_wdt_ops = {
.start = mpc8xx_wdt_start,
.reset = mpc8xx_wdt_reset,
.stop = mpc8xx_wdt_stop,
};
static const struct udevice_id mpc8xx_wdt_ids[] = {
{ .compatible = "fsl,pq1-wdt" },
{}
};
U_BOOT_DRIVER(wdt_mpc8xx) = {
.name = "wdt_mpc8xx",
.id = UCLASS_WDT,
.of_match = mpc8xx_wdt_ids,
.ops = &mpc8xx_wdt_ops,
};
#endif /* CONFIG_WDT_MPC8xx */

View File

@ -34,15 +34,8 @@
/* FIT support */ /* FIT support */
#define CONFIG_SYS_BOOTM_LEN SZ_64M #define CONFIG_SYS_BOOTM_LEN SZ_64M
/* UBI Support */
/* I2C configuration */
#ifdef CONFIG_NAND #ifdef CONFIG_NAND
#define CONFIG_SYS_NAND_U_BOOT_OFFS 0x00080000
#ifdef CONFIG_SPL_OS_BOOT
#define CONFIG_SYS_NAND_SPL_KERNEL_OFFS 0x00200000 /* kernel offset */
#endif
#define NANDARGS \ #define NANDARGS \
"mtdids=" CONFIG_MTDIDS_DEFAULT "\0" \ "mtdids=" CONFIG_MTDIDS_DEFAULT "\0" \
"mtdparts=" CONFIG_MTDPARTS_DEFAULT "\0" \ "mtdparts=" CONFIG_MTDPARTS_DEFAULT "\0" \
@ -264,10 +257,6 @@
#define CONFIG_AM335X_USB1 #define CONFIG_AM335X_USB1
#define CONFIG_AM335X_USB1_MODE MUSB_OTG #define CONFIG_AM335X_USB1_MODE MUSB_OTG
/* Network. */
#define CONFIG_PHY_SMSC
#define CONFIG_PHY_ATHEROS
/* NAND support */ /* NAND support */
#ifdef CONFIG_NAND #ifdef CONFIG_NAND
#define GPMC_NAND_ECC_LP_x8_LAYOUT 1 #define GPMC_NAND_ECC_LP_x8_LAYOUT 1

View File

@ -110,7 +110,6 @@
* RTC * RTC
*/ */
#ifdef CONFIG_CMD_DATE #ifdef CONFIG_CMD_DATE
#define CONFIG_RTC_M41T62
#define CONFIG_SYS_I2C_RTC_ADDR 0x68 #define CONFIG_SYS_I2C_RTC_ADDR 0x68
#define CONFIG_SYS_M41T11_BASE_YEAR 2000 #define CONFIG_SYS_M41T11_BASE_YEAR 2000
#endif #endif

View File

@ -58,7 +58,6 @@
#define CONFIG_SYS_I2C_MXC #define CONFIG_SYS_I2C_MXC
/* RTC (actually an RV-4162 but M41T62-compatible) */ /* RTC (actually an RV-4162 but M41T62-compatible) */
#define CONFIG_RTC_M41T62
#define CONFIG_SYS_I2C_RTC_ADDR 0x68 #define CONFIG_SYS_I2C_RTC_ADDR 0x68
#define CONFIG_SYS_RTC_BUS_NUM 2 #define CONFIG_SYS_RTC_BUS_NUM 2

View File

@ -75,7 +75,6 @@
#define CONFIG_SYS_I2C_SLAVE 0x02 #define CONFIG_SYS_I2C_SLAVE 0x02
#define CONFIG_I2C_CHIPADDRESS 0x50 #define CONFIG_I2C_CHIPADDRESS 0x50
#define CONFIG_RTC_M41T62 1
#define CONFIG_SYS_I2C_RTC_ADDR 0x68 #define CONFIG_SYS_I2C_RTC_ADDR 0x68
/* FPGA config options */ /* FPGA config options */

View File

@ -30,6 +30,7 @@ struct fdt_region;
#define IMAGE_ENABLE_FIT 1 #define IMAGE_ENABLE_FIT 1
#define IMAGE_ENABLE_OF_LIBFDT 1 #define IMAGE_ENABLE_OF_LIBFDT 1
#define CONFIG_FIT_VERBOSE 1 /* enable fit_format_{error,warning}() */ #define CONFIG_FIT_VERBOSE 1 /* enable fit_format_{error,warning}() */
#define CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT 1
#define CONFIG_FIT_ENABLE_SHA256_SUPPORT #define CONFIG_FIT_ENABLE_SHA256_SUPPORT
#define CONFIG_SHA1 #define CONFIG_SHA1
#define CONFIG_SHA256 #define CONFIG_SHA256
@ -1101,6 +1102,7 @@ struct image_sign_info {
int node_offset; /* Offset of signature node */ int node_offset; /* Offset of signature node */
const char *name; /* Algorithm name */ const char *name; /* Algorithm name */
struct checksum_algo *checksum; /* Checksum algorithm information */ struct checksum_algo *checksum; /* Checksum algorithm information */
struct padding_algo *padding; /* Padding algorithm information */
struct crypto_algo *crypto; /* Crypto algorithm information */ struct crypto_algo *crypto; /* Crypto algorithm information */
const void *fdt_blob; /* FDT containing public keys */ const void *fdt_blob; /* FDT containing public keys */
int required_keynode; /* Node offset of key to use: -1=any */ int required_keynode; /* Node offset of key to use: -1=any */
@ -1186,6 +1188,13 @@ struct crypto_algo {
uint8_t *sig, uint sig_len); uint8_t *sig, uint sig_len);
}; };
struct padding_algo {
const char *name;
int (*verify)(struct image_sign_info *info,
uint8_t *pad, int pad_len,
const uint8_t *hash, int hash_len);
};
/** /**
* image_get_checksum_algo() - Look up a checksum algorithm * image_get_checksum_algo() - Look up a checksum algorithm
* *
@ -1202,6 +1211,14 @@ struct checksum_algo *image_get_checksum_algo(const char *full_name);
*/ */
struct crypto_algo *image_get_crypto_algo(const char *full_name); struct crypto_algo *image_get_crypto_algo(const char *full_name);
/**
* image_get_padding_algo() - Look up a padding algorithm
*
* @param name Name of padding algorithm
* @return pointer to algorithm information, or NULL if not found
*/
struct padding_algo *image_get_padding_algo(const char *name);
/** /**
* fit_image_verify_required_sigs() - Verify signatures marked as 'required' * fit_image_verify_required_sigs() - Verify signatures marked as 'required'
* *

View File

@ -224,7 +224,6 @@ struct serial_dev_priv {
void atmel_serial_initialize(void); void atmel_serial_initialize(void);
void mcf_serial_initialize(void); void mcf_serial_initialize(void);
void mpc85xx_serial_initialize(void); void mpc85xx_serial_initialize(void);
void mpc8xx_serial_initialize(void);
void mxc_serial_initialize(void); void mxc_serial_initialize(void);
void ns16550_serial_initialize(void); void ns16550_serial_initialize(void);
void pl01x_serial_initialize(void); void pl01x_serial_initialize(void);

View File

@ -97,6 +97,16 @@ static inline int rsa_add_verify_data(struct image_sign_info *info,
int rsa_verify(struct image_sign_info *info, int rsa_verify(struct image_sign_info *info,
const struct image_region region[], int region_count, const struct image_region region[], int region_count,
uint8_t *sig, uint sig_len); uint8_t *sig, uint sig_len);
int padding_pkcs_15_verify(struct image_sign_info *info,
uint8_t *msg, int msg_len,
const uint8_t *hash, int hash_len);
#ifdef CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT
int padding_pss_verify(struct image_sign_info *info,
uint8_t *msg, int msg_len,
const uint8_t *hash, int hash_len);
#endif /* CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT */
#else #else
static inline int rsa_verify(struct image_sign_info *info, static inline int rsa_verify(struct image_sign_info *info,
const struct image_region region[], int region_count, const struct image_region region[], int region_count,
@ -104,8 +114,26 @@ static inline int rsa_verify(struct image_sign_info *info,
{ {
return -ENXIO; return -ENXIO;
} }
static inline int padding_pkcs_15_verify(struct image_sign_info *info,
uint8_t *msg, int msg_len,
const uint8_t *hash, int hash_len)
{
return -ENXIO;
}
#ifdef CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT
static inline int padding_pss_verify(struct image_sign_info *info,
uint8_t *msg, int msg_len,
const uint8_t *hash, int hash_len)
{
return -ENXIO;
}
#endif /* CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT */
#endif #endif
#define RSA_DEFAULT_PADDING_NAME "pkcs-1.5"
#define RSA2048_BYTES (2048 / 8) #define RSA2048_BYTES (2048 / 8)
#define RSA4096_BYTES (4096 / 8) #define RSA4096_BYTES (4096 / 8)

View File

@ -387,13 +387,16 @@ static void rsa_engine_remove(ENGINE *e)
} }
} }
static int rsa_sign_with_key(RSA *rsa, struct checksum_algo *checksum_algo, static int rsa_sign_with_key(RSA *rsa, struct padding_algo *padding_algo,
struct checksum_algo *checksum_algo,
const struct image_region region[], int region_count, const struct image_region region[], int region_count,
uint8_t **sigp, uint *sig_size) uint8_t **sigp, uint *sig_size)
{ {
EVP_PKEY *key; EVP_PKEY *key;
EVP_PKEY_CTX *ckey;
EVP_MD_CTX *context; EVP_MD_CTX *context;
int size, ret = 0; int ret = 0;
size_t size;
uint8_t *sig; uint8_t *sig;
int i; int i;
@ -409,7 +412,7 @@ static int rsa_sign_with_key(RSA *rsa, struct checksum_algo *checksum_algo,
size = EVP_PKEY_size(key); size = EVP_PKEY_size(key);
sig = malloc(size); sig = malloc(size);
if (!sig) { if (!sig) {
fprintf(stderr, "Out of memory for signature (%d bytes)\n", fprintf(stderr, "Out of memory for signature (%zu bytes)\n",
size); size);
ret = -ENOMEM; ret = -ENOMEM;
goto err_alloc; goto err_alloc;
@ -421,22 +424,43 @@ static int rsa_sign_with_key(RSA *rsa, struct checksum_algo *checksum_algo,
goto err_create; goto err_create;
} }
EVP_MD_CTX_init(context); EVP_MD_CTX_init(context);
if (!EVP_SignInit(context, checksum_algo->calculate_sign())) {
ckey = EVP_PKEY_CTX_new(key, NULL);
if (!ckey) {
ret = rsa_err("EVP key context creation failed");
goto err_create;
}
if (EVP_DigestSignInit(context, &ckey,
checksum_algo->calculate_sign(),
NULL, key) <= 0) {
ret = rsa_err("Signer setup failed"); ret = rsa_err("Signer setup failed");
goto err_sign; goto err_sign;
} }
#ifdef CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT
if (padding_algo && !strcmp(padding_algo->name, "pss")) {
if (EVP_PKEY_CTX_set_rsa_padding(ckey,
RSA_PKCS1_PSS_PADDING) <= 0) {
ret = rsa_err("Signer padding setup failed");
goto err_sign;
}
}
#endif /* CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT */
for (i = 0; i < region_count; i++) { for (i = 0; i < region_count; i++) {
if (!EVP_SignUpdate(context, region[i].data, region[i].size)) { if (!EVP_DigestSignUpdate(context, region[i].data,
region[i].size)) {
ret = rsa_err("Signing data failed"); ret = rsa_err("Signing data failed");
goto err_sign; goto err_sign;
} }
} }
if (!EVP_SignFinal(context, sig, sig_size, key)) { if (!EVP_DigestSignFinal(context, sig, &size)) {
ret = rsa_err("Could not obtain signature"); ret = rsa_err("Could not obtain signature");
goto err_sign; goto err_sign;
} }
#if OPENSSL_VERSION_NUMBER < 0x10100000L || \ #if OPENSSL_VERSION_NUMBER < 0x10100000L || \
(defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x02070000fL) (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x02070000fL)
EVP_MD_CTX_cleanup(context); EVP_MD_CTX_cleanup(context);
@ -446,7 +470,7 @@ static int rsa_sign_with_key(RSA *rsa, struct checksum_algo *checksum_algo,
EVP_MD_CTX_destroy(context); EVP_MD_CTX_destroy(context);
EVP_PKEY_free(key); EVP_PKEY_free(key);
debug("Got signature: %d bytes, expected %d\n", *sig_size, size); debug("Got signature: %d bytes, expected %zu\n", *sig_size, size);
*sigp = sig; *sigp = sig;
*sig_size = size; *sig_size = size;
@ -483,7 +507,7 @@ int rsa_sign(struct image_sign_info *info,
ret = rsa_get_priv_key(info->keydir, info->keyname, e, &rsa); ret = rsa_get_priv_key(info->keydir, info->keyname, e, &rsa);
if (ret) if (ret)
goto err_priv; goto err_priv;
ret = rsa_sign_with_key(rsa, info->checksum, region, ret = rsa_sign_with_key(rsa, info->padding, info->checksum, region,
region_count, sigp, sig_len); region_count, sigp, sig_len);
if (ret) if (ret)
goto err_sign; goto err_sign;

View File

@ -57,31 +57,247 @@ static int rsa_verify_padding(const uint8_t *msg, const int pad_len,
return ret; return ret;
} }
int padding_pkcs_15_verify(struct image_sign_info *info,
uint8_t *msg, int msg_len,
const uint8_t *hash, int hash_len)
{
struct checksum_algo *checksum = info->checksum;
int ret, pad_len = msg_len - checksum->checksum_len;
/* Check pkcs1.5 padding bytes. */
ret = rsa_verify_padding(msg, pad_len, checksum);
if (ret) {
debug("In RSAVerify(): Padding check failed!\n");
return -EINVAL;
}
/* Check hash. */
if (memcmp((uint8_t *)msg + pad_len, hash, msg_len - pad_len)) {
debug("In RSAVerify(): Hash check failed!\n");
return -EACCES;
}
return 0;
}
#ifdef CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT
static void u32_i2osp(uint32_t val, uint8_t *buf)
{
buf[0] = (uint8_t)((val >> 24) & 0xff);
buf[1] = (uint8_t)((val >> 16) & 0xff);
buf[2] = (uint8_t)((val >> 8) & 0xff);
buf[3] = (uint8_t)((val >> 0) & 0xff);
}
/**
* mask_generation_function1() - generate an octet string
*
* Generate an octet string used to check rsa signature.
* It use an input octet string and a hash function.
*
* @checksum: A Hash function
* @seed: Specifies an input variable octet string
* @seed_len: Size of the input octet string
* @output: Specifies the output octet string
* @output_len: Size of the output octet string
* @return 0 if the octet string was correctly generated, others on error
*/
static int mask_generation_function1(struct checksum_algo *checksum,
uint8_t *seed, int seed_len,
uint8_t *output, int output_len)
{
struct image_region region[2];
int ret = 0, i, i_output = 0, region_count = 2;
uint32_t counter = 0;
uint8_t buf_counter[4], *tmp;
int hash_len = checksum->checksum_len;
memset(output, 0, output_len);
region[0].data = seed;
region[0].size = seed_len;
region[1].data = &buf_counter[0];
region[1].size = 4;
tmp = malloc(hash_len);
if (!tmp) {
debug("%s: can't allocate array tmp\n", __func__);
ret = -ENOMEM;
goto out;
}
while (i_output < output_len) {
u32_i2osp(counter, &buf_counter[0]);
ret = checksum->calculate(checksum->name,
region, region_count,
tmp);
if (ret < 0) {
debug("%s: Error in checksum calculation\n", __func__);
goto out;
}
i = 0;
while ((i_output < output_len) && (i < hash_len)) {
output[i_output] = tmp[i];
i_output++;
i++;
}
counter++;
}
out:
free(tmp);
return ret;
}
static int compute_hash_prime(struct checksum_algo *checksum,
uint8_t *pad, int pad_len,
uint8_t *hash, int hash_len,
uint8_t *salt, int salt_len,
uint8_t *hprime)
{
struct image_region region[3];
int ret, region_count = 3;
region[0].data = pad;
region[0].size = pad_len;
region[1].data = hash;
region[1].size = hash_len;
region[2].data = salt;
region[2].size = salt_len;
ret = checksum->calculate(checksum->name, region, region_count, hprime);
if (ret < 0) {
debug("%s: Error in checksum calculation\n", __func__);
goto out;
}
out:
return ret;
}
int padding_pss_verify(struct image_sign_info *info,
uint8_t *msg, int msg_len,
const uint8_t *hash, int hash_len)
{
uint8_t *masked_db = NULL;
int masked_db_len = msg_len - hash_len - 1;
uint8_t *h = NULL, *hprime = NULL;
int h_len = hash_len;
uint8_t *db_mask = NULL;
int db_mask_len = masked_db_len;
uint8_t *db = NULL, *salt = NULL;
int db_len = masked_db_len, salt_len = msg_len - hash_len - 2;
uint8_t pad_zero[8] = { 0 };
int ret, i, leftmost_bits = 1;
uint8_t leftmost_mask;
struct checksum_algo *checksum = info->checksum;
/* first, allocate everything */
masked_db = malloc(masked_db_len);
h = malloc(h_len);
db_mask = malloc(db_mask_len);
db = malloc(db_len);
salt = malloc(salt_len);
hprime = malloc(hash_len);
if (!masked_db || !h || !db_mask || !db || !salt || !hprime) {
printf("%s: can't allocate some buffer\n", __func__);
ret = -ENOMEM;
goto out;
}
/* step 4: check if the last byte is 0xbc */
if (msg[msg_len - 1] != 0xbc) {
printf("%s: invalid pss padding (0xbc is missing)\n", __func__);
ret = -EINVAL;
goto out;
}
/* step 5 */
memcpy(masked_db, msg, masked_db_len);
memcpy(h, msg + masked_db_len, h_len);
/* step 6 */
leftmost_mask = (0xff >> (8 - leftmost_bits)) << (8 - leftmost_bits);
if (masked_db[0] & leftmost_mask) {
printf("%s: invalid pss padding ", __func__);
printf("(leftmost bit of maskedDB not zero)\n");
ret = -EINVAL;
goto out;
}
/* step 7 */
mask_generation_function1(checksum, h, h_len, db_mask, db_mask_len);
/* step 8 */
for (i = 0; i < db_len; i++)
db[i] = masked_db[i] ^ db_mask[i];
/* step 9 */
db[0] &= 0xff >> leftmost_bits;
/* step 10 */
if (db[0] != 0x01) {
printf("%s: invalid pss padding ", __func__);
printf("(leftmost byte of db isn't 0x01)\n");
ret = EINVAL;
goto out;
}
/* step 11 */
memcpy(salt, &db[1], salt_len);
/* step 12 & 13 */
compute_hash_prime(checksum, pad_zero, 8,
(uint8_t *)hash, hash_len,
salt, salt_len, hprime);
/* step 14 */
ret = memcmp(h, hprime, hash_len);
out:
free(hprime);
free(salt);
free(db);
free(db_mask);
free(h);
free(masked_db);
return ret;
}
#endif
/** /**
* rsa_verify_key() - Verify a signature against some data using RSA Key * rsa_verify_key() - Verify a signature against some data using RSA Key
* *
* Verify a RSA PKCS1.5 signature against an expected hash using * Verify a RSA PKCS1.5 signature against an expected hash using
* the RSA Key properties in prop structure. * the RSA Key properties in prop structure.
* *
* @info: Specifies key and FIT information
* @prop: Specifies key * @prop: Specifies key
* @sig: Signature * @sig: Signature
* @sig_len: Number of bytes in signature * @sig_len: Number of bytes in signature
* @hash: Pointer to the expected hash * @hash: Pointer to the expected hash
* @key_len: Number of bytes in rsa key * @key_len: Number of bytes in rsa key
* @algo: Checksum algo structure having information on DER encoding etc.
* @return 0 if verified, -ve on error * @return 0 if verified, -ve on error
*/ */
static int rsa_verify_key(struct key_prop *prop, const uint8_t *sig, static int rsa_verify_key(struct image_sign_info *info,
struct key_prop *prop, const uint8_t *sig,
const uint32_t sig_len, const uint8_t *hash, const uint32_t sig_len, const uint8_t *hash,
const uint32_t key_len, struct checksum_algo *algo) const uint32_t key_len)
{ {
int pad_len;
int ret; int ret;
#if !defined(USE_HOSTCC) #if !defined(USE_HOSTCC)
struct udevice *mod_exp_dev; struct udevice *mod_exp_dev;
#endif #endif
struct checksum_algo *checksum = info->checksum;
struct padding_algo *padding = info->padding;
int hash_len = checksum->checksum_len;
if (!prop || !sig || !hash || !algo) if (!prop || !sig || !hash || !checksum)
return -EIO; return -EIO;
if (sig_len != (prop->num_bits / 8)) { if (sig_len != (prop->num_bits / 8)) {
@ -89,7 +305,7 @@ static int rsa_verify_key(struct key_prop *prop, const uint8_t *sig,
return -EINVAL; return -EINVAL;
} }
debug("Checksum algorithm: %s", algo->name); debug("Checksum algorithm: %s", checksum->name);
/* Sanity check for stack size */ /* Sanity check for stack size */
if (sig_len > RSA_MAX_SIG_BITS / 8) { if (sig_len > RSA_MAX_SIG_BITS / 8) {
@ -116,19 +332,10 @@ static int rsa_verify_key(struct key_prop *prop, const uint8_t *sig,
return ret; return ret;
} }
pad_len = key_len - algo->checksum_len; ret = padding->verify(info, buf, key_len, hash, hash_len);
/* Check pkcs1.5 padding bytes. */
ret = rsa_verify_padding(buf, pad_len, algo);
if (ret) { if (ret) {
debug("In RSAVerify(): Padding check failed!\n"); debug("In RSAVerify(): padding check failed!\n");
return -EINVAL; return ret;
}
/* Check hash. */
if (memcmp((uint8_t *)buf + pad_len, hash, sig_len - pad_len)) {
debug("In RSAVerify(): Hash check failed!\n");
return -EACCES;
} }
return 0; return 0;
@ -182,8 +389,8 @@ static int rsa_verify_with_keynode(struct image_sign_info *info,
return -EFAULT; return -EFAULT;
} }
ret = rsa_verify_key(&prop, sig, sig_len, hash, ret = rsa_verify_key(info, &prop, sig, sig_len, hash,
info->crypto->key_len, info->checksum); info->crypto->key_len);
return ret; return ret;
} }

View File

@ -1661,7 +1661,6 @@ CONFIG_RTC_DS3231
CONFIG_RTC_FTRTC010 CONFIG_RTC_FTRTC010
CONFIG_RTC_IMXDI CONFIG_RTC_IMXDI
CONFIG_RTC_M41T11 CONFIG_RTC_M41T11
CONFIG_RTC_M41T62
CONFIG_RTC_MC13XXX CONFIG_RTC_MC13XXX
CONFIG_RTC_MCFRRTC CONFIG_RTC_MCFRRTC
CONFIG_RTC_MCP79411 CONFIG_RTC_MCP79411

View File

@ -126,7 +126,7 @@ def test_vboot(u_boot_console):
handle.write(struct.pack(">I", size)) handle.write(struct.pack(">I", size))
return struct.unpack(">I", total_size)[0] return struct.unpack(">I", total_size)[0]
def test_with_algo(sha_algo): def test_with_algo(sha_algo, padding):
"""Test verified boot with the given hash algorithm. """Test verified boot with the given hash algorithm.
This is the main part of the test code. The same procedure is followed This is the main part of the test code. The same procedure is followed
@ -144,7 +144,7 @@ def test_vboot(u_boot_console):
# Build the FIT, but don't sign anything yet # Build the FIT, but don't sign anything yet
cons.log.action('%s: Test FIT with signed images' % sha_algo) cons.log.action('%s: Test FIT with signed images' % sha_algo)
make_fit('sign-images-%s.its' % sha_algo) make_fit('sign-images-%s%s.its' % (sha_algo , padding))
run_bootm(sha_algo, 'unsigned images', 'dev-', True) run_bootm(sha_algo, 'unsigned images', 'dev-', True)
# Sign images with our dev keys # Sign images with our dev keys
@ -155,7 +155,7 @@ def test_vboot(u_boot_console):
dtc('sandbox-u-boot.dts') dtc('sandbox-u-boot.dts')
cons.log.action('%s: Test FIT with signed configuration' % sha_algo) cons.log.action('%s: Test FIT with signed configuration' % sha_algo)
make_fit('sign-configs-%s.its' % sha_algo) make_fit('sign-configs-%s%s.its' % (sha_algo , padding))
run_bootm(sha_algo, 'unsigned config', '%s+ OK' % sha_algo, True) run_bootm(sha_algo, 'unsigned config', '%s+ OK' % sha_algo, True)
# Sign images with our dev keys # Sign images with our dev keys
@ -204,7 +204,7 @@ def test_vboot(u_boot_console):
fit_check_sign = cons.config.build_dir + '/tools/fit_check_sign' fit_check_sign = cons.config.build_dir + '/tools/fit_check_sign'
dtc_args = '-I dts -O dtb -i %s' % tmpdir dtc_args = '-I dts -O dtb -i %s' % tmpdir
dtb = '%ssandbox-u-boot.dtb' % tmpdir dtb = '%ssandbox-u-boot.dtb' % tmpdir
sig_node = '/configurations/conf@1/signature@1' sig_node = '/configurations/conf-1/signature'
# Create an RSA key pair # Create an RSA key pair
public_exponent = 65537 public_exponent = 65537
@ -226,8 +226,10 @@ def test_vboot(u_boot_console):
# afterwards. # afterwards.
old_dtb = cons.config.dtb old_dtb = cons.config.dtb
cons.config.dtb = dtb cons.config.dtb = dtb
test_with_algo('sha1') test_with_algo('sha1','')
test_with_algo('sha256') test_with_algo('sha1','-pss')
test_with_algo('sha256','')
test_with_algo('sha256','-pss')
finally: finally:
# Go back to the original U-Boot with the correct dtb. # Go back to the original U-Boot with the correct dtb.
cons.config.dtb = old_dtb cons.config.dtb = old_dtb

View File

@ -0,0 +1,46 @@
/dts-v1/;
/ {
description = "Chrome OS kernel image with one or more FDT blobs";
#address-cells = <1>;
images {
kernel {
data = /incbin/("test-kernel.bin");
type = "kernel_noload";
arch = "sandbox";
os = "linux";
compression = "none";
load = <0x4>;
entry = <0x8>;
kernel-version = <1>;
hash-1 {
algo = "sha1";
};
};
fdt-1 {
description = "snow";
data = /incbin/("sandbox-kernel.dtb");
type = "flat_dt";
arch = "sandbox";
compression = "none";
fdt-version = <1>;
hash-1 {
algo = "sha1";
};
};
};
configurations {
default = "conf-1";
conf-1 {
kernel = "kernel";
fdt = "fdt-1";
signature {
algo = "sha1,rsa2048";
padding = "pss";
key-name-hint = "dev";
sign-images = "fdt", "kernel";
};
};
};
};

View File

@ -5,7 +5,7 @@
#address-cells = <1>; #address-cells = <1>;
images { images {
kernel@1 { kernel {
data = /incbin/("test-kernel.bin"); data = /incbin/("test-kernel.bin");
type = "kernel_noload"; type = "kernel_noload";
arch = "sandbox"; arch = "sandbox";
@ -14,28 +14,28 @@
load = <0x4>; load = <0x4>;
entry = <0x8>; entry = <0x8>;
kernel-version = <1>; kernel-version = <1>;
hash@1 { hash-1 {
algo = "sha1"; algo = "sha1";
}; };
}; };
fdt@1 { fdt-1 {
description = "snow"; description = "snow";
data = /incbin/("sandbox-kernel.dtb"); data = /incbin/("sandbox-kernel.dtb");
type = "flat_dt"; type = "flat_dt";
arch = "sandbox"; arch = "sandbox";
compression = "none"; compression = "none";
fdt-version = <1>; fdt-version = <1>;
hash@1 { hash-1 {
algo = "sha1"; algo = "sha1";
}; };
}; };
}; };
configurations { configurations {
default = "conf@1"; default = "conf-1";
conf@1 { conf-1 {
kernel = "kernel@1"; kernel = "kernel";
fdt = "fdt@1"; fdt = "fdt-1";
signature@1 { signature {
algo = "sha1,rsa2048"; algo = "sha1,rsa2048";
key-name-hint = "dev"; key-name-hint = "dev";
sign-images = "fdt", "kernel"; sign-images = "fdt", "kernel";

View File

@ -0,0 +1,46 @@
/dts-v1/;
/ {
description = "Chrome OS kernel image with one or more FDT blobs";
#address-cells = <1>;
images {
kernel {
data = /incbin/("test-kernel.bin");
type = "kernel_noload";
arch = "sandbox";
os = "linux";
compression = "none";
load = <0x4>;
entry = <0x8>;
kernel-version = <1>;
hash-1 {
algo = "sha256";
};
};
fdt-1 {
description = "snow";
data = /incbin/("sandbox-kernel.dtb");
type = "flat_dt";
arch = "sandbox";
compression = "none";
fdt-version = <1>;
hash-1 {
algo = "sha256";
};
};
};
configurations {
default = "conf-1";
conf-1 {
kernel = "kernel";
fdt = "fdt-1";
signature {
algo = "sha256,rsa2048";
padding = "pss";
key-name-hint = "dev";
sign-images = "fdt", "kernel";
};
};
};
};

View File

@ -5,7 +5,7 @@
#address-cells = <1>; #address-cells = <1>;
images { images {
kernel@1 { kernel {
data = /incbin/("test-kernel.bin"); data = /incbin/("test-kernel.bin");
type = "kernel_noload"; type = "kernel_noload";
arch = "sandbox"; arch = "sandbox";
@ -14,28 +14,28 @@
load = <0x4>; load = <0x4>;
entry = <0x8>; entry = <0x8>;
kernel-version = <1>; kernel-version = <1>;
hash@1 { hash-1 {
algo = "sha256"; algo = "sha256";
}; };
}; };
fdt@1 { fdt-1 {
description = "snow"; description = "snow";
data = /incbin/("sandbox-kernel.dtb"); data = /incbin/("sandbox-kernel.dtb");
type = "flat_dt"; type = "flat_dt";
arch = "sandbox"; arch = "sandbox";
compression = "none"; compression = "none";
fdt-version = <1>; fdt-version = <1>;
hash@1 { hash-1 {
algo = "sha256"; algo = "sha256";
}; };
}; };
}; };
configurations { configurations {
default = "conf@1"; default = "conf-1";
conf@1 { conf-1 {
kernel = "kernel@1"; kernel = "kernel";
fdt = "fdt@1"; fdt = "fdt-1";
signature@1 { signature {
algo = "sha256,rsa2048"; algo = "sha256,rsa2048";
key-name-hint = "dev"; key-name-hint = "dev";
sign-images = "fdt", "kernel"; sign-images = "fdt", "kernel";

View File

@ -0,0 +1,44 @@
/dts-v1/;
/ {
description = "Chrome OS kernel image with one or more FDT blobs";
#address-cells = <1>;
images {
kernel {
data = /incbin/("test-kernel.bin");
type = "kernel_noload";
arch = "sandbox";
os = "linux";
compression = "none";
load = <0x4>;
entry = <0x8>;
kernel-version = <1>;
signature {
algo = "sha1,rsa2048";
padding = "pss";
key-name-hint = "dev";
};
};
fdt-1 {
description = "snow";
data = /incbin/("sandbox-kernel.dtb");
type = "flat_dt";
arch = "sandbox";
compression = "none";
fdt-version = <1>;
signature {
algo = "sha1,rsa2048";
padding = "pss";
key-name-hint = "dev";
};
};
};
configurations {
default = "conf-1";
conf-1 {
kernel = "kernel";
fdt = "fdt-1";
};
};
};

View File

@ -5,7 +5,7 @@
#address-cells = <1>; #address-cells = <1>;
images { images {
kernel@1 { kernel {
data = /incbin/("test-kernel.bin"); data = /incbin/("test-kernel.bin");
type = "kernel_noload"; type = "kernel_noload";
arch = "sandbox"; arch = "sandbox";
@ -14,29 +14,29 @@
load = <0x4>; load = <0x4>;
entry = <0x8>; entry = <0x8>;
kernel-version = <1>; kernel-version = <1>;
signature@1 { signature {
algo = "sha1,rsa2048"; algo = "sha1,rsa2048";
key-name-hint = "dev"; key-name-hint = "dev";
}; };
}; };
fdt@1 { fdt-1 {
description = "snow"; description = "snow";
data = /incbin/("sandbox-kernel.dtb"); data = /incbin/("sandbox-kernel.dtb");
type = "flat_dt"; type = "flat_dt";
arch = "sandbox"; arch = "sandbox";
compression = "none"; compression = "none";
fdt-version = <1>; fdt-version = <1>;
signature@1 { signature {
algo = "sha1,rsa2048"; algo = "sha1,rsa2048";
key-name-hint = "dev"; key-name-hint = "dev";
}; };
}; };
}; };
configurations { configurations {
default = "conf@1"; default = "conf-1";
conf@1 { conf-1 {
kernel = "kernel@1"; kernel = "kernel";
fdt = "fdt@1"; fdt = "fdt-1";
}; };
}; };
}; };

View File

@ -0,0 +1,44 @@
/dts-v1/;
/ {
description = "Chrome OS kernel image with one or more FDT blobs";
#address-cells = <1>;
images {
kernel {
data = /incbin/("test-kernel.bin");
type = "kernel_noload";
arch = "sandbox";
os = "linux";
compression = "none";
load = <0x4>;
entry = <0x8>;
kernel-version = <1>;
signature {
algo = "sha256,rsa2048";
padding = "pss";
key-name-hint = "dev";
};
};
fdt-1 {
description = "snow";
data = /incbin/("sandbox-kernel.dtb");
type = "flat_dt";
arch = "sandbox";
compression = "none";
fdt-version = <1>;
signature {
algo = "sha256,rsa2048";
padding = "pss";
key-name-hint = "dev";
};
};
};
configurations {
default = "conf-1";
conf-1 {
kernel = "kernel";
fdt = "fdt-1";
};
};
};

View File

@ -5,7 +5,7 @@
#address-cells = <1>; #address-cells = <1>;
images { images {
kernel@1 { kernel {
data = /incbin/("test-kernel.bin"); data = /incbin/("test-kernel.bin");
type = "kernel_noload"; type = "kernel_noload";
arch = "sandbox"; arch = "sandbox";
@ -14,29 +14,29 @@
load = <0x4>; load = <0x4>;
entry = <0x8>; entry = <0x8>;
kernel-version = <1>; kernel-version = <1>;
signature@1 { signature {
algo = "sha256,rsa2048"; algo = "sha256,rsa2048";
key-name-hint = "dev"; key-name-hint = "dev";
}; };
}; };
fdt@1 { fdt-1 {
description = "snow"; description = "snow";
data = /incbin/("sandbox-kernel.dtb"); data = /incbin/("sandbox-kernel.dtb");
type = "flat_dt"; type = "flat_dt";
arch = "sandbox"; arch = "sandbox";
compression = "none"; compression = "none";
fdt-version = <1>; fdt-version = <1>;
signature@1 { signature {
algo = "sha256,rsa2048"; algo = "sha256,rsa2048";
key-name-hint = "dev"; key-name-hint = "dev";
}; };
}; };
}; };
configurations { configurations {
default = "conf@1"; default = "conf-1";
conf@1 { conf-1 {
kernel = "kernel@1"; kernel = "kernel";
fdt = "fdt@1"; fdt = "fdt-1";
}; };
}; };
}; };

View File

@ -157,6 +157,7 @@ static int fit_image_setup_sig(struct image_sign_info *info,
{ {
const char *node_name; const char *node_name;
char *algo_name; char *algo_name;
const char *padding_name;
node_name = fit_get_name(fit, noffset, NULL); node_name = fit_get_name(fit, noffset, NULL);
if (fit_image_hash_get_algo(fit, noffset, &algo_name)) { if (fit_image_hash_get_algo(fit, noffset, &algo_name)) {
@ -165,6 +166,8 @@ static int fit_image_setup_sig(struct image_sign_info *info,
return -1; return -1;
} }
padding_name = fdt_getprop(fit, noffset, "padding", NULL);
memset(info, '\0', sizeof(*info)); memset(info, '\0', sizeof(*info));
info->keydir = keydir; info->keydir = keydir;
info->keyname = fdt_getprop(fit, noffset, "key-name-hint", NULL); info->keyname = fdt_getprop(fit, noffset, "key-name-hint", NULL);
@ -173,6 +176,7 @@ static int fit_image_setup_sig(struct image_sign_info *info,
info->name = strdup(algo_name); info->name = strdup(algo_name);
info->checksum = image_get_checksum_algo(algo_name); info->checksum = image_get_checksum_algo(algo_name);
info->crypto = image_get_crypto_algo(algo_name); info->crypto = image_get_crypto_algo(algo_name);
info->padding = image_get_padding_algo(padding_name);
info->require_keys = require_keys; info->require_keys = require_keys;
info->engine_id = engine_id; info->engine_id = engine_id;
if (!info->checksum || !info->crypto) { if (!info->checksum || !info->crypto) {