mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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: Chunming Zhou <david1.zhou@amd.com> Reviewed-by: Monk Liu <monk.liu@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180209024410.1469-2-david1.zhou@amd.com
This commit is contained in:
		
							parent
							
								
									82626363a2
								
							
						
					
					
						commit
						fd5fd480dd
					
				
					 6 changed files with 13 additions and 3 deletions
				
			
		| 
						 | 
					@ -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,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_SWIOTLB
 | 
					#ifdef CONFIG_SWIOTLB
 | 
				
			||||||
	if (swiotlb_nr_tbl()) {
 | 
						if (adev->need_swiotlb && swiotlb_nr_tbl()) {
 | 
				
			||||||
		return ttm_dma_populate(>t->ttm, adev->dev, ctx);
 | 
							return ttm_dma_populate(>t->ttm, adev->dev, ctx);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -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(>t->ttm, adev->dev);
 | 
							ttm_dma_unpopulate(>t->ttm, adev->dev);
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -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 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#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)
 | 
				
			||||||
		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 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#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)
 | 
				
			||||||
		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 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#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)
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	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)
 | 
				
			||||||
		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 @@
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#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)
 | 
				
			||||||
		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)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue