Skip to content

Commit 9c3dd00

Browse files
committed
dtmerge: Support parameters from renames
Move the main override application wrapper into a helper function, and use it to also support parameters added as part of a rename. Signed-off-by: Phil Elwell <[email protected]>
1 parent 28a6fa0 commit 9c3dd00

File tree

1 file changed

+76
-45
lines changed

1 file changed

+76
-45
lines changed

dtmerge/dtmerge.c

Lines changed: 76 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,52 @@ static void usage(void)
4444
exit(1);
4545
}
4646

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+
4793
int main(int argc, char **argv)
4894
{
4995
const char *base_file;
@@ -128,7 +174,6 @@ int main(int argc, char **argv)
128174
char *overlay_name;
129175
const char *new_name;
130176
char *p;
131-
int len;
132177

133178
strcpy(new_file, overlay_file);
134179
overlay_name = strrchr(new_file, '/');
@@ -142,18 +187,42 @@ int main(int argc, char **argv)
142187
new_name = dtoverlay_remap_overlay(overlay_name);
143188
if (new_name)
144189
{
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+
}
147204

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");
151206

152207
overlay_dtb = dtoverlay_load_dtb(new_file, max_dtb_size);
153208
if (overlay_dtb)
154209
err = dtoverlay_fixup_overlay(base_dtb, overlay_dtb);
155210
else
156211
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+
}
157226
}
158227
else
159228
{
@@ -164,45 +233,7 @@ int main(int argc, char **argv)
164233

165234
while (!err && (argn < argc))
166235
{
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++]);
206237
}
207238

208239
if (!err && (overlay_dtb != base_dtb))

0 commit comments

Comments
 (0)