Hello Furquan Shaikh, Patrick Georgi, Angel Pons, Arthur Heymans, Kyösti Mälkki, Aaron Durbin,
I'd like you to do a code review. Please visit
https://review.coreboot.org/c/coreboot/+/41745
to review the following change.
Change subject: [RFC] util/sconfig: Add per-device configuration ......................................................................
[RFC] util/sconfig: Add per-device configuration
Similar to the `register` entries for chip drivers, allow to store a configuration struct per device. This should help the ever growing chips in two ways: First, it should overcome the psychological issue that nobody is going to use the `chip` mechanism for configuration unless a device is really on a separate chip. And second, by having a separate struct per device, we can directly query this struct from a common driver, even if not the whole chip is covered by common code.
The current implementation borrows some logic from the `register` entries, but groups all key-value pairs in a `config` section, e.g.:
device generic 0.0 on config drivers/vendor/model key = value paradox = same_value end end
Similar to chip drivers, this example would require a `drivers/vendor/model/config.h` with a struct named `drivers_vendor_model_config` containing `key` and `paradox` fields, and definitions for `value` and `same_value`.
Change-Id: I25f46e774bb6d26d0e6b77f9bd96d80581412655 Signed-off-by: Nico Huber nico.h@gmx.de --- M src/include/device/device.h 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 8 files changed, 391 insertions(+), 310 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/45/41745/1
diff --git a/src/include/device/device.h b/src/include/device/device.h index 46efbfe..23abc72 100644 --- a/src/include/device/device.h +++ b/src/include/device/device.h @@ -139,6 +139,7 @@ struct device_operations *ops; struct chip_operations *chip_ops; const char *name; + const void *config; #if CONFIG(GENERATE_SMBIOS_TABLES) u8 smbios_slot_type; u8 smbios_slot_data_width; diff --git a/util/sconfig/lex.yy.c_shipped b/util/sconfig/lex.yy.c_shipped index 61928e6..e7059b7 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 42 +#define YY_END_OF_BUFFER 43 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -358,27 +358,27 @@ 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[178] = { 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, 43, 41, 1, 3, 41, 41, 41, 36, + 36, 34, 37, 41, 37, 37, 37, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 1, 3, + 41, 0, 41, 41, 0, 2, 36, 37, 41, 41, + 41, 41, 41, 37, 41, 41, 41, 41, 41, 41, + 41, 41, 28, 41, 41, 41, 41, 41, 41, 8, + 41, 41, 41, 41, 41, 41, 41, 40, 40, 41, + 0, 35, 41, 41, 41, 18, 41, 41, 27, 32, + 41, 41, 41, 15, 41, 41, 26, 41, 24, 41, + 41, 9, 12, 14, 41, 41, 22, 41, 23, 41,
- 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 + 0, 38, 4, 41, 41, 41, 41, 25, 41, 41, + 41, 41, 41, 41, 21, 41, 41, 41, 39, 39, + 41, 41, 41, 41, 41, 41, 41, 41, 16, 41, + 41, 41, 41, 6, 41, 5, 19, 41, 10, 41, + 13, 41, 41, 41, 41, 41, 20, 30, 41, 41, + 41, 41, 41, 41, 41, 41, 7, 41, 41, 41, + 41, 11, 41, 41, 41, 29, 41, 41, 17, 41, + 31, 41, 41, 41, 41, 33, 0 } ;
static const YY_CHAR yy_ec[256] = @@ -421,118 +421,122 @@ 1, 1, 1, 1, 1, 1, 1, 1 } ;
-static const flex_int16_t yy_base[180] = +static const flex_int16_t yy_base[185] = { 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, 245, 0, 242, 246, 240, 37, 41, 38, + 205, 0, 44, 227, 54, 78, 60, 219, 214, 45, + 49, 48, 42, 52, 217, 62, 204, 0, 234, 246, + 93, 230, 98, 79, 231, 246, 0, 97, 104, 218, + 207, 203, 195, 110, 202, 197, 207, 196, 197, 204, + 204, 198, 204, 189, 189, 199, 189, 191, 193, 0, + 189, 183, 189, 193, 185, 191, 190, 0, 246, 125, + 202, 0, 195, 175, 182, 187, 177, 184, 0, 0, + 175, 178, 178, 0, 176, 166, 0, 170, 0, 174, + 164, 0, 0, 0, 167, 166, 0, 157, 0, 184,
- 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 + 183, 0, 0, 162, 167, 166, 159, 0, 151, 161, + 149, 155, 160, 161, 0, 144, 147, 137, 0, 246, + 151, 147, 151, 143, 145, 141, 143, 148, 0, 132, + 131, 131, 130, 0, 127, 0, 0, 142, 0, 126, + 143, 116, 123, 127, 108, 108, 0, 0, 115, 107, + 106, 104, 115, 101, 102, 95, 0, 106, 104, 108, + 89, 0, 85, 84, 76, 0, 68, 74, 0, 75, + 0, 70, 55, 39, 29, 0, 246, 40, 146, 148, + 150, 152, 154, 156 } ;
-static const flex_int16_t yy_def[180] = +static const flex_int16_t yy_def[185] = { 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, + 177, 1, 177, 178, 177, 177, 178, 179, 180, 178, + 10, 178, 10, 178, 10, 10, 10, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 177, 177, + 179, 181, 182, 180, 183, 177, 10, 10, 10, 178, + 178, 178, 178, 10, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 177, 182, + 184, 39, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
- 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 + 177, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 177, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 0, 177, 177, 177, + 177, 177, 177, 177 } ;
-static const flex_int16_t yy_nxt[280] = +static const flex_int16_t yy_nxt[285] = { 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, + 28, 33, 35, 36, 37, 37, 37, 176, 38, 38, + 38, 38, 38, 51, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 59, 57, 55, 38, 38, 38, 60, + 61, 175, 52, 53, 58, 174, 54, 41, 56, 62, + 35, 36, 42, 43, 38, 38, 38, 47, 64, 173, + 172, 65, 48, 171, 32, 32, 66, 68, 44, 71,
- 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, - 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, + 71, 170, 28, 38, 38, 38, 45, 169, 168, 46, + 72, 72, 72, 167, 72, 72, 38, 38, 38, 166, + 72, 72, 72, 72, 72, 72, 71, 71, 165, 100, + 164, 163, 162, 161, 160, 159, 158, 157, 156, 155, + 154, 153, 152, 151, 150, 77, 31, 31, 34, 34, + 32, 32, 70, 70, 35, 35, 71, 71, 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,
- 101, 100, 99, 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 + 107, 106, 105, 104, 103, 102, 101, 99, 98, 97, + 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, + 86, 85, 84, 83, 82, 81, 80, 79, 78, 76, + 75, 74, 73, 36, 69, 29, 67, 63, 50, 49, + 40, 39, 30, 29, 177, 3, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 177, 177, 177, 177 } ;
-static const flex_int16_t yy_chk[280] = +static const flex_int16_t yy_chk[285] = { 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, + 178, 8, 9, 9, 10, 10, 10, 175, 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, + 24, 174, 20, 20, 22, 173, 20, 15, 21, 24, + 34, 34, 15, 15, 16, 16, 16, 17, 26, 172, + 170, 26, 17, 168, 31, 31, 26, 31, 16, 33,
- 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, + 33, 167, 33, 38, 38, 38, 16, 165, 164, 16, + 39, 39, 39, 163, 39, 39, 44, 44, 44, 161, + 39, 39, 39, 39, 39, 39, 70, 70, 160, 70, + 159, 158, 156, 155, 154, 153, 152, 151, 150, 149, + 146, 145, 144, 143, 142, 44, 179, 179, 180, 180, + 181, 181, 182, 182, 183, 183, 184, 184, 141, 140, + 138, 135, 133, 132, 131, 130, 128, 127, 126, 125, + 124, 123, 122, 121, 118, 117, 116, 114, 113, 112, + 111, 110, 109, 107, 106, 105, 104, 101, 100, 98, + 96, 95, 91, 90, 88, 86, 85, 83, 82, 81,
- 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 + 78, 77, 76, 75, 74, 73, 71, 67, 66, 65, + 64, 63, 62, 61, 59, 58, 57, 56, 55, 54, + 53, 52, 51, 50, 49, 48, 47, 46, 45, 43, + 42, 41, 40, 35, 32, 29, 27, 25, 19, 18, + 14, 11, 7, 5, 3, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 177, 177, 177, 177 } ;
static yy_state_type yy_last_accepting_state; @@ -549,21 +553,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 +801,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 >= 178 ) 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] != 246 );
yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -864,119 +855,119 @@ YY_BREAK case 6: YY_RULE_SETUP -{return(REGISTER);} +{return(CONFIG);} YY_BREAK case 7: YY_RULE_SETUP -{yylval.number=1; return(BOOL);} +{return(REGISTER);} YY_BREAK case 8: YY_RULE_SETUP -{yylval.number=0; return(BOOL);} +{yylval.number=1; return(BOOL);} YY_BREAK case 9: YY_RULE_SETUP -{yylval.number=3; return(STATUS);} +{yylval.number=0; return(BOOL);} YY_BREAK case 10: YY_RULE_SETUP -{yylval.number=5; return(STATUS);} +{yylval.number=3; return(STATUS);} YY_BREAK case 11: YY_RULE_SETUP -{yylval.number=PCI; return(BUS);} +{yylval.number=5; return(STATUS);} YY_BREAK case 12: YY_RULE_SETUP -{yylval.number=IOAPIC; return(BUS);} +{yylval.number=PCI; return(BUS);} YY_BREAK case 13: YY_RULE_SETUP -{yylval.number=PNP; return(BUS);} +{yylval.number=IOAPIC; return(BUS);} YY_BREAK case 14: YY_RULE_SETUP -{yylval.number=I2C; return(BUS);} +{yylval.number=PNP; return(BUS);} YY_BREAK case 15: YY_RULE_SETUP -{yylval.number=APIC; return(BUS);} +{yylval.number=I2C; return(BUS);} YY_BREAK case 16: YY_RULE_SETUP -{yylval.number=CPU_CLUSTER; return(BUS);} +{yylval.number=APIC; return(BUS);} YY_BREAK case 17: YY_RULE_SETUP -{yylval.number=CPU; return(BUS);} +{yylval.number=CPU_CLUSTER; return(BUS);} YY_BREAK case 18: YY_RULE_SETUP -{yylval.number=DOMAIN; return(BUS);} +{yylval.number=CPU; return(BUS);} YY_BREAK case 19: YY_RULE_SETUP -{yylval.number=GENERIC; return(BUS);} +{yylval.number=DOMAIN; return(BUS);} YY_BREAK case 20: YY_RULE_SETUP -{yylval.number=MMIO; return(BUS);} +{yylval.number=GENERIC; return(BUS);} YY_BREAK case 21: YY_RULE_SETUP -{yylval.number=SPI; return(BUS);} +{yylval.number=MMIO; return(BUS);} YY_BREAK case 22: YY_RULE_SETUP -{yylval.number=USB; return(BUS);} +{yylval.number=SPI; return(BUS);} YY_BREAK case 23: YY_RULE_SETUP -{yylval.number=LPC; return(BUS);} +{yylval.number=USB; return(BUS);} YY_BREAK case 24: YY_RULE_SETUP -{yylval.number=ESPI; return(BUS);} +{yylval.number=LPC; return(BUS);} YY_BREAK case 25: YY_RULE_SETUP -{yylval.number=IRQ; return(RESOURCE);} +{yylval.number=ESPI; return(BUS);} YY_BREAK case 26: YY_RULE_SETUP -{yylval.number=DRQ; return(RESOURCE);} +{yylval.number=IRQ; return(RESOURCE);} YY_BREAK case 27: YY_RULE_SETUP -{yylval.number=IO; return(RESOURCE);} +{yylval.number=DRQ; return(RESOURCE);} YY_BREAK case 28: YY_RULE_SETUP -{return(IOAPIC_IRQ);} +{yylval.number=IO; return(RESOURCE);} YY_BREAK case 29: YY_RULE_SETUP -{return(INHERIT);} +{return(IOAPIC_IRQ);} YY_BREAK case 30: YY_RULE_SETUP -{return(SUBSYSTEMID);} +{return(INHERIT);} YY_BREAK case 31: YY_RULE_SETUP -{return(END);} +{return(SUBSYSTEMID);} YY_BREAK case 32: YY_RULE_SETUP -{return(SLOT_DESC);} +{return(END);} YY_BREAK case 33: YY_RULE_SETUP -{return(EQUALS);} +{return(SLOT_DESC);} YY_BREAK case 34: YY_RULE_SETUP -{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);} +{return(EQUALS);} YY_BREAK case 35: YY_RULE_SETUP @@ -988,12 +979,11 @@ YY_BREAK case 37: YY_RULE_SETUP -{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(PCIINT);} +{yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(NUMBER);} YY_BREAK case 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(PCIINT);} YY_BREAK case 39: /* rule 39 can match eol */ @@ -1001,10 +991,15 @@ {yylval.string = malloc(yyleng-1); strncpy(yylval.string, yytext+1, yyleng-2); yylval.string[yyleng-2]='\0'; return(STRING);} YY_BREAK case 40: +/* rule 40 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 41: YY_RULE_SETUP {yylval.string = malloc(yyleng+1); strncpy(yylval.string, yytext, yyleng); yylval.string[yyleng]='\0'; return(STRING);} YY_BREAK -case 41: +case 42: YY_RULE_SETUP ECHO; YY_BREAK @@ -1304,7 +1299,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 >= 178 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -1332,11 +1327,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 >= 178 ) 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 == 177);
return yy_is_jam ? 0 : yy_current_state; } diff --git a/util/sconfig/main.c b/util/sconfig/main.c index 0d8f7f8..0e033d9 100644 --- a/util/sconfig/main.c +++ b/util/sconfig/main.c @@ -528,6 +528,12 @@ new_resource(bus->dev, type, index, base); }
+void set_config_path(struct bus *bus, char *path) +{ + bus->dev->config_path = path; + bus->dev->config_path_underscore = translate_name(path, UNSLASH); +} + static void add_reg(struct reg **const head, char *const name, char *const val) { struct reg *const r = S_ALLOC(sizeof(struct reg)); @@ -540,7 +546,7 @@ for (cur = *head; cur != NULL; prev = cur, cur = cur->next) { const int sort = strcmp(r->key, cur->key); if (sort == 0) { - printf("ERROR: duplicate 'register' key.\n"); + printf("ERROR: duplicate key '%s'.\n", name); exit(1); } if (sort < 0) @@ -553,6 +559,11 @@ *head = r; }
+void add_setting(struct bus *bus, char *name, char *val) +{ + add_reg(&bus->dev->settings, name, val); +} + void add_register(struct chip_instance *chip_instance, char *name, char *val) { add_reg(&chip_instance->reg, name, val); @@ -644,6 +655,9 @@ ptr->name = name;
fprintf(fil, "STORAGE struct device %s;\n", ptr->name); + if (ptr->config_path) + fprintf(fil, "STORAGE struct %s_config %s_config;\n", + ptr->config_path_underscore, ptr->name); if (ptr->res) fprintf(fil, "STORAGE struct resource %s_res[];\n", ptr->name); @@ -659,6 +673,22 @@ ptr->name); }
+static void emit_config(FILE *fil, struct device *ptr) +{ + struct reg *r; + + if (ptr->config_path == NULL) + return; + + fprintf(fil, "STORAGE struct %s_config %s_config = {\n", + ptr->config_path_underscore, ptr->name); + + for (r = ptr->settings; r != NULL; r = r->next) + fprintf(fil, "\t.%s = %s,\n", r->key, r->value); + + fprintf(fil, "};\n"); +} + static void emit_resources(FILE *fil, struct device *ptr) { if (ptr->res == NULL) @@ -748,6 +778,8 @@ fprintf(fil, "\t.ops = &default_dev_ops_root,\n"); else fprintf(fil, "\t.ops = NULL,\n"); + if (ptr->config_path) + fprintf(fil, "\t.config = &%s_config,\n", ptr->name); fprintf(fil, "#endif\n"); fprintf(fil, "\t.bus = &%s_links[%d],\n", ptr->parent->dev->name, ptr->parent->id); @@ -826,6 +858,7 @@ } fprintf(fil, "};\n");
+ emit_config(fil, ptr); emit_resources(fil, ptr);
if (has_children) @@ -1301,6 +1334,12 @@ } }
+static void emit_config_headers(FILE *file, FILE *head, struct device *dev, struct device *next) +{ + if (dev->config_path) + fprintf(file, "#include "%s/config.h"\n", dev->config_path); +} + int main(int argc, char **argv) { if ((argc < MANDATORY_ARG_COUNT) || (argc > TOTAL_ARG_COUNT)) @@ -1346,6 +1385,8 @@
fprintf(autogen, "#include <device/device.h>\n"); fprintf(autogen, "#include <device/pci.h>\n\n"); + walk_device_tree(autogen, autohead, &base_root_dev, emit_config_headers); + fprintf(autogen, "\n");
emit_chips(autogen);
diff --git a/util/sconfig/sconfig.h b/util/sconfig/sconfig.h index a960b7f..bd97d240 100644 --- a/util/sconfig/sconfig.h +++ b/util/sconfig/sconfig.h @@ -125,6 +125,11 @@ /* Pointer to chip instance for this device. */ struct chip_instance *chip_instance;
+ /* Path of config and settings. */ + char *config_path; + char *config_path_underscore; + struct reg *settings; + /* Pointer to list of buses under this device. */ struct bus *bus; /* Pointer to last bus under this device. */ @@ -150,6 +155,9 @@ const int bustype, const char *devnum, int status);
+void set_config_path(struct bus *bus, char *path); +void add_setting(struct bus *bus, char *name, char *val); + void add_resource(struct bus *bus, int type, int index, int base);
void add_pci_subsystem_ids(struct bus *bus, int vendor, int device, diff --git a/util/sconfig/sconfig.l b/util/sconfig/sconfig.l index 5ac5057..f0b1efd 100755 --- a/util/sconfig/sconfig.l +++ b/util/sconfig/sconfig.l @@ -13,6 +13,7 @@ \r?\n {linenum++;} chip {return(CHIP);} device {return(DEVICE);} +config {return(CONFIG);} register {return(REGISTER);} on {yylval.number=1; return(BOOL);} off {yylval.number=0; return(BOOL);} diff --git a/util/sconfig/sconfig.tab.c_shipped b/util/sconfig/sconfig.tab.c_shipped index 2bae43b..b0d79bd 100644 --- a/util/sconfig/sconfig.tab.c_shipped +++ b/util/sconfig/sconfig.tab.c_shipped @@ -111,8 +111,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_HOME_ICON_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED +# define YY_YY_HOME_ICON_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 @@ -128,39 +128,40 @@ { CHIP = 258, DEVICE = 259, - REGISTER = 260, - BOOL = 261, - STATUS = 262, - MANDATORY = 263, - BUS = 264, - RESOURCE = 265, - END = 266, - EQUALS = 267, - HEX = 268, - STRING = 269, - PCI = 270, - PNP = 271, - I2C = 272, - APIC = 273, - CPU_CLUSTER = 274, - CPU = 275, - DOMAIN = 276, - IRQ = 277, - DRQ = 278, - SLOT_DESC = 279, - IO = 280, - NUMBER = 281, - SUBSYSTEMID = 282, - INHERIT = 283, - IOAPIC_IRQ = 284, - IOAPIC = 285, - PCIINT = 286, - GENERIC = 287, - SPI = 288, - USB = 289, - MMIO = 290, - LPC = 291, - ESPI = 292 + CONFIG = 260, + REGISTER = 261, + BOOL = 262, + STATUS = 263, + MANDATORY = 264, + BUS = 265, + RESOURCE = 266, + END = 267, + EQUALS = 268, + HEX = 269, + STRING = 270, + PCI = 271, + PNP = 272, + I2C = 273, + APIC = 274, + CPU_CLUSTER = 275, + CPU = 276, + DOMAIN = 277, + IRQ = 278, + DRQ = 279, + SLOT_DESC = 280, + IO = 281, + NUMBER = 282, + SUBSYSTEMID = 283, + INHERIT = 284, + IOAPIC_IRQ = 285, + IOAPIC = 286, + PCIINT = 287, + GENERIC = 288, + SPI = 289, + USB = 290, + MMIO = 291, + LPC = 292, + ESPI = 293 }; #endif
@@ -186,7 +187,7 @@
int yyparse (void);
-#endif /* !YY_YY_HOME_ME_REPOS_COREBOOTORG_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED */ +#endif /* !YY_YY_HOME_ICON_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED */
@@ -492,19 +493,19 @@ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 45 +#define YYLAST 55
/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 38 +#define YYNTOKENS 39 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 15 +#define YYNNTS 19 /* YYNRULES -- Number of rules. */ -#define YYNRULES 29 +#define YYNRULES 35 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 50 +#define YYNSTATES 61
#define YYUNDEFTOK 2 -#define YYMAXUTOK 292 +#define YYMAXUTOK 293
/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM @@ -545,16 +546,17 @@ 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 };
#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, 23, 23, 23, 25, 25, 25, 25, 27, 27, + 27, 27, 27, 27, 27, 27, 29, 29, 31, 31, + 40, 40, 48, 48, 50, 50, 53, 56, 59, 62, + 65, 68, 71, 74, 77, 80 }; #endif
@@ -563,14 +565,15 @@ First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { - "$end", "error", "$undefined", "CHIP", "DEVICE", "REGISTER", "BOOL", - "STATUS", "MANDATORY", "BUS", "RESOURCE", "END", "EQUALS", "HEX", + "$end", "error", "$undefined", "CHIP", "DEVICE", "CONFIG", "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", "$accept", "devtree", "$@1", "chipchildren", "devicechildren", - "chip", "@2", "device", "@3", "status", "resource", "registers", - "subsystemid", "ioapic_irq", "smbios_slot_desc", YY_NULLPTR + "settings", "chip", "@2", "device", "@3", "status", "config", "$@4", + "setting", "resource", "registers", "subsystemid", "ioapic_irq", + "smbios_slot_desc", YY_NULLPTR }; #endif
@@ -582,11 +585,11 @@ 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 }; # endif
-#define YYPACT_NINF (-10) +#define YYPACT_NINF (-16)
#define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) @@ -600,11 +603,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 + -16, 6, 7, -16, 2, -16, -16, -16, 1, 9, + 3, -16, -16, -16, -16, -15, 10, 8, 5, -16, + -16, -16, -16, 19, 11, -16, -16, -3, 13, 4, + -16, 14, 12, 15, -16, -16, -16, -16, -16, -16, + -16, 17, -1, -16, 20, 21, 16, 0, 22, -16, + -16, 18, 23, 24, 25, -16, -16, 26, -16, -16, + -16 };
/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -612,25 +617,27 @@ 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, 0, 1, 0, 3, 18, 7, 0, 0, + 0, 19, 5, 4, 6, 0, 0, 0, 0, 22, + 23, 20, 29, 26, 0, 15, 24, 0, 0, 0, + 21, 0, 0, 0, 9, 8, 10, 14, 11, 12, + 13, 0, 0, 17, 0, 0, 0, 0, 0, 25, + 16, 0, 35, 30, 0, 27, 28, 34, 31, 32, + 33 };
/* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { - -10, -10, -10, -10, -10, -5, -10, 20, -10, -10, - -10, 21, -10, -10, -10 + -16, -16, -16, -16, -16, -16, -6, -16, 27, -16, + -16, -16, -16, -8, -16, 28, -16, -16, -16 };
/* 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, 2, 8, 27, 42, 5, 7, 13, 23, + 21, 25, 28, 43, 36, 14, 38, 39, 40 };
/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -638,47 +645,53 @@ 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 + 4, 9, 12, 10, 4, 9, 3, 10, 29, 30, + 4, 49, 17, 11, 41, 19, 20, 6, 16, 15, + 22, 34, 31, 18, 24, 32, 26, 33, 41, 45, + 48, 44, 54, 51, 50, 0, 52, 55, 57, 46, + 0, 60, 47, 53, 0, 56, 0, 0, 0, 0, + 0, 0, 59, 58, 35, 37 };
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, 8, 6, 3, 4, 0, 6, 11, 12, + 3, 12, 27, 12, 15, 7, 8, 15, 15, 10, + 15, 27, 25, 13, 5, 28, 15, 30, 15, 15, + 13, 27, 32, 13, 42, -1, 15, 15, 15, 27, + -1, 15, 27, 27, -1, 27, -1, -1, -1, -1, + -1, -1, 27, 29, 27, 27 };
/* 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, 40, 41, 0, 3, 45, 15, 46, 42, 4, + 6, 12, 45, 47, 54, 10, 15, 27, 13, 7, + 8, 49, 15, 48, 5, 50, 15, 43, 51, 11, + 12, 25, 28, 30, 45, 47, 53, 54, 55, 56, + 57, 15, 44, 52, 27, 15, 27, 27, 13, 12, + 52, 13, 15, 27, 32, 15, 27, 15, 29, 27, + 15 };
/* 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, 39, 41, 40, 42, 42, 42, 42, 43, 43, + 43, 43, 43, 43, 43, 43, 44, 44, 46, 45, + 48, 47, 49, 49, 51, 50, 50, 52, 53, 54, + 55, 55, 56, 57, 57, 57 };
/* 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 + 2, 2, 2, 2, 2, 0, 2, 1, 0, 5, + 0, 8, 1, 1, 0, 5, 0, 3, 4, 4, + 3, 4, 4, 5, 4, 3 };
@@ -1377,7 +1390,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,54 +1398,64 @@ } 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: - { - cur_parent = (yyvsp[-2].dev)->parent; + case 21: + { + cur_parent = (yyvsp[-3].dev)->parent; } break;
- case 22: - { add_resource(cur_parent, (yyvsp[-3].number), strtol((yyvsp[-2].string), NULL, 0), strtol((yyvsp[0].string), NULL, 0)); } - break; - - case 23: - { add_register(cur_chip_instance, (yyvsp[-2].string), (yyvsp[0].string)); } - break; - case 24: - { add_pci_subsystem_ids(cur_parent, strtol((yyvsp[-1].string), NULL, 16), strtol((yyvsp[0].string), NULL, 16), 0); } - break; - - case 25: - { add_pci_subsystem_ids(cur_parent, strtol((yyvsp[-2].string), NULL, 16), strtol((yyvsp[-1].string), NULL, 16), 1); } - break; - - case 26: - { add_ioapic_info(cur_parent, strtol((yyvsp[-2].string), NULL, 16), (yyvsp[-1].string), strtol((yyvsp[0].string), NULL, 16)); } + { + set_config_path(cur_parent, (yyvsp[0].string)); +} break;
case 27: - { add_slot_desc(cur_parent, (yyvsp[-3].string), (yyvsp[-2].string), (yyvsp[-1].string), (yyvsp[0].string)); } + { add_setting(cur_parent, (yyvsp[-2].string), (yyvsp[0].string)); } break;
case 28: - { add_slot_desc(cur_parent, (yyvsp[-2].string), (yyvsp[-1].string), (yyvsp[0].string), NULL); } + { add_resource(cur_parent, (yyvsp[-3].number), strtol((yyvsp[-2].string), NULL, 0), strtol((yyvsp[0].string), NULL, 0)); } break;
case 29: + { add_register(cur_chip_instance, (yyvsp[-2].string), (yyvsp[0].string)); } + break; + + case 30: + { add_pci_subsystem_ids(cur_parent, strtol((yyvsp[-1].string), NULL, 16), strtol((yyvsp[0].string), NULL, 16), 0); } + break; + + case 31: + { add_pci_subsystem_ids(cur_parent, strtol((yyvsp[-2].string), NULL, 16), strtol((yyvsp[-1].string), NULL, 16), 1); } + break; + + case 32: + { add_ioapic_info(cur_parent, strtol((yyvsp[-2].string), NULL, 16), (yyvsp[-1].string), strtol((yyvsp[0].string), NULL, 16)); } + break; + + case 33: + { add_slot_desc(cur_parent, (yyvsp[-3].string), (yyvsp[-2].string), (yyvsp[-1].string), (yyvsp[0].string)); } + break; + + case 34: + { add_slot_desc(cur_parent, (yyvsp[-2].string), (yyvsp[-1].string), (yyvsp[0].string), NULL); } + break; + + case 35: { add_slot_desc(cur_parent, (yyvsp[-1].string), (yyvsp[0].string), NULL, NULL); } break;
diff --git a/util/sconfig/sconfig.tab.h_shipped b/util/sconfig/sconfig.tab.h_shipped index 5fa9d19..cb68de9 100644 --- a/util/sconfig/sconfig.tab.h_shipped +++ b/util/sconfig/sconfig.tab.h_shipped @@ -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_HOME_ICON_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED +# define YY_YY_HOME_ICON_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 @@ -51,39 +51,40 @@ { CHIP = 258, DEVICE = 259, - REGISTER = 260, - BOOL = 261, - STATUS = 262, - MANDATORY = 263, - BUS = 264, - RESOURCE = 265, - END = 266, - EQUALS = 267, - HEX = 268, - STRING = 269, - PCI = 270, - PNP = 271, - I2C = 272, - APIC = 273, - CPU_CLUSTER = 274, - CPU = 275, - DOMAIN = 276, - IRQ = 277, - DRQ = 278, - SLOT_DESC = 279, - IO = 280, - NUMBER = 281, - SUBSYSTEMID = 282, - INHERIT = 283, - IOAPIC_IRQ = 284, - IOAPIC = 285, - PCIINT = 286, - GENERIC = 287, - SPI = 288, - USB = 289, - MMIO = 290, - LPC = 291, - ESPI = 292 + CONFIG = 260, + REGISTER = 261, + BOOL = 262, + STATUS = 263, + MANDATORY = 264, + BUS = 265, + RESOURCE = 266, + END = 267, + EQUALS = 268, + HEX = 269, + STRING = 270, + PCI = 271, + PNP = 272, + I2C = 273, + APIC = 274, + CPU_CLUSTER = 275, + CPU = 276, + DOMAIN = 277, + IRQ = 278, + DRQ = 279, + SLOT_DESC = 280, + IO = 281, + NUMBER = 282, + SUBSYSTEMID = 283, + INHERIT = 284, + IOAPIC_IRQ = 285, + IOAPIC = 286, + PCIINT = 287, + GENERIC = 288, + SPI = 289, + USB = 290, + MMIO = 291, + LPC = 292, + ESPI = 293 }; #endif
@@ -109,4 +110,4 @@
int yyparse (void);
-#endif /* !YY_YY_HOME_ME_REPOS_COREBOOTORG_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED */ +#endif /* !YY_YY_HOME_ICON_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED */ diff --git a/util/sconfig/sconfig.y b/util/sconfig/sconfig.y index 161cf81..defa96f 100755 --- a/util/sconfig/sconfig.y +++ b/util/sconfig/sconfig.y @@ -18,7 +18,7 @@ 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 CONFIG 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 %% devtree: { cur_parent = root_parent; } chip;
@@ -26,6 +26,8 @@
devicechildren: devicechildren device | devicechildren chip | devicechildren resource | devicechildren subsystemid | devicechildren ioapic_irq | devicechildren smbios_slot_desc | devicechildren registers | /* empty */ ;
+settings: settings setting | setting; + chip: CHIP STRING /* == path */ { $<chip_instance>$ = new_chip_instance($<string>2); chip_enqueue_tail(cur_chip_instance); @@ -39,12 +41,21 @@ $<dev>$ = new_device(cur_parent, cur_chip_instance, $<number>2, $<string>3, $<number>4); cur_parent = $<dev>$->last_bus; } - devicechildren END { + config devicechildren END { cur_parent = $<dev>5->parent; };
status: BOOL | STATUS ;
+config: CONFIG STRING /* == path */ { + set_config_path(cur_parent, $<string>2); +} + settings END | /* empty */ +; + +setting: STRING /* == identifier */ EQUALS STRING /* == value */ + { add_setting(cur_parent, $<string>1, $<string>3); } ; + resource: RESOURCE NUMBER /* == resnum */ EQUALS NUMBER /* == resval */ { add_resource(cur_parent, $<number>1, strtol($<string>2, NULL, 0), strtol($<string>4, NULL, 0)); } ;
Paul Menzel has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41745 )
Change subject: [RFC] util/sconfig: Add per-device configuration ......................................................................
Patch Set 3:
a
Angel Pons has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41745 )
Change subject: [RFC] util/sconfig: Add per-device configuration ......................................................................
Patch Set 3: Code-Review+1
Tim Wawrzynczak has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41745 )
Change subject: [RFC] util/sconfig: Add per-device configuration ......................................................................
Patch Set 3:
just curious, do you have a specific use-case in mind for this?
Nico Huber has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41745 )
Change subject: [RFC] util/sconfig: Add per-device configuration ......................................................................
Patch Set 3:
just curious, do you have a specific use-case in mind for this?
Ah, plenty ;) There has a pattern evolved (I've seen mostly in soc/ intel/common/) where chip specific code is often coupled with generic drivers just to provide configuration information from the devicetree. It adds lots of odd boilerplate. What finally made me write this was `soc/intel/common/blocks/graphics/` where I wanted to consolidate existing and add more panel configuration. Eventually, that driver would be standalone then without any soc hooks. The same probably applies to many more drivers.
There's another, potential long-term idea. I would like to have an ABI for drivers. For instance, a binary module that could be placed in CBFS just like an option ROM, that can override `struct device_ operations` functions. That might need more fine-grained configu- ration too.
Tim Wawrzynczak has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41745 )
Change subject: [RFC] util/sconfig: Add per-device configuration ......................................................................
Patch Set 3:
Patch Set 3:
just curious, do you have a specific use-case in mind for this?
Ah, plenty ;) There has a pattern evolved (I've seen mostly in soc/ intel/common/) where chip specific code is often coupled with generic drivers just to provide configuration information from the devicetree. It adds lots of odd boilerplate. What finally made me write this was `soc/intel/common/blocks/graphics/` where I wanted to consolidate existing and add more panel configuration. Eventually, that driver would be standalone then without any soc hooks. The same probably applies to many more drivers.
There's another, potential long-term idea. I would like to have an ABI for drivers. For instance, a binary module that could be placed in CBFS just like an option ROM, that can override `struct device_ operations` functions. That might need more fine-grained configu- ration too.
Makes sense to me, thanks Nico!
Tim Wawrzynczak has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41745 )
Change subject: [RFC] util/sconfig: Add per-device configuration ......................................................................
Patch Set 3: Code-Review+1
LGTM. Still think this is RFC?
Tim Wawrzynczak has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/41745 )
Change subject: [RFC] util/sconfig: Add per-device configuration ......................................................................
Patch Set 3:
WDYT Nico, still an RFC or would you like to move this forward?
Martin L Roth has abandoned this change. ( https://review.coreboot.org/c/coreboot/+/41745?usp=email )
Change subject: [RFC] util/sconfig: Add per-device configuration ......................................................................
Abandoned
This patch has not been touched in over 12 months. Anyone who wants to take over work on this patch, please feel free to restore it and do any work needed to get it merged. If you create a new patch based on this work, please credit the original author.