@@ -44,6 +44,52 @@ static void usage(void)
44
44
exit (1 );
45
45
}
46
46
47
+ static int apply_override (DTBLOB_T * base_dtb , DTBLOB_T * overlay_dtb , char * override )
48
+ {
49
+ char * param_name = override ;
50
+ char * param_value = param_name + strcspn (param_name , "=" );
51
+ const void * override_data ;
52
+ int data_len ;
53
+ int err ;
54
+
55
+ if (* param_value == '=' )
56
+ {
57
+ * (param_value ++ ) = '\0' ;
58
+ }
59
+ else
60
+ {
61
+ /* This isn't a well-formed parameter assignment, but it can be
62
+ treated as an assignment of true. */
63
+ param_value = "true" ;
64
+ }
65
+
66
+ override_data = dtoverlay_find_override (overlay_dtb , param_name ,
67
+ & data_len );
68
+ if (override_data )
69
+ {
70
+ err = dtoverlay_apply_override (overlay_dtb , param_name ,
71
+ override_data , data_len ,
72
+ param_value );
73
+ }
74
+ else
75
+ {
76
+ override_data = dtoverlay_find_override (base_dtb , param_name , & data_len );
77
+ if (override_data )
78
+ {
79
+ err = dtoverlay_apply_override (base_dtb , param_name ,
80
+ override_data , data_len ,
81
+ param_value );
82
+ }
83
+ else
84
+ {
85
+ printf ("* unknown param '%s'\n" , param_name );
86
+ err = data_len ;
87
+ }
88
+ }
89
+
90
+ return err ;
91
+ }
92
+
47
93
int main (int argc , char * * argv )
48
94
{
49
95
const char * base_file ;
@@ -128,7 +174,6 @@ int main(int argc, char **argv)
128
174
char * overlay_name ;
129
175
const char * new_name ;
130
176
char * p ;
131
- int len ;
132
177
133
178
strcpy (new_file , overlay_file );
134
179
overlay_name = strrchr (new_file , '/' );
@@ -142,18 +187,42 @@ int main(int argc, char **argv)
142
187
new_name = dtoverlay_remap_overlay (overlay_name );
143
188
if (new_name )
144
189
{
145
- if (strcmp (overlay_name , new_name ))
146
- dtoverlay_debug ("mapped overlay '%s' to '%s'" , overlay_name , new_name );
190
+ char * overrides = NULL ;
191
+ int len = strlen (overlay_name );
192
+ int new_len = strcspn (new_name , "," );
193
+ if (new_name [new_len ] && new_name [new_len + 1 ])
194
+ {
195
+ /* There are parameters */
196
+ overrides = strdup (new_name + new_len + 1 );
197
+ }
198
+ if (new_len != len || memcmp (overlay_name , new_name , len ))
199
+ {
200
+ dtoverlay_debug ("mapped overlay '%s' to '%.*s'" ,
201
+ overlay_name , new_len , new_name );
202
+ memcpy (overlay_name , new_name , new_len );
203
+ }
147
204
148
- len = strlen (new_name );
149
- memmove (overlay_name , new_name , len );
150
- strcpy (overlay_name + len , ".dtbo" );
205
+ strcpy (overlay_name + new_len , ".dtbo" );
151
206
152
207
overlay_dtb = dtoverlay_load_dtb (new_file , max_dtb_size );
153
208
if (overlay_dtb )
154
209
err = dtoverlay_fixup_overlay (base_dtb , overlay_dtb );
155
210
else
156
211
err = -1 ;
212
+
213
+ while (!err && overrides )
214
+ {
215
+ char * override = overrides ;
216
+ char * end ;
217
+ len = strcspn (override , "," );
218
+ end = override + len ;
219
+ if (* end == ',' && * (end + 1 ))
220
+ overrides = end + 1 ;
221
+ else
222
+ overrides = NULL ;
223
+ * end = '\0' ;
224
+ err = apply_override (base_dtb , overlay_dtb , override );
225
+ }
157
226
}
158
227
else
159
228
{
@@ -164,45 +233,7 @@ int main(int argc, char **argv)
164
233
165
234
while (!err && (argn < argc ))
166
235
{
167
- char * param_name = argv [argn ++ ];
168
- char * param_value = param_name + strcspn (param_name , "=" );
169
- const void * override_data ;
170
- int data_len ;
171
-
172
- if (* param_value == '=' )
173
- {
174
- * (param_value ++ ) = '\0' ;
175
- }
176
- else
177
- {
178
- /* This isn't a well-formed parameter assignment, but it can be
179
- treated as an assignment of true. */
180
- param_value = "true" ;
181
- }
182
-
183
- override_data = dtoverlay_find_override (overlay_dtb , param_name ,
184
- & data_len );
185
- if (override_data )
186
- {
187
- err = dtoverlay_apply_override (overlay_dtb , param_name ,
188
- override_data , data_len ,
189
- param_value );
190
- }
191
- else
192
- {
193
- override_data = dtoverlay_find_override (base_dtb , param_name , & data_len );
194
- if (override_data )
195
- {
196
- err = dtoverlay_apply_override (base_dtb , param_name ,
197
- override_data , data_len ,
198
- param_value );
199
- }
200
- else
201
- {
202
- printf ("* unknown param '%s'\n" , param_name );
203
- err = data_len ;
204
- }
205
- }
236
+ err = apply_override (base_dtb , overlay_dtb , argv [argn ++ ]);
206
237
}
207
238
208
239
if (!err && (overlay_dtb != base_dtb ))
0 commit comments