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:
Tom Rini 2022-12-08 15:12:14 -05:00
commit 0494ab37c2
15 changed files with 142 additions and 63 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

@ -28,6 +28,7 @@
/mxsboot
/ncb
/prelink-riscv
/printinitialenv
/proftool
/relocate-rela
/spl_size_limit

View file

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

View file

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

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

View file

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

View file

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

View file

@ -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, &params);
@ -760,8 +765,8 @@ int main(int argc, char **argv)
if (tparams->set_header)
tparams->set_header (ptr, &sbuf, ifd, &params);
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
View 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;
}