platform: msm_shared: Correct invalidate cache actions
When invalidate cache, address and size must be aligned
to CACHE_LINE, if not, the arch_invalidate_cache_range
api itself will do the alignment, that may cause valid
data lost which is not yet cleaned to cache.
So correct invalidate cache actions by use CACHE_LINE
aligned address and size explicitly. Use memalign,
STACKBUF_DMA_ALIGN or BUF_DMA_ALIGN to alloc space
which will used for cache invalidate and have the size
alloc Round to CACHE_LINE.
Change-Id: I30c3f101481fd259c631c48501988fd403a8627b
diff --git a/platform/msm_shared/usb30_dwc_hw.c b/platform/msm_shared/usb30_dwc_hw.c
index 2ca1a54..04d896e 100644
--- a/platform/msm_shared/usb30_dwc_hw.c
+++ b/platform/msm_shared/usb30_dwc_hw.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013,2015 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013, 2015, 2018 The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -490,11 +490,9 @@
/* get event buffer for this device */
buf = dev->event_buf.buf;
- /* invalidate cached event buf data */
- arch_invalidate_cache_range((addr_t) (buf + dev->event_buf.index), 4);
-
+ arch_invalidate_cache_range((addr_t)buf, dev->event_buf.buf_size);
/* read next event */
- *event = buf[dev->event_buf.index];
+ *event = readl(buf + dev->event_buf.index);
event_size += 4;
dwc_event_update_index(&dev->event_buf.index, dev->event_buf.max_index);
@@ -511,17 +509,11 @@
if( DWC_EVENT_IS_DEVICE_EVENT(*event) &
(DWC_EVENT_DEVICE_EVENT_ID(*event) == DWC_EVENT_DEVICE_EVENT_ID_VENDOR_DEVICE_TEST_LMP))
{
- /* invalidate cached event buf data */
- arch_invalidate_cache_range((addr_t) (buf + dev->event_buf.index), 4);
-
- *(event + 1) = buf[dev->event_buf.index];
+ *(event + 1) = readl(buf + dev->event_buf.index);
event_size += 4;
dwc_event_update_index(&dev->event_buf.index, dev->event_buf.buf_size);
- /* invalidate cached event buf data */
- arch_invalidate_cache_range((addr_t) (buf + dev->event_buf.index), 4);
-
- *(event + 1) = buf[dev->event_buf.index];
+ *(event + 1) = readl(buf + dev->event_buf.index);
event_size += 4;
dwc_event_update_index(&dev->event_buf.index, dev->event_buf.buf_size);
}