| // SPDX-License-Identifier: (GPL-2.0+ OR MIT) |
| /* |
| * Copyright (c) 2019 Amlogic, Inc. All rights reserved. |
| */ |
| |
| #include <common.h> |
| #include <command.h> |
| #include <version.h> |
| #include <linux/compiler.h> |
| #include <asm/arch/cpu_config.h> |
| |
| const char __weak version_string[] = U_BOOT_VERSION_STRING; |
| |
| #ifdef CONFIG_BUILD_MESSAGE |
| #include <asm/arch/bl31_apis.h> |
| #include <malloc.h> |
| #include <linux/libfdt.h> |
| #include <fdt_support.h> |
| |
| #define BUFF_LENGTH 512 |
| const char compile_user[] = COMPILE_USER; |
| unsigned char *bootloader_build_message; |
| static char version_buffer[BUFF_LENGTH]; |
| static int index; |
| |
| int putin_buf(const char *str) |
| { |
| char *ptr = version_buffer; |
| int num = strlen(str); |
| |
| if ((index + num) >= BUFF_LENGTH) |
| return -1; |
| |
| ptr += index; |
| memcpy(ptr, str, num); |
| index += num; |
| |
| return 0; |
| } |
| |
| void free_build_message(void) |
| { |
| if (bootloader_build_message) |
| free(bootloader_build_message); |
| } |
| #endif |
| |
| int get_bootloader_build_message(void) |
| { |
| #ifdef CONFIG_BUILD_MESSAGE |
| static build_messages_t *build_info; |
| |
| bootloader_build_message = (uint8_t *)malloc(sizeof(build_messages_t)); |
| if (!bootloader_build_message) { |
| printf("version message malloc fail\n"); |
| return -1; |
| } |
| |
| if (!aml_get_bootloader_version(bootloader_build_message)) { |
| build_info = (build_messages_t *)(bootloader_build_message); |
| if (build_info->h.type != PARAM_MESSAGE || |
| build_info->h.version != VERSION_2 || |
| build_info->h.size != sizeof(build_messages_t)) { |
| printf("invalid build messages info head!\n"); |
| free_build_message(); |
| return -1; |
| } |
| /* |
| * snprintf(build_info->bl33_message.hash, 32, "%s", git_hash); |
| * snprintf(build_info->bl33_message.user, 32, "%s", compile_user); |
| * snprintf(build_info->bl33_message.time, 64, "%s%s", compile_time, compile_data); |
| * build_info->bl33_message.ver = INDEX_BL33_15; |
| * build_info->bl33_message.init_flag = 1; |
| */ |
| putin_buf("Bootloader:{\n"); |
| if (build_info->bl2_message.init_flag) { |
| putin_buf("\tBL2 :"); |
| if (build_info->bl2_message.ver == INDEX_SPL) |
| putin_buf(" SPL-"); |
| else if (build_info->bl2_message.ver == INDEX_CORE) |
| putin_buf(" CORE-"); |
| //putin_buf(build_info->bl2_message.ver_str); |
| //putin_buf(","); |
| putin_buf(build_info->bl2_message.hash); |
| putin_buf(","); |
| putin_buf(build_info->bl2_message.time); |
| putin_buf(","); |
| putin_buf(build_info->bl2_message.user); |
| putin_buf("\n"); |
| } |
| |
| if (build_info->bl2e_message.init_flag) { |
| putin_buf("\tBL2E: "); |
| //putin_buf(build_info->bl2e_message.ver_str); |
| //putin_buf(","); |
| putin_buf(build_info->bl2e_message.hash); |
| putin_buf(","); |
| putin_buf(build_info->bl2e_message.time); |
| putin_buf(","); |
| putin_buf(build_info->bl2e_message.user); |
| putin_buf("\n"); |
| } |
| |
| if (build_info->bl2x_message.init_flag) { |
| putin_buf("\tBL2X: "); |
| //putin_buf(build_info->bl2x_message.ver_str); |
| //putin_buf(","); |
| putin_buf(build_info->bl2x_message.hash); |
| putin_buf(","); |
| putin_buf(build_info->bl2x_message.time); |
| putin_buf(","); |
| putin_buf(build_info->bl2x_message.user); |
| putin_buf("\n"); |
| } |
| |
| if (build_info->bl30_message.init_flag) { |
| putin_buf("\tBL30: "); |
| //putin_buf(build_info->bl30_message.ver_str); |
| //putin_buf(","); |
| putin_buf(build_info->bl30_message.hash); |
| putin_buf(","); |
| putin_buf(build_info->bl30_message.time); |
| putin_buf(","); |
| putin_buf(build_info->bl30_message.user); |
| putin_buf("\n"); |
| } |
| |
| if (build_info->bl31_message.init_flag) { |
| putin_buf("\tBL31: "); |
| putin_buf(build_info->bl31_message.ver_str); |
| putin_buf(","); |
| putin_buf(build_info->bl31_message.hash); |
| putin_buf(","); |
| putin_buf(build_info->bl31_message.time); |
| putin_buf(","); |
| putin_buf(build_info->bl31_message.user); |
| putin_buf("\n"); |
| } |
| |
| if (build_info->bl32_message.init_flag) { |
| putin_buf("\tBL32 :"); |
| putin_buf(build_info->bl32_message.ver_str); |
| putin_buf(","); |
| putin_buf(build_info->bl32_message.hash); |
| putin_buf(","); |
| putin_buf(build_info->bl32_message.time); |
| putin_buf(","); |
| putin_buf(build_info->bl32_message.user); |
| putin_buf("\n"); |
| } |
| |
| putin_buf("\tBL33: "); |
| putin_buf(version_string); |
| putin_buf(","); |
| putin_buf(compile_user); |
| putin_buf("\n"); |
| putin_buf("}\n\0"); |
| |
| free_build_message(); |
| return 0; |
| } |
| #endif |
| printf("no BUILD_MESSAGE\n"); |
| |
| return -1; |
| } |
| |
| static int do_build_message_print(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
| { |
| #ifdef CONFIG_BUILD_MESSAGE |
| if (index > 0) { |
| printf("%s", version_buffer); |
| return 0; |
| } |
| #endif |
| printf("no version buffer data!"); |
| return -1; |
| } |
| |
| int fdt_bl_version(void *fdt) |
| { |
| #ifdef CONFIG_BUILD_MESSAGE |
| int nodeoffset; |
| int err; |
| |
| if (index > 0) { |
| err = fdt_check_header(fdt); |
| if (err < 0) { |
| printf("fdt_chosen: %s\n", fdt_strerror(err)); |
| return err; |
| } |
| |
| /* find or create "/chosen" node. */ |
| nodeoffset = fdt_find_or_add_subnode(fdt, 0, "chosen"); |
| if (nodeoffset < 0) |
| return nodeoffset; |
| |
| err = fdt_setprop(fdt, nodeoffset, "bootloader_build", version_buffer, |
| strlen(version_buffer) + 1); |
| if (err < 0) { |
| printf("WARNING: could not set bl2_build %s.\n", |
| fdt_strerror(err)); |
| return err; |
| } |
| } |
| #endif |
| return 0; |
| } |
| |
| static int do_bootloader_version(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
| { |
| char s_version[64]; |
| strcpy(s_version, "01.01."); |
| strcat(s_version, U_BOOT_DATE_TIME); |
| printf("s_version: %s\n", s_version); |
| env_set("bootloader_version", s_version); |
| |
| return 0; |
| } |
| |
| U_BOOT_CMD( |
| get_bootloaderversion, 1, 0, do_bootloader_version, |
| "print bootloader version", |
| "" |
| ); |
| |
| U_BOOT_CMD(build_message, 1, 1, do_build_message_print, |
| "print bl2/bl2e/bl2x/bl31/bl32/bl33 version", |
| "" |
| ); |