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
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
© 2016 - 2025 Red Hat, Inc.