diff options
Diffstat (limited to 'util/sconfig/sconfig.y')
-rwxr-xr-x | util/sconfig/sconfig.y | 41 |
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); } %% |