device + util/sconfig: introduce new device `gpio`

Introduce a new device `gpio` that is going to be used for generic
abstraction of gpio operations in the devicetree.

The general idea behind this is that every chip can have gpios that
shall be accessible in a very generic way by any driver through the
devicetree.

The chip that implements the chip-specific gpio operations has to assign
them to the generic device operations struct, which then gets assigned
to the gpio device during device probing. See CB:48583 for how this gets
done for the SoCs using intelblocks/gpio.

The gpio device then can be added to the devicetree with an alias name
like in the following example:

  chip soc/whateverlake
    device gpio 0 alias soc_gpio on end
    ...
  end

Any driver that requires access to this gpio device needs to have a
device pointer (or multiple) and an option for specifying the gpio to be
used in its chip config like this:

  struct drivers_ipmi_config {
    ...
    DEVTREE_CONST struct device *gpio_dev;
    u16 post_complete_gpio;
    ...
  };

The device `soc_gpio` can then be linked to the chip driver's `gpio_dev`
above by using the syntax `use ... as ...`, which was introduced in
commit 8e1ea52:

  chip drivers/ipmi
    use soc_gpio as gpio_dev
    register "bmc_jumper_gpio" = "GPP_D22"
    ...
  end

The IPMI driver can then use the generic gpio operations without any
knowlege of the chip's specifics:

  unsigned int gpio_val;
  const struct gpio_operations *gpio_ops;
  gpio_ops = dev_get_gpio_ops(conf->gpio_dev);
  gpio_val = gpio_ops->get(conf->bmc_jumper_gpio);

For a full example have a look at CB:48096 and CB:48095.

This change adds the new device type to sconfig and adds generic gpio
operations to the `device_operations` struct. Also, a helper for getting
the gpio operations from a device after checking them for NULL pointers
gets added.

Successfully tested on Supermicro X11SSM-F with CB:48097, X11SSH-TF with
CB:48711 and OCP DeltaLake with CB:48672.

Change-Id: Ic4572ad8b37bd1afd2fb213b2c67fb8aec536786
Tested-by: Johnny Lin <Johnny_Lin@wiwynn.com>
Tested-by: Michael Niewöhner <foss@mniewoehner.de>
Tested-by: Patrick Rudolph <siro@das-labor.org>
Signed-off-by: Michael Niewöhner <foss@mniewoehner.de>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/48582
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Nico Huber <nico.h@gmx.de>
diff --git a/util/sconfig/sconfig.tab.c_shipped b/util/sconfig/sconfig.tab.c_shipped
index 43fd14f..a8d1e1d 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.6.3.  */
+/* A Bison parser, made by GNU Bison 3.7.2.  */
 
 /* Bison implementation for Yacc-like parsers in C
 
@@ -49,7 +49,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "3.6.3"
+#define YYBISON_VERSION "3.7.2"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -71,6 +71,7 @@
 /* sconfig, coreboot device tree compiler */
 /* SPDX-License-Identifier: GPL-2.0-only */
 
+#include <stdint.h>
 #include "sconfig.h"
 
 int yylex();
@@ -103,96 +104,7 @@
 #  endif
 # endif
 
-/* Use api.header.include to #include this header
-   instead of duplicating it here.  */
-#ifndef YY_YY_SRC_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED
-# define YY_YY_SRC_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED
-/* Debug traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
-#if YYDEBUG
-extern int yydebug;
-#endif
-
-/* Token kinds.  */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
-  enum yytokentype
-  {
-    YYEMPTY = -2,
-    YYEOF = 0,                     /* "end of file"  */
-    YYerror = 256,                 /* error  */
-    YYUNDEF = 257,                 /* "invalid token"  */
-    CHIP = 258,                    /* CHIP  */
-    DEVICE = 259,                  /* DEVICE  */
-    REGISTER = 260,                /* REGISTER  */
-    ALIAS = 261,                   /* ALIAS  */
-    REFERENCE = 262,               /* REFERENCE  */
-    ASSOCIATION = 263,             /* ASSOCIATION  */
-    BOOL = 264,                    /* BOOL  */
-    STATUS = 265,                  /* STATUS  */
-    MANDATORY = 266,               /* MANDATORY  */
-    BUS = 267,                     /* BUS  */
-    RESOURCE = 268,                /* RESOURCE  */
-    END = 269,                     /* END  */
-    EQUALS = 270,                  /* EQUALS  */
-    HEX = 271,                     /* HEX  */
-    STRING = 272,                  /* STRING  */
-    PCI = 273,                     /* PCI  */
-    PNP = 274,                     /* PNP  */
-    I2C = 275,                     /* I2C  */
-    APIC = 276,                    /* APIC  */
-    CPU_CLUSTER = 277,             /* CPU_CLUSTER  */
-    CPU = 278,                     /* CPU  */
-    DOMAIN = 279,                  /* DOMAIN  */
-    IRQ = 280,                     /* IRQ  */
-    DRQ = 281,                     /* DRQ  */
-    SLOT_DESC = 282,               /* SLOT_DESC  */
-    IO = 283,                      /* IO  */
-    NUMBER = 284,                  /* NUMBER  */
-    SUBSYSTEMID = 285,             /* SUBSYSTEMID  */
-    INHERIT = 286,                 /* INHERIT  */
-    IOAPIC_IRQ = 287,              /* IOAPIC_IRQ  */
-    IOAPIC = 288,                  /* IOAPIC  */
-    PCIINT = 289,                  /* PCIINT  */
-    GENERIC = 290,                 /* GENERIC  */
-    SPI = 291,                     /* SPI  */
-    USB = 292,                     /* USB  */
-    MMIO = 293,                    /* MMIO  */
-    LPC = 294,                     /* LPC  */
-    ESPI = 295,                    /* ESPI  */
-    FW_CONFIG_TABLE = 296,         /* FW_CONFIG_TABLE  */
-    FW_CONFIG_FIELD = 297,         /* FW_CONFIG_FIELD  */
-    FW_CONFIG_OPTION = 298,        /* FW_CONFIG_OPTION  */
-    FW_CONFIG_PROBE = 299          /* FW_CONFIG_PROBE  */
-  };
-  typedef enum yytokentype yytoken_kind_t;
-#endif
-
-/* Value type.  */
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-union YYSTYPE
-{
-
-	struct device *dev;
-	struct chip_instance *chip_instance;
-	char *string;
-	int number;
-
-
-};
-typedef union YYSTYPE YYSTYPE;
-# define YYSTYPE_IS_TRIVIAL 1
-# define YYSTYPE_IS_DECLARED 1
-#endif
-
-
-extern YYSTYPE yylval;
-
-int yyparse (void);
-
-#endif /* !YY_YY_SRC_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED  */
+#include "sconfig.tab.h_shipped"
 /* Symbol kind.  */
 enum yysymbol_kind_t
 {
@@ -238,36 +150,37 @@
   YYSYMBOL_MMIO = 38,                      /* MMIO  */
   YYSYMBOL_LPC = 39,                       /* LPC  */
   YYSYMBOL_ESPI = 40,                      /* ESPI  */
-  YYSYMBOL_FW_CONFIG_TABLE = 41,           /* FW_CONFIG_TABLE  */
-  YYSYMBOL_FW_CONFIG_FIELD = 42,           /* FW_CONFIG_FIELD  */
-  YYSYMBOL_FW_CONFIG_OPTION = 43,          /* FW_CONFIG_OPTION  */
-  YYSYMBOL_FW_CONFIG_PROBE = 44,           /* FW_CONFIG_PROBE  */
-  YYSYMBOL_YYACCEPT = 45,                  /* $accept  */
-  YYSYMBOL_devtree = 46,                   /* devtree  */
-  YYSYMBOL_chipchildren = 47,              /* chipchildren  */
-  YYSYMBOL_devicechildren = 48,            /* devicechildren  */
-  YYSYMBOL_chip = 49,                      /* chip  */
-  YYSYMBOL_50_1 = 50,                      /* @1  */
-  YYSYMBOL_device = 51,                    /* device  */
-  YYSYMBOL_52_2 = 52,                      /* @2  */
-  YYSYMBOL_53_3 = 53,                      /* @3  */
-  YYSYMBOL_alias = 54,                     /* alias  */
-  YYSYMBOL_status = 55,                    /* status  */
-  YYSYMBOL_resource = 56,                  /* resource  */
-  YYSYMBOL_reference = 57,                 /* reference  */
-  YYSYMBOL_registers = 58,                 /* registers  */
-  YYSYMBOL_subsystemid = 59,               /* subsystemid  */
-  YYSYMBOL_ioapic_irq = 60,                /* ioapic_irq  */
-  YYSYMBOL_smbios_slot_desc = 61,          /* smbios_slot_desc  */
-  YYSYMBOL_fw_config_table = 62,           /* fw_config_table  */
-  YYSYMBOL_fw_config_table_children = 63,  /* fw_config_table_children  */
-  YYSYMBOL_fw_config_field_children = 64,  /* fw_config_field_children  */
-  YYSYMBOL_fw_config_field = 65,           /* fw_config_field  */
-  YYSYMBOL_66_4 = 66,                      /* $@4  */
-  YYSYMBOL_67_5 = 67,                      /* $@5  */
-  YYSYMBOL_68_6 = 68,                      /* $@6  */
-  YYSYMBOL_fw_config_option = 69,          /* fw_config_option  */
-  YYSYMBOL_fw_config_probe = 70            /* fw_config_probe  */
+  YYSYMBOL_GPIO = 41,                      /* GPIO  */
+  YYSYMBOL_FW_CONFIG_TABLE = 42,           /* FW_CONFIG_TABLE  */
+  YYSYMBOL_FW_CONFIG_FIELD = 43,           /* FW_CONFIG_FIELD  */
+  YYSYMBOL_FW_CONFIG_OPTION = 44,          /* FW_CONFIG_OPTION  */
+  YYSYMBOL_FW_CONFIG_PROBE = 45,           /* FW_CONFIG_PROBE  */
+  YYSYMBOL_YYACCEPT = 46,                  /* $accept  */
+  YYSYMBOL_devtree = 47,                   /* devtree  */
+  YYSYMBOL_chipchildren = 48,              /* chipchildren  */
+  YYSYMBOL_devicechildren = 49,            /* devicechildren  */
+  YYSYMBOL_chip = 50,                      /* chip  */
+  YYSYMBOL_51_1 = 51,                      /* @1  */
+  YYSYMBOL_device = 52,                    /* device  */
+  YYSYMBOL_53_2 = 53,                      /* @2  */
+  YYSYMBOL_54_3 = 54,                      /* @3  */
+  YYSYMBOL_alias = 55,                     /* alias  */
+  YYSYMBOL_status = 56,                    /* status  */
+  YYSYMBOL_resource = 57,                  /* resource  */
+  YYSYMBOL_reference = 58,                 /* reference  */
+  YYSYMBOL_registers = 59,                 /* registers  */
+  YYSYMBOL_subsystemid = 60,               /* subsystemid  */
+  YYSYMBOL_ioapic_irq = 61,                /* ioapic_irq  */
+  YYSYMBOL_smbios_slot_desc = 62,          /* smbios_slot_desc  */
+  YYSYMBOL_fw_config_table = 63,           /* fw_config_table  */
+  YYSYMBOL_fw_config_table_children = 64,  /* fw_config_table_children  */
+  YYSYMBOL_fw_config_field_children = 65,  /* fw_config_field_children  */
+  YYSYMBOL_fw_config_field = 66,           /* fw_config_field  */
+  YYSYMBOL_67_4 = 67,                      /* $@4  */
+  YYSYMBOL_68_5 = 68,                      /* $@5  */
+  YYSYMBOL_69_6 = 69,                      /* $@6  */
+  YYSYMBOL_fw_config_option = 70,          /* fw_config_option  */
+  YYSYMBOL_fw_config_probe = 71            /* fw_config_probe  */
 };
 typedef enum yysymbol_kind_t yysymbol_kind_t;
 
@@ -577,10 +490,10 @@
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  2
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   97
+#define YYLAST   79
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  45
+#define YYNTOKENS  46
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  26
 /* YYNRULES -- Number of rules.  */
@@ -588,7 +501,8 @@
 /* YYNSTATES -- Number of states.  */
 #define YYNSTATES  89
 
-#define YYMAXUTOK   299
+/* YYMAXUTOK -- Last valid token kind.  */
+#define YYMAXUTOK   300
 
 
 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
@@ -631,19 +545,20 @@
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       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
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45
 };
 
 #if YYDEBUG
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_int8 yyrline[] =
 {
-       0,    24,    24,    24,    24,    26,    26,    26,    26,    26,
-      28,    28,    28,    28,    28,    28,    28,    28,    28,    30,
-      30,    39,    39,    47,    47,    55,    57,    61,    61,    63,
-      66,    69,    72,    75,    78,    81,    84,    87,    91,    94,
-      94,    97,    97,   100,   100,   106,   106,   112,   112,   118,
-     122
+       0,    25,    25,    25,    25,    27,    27,    27,    27,    27,
+      29,    29,    29,    29,    29,    29,    29,    29,    29,    31,
+      31,    40,    40,    48,    48,    56,    58,    62,    62,    64,
+      67,    70,    73,    76,    79,    82,    85,    88,    92,    95,
+      95,    98,    98,   101,   101,   107,   107,   113,   113,   119,
+     123
 };
 #endif
 
@@ -665,7 +580,7 @@
   "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",
+  "GPIO", "FW_CONFIG_TABLE", "FW_CONFIG_FIELD", "FW_CONFIG_OPTION",
   "FW_CONFIG_PROBE", "$accept", "devtree", "chipchildren",
   "devicechildren", "chip", "@1", "device", "@2", "@3", "alias", "status",
   "resource", "reference", "registers", "subsystemid", "ioapic_irq",
@@ -690,11 +605,11 @@
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,   297,   298,   299
+     295,   296,   297,   298,   299,   300
 };
 #endif
 
-#define YYPACT_NINF (-12)
+#define YYPACT_NINF (-15)
 
 #define yypact_value_is_default(Yyn) \
   ((Yyn) == YYPACT_NINF)
@@ -708,15 +623,15 @@
      STATE-NUM.  */
 static const yytype_int8 yypact[] =
 {
-     -12,     9,   -12,    18,   -12,   -12,   -12,   -12,     2,   -12,
-     -12,    25,   -12,    16,    14,    10,    30,    31,   -12,   -12,
-     -12,   -12,   -12,    17,   -12,    32,    22,     3,    44,   -12,
-     -12,   -11,    29,    20,    36,    37,   -12,    -7,   -12,    38,
-     -12,   -12,   -12,   -12,    39,    29,   -12,   -12,    -6,   -12,
-      28,   -12,   -12,   -12,   -12,   -12,    -3,   -12,    33,   -12,
-      41,    34,    35,    42,   -12,   -12,   -12,   -12,   -12,   -12,
-     -12,   -12,     1,    45,    48,    40,    27,    49,   -12,    43,
-      50,    46,    47,   -12,   -12,    51,   -12,   -12,   -12
+     -15,     9,   -15,     0,   -15,   -15,   -15,   -15,   -11,   -15,
+     -15,     2,   -15,    45,    -8,    13,     6,    19,   -15,   -15,
+     -15,   -15,   -15,    10,   -15,    23,    12,    11,    36,   -15,
+     -15,    -7,    25,    39,    30,    37,   -15,    -6,   -15,    38,
+     -15,   -15,   -15,   -15,    40,    25,   -15,   -15,    -1,   -15,
+      24,   -15,   -15,   -15,   -15,   -15,    -3,   -15,    27,   -15,
+      41,    31,    32,    46,   -15,   -15,   -15,   -15,   -15,   -15,
+     -15,   -15,     1,    47,    48,    35,    33,    49,   -15,    42,
+      51,    43,    44,   -15,   -15,    52,   -15,   -15,   -15
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -738,9 +653,9 @@
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int8 yypgoto[] =
 {
-     -12,   -12,   -12,    13,    12,   -12,    58,   -12,   -12,   -12,
-      52,   -12,   -12,    60,   -12,   -12,   -12,   -12,   -12,     4,
-     -12,   -12,   -12,   -12,   -12,   -12
+     -15,   -15,   -15,    15,    17,   -15,    57,   -15,   -15,   -15,
+      34,   -15,   -15,    62,   -15,   -15,   -15,   -15,   -15,   -14,
+     -15,   -15,   -15,   -15,   -15,   -15
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
@@ -756,56 +671,52 @@
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int8 yytable[] =
 {
-       3,    15,    16,    38,     3,    15,    16,    49,    54,     2,
-      58,    59,     3,     5,    58,    78,    10,    25,    34,     3,
-      15,    16,    26,    17,    60,    19,    44,    61,    60,    62,
-      18,    61,    39,    62,    37,     7,    39,    39,    41,    42,
-      48,    63,    14,    23,    11,    63,    29,    27,    28,    32,
-       4,    33,    35,    46,    47,    50,    52,    55,    74,    77,
-      79,    82,    73,    75,    76,    80,    83,    85,    88,    81,
-      72,    20,    84,    22,     0,     0,    87,    86,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    53
+       3,    15,    16,    10,     3,    15,    16,    38,    49,     2,
+      58,    59,     3,    54,    58,    78,    37,     7,     5,    14,
+      25,    23,    48,    27,    60,    26,    34,    61,    60,    62,
+      19,    61,    11,    62,    41,    42,    28,    39,    39,    29,
+      32,    33,    63,    39,    35,    44,    63,    46,     3,    15,
+      16,     4,    17,    55,    47,    50,    73,    52,    74,    18,
+      75,    76,    79,    77,    81,    80,    83,    82,    85,    88,
+      20,    84,    72,    87,    86,    22,     0,     0,     0,    53
 };
 
 static const yytype_int8 yycheck[] =
 {
        3,     4,     5,    14,     3,     4,     5,    14,    14,     0,
-      13,    14,     3,     1,    13,    14,    14,     7,    15,     3,
-       4,     5,    12,     7,    27,    13,     6,    30,    27,    32,
-      14,    30,    43,    32,    30,    17,    43,    43,     9,    10,
-      36,    44,    17,    29,    42,    44,    29,    17,    17,    17,
-      41,    29,     8,    17,    17,    17,    17,    29,    17,    17,
-      15,    34,    29,    29,    29,    17,    17,    17,    17,    29,
-      57,    13,    29,    13,    -1,    -1,    29,    31,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    45
+      13,    14,     3,    14,    13,    14,    30,    17,     1,    17,
+       7,    29,    36,    17,    27,    12,    15,    30,    27,    32,
+      13,    30,    43,    32,     9,    10,    17,    44,    44,    29,
+      17,    29,    45,    44,     8,     6,    45,    17,     3,     4,
+       5,    42,     7,    29,    17,    17,    29,    17,    17,    14,
+      29,    29,    15,    17,    29,    17,    17,    34,    17,    17,
+      13,    29,    57,    29,    31,    13,    -1,    -1,    -1,    45
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
      symbol of state STATE-NUM.  */
 static const yytype_int8 yystos[] =
 {
-       0,    46,     0,     3,    41,    49,    62,    17,    63,    50,
-      14,    42,    65,    47,    17,     4,     5,     7,    14,    49,
-      51,    57,    58,    29,    68,     7,    12,    17,    17,    29,
-      67,    64,    17,    29,    15,     8,    66,    64,    14,    43,
-      69,     9,    10,    55,     6,    54,    17,    17,    64,    14,
-      17,    53,    17,    55,    14,    29,    48,    52,    13,    14,
-      27,    30,    32,    44,    49,    51,    56,    58,    59,    60,
-      61,    70,    48,    29,    17,    29,    29,    17,    14,    15,
+       0,    47,     0,     3,    42,    50,    63,    17,    64,    51,
+      14,    43,    66,    48,    17,     4,     5,     7,    14,    50,
+      52,    58,    59,    29,    69,     7,    12,    17,    17,    29,
+      68,    65,    17,    29,    15,     8,    67,    65,    14,    44,
+      70,     9,    10,    56,     6,    55,    17,    17,    65,    14,
+      17,    54,    17,    56,    14,    29,    49,    53,    13,    14,
+      27,    30,    32,    45,    50,    52,    57,    59,    60,    61,
+      62,    71,    49,    29,    17,    29,    29,    17,    14,    15,
       17,    29,    34,    17,    29,    17,    31,    29,    17
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_int8 yyr1[] =
 {
-       0,    45,    46,    46,    46,    47,    47,    47,    47,    47,
-      48,    48,    48,    48,    48,    48,    48,    48,    48,    50,
-      49,    52,    51,    53,    51,    54,    54,    55,    55,    56,
-      57,    58,    59,    59,    60,    61,    61,    61,    62,    63,
-      63,    64,    64,    66,    65,    67,    65,    68,    65,    69,
-      70
+       0,    46,    47,    47,    47,    48,    48,    48,    48,    48,
+      49,    49,    49,    49,    49,    49,    49,    49,    49,    51,
+      50,    53,    52,    54,    52,    55,    55,    56,    56,    57,
+      58,    59,    60,    60,    61,    62,    62,    62,    63,    64,
+      64,    65,    65,    67,    66,    68,    66,    69,    66,    70,
+      71
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -1028,7 +939,7 @@
 }
 
 
-/* The lookahead symbol.  */
+/* Lookahead token kind.  */
 int yychar;
 
 /* The semantic value of the lookahead symbol.  */
@@ -1046,34 +957,30 @@
 int
 yyparse (void)
 {
-    yy_state_fast_t yystate;
+    yy_state_fast_t yystate = 0;
     /* Number of tokens to shift before error messages enabled.  */
-    int yyerrstatus;
+    int yyerrstatus = 0;
 
-    /* The stacks and their tools:
-       'yyss': related to states.
-       'yyvs': related to semantic values.
-
-       Refer to the stacks through separate pointers, to allow yyoverflow
+    /* Refer to the stacks through separate pointers, to allow yyoverflow
        to reallocate them elsewhere.  */
 
     /* Their size.  */
-    YYPTRDIFF_T yystacksize;
+    YYPTRDIFF_T yystacksize = YYINITDEPTH;
 
-    /* The state stack.  */
+    /* The state stack: array, bottom, top.  */
     yy_state_t yyssa[YYINITDEPTH];
-    yy_state_t *yyss;
-    yy_state_t *yyssp;
+    yy_state_t *yyss = yyssa;
+    yy_state_t *yyssp = yyss;
 
-    /* The semantic value stack.  */
+    /* The semantic value stack: array, bottom, top.  */
     YYSTYPE yyvsa[YYINITDEPTH];
-    YYSTYPE *yyvs;
-    YYSTYPE *yyvsp;
+    YYSTYPE *yyvs = yyvsa;
+    YYSTYPE *yyvsp = yyvs;
 
   int yyn;
   /* The return value of yyparse.  */
   int yyresult;
-  /* Lookahead token as an internal (translated) token number.  */
+  /* Lookahead symbol kind.  */
   yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
   /* The variables used to return semantic value and location from the
      action routines.  */
@@ -1087,15 +994,6 @@
      Keep to zero when no symbol should be popped.  */
   int yylen = 0;
 
-  yynerrs = 0;
-  yystate = 0;
-  yyerrstatus = 0;
-
-  yystacksize = YYINITDEPTH;
-  yyssp = yyss = yyssa;
-  yyvsp = yyvs = yyvsa;
-
-
   YYDPRINTF ((stderr, "Starting parse\n"));
 
   yychar = YYEMPTY; /* Cause a token to be read.  */
@@ -1296,11 +1194,11 @@
   YY_REDUCE_PRINT (yyn);
   switch (yyn)
     {
-  case 2:
+  case 2: /* devtree: %empty  */
          { cur_parent = root_parent; }
     break;
 
-  case 19:
+  case 19: /* @1: %empty  */
                                 {
 	(yyval.chip_instance) = new_chip_instance((yyvsp[0].string));
 	chip_enqueue_tail(cur_chip_instance);
@@ -1308,125 +1206,125 @@
 }
     break;
 
-  case 20:
+  case 20: /* chip: CHIP STRING @1 chipchildren END  */
                          {
 	cur_chip_instance = chip_dequeue_tail();
 }
     break;
 
-  case 21:
+  case 21: /* @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 22:
+  case 22: /* device: DEVICE BUS NUMBER alias status @2 devicechildren END  */
                            {
 	cur_parent = (yyvsp[-2].dev)->parent;
 }
     break;
 
-  case 23:
+  case 23: /* @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 24:
+  case 24: /* device: DEVICE REFERENCE STRING status @3 devicechildren END  */
                            {
 	cur_parent = (yyvsp[-2].dev)->parent;
 }
     break;
 
-  case 25:
+  case 25: /* alias: %empty  */
                    {
 	(yyval.string) = NULL;
 }
     break;
 
-  case 26:
+  case 26: /* alias: ALIAS STRING  */
                  {
 	(yyval.string) = (yyvsp[0].string);
 }
     break;
 
-  case 29:
+  case 29: /* 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 30:
+  case 30: /* reference: REFERENCE STRING ASSOCIATION STRING  */
         { add_reference(cur_chip_instance, (yyvsp[0].string), (yyvsp[-2].string)); }
     break;
 
-  case 31:
+  case 31: /* registers: REGISTER STRING EQUALS STRING  */
         { add_register(cur_chip_instance, (yyvsp[-2].string), (yyvsp[0].string)); }
     break;
 
-  case 32:
+  case 32: /* 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 33:
+  case 33: /* 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 34:
+  case 34: /* 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 35:
+  case 35: /* 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 36:
+  case 36: /* 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 37:
+  case 37: /* smbios_slot_desc: SLOT_DESC STRING STRING  */
         { add_slot_desc(cur_parent, (yyvsp[-1].string), (yyvsp[0].string), NULL, NULL); }
     break;
 
-  case 38:
+  case 38: /* fw_config_table: FW_CONFIG_TABLE fw_config_table_children END  */
                                                               { }
     break;
 
-  case 43:
+  case 43: /* $@4: %empty  */
                                                                                           {
 	cur_field = new_fw_config_field((yyvsp[-2].string), strtoul((yyvsp[-1].string), NULL, 0), strtoul((yyvsp[0].string), NULL, 0));
 }
     break;
 
-  case 44:
+  case 44: /* fw_config_field: FW_CONFIG_FIELD STRING NUMBER NUMBER $@4 fw_config_field_children END  */
                                      { }
     break;
 
-  case 45:
+  case 45: /* $@5: %empty  */
                                                             {
 	cur_field = new_fw_config_field((yyvsp[-1].string), strtoul((yyvsp[0].string), NULL, 0), strtoul((yyvsp[0].string), NULL, 0));
 }
     break;
 
-  case 46:
+  case 46: /* fw_config_field: FW_CONFIG_FIELD STRING NUMBER $@5 fw_config_field_children END  */
                                      { }
     break;
 
-  case 47:
+  case 47: /* $@6: %empty  */
                                         {
 	cur_field = get_fw_config_field((yyvsp[0].string));
 }
     break;
 
-  case 48:
+  case 48: /* fw_config_field: FW_CONFIG_FIELD STRING $@6 fw_config_field_children END  */
                                      { }
     break;
 
-  case 49:
-        { add_fw_config_option(cur_field, (yyvsp[-1].string), strtoul((yyvsp[0].string), NULL, 0)); }
+  case 49: /* 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 50:
+  case 50: /* fw_config_probe: FW_CONFIG_PROBE STRING STRING  */
         { add_fw_config_probe(cur_parent, (yyvsp[-1].string), (yyvsp[0].string)); }
     break;
 
@@ -1590,13 +1488,13 @@
 yyexhaustedlab:
   yyerror (YY_("memory exhausted"));
   yyresult = 2;
-  /* Fall through.  */
+  goto yyreturn;
 #endif
 
 
-/*-----------------------------------------------------.
-| yyreturn -- parsing is finished, return the result.  |
-`-----------------------------------------------------*/
+/*-------------------------------------------------------.
+| yyreturn -- parsing is finished, clean up and return.  |
+`-------------------------------------------------------*/
 yyreturn:
   if (yychar != YYEMPTY)
     {