Skip to content

Commit ca01910

Browse files
committed
ODROID-COMMON: fix to load device tree files matches to kernel version
Boot directory in Linux system may contains multiple kernel versions with dedicated device tree files, but boot loader does not know about kernel version to start if not given by 'fk_kvers'. So this patch is to gather 'fk_kvers' from 'config.ini' if set via 'fk_kvers=...' or if there is a symbolic link file 'dtb' that points to the device tree file under 'dtbs/<kernel version/rockchip/<device tree file>. Signed-off-by: Dongjin Kim <[email protected]> Change-Id: I576f6f40690a3552c334289b078a9efceea757c8
1 parent 9fbb701 commit ca01910

File tree

2 files changed

+64
-28
lines changed

2 files changed

+64
-28
lines changed

board/hardkernel/odroid-common/board.c

Lines changed: 56 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -212,10 +212,10 @@ int rk_board_late_init(void)
212212
return 0;
213213
}
214214

215-
int dtoverlay_apply(void *fdt, const char *dtoverlay, struct blk_desc *dev_desc)
215+
int dtoverlay_apply(void *fdt, const char *dtoverlay, struct blk_desc *dev_desc,
216+
const char *root)
216217
{
217218
char *paths[] = {
218-
"",
219219
"overlays/"CONFIG_BOARDNAME"/",
220220
"rockchip/overlays/"CONFIG_BOARDNAME"/",
221221
};
@@ -229,7 +229,7 @@ int dtoverlay_apply(void *fdt, const char *dtoverlay, struct blk_desc *dev_desc)
229229
ulong fdt_dtbo = env_get_ulong("loadaddr", 16, 0);
230230

231231
for (i = 0; i < ARRAY_SIZE(paths); i++) {
232-
snprintf(buf, sizeof(buf), "%s%s.dtbo", paths[i], dtoverlay);
232+
snprintf(buf, sizeof(buf), "%s%s%s.dtbo", root, paths[i], dtoverlay);
233233

234234
if (dev_desc)
235235
ret = load_from_mmc(fdt_dtbo, dev_desc->devnum, 1, buf);
@@ -247,49 +247,78 @@ int dtoverlay_apply(void *fdt, const char *dtoverlay, struct blk_desc *dev_desc)
247247
return -1;
248248
}
249249

250+
static int load_boot_config(void)
251+
{
252+
int ret = -EINVAL;
253+
254+
run_command_list(
255+
"load mmc 0:1 $loadaddr config.ini;"
256+
"ini generic $loadaddr",
257+
-1, 0);
258+
259+
char *overlay_profile = env_get("overlay_profile");
260+
if (overlay_profile) {
261+
char buf[32];
262+
snprintf(buf, sizeof(buf), "ini overlay_%s $loadaddr", overlay_profile);
263+
run_command(buf, 0);
264+
}
265+
266+
char *overlays = env_get("overlays");
267+
const char *token = strtok(overlays, " ");
268+
while (token != NULL) {
269+
if (!strncmp(token, "display_", 8)) {
270+
ret = set_panel_name(token);
271+
break;
272+
}
273+
token = strtok(NULL, " ");
274+
}
275+
276+
return ret;
277+
}
278+
250279
int board_read_dtb_file(void *fdt_addr)
251280
{
252281
int ret;
253282

254283
ret = load_from_cramfs((unsigned long)fdt_addr, CONFIG_ROCKCHIP_EARLY_DISTRO_DTB_PATH);
255284
if (!ret) {
256285
if (panel)
257-
ret = dtoverlay_apply(fdt_addr, panel, NULL);
286+
ret = dtoverlay_apply(fdt_addr, panel, NULL, NULL);
258287
} else {
288+
load_boot_config();
289+
259290
char *paths[] = {
260291
"dtb",
261292
"rockchip/"CONFIG_ROCKCHIP_EARLY_DISTRO_DTB_PATH,
262293
};
263294
struct blk_desc *dev_desc = rockchip_get_bootdev();
264295
int i;
296+
char buf[1024];
297+
char root[1024];
298+
299+
char *kvers = env_get("fk_kvers");
300+
if (!kvers) {
301+
/* Try to get kernel version from 'dtb' which must
302+
* be symbol link of device tree file in Linux
303+
*/
304+
load_from_mmc((unsigned long)fdt_addr, dev_desc->devnum, 1, "dtb");
305+
}
306+
307+
kvers = env_get("fk_kvers");
308+
if (kvers) {
309+
/* Set default device tree file with given kernel version */
310+
snprintf(root, sizeof(root), "dtbs/%s/rockchip/", kvers);
311+
strcpy(buf, root);
312+
strcat(buf, CONFIG_ROCKCHIP_EARLY_DISTRO_DTB_PATH);
313+
314+
paths[0] = buf;
315+
}
265316

266317
for (i = 0; i < ARRAY_SIZE(paths); i++) {
267318
ret = load_from_mmc((unsigned long)fdt_addr, dev_desc->devnum, 1, paths[i]);
268319
if (!ret) {
269-
run_command_list(
270-
"load mmc 0:1 $loadaddr config.ini;"
271-
"ini generic $loadaddr",
272-
-1, 0);
273-
274-
char *overlay_profile = env_get("overlay_profile");
275-
if (overlay_profile) {
276-
char buf[32];
277-
snprintf(buf, sizeof(buf), "ini overlay_%s $loadaddr", overlay_profile);
278-
run_command(buf, 0);
279-
}
280-
281-
char *overlays = env_get("overlays");
282-
const char *token = strtok(overlays, " ");
283-
while (token != NULL) {
284-
if (!strncmp(token, "display_", 8)) {
285-
set_panel_name(token);
286-
break;
287-
}
288-
token = strtok(NULL, " ");
289-
}
290-
291320
if (panel)
292-
ret = dtoverlay_apply(fdt_addr, panel, dev_desc);
321+
ret = dtoverlay_apply(fdt_addr, panel, dev_desc, root);
293322
break;
294323
}
295324
}

fs/ext4/ext4_common.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2241,7 +2241,6 @@ static int ext4fs_find_file1(const char *currpath,
22412241
}
22422242

22432243
debug("Got symlink >%s<\n", symlink);
2244-
22452244
if (symlink[0] == '/') {
22462245
ext4fs_free_node(oldnode, currroot);
22472246
oldnode = &ext4fs_root->diropen;
@@ -2251,6 +2250,14 @@ static int ext4fs_find_file1(const char *currpath,
22512250
status = ext4fs_find_file1(symlink, oldnode,
22522251
&currnode, &type);
22532252

2253+
/* Take kernel version from symlink path if start
2254+
* with 'dtbs/.../...' and store it to 'fk_kvers'
2255+
*/
2256+
if (!strncmp(symlink, "dtbs/", 5)) {
2257+
char *token = strtok(symlink + 5, "/");
2258+
env_set("fk_kvers", token);
2259+
}
2260+
22542261
free(symlink);
22552262

22562263
if (status == 0) {

0 commit comments

Comments
 (0)