Merge branch '2023-01-12-further-assorted-general-updates'
- Bring in a number of assorted updates, some of which have been waiting around for a bit. Make silent console really be silent, get rid of gpio_hog_probe_all, add RNG for imx6, make net/fm use fs_loader, get rid of a bad __weak usage and set distro_bootpart_uuid in another case.
This commit is contained in:
commit
87c9e117bf
@ -746,6 +746,16 @@ int arch_misc_init(void)
|
|||||||
if (ret)
|
if (ret)
|
||||||
printf("Failed to initialize caam_jr: %d\n", ret);
|
printf("Failed to initialize caam_jr: %d\n", ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IS_ENABLED(CONFIG_FSL_DCP_RNG)) {
|
||||||
|
struct udevice *dev;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = uclass_get_device_by_driver(UCLASS_RNG, DM_DRIVER_GET(dcp_rng), &dev);
|
||||||
|
if (ret)
|
||||||
|
printf("Failed to initialize dcp rng: %d\n", ret);
|
||||||
|
}
|
||||||
|
|
||||||
setup_serial_number();
|
setup_serial_number();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -181,7 +181,7 @@ int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr)
|
|||||||
if (!*loadaddr)
|
if (!*loadaddr)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!uclass_get_device(UCLASS_FS_FIRMWARE_LOADER, 0, &fsdev)) {
|
if (!get_fs_loader(&fsdev)) {
|
||||||
size = request_firmware_into_buf(fsdev, name, (void *)*loadaddr,
|
size = request_firmware_into_buf(fsdev, name, (void *)*loadaddr,
|
||||||
0, 0);
|
0, 0);
|
||||||
}
|
}
|
||||||
|
@ -214,7 +214,7 @@ int load_firmware(char *name_fw, u32 *loadaddr)
|
|||||||
if (!*loadaddr)
|
if (!*loadaddr)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!uclass_get_device(UCLASS_FS_FIRMWARE_LOADER, 0, &fsdev)) {
|
if (!get_fs_loader(&fsdev)) {
|
||||||
size = request_firmware_into_buf(fsdev, name_fw,
|
size = request_firmware_into_buf(fsdev, name_fw,
|
||||||
(void *)*loadaddr, 0, 0);
|
(void *)*loadaddr, 0, 0);
|
||||||
}
|
}
|
||||||
|
@ -112,6 +112,9 @@ int do_spi(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
|
|||||||
|
|
||||||
if ((flag & CMD_FLAG_REPEAT) == 0)
|
if ((flag & CMD_FLAG_REPEAT) == 0)
|
||||||
{
|
{
|
||||||
|
if (argc < 2)
|
||||||
|
return CMD_RET_USAGE;
|
||||||
|
|
||||||
if (argc >= 2) {
|
if (argc >= 2) {
|
||||||
mode = CONFIG_DEFAULT_SPI_MODE;
|
mode = CONFIG_DEFAULT_SPI_MODE;
|
||||||
bus = dectoul(argv[1], &cp);
|
bus = dectoul(argv[1], &cp);
|
||||||
|
@ -164,6 +164,16 @@ config SILENT_CONSOLE_UPDATE_ON_RELOC
|
|||||||
(e.g. NAND). This option makes the value of the 'silent'
|
(e.g. NAND). This option makes the value of the 'silent'
|
||||||
environment variable take effect at relocation.
|
environment variable take effect at relocation.
|
||||||
|
|
||||||
|
config SILENT_CONSOLE_UNTIL_ENV
|
||||||
|
bool "Keep console silent until environment is loaded"
|
||||||
|
depends on SILENT_CONSOLE
|
||||||
|
help
|
||||||
|
This option makes sure U-Boot will never use the console unless the
|
||||||
|
environment from flash does not contain the 'silent' variable. If
|
||||||
|
set, the console is kept silent until after the environment was
|
||||||
|
loaded. Use this in combination with PRE_CONSOLE_BUFFER to print out
|
||||||
|
earlier messages after loading the environment when allowed.
|
||||||
|
|
||||||
config PRE_CONSOLE_BUFFER
|
config PRE_CONSOLE_BUFFER
|
||||||
bool "Buffer characters before the console is available"
|
bool "Buffer characters before the console is available"
|
||||||
help
|
help
|
||||||
|
@ -756,9 +756,6 @@ static init_fnc_t init_sequence_r[] = {
|
|||||||
initr_status_led,
|
initr_status_led,
|
||||||
#endif
|
#endif
|
||||||
/* PPC has a udelay(20) here dating from 2002. Why? */
|
/* PPC has a udelay(20) here dating from 2002. Why? */
|
||||||
#if defined(CONFIG_GPIO_HOG)
|
|
||||||
gpio_hog_probe_all,
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_BOARD_LATE_INIT
|
#ifdef CONFIG_BOARD_LATE_INIT
|
||||||
board_late_init,
|
board_late_init,
|
||||||
#endif
|
#endif
|
||||||
|
@ -970,6 +970,11 @@ static bool console_update_silent(void)
|
|||||||
if (!IS_ENABLED(CONFIG_SILENT_CONSOLE))
|
if (!IS_ENABLED(CONFIG_SILENT_CONSOLE))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (IS_ENABLED(CONFIG_SILENT_CONSOLE_UNTIL_ENV) && !(gd->flags & GD_FLG_ENV_READY)) {
|
||||||
|
gd->flags |= GD_FLG_SILENT;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (env_get("silent")) {
|
if (env_get("silent")) {
|
||||||
gd->flags |= GD_FLG_SILENT;
|
gd->flags |= GD_FLG_SILENT;
|
||||||
return false;
|
return false;
|
||||||
|
@ -786,9 +786,6 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CONFIG_IS_ENABLED(GPIO_HOG))
|
|
||||||
gpio_hog_probe_all();
|
|
||||||
|
|
||||||
#if CONFIG_IS_ENABLED(BOARD_INIT)
|
#if CONFIG_IS_ENABLED(BOARD_INIT)
|
||||||
spl_board_init();
|
spl_board_init();
|
||||||
#endif
|
#endif
|
||||||
|
@ -38,12 +38,13 @@ static int spl_ram_load_image(struct spl_image_info *spl_image,
|
|||||||
struct spl_boot_device *bootdev)
|
struct spl_boot_device *bootdev)
|
||||||
{
|
{
|
||||||
struct legacy_img_hdr *header;
|
struct legacy_img_hdr *header;
|
||||||
|
int ret;
|
||||||
|
|
||||||
header = (struct legacy_img_hdr *)CONFIG_SPL_LOAD_FIT_ADDRESS;
|
header = (struct legacy_img_hdr *)CONFIG_SPL_LOAD_FIT_ADDRESS;
|
||||||
|
|
||||||
if (CONFIG_IS_ENABLED(IMAGE_PRE_LOAD)) {
|
if (CONFIG_IS_ENABLED(IMAGE_PRE_LOAD)) {
|
||||||
unsigned long addr = (unsigned long)header;
|
unsigned long addr = (unsigned long)header;
|
||||||
int ret = image_pre_load(addr);
|
ret = image_pre_load(addr);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
@ -64,7 +65,7 @@ static int spl_ram_load_image(struct spl_image_info *spl_image,
|
|||||||
debug("Found FIT\n");
|
debug("Found FIT\n");
|
||||||
load.bl_len = 1;
|
load.bl_len = 1;
|
||||||
load.read = spl_ram_load_read;
|
load.read = spl_ram_load_read;
|
||||||
spl_load_simple_fit(spl_image, &load, 0, header);
|
ret = spl_load_simple_fit(spl_image, &load, 0, header);
|
||||||
} else {
|
} else {
|
||||||
ulong u_boot_pos = spl_get_image_pos();
|
ulong u_boot_pos = spl_get_image_pos();
|
||||||
|
|
||||||
@ -85,10 +86,10 @@ static int spl_ram_load_image(struct spl_image_info *spl_image,
|
|||||||
}
|
}
|
||||||
header = (struct legacy_img_hdr *)map_sysmem(u_boot_pos, 0);
|
header = (struct legacy_img_hdr *)map_sysmem(u_boot_pos, 0);
|
||||||
|
|
||||||
spl_parse_image_header(spl_image, bootdev, header);
|
ret = spl_parse_image_header(spl_image, bootdev, header);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
#if CONFIG_IS_ENABLED(RAM_DEVICE)
|
#if CONFIG_IS_ENABLED(RAM_DEVICE)
|
||||||
SPL_LOAD_IMAGE_METHOD("RAM", 0, BOOT_DEVICE_RAM, spl_ram_load_image);
|
SPL_LOAD_IMAGE_METHOD("RAM", 0, BOOT_DEVICE_RAM, spl_ram_load_image);
|
||||||
|
@ -65,3 +65,7 @@ CONFIG_DM_SPI=y
|
|||||||
CONFIG_FSL_QSPI=y
|
CONFIG_FSL_QSPI=y
|
||||||
CONFIG_SOFT_SPI=y
|
CONFIG_SOFT_SPI=y
|
||||||
CONFIG_IMX_THERMAL=y
|
CONFIG_IMX_THERMAL=y
|
||||||
|
CONFIG_ARCH_MISC_INIT=y
|
||||||
|
CONFIG_DM_RNG=y
|
||||||
|
CONFIG_CMD_RNG=y
|
||||||
|
CONFIG_FSL_DCP_RNG=y
|
||||||
|
@ -64,3 +64,7 @@ CONFIG_DM_SPI=y
|
|||||||
CONFIG_FSL_QSPI=y
|
CONFIG_FSL_QSPI=y
|
||||||
CONFIG_SOFT_SPI=y
|
CONFIG_SOFT_SPI=y
|
||||||
CONFIG_IMX_THERMAL=y
|
CONFIG_IMX_THERMAL=y
|
||||||
|
CONFIG_ARCH_MISC_INIT=y
|
||||||
|
CONFIG_DM_RNG=y
|
||||||
|
CONFIG_CMD_RNG=y
|
||||||
|
CONFIG_FSL_DCP_RNG=y
|
||||||
|
@ -2,10 +2,8 @@
|
|||||||
GPIO hog (CONFIG_GPIO_HOG)
|
GPIO hog (CONFIG_GPIO_HOG)
|
||||||
--------
|
--------
|
||||||
|
|
||||||
All the GPIO hog are initialized in gpio_hog_probe_all() function called in
|
All the GPIO hog are initialized using DM_FLAG_PROBE_AFTER_BIND DM flag
|
||||||
board_r.c just before board_late_init() but you can also acces directly to
|
after bind().
|
||||||
the gpio with gpio_hog_lookup_name().
|
|
||||||
|
|
||||||
|
|
||||||
Example, for the device tree:
|
Example, for the device tree:
|
||||||
|
|
||||||
|
@ -363,20 +363,22 @@ void *dm_priv_to_rw(void *priv)
|
|||||||
|
|
||||||
static int dm_probe_devices(struct udevice *dev, bool pre_reloc_only)
|
static int dm_probe_devices(struct udevice *dev, bool pre_reloc_only)
|
||||||
{
|
{
|
||||||
u32 mask = DM_FLAG_PROBE_AFTER_BIND;
|
ofnode node = dev_ofnode(dev);
|
||||||
u32 flags = dev_get_flags(dev);
|
|
||||||
struct udevice *child;
|
struct udevice *child;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (pre_reloc_only)
|
if (pre_reloc_only &&
|
||||||
mask |= DM_FLAG_PRE_RELOC;
|
(!ofnode_valid(node) || !ofnode_pre_reloc(node)) &&
|
||||||
|
!(dev->driver->flags & DM_FLAG_PRE_RELOC))
|
||||||
|
goto probe_children;
|
||||||
|
|
||||||
if ((flags & mask) == mask) {
|
if (dev_get_flags(dev) & DM_FLAG_PROBE_AFTER_BIND) {
|
||||||
ret = device_probe(dev);
|
ret = device_probe(dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
probe_children:
|
||||||
list_for_each_entry(child, &dev->child_head, sibling_node)
|
list_for_each_entry(child, &dev->child_head, sibling_node)
|
||||||
dm_probe_devices(child, pre_reloc_only);
|
dm_probe_devices(child, pre_reloc_only);
|
||||||
|
|
||||||
|
@ -73,3 +73,13 @@ config FSL_CAAM_RNG
|
|||||||
reseeded from the TRNG every time random data is generated.
|
reseeded from the TRNG every time random data is generated.
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
config FSL_DCP_RNG
|
||||||
|
bool "Enable Random Number Generator support"
|
||||||
|
depends on DM_RNG
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
Enable support for the hardware based random number generator
|
||||||
|
module of the DCP. It uses the True Random Number Generator (TRNG)
|
||||||
|
and a Pseudo-Random Number Generator (PRNG) to achieve a true
|
||||||
|
randomness and cryptographic strength.
|
||||||
|
@ -7,4 +7,5 @@ obj-$(CONFIG_FSL_CAAM) += jr.o fsl_hash.o jobdesc.o error.o
|
|||||||
obj-$(CONFIG_CMD_BLOB)$(CONFIG_IMX_CAAM_DEK_ENCAP) += fsl_blob.o
|
obj-$(CONFIG_CMD_BLOB)$(CONFIG_IMX_CAAM_DEK_ENCAP) += fsl_blob.o
|
||||||
obj-$(CONFIG_RSA_FREESCALE_EXP) += fsl_rsa.o
|
obj-$(CONFIG_RSA_FREESCALE_EXP) += fsl_rsa.o
|
||||||
obj-$(CONFIG_FSL_CAAM_RNG) += rng.o
|
obj-$(CONFIG_FSL_CAAM_RNG) += rng.o
|
||||||
|
obj-$(CONFIG_FSL_DCP_RNG) += dcp_rng.o
|
||||||
obj-$(CONFIG_FSL_MFGPROT) += fsl_mfgprot.o
|
obj-$(CONFIG_FSL_MFGPROT) += fsl_mfgprot.o
|
||||||
|
182
drivers/crypto/fsl/dcp_rng.c
Normal file
182
drivers/crypto/fsl/dcp_rng.c
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
/*
|
||||||
|
* RNG driver for Freescale RNGC
|
||||||
|
*
|
||||||
|
* Copyright 2022 NXP
|
||||||
|
*
|
||||||
|
* Based on RNGC driver in drivers/char/hw_random/imx-rngc.c in Linux
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <cpu_func.h>
|
||||||
|
#include <dm.h>
|
||||||
|
#include <rng.h>
|
||||||
|
#include <asm/cache.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <dm/root.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
|
||||||
|
#define DCP_RNG_MAX_FIFO_STORE_SIZE 4
|
||||||
|
#define RNGC_VER_ID 0x0
|
||||||
|
#define RNGC_COMMAND 0x4
|
||||||
|
#define RNGC_CONTROL 0x8
|
||||||
|
#define RNGC_STATUS 0xC
|
||||||
|
#define RNGC_ERROR 0x10
|
||||||
|
#define RNGC_FIFO 0x14
|
||||||
|
|
||||||
|
/* the fields in the ver id register */
|
||||||
|
#define RNGC_TYPE_SHIFT 28
|
||||||
|
|
||||||
|
/* the rng_type field */
|
||||||
|
#define RNGC_TYPE_RNGB 0x1
|
||||||
|
#define RNGC_TYPE_RNGC 0x2
|
||||||
|
|
||||||
|
#define RNGC_CMD_CLR_ERR 0x20
|
||||||
|
#define RNGC_CMD_SEED 0x2
|
||||||
|
|
||||||
|
#define RNGC_CTRL_AUTO_SEED 0x10
|
||||||
|
|
||||||
|
#define RNGC_STATUS_ERROR 0x10000
|
||||||
|
#define RNGC_STATUS_FIFO_LEVEL_MASK 0xf00
|
||||||
|
#define RNGC_STATUS_FIFO_LEVEL_SHIFT 8
|
||||||
|
#define RNGC_STATUS_SEED_DONE 0x20
|
||||||
|
#define RNGC_STATUS_ST_DONE 0x10
|
||||||
|
|
||||||
|
#define RNGC_ERROR_STATUS_STAT_ERR 0x8
|
||||||
|
|
||||||
|
#define RNGC_TIMEOUT 3000000U /* 3 sec */
|
||||||
|
|
||||||
|
struct imx_rngc_priv {
|
||||||
|
unsigned long base;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int rngc_read(struct udevice *dev, void *data, size_t len)
|
||||||
|
{
|
||||||
|
struct imx_rngc_priv *priv = dev_get_priv(dev);
|
||||||
|
u8 buffer[DCP_RNG_MAX_FIFO_STORE_SIZE];
|
||||||
|
u32 status, level;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
while (len) {
|
||||||
|
status = readl(priv->base + RNGC_STATUS);
|
||||||
|
|
||||||
|
/* is there some error while reading this random number? */
|
||||||
|
if (status & RNGC_STATUS_ERROR)
|
||||||
|
break;
|
||||||
|
/* how many random numbers are in FIFO? [0-16] */
|
||||||
|
level = (status & RNGC_STATUS_FIFO_LEVEL_MASK) >>
|
||||||
|
RNGC_STATUS_FIFO_LEVEL_SHIFT;
|
||||||
|
|
||||||
|
if (level) {
|
||||||
|
/* retrieve a random number from FIFO */
|
||||||
|
*(u32 *)buffer = readl(priv->base + RNGC_FIFO);
|
||||||
|
size = min(len, sizeof(u32));
|
||||||
|
memcpy(data, buffer, size);
|
||||||
|
data += size;
|
||||||
|
len -= size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return len ? -EIO : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rngc_init(struct imx_rngc_priv *priv)
|
||||||
|
{
|
||||||
|
u32 cmd, ctrl, status, err_reg = 0;
|
||||||
|
unsigned long long timeval = 0;
|
||||||
|
unsigned long long timeout = RNGC_TIMEOUT;
|
||||||
|
|
||||||
|
/* clear error */
|
||||||
|
cmd = readl(priv->base + RNGC_COMMAND);
|
||||||
|
writel(cmd | RNGC_CMD_CLR_ERR, priv->base + RNGC_COMMAND);
|
||||||
|
|
||||||
|
/* create seed, repeat while there is some statistical error */
|
||||||
|
do {
|
||||||
|
/* seed creation */
|
||||||
|
cmd = readl(priv->base + RNGC_COMMAND);
|
||||||
|
writel(cmd | RNGC_CMD_SEED, priv->base + RNGC_COMMAND);
|
||||||
|
|
||||||
|
udelay(1);
|
||||||
|
timeval += 1;
|
||||||
|
|
||||||
|
status = readl(priv->base + RNGC_STATUS);
|
||||||
|
err_reg = readl(priv->base + RNGC_ERROR);
|
||||||
|
|
||||||
|
if (status & (RNGC_STATUS_SEED_DONE | RNGC_STATUS_ST_DONE))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (timeval > timeout) {
|
||||||
|
debug("rngc timed out\n");
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
}
|
||||||
|
} while (err_reg == RNGC_ERROR_STATUS_STAT_ERR);
|
||||||
|
|
||||||
|
if (err_reg)
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* enable automatic seeding, the rngc creates a new seed automatically
|
||||||
|
* after serving 2^20 random 160-bit words
|
||||||
|
*/
|
||||||
|
ctrl = readl(priv->base + RNGC_CONTROL);
|
||||||
|
ctrl |= RNGC_CTRL_AUTO_SEED;
|
||||||
|
writel(ctrl, priv->base + RNGC_CONTROL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rngc_probe(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct imx_rngc_priv *priv = dev_get_priv(dev);
|
||||||
|
fdt_addr_t addr;
|
||||||
|
u32 ver_id;
|
||||||
|
u8 rng_type;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
addr = dev_read_addr(dev);
|
||||||
|
if (addr == FDT_ADDR_T_NONE) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
priv->base = addr;
|
||||||
|
ver_id = readl(priv->base + RNGC_VER_ID);
|
||||||
|
rng_type = ver_id >> RNGC_TYPE_SHIFT;
|
||||||
|
/*
|
||||||
|
* This driver supports only RNGC and RNGB. (There's a different
|
||||||
|
* driver for RNGA.)
|
||||||
|
*/
|
||||||
|
if (rng_type != RNGC_TYPE_RNGC && rng_type != RNGC_TYPE_RNGB) {
|
||||||
|
ret = -ENODEV;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = rngc_init(priv);
|
||||||
|
if (ret)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err:
|
||||||
|
printf("%s error = %d\n", __func__, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct dm_rng_ops rngc_ops = {
|
||||||
|
.read = rngc_read,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct udevice_id rngc_dt_ids[] = {
|
||||||
|
{ .compatible = "fsl,imx25-rngb" },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
U_BOOT_DRIVER(dcp_rng) = {
|
||||||
|
.name = "dcp_rng",
|
||||||
|
.id = UCLASS_RNG,
|
||||||
|
.of_match = rngc_dt_ids,
|
||||||
|
.ops = &rngc_ops,
|
||||||
|
.probe = rngc_probe,
|
||||||
|
.priv_auto = sizeof(struct imx_rngc_priv),
|
||||||
|
.flags = DM_FLAG_ALLOC_PRIV_DMA,
|
||||||
|
};
|
@ -777,42 +777,20 @@ int socfpga_loadfs(fpga_fs_info *fpga_fsinfo, const void *buf, size_t bsize,
|
|||||||
{
|
{
|
||||||
struct fpga_loadfs_info fpga_loadfs;
|
struct fpga_loadfs_info fpga_loadfs;
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
int status, ret, size;
|
int status, ret;
|
||||||
u32 buffer = (uintptr_t)buf;
|
u32 buffer = (uintptr_t)buf;
|
||||||
size_t buffer_sizebytes = bsize;
|
size_t buffer_sizebytes = bsize;
|
||||||
size_t buffer_sizebytes_ori = bsize;
|
size_t buffer_sizebytes_ori = bsize;
|
||||||
size_t total_sizeof_image = 0;
|
size_t total_sizeof_image = 0;
|
||||||
ofnode node;
|
ofnode node;
|
||||||
const fdt32_t *phandle_p;
|
|
||||||
u32 phandle;
|
|
||||||
|
|
||||||
node = get_fpga_mgr_ofnode(ofnode_null());
|
node = get_fpga_mgr_ofnode(ofnode_null());
|
||||||
|
|
||||||
if (ofnode_valid(node)) {
|
|
||||||
phandle_p = ofnode_get_property(node, "firmware-loader", &size);
|
|
||||||
if (!phandle_p) {
|
|
||||||
node = ofnode_path("/chosen");
|
|
||||||
if (!ofnode_valid(node)) {
|
if (!ofnode_valid(node)) {
|
||||||
debug("FPGA: /chosen node was not found.\n");
|
|
||||||
return -ENOENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
phandle_p = ofnode_get_property(node, "firmware-loader",
|
|
||||||
&size);
|
|
||||||
if (!phandle_p) {
|
|
||||||
debug("FPGA: firmware-loader property was not");
|
|
||||||
debug(" found.\n");
|
|
||||||
return -ENOENT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
debug("FPGA: FPGA manager node was not found.\n");
|
debug("FPGA: FPGA manager node was not found.\n");
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
phandle = fdt32_to_cpu(*phandle_p);
|
ret = get_fs_loader(&dev);
|
||||||
ret = uclass_get_device_by_phandle_id(UCLASS_FS_FIRMWARE_LOADER,
|
|
||||||
phandle, &dev);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -311,34 +311,11 @@ static int gpio_hog_probe(struct udevice *dev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int gpio_hog_probe_all(void)
|
|
||||||
{
|
|
||||||
struct udevice *dev;
|
|
||||||
int ret;
|
|
||||||
int retval = 0;
|
|
||||||
|
|
||||||
for (uclass_first_device(UCLASS_NOP, &dev);
|
|
||||||
dev;
|
|
||||||
uclass_find_next_device(&dev)) {
|
|
||||||
if (dev->driver == DM_DRIVER_GET(gpio_hog)) {
|
|
||||||
ret = device_probe(dev);
|
|
||||||
if (ret) {
|
|
||||||
printf("Failed to probe device %s err: %d\n",
|
|
||||||
dev->name, ret);
|
|
||||||
retval = ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
int gpio_hog_lookup_name(const char *name, struct gpio_desc **desc)
|
int gpio_hog_lookup_name(const char *name, struct gpio_desc **desc)
|
||||||
{
|
{
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
|
|
||||||
*desc = NULL;
|
*desc = NULL;
|
||||||
gpio_hog_probe_all();
|
|
||||||
if (!uclass_get_device_by_name(UCLASS_NOP, name, &dev)) {
|
if (!uclass_get_device_by_name(UCLASS_NOP, name, &dev)) {
|
||||||
struct gpio_hog_priv *priv = dev_get_priv(dev);
|
struct gpio_hog_priv *priv = dev_get_priv(dev);
|
||||||
|
|
||||||
@ -1505,9 +1482,17 @@ static int gpio_post_bind(struct udevice *dev)
|
|||||||
&child);
|
&child);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure gpio-hogs are probed after bind
|
||||||
|
* since hogs can be essential to the hardware
|
||||||
|
* system.
|
||||||
|
*/
|
||||||
|
dev_or_flags(child, DM_FLAG_PROBE_AFTER_BIND);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
#include <fs_loader.h>
|
#include <fs_loader.h>
|
||||||
#include <log.h>
|
#include <log.h>
|
||||||
#include <asm/global_data.h>
|
#include <asm/global_data.h>
|
||||||
|
#include <dm/device-internal.h>
|
||||||
|
#include <dm/root.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <mapmem.h>
|
#include <mapmem.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
@ -297,6 +299,31 @@ U_BOOT_DRIVER(fs_loader) = {
|
|||||||
.priv_auto = sizeof(struct firmware),
|
.priv_auto = sizeof(struct firmware),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct device_plat default_plat = { 0 };
|
||||||
|
|
||||||
|
int get_fs_loader(struct udevice **dev)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
ofnode node = ofnode_get_chosen_node("firmware-loader");
|
||||||
|
|
||||||
|
if (ofnode_valid(node))
|
||||||
|
return uclass_get_device_by_ofnode(UCLASS_FS_FIRMWARE_LOADER,
|
||||||
|
node, dev);
|
||||||
|
|
||||||
|
/* Try the first device if none was chosen */
|
||||||
|
ret = uclass_first_device_err(UCLASS_FS_FIRMWARE_LOADER, dev);
|
||||||
|
if (ret != -ENODEV)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/* Just create a new device */
|
||||||
|
ret = device_bind(dm_root(), DM_DRIVER_GET(fs_loader), "default-loader",
|
||||||
|
&default_plat, ofnode_null(), dev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return device_probe(*dev);
|
||||||
|
}
|
||||||
|
|
||||||
UCLASS_DRIVER(fs_loader) = {
|
UCLASS_DRIVER(fs_loader) = {
|
||||||
.id = UCLASS_FS_FIRMWARE_LOADER,
|
.id = UCLASS_FS_FIRMWARE_LOADER,
|
||||||
.name = "fs-loader",
|
.name = "fs-loader",
|
||||||
|
@ -5,9 +5,11 @@
|
|||||||
*/
|
*/
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <env.h>
|
#include <env.h>
|
||||||
|
#include <fs_loader.h>
|
||||||
#include <image.h>
|
#include <image.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
#include <dm/device_compat.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <u-boot/crc.h>
|
#include <u-boot/crc.h>
|
||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
@ -353,7 +355,7 @@ static void fm_init_qmi(struct fm_qmi_common *qmi)
|
|||||||
|
|
||||||
/* Init common part of FM, index is fm num# like fm as above */
|
/* Init common part of FM, index is fm num# like fm as above */
|
||||||
#ifdef CONFIG_TFABOOT
|
#ifdef CONFIG_TFABOOT
|
||||||
int fm_init_common(int index, struct ccsr_fman *reg)
|
int fm_init_common(int index, struct ccsr_fman *reg, const char *firmware_name)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
void *addr = NULL;
|
void *addr = NULL;
|
||||||
@ -448,10 +450,32 @@ int fm_init_common(int index, struct ccsr_fman *reg)
|
|||||||
return fm_init_bmi(index, ®->fm_bmi_common);
|
return fm_init_bmi(index, ®->fm_bmi_common);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
int fm_init_common(int index, struct ccsr_fman *reg)
|
int fm_init_common(int index, struct ccsr_fman *reg, const char *firmware_name)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
#if defined(CONFIG_SYS_QE_FMAN_FW_IN_NOR)
|
#if defined(CONFIG_SYS_QE_FMAN_FW_IN_FS)
|
||||||
|
struct udevice *fs_loader;
|
||||||
|
void *addr = malloc(CONFIG_SYS_QE_FMAN_FW_LENGTH);
|
||||||
|
|
||||||
|
if (!addr)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
rc = get_fs_loader(&fs_loader);
|
||||||
|
if (rc) {
|
||||||
|
debug("could not get fs loader: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!firmware_name)
|
||||||
|
firmware_name = "fman.itb";
|
||||||
|
|
||||||
|
rc = request_firmware_into_buf(fs_loader, firmware_name, addr,
|
||||||
|
CONFIG_SYS_QE_FMAN_FW_LENGTH, 0);
|
||||||
|
if (rc < 0) {
|
||||||
|
debug("could not request %s: %d\n", firmware_name, rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
#elif defined(CONFIG_SYS_QE_FMAN_FW_IN_NOR)
|
||||||
void *addr = (void *)CONFIG_SYS_FMAN_FW_ADDR;
|
void *addr = (void *)CONFIG_SYS_FMAN_FW_ADDR;
|
||||||
#elif defined(CONFIG_SYS_QE_FMAN_FW_IN_NAND)
|
#elif defined(CONFIG_SYS_QE_FMAN_FW_IN_NAND)
|
||||||
size_t fw_length = CONFIG_SYS_QE_FMAN_FW_LENGTH;
|
size_t fw_length = CONFIG_SYS_QE_FMAN_FW_LENGTH;
|
||||||
@ -561,6 +585,8 @@ static const struct udevice_id fman_ids[] = {
|
|||||||
|
|
||||||
static int fman_probe(struct udevice *dev)
|
static int fman_probe(struct udevice *dev)
|
||||||
{
|
{
|
||||||
|
const char *firmware_name = NULL;
|
||||||
|
int ret;
|
||||||
struct fman_priv *priv = dev_get_priv(dev);
|
struct fman_priv *priv = dev_get_priv(dev);
|
||||||
|
|
||||||
priv->reg = (struct ccsr_fman *)(uintptr_t)dev_read_addr(dev);
|
priv->reg = (struct ccsr_fman *)(uintptr_t)dev_read_addr(dev);
|
||||||
@ -570,7 +596,13 @@ static int fman_probe(struct udevice *dev)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return fm_init_common(priv->fman_id, priv->reg);
|
ret = dev_read_string_index(dev, "firmware-name", 0, &firmware_name);
|
||||||
|
if (ret && ret != -EINVAL) {
|
||||||
|
dev_dbg(dev, "Could not read firmware-name\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fm_init_common(priv->fman_id, priv->reg, firmware_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fman_remove(struct udevice *dev)
|
static int fman_remove(struct udevice *dev)
|
||||||
|
@ -106,7 +106,7 @@ struct fm_port_global_pram {
|
|||||||
|
|
||||||
void *fm_muram_alloc(int fm_idx, size_t size, ulong align);
|
void *fm_muram_alloc(int fm_idx, size_t size, ulong align);
|
||||||
void *fm_muram_base(int fm_idx);
|
void *fm_muram_base(int fm_idx);
|
||||||
int fm_init_common(int index, struct ccsr_fman *reg);
|
int fm_init_common(int index, struct ccsr_fman *reg, const char *firmware_name);
|
||||||
int fm_eth_initialize(struct ccsr_fman *reg, struct fm_eth_info *info);
|
int fm_eth_initialize(struct ccsr_fman *reg, struct fm_eth_info *info);
|
||||||
phy_interface_t fman_port_enet_if(enum fm_port port);
|
phy_interface_t fman_port_enet_if(enum fm_port port);
|
||||||
void fman_disable_port(enum fm_port port);
|
void fman_disable_port(enum fm_port port);
|
||||||
|
@ -27,6 +27,10 @@ choice
|
|||||||
depends on FMAN_ENET || QE
|
depends on FMAN_ENET || QE
|
||||||
default SYS_QE_FMAN_FW_IN_ROM
|
default SYS_QE_FMAN_FW_IN_ROM
|
||||||
|
|
||||||
|
config SYS_QE_FMAN_FW_IN_FS
|
||||||
|
depends on FS_LOADER && FMAN_ENET
|
||||||
|
bool "Filesystem"
|
||||||
|
|
||||||
config SYS_QE_FMAN_FW_IN_NOR
|
config SYS_QE_FMAN_FW_IN_NOR
|
||||||
bool "NOR flash"
|
bool "NOR flash"
|
||||||
|
|
||||||
|
@ -461,14 +461,6 @@ int dm_gpio_lookup_name(const char *name, struct gpio_desc *desc);
|
|||||||
*/
|
*/
|
||||||
int gpio_hog_lookup_name(const char *name, struct gpio_desc **desc);
|
int gpio_hog_lookup_name(const char *name, struct gpio_desc **desc);
|
||||||
|
|
||||||
/**
|
|
||||||
* gpio_hog_probe_all() - probe all gpio devices with
|
|
||||||
* gpio-hog subnodes.
|
|
||||||
*
|
|
||||||
* @return: Returns return value from device_probe()
|
|
||||||
*/
|
|
||||||
int gpio_hog_probe_all(void);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gpio_lookup_name - Look up a GPIO name and return its details
|
* gpio_lookup_name - Look up a GPIO name and return its details
|
||||||
*
|
*
|
||||||
|
@ -521,6 +521,9 @@
|
|||||||
"if fstype ${devtype} " \
|
"if fstype ${devtype} " \
|
||||||
"${devnum}:${distro_bootpart} " \
|
"${devnum}:${distro_bootpart} " \
|
||||||
"bootfstype; then " \
|
"bootfstype; then " \
|
||||||
|
"part uuid ${devtype} " \
|
||||||
|
"${devnum}:${distro_bootpart} " \
|
||||||
|
"distro_bootpart_uuid ; " \
|
||||||
"run scan_dev_for_boot; " \
|
"run scan_dev_for_boot; " \
|
||||||
"fi; " \
|
"fi; " \
|
||||||
"done; " \
|
"done; " \
|
||||||
|
@ -52,4 +52,16 @@ struct device_plat {
|
|||||||
int request_firmware_into_buf(struct udevice *dev,
|
int request_firmware_into_buf(struct udevice *dev,
|
||||||
const char *name,
|
const char *name,
|
||||||
void *buf, size_t size, u32 offset);
|
void *buf, size_t size, u32 offset);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get_fs_loader() - Get the chosen filesystem loader
|
||||||
|
* @dev: Where to store the device
|
||||||
|
*
|
||||||
|
* This gets a filesystem loader device based on the value of
|
||||||
|
* /chosen/firmware-loader. If no such property exists, it returns a
|
||||||
|
* firmware loader which is configured by environmental variables.
|
||||||
|
*
|
||||||
|
* Return: 0 on success, negative value on error
|
||||||
|
*/
|
||||||
|
int get_fs_loader(struct udevice **dev);
|
||||||
#endif
|
#endif
|
||||||
|
@ -63,7 +63,7 @@ ulong timer_get_boot_us(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
extern unsigned long __weak timer_read_counter(void);
|
extern unsigned long timer_read_counter(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_IS_ENABLED(TIMER)
|
#if CONFIG_IS_ENABLED(TIMER)
|
||||||
|
Loading…
Reference in New Issue
Block a user