diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 92 | 
1 files changed, 68 insertions, 24 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index bf2d50c8c92a..86fbb4138285 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -23,8 +23,8 @@   */  #include <drm/amdgpu_drm.h> -#include <drm/drm_aperture.h>  #include <drm/drm_drv.h> +#include <drm/drm_fbdev_generic.h>  #include <drm/drm_gem.h>  #include <drm/drm_vblank.h>  #include <drm/drm_managed.h> @@ -38,7 +38,6 @@  #include <linux/mmu_notifier.h>  #include <linux/suspend.h>  #include <linux/cc_platform.h> -#include <linux/fb.h>  #include <linux/dynamic_debug.h>  #include "amdgpu.h" @@ -104,13 +103,16 @@   * - 3.46.0 - To enable hot plug amdgpu tests in libdrm   * - 3.47.0 - Add AMDGPU_GEM_CREATE_DISCARDABLE and AMDGPU_VM_NOALLOC flags   * - 3.48.0 - Add IP discovery version info to HW INFO - *   3.49.0 - Add gang submit into CS IOCTL + * - 3.49.0 - Add gang submit into CS IOCTL + * - 3.50.0 - Update AMDGPU_INFO_DEV_INFO IOCTL for minimum engine and memory clock + *            Update AMDGPU_INFO_SENSOR IOCTL for PEAK_PSTATE engine and memory clock + *   3.51.0 - Return the PCIe gen and lanes from the INFO ioctl   */  #define KMS_DRIVER_MAJOR	3 -#define KMS_DRIVER_MINOR	49 +#define KMS_DRIVER_MINOR	51  #define KMS_DRIVER_PATCHLEVEL	0 -int amdgpu_vram_limit; +unsigned int amdgpu_vram_limit = UINT_MAX;  int amdgpu_vis_vram_limit;  int amdgpu_gart_size = -1; /* auto */  int amdgpu_gtt_size = -1; /* auto */ @@ -180,11 +182,13 @@ int amdgpu_mes_kiq;  int amdgpu_noretry = -1;  int amdgpu_force_asic_type = -1;  int amdgpu_tmz = -1; /* auto */ +uint amdgpu_freesync_vid_mode;  int amdgpu_reset_method = -1; /* auto */  int amdgpu_num_kcq = -1;  int amdgpu_smartshift_bias;  int amdgpu_use_xgmi_p2p = 1;  int amdgpu_vcnfw_log; +int amdgpu_sg_display = -1; /* auto */  static void amdgpu_drv_delayed_reset_work_handler(struct work_struct *work); @@ -230,17 +234,18 @@ module_param_named(vis_vramlimit, amdgpu_vis_vram_limit, int, 0444);  /**   * DOC: gartsize (uint) - * Restrict the size of GART in Mib (32, 64, etc.) for testing. The default is -1 (The size depends on asic). + * Restrict the size of GART (for kernel use) in Mib (32, 64, etc.) for testing. + * The default is -1 (The size depends on asic).   */ -MODULE_PARM_DESC(gartsize, "Size of GART to setup in megabytes (32, 64, etc., -1=auto)"); +MODULE_PARM_DESC(gartsize, "Size of kernel GART to setup in megabytes (32, 64, etc., -1=auto)");  module_param_named(gartsize, amdgpu_gart_size, uint, 0600);  /**   * DOC: gttsize (int) - * Restrict the size of GTT domain in MiB for testing. The default is -1 (It's VRAM size if 3GB < VRAM < 3/4 RAM, - * otherwise 3/4 RAM size). + * Restrict the size of GTT domain (for userspace use) in MiB for testing. + * The default is -1 (Use 1/2 RAM, minimum value is 3GB).   */ -MODULE_PARM_DESC(gttsize, "Size of the GTT domain in megabytes (-1 = auto)"); +MODULE_PARM_DESC(gttsize, "Size of the GTT userspace domain in megabytes (-1 = auto)");  module_param_named(gttsize, amdgpu_gtt_size, int, 0600);  /** @@ -533,7 +538,7 @@ module_param_named(compute_multipipe, amdgpu_compute_multipipe, int, 0444);   * DOC: gpu_recovery (int)   * Set to enable GPU recovery mechanism (1 = enable, 0 = disable). The default is -1 (auto, disabled except SRIOV).   */ -MODULE_PARM_DESC(gpu_recovery, "Enable GPU recovery mechanism, (2 = advanced tdr mode, 1 = enable, 0 = disable, -1 = auto)"); +MODULE_PARM_DESC(gpu_recovery, "Enable GPU recovery mechanism, (1 = enable, 0 = disable, -1 = auto)");  module_param_named(gpu_recovery, amdgpu_gpu_recovery, int, 0444);  /** @@ -878,6 +883,32 @@ MODULE_PARM_DESC(tmz, "Enable TMZ feature (-1 = auto (default), 0 = off, 1 = on)  module_param_named(tmz, amdgpu_tmz, int, 0444);  /** + * DOC: freesync_video (uint) + * Enable the optimization to adjust front porch timing to achieve seamless + * mode change experience when setting a freesync supported mode for which full + * modeset is not needed. + * + * The Display Core will add a set of modes derived from the base FreeSync + * video mode into the corresponding connector's mode list based on commonly + * used refresh rates and VRR range of the connected display, when users enable + * this feature. From the userspace perspective, they can see a seamless mode + * change experience when the change between different refresh rates under the + * same resolution. Additionally, userspace applications such as Video playback + * can read this modeset list and change the refresh rate based on the video + * frame rate. Finally, the userspace can also derive an appropriate mode for a + * particular refresh rate based on the FreeSync Mode and add it to the + * connector's mode list. + * + * Note: This is an experimental feature. + * + * The default value: 0 (off). + */ +MODULE_PARM_DESC( +	freesync_video, +	"Enable freesync modesetting optimization feature (0 = off (default), 1 = on)"); +module_param_named(freesync_video, amdgpu_freesync_vid_mode, uint, 0444); + +/**   * DOC: reset_method (int)   * GPU reset method (-1 = auto (default), 0 = legacy, 1 = mode0, 2 = mode1, 3 = mode2, 4 = baco)   */ @@ -904,6 +935,16 @@ MODULE_PARM_DESC(vcnfw_log, "Enable vcnfw log(0 = disable (default value), 1 = e  module_param_named(vcnfw_log, amdgpu_vcnfw_log, int, 0444);  /** + * DOC: sg_display (int) + * Disable S/G (scatter/gather) display (i.e., display from system memory). + * This option is only relevant on APUs.  Set this option to 0 to disable + * S/G display if you experience flickering or other issues under memory + * pressure and report the issue. + */ +MODULE_PARM_DESC(sg_display, "S/G Display (-1 = auto (default), 0 = disable)"); +module_param_named(sg_display, amdgpu_sg_display, int, 0444); + +/**   * DOC: smu_pptable_id (int)   * Used to override pptable id. id = 0 use VBIOS pptable.   * id > 0 use the soft pptable with specicfied id. @@ -1924,9 +1965,6 @@ static const struct pci_device_id pciidlist[] = {  	{0x1002, 0x73AF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},  	{0x1002, 0x73BF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID}, -	/* Van Gogh */ -	{0x1002, 0x163F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VANGOGH|AMD_IS_APU}, -  	/* Yellow Carp */  	{0x1002, 0x164D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_YELLOW_CARP|AMD_IS_APU},  	{0x1002, 0x1681, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_YELLOW_CARP|AMD_IS_APU}, @@ -2040,6 +2078,15 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,  			 "See modparam exp_hw_support\n");  		return -ENODEV;  	} +	/* differentiate between P10 and P11 asics with the same DID */ +	if (pdev->device == 0x67FF && +	    (pdev->revision == 0xE3 || +	     pdev->revision == 0xE7 || +	     pdev->revision == 0xF3 || +	     pdev->revision == 0xF7)) { +		flags &= ~AMD_ASIC_MASK; +		flags |= CHIP_POLARIS10; +	}  	/* Due to hardware bugs, S/G Display on raven requires a 1:1 IOMMU mapping,  	 * however, SME requires an indirect IOMMU mapping because the encryption @@ -2087,11 +2134,6 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,  	}  #endif -	/* Get rid of things like offb */ -	ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, &amdgpu_kms_driver); -	if (ret) -		return ret; -  	adev = devm_drm_dev_alloc(&pdev->dev, &amdgpu_kms_driver, typeof(*adev), ddev);  	if (IS_ERR(adev))  		return PTR_ERR(adev); @@ -2109,12 +2151,12 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,  	pci_set_drvdata(pdev, ddev); -	ret = amdgpu_driver_load_kms(adev, ent->driver_data); +	ret = amdgpu_driver_load_kms(adev, flags);  	if (ret)  		goto err_pci;  retry_init: -	ret = drm_dev_register(ddev, ent->driver_data); +	ret = drm_dev_register(ddev, flags);  	if (ret == -EAGAIN && ++retry <= 3) {  		DRM_INFO("retry init %d\n", retry);  		/* Don't request EX mode too frequently which is attacking */ @@ -2196,6 +2238,8 @@ amdgpu_pci_remove(struct pci_dev *pdev)  	struct drm_device *dev = pci_get_drvdata(pdev);  	struct amdgpu_device *adev = drm_to_adev(dev); +	drm_dev_unplug(dev); +  	if (adev->pm.rpm_mode != AMDGPU_RUNPM_NONE) {  		pm_runtime_get_sync(dev->dev);  		pm_runtime_forbid(dev->dev); @@ -2235,8 +2279,6 @@ amdgpu_pci_remove(struct pci_dev *pdev)  	amdgpu_driver_unload_kms(dev); -	drm_dev_unplug(dev); -  	/*  	 * Flush any in flight DMA operations from device.  	 * Clear the Bus Master Enable bit and then wait on the PCIe Device @@ -2471,7 +2513,7 @@ static int amdgpu_runtime_idle_check_display(struct device *dev)  		if (ret)  			return ret; -		if (amdgpu_device_has_dc_support(adev)) { +		if (adev->dc_enabled) {  			struct drm_crtc *crtc;  			drm_for_each_crtc(crtc, drm_dev) { @@ -2572,6 +2614,8 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)  		amdgpu_device_baco_enter(drm_dev);  	} +	dev_dbg(&pdev->dev, "asic/device is runtime suspended\n"); +  	return 0;  }  |