diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 53 | 
1 files changed, 47 insertions, 6 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 86ca80da9eea..b63ed1ddf713 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -31,7 +31,6 @@  #include "amdgpu_drv.h"  #include <drm/drm_pciids.h> -#include <linux/console.h>  #include <linux/module.h>  #include <linux/pm_runtime.h>  #include <linux/vga_switcheroo.h> @@ -39,6 +38,7 @@  #include <linux/mmu_notifier.h>  #include <linux/suspend.h>  #include <linux/cc_platform.h> +#include <linux/fb.h>  #include "amdgpu.h"  #include "amdgpu_irq.h" @@ -314,9 +314,12 @@ module_param_named(dpm, amdgpu_dpm, int, 0444);  /**   * DOC: fw_load_type (int) - * Set different firmware loading type for debugging (0 = direct, 1 = SMU, 2 = PSP). The default is -1 (auto). + * Set different firmware loading type for debugging, if supported. + * Set to 0 to force direct loading if supported by the ASIC.  Set + * to -1 to select the default loading mode for the ASIC, as defined + * by the driver.  The default is -1 (auto).   */ -MODULE_PARM_DESC(fw_load_type, "firmware loading type (0 = direct, 1 = SMU, 2 = PSP, -1 = auto)"); +MODULE_PARM_DESC(fw_load_type, "firmware loading type (0 = force direct if supported, -1 = auto)");  module_param_named(fw_load_type, amdgpu_fw_load_type, int, 0444);  /** @@ -1890,6 +1893,26 @@ MODULE_DEVICE_TABLE(pci, pciidlist);  static const struct drm_driver amdgpu_kms_driver; +static bool amdgpu_is_fw_framebuffer(resource_size_t base, +				     resource_size_t size) +{ +	bool found = false; +#if IS_REACHABLE(CONFIG_FB) +	struct apertures_struct *a; + +	a = alloc_apertures(1); +	if (!a) +		return false; + +	a->ranges[0].base = base; +	a->ranges[0].size = size; + +	found = is_firmware_framebuffer(a); +	kfree(a); +#endif +	return found; +} +  static int amdgpu_pci_probe(struct pci_dev *pdev,  			    const struct pci_device_id *ent)  { @@ -1898,6 +1921,8 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,  	unsigned long flags = ent->driver_data;  	int ret, retry = 0, i;  	bool supports_atomic = false; +	bool is_fw_fb; +	resource_size_t base, size;  	/* skip devices which are owned by radeon */  	for (i = 0; i < ARRAY_SIZE(amdgpu_unsupported_pciidlist); i++) { @@ -1966,6 +1991,10 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,  	}  #endif +	base = pci_resource_start(pdev, 0); +	size = pci_resource_len(pdev, 0); +	is_fw_fb = amdgpu_is_fw_framebuffer(base, size); +  	/* Get rid of things like offb */  	ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, &amdgpu_kms_driver);  	if (ret) @@ -1978,6 +2007,7 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,  	adev->dev  = &pdev->dev;  	adev->pdev = pdev;  	ddev = adev_to_drm(adev); +	adev->is_fw_fb = is_fw_fb;  	if (!supports_atomic)  		ddev->driver_features &= ~DRIVER_ATOMIC; @@ -2003,6 +2033,19 @@ retry_init:  		goto err_pci;  	} +	/* +	 * 1. don't init fbdev on hw without DCE +	 * 2. don't init fbdev if there are no connectors +	 */ +	if (adev->mode_info.mode_config_initialized && +	    !list_empty(&adev_to_drm(adev)->mode_config.connector_list)) { +		/* select 8 bpp console on low vram cards */ +		if (adev->gmc.real_vram_size <= (32*1024*1024)) +			drm_fbdev_generic_setup(adev_to_drm(adev), 8); +		else +			drm_fbdev_generic_setup(adev_to_drm(adev), 32); +	} +  	ret = amdgpu_debugfs_init(adev);  	if (ret)  		DRM_ERROR("Creating debugfs files failed (%d).\n", ret); @@ -2535,10 +2578,8 @@ static int __init amdgpu_init(void)  {  	int r; -	if (vgacon_text_force()) { -		DRM_ERROR("VGACON disables amdgpu kernel modesetting.\n"); +	if (drm_firmware_drivers_only())  		return -EINVAL; -	}  	r = amdgpu_sync_init();  	if (r) | 
