Merge tag 'efi-2020-01-rc2-2' of https://gitlab.denx.de/u-boot/custodians/u-boot-efi
Pull request for UEFI sub-system for efi-2021-01-rc2 (2) The series contains the following enhancements * preparatory patches for UEFI capsule updates * initialization of the emulated RTC using an environment variable and a bug fix * If DisconnectController() is called for a child controller that is the only child of the driver, the driver must be disconnected.
This commit is contained in:
@@ -14,9 +14,15 @@ config DFU_OVER_TFTP
|
||||
depends on NET
|
||||
|
||||
if DFU
|
||||
config DFU_WRITE_ALT
|
||||
bool
|
||||
default n
|
||||
|
||||
config DFU_TFTP
|
||||
bool "DFU via TFTP"
|
||||
select DFU_WRITE_ALT
|
||||
select DFU_OVER_TFTP
|
||||
select UPDATE_COMMON
|
||||
help
|
||||
This option allows performing update of DFU-managed medium with data
|
||||
sent via TFTP boot.
|
||||
|
||||
@@ -9,5 +9,5 @@ obj-$(CONFIG_$(SPL_)DFU_MTD) += dfu_mtd.o
|
||||
obj-$(CONFIG_$(SPL_)DFU_NAND) += dfu_nand.o
|
||||
obj-$(CONFIG_$(SPL_)DFU_RAM) += dfu_ram.o
|
||||
obj-$(CONFIG_$(SPL_)DFU_SF) += dfu_sf.o
|
||||
obj-$(CONFIG_$(SPL_)DFU_TFTP) += dfu_tftp.o
|
||||
obj-$(CONFIG_$(SPL_)DFU_WRITE_ALT) += dfu_alt.o
|
||||
obj-$(CONFIG_$(SPL_)DFU_VIRT) += dfu_virt.o
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/compiler.h>
|
||||
|
||||
static LIST_HEAD(dfu_list);
|
||||
LIST_HEAD(dfu_list);
|
||||
static int dfu_alt_num;
|
||||
static int alt_num_cnt;
|
||||
static struct hash_algo *dfu_hash_algo;
|
||||
|
||||
125
drivers/dfu/dfu_alt.c
Normal file
125
drivers/dfu/dfu_alt.c
Normal file
@@ -0,0 +1,125 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2015
|
||||
* Lukasz Majewski <l.majewski@majess.pl>
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <log.h>
|
||||
#include <malloc.h>
|
||||
#include <errno.h>
|
||||
#include <dfu.h>
|
||||
|
||||
/**
|
||||
* dfu_write_by_name() - write data to DFU medium
|
||||
* @dfu_entity_name: Name of DFU entity to write
|
||||
* @addr: Address of data buffer to write
|
||||
* @len: Number of bytes
|
||||
* @interface: Destination DFU medium (e.g. "mmc")
|
||||
* @devstring: Instance number of destination DFU medium (e.g. "1")
|
||||
*
|
||||
* This function is storing data received on DFU supported medium which
|
||||
* is specified by @dfu_entity_name.
|
||||
*
|
||||
* Return: 0 - on success, error code - otherwise
|
||||
*/
|
||||
int dfu_write_by_name(char *dfu_entity_name, void *addr,
|
||||
unsigned int len, char *interface, char *devstring)
|
||||
{
|
||||
char *s, *sb;
|
||||
int alt_setting_num, ret;
|
||||
struct dfu_entity *dfu;
|
||||
|
||||
debug("%s: name: %s addr: 0x%p len: %d device: %s:%s\n", __func__,
|
||||
dfu_entity_name, addr, len, interface, devstring);
|
||||
|
||||
ret = dfu_init_env_entities(interface, devstring);
|
||||
if (ret)
|
||||
goto done;
|
||||
|
||||
/*
|
||||
* We need to copy name pointed by *dfu_entity_name since this text
|
||||
* is the integral part of the FDT image.
|
||||
* Any implicit modification (i.e. done by strsep()) will corrupt
|
||||
* the FDT image and prevent other images to be stored.
|
||||
*/
|
||||
s = strdup(dfu_entity_name);
|
||||
sb = s;
|
||||
if (!s) {
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
|
||||
strsep(&s, "@");
|
||||
debug("%s: image name: %s strlen: %zd\n", __func__, sb, strlen(sb));
|
||||
|
||||
alt_setting_num = dfu_get_alt(sb);
|
||||
free(sb);
|
||||
if (alt_setting_num < 0) {
|
||||
pr_err("Alt setting [%d] to write not found!",
|
||||
alt_setting_num);
|
||||
ret = -ENODEV;
|
||||
goto done;
|
||||
}
|
||||
|
||||
dfu = dfu_get_entity(alt_setting_num);
|
||||
if (!dfu) {
|
||||
pr_err("DFU entity for alt: %d not found!", alt_setting_num);
|
||||
ret = -ENODEV;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = dfu_write_from_mem_addr(dfu, (void *)addr, len);
|
||||
|
||||
done:
|
||||
dfu_free_entities();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* dfu_write_by_alt() - write data to DFU medium
|
||||
* @dfu_alt_num: DFU alt setting number
|
||||
* @addr: Address of data buffer to write
|
||||
* @len: Number of bytes
|
||||
* @interface: Destination DFU medium (e.g. "mmc")
|
||||
* @devstring: Instance number of destination DFU medium (e.g. "1")
|
||||
*
|
||||
* This function is storing data received on DFU supported medium which
|
||||
* is specified by @dfu_alt_name.
|
||||
*
|
||||
* Return: 0 - on success, error code - otherwise
|
||||
*/
|
||||
int dfu_write_by_alt(int dfu_alt_num, void *addr, unsigned int len,
|
||||
char *interface, char *devstring)
|
||||
{
|
||||
struct dfu_entity *dfu;
|
||||
int ret;
|
||||
|
||||
debug("%s: alt: %d addr: 0x%p len: %d device: %s:%s\n", __func__,
|
||||
dfu_alt_num, addr, len, interface, devstring);
|
||||
|
||||
ret = dfu_init_env_entities(interface, devstring);
|
||||
if (ret)
|
||||
goto done;
|
||||
|
||||
if (dfu_alt_num < 0) {
|
||||
pr_err("Invalid alt number: %d", dfu_alt_num);
|
||||
ret = -ENODEV;
|
||||
goto done;
|
||||
}
|
||||
|
||||
dfu = dfu_get_entity(dfu_alt_num);
|
||||
if (!dfu) {
|
||||
pr_err("DFU entity for alt: %d not found!", dfu_alt_num);
|
||||
ret = -ENODEV;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = dfu_write_from_mem_addr(dfu, (void *)(uintptr_t)addr, len);
|
||||
|
||||
done:
|
||||
dfu_free_entities();
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2015
|
||||
* Lukasz Majewski <l.majewski@majess.pl>
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <log.h>
|
||||
#include <malloc.h>
|
||||
#include <errno.h>
|
||||
#include <dfu.h>
|
||||
|
||||
int dfu_tftp_write(char *dfu_entity_name, unsigned int addr, unsigned int len,
|
||||
char *interface, char *devstring)
|
||||
{
|
||||
char *s, *sb;
|
||||
int alt_setting_num, ret;
|
||||
struct dfu_entity *dfu;
|
||||
|
||||
debug("%s: name: %s addr: 0x%x len: %d device: %s:%s\n", __func__,
|
||||
dfu_entity_name, addr, len, interface, devstring);
|
||||
|
||||
ret = dfu_init_env_entities(interface, devstring);
|
||||
if (ret)
|
||||
goto done;
|
||||
|
||||
/*
|
||||
* We need to copy name pointed by *dfu_entity_name since this text
|
||||
* is the integral part of the FDT image.
|
||||
* Any implicit modification (i.e. done by strsep()) will corrupt
|
||||
* the FDT image and prevent other images to be stored.
|
||||
*/
|
||||
s = strdup(dfu_entity_name);
|
||||
sb = s;
|
||||
if (!s) {
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
|
||||
strsep(&s, "@");
|
||||
debug("%s: image name: %s strlen: %zd\n", __func__, sb, strlen(sb));
|
||||
|
||||
alt_setting_num = dfu_get_alt(sb);
|
||||
free(sb);
|
||||
if (alt_setting_num < 0) {
|
||||
pr_err("Alt setting [%d] to write not found!",
|
||||
alt_setting_num);
|
||||
ret = -ENODEV;
|
||||
goto done;
|
||||
}
|
||||
|
||||
dfu = dfu_get_entity(alt_setting_num);
|
||||
if (!dfu) {
|
||||
pr_err("DFU entity for alt: %d not found!", alt_setting_num);
|
||||
ret = -ENODEV;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = dfu_write_from_mem_addr(dfu, (void *)(uintptr_t)addr, len);
|
||||
|
||||
done:
|
||||
dfu_free_entities();
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -68,11 +68,14 @@ config RTC_EMULATION
|
||||
depends on DM_RTC
|
||||
help
|
||||
On a board without hardware clock this software real time clock can be
|
||||
used. The build time is used to initialize the RTC. So you will have
|
||||
to adjust the time either manually using the 'date' command or use
|
||||
the 'sntp' to update the RTC with the time from a network time server.
|
||||
See CONFIG_CMD_SNTP and CONFIG_BOOTP_NTPSERVER. The RTC time is
|
||||
advanced according to CPU ticks.
|
||||
used. The initial time may be provided via the environment variable
|
||||
'rtc_emul_epoch' as a decimal string indicating seconds since
|
||||
1970-01-01. If the environment variable is missing, the build time is
|
||||
used to initialize the RTC. The time can be adjusted manually via the
|
||||
'date' command or the 'sntp' command can be used to update the RTC
|
||||
with the time from a network time server. See CONFIG_CMD_SNTP and
|
||||
CONFIG_BOOTP_NTPSERVER. The RTC time is advanced according to CPU
|
||||
ticks.
|
||||
|
||||
config RTC_ISL1208
|
||||
bool "Enable ISL1208 driver"
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <common.h>
|
||||
#include <div64.h>
|
||||
#include <dm.h>
|
||||
#include <env.h>
|
||||
#include <generated/timestamp_autogenerated.h>
|
||||
#include <rtc.h>
|
||||
|
||||
@@ -30,12 +31,6 @@ static int emul_rtc_get(struct udevice *dev, struct rtc_time *time)
|
||||
struct emul_rtc *priv = dev_get_priv(dev);
|
||||
u64 now;
|
||||
|
||||
if (!priv->offset_us) {
|
||||
/* Use the build date as initial time */
|
||||
priv->offset_us = U_BOOT_EPOCH * 1000000ULL - timer_get_us();
|
||||
priv->isdst = -1;
|
||||
}
|
||||
|
||||
now = timer_get_us() + priv->offset_us;
|
||||
do_div(now, 1000000);
|
||||
rtc_to_tm(now, time);
|
||||
@@ -63,6 +58,26 @@ static int emul_rtc_set(struct udevice *dev, const struct rtc_time *time)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int emul_rtc_probe(struct udevice *dev)
|
||||
{
|
||||
struct emul_rtc *priv = dev_get_priv(dev);
|
||||
const char *epoch_str;
|
||||
u64 epoch;
|
||||
|
||||
epoch_str = env_get("rtc_emul_epoch");
|
||||
|
||||
if (epoch_str) {
|
||||
epoch = simple_strtoull(epoch_str, NULL, 10);
|
||||
} else {
|
||||
/* Use the build date as initial time */
|
||||
epoch = U_BOOT_EPOCH;
|
||||
}
|
||||
priv->offset_us = epoch * 1000000ULL - timer_get_us();
|
||||
priv->isdst = -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct rtc_ops emul_rtc_ops = {
|
||||
.get = emul_rtc_get,
|
||||
.set = emul_rtc_set,
|
||||
@@ -72,6 +87,7 @@ U_BOOT_DRIVER(rtc_emul) = {
|
||||
.name = "rtc_emul",
|
||||
.id = UCLASS_RTC,
|
||||
.ops = &emul_rtc_ops,
|
||||
.probe = emul_rtc_probe,
|
||||
.priv_auto_alloc_size = sizeof(struct emul_rtc),
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user