binman/patman documentation improvements
other minor fixes -----BEGIN PGP SIGNATURE----- iQFFBAABCgAvFiEEslwAIq+Gp8wWVbYnfxc6PpAIreYFAmMJZZ8RHHNqZ0BjaHJv bWl1bS5vcmcACgkQfxc6PpAIreZ8pggAjYxdCTEtTMJamt67hht8xjeZLom4KX3G HZJhXHAXHgnw2vku4nYKEZp6B5+if184I34Gbw6AGHJib7tfGBPFHeb0lIg+NHlB bb7hMSKJwZJAASWB5Txqtmx2iFdnTZVnUUMp5Jl8Fpd0yhd8YxsaDKrt7BUTTZgM 84ht/zv+laFoDvM0Xj81TVkPym8ShIylsUc44Sn8je5KC8kg1lmukqnBHAOj0DKG cE/hGOmdq5HLu7Ylj3XQ8tl6jpPMn6hltoIMku6ePsJeaTOdsXg2i3RN/Xga835D 7/KW+qasl2+5XwqYyAXjLW6YncbGzxmsLfJ6HrzInLtp9rkOt/z0hA== =09Bs -----END PGP SIGNATURE----- Merge tag 'dm-pull-26aug22' of https://source.denx.de/u-boot/custodians/u-boot-dm binman/patman documentation improvements other minor fixes
This commit is contained in:
commit
1573b6a869
34 changed files with 148 additions and 108 deletions
|
@ -35,8 +35,8 @@ static int distro_get_state_desc(struct udevice *dev, char *buf, int maxsize)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int disto_getfile(struct pxe_context *ctx, const char *file_path,
|
||||
char *file_addr, ulong *sizep)
|
||||
static int distro_getfile(struct pxe_context *ctx, const char *file_path,
|
||||
char *file_addr, ulong *sizep)
|
||||
{
|
||||
struct distro_info *info = ctx->userdata;
|
||||
ulong addr;
|
||||
|
@ -113,7 +113,7 @@ static int distro_boot(struct udevice *dev, struct bootflow *bflow)
|
|||
addr = map_to_sysmem(bflow->buf);
|
||||
info.dev = dev;
|
||||
info.bflow = bflow;
|
||||
ret = pxe_setup_ctx(&ctx, &cmdtp, disto_getfile, &info, true,
|
||||
ret = pxe_setup_ctx(&ctx, &cmdtp, distro_getfile, &info, true,
|
||||
bflow->subdir);
|
||||
if (ret)
|
||||
return log_msg_ret("ctx", -EINVAL);
|
||||
|
|
|
@ -23,8 +23,8 @@
|
|||
#include <net.h>
|
||||
#include <pxe_utils.h>
|
||||
|
||||
static int disto_pxe_getfile(struct pxe_context *ctx, const char *file_path,
|
||||
char *file_addr, ulong *sizep)
|
||||
static int distro_pxe_getfile(struct pxe_context *ctx, const char *file_path,
|
||||
char *file_addr, ulong *sizep)
|
||||
{
|
||||
struct distro_info *info = ctx->userdata;
|
||||
ulong addr;
|
||||
|
@ -142,7 +142,7 @@ static int distro_pxe_boot(struct udevice *dev, struct bootflow *bflow)
|
|||
info.dev = dev;
|
||||
info.bflow = bflow;
|
||||
info.cmdtp = &cmdtp;
|
||||
ret = pxe_setup_ctx(ctx, &cmdtp, disto_pxe_getfile, &info, false,
|
||||
ret = pxe_setup_ctx(ctx, &cmdtp, distro_pxe_getfile, &info, false,
|
||||
bflow->subdir);
|
||||
if (ret)
|
||||
return log_msg_ret("ctx", -EINVAL);
|
||||
|
|
|
@ -40,7 +40,7 @@ int vbe_find_next_device(struct udevice **devp)
|
|||
int vbe_find_first_device(struct udevice **devp)
|
||||
{
|
||||
uclass_find_first_device(UCLASS_BOOTMETH, devp);
|
||||
if (*devp && is_vbe(*devp))
|
||||
if (!*devp || is_vbe(*devp))
|
||||
return 0;
|
||||
|
||||
return vbe_find_next_device(devp);
|
||||
|
|
|
@ -225,17 +225,16 @@ static int bootmeth_vbe_simple_ft_fixup(void *ctx, struct event *event)
|
|||
{
|
||||
oftree tree = event->data.ft_fixup.tree;
|
||||
struct udevice *dev;
|
||||
ofnode node;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Ideally we would have driver model support for fixups, but that does
|
||||
* not exist yet. It is a step too far to try to do this before VBE is
|
||||
* in place.
|
||||
*/
|
||||
for (ret = vbe_find_first_device(&dev); dev;
|
||||
ret = vbe_find_next_device(&dev)) {
|
||||
for (vbe_find_first_device(&dev); dev; vbe_find_next_device(&dev)) {
|
||||
struct simple_state state;
|
||||
ofnode node;
|
||||
int ret;
|
||||
|
||||
if (strcmp("vbe_simple", dev->driver->name))
|
||||
continue;
|
||||
|
|
|
@ -333,7 +333,7 @@ config BOOTM_RTEMS
|
|||
config CMD_VBE
|
||||
bool "vbe - Verified Boot for Embedded"
|
||||
depends on BOOTMETH_VBE
|
||||
default y
|
||||
default y if BOOTSTD_FULL
|
||||
help
|
||||
Provides various subcommands related to VBE, such as listing the
|
||||
available methods, looking at the state and changing which method
|
||||
|
|
2
cmd/dm.c
2
cmd/dm.c
|
@ -87,7 +87,7 @@ static char dm_help_text[] =
|
|||
"dm drivers Dump list of drivers with uclass and instances\n"
|
||||
DM_MEM_HELP
|
||||
"dm static Dump list of drivers with static platform data\n"
|
||||
"dn tree Dump tree of driver model devices ('*' = activated)\n"
|
||||
"dm tree Dump tree of driver model devices ('*' = activated)\n"
|
||||
"dm uclass Dump list of instances for each uclass"
|
||||
;
|
||||
#endif
|
||||
|
|
|
@ -58,6 +58,7 @@ quiet_cmd_sphinx = SPHINX $@ --> file://$(abspath $(BUILDDIR)/$3/$4)
|
|||
$(SPHINXBUILD) \
|
||||
-j$(shell nproc) \
|
||||
-b $2 \
|
||||
-j auto \
|
||||
-c $(abspath $(srctree)/$(src)) \
|
||||
-d $(abspath $(BUILDDIR)/.doctrees/$3) \
|
||||
-D version=$(KERNELVERSION) -D release=$(KERNELRELEASE) \
|
||||
|
|
|
@ -322,7 +322,7 @@ look like this::
|
|||
|
||||
The `sf-bootdev` driver can implement a way to read from the SPI flash, using
|
||||
the offset and size provided, and return that bootflow file back to the caller.
|
||||
When distro boot wants to read the kernel it calls disto_getfile() which must
|
||||
When distro boot wants to read the kernel it calls distro_getfile() which must
|
||||
provide a way to read from the SPI flash. See `distro_boot()` at distro_boot_
|
||||
for more details.
|
||||
|
||||
|
|
|
@ -236,6 +236,10 @@ variable. Within binman, this EntryArg is picked up by the `Entry_atf_bl31`
|
|||
etype. An EntryArg is simply an argument to the entry. The `atf-bl31-path`
|
||||
name is documented in :ref:`etype_atf_bl31`.
|
||||
|
||||
Taking this a little further, when binman is used to create a FIT, it supports
|
||||
using an ELF file, e.g. `bl31.elf` and splitting it into separate pieces (with
|
||||
`fit,operation = "split-elf"`), each with its own load address.
|
||||
|
||||
|
||||
Invoking binman outside U-Boot
|
||||
------------------------------
|
||||
|
@ -854,6 +858,55 @@ allow-repack:
|
|||
image description to be stored in the FDT and fdtmap.
|
||||
|
||||
|
||||
Image dependencies
|
||||
------------------
|
||||
|
||||
Binman does not currently support images that depend on each other. For example,
|
||||
if one image creates `fred.bin` and then the next uses this `fred.bin` to
|
||||
produce a final `image.bin`, then the behaviour is undefined. It may work, or it
|
||||
may produce an error about `fred.bin` being missing, or it may use a version of
|
||||
`fred.bin` from a previous run.
|
||||
|
||||
Often this can be handled by incorporating the dependency into the second
|
||||
image. For example, instead of::
|
||||
|
||||
binman {
|
||||
multiple-images;
|
||||
|
||||
fred {
|
||||
u-boot {
|
||||
};
|
||||
fill {
|
||||
size = <0x100>;
|
||||
};
|
||||
};
|
||||
|
||||
image {
|
||||
blob {
|
||||
filename = "fred.bin";
|
||||
};
|
||||
u-boot-spl {
|
||||
};
|
||||
};
|
||||
|
||||
you can do this::
|
||||
|
||||
binman {
|
||||
image {
|
||||
fred {
|
||||
type = "section";
|
||||
u-boot {
|
||||
};
|
||||
fill {
|
||||
size = <0x100>;
|
||||
};
|
||||
};
|
||||
u-boot-spl {
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
|
||||
Hashing Entries
|
||||
---------------
|
||||
|
||||
|
@ -1684,6 +1737,7 @@ Some ideas:
|
|||
- Figure out how to make Fdt support changing the node order, so that
|
||||
Node.AddSubnode() can support adding a node before another, existing node.
|
||||
Perhaps it should completely regenerate the flat tree?
|
||||
- Support images which depend on each other
|
||||
|
||||
--
|
||||
Simon Glass <sjg@chromium.org>
|
||||
|
|
|
@ -5351,16 +5351,6 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
"Node '/binman/u-boot': Please use 'extend-size' instead of 'expand-size'",
|
||||
str(e.exception))
|
||||
|
||||
def testMkimageMissingBlob(self):
|
||||
"""Test using mkimage to build an image"""
|
||||
with test_util.capture_sys_output() as (stdout, stderr):
|
||||
self._DoTestFile('229_mkimage_missing.dts', allow_missing=True,
|
||||
allow_fake_blobs=True)
|
||||
err = stderr.getvalue()
|
||||
self.assertRegex(
|
||||
err,
|
||||
"Image '.*' has faked external blobs and is non-functional: .*")
|
||||
|
||||
def testFitSplitElf(self):
|
||||
"""Test an image with an FIT with an split-elf operation"""
|
||||
if not elf.ELF_TOOLS:
|
||||
|
@ -5461,24 +5451,6 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
"Node '/binman/fit': subnode 'images/@atf-SEQ': Failed to read ELF file: Magic number does not match",
|
||||
str(exc.exception))
|
||||
|
||||
def testFitSplitElfBadDirective(self):
|
||||
"""Test a FIT split-elf invalid fit,xxx directive in an image node"""
|
||||
if not elf.ELF_TOOLS:
|
||||
self.skipTest('Python elftools not available')
|
||||
err = self._check_bad_fit('227_fit_bad_dir.dts')
|
||||
self.assertIn(
|
||||
"Node '/binman/fit': subnode 'images/@atf-SEQ': Unknown directive 'fit,something'",
|
||||
err)
|
||||
|
||||
def testFitSplitElfBadDirectiveConfig(self):
|
||||
"""Test a FIT split-elf with invalid fit,xxx directive in config"""
|
||||
if not elf.ELF_TOOLS:
|
||||
self.skipTest('Python elftools not available')
|
||||
err = self._check_bad_fit('228_fit_bad_dir_config.dts')
|
||||
self.assertEqual(
|
||||
"Node '/binman/fit': subnode 'configurations/@config-SEQ': Unknown directive 'fit,config'",
|
||||
err)
|
||||
|
||||
def checkFitSplitElf(self, **kwargs):
|
||||
"""Test an split-elf FIT with a missing ELF file
|
||||
|
||||
|
@ -5505,6 +5477,25 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
err = stderr.getvalue()
|
||||
return out, err
|
||||
|
||||
def testFitSplitElfBadDirective(self):
|
||||
"""Test a FIT split-elf invalid fit,xxx directive in an image node"""
|
||||
if not elf.ELF_TOOLS:
|
||||
self.skipTest('Python elftools not available')
|
||||
err = self._check_bad_fit('227_fit_bad_dir.dts')
|
||||
self.assertIn(
|
||||
"Node '/binman/fit': subnode 'images/@atf-SEQ': Unknown directive 'fit,something'",
|
||||
err)
|
||||
|
||||
def testFitSplitElfBadDirectiveConfig(self):
|
||||
"""Test a FIT split-elf with invalid fit,xxx directive in config"""
|
||||
if not elf.ELF_TOOLS:
|
||||
self.skipTest('Python elftools not available')
|
||||
err = self._check_bad_fit('228_fit_bad_dir_config.dts')
|
||||
self.assertEqual(
|
||||
"Node '/binman/fit': subnode 'configurations/@config-SEQ': Unknown directive 'fit,config'",
|
||||
err)
|
||||
|
||||
|
||||
def testFitSplitElfMissing(self):
|
||||
"""Test an split-elf FIT with a missing ELF file"""
|
||||
if not elf.ELF_TOOLS:
|
||||
|
@ -5531,31 +5522,41 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
fname = tools.get_output_filename('binman-fake/missing.elf')
|
||||
self.assertTrue(os.path.exists(fname))
|
||||
|
||||
def testMkimageMissingBlob(self):
|
||||
"""Test using mkimage to build an image"""
|
||||
with test_util.capture_sys_output() as (stdout, stderr):
|
||||
self._DoTestFile('229_mkimage_missing.dts', allow_missing=True,
|
||||
allow_fake_blobs=True)
|
||||
err = stderr.getvalue()
|
||||
self.assertRegex(
|
||||
err,
|
||||
"Image '.*' has faked external blobs and is non-functional: .*")
|
||||
|
||||
def testPreLoad(self):
|
||||
"""Test an image with a pre-load header"""
|
||||
entry_args = {
|
||||
'pre-load-key-path': '.',
|
||||
}
|
||||
data, _, _, _ = self._DoReadFileDtb('225_pre_load.dts',
|
||||
data, _, _, _ = self._DoReadFileDtb('230_pre_load.dts',
|
||||
entry_args=entry_args)
|
||||
self.assertEqual(PRE_LOAD_MAGIC, data[:len(PRE_LOAD_MAGIC)])
|
||||
self.assertEqual(PRE_LOAD_VERSION, data[4:4 + len(PRE_LOAD_VERSION)])
|
||||
self.assertEqual(PRE_LOAD_HDR_SIZE, data[8:8 + len(PRE_LOAD_HDR_SIZE)])
|
||||
data = self._DoReadFile('225_pre_load.dts')
|
||||
data = self._DoReadFile('230_pre_load.dts')
|
||||
self.assertEqual(PRE_LOAD_MAGIC, data[:len(PRE_LOAD_MAGIC)])
|
||||
self.assertEqual(PRE_LOAD_VERSION, data[4:4 + len(PRE_LOAD_VERSION)])
|
||||
self.assertEqual(PRE_LOAD_HDR_SIZE, data[8:8 + len(PRE_LOAD_HDR_SIZE)])
|
||||
|
||||
def testPreLoadPkcs(self):
|
||||
"""Test an image with a pre-load header with padding pkcs"""
|
||||
data = self._DoReadFile('226_pre_load_pkcs.dts')
|
||||
data = self._DoReadFile('231_pre_load_pkcs.dts')
|
||||
self.assertEqual(PRE_LOAD_MAGIC, data[:len(PRE_LOAD_MAGIC)])
|
||||
self.assertEqual(PRE_LOAD_VERSION, data[4:4 + len(PRE_LOAD_VERSION)])
|
||||
self.assertEqual(PRE_LOAD_HDR_SIZE, data[8:8 + len(PRE_LOAD_HDR_SIZE)])
|
||||
|
||||
def testPreLoadPss(self):
|
||||
"""Test an image with a pre-load header with padding pss"""
|
||||
data = self._DoReadFile('227_pre_load_pss.dts')
|
||||
data = self._DoReadFile('232_pre_load_pss.dts')
|
||||
self.assertEqual(PRE_LOAD_MAGIC, data[:len(PRE_LOAD_MAGIC)])
|
||||
self.assertEqual(PRE_LOAD_VERSION, data[4:4 + len(PRE_LOAD_VERSION)])
|
||||
self.assertEqual(PRE_LOAD_HDR_SIZE, data[8:8 + len(PRE_LOAD_HDR_SIZE)])
|
||||
|
@ -5563,22 +5564,22 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
def testPreLoadInvalidPadding(self):
|
||||
"""Test an image with a pre-load header with an invalid padding"""
|
||||
with self.assertRaises(ValueError) as e:
|
||||
data = self._DoReadFile('228_pre_load_invalid_padding.dts')
|
||||
data = self._DoReadFile('233_pre_load_invalid_padding.dts')
|
||||
|
||||
def testPreLoadInvalidSha(self):
|
||||
"""Test an image with a pre-load header with an invalid hash"""
|
||||
with self.assertRaises(ValueError) as e:
|
||||
data = self._DoReadFile('229_pre_load_invalid_sha.dts')
|
||||
data = self._DoReadFile('234_pre_load_invalid_sha.dts')
|
||||
|
||||
def testPreLoadInvalidAlgo(self):
|
||||
"""Test an image with a pre-load header with an invalid algo"""
|
||||
with self.assertRaises(ValueError) as e:
|
||||
data = self._DoReadFile('230_pre_load_invalid_algo.dts')
|
||||
data = self._DoReadFile('235_pre_load_invalid_algo.dts')
|
||||
|
||||
def testPreLoadInvalidKey(self):
|
||||
"""Test an image with a pre-load header with an invalid key"""
|
||||
with self.assertRaises(ValueError) as e:
|
||||
data = self._DoReadFile('231_pre_load_invalid_key.dts')
|
||||
data = self._DoReadFile('236_pre_load_invalid_key.dts')
|
||||
|
||||
def _CheckSafeUniqueNames(self, *images):
|
||||
"""Check all entries of given images for unsafe unique names"""
|
||||
|
@ -5593,7 +5594,7 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
|
||||
def testSafeUniqueNames(self):
|
||||
"""Test entry unique names are safe in single image configuration"""
|
||||
data = self._DoReadFileRealDtb('230_unique_names.dts')
|
||||
data = self._DoReadFileRealDtb('237_unique_names.dts')
|
||||
|
||||
orig_image = control.images['image']
|
||||
image_fname = tools.get_output_filename('image.bin')
|
||||
|
@ -5603,7 +5604,7 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
|
||||
def testSafeUniqueNamesMulti(self):
|
||||
"""Test entry unique names are safe with multiple images"""
|
||||
data = self._DoReadFileRealDtb('231_unique_names_multi.dts')
|
||||
data = self._DoReadFileRealDtb('238_unique_names_multi.dts')
|
||||
|
||||
orig_image = control.images['image']
|
||||
image_fname = tools.get_output_filename('image.bin')
|
||||
|
@ -5613,7 +5614,7 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
|
||||
def testReplaceCmdWithBintool(self):
|
||||
"""Test replacing an entry that needs a bintool to pack"""
|
||||
data = self._DoReadFileRealDtb('232_replace_with_bintool.dts')
|
||||
data = self._DoReadFileRealDtb('239_replace_with_bintool.dts')
|
||||
expected = U_BOOT_DATA + b'aa'
|
||||
self.assertEqual(expected, data[:len(expected)])
|
||||
|
||||
|
@ -5632,7 +5633,7 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
|
||||
def testReplaceCmdOtherWithBintool(self):
|
||||
"""Test replacing an entry when another needs a bintool to pack"""
|
||||
data = self._DoReadFileRealDtb('232_replace_with_bintool.dts')
|
||||
data = self._DoReadFileRealDtb('239_replace_with_bintool.dts')
|
||||
expected = U_BOOT_DATA + b'aa'
|
||||
self.assertEqual(expected, data[:len(expected)])
|
||||
|
||||
|
@ -5672,7 +5673,7 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
|
||||
def testExtractFit(self):
|
||||
"""Test extracting a FIT section"""
|
||||
self._DoReadFileRealDtb('233_fit_extract_replace.dts')
|
||||
self._DoReadFileRealDtb('240_fit_extract_replace.dts')
|
||||
image_fname = tools.get_output_filename('image.bin')
|
||||
|
||||
fit_data = control.ReadEntry(image_fname, 'fit')
|
||||
|
@ -5691,7 +5692,7 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
|
||||
def testExtractFitSubentries(self):
|
||||
"""Test extracting FIT section subentries"""
|
||||
self._DoReadFileRealDtb('233_fit_extract_replace.dts')
|
||||
self._DoReadFileRealDtb('240_fit_extract_replace.dts')
|
||||
image_fname = tools.get_output_filename('image.bin')
|
||||
|
||||
for entry_path, expected in [
|
||||
|
@ -5710,7 +5711,7 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
new_data = b'x' * len(U_BOOT_DATA)
|
||||
data, expected_fdtmap, _ = self._RunReplaceCmd(
|
||||
'fit/kernel/u-boot', new_data,
|
||||
dts='233_fit_extract_replace.dts')
|
||||
dts='240_fit_extract_replace.dts')
|
||||
self.assertEqual(new_data, data)
|
||||
|
||||
path, fdtmap = state.GetFdtContents('fdtmap')
|
||||
|
@ -5722,7 +5723,7 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
new_data = b'ub' * len(U_BOOT_NODTB_DATA)
|
||||
data, expected_fdtmap, _ = self._RunReplaceCmd(
|
||||
'fit/fdt-1/u-boot-nodtb', new_data,
|
||||
dts='233_fit_extract_replace.dts')
|
||||
dts='240_fit_extract_replace.dts')
|
||||
self.assertEqual(new_data, data)
|
||||
|
||||
# Will be repacked, so fdtmap must change
|
||||
|
@ -5736,7 +5737,7 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
expected = new_data.ljust(len(U_BOOT_NODTB_DATA), b'\0')
|
||||
data, expected_fdtmap, _ = self._RunReplaceCmd(
|
||||
'fit/fdt-1/u-boot-nodtb', new_data,
|
||||
dts='233_fit_extract_replace.dts')
|
||||
dts='240_fit_extract_replace.dts')
|
||||
self.assertEqual(expected, data)
|
||||
|
||||
path, fdtmap = state.GetFdtContents('fdtmap')
|
||||
|
@ -5748,14 +5749,14 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
new_data = b'w' * len(COMPRESS_DATA + U_BOOT_DATA)
|
||||
with self.assertRaises(ValueError) as exc:
|
||||
self._RunReplaceCmd('section', new_data,
|
||||
dts='234_replace_section_simple.dts')
|
||||
dts='241_replace_section_simple.dts')
|
||||
self.assertIn(
|
||||
"Node '/section': Replacing sections is not implemented yet",
|
||||
str(exc.exception))
|
||||
|
||||
def testMkimageImagename(self):
|
||||
"""Test using mkimage with -n holding the data too"""
|
||||
data = self._DoReadFile('235_mkimage_name.dts')
|
||||
data = self._DoReadFile('242_mkimage_name.dts')
|
||||
|
||||
# Check that the data appears in the file somewhere
|
||||
self.assertIn(U_BOOT_SPL_DATA, data)
|
||||
|
@ -5772,7 +5773,7 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
|
||||
def testMkimageImage(self):
|
||||
"""Test using mkimage with -n holding the data too"""
|
||||
data = self._DoReadFile('236_mkimage_image.dts')
|
||||
data = self._DoReadFile('243_mkimage_image.dts')
|
||||
|
||||
# Check that the data appears in the file somewhere
|
||||
self.assertIn(U_BOOT_SPL_DATA, data)
|
||||
|
@ -5793,20 +5794,20 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
def testMkimageImageNoContent(self):
|
||||
"""Test using mkimage with -n and no data"""
|
||||
with self.assertRaises(ValueError) as exc:
|
||||
self._DoReadFile('237_mkimage_image_no_content.dts')
|
||||
self._DoReadFile('244_mkimage_image_no_content.dts')
|
||||
self.assertIn('Could not complete processing of contents',
|
||||
str(exc.exception))
|
||||
|
||||
def testMkimageImageBad(self):
|
||||
"""Test using mkimage with imagename node and data-to-imagename"""
|
||||
with self.assertRaises(ValueError) as exc:
|
||||
self._DoReadFile('238_mkimage_image_bad.dts')
|
||||
self._DoReadFile('245_mkimage_image_bad.dts')
|
||||
self.assertIn('Cannot use both imagename node and data-to-imagename',
|
||||
str(exc.exception))
|
||||
|
||||
def testCollectionOther(self):
|
||||
"""Test a collection where the data comes from another section"""
|
||||
data = self._DoReadFile('239_collection_other.dts')
|
||||
data = self._DoReadFile('246_collection_other.dts')
|
||||
self.assertEqual(U_BOOT_NODTB_DATA + U_BOOT_DTB_DATA +
|
||||
tools.get_bytes(0xff, 2) + U_BOOT_NODTB_DATA +
|
||||
tools.get_bytes(0xfe, 3) + U_BOOT_DTB_DATA,
|
||||
|
@ -5814,20 +5815,20 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
|
||||
def testMkimageCollection(self):
|
||||
"""Test using a collection referring to an entry in a mkimage entry"""
|
||||
data = self._DoReadFile('240_mkimage_coll.dts')
|
||||
data = self._DoReadFile('247_mkimage_coll.dts')
|
||||
expect = U_BOOT_SPL_DATA + U_BOOT_DATA
|
||||
self.assertEqual(expect, data[:len(expect)])
|
||||
|
||||
def testCompressDtbPrependInvalid(self):
|
||||
"""Test that invalid header is detected"""
|
||||
with self.assertRaises(ValueError) as e:
|
||||
self._DoReadFileDtb('235_compress_dtb_prepend_invalid.dts')
|
||||
self._DoReadFileDtb('248_compress_dtb_prepend_invalid.dts')
|
||||
self.assertIn("Node '/binman/u-boot-dtb': Invalid prepend in "
|
||||
"'u-boot-dtb': 'invalid'", str(e.exception))
|
||||
|
||||
def testCompressDtbPrependLength(self):
|
||||
"""Test that compress with length header works as expected"""
|
||||
data = self._DoReadFileRealDtb('236_compress_dtb_prepend_length.dts')
|
||||
data = self._DoReadFileRealDtb('249_compress_dtb_prepend_length.dts')
|
||||
image = control.images['image']
|
||||
entries = image.GetEntries()
|
||||
self.assertIn('u-boot-dtb', entries)
|
||||
|
@ -5860,7 +5861,7 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
def testInvalidCompress(self):
|
||||
"""Test that invalid compress algorithm is detected"""
|
||||
with self.assertRaises(ValueError) as e:
|
||||
self._DoTestFile('237_compress_dtb_invalid.dts')
|
||||
self._DoTestFile('250_compress_dtb_invalid.dts')
|
||||
self.assertIn("Unknown algorithm 'invalid'", str(e.exception))
|
||||
|
||||
def testCompUtilCompressions(self):
|
||||
|
@ -5893,7 +5894,7 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
def testCompressDtbZstd(self):
|
||||
"""Test that zstd compress of device-tree files failed"""
|
||||
with self.assertRaises(ValueError) as e:
|
||||
self._DoTestFile('238_compress_dtb_zstd.dts')
|
||||
self._DoTestFile('251_compress_dtb_zstd.dts')
|
||||
self.assertIn("Node '/binman/u-boot-dtb': The zstd compression "
|
||||
"requires a length header", str(e.exception))
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
pre-load {
|
||||
content = <&image>;
|
||||
algo-name = "sha256,rsa2048";
|
||||
key-name = "tools/binman/test/225_dev.key";
|
||||
key-name = "tools/binman/test/230_dev.key";
|
||||
header-size = <4096>;
|
||||
version = <0x11223344>;
|
||||
};
|
|
@ -11,7 +11,7 @@
|
|||
content = <&image>;
|
||||
algo-name = "sha256,rsa2048";
|
||||
padding-name = "pkcs-1.5";
|
||||
key-name = "tools/binman/test/225_dev.key";
|
||||
key-name = "tools/binman/test/230_dev.key";
|
||||
header-size = <4096>;
|
||||
version = <0x11223344>;
|
||||
};
|
|
@ -11,7 +11,7 @@
|
|||
content = <&image>;
|
||||
algo-name = "sha256,rsa2048";
|
||||
padding-name = "pss";
|
||||
key-name = "tools/binman/test/225_dev.key";
|
||||
key-name = "tools/binman/test/230_dev.key";
|
||||
header-size = <4096>;
|
||||
version = <0x11223344>;
|
||||
};
|
|
@ -11,7 +11,7 @@
|
|||
content = <&image>;
|
||||
algo-name = "sha256,rsa2048";
|
||||
padding-name = "padding";
|
||||
key-name = "tools/binman/test/225_dev.key";
|
||||
key-name = "tools/binman/test/230_dev.key";
|
||||
header-size = <4096>;
|
||||
version = <1>;
|
||||
};
|
|
@ -11,7 +11,7 @@
|
|||
content = <&image>;
|
||||
algo-name = "sha2560,rsa2048";
|
||||
padding-name = "pkcs-1.5";
|
||||
key-name = "tools/binman/test/225_dev.key";
|
||||
key-name = "tools/binman/test/230_dev.key";
|
||||
header-size = <4096>;
|
||||
version = <1>;
|
||||
};
|
|
@ -11,7 +11,7 @@
|
|||
content = <&image>;
|
||||
algo-name = "sha256,rsa20480";
|
||||
padding-name = "pkcs-1.5";
|
||||
key-name = "tools/binman/test/225_dev.key";
|
||||
key-name = "tools/binman/test/230_dev.key";
|
||||
header-size = <4096>;
|
||||
version = <1>;
|
||||
};
|
|
@ -11,7 +11,7 @@
|
|||
content = <&image>;
|
||||
algo-name = "sha256,rsa4096";
|
||||
padding-name = "pkcs-1.5";
|
||||
key-name = "tools/binman/test/225_dev.key";
|
||||
key-name = "tools/binman/test/230_dev.key";
|
||||
header-size = <4096>;
|
||||
version = <1>;
|
||||
};
|
|
@ -3,7 +3,7 @@
|
|||
.. Simon Glass <sjg@chromium.org>
|
||||
.. v1, v2, 19-Oct-11
|
||||
.. revised v3 24-Nov-11
|
||||
.. revised v4 04-Jul-2020, with Patchwork integration
|
||||
.. revised v4 Independence Day 2020, with Patchwork integration
|
||||
|
||||
Patman patch manager
|
||||
====================
|
||||
|
@ -11,21 +11,15 @@ Patman patch manager
|
|||
This tool is a Python script which:
|
||||
|
||||
- Creates patch directly from your branch
|
||||
|
||||
- Cleans them up by removing unwanted tags
|
||||
|
||||
- Inserts a cover letter with change lists
|
||||
|
||||
- Runs the patches through checkpatch.pl and its own checks
|
||||
|
||||
- Optionally emails them out to selected people
|
||||
|
||||
It also has some Patchwork features:
|
||||
|
||||
- shows review tags from Patchwork so you can update your local patches
|
||||
|
||||
- pulls these down into a new branch on request
|
||||
|
||||
- lists comments received on a series
|
||||
|
||||
It is intended to automate patch creation and make it a less
|
||||
|
@ -53,15 +47,12 @@ This tool requires a certain way of working:
|
|||
|
||||
- Maintain a number of branches, one for each patch series you are
|
||||
working on
|
||||
|
||||
- Add tags into the commits within each branch to indicate where the
|
||||
series should be sent, cover letter, version, etc. Most of these are
|
||||
normally in the top commit so it is easy to change them with 'git
|
||||
commit --amend'
|
||||
|
||||
- Each branch tracks the upstream branch, so that this script can
|
||||
automatically determine the number of commits in it (optional)
|
||||
|
||||
- Check out a branch, and run this script to create and send out your
|
||||
patches. Weeks later, change the patches and repeat, knowing that you
|
||||
will get a consistent result each time.
|
||||
|
@ -623,41 +614,35 @@ and it will create and send the version 2 series.
|
|||
General points
|
||||
--------------
|
||||
|
||||
1. When you change back to the us-cmd branch days or weeks later all your
|
||||
#. When you change back to the us-cmd branch days or weeks later all your
|
||||
information is still there, safely stored in the commits. You don't need
|
||||
to remember what version you are up to, who you sent the last lot of patches
|
||||
to, or anything about the change logs.
|
||||
|
||||
2. If you put tags in the subject, patman will Cc the maintainers
|
||||
#. If you put tags in the subject, patman will Cc the maintainers
|
||||
automatically in many cases.
|
||||
|
||||
3. If you want to keep the commits from each series you sent so that you can
|
||||
#. If you want to keep the commits from each series you sent so that you can
|
||||
compare change and see what you did, you can either create a new branch for
|
||||
each version, or just tag the branch before you start changing it:
|
||||
|
||||
.. code-block:: bash
|
||||
.. code-block:: bash
|
||||
|
||||
git tag sent/us-cmd-rfc
|
||||
# ...later...
|
||||
git tag sent/us-cmd-v2
|
||||
|
||||
4. If you want to modify the patches a little before sending, you can do
|
||||
#. If you want to modify the patches a little before sending, you can do
|
||||
this in your editor, but be careful!
|
||||
|
||||
5. If you want to run git send-email yourself, use the -n flag which will
|
||||
#. If you want to run git send-email yourself, use the -n flag which will
|
||||
print out the command line patman would have used.
|
||||
|
||||
6. It is a good idea to add the change log info as you change the commit,
|
||||
#. It is a good idea to add the change log info as you change the commit,
|
||||
not later when you can't remember which patch you changed. You can always
|
||||
go back and change or remove logs from commits.
|
||||
|
||||
7. Some mailing lists have size limits and when we add binary contents to
|
||||
#. Some mailing lists have size limits and when we add binary contents to
|
||||
our patches it's easy to exceed the size limits. Use "--no-binary" to
|
||||
generate patches without any binary contents. You are supposed to include
|
||||
a link to a git repository in your "Commit-notes", "Series-notes" or
|
||||
"Cover-letter" for maintainers to fetch the original commit.
|
||||
|
||||
8. Patches will have no changelog entries for revisions where they did not
|
||||
#. Patches will have no changelog entries for revisions where they did not
|
||||
change. For clarity, if there are no changes for this patch in the most
|
||||
recent revision of the series, a note will be added. For example, a patch
|
||||
with the following tags in the commit::
|
||||
|
@ -669,15 +654,15 @@ General points
|
|||
Series-changes: 4
|
||||
- Another change
|
||||
|
||||
would have a changelog of:::
|
||||
would have a changelog of:::
|
||||
|
||||
(no changes since v4)
|
||||
(no changes since v4)
|
||||
|
||||
Changes in v4:
|
||||
- Another change
|
||||
Changes in v4:
|
||||
- Another change
|
||||
|
||||
Changes in v2:
|
||||
- Some change
|
||||
Changes in v2:
|
||||
- Some change
|
||||
|
||||
|
||||
Other thoughts
|
||||
|
|
Loading…
Reference in a new issue