diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 35 | 
1 files changed, 31 insertions, 4 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 0534ab716809..4e51dce3aab5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -49,7 +49,6 @@  #include <drm/ttm/ttm_tt.h>  #include <drm/amdgpu_drm.h> -#include <drm/drm_drv.h>  #include "amdgpu.h"  #include "amdgpu_object.h" @@ -127,6 +126,7 @@ static void amdgpu_evict_flags(struct ttm_buffer_object *bo,  	case AMDGPU_PL_GDS:  	case AMDGPU_PL_GWS:  	case AMDGPU_PL_OA: +	case AMDGPU_PL_DOORBELL:  		placement->num_placement = 0;  		placement->num_busy_placement = 0;  		return; @@ -496,9 +496,11 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,  	if (old_mem->mem_type == AMDGPU_PL_GDS ||  	    old_mem->mem_type == AMDGPU_PL_GWS ||  	    old_mem->mem_type == AMDGPU_PL_OA || +	    old_mem->mem_type == AMDGPU_PL_DOORBELL ||  	    new_mem->mem_type == AMDGPU_PL_GDS ||  	    new_mem->mem_type == AMDGPU_PL_GWS || -	    new_mem->mem_type == AMDGPU_PL_OA) { +	    new_mem->mem_type == AMDGPU_PL_OA || +	    new_mem->mem_type == AMDGPU_PL_DOORBELL) {  		/* Nothing to save here */  		ttm_bo_move_null(bo, new_mem);  		goto out; @@ -582,6 +584,12 @@ static int amdgpu_ttm_io_mem_reserve(struct ttm_device *bdev,  		mem->bus.offset += adev->gmc.aper_base;  		mem->bus.is_iomem = true;  		break; +	case AMDGPU_PL_DOORBELL: +		mem->bus.offset = mem->start << PAGE_SHIFT; +		mem->bus.offset += adev->doorbell.base; +		mem->bus.is_iomem = true; +		mem->bus.caching = ttm_uncached; +		break;  	default:  		return -EINVAL;  	} @@ -596,6 +604,10 @@ static unsigned long amdgpu_ttm_io_mem_pfn(struct ttm_buffer_object *bo,  	amdgpu_res_first(bo->resource, (u64)page_offset << PAGE_SHIFT, 0,  			 &cursor); + +	if (bo->resource->mem_type == AMDGPU_PL_DOORBELL) +		return ((uint64_t)(adev->doorbell.base + cursor.start)) >> PAGE_SHIFT; +  	return (adev->gmc.aper_base + cursor.start) >> PAGE_SHIFT;  } @@ -1305,6 +1317,7 @@ uint64_t amdgpu_ttm_tt_pde_flags(struct ttm_tt *ttm, struct ttm_resource *mem)  		flags |= AMDGPU_PTE_VALID;  	if (mem && (mem->mem_type == TTM_PL_TT || +		    mem->mem_type == AMDGPU_PL_DOORBELL ||  		    mem->mem_type == AMDGPU_PL_PREEMPT)) {  		flags |= AMDGPU_PTE_SYSTEM; @@ -1924,6 +1937,20 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)  	DRM_INFO("amdgpu: %uM of GTT memory ready.\n",  		 (unsigned int)(gtt_size / (1024 * 1024))); +	/* Initiailize doorbell pool on PCI BAR */ +	r = amdgpu_ttm_init_on_chip(adev, AMDGPU_PL_DOORBELL, adev->doorbell.size / PAGE_SIZE); +	if (r) { +		DRM_ERROR("Failed initializing doorbell heap.\n"); +		return r; +	} + +	/* Create a boorbell page for kernel usages */ +	r = amdgpu_doorbell_create_kernel_doorbells(adev); +	if (r) { +		DRM_ERROR("Failed to initialize kernel doorbells.\n"); +		return r; +	} +  	/* Initialize preemptible memory pool */  	r = amdgpu_preempt_mgr_init(adev);  	if (r) { @@ -2392,7 +2419,7 @@ static ssize_t amdgpu_iomem_read(struct file *f, char __user *buf,  		struct page *p;  		void *ptr; -		bytes = bytes < size ? bytes : size; +		bytes = min(bytes, size);  		/* Translate the bus address to a physical address.  If  		 * the domain is NULL it means there is no IOMMU active @@ -2447,7 +2474,7 @@ static ssize_t amdgpu_iomem_write(struct file *f, const char __user *buf,  		struct page *p;  		void *ptr; -		bytes = bytes < size ? bytes : size; +		bytes = min(bytes, size);  		addr = dom ? iommu_iova_to_phys(dom, addr) : addr; | 
