>-----Original Message----- >From: Arnd Bergmann <arnd@xxxxxxxxxx> >Sent: Tuesday, May 28, 2024 7:58 PM >To: Srinivas Pandruvada <srinivas.pandruvada@xxxxxxxxxxxxxxx>; Jiri Kosina ><jikos@xxxxxxxxxx>; Benjamin Tissoires <bentiss@xxxxxxxxxx>; Zhang, Lixu ><lixu.zhang@xxxxxxxxx> >Cc: Arnd Bergmann <arnd@xxxxxxxx>; linux-input@xxxxxxxxxxxxxxx; linux- >kernel@xxxxxxxxxxxxxxx >Subject: [PATCH 1/2] HID: intel-ish-hid: fix cache management mistake > >From: Arnd Bergmann <arnd@xxxxxxxx> > >The low-level cache operation on a coherent buffer is incorrect, as coherent >DMA memory may not actually be cached. Instead, use a DMA barrier that >ensures that the data is visible to the DMA master before the address is and >move the memcpy() before the reference. > >Fixes: 579a267e4617 ("HID: intel-ish-hid: Implement loading firmware from >host feature") >Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx> >--- >I noticed this one while looking at the bug that was fixed in >236049723826 ("HID: intel-ish-hid: Fix build error for COMPILE_TEST") >--- > drivers/hid/intel-ish-hid/ishtp/loader.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > >diff --git a/drivers/hid/intel-ish-hid/ishtp/loader.c b/drivers/hid/intel-ish- >hid/ishtp/loader.c >index 2785b04a2f5a..062d1b25eaa7 100644 >--- a/drivers/hid/intel-ish-hid/ishtp/loader.c >+++ b/drivers/hid/intel-ish-hid/ishtp/loader.c >@@ -33,7 +33,6 @@ > > #define dev_fmt(fmt) "ISH loader: " fmt > >-#include <linux/cacheflush.h> > #include <linux/container_of.h> > #include <linux/dev_printk.h> > #include <linux/dma-mapping.h> >@@ -175,10 +174,11 @@ static int prepare_dma_bufs(struct ishtp_device >*dev, > return -ENOMEM; > > fragment->fragment_tbl[i].ddr_adrs = >cpu_to_le64(dma_addr); >+ >+ memcpy(dma_bufs[i], ish_fw->data + offset, fragment- >>fragment_tbl[i].length); fragment->fragment_tbl[i].length was used before assignment. >+ dma_wmb(); I tested it on the platform, but it didn't wok. Thanks, Lixu > 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); >- clflush_cache_range(dma_bufs[i], fragment_size); > > offset += fragment->fragment_tbl[i].length; > } >-- >2.39.2