mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	 cce91f29c0
			
		
	
	
		cce91f29c0
		
	
	
	
	
		
			
			Recent generations of Tegra have moved the display components outside of
host1x, leading to a device that has no CRTCs attached and hence doesn't
support any of the modesetting functionality. When this is detected, the
driver clears the DRIVER_MODESET and DRIVER_ATOMIC flags for the device.
Unfortunately, this causes the following errors during boot:
    [      15.418958] ERR KERN drm drm: [drm] *ERROR* Failed to register client: -95
    [      15.425311] WARNING KERN drm drm: [drm] Failed to set up DRM client; error -95
These originate from the fbdev client checking for the presence of the
DRIVER_MODESET flag and returning -EOPNOTSUPP. However, if a driver does
not support DRIVER_MODESET this is entirely expected and the error isn't
helpful.
Prevent this misleading error message by setting up the DRM clients only
if modesetting is enabled.
Changes in v2:
- use DRIVER_MODESET check to avoid registering any clients
Reported-by: Jonathan Hunter <jonathanh@nvidia.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Acked-by: Jon Hunter <jonathanh@nvidia.com>
Tested-by: Jon Hunter <jonathanh@nvidia.com>
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://lore.kernel.org/r/20250613122838.2082334-1-thierry.reding@gmail.com
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
		
	
			
		
			
				
	
	
		
			98 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: MIT
 | |
| 
 | |
| #include <linux/export.h>
 | |
| 
 | |
| #include <drm/clients/drm_client_setup.h>
 | |
| #include <drm/drm_device.h>
 | |
| #include <drm/drm_drv.h>
 | |
| #include <drm/drm_fourcc.h>
 | |
| #include <drm/drm_print.h>
 | |
| 
 | |
| #include "drm_client_internal.h"
 | |
| 
 | |
| static char drm_client_default[16] = CONFIG_DRM_CLIENT_DEFAULT;
 | |
| module_param_string(active, drm_client_default, sizeof(drm_client_default), 0444);
 | |
| MODULE_PARM_DESC(active,
 | |
| 		 "Choose which drm client to start, default is"
 | |
| 		 CONFIG_DRM_CLIENT_DEFAULT "]");
 | |
| 
 | |
| /**
 | |
|  * drm_client_setup() - Setup in-kernel DRM clients
 | |
|  * @dev: DRM device
 | |
|  * @format: Preferred pixel format for the device. Use NULL, unless
 | |
|  *          there is clearly a driver-preferred format.
 | |
|  *
 | |
|  * This function sets up the in-kernel DRM clients. Restore, hotplug
 | |
|  * events and teardown are all taken care of.
 | |
|  *
 | |
|  * Drivers should call drm_client_setup() after registering the new
 | |
|  * DRM device with drm_dev_register(). This function is safe to call
 | |
|  * even when there are no connectors present. Setup will be retried
 | |
|  * on the next hotplug event.
 | |
|  *
 | |
|  * The clients are destroyed by drm_dev_unregister().
 | |
|  */
 | |
| void drm_client_setup(struct drm_device *dev, const struct drm_format_info *format)
 | |
| {
 | |
| 	if (!drm_core_check_feature(dev, DRIVER_MODESET)) {
 | |
| 		drm_dbg(dev, "driver does not support mode-setting, skipping DRM clients\n");
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| #ifdef CONFIG_DRM_FBDEV_EMULATION
 | |
| 	if (!strcmp(drm_client_default, "fbdev")) {
 | |
| 		int ret;
 | |
| 
 | |
| 		ret = drm_fbdev_client_setup(dev, format);
 | |
| 		if (ret)
 | |
| 			drm_warn(dev, "Failed to set up DRM client; error %d\n", ret);
 | |
| 		return;
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| #ifdef CONFIG_DRM_CLIENT_LOG
 | |
| 	if (!strcmp(drm_client_default, "log")) {
 | |
| 		drm_log_register(dev);
 | |
| 		return;
 | |
| 	}
 | |
| #endif
 | |
| 	if (strcmp(drm_client_default, ""))
 | |
| 		drm_warn(dev, "Unknown DRM client %s\n", drm_client_default);
 | |
| }
 | |
| EXPORT_SYMBOL(drm_client_setup);
 | |
| 
 | |
| /**
 | |
|  * drm_client_setup_with_fourcc() - Setup in-kernel DRM clients for color mode
 | |
|  * @dev: DRM device
 | |
|  * @fourcc: Preferred pixel format as 4CC code for the device
 | |
|  *
 | |
|  * This function sets up the in-kernel DRM clients. It is equivalent
 | |
|  * to drm_client_setup(), but expects a 4CC code as second argument.
 | |
|  */
 | |
| void drm_client_setup_with_fourcc(struct drm_device *dev, u32 fourcc)
 | |
| {
 | |
| 	drm_client_setup(dev, drm_format_info(fourcc));
 | |
| }
 | |
| EXPORT_SYMBOL(drm_client_setup_with_fourcc);
 | |
| 
 | |
| /**
 | |
|  * drm_client_setup_with_color_mode() - Setup in-kernel DRM clients for color mode
 | |
|  * @dev: DRM device
 | |
|  * @color_mode: Preferred color mode for the device
 | |
|  *
 | |
|  * This function sets up the in-kernel DRM clients. It is equivalent
 | |
|  * to drm_client_setup(), but expects a color mode as second argument.
 | |
|  *
 | |
|  * Do not use this function in new drivers. Prefer drm_client_setup() with a
 | |
|  * format of NULL.
 | |
|  */
 | |
| void drm_client_setup_with_color_mode(struct drm_device *dev, unsigned int color_mode)
 | |
| {
 | |
| 	u32 fourcc = drm_driver_color_mode_format(dev, color_mode);
 | |
| 
 | |
| 	drm_client_setup_with_fourcc(dev, fourcc);
 | |
| }
 | |
| EXPORT_SYMBOL(drm_client_setup_with_color_mode);
 | |
| 
 | |
| MODULE_DESCRIPTION("In-kernel DRM clients");
 | |
| MODULE_LICENSE("GPL and additional rights");
 |