Merge branch '2022-12-08-assorted-tooling-and-fs-fixes' into next
- Assorted fixes for squashfs, ext4, a number of host tools (including reworking u-boot-initial-env) and then a few unrelated code cleanups / fixes.
This commit is contained in:
commit
0494ab37c2
15 changed files with 142 additions and 63 deletions
10
Makefile
10
Makefile
|
@ -2439,11 +2439,13 @@ endif
|
|||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
||||
|
||||
quiet_cmd_genenv = GENENV $@
|
||||
cmd_genenv = $(OBJCOPY) --dump-section .rodata.default_environment=$@ env/common.o; \
|
||||
sed --in-place -e 's/\x00/\x0A/g' $@; sed --in-place -e '/^\s*$$/d' $@; \
|
||||
sort --field-separator== -k1,1 --stable $@ -o $@
|
||||
cmd_genenv = \
|
||||
$(objtree)/tools/printinitialenv | \
|
||||
sed -e '/^\s*$$/d' | \
|
||||
sort --field-separator== -k1,1 --stable -o $@
|
||||
|
||||
u-boot-initial-env: u-boot.bin
|
||||
u-boot-initial-env: $(env_h) FORCE
|
||||
$(Q)$(MAKE) $(build)=tools $(objtree)/tools/printinitialenv
|
||||
$(call if_changed,genenv)
|
||||
|
||||
# Consistency checks
|
||||
|
|
|
@ -180,6 +180,7 @@ static const table_entry_t uimage_type[] = {
|
|||
{ IH_TYPE_COPRO, "copro", "Coprocessor Image"},
|
||||
{ IH_TYPE_SUNXI_EGON, "sunxi_egon", "Allwinner eGON Boot Image" },
|
||||
{ IH_TYPE_SUNXI_TOC0, "sunxi_toc0", "Allwinner TOC0 Boot Image" },
|
||||
{ IH_TYPE_FDT_LEGACY, "fdt_legacy", "legacy Image with Flat Device Tree ", },
|
||||
{ -1, "", "", },
|
||||
};
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ U_BOOT_DRIVER(ahci_pci) = {
|
|||
|
||||
static struct pci_device_id ahci_pci_supported[] = {
|
||||
{ PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_SATA_AHCI, ~0) },
|
||||
{ PCI_DEVICE(0x1b21, 0x0611) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_ASMEDIA, 0x0611) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x6121) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x6145) },
|
||||
{},
|
||||
|
|
|
@ -60,6 +60,7 @@ static int scmi_bind_protocols(struct udevice *dev)
|
|||
{
|
||||
int ret = 0;
|
||||
ofnode node;
|
||||
const char *name;
|
||||
|
||||
dev_for_each_subnode(node, dev) {
|
||||
struct driver *drv = NULL;
|
||||
|
@ -71,6 +72,7 @@ static int scmi_bind_protocols(struct udevice *dev)
|
|||
if (ofnode_read_u32(node, "reg", &protocol_id))
|
||||
continue;
|
||||
|
||||
name = ofnode_get_name(node);
|
||||
switch (protocol_id) {
|
||||
case SCMI_PROTOCOL_ID_CLOCK:
|
||||
if (IS_ENABLED(CONFIG_CLK_SCMI))
|
||||
|
@ -100,8 +102,7 @@ static int scmi_bind_protocols(struct udevice *dev)
|
|||
continue;
|
||||
}
|
||||
|
||||
ret = device_bind(dev, drv, ofnode_get_name(node), NULL, node,
|
||||
NULL);
|
||||
ret = device_bind(dev, drv, name, NULL, node, NULL);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -850,15 +850,20 @@ end:
|
|||
|
||||
fail:
|
||||
free(depth_dirname);
|
||||
free(parse_dirname);
|
||||
for (i = 0; i < depth; i++) {
|
||||
if (!ptr[i])
|
||||
break;
|
||||
free(ptr[i]);
|
||||
if (parse_dirname)
|
||||
free(parse_dirname);
|
||||
if (ptr) {
|
||||
for (i = 0; i < depth; i++) {
|
||||
if (!ptr[i])
|
||||
break;
|
||||
free(ptr[i]);
|
||||
}
|
||||
free(ptr);
|
||||
}
|
||||
free(ptr);
|
||||
free(parent_inode);
|
||||
free(first_inode);
|
||||
if (parent_inode)
|
||||
free(parent_inode);
|
||||
if (first_inode)
|
||||
free(first_inode);
|
||||
|
||||
return result_inode_no;
|
||||
}
|
||||
|
|
|
@ -87,7 +87,7 @@ static int sqfs_calc_n_blks(__le64 start, __le64 end, u64 *offset)
|
|||
u64 start_, table_size;
|
||||
|
||||
table_size = le64_to_cpu(end) - le64_to_cpu(start);
|
||||
start_ = le64_to_cpu(start) / ctxt.cur_dev->blksz;
|
||||
start_ = lldiv(le64_to_cpu(start), ctxt.cur_dev->blksz);
|
||||
*offset = le64_to_cpu(start) - (start_ * ctxt.cur_dev->blksz);
|
||||
|
||||
return DIV_ROUND_UP(table_size + *offset, ctxt.cur_dev->blksz);
|
||||
|
|
|
@ -229,6 +229,7 @@ enum image_type_t {
|
|||
IH_TYPE_COPRO, /* Coprocessor Image for remoteproc*/
|
||||
IH_TYPE_SUNXI_EGON, /* Allwinner eGON Boot Image */
|
||||
IH_TYPE_SUNXI_TOC0, /* Allwinner TOC0 Boot Image */
|
||||
IH_TYPE_FDT_LEGACY, /* Binary Flat Device Tree Blob in a Legacy Image */
|
||||
|
||||
IH_TYPE_COUNT, /* Number of image types */
|
||||
};
|
||||
|
|
1
tools/.gitignore
vendored
1
tools/.gitignore
vendored
|
@ -28,6 +28,7 @@
|
|||
/mxsboot
|
||||
/ncb
|
||||
/prelink-riscv
|
||||
/printinitialenv
|
||||
/proftool
|
||||
/relocate-rela
|
||||
/spl_size_limit
|
||||
|
|
|
@ -275,6 +275,10 @@ clean-dirs := lib common
|
|||
|
||||
always := $(hostprogs-y)
|
||||
|
||||
# Host tool to dump the currently configured default environment,
|
||||
# build it on demand, i.e. not add it to 'always'.
|
||||
hostprogs-y += printinitialenv
|
||||
|
||||
# Generated LCD/video logo
|
||||
LOGO_H = $(objtree)/include/bmp_logo.h
|
||||
LOGO_DATA_H = $(objtree)/include/bmp_logo_data.h
|
||||
|
|
|
@ -27,7 +27,8 @@ static struct legacy_img_hdr header;
|
|||
static int image_check_image_types(uint8_t type)
|
||||
{
|
||||
if (((type > IH_TYPE_INVALID) && (type < IH_TYPE_FLATDT)) ||
|
||||
(type == IH_TYPE_KERNEL_NOLOAD) || (type == IH_TYPE_FIRMWARE_IVT))
|
||||
(type == IH_TYPE_KERNEL_NOLOAD) || (type == IH_TYPE_FIRMWARE_IVT) ||
|
||||
(type == IH_TYPE_FDT_LEGACY))
|
||||
return EXIT_SUCCESS;
|
||||
else
|
||||
return EXIT_FAILURE;
|
||||
|
@ -94,6 +95,7 @@ static void image_set_header(void *ptr, struct stat *sbuf, int ifd,
|
|||
uint32_t imagesize;
|
||||
uint32_t ep;
|
||||
uint32_t addr;
|
||||
int type;
|
||||
struct legacy_img_hdr *hdr = (struct legacy_img_hdr *)ptr;
|
||||
|
||||
checksum = crc32(0,
|
||||
|
@ -113,6 +115,11 @@ static void image_set_header(void *ptr, struct stat *sbuf, int ifd,
|
|||
else
|
||||
imagesize = sbuf->st_size - sizeof(struct legacy_img_hdr);
|
||||
|
||||
if (params->type == IH_TYPE_FDT_LEGACY)
|
||||
type = IH_TYPE_FLATDT;
|
||||
else
|
||||
type = params->type;
|
||||
|
||||
if (params->os == IH_OS_TEE) {
|
||||
addr = optee_image_get_load_addr(hdr);
|
||||
ep = optee_image_get_entry_point(hdr);
|
||||
|
@ -127,7 +134,7 @@ static void image_set_header(void *ptr, struct stat *sbuf, int ifd,
|
|||
image_set_dcrc(hdr, checksum);
|
||||
image_set_os(hdr, params->os);
|
||||
image_set_arch(hdr, params->arch);
|
||||
image_set_type(hdr, params->type);
|
||||
image_set_type(hdr, type);
|
||||
image_set_comp(hdr, params->comp);
|
||||
|
||||
image_set_name(hdr, params->imagename);
|
||||
|
|
10
tools/env/fw_env.c
vendored
10
tools/env/fw_env.c
vendored
|
@ -1733,6 +1733,7 @@ static int find_nvmem_device(void)
|
|||
|
||||
while (!nvmem && (dent = readdir(dir))) {
|
||||
FILE *fp;
|
||||
size_t size;
|
||||
|
||||
if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, "..")) {
|
||||
continue;
|
||||
|
@ -1748,7 +1749,14 @@ static int find_nvmem_device(void)
|
|||
continue;
|
||||
}
|
||||
|
||||
fread(buf, sizeof(buf), 1, fp);
|
||||
size = fread(buf, sizeof(buf), 1, fp);
|
||||
if (size != 1) {
|
||||
fprintf(stderr,
|
||||
"read failed about %s\n", comp);
|
||||
fclose(fp);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
||||
if (!strcmp(buf, "u-boot,env")) {
|
||||
bytes = asprintf(&nvmem, "%s/%s/nvmem", path, dent->d_name);
|
||||
|
|
|
@ -712,15 +712,19 @@ int utilfdt_read_err_len(const char *filename, char **buffp, off_t *len)
|
|||
|
||||
/* Loop until we have read everything */
|
||||
buf = malloc(bufsize);
|
||||
if (!buf)
|
||||
if (!buf) {
|
||||
close(fd);
|
||||
return -ENOMEM;
|
||||
}
|
||||
do {
|
||||
/* Expand the buffer to hold the next chunk */
|
||||
if (offset == bufsize) {
|
||||
bufsize *= 2;
|
||||
buf = realloc(buf, bufsize);
|
||||
if (!buf)
|
||||
if (!buf) {
|
||||
close(fd);
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
ret = read(fd, &buf[offset], bufsize - offset);
|
||||
|
|
|
@ -1441,23 +1441,20 @@ static void bpdt_fixup_write_buffer(struct buffer *buf)
|
|||
|
||||
size_t offset = 0;
|
||||
|
||||
offset = fix_member(&h->signature, offset, sizeof(h->signature));
|
||||
offset = fix_member(&h->descriptor_count, offset,
|
||||
sizeof(h->descriptor_count));
|
||||
offset = fix_member(&h->bpdt_version, offset, sizeof(h->bpdt_version));
|
||||
offset = fix_member(&h->xor_redundant_block, offset,
|
||||
sizeof(h->xor_redundant_block));
|
||||
offset = fix_member(&h->ifwi_version, offset, sizeof(h->ifwi_version));
|
||||
offset = fix_member(&h->fit_tool_version, offset,
|
||||
sizeof(h->fit_tool_version));
|
||||
offset = fix_member(&s, offset, sizeof(h->signature));
|
||||
offset = fix_member(&s, offset, sizeof(h->descriptor_count));
|
||||
offset = fix_member(&s, offset, sizeof(h->bpdt_version));
|
||||
offset = fix_member(&s, offset, sizeof(h->xor_redundant_block));
|
||||
offset = fix_member(&s, offset, sizeof(h->ifwi_version));
|
||||
offset = fix_member(&s, offset, sizeof(h->fit_tool_version));
|
||||
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
offset = fix_member(&e[i].type, offset, sizeof(e[i].type));
|
||||
offset = fix_member(&e[i].flags, offset, sizeof(e[i].flags));
|
||||
offset = fix_member(&e[i].offset, offset, sizeof(e[i].offset));
|
||||
offset = fix_member(&e[i].size, offset, sizeof(e[i].size));
|
||||
offset = fix_member(&s, offset, sizeof(e[i].type));
|
||||
offset = fix_member(&s, offset, sizeof(e[i].flags));
|
||||
offset = fix_member(&s, offset, sizeof(e[i].offset));
|
||||
offset = fix_member(&s, offset, sizeof(e[i].size));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1628,6 +1625,8 @@ static void init_manifest_header(struct manifest_header *hdr, size_t size)
|
|||
|
||||
curr_time = time(NULL);
|
||||
local_time = localtime(&curr_time);
|
||||
assert(local_time != NULL);
|
||||
|
||||
strftime(buffer, sizeof(buffer), "0x%Y%m%d", local_time);
|
||||
hdr->date = strtoul(buffer, NULL, 16);
|
||||
|
||||
|
@ -1655,24 +1654,21 @@ static void subpart_dir_fixup_write_buffer(struct buffer *buf)
|
|||
size_t count = h->num_entries;
|
||||
size_t offset = 0;
|
||||
|
||||
offset = fix_member(&h->marker, offset, sizeof(h->marker));
|
||||
offset = fix_member(&h->num_entries, offset, sizeof(h->num_entries));
|
||||
offset = fix_member(&h->header_version, offset,
|
||||
sizeof(h->header_version));
|
||||
offset = fix_member(&h->entry_version, offset,
|
||||
sizeof(h->entry_version));
|
||||
offset = fix_member(&h->header_length, offset,
|
||||
sizeof(h->header_length));
|
||||
offset = fix_member(&h->checksum, offset, sizeof(h->checksum));
|
||||
offset = fix_member(&s, offset, sizeof(h->marker));
|
||||
offset = fix_member(&s, offset, sizeof(h->num_entries));
|
||||
offset = fix_member(&s, offset, sizeof(h->header_version));
|
||||
offset = fix_member(&s, offset, sizeof(h->entry_version));
|
||||
offset = fix_member(&s, offset, sizeof(h->header_length));
|
||||
offset = fix_member(&s, offset, sizeof(h->checksum));
|
||||
offset += sizeof(h->name);
|
||||
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
offset += sizeof(e[i].name);
|
||||
offset = fix_member(&e[i].offset, offset, sizeof(e[i].offset));
|
||||
offset = fix_member(&e[i].length, offset, sizeof(e[i].length));
|
||||
offset = fix_member(&e[i].rsvd, offset, sizeof(e[i].rsvd));
|
||||
offset = fix_member(&s, offset, sizeof(e[i].offset));
|
||||
offset = fix_member(&s, offset, sizeof(e[i].length));
|
||||
offset = fix_member(&s, offset, sizeof(e[i].rsvd));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -430,6 +430,25 @@ static void verify_image(const struct image_type_params *tparams)
|
|||
(void)close(ifd);
|
||||
}
|
||||
|
||||
void copy_datafile(int ifd, char *file)
|
||||
{
|
||||
if (!file)
|
||||
return;
|
||||
for (;;) {
|
||||
char *sep = strchr(file, ':');
|
||||
|
||||
if (sep) {
|
||||
*sep = '\0';
|
||||
copy_file(ifd, file, 1);
|
||||
*sep++ = ':';
|
||||
file = sep;
|
||||
} else {
|
||||
copy_file(ifd, file, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int ifd = -1;
|
||||
|
@ -647,21 +666,7 @@ int main(int argc, char **argv)
|
|||
file = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
file = params.datafile;
|
||||
|
||||
for (;;) {
|
||||
char *sep = strchr(file, ':');
|
||||
if (sep) {
|
||||
*sep = '\0';
|
||||
copy_file (ifd, file, 1);
|
||||
*sep++ = ':';
|
||||
file = sep;
|
||||
} else {
|
||||
copy_file (ifd, file, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
copy_datafile(ifd, params.datafile);
|
||||
} else if (params.type == IH_TYPE_PBLIMAGE) {
|
||||
/* PBL has special Image format, implements its' own */
|
||||
pbl_load_uboot(ifd, ¶ms);
|
||||
|
@ -760,8 +765,8 @@ int main(int argc, char **argv)
|
|||
if (tparams->set_header)
|
||||
tparams->set_header (ptr, &sbuf, ifd, ¶ms);
|
||||
else {
|
||||
fprintf (stderr, "%s: Can't set header for %s: %s\n",
|
||||
params.cmdname, tparams->name, strerror(errno));
|
||||
fprintf (stderr, "%s: Can't set header for %s\n",
|
||||
params.cmdname, tparams->name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
|
|
44
tools/printinitialenv.c
Normal file
44
tools/printinitialenv.c
Normal file
|
@ -0,0 +1,44 @@
|
|||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* (C) Copyright 2022
|
||||
* Max Krummenacher, Toradex
|
||||
*
|
||||
* Snippets taken from tools/env/fw_env.c
|
||||
*
|
||||
* This prints the list of default environment variables as currently
|
||||
* configured.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* Pull in the current config to define the default environment */
|
||||
#include <linux/kconfig.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#define __ASSEMBLY__ /* get only #defines from config.h */
|
||||
#include <config.h>
|
||||
#undef __ASSEMBLY__
|
||||
#else
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#define DEFAULT_ENV_INSTANCE_STATIC
|
||||
#include <generated/environment.h>
|
||||
#include <env_default.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
char *env, *nxt;
|
||||
|
||||
for (env = default_environment; *env; env = nxt + 1) {
|
||||
for (nxt = env; *nxt; ++nxt) {
|
||||
if (nxt >= &default_environment[sizeof(default_environment)]) {
|
||||
fprintf(stderr, "## Error: environment not terminated\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
printf("%s\n", env);
|
||||
}
|
||||
return 0;
|
||||
}
|
Loading…
Reference in a new issue