[PATCH v2 RESEND 2/4] soc: qcom: fix QMI encoding/decoding for basic elements

Alexander Wilhelm posted 4 patches 2 weeks, 1 day ago
There is a newer version of this series
[PATCH v2 RESEND 2/4] soc: qcom: fix QMI encoding/decoding for basic elements
Posted by Alexander Wilhelm 2 weeks, 1 day ago
Extend the QMI byte encoding and decoding logic to support multiple basic
data type sizes (u8, u16, u32, u64) using existing macros for generic
access. Ensure correct handling of data sizes and proper byte order
conversion on big-endian platforms by consistently applying these macros
during encoding and decoding of basic elements.

Fixes: 9b8a11e82615 ("soc: qcom: Introduce QMI encoder/decoder")
Signed-off-by: Alexander Wilhelm <alexander.wilhelm@westermo.com>
---
 drivers/soc/qcom/qmi_encdec.c | 50 ++++++++++++++++++++++++++---------
 1 file changed, 38 insertions(+), 12 deletions(-)

diff --git a/drivers/soc/qcom/qmi_encdec.c b/drivers/soc/qcom/qmi_encdec.c
index cb43531a8b66..d8575e92dbf6 100644
--- a/drivers/soc/qcom/qmi_encdec.c
+++ b/drivers/soc/qcom/qmi_encdec.c
@@ -36,18 +36,16 @@
 	*p_length |= ((u8)*p_src) << 8; \
 } while (0)
 
-#define QMI_ENCDEC_ENCODE_N_BYTES(p_dst, p_src, size) \
-do { \
-	memcpy(p_dst, p_src, size); \
-	p_dst = (u8 *)p_dst + size; \
-	p_src = (u8 *)p_src + size; \
+#define QMI_ENCDEC_ENCODE_N_BYTES(p_dst, p_src, type) do { \
+	*(type *)(p_dst) = QMI_ENCDEC_ENCODE(*(type *)(p_src), type); \
+	p_dst = (u8 *)(p_dst) + sizeof(type); \
+	p_src = (u8 *)(p_src) + sizeof(type); \
 } while (0)
 
-#define QMI_ENCDEC_DECODE_N_BYTES(p_dst, p_src, size) \
-do { \
-	memcpy(p_dst, p_src, size); \
-	p_dst = (u8 *)p_dst + size; \
-	p_src = (u8 *)p_src + size; \
+#define QMI_ENCDEC_DECODE_N_BYTES(p_dst, p_src, type) do { \
+	*(type *)(p_dst) = QMI_ENCDEC_DECODE(*(type *)(p_src), type); \
+	p_dst = (u8 *)(p_dst) + sizeof(type); \
+	p_src = (u8 *)(p_src) + sizeof(type); \
 } while (0)
 
 #define UPDATE_ENCODE_VARIABLES(temp_si, buf_dst, \
@@ -182,7 +180,21 @@ static int qmi_encode_basic_elem(void *buf_dst, const void *buf_src,
 	u32 i, rc = 0;
 
 	for (i = 0; i < elem_len; i++) {
-		QMI_ENCDEC_ENCODE_N_BYTES(buf_dst, buf_src, elem_size);
+		switch (elem_size) {
+		case sizeof(u8):
+			QMI_ENCDEC_ENCODE_N_BYTES(buf_dst, buf_src, u8);
+			break;
+		case sizeof(u16):
+			QMI_ENCDEC_ENCODE_N_BYTES(buf_dst, buf_src, u16);
+			break;
+		case sizeof(u32):
+			QMI_ENCDEC_ENCODE_N_BYTES(buf_dst, buf_src, u32);
+			break;
+		case sizeof(u64):
+			QMI_ENCDEC_ENCODE_N_BYTES(buf_dst, buf_src, u64);
+			break;
+		}
+
 		rc += elem_size;
 	}
 
@@ -465,7 +477,21 @@ static int qmi_decode_basic_elem(void *buf_dst, const void *buf_src,
 	u32 i, rc = 0;
 
 	for (i = 0; i < elem_len; i++) {
-		QMI_ENCDEC_DECODE_N_BYTES(buf_dst, buf_src, elem_size);
+		switch (elem_size) {
+		case sizeof(u8):
+			QMI_ENCDEC_DECODE_N_BYTES(buf_dst, buf_src, u8);
+			break;
+		case sizeof(u16):
+			QMI_ENCDEC_DECODE_N_BYTES(buf_dst, buf_src, u16);
+			break;
+		case sizeof(u32):
+			QMI_ENCDEC_DECODE_N_BYTES(buf_dst, buf_src, u32);
+			break;
+		case sizeof(u64):
+			QMI_ENCDEC_DECODE_N_BYTES(buf_dst, buf_src, u64);
+			break;
+		}
+
 		rc += elem_size;
 	}
 
-- 
2.43.0
Re: [PATCH v2 RESEND 2/4] soc: qcom: fix QMI encoding/decoding for basic elements
Posted by kernel test robot 2 weeks ago
Hi Alexander,

kernel test robot noticed the following build warnings:

[auto build test WARNING on ath/ath-next]
[also build test WARNING on linus/master v6.17-rc6 next-20250917]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Alexander-Wilhelm/soc-qcom-introduce-generic-QMI-encoding-decoding-macros/20250917-150826
base:   https://git.kernel.org/pub/scm/linux/kernel/git/ath/ath.git ath-next
patch link:    https://lore.kernel.org/r/20250917070428.2909-3-alexander.wilhelm%40westermo.com
patch subject: [PATCH v2 RESEND 2/4] soc: qcom: fix QMI encoding/decoding for basic elements
config: openrisc-randconfig-r132-20250918 (https://download.01.org/0day-ci/archive/20250918/202509181302.j10W2wCw-lkp@intel.com/config)
compiler: or1k-linux-gcc (GCC) 15.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250918/202509181302.j10W2wCw-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202509181302.j10W2wCw-lkp@intel.com/

sparse warnings: (new ones prefixed by >>)
   drivers/soc/qcom/qmi_encdec.c:384:55: sparse: sparse: cast to restricted __le16
   drivers/soc/qcom/qmi_encdec.c:384:55: sparse: sparse: cast to restricted __le16
   drivers/soc/qcom/qmi_encdec.c:384:55: sparse: sparse: cast to restricted __le16
   drivers/soc/qcom/qmi_encdec.c:384:55: sparse: sparse: cast to restricted __le16
   drivers/soc/qcom/qmi_encdec.c:715:31: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned int [usertype] val32 @@     got restricted __le32 [usertype] @@
   drivers/soc/qcom/qmi_encdec.c:715:31: sparse:     expected unsigned int [usertype] val32
   drivers/soc/qcom/qmi_encdec.c:715:31: sparse:     got restricted __le32 [usertype]
>> drivers/soc/qcom/qmi_encdec.c:188:25: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned short [usertype] @@     got restricted __le16 [usertype] @@
   drivers/soc/qcom/qmi_encdec.c:188:25: sparse:     expected unsigned short [usertype]
   drivers/soc/qcom/qmi_encdec.c:188:25: sparse:     got restricted __le16 [usertype]
>> drivers/soc/qcom/qmi_encdec.c:191:25: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned int [usertype] @@     got restricted __le32 [usertype] @@
   drivers/soc/qcom/qmi_encdec.c:191:25: sparse:     expected unsigned int [usertype]
   drivers/soc/qcom/qmi_encdec.c:191:25: sparse:     got restricted __le32 [usertype]
>> drivers/soc/qcom/qmi_encdec.c:194:25: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned long long [usertype] @@     got restricted __le64 [usertype] @@
   drivers/soc/qcom/qmi_encdec.c:194:25: sparse:     expected unsigned long long [usertype]
   drivers/soc/qcom/qmi_encdec.c:194:25: sparse:     got restricted __le64 [usertype]
   drivers/soc/qcom/qmi_encdec.c:485:25: sparse: sparse: cast to restricted __le16
   drivers/soc/qcom/qmi_encdec.c:485:25: sparse: sparse: cast to restricted __le16
   drivers/soc/qcom/qmi_encdec.c:485:25: sparse: sparse: cast to restricted __le16
   drivers/soc/qcom/qmi_encdec.c:485:25: sparse: sparse: cast to restricted __le16
>> drivers/soc/qcom/qmi_encdec.c:488:25: sparse: sparse: cast to restricted __le32
>> drivers/soc/qcom/qmi_encdec.c:488:25: sparse: sparse: cast to restricted __le32
>> drivers/soc/qcom/qmi_encdec.c:488:25: sparse: sparse: cast to restricted __le32
>> drivers/soc/qcom/qmi_encdec.c:488:25: sparse: sparse: cast to restricted __le32
>> drivers/soc/qcom/qmi_encdec.c:488:25: sparse: sparse: cast to restricted __le32
>> drivers/soc/qcom/qmi_encdec.c:488:25: sparse: sparse: cast to restricted __le32
>> drivers/soc/qcom/qmi_encdec.c:491:25: sparse: sparse: cast to restricted __le64
>> drivers/soc/qcom/qmi_encdec.c:491:25: sparse: sparse: cast to restricted __le64
>> drivers/soc/qcom/qmi_encdec.c:491:25: sparse: sparse: cast to restricted __le64
>> drivers/soc/qcom/qmi_encdec.c:491:25: sparse: sparse: cast to restricted __le64
>> drivers/soc/qcom/qmi_encdec.c:491:25: sparse: sparse: cast to restricted __le64
>> drivers/soc/qcom/qmi_encdec.c:491:25: sparse: sparse: cast to restricted __le64
>> drivers/soc/qcom/qmi_encdec.c:491:25: sparse: sparse: cast to restricted __le64
>> drivers/soc/qcom/qmi_encdec.c:491:25: sparse: sparse: cast to restricted __le64
>> drivers/soc/qcom/qmi_encdec.c:491:25: sparse: sparse: cast to restricted __le64
>> drivers/soc/qcom/qmi_encdec.c:491:25: sparse: sparse: cast to restricted __le64

vim +188 drivers/soc/qcom/qmi_encdec.c

   161	
   162	/**
   163	 * qmi_encode_basic_elem() - Encodes elements of basic/primary data type
   164	 * @buf_dst: Buffer to store the encoded information.
   165	 * @buf_src: Buffer containing the elements to be encoded.
   166	 * @elem_len: Number of elements, in the buf_src, to be encoded.
   167	 * @elem_size: Size of a single instance of the element to be encoded.
   168	 *
   169	 * This function encodes the "elem_len" number of data elements, each of
   170	 * size "elem_size" bytes from the source buffer "buf_src" and stores the
   171	 * encoded information in the destination buffer "buf_dst". The elements are
   172	 * of primary data type which include u8 - u64 or similar. This
   173	 * function returns the number of bytes of encoded information.
   174	 *
   175	 * Return: The number of bytes of encoded information.
   176	 */
   177	static int qmi_encode_basic_elem(void *buf_dst, const void *buf_src,
   178					 u32 elem_len, u32 elem_size)
   179	{
   180		u32 i, rc = 0;
   181	
   182		for (i = 0; i < elem_len; i++) {
   183			switch (elem_size) {
   184			case sizeof(u8):
   185				QMI_ENCDEC_ENCODE_N_BYTES(buf_dst, buf_src, u8);
   186				break;
   187			case sizeof(u16):
 > 188				QMI_ENCDEC_ENCODE_N_BYTES(buf_dst, buf_src, u16);
   189				break;
   190			case sizeof(u32):
 > 191				QMI_ENCDEC_ENCODE_N_BYTES(buf_dst, buf_src, u32);
   192				break;
   193			case sizeof(u64):
 > 194				QMI_ENCDEC_ENCODE_N_BYTES(buf_dst, buf_src, u64);
   195				break;
   196			}
   197	
   198			rc += elem_size;
   199		}
   200	
   201		return rc;
   202	}
   203	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki