Duncan Laurie has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/41440 )
Change subject: sconfig: Add support for firmware configuration ......................................................................
sconfig: Add support for firmware configuration
This change adds support to sconfig for generating the firmware configuration field and option definitions in devicetree.cb.
In addition these fields and options can be used to probe for a device and have that device be disabled if it is not found at boot time.
New tokens: fw_config: top level token, table can be defined before chips field: define field in the mask with the start and end bits option: define option in a field with the value of the field probe: indicate that a device should probe by field and option
Example: fw_config field FEATURE 0 0 option DISABLE 0 option ENABLE 1 end end chip drivers/generic/feature device generic 0 on probe FEATURE ENABLE end end
Variants can add new fields and add new options to existing fields in overridetree.cb but cannot redefine an existing option.
Devices can have multiple probe tokens, and the device will be considered to be found if any of them return true.
The output from defining this field are:
1) the various fields and options will be added as macro constants to static.h and can be used by fw_config for probing. 2) the probe entries will result in a list of fields/options to probe that is added to the resulting struct device and handled by coreboot.
BUG=b:147462631
Signed-off-by: Duncan Laurie dlaurie@google.com Change-Id: I8aea63e577d933aea09e0d0b09470929cc96e0de --- M util/sconfig/lex.yy.c_shipped M util/sconfig/main.c M util/sconfig/sconfig.h M util/sconfig/sconfig.l M util/sconfig/sconfig.tab.c_shipped M util/sconfig/sconfig.tab.h_shipped M util/sconfig/sconfig.y 7 files changed, 568 insertions(+), 245 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/40/41440/1
diff --git a/util/sconfig/lex.yy.c_shipped b/util/sconfig/lex.yy.c_shipped index 61928e6..998505e 100644 --- a/util/sconfig/lex.yy.c_shipped +++ b/util/sconfig/lex.yy.c_shipped @@ -349,8 +349,8 @@ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 41 -#define YY_END_OF_BUFFER 42 +#define YY_NUM_RULES 45 +#define YY_END_OF_BUFFER 46 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -358,27 +358,30 @@ flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[173] = +static const flex_int16_t yy_accept[195] = { 0, - 0, 0, 42, 40, 1, 3, 40, 40, 40, 35, - 35, 33, 36, 40, 36, 36, 36, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 1, 3, - 40, 0, 40, 40, 0, 2, 35, 36, 40, 40, - 40, 40, 36, 40, 40, 40, 40, 40, 40, 40, - 40, 27, 40, 40, 40, 40, 40, 40, 7, 40, - 40, 40, 40, 40, 40, 40, 39, 39, 40, 0, - 34, 40, 40, 17, 40, 40, 26, 31, 40, 40, - 40, 14, 40, 40, 25, 40, 23, 40, 40, 8, - 11, 13, 40, 40, 21, 40, 22, 40, 0, 37, + 0, 0, 46, 44, 1, 3, 44, 44, 44, 39, + 39, 37, 40, 44, 40, 40, 40, 40, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 1, + 3, 44, 0, 44, 44, 0, 2, 39, 40, 44, + 44, 44, 44, 40, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 31, 44, 44, 44, 44, 44, + 44, 11, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 43, 43, 44, 0, 38, 44, 44, 21, 44, + 44, 30, 35, 44, 44, 44, 44, 44, 18, 44, + 44, 29, 44, 27, 44, 44, 12, 44, 15, 17,
- 4, 40, 40, 40, 24, 40, 40, 40, 40, 40, - 40, 20, 40, 40, 40, 38, 38, 40, 40, 40, - 40, 40, 40, 40, 15, 40, 40, 40, 40, 40, - 5, 18, 40, 9, 40, 12, 40, 40, 40, 40, - 40, 19, 29, 40, 40, 40, 40, 40, 40, 40, - 40, 6, 40, 40, 40, 40, 10, 40, 40, 40, - 28, 40, 40, 16, 40, 30, 40, 40, 40, 40, - 32, 0 + 44, 44, 44, 25, 44, 26, 44, 0, 41, 4, + 44, 44, 44, 28, 44, 44, 44, 44, 44, 44, + 44, 44, 24, 44, 44, 44, 44, 44, 42, 42, + 44, 44, 44, 8, 44, 44, 44, 44, 44, 19, + 44, 44, 10, 44, 44, 44, 44, 5, 22, 44, + 44, 13, 44, 16, 44, 9, 44, 44, 44, 44, + 44, 23, 33, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 6, 44, 44, 44, 7, 44, 14, 44, + 44, 44, 32, 44, 44, 20, 44, 34, 44, 44, + 44, 44, 36, 0 + } ;
static const YY_CHAR yy_ec[256] = @@ -395,8 +398,8 @@ 1, 1, 1, 1, 16, 1, 17, 18, 19, 20,
21, 22, 23, 24, 25, 1, 1, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 1, 37, - 38, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 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, 1, @@ -413,126 +416,142 @@ 1, 1, 1, 1, 1 } ;
-static const YY_CHAR yy_meta[39] = +static const YY_CHAR yy_meta[40] = { 0, 1, 2, 2, 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, 1, 1, 1, 1, 1, 1 } ;
-static const flex_int16_t yy_base[180] = +static const flex_int16_t yy_base[202] = { 0, - 0, 0, 240, 0, 237, 241, 235, 37, 41, 38, - 200, 0, 44, 222, 54, 78, 60, 214, 209, 45, - 49, 48, 42, 52, 212, 62, 199, 0, 229, 241, - 93, 225, 98, 79, 226, 241, 0, 97, 104, 213, - 202, 191, 110, 198, 193, 203, 192, 193, 200, 200, - 194, 200, 185, 185, 195, 185, 187, 189, 0, 185, - 179, 185, 189, 181, 187, 186, 0, 241, 125, 198, - 0, 191, 171, 184, 174, 181, 0, 0, 172, 175, - 175, 0, 173, 163, 0, 167, 0, 171, 161, 0, - 0, 0, 164, 163, 0, 154, 0, 181, 180, 0, + 0, 0, 265, 0, 262, 266, 260, 38, 42, 39, + 224, 0, 45, 247, 55, 79, 61, 58, 239, 234, + 46, 54, 55, 68, 73, 237, 46, 224, 0, 254, + 266, 101, 250, 107, 111, 251, 266, 0, 108, 111, + 238, 227, 216, 117, 223, 218, 228, 217, 225, 229, + 216, 223, 223, 217, 223, 208, 208, 218, 208, 210, + 212, 0, 199, 207, 201, 201, 206, 210, 202, 208, + 207, 0, 266, 132, 219, 0, 212, 192, 205, 195, + 202, 0, 0, 193, 191, 197, 194, 194, 0, 192, + 182, 0, 186, 0, 190, 180, 0, 183, 0, 0,
- 0, 165, 164, 157, 0, 149, 159, 147, 153, 158, - 159, 0, 142, 145, 135, 0, 241, 146, 150, 142, - 144, 140, 142, 147, 0, 131, 130, 130, 129, 126, - 0, 0, 141, 0, 125, 129, 115, 122, 126, 107, - 107, 0, 0, 114, 106, 105, 103, 114, 100, 101, - 94, 0, 105, 102, 99, 83, 0, 80, 83, 70, - 0, 60, 71, 0, 74, 0, 63, 55, 39, 29, - 0, 241, 40, 146, 148, 150, 152, 154, 156 + 189, 181, 180, 0, 171, 0, 198, 197, 0, 0, + 182, 181, 174, 0, 178, 168, 164, 174, 162, 168, + 173, 174, 0, 161, 168, 155, 158, 147, 0, 266, + 159, 163, 155, 0, 154, 156, 152, 154, 159, 0, + 143, 148, 0, 141, 141, 140, 137, 0, 0, 149, + 151, 0, 135, 152, 138, 0, 145, 136, 117, 117, + 124, 0, 0, 123, 115, 114, 112, 123, 109, 119, + 109, 101, 0, 113, 111, 115, 0, 96, 0, 92, + 82, 70, 0, 65, 77, 0, 77, 0, 71, 59, + 44, 30, 0, 266, 41, 153, 155, 157, 159, 161, + + 163 } ;
-static const flex_int16_t yy_def[180] = +static const flex_int16_t yy_def[202] = { 0, - 172, 1, 172, 173, 172, 172, 173, 174, 175, 173, - 10, 173, 10, 173, 10, 10, 10, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 172, 172, - 174, 176, 177, 175, 178, 172, 10, 10, 10, 173, - 173, 173, 10, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 172, 177, 179, - 39, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 172, 173, + 194, 1, 194, 195, 194, 194, 195, 196, 197, 195, + 10, 195, 10, 195, 10, 10, 10, 10, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 194, + 194, 196, 198, 199, 197, 200, 194, 10, 10, 10, + 195, 195, 195, 10, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 194, 199, 201, 40, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
- 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 172, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 0, 172, 172, 172, 172, 172, 172, 172 + 195, 195, 195, 195, 195, 195, 195, 194, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 194, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 0, 194, 194, 194, 194, 194, 194, + + 194 } ;
-static const flex_int16_t yy_nxt[280] = +static const flex_int16_t yy_nxt[306] = { 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, 171, 38, 38, - 38, 38, 38, 50, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 58, 56, 54, 38, 38, 38, 59, - 60, 170, 51, 52, 57, 169, 53, 41, 55, 61, - 35, 36, 168, 42, 38, 38, 38, 46, 63, 167, - 166, 64, 47, 165, 32, 32, 65, 67, 43, 70, + 17, 18, 19, 20, 21, 22, 23, 4, 24, 25, + 4, 26, 27, 4, 28, 4, 4, 4, 4, 33, + 33, 29, 34, 36, 37, 38, 38, 38, 193, 39, + 39, 39, 39, 39, 53, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 57, 59, 68, 54, 55, 69, 192, 56, 42, 191, + 70, 60, 49, 58, 43, 39, 39, 39, 47, 61, + 190, 64, 189, 48, 50, 62, 188, 63, 187, 44,
- 70, 164, 28, 38, 38, 38, 44, 163, 162, 45, - 71, 71, 71, 161, 71, 71, 38, 38, 38, 160, - 71, 71, 71, 71, 71, 71, 70, 70, 159, 98, - 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, - 148, 147, 146, 145, 144, 75, 31, 31, 34, 34, - 32, 32, 69, 69, 35, 35, 70, 70, 143, 142, + 65, 186, 33, 33, 66, 72, 185, 45, 75, 75, + 46, 29, 36, 37, 39, 39, 39, 76, 76, 76, + 184, 76, 76, 39, 39, 39, 183, 76, 76, 76, + 76, 76, 76, 75, 75, 182, 107, 181, 180, 179, + 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, + 168, 167, 80, 32, 32, 35, 35, 33, 33, 74, + 74, 36, 36, 75, 75, 166, 165, 164, 163, 162, + 161, 160, 159, 158, 157, 156, 155, 154, 153, 152, + 151, 150, 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, 97, 96, 95, 94, 93, 92, 91, + 111, 110, 109, 108, 106, 105, 104, 103, 102, 101, + 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, - 80, 79, 78, 77, 76, 74, 73, 72, 36, 68, - 29, 66, 62, 49, 48, 40, 39, 30, 29, 172, - 3, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172 + 79, 78, 77, 37, 73, 30, 71, 67, 52, 51, + 41, 40, 31, 30, 194, 3, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + + 194, 194, 194, 194, 194 } ;
-static const flex_int16_t yy_chk[280] = +static const flex_int16_t yy_chk[306] = { 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, - 173, 8, 9, 9, 10, 10, 10, 170, 10, 10, - 13, 13, 13, 20, 10, 10, 10, 10, 10, 10, - 15, 15, 15, 23, 22, 21, 17, 17, 17, 23, - 24, 169, 20, 20, 22, 168, 20, 15, 21, 24, - 34, 34, 167, 15, 16, 16, 16, 17, 26, 165, - 163, 26, 17, 162, 31, 31, 26, 31, 16, 33, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, + 8, 195, 8, 9, 9, 10, 10, 10, 192, 10, + 10, 13, 13, 13, 21, 10, 10, 10, 10, 10, + 10, 15, 15, 15, 18, 18, 18, 17, 17, 17, + 22, 23, 27, 21, 21, 27, 191, 21, 15, 190, + 27, 23, 18, 22, 15, 16, 16, 16, 17, 24, + 189, 25, 187, 17, 18, 24, 185, 24, 184, 16,
- 33, 160, 33, 38, 38, 38, 16, 159, 158, 16, - 39, 39, 39, 156, 39, 39, 43, 43, 43, 155, - 39, 39, 39, 39, 39, 39, 69, 69, 154, 69, - 153, 151, 150, 149, 148, 147, 146, 145, 144, 141, - 140, 139, 138, 137, 136, 43, 174, 174, 175, 175, - 176, 176, 177, 177, 178, 178, 179, 179, 135, 133, - 130, 129, 128, 127, 126, 124, 123, 122, 121, 120, - 119, 118, 115, 114, 113, 111, 110, 109, 108, 107, - 106, 104, 103, 102, 99, 98, 96, 94, 93, 89, - 88, 86, 84, 83, 81, 80, 79, 76, 75, 74, + 25, 182, 32, 32, 25, 32, 181, 16, 34, 34, + 16, 34, 35, 35, 39, 39, 39, 40, 40, 40, + 180, 40, 40, 44, 44, 44, 178, 40, 40, 40, + 40, 40, 40, 74, 74, 176, 74, 175, 174, 172, + 171, 170, 169, 168, 167, 166, 165, 164, 161, 160, + 159, 158, 44, 196, 196, 197, 197, 198, 198, 199, + 199, 200, 200, 201, 201, 157, 155, 154, 153, 151, + 150, 147, 146, 145, 144, 142, 141, 139, 138, 137, + 136, 135, 133, 132, 131, 128, 127, 126, 125, 124, + 122, 121, 120, 119, 118, 117, 116, 115, 113, 112,
- 73, 72, 70, 66, 65, 64, 63, 62, 61, 60, - 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, - 48, 47, 46, 45, 44, 42, 41, 40, 35, 32, - 29, 27, 25, 19, 18, 14, 11, 7, 5, 3, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172 + 111, 108, 107, 105, 103, 102, 101, 98, 96, 95, + 93, 91, 90, 88, 87, 86, 85, 84, 81, 80, + 79, 78, 77, 75, 71, 70, 69, 68, 67, 66, + 65, 64, 63, 61, 60, 59, 58, 57, 56, 55, + 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, + 43, 42, 41, 36, 33, 30, 28, 26, 20, 19, + 14, 11, 7, 5, 3, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + + 194, 194, 194, 194, 194 } ;
static yy_state_type yy_last_accepting_state; @@ -549,21 +568,8 @@ #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; -/* - * sconfig, coreboot device tree compiler - * - * Copyright (C) 2010 coresystems GmbH - * written by Patrick Georgi patrick@georgi-clan.de - * - * 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 - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ +/* sconfig, coreboot device tree compiler */ +/* SPDX-License-Identifier: GPL-2.0-only */
#include "sconfig.tab.h"
@@ -810,13 +816,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 >= 173 ) + if ( yy_current_state >= 195 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 241 ); + while ( yy_base[yy_current_state] != 266 );
yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -868,144 +874,160 @@ YY_BREAK case 7: YY_RULE_SETUP -{yylval.number=1; return(BOOL);} +{return(FW_CONFIG_TABLE);} YY_BREAK case 8: YY_RULE_SETUP -{yylval.number=0; return(BOOL);} +{return(FW_CONFIG_FIELD);} YY_BREAK case 9: YY_RULE_SETUP -{yylval.number=3; return(STATUS);} +{return(FW_CONFIG_OPTION);} YY_BREAK case 10: YY_RULE_SETUP -{yylval.number=5; return(STATUS);} +{return(FW_CONFIG_PROBE);} YY_BREAK case 11: YY_RULE_SETUP -{yylval.number=PCI; return(BUS);} +{yylval.number=1; return(BOOL);} YY_BREAK case 12: YY_RULE_SETUP -{yylval.number=IOAPIC; return(BUS);} +{yylval.number=0; return(BOOL);} YY_BREAK case 13: YY_RULE_SETUP -{yylval.number=PNP; return(BUS);} +{yylval.number=3; return(STATUS);} YY_BREAK case 14: YY_RULE_SETUP -{yylval.number=I2C; return(BUS);} +{yylval.number=5; return(STATUS);} YY_BREAK case 15: YY_RULE_SETUP -{yylval.number=APIC; return(BUS);} +{yylval.number=PCI; return(BUS);} YY_BREAK case 16: YY_RULE_SETUP -{yylval.number=CPU_CLUSTER; return(BUS);} +{yylval.number=IOAPIC; return(BUS);} YY_BREAK case 17: YY_RULE_SETUP -{yylval.number=CPU; return(BUS);} +{yylval.number=PNP; return(BUS);} YY_BREAK case 18: YY_RULE_SETUP -{yylval.number=DOMAIN; return(BUS);} +{yylval.number=I2C; return(BUS);} YY_BREAK case 19: YY_RULE_SETUP -{yylval.number=GENERIC; return(BUS);} +{yylval.number=APIC; return(BUS);} YY_BREAK case 20: YY_RULE_SETUP -{yylval.number=MMIO; return(BUS);} +{yylval.number=CPU_CLUSTER; return(BUS);} YY_BREAK case 21: YY_RULE_SETUP -{yylval.number=SPI; return(BUS);} +{yylval.number=CPU; return(BUS);} YY_BREAK case 22: YY_RULE_SETUP -{yylval.number=USB; return(BUS);} +{yylval.number=DOMAIN; return(BUS);} YY_BREAK case 23: YY_RULE_SETUP -{yylval.number=LPC; return(BUS);} +{yylval.number=GENERIC; return(BUS);} YY_BREAK case 24: YY_RULE_SETUP -{yylval.number=ESPI; return(BUS);} +{yylval.number=MMIO; return(BUS);} YY_BREAK case 25: YY_RULE_SETUP -{yylval.number=IRQ; return(RESOURCE);} +{yylval.number=SPI; return(BUS);} YY_BREAK case 26: YY_RULE_SETUP -{yylval.number=DRQ; return(RESOURCE);} +{yylval.number=USB; return(BUS);} YY_BREAK case 27: YY_RULE_SETUP -{yylval.number=IO; return(RESOURCE);} +{yylval.number=LPC; return(BUS);} YY_BREAK case 28: YY_RULE_SETUP -{return(IOAPIC_IRQ);} +{yylval.number=ESPI; return(BUS);} YY_BREAK case 29: YY_RULE_SETUP -{return(INHERIT);} +{yylval.number=IRQ; return(RESOURCE);} YY_BREAK case 30: YY_RULE_SETUP -{return(SUBSYSTEMID);} +{yylval.number=DRQ; return(RESOURCE);} YY_BREAK case 31: YY_RULE_SETUP -{return(END);} +{yylval.number=IO; return(RESOURCE);} YY_BREAK case 32: YY_RULE_SETUP -{return(SLOT_DESC);} +{return(IOAPIC_IRQ);} YY_BREAK case 33: YY_RULE_SETUP -{return(EQUALS);} +{return(INHERIT);} YY_BREAK case 34: YY_RULE_SETUP -{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);} +{return(SUBSYSTEMID);} YY_BREAK case 35: YY_RULE_SETUP -{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);} +{return(END);} YY_BREAK case 36: YY_RULE_SETUP -{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);} +{return(SLOT_DESC);} YY_BREAK case 37: YY_RULE_SETUP -{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(PCIINT);} +{return(EQUALS);} YY_BREAK case 38: -/* rule 38 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(NUMBER);} YY_BREAK case 39: -/* rule 39 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(NUMBER);} YY_BREAK case 40: YY_RULE_SETUP -{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(STRING);} +{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);} YY_BREAK case 41: YY_RULE_SETUP +{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(PCIINT);} + YY_BREAK +case 42: +/* rule 42 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 43: +/* rule 43 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 44: +YY_RULE_SETUP +{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(STRING);} + YY_BREAK +case 45: +YY_RULE_SETUP ECHO; YY_BREAK case YY_STATE_EOF(INITIAL): @@ -1304,7 +1326,7 @@ 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 >= 173 ) + if ( yy_current_state >= 195 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -1332,11 +1354,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 >= 173 ) + if ( yy_current_state >= 195 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 172); + yy_is_jam = (yy_current_state == 194);
return yy_is_jam ? 0 : yy_current_state; } diff --git a/util/sconfig/main.c b/util/sconfig/main.c index 6676bae..c408329 100644 --- a/util/sconfig/main.c +++ b/util/sconfig/main.c @@ -5,6 +5,7 @@ /* stat.h needs to be included before commonlib/helpers.h to avoid errors.*/ #include <sys/stat.h> #include <commonlib/helpers.h> +#include <stdint.h> #include "sconfig.h" #include "sconfig.tab.h"
@@ -323,6 +324,190 @@ return instance; }
+/* List of fw_config fields added during parsing. */ +static struct fw_config_field *fw_config_fields; + +static struct fw_config_option *find_fw_config_option(struct fw_config_field *field, + const char *name) +{ + struct fw_config_option *option = field->options; + + while (option && option->name) { + if (!strncasecmp(option->name, name, strlen(option->name))) + return option; + option = option->next; + } + return NULL; +} + +static struct fw_config_field *find_fw_config_field(const char *name) +{ + struct fw_config_field *field = fw_config_fields; + + while (field && field->name) { + if (!strncasecmp(field->name, name, strlen(field->name))) + return field; + field = field->next; + } + return NULL; +} + +static void append_fw_config_field(struct fw_config_field *add) +{ + struct fw_config_field *field = fw_config_fields; + + if (!fw_config_fields) { + fw_config_fields = add; + } else { + while (field && field->next) + field = field->next; + field->next = add; + } +} + +struct fw_config_field *new_fw_config_field(const char *name, + unsigned int start_bit, unsigned int end_bit) +{ + struct fw_config_field *field = find_fw_config_field(name); + + if (!field) { + field = S_ALLOC(sizeof(*field)); + field->name = name; + field->start_bit = start_bit; + field->end_bit = end_bit; + append_fw_config_field(field); + } + return field; +} + +static void append_fw_config_option_to_field(struct fw_config_field *field, + struct fw_config_option *add) +{ + struct fw_config_option *option = field->options; + + if (!option) { + field->options = add; + } else { + while (option && option->next) + option = option->next; + option->next = add; + } +} + +void add_fw_config_option(struct fw_config_field *field, const char *name, unsigned int value) +{ + struct fw_config_option *option = S_ALLOC(sizeof(*option)); + + option->name = name; + option->value = value; + + /* Add option to the current field. */ + append_fw_config_option_to_field(field, option); +} + +static void append_fw_config_probe_to_dev(struct device *dev, struct fw_config_probe *add) +{ + struct fw_config_probe *probe = dev->probe; + + if (!probe) { + dev->probe = add; + } else { + while (probe && probe->next) + probe = probe->next; + probe->next = add; + } +} + +void add_fw_config_probe(struct bus *bus, const char *field, const char *option) +{ + struct fw_config_probe *probe = S_ALLOC(sizeof(*probe)); + + probe->field = field; + probe->option = option; + + append_fw_config_probe_to_dev(bus->dev, probe); +} + +static void emit_fw_config(FILE *fil) +{ + struct fw_config_field *field = fw_config_fields; + + if (!field) + return; + + fprintf(fil, "\n/* firmware configuration */\n"); + fprintf(fil, "#include <fw_config.h>\n"); + + while (field) { + struct fw_config_option *option = field->options; + uint32_t mask; + + fprintf(fil, "#define FW_CONFIG_FIELD_%s_NAME "%s"\n", + field->name, field->name); + + /* Compute mask from start and end bit. */ + mask = ((1 << (1 + field->end_bit - field->start_bit)) - 1); + mask <<= field->start_bit; + + fprintf(fil, "#define FW_CONFIG_FIELD_%s_MASK 0x%08x\n", + field->name, mask); + + while (option) { + fprintf(fil, "#define FW_CONFIG_FIELD_%s_OPTION_%s_NAME "%s"\n", + field->name, option->name, option->name); + fprintf(fil, "#define FW_CONFIG_FIELD_%s_OPTION_%s_VALUE 0x%08x\n", + field->name, option->name, option->value << field->start_bit); + + option = option->next; + } + + field = field->next; + } + + fprintf(fil, "\n"); +} + +static void emit_fw_config_probe(FILE *fil, struct device *dev) +{ + struct fw_config_probe *probe = dev->probe; + + fprintf(fil, "DEVTREE_CONST struct fw_config %s_probe_list[] = {\n", dev->name); + + while (probe) { + /* Find matching field. */ + struct fw_config_field *field; + struct fw_config_option *option; + uint32_t mask, value; + + field = find_fw_config_field(probe->field); + if (!field) { + printf("ERROR: fw_config_probe field %s not found\n", probe->field); + exit(1); + } + option = find_fw_config_option(field, probe->option); + if (!option) { + printf("ERROR: fw_config_probe field %s option %s not found\n", + probe->field, probe->option); + exit(1); + } + + /* Fill out the probe structure with values from emit_fw_config(). */ + fprintf(fil, "\t{\n"); + fprintf(fil, "\t\t.field_name = FW_CONFIG_FIELD_%s_NAME,\n", probe->field); + fprintf(fil, "\t\t.option_name = FW_CONFIG_FIELD_%s_OPTION_%s_NAME,\n", + probe->field, probe->option); + fprintf(fil, "\t\t.mask = FW_CONFIG_FIELD_%s_MASK,\n", probe->field); + fprintf(fil, "\t\t.value = FW_CONFIG_FIELD_%s_OPTION_%s_VALUE,\n", + probe->field, probe->option); + fprintf(fil, "\t},\n"); + + probe = probe->next; + } + + /* Add empty entry to mark end of list. */ + fprintf(fil, "\t{ }\n};\n"); +} + /* * Allocate a new bus for the provided device. * - If this is the first bus being allocated under this device, then its id @@ -732,6 +917,10 @@ if (chip_ins->base_chip_instance) chip_ins = chip_ins->base_chip_instance;
+ /* Emit probe structures. */ + if (ptr->probe) + emit_fw_config_probe(fil, ptr); + if (ptr == &base_root_dev) fprintf(fil, "DEVTREE_CONST struct device %s = {\n", ptr->name); else @@ -779,6 +968,8 @@ else fprintf(fil, "\t.sibling = NULL,\n"); fprintf(fil, "#if !DEVTREE_EARLY\n"); + if (ptr->probe) + fprintf(fil, "\t.probe_list = %s_probe_list,\n", ptr->name); for (pin = 0; pin < 4; pin++) { if (ptr->pci_irq_info[pin].ioapic_irq_pin > 0) fprintf(fil, @@ -1345,7 +1536,9 @@ fprintf(autohead, "#ifndef __STATIC_DEVICE_TREE_H\n"); fprintf(autohead, "#define __STATIC_DEVICE_TREE_H\n\n"); fprintf(autohead, "#include <device/device.h>\n\n"); + emit_fw_config(autohead);
+ fprintf(autogen, "#include <static.h>\n"); emit_chips(autogen);
walk_device_tree(autogen, autohead, &base_root_dev, inherit_subsystem_ids); diff --git a/util/sconfig/sconfig.h b/util/sconfig/sconfig.h index a960b7f..55a2617 100644 --- a/util/sconfig/sconfig.h +++ b/util/sconfig/sconfig.h @@ -8,6 +8,7 @@ #include <unistd.h> #include <errno.h>
+ struct resource; struct resource { int type; @@ -28,6 +29,27 @@ int ioapic_dst_id; };
+struct fw_config_option; +struct fw_config_option { + const char *name; + unsigned int value; + struct fw_config_option *next; +}; +struct fw_config_field; +struct fw_config_field { + const char *name; + unsigned int start_bit; + unsigned int end_bit; + struct fw_config_field *next; + struct fw_config_option *options; +}; +struct fw_config_probe; +struct fw_config_probe { + const char *field; + const char *option; + struct fw_config_probe *next; +}; + struct chip; struct chip_instance { /* Monotonically increasing ID for each chip instance. */ @@ -141,6 +163,9 @@
/* SMBIOS slot length */ char *smbios_slot_length; + + /* List of field+option to probe. */ + struct fw_config_probe *probe; };
extern struct bus *root_parent; @@ -171,3 +196,11 @@
struct chip_instance *new_chip_instance(char *path); void add_register(struct chip_instance *chip, char *name, char *val); + +struct fw_config_field *new_fw_config_field(const char *name, + unsigned int start_bit, unsigned int end_bit); + +void add_fw_config_option(struct fw_config_field *field, const char *name, + unsigned int value); + +void add_fw_config_probe(struct bus *bus, const char *field, const char *option); diff --git a/util/sconfig/sconfig.l b/util/sconfig/sconfig.l index 5ac5057..10a86a2 100755 --- a/util/sconfig/sconfig.l +++ b/util/sconfig/sconfig.l @@ -14,6 +14,10 @@ chip {return(CHIP);} device {return(DEVICE);} register {return(REGISTER);} +fw_config {return(FW_CONFIG_TABLE);} +field {return(FW_CONFIG_FIELD);} +option {return(FW_CONFIG_OPTION);} +probe {return(FW_CONFIG_PROBE);} on {yylval.number=1; return(BOOL);} off {yylval.number=0; return(BOOL);} hidden {yylval.number=3; return(STATUS);} diff --git a/util/sconfig/sconfig.tab.c_shipped b/util/sconfig/sconfig.tab.c_shipped index 2bae43b..5399c77 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.5.4. */ +/* A Bison parser, made by GNU Bison 3.5.1. */
/* Bison implementation for Yacc-like parsers in C
@@ -48,7 +48,7 @@ #define YYBISON 1
/* Bison version. */ -#define YYBISON_VERSION "3.5.4" +#define YYBISON_VERSION "3.5.1"
/* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -77,6 +77,7 @@
static struct bus *cur_parent; static struct chip_instance *cur_chip_instance; +static struct fw_config_field *cur_field;
@@ -111,8 +112,8 @@
/* Use api.header.include to #include this header instead of duplicating it here. */ -#ifndef YY_YY_HOME_ME_REPOS_COREBOOTORG_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED -# define YY_YY_HOME_ME_REPOS_COREBOOTORG_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED +#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 @@ -160,7 +161,11 @@ USB = 289, MMIO = 290, LPC = 291, - ESPI = 292 + ESPI = 292, + FW_CONFIG_TABLE = 293, + FW_CONFIG_FIELD = 294, + FW_CONFIG_OPTION = 295, + FW_CONFIG_PROBE = 296 }; #endif
@@ -186,7 +191,7 @@
int yyparse (void);
-#endif /* !YY_YY_HOME_ME_REPOS_COREBOOTORG_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED */ +#endif /* !YY_YY_SRC_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED */
@@ -490,21 +495,21 @@ #endif /* !YYCOPY_NEEDED */
/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 3 +#define YYFINAL 2 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 45 +#define YYLAST 62
/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 38 +#define YYNTOKENS 42 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 15 +#define YYNNTS 21 /* YYNRULES -- Number of rules. */ -#define YYNRULES 29 +#define YYNRULES 40 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 50 +#define YYNSTATES 69
#define YYUNDEFTOK 2 -#define YYMAXUTOK 292 +#define YYMAXUTOK 296
/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM @@ -545,16 +550,18 @@ 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 + 35, 36, 37, 38, 39, 40, 41 };
#if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int8 yyrline[] = { - 0, 36, 36, 36, 38, 38, 38, 38, 40, 40, - 40, 40, 40, 40, 40, 40, 42, 42, 51, 51, - 59, 59, 61, 64, 67, 70, 73, 76, 79, 82 + 0, 24, 24, 24, 24, 26, 26, 26, 26, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 30, 30, + 39, 39, 47, 47, 49, 52, 55, 58, 61, 64, + 67, 70, 73, 75, 75, 77, 77, 79, 79, 84, + 87 }; #endif
@@ -568,9 +575,13 @@ "STRING", "PCI", "PNP", "I2C", "APIC", "CPU_CLUSTER", "CPU", "DOMAIN", "IRQ", "DRQ", "SLOT_DESC", "IO", "NUMBER", "SUBSYSTEMID", "INHERIT", "IOAPIC_IRQ", "IOAPIC", "PCIINT", "GENERIC", "SPI", "USB", "MMIO", "LPC", - "ESPI", "$accept", "devtree", "$@1", "chipchildren", "devicechildren", - "chip", "@2", "device", "@3", "status", "resource", "registers", - "subsystemid", "ioapic_irq", "smbios_slot_desc", YY_NULLPTR + "ESPI", "FW_CONFIG_TABLE", "FW_CONFIG_FIELD", "FW_CONFIG_OPTION", + "FW_CONFIG_PROBE", "$accept", "devtree", "chipchildren", + "devicechildren", "chip", "@1", "device", "@2", "status", "resource", + "registers", "subsystemid", "ioapic_irq", "smbios_slot_desc", + "fw_config_table", "fw_config_table_children", + "fw_config_field_children", "fw_config_field", "$@3", "fw_config_option", + "fw_config_probe", YY_NULLPTR }; #endif
@@ -582,7 +593,8 @@ 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, 290, 291, 292 + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296 }; # endif
@@ -600,11 +612,13 @@ STATE-NUM. */ static const yytype_int8 yypact[] = { - -10, 11, 10, -10, 0, -10, -10, -10, 1, 6, - 2, -10, -10, -10, -10, -9, 8, 3, 4, -10, - -10, -10, -10, -10, -3, -4, -10, 9, -1, 5, - -10, -10, -10, -10, -10, -10, -10, 15, 14, 7, - -2, 12, 16, 13, 17, -10, 18, -10, -10, -10 + -10, 3, -10, -1, -10, -10, -10, -10, -2, -10, + -10, 2, -10, 7, -9, 10, 6, -10, -10, -10, + -10, -4, 1, 11, -10, 8, 14, -10, -10, -10, + -10, -10, -7, -10, -10, 16, -10, -3, 5, 9, + -10, 18, 13, 17, 20, -10, -10, -10, -10, -10, + -10, -10, -10, -10, 24, 26, 19, -6, 28, 21, + 30, 22, 23, -10, -10, 32, -10, -10, -10 };
/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -612,25 +626,29 @@ means the default is an error. */ static const yytype_int8 yydefact[] = { - 2, 0, 0, 1, 0, 3, 16, 7, 0, 0, - 0, 17, 5, 4, 6, 0, 0, 0, 0, 20, - 21, 18, 23, 15, 0, 0, 19, 0, 0, 0, - 9, 8, 10, 14, 11, 12, 13, 0, 0, 0, - 0, 0, 29, 24, 0, 22, 28, 25, 26, 27 + 2, 0, 1, 0, 34, 3, 4, 18, 0, 8, + 32, 0, 33, 0, 0, 0, 0, 19, 6, 5, + 7, 0, 0, 0, 37, 0, 0, 36, 22, 23, + 20, 25, 0, 17, 38, 0, 35, 0, 0, 0, + 21, 0, 0, 0, 0, 10, 9, 11, 15, 12, + 13, 14, 16, 39, 0, 0, 0, 0, 0, 0, + 31, 26, 0, 40, 24, 30, 27, 28, 29 };
/* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { - -10, -10, -10, -10, -10, -5, -10, 20, -10, -10, - -10, 21, -10, -10, -10 + -10, -10, -10, -10, -8, -10, 15, -10, -10, -10, + 25, -10, -10, -10, -10, -10, -10, -10, -10, -10, + -10 };
/* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { - -1, 1, 2, 8, 24, 5, 7, 13, 23, 21, - 32, 14, 34, 35, 36 + -1, 1, 13, 37, 5, 9, 19, 33, 30, 47, + 20, 49, 50, 51, 6, 8, 32, 12, 27, 36, + 52 };
/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -638,47 +656,57 @@ number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int8 yytable[] = { - 4, 9, 10, 12, 4, 9, 10, 25, 26, 19, - 20, 3, 11, 4, 6, 15, 16, 17, 22, 30, - 18, 27, 37, 38, 28, 39, 29, 41, 42, 44, - 46, 40, 49, 43, 0, 0, 0, 0, 45, 0, - 0, 47, 0, 48, 31, 33 + 3, 15, 16, 2, 34, 18, 3, 39, 40, 10, + 3, 15, 16, 7, 28, 29, 14, 21, 17, 22, + 23, 41, 24, 26, 42, 62, 43, 25, 31, 45, + 38, 53, 55, 35, 58, 54, 59, 11, 44, 56, + 60, 4, 63, 57, 65, 61, 68, 64, 0, 67, + 66, 0, 46, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 48 };
static const yytype_int8 yycheck[] = { - 3, 4, 5, 8, 3, 4, 5, 10, 11, 6, - 7, 0, 11, 3, 14, 9, 14, 26, 14, 24, - 12, 24, 26, 14, 27, 26, 29, 12, 14, 31, - 14, 26, 14, 26, -1, -1, -1, -1, 26, -1, - -1, 28, -1, 26, 24, 24 + 3, 4, 5, 0, 11, 13, 3, 10, 11, 11, + 3, 4, 5, 14, 6, 7, 14, 26, 11, 9, + 14, 24, 26, 12, 27, 31, 29, 26, 14, 37, + 14, 26, 14, 40, 14, 26, 12, 39, 41, 26, + 14, 38, 14, 26, 14, 26, 14, 26, -1, 26, + 28, -1, 37, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 37 };
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_int8 yystos[] = { - 0, 39, 40, 0, 3, 43, 14, 44, 41, 4, - 5, 11, 43, 45, 49, 9, 14, 26, 12, 6, - 7, 47, 14, 46, 42, 10, 11, 24, 27, 29, - 43, 45, 48, 49, 50, 51, 52, 26, 14, 26, - 26, 12, 14, 26, 31, 26, 14, 28, 26, 14 + 0, 43, 0, 3, 38, 46, 56, 14, 57, 47, + 11, 39, 59, 44, 14, 4, 5, 11, 46, 48, + 52, 26, 9, 14, 26, 26, 12, 60, 6, 7, + 50, 14, 58, 49, 11, 40, 61, 45, 14, 10, + 11, 24, 27, 29, 41, 46, 48, 51, 52, 53, + 54, 55, 62, 26, 26, 14, 26, 26, 14, 12, + 14, 26, 31, 14, 26, 14, 28, 26, 14 };
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_int8 yyr1[] = { - 0, 38, 40, 39, 41, 41, 41, 41, 42, 42, - 42, 42, 42, 42, 42, 42, 44, 43, 46, 45, - 47, 47, 48, 49, 50, 50, 51, 52, 52, 52 + 0, 42, 43, 43, 43, 44, 44, 44, 44, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 47, 46, + 49, 48, 50, 50, 51, 52, 53, 53, 54, 55, + 55, 55, 56, 57, 57, 58, 58, 60, 59, 61, + 62 };
/* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ static const yytype_int8 yyr2[] = { - 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, - 2, 2, 2, 2, 2, 0, 0, 5, 0, 7, - 1, 1, 4, 4, 3, 4, 4, 5, 4, 3 + 0, 2, 0, 2, 2, 2, 2, 2, 0, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 5, + 0, 7, 1, 1, 4, 4, 3, 4, 4, 5, + 4, 3, 3, 2, 0, 2, 0, 0, 7, 3, + 3 };
@@ -1377,7 +1405,7 @@ { cur_parent = root_parent; } break;
- case 16: + case 18: { (yyval.chip_instance) = new_chip_instance((yyvsp[0].string)); chip_enqueue_tail(cur_chip_instance); @@ -1385,57 +1413,79 @@ } break;
- case 17: + case 19: { cur_chip_instance = chip_dequeue_tail(); } break;
- case 18: + case 20: { (yyval.dev) = new_device(cur_parent, cur_chip_instance, (yyvsp[-2].number), (yyvsp[-1].string), (yyvsp[0].number)); cur_parent = (yyval.dev)->last_bus; } break;
- case 19: + case 21: { cur_parent = (yyvsp[-2].dev)->parent; } break;
- case 22: + case 24: { add_resource(cur_parent, (yyvsp[-3].number), strtol((yyvsp[-2].string), NULL, 0), strtol((yyvsp[0].string), NULL, 0)); } break;
- case 23: + case 25: { add_register(cur_chip_instance, (yyvsp[-2].string), (yyvsp[0].string)); } break;
- case 24: + case 26: { add_pci_subsystem_ids(cur_parent, strtol((yyvsp[-1].string), NULL, 16), strtol((yyvsp[0].string), NULL, 16), 0); } break;
- case 25: + case 27: { add_pci_subsystem_ids(cur_parent, strtol((yyvsp[-2].string), NULL, 16), strtol((yyvsp[-1].string), NULL, 16), 1); } break;
- case 26: + case 28: { add_ioapic_info(cur_parent, strtol((yyvsp[-2].string), NULL, 16), (yyvsp[-1].string), strtol((yyvsp[0].string), NULL, 16)); } break;
- case 27: + case 29: { add_slot_desc(cur_parent, (yyvsp[-3].string), (yyvsp[-2].string), (yyvsp[-1].string), (yyvsp[0].string)); } break;
- case 28: + case 30: { add_slot_desc(cur_parent, (yyvsp[-2].string), (yyvsp[-1].string), (yyvsp[0].string), NULL); } break;
- case 29: + case 31: { add_slot_desc(cur_parent, (yyvsp[-1].string), (yyvsp[0].string), NULL, NULL); } break;
+ case 32: + { } + break; + + case 37: + { + cur_field = new_fw_config_field((yyvsp[-2].string), strtoul((yyvsp[-1].string), NULL, 0), strtoul((yyvsp[0].string), NULL, 0)); +} + break; + + case 38: + { } + break; + + case 39: + { add_fw_config_option(cur_field, (yyvsp[-1].string), strtoul((yyvsp[0].string), NULL, 0)); } + break; + + case 40: + { add_fw_config_probe(cur_parent, (yyvsp[-1].string), (yyvsp[0].string)); } + break; +
default: break; diff --git a/util/sconfig/sconfig.tab.h_shipped b/util/sconfig/sconfig.tab.h_shipped index 5fa9d19..cadd847 100644 --- a/util/sconfig/sconfig.tab.h_shipped +++ b/util/sconfig/sconfig.tab.h_shipped @@ -1,4 +1,4 @@ -/* A Bison parser, made by GNU Bison 3.5.4. */ +/* A Bison parser, made by GNU Bison 3.5.1. */
/* Bison interface for Yacc-like parsers in C
@@ -34,8 +34,8 @@ /* Undocumented macros, especially those whose name start with YY_, are private implementation details. Do not rely on them. */
-#ifndef YY_YY_HOME_ME_REPOS_COREBOOTORG_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED -# define YY_YY_HOME_ME_REPOS_COREBOOTORG_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED +#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 @@ -83,7 +83,11 @@ USB = 289, MMIO = 290, LPC = 291, - ESPI = 292 + ESPI = 292, + FW_CONFIG_TABLE = 293, + FW_CONFIG_FIELD = 294, + FW_CONFIG_OPTION = 295, + FW_CONFIG_PROBE = 296 }; #endif
@@ -109,4 +113,4 @@
int yyparse (void);
-#endif /* !YY_YY_HOME_ME_REPOS_COREBOOTORG_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED */ +#endif /* !YY_YY_SRC_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED */ diff --git a/util/sconfig/sconfig.y b/util/sconfig/sconfig.y index 161cf81..d6d6273 100755 --- a/util/sconfig/sconfig.y +++ b/util/sconfig/sconfig.y @@ -9,6 +9,7 @@
static struct bus *cur_parent; static struct chip_instance *cur_chip_instance; +static struct fw_config_field *cur_field;
%} %union { @@ -18,13 +19,13 @@ int number; }
-%token CHIP DEVICE REGISTER BOOL STATUS MANDATORY BUS RESOURCE END EQUALS HEX STRING PCI PNP I2C APIC CPU_CLUSTER CPU DOMAIN IRQ DRQ SLOT_DESC IO NUMBER SUBSYSTEMID INHERIT IOAPIC_IRQ IOAPIC PCIINT GENERIC SPI USB MMIO LPC ESPI +%token CHIP DEVICE REGISTER BOOL STATUS MANDATORY BUS RESOURCE END EQUALS HEX STRING PCI PNP I2C APIC CPU_CLUSTER CPU DOMAIN IRQ DRQ SLOT_DESC IO NUMBER SUBSYSTEMID INHERIT IOAPIC_IRQ IOAPIC PCIINT GENERIC SPI USB MMIO LPC ESPI FW_CONFIG_TABLE FW_CONFIG_FIELD FW_CONFIG_OPTION FW_CONFIG_PROBE %% -devtree: { cur_parent = root_parent; } chip; +devtree: { cur_parent = root_parent; } | devtree chip | devtree fw_config_table;
chipchildren: chipchildren device | chipchildren chip | chipchildren registers | /* empty */ ;
-devicechildren: devicechildren device | devicechildren chip | devicechildren resource | devicechildren subsystemid | devicechildren ioapic_irq | devicechildren smbios_slot_desc | devicechildren registers | /* empty */ ; +devicechildren: devicechildren device | devicechildren chip | devicechildren resource | devicechildren subsystemid | devicechildren ioapic_irq | devicechildren smbios_slot_desc | devicechildren registers | devicechildren fw_config_probe | /* empty */ ;
chip: CHIP STRING /* == path */ { $<chip_instance>$ = new_chip_instance($<string>2); @@ -69,4 +70,20 @@ smbios_slot_desc: SLOT_DESC STRING STRING { add_slot_desc(cur_parent, $<string>2, $<string>3, NULL, NULL); };
+fw_config_table: FW_CONFIG_TABLE fw_config_table_children END { }; + +fw_config_table_children: fw_config_table_children fw_config_field | /* empty */ ; + +fw_config_field_children: fw_config_field_children fw_config_option | /* empty */ ; + +fw_config_field: FW_CONFIG_FIELD STRING NUMBER /* == start bit */ NUMBER /* == end bit */ { + cur_field = new_fw_config_field($<string>2, strtoul($<string>3, NULL, 0), strtoul($<string>4, NULL, 0)); +} + fw_config_field_children END { }; + +fw_config_option: FW_CONFIG_OPTION STRING NUMBER /* == field value */ + { add_fw_config_option(cur_field, $<string>2, strtoul($<string>3, NULL, 0)); }; + +fw_config_probe: FW_CONFIG_PROBE STRING /* == field */ STRING /* == option */ + { add_fw_config_probe(cur_parent, $<string>2, $<string>3); } %%
Julius Werner has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41440 )
Change subject: sconfig: Add support for firmware configuration ......................................................................
Patch Set 1:
(7 comments)
Thanks, I think this approach is a lot better!
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/main.c File util/sconfig/main.c:
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/main.c@336 PS1, Line 336: strncasecmp I don't think you want to make these case insensitive. The macro names are gonna be case sensitive, so if people start mixing up the case things are probably going to break at one point anyway. Better to catch it early.
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/main.c@372 PS1, Line 372: nit: maybe sanity-check bits (start <= end, end < 32)?
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/main.c@373 PS1, Line 373: if (!field) { Shouldn't this be a fatal error if field already exists (not just silently ignore)?
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/main.c@392 PS1, Line 392: option = option->next; nit: might also want to check that option name doesn't exist yet while doing this
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/main.c@394 PS1, Line 394: } nit: should probably sanity check add->value < 1 << field->end_bit
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/sconfig.y File util/sconfig/sconfig.y:
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/sconfig.y@79 PS1, Line 79: NUMBER nit: could consider making the second number optional for single-bit fields?
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/sconfig.y@85 PS1, Line 85: strtoul($<string>3, nit: off-topic, but I'm not sure why we're using strto(u)l for all the numbers in here. According to my (limited) understanding of yacc, it should be possible to just say $<number>3 here (and that would fail visibly for wrong tokens, whereas strtoul() just returns 0 on parsing errors).
Duncan Laurie has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41440 )
Change subject: sconfig: Add support for firmware configuration ......................................................................
Patch Set 1:
(7 comments)
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/main.c File util/sconfig/main.c:
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/main.c@336 PS1, Line 336: strncasecmp
I don't think you want to make these case insensitive. […]
Ack
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/main.c@372 PS1, Line 372:
nit: maybe sanity-check bits (start <= end, end < 32)?
Ack
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/main.c@373 PS1, Line 373: if (!field) {
Shouldn't this be a fatal error if field already exists (not just silently ignore)?
This is what lets a variant add options to an existing field in overridetree.cb
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/main.c@392 PS1, Line 392: option = option->next;
nit: might also want to check that option name doesn't exist yet while doing this
meta question: Do we want to let a variant override an option? (rather than just add options to existing fields like above)
What I have here doesn't really do that either so I need to add checks either way.
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/main.c@394 PS1, Line 394: }
nit: should probably sanity check add->value < 1 << field->end_bit
Ack
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/sconfig.y File util/sconfig/sconfig.y:
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/sconfig.y@79 PS1, Line 79: NUMBER
nit: could consider making the second number optional for single-bit fields?
I was wondering how to do that but it looks like I can just add another entry here without the second number and it should work.
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/sconfig.y@85 PS1, Line 85: strtoul($<string>3,
nit: off-topic, but I'm not sure why we're using strto(u)l for all the numbers in here. […]
I actually started with $<number> here and ran into issues before realizing that everything else was converting a string. Let me dig up what the issue was.
Duncan Laurie has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41440 )
Change subject: sconfig: Add support for firmware configuration ......................................................................
Patch Set 1:
(2 comments)
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/main.c File util/sconfig/main.c:
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/main.c@373 PS1, Line 373: if (!field) {
This is what lets a variant add options to an existing field in overridetree. […]
I'm going to split this and support 3 different types of 'field'
field <start> <end> [option...] end field <bit> [option...] end // single-bit field field [option...] end // when adding options to a field
This way when a field is defined with bits it has to be a new field, and when a variant wants to add options to a field it doesn't need to supply the bits and the field must already exist.
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/main.c@392 PS1, Line 392: option = option->next;
meta question: Do we want to let a variant override an option? (rather than just add options to exi […]
After thinking about it I'm going to say that we don't want to allow this for now and I'll make the code throw an error it it is attempted. There should be sufficient flexibility with adding new fields and options that this should not be required.
Hello build bot (Jenkins), Patrick Georgi, Martin Roth,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/41440
to look at the new patch set (#2).
Change subject: sconfig: Add support for firmware configuration ......................................................................
sconfig: Add support for firmware configuration
This change adds support to sconfig for generating the firmware configuration field and option definitions in devicetree.cb.
In addition these fields and options can be used to probe for a device and have that device be disabled if it is not found at boot time.
New tokens: fw_config: top level token, table can be defined before chips field: define field in the mask with the start and end bits option: define option in a field with the value of the field probe: indicate that a device should probe by field and option
Example: fw_config field FEATURE 0 0 option DISABLE 0 option ENABLE 1 end end chip drivers/generic/feature device generic 0 on probe FEATURE ENABLE end end
Variants can add new fields and add new options to existing fields in overridetree.cb but cannot redefine an existing option.
Devices can have multiple probe tokens, and the device will be considered to be found if any of them return true.
The output from defining this field are:
1) the various fields and options will be added as macro constants to static.h and can be used by fw_config for probing. 2) the probe entries will result in a list of fields/options to probe that is added to the resulting struct device and handled by coreboot.
BUG=b:147462631
Signed-off-by: Duncan Laurie dlaurie@google.com Change-Id: I8aea63e577d933aea09e0d0b09470929cc96e0de --- M util/sconfig/lex.yy.c_shipped M util/sconfig/main.c M util/sconfig/sconfig.h M util/sconfig/sconfig.l M util/sconfig/sconfig.tab.c_shipped M util/sconfig/sconfig.tab.h_shipped M util/sconfig/sconfig.y 7 files changed, 687 insertions(+), 246 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/40/41440/2
Duncan Laurie has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41440 )
Change subject: sconfig: Add support for firmware configuration ......................................................................
Patch Set 2:
(1 comment)
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/sconfig.y File util/sconfig/sconfig.y:
https://review.coreboot.org/c/coreboot/+/41440/1/util/sconfig/sconfig.y@85 PS1, Line 85: strtoul($<string>3,
I actually started with $<number> here and ran into issues before realizing that everything else was […]
It complains about type mismatches and I tried to untangle but it ended up touching a lot more code so I'm leaving it alone for now.
Julius Werner has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41440 )
Change subject: sconfig: Add support for firmware configuration ......................................................................
Patch Set 5:
(3 comments)
https://review.coreboot.org/c/coreboot/+/41440/5/util/sconfig/main.c File util/sconfig/main.c:
https://review.coreboot.org/c/coreboot/+/41440/5/util/sconfig/main.c@336 PS5, Line 336: if (!strncmp(option->name, name, strlen(name))) In fact, these too are odd (see below) and finding anything that matches the prefix 'name'. Why not just strcmp()?
https://review.coreboot.org/c/coreboot/+/41440/5/util/sconfig/main.c@401 PS5, Line 401: && field->name I don't think it's possible for field->name to be NULL here?
https://review.coreboot.org/c/coreboot/+/41440/5/util/sconfig/main.c@451 PS5, Line 451: use length of new name to allow existing as prefix Effectively this just means you're forbidding the new name from being a prefix of any existing one. Is that intentional? I think we just care about the full name being unique so I think you should just want a plain old strcmp() here?
Duncan Laurie has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41440 )
Change subject: sconfig: Add support for firmware configuration ......................................................................
Patch Set 5:
(3 comments)
https://review.coreboot.org/c/coreboot/+/41440/5/util/sconfig/main.c File util/sconfig/main.c:
https://review.coreboot.org/c/coreboot/+/41440/5/util/sconfig/main.c@336 PS5, Line 336: if (!strncmp(option->name, name, strlen(name)))
In fact, these too are odd (see below) and finding anything that matches the prefix 'name'. […]
Done
https://review.coreboot.org/c/coreboot/+/41440/5/util/sconfig/main.c@401 PS5, Line 401: && field->name
I don't think it's possible for field->name to be NULL here?
Done
https://review.coreboot.org/c/coreboot/+/41440/5/util/sconfig/main.c@451 PS5, Line 451: use length of new name to allow existing as prefix
Effectively this just means you're forbidding the new name from being a prefix of any existing one. […]
Done
Hello build bot (Jenkins), Patrick Georgi, Martin Roth,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/41440
to look at the new patch set (#6).
Change subject: sconfig: Add support for firmware configuration ......................................................................
sconfig: Add support for firmware configuration
This change adds support to sconfig for generating the firmware configuration field and option definitions in devicetree.cb.
In addition these fields and options can be used to probe for a device and have that device be disabled if it is not found at boot time.
New tokens: fw_config: top level token, table can be defined before chips field: define field in the mask with the start and end bits option: define option in a field with the value of the field probe: indicate that a device should probe by field and option
Example: fw_config field FEATURE 0 0 option DISABLE 0 option ENABLE 1 end end chip drivers/generic/feature device generic 0 on probe FEATURE ENABLE end end
Variants can add new fields and add new options to existing fields in overridetree.cb but cannot redefine an existing option.
Devices can have multiple probe tokens, and the device will be considered to be found if any of them return true.
The output from defining this field are:
1) the various fields and options will be added as macro constants to static.h and can be used by fw_config for probing. 2) the probe entries will result in a list of fields/options to probe that is added to the resulting struct device and handled by coreboot.
BUG=b:147462631
Signed-off-by: Duncan Laurie dlaurie@google.com Change-Id: I8aea63e577d933aea09e0d0b09470929cc96e0de --- M util/sconfig/lex.yy.c_shipped M util/sconfig/main.c M util/sconfig/sconfig.h M util/sconfig/sconfig.l M util/sconfig/sconfig.tab.c_shipped M util/sconfig/sconfig.tab.h_shipped M util/sconfig/sconfig.y 7 files changed, 685 insertions(+), 246 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/40/41440/6
Julius Werner has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41440 )
Change subject: sconfig: Add support for firmware configuration ......................................................................
Patch Set 6: Code-Review+2
Furquan Shaikh has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41440 )
Change subject: sconfig: Add support for firmware configuration ......................................................................
Patch Set 14:
(3 comments)
https://review.coreboot.org/c/coreboot/+/41440/14/util/sconfig/main.c File util/sconfig/main.c:
https://review.coreboot.org/c/coreboot/+/41440/14/util/sconfig/main.c@557 PS14, Line 557: field = find_fw_config_field(probe->field); : if (!field) { : printf("ERROR: fw_config_probe field %s not found\n", probe->field); : exit(1); : } : option = find_fw_config_option(field, probe->option); : if (!option) { : printf("ERROR: fw_config_probe field %s option %s not found\n", : probe->field, probe->option); : exit(1); : } Should these be done in add_fw_config_probe() instead so that we don't exit() with file opened?
https://review.coreboot.org/c/coreboot/+/41440/14/util/sconfig/main.c@1495 PS14, Line 1495: I think we will need something here(like update_fw_config_probe) to copy the probe properties of a device in override tree to the equivalent device in base tree. This would be for a condition where device exists in both base tree and override tree and the device in override tree contains additional probe properties.
https://review.coreboot.org/c/coreboot/+/41440/14/util/sconfig/sconfig.h File util/sconfig/sconfig.h:
https://review.coreboot.org/c/coreboot/+/41440/14/util/sconfig/sconfig.h@11 PS14, Line 11: nit: extra blank line not required.
Duncan Laurie has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41440 )
Change subject: sconfig: Add support for firmware configuration ......................................................................
Patch Set 14:
(2 comments)
https://review.coreboot.org/c/coreboot/+/41440/14/util/sconfig/main.c File util/sconfig/main.c:
https://review.coreboot.org/c/coreboot/+/41440/14/util/sconfig/main.c@557 PS14, Line 557: field = find_fw_config_field(probe->field); : if (!field) { : printf("ERROR: fw_config_probe field %s not found\n", probe->field); : exit(1); : } : option = find_fw_config_option(field, probe->option); : if (!option) { : printf("ERROR: fw_config_probe field %s option %s not found\n", : probe->field, probe->option); : exit(1); : }
Should these be done in add_fw_config_probe() instead so that we don't exit() with file opened?
I think I would need to do it in another pass after everything has been processed so that override options get checked too.
I can at least close autohead/autogen before exit.
https://review.coreboot.org/c/coreboot/+/41440/14/util/sconfig/main.c@1495 PS14, Line 1495:
I think we will need something here(like update_fw_config_probe) to copy the probe properties of a d […]
I did this intentionally because this allows an override to remove all the probe entries and/or define it's own. Otherwise there is no way for an override device to remove a probe from the list.
I can change it if you think that this isn't something we need to accommodate. I should update the doc either way so it is clear how overrides work for probing...
Duncan Laurie has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41440 )
Change subject: sconfig: Add support for firmware configuration ......................................................................
Patch Set 14:
(2 comments)
https://review.coreboot.org/c/coreboot/+/41440/14/util/sconfig/main.c File util/sconfig/main.c:
https://review.coreboot.org/c/coreboot/+/41440/14/util/sconfig/main.c@1495 PS14, Line 1495:
I did this intentionally because this allows an override to remove all the probe entries and/or defi […]
The downside is that an override has to keep that in mind and define the probe list every time it wants to override a device for anything, which is not great either..
https://review.coreboot.org/c/coreboot/+/41440/14/util/sconfig/sconfig.h File util/sconfig/sconfig.h:
https://review.coreboot.org/c/coreboot/+/41440/14/util/sconfig/sconfig.h@11 PS14, Line 11:
nit: extra blank line not required.
Done
Furquan Shaikh has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41440 )
Change subject: sconfig: Add support for firmware configuration ......................................................................
Patch Set 14:
(2 comments)
https://review.coreboot.org/c/coreboot/+/41440/14/util/sconfig/main.c File util/sconfig/main.c:
https://review.coreboot.org/c/coreboot/+/41440/14/util/sconfig/main.c@557 PS14, Line 557: field = find_fw_config_field(probe->field); : if (!field) { : printf("ERROR: fw_config_probe field %s not found\n", probe->field); : exit(1); : } : option = find_fw_config_option(field, probe->option); : if (!option) { : printf("ERROR: fw_config_probe field %s option %s not found\n", : probe->field, probe->option); : exit(1); : }
I think I would need to do it in another pass after everything has been processed so that override options get checked too.
That's right.
I can at least close autohead/autogen before exit.
Sounds good.
https://review.coreboot.org/c/coreboot/+/41440/14/util/sconfig/main.c@1495 PS14, Line 1495:
I did this intentionally because this allows an override to remove all the probe entries and/or define it's own.
You would still need something like this to update the probe list for device in base tree: base_dev->probe = override_dev->probe;
Otherwise there is no way for an override device to remove a probe from the list.
I can change it if you think that this isn't something we need to accommodate. I should update the doc either way so it is clear how overrides work for probing...
I think it is fine to override all the probe properties provided by the device in the override tree. Good idea about updating the doc since it would be helpful as probe properties start getting used.
The downside is that an override has to keep that in mind and define the probe list every time it wants to override a device for anything, which is not great either..
That is right. It is slightly different than how we handle registers, but I think probe properties would mostly be used in override trees. So, it should be okay to have the probe properties be completely removed from base and use the ones provided by override.
Duncan Laurie has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41440 )
Change subject: sconfig: Add support for firmware configuration ......................................................................
Patch Set 14:
(1 comment)
https://review.coreboot.org/c/coreboot/+/41440/14/util/sconfig/main.c File util/sconfig/main.c:
https://review.coreboot.org/c/coreboot/+/41440/14/util/sconfig/main.c@1495 PS14, Line 1495:
I did this intentionally because this allows an override to remove all the probe entries and/or de […]
Ah you are right, it does need to do something in there to assign the override probe to the base device. I'll fix that and update the docs.
Hello build bot (Jenkins), Patrick Georgi, Martin Roth, Julius Werner,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/41440
to look at the new patch set (#15).
Change subject: sconfig: Add support for firmware configuration ......................................................................
sconfig: Add support for firmware configuration
This change adds support to sconfig for generating the firmware configuration field and option definitions in devicetree.cb.
In addition these fields and options can be used to probe for a device and have that device be disabled if it is not found at boot time.
New tokens: fw_config: top level token, table can be defined before chips field: define field in the mask with the start and end bits option: define option in a field with the value of the field probe: indicate that a device should probe by field and option
Example: fw_config field FEATURE 0 0 option DISABLE 0 option ENABLE 1 end end chip drivers/generic/feature device generic 0 on probe FEATURE ENABLE end end
Variants can add new fields and add new options to existing fields in overridetree.cb but cannot redefine an existing option.
Devices can have multiple probe tokens, and the device will be considered to be found if any of them return true.
The output from defining this field are:
1) the various fields and options will be added as macro constants to static.h and can be used by fw_config for probing. 2) the probe entries will result in a list of fields/options to probe that is added to the resulting struct device and handled by coreboot.
BUG=b:147462631
Signed-off-by: Duncan Laurie dlaurie@google.com Change-Id: I8aea63e577d933aea09e0d0b09470929cc96e0de --- M util/sconfig/lex.yy.c_shipped M util/sconfig/main.c M util/sconfig/sconfig.h M util/sconfig/sconfig.l M util/sconfig/sconfig.tab.c_shipped M util/sconfig/sconfig.tab.h_shipped M util/sconfig/sconfig.y 7 files changed, 695 insertions(+), 246 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/40/41440/15
Furquan Shaikh has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41440 )
Change subject: sconfig: Add support for firmware configuration ......................................................................
Patch Set 16: Code-Review+2
Hello build bot (Jenkins), Furquan Shaikh, Patrick Georgi, Martin Roth, Julius Werner,
I'd like you to reexamine a change. Please visit
https://review.coreboot.org/c/coreboot/+/41440
to look at the new patch set (#17).
Change subject: sconfig: Add support for firmware configuration ......................................................................
sconfig: Add support for firmware configuration
This change adds support to sconfig for generating the firmware configuration field and option definitions in devicetree.cb.
In addition these fields and options can be used to probe for a device and have that device be disabled if it is not found at boot time.
New tokens: fw_config: top level token, table can be defined before chips field: define field in the mask with the start and end bits option: define option in a field with the value of the field probe: indicate that a device should probe by field and option
Example: fw_config field FEATURE 0 0 option DISABLE 0 option ENABLE 1 end end chip drivers/generic/feature device generic 0 on probe FEATURE ENABLE end end
Variants can add new fields and add new options to existing fields in overridetree.cb but cannot redefine an existing option.
Devices can have multiple probe tokens, and the device will be considered to be found if any of them return true.
The output from defining this field are:
1) the various fields and options will be added as macro constants to static.h and can be used by fw_config for probing. 2) the probe entries will result in a list of fields/options to probe that is added to the resulting struct device and handled by coreboot.
BUG=b:147462631
Signed-off-by: Duncan Laurie dlaurie@google.com Change-Id: I8aea63e577d933aea09e0d0b09470929cc96e0de --- M util/sconfig/lex.yy.c_shipped M util/sconfig/main.c M util/sconfig/sconfig.h M util/sconfig/sconfig.l M util/sconfig/sconfig.tab.c_shipped M util/sconfig/sconfig.tab.h_shipped M util/sconfig/sconfig.y 7 files changed, 694 insertions(+), 246 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/40/41440/17
Furquan Shaikh has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41440 )
Change subject: sconfig: Add support for firmware configuration ......................................................................
Patch Set 17: Code-Review+2
Duncan Laurie has submitted this change. ( https://review.coreboot.org/c/coreboot/+/41440 )
Change subject: sconfig: Add support for firmware configuration ......................................................................
sconfig: Add support for firmware configuration
This change adds support to sconfig for generating the firmware configuration field and option definitions in devicetree.cb.
In addition these fields and options can be used to probe for a device and have that device be disabled if it is not found at boot time.
New tokens: fw_config: top level token, table can be defined before chips field: define field in the mask with the start and end bits option: define option in a field with the value of the field probe: indicate that a device should probe by field and option
Example: fw_config field FEATURE 0 0 option DISABLE 0 option ENABLE 1 end end chip drivers/generic/feature device generic 0 on probe FEATURE ENABLE end end
Variants can add new fields and add new options to existing fields in overridetree.cb but cannot redefine an existing option.
Devices can have multiple probe tokens, and the device will be considered to be found if any of them return true.
The output from defining this field are:
1) the various fields and options will be added as macro constants to static.h and can be used by fw_config for probing. 2) the probe entries will result in a list of fields/options to probe that is added to the resulting struct device and handled by coreboot.
BUG=b:147462631
Signed-off-by: Duncan Laurie dlaurie@google.com Change-Id: I8aea63e577d933aea09e0d0b09470929cc96e0de Reviewed-on: https://review.coreboot.org/c/coreboot/+/41440 Tested-by: build bot (Jenkins) no-reply@coreboot.org Reviewed-by: Furquan Shaikh furquan@google.com --- M util/sconfig/lex.yy.c_shipped M util/sconfig/main.c M util/sconfig/sconfig.h M util/sconfig/sconfig.l M util/sconfig/sconfig.tab.c_shipped M util/sconfig/sconfig.tab.h_shipped M util/sconfig/sconfig.y 7 files changed, 694 insertions(+), 246 deletions(-)
Approvals: build bot (Jenkins): Verified Furquan Shaikh: Looks good to me, approved
diff --git a/util/sconfig/lex.yy.c_shipped b/util/sconfig/lex.yy.c_shipped index 61928e6..998505e 100644 --- a/util/sconfig/lex.yy.c_shipped +++ b/util/sconfig/lex.yy.c_shipped @@ -349,8 +349,8 @@ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 41 -#define YY_END_OF_BUFFER 42 +#define YY_NUM_RULES 45 +#define YY_END_OF_BUFFER 46 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -358,27 +358,30 @@ flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[173] = +static const flex_int16_t yy_accept[195] = { 0, - 0, 0, 42, 40, 1, 3, 40, 40, 40, 35, - 35, 33, 36, 40, 36, 36, 36, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 1, 3, - 40, 0, 40, 40, 0, 2, 35, 36, 40, 40, - 40, 40, 36, 40, 40, 40, 40, 40, 40, 40, - 40, 27, 40, 40, 40, 40, 40, 40, 7, 40, - 40, 40, 40, 40, 40, 40, 39, 39, 40, 0, - 34, 40, 40, 17, 40, 40, 26, 31, 40, 40, - 40, 14, 40, 40, 25, 40, 23, 40, 40, 8, - 11, 13, 40, 40, 21, 40, 22, 40, 0, 37, + 0, 0, 46, 44, 1, 3, 44, 44, 44, 39, + 39, 37, 40, 44, 40, 40, 40, 40, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 1, + 3, 44, 0, 44, 44, 0, 2, 39, 40, 44, + 44, 44, 44, 40, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 31, 44, 44, 44, 44, 44, + 44, 11, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 43, 43, 44, 0, 38, 44, 44, 21, 44, + 44, 30, 35, 44, 44, 44, 44, 44, 18, 44, + 44, 29, 44, 27, 44, 44, 12, 44, 15, 17,
- 4, 40, 40, 40, 24, 40, 40, 40, 40, 40, - 40, 20, 40, 40, 40, 38, 38, 40, 40, 40, - 40, 40, 40, 40, 15, 40, 40, 40, 40, 40, - 5, 18, 40, 9, 40, 12, 40, 40, 40, 40, - 40, 19, 29, 40, 40, 40, 40, 40, 40, 40, - 40, 6, 40, 40, 40, 40, 10, 40, 40, 40, - 28, 40, 40, 16, 40, 30, 40, 40, 40, 40, - 32, 0 + 44, 44, 44, 25, 44, 26, 44, 0, 41, 4, + 44, 44, 44, 28, 44, 44, 44, 44, 44, 44, + 44, 44, 24, 44, 44, 44, 44, 44, 42, 42, + 44, 44, 44, 8, 44, 44, 44, 44, 44, 19, + 44, 44, 10, 44, 44, 44, 44, 5, 22, 44, + 44, 13, 44, 16, 44, 9, 44, 44, 44, 44, + 44, 23, 33, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 6, 44, 44, 44, 7, 44, 14, 44, + 44, 44, 32, 44, 44, 20, 44, 34, 44, 44, + 44, 44, 36, 0 + } ;
static const YY_CHAR yy_ec[256] = @@ -395,8 +398,8 @@ 1, 1, 1, 1, 16, 1, 17, 18, 19, 20,
21, 22, 23, 24, 25, 1, 1, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 1, 37, - 38, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 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, 1, @@ -413,126 +416,142 @@ 1, 1, 1, 1, 1 } ;
-static const YY_CHAR yy_meta[39] = +static const YY_CHAR yy_meta[40] = { 0, 1, 2, 2, 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, 1, 1, 1, 1, 1, 1 } ;
-static const flex_int16_t yy_base[180] = +static const flex_int16_t yy_base[202] = { 0, - 0, 0, 240, 0, 237, 241, 235, 37, 41, 38, - 200, 0, 44, 222, 54, 78, 60, 214, 209, 45, - 49, 48, 42, 52, 212, 62, 199, 0, 229, 241, - 93, 225, 98, 79, 226, 241, 0, 97, 104, 213, - 202, 191, 110, 198, 193, 203, 192, 193, 200, 200, - 194, 200, 185, 185, 195, 185, 187, 189, 0, 185, - 179, 185, 189, 181, 187, 186, 0, 241, 125, 198, - 0, 191, 171, 184, 174, 181, 0, 0, 172, 175, - 175, 0, 173, 163, 0, 167, 0, 171, 161, 0, - 0, 0, 164, 163, 0, 154, 0, 181, 180, 0, + 0, 0, 265, 0, 262, 266, 260, 38, 42, 39, + 224, 0, 45, 247, 55, 79, 61, 58, 239, 234, + 46, 54, 55, 68, 73, 237, 46, 224, 0, 254, + 266, 101, 250, 107, 111, 251, 266, 0, 108, 111, + 238, 227, 216, 117, 223, 218, 228, 217, 225, 229, + 216, 223, 223, 217, 223, 208, 208, 218, 208, 210, + 212, 0, 199, 207, 201, 201, 206, 210, 202, 208, + 207, 0, 266, 132, 219, 0, 212, 192, 205, 195, + 202, 0, 0, 193, 191, 197, 194, 194, 0, 192, + 182, 0, 186, 0, 190, 180, 0, 183, 0, 0,
- 0, 165, 164, 157, 0, 149, 159, 147, 153, 158, - 159, 0, 142, 145, 135, 0, 241, 146, 150, 142, - 144, 140, 142, 147, 0, 131, 130, 130, 129, 126, - 0, 0, 141, 0, 125, 129, 115, 122, 126, 107, - 107, 0, 0, 114, 106, 105, 103, 114, 100, 101, - 94, 0, 105, 102, 99, 83, 0, 80, 83, 70, - 0, 60, 71, 0, 74, 0, 63, 55, 39, 29, - 0, 241, 40, 146, 148, 150, 152, 154, 156 + 189, 181, 180, 0, 171, 0, 198, 197, 0, 0, + 182, 181, 174, 0, 178, 168, 164, 174, 162, 168, + 173, 174, 0, 161, 168, 155, 158, 147, 0, 266, + 159, 163, 155, 0, 154, 156, 152, 154, 159, 0, + 143, 148, 0, 141, 141, 140, 137, 0, 0, 149, + 151, 0, 135, 152, 138, 0, 145, 136, 117, 117, + 124, 0, 0, 123, 115, 114, 112, 123, 109, 119, + 109, 101, 0, 113, 111, 115, 0, 96, 0, 92, + 82, 70, 0, 65, 77, 0, 77, 0, 71, 59, + 44, 30, 0, 266, 41, 153, 155, 157, 159, 161, + + 163 } ;
-static const flex_int16_t yy_def[180] = +static const flex_int16_t yy_def[202] = { 0, - 172, 1, 172, 173, 172, 172, 173, 174, 175, 173, - 10, 173, 10, 173, 10, 10, 10, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 172, 172, - 174, 176, 177, 175, 178, 172, 10, 10, 10, 173, - 173, 173, 10, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 172, 177, 179, - 39, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 172, 173, + 194, 1, 194, 195, 194, 194, 195, 196, 197, 195, + 10, 195, 10, 195, 10, 10, 10, 10, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 194, + 194, 196, 198, 199, 197, 200, 194, 10, 10, 10, + 195, 195, 195, 10, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 194, 199, 201, 40, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
- 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 172, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 0, 172, 172, 172, 172, 172, 172, 172 + 195, 195, 195, 195, 195, 195, 195, 194, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 194, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 0, 194, 194, 194, 194, 194, 194, + + 194 } ;
-static const flex_int16_t yy_nxt[280] = +static const flex_int16_t yy_nxt[306] = { 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, 171, 38, 38, - 38, 38, 38, 50, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 58, 56, 54, 38, 38, 38, 59, - 60, 170, 51, 52, 57, 169, 53, 41, 55, 61, - 35, 36, 168, 42, 38, 38, 38, 46, 63, 167, - 166, 64, 47, 165, 32, 32, 65, 67, 43, 70, + 17, 18, 19, 20, 21, 22, 23, 4, 24, 25, + 4, 26, 27, 4, 28, 4, 4, 4, 4, 33, + 33, 29, 34, 36, 37, 38, 38, 38, 193, 39, + 39, 39, 39, 39, 53, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 57, 59, 68, 54, 55, 69, 192, 56, 42, 191, + 70, 60, 49, 58, 43, 39, 39, 39, 47, 61, + 190, 64, 189, 48, 50, 62, 188, 63, 187, 44,
- 70, 164, 28, 38, 38, 38, 44, 163, 162, 45, - 71, 71, 71, 161, 71, 71, 38, 38, 38, 160, - 71, 71, 71, 71, 71, 71, 70, 70, 159, 98, - 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, - 148, 147, 146, 145, 144, 75, 31, 31, 34, 34, - 32, 32, 69, 69, 35, 35, 70, 70, 143, 142, + 65, 186, 33, 33, 66, 72, 185, 45, 75, 75, + 46, 29, 36, 37, 39, 39, 39, 76, 76, 76, + 184, 76, 76, 39, 39, 39, 183, 76, 76, 76, + 76, 76, 76, 75, 75, 182, 107, 181, 180, 179, + 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, + 168, 167, 80, 32, 32, 35, 35, 33, 33, 74, + 74, 36, 36, 75, 75, 166, 165, 164, 163, 162, + 161, 160, 159, 158, 157, 156, 155, 154, 153, 152, + 151, 150, 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, 97, 96, 95, 94, 93, 92, 91, + 111, 110, 109, 108, 106, 105, 104, 103, 102, 101, + 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, - 80, 79, 78, 77, 76, 74, 73, 72, 36, 68, - 29, 66, 62, 49, 48, 40, 39, 30, 29, 172, - 3, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172 + 79, 78, 77, 37, 73, 30, 71, 67, 52, 51, + 41, 40, 31, 30, 194, 3, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + + 194, 194, 194, 194, 194 } ;
-static const flex_int16_t yy_chk[280] = +static const flex_int16_t yy_chk[306] = { 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, - 173, 8, 9, 9, 10, 10, 10, 170, 10, 10, - 13, 13, 13, 20, 10, 10, 10, 10, 10, 10, - 15, 15, 15, 23, 22, 21, 17, 17, 17, 23, - 24, 169, 20, 20, 22, 168, 20, 15, 21, 24, - 34, 34, 167, 15, 16, 16, 16, 17, 26, 165, - 163, 26, 17, 162, 31, 31, 26, 31, 16, 33, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, + 8, 195, 8, 9, 9, 10, 10, 10, 192, 10, + 10, 13, 13, 13, 21, 10, 10, 10, 10, 10, + 10, 15, 15, 15, 18, 18, 18, 17, 17, 17, + 22, 23, 27, 21, 21, 27, 191, 21, 15, 190, + 27, 23, 18, 22, 15, 16, 16, 16, 17, 24, + 189, 25, 187, 17, 18, 24, 185, 24, 184, 16,
- 33, 160, 33, 38, 38, 38, 16, 159, 158, 16, - 39, 39, 39, 156, 39, 39, 43, 43, 43, 155, - 39, 39, 39, 39, 39, 39, 69, 69, 154, 69, - 153, 151, 150, 149, 148, 147, 146, 145, 144, 141, - 140, 139, 138, 137, 136, 43, 174, 174, 175, 175, - 176, 176, 177, 177, 178, 178, 179, 179, 135, 133, - 130, 129, 128, 127, 126, 124, 123, 122, 121, 120, - 119, 118, 115, 114, 113, 111, 110, 109, 108, 107, - 106, 104, 103, 102, 99, 98, 96, 94, 93, 89, - 88, 86, 84, 83, 81, 80, 79, 76, 75, 74, + 25, 182, 32, 32, 25, 32, 181, 16, 34, 34, + 16, 34, 35, 35, 39, 39, 39, 40, 40, 40, + 180, 40, 40, 44, 44, 44, 178, 40, 40, 40, + 40, 40, 40, 74, 74, 176, 74, 175, 174, 172, + 171, 170, 169, 168, 167, 166, 165, 164, 161, 160, + 159, 158, 44, 196, 196, 197, 197, 198, 198, 199, + 199, 200, 200, 201, 201, 157, 155, 154, 153, 151, + 150, 147, 146, 145, 144, 142, 141, 139, 138, 137, + 136, 135, 133, 132, 131, 128, 127, 126, 125, 124, + 122, 121, 120, 119, 118, 117, 116, 115, 113, 112,
- 73, 72, 70, 66, 65, 64, 63, 62, 61, 60, - 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, - 48, 47, 46, 45, 44, 42, 41, 40, 35, 32, - 29, 27, 25, 19, 18, 14, 11, 7, 5, 3, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172 + 111, 108, 107, 105, 103, 102, 101, 98, 96, 95, + 93, 91, 90, 88, 87, 86, 85, 84, 81, 80, + 79, 78, 77, 75, 71, 70, 69, 68, 67, 66, + 65, 64, 63, 61, 60, 59, 58, 57, 56, 55, + 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, + 43, 42, 41, 36, 33, 30, 28, 26, 20, 19, + 14, 11, 7, 5, 3, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + + 194, 194, 194, 194, 194 } ;
static yy_state_type yy_last_accepting_state; @@ -549,21 +568,8 @@ #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; -/* - * sconfig, coreboot device tree compiler - * - * Copyright (C) 2010 coresystems GmbH - * written by Patrick Georgi patrick@georgi-clan.de - * - * 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 - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ +/* sconfig, coreboot device tree compiler */ +/* SPDX-License-Identifier: GPL-2.0-only */
#include "sconfig.tab.h"
@@ -810,13 +816,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 >= 173 ) + if ( yy_current_state >= 195 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 241 ); + while ( yy_base[yy_current_state] != 266 );
yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -868,144 +874,160 @@ YY_BREAK case 7: YY_RULE_SETUP -{yylval.number=1; return(BOOL);} +{return(FW_CONFIG_TABLE);} YY_BREAK case 8: YY_RULE_SETUP -{yylval.number=0; return(BOOL);} +{return(FW_CONFIG_FIELD);} YY_BREAK case 9: YY_RULE_SETUP -{yylval.number=3; return(STATUS);} +{return(FW_CONFIG_OPTION);} YY_BREAK case 10: YY_RULE_SETUP -{yylval.number=5; return(STATUS);} +{return(FW_CONFIG_PROBE);} YY_BREAK case 11: YY_RULE_SETUP -{yylval.number=PCI; return(BUS);} +{yylval.number=1; return(BOOL);} YY_BREAK case 12: YY_RULE_SETUP -{yylval.number=IOAPIC; return(BUS);} +{yylval.number=0; return(BOOL);} YY_BREAK case 13: YY_RULE_SETUP -{yylval.number=PNP; return(BUS);} +{yylval.number=3; return(STATUS);} YY_BREAK case 14: YY_RULE_SETUP -{yylval.number=I2C; return(BUS);} +{yylval.number=5; return(STATUS);} YY_BREAK case 15: YY_RULE_SETUP -{yylval.number=APIC; return(BUS);} +{yylval.number=PCI; return(BUS);} YY_BREAK case 16: YY_RULE_SETUP -{yylval.number=CPU_CLUSTER; return(BUS);} +{yylval.number=IOAPIC; return(BUS);} YY_BREAK case 17: YY_RULE_SETUP -{yylval.number=CPU; return(BUS);} +{yylval.number=PNP; return(BUS);} YY_BREAK case 18: YY_RULE_SETUP -{yylval.number=DOMAIN; return(BUS);} +{yylval.number=I2C; return(BUS);} YY_BREAK case 19: YY_RULE_SETUP -{yylval.number=GENERIC; return(BUS);} +{yylval.number=APIC; return(BUS);} YY_BREAK case 20: YY_RULE_SETUP -{yylval.number=MMIO; return(BUS);} +{yylval.number=CPU_CLUSTER; return(BUS);} YY_BREAK case 21: YY_RULE_SETUP -{yylval.number=SPI; return(BUS);} +{yylval.number=CPU; return(BUS);} YY_BREAK case 22: YY_RULE_SETUP -{yylval.number=USB; return(BUS);} +{yylval.number=DOMAIN; return(BUS);} YY_BREAK case 23: YY_RULE_SETUP -{yylval.number=LPC; return(BUS);} +{yylval.number=GENERIC; return(BUS);} YY_BREAK case 24: YY_RULE_SETUP -{yylval.number=ESPI; return(BUS);} +{yylval.number=MMIO; return(BUS);} YY_BREAK case 25: YY_RULE_SETUP -{yylval.number=IRQ; return(RESOURCE);} +{yylval.number=SPI; return(BUS);} YY_BREAK case 26: YY_RULE_SETUP -{yylval.number=DRQ; return(RESOURCE);} +{yylval.number=USB; return(BUS);} YY_BREAK case 27: YY_RULE_SETUP -{yylval.number=IO; return(RESOURCE);} +{yylval.number=LPC; return(BUS);} YY_BREAK case 28: YY_RULE_SETUP -{return(IOAPIC_IRQ);} +{yylval.number=ESPI; return(BUS);} YY_BREAK case 29: YY_RULE_SETUP -{return(INHERIT);} +{yylval.number=IRQ; return(RESOURCE);} YY_BREAK case 30: YY_RULE_SETUP -{return(SUBSYSTEMID);} +{yylval.number=DRQ; return(RESOURCE);} YY_BREAK case 31: YY_RULE_SETUP -{return(END);} +{yylval.number=IO; return(RESOURCE);} YY_BREAK case 32: YY_RULE_SETUP -{return(SLOT_DESC);} +{return(IOAPIC_IRQ);} YY_BREAK case 33: YY_RULE_SETUP -{return(EQUALS);} +{return(INHERIT);} YY_BREAK case 34: YY_RULE_SETUP -{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);} +{return(SUBSYSTEMID);} YY_BREAK case 35: YY_RULE_SETUP -{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);} +{return(END);} YY_BREAK case 36: YY_RULE_SETUP -{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);} +{return(SLOT_DESC);} YY_BREAK case 37: YY_RULE_SETUP -{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(PCIINT);} +{return(EQUALS);} YY_BREAK case 38: -/* rule 38 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(NUMBER);} YY_BREAK case 39: -/* rule 39 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(NUMBER);} YY_BREAK case 40: YY_RULE_SETUP -{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(STRING);} +{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);} YY_BREAK case 41: YY_RULE_SETUP +{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(PCIINT);} + YY_BREAK +case 42: +/* rule 42 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 43: +/* rule 43 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 44: +YY_RULE_SETUP +{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(STRING);} + YY_BREAK +case 45: +YY_RULE_SETUP ECHO; YY_BREAK case YY_STATE_EOF(INITIAL): @@ -1304,7 +1326,7 @@ 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 >= 173 ) + if ( yy_current_state >= 195 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -1332,11 +1354,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 >= 173 ) + if ( yy_current_state >= 195 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 172); + yy_is_jam = (yy_current_state == 194);
return yy_is_jam ? 0 : yy_current_state; } diff --git a/util/sconfig/main.c b/util/sconfig/main.c index 0d8f7f8..6752b61c 100644 --- a/util/sconfig/main.c +++ b/util/sconfig/main.c @@ -5,6 +5,7 @@ /* stat.h needs to be included before commonlib/helpers.h to avoid errors.*/ #include <sys/stat.h> #include <commonlib/helpers.h> +#include <stdint.h> #include "sconfig.h" #include "sconfig.tab.h"
@@ -323,6 +324,266 @@ return instance; }
+/* List of fw_config fields added during parsing. */ +static struct fw_config_field *fw_config_fields; + +static struct fw_config_option *find_fw_config_option(struct fw_config_field *field, + const char *name) +{ + struct fw_config_option *option = field->options; + + while (option && option->name) { + if (!strcmp(option->name, name)) + return option; + option = option->next; + } + return NULL; +} + +static struct fw_config_field *find_fw_config_field(const char *name) +{ + struct fw_config_field *field = fw_config_fields; + + while (field && field->name) { + if (!strcmp(field->name, name)) + return field; + field = field->next; + } + return NULL; +} + +struct fw_config_field *get_fw_config_field(const char *name) +{ + struct fw_config_field *field = find_fw_config_field(name); + + /* Fail if the field does not exist, new fields must be added with a mask. */ + if (!field) { + printf("ERROR: fw_config field not found: %s\n", name); + exit(1); + } + return field; +} + +static void append_fw_config_field(struct fw_config_field *add) +{ + struct fw_config_field *field = fw_config_fields; + + if (!fw_config_fields) { + fw_config_fields = add; + } else { + while (field && field->next) + field = field->next; + field->next = add; + } +} + +struct fw_config_field *new_fw_config_field(const char *name, + unsigned int start_bit, unsigned int end_bit) +{ + struct fw_config_field *field = find_fw_config_field(name); + + /* Check that field is within 32bits. */ + if (start_bit > end_bit || end_bit > 31) { + printf("ERROR: fw_config field %s has invalid range %u-%u\n", name, + start_bit, end_bit); + exit(1); + } + + /* Don't allow re-defining a field, only adding new fields. */ + if (field) { + printf("ERROR: fw_config field %s[%u-%u] already exists with range %u-%u\n", + name, start_bit, end_bit, field->start_bit, field->end_bit); + exit(1); + } + + /* Check for overlap with an existing field. */ + field = fw_config_fields; + while (field) { + /* Check if the mask overlaps. */ + if (start_bit <= field->end_bit && end_bit >= field->start_bit) { + printf("ERROR: fw_config field %s[%u-%u] overlaps %s[%u-%u]\n", + name, start_bit, end_bit, + field->name, field->start_bit, field->end_bit); + exit(1); + } + field = field->next; + } + + field = S_ALLOC(sizeof(*field)); + field->name = name; + field->start_bit = start_bit; + field->end_bit = end_bit; + append_fw_config_field(field); + + return field; +} + +static void append_fw_config_option_to_field(struct fw_config_field *field, + struct fw_config_option *add) +{ + struct fw_config_option *option = field->options; + + if (!option) { + field->options = add; + } else { + while (option && option->next) + option = option->next; + option->next = add; + } +} + +void add_fw_config_option(struct fw_config_field *field, const char *name, unsigned int value) +{ + struct fw_config_option *option; + uint32_t field_max_value; + + /* Check that option value fits within field mask. */ + field_max_value = (1 << (1 + field->end_bit - field->start_bit)) - 1; + if (value > field_max_value) { + printf("ERROR: fw_config option %s:%s value %u larger than field max %u\n", + field->name, name, value, field_max_value); + exit(1); + } + + /* Check for existing option with this name or value. */ + option = field->options; + while (option) { + if (!strcmp(option->name, name)) { + printf("ERROR: fw_config option name %s:%s already exists\n", + field->name, name); + exit(1); + } + /* Compare values. */ + if (value == option->value) { + printf("ERROR: fw_config option %s:%s[%u] redefined as %s\n", + field->name, option->name, value, name); + exit(1); + } + option = option->next; + } + + option = S_ALLOC(sizeof(*option)); + option->name = name; + option->value = value; + + /* Add option to the current field. */ + append_fw_config_option_to_field(field, option); +} + +static void append_fw_config_probe_to_dev(struct device *dev, struct fw_config_probe *add) +{ + struct fw_config_probe *probe = dev->probe; + + if (!probe) { + dev->probe = add; + } else { + while (probe && probe->next) + probe = probe->next; + probe->next = add; + } +} + +void add_fw_config_probe(struct bus *bus, const char *field, const char *option) +{ + struct fw_config_probe *probe; + + probe = bus->dev->probe; + while (probe) { + if (!strcmp(probe->field, field) && !strcmp(probe->option, option)) { + printf("ERROR: fw_config probe %s:%s already exists\n", field, option); + exit(1); + } + probe = probe->next; + } + + probe = S_ALLOC(sizeof(*probe)); + probe->field = field; + probe->option = option; + + append_fw_config_probe_to_dev(bus->dev, probe); +} + +static void emit_fw_config(FILE *fil) +{ + struct fw_config_field *field = fw_config_fields; + + if (!field) + return; + + fprintf(fil, "\n/* firmware configuration */\n"); + fprintf(fil, "#include <fw_config.h>\n"); + + while (field) { + struct fw_config_option *option = field->options; + uint32_t mask; + + fprintf(fil, "#define FW_CONFIG_FIELD_%s_NAME "%s"\n", + field->name, field->name); + + /* Compute mask from start and end bit. */ + mask = ((1 << (1 + field->end_bit - field->start_bit)) - 1); + mask <<= field->start_bit; + + fprintf(fil, "#define FW_CONFIG_FIELD_%s_MASK 0x%08x\n", + field->name, mask); + + while (option) { + fprintf(fil, "#define FW_CONFIG_FIELD_%s_OPTION_%s_NAME "%s"\n", + field->name, option->name, option->name); + fprintf(fil, "#define FW_CONFIG_FIELD_%s_OPTION_%s_VALUE 0x%08x\n", + field->name, option->name, option->value << field->start_bit); + + option = option->next; + } + + field = field->next; + } + + fprintf(fil, "\n"); +} + +static int emit_fw_config_probe(FILE *fil, struct device *dev) +{ + struct fw_config_probe *probe = dev->probe; + + fprintf(fil, "STORAGE struct fw_config %s_probe_list[] = {\n", dev->name); + + while (probe) { + /* Find matching field. */ + struct fw_config_field *field; + struct fw_config_option *option; + uint32_t mask, value; + + field = find_fw_config_field(probe->field); + if (!field) { + printf("ERROR: fw_config_probe field %s not found\n", probe->field); + return -1; + } + option = find_fw_config_option(field, probe->option); + if (!option) { + printf("ERROR: fw_config_probe field %s option %s not found\n", + probe->field, probe->option); + return -1; + } + + /* Fill out the probe structure with values from emit_fw_config(). */ + fprintf(fil, "\t{\n"); + fprintf(fil, "\t\t.field_name = FW_CONFIG_FIELD_%s_NAME,\n", probe->field); + fprintf(fil, "\t\t.option_name = FW_CONFIG_FIELD_%s_OPTION_%s_NAME,\n", + probe->field, probe->option); + fprintf(fil, "\t\t.mask = FW_CONFIG_FIELD_%s_MASK,\n", probe->field); + fprintf(fil, "\t\t.value = FW_CONFIG_FIELD_%s_OPTION_%s_VALUE,\n", + probe->field, probe->option); + fprintf(fil, "\t},\n"); + + probe = probe->next; + } + + /* Add empty entry to mark end of list. */ + fprintf(fil, "\t{ }\n};\n"); + return 0; +} + /* * Allocate a new bus for the provided device. * - If this is the first bus being allocated under this device, then its id @@ -733,6 +994,13 @@ if (chip_ins->base_chip_instance) chip_ins = chip_ins->base_chip_instance;
+ /* Emit probe structures. */ + if (ptr->probe && (emit_fw_config_probe(fil, ptr) < 0)) { + fclose(head); + fclose(fil); + exit(1); + } + if (ptr == &base_root_dev) fprintf(fil, "DEVTREE_CONST struct device %s = {\n", ptr->name); else @@ -780,6 +1048,8 @@ else fprintf(fil, "\t.sibling = NULL,\n"); fprintf(fil, "#if !DEVTREE_EARLY\n"); + if (ptr->probe) + fprintf(fil, "\t.probe_list = %s_probe_list,\n", ptr->name); for (pin = 0; pin < 4; pin++) { if (ptr->pci_irq_info[pin].ioapic_irq_pin > 0) fprintf(fil, @@ -1220,6 +1490,12 @@ }
/* + * Use probe list from override device in place of base device, in order + * to allow an override to remove a probe from the base device. + */ + base_dev->probe = override_dev->probe; + + /* * Update base_chip_instance member in chip instance of override tree to forward it to * the chip instance in base tree. */ @@ -1343,9 +1619,11 @@ fprintf(autohead, "#ifndef __STATIC_DEVICE_TREE_H\n"); fprintf(autohead, "#define __STATIC_DEVICE_TREE_H\n\n"); fprintf(autohead, "#include <device/device.h>\n\n"); + emit_fw_config(autohead);
fprintf(autogen, "#include <device/device.h>\n"); fprintf(autogen, "#include <device/pci.h>\n\n"); + fprintf(autogen, "#include <static.h>\n");
emit_chips(autogen);
diff --git a/util/sconfig/sconfig.h b/util/sconfig/sconfig.h index a960b7f..1bbff46 100644 --- a/util/sconfig/sconfig.h +++ b/util/sconfig/sconfig.h @@ -28,6 +28,27 @@ int ioapic_dst_id; };
+struct fw_config_option; +struct fw_config_option { + const char *name; + unsigned int value; + struct fw_config_option *next; +}; +struct fw_config_field; +struct fw_config_field { + const char *name; + unsigned int start_bit; + unsigned int end_bit; + struct fw_config_field *next; + struct fw_config_option *options; +}; +struct fw_config_probe; +struct fw_config_probe { + const char *field; + const char *option; + struct fw_config_probe *next; +}; + struct chip; struct chip_instance { /* Monotonically increasing ID for each chip instance. */ @@ -141,6 +162,9 @@
/* SMBIOS slot length */ char *smbios_slot_length; + + /* List of field+option to probe. */ + struct fw_config_probe *probe; };
extern struct bus *root_parent; @@ -171,3 +195,13 @@
struct chip_instance *new_chip_instance(char *path); void add_register(struct chip_instance *chip, char *name, char *val); + +struct fw_config_field *get_fw_config_field(const char *name); + +struct fw_config_field *new_fw_config_field(const char *name, + unsigned int start_bit, unsigned int end_bit); + +void add_fw_config_option(struct fw_config_field *field, const char *name, + unsigned int value); + +void add_fw_config_probe(struct bus *bus, const char *field, const char *option); diff --git a/util/sconfig/sconfig.l b/util/sconfig/sconfig.l index 5ac5057..10a86a2 100755 --- a/util/sconfig/sconfig.l +++ b/util/sconfig/sconfig.l @@ -14,6 +14,10 @@ chip {return(CHIP);} device {return(DEVICE);} register {return(REGISTER);} +fw_config {return(FW_CONFIG_TABLE);} +field {return(FW_CONFIG_FIELD);} +option {return(FW_CONFIG_OPTION);} +probe {return(FW_CONFIG_PROBE);} on {yylval.number=1; return(BOOL);} off {yylval.number=0; return(BOOL);} hidden {yylval.number=3; return(STATUS);} diff --git a/util/sconfig/sconfig.tab.c_shipped b/util/sconfig/sconfig.tab.c_shipped index 2bae43b..c78f1ac 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.5.4. */ +/* A Bison parser, made by GNU Bison 3.5.1. */
/* Bison implementation for Yacc-like parsers in C
@@ -48,7 +48,7 @@ #define YYBISON 1
/* Bison version. */ -#define YYBISON_VERSION "3.5.4" +#define YYBISON_VERSION "3.5.1"
/* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -77,6 +77,7 @@
static struct bus *cur_parent; static struct chip_instance *cur_chip_instance; +static struct fw_config_field *cur_field;
@@ -111,8 +112,8 @@
/* Use api.header.include to #include this header instead of duplicating it here. */ -#ifndef YY_YY_HOME_ME_REPOS_COREBOOTORG_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED -# define YY_YY_HOME_ME_REPOS_COREBOOTORG_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED +#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 @@ -160,7 +161,11 @@ USB = 289, MMIO = 290, LPC = 291, - ESPI = 292 + ESPI = 292, + FW_CONFIG_TABLE = 293, + FW_CONFIG_FIELD = 294, + FW_CONFIG_OPTION = 295, + FW_CONFIG_PROBE = 296 }; #endif
@@ -186,7 +191,7 @@
int yyparse (void);
-#endif /* !YY_YY_HOME_ME_REPOS_COREBOOTORG_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED */ +#endif /* !YY_YY_SRC_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED */
@@ -490,21 +495,21 @@ #endif /* !YYCOPY_NEEDED */
/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 3 +#define YYFINAL 2 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 45 +#define YYLAST 58
/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 38 +#define YYNTOKENS 42 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 15 +#define YYNNTS 23 /* YYNRULES -- Number of rules. */ -#define YYNRULES 29 +#define YYNRULES 44 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 50 +#define YYNSTATES 75
#define YYUNDEFTOK 2 -#define YYMAXUTOK 292 +#define YYMAXUTOK 296
/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM @@ -545,16 +550,18 @@ 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 + 35, 36, 37, 38, 39, 40, 41 };
#if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int8 yyrline[] = { - 0, 36, 36, 36, 38, 38, 38, 38, 40, 40, - 40, 40, 40, 40, 40, 40, 42, 42, 51, 51, - 59, 59, 61, 64, 67, 70, 73, 76, 79, 82 + 0, 24, 24, 24, 24, 26, 26, 26, 26, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 30, 30, + 39, 39, 47, 47, 49, 52, 55, 58, 61, 64, + 67, 70, 74, 77, 77, 80, 80, 83, 83, 89, + 89, 95, 95, 101, 105 }; #endif
@@ -568,9 +575,13 @@ "STRING", "PCI", "PNP", "I2C", "APIC", "CPU_CLUSTER", "CPU", "DOMAIN", "IRQ", "DRQ", "SLOT_DESC", "IO", "NUMBER", "SUBSYSTEMID", "INHERIT", "IOAPIC_IRQ", "IOAPIC", "PCIINT", "GENERIC", "SPI", "USB", "MMIO", "LPC", - "ESPI", "$accept", "devtree", "$@1", "chipchildren", "devicechildren", - "chip", "@2", "device", "@3", "status", "resource", "registers", - "subsystemid", "ioapic_irq", "smbios_slot_desc", YY_NULLPTR + "ESPI", "FW_CONFIG_TABLE", "FW_CONFIG_FIELD", "FW_CONFIG_OPTION", + "FW_CONFIG_PROBE", "$accept", "devtree", "chipchildren", + "devicechildren", "chip", "@1", "device", "@2", "status", "resource", + "registers", "subsystemid", "ioapic_irq", "smbios_slot_desc", + "fw_config_table", "fw_config_table_children", + "fw_config_field_children", "fw_config_field", "$@3", "$@4", "$@5", + "fw_config_option", "fw_config_probe", YY_NULLPTR }; #endif
@@ -582,11 +593,12 @@ 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, 290, 291, 292 + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296 }; # endif
-#define YYPACT_NINF (-10) +#define YYPACT_NINF (-12)
#define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) @@ -600,11 +612,14 @@ STATE-NUM. */ static const yytype_int8 yypact[] = { - -10, 11, 10, -10, 0, -10, -10, -10, 1, 6, - 2, -10, -10, -10, -10, -9, 8, 3, 4, -10, - -10, -10, -10, -10, -3, -4, -10, 9, -1, 5, - -10, -10, -10, -10, -10, -10, -10, 15, 14, 7, - -2, 12, 16, 13, 17, -10, 18, -10, -10, -10 + -12, 3, -12, 4, -12, -12, -12, -12, -2, -12, + -12, 8, -12, 9, 1, 14, 11, -12, -12, -12, + -12, 2, -12, 5, 17, -12, -12, -6, 10, 16, + -12, -1, -12, 18, -12, -12, -12, -12, -12, 0, + -12, 7, -12, -12, -12, -3, 19, -12, 21, 20, + 22, 28, -12, -12, -12, -12, -12, -12, -12, -12, + 31, 30, 23, 24, 33, 25, 36, 26, 27, -12, + -12, 38, -12, -12, -12 };
/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -612,25 +627,30 @@ means the default is an error. */ static const yytype_int8 yydefact[] = { - 2, 0, 0, 1, 0, 3, 16, 7, 0, 0, - 0, 17, 5, 4, 6, 0, 0, 0, 0, 20, - 21, 18, 23, 15, 0, 0, 19, 0, 0, 0, - 9, 8, 10, 14, 11, 12, 13, 0, 0, 0, - 0, 0, 29, 24, 0, 22, 28, 25, 26, 27 + 2, 0, 1, 0, 34, 3, 4, 18, 0, 8, + 32, 0, 33, 0, 41, 0, 0, 19, 6, 5, + 7, 39, 36, 0, 0, 37, 36, 0, 0, 0, + 36, 0, 42, 0, 35, 22, 23, 20, 25, 0, + 40, 0, 17, 38, 43, 0, 0, 21, 0, 0, + 0, 0, 10, 9, 11, 15, 12, 13, 14, 16, + 0, 0, 0, 0, 0, 0, 31, 26, 0, 44, + 24, 30, 27, 28, 29 };
/* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { - -10, -10, -10, -10, -10, -5, -10, 20, -10, -10, - -10, 21, -10, -10, -10 + -12, -12, -12, -12, -9, -12, 12, -12, -12, -12, + 13, -12, -12, -12, -12, -12, -11, -12, -12, -12, + -12, -12, -12 };
/* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { - -1, 1, 2, 8, 24, 5, 7, 13, 23, 21, - 32, 14, 34, 35, 36 + -1, 1, 13, 45, 5, 9, 19, 42, 37, 54, + 20, 56, 57, 58, 6, 8, 27, 12, 30, 26, + 22, 34, 59 };
/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -638,47 +658,56 @@ number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int8 yytable[] = { - 4, 9, 10, 12, 4, 9, 10, 25, 26, 19, - 20, 3, 11, 4, 6, 15, 16, 17, 22, 30, - 18, 27, 37, 38, 28, 39, 29, 41, 42, 44, - 46, 40, 49, 43, 0, 0, 0, 0, 45, 0, - 0, 47, 0, 48, 31, 33 + 3, 15, 16, 2, 18, 32, 3, 46, 47, 10, + 40, 43, 3, 15, 16, 31, 35, 36, 7, 39, + 17, 48, 14, 23, 49, 24, 50, 21, 25, 29, + 38, 28, 41, 44, 33, 61, 52, 11, 51, 33, + 33, 4, 64, 65, 66, 60, 62, 69, 63, 67, + 71, 70, 74, 73, 72, 68, 0, 53, 55 };
static const yytype_int8 yycheck[] = { - 3, 4, 5, 8, 3, 4, 5, 10, 11, 6, - 7, 0, 11, 3, 14, 9, 14, 26, 14, 24, - 12, 24, 26, 14, 27, 26, 29, 12, 14, 31, - 14, 26, 14, 26, -1, -1, -1, -1, 26, -1, - -1, 28, -1, 26, 24, 24 + 3, 4, 5, 0, 13, 11, 3, 10, 11, 11, + 11, 11, 3, 4, 5, 26, 6, 7, 14, 30, + 11, 24, 14, 9, 27, 14, 29, 26, 26, 12, + 14, 26, 14, 26, 40, 14, 45, 39, 41, 40, + 40, 38, 14, 12, 14, 26, 26, 14, 26, 26, + 14, 26, 14, 26, 28, 31, -1, 45, 45 };
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_int8 yystos[] = { - 0, 39, 40, 0, 3, 43, 14, 44, 41, 4, - 5, 11, 43, 45, 49, 9, 14, 26, 12, 6, - 7, 47, 14, 46, 42, 10, 11, 24, 27, 29, - 43, 45, 48, 49, 50, 51, 52, 26, 14, 26, - 26, 12, 14, 26, 31, 26, 14, 28, 26, 14 + 0, 43, 0, 3, 38, 46, 56, 14, 57, 47, + 11, 39, 59, 44, 14, 4, 5, 11, 46, 48, + 52, 26, 62, 9, 14, 26, 61, 58, 26, 12, + 60, 58, 11, 40, 63, 6, 7, 50, 14, 58, + 11, 14, 49, 11, 26, 45, 10, 11, 24, 27, + 29, 41, 46, 48, 51, 52, 53, 54, 55, 64, + 26, 14, 26, 26, 14, 12, 14, 26, 31, 14, + 26, 14, 28, 26, 14 };
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_int8 yyr1[] = { - 0, 38, 40, 39, 41, 41, 41, 41, 42, 42, - 42, 42, 42, 42, 42, 42, 44, 43, 46, 45, - 47, 47, 48, 49, 50, 50, 51, 52, 52, 52 + 0, 42, 43, 43, 43, 44, 44, 44, 44, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 47, 46, + 49, 48, 50, 50, 51, 52, 53, 53, 54, 55, + 55, 55, 56, 57, 57, 58, 58, 60, 59, 61, + 59, 62, 59, 63, 64 };
/* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ static const yytype_int8 yyr2[] = { - 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, - 2, 2, 2, 2, 2, 0, 0, 5, 0, 7, - 1, 1, 4, 4, 3, 4, 4, 5, 4, 3 + 0, 2, 0, 2, 2, 2, 2, 2, 0, 2, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 5, + 0, 7, 1, 1, 4, 4, 3, 4, 4, 5, + 4, 3, 3, 2, 0, 2, 0, 0, 7, 0, + 6, 0, 5, 3, 3 };
@@ -1377,7 +1406,7 @@ { cur_parent = root_parent; } break;
- case 16: + case 18: { (yyval.chip_instance) = new_chip_instance((yyvsp[0].string)); chip_enqueue_tail(cur_chip_instance); @@ -1385,57 +1414,99 @@ } break;
- case 17: + case 19: { cur_chip_instance = chip_dequeue_tail(); } break;
- case 18: + case 20: { (yyval.dev) = new_device(cur_parent, cur_chip_instance, (yyvsp[-2].number), (yyvsp[-1].string), (yyvsp[0].number)); cur_parent = (yyval.dev)->last_bus; } break;
- case 19: + case 21: { cur_parent = (yyvsp[-2].dev)->parent; } break;
- case 22: + case 24: { add_resource(cur_parent, (yyvsp[-3].number), strtol((yyvsp[-2].string), NULL, 0), strtol((yyvsp[0].string), NULL, 0)); } break;
- case 23: + case 25: { add_register(cur_chip_instance, (yyvsp[-2].string), (yyvsp[0].string)); } break;
- case 24: + case 26: { add_pci_subsystem_ids(cur_parent, strtol((yyvsp[-1].string), NULL, 16), strtol((yyvsp[0].string), NULL, 16), 0); } break;
- case 25: + case 27: { add_pci_subsystem_ids(cur_parent, strtol((yyvsp[-2].string), NULL, 16), strtol((yyvsp[-1].string), NULL, 16), 1); } break;
- case 26: + case 28: { add_ioapic_info(cur_parent, strtol((yyvsp[-2].string), NULL, 16), (yyvsp[-1].string), strtol((yyvsp[0].string), NULL, 16)); } break;
- case 27: + case 29: { add_slot_desc(cur_parent, (yyvsp[-3].string), (yyvsp[-2].string), (yyvsp[-1].string), (yyvsp[0].string)); } break;
- case 28: + case 30: { add_slot_desc(cur_parent, (yyvsp[-2].string), (yyvsp[-1].string), (yyvsp[0].string), NULL); } break;
- case 29: + case 31: { add_slot_desc(cur_parent, (yyvsp[-1].string), (yyvsp[0].string), NULL, NULL); } break;
+ case 32: + { } + break; + + case 37: + { + cur_field = new_fw_config_field((yyvsp[-2].string), strtoul((yyvsp[-1].string), NULL, 0), strtoul((yyvsp[0].string), NULL, 0)); +} + break; + + case 38: + { } + break; + + case 39: + { + cur_field = new_fw_config_field((yyvsp[-1].string), strtoul((yyvsp[0].string), NULL, 0), strtoul((yyvsp[0].string), NULL, 0)); +} + break; + + case 40: + { } + break; + + case 41: + { + cur_field = get_fw_config_field((yyvsp[0].string)); +} + break; + + case 42: + { } + break; + + case 43: + { add_fw_config_option(cur_field, (yyvsp[-1].string), strtoul((yyvsp[0].string), NULL, 0)); } + break; + + case 44: + { add_fw_config_probe(cur_parent, (yyvsp[-1].string), (yyvsp[0].string)); } + break; +
default: break; diff --git a/util/sconfig/sconfig.tab.h_shipped b/util/sconfig/sconfig.tab.h_shipped index 5fa9d19..cadd847 100644 --- a/util/sconfig/sconfig.tab.h_shipped +++ b/util/sconfig/sconfig.tab.h_shipped @@ -1,4 +1,4 @@ -/* A Bison parser, made by GNU Bison 3.5.4. */ +/* A Bison parser, made by GNU Bison 3.5.1. */
/* Bison interface for Yacc-like parsers in C
@@ -34,8 +34,8 @@ /* Undocumented macros, especially those whose name start with YY_, are private implementation details. Do not rely on them. */
-#ifndef YY_YY_HOME_ME_REPOS_COREBOOTORG_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED -# define YY_YY_HOME_ME_REPOS_COREBOOTORG_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED +#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 @@ -83,7 +83,11 @@ USB = 289, MMIO = 290, LPC = 291, - ESPI = 292 + ESPI = 292, + FW_CONFIG_TABLE = 293, + FW_CONFIG_FIELD = 294, + FW_CONFIG_OPTION = 295, + FW_CONFIG_PROBE = 296 }; #endif
@@ -109,4 +113,4 @@
int yyparse (void);
-#endif /* !YY_YY_HOME_ME_REPOS_COREBOOTORG_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED */ +#endif /* !YY_YY_SRC_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED */ diff --git a/util/sconfig/sconfig.y b/util/sconfig/sconfig.y index 161cf81..57e939d 100755 --- a/util/sconfig/sconfig.y +++ b/util/sconfig/sconfig.y @@ -9,6 +9,7 @@
static struct bus *cur_parent; static struct chip_instance *cur_chip_instance; +static struct fw_config_field *cur_field;
%} %union { @@ -18,13 +19,13 @@ int number; }
-%token CHIP DEVICE REGISTER BOOL STATUS MANDATORY BUS RESOURCE END EQUALS HEX STRING PCI PNP I2C APIC CPU_CLUSTER CPU DOMAIN IRQ DRQ SLOT_DESC IO NUMBER SUBSYSTEMID INHERIT IOAPIC_IRQ IOAPIC PCIINT GENERIC SPI USB MMIO LPC ESPI +%token CHIP DEVICE REGISTER BOOL STATUS MANDATORY BUS RESOURCE END EQUALS HEX STRING PCI PNP I2C APIC CPU_CLUSTER CPU DOMAIN IRQ DRQ SLOT_DESC IO NUMBER SUBSYSTEMID INHERIT IOAPIC_IRQ IOAPIC PCIINT GENERIC SPI USB MMIO LPC ESPI FW_CONFIG_TABLE FW_CONFIG_FIELD FW_CONFIG_OPTION FW_CONFIG_PROBE %% -devtree: { cur_parent = root_parent; } chip; +devtree: { cur_parent = root_parent; } | devtree chip | devtree fw_config_table;
chipchildren: chipchildren device | chipchildren chip | chipchildren registers | /* empty */ ;
-devicechildren: devicechildren device | devicechildren chip | devicechildren resource | devicechildren subsystemid | devicechildren ioapic_irq | devicechildren smbios_slot_desc | devicechildren registers | /* empty */ ; +devicechildren: devicechildren device | devicechildren chip | devicechildren resource | devicechildren subsystemid | devicechildren ioapic_irq | devicechildren smbios_slot_desc | devicechildren registers | devicechildren fw_config_probe | /* empty */ ;
chip: CHIP STRING /* == path */ { $<chip_instance>$ = new_chip_instance($<string>2); @@ -69,4 +70,38 @@ smbios_slot_desc: SLOT_DESC STRING STRING { add_slot_desc(cur_parent, $<string>2, $<string>3, NULL, NULL); };
+/* fw_config: firmware configuration table */ +fw_config_table: FW_CONFIG_TABLE fw_config_table_children END { }; + +/* fw_config -> field */ +fw_config_table_children: fw_config_table_children fw_config_field | /* empty */ ; + +/* field -> option */ +fw_config_field_children: fw_config_field_children fw_config_option | /* empty */ ; + +/* field <start-bit> <end-bit> */ +fw_config_field: FW_CONFIG_FIELD STRING NUMBER /* == start bit */ NUMBER /* == end bit */ { + cur_field = new_fw_config_field($<string>2, strtoul($<string>3, NULL, 0), strtoul($<string>4, NULL, 0)); +} + fw_config_field_children END { }; + +/* field <bit> (for single-bit fields) */ +fw_config_field: FW_CONFIG_FIELD STRING NUMBER /* == bit */ { + cur_field = new_fw_config_field($<string>2, strtoul($<string>3, NULL, 0), strtoul($<string>3, NULL, 0)); +} + fw_config_field_children END { }; + +/* field (for adding options to an existing field) */ +fw_config_field: FW_CONFIG_FIELD STRING { + cur_field = get_fw_config_field($<string>2); +} + fw_config_field_children END { }; + +/* option <value> */ +fw_config_option: FW_CONFIG_OPTION STRING NUMBER /* == field value */ + { add_fw_config_option(cur_field, $<string>2, strtoul($<string>3, NULL, 0)); }; + +/* probe <field> <option> */ +fw_config_probe: FW_CONFIG_PROBE STRING /* == field */ STRING /* == option */ + { add_fw_config_probe(cur_parent, $<string>2, $<string>3); } %%
9elements QA has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41440 )
Change subject: sconfig: Add support for firmware configuration ......................................................................
Patch Set 18:
Automatic boot test returned (PASS/FAIL/TOTAL): 4/0/4 Emulation targets: "QEMU x86 q35/ich9" using payload TianoCore : SUCCESS : https://lava.9esec.io/r/4702 "QEMU x86 q35/ich9" using payload SeaBIOS : SUCCESS : https://lava.9esec.io/r/4701 "QEMU x86 i440fx/piix4" using payload SeaBIOS : SUCCESS : https://lava.9esec.io/r/4700 "QEMU AArch64" using payload LinuxBoot_u-root_kexec : SUCCESS : https://lava.9esec.io/r/4699
Please note: This test is under development and might not be accurate at all!