sconfig: Allow to specify device operations

Currently we only have runtime mechanisms to assign device operations to
a node in our devicetree (with one exception: the root device). The most
common method is to map PCI IDs to the device operations with a `struct
pci_driver`. Another accustomed way is to let a chip driver assign them.

For very common drivers, e.g. those in soc/intel/common/blocks/, the PCI
ID lists grew very large and are incredibly error-prone. Often, IDs are
missing and sometimes IDs are added almost mechanically without checking
the code for compatibility. Maintaining these lists in a central place
also reduces flexibility.

Now, for onboard devices it is actually unnecessary to assign the device
operations at runtime. We already know exactly what operations should be
assigned. And since we are using chipset devicetrees, we have a perfect
place to put that information.

This patch adds a simple mechanism to `sconfig`. It allows us to speci-
fy operations per device, e.g.

  device pci 00.0 alias system_agent on
          ops system_agent_ops
  end

The operations are given as a C identifier. In this example, we simply
assume that a global `struct device_operations system_agent_ops` exists.

Change-Id: I2833d2f2450fde3206c33393f58b86fd4280b566
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/66483
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-by: Felix Held <felix-coreboot@felixheld.de>
diff --git a/util/sconfig/sconfig.tab.c_shipped b/util/sconfig/sconfig.tab.c_shipped
index c319a79..3df31a7 100644
--- a/util/sconfig/sconfig.tab.c_shipped
+++ b/util/sconfig/sconfig.tab.c_shipped
@@ -1,4 +1,4 @@
-/* A Bison parser, made by GNU Bison 3.8.1.  */
+/* A Bison parser, made by GNU Bison 3.8.2.  */
 
 /* Bison implementation for Yacc-like parsers in C
 
@@ -46,10 +46,10 @@
    USER NAME SPACE" below.  */
 
 /* Identify Bison output, and Bison version.  */
-#define YYBISON 30801
+#define YYBISON 30802
 
 /* Bison version string.  */
-#define YYBISON_VERSION "3.8.1"
+#define YYBISON_VERSION "3.8.2"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -156,38 +156,40 @@
   YYSYMBOL_FW_CONFIG_OPTION = 43,          /* FW_CONFIG_OPTION  */
   YYSYMBOL_FW_CONFIG_PROBE = 44,           /* FW_CONFIG_PROBE  */
   YYSYMBOL_PIPE = 45,                      /* PIPE  */
-  YYSYMBOL_YYACCEPT = 46,                  /* $accept  */
-  YYSYMBOL_devtree = 47,                   /* devtree  */
-  YYSYMBOL_chipchild_nondev = 48,          /* chipchild_nondev  */
-  YYSYMBOL_chipchild = 49,                 /* chipchild  */
-  YYSYMBOL_chipchildren = 50,              /* chipchildren  */
-  YYSYMBOL_chipchildren_dev = 51,          /* chipchildren_dev  */
-  YYSYMBOL_devicechildren = 52,            /* devicechildren  */
-  YYSYMBOL_chip = 53,                      /* chip  */
-  YYSYMBOL_54_1 = 54,                      /* @1  */
-  YYSYMBOL_device = 55,                    /* device  */
-  YYSYMBOL_56_2 = 56,                      /* @2  */
-  YYSYMBOL_57_3 = 57,                      /* @3  */
-  YYSYMBOL_alias = 58,                     /* alias  */
-  YYSYMBOL_status = 59,                    /* status  */
-  YYSYMBOL_resource = 60,                  /* resource  */
-  YYSYMBOL_reference = 61,                 /* reference  */
-  YYSYMBOL_registers = 62,                 /* registers  */
-  YYSYMBOL_subsystemid = 63,               /* subsystemid  */
-  YYSYMBOL_ioapic_irq = 64,                /* ioapic_irq  */
-  YYSYMBOL_smbios_slot_desc = 65,          /* smbios_slot_desc  */
-  YYSYMBOL_smbios_dev_info = 66,           /* smbios_dev_info  */
-  YYSYMBOL_fw_config_table = 67,           /* fw_config_table  */
-  YYSYMBOL_fw_config_table_children = 68,  /* fw_config_table_children  */
-  YYSYMBOL_fw_config_field_children = 69,  /* fw_config_field_children  */
-  YYSYMBOL_fw_config_field_bits = 70,      /* fw_config_field_bits  */
-  YYSYMBOL_fw_config_field_bits_repeating = 71, /* fw_config_field_bits_repeating  */
-  YYSYMBOL_fw_config_field = 72,           /* fw_config_field  */
-  YYSYMBOL_73_4 = 73,                      /* $@4  */
-  YYSYMBOL_74_5 = 74,                      /* $@5  */
-  YYSYMBOL_75_6 = 75,                      /* $@6  */
-  YYSYMBOL_fw_config_option = 76,          /* fw_config_option  */
-  YYSYMBOL_fw_config_probe = 77            /* fw_config_probe  */
+  YYSYMBOL_OPS = 46,                       /* OPS  */
+  YYSYMBOL_YYACCEPT = 47,                  /* $accept  */
+  YYSYMBOL_devtree = 48,                   /* devtree  */
+  YYSYMBOL_chipchild_nondev = 49,          /* chipchild_nondev  */
+  YYSYMBOL_chipchild = 50,                 /* chipchild  */
+  YYSYMBOL_chipchildren = 51,              /* chipchildren  */
+  YYSYMBOL_chipchildren_dev = 52,          /* chipchildren_dev  */
+  YYSYMBOL_devicechildren = 53,            /* devicechildren  */
+  YYSYMBOL_chip = 54,                      /* chip  */
+  YYSYMBOL_55_1 = 55,                      /* @1  */
+  YYSYMBOL_device = 56,                    /* device  */
+  YYSYMBOL_57_2 = 57,                      /* @2  */
+  YYSYMBOL_58_3 = 58,                      /* @3  */
+  YYSYMBOL_alias = 59,                     /* alias  */
+  YYSYMBOL_status = 60,                    /* status  */
+  YYSYMBOL_resource = 61,                  /* resource  */
+  YYSYMBOL_reference = 62,                 /* reference  */
+  YYSYMBOL_registers = 63,                 /* registers  */
+  YYSYMBOL_subsystemid = 64,               /* subsystemid  */
+  YYSYMBOL_ioapic_irq = 65,                /* ioapic_irq  */
+  YYSYMBOL_smbios_slot_desc = 66,          /* smbios_slot_desc  */
+  YYSYMBOL_smbios_dev_info = 67,           /* smbios_dev_info  */
+  YYSYMBOL_fw_config_table = 68,           /* fw_config_table  */
+  YYSYMBOL_fw_config_table_children = 69,  /* fw_config_table_children  */
+  YYSYMBOL_fw_config_field_children = 70,  /* fw_config_field_children  */
+  YYSYMBOL_fw_config_field_bits = 71,      /* fw_config_field_bits  */
+  YYSYMBOL_fw_config_field_bits_repeating = 72, /* fw_config_field_bits_repeating  */
+  YYSYMBOL_fw_config_field = 73,           /* fw_config_field  */
+  YYSYMBOL_74_4 = 74,                      /* $@4  */
+  YYSYMBOL_75_5 = 75,                      /* $@5  */
+  YYSYMBOL_76_6 = 76,                      /* $@6  */
+  YYSYMBOL_fw_config_option = 77,          /* fw_config_option  */
+  YYSYMBOL_fw_config_probe = 78,           /* fw_config_probe  */
+  YYSYMBOL_ops = 79                        /* ops  */
 };
 typedef enum yysymbol_kind_t yysymbol_kind_t;
 
@@ -515,19 +517,19 @@
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  2
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   98
+#define YYLAST   101
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  46
+#define YYNTOKENS  47
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  32
+#define YYNNTS  33
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  60
+#define YYNRULES  62
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  105
+#define YYNSTATES  108
 
 /* YYMAXUTOK -- Last valid token kind.  */
-#define YYMAXUTOK   300
+#define YYMAXUTOK   301
 
 
 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
@@ -571,7 +573,7 @@
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
       35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45
+      45,    46
 };
 
 #if YYDEBUG
@@ -580,11 +582,11 @@
 {
        0,    26,    26,    26,    26,    29,    29,    29,    30,    30,
       31,    31,    32,    32,    34,    34,    34,    34,    34,    34,
-      34,    34,    34,    34,    36,    36,    45,    45,    53,    53,
-      61,    63,    67,    67,    69,    72,    75,    78,    81,    84,
-      87,    90,    93,    96,    99,   103,   106,   106,   109,   109,
-     112,   118,   118,   121,   120,   125,   125,   133,   133,   139,
-     143
+      34,    34,    34,    34,    34,    36,    36,    45,    45,    53,
+      53,    61,    63,    67,    67,    69,    72,    75,    78,    81,
+      84,    87,    90,    93,    96,    99,   103,   106,   106,   109,
+     109,   112,   118,   118,   121,   120,   125,   125,   133,   133,
+     139,   143,   146
 };
 #endif
 
@@ -607,15 +609,15 @@
   "SLOT_DESC", "SMBIOS_DEV_INFO", "IO", "NUMBER", "SUBSYSTEMID", "INHERIT",
   "IOAPIC_IRQ", "IOAPIC", "PCIINT", "GENERIC", "SPI", "USB", "MMIO",
   "GPIO", "FW_CONFIG_TABLE", "FW_CONFIG_FIELD", "FW_CONFIG_OPTION",
-  "FW_CONFIG_PROBE", "PIPE", "$accept", "devtree", "chipchild_nondev",
-  "chipchild", "chipchildren", "chipchildren_dev", "devicechildren",
-  "chip", "@1", "device", "@2", "@3", "alias", "status", "resource",
-  "reference", "registers", "subsystemid", "ioapic_irq",
+  "FW_CONFIG_PROBE", "PIPE", "OPS", "$accept", "devtree",
+  "chipchild_nondev", "chipchild", "chipchildren", "chipchildren_dev",
+  "devicechildren", "chip", "@1", "device", "@2", "@3", "alias", "status",
+  "resource", "reference", "registers", "subsystemid", "ioapic_irq",
   "smbios_slot_desc", "smbios_dev_info", "fw_config_table",
   "fw_config_table_children", "fw_config_field_children",
   "fw_config_field_bits", "fw_config_field_bits_repeating",
   "fw_config_field", "$@4", "$@5", "$@6", "fw_config_option",
-  "fw_config_probe", YY_NULLPTR
+  "fw_config_probe", "ops", YY_NULLPTR
 };
 
 static const char *
@@ -625,7 +627,7 @@
 }
 #endif
 
-#define YYPACT_NINF (-45)
+#define YYPACT_NINF (-57)
 
 #define yypact_value_is_default(Yyn) \
   ((Yyn) == YYPACT_NINF)
@@ -639,17 +641,17 @@
    STATE-NUM.  */
 static const yytype_int8 yypact[] =
 {
-     -45,     6,   -45,     4,   -45,   -45,   -45,   -45,   -12,    45,
-     -45,    15,   -45,    11,    17,    18,    45,    -3,   -45,   -45,
-     -45,   -45,    16,    34,    23,    14,    46,   -45,   -45,    45,
-      25,    19,   -45,    10,    51,    42,    43,   -45,   -45,   -45,
-     -45,   -45,    31,   -45,    -7,   -45,   -45,   -45,    49,    10,
-     -45,   -45,    -6,    25,    19,   -45,   -45,    50,   -45,   -45,
-     -45,   -45,   -45,   -45,    -2,    32,     0,   -45,   -45,   -45,
-      33,   -45,    52,    38,    40,    41,    55,   -45,   -45,   -45,
-     -45,   -45,   -45,   -45,   -45,   -45,    12,    58,    57,    59,
-      47,    44,    61,   -45,    53,    63,   -45,    54,    60,   -45,
-     -45,    64,   -45,   -45,   -45
+     -57,     6,   -57,     2,   -57,   -57,   -57,   -57,   -12,    45,
+     -57,     4,   -57,    11,     5,     7,    45,    -3,   -57,   -57,
+     -57,   -57,    21,    18,    25,    14,    34,   -57,   -57,    45,
+      27,    16,   -57,    44,    53,    46,    47,   -57,   -57,   -57,
+     -57,   -57,    32,   -57,    -7,   -57,   -57,   -57,    49,    44,
+     -57,   -57,    -6,    27,    16,   -57,   -57,    50,   -57,   -57,
+     -57,   -57,   -57,   -57,    -2,    38,     0,   -57,   -57,   -57,
+      39,   -57,    54,    40,    42,    43,    57,    58,   -57,   -57,
+     -57,   -57,   -57,   -57,   -57,   -57,   -57,   -57,    12,    61,
+      60,    62,    48,    51,    63,   -57,   -57,    52,    64,   -57,
+      56,    55,   -57,   -57,    66,   -57,   -57,   -57
 };
 
 /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -657,35 +659,35 @@
    means the default is an error.  */
 static const yytype_int8 yydefact[] =
 {
-       2,     0,     1,     0,    47,     3,     4,    24,     0,     0,
-      45,     0,    46,     0,     0,     0,     0,     0,     5,    11,
-       7,     6,    57,     0,     0,     0,     0,    13,    25,    12,
-      55,    52,    49,     0,    30,     0,     0,     9,    10,     8,
-      50,    49,     0,    53,     0,    32,    33,    28,     0,     0,
-      36,    35,     0,     0,    52,    49,    58,     0,    48,    23,
-      31,    26,    56,    51,     0,     0,     0,    23,    54,    59,
-       0,    29,     0,     0,     0,     0,     0,    15,    14,    16,
-      21,    17,    18,    19,    20,    22,     0,     0,     0,    44,
-       0,     0,     0,    27,     0,    42,    43,    37,     0,    60,
-      34,    41,    38,    39,    40
+       2,     0,     1,     0,    48,     3,     4,    25,     0,     0,
+      46,     0,    47,     0,     0,     0,     0,     0,     5,    11,
+       7,     6,    58,     0,     0,     0,     0,    13,    26,    12,
+      56,    53,    50,     0,    31,     0,     0,     9,    10,     8,
+      51,    50,     0,    54,     0,    33,    34,    29,     0,     0,
+      37,    36,     0,     0,    53,    50,    59,     0,    49,    24,
+      32,    27,    57,    52,     0,     0,     0,    24,    55,    60,
+       0,    30,     0,     0,     0,     0,     0,     0,    15,    14,
+      16,    21,    17,    18,    19,    20,    22,    23,     0,     0,
+       0,    45,     0,     0,     0,    62,    28,     0,    43,    44,
+      38,     0,    61,    35,    42,    39,    40,    41
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int8 yypgoto[] =
 {
-     -45,   -45,    62,   -45,   -45,    66,     8,    -1,   -45,   -28,
-     -45,   -45,   -45,    35,   -45,   -45,   -44,   -45,   -45,   -45,
-     -45,   -45,   -45,   -31,    56,    39,   -45,   -45,   -45,   -45,
-     -45,   -45
+     -57,   -57,    65,   -57,   -57,    68,    22,    -1,   -57,   -28,
+     -57,   -57,   -57,    41,   -57,   -57,   -56,   -57,   -57,   -57,
+     -57,   -57,   -57,   -21,    59,    37,   -57,   -57,   -57,   -57,
+     -57,   -57,   -57
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int8 yydefgoto[] =
 {
        0,     1,    16,    38,    29,    17,    66,    18,     9,    19,
-      67,    59,    49,    47,    79,    20,    21,    81,    82,    83,
-      84,     6,     8,    44,    31,    43,    12,    55,    41,    32,
-      58,    85
+      67,    59,    49,    47,    80,    20,    21,    82,    83,    84,
+      85,     6,     8,    44,    31,    43,    12,    55,    41,    32,
+      58,    86,    87
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -694,58 +696,60 @@
 static const yytype_int8 yytable[] =
 {
        5,    39,    10,     3,    13,    14,     2,    56,    62,     3,
-      52,    28,    68,    70,    71,     3,    13,    14,    23,    45,
-      46,     7,    80,    24,    64,    70,    93,    72,    73,    35,
-      11,    74,    22,    75,    25,    26,    57,    57,    78,    72,
-      73,    57,    80,    74,    76,    75,    30,     4,     3,    13,
-      14,    33,    15,    34,    36,    40,    76,    48,    78,    50,
-      51,    53,    69,    87,    42,    77,    60,    65,    89,    88,
-      90,    91,    92,    94,    95,    86,    96,    97,    99,    98,
-     101,   104,    27,   100,    61,    77,   102,     0,     0,     0,
-     103,    37,     0,    63,     0,     0,     0,     0,    54
+      81,    28,    68,    70,    71,     3,    13,    14,    23,     7,
+      52,    22,    25,    24,    26,    70,    96,    72,    73,    35,
+      11,    74,    81,    75,    64,    33,    57,    57,    79,    72,
+      73,    57,    36,    74,    76,    75,    77,     4,     3,    13,
+      14,    30,    15,    45,    46,    34,    76,    40,    77,    48,
+      79,    42,    53,    50,    51,    78,    60,    65,    69,    89,
+      91,    90,    92,    93,    94,    95,    97,    98,   100,    99,
+     102,   104,   103,   107,    27,   106,   101,    78,   105,    88,
+      61,    63,     0,     0,    37,     0,     0,     0,     0,     0,
+       0,    54
 };
 
 static const yytype_int8 yycheck[] =
 {
        1,    29,    14,     3,     4,     5,     0,    14,    14,     3,
-      41,    14,    14,    13,    14,     3,     4,     5,     7,     9,
-      10,    17,    66,    12,    55,    13,    14,    27,    28,    15,
-      42,    31,    17,    33,    17,    17,    43,    43,    66,    27,
-      28,    43,    86,    31,    44,    33,    30,    41,     3,     4,
-       5,    17,     7,    30,     8,    30,    44,     6,    86,    17,
-      17,    30,    30,    30,    45,    66,    17,    17,    30,    17,
-      30,    30,    17,    15,    17,    67,    17,    30,    17,    35,
-      17,    17,    16,    30,    49,    86,    32,    -1,    -1,    -1,
-      30,    29,    -1,    54,    -1,    -1,    -1,    -1,    42
+      66,    14,    14,    13,    14,     3,     4,     5,     7,    17,
+      41,    17,    17,    12,    17,    13,    14,    27,    28,    15,
+      42,    31,    88,    33,    55,    17,    43,    43,    66,    27,
+      28,    43,     8,    31,    44,    33,    46,    41,     3,     4,
+       5,    30,     7,     9,    10,    30,    44,    30,    46,     6,
+      88,    45,    30,    17,    17,    66,    17,    17,    30,    30,
+      30,    17,    30,    30,    17,    17,    15,    17,    30,    17,
+      17,    17,    30,    17,    16,    30,    35,    88,    32,    67,
+      49,    54,    -1,    -1,    29,    -1,    -1,    -1,    -1,    -1,
+      -1,    42
 };
 
 /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
    state STATE-NUM.  */
 static const yytype_int8 yystos[] =
 {
-       0,    47,     0,     3,    41,    53,    67,    17,    68,    54,
-      14,    42,    72,     4,     5,     7,    48,    51,    53,    55,
-      61,    62,    17,     7,    12,    17,    17,    51,    14,    50,
-      30,    70,    75,    17,    30,    15,     8,    48,    49,    55,
-      30,    74,    45,    71,    69,     9,    10,    59,     6,    58,
-      17,    17,    69,    30,    70,    73,    14,    43,    76,    57,
-      17,    59,    14,    71,    69,    17,    52,    56,    14,    30,
-      13,    14,    27,    28,    31,    33,    44,    53,    55,    60,
-      62,    63,    64,    65,    66,    77,    52,    30,    17,    30,
-      30,    30,    17,    14,    15,    17,    17,    30,    35,    17,
-      30,    17,    32,    30,    17
+       0,    48,     0,     3,    41,    54,    68,    17,    69,    55,
+      14,    42,    73,     4,     5,     7,    49,    52,    54,    56,
+      62,    63,    17,     7,    12,    17,    17,    52,    14,    51,
+      30,    71,    76,    17,    30,    15,     8,    49,    50,    56,
+      30,    75,    45,    72,    70,     9,    10,    60,     6,    59,
+      17,    17,    70,    30,    71,    74,    14,    43,    77,    58,
+      17,    60,    14,    72,    70,    17,    53,    57,    14,    30,
+      13,    14,    27,    28,    31,    33,    44,    46,    54,    56,
+      61,    63,    64,    65,    66,    67,    78,    79,    53,    30,
+      17,    30,    30,    30,    17,    17,    14,    15,    17,    17,
+      30,    35,    17,    30,    17,    32,    30,    17
 };
 
 /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM.  */
 static const yytype_int8 yyr1[] =
 {
-       0,    46,    47,    47,    47,    48,    48,    48,    49,    49,
-      50,    50,    51,    51,    52,    52,    52,    52,    52,    52,
-      52,    52,    52,    52,    54,    53,    56,    55,    57,    55,
-      58,    58,    59,    59,    60,    61,    62,    63,    63,    64,
-      65,    65,    65,    66,    66,    67,    68,    68,    69,    69,
-      70,    71,    71,    73,    72,    74,    72,    75,    72,    76,
-      77
+       0,    47,    48,    48,    48,    49,    49,    49,    50,    50,
+      51,    51,    52,    52,    53,    53,    53,    53,    53,    53,
+      53,    53,    53,    53,    53,    55,    54,    57,    56,    58,
+      56,    59,    59,    60,    60,    61,    62,    63,    64,    64,
+      65,    66,    66,    66,    67,    67,    68,    69,    69,    70,
+      70,    71,    72,    72,    74,    73,    75,    73,    76,    73,
+      77,    78,    79
 };
 
 /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM.  */
@@ -753,11 +757,11 @@
 {
        0,     2,     0,     2,     2,     1,     1,     1,     1,     1,
        2,     0,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     0,     0,     5,     0,     8,     0,     7,
-       0,     2,     1,     1,     4,     4,     4,     3,     4,     4,
-       5,     4,     3,     3,     2,     3,     2,     0,     2,     0,
-       2,     3,     0,     0,     7,     0,     6,     0,     5,     3,
-       3
+       2,     2,     2,     2,     0,     0,     5,     0,     8,     0,
+       7,     0,     2,     1,     1,     4,     4,     4,     3,     4,
+       4,     5,     4,     3,     3,     2,     3,     2,     0,     2,
+       0,     2,     3,     0,     0,     7,     0,     6,     0,     5,
+       3,     3,     2
 };
 
 
@@ -1224,7 +1228,7 @@
          { cur_parent = root_parent; }
     break;
 
-  case 24: /* @1: %empty  */
+  case 25: /* @1: %empty  */
                                 {
 	(yyval.chip_instance) = new_chip_instance((yyvsp[0].string));
 	chip_enqueue_tail(cur_chip_instance);
@@ -1232,113 +1236,113 @@
 }
     break;
 
-  case 25: /* chip: CHIP STRING @1 chipchildren_dev END  */
+  case 26: /* chip: CHIP STRING @1 chipchildren_dev END  */
                              {
 	cur_chip_instance = chip_dequeue_tail();
 }
     break;
 
-  case 26: /* @2: %empty  */
+  case 27: /* @2: %empty  */
                                                        {
 	(yyval.dev) = new_device_raw(cur_parent, cur_chip_instance, (yyvsp[-3].number), (yyvsp[-2].string), (yyvsp[-1].string), (yyvsp[0].number));
 	cur_parent = (yyval.dev)->last_bus;
 }
     break;
 
-  case 27: /* device: DEVICE BUS NUMBER alias status @2 devicechildren END  */
+  case 28: /* device: DEVICE BUS NUMBER alias status @2 devicechildren END  */
                            {
 	cur_parent = (yyvsp[-2].dev)->parent;
 }
     break;
 
-  case 28: /* @3: %empty  */
+  case 29: /* @3: %empty  */
                                        {
 	(yyval.dev) = new_device_reference(cur_parent, cur_chip_instance, (yyvsp[-1].string), (yyvsp[0].number));
 	cur_parent = (yyval.dev)->last_bus;
 }
     break;
 
-  case 29: /* device: DEVICE REFERENCE STRING status @3 devicechildren END  */
+  case 30: /* device: DEVICE REFERENCE STRING status @3 devicechildren END  */
                            {
 	cur_parent = (yyvsp[-2].dev)->parent;
 }
     break;
 
-  case 30: /* alias: %empty  */
+  case 31: /* alias: %empty  */
                    {
 	(yyval.string) = NULL;
 }
     break;
 
-  case 31: /* alias: ALIAS STRING  */
+  case 32: /* alias: ALIAS STRING  */
                  {
 	(yyval.string) = (yyvsp[0].string);
 }
     break;
 
-  case 34: /* resource: RESOURCE NUMBER EQUALS NUMBER  */
+  case 35: /* resource: RESOURCE NUMBER EQUALS NUMBER  */
         { add_resource(cur_parent, (yyvsp[-3].number), strtol((yyvsp[-2].string), NULL, 0), strtol((yyvsp[0].string), NULL, 0)); }
     break;
 
-  case 35: /* reference: REFERENCE STRING ASSOCIATION STRING  */
+  case 36: /* reference: REFERENCE STRING ASSOCIATION STRING  */
         { add_reference(cur_chip_instance, (yyvsp[0].string), (yyvsp[-2].string)); }
     break;
 
-  case 36: /* registers: REGISTER STRING EQUALS STRING  */
+  case 37: /* registers: REGISTER STRING EQUALS STRING  */
         { add_register(cur_chip_instance, (yyvsp[-2].string), (yyvsp[0].string)); }
     break;
 
-  case 37: /* subsystemid: SUBSYSTEMID NUMBER NUMBER  */
+  case 38: /* subsystemid: SUBSYSTEMID NUMBER NUMBER  */
         { add_pci_subsystem_ids(cur_parent, strtol((yyvsp[-1].string), NULL, 16), strtol((yyvsp[0].string), NULL, 16), 0); }
     break;
 
-  case 38: /* subsystemid: SUBSYSTEMID NUMBER NUMBER INHERIT  */
+  case 39: /* subsystemid: SUBSYSTEMID NUMBER NUMBER INHERIT  */
         { add_pci_subsystem_ids(cur_parent, strtol((yyvsp[-2].string), NULL, 16), strtol((yyvsp[-1].string), NULL, 16), 1); }
     break;
 
-  case 39: /* ioapic_irq: IOAPIC_IRQ NUMBER PCIINT NUMBER  */
+  case 40: /* ioapic_irq: IOAPIC_IRQ NUMBER PCIINT NUMBER  */
         { add_ioapic_info(cur_parent, strtol((yyvsp[-2].string), NULL, 16), (yyvsp[-1].string), strtol((yyvsp[0].string), NULL, 16)); }
     break;
 
-  case 40: /* smbios_slot_desc: SLOT_DESC STRING STRING STRING STRING  */
+  case 41: /* smbios_slot_desc: SLOT_DESC STRING STRING STRING STRING  */
         { add_slot_desc(cur_parent, (yyvsp[-3].string), (yyvsp[-2].string), (yyvsp[-1].string), (yyvsp[0].string)); }
     break;
 
-  case 41: /* smbios_slot_desc: SLOT_DESC STRING STRING STRING  */
+  case 42: /* smbios_slot_desc: SLOT_DESC STRING STRING STRING  */
         { add_slot_desc(cur_parent, (yyvsp[-2].string), (yyvsp[-1].string), (yyvsp[0].string), NULL); }
     break;
 
-  case 42: /* smbios_slot_desc: SLOT_DESC STRING STRING  */
+  case 43: /* smbios_slot_desc: SLOT_DESC STRING STRING  */
         { add_slot_desc(cur_parent, (yyvsp[-1].string), (yyvsp[0].string), NULL, NULL); }
     break;
 
-  case 43: /* smbios_dev_info: SMBIOS_DEV_INFO NUMBER STRING  */
+  case 44: /* smbios_dev_info: SMBIOS_DEV_INFO NUMBER STRING  */
         { add_smbios_dev_info(cur_parent, strtol((yyvsp[-1].string), NULL, 0), (yyvsp[0].string)); }
     break;
 
-  case 44: /* smbios_dev_info: SMBIOS_DEV_INFO NUMBER  */
+  case 45: /* smbios_dev_info: SMBIOS_DEV_INFO NUMBER  */
         { add_smbios_dev_info(cur_parent, strtol((yyvsp[0].string), NULL, 0), NULL); }
     break;
 
-  case 45: /* fw_config_table: FW_CONFIG_TABLE fw_config_table_children END  */
+  case 46: /* fw_config_table: FW_CONFIG_TABLE fw_config_table_children END  */
                                                               { }
     break;
 
-  case 50: /* fw_config_field_bits: NUMBER NUMBER  */
+  case 51: /* fw_config_field_bits: NUMBER NUMBER  */
 {
 	append_fw_config_bits(&cur_bits, strtoul((yyvsp[-1].string), NULL, 0), strtoul((yyvsp[0].string), NULL, 0));
 }
     break;
 
-  case 53: /* $@4: %empty  */
+  case 54: /* $@4: %empty  */
         { cur_field = new_fw_config_field((yyvsp[-2].string), cur_bits); }
     break;
 
-  case 54: /* fw_config_field: FW_CONFIG_FIELD STRING fw_config_field_bits fw_config_field_bits_repeating $@4 fw_config_field_children END  */
+  case 55: /* fw_config_field: FW_CONFIG_FIELD STRING fw_config_field_bits fw_config_field_bits_repeating $@4 fw_config_field_children END  */
                                      { cur_bits = NULL; }
     break;
 
-  case 55: /* $@5: %empty  */
+  case 56: /* $@5: %empty  */
                                                             {
 	cur_bits = NULL;
 	append_fw_config_bits(&cur_bits, strtoul((yyvsp[0].string), NULL, 0), strtoul((yyvsp[0].string), NULL, 0));
@@ -1346,28 +1350,32 @@
 }
     break;
 
-  case 56: /* fw_config_field: FW_CONFIG_FIELD STRING NUMBER $@5 fw_config_field_children END  */
+  case 57: /* fw_config_field: FW_CONFIG_FIELD STRING NUMBER $@5 fw_config_field_children END  */
                                      { cur_bits = NULL; }
     break;
 
-  case 57: /* $@6: %empty  */
+  case 58: /* $@6: %empty  */
                                         {
 	cur_field = get_fw_config_field((yyvsp[0].string));
 }
     break;
 
-  case 58: /* fw_config_field: FW_CONFIG_FIELD STRING $@6 fw_config_field_children END  */
+  case 59: /* fw_config_field: FW_CONFIG_FIELD STRING $@6 fw_config_field_children END  */
                                      { cur_bits = NULL; }
     break;
 
-  case 59: /* fw_config_option: FW_CONFIG_OPTION STRING NUMBER  */
+  case 60: /* fw_config_option: FW_CONFIG_OPTION STRING NUMBER  */
         { add_fw_config_option(cur_field, (yyvsp[-1].string), strtoull((yyvsp[0].string), NULL, 0)); }
     break;
 
-  case 60: /* fw_config_probe: FW_CONFIG_PROBE STRING STRING  */
+  case 61: /* fw_config_probe: FW_CONFIG_PROBE STRING STRING  */
         { add_fw_config_probe(cur_parent, (yyvsp[-1].string), (yyvsp[0].string)); }
     break;
 
+  case 62: /* ops: OPS STRING  */
+        { add_device_ops(cur_parent, (yyvsp[0].string)); }
+    break;
+
 
 
       default: break;