diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 105 | 
1 files changed, 65 insertions, 40 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index b403b2a88ee5..efda38349a03 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -78,7 +78,7 @@ void amdgpu_unregister_gpu_instance(struct amdgpu_device *adev)   */  void amdgpu_driver_unload_kms(struct drm_device *dev)  { -	struct amdgpu_device *adev = dev->dev_private; +	struct amdgpu_device *adev = drm_to_adev(dev);  	if (adev == NULL)  		return; @@ -86,7 +86,7 @@ void amdgpu_driver_unload_kms(struct drm_device *dev)  	amdgpu_unregister_gpu_instance(adev);  	if (adev->rmmio == NULL) -		goto done_free; +		return;  	if (adev->runpm) {  		pm_runtime_get_sync(dev->dev); @@ -94,12 +94,7 @@ void amdgpu_driver_unload_kms(struct drm_device *dev)  	}  	amdgpu_acpi_fini(adev); -  	amdgpu_device_fini(adev); - -done_free: -	kfree(adev); -	dev->dev_private = NULL;  }  void amdgpu_register_gpu_instance(struct amdgpu_device *adev) @@ -130,22 +125,18 @@ void amdgpu_register_gpu_instance(struct amdgpu_device *adev)  /**   * amdgpu_driver_load_kms - Main load function for KMS.   * - * @dev: drm dev pointer + * @adev: pointer to struct amdgpu_device   * @flags: device flags   *   * This is the main load function for KMS (all asics).   * Returns 0 on success, error on failure.   */ -int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags) +int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)  { -	struct amdgpu_device *adev; +	struct drm_device *dev;  	int r, acpi_status; -	adev = kzalloc(sizeof(struct amdgpu_device), GFP_KERNEL); -	if (adev == NULL) { -		return -ENOMEM; -	} -	dev->dev_private = (void *)adev; +	dev = adev_to_drm(adev);  	if (amdgpu_has_atpx() &&  	    (amdgpu_is_atpx_hybrid() || @@ -160,7 +151,7 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)  	 * properly initialize the GPU MC controller and permit  	 * VRAM allocation  	 */ -	r = amdgpu_device_init(adev, dev, dev->pdev, flags); +	r = amdgpu_device_init(adev, flags);  	if (r) {  		dev_err(&dev->pdev->dev, "Fatal error during GPU init\n");  		goto out; @@ -186,7 +177,7 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)  			break;  		case CHIP_VEGA10:  			/* turn runpm on if noretry=0 */ -			if (!amdgpu_noretry) +			if (!adev->gmc.noretry)  				adev->runpm = true;  			break;  		default: @@ -291,14 +282,25 @@ static int amdgpu_firmware_info(struct drm_amdgpu_info_firmware *fw_info,  		fw_info->feature = 0;  		break;  	case AMDGPU_INFO_FW_TA: -		if (query_fw->index > 1) -			return -EINVAL; -		if (query_fw->index == 0) { +		switch (query_fw->index) { +		case 0:  			fw_info->ver = adev->psp.ta_fw_version;  			fw_info->feature = adev->psp.ta_xgmi_ucode_version; -		} else { +			break; +		case 1:  			fw_info->ver = adev->psp.ta_fw_version;  			fw_info->feature = adev->psp.ta_ras_ucode_version; +			break; +		case 2: +			fw_info->ver = adev->psp.ta_fw_version; +			fw_info->feature = adev->psp.ta_hdcp_ucode_version; +			break; +		case 3: +			fw_info->ver = adev->psp.ta_fw_version; +			fw_info->feature = adev->psp.ta_dtm_ucode_version; +			break; +		default: +			return -EINVAL;  		}  		break;  	case AMDGPU_INFO_FW_SDMA: @@ -480,7 +482,7 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,   */  static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)  { -	struct amdgpu_device *adev = dev->dev_private; +	struct amdgpu_device *adev = drm_to_adev(dev);  	struct drm_amdgpu_info *info = data;  	struct amdgpu_mode_info *minfo = &adev->mode_info;  	void __user *out = (void __user *)(uintptr_t)info->return_pointer; @@ -595,13 +597,13 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file  		ui64 = atomic64_read(&adev->num_vram_cpu_page_faults);  		return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0;  	case AMDGPU_INFO_VRAM_USAGE: -		ui64 = amdgpu_vram_mgr_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); +		ui64 = amdgpu_vram_mgr_usage(ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM));  		return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0;  	case AMDGPU_INFO_VIS_VRAM_USAGE: -		ui64 = amdgpu_vram_mgr_vis_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); +		ui64 = amdgpu_vram_mgr_vis_usage(ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM));  		return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0;  	case AMDGPU_INFO_GTT_USAGE: -		ui64 = amdgpu_gtt_mgr_usage(&adev->mman.bdev.man[TTM_PL_TT]); +		ui64 = amdgpu_gtt_mgr_usage(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT));  		return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0;  	case AMDGPU_INFO_GDS_CONFIG: {  		struct drm_amdgpu_info_gds gds_info; @@ -624,7 +626,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file  			min(adev->gmc.visible_vram_size -  			    atomic64_read(&adev->visible_pin_size),  			    vram_gtt.vram_size); -		vram_gtt.gtt_size = adev->mman.bdev.man[TTM_PL_TT].size; +		vram_gtt.gtt_size = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT)->size;  		vram_gtt.gtt_size *= PAGE_SIZE;  		vram_gtt.gtt_size -= atomic64_read(&adev->gart_pin_size);  		return copy_to_user(out, &vram_gtt, @@ -632,14 +634,17 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file  	}  	case AMDGPU_INFO_MEMORY: {  		struct drm_amdgpu_memory_info mem; - +		struct ttm_resource_manager *vram_man = +			ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM); +		struct ttm_resource_manager *gtt_man = +			ttm_manager_type(&adev->mman.bdev, TTM_PL_TT);  		memset(&mem, 0, sizeof(mem));  		mem.vram.total_heap_size = adev->gmc.real_vram_size;  		mem.vram.usable_heap_size = adev->gmc.real_vram_size -  			atomic64_read(&adev->vram_pin_size) -  			AMDGPU_VM_RESERVED_VRAM;  		mem.vram.heap_usage = -			amdgpu_vram_mgr_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); +			amdgpu_vram_mgr_usage(vram_man);  		mem.vram.max_allocation = mem.vram.usable_heap_size * 3 / 4;  		mem.cpu_accessible_vram.total_heap_size = @@ -649,16 +654,16 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file  			    atomic64_read(&adev->visible_pin_size),  			    mem.vram.usable_heap_size);  		mem.cpu_accessible_vram.heap_usage = -			amdgpu_vram_mgr_vis_usage(&adev->mman.bdev.man[TTM_PL_VRAM]); +			amdgpu_vram_mgr_vis_usage(vram_man);  		mem.cpu_accessible_vram.max_allocation =  			mem.cpu_accessible_vram.usable_heap_size * 3 / 4; -		mem.gtt.total_heap_size = adev->mman.bdev.man[TTM_PL_TT].size; +		mem.gtt.total_heap_size = gtt_man->size;  		mem.gtt.total_heap_size *= PAGE_SIZE;  		mem.gtt.usable_heap_size = mem.gtt.total_heap_size -  			atomic64_read(&adev->gart_pin_size);  		mem.gtt.heap_usage = -			amdgpu_gtt_mgr_usage(&adev->mman.bdev.man[TTM_PL_TT]); +			amdgpu_gtt_mgr_usage(gtt_man);  		mem.gtt.max_allocation = mem.gtt.usable_heap_size * 3 / 4;  		return copy_to_user(out, &mem, @@ -742,6 +747,8 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file  			dev_info.ids_flags |= AMDGPU_IDS_FLAGS_FUSION;  		if (amdgpu_mcbp || amdgpu_sriov_vf(adev))  			dev_info.ids_flags |= AMDGPU_IDS_FLAGS_PREEMPTION; +		if (amdgpu_is_tmz(adev)) +			dev_info.ids_flags |= AMDGPU_IDS_FLAGS_TMZ;  		vm_size = adev->vm_manager.max_pfn * AMDGPU_GPU_PAGE_SIZE;  		vm_size -= AMDGPU_VA_RESERVED_SIZE; @@ -995,7 +1002,7 @@ void amdgpu_driver_lastclose_kms(struct drm_device *dev)   */  int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)  { -	struct amdgpu_device *adev = dev->dev_private; +	struct amdgpu_device *adev = drm_to_adev(dev);  	struct amdgpu_fpriv *fpriv;  	int r, pasid; @@ -1080,7 +1087,7 @@ pm_put:  void amdgpu_driver_postclose_kms(struct drm_device *dev,  				 struct drm_file *file_priv)  { -	struct amdgpu_device *adev = dev->dev_private; +	struct amdgpu_device *adev = drm_to_adev(dev);  	struct amdgpu_fpriv *fpriv = file_priv->driver_priv;  	struct amdgpu_bo_list *list;  	struct amdgpu_bo *pd; @@ -1145,7 +1152,7 @@ u32 amdgpu_get_vblank_counter_kms(struct drm_crtc *crtc)  {  	struct drm_device *dev = crtc->dev;  	unsigned int pipe = crtc->index; -	struct amdgpu_device *adev = dev->dev_private; +	struct amdgpu_device *adev = drm_to_adev(dev);  	int vpos, hpos, stat;  	u32 count; @@ -1213,7 +1220,7 @@ int amdgpu_enable_vblank_kms(struct drm_crtc *crtc)  {  	struct drm_device *dev = crtc->dev;  	unsigned int pipe = crtc->index; -	struct amdgpu_device *adev = dev->dev_private; +	struct amdgpu_device *adev = drm_to_adev(dev);  	int idx = amdgpu_display_crtc_idx_to_irq_type(adev, pipe);  	return amdgpu_irq_get(adev, &adev->crtc_irq, idx); @@ -1230,7 +1237,7 @@ void amdgpu_disable_vblank_kms(struct drm_crtc *crtc)  {  	struct drm_device *dev = crtc->dev;  	unsigned int pipe = crtc->index; -	struct amdgpu_device *adev = dev->dev_private; +	struct amdgpu_device *adev = drm_to_adev(dev);  	int idx = amdgpu_display_crtc_idx_to_irq_type(adev, pipe);  	amdgpu_irq_put(adev, &adev->crtc_irq, idx); @@ -1266,7 +1273,7 @@ static int amdgpu_debugfs_firmware_info(struct seq_file *m, void *data)  {  	struct drm_info_node *node = (struct drm_info_node *) m->private;  	struct drm_device *dev = node->minor->dev; -	struct amdgpu_device *adev = dev->dev_private; +	struct amdgpu_device *adev = drm_to_adev(dev);  	struct drm_amdgpu_info_firmware fw_info;  	struct drm_amdgpu_query_fw query_fw;  	struct atom_context *ctx = adev->mode_info.atom_context; @@ -1389,13 +1396,31 @@ static int amdgpu_debugfs_firmware_info(struct seq_file *m, void *data)  		   fw_info.feature, fw_info.ver);  	query_fw.fw_type = AMDGPU_INFO_FW_TA; -	for (i = 0; i < 2; i++) { +	for (i = 0; i < 4; i++) {  		query_fw.index = i;  		ret = amdgpu_firmware_info(&fw_info, &query_fw, adev);  		if (ret)  			continue; -		seq_printf(m, "TA %s feature version: %u, firmware version: 0x%08x\n", -				i ? "RAS" : "XGMI", fw_info.feature, fw_info.ver); +		switch (query_fw.index) { +		case 0: +			seq_printf(m, "TA %s feature version: 0x%08x, firmware version: 0x%08x\n", +					"RAS", fw_info.feature, fw_info.ver); +			break; +		case 1: +			seq_printf(m, "TA %s feature version: 0x%08x, firmware version: 0x%08x\n", +					"XGMI", fw_info.feature, fw_info.ver); +			break; +		case 2: +			seq_printf(m, "TA %s feature version: 0x%08x, firmware version: 0x%08x\n", +					"HDCP", fw_info.feature, fw_info.ver); +			break; +		case 3: +			seq_printf(m, "TA %s feature version: 0x%08x, firmware version: 0x%08x\n", +					"DTM", fw_info.feature, fw_info.ver); +			break; +		default: +			return -EINVAL; +		}  	}  	/* SMC */  | 
