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
This commit is contained in:
Warner Losh 2019-07-10 22:23:59 +00:00
parent 3b0b41e613
commit f6ccd325fc
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=349895
3 changed files with 8 additions and 4 deletions

View File

@ -414,7 +414,8 @@ isci_allocate_dma_buffer(device_t device, struct ISCI_CONTROLLER *controller,
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,

View File

@ -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 {

View File

@ -477,9 +477,9 @@ int isci_controller_allocate_memory(struct ISCI_CONTROLLER *controller)
* 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);