sconfig: Ensure at least one device node below each chip

Even though `device` entries are children of `chip` entries in the
devicetree source format, the chips in the translated C structures
are only hooked up to device nodes. Hence, any chip with all its
settings will be silently dropped by sconfig if there is no device
node below it.

Let's adapt the parser to ensure that there is at least one `device`
entry. The intermediate `chipchildren_dev` rule applies until the
first `device` entry is found, then everything continues as before
with the `chipchildren` rule.

Change-Id: I54830bc1fc7d00a0605f3fe4d36a83ef57ef3312
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/51119
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Nico Huber
2021-02-28 16:18:18 +01:00
committed by Felix Held
parent e708468df9
commit 859ecdf517
3 changed files with 160 additions and 147 deletions

View File

@@ -25,7 +25,11 @@ static struct fw_config_field_bits *cur_bits;
%%
devtree: { cur_parent = root_parent; } | devtree chip | devtree fw_config_table;
chipchildren: chipchildren device | chipchildren chip | chipchildren registers | chipchildren reference | /* empty */ ;
/* Ensure at least one `device` below each `chip`. */
chipchild_nondev: chip | registers | reference;
chipchild: device | chipchild_nondev;
chipchildren: chipchildren chipchild | /* empty */ ;
chipchildren_dev: device chipchildren | chipchild_nondev chipchildren_dev;
devicechildren: devicechildren device | devicechildren chip | devicechildren resource | devicechildren subsystemid | devicechildren ioapic_irq | devicechildren smbios_slot_desc | devicechildren registers | devicechildren fw_config_probe | /* empty */ ;
@@ -34,7 +38,7 @@ chip: CHIP STRING /* == path */ {
chip_enqueue_tail(cur_chip_instance);
cur_chip_instance = $<chip_instance>$;
}
chipchildren END {
chipchildren_dev END {
cur_chip_instance = chip_dequeue_tail();
};