[PATCH 2/2] drm/drivers: add support for using the arch wc mapping API.

Christian König deathsimple at vodafone.de
Mon Oct 24 09:24:30 UTC 2016


Am 24.10.2016 um 08:31 schrieb Dave Airlie:
> This fixes a regression in all these drivers since the cache
> mode tracking was fixed for mixed mappings. It uses the new
> arch API to add the VRAM range to the PAT mapping tracking
> tables.
>
> Fixes: 87744ab3832 (mm: fix cache mode tracking in vm_insert_mixed())
> Signed-off-by: Dave Airlie <airlied at redhat.com>

Reviewed-by: Christian König <christian.koenig at amd.com>.

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 5 +++++
>   drivers/gpu/drm/ast/ast_ttm.c              | 6 ++++++
>   drivers/gpu/drm/cirrus/cirrus_ttm.c        | 7 +++++++
>   drivers/gpu/drm/mgag200/mgag200_ttm.c      | 7 +++++++
>   drivers/gpu/drm/nouveau/nouveau_ttm.c      | 8 ++++++++
>   drivers/gpu/drm/radeon/radeon_object.c     | 5 +++++
>   6 files changed, 38 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> index aa074fa..f3efb1c 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> @@ -754,6 +754,10 @@ static const char *amdgpu_vram_names[] = {
>   
>   int amdgpu_bo_init(struct amdgpu_device *adev)
>   {
> +	/* reserve PAT memory space to WC for VRAM */
> +	arch_io_reserve_memtype_wc(adev->mc.aper_base,
> +				   adev->mc.aper_size);
> +
>   	/* Add an MTRR for the VRAM */
>   	adev->mc.vram_mtrr = arch_phys_wc_add(adev->mc.aper_base,
>   					      adev->mc.aper_size);
> @@ -769,6 +773,7 @@ void amdgpu_bo_fini(struct amdgpu_device *adev)
>   {
>   	amdgpu_ttm_fini(adev);
>   	arch_phys_wc_del(adev->mc.vram_mtrr);
> +	arch_io_free_memtype_wc(adev->mc.aper_base, adev->mc.aper_size);
>   }
>   
>   int amdgpu_bo_fbdev_mmap(struct amdgpu_bo *bo,
> diff --git a/drivers/gpu/drm/ast/ast_ttm.c b/drivers/gpu/drm/ast/ast_ttm.c
> index 608df4c..0743e65 100644
> --- a/drivers/gpu/drm/ast/ast_ttm.c
> +++ b/drivers/gpu/drm/ast/ast_ttm.c
> @@ -267,6 +267,8 @@ int ast_mm_init(struct ast_private *ast)
>   		return ret;
>   	}
>   
> +	arch_io_reserve_memtype_wc(pci_resource_start(dev->pdev, 0),
> +				   pci_resource_len(dev->pdev, 0));
>   	ast->fb_mtrr = arch_phys_wc_add(pci_resource_start(dev->pdev, 0),
>   					pci_resource_len(dev->pdev, 0));
>   
> @@ -275,11 +277,15 @@ int ast_mm_init(struct ast_private *ast)
>   
>   void ast_mm_fini(struct ast_private *ast)
>   {
> +	struct drm_device *dev = ast->dev;
> +
>   	ttm_bo_device_release(&ast->ttm.bdev);
>   
>   	ast_ttm_global_release(ast);
>   
>   	arch_phys_wc_del(ast->fb_mtrr);
> +	arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0),
> +				pci_resource_len(dev->pdev, 0));
>   }
>   
>   void ast_ttm_placement(struct ast_bo *bo, int domain)
> diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c
> index bb2438d..5e7e63c 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_ttm.c
> +++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c
> @@ -267,6 +267,9 @@ int cirrus_mm_init(struct cirrus_device *cirrus)
>   		return ret;
>   	}
>   
> +	arch_io_reserve_memtype_wc(pci_resource_start(dev->pdev, 0),
> +				   pci_resource_len(dev->pdev, 0));
> +
>   	cirrus->fb_mtrr = arch_phys_wc_add(pci_resource_start(dev->pdev, 0),
>   					   pci_resource_len(dev->pdev, 0));
>   
> @@ -276,6 +279,8 @@ int cirrus_mm_init(struct cirrus_device *cirrus)
>   
>   void cirrus_mm_fini(struct cirrus_device *cirrus)
>   {
> +	struct drm_device *dev = cirrus->dev;
> +
>   	if (!cirrus->mm_inited)
>   		return;
>   
> @@ -285,6 +290,8 @@ void cirrus_mm_fini(struct cirrus_device *cirrus)
>   
>   	arch_phys_wc_del(cirrus->fb_mtrr);
>   	cirrus->fb_mtrr = 0;
> +	arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0),
> +				pci_resource_len(dev->pdev, 0));
>   }
>   
>   void cirrus_ttm_placement(struct cirrus_bo *bo, int domain)
> diff --git a/drivers/gpu/drm/mgag200/mgag200_ttm.c b/drivers/gpu/drm/mgag200/mgag200_ttm.c
> index 919b35f..dcf7d11 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_ttm.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_ttm.c
> @@ -266,6 +266,9 @@ int mgag200_mm_init(struct mga_device *mdev)
>   		return ret;
>   	}
>   
> +	arch_io_reserve_memtype_wc(pci_resource_start(dev->pdev, 0),
> +				   pci_resource_len(dev->pdev, 0));
> +
>   	mdev->fb_mtrr = arch_phys_wc_add(pci_resource_start(dev->pdev, 0),
>   					 pci_resource_len(dev->pdev, 0));
>   
> @@ -274,10 +277,14 @@ int mgag200_mm_init(struct mga_device *mdev)
>   
>   void mgag200_mm_fini(struct mga_device *mdev)
>   {
> +	struct drm_device *dev = mdev->dev;
> +
>   	ttm_bo_device_release(&mdev->ttm.bdev);
>   
>   	mgag200_ttm_global_release(mdev);
>   
> +	arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0),
> +				pci_resource_len(dev->pdev, 0));
>   	arch_phys_wc_del(mdev->fb_mtrr);
>   	mdev->fb_mtrr = 0;
>   }
> diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c
> index 1825dbc..a6dbe82 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_ttm.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c
> @@ -398,6 +398,9 @@ nouveau_ttm_init(struct nouveau_drm *drm)
>   	/* VRAM init */
>   	drm->gem.vram_available = drm->device.info.ram_user;
>   
> +	arch_io_reserve_memtype_wc(device->func->resource_addr(device, 1),
> +				   device->func->resource_size(device, 1));
> +
>   	ret = ttm_bo_init_mm(&drm->ttm.bdev, TTM_PL_VRAM,
>   			      drm->gem.vram_available >> PAGE_SHIFT);
>   	if (ret) {
> @@ -430,6 +433,8 @@ nouveau_ttm_init(struct nouveau_drm *drm)
>   void
>   nouveau_ttm_fini(struct nouveau_drm *drm)
>   {
> +	struct nvkm_device *device = nvxx_device(&drm->device);
> +
>   	ttm_bo_clean_mm(&drm->ttm.bdev, TTM_PL_VRAM);
>   	ttm_bo_clean_mm(&drm->ttm.bdev, TTM_PL_TT);
>   
> @@ -439,4 +444,7 @@ nouveau_ttm_fini(struct nouveau_drm *drm)
>   
>   	arch_phys_wc_del(drm->ttm.mtrr);
>   	drm->ttm.mtrr = 0;
> +	arch_io_free_memtype_wc(device->func->resource_addr(device, 1),
> +				device->func->resource_size(device, 1));
> +
>   }
> diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
> index be30861..41b72ce 100644
> --- a/drivers/gpu/drm/radeon/radeon_object.c
> +++ b/drivers/gpu/drm/radeon/radeon_object.c
> @@ -446,6 +446,10 @@ void radeon_bo_force_delete(struct radeon_device *rdev)
>   
>   int radeon_bo_init(struct radeon_device *rdev)
>   {
> +	/* reserve PAT memory space to WC for VRAM */
> +	arch_io_reserve_memtype_wc(rdev->mc.aper_base,
> +				   rdev->mc.aper_size);
> +
>   	/* Add an MTRR for the VRAM */
>   	if (!rdev->fastfb_working) {
>   		rdev->mc.vram_mtrr = arch_phys_wc_add(rdev->mc.aper_base,
> @@ -463,6 +467,7 @@ void radeon_bo_fini(struct radeon_device *rdev)
>   {
>   	radeon_ttm_fini(rdev);
>   	arch_phys_wc_del(rdev->mc.vram_mtrr);
> +	arch_io_free_memtype_wc(rdev->mc.aper_base, rdev->mc.aper_size);
>   }
>   
>   /* Returns how many bytes TTM can move per IB.




More information about the dri-devel mailing list