diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c | 59 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c | 13 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/psp_v11_0.c | 28 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/soc15.c | 6 | 
12 files changed, 103 insertions, 47 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c index a028661d9e20..92b11de19581 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c @@ -576,6 +576,7 @@ static const struct amdgpu_px_quirk amdgpu_px_quirk_list[] = {  	{ 0x1002, 0x6900, 0x1028, 0x0812, AMDGPU_PX_QUIRK_FORCE_ATPX },  	{ 0x1002, 0x6900, 0x1028, 0x0813, AMDGPU_PX_QUIRK_FORCE_ATPX },  	{ 0x1002, 0x6900, 0x1025, 0x125A, AMDGPU_PX_QUIRK_FORCE_ATPX }, +	{ 0x1002, 0x6900, 0x17AA, 0x3806, AMDGPU_PX_QUIRK_FORCE_ATPX },  	{ 0, 0, 0, 0, 0 },  }; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c index dafc645b2e4e..b083b219b1a9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c @@ -531,17 +531,6 @@ amdgpu_display_user_framebuffer_create(struct drm_device *dev,  	struct drm_gem_object *obj;  	struct amdgpu_framebuffer *amdgpu_fb;  	int ret; -	int height; -	struct amdgpu_device *adev = dev->dev_private; -	int cpp = drm_format_plane_cpp(mode_cmd->pixel_format, 0); -	int pitch = mode_cmd->pitches[0] / cpp; - -	pitch = amdgpu_align_pitch(adev, pitch, cpp, false); -	if (mode_cmd->pitches[0] != pitch) { -		DRM_DEBUG_KMS("Invalid pitch: expecting %d but got %d\n", -			      pitch, mode_cmd->pitches[0]); -		return ERR_PTR(-EINVAL); -	}  	obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[0]);  	if (obj ==  NULL) { @@ -556,13 +545,6 @@ amdgpu_display_user_framebuffer_create(struct drm_device *dev,  		return ERR_PTR(-EINVAL);  	} -	height = ALIGN(mode_cmd->height, 8); -	if (obj->size < pitch * height) { -		DRM_DEBUG_KMS("Invalid GEM size: expecting >= %d but got %zu\n", -			      pitch * height, obj->size); -		return ERR_PTR(-EINVAL); -	} -  	amdgpu_fb = kzalloc(sizeof(*amdgpu_fb), GFP_KERNEL);  	if (amdgpu_fb == NULL) {  		drm_gem_object_put_unlocked(obj); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index bc62bf41b7e9..5dc349173e4f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -212,6 +212,7 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)  	}  	if (amdgpu_device_is_px(dev)) { +		dev_pm_set_driver_flags(dev->dev, DPM_FLAG_NEVER_SKIP);  		pm_runtime_use_autosuspend(dev->dev);  		pm_runtime_set_autosuspend_delay(dev->dev, 5000);  		pm_runtime_set_active(dev->dev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h index aadd0fa42e43..3aa42c64484a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h @@ -405,6 +405,7 @@ struct amdgpu_crtc {  	struct amdgpu_flip_work *pflip_works;  	enum amdgpu_flip_status pflip_status;  	int deferred_flip_completion; +	u64 last_flip_vblank;  	/* pll sharing */  	struct amdgpu_atom_ss ss;  	bool ss_enabled; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index 6896dec97fc7..0ed41a9d2d77 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c @@ -1686,7 +1686,8 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj,  		effective_mode &= ~S_IWUSR;  	if ((adev->flags & AMD_IS_APU) && -	    (attr == &sensor_dev_attr_power1_cap_max.dev_attr.attr || +	    (attr == &sensor_dev_attr_power1_average.dev_attr.attr || +	     attr == &sensor_dev_attr_power1_cap_max.dev_attr.attr ||  	     attr == &sensor_dev_attr_power1_cap_min.dev_attr.attr||  	     attr == &sensor_dev_attr_power1_cap.dev_attr.attr))  		return 0; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c index 71913a18d142..a38e0fb4a6fe 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c @@ -38,6 +38,7 @@  #include "amdgpu_gem.h"  #include <drm/amdgpu_drm.h>  #include <linux/dma-buf.h> +#include <linux/dma-fence-array.h>  /**   * amdgpu_gem_prime_get_sg_table - &drm_driver.gem_prime_get_sg_table @@ -187,6 +188,48 @@ error:  	return ERR_PTR(ret);  } +static int +__reservation_object_make_exclusive(struct reservation_object *obj) +{ +	struct dma_fence **fences; +	unsigned int count; +	int r; + +	if (!reservation_object_get_list(obj)) /* no shared fences to convert */ +		return 0; + +	r = reservation_object_get_fences_rcu(obj, NULL, &count, &fences); +	if (r) +		return r; + +	if (count == 0) { +		/* Now that was unexpected. */ +	} else if (count == 1) { +		reservation_object_add_excl_fence(obj, fences[0]); +		dma_fence_put(fences[0]); +		kfree(fences); +	} else { +		struct dma_fence_array *array; + +		array = dma_fence_array_create(count, fences, +					       dma_fence_context_alloc(1), 0, +					       false); +		if (!array) +			goto err_fences_put; + +		reservation_object_add_excl_fence(obj, &array->base); +		dma_fence_put(&array->base); +	} + +	return 0; + +err_fences_put: +	while (count--) +		dma_fence_put(fences[count]); +	kfree(fences); +	return -ENOMEM; +} +  /**   * amdgpu_gem_map_attach - &dma_buf_ops.attach implementation   * @dma_buf: Shared DMA buffer @@ -218,16 +261,16 @@ static int amdgpu_gem_map_attach(struct dma_buf *dma_buf,  	if (attach->dev->driver != adev->dev->driver) {  		/* -		 * Wait for all shared fences to complete before we switch to future -		 * use of exclusive fence on this prime shared bo. +		 * We only create shared fences for internal use, but importers +		 * of the dmabuf rely on exclusive fences for implicitly +		 * tracking write hazards. As any of the current fences may +		 * correspond to a write, we need to convert all existing +		 * fences on the reservation object into a single exclusive +		 * fence.  		 */ -		r = reservation_object_wait_timeout_rcu(bo->tbo.resv, -							true, false, -							MAX_SCHEDULE_TIMEOUT); -		if (unlikely(r < 0)) { -			DRM_DEBUG_PRIME("Fence wait failed: %li\n", r); +		r = __reservation_object_make_exclusive(bo->tbo.resv); +		if (r)  			goto error_unreserve; -		}  	}  	/* pin buffer into GTT */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c index 8fab0d637ee5..3a9b48b227ac 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c @@ -90,8 +90,10 @@ static int psp_sw_fini(void *handle)  	adev->psp.sos_fw = NULL;  	release_firmware(adev->psp.asd_fw);  	adev->psp.asd_fw = NULL; -	release_firmware(adev->psp.ta_fw); -	adev->psp.ta_fw = NULL; +	if (adev->psp.ta_fw) { +		release_firmware(adev->psp.ta_fw); +		adev->psp.ta_fw = NULL; +	}  	return 0;  } @@ -435,6 +437,9 @@ static int psp_xgmi_initialize(struct psp_context *psp)  	struct ta_xgmi_shared_memory *xgmi_cmd;  	int ret; +	if (!psp->adev->psp.ta_fw) +		return -ENOENT; +  	if (!psp->xgmi_context.initialized) {  		ret = psp_xgmi_init_shared_buf(psp);  		if (ret) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index d2ea5ce2cefb..698bcb8ce61d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -638,12 +638,14 @@ void amdgpu_vm_move_to_lru_tail(struct amdgpu_device *adev,  	struct ttm_bo_global *glob = adev->mman.bdev.glob;  	struct amdgpu_vm_bo_base *bo_base; +#if 0  	if (vm->bulk_moveable) {  		spin_lock(&glob->lru_lock);  		ttm_bo_bulk_move_lru_tail(&vm->lru_bulk_move);  		spin_unlock(&glob->lru_lock);  		return;  	} +#endif  	memset(&vm->lru_bulk_move, 0, sizeof(vm->lru_bulk_move)); @@ -3363,14 +3365,15 @@ void amdgpu_vm_get_task_info(struct amdgpu_device *adev, unsigned int pasid,  			 struct amdgpu_task_info *task_info)  {  	struct amdgpu_vm *vm; +	unsigned long flags; -	spin_lock(&adev->vm_manager.pasid_lock); +	spin_lock_irqsave(&adev->vm_manager.pasid_lock, flags);  	vm = idr_find(&adev->vm_manager.pasid_idr, pasid);  	if (vm)  		*task_info = vm->task_info; -	spin_unlock(&adev->vm_manager.pasid_lock); +	spin_unlock_irqrestore(&adev->vm_manager.pasid_lock, flags);  }  /** diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c b/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c index 4cd31a276dcd..186db182f924 100644 --- a/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c +++ b/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c @@ -93,7 +93,20 @@ static void nbio_v7_4_enable_doorbell_aperture(struct amdgpu_device *adev,  static void nbio_v7_4_enable_doorbell_selfring_aperture(struct amdgpu_device *adev,  							bool enable)  { +	u32 tmp = 0; +	if (enable) { +		tmp = REG_SET_FIELD(tmp, DOORBELL_SELFRING_GPA_APER_CNTL, DOORBELL_SELFRING_GPA_APER_EN, 1) | +		      REG_SET_FIELD(tmp, DOORBELL_SELFRING_GPA_APER_CNTL, DOORBELL_SELFRING_GPA_APER_MODE, 1) | +		      REG_SET_FIELD(tmp, DOORBELL_SELFRING_GPA_APER_CNTL, DOORBELL_SELFRING_GPA_APER_SIZE, 0); + +		WREG32_SOC15(NBIO, 0, mmDOORBELL_SELFRING_GPA_APER_BASE_LOW, +			     lower_32_bits(adev->doorbell.base)); +		WREG32_SOC15(NBIO, 0, mmDOORBELL_SELFRING_GPA_APER_BASE_HIGH, +			     upper_32_bits(adev->doorbell.base)); +	} + +	WREG32_SOC15(NBIO, 0, mmDOORBELL_SELFRING_GPA_APER_CNTL, tmp);  }  static void nbio_v7_4_ih_doorbell_range(struct amdgpu_device *adev, diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c index 0c6e7f9b143f..189fcb004579 100644 --- a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c @@ -152,18 +152,22 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)  	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name);  	err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev); -	if (err) -		goto out2; - -	err = amdgpu_ucode_validate(adev->psp.ta_fw); -	if (err) -		goto out2; - -	ta_hdr = (const struct ta_firmware_header_v1_0 *)adev->psp.ta_fw->data; -	adev->psp.ta_xgmi_ucode_version = le32_to_cpu(ta_hdr->ta_xgmi_ucode_version); -	adev->psp.ta_xgmi_ucode_size = le32_to_cpu(ta_hdr->ta_xgmi_size_bytes); -	adev->psp.ta_xgmi_start_addr = (uint8_t *)ta_hdr + -		le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes); +	if (err) { +		release_firmware(adev->psp.ta_fw); +		adev->psp.ta_fw = NULL; +		dev_info(adev->dev, +			 "psp v11.0: Failed to load firmware \"%s\"\n", fw_name); +	} else { +		err = amdgpu_ucode_validate(adev->psp.ta_fw); +		if (err) +			goto out2; + +		ta_hdr = (const struct ta_firmware_header_v1_0 *)adev->psp.ta_fw->data; +		adev->psp.ta_xgmi_ucode_version = le32_to_cpu(ta_hdr->ta_xgmi_ucode_version); +		adev->psp.ta_xgmi_ucode_size = le32_to_cpu(ta_hdr->ta_xgmi_size_bytes); +		adev->psp.ta_xgmi_start_addr = (uint8_t *)ta_hdr + +			le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes); +	}  	return 0; diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c index 6811a5d05b27..aa2f71cc1eba 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c @@ -128,7 +128,7 @@ static const struct soc15_reg_golden golden_settings_sdma0_4_2_init[] = {  static const struct soc15_reg_golden golden_settings_sdma0_4_2[] =  { -	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_CHICKEN_BITS, 0xfe931f07, 0x02831d07), +	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_CHICKEN_BITS, 0xfe931f07, 0x02831f07),  	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_CLK_CTRL, 0xffffffff, 0x3f000100),  	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG, 0x0000773f, 0x00004002),  	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG_READ, 0x0000773f, 0x00004002), @@ -158,7 +158,7 @@ static const struct soc15_reg_golden golden_settings_sdma0_4_2[] =  };  static const struct soc15_reg_golden golden_settings_sdma1_4_2[] = { -	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CHICKEN_BITS, 0xfe931f07, 0x02831d07), +	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CHICKEN_BITS, 0xfe931f07, 0x02831f07),  	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CLK_CTRL, 0xffffffff, 0x3f000100),  	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG, 0x0000773f, 0x00004002),  	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG_READ, 0x0000773f, 0x00004002), diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c index 8849b74078d6..9b639974c70c 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.c +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c @@ -729,11 +729,13 @@ static int soc15_common_early_init(void *handle)  	case CHIP_RAVEN:  		adev->asic_funcs = &soc15_asic_funcs;  		if (adev->rev_id >= 0x8) -			adev->external_rev_id = adev->rev_id + 0x81; +			adev->external_rev_id = adev->rev_id + 0x79;  		else if (adev->pdev->device == 0x15d8)  			adev->external_rev_id = adev->rev_id + 0x41; +		else if (adev->rev_id == 1) +			adev->external_rev_id = adev->rev_id + 0x20;  		else -			adev->external_rev_id = 0x1; +			adev->external_rev_id = adev->rev_id + 0x01;  		if (adev->rev_id >= 0x8) {  			adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG | | 
