aboutsummaryrefslogtreecommitdiff
path: root/util/sconfig/sconfig.y
diff options
context:
space:
mode:
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); }
%%