提交 0351cbb9 编写于 作者: S Shivasharan S 提交者: Xie XiuQi

scsi: megaraid_sas: Use 63-bit DMA addressing

mainline inclusion
from mainline-5.0-rc1
commit 894169db12463cea08d0e2a9e35f42b291340e5a
category: bugfix
bugzilla: 5896
CVE: NA

---------------------------

Although MegaRAID controllers support 64-bit DMA addressing, as per
hardware design, DMA address with all 64-bits set
(0xFFFFFFFF-FFFFFFFF) results in a firmware fault.

Driver will set 63-bit DMA mask to ensure the above address will not be
used.

Cc: stable@vger.kernel.org
Signed-off-by: NShivasharan S <shivasharan.srikanteshwara@broadcom.com>
Signed-off-by: NMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Nzhengbin <zhengbin13@huawei.com>
Reviewed-by: NJason Yan <yanaijie@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 ae37010e
...@@ -6023,13 +6023,13 @@ static int megasas_io_attach(struct megasas_instance *instance) ...@@ -6023,13 +6023,13 @@ static int megasas_io_attach(struct megasas_instance *instance)
* @instance: Adapter soft state * @instance: Adapter soft state
* Description: * Description:
* *
* For Ventura, driver/FW will operate in 64bit DMA addresses. * For Ventura, driver/FW will operate in 63bit DMA addresses.
* *
* For invader- * For invader-
* By default, driver/FW will operate in 32bit DMA addresses * By default, driver/FW will operate in 32bit DMA addresses
* for consistent DMA mapping but if 32 bit consistent * for consistent DMA mapping but if 32 bit consistent
* DMA mask fails, driver will try with 64 bit consistent * DMA mask fails, driver will try with 63 bit consistent
* mask provided FW is true 64bit DMA capable * mask provided FW is true 63bit DMA capable
* *
* For older controllers(Thunderbolt and MFI based adapters)- * For older controllers(Thunderbolt and MFI based adapters)-
* driver/FW will operate in 32 bit consistent DMA addresses. * driver/FW will operate in 32 bit consistent DMA addresses.
...@@ -6043,14 +6043,14 @@ megasas_set_dma_mask(struct megasas_instance *instance) ...@@ -6043,14 +6043,14 @@ megasas_set_dma_mask(struct megasas_instance *instance)
pdev = instance->pdev; pdev = instance->pdev;
consistent_mask = (instance->adapter_type == VENTURA_SERIES) ? consistent_mask = (instance->adapter_type == VENTURA_SERIES) ?
DMA_BIT_MASK(64) : DMA_BIT_MASK(32); DMA_BIT_MASK(63) : DMA_BIT_MASK(32);
if (IS_DMA64) { if (IS_DMA64) {
if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)) && if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(63)) &&
dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32))) dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)))
goto fail_set_dma_mask; goto fail_set_dma_mask;
if ((*pdev->dev.dma_mask == DMA_BIT_MASK(64)) && if ((*pdev->dev.dma_mask == DMA_BIT_MASK(63)) &&
(dma_set_coherent_mask(&pdev->dev, consistent_mask) && (dma_set_coherent_mask(&pdev->dev, consistent_mask) &&
dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)))) { dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)))) {
/* /*
...@@ -6063,7 +6063,7 @@ megasas_set_dma_mask(struct megasas_instance *instance) ...@@ -6063,7 +6063,7 @@ megasas_set_dma_mask(struct megasas_instance *instance)
if (!(scratch_pad_2 & MR_CAN_HANDLE_64_BIT_DMA_OFFSET)) if (!(scratch_pad_2 & MR_CAN_HANDLE_64_BIT_DMA_OFFSET))
goto fail_set_dma_mask; goto fail_set_dma_mask;
else if (dma_set_mask_and_coherent(&pdev->dev, else if (dma_set_mask_and_coherent(&pdev->dev,
DMA_BIT_MASK(64))) DMA_BIT_MASK(63)))
goto fail_set_dma_mask; goto fail_set_dma_mask;
} }
} else if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32))) } else if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)))
...@@ -6075,8 +6075,8 @@ megasas_set_dma_mask(struct megasas_instance *instance) ...@@ -6075,8 +6075,8 @@ megasas_set_dma_mask(struct megasas_instance *instance)
instance->consistent_mask_64bit = true; instance->consistent_mask_64bit = true;
dev_info(&pdev->dev, "%s bit DMA mask and %s bit consistent mask\n", dev_info(&pdev->dev, "%s bit DMA mask and %s bit consistent mask\n",
((*pdev->dev.dma_mask == DMA_BIT_MASK(64)) ? "64" : "32"), ((*pdev->dev.dma_mask == DMA_BIT_MASK(64)) ? "63" : "32"),
(instance->consistent_mask_64bit ? "64" : "32")); (instance->consistent_mask_64bit ? "63" : "32"));
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册