Skip to content

Commit 0d65831

Browse files
committed
linuxloader: Introduce device_quirks
1 parent 0a8fa3e commit 0d65831

4 files changed

Lines changed: 63 additions & 0 deletions

File tree

droidbootPlatformsLib.inf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
[Sources]
4242
uefi/common/droidboot_uefi_common.c
4343
uefi/common_linuxloader/common_linuxloader.c
44+
uefi/common_linuxloader/device_quirks.c
4445
uefi/common_linuxloader/linux-boot/arm.c
4546
common/droidboot_platform_common.c
4647

uefi/common_linuxloader/common_linuxloader.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <droidboot_dtb.h>
2222
#include <droidboot_kernel_helper.h>
2323
#include <droidboot_ufdt_overlay.h>
24+
#include <device_quirks.h>
2425

2526
#include "linux-boot/arm.h"
2627

@@ -171,6 +172,7 @@ void droidboot_internal_boot_linux_from_ram(void *kernel_raw, off_t kernel_raw_s
171172
}
172173
}
173174
}
175+
174176
droidboot_log(DROIDBOOT_LOG_INFO, "dtb reallocation done, old addr: %p new: %p, new size: %llx\n", dtb_raw, dtb_address, dtb_raw_size);
175177

176178
// Update size in dtb itself
@@ -212,6 +214,9 @@ void droidboot_internal_boot_linux_from_ram(void *kernel_raw, off_t kernel_raw_s
212214
}
213215
droidboot_dtb_update_cmdline(dtb_address, &cmdline);
214216

217+
// As a last step apply platform specific hacks, if any
218+
droidboot_uefi_dtb_device_patch(dtb_address, model);
219+
215220
// Boot new kernel
216221
boot_linux_arm(kernel_reallocated+LINUX_ARM64_OFFSET, kernel_actual_size, dtb_address, dtb_raw_size);
217222
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#include <string.h>
2+
3+
#include <droidboot_logging.h>
4+
#include <droidboot_error.h>
5+
#include <droidboot_libufdt.h>
6+
#include <sys/types.h>
7+
#include <droidboot_libfdt.h>
8+
9+
// We need device name from dtbo as it apparently not overlayed by ufdt
10+
droidboot_error droidboot_uefi_dtb_device_patch(void*fdt, char *device_name)
11+
{
12+
droidboot_error err;
13+
uint off;
14+
15+
// Check fdt header, just in case
16+
err = fdt_check_header(fdt);
17+
if(err!=0){
18+
droidboot_log(DROIDBOOT_LOG_ERROR, "dtb header check failed: %d\n", err);
19+
return err;
20+
}
21+
22+
// On some devices BL disable firmware node, if left enable confuses android's init
23+
/* if (strstr(device_name, "pipa") != NULL || strstr(device_name, "vayu") != NULL){
24+
droidboot_log(DROIDBOOT_LOG_INFO, "device quirks: Patching dtb, disable fstab/vendor\n");
25+
err=fdt_path_offset(fdt,"/firmware/android/fstab/vendor");
26+
if(err<0){
27+
droidboot_log(DROIDBOOT_LOG_ERROR, "get chosen node failed: %s\n", fdt_strerror(err));
28+
return err;
29+
}
30+
off=err;
31+
err=fdt_setprop_string(fdt, off, "status", "disabled");
32+
if(err<0){
33+
droidboot_log(DROIDBOOT_LOG_ERROR, "Setting status failed: %s\n", fdt_strerror(err));
34+
return err;
35+
}
36+
}*/
37+
38+
if (strstr(device_name, "pipa") != NULL){
39+
droidboot_log(DROIDBOOT_LOG_INFO, "device quirks: Patching dtb, adding ddr type\n");
40+
err=fdt_path_offset(fdt,"/memory");
41+
if(err<0){
42+
droidboot_log(DROIDBOOT_LOG_ERROR, "get memory node failed: %s\n", fdt_strerror(err));
43+
return err;
44+
}
45+
off=err;
46+
err=fdt_setprop_u32(fdt,off,"ddr_device_type",0x88);
47+
if(err<0){
48+
droidboot_log(DROIDBOOT_LOG_ERROR, "Setting status failed: %s\n", fdt_strerror(err));
49+
return err;
50+
}
51+
}
52+
return DROIDBOOT_EOK;
53+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#pragma once
2+
#include <droidboot_error.h>
3+
4+
droidboot_error droidboot_uefi_dtb_device_patch(void*fdt, char *device_name);

0 commit comments

Comments
 (0)