diff mbox series

wifi: ath10k: Add WLAN firmware image version info into smem

Message ID 20221026102257.19919-1-quic_youghand@quicinc.com
State Superseded
Headers show
Series wifi: ath10k: Add WLAN firmware image version info into smem | expand

Commit Message

Youghandhar Chintala Oct. 26, 2022, 10:22 a.m. UTC
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.

Tested-on: WCN3990 hw1.0 SNOC WLAN.HL.3.2.2.c10-00754-QCAHLSWMTPL-1

Signed-off-by: Youghandhar Chintala <quic_youghand@quicinc.com>
---
 drivers/net/wireless/ath/ath10k/qmi.c | 28 +++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

Comments

Youghandhar Chintala Oct. 31, 2022, 6:54 a.m. UTC | #1
On 10/28/2022 12:19 AM, Jeff Johnson wrote:
> On 10/26/2022 3:22 AM, Youghandhar Chintala wrote:
>> 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.
>>
>> Tested-on: WCN3990 hw1.0 SNOC WLAN.HL.3.2.2.c10-00754-QCAHLSWMTPL-1
>>
>> Signed-off-by: Youghandhar Chintala <quic_youghand@quicinc.com>
>> ---
>>   drivers/net/wireless/ath/ath10k/qmi.c | 28 +++++++++++++++++++++++++++
>>   1 file changed, 28 insertions(+)
>>
>> diff --git a/drivers/net/wireless/ath/ath10k/qmi.c 
>> b/drivers/net/wireless/ath/ath10k/qmi.c
>> index 66cb7a1e628a..e88bcfd96859 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
>> +#define ATH10K_SMEM_IMAGE_TABLE_CNSS_INDEX     13
>>     static int ath10k_qmi_map_msa_permission(struct ath10k_qmi *qmi,
>>                        struct ath10k_msa_mem_info *mem_info)
>> @@ -536,6 +539,29 @@ 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, char 
>> *fw_build_id)
>
> const char *fw_build_id?
>
>> +{
>> +    u8 *smem_table_ptr;
>> +    size_t smem_block_size;
>> +    const u32 version_string_size = 128;
>
> should you s/128/MAX_BUILD_ID_LEN/ since that is what is used to size 
> qmi->fw_build_id?
>
> or alternately have the caller pass fw_build_id length as a separate 
> param?
>   Sure Jeff. Will address it in next version of patch.
>
>> +    const u32 smem_img_idx_wlan = ATH10K_SMEM_IMAGE_TABLE_CNSS_INDEX 
>> * 128;
>> +
>> +    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");
>> +        return;
>> +    }
>> +    if (smem_img_idx_wlan + version_string_size > smem_block_size) {
>> +        ath10k_dbg(ar, ATH10K_DBG_QMI, "smem block size too small: %i",
>> +               smem_block_size);
>> +        return;
>> +    }
>> +    memcpy(smem_table_ptr + smem_img_idx_wlan, fw_build_id,
>> +           version_string_size);
>> +}
>> +
>>   static int ath10k_qmi_cap_send_sync_msg(struct ath10k_qmi *qmi)
>>   {
>>       struct wlfw_cap_resp_msg_v01 *resp;
>> @@ -606,6 +632,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);
>> +
>>       kfree(resp);
>>       return 0;
>
Kalle Valo Nov. 1, 2022, 9:01 a.m. UTC | #2
(fixing quotation)

"Youghandhar Chintala (Temp)" <quic_youghand@quicinc.com> writes:

> On 10/28/2022 12:19 AM, Jeff Johnson wrote:
>
>> On 10/26/2022 3:22 AM, Youghandhar Chintala wrote:

>>>   +static void ath10k_qmi_add_wlan_ver_smem(struct ath10k *ar, char
>>> *fw_build_id)
>>
>> const char *fw_build_id?
>>
>>> +{
>>> +    u8 *smem_table_ptr;
>>> +    size_t smem_block_size;
>>> +    const u32 version_string_size = 128;
>>
>> should you s/128/MAX_BUILD_ID_LEN/ since that is what is used to
>> size qmi->fw_build_id?
>>
>> or alternately have the caller pass fw_build_id length as a separate
>> param?
>
> Sure Jeff. Will address it in next version of patch.

BTW Youghandhar, your quotes were broken in this mail so your reply was
difficult to find. See here:

https://patchwork.kernel.org/project/linux-wireless/patch/20221026102257.19919-1-quic_youghand@quicinc.com/

If you are using Outlook, I recommend switching to an application which
respects standards more :) For example, some people seem to be happy
with Thunderbird.
Youghandhar Chintala Nov. 1, 2022, 9:08 a.m. UTC | #3
On 11/1/2022 2:31 PM, Kalle Valo wrote:
> (fixing quotation)
>
> "Youghandhar Chintala (Temp)" <quic_youghand@quicinc.com> writes:
>
>> On 10/28/2022 12:19 AM, Jeff Johnson wrote:
>>
>>> On 10/26/2022 3:22 AM, Youghandhar Chintala wrote:
>>>>    +static void ath10k_qmi_add_wlan_ver_smem(struct ath10k *ar, char
>>>> *fw_build_id)
>>> const char *fw_build_id?
>>>
>>>> +{
>>>> +    u8 *smem_table_ptr;
>>>> +    size_t smem_block_size;
>>>> +    const u32 version_string_size = 128;
>>> should you s/128/MAX_BUILD_ID_LEN/ since that is what is used to
>>> size qmi->fw_build_id?
>>>
>>> or alternately have the caller pass fw_build_id length as a separate
>>> param?
>> Sure Jeff. Will address it in next version of patch.
> BTW Youghandhar, your quotes were broken in this mail so your reply was
> difficult to find. See here:
>
> https://patchwork.kernel.org/project/linux-wireless/patch/20221026102257.19919-1-quic_youghand@quicinc.com/
>
> If you are using Outlook, I recommend switching to an application which
> respects standards more :) For example, some people seem to be happy
> with Thunderbird.


Thank you so much for your suggestion. I will address it.

Currently I am using  Thunderbird.
Kalle Valo Nov. 1, 2022, 9:29 a.m. UTC | #4
"Youghandhar Chintala (Temp)" <quic_youghand@quicinc.com> writes:

> On 11/1/2022 2:31 PM, Kalle Valo wrote:
>
>> BTW Youghandhar, your quotes were broken in this mail so your reply was
>> difficult to find. See here:
>>
>> https://patchwork.kernel.org/project/linux-wireless/patch/20221026102257.19919-1-quic_youghand@quicinc.com/
>>
>> If you are using Outlook, I recommend switching to an application which
>> respects standards more :) For example, some people seem to be happy
>> with Thunderbird.
>
>
> Thank you so much for your suggestion. I will address it.
>
> Currently I am using  Thunderbird.

Good, and now your quotes were correct.
diff mbox series

Patch

diff --git a/drivers/net/wireless/ath/ath10k/qmi.c b/drivers/net/wireless/ath/ath10k/qmi.c
index 66cb7a1e628a..e88bcfd96859 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
+#define ATH10K_SMEM_IMAGE_TABLE_CNSS_INDEX     13
 
 static int ath10k_qmi_map_msa_permission(struct ath10k_qmi *qmi,
 					 struct ath10k_msa_mem_info *mem_info)
@@ -536,6 +539,29 @@  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, char *fw_build_id)
+{
+	u8 *smem_table_ptr;
+	size_t smem_block_size;
+	const u32 version_string_size = 128;
+	const u32 smem_img_idx_wlan = ATH10K_SMEM_IMAGE_TABLE_CNSS_INDEX * 128;
+
+	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");
+		return;
+	}
+	if (smem_img_idx_wlan + version_string_size > smem_block_size) {
+		ath10k_dbg(ar, ATH10K_DBG_QMI, "smem block size too small: %i",
+			   smem_block_size);
+		return;
+	}
+	memcpy(smem_table_ptr + smem_img_idx_wlan, fw_build_id,
+	       version_string_size);
+}
+
 static int ath10k_qmi_cap_send_sync_msg(struct ath10k_qmi *qmi)
 {
 	struct wlfw_cap_resp_msg_v01 *resp;
@@ -606,6 +632,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);
+
 	kfree(resp);
 	return 0;