// SPDX-License-Identifier: GPL-2.0 #include #include /* * This file contains a fallback to the legacy avm_kernel_* api if available. * * To easy the migration to fw_info this can be used. */ /* * Declare the external symbols needed. Don't use a header here to avoid * introducing a dependency on the actual kernel. */ extern struct _avm_kernel_module_memory_config *avm_kernel_module_memory_config; extern struct _avm_kernel_version_info *avm_kernel_version_info; extern struct _avm_kernel_urlader_env *avm_kernel_urlader_env; /* * Define these symbols as weak and initialize them with NULL. * * Some kernels did not support avm_kernel_* at all (like puma6) but won't use * the fw_info mechanism. So define weak symbols to provide an empty api. */ __weak struct _avm_kernel_module_memory_config *avm_kernel_module_memory_config; __weak struct _avm_kernel_version_info *avm_kernel_version_info; __weak struct _avm_kernel_urlader_env *avm_kernel_urlader_env; __init void avm_fw_info_init(void) { } const char *avm_fw_version(void) { if (!avm_kernel_version_info) return NULL; return avm_kernel_version_info->firmwarestring; } bool avm_fw_is_internal(void) { int len; if (!avm_kernel_version_info) return NULL; len = strlen(avm_kernel_version_info->svnversion); return len && avm_kernel_version_info->svnversion[len - 1] == 'M'; } struct _avm_kernel_module_memory_config *avm_fw_module_sizes(void) { return avm_kernel_module_memory_config; } struct _avm_kernel_urlader_env *avm_fw_urlader_env(void) { return avm_kernel_urlader_env; } static __init int fw_info_print_banner(void) { const char *version = avm_fw_version(); if (!version) version = "unknown"; if (avm_fw_is_internal()) pr_err("Version %s (internal only)\n", version); else pr_err("Version %s\n", version); return 0; } postcore_initcall(fw_info_print_banner);