Commit fd5fd480 authored by Chunming Zhou's avatar Chunming Zhou Committed by Alex Deucher

drm/amdgpu: only enable swiotlb alloc when need v2

get the max io mapping address of system memory to see if it is over
our card accessing range.
v2: move checking later
Signed-off-by: default avatarChunming Zhou <david1.zhou@amd.com>
Reviewed-by: default avatarMonk Liu <monk.liu@amd.com>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180209024410.1469-2-david1.zhou@amd.com
parent 82626363
...@@ -1504,6 +1504,7 @@ struct amdgpu_device { ...@@ -1504,6 +1504,7 @@ struct amdgpu_device {
const struct amdgpu_asic_funcs *asic_funcs; const struct amdgpu_asic_funcs *asic_funcs;
bool shutdown; bool shutdown;
bool need_dma32; bool need_dma32;
bool need_swiotlb;
bool accel_working; bool accel_working;
struct work_struct reset_work; struct work_struct reset_work;
struct notifier_block acpi_nb; struct notifier_block acpi_nb;
......
...@@ -1018,7 +1018,7 @@ static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm, ...@@ -1018,7 +1018,7 @@ static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm,
} }
#ifdef CONFIG_SWIOTLB #ifdef CONFIG_SWIOTLB
if (swiotlb_nr_tbl()) { if (adev->need_swiotlb && swiotlb_nr_tbl()) {
return ttm_dma_populate(&gtt->ttm, adev->dev, ctx); return ttm_dma_populate(&gtt->ttm, adev->dev, ctx);
} }
#endif #endif
...@@ -1045,7 +1045,7 @@ static void amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm) ...@@ -1045,7 +1045,7 @@ static void amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm)
adev = amdgpu_ttm_adev(ttm->bdev); adev = amdgpu_ttm_adev(ttm->bdev);
#ifdef CONFIG_SWIOTLB #ifdef CONFIG_SWIOTLB
if (swiotlb_nr_tbl()) { if (adev->need_swiotlb && swiotlb_nr_tbl()) {
ttm_dma_unpopulate(&gtt->ttm, adev->dev); ttm_dma_unpopulate(&gtt->ttm, adev->dev);
return; return;
} }
...@@ -2010,7 +2010,7 @@ static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev) ...@@ -2010,7 +2010,7 @@ static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
count = ARRAY_SIZE(amdgpu_ttm_debugfs_list); count = ARRAY_SIZE(amdgpu_ttm_debugfs_list);
#ifdef CONFIG_SWIOTLB #ifdef CONFIG_SWIOTLB
if (!swiotlb_nr_tbl()) if (!(adev->need_swiotlb && swiotlb_nr_tbl()))
--count; --count;
#endif #endif
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
*/ */
#include <linux/firmware.h> #include <linux/firmware.h>
#include <drm/drmP.h> #include <drm/drmP.h>
#include <drm/drm_cache.h>
#include "amdgpu.h" #include "amdgpu.h"
#include "gmc_v6_0.h" #include "gmc_v6_0.h"
#include "amdgpu_ucode.h" #include "amdgpu_ucode.h"
...@@ -851,6 +852,7 @@ static int gmc_v6_0_sw_init(void *handle) ...@@ -851,6 +852,7 @@ static int gmc_v6_0_sw_init(void *handle)
pci_set_consistent_dma_mask(adev->pdev, DMA_BIT_MASK(32)); pci_set_consistent_dma_mask(adev->pdev, DMA_BIT_MASK(32));
dev_warn(adev->dev, "amdgpu: No coherent DMA available.\n"); dev_warn(adev->dev, "amdgpu: No coherent DMA available.\n");
} }
adev->need_swiotlb = drm_get_max_iomem() > ((u64)1 << dma_bits);
r = gmc_v6_0_init_microcode(adev); r = gmc_v6_0_init_microcode(adev);
if (r) { if (r) {
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
*/ */
#include <linux/firmware.h> #include <linux/firmware.h>
#include <drm/drmP.h> #include <drm/drmP.h>
#include <drm/drm_cache.h>
#include "amdgpu.h" #include "amdgpu.h"
#include "cikd.h" #include "cikd.h"
#include "cik.h" #include "cik.h"
...@@ -999,6 +1000,7 @@ static int gmc_v7_0_sw_init(void *handle) ...@@ -999,6 +1000,7 @@ static int gmc_v7_0_sw_init(void *handle)
pci_set_consistent_dma_mask(adev->pdev, DMA_BIT_MASK(32)); pci_set_consistent_dma_mask(adev->pdev, DMA_BIT_MASK(32));
pr_warn("amdgpu: No coherent DMA available\n"); pr_warn("amdgpu: No coherent DMA available\n");
} }
adev->need_swiotlb = drm_get_max_iomem() > ((u64)1 << dma_bits);
r = gmc_v7_0_init_microcode(adev); r = gmc_v7_0_init_microcode(adev);
if (r) { if (r) {
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
*/ */
#include <linux/firmware.h> #include <linux/firmware.h>
#include <drm/drmP.h> #include <drm/drmP.h>
#include <drm/drm_cache.h>
#include "amdgpu.h" #include "amdgpu.h"
#include "gmc_v8_0.h" #include "gmc_v8_0.h"
#include "amdgpu_ucode.h" #include "amdgpu_ucode.h"
...@@ -1085,6 +1086,7 @@ static int gmc_v8_0_sw_init(void *handle) ...@@ -1085,6 +1086,7 @@ static int gmc_v8_0_sw_init(void *handle)
*/ */
adev->need_dma32 = false; adev->need_dma32 = false;
dma_bits = adev->need_dma32 ? 32 : 40; dma_bits = adev->need_dma32 ? 32 : 40;
adev->need_swiotlb = drm_get_max_iomem() > ((u64)1 << dma_bits);
r = pci_set_dma_mask(adev->pdev, DMA_BIT_MASK(dma_bits)); r = pci_set_dma_mask(adev->pdev, DMA_BIT_MASK(dma_bits));
if (r) { if (r) {
adev->need_dma32 = true; adev->need_dma32 = true;
...@@ -1096,6 +1098,7 @@ static int gmc_v8_0_sw_init(void *handle) ...@@ -1096,6 +1098,7 @@ static int gmc_v8_0_sw_init(void *handle)
pci_set_consistent_dma_mask(adev->pdev, DMA_BIT_MASK(32)); pci_set_consistent_dma_mask(adev->pdev, DMA_BIT_MASK(32));
pr_warn("amdgpu: No coherent DMA available\n"); pr_warn("amdgpu: No coherent DMA available\n");
} }
adev->need_swiotlb = drm_get_max_iomem() > ((u64)1 << dma_bits);
r = gmc_v8_0_init_microcode(adev); r = gmc_v8_0_init_microcode(adev);
if (r) { if (r) {
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
* *
*/ */
#include <linux/firmware.h> #include <linux/firmware.h>
#include <drm/drm_cache.h>
#include "amdgpu.h" #include "amdgpu.h"
#include "gmc_v9_0.h" #include "gmc_v9_0.h"
#include "amdgpu_atomfirmware.h" #include "amdgpu_atomfirmware.h"
...@@ -850,6 +851,7 @@ static int gmc_v9_0_sw_init(void *handle) ...@@ -850,6 +851,7 @@ static int gmc_v9_0_sw_init(void *handle)
pci_set_consistent_dma_mask(adev->pdev, DMA_BIT_MASK(32)); pci_set_consistent_dma_mask(adev->pdev, DMA_BIT_MASK(32));
printk(KERN_WARNING "amdgpu: No coherent DMA available.\n"); printk(KERN_WARNING "amdgpu: No coherent DMA available.\n");
} }
adev->need_swiotlb = drm_get_max_iomem() > ((u64)1 << dma_bits);
r = gmc_v9_0_mc_init(adev); r = gmc_v9_0_mc_init(adev);
if (r) if (r)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment