Re: [PATCH v3] wifi: ath10k: Add WLAN firmware image version info into smem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Nov 11, 2022 at 05:12:35PM +0530, Youghandhar Chintala wrote:

Can you please change the subject to:
wifi: ath10k: Store WLAN firmware version in SMEM image table

> In a SoC based solution, it would be useful to know the versions of the
> various binary firmware blobs the system is running on. On a QCOM based
> SoC, this info can be obtained from socinfo debugfs infrastructure. For
> this to work, respective subsystem drivers have to export the firmware
> version information to an SMEM based version information table.
> 
> Having firmware version information at one place will help quickly
> figure out the firmware versions of various subsystems on the device
> instead of going through builds/logs in an event of a system crash.
> 
> Fill WLAN firmware version information in SMEM version table to be
> printed as part of socinfo debugfs infrastructure on a Qualcomm based
> SoC.
> 
> This change is applicable only for WCN399X targets.
> 

Why is this restricted to WCN399X? Is it not the case that it only
relates to the SNOC/QMI-based implementation? Perhaps that's the same
thing, but if so I think the comment could be improved.

> Example:
> cat /sys/kernel/debug/qcom_socinfo/cnss/name
> QC_IMAGE_VERSION_STRING=WLAN.HL.3.2.2.c10-00754-QCAHLSWMTPL-1
> 
> Reported-by: kernel test robot <lkp@xxxxxxxxx>

I don't think that kernel test robot reported the lack of this feature.

> 
> Tested-on: WCN3990 hw1.0 SNOC WLAN.HL.3.2.2.c10-00754-QCAHLSWMTPL-1
> 
> Signed-off-by: Youghandhar Chintala <quic_youghand@xxxxxxxxxxx>
> ---
> Changes from v2:
>  - Removed blank line between trailers
>  - Changed memcpy to strscpy
>  - Removed version_string_size
>  - Added new condition fw_build_id against max length
>  - Added depends on QCOM_SMEM for ath10k_snoc
> ---
>  drivers/net/wireless/ath/ath10k/Kconfig |  1 +
>  drivers/net/wireless/ath/ath10k/qmi.c   | 34 +++++++++++++++++++++++++
>  2 files changed, 35 insertions(+)
> 
> diff --git a/drivers/net/wireless/ath/ath10k/Kconfig b/drivers/net/wireless/ath/ath10k/Kconfig
> index ca007b800f75..e6ea884cafc1 100644
> --- a/drivers/net/wireless/ath/ath10k/Kconfig
> +++ b/drivers/net/wireless/ath/ath10k/Kconfig
> @@ -44,6 +44,7 @@ config ATH10K_SNOC
>  	tristate "Qualcomm ath10k SNOC support"
>  	depends on ATH10K
>  	depends on ARCH_QCOM || COMPILE_TEST
> +	depends on QCOM_SMEM
>  	select QCOM_SCM
>  	select QCOM_QMI_HELPERS
>  	help
> diff --git a/drivers/net/wireless/ath/ath10k/qmi.c b/drivers/net/wireless/ath/ath10k/qmi.c
> index 66cb7a1e628a..6c3ddad26417 100644
> --- a/drivers/net/wireless/ath/ath10k/qmi.c
> +++ b/drivers/net/wireless/ath/ath10k/qmi.c
> @@ -14,6 +14,7 @@
>  #include <linux/net.h>
>  #include <linux/platform_device.h>
>  #include <linux/qcom_scm.h>
> +#include <linux/soc/qcom/smem.h>
>  #include <linux/string.h>
>  #include <net/sock.h>
>  
> @@ -22,6 +23,8 @@
>  
>  #define ATH10K_QMI_CLIENT_ID		0x4b4e454c
>  #define ATH10K_QMI_TIMEOUT		30
> +#define ATH10K_SMEM_IMAGE_VERSION_TABLE       469

This isn't the ATH10K SMEM_IMAGE_VERSION_TABLE, it's the one and only
SMEM_IMAGE_VERSION_TABLE. As that is defined in socinfo.c, you can
use the same define here.

> +#define ATH10K_SMEM_IMAGE_TABLE_CNSS_INDEX     13

SMEM_IMAGE_TABLE_CNSS_INDEX

>  
>  static int ath10k_qmi_map_msa_permission(struct ath10k_qmi *qmi,
>  					 struct ath10k_msa_mem_info *mem_info)
> @@ -536,6 +539,35 @@ int ath10k_qmi_wlan_disable(struct ath10k *ar)
>  	return ath10k_qmi_mode_send_sync_msg(ar, QMI_WLFW_OFF_V01);
>  }
>  
> +static void ath10k_qmi_add_wlan_ver_smem(struct ath10k *ar, const char *fw_build_id)
> +{
> +	u8 *smem_table_ptr;

I don't think "smem" or "ptr" adds any value in this variable name.
"table" should be sufficient.

> +	size_t smem_block_size;

This is the "smem_item_size".

> +	const u32 smem_img_idx_wlan = ATH10K_SMEM_IMAGE_TABLE_CNSS_INDEX * 128;

Why not just "offset"?

#define SMEM_IMAGE_VERSION_ENTRY_SIZE 128

Instead of writing 128 here and abusing MAX_BUILD_ID_LEN below.

> +
> +	smem_table_ptr = qcom_smem_get(QCOM_SMEM_HOST_ANY,
> +				       ATH10K_SMEM_IMAGE_VERSION_TABLE,
> +				       &smem_block_size);
> +	if (IS_ERR(smem_table_ptr)) {
> +		ath10k_dbg(ar, ATH10K_DBG_QMI,
> +			   "smem image version table not found\n");
> +		return;
> +	}
> +
> +	if (smem_img_idx_wlan + MAX_BUILD_ID_LEN > smem_block_size) {
> +		ath10k_dbg(ar, ATH10K_DBG_QMI, "smem block size too small: %zu\n",
> +			   smem_block_size);

You found a IMAGE_VERSION_TABLE, but it's smaller than expected. That
sounds like an ath10k_err() to me.

> +		return;
> +	}
> +
> +	if (strlen(fw_build_id) > MAX_BUILD_ID_LEN) {

Is this really a concern, if the string is too long strscpy() below will
truncate it.

> +		ath10k_dbg(ar, ATH10K_DBG_QMI, "fw_build_id length more than max length\n");
> +		return;
> +	}
> +
> +	strscpy(smem_table_ptr + smem_img_idx_wlan, fw_build_id, MAX_BUILD_ID_LEN);

MAX_BUILD_ID_LEN is the length of fw_build_id, which is 128.

But the memory you're writing to is defined as:

struct smem_image_version {
	char name[SMEM_IMAGE_VERSION_NAME_SIZE];
	char variant[SMEM_IMAGE_VERSION_VARIANT_SIZE];
	char pad;
	char oem[SMEM_IMAGE_VERSION_OEM_SIZE];
};

With SMEM_IMAGE_VERSION_NAME_SIZE being 75.

> +}
> +
>  static int ath10k_qmi_cap_send_sync_msg(struct ath10k_qmi *qmi)
>  {
>  	struct wlfw_cap_resp_msg_v01 *resp;
> @@ -606,6 +638,8 @@ static int ath10k_qmi_cap_send_sync_msg(struct ath10k_qmi *qmi)
>  			    qmi->fw_version, qmi->fw_build_timestamp, qmi->fw_build_id);
>  	}
>  
> +	ath10k_qmi_add_wlan_ver_smem(ar, qmi->fw_build_id);

qmi->fw_build_id is only valid if resp->fw_build_id_valid is set...

Regards,
Bjorn

> +
>  	kfree(resp);
>  	return 0;
>  
> -- 
> 2.38.0
> 



[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [Linux for Sparc]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux