mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
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: 579a267e46
("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>
This commit is contained in:
parent
70ec81c2e2
commit
2360497238
@ -138,12 +138,13 @@ static void release_dma_bufs(struct ishtp_device *dev,
|
||||
struct loader_xfer_dma_fragment *fragment,
|
||||
void **dma_bufs, u32 fragment_size)
|
||||
{
|
||||
dma_addr_t dma_addr;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < FRAGMENT_MAX_NUM; i++) {
|
||||
if (dma_bufs[i]) {
|
||||
dma_free_coherent(dev->devc, fragment_size, dma_bufs[i],
|
||||
fragment->fragment_tbl[i].ddr_adrs);
|
||||
dma_addr = le64_to_cpu(fragment->fragment_tbl[i].ddr_adrs);
|
||||
dma_free_coherent(dev->devc, fragment_size, dma_bufs[i], dma_addr);
|
||||
dma_bufs[i] = NULL;
|
||||
}
|
||||
}
|
||||
@ -164,15 +165,16 @@ static int prepare_dma_bufs(struct ishtp_device *dev,
|
||||
struct loader_xfer_dma_fragment *fragment,
|
||||
void **dma_bufs, u32 fragment_size)
|
||||
{
|
||||
dma_addr_t dma_addr;
|
||||
u32 offset = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < fragment->fragment_cnt && offset < ish_fw->size; i++) {
|
||||
dma_bufs[i] = dma_alloc_coherent(dev->devc, fragment_size,
|
||||
&fragment->fragment_tbl[i].ddr_adrs, GFP_KERNEL);
|
||||
dma_bufs[i] = dma_alloc_coherent(dev->devc, fragment_size, &dma_addr, GFP_KERNEL);
|
||||
if (!dma_bufs[i])
|
||||
return -ENOMEM;
|
||||
|
||||
fragment->fragment_tbl[i].ddr_adrs = cpu_to_le64(dma_addr);
|
||||
fragment->fragment_tbl[i].length = clamp(ish_fw->size - offset, 0, fragment_size);
|
||||
fragment->fragment_tbl[i].fw_off = offset;
|
||||
memcpy(dma_bufs[i], ish_fw->data + offset, fragment->fragment_tbl[i].length);
|
||||
|
Loading…
Reference in New Issue
Block a user