summaryrefslogtreecommitdiff
path: root/util/sconfig/sconfig.y
diff options
context:
space:
mode:
authorDuncan Laurie <dlaurie@google.com>2020-05-15 15:39:08 -0700
committerDuncan Laurie <dlaurie@chromium.org>2020-06-02 18:06:37 +0000
commit47b7b3402b0864e5c782705bc24e4bf143c3c7f3 (patch)
treeb12bb7e9d75ff2e3e3e2a10b5cb9be21b2a97ded /util/sconfig/sconfig.y
parent36e6c6f8d2b63428b0829ff615903715766b8c20 (diff)
sconfig: Add support for firmware configuration
This change adds support to sconfig for generating the firmware configuration field and option definitions in devicetree.cb. In addition these fields and options can be used to probe for a device and have that device be disabled if it is not found at boot time. New tokens: fw_config: top level token, table can be defined before chips field: define field in the mask with the start and end bits option: define option in a field with the value of the field probe: indicate that a device should probe by field and option Example: fw_config field FEATURE 0 0 option DISABLE 0 option ENABLE 1 end end chip drivers/generic/feature device generic 0 on probe FEATURE ENABLE end end Variants can add new fields and add new options to existing fields in overridetree.cb but cannot redefine an existing option. Devices can have multiple probe tokens, and the device will be considered to be found if any of them return true. The output from defining this field are: 1) the various fields and options will be added as macro constants to static.h and can be used by fw_config for probing. 2) the probe entries will result in a list of fields/options to probe that is added to the resulting struct device and handled by coreboot. BUG=b:147462631 Signed-off-by: Duncan Laurie <dlaurie@google.com> Change-Id: I8aea63e577d933aea09e0d0b09470929cc96e0de Reviewed-on: https://review.coreboot.org/c/coreboot/+/41440 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Furquan Shaikh <furquan@google.com>
Diffstat (limited to 'util/sconfig/sconfig.y')
-rwxr-xr-xutil/sconfig/sconfig.y41
1 files changed, 38 insertions, 3 deletions
diff --git a/util/sconfig/sconfig.y b/util/sconfig/sconfig.y
index 161cf81551..57e939d9f0 100755
--- a/util/sconfig/sconfig.y
+++ b/util/sconfig/sconfig.y
@@ -9,6 +9,7 @@ void yyerror(const char *s);
static struct bus *cur_parent;
static struct chip_instance *cur_chip_instance;
+static struct fw_config_field *cur_field;
%}
%union {
@@ -18,13 +19,13 @@ static struct chip_instance *cur_chip_instance;
int number;
}
-%token CHIP DEVICE REGISTER BOOL STATUS MANDATORY BUS RESOURCE END EQUALS HEX STRING PCI PNP I2C APIC CPU_CLUSTER CPU DOMAIN IRQ DRQ SLOT_DESC IO NUMBER SUBSYSTEMID INHERIT IOAPIC_IRQ IOAPIC PCIINT GENERIC SPI USB MMIO LPC ESPI
+%token CHIP DEVICE REGISTER BOOL STATUS MANDATORY BUS RESOURCE END EQUALS HEX STRING PCI PNP I2C APIC CPU_CLUSTER CPU DOMAIN IRQ DRQ SLOT_DESC IO NUMBER SUBSYSTEMID INHERIT IOAPIC_IRQ IOAPIC PCIINT GENERIC SPI USB MMIO LPC ESPI FW_CONFIG_TABLE FW_CONFIG_FIELD FW_CONFIG_OPTION FW_CONFIG_PROBE
%%
-devtree: { cur_parent = root_parent; } chip;
+devtree: { cur_parent = root_parent; } | devtree chip | devtree fw_config_table;
chipchildren: chipchildren device | chipchildren chip | chipchildren registers | /* empty */ ;
-devicechildren: devicechildren device | devicechildren chip | devicechildren resource | devicechildren subsystemid | devicechildren ioapic_irq | devicechildren smbios_slot_desc | devicechildren registers | /* empty */ ;
+devicechildren: devicechildren device | devicechildren chip | devicechildren resource | devicechildren subsystemid | devicechildren ioapic_irq | devicechildren smbios_slot_desc | devicechildren registers | devicechildren fw_config_probe | /* empty */ ;
chip: CHIP STRING /* == path */ {
$<chip_instance>$ = new_chip_instance($<string>2);
@@ -69,4 +70,38 @@ smbios_slot_desc: SLOT_DESC STRING STRING STRING
smbios_slot_desc: SLOT_DESC STRING STRING
{ add_slot_desc(cur_parent, $<string>2, $<string>3, NULL, NULL); };
+/* fw_config: firmware configuration table */
+fw_config_table: FW_CONFIG_TABLE fw_config_table_children END { };
+
+/* fw_config -> field */
+fw_config_table_children: fw_config_table_children fw_config_field | /* empty */ ;
+
+/* field -> option */
+fw_config_field_children: fw_config_field_children fw_config_option | /* empty */ ;
+
+/* field <start-bit> <end-bit> */
+fw_config_field: FW_CONFIG_FIELD STRING NUMBER /* == start bit */ NUMBER /* == end bit */ {
+ cur_field = new_fw_config_field($<string>2, strtoul($<string>3, NULL, 0), strtoul($<string>4, NULL, 0));
+}
+ fw_config_field_children END { };
+
+/* field <bit> (for single-bit fields) */
+fw_config_field: FW_CONFIG_FIELD STRING NUMBER /* == bit */ {
+ cur_field = new_fw_config_field($<string>2, strtoul($<string>3, NULL, 0), strtoul($<string>3, NULL, 0));
+}
+ fw_config_field_children END { };
+
+/* field (for adding options to an existing field) */
+fw_config_field: FW_CONFIG_FIELD STRING {
+ cur_field = get_fw_config_field($<string>2);
+}
+ fw_config_field_children END { };
+
+/* option <value> */
+fw_config_option: FW_CONFIG_OPTION STRING NUMBER /* == field value */
+ { add_fw_config_option(cur_field, $<string>2, strtoul($<string>3, NULL, 0)); };
+
+/* probe <field> <option> */
+fw_config_probe: FW_CONFIG_PROBE STRING /* == field */ STRING /* == option */
+ { add_fw_config_probe(cur_parent, $<string>2, $<string>3); }
%%