Message ID | 20180208060017.30780-2-david1.zhou@amd.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Am 08.02.2018 um 07:00 schrieb Chunming Zhou: > get the max io mapping address of system memory to see if it is over > our card accessing range. > > Change-Id: Ibc38dbd34a20af5b4a4b1ed154c14e1c58aa4c55 > Signed-off-by: Chunming Zhou <david1.zhou@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 6 +++--- > drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 2 ++ > drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 2 ++ > drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 2 ++ > drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 2 ++ > 6 files changed, 12 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > index 257424dd8a52..627a06185368 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > @@ -1437,6 +1437,7 @@ struct amdgpu_device { > const struct amdgpu_asic_funcs *asic_funcs; > bool shutdown; > bool need_dma32; > + bool need_swiotlb; > bool accel_working; > struct work_struct reset_work; > struct notifier_block acpi_nb; > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c > index 95f990140f2a..a021de9629ad 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c > @@ -1018,7 +1018,7 @@ static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm, > } > > #ifdef CONFIG_SWIOTLB > - if (swiotlb_nr_tbl()) { > + if (adev->need_swiotlb && swiotlb_nr_tbl()) { > return ttm_dma_populate(>t->ttm, adev->dev, ctx); > } > #endif > @@ -1045,7 +1045,7 @@ static void amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm) > adev = amdgpu_ttm_adev(ttm->bdev); > > #ifdef CONFIG_SWIOTLB > - if (swiotlb_nr_tbl()) { > + if (adev->need_swiotlb && swiotlb_nr_tbl()) { > ttm_dma_unpopulate(>t->ttm, adev->dev); > return; > } > @@ -2007,7 +2007,7 @@ static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev) > count = ARRAY_SIZE(amdgpu_ttm_debugfs_list); > > #ifdef CONFIG_SWIOTLB > - if (!swiotlb_nr_tbl()) > + if (!(adev->need_swiotlb && swiotlb_nr_tbl())) > --count; > #endif > > diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c > index 5eacc0819b66..63d0720ac21f 100644 > --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c > @@ -22,6 +22,7 @@ > */ > #include <linux/firmware.h> > #include <drm/drmP.h> > +#include <drm/drm_cache.h> > #include "amdgpu.h" > #include "gmc_v6_0.h" > #include "amdgpu_ucode.h" > @@ -855,6 +856,7 @@ static int gmc_v6_0_sw_init(void *handle) > > adev->need_dma32 = false; > dma_bits = adev->need_dma32 ? 32 : 40; > + adev->need_swiotlb = drm_get_max_iomem() > ((u64)1 << dma_bits); The code here is mixed up. The check needs to come later, after we tried to set the dma_mask and possible failed. Same for all other GMC variants as well. Apart from that the series looks good to me, Christian. > r = pci_set_dma_mask(adev->pdev, DMA_BIT_MASK(dma_bits)); > if (r) { > adev->need_dma32 = true; > diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c > index ce7f484f86f9..f70a81fcadec 100644 > --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c > @@ -22,6 +22,7 @@ > */ > #include <linux/firmware.h> > #include <drm/drmP.h> > +#include <drm/drm_cache.h> > #include "amdgpu.h" > #include "cikd.h" > #include "cik.h" > @@ -1003,6 +1004,7 @@ static int gmc_v7_0_sw_init(void *handle) > */ > adev->need_dma32 = false; > 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)); > if (r) { > adev->need_dma32 = true; > diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c > index f53f3936fd4f..21fe9afb6e73 100644 > --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c > @@ -22,6 +22,7 @@ > */ > #include <linux/firmware.h> > #include <drm/drmP.h> > +#include <drm/drm_cache.h> > #include "amdgpu.h" > #include "gmc_v8_0.h" > #include "amdgpu_ucode.h" > @@ -1101,6 +1102,7 @@ static int gmc_v8_0_sw_init(void *handle) > */ > adev->need_dma32 = false; > 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)); > if (r) { > adev->need_dma32 = true; > diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c > index 2c60981d2eec..8730768efd13 100644 > --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c > @@ -21,6 +21,7 @@ > * > */ > #include <linux/firmware.h> > +#include <drm/drm_cache.h> > #include "amdgpu.h" > #include "gmc_v9_0.h" > #include "amdgpu_atomfirmware.h" > @@ -879,6 +880,7 @@ static int gmc_v9_0_sw_init(void *handle) > */ > adev->need_dma32 = false; > dma_bits = adev->need_dma32 ? 32 : 44; > + adev->need_swiotlb = drm_get_max_iomem() > ((u64)1 << dma_bits); > r = pci_set_dma_mask(adev->pdev, DMA_BIT_MASK(dma_bits)); > if (r) { > adev->need_dma32 = true;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 257424dd8a52..627a06185368 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -1437,6 +1437,7 @@ struct amdgpu_device { const struct amdgpu_asic_funcs *asic_funcs; bool shutdown; bool need_dma32; + bool need_swiotlb; bool accel_working; struct work_struct reset_work; struct notifier_block acpi_nb; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 95f990140f2a..a021de9629ad 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -1018,7 +1018,7 @@ static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm, } #ifdef CONFIG_SWIOTLB - if (swiotlb_nr_tbl()) { + if (adev->need_swiotlb && swiotlb_nr_tbl()) { return ttm_dma_populate(>t->ttm, adev->dev, ctx); } #endif @@ -1045,7 +1045,7 @@ static void amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm) adev = amdgpu_ttm_adev(ttm->bdev); #ifdef CONFIG_SWIOTLB - if (swiotlb_nr_tbl()) { + if (adev->need_swiotlb && swiotlb_nr_tbl()) { ttm_dma_unpopulate(>t->ttm, adev->dev); return; } @@ -2007,7 +2007,7 @@ static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev) count = ARRAY_SIZE(amdgpu_ttm_debugfs_list); #ifdef CONFIG_SWIOTLB - if (!swiotlb_nr_tbl()) + if (!(adev->need_swiotlb && swiotlb_nr_tbl())) --count; #endif diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c index 5eacc0819b66..63d0720ac21f 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c @@ -22,6 +22,7 @@ */ #include <linux/firmware.h> #include <drm/drmP.h> +#include <drm/drm_cache.h> #include "amdgpu.h" #include "gmc_v6_0.h" #include "amdgpu_ucode.h" @@ -855,6 +856,7 @@ static int gmc_v6_0_sw_init(void *handle) adev->need_dma32 = false; 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)); if (r) { adev->need_dma32 = true; diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c index ce7f484f86f9..f70a81fcadec 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c @@ -22,6 +22,7 @@ */ #include <linux/firmware.h> #include <drm/drmP.h> +#include <drm/drm_cache.h> #include "amdgpu.h" #include "cikd.h" #include "cik.h" @@ -1003,6 +1004,7 @@ static int gmc_v7_0_sw_init(void *handle) */ adev->need_dma32 = false; 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)); if (r) { adev->need_dma32 = true; diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c index f53f3936fd4f..21fe9afb6e73 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c @@ -22,6 +22,7 @@ */ #include <linux/firmware.h> #include <drm/drmP.h> +#include <drm/drm_cache.h> #include "amdgpu.h" #include "gmc_v8_0.h" #include "amdgpu_ucode.h" @@ -1101,6 +1102,7 @@ static int gmc_v8_0_sw_init(void *handle) */ adev->need_dma32 = false; 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)); if (r) { adev->need_dma32 = true; diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c index 2c60981d2eec..8730768efd13 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c @@ -21,6 +21,7 @@ * */ #include <linux/firmware.h> +#include <drm/drm_cache.h> #include "amdgpu.h" #include "gmc_v9_0.h" #include "amdgpu_atomfirmware.h" @@ -879,6 +880,7 @@ static int gmc_v9_0_sw_init(void *handle) */ adev->need_dma32 = false; dma_bits = adev->need_dma32 ? 32 : 44; + adev->need_swiotlb = drm_get_max_iomem() > ((u64)1 << dma_bits); r = pci_set_dma_mask(adev->pdev, DMA_BIT_MASK(dma_bits)); if (r) { adev->need_dma32 = true;
get the max io mapping address of system memory to see if it is over our card accessing range. Change-Id: Ibc38dbd34a20af5b4a4b1ed154c14e1c58aa4c55 Signed-off-by: Chunming Zhou <david1.zhou@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 6 +++--- drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 2 ++ drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 2 ++ drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 2 ++ drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 2 ++ 6 files changed, 12 insertions(+), 3 deletions(-)