Author: imp
Date: Wed Jul 10 22:23:59 2019
New Revision: 349895
URL: https://svnweb.freebsd.org/changeset/base/349895

Log:
  Enforce a 4GB DMA boundary on isci(4)
  
  This device cannot cross a 4GB boundary with DMA.  Removing the
  boundary in r346386 resulted in low frequency memory corruption on
  machines with isci(4) controllers.
  
  Submitted by: gallatin@
  Sponsored by: Netflix
  Differential Revision: https://reviews.freebsd.org/D20910

Modified:
  head/sys/dev/isci/isci.c
  head/sys/dev/isci/isci.h
  head/sys/dev/isci/isci_controller.c

Modified: head/sys/dev/isci/isci.c
==============================================================================
--- head/sys/dev/isci/isci.c    Wed Jul 10 21:35:55 2019        (r349894)
+++ head/sys/dev/isci/isci.c    Wed Jul 10 22:23:59 2019        (r349895)
@@ -414,7 +414,8 @@ isci_allocate_dma_buffer(device_t device, struct ISCI_
        uint32_t status;
 
        status = bus_dma_tag_create(bus_get_dma_tag(device),
-           0x40 /* cacheline alignment */, 0x0, BUS_SPACE_MAXADDR,
+           0x40 /* cacheline alignment */,
+           ISCI_DMA_BOUNDARY, BUS_SPACE_MAXADDR,
            BUS_SPACE_MAXADDR, NULL, NULL, memory->size,
            0x1 /* we want physically contiguous */,
            memory->size, 0, busdma_lock_mutex, &controller->lock,

Modified: head/sys/dev/isci/isci.h
==============================================================================
--- head/sys/dev/isci/isci.h    Wed Jul 10 21:35:55 2019        (r349894)
+++ head/sys/dev/isci/isci.h    Wed Jul 10 22:23:59 2019        (r349895)
@@ -75,6 +75,9 @@
 #define ISCI_NUM_PCI_BARS  2
 #define ISCI_MAX_LUN            8
 
+/* This device cannot DMA across a 4GB boundary */
+#define        ISCI_DMA_BOUNDARY               ((bus_addr_t)((uint64_t)1 << 
32))
+
 MALLOC_DECLARE(M_ISCI);
 
 struct ISCI_TIMER {

Modified: head/sys/dev/isci/isci_controller.c
==============================================================================
--- head/sys/dev/isci/isci_controller.c Wed Jul 10 21:35:55 2019        
(r349894)
+++ head/sys/dev/isci/isci_controller.c Wed Jul 10 22:23:59 2019        
(r349895)
@@ -477,9 +477,9 @@ int isci_controller_allocate_memory(struct ISCI_CONTRO
         *  will enable better performance than creating the DMA maps every 
time we get
         *  an I/O.
         */
-       status = bus_dma_tag_create(bus_get_dma_tag(device), 0x1, 0x0,
-           BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL,
-           isci_io_request_get_max_io_size(),
+       status = bus_dma_tag_create(bus_get_dma_tag(device), 0x1,
+           ISCI_DMA_BOUNDARY, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
+           NULL, NULL, isci_io_request_get_max_io_size(),
            SCI_MAX_SCATTER_GATHER_ELEMENTS, max_segment_size, 0,
            busdma_lock_mutex, &controller->lock,
            &controller->buffer_dma_tag);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to