Add configurable ramstage support for minimal PCI scanning

This CL has changes that allow us to enable a configurable
ramstage, and one change that allows us to minimize PCI
scanning. Minimal scanning is a frequently requested feature.

To enable it, we add two new variables to src/Kconfig
CONFIGURABLE_RAMSTAGE
is the overall variable controlling other options for minimizing the
ramstage.

MINIMAL_PCI_SCANNING is how we indicate we wish to enable minimal
PCI scanning.

Some devices must be scanned in all cases, such as 0:0.0.

To indicate which devices we must scan, we add a new mandatory
keyword to sconfig

It is used in place of on, off, or hidden, and indicates
a device is enabled and mandatory. Mandatory
devices are always scanned. When MINIMAL_PCI_SCANNING is enabled,
ONLY mandatory devices are scanned.

We further add support in src/device/pci_device.c to manage
both MINIMAL_PCI_SCANNING and mandatory devices.

Finally, to show how this works in practice, we add mandatory
keywords to 3 devices on the qemu-q35.

TEST=
1. This is tested and working on the qemu-q35 target.
2. On CML-Hatch

Before CL:
Total Boot time: ~685ms

After CL:
Total Boot time: ~615ms

Change-Id: I2073d9f8e9297c2b02530821ebb634ea2a5c758e
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/36221
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Jeremy Soller <jeremy@system76.com>
diff --git a/src/Kconfig b/src/Kconfig
index f538a1c..3742c04 100644
--- a/src/Kconfig
+++ b/src/Kconfig
@@ -354,6 +354,21 @@
 	  Skip PCI enumeration logic and only allocate BAR for fixed devices
 	  (bootable devices, TPM over GSPI).
 
+config CONFIGURABLE_RAMSTAGE
+	bool "Enable a configurable ramstage."
+	default y if ARCH_X86
+	help
+	  A configurable ramstage allows you to select which parts of the ramstage
+	  to run. Currently, we can only select a minimal PCI scanning step.
+	  The minimal PCI scanning will only check those parts that are enabled
+	  in the devicetree.cb. By convention none of those devices should be bridges.
+
+config MINIMAL_PCI_SCANNING
+	bool "Enable minimal PCI scanning"
+	depends on CONFIGURABLE_RAMSTAGE
+	help
+	  If this option is enabled, coreboot will scan only devices
+	  marked as mandatory in devicetree.cb
 endmenu
 
 menu "Mainboard"
diff --git a/src/device/pci_device.c b/src/device/pci_device.c
index 47c0e9f..b1e88a6 100644
--- a/src/device/pci_device.c
+++ b/src/device/pci_device.c
@@ -1195,6 +1195,12 @@
 	 * non-existence and single function devices.
 	 */
 	for (devfn = min_devfn; devfn <= max_devfn; devfn++) {
+		if (CONFIG(MINIMAL_PCI_SCANNING)) {
+			dev = pcidev_path_behind(bus, devfn);
+			if (!dev || !dev->mandatory)
+				continue;
+		}
+
 		/* First thing setup the device structure. */
 		dev = pci_scan_get_dev(bus, devfn);
 
diff --git a/src/include/device/device.h b/src/include/device/device.h
index c3a1106..333ac5d 100644
--- a/src/include/device/device.h
+++ b/src/include/device/device.h
@@ -119,7 +119,10 @@
 	unsigned int  initialized : 1; /* 1 if we have initialized the device */
 	unsigned int    on_mainboard : 1;
 	unsigned int    disable_pcie_aspm : 1;
-	unsigned int    hidden : 1;	/* set if we should hide from UI */
+	/* set if we should hide from UI */
+	unsigned int    hidden : 1;
+	/* set if this device is used even in minimum PCI cases */
+	unsigned int    mandatory : 1;
 	u8 command;
 	uint16_t hotplug_buses; /* Number of hotplug buses to allocate */
 
diff --git a/src/mainboard/emulation/qemu-q35/devicetree.cb b/src/mainboard/emulation/qemu-q35/devicetree.cb
index 671a2d6..c032606 100644
--- a/src/mainboard/emulation/qemu-q35/devicetree.cb
+++ b/src/mainboard/emulation/qemu-q35/devicetree.cb
@@ -5,10 +5,10 @@
 		end
 	end
 	device domain 0 on
-		device pci 0.0 on end		# northbridge (q35)
+		device pci 0.0 mandatory end		# northbridge (q35)
 		chip southbridge/intel/i82801ix
 			# present unconditionally
-			device pci 1f.0 on end	# LPC
+			device pci 1f.0 mandatory end	# LPC
 			device pci 1f.2 on end	# SATA
 			device pci 1f.3 on end	# SMBus
 
diff --git a/util/sconfig/lex.yy.c_shipped b/util/sconfig/lex.yy.c_shipped
index 14ffeff..6329773 100644
--- a/util/sconfig/lex.yy.c_shipped
+++ b/util/sconfig/lex.yy.c_shipped
@@ -6,7 +6,7 @@
 #define FLEX_SCANNER
 #define YY_FLEX_MAJOR_VERSION 2
 #define YY_FLEX_MINOR_VERSION 6
-#define YY_FLEX_SUBMINOR_VERSION 1
+#define YY_FLEX_SUBMINOR_VERSION 4
 #if YY_FLEX_SUBMINOR_VERSION > 0
 #define FLEX_BETA
 #endif
@@ -81,10 +81,16 @@
 #define UINT32_MAX             (4294967295U)
 #endif
 
+#ifndef SIZE_MAX
+#define SIZE_MAX               (~(size_t)0)
+#endif
+
 #endif /* ! C99 */
 
 #endif /* ! FLEXINT_H */
 
+/* begin standard C++ headers. */
+
 /* TODO: this is always defined, so inline it */
 #define yyconst const
 
@@ -97,32 +103,26 @@
 /* Returned upon end-of-file. */
 #define YY_NULL 0
 
-/* Promotes a possibly negative, possibly signed char to an unsigned
- * integer for use as an array index.  If the signed char is negative,
- * we want to instead treat it as an 8-bit unsigned char, hence the
- * double cast.
+/* Promotes a possibly negative, possibly signed char to an
+ *   integer in range [0..255] for use as an array index.
  */
-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+#define YY_SC_TO_UI(c) ((YY_CHAR) (c))
 
 /* Enter a start condition.  This macro really ought to take a parameter,
  * but we do it the disgusting crufty way forced on us by the ()-less
  * definition of BEGIN.
  */
 #define BEGIN (yy_start) = 1 + 2 *
-
 /* Translate the current start state into a value that can be later handed
  * to BEGIN to return to the state.  The YYSTATE alias is for lex
  * compatibility.
  */
 #define YY_START (((yy_start) - 1) / 2)
 #define YYSTATE YY_START
-
 /* Action number for EOF rule of a given start state. */
 #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-
 /* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE yyrestart(yyin  )
-
+#define YY_NEW_FILE yyrestart( yyin  )
 #define YY_END_OF_BUFFER_CHAR 0
 
 /* Size of default input buffer. */
@@ -159,16 +159,14 @@
 #define EOB_ACT_CONTINUE_SCAN 0
 #define EOB_ACT_END_OF_FILE 1
 #define EOB_ACT_LAST_MATCH 2
-
     #define YY_LESS_LINENO(n)
     #define YY_LINENO_REWIND_TO(ptr)
-    
 /* Return all but the first "n" matched characters back to the input stream. */
 #define yyless(n) \
 	do \
 		{ \
 		/* Undo effects of setting up yytext. */ \
-        yy_size_t yyless_macro_arg = (n); \
+        int yyless_macro_arg = (n); \
         YY_LESS_LINENO(yyless_macro_arg);\
 		*yy_cp = (yy_hold_char); \
 		YY_RESTORE_YY_MORE_OFFSET \
@@ -176,7 +174,6 @@
 		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
 		} \
 	while ( 0 )
-
 #define unput(c) yyunput( c, (yytext_ptr)  )
 
 #ifndef YY_STRUCT_YY_BUFFER_STATE
@@ -258,7 +255,6 @@
 #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
                           ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
                           : NULL)
-
 /* Same as previous macro, but useful when we know that the buffer stack is not
  * NULL or when we need an lvalue. For internal use only.
  */
@@ -279,62 +275,56 @@
  */
 static int yy_did_buffer_switch_on_eof;
 
-void yyrestart (FILE *input_file  );
-void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer  );
-YY_BUFFER_STATE yy_create_buffer (FILE *file,int size  );
-void yy_delete_buffer (YY_BUFFER_STATE b  );
-void yy_flush_buffer (YY_BUFFER_STATE b  );
-void yypush_buffer_state (YY_BUFFER_STATE new_buffer  );
-void yypop_buffer_state (void );
+void yyrestart ( FILE *input_file  );
+void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer  );
+YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size  );
+void yy_delete_buffer ( YY_BUFFER_STATE b  );
+void yy_flush_buffer ( YY_BUFFER_STATE b  );
+void yypush_buffer_state ( YY_BUFFER_STATE new_buffer  );
+void yypop_buffer_state ( void );
 
-static void yyensure_buffer_stack (void );
-static void yy_load_buffer_state (void );
-static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file  );
+static void yyensure_buffer_stack ( void );
+static void yy_load_buffer_state ( void );
+static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file  );
+#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER )
 
-#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
+YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size  );
+YY_BUFFER_STATE yy_scan_string ( const char *yy_str  );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len  );
 
-YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size  );
-YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str  );
-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len  );
-
-void *yyalloc (yy_size_t  );
-void *yyrealloc (void *,yy_size_t  );
-void yyfree (void *  );
+void *yyalloc ( yy_size_t  );
+void *yyrealloc ( void *, yy_size_t  );
+void yyfree ( void *  );
 
 #define yy_new_buffer yy_create_buffer
-
 #define yy_set_interactive(is_interactive) \
 	{ \
 	if ( ! YY_CURRENT_BUFFER ){ \
         yyensure_buffer_stack (); \
 		YY_CURRENT_BUFFER_LVALUE =    \
-            yy_create_buffer(yyin,YY_BUF_SIZE ); \
+            yy_create_buffer( yyin, YY_BUF_SIZE ); \
 	} \
 	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
 	}
-
 #define yy_set_bol(at_bol) \
 	{ \
 	if ( ! YY_CURRENT_BUFFER ){\
         yyensure_buffer_stack (); \
 		YY_CURRENT_BUFFER_LVALUE =    \
-            yy_create_buffer(yyin,YY_BUF_SIZE ); \
+            yy_create_buffer( yyin, YY_BUF_SIZE ); \
 	} \
 	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
 	}
-
 #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
 
 /* Begin user sect3 */
-
-typedef unsigned char YY_CHAR;
+typedef flex_uint8_t YY_CHAR;
 
 FILE *yyin = NULL, *yyout = NULL;
 
 typedef int yy_state_type;
 
 extern int yylineno;
-
 int yylineno = 1;
 
 extern char *yytext;
@@ -343,10 +333,10 @@
 #endif
 #define yytext_ptr yytext
 
-static yy_state_type yy_get_previous_state (void );
-static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
-static int yy_get_next_buffer (void );
-static void yynoreturn yy_fatal_error (yyconst char* msg  );
+static yy_state_type yy_get_previous_state ( void );
+static yy_state_type yy_try_NUL_trans ( yy_state_type current_state  );
+static int yy_get_next_buffer ( void );
+static void yynoreturn yy_fatal_error ( const char* msg  );
 
 /* Done after the current pattern has been matched and before the
  * corresponding action - sets up yytext.
@@ -357,9 +347,8 @@
 	(yy_hold_char) = *yy_cp; \
 	*yy_cp = '\0'; \
 	(yy_c_buf_p) = yy_cp;
-
-#define YY_NUM_RULES 38
-#define YY_END_OF_BUFFER 39
+#define YY_NUM_RULES 39
+#define YY_END_OF_BUFFER 40
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -367,28 +356,29 @@
 	flex_int32_t yy_verify;
 	flex_int32_t yy_nxt;
 	};
-static yyconst flex_int16_t yy_accept[160] =
+static const flex_int16_t yy_accept[168] =
     {   0,
-        0,    0,   39,   37,    1,    3,   37,   37,   37,   32,
-       32,   30,   33,   37,   33,   33,   33,   37,   37,   37,
-       37,   37,   37,   37,   37,   37,   37,   37,    1,    3,
-       37,    0,   37,   37,    0,    2,   32,   33,   37,   37,
-       37,   37,   33,   37,   37,   37,   37,   37,   37,   37,
-       24,   37,   37,   37,   37,    7,   37,   37,   37,   37,
-       37,   37,   37,   36,   36,   37,    0,   31,   37,   37,
-       16,   37,   37,   23,   28,   37,   37,   13,   37,   37,
-       22,   37,   37,    8,   10,   12,   37,   37,   20,   37,
-       21,   37,    0,   34,    4,   37,   37,   37,   37,   37,
+        0,    0,   40,   38,    1,    3,   38,   38,   38,   33,
+       33,   31,   34,   38,   34,   34,   34,   38,   38,   38,
+       38,   38,   38,   38,   38,   38,   38,   38,    1,    3,
+       38,    0,   38,   38,    0,    2,   33,   34,   38,   38,
+       38,   38,   34,   38,   38,   38,   38,   38,   38,   38,
+       25,   38,   38,   38,   38,   38,    7,   38,   38,   38,
+       38,   38,   38,   38,   37,   37,   38,    0,   32,   38,
+       38,   17,   38,   38,   24,   29,   38,   38,   14,   38,
+       38,   23,   38,   38,   38,    8,   11,   13,   38,   38,
+       21,   38,   22,   38,    0,   35,    4,   38,   38,   38,
 
-       37,   37,   37,   19,   37,   37,   37,   35,   35,   37,
-       37,   37,   37,   37,   37,   37,   14,   37,   37,   37,
-       37,    5,   17,   37,    9,   37,   11,   37,   37,   37,
-       37,   18,   26,   37,   37,   37,   37,   37,   37,    6,
-       37,   37,   37,   37,   37,   37,   37,   25,   37,   37,
-       15,   37,   27,   37,   37,   37,   37,   29,    0
+       38,   38,   38,   38,   38,   38,   20,   38,   38,   38,
+       36,   36,   38,   38,   38,   38,   38,   38,   38,   15,
+       38,   38,   38,   38,   38,    5,   18,   38,    9,   38,
+       12,   38,   38,   38,   38,   38,   19,   27,   38,   38,
+       38,   38,   38,   38,   38,   38,    6,   38,   38,   38,
+       38,   10,   38,   38,   38,   26,   38,   38,   16,   38,
+       28,   38,   38,   38,   38,   30,    0
     } ;
 
-static yyconst YY_CHAR yy_ec[256] =
+static const YY_CHAR yy_ec[256] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
         1,    1,    4,    1,    1,    1,    1,    1,    1,    1,
@@ -420,7 +410,7 @@
         1,    1,    1,    1,    1
     } ;
 
-static yyconst YY_CHAR yy_meta[39] =
+static const YY_CHAR yy_meta[39] =
     {   0,
         1,    2,    2,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -428,114 +418,118 @@
         1,    1,    1,    1,    1,    1,    1,    1
     } ;
 
-static yyconst flex_uint16_t yy_base[167] =
+static const flex_int16_t yy_base[175] =
     {   0,
-        0,    0,  227,    0,  224,  228,  222,   37,   41,   38,
-      187,    0,   44,  209,   54,   78,   60,  201,  196,   45,
-      203,  192,   42,   47,  197,   62,  184,    0,  214,  228,
-       77,  210,   88,   69,  211,  228,    0,   87,  104,  198,
-      187,  176,   93,  183,  178,  188,  179,  186,  186,  180,
-      186,  171,  171,  175,  177,    0,  173,  167,  173,  177,
-      169,  175,  174,    0,  228,  101,  186,    0,  179,  159,
-      172,  162,  169,    0,    0,  164,  164,    0,  162,  152,
-        0,  156,  151,    0,    0,    0,  154,  153,    0,  144,
-        0,  171,  170,    0,    0,  155,  154,  147,  139,  149,
+        0,    0,  235,    0,  232,  236,  230,   37,   41,   38,
+      195,    0,   44,  217,   54,   78,   60,  209,  204,   45,
+      211,   48,   42,   52,  206,   62,  193,    0,  223,  236,
+       88,  219,   93,   79,  220,  236,    0,   93,  104,  207,
+      196,  185,   96,  192,  187,  197,  188,  195,  195,  189,
+      195,  180,  180,  181,  183,  185,    0,  181,  175,  181,
+      185,  177,  183,  182,    0,  236,  115,  194,    0,  187,
+      167,  180,  170,  177,    0,    0,  172,  172,    0,  170,
+      160,    0,  164,  168,  158,    0,    0,    0,  161,  160,
+        0,  151,    0,  178,  177,    0,    0,  162,  161,  154,
 
-      137,  143,  148,    0,  133,  136,  126,    0,  228,  137,
-      141,  133,  135,  131,  133,  138,    0,  122,  122,  121,
-      118,    0,    0,  133,    0,  117,  134,  128,  132,  113,
-      113,    0,    0,  120,  112,  110,  121,   94,   95,    0,
-       94,   92,   97,   86,   85,   84,   76,    0,   71,   78,
-        0,   67,    0,   61,   55,   32,   29,    0,  228,   40,
-      129,  131,  133,  135,  137,  139
+      146,  156,  144,  150,  155,  156,    0,  139,  142,  132,
+        0,  236,  143,  147,  139,  141,  137,  139,  144,    0,
+      128,  127,  127,  126,  123,    0,    0,  138,    0,  122,
+      139,  125,  132,  136,  117,  117,    0,    0,  124,  116,
+      115,  113,  124,   97,   98,   91,    0,  102,  100,   98,
+       83,    0,   80,   83,   74,    0,   60,   63,    0,   63,
+        0,   56,   51,   33,   29,    0,  236,   40,  132,  134,
+      136,  138,  140,  142
     } ;
 
-static yyconst flex_int16_t yy_def[167] =
+static const flex_int16_t yy_def[175] =
     {   0,
-      159,    1,  159,  160,  159,  159,  160,  161,  162,  160,
-       10,  160,   10,  160,   10,   10,   10,  160,  160,  160,
-      160,  160,  160,  160,  160,  160,  160,  160,  159,  159,
-      161,  163,  164,  162,  165,  159,   10,   10,   10,  160,
-      160,  160,   10,  160,  160,  160,  160,  160,  160,  160,
-      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
-      160,  160,  160,  160,  159,  164,  166,   39,  160,  160,
-      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
-      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
-      160,  160,  159,  160,  160,  160,  160,  160,  160,  160,
+      167,    1,  167,  168,  167,  167,  168,  169,  170,  168,
+       10,  168,   10,  168,   10,   10,   10,  168,  168,  168,
+      168,  168,  168,  168,  168,  168,  168,  168,  167,  167,
+      169,  171,  172,  170,  173,  167,   10,   10,   10,  168,
+      168,  168,   10,  168,  168,  168,  168,  168,  168,  168,
+      168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
+      168,  168,  168,  168,  168,  167,  172,  174,   39,  168,
+      168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
+      168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
+      168,  168,  168,  168,  167,  168,  168,  168,  168,  168,
 
-      160,  160,  160,  160,  160,  160,  160,  160,  159,  160,
-      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
-      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
-      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
-      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
-      160,  160,  160,  160,  160,  160,  160,  160,    0,  159,
-      159,  159,  159,  159,  159,  159
+      168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
+      168,  167,  168,  168,  168,  168,  168,  168,  168,  168,
+      168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
+      168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
+      168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
+      168,  168,  168,  168,  168,  168,  168,  168,  168,  168,
+      168,  168,  168,  168,  168,  168,    0,  167,  167,  167,
+      167,  167,  167,  167
     } ;
 
-static yyconst flex_uint16_t yy_nxt[267] =
+static const flex_int16_t yy_nxt[275] =
     {   0,
         4,    5,    6,    7,    8,    9,   10,   11,   10,   12,
        13,   13,   14,    4,    4,    4,   13,   13,   15,   16,
        17,   13,   18,   19,   20,   21,   22,    4,   23,   24,
         4,   25,   26,    4,   27,    4,    4,    4,   32,   32,
-       28,   33,   35,   36,   37,   37,   37,  158,   38,   38,
+       28,   33,   35,   36,   37,   37,   37,  166,   38,   38,
        38,   38,   38,   49,   38,   38,   38,   38,   38,   38,
-       38,   38,   38,   55,  157,   57,   38,   38,   38,   56,
-       35,   36,   50,   51,   58,  156,   52,   41,   32,   32,
-      155,   64,  154,   42,   38,   38,   38,   46,   60,   67,
-       67,   61,   28,   38,   38,   38,   62,  153,   43,   38,
+       38,   38,   38,   56,   54,  165,   38,   38,   38,   57,
+       58,  164,   50,   51,   55,  163,   52,   41,  162,   59,
+       35,   36,  161,   42,   38,   38,   38,   46,   61,   32,
+       32,   62,   65,  160,   68,   68,   63,   28,   43,   38,
 
-       38,   38,   67,   67,  152,   92,   44,  151,  150,   45,
-       68,   68,   68,  149,   68,   68,  148,  147,  146,  145,
-       68,   68,   68,   68,   68,   68,  144,  143,   72,   31,
-       31,   34,   34,   32,   32,   66,   66,   35,   35,   67,
-       67,  142,  141,  140,  139,  138,  137,  136,  135,  134,
+       38,   38,   38,   38,   38,  159,   44,  158,  157,   45,
+       69,   69,   69,  156,   69,   69,   68,   68,  155,   94,
+       69,   69,   69,   69,   69,   69,  154,  153,  152,  151,
+      150,   73,   31,   31,   34,   34,   32,   32,   67,   67,
+       35,   35,   68,   68,  149,  148,  147,  146,  145,  144,
+      143,  142,  141,  140,  139,  138,  137,  136,  135,  134,
       133,  132,  131,  130,  129,  128,  127,  126,  125,  124,
       123,  122,  121,  120,  119,  118,  117,  116,  115,  114,
       113,  112,  111,  110,  109,  108,  107,  106,  105,  104,
-      103,  102,  101,  100,   99,   98,   97,   96,   95,   94,
-       93,   91,   90,   89,   88,   87,   86,   85,   84,   83,
+      103,  102,  101,  100,   99,   98,   97,   96,   95,   93,
 
-       82,   81,   80,   79,   78,   77,   76,   75,   74,   73,
-       71,   70,   69,   36,   65,   29,   63,   59,   54,   53,
-       48,   47,   40,   39,   30,   29,  159,    3,  159,  159,
-      159,  159,  159,  159,  159,  159,  159,  159,  159,  159,
-      159,  159,  159,  159,  159,  159,  159,  159,  159,  159,
-      159,  159,  159,  159,  159,  159,  159,  159,  159,  159,
-      159,  159,  159,  159,  159,  159
+       92,   91,   90,   89,   88,   87,   86,   85,   84,   83,
+       82,   81,   80,   79,   78,   77,   76,   75,   74,   72,
+       71,   70,   36,   66,   29,   64,   60,   53,   48,   47,
+       40,   39,   30,   29,  167,    3,  167,  167,  167,  167,
+      167,  167,  167,  167,  167,  167,  167,  167,  167,  167,
+      167,  167,  167,  167,  167,  167,  167,  167,  167,  167,
+      167,  167,  167,  167,  167,  167,  167,  167,  167,  167,
+      167,  167,  167,  167
     } ;
 
-static yyconst flex_int16_t yy_chk[267] =
+static const flex_int16_t yy_chk[275] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    8,    8,
-      160,    8,    9,    9,   10,   10,   10,  157,   10,   10,
+      168,    8,    9,    9,   10,   10,   10,  165,   10,   10,
        13,   13,   13,   20,   10,   10,   10,   10,   10,   10,
-       15,   15,   15,   23,  156,   24,   17,   17,   17,   23,
-       34,   34,   20,   20,   24,  155,   20,   15,   31,   31,
-      154,   31,  152,   15,   16,   16,   16,   17,   26,   33,
-       33,   26,   33,   38,   38,   38,   26,  150,   16,   43,
+       15,   15,   15,   23,   22,  164,   17,   17,   17,   23,
+       24,  163,   20,   20,   22,  162,   20,   15,  160,   24,
+       34,   34,  158,   15,   16,   16,   16,   17,   26,   31,
+       31,   26,   31,  157,   33,   33,   26,   33,   16,   38,
 
-       43,   43,   66,   66,  149,   66,   16,  147,  146,   16,
-       39,   39,   39,  145,   39,   39,  144,  143,  142,  141,
-       39,   39,   39,   39,   39,   39,  139,  138,   43,  161,
-      161,  162,  162,  163,  163,  164,  164,  165,  165,  166,
-      166,  137,  136,  135,  134,  131,  130,  129,  128,  127,
-      126,  124,  121,  120,  119,  118,  116,  115,  114,  113,
-      112,  111,  110,  107,  106,  105,  103,  102,  101,  100,
-       99,   98,   97,   96,   93,   92,   90,   88,   87,   83,
-       82,   80,   79,   77,   76,   73,   72,   71,   70,   69,
-       67,   63,   62,   61,   60,   59,   58,   57,   55,   54,
+       38,   38,   43,   43,   43,  155,   16,  154,  153,   16,
+       39,   39,   39,  151,   39,   39,   67,   67,  150,   67,
+       39,   39,   39,   39,   39,   39,  149,  148,  146,  145,
+      144,   43,  169,  169,  170,  170,  171,  171,  172,  172,
+      173,  173,  174,  174,  143,  142,  141,  140,  139,  136,
+      135,  134,  133,  132,  131,  130,  128,  125,  124,  123,
+      122,  121,  119,  118,  117,  116,  115,  114,  113,  110,
+      109,  108,  106,  105,  104,  103,  102,  101,  100,   99,
+       98,   95,   94,   92,   90,   89,   85,   84,   83,   81,
+       80,   78,   77,   74,   73,   72,   71,   70,   68,   64,
 
-       53,   52,   51,   50,   49,   48,   47,   46,   45,   44,
-       42,   41,   40,   35,   32,   29,   27,   25,   22,   21,
-       19,   18,   14,   11,    7,    5,    3,  159,  159,  159,
-      159,  159,  159,  159,  159,  159,  159,  159,  159,  159,
-      159,  159,  159,  159,  159,  159,  159,  159,  159,  159,
-      159,  159,  159,  159,  159,  159,  159,  159,  159,  159,
-      159,  159,  159,  159,  159,  159
+       63,   62,   61,   60,   59,   58,   56,   55,   54,   53,
+       52,   51,   50,   49,   48,   47,   46,   45,   44,   42,
+       41,   40,   35,   32,   29,   27,   25,   21,   19,   18,
+       14,   11,    7,    5,    3,  167,  167,  167,  167,  167,
+      167,  167,  167,  167,  167,  167,  167,  167,  167,  167,
+      167,  167,  167,  167,  167,  167,  167,  167,  167,  167,
+      167,  167,  167,  167,  167,  167,  167,  167,  167,  167,
+      167,  167,  167,  167
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -586,36 +580,36 @@
 #define YY_EXTRA_TYPE void *
 #endif
 
-static int yy_init_globals (void );
+static int yy_init_globals ( void );
 
 /* Accessor methods to globals.
    These are made visible to non-reentrant scanners for convenience. */
 
-int yylex_destroy (void );
+int yylex_destroy ( void );
 
-int yyget_debug (void );
+int yyget_debug ( void );
 
-void yyset_debug (int debug_flag  );
+void yyset_debug ( int debug_flag  );
 
-YY_EXTRA_TYPE yyget_extra (void );
+YY_EXTRA_TYPE yyget_extra ( void );
 
-void yyset_extra (YY_EXTRA_TYPE user_defined  );
+void yyset_extra ( YY_EXTRA_TYPE user_defined  );
 
-FILE *yyget_in (void );
+FILE *yyget_in ( void );
 
-void yyset_in  (FILE * _in_str  );
+void yyset_in  ( FILE * _in_str  );
 
-FILE *yyget_out (void );
+FILE *yyget_out ( void );
 
-void yyset_out  (FILE * _out_str  );
+void yyset_out  ( FILE * _out_str  );
 
-			int yyget_leng (void );
+			int yyget_leng ( void );
 
-char *yyget_text (void );
+char *yyget_text ( void );
 
-int yyget_lineno (void );
+int yyget_lineno ( void );
 
-void yyset_lineno (int _line_number  );
+void yyset_lineno ( int _line_number  );
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -623,32 +617,31 @@
 
 #ifndef YY_SKIP_YYWRAP
 #ifdef __cplusplus
-extern "C" int yywrap (void );
+extern "C" int yywrap ( void );
 #else
-extern int yywrap (void );
+extern int yywrap ( void );
 #endif
 #endif
 
 #ifndef YY_NO_UNPUT
     
-    static void yyunput (int c,char *buf_ptr  );
+    static void yyunput ( int c, char *buf_ptr  );
     
 #endif
 
 #ifndef yytext_ptr
-static void yy_flex_strncpy (char *,yyconst char *,int );
+static void yy_flex_strncpy ( char *, const char *, int );
 #endif
 
 #ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * );
+static int yy_flex_strlen ( const char * );
 #endif
 
 #ifndef YY_NO_INPUT
-
 #ifdef __cplusplus
-static int yyinput (void );
+static int yyinput ( void );
 #else
-static int input (void );
+static int input ( void );
 #endif
 
 #endif
@@ -781,10 +774,10 @@
 		if ( ! YY_CURRENT_BUFFER ) {
 			yyensure_buffer_stack ();
 			YY_CURRENT_BUFFER_LVALUE =
-				yy_create_buffer(yyin,YY_BUF_SIZE );
+				yy_create_buffer( yyin, YY_BUF_SIZE );
 		}
 
-		yy_load_buffer_state( );
+		yy_load_buffer_state(  );
 		}
 
 	{
@@ -814,13 +807,13 @@
 			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 160 )
-					yy_c = yy_meta[(unsigned int) yy_c];
+				if ( yy_current_state >= 168 )
+					yy_c = yy_meta[yy_c];
 				}
-			yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
+			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
 			++yy_cp;
 			}
-		while ( yy_base[yy_current_state] != 228 );
+		while ( yy_base[yy_current_state] != 236 );
 
 yy_find_action:
 		yy_act = yy_accept[yy_current_state];
@@ -880,95 +873,95 @@
 	YY_BREAK
 case 9:
 YY_RULE_SETUP
-{yylval.number=3; return(HIDDEN);}
+{yylval.number=3; return(STATUS);}
 	YY_BREAK
 case 10:
 YY_RULE_SETUP
-{yylval.number=PCI; return(BUS);}
+{yylval.number=5; return(STATUS);}
 	YY_BREAK
 case 11:
 YY_RULE_SETUP
-{yylval.number=IOAPIC; return(BUS);}
+{yylval.number=PCI; return(BUS);}
 	YY_BREAK
 case 12:
 YY_RULE_SETUP
-{yylval.number=PNP; return(BUS);}
+{yylval.number=IOAPIC; return(BUS);}
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-{yylval.number=I2C; return(BUS);}
+{yylval.number=PNP; return(BUS);}
 	YY_BREAK
 case 14:
 YY_RULE_SETUP
-{yylval.number=APIC; return(BUS);}
+{yylval.number=I2C; return(BUS);}
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
-{yylval.number=CPU_CLUSTER; return(BUS);}
+{yylval.number=APIC; return(BUS);}
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
-{yylval.number=CPU; return(BUS);}
+{yylval.number=CPU_CLUSTER; return(BUS);}
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-{yylval.number=DOMAIN; return(BUS);}
+{yylval.number=CPU; return(BUS);}
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-{yylval.number=GENERIC; return(BUS);}
+{yylval.number=DOMAIN; return(BUS);}
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
-{yylval.number=MMIO; return(BUS);}
+{yylval.number=GENERIC; return(BUS);}
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
-{yylval.number=SPI; return(BUS);}
+{yylval.number=MMIO; return(BUS);}
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
-{yylval.number=USB; return(BUS);}
+{yylval.number=SPI; return(BUS);}
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
-{yylval.number=IRQ; return(RESOURCE);}
+{yylval.number=USB; return(BUS);}
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
-{yylval.number=DRQ; return(RESOURCE);}
+{yylval.number=IRQ; return(RESOURCE);}
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-{yylval.number=IO; return(RESOURCE);}
+{yylval.number=DRQ; return(RESOURCE);}
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-{return(IOAPIC_IRQ);}
+{yylval.number=IO; return(RESOURCE);}
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-{return(INHERIT);}
+{return(IOAPIC_IRQ);}
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-{return(SUBSYSTEMID);}
+{return(INHERIT);}
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-{return(END);}
+{return(SUBSYSTEMID);}
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
-{return(SLOT_DESC);}
+{return(END);}
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
-{return(EQUALS);}
+{return(SLOT_DESC);}
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
-{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);}
+{return(EQUALS);}
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
@@ -980,12 +973,11 @@
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(PCIINT);}
+{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);}
 	YY_BREAK
 case 35:
-/* rule 35 can match eol */
 YY_RULE_SETUP
-{yylval.string = malloc(yyleng-1); strncpy(yylval.string, yytext+1, yyleng-2); yylval.string[yyleng-2]='\0'; return(STRING);}
+{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(PCIINT);}
 	YY_BREAK
 case 36:
 /* rule 36 can match eol */
@@ -993,10 +985,15 @@
 {yylval.string = malloc(yyleng-1); strncpy(yylval.string, yytext+1, yyleng-2); yylval.string[yyleng-2]='\0'; return(STRING);}
 	YY_BREAK
 case 37:
+/* rule 37 can match eol */
+YY_RULE_SETUP
+{yylval.string = malloc(yyleng-1); strncpy(yylval.string, yytext+1, yyleng-2); yylval.string[yyleng-2]='\0'; return(STRING);}
+	YY_BREAK
+case 38:
 YY_RULE_SETUP
 {yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(STRING);}
 	YY_BREAK
-case 38:
+case 39:
 YY_RULE_SETUP
 ECHO;
 	YY_BREAK
@@ -1077,7 +1074,7 @@
 				{
 				(yy_did_buffer_switch_on_eof) = 0;
 
-				if ( yywrap( ) )
+				if ( yywrap(  ) )
 					{
 					/* Note: because we've taken care in
 					 * yy_get_next_buffer() to have set up
@@ -1144,7 +1141,7 @@
 {
     	char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
 	char *source = (yytext_ptr);
-	yy_size_t number_to_move, i;
+	int number_to_move, i;
 	int ret_val;
 
 	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
@@ -1173,7 +1170,7 @@
 	/* Try to read more data. */
 
 	/* First move last chars to start of buffer. */
-	number_to_move = (yy_size_t) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+	number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1);
 
 	for ( i = 0; i < number_to_move; ++i )
 		*(dest++) = *(source++);
@@ -1209,7 +1206,8 @@
 
 				b->yy_ch_buf = (char *)
 					/* Include room in for 2 EOB chars. */
-					yyrealloc((void *) b->yy_ch_buf,(yy_size_t) (b->yy_buf_size + 2)  );
+					yyrealloc( (void *) b->yy_ch_buf,
+							 (yy_size_t) (b->yy_buf_size + 2)  );
 				}
 			else
 				/* Can't grow it, we don't own it. */
@@ -1241,7 +1239,7 @@
 		if ( number_to_move == YY_MORE_ADJ )
 			{
 			ret_val = EOB_ACT_END_OF_FILE;
-			yyrestart(yyin  );
+			yyrestart( yyin  );
 			}
 
 		else
@@ -1255,12 +1253,15 @@
 	else
 		ret_val = EOB_ACT_CONTINUE_SCAN;
 
-	if ((int) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+	if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
 		/* Extend the array by 50%, plus the number we really need. */
 		int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
-		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,(yy_size_t) new_size  );
+		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
+			(void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size  );
 		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
 			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+		/* "- 2" to take care of EOB's */
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
 	}
 
 	(yy_n_chars) += number_to_move;
@@ -1292,10 +1293,10 @@
 		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 160 )
-				yy_c = yy_meta[(unsigned int) yy_c];
+			if ( yy_current_state >= 168 )
+				yy_c = yy_meta[yy_c];
 			}
-		yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
+		yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
 		}
 
 	return yy_current_state;
@@ -1320,11 +1321,11 @@
 	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 160 )
-			yy_c = yy_meta[(unsigned int) yy_c];
+		if ( yy_current_state >= 168 )
+			yy_c = yy_meta[yy_c];
 		}
-	yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
-	yy_is_jam = (yy_current_state == 159);
+	yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+	yy_is_jam = (yy_current_state == 167);
 
 		return yy_is_jam ? 0 : yy_current_state;
 }
@@ -1394,7 +1395,7 @@
 
 		else
 			{ /* need more input */
-			int offset = (yy_c_buf_p) - (yytext_ptr);
+			int offset = (int) ((yy_c_buf_p) - (yytext_ptr));
 			++(yy_c_buf_p);
 
 			switch ( yy_get_next_buffer(  ) )
@@ -1411,13 +1412,13 @@
 					 */
 
 					/* Reset buffer status. */
-					yyrestart(yyin );
+					yyrestart( yyin );
 
 					/*FALLTHROUGH*/
 
 				case EOB_ACT_END_OF_FILE:
 					{
-					if ( yywrap( ) )
+					if ( yywrap(  ) )
 						return 0;
 
 					if ( ! (yy_did_buffer_switch_on_eof) )
@@ -1455,11 +1456,11 @@
 	if ( ! YY_CURRENT_BUFFER ){
         yyensure_buffer_stack ();
 		YY_CURRENT_BUFFER_LVALUE =
-            yy_create_buffer(yyin,YY_BUF_SIZE );
+            yy_create_buffer( yyin, YY_BUF_SIZE );
 	}
 
-	yy_init_buffer(YY_CURRENT_BUFFER,input_file );
-	yy_load_buffer_state( );
+	yy_init_buffer( YY_CURRENT_BUFFER, input_file );
+	yy_load_buffer_state(  );
 }
 
 /** Switch to a different input buffer.
@@ -1487,7 +1488,7 @@
 		}
 
 	YY_CURRENT_BUFFER_LVALUE = new_buffer;
-	yy_load_buffer_state( );
+	yy_load_buffer_state(  );
 
 	/* We don't actually know whether we did this switch during
 	 * EOF (yywrap()) processing, but the only time this flag
@@ -1515,7 +1516,7 @@
 {
 	YY_BUFFER_STATE b;
     
-	b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state )  );
+	b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state )  );
 	if ( ! b )
 		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
 
@@ -1524,13 +1525,13 @@
 	/* yy_ch_buf has to be 2 characters longer than the size given because
 	 * we need to put in 2 end-of-buffer characters.
 	 */
-	b->yy_ch_buf = (char *) yyalloc((yy_size_t) (b->yy_buf_size + 2)  );
+	b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2)  );
 	if ( ! b->yy_ch_buf )
 		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
 
 	b->yy_is_our_buffer = 1;
 
-	yy_init_buffer(b,file );
+	yy_init_buffer( b, file );
 
 	return b;
 }
@@ -1549,9 +1550,9 @@
 		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
 
 	if ( b->yy_is_our_buffer )
-		yyfree((void *) b->yy_ch_buf  );
+		yyfree( (void *) b->yy_ch_buf  );
 
-	yyfree((void *) b  );
+	yyfree( (void *) b  );
 }
 
 /* Initializes or reinitializes a buffer.
@@ -1563,7 +1564,7 @@
 {
 	int oerrno = errno;
     
-	yy_flush_buffer(b );
+	yy_flush_buffer( b );
 
 	b->yy_input_file = file;
 	b->yy_fill_buffer = 1;
@@ -1606,7 +1607,7 @@
 	b->yy_buffer_status = YY_BUFFER_NEW;
 
 	if ( b == YY_CURRENT_BUFFER )
-		yy_load_buffer_state( );
+		yy_load_buffer_state(  );
 }
 
 /** Pushes the new state onto the stack. The new state becomes
@@ -1637,7 +1638,7 @@
 	YY_CURRENT_BUFFER_LVALUE = new_buffer;
 
 	/* copied from yy_switch_to_buffer. */
-	yy_load_buffer_state( );
+	yy_load_buffer_state(  );
 	(yy_did_buffer_switch_on_eof) = 1;
 }
 
@@ -1656,7 +1657,7 @@
 		--(yy_buffer_stack_top);
 
 	if (YY_CURRENT_BUFFER) {
-		yy_load_buffer_state( );
+		yy_load_buffer_state(  );
 		(yy_did_buffer_switch_on_eof) = 1;
 	}
 }
@@ -1666,7 +1667,7 @@
  */
 static void yyensure_buffer_stack (void)
 {
-	int num_to_alloc;
+	yy_size_t num_to_alloc;
     
 	if (!(yy_buffer_stack)) {
 
@@ -1723,7 +1724,7 @@
 		/* They forgot to leave room for the EOB's. */
 		return NULL;
 
-	b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state )  );
+	b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state )  );
 	if ( ! b )
 		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
 
@@ -1737,7 +1738,7 @@
 	b->yy_fill_buffer = 0;
 	b->yy_buffer_status = YY_BUFFER_NEW;
 
-	yy_switch_to_buffer(b  );
+	yy_switch_to_buffer( b  );
 
 	return b;
 }
@@ -1750,10 +1751,10 @@
  * @note If you want to scan bytes that may contain NUL values, then use
  *       yy_scan_bytes() instead.
  */
-YY_BUFFER_STATE yy_scan_string (yyconst char * yystr )
+YY_BUFFER_STATE yy_scan_string (const char * yystr )
 {
     
-	return yy_scan_bytes(yystr,(int) strlen(yystr) );
+	return yy_scan_bytes( yystr, (int) strlen(yystr) );
 }
 
 /** Setup the input buffer state to scan the given bytes. The next call to yylex() will
@@ -1763,7 +1764,7 @@
  * 
  * @return the newly allocated buffer state object.
  */
-YY_BUFFER_STATE yy_scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
+YY_BUFFER_STATE yy_scan_bytes  (const char * yybytes, int  _yybytes_len )
 {
 	YY_BUFFER_STATE b;
 	char *buf;
@@ -1772,7 +1773,7 @@
     
 	/* Get memory for full buffer, including space for trailing EOB's. */
 	n = (yy_size_t) (_yybytes_len + 2);
-	buf = (char *) yyalloc(n  );
+	buf = (char *) yyalloc( n  );
 	if ( ! buf )
 		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
 
@@ -1781,7 +1782,7 @@
 
 	buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
 
-	b = yy_scan_buffer(buf,n );
+	b = yy_scan_buffer( buf, n );
 	if ( ! b )
 		YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
 
@@ -1797,9 +1798,9 @@
 #define YY_EXIT_FAILURE 2
 #endif
 
-static void yynoreturn yy_fatal_error (yyconst char* msg )
+static void yynoreturn yy_fatal_error (const char* msg )
 {
-			(void) fprintf( stderr, "%s\n", msg );
+			fprintf( stderr, "%s\n", msg );
 	exit( YY_EXIT_FAILURE );
 }
 
@@ -1810,7 +1811,7 @@
 	do \
 		{ \
 		/* Undo effects of setting up yytext. */ \
-        yy_size_t yyless_macro_arg = (n); \
+        int yyless_macro_arg = (n); \
         YY_LESS_LINENO(yyless_macro_arg);\
 		yytext[yyleng] = (yy_hold_char); \
 		(yy_c_buf_p) = yytext + yyless_macro_arg; \
@@ -1934,7 +1935,7 @@
     
     /* Pop the buffer stack, destroying each element. */
 	while(YY_CURRENT_BUFFER){
-		yy_delete_buffer(YY_CURRENT_BUFFER  );
+		yy_delete_buffer( YY_CURRENT_BUFFER  );
 		YY_CURRENT_BUFFER_LVALUE = NULL;
 		yypop_buffer_state();
 	}
@@ -1955,7 +1956,7 @@
  */
 
 #ifndef yytext_ptr
-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+static void yy_flex_strncpy (char* s1, const char * s2, int n )
 {
 		
 	int i;
@@ -1965,7 +1966,7 @@
 #endif
 
 #ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * s )
+static int yy_flex_strlen (const char * s )
 {
 	int n;
 	for ( n = 0; s[n]; ++n )
diff --git a/util/sconfig/main.c b/util/sconfig/main.c
index 3b60e2a..d784642 100644
--- a/util/sconfig/main.c
+++ b/util/sconfig/main.c
@@ -516,6 +516,7 @@
 
 	new_d->enabled = status & 0x01;
 	new_d->hidden = (status >> 1) & 0x01;
+	new_d->mandatory = (status >> 2) & 0x01;
 	new_d->chip_instance = chip_instance;
 	chip_instance->ref_count++;
 
@@ -810,6 +811,7 @@
 	fprintf(fil, "},\n");
 	fprintf(fil, "\t.enabled = %d,\n", ptr->enabled);
 	fprintf(fil, "\t.hidden = %d,\n", ptr->hidden);
+	fprintf(fil, "\t.mandatory = %d,\n", ptr->mandatory);
 	fprintf(fil, "\t.on_mainboard = 1,\n");
 	if (ptr->subsystem_vendor > 0)
 		fprintf(fil, "\t.subsystem_vendor = 0x%04x,\n",
diff --git a/util/sconfig/sconfig.h b/util/sconfig/sconfig.h
index eea2a14..60842f1 100644
--- a/util/sconfig/sconfig.h
+++ b/util/sconfig/sconfig.h
@@ -104,6 +104,8 @@
 	/* Indicates device status (enabled / hidden or not). */
 	int enabled;
 	int hidden;
+	/* non-zero if the device should be included in all cases */
+	int mandatory;
 
 	/* Subsystem IDs for the device. */
 	int subsystem_vendor;
diff --git a/util/sconfig/sconfig.l b/util/sconfig/sconfig.l
index 87de6e2..14eb965 100755
--- a/util/sconfig/sconfig.l
+++ b/util/sconfig/sconfig.l
@@ -29,7 +29,8 @@
 register		{return(REGISTER);}
 on			{yylval.number=1; return(BOOL);}
 off			{yylval.number=0; return(BOOL);}
-hidden			{yylval.number=3; return(HIDDEN);}
+hidden			{yylval.number=3; return(STATUS);}
+mandatory		{yylval.number=5; return(STATUS);}
 pci			{yylval.number=PCI; return(BUS);}
 ioapic			{yylval.number=IOAPIC; return(BUS);}
 pnp			{yylval.number=PNP; return(BUS);}
diff --git a/util/sconfig/sconfig.tab.c_shipped b/util/sconfig/sconfig.tab.c_shipped
index 8e1e57d..f4335c7 100644
--- a/util/sconfig/sconfig.tab.c_shipped
+++ b/util/sconfig/sconfig.tab.c_shipped
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 3.0.5.  */
+/* A Bison parser, made by GNU Bison 3.0.4.  */
 
 /* Bison implementation for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2015, 2018 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -44,7 +44,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "3.0.5"
+#define YYBISON_VERSION "3.0.4"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -109,8 +109,8 @@
 
 /* In a future release of Bison, this section will be replaced
    by #include "sconfig.tab.h_shipped".  */
-#ifndef YY_YY_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED
-# define YY_YY_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED
+#ifndef YY_YY_HOME_RMINNICH_PROJECTS_LINUXBOOT_COREBOOTNERF_GITHUBCOREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED
+# define YY_YY_HOME_RMINNICH_PROJECTS_LINUXBOOT_COREBOOTNERF_GITHUBCOREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED
 /* Debug traces.  */
 #ifndef YYDEBUG
 # define YYDEBUG 0
@@ -128,34 +128,35 @@
     DEVICE = 259,
     REGISTER = 260,
     BOOL = 261,
-    HIDDEN = 262,
-    BUS = 263,
-    RESOURCE = 264,
-    END = 265,
-    EQUALS = 266,
-    HEX = 267,
-    STRING = 268,
-    PCI = 269,
-    PNP = 270,
-    I2C = 271,
-    APIC = 272,
-    CPU_CLUSTER = 273,
-    CPU = 274,
-    DOMAIN = 275,
-    IRQ = 276,
-    DRQ = 277,
-    SLOT_DESC = 278,
-    IO = 279,
-    NUMBER = 280,
-    SUBSYSTEMID = 281,
-    INHERIT = 282,
-    IOAPIC_IRQ = 283,
-    IOAPIC = 284,
-    PCIINT = 285,
-    GENERIC = 286,
-    SPI = 287,
-    USB = 288,
-    MMIO = 289
+    STATUS = 262,
+    MANDATORY = 263,
+    BUS = 264,
+    RESOURCE = 265,
+    END = 266,
+    EQUALS = 267,
+    HEX = 268,
+    STRING = 269,
+    PCI = 270,
+    PNP = 271,
+    I2C = 272,
+    APIC = 273,
+    CPU_CLUSTER = 274,
+    CPU = 275,
+    DOMAIN = 276,
+    IRQ = 277,
+    DRQ = 278,
+    SLOT_DESC = 279,
+    IO = 280,
+    NUMBER = 281,
+    SUBSYSTEMID = 282,
+    INHERIT = 283,
+    IOAPIC_IRQ = 284,
+    IOAPIC = 285,
+    PCIINT = 286,
+    GENERIC = 287,
+    SPI = 288,
+    USB = 289,
+    MMIO = 290
   };
 #endif
 
@@ -184,7 +185,7 @@
 
 int yyparse (void);
 
-#endif /* !YY_YY_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED  */
+#endif /* !YY_YY_HOME_RMINNICH_PROJECTS_LINUXBOOT_COREBOOTNERF_GITHUBCOREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED  */
 
 /* Copy the second part of user declarations.  */
 
@@ -430,10 +431,10 @@
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   43
+#define YYLAST   40
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  35
+#define YYNTOKENS  36
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  15
 /* YYNRULES -- Number of rules.  */
@@ -444,7 +445,7 @@
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   289
+#define YYMAXUTOK   290
 
 #define YYTRANSLATE(YYX)                                                \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -481,7 +482,8 @@
        2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
        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
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35
 };
 
 #if YYDEBUG
@@ -500,12 +502,12 @@
 static const char *const yytname[] =
 {
   "$end", "error", "$undefined", "CHIP", "DEVICE", "REGISTER", "BOOL",
-  "HIDDEN", "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", "$accept",
-  "devtree", "$@1", "chipchildren", "devicechildren", "chip", "@2",
-  "device", "@3", "status", "resource", "registers", "subsystemid",
+  "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",
+  "$accept", "devtree", "$@1", "chipchildren", "devicechildren", "chip",
+  "@2", "device", "@3", "status", "resource", "registers", "subsystemid",
   "ioapic_irq", "smbios_slot_desc", YY_NULLPTR
 };
 #endif
@@ -518,7 +520,7 @@
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      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
+     285,   286,   287,   288,   289,   290
 };
 # endif
 
@@ -536,11 +538,11 @@
      STATE-NUM.  */
 static const yytype_int8 yypact[] =
 {
-     -12,    11,     9,   -12,     1,   -12,   -12,   -12,     0,     5,
-       3,   -12,   -12,   -12,   -12,   -10,     6,     2,     8,   -12,
-     -12,   -12,   -12,   -12,    -3,    -1,   -12,    13,     4,     7,
-     -12,   -12,   -12,   -12,   -12,   -12,    16,    15,    10,   -11,
-      12,    17,    -5,    14,   -12,    18,   -12,   -12,   -12
+     -12,     6,     9,   -12,    -1,   -12,   -12,   -12,     0,     5,
+       1,   -12,   -12,   -12,   -12,   -10,     7,     3,     8,   -12,
+     -12,   -12,   -12,   -12,    -3,    -9,   -12,    11,     2,     4,
+     -12,   -12,   -12,   -12,   -12,   -12,    15,    17,    10,   -11,
+      12,    18,    -5,    13,   -12,    19,   -12,   -12,   -12
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -558,7 +560,7 @@
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int8 yypgoto[] =
 {
-     -12,   -12,   -12,   -12,   -12,    -6,   -12,    19,   -12,   -12,
+     -12,   -12,   -12,   -12,   -12,    -6,   -12,    16,   -12,   -12,
      -12,   -12,   -12,   -12,   -12
 };
 
@@ -574,39 +576,39 @@
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_uint8 yytable[] =
 {
-       4,     9,    12,     4,     9,    10,    25,    26,    19,    20,
-      11,     3,     4,    15,     6,    17,    16,    18,    30,    43,
-      27,    22,    46,    28,    36,    29,    37,    40,    41,    38,
-      45,    48,    39,     0,     0,    42,     0,    44,     0,    47,
-       0,     0,     0,    31
+       4,     9,    12,     4,     9,    10,     3,    25,    26,    19,
+      20,    11,     4,     6,    15,    16,    17,    36,    30,    18,
+      43,    27,    22,    46,    28,    37,    29,    40,    38,     0,
+      39,    41,    45,    48,     0,     0,    42,     0,    44,    47,
+      31
 };
 
 static const yytype_int8 yycheck[] =
 {
-       3,     4,     8,     3,     4,     5,     9,    10,     6,     7,
-      10,     0,     3,     8,    13,    25,    13,    11,    24,    30,
-      23,    13,    27,    26,    25,    28,    13,    11,    13,    25,
-      13,    13,    25,    -1,    -1,    25,    -1,    25,    -1,    25,
-      -1,    -1,    -1,    24
+       3,     4,     8,     3,     4,     5,     0,    10,    11,     6,
+       7,    11,     3,    14,     9,    14,    26,    26,    24,    12,
+      31,    24,    14,    28,    27,    14,    29,    12,    26,    -1,
+      26,    14,    14,    14,    -1,    -1,    26,    -1,    26,    26,
+      24
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
      symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
-       0,    36,    37,     0,     3,    40,    13,    41,    38,     4,
-       5,    10,    40,    42,    46,     8,    13,    25,    11,     6,
-       7,    44,    13,    43,    39,     9,    10,    23,    26,    28,
-      40,    42,    45,    47,    48,    49,    25,    13,    25,    25,
-      11,    13,    25,    30,    25,    13,    27,    25,    13
+       0,    37,    38,     0,     3,    41,    14,    42,    39,     4,
+       5,    11,    41,    43,    47,     9,    14,    26,    12,     6,
+       7,    45,    14,    44,    40,    10,    11,    24,    27,    29,
+      41,    43,    46,    48,    49,    50,    26,    14,    26,    26,
+      12,    14,    26,    31,    26,    14,    28,    26,    14
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,    35,    37,    36,    38,    38,    38,    38,    39,    39,
-      39,    39,    39,    39,    39,    41,    40,    43,    42,    44,
-      44,    45,    46,    47,    47,    48,    49,    49,    49
+       0,    36,    38,    37,    39,    39,    39,    39,    40,    40,
+      40,    40,    40,    40,    40,    42,    41,    44,    43,    45,
+      45,    46,    47,    48,    48,    49,    50,    50,    50
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -975,7 +977,6 @@
       case N:                               \
         yyformat = S;                       \
       break
-    default: /* Avoid compiler warnings. */
       YYCASE_(0, YY_("syntax error"));
       YYCASE_(1, YY_("syntax error, unexpected %s"));
       YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
diff --git a/util/sconfig/sconfig.tab.h_shipped b/util/sconfig/sconfig.tab.h_shipped
index bcbd644..272f651 100644
--- a/util/sconfig/sconfig.tab.h_shipped
+++ b/util/sconfig/sconfig.tab.h_shipped
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 3.0.5.  */
+/* A Bison parser, made by GNU Bison 3.0.4.  */
 
 /* Bison interface for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2015, 2018 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -30,8 +30,8 @@
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
-#ifndef YY_YY_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED
-# define YY_YY_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED
+#ifndef YY_YY_HOME_RMINNICH_PROJECTS_LINUXBOOT_COREBOOTNERF_GITHUBCOREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED
+# define YY_YY_HOME_RMINNICH_PROJECTS_LINUXBOOT_COREBOOTNERF_GITHUBCOREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED
 /* Debug traces.  */
 #ifndef YYDEBUG
 # define YYDEBUG 0
@@ -49,34 +49,35 @@
     DEVICE = 259,
     REGISTER = 260,
     BOOL = 261,
-    HIDDEN = 262,
-    BUS = 263,
-    RESOURCE = 264,
-    END = 265,
-    EQUALS = 266,
-    HEX = 267,
-    STRING = 268,
-    PCI = 269,
-    PNP = 270,
-    I2C = 271,
-    APIC = 272,
-    CPU_CLUSTER = 273,
-    CPU = 274,
-    DOMAIN = 275,
-    IRQ = 276,
-    DRQ = 277,
-    SLOT_DESC = 278,
-    IO = 279,
-    NUMBER = 280,
-    SUBSYSTEMID = 281,
-    INHERIT = 282,
-    IOAPIC_IRQ = 283,
-    IOAPIC = 284,
-    PCIINT = 285,
-    GENERIC = 286,
-    SPI = 287,
-    USB = 288,
-    MMIO = 289
+    STATUS = 262,
+    MANDATORY = 263,
+    BUS = 264,
+    RESOURCE = 265,
+    END = 266,
+    EQUALS = 267,
+    HEX = 268,
+    STRING = 269,
+    PCI = 270,
+    PNP = 271,
+    I2C = 272,
+    APIC = 273,
+    CPU_CLUSTER = 274,
+    CPU = 275,
+    DOMAIN = 276,
+    IRQ = 277,
+    DRQ = 278,
+    SLOT_DESC = 279,
+    IO = 280,
+    NUMBER = 281,
+    SUBSYSTEMID = 282,
+    INHERIT = 283,
+    IOAPIC_IRQ = 284,
+    IOAPIC = 285,
+    PCIINT = 286,
+    GENERIC = 287,
+    SPI = 288,
+    USB = 289,
+    MMIO = 290
   };
 #endif
 
@@ -105,4 +106,4 @@
 
 int yyparse (void);
 
-#endif /* !YY_YY_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED  */
+#endif /* !YY_YY_HOME_RMINNICH_PROJECTS_LINUXBOOT_COREBOOTNERF_GITHUBCOREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED  */
diff --git a/util/sconfig/sconfig.y b/util/sconfig/sconfig.y
index 0d894a9..d55b18b 100755
--- a/util/sconfig/sconfig.y
+++ b/util/sconfig/sconfig.y
@@ -31,7 +31,7 @@
 	int number;
 }
 
-%token CHIP DEVICE REGISTER BOOL HIDDEN 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
+%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
 %%
 devtree: { cur_parent = root_parent; } chip;
 
@@ -56,7 +56,7 @@
 	cur_parent = $<dev>5->parent;
 };
 
-status: BOOL | HIDDEN;
+status: BOOL | STATUS ;
 
 resource: RESOURCE NUMBER /* == resnum */ EQUALS NUMBER /* == resval */
 	{ add_resource(cur_parent, $<number>1, strtol($<string>2, NULL, 0), strtol($<string>4, NULL, 0)); } ;