diff options
author | ji.luo <ji.luo@nxp.com> | 2017-10-10 18:22:02 +0800 |
---|---|---|
committer | Jason Liu <jason.hui.liu@nxp.com> | 2017-11-03 02:37:28 +0800 |
commit | a89c0efcca55dc8bab4c8d7af806f261f92f39e8 (patch) | |
tree | c996c3620eb211a2f7d101c7047c4457dac787d0 | |
parent | 36a5dfa4d86c0a56fd91838f58cb7cd0dfce1c6e (diff) |
Pass bootloader metrics to kernel by kernel cmdline
Pass bootloader metrics (nBLL, nBLE, KD, KL, AVB, ODT, SW)
to kernel by kernel cmdline.
Change-Id: Ibabff6844be86d028548d1ad697d948ef20590f3
Signed-off-by: ji.luo <ji.luo@nxp.com>
-rw-r--r-- | common/image-android.c | 11 | ||||
-rw-r--r-- | drivers/usb/gadget/f_fastboot.c | 16 | ||||
-rw-r--r-- | include/android_image.h | 13 |
3 files changed, 39 insertions, 1 deletions
diff --git a/common/image-android.c b/common/image-android.c index d8407d4ed5..2d2526def6 100644 --- a/common/image-android.c +++ b/common/image-android.c @@ -57,6 +57,7 @@ static ulong android_image_get_kernel_addr(const struct andr_img_hdr *hdr) int android_image_get_kernel(const struct andr_img_hdr *hdr, int verify, ulong *os_data, ulong *os_len) { + extern boot_metric metrics; u32 kernel_addr = android_image_get_kernel_addr(hdr); /* @@ -73,7 +74,7 @@ int android_image_get_kernel(const struct andr_img_hdr *hdr, int verify, kernel_addr, DIV_ROUND_UP(hdr->kernel_size, 1024)); char newbootargs[512] = {0}; - char commandline[1024] = {0}; + char commandline[2048] = {0}; char *bootargs = getenv("bootargs"); if (bootargs) { @@ -122,6 +123,14 @@ int android_image_get_kernel(const struct andr_img_hdr *hdr, int verify, strcat(commandline, newbootargs); } + /* boot metric variables */ + metrics.ble_1 = get_timer(0); + sprintf(newbootargs, + " androidboot.boottime=1BLL:%d,1BLE:%d,KL:%d,KD:%d,AVB:%d,ODT:%d,SW:%d", + metrics.bll_1, metrics.ble_1, metrics.kl, metrics.kd, metrics.avb, + metrics.odt, metrics.sw); + strcat(commandline, newbootargs); + #ifdef CONFIG_AVB_SUPPORT /* secondary cmdline added by avb */ char *bootargs_sec = getenv("bootargs_sec"); diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c index 60a648e927..63ff415eca 100644 --- a/drivers/usb/gadget/f_fastboot.c +++ b/drivers/usb/gadget/f_fastboot.c @@ -109,6 +109,17 @@ char *fastboot_common_var[FASTBOOT_COMMON_VAR_NUM] = { "battery-soc-ok" }; +/* Boot metric variables */ +boot_metric metrics = { + .bll_1 = 0, + .ble_1 = 0, + .kl = 0, + .kd = 0, + .avb = 0, + .odt = 0, + .sw = 0 +}; + #ifdef CONFIG_USB_GADGET struct f_fastboot { struct usb_function usb_function; @@ -1506,6 +1517,7 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { struct andr_img_hdr *hdr = NULL; struct andr_img_hdr *hdrload; ulong image_size; + u32 avb_metric; AvbABFlowResult avb_result; AvbSlotVerifyData *avb_out_data; @@ -1520,8 +1532,12 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { lock_status = FASTBOOT_LOCK; } bool allow_fail = (lock_status == FASTBOOT_UNLOCK ? true : false); + avb_metric = get_timer(0); /* if in lock state, do avb verify */ avb_result = avb_ab_flow(&fsl_avb_ab_ops, requested_partitions, allow_fail, &avb_out_data); + /* get the duration of avb */ + metrics.avb = get_timer(avb_metric); + if (avb_result == AVB_AB_FLOW_RESULT_OK) { assert(avb_out_data != NULL); /* load the first partition */ diff --git a/include/android_image.h b/include/android_image.h index 1c70bf8e22..6fde9b7aae 100644 --- a/include/android_image.h +++ b/include/android_image.h @@ -17,6 +17,19 @@ #define ANDR_BOOT_NAME_SIZE 16 #define ANDR_BOOT_ARGS_SIZE 512 +/* Boot metric variables (in millisecond) */ +struct boot_metric +{ + u32 bll_1; /* 1th bootloader load duration */ + u32 ble_1; /* 1th bootloader exec duration */ + u32 kl; /* kernel image load duration */ + u32 kd; /* kernel image decompress duration */ + u32 avb; /* avb verify boot.img duration */ + u32 odt; /* overlay device tree duration */ + u32 sw; /* system wait for UI interaction duration*/ +}; +typedef struct boot_metric boot_metric; + struct andr_img_hdr { char magic[ANDR_BOOT_MAGIC_SIZE]; |