ioat3: dca and raid operations are incompatible
RAID operations cause a system hang on platforms with DCA (Direct-Cache-Access) enabled. So turn off RAID capabilities in this case. Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
parent
e22dde9904
commit
228c4f5cfb
|
@ -103,7 +103,7 @@ static int dca_enabled_in_bios(struct pci_dev *pdev)
|
|||
return res;
|
||||
}
|
||||
|
||||
static int system_has_dca_enabled(struct pci_dev *pdev)
|
||||
int system_has_dca_enabled(struct pci_dev *pdev)
|
||||
{
|
||||
if (boot_cpu_has(X86_FEATURE_DCA))
|
||||
return dca_enabled_in_bios(pdev);
|
||||
|
|
|
@ -1117,6 +1117,7 @@ static int __devinit ioat3_dma_self_test(struct ioatdma_device *device)
|
|||
int __devinit ioat3_dma_probe(struct ioatdma_device *device, int dca)
|
||||
{
|
||||
struct pci_dev *pdev = device->pdev;
|
||||
int dca_en = system_has_dca_enabled(pdev);
|
||||
struct dma_device *dma;
|
||||
struct dma_chan *c;
|
||||
struct ioat_chan_common *chan;
|
||||
|
@ -1137,6 +1138,11 @@ int __devinit ioat3_dma_probe(struct ioatdma_device *device, int dca)
|
|||
dma->device_prep_dma_interrupt = ioat3_prep_interrupt_lock;
|
||||
|
||||
cap = readl(device->reg_base + IOAT_DMA_CAP_OFFSET);
|
||||
|
||||
/* dca is incompatible with raid operations */
|
||||
if (dca_en && (cap & (IOAT_CAP_XOR|IOAT_CAP_PQ)))
|
||||
cap &= ~(IOAT_CAP_XOR|IOAT_CAP_PQ);
|
||||
|
||||
if (cap & IOAT_CAP_XOR) {
|
||||
is_raid_device = true;
|
||||
dma->max_xor = 8;
|
||||
|
|
|
@ -39,6 +39,8 @@
|
|||
#define IOAT_VER_3_0 0x30 /* Version 3.0 */
|
||||
#define IOAT_VER_3_2 0x32 /* Version 3.2 */
|
||||
|
||||
int system_has_dca_enabled(struct pci_dev *pdev);
|
||||
|
||||
struct ioat_dma_descriptor {
|
||||
uint32_t size;
|
||||
union {
|
||||
|
|
Loading…
Reference in New Issue