Ok, A second version of this patch will be provided soon.
In addition, The new version will rely on a macro(XHCI_ZHAOXIN_HOST)
provided in another patch[xhci: Add Zhaoxin xHCI LPM U1/U2 feature support].
Sincerely
LeoLiu-oc
On 2021/3/25 下午5:10, 丁宁(富邻) wrote:
Why not use quirks here?
Best Regards
Artie Ding(丁宁)
------------------原始邮件 ------------------
*发件人:*LeoLiu-oc <LeoLiu-oc(a)zhaoxin.com>
*发送时间:*Mon Mar 22 18:45:17 2021
*收件人:* <cloud-kernel(a)lists.openanolis.org>
*抄送:* <TonyWWang-oc(a)zhaoxin.com>om>, <TimGuo(a)zhaoxin.com>om>,
<CobeChen(a)zhaoxin.com>
*主题:*[ck] [patch v1] ck: xhci: fix issue of cross page boundary in
TRB prefetch mechanism
On some Zhaoxin platforms, xHCI will prefetch TRB for performance
improvement. However this TRB prefetch mechanism may cross page boundary,
which may access memory not belong to xHCI. In order to fix this issue,
using two pages for TRB allocate and only the first page will be used.
The patch is scheduled to be submitted to the kernel mainline in 2021.
Signed-off-by: LeoLiu-oc <LeoLiu-oc(a)zhaoxin.com>
---
drivers/usb/host/xhci-mem.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
index 82ce6d8b708d..9f4e1ee82898 100644
--- a/drivers/usb/host/xhci-mem.c
+++ b/drivers/usb/host/xhci-mem.c
@@ -2364,6 +2364,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
{
dma_addr_tdma;
struct device*dev = xhci_to_hcd(xhci)->self.sysdev;
+ struct pci_dev*pdev = to_pci_dev(dev);
unsigned intval, val2;
u64val_64;
u32page_size, temp;
@@ -2429,8 +2430,13 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
* and our use of dma addresses in the trb_address_map radix tree needs
* TRB_SEGMENT_SIZE alignment, so we pick the greater alignment need.
*/
-xhci->segment_pool = dma_pool_create("xHCI ring segments", dev,
-TRB_SEGMENT_SIZE, TRB_SEGMENT_SIZE, xhci->page_size);
+/*With xHCI TRB prefetch patch:To fix cross page boundry access issue
in IOV environment*/
+if ((pdev->vendor == PCI_VENDOR_ID_ZHAOXIN) && (pdev->device == 0x9202
|| pdev->device == 0x9203)) {
+xhci->segment_pool = dma_pool_create("xHCI ring segments", dev,
+ TRB_SEGMENT_SIZE*2, TRB_SEGMENT_SIZE*2, xhci->page_size*2);
+} else
+xhci->segment_pool = dma_pool_create("xHCI ring segments", dev,
+ TRB_SEGMENT_SIZE, TRB_SEGMENT_SIZE, xhci->page_size);
/* See Table 46 and Note on Figure 55 */
xhci->device_pool = dma_pool_create("xHCI input/output contexts", dev,
--
2.20.1
_______________________________________________
Cloud Kernel mailing list -- cloud-kernel(a)lists.openanolis.org
To unsubscribe send an email to cloud-kernel-leave(a)lists.openanolis.org