Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

HID: intel-ish-hid: Fix build error for COMPILE_TEST

kernel test robot reported build error due to a pointer type mismatch:

.../ishtp/loader.c:172:8: error: incompatible pointer types passing
'__le64 *' (aka 'unsigned long long *') to parameter of type
'dma_addr_t *' (aka 'unsigned int *')

The issue arises because the driver, which is primarily intended for
x86-64, is also built for i386 when COMPILE_TEST is enabled.

Resolve type mismatch by using a temporary dma_addr_t variable to hold
the DMA address. Populate this temporary variable in dma_alloc_coherent()
function, and then convert and store the address in the
fragment->fragment_tbl[i].ddr_adrs field in the correct format.
Similarly, convert the ddr_adrs field back to dma_addr_t when freeing
the DMA buffer with dma_free_coherent().

Fixes: 579a267e4617 ("HID: intel-ish-hid: Implement loading firmware from host feature")
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202405201313.SAStVPrT-lkp@intel.com/
Signed-off-by: Zhang Lixu <lixu.zhang@intel.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>

authored by

Zhang Lixu and committed by
Jiri Kosina
23604972 70ec81c2

+6 -4
+6 -4
drivers/hid/intel-ish-hid/ishtp/loader.c
··· 138 138 struct loader_xfer_dma_fragment *fragment, 139 139 void **dma_bufs, u32 fragment_size) 140 140 { 141 + dma_addr_t dma_addr; 141 142 int i; 142 143 143 144 for (i = 0; i < FRAGMENT_MAX_NUM; i++) { 144 145 if (dma_bufs[i]) { 145 - dma_free_coherent(dev->devc, fragment_size, dma_bufs[i], 146 - fragment->fragment_tbl[i].ddr_adrs); 146 + dma_addr = le64_to_cpu(fragment->fragment_tbl[i].ddr_adrs); 147 + dma_free_coherent(dev->devc, fragment_size, dma_bufs[i], dma_addr); 147 148 dma_bufs[i] = NULL; 148 149 } 149 150 } ··· 165 164 struct loader_xfer_dma_fragment *fragment, 166 165 void **dma_bufs, u32 fragment_size) 167 166 { 167 + dma_addr_t dma_addr; 168 168 u32 offset = 0; 169 169 int i; 170 170 171 171 for (i = 0; i < fragment->fragment_cnt && offset < ish_fw->size; i++) { 172 - dma_bufs[i] = dma_alloc_coherent(dev->devc, fragment_size, 173 - &fragment->fragment_tbl[i].ddr_adrs, GFP_KERNEL); 172 + dma_bufs[i] = dma_alloc_coherent(dev->devc, fragment_size, &dma_addr, GFP_KERNEL); 174 173 if (!dma_bufs[i]) 175 174 return -ENOMEM; 176 175 176 + fragment->fragment_tbl[i].ddr_adrs = cpu_to_le64(dma_addr); 177 177 fragment->fragment_tbl[i].length = clamp(ish_fw->size - offset, 0, fragment_size); 178 178 fragment->fragment_tbl[i].fw_off = offset; 179 179 memcpy(dma_bufs[i], ish_fw->data + offset, fragment->fragment_tbl[i].length);