sconfig: Add SMBIOS type 9 entries

Add the new field 'smbios_slot_desc', which takes 2 to 4 arguments.
The field is valid for PCI devices and only compiled if SMBIOS table
generation is enabled.

smbios_slot_desc arguments:
1. slot type
2. slot lenth
3. slot designation (optional)
4. slot data width (optional)

Example:

    device pci 1c.1 on
        smbios_slot_desc "21" "3" "MINI-PCI-FULL" "8"
    end # PCIe Port #2 Integrated Wireless LAN

Tested on Lenovo T520.

Change-Id: If95aae3c322d3da47637613b9a872ba1f7af9080
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/32307
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com>
This commit is contained in:
Patrick Rudolph 2019-04-12 14:42:17 +02:00 committed by Patrick Georgi
parent 1a93058448
commit ac24d3c311
8 changed files with 344 additions and 242 deletions

View File

@ -141,6 +141,12 @@ struct device {
#if !DEVTREE_EARLY
struct chip_operations *chip_ops;
const char *name;
#if CONFIG(GENERATE_SMBIOS_TABLES)
u8 smbios_slot_type;
u8 smbios_slot_data_width;
u8 smbios_slot_length;
const char *smbios_slot_designation;
#endif
#endif
DEVTREE_CONST void *chip_info;
};

View File

@ -168,7 +168,7 @@ extern FILE *yyin, *yyout;
do \
{ \
/* Undo effects of setting up yytext. */ \
int yyless_macro_arg = (n); \
yy_size_t yyless_macro_arg = (n); \
YY_LESS_LINENO(yyless_macro_arg);\
*yy_cp = (yy_hold_char); \
YY_RESTORE_YY_MORE_OFFSET \
@ -358,8 +358,8 @@ static void yynoreturn yy_fatal_error (yyconst char* msg );
*yy_cp = '\0'; \
(yy_c_buf_p) = yy_cp;
#define YY_NUM_RULES 37
#define YY_END_OF_BUFFER 38
#define YY_NUM_RULES 38
#define YY_END_OF_BUFFER 39
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
@ -367,24 +367,25 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
static yyconst flex_int16_t yy_accept[145] =
static yyconst flex_int16_t yy_accept[160] =
{ 0,
0, 0, 38, 36, 1, 3, 36, 36, 36, 31,
31, 29, 32, 36, 32, 32, 32, 36, 36, 36,
36, 36, 36, 36, 36, 36, 36, 36, 1, 3,
36, 0, 36, 36, 0, 2, 31, 32, 36, 36,
36, 36, 32, 36, 36, 36, 36, 36, 36, 36,
24, 36, 36, 36, 36, 7, 36, 36, 36, 36,
36, 36, 35, 35, 36, 0, 30, 36, 36, 16,
36, 36, 23, 28, 36, 36, 13, 36, 36, 22,
36, 36, 8, 10, 12, 36, 20, 36, 21, 36,
0, 33, 4, 36, 36, 36, 36, 36, 36, 36,
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,
36, 19, 36, 36, 34, 34, 36, 36, 36, 36,
36, 36, 36, 14, 36, 36, 36, 5, 17, 36,
9, 36, 11, 36, 36, 36, 18, 26, 36, 36,
36, 36, 36, 6, 36, 36, 36, 36, 36, 25,
36, 15, 27, 0
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
} ;
static yyconst YY_CHAR yy_ec[256] =
@ -427,110 +428,114 @@ static yyconst YY_CHAR yy_meta[39] =
1, 1, 1, 1, 1, 1, 1, 1
} ;
static yyconst flex_uint16_t yy_base[152] =
static yyconst flex_uint16_t yy_base[167] =
{ 0,
0, 0, 212, 0, 209, 213, 207, 37, 41, 38,
172, 0, 44, 194, 54, 78, 60, 186, 181, 45,
188, 177, 42, 47, 182, 41, 169, 0, 199, 213,
77, 195, 87, 91, 196, 213, 0, 88, 104, 183,
172, 161, 93, 168, 163, 173, 164, 171, 171, 165,
171, 156, 156, 160, 162, 0, 158, 152, 158, 155,
161, 160, 0, 213, 101, 172, 0, 165, 145, 158,
148, 155, 0, 0, 150, 150, 0, 148, 138, 0,
142, 137, 0, 0, 0, 140, 0, 131, 0, 158,
157, 0, 0, 142, 141, 134, 126, 136, 124, 130,
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,
135, 0, 120, 114, 0, 213, 125, 129, 121, 123,
119, 121, 126, 0, 110, 110, 107, 0, 0, 109,
0, 93, 104, 98, 84, 84, 0, 0, 89, 77,
87, 71, 66, 0, 64, 62, 50, 47, 33, 0,
28, 0, 0, 213, 40, 129, 131, 133, 135, 137,
139
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
} ;
static yyconst flex_int16_t yy_def[152] =
static yyconst flex_int16_t yy_def[167] =
{ 0,
144, 1, 144, 145, 144, 144, 145, 146, 147, 145,
10, 145, 10, 145, 10, 10, 10, 145, 145, 145,
145, 145, 145, 145, 145, 145, 145, 145, 144, 144,
146, 148, 149, 147, 150, 144, 10, 10, 10, 145,
145, 145, 10, 145, 145, 145, 145, 145, 145, 145,
145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
145, 145, 145, 144, 149, 151, 39, 145, 145, 145,
145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
144, 145, 145, 145, 145, 145, 145, 145, 145, 145,
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,
145, 145, 145, 145, 145, 144, 145, 145, 145, 145,
145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
145, 145, 145, 0, 144, 144, 144, 144, 144, 144,
144
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
} ;
static yyconst flex_uint16_t yy_nxt[252] =
static yyconst flex_uint16_t yy_nxt[267] =
{ 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, 143, 38, 38,
28, 33, 35, 36, 37, 37, 37, 158, 38, 38,
38, 38, 38, 49, 38, 38, 38, 38, 38, 38,
38, 38, 38, 55, 142, 57, 38, 38, 38, 56,
60, 141, 50, 51, 58, 61, 52, 41, 32, 32,
140, 63, 139, 42, 38, 38, 38, 46, 66, 66,
138, 28, 35, 36, 38, 38, 38, 137, 43, 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, 66, 66, 136, 90, 44, 135, 134, 45,
67, 67, 67, 133, 67, 67, 132, 131, 130, 129,
67, 67, 67, 67, 67, 67, 128, 127, 71, 31,
31, 34, 34, 32, 32, 65, 65, 35, 35, 66,
66, 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, 92, 91, 89, 88, 87,
86, 85, 84, 83, 82, 81, 80, 79, 78, 77,
76, 75, 74, 73, 72, 70, 69, 68, 36, 64,
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,
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,
29, 62, 59, 54, 53, 48, 47, 40, 39, 30,
29, 144, 3, 144, 144, 144, 144, 144, 144, 144,
144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
144
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
} ;
static yyconst flex_int16_t yy_chk[252] =
static yyconst flex_int16_t yy_chk[267] =
{ 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,
145, 8, 9, 9, 10, 10, 10, 141, 10, 10,
160, 8, 9, 9, 10, 10, 10, 157, 10, 10,
13, 13, 13, 20, 10, 10, 10, 10, 10, 10,
15, 15, 15, 23, 139, 24, 17, 17, 17, 23,
26, 138, 20, 20, 24, 26, 20, 15, 31, 31,
137, 31, 136, 15, 16, 16, 16, 17, 33, 33,
135, 33, 34, 34, 38, 38, 38, 133, 16, 43,
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,
43, 43, 65, 65, 132, 65, 16, 131, 130, 16,
39, 39, 39, 129, 39, 39, 126, 125, 124, 123,
39, 39, 39, 39, 39, 39, 122, 120, 43, 146,
146, 147, 147, 148, 148, 149, 149, 150, 150, 151,
151, 117, 116, 115, 113, 112, 111, 110, 109, 108,
107, 104, 103, 101, 100, 99, 98, 97, 96, 95,
94, 91, 90, 88, 86, 82, 81, 79, 78, 76,
75, 72, 71, 70, 69, 68, 66, 62, 61, 60,
59, 58, 57, 55, 54, 53, 52, 51, 50, 49,
48, 47, 46, 45, 44, 42, 41, 40, 35, 32,
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,
29, 27, 25, 22, 21, 19, 18, 14, 11, 7,
5, 3, 144, 144, 144, 144, 144, 144, 144, 144,
144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
144, 144, 144, 144, 144, 144, 144, 144, 144, 144,
144
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
} ;
static yy_state_type yy_last_accepting_state;
@ -674,7 +679,7 @@ static int input (void );
if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
{ \
int c = '*'; \
size_t n; \
int n; \
for ( n = 0; n < max_size && \
(c = getc( yyin )) != EOF && c != '\n'; ++n ) \
buf[n] = (char) c; \
@ -687,7 +692,7 @@ static int input (void );
else \
{ \
errno=0; \
while ( (result = (int) fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
{ \
if( errno != EINTR) \
{ \
@ -809,13 +814,13 @@ yy_match:
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 >= 145 )
if ( yy_current_state >= 160 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
++yy_cp;
}
while ( yy_base[yy_current_state] != 213 );
while ( yy_base[yy_current_state] != 228 );
yy_find_action:
yy_act = yy_accept[yy_current_state];
@ -955,11 +960,11 @@ YY_RULE_SETUP
YY_BREAK
case 29:
YY_RULE_SETUP
{return(EQUALS);}
{return(SLOT_DESC);}
YY_BREAK
case 30:
YY_RULE_SETUP
{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);}
{return(EQUALS);}
YY_BREAK
case 31:
YY_RULE_SETUP
@ -971,12 +976,11 @@ YY_RULE_SETUP
YY_BREAK
case 33:
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 34:
/* rule 34 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 35:
/* rule 35 can match eol */
@ -984,10 +988,15 @@ 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 36:
/* rule 36 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 37:
YY_RULE_SETUP
{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(STRING);}
YY_BREAK
case 37:
case 38:
YY_RULE_SETUP
ECHO;
YY_BREAK
@ -1135,7 +1144,7 @@ static int yy_get_next_buffer (void)
{
char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
char *source = (yytext_ptr);
int number_to_move, i;
yy_size_t number_to_move, i;
int ret_val;
if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
@ -1164,7 +1173,7 @@ static int yy_get_next_buffer (void)
/* Try to read more data. */
/* First move last chars to start of buffer. */
number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1);
number_to_move = (yy_size_t) ((yy_c_buf_p) - (yytext_ptr)) - 1;
for ( i = 0; i < number_to_move; ++i )
*(dest++) = *(source++);
@ -1200,7 +1209,7 @@ static int yy_get_next_buffer (void)
b->yy_ch_buf = (char *)
/* Include room in for 2 EOB chars. */
yyrealloc((void *) b->yy_ch_buf,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. */
@ -1246,10 +1255,10 @@ static int yy_get_next_buffer (void)
else
ret_val = EOB_ACT_CONTINUE_SCAN;
if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
if ((int) ((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,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()" );
}
@ -1283,7 +1292,7 @@ static int yy_get_next_buffer (void)
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 >= 145 )
if ( yy_current_state >= 160 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
@ -1311,11 +1320,11 @@ static int yy_get_next_buffer (void)
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 >= 145 )
if ( yy_current_state >= 160 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
yy_is_jam = (yy_current_state == 144);
yy_is_jam = (yy_current_state == 159);
return yy_is_jam ? 0 : yy_current_state;
}
@ -1510,12 +1519,12 @@ static void yy_load_buffer_state (void)
if ( ! b )
YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
b->yy_buf_size = (yy_size_t)size;
b->yy_buf_size = size;
/* 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(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()" );
@ -1718,7 +1727,7 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
if ( ! b )
YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */
b->yy_buf_pos = b->yy_ch_buf = base;
b->yy_is_our_buffer = 0;
b->yy_input_file = NULL;
@ -1801,7 +1810,7 @@ static void yynoreturn yy_fatal_error (yyconst char* msg )
do \
{ \
/* Undo effects of setting up yytext. */ \
int yyless_macro_arg = (n); \
yy_size_t yyless_macro_arg = (n); \
YY_LESS_LINENO(yyless_macro_arg);\
yytext[yyleng] = (yy_hold_char); \
(yy_c_buf_p) = yytext + yyless_macro_arg; \

View File

@ -622,6 +622,22 @@ void add_register(struct chip_instance *chip_instance, char *name, char *val)
}
}
void add_slot_desc(struct bus *bus, char *type, char *length, char *designation,
char *data_width)
{
struct device *dev = bus->dev;
if (dev->bustype != PCI && dev->bustype != DOMAIN) {
printf("ERROR: 'slot_type' only allowed for PCI devices\n");
exit(1);
}
dev->smbios_slot_type = type;
dev->smbios_slot_length = length;
dev->smbios_slot_data_width = data_width;
dev->smbios_slot_designation = designation;
}
void add_pci_subsystem_ids(struct bus *bus, int vendor, int device,
int inherit)
{
@ -831,7 +847,30 @@ static void pass1(FILE *fil, struct device *ptr, struct device *next)
fprintf(fil, "\t.chip_info = &%s_info_%d,\n",
chip_ins->chip->name_underscore, chip_ins->id);
if (next)
fprintf(fil, "\t.next=&%s\n", next->name);
fprintf(fil, "\t.next=&%s,\n", next->name);
if (ptr->smbios_slot_type || ptr->smbios_slot_data_width ||
ptr->smbios_slot_designation || ptr->smbios_slot_length) {
fprintf(fil, "#if !DEVTREE_EARLY\n");
fprintf(fil, "#if CONFIG(GENERATE_SMBIOS_TABLES)\n");
}
/* SMBIOS types start at 1, if zero it hasn't been set */
if (ptr->smbios_slot_type)
fprintf(fil, "\t.smbios_slot_type = %s,\n",
ptr->smbios_slot_type);
if (ptr->smbios_slot_data_width)
fprintf(fil, "\t.smbios_slot_data_width = %s,\n",
ptr->smbios_slot_data_width);
if (ptr->smbios_slot_designation)
fprintf(fil, "\t.smbios_slot_designation = \"%s\",\n",
ptr->smbios_slot_designation);
if (ptr->smbios_slot_length)
fprintf(fil, "\t.smbios_slot_length = %s,\n",
ptr->smbios_slot_length);
if (ptr->smbios_slot_type || ptr->smbios_slot_data_width ||
ptr->smbios_slot_designation || ptr->smbios_slot_length) {
fprintf(fil, "#endif\n");
fprintf(fil, "#endif\n");
}
fprintf(fil, "};\n");
emit_resources(fil, ptr);

View File

@ -141,6 +141,18 @@ struct device {
struct bus *bus;
/* Pointer to last bus under this device. */
struct bus *last_bus;
/* SMBIOS slot type */
char *smbios_slot_type;
/* SMBIOS slot data width */
char *smbios_slot_data_width;
/* SMBIOS slot description for reference designation */
char *smbios_slot_designation;
/* SMBIOS slot length */
char *smbios_slot_length;
};
extern struct bus *root_parent;
@ -158,6 +170,9 @@ void add_pci_subsystem_ids(struct bus *bus, int vendor, int device,
void add_ioapic_info(struct bus *bus, int apicid, const char *_srcpin,
int irqpin);
void add_slot_desc(struct bus *bus, char *type, char *length, char *designation,
char *data_width);
void yyrestart(FILE *input_file);
/* Add chip data to tail of queue. */

View File

@ -21,40 +21,41 @@ int linenum = 0;
%}
%option nodebug
%%
[ \t]+ {}
#.*\n {linenum++;}
\r?\n {linenum++;}
chip {return(CHIP);}
device {return(DEVICE);}
register {return(REGISTER);}
on {yylval.number=1; return(BOOL);}
off {yylval.number=0; return(BOOL);}
hidden {yylval.number=3; return(HIDDEN);}
pci {yylval.number=PCI; return(BUS);}
ioapic {yylval.number=IOAPIC; return(BUS);}
pnp {yylval.number=PNP; return(BUS);}
i2c {yylval.number=I2C; return(BUS);}
lapic {yylval.number=APIC; return(BUS);}
cpu_cluster {yylval.number=CPU_CLUSTER; return(BUS);}
cpu {yylval.number=CPU; return(BUS);}
domain {yylval.number=DOMAIN; return(BUS);}
generic {yylval.number=GENERIC; return(BUS);}
mmio {yylval.number=MMIO; return(BUS);}
spi {yylval.number=SPI; return(BUS);}
usb {yylval.number=USB; return(BUS);}
irq {yylval.number=IRQ; return(RESOURCE);}
drq {yylval.number=DRQ; return(RESOURCE);}
io {yylval.number=IO; return(RESOURCE);}
ioapic_irq {return(IOAPIC_IRQ);}
inherit {return(INHERIT);}
subsystemid {return(SUBSYSTEMID);}
end {return(END);}
= {return(EQUALS);}
0x[0-9a-fA-F.]+ {yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);}
[0-9.]+ {yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);}
[0-9a-fA-F.]+ {yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);}
INT[A-D] {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+1, yyleng-2); yylval.string[yyleng-2]='\0'; return(STRING);}
\"[^\"]+\" {yylval.string = malloc(yyleng-1); strncpy(yylval.string, yytext+1, yyleng-2); yylval.string[yyleng-2]='\0'; return(STRING);}
[^ \n\t]+ {yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(STRING);}
[ \t]+ {}
#.*\n {linenum++;}
\r?\n {linenum++;}
chip {return(CHIP);}
device {return(DEVICE);}
register {return(REGISTER);}
on {yylval.number=1; return(BOOL);}
off {yylval.number=0; return(BOOL);}
hidden {yylval.number=3; return(HIDDEN);}
pci {yylval.number=PCI; return(BUS);}
ioapic {yylval.number=IOAPIC; return(BUS);}
pnp {yylval.number=PNP; return(BUS);}
i2c {yylval.number=I2C; return(BUS);}
lapic {yylval.number=APIC; return(BUS);}
cpu_cluster {yylval.number=CPU_CLUSTER; return(BUS);}
cpu {yylval.number=CPU; return(BUS);}
domain {yylval.number=DOMAIN; return(BUS);}
generic {yylval.number=GENERIC; return(BUS);}
mmio {yylval.number=MMIO; return(BUS);}
spi {yylval.number=SPI; return(BUS);}
usb {yylval.number=USB; return(BUS);}
irq {yylval.number=IRQ; return(RESOURCE);}
drq {yylval.number=DRQ; return(RESOURCE);}
io {yylval.number=IO; return(RESOURCE);}
ioapic_irq {return(IOAPIC_IRQ);}
inherit {return(INHERIT);}
subsystemid {return(SUBSYSTEMID);}
end {return(END);}
smbios_slot_desc {return(SLOT_DESC);}
= {return(EQUALS);}
0x[0-9a-fA-F.]+ {yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);}
[0-9.]+ {yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);}
[0-9a-fA-F.]+ {yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);}
INT[A-D] {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+1, yyleng-2); yylval.string[yyleng-2]='\0'; return(STRING);}
\"[^\"]+\" {yylval.string = malloc(yyleng-1); strncpy(yylval.string, yytext+1, yyleng-2); yylval.string[yyleng-2]='\0'; return(STRING);}
[^ \n\t]+ {yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(STRING);}
%%

View File

@ -1,8 +1,8 @@
/* A Bison parser, made by GNU Bison 3.0.4. */
/* A Bison parser, made by GNU Bison 3.0.5. */
/* Bison implementation for Yacc-like parsers in C
Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
Copyright (C) 1984, 1989-1990, 2000-2015, 2018 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.4"
#define YYBISON_VERSION "3.0.5"
/* Skeleton name. */
#define YYSKELETON_NAME "yacc.c"
@ -144,17 +144,18 @@ extern int yydebug;
DOMAIN = 275,
IRQ = 276,
DRQ = 277,
IO = 278,
NUMBER = 279,
SUBSYSTEMID = 280,
INHERIT = 281,
IOAPIC_IRQ = 282,
IOAPIC = 283,
PCIINT = 284,
GENERIC = 285,
SPI = 286,
USB = 287,
MMIO = 288
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
};
#endif
@ -429,21 +430,21 @@ union yyalloc
/* YYFINAL -- State number of the termination state. */
#define YYFINAL 3
/* YYLAST -- Last index in YYTABLE. */
#define YYLAST 40
#define YYLAST 43
/* YYNTOKENS -- Number of terminals. */
#define YYNTOKENS 34
#define YYNTOKENS 35
/* YYNNTS -- Number of nonterminals. */
#define YYNNTS 14
#define YYNNTS 15
/* YYNRULES -- Number of rules. */
#define YYNRULES 24
#define YYNRULES 28
/* YYNSTATES -- Number of states. */
#define YYNSTATES 43
#define YYNSTATES 49
/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
by yylex, with out-of-bounds checking. */
#define YYUNDEFTOK 2
#define YYMAXUTOK 288
#define YYMAXUTOK 289
#define YYTRANSLATE(YYX) \
((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@ -480,7 +481,7 @@ static const yytype_uint8 yytranslate[] =
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
25, 26, 27, 28, 29, 30, 31, 32, 33, 34
};
#if YYDEBUG
@ -488,8 +489,8 @@ static const yytype_uint8 yytranslate[] =
static const yytype_uint8 yyrline[] =
{
0, 36, 36, 36, 38, 38, 38, 38, 40, 40,
40, 40, 40, 40, 42, 42, 51, 51, 59, 59,
61, 64, 67, 70, 73
40, 40, 40, 40, 40, 42, 42, 51, 51, 59,
59, 61, 64, 67, 70, 73, 76, 79, 82
};
#endif
@ -500,11 +501,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", "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", YY_NULLPTR
"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
@ -516,14 +518,14 @@ static const yytype_uint16 yytoknum[] =
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
285, 286, 287, 288, 289
};
# endif
#define YYPACT_NINF -10
#define YYPACT_NINF -12
#define yypact_value_is_default(Yystate) \
(!!((Yystate) == (-10)))
(!!((Yystate) == (-12)))
#define YYTABLE_NINF -1
@ -534,11 +536,11 @@ static const yytype_uint16 yytoknum[] =
STATE-NUM. */
static const yytype_int8 yypact[] =
{
-10, 11, 9, -10, 1, -10, -10, -10, 0, 5,
3, -10, -10, -10, -10, -9, 6, 2, 7, -10,
-10, -10, -10, -10, -3, -5, -10, -1, 4, -10,
-10, -10, -10, -10, 10, 8, -4, 12, 13, 14,
-10, -10, -10
-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
};
/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@ -546,25 +548,25 @@ static const yytype_int8 yypact[] =
means the default is an error. */
static const yytype_uint8 yydefact[] =
{
2, 0, 0, 1, 0, 3, 14, 7, 0, 0,
0, 15, 5, 4, 6, 0, 0, 0, 0, 18,
19, 16, 21, 13, 0, 0, 17, 0, 0, 9,
8, 10, 11, 12, 0, 0, 0, 0, 22, 0,
20, 23, 24
2, 0, 0, 1, 0, 3, 15, 7, 0, 0,
0, 16, 5, 4, 6, 0, 0, 0, 0, 19,
20, 17, 22, 14, 0, 0, 18, 0, 0, 0,
9, 8, 10, 11, 12, 13, 0, 0, 0, 0,
0, 28, 23, 0, 21, 27, 24, 25, 26
};
/* YYPGOTO[NTERM-NUM]. */
static const yytype_int8 yypgoto[] =
{
-10, -10, -10, -10, -10, -6, -10, 16, -10, -10,
-10, -10, -10, -10
-12, -12, -12, -12, -12, -6, -12, 19, -12, -12,
-12, -12, -12, -12, -12
};
/* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int8 yydefgoto[] =
{
-1, 1, 2, 8, 24, 5, 7, 13, 23, 21,
31, 14, 32, 33
32, 14, 33, 34, 35
};
/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
@ -573,46 +575,46 @@ static const yytype_int8 yydefgoto[] =
static const yytype_uint8 yytable[] =
{
4, 9, 12, 4, 9, 10, 25, 26, 19, 20,
11, 3, 4, 15, 6, 17, 16, 18, 29, 34,
22, 37, 27, 35, 28, 39, 0, 0, 36, 0,
0, 0, 38, 0, 0, 0, 40, 0, 42, 41,
30
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
};
static const yytype_int8 yycheck[] =
{
3, 4, 8, 3, 4, 5, 9, 10, 6, 7,
10, 0, 3, 8, 13, 24, 13, 11, 24, 24,
13, 11, 25, 24, 27, 29, -1, -1, 24, -1,
-1, -1, 24, -1, -1, -1, 24, -1, 24, 26,
24
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
};
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM. */
static const yytype_uint8 yystos[] =
{
0, 35, 36, 0, 3, 39, 13, 40, 37, 4,
5, 10, 39, 41, 45, 8, 13, 24, 11, 6,
7, 43, 13, 42, 38, 9, 10, 25, 27, 39,
41, 44, 46, 47, 24, 24, 24, 11, 24, 29,
24, 26, 24
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
};
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
static const yytype_uint8 yyr1[] =
{
0, 34, 36, 35, 37, 37, 37, 37, 38, 38,
38, 38, 38, 38, 40, 39, 42, 41, 43, 43,
44, 45, 46, 46, 47
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
};
/* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
static const yytype_uint8 yyr2[] =
{
0, 2, 0, 2, 2, 2, 2, 0, 2, 2,
2, 2, 2, 0, 0, 5, 0, 7, 1, 1,
4, 4, 3, 4, 4
2, 2, 2, 2, 0, 0, 5, 0, 7, 1,
1, 4, 4, 3, 4, 4, 5, 4, 3
};
@ -973,6 +975,7 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
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"));
@ -1294,7 +1297,7 @@ yyreduce:
break;
case 14:
case 15:
{
(yyval.chip_instance) = new_chip_instance((yyvsp[0].string));
@ -1304,7 +1307,7 @@ yyreduce:
break;
case 15:
case 16:
{
cur_chip_instance = chip_dequeue_tail();
@ -1312,7 +1315,7 @@ yyreduce:
break;
case 16:
case 17:
{
(yyval.dev) = new_device(cur_parent, cur_chip_instance, (yyvsp[-2].number), (yyvsp[-1].string), (yyvsp[0].number));
@ -1321,7 +1324,7 @@ yyreduce:
break;
case 17:
case 18:
{
cur_parent = (yyvsp[-2].dev)->parent;
@ -1329,36 +1332,54 @@ yyreduce:
break;
case 20:
case 21:
{ add_resource(cur_parent, (yyvsp[-3].number), strtol((yyvsp[-2].string), NULL, 0), strtol((yyvsp[0].string), NULL, 0)); }
break;
case 21:
case 22:
{ add_register(cur_chip_instance, (yyvsp[-2].string), (yyvsp[0].string)); }
break;
case 22:
case 23:
{ add_pci_subsystem_ids(cur_parent, strtol((yyvsp[-1].string), NULL, 16), strtol((yyvsp[0].string), NULL, 16), 0); }
break;
case 23:
case 24:
{ add_pci_subsystem_ids(cur_parent, strtol((yyvsp[-2].string), NULL, 16), strtol((yyvsp[-1].string), NULL, 16), 1); }
break;
case 24:
case 25:
{ add_ioapic_info(cur_parent, strtol((yyvsp[-2].string), NULL, 16), (yyvsp[-1].string), strtol((yyvsp[0].string), NULL, 16)); }
break;
case 26:
{ add_slot_desc(cur_parent, (yyvsp[-3].string), (yyvsp[-2].string), (yyvsp[-1].string), (yyvsp[0].string)); }
break;
case 27:
{ add_slot_desc(cur_parent, (yyvsp[-2].string), (yyvsp[-1].string), (yyvsp[0].string), NULL); }
break;
case 28:
{ add_slot_desc(cur_parent, (yyvsp[-1].string), (yyvsp[0].string), NULL, NULL); }
break;
default: break;

View File

@ -1,8 +1,8 @@
/* A Bison parser, made by GNU Bison 3.0.4. */
/* A Bison parser, made by GNU Bison 3.0.5. */
/* Bison interface for Yacc-like parsers in C
Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
Copyright (C) 1984, 1989-1990, 2000-2015, 2018 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
@ -65,17 +65,18 @@ extern int yydebug;
DOMAIN = 275,
IRQ = 276,
DRQ = 277,
IO = 278,
NUMBER = 279,
SUBSYSTEMID = 280,
INHERIT = 281,
IOAPIC_IRQ = 282,
IOAPIC = 283,
PCIINT = 284,
GENERIC = 285,
SPI = 286,
USB = 287,
MMIO = 288
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
};
#endif

View File

@ -31,13 +31,13 @@ static struct chip_instance *cur_chip_instance;
int number;
}
%token CHIP DEVICE REGISTER BOOL HIDDEN BUS RESOURCE END EQUALS HEX STRING PCI PNP I2C APIC CPU_CLUSTER CPU DOMAIN IRQ DRQ IO NUMBER SUBSYSTEMID INHERIT IOAPIC_IRQ IOAPIC PCIINT GENERIC SPI USB MMIO
%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
%%
devtree: { cur_parent = root_parent; } chip;
chipchildren: chipchildren device | chipchildren chip | chipchildren registers | /* empty */ ;
devicechildren: devicechildren device | devicechildren chip | devicechildren resource | devicechildren subsystemid | devicechildren ioapic_irq | /* empty */ ;
devicechildren: devicechildren device | devicechildren chip | devicechildren resource | devicechildren subsystemid | devicechildren ioapic_irq | devicechildren smbios_slot_desc | /* empty */ ;
chip: CHIP STRING /* == path */ {
$<chip_instance>$ = new_chip_instance($<string>2);
@ -72,4 +72,14 @@ subsystemid: SUBSYSTEMID NUMBER NUMBER INHERIT
ioapic_irq: IOAPIC_IRQ NUMBER PCIINT NUMBER
{ add_ioapic_info(cur_parent, strtol($<string>2, NULL, 16), $<string>3, strtol($<string>4, NULL, 16)); };
smbios_slot_desc: SLOT_DESC STRING STRING STRING STRING
{ add_slot_desc(cur_parent, $<string>2, $<string>3, $<string>4, $<string>5); };
smbios_slot_desc: SLOT_DESC STRING STRING STRING
{ add_slot_desc(cur_parent, $<string>2, $<string>3, $<string>4, NULL); };
smbios_slot_desc: SLOT_DESC STRING STRING
{ add_slot_desc(cur_parent, $<string>2, $<string>3, NULL, NULL); };
%%