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:
Tom Rini
2020-11-01 10:56:37 -05:00
20 changed files with 390 additions and 107 deletions

View File

@@ -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.

View File

@@ -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

View File

@@ -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
View 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;
}

View File

@@ -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;
}

View File

@@ -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"

View File

@@ -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),
};