diff mbox series

[5/5] drm: Add client-lib module

Message ID 20240927144252.31813-6-tzimmermann@suse.de (mailing list archive)
State New, archived
Headers show
Series drm: Introduce DRM client library | expand

Commit Message

Thomas Zimmermann Sept. 27, 2024, 2:37 p.m. UTC
Add drm_client_lib.ko to contain most of the client code. Move the
existing client for fbdev emulation into the new module. Protect the
new module behind CONFIG_DRM_CLIENT.

The Kconfig rules separate the DRM drivers from the DRM clients. A
driver can opt into the default clients, but the user configures
each client individually. To do so, DRM drivers still select
DRM_CLIENT_SELECTION. The option is now a tristate that further
selects all dependencies of the enabled DRM clients. There's
a menu option for each client. Enabling at least one client also
selects DRM_CLIENT_SETUP, so that drivers call drm_client_setup().
New DRM clients should depend on DRM_CLIENT_SELECTION.

The KMS-helper module now exports handful of symbols needed by the
DRM client library.

There are existing kernel options in drm_fb_helper.o, so leave this
file in the KMS-helper module for now.

Amdgpu has an internal DRM client, so it has to select DRM_CLIENT by
itself unconditionally.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/Kconfig            | 31 ++++++++++++++++++++++++------
 drivers/gpu/drm/Makefile           | 19 +++++++++++++-----
 drivers/gpu/drm/amd/amdgpu/Kconfig |  1 +
 drivers/gpu/drm/drm_client.c       |  3 +++
 drivers/gpu/drm/drm_dumb_buffers.c |  2 ++
 drivers/gpu/drm/drm_file.c         |  2 ++
 drivers/gpu/drm/drm_framebuffer.c  |  2 ++
 drivers/gpu/drm/drm_gem.c          |  2 ++
 8 files changed, 51 insertions(+), 11 deletions(-)

Comments

Jocelyn Falempe Sept. 30, 2024, 11:55 a.m. UTC | #1
On 27/09/2024 16:37, Thomas Zimmermann wrote:
> Add drm_client_lib.ko to contain most of the client code. Move the
> existing client for fbdev emulation into the new module. Protect the
> new module behind CONFIG_DRM_CLIENT.
> 
> The Kconfig rules separate the DRM drivers from the DRM clients. A
> driver can opt into the default clients, but the user configures
> each client individually. To do so, DRM drivers still select
> DRM_CLIENT_SELECTION. The option is now a tristate that further
> selects all dependencies of the enabled DRM clients. There's
> a menu option for each client. Enabling at least one client also
> selects DRM_CLIENT_SETUP, so that drivers call drm_client_setup().
> New DRM clients should depend on DRM_CLIENT_SELECTION.
> 
> The KMS-helper module now exports handful of symbols needed by the
> DRM client library.
> 
> There are existing kernel options in drm_fb_helper.o, so leave this
> file in the KMS-helper module for now.
> 
> Amdgpu has an internal DRM client, so it has to select DRM_CLIENT by
> itself unconditionally.

Thanks, I found a typo in the Makefile (see below), other than that it 
looks good to me.

Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>

> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
>   drivers/gpu/drm/Kconfig            | 31 ++++++++++++++++++++++++------
>   drivers/gpu/drm/Makefile           | 19 +++++++++++++-----
>   drivers/gpu/drm/amd/amdgpu/Kconfig |  1 +
>   drivers/gpu/drm/drm_client.c       |  3 +++
>   drivers/gpu/drm/drm_dumb_buffers.c |  2 ++
>   drivers/gpu/drm/drm_file.c         |  2 ++
>   drivers/gpu/drm/drm_framebuffer.c  |  2 ++
>   drivers/gpu/drm/drm_gem.c          |  2 ++
>   8 files changed, 51 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
> index 88b2ba55fe16..379fccf3a6ea 100644
> --- a/drivers/gpu/drm/Kconfig
> +++ b/drivers/gpu/drm/Kconfig
> @@ -9,8 +9,6 @@ menuconfig DRM
>   	tristate "Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)"
>   	depends on (AGP || AGP=n) && !EMULATED_CMPXCHG && HAS_DMA
>   	select DRM_PANEL_ORIENTATION_QUIRKS
> -	select DRM_KMS_HELPER if DRM_FBDEV_EMULATION
> -	select FB_CORE if DRM_FBDEV_EMULATION
>   	select HDMI
>   	select I2C
>   	select DMA_SHARED_BUFFER
> @@ -209,21 +207,40 @@ config DRM_DEBUG_MODESET_LOCK
>   
>   	  If in doubt, say "N".
>   
> +config DRM_CLIENT
> +	tristate
> +	depends on DRM
> +	help
> +	  Enables the DRM client-lib module. DRM drivers that need
> +	  struct drm_client_dev and its interfaces should select this
> +	  option. Drivers that support the default clients should
> +	  select DRM_CLIENT_SELECTION instead.
> +
>   config DRM_CLIENT_SELECTION
> -	bool
> +	tristate
>   	depends on DRM
> -	select DRM_CLIENT_SETUP if DRM_FBDEV_EMULATION
> +	select DRM_CLIENT if DRM_FBDEV_EMULATION
> +	select DRM_KMS_HELPER if DRM_FBDEV_EMULATION
> +	select FB_CORE if DRM_FBDEV_EMULATION
>   	help
>   	  Drivers that support in-kernel DRM clients have to select this
> -	  option.
> +	  option. It selects all modules and components according to the
> +	  enabled clients.
>   
>   config DRM_CLIENT_SETUP
>   	bool
>   	depends on DRM_CLIENT_SELECTION
> +	help
> +	  Enables the DRM client selection. DRM drivers that support the
> +	  default clients should select DRM_CLIENT_SELECTION instead.
> +
> +menu "Supported DRM clients"
> +	depends on DRM_CLIENT_SELECTION
>   
>   config DRM_FBDEV_EMULATION
>   	bool "Enable legacy fbdev support for your modesetting driver"
> -	depends on DRM
> +	depends on DRM_CLIENT_SELECTION
> +	select DRM_CLIENT_SETUP
>   	select FRAMEBUFFER_CONSOLE_DETECT_PRIMARY if FRAMEBUFFER_CONSOLE
>   	default FB
>   	help
> @@ -262,6 +279,8 @@ config DRM_FBDEV_LEAK_PHYS_SMEM
>   	  If in doubt, say "N" or spread the word to your closed source
>   	  library vendor.
>   
> +endmenu
> +
>   config DRM_LOAD_EDID_FIRMWARE
>   	bool "Allow to specify an EDID data set instead of probing for it"
>   	depends on DRM
> diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
> index c50443756457..419208b97f57 100644
> --- a/drivers/gpu/drm/Makefile
> +++ b/drivers/gpu/drm/Makefile
> @@ -41,9 +41,7 @@ drm-y := \
>   	drm_blend.o \
>   	drm_bridge.o \
>   	drm_cache.o \
> -	drm_client.o \
>   	drm_client_dev.o \
> -	drm_client_modeset.o \
>   	drm_color_mgmt.o \
>   	drm_connector.o \
>   	drm_crtc.o \
> @@ -144,14 +142,25 @@ drm_kms_helper-y := \
>   	drm_probe_helper.o \
>   	drm_self_refresh_helper.o \
>   	drm_simple_kms_helper.o
> -drm_kms_helper-$(CONFIG_DRM_CLIENT_SETUP) += \
> -	drm_client_setup.o
>   drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o
>   drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += \
> -	drm_fbdev_client.o \
>   	drm_fb_helper.o
> +drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o
>   obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o
>   
> +#
> +# DRM clients
> +#
> +
> +drm_client_lib-y := \
> +	drm_client.o \
> +	drm_client_modeset.o
> +drm_client_lib-$(CONFIG_DRM_CLIENT_SETUP) += \
> +	drm_client_setup.o
> +drm_client_lib-$(CONFIG_DRM_FBDEV_EMULATION) += \
> +	drm_fbdev_client.o
> +obj-$(CONFIG_DRM_CLIENT) += drm_client_lib.o
> +
>   #
>   # Drivers and the rest
>   #
> diff --git a/drivers/gpu/drm/amd/amdgpu/Kconfig b/drivers/gpu/drm/amd/amdgpu/Kconfig
> index 680a94c361ba..41fa3377d9cf 100644
> --- a/drivers/gpu/drm/amd/amdgpu/Kconfig
> +++ b/drivers/gpu/drm/amd/amdgpu/Kconfig
> @@ -5,6 +5,7 @@ config DRM_AMDGPU
>   	depends on DRM && PCI && MMU
>   	depends on !UML
>   	select FW_LOADER
> +	select DRM_CLIENT
>   	select DRM_CLIENT_SELECTION
>   	select DRM_DISPLAY_DP_HELPER
>   	select DRM_DISPLAY_DSC_HELPER
> diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
> index 549b28a5918c..864ee96e48cf 100644
> --- a/drivers/gpu/drm/drm_client.c
> +++ b/drivers/gpu/drm/drm_client.c
> @@ -490,3 +490,6 @@ int drm_client_framebuffer_flush(struct drm_client_buffer *buffer, struct drm_re
>   					0, 0, NULL, 0);
>   }
>   EXPORT_SYMBOL(drm_client_framebuffer_flush);
> +
> +MODULE_DESCRIPTION("In-kernel DRM clients");
> +MODULE_LICENSE("GPL and additional rights");
> diff --git a/drivers/gpu/drm/drm_dumb_buffers.c b/drivers/gpu/drm/drm_dumb_buffers.c
> index 70032bba1c97..7ed8f05a8d5c 100644
> --- a/drivers/gpu/drm/drm_dumb_buffers.c
> +++ b/drivers/gpu/drm/drm_dumb_buffers.c
> @@ -95,6 +95,7 @@ int drm_mode_create_dumb(struct drm_device *dev,
>   
>   	return dev->driver->dumb_create(file_priv, dev, args);
>   }
> +EXPORT_SYMBOL(drm_mode_create_dumb);
>   
>   int drm_mode_create_dumb_ioctl(struct drm_device *dev,
>   			       void *data, struct drm_file *file_priv)
> @@ -141,6 +142,7 @@ int drm_mode_destroy_dumb(struct drm_device *dev, u32 handle,
>   
>   	return drm_gem_handle_delete(file_priv, handle);
>   }
> +EXPORT_SYMBOL(drm_mode_destroy_dumb);
>   
>   int drm_mode_destroy_dumb_ioctl(struct drm_device *dev,
>   				void *data, struct drm_file *file_priv)
> diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c
> index 01fde94fe2a9..dd847b574457 100644
> --- a/drivers/gpu/drm/drm_file.c
> +++ b/drivers/gpu/drm/drm_file.c
> @@ -186,6 +186,7 @@ struct drm_file *drm_file_alloc(struct drm_minor *minor)
>   
>   	return ERR_PTR(ret);
>   }
> +EXPORT_SYMBOL(drm_file_alloc);
>   
>   static void drm_events_release(struct drm_file *file_priv)
>   {
> @@ -261,6 +262,7 @@ void drm_file_free(struct drm_file *file)
>   	put_pid(rcu_access_pointer(file->pid));
>   	kfree(file);
>   }
> +EXPORT_SYMBOL(drm_file_free);
>   
>   static void drm_close_helper(struct file *filp)
>   {
> diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c
> index 47e6e8577b62..761262529416 100644
> --- a/drivers/gpu/drm/drm_framebuffer.c
> +++ b/drivers/gpu/drm/drm_framebuffer.c
> @@ -349,6 +349,7 @@ int drm_mode_addfb2(struct drm_device *dev,
>   
>   	return 0;
>   }
> +EXPORT_SYMBOL(drm_mode_addfb2);
>   
>   int drm_mode_addfb2_ioctl(struct drm_device *dev,
>   			  void *data, struct drm_file *file_priv)
> @@ -473,6 +474,7 @@ int drm_mode_rmfb(struct drm_device *dev, u32 fb_id,
>   
>   	return 0;
>   }
> +EXPORT_SYMBOL(drm_mode_rmfb);
>   
>   int drm_mode_rmfb_ioctl(struct drm_device *dev,
>   			void *data, struct drm_file *file_priv)
> diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
> index ee811764c3df..07ae82e35517 100644
> --- a/drivers/gpu/drm/drm_gem.c
> +++ b/drivers/gpu/drm/drm_gem.c
> @@ -1191,12 +1191,14 @@ int drm_gem_pin_locked(struct drm_gem_object *obj)
>   
>   	return 0;
>   }
> +EXPORT_SYMBOL(drm_gem_pin_locked);
>   
>   void drm_gem_unpin_locked(struct drm_gem_object *obj)
>   {
>   	if (obj->funcs->unpin)
>   		obj->funcs->unpin(obj);
>   }
> +EXPORT_SYMBOL(drm_gem_unpin_locked);
>   
>   int drm_gem_pin(struct drm_gem_object *obj)
>   {
Jocelyn Falempe Sept. 30, 2024, 11:56 a.m. UTC | #2
On 30/09/2024 13:55, Jocelyn Falempe wrote:
> On 27/09/2024 16:37, Thomas Zimmermann wrote:
>> Add drm_client_lib.ko to contain most of the client code. Move the
>> existing client for fbdev emulation into the new module. Protect the
>> new module behind CONFIG_DRM_CLIENT.
>>
>> The Kconfig rules separate the DRM drivers from the DRM clients. A
>> driver can opt into the default clients, but the user configures
>> each client individually. To do so, DRM drivers still select
>> DRM_CLIENT_SELECTION. The option is now a tristate that further
>> selects all dependencies of the enabled DRM clients. There's
>> a menu option for each client. Enabling at least one client also
>> selects DRM_CLIENT_SETUP, so that drivers call drm_client_setup().
>> New DRM clients should depend on DRM_CLIENT_SELECTION.
>>
>> The KMS-helper module now exports handful of symbols needed by the
>> DRM client library.
>>
>> There are existing kernel options in drm_fb_helper.o, so leave this
>> file in the KMS-helper module for now.
>>
>> Amdgpu has an internal DRM client, so it has to select DRM_CLIENT by
>> itself unconditionally.
> 
> Thanks, I found a typo in the Makefile (see below), other than that it 
> looks good to me.

Sorry, this time with the typo below.
> 
> Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
> 
>>
>> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
>> ---
>>   drivers/gpu/drm/Kconfig            | 31 ++++++++++++++++++++++++------
>>   drivers/gpu/drm/Makefile           | 19 +++++++++++++-----
>>   drivers/gpu/drm/amd/amdgpu/Kconfig |  1 +
>>   drivers/gpu/drm/drm_client.c       |  3 +++
>>   drivers/gpu/drm/drm_dumb_buffers.c |  2 ++
>>   drivers/gpu/drm/drm_file.c         |  2 ++
>>   drivers/gpu/drm/drm_framebuffer.c  |  2 ++
>>   drivers/gpu/drm/drm_gem.c          |  2 ++
>>   8 files changed, 51 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
>> index 88b2ba55fe16..379fccf3a6ea 100644
>> --- a/drivers/gpu/drm/Kconfig
>> +++ b/drivers/gpu/drm/Kconfig
>> @@ -9,8 +9,6 @@ menuconfig DRM
>>       tristate "Direct Rendering Manager (XFree86 4.1.0 and higher DRI 
>> support)"
>>       depends on (AGP || AGP=n) && !EMULATED_CMPXCHG && HAS_DMA
>>       select DRM_PANEL_ORIENTATION_QUIRKS
>> -    select DRM_KMS_HELPER if DRM_FBDEV_EMULATION
>> -    select FB_CORE if DRM_FBDEV_EMULATION
>>       select HDMI
>>       select I2C
>>       select DMA_SHARED_BUFFER
>> @@ -209,21 +207,40 @@ config DRM_DEBUG_MODESET_LOCK
>>         If in doubt, say "N".
>> +config DRM_CLIENT
>> +    tristate
>> +    depends on DRM
>> +    help
>> +      Enables the DRM client-lib module. DRM drivers that need
>> +      struct drm_client_dev and its interfaces should select this
>> +      option. Drivers that support the default clients should
>> +      select DRM_CLIENT_SELECTION instead.
>> +
>>   config DRM_CLIENT_SELECTION
>> -    bool
>> +    tristate
>>       depends on DRM
>> -    select DRM_CLIENT_SETUP if DRM_FBDEV_EMULATION
>> +    select DRM_CLIENT if DRM_FBDEV_EMULATION
>> +    select DRM_KMS_HELPER if DRM_FBDEV_EMULATION
>> +    select FB_CORE if DRM_FBDEV_EMULATION
>>       help
>>         Drivers that support in-kernel DRM clients have to select this
>> -      option.
>> +      option. It selects all modules and components according to the
>> +      enabled clients.
>>   config DRM_CLIENT_SETUP
>>       bool
>>       depends on DRM_CLIENT_SELECTION
>> +    help
>> +      Enables the DRM client selection. DRM drivers that support the
>> +      default clients should select DRM_CLIENT_SELECTION instead.
>> +
>> +menu "Supported DRM clients"
>> +    depends on DRM_CLIENT_SELECTION
>>   config DRM_FBDEV_EMULATION
>>       bool "Enable legacy fbdev support for your modesetting driver"
>> -    depends on DRM
>> +    depends on DRM_CLIENT_SELECTION
>> +    select DRM_CLIENT_SETUP
>>       select FRAMEBUFFER_CONSOLE_DETECT_PRIMARY if FRAMEBUFFER_CONSOLE
>>       default FB
>>       help
>> @@ -262,6 +279,8 @@ config DRM_FBDEV_LEAK_PHYS_SMEM
>>         If in doubt, say "N" or spread the word to your closed source
>>         library vendor.
>> +endmenu
>> +
>>   config DRM_LOAD_EDID_FIRMWARE
>>       bool "Allow to specify an EDID data set instead of probing for it"
>>       depends on DRM
>> diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
>> index c50443756457..419208b97f57 100644
>> --- a/drivers/gpu/drm/Makefile
>> +++ b/drivers/gpu/drm/Makefile
>> @@ -41,9 +41,7 @@ drm-y := \
>>       drm_blend.o \
>>       drm_bridge.o \
>>       drm_cache.o \
>> -    drm_client.o \
>>       drm_client_dev.o \
>> -    drm_client_modeset.o \
>>       drm_color_mgmt.o \
>>       drm_connector.o \
>>       drm_crtc.o \
>> @@ -144,14 +142,25 @@ drm_kms_helper-y := \
>>       drm_probe_helper.o \
>>       drm_self_refresh_helper.o \
>>       drm_simple_kms_helper.o
>> -drm_kms_helper-$(CONFIG_DRM_CLIENT_SETUP) += \
>> -    drm_client_setup.o
>>   drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o
>>   drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += \
>> -    drm_fbdev_client.o \
>>       drm_fb_helper.o
>> +drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o

Typo: the above line is duplicated.

>>   obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o
>> +#
>> +# DRM clients
>> +#
>> +
>> +drm_client_lib-y := \
>> +    drm_client.o \
>> +    drm_client_modeset.o
>> +drm_client_lib-$(CONFIG_DRM_CLIENT_SETUP) += \
>> +    drm_client_setup.o
>> +drm_client_lib-$(CONFIG_DRM_FBDEV_EMULATION) += \
>> +    drm_fbdev_client.o
>> +obj-$(CONFIG_DRM_CLIENT) += drm_client_lib.o
>> +
>>   #
>>   # Drivers and the rest
>>   #
>> diff --git a/drivers/gpu/drm/amd/amdgpu/Kconfig b/drivers/gpu/drm/amd/ 
>> amdgpu/Kconfig
>> index 680a94c361ba..41fa3377d9cf 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/Kconfig
>> +++ b/drivers/gpu/drm/amd/amdgpu/Kconfig
>> @@ -5,6 +5,7 @@ config DRM_AMDGPU
>>       depends on DRM && PCI && MMU
>>       depends on !UML
>>       select FW_LOADER
>> +    select DRM_CLIENT
>>       select DRM_CLIENT_SELECTION
>>       select DRM_DISPLAY_DP_HELPER
>>       select DRM_DISPLAY_DSC_HELPER
>> diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
>> index 549b28a5918c..864ee96e48cf 100644
>> --- a/drivers/gpu/drm/drm_client.c
>> +++ b/drivers/gpu/drm/drm_client.c
>> @@ -490,3 +490,6 @@ int drm_client_framebuffer_flush(struct 
>> drm_client_buffer *buffer, struct drm_re
>>                       0, 0, NULL, 0);
>>   }
>>   EXPORT_SYMBOL(drm_client_framebuffer_flush);
>> +
>> +MODULE_DESCRIPTION("In-kernel DRM clients");
>> +MODULE_LICENSE("GPL and additional rights");
>> diff --git a/drivers/gpu/drm/drm_dumb_buffers.c b/drivers/gpu/drm/ 
>> drm_dumb_buffers.c
>> index 70032bba1c97..7ed8f05a8d5c 100644
>> --- a/drivers/gpu/drm/drm_dumb_buffers.c
>> +++ b/drivers/gpu/drm/drm_dumb_buffers.c
>> @@ -95,6 +95,7 @@ int drm_mode_create_dumb(struct drm_device *dev,
>>       return dev->driver->dumb_create(file_priv, dev, args);
>>   }
>> +EXPORT_SYMBOL(drm_mode_create_dumb);
>>   int drm_mode_create_dumb_ioctl(struct drm_device *dev,
>>                      void *data, struct drm_file *file_priv)
>> @@ -141,6 +142,7 @@ int drm_mode_destroy_dumb(struct drm_device *dev, 
>> u32 handle,
>>       return drm_gem_handle_delete(file_priv, handle);
>>   }
>> +EXPORT_SYMBOL(drm_mode_destroy_dumb);
>>   int drm_mode_destroy_dumb_ioctl(struct drm_device *dev,
>>                   void *data, struct drm_file *file_priv)
>> diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c
>> index 01fde94fe2a9..dd847b574457 100644
>> --- a/drivers/gpu/drm/drm_file.c
>> +++ b/drivers/gpu/drm/drm_file.c
>> @@ -186,6 +186,7 @@ struct drm_file *drm_file_alloc(struct drm_minor 
>> *minor)
>>       return ERR_PTR(ret);
>>   }
>> +EXPORT_SYMBOL(drm_file_alloc);
>>   static void drm_events_release(struct drm_file *file_priv)
>>   {
>> @@ -261,6 +262,7 @@ void drm_file_free(struct drm_file *file)
>>       put_pid(rcu_access_pointer(file->pid));
>>       kfree(file);
>>   }
>> +EXPORT_SYMBOL(drm_file_free);
>>   static void drm_close_helper(struct file *filp)
>>   {
>> diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/ 
>> drm_framebuffer.c
>> index 47e6e8577b62..761262529416 100644
>> --- a/drivers/gpu/drm/drm_framebuffer.c
>> +++ b/drivers/gpu/drm/drm_framebuffer.c
>> @@ -349,6 +349,7 @@ int drm_mode_addfb2(struct drm_device *dev,
>>       return 0;
>>   }
>> +EXPORT_SYMBOL(drm_mode_addfb2);
>>   int drm_mode_addfb2_ioctl(struct drm_device *dev,
>>                 void *data, struct drm_file *file_priv)
>> @@ -473,6 +474,7 @@ int drm_mode_rmfb(struct drm_device *dev, u32 fb_id,
>>       return 0;
>>   }
>> +EXPORT_SYMBOL(drm_mode_rmfb);
>>   int drm_mode_rmfb_ioctl(struct drm_device *dev,
>>               void *data, struct drm_file *file_priv)
>> diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
>> index ee811764c3df..07ae82e35517 100644
>> --- a/drivers/gpu/drm/drm_gem.c
>> +++ b/drivers/gpu/drm/drm_gem.c
>> @@ -1191,12 +1191,14 @@ int drm_gem_pin_locked(struct drm_gem_object 
>> *obj)
>>       return 0;
>>   }
>> +EXPORT_SYMBOL(drm_gem_pin_locked);
>>   void drm_gem_unpin_locked(struct drm_gem_object *obj)
>>   {
>>       if (obj->funcs->unpin)
>>           obj->funcs->unpin(obj);
>>   }
>> +EXPORT_SYMBOL(drm_gem_unpin_locked);
>>   int drm_gem_pin(struct drm_gem_object *obj)
>>   {
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 88b2ba55fe16..379fccf3a6ea 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -9,8 +9,6 @@  menuconfig DRM
 	tristate "Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)"
 	depends on (AGP || AGP=n) && !EMULATED_CMPXCHG && HAS_DMA
 	select DRM_PANEL_ORIENTATION_QUIRKS
-	select DRM_KMS_HELPER if DRM_FBDEV_EMULATION
-	select FB_CORE if DRM_FBDEV_EMULATION
 	select HDMI
 	select I2C
 	select DMA_SHARED_BUFFER
@@ -209,21 +207,40 @@  config DRM_DEBUG_MODESET_LOCK
 
 	  If in doubt, say "N".
 
+config DRM_CLIENT
+	tristate
+	depends on DRM
+	help
+	  Enables the DRM client-lib module. DRM drivers that need
+	  struct drm_client_dev and its interfaces should select this
+	  option. Drivers that support the default clients should
+	  select DRM_CLIENT_SELECTION instead.
+
 config DRM_CLIENT_SELECTION
-	bool
+	tristate
 	depends on DRM
-	select DRM_CLIENT_SETUP if DRM_FBDEV_EMULATION
+	select DRM_CLIENT if DRM_FBDEV_EMULATION
+	select DRM_KMS_HELPER if DRM_FBDEV_EMULATION
+	select FB_CORE if DRM_FBDEV_EMULATION
 	help
 	  Drivers that support in-kernel DRM clients have to select this
-	  option.
+	  option. It selects all modules and components according to the
+	  enabled clients.
 
 config DRM_CLIENT_SETUP
 	bool
 	depends on DRM_CLIENT_SELECTION
+	help
+	  Enables the DRM client selection. DRM drivers that support the
+	  default clients should select DRM_CLIENT_SELECTION instead.
+
+menu "Supported DRM clients"
+	depends on DRM_CLIENT_SELECTION
 
 config DRM_FBDEV_EMULATION
 	bool "Enable legacy fbdev support for your modesetting driver"
-	depends on DRM
+	depends on DRM_CLIENT_SELECTION
+	select DRM_CLIENT_SETUP
 	select FRAMEBUFFER_CONSOLE_DETECT_PRIMARY if FRAMEBUFFER_CONSOLE
 	default FB
 	help
@@ -262,6 +279,8 @@  config DRM_FBDEV_LEAK_PHYS_SMEM
 	  If in doubt, say "N" or spread the word to your closed source
 	  library vendor.
 
+endmenu
+
 config DRM_LOAD_EDID_FIRMWARE
 	bool "Allow to specify an EDID data set instead of probing for it"
 	depends on DRM
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index c50443756457..419208b97f57 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -41,9 +41,7 @@  drm-y := \
 	drm_blend.o \
 	drm_bridge.o \
 	drm_cache.o \
-	drm_client.o \
 	drm_client_dev.o \
-	drm_client_modeset.o \
 	drm_color_mgmt.o \
 	drm_connector.o \
 	drm_crtc.o \
@@ -144,14 +142,25 @@  drm_kms_helper-y := \
 	drm_probe_helper.o \
 	drm_self_refresh_helper.o \
 	drm_simple_kms_helper.o
-drm_kms_helper-$(CONFIG_DRM_CLIENT_SETUP) += \
-	drm_client_setup.o
 drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o
 drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += \
-	drm_fbdev_client.o \
 	drm_fb_helper.o
+drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o
 obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o
 
+#
+# DRM clients
+#
+
+drm_client_lib-y := \
+	drm_client.o \
+	drm_client_modeset.o
+drm_client_lib-$(CONFIG_DRM_CLIENT_SETUP) += \
+	drm_client_setup.o
+drm_client_lib-$(CONFIG_DRM_FBDEV_EMULATION) += \
+	drm_fbdev_client.o
+obj-$(CONFIG_DRM_CLIENT) += drm_client_lib.o
+
 #
 # Drivers and the rest
 #
diff --git a/drivers/gpu/drm/amd/amdgpu/Kconfig b/drivers/gpu/drm/amd/amdgpu/Kconfig
index 680a94c361ba..41fa3377d9cf 100644
--- a/drivers/gpu/drm/amd/amdgpu/Kconfig
+++ b/drivers/gpu/drm/amd/amdgpu/Kconfig
@@ -5,6 +5,7 @@  config DRM_AMDGPU
 	depends on DRM && PCI && MMU
 	depends on !UML
 	select FW_LOADER
+	select DRM_CLIENT
 	select DRM_CLIENT_SELECTION
 	select DRM_DISPLAY_DP_HELPER
 	select DRM_DISPLAY_DSC_HELPER
diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
index 549b28a5918c..864ee96e48cf 100644
--- a/drivers/gpu/drm/drm_client.c
+++ b/drivers/gpu/drm/drm_client.c
@@ -490,3 +490,6 @@  int drm_client_framebuffer_flush(struct drm_client_buffer *buffer, struct drm_re
 					0, 0, NULL, 0);
 }
 EXPORT_SYMBOL(drm_client_framebuffer_flush);
+
+MODULE_DESCRIPTION("In-kernel DRM clients");
+MODULE_LICENSE("GPL and additional rights");
diff --git a/drivers/gpu/drm/drm_dumb_buffers.c b/drivers/gpu/drm/drm_dumb_buffers.c
index 70032bba1c97..7ed8f05a8d5c 100644
--- a/drivers/gpu/drm/drm_dumb_buffers.c
+++ b/drivers/gpu/drm/drm_dumb_buffers.c
@@ -95,6 +95,7 @@  int drm_mode_create_dumb(struct drm_device *dev,
 
 	return dev->driver->dumb_create(file_priv, dev, args);
 }
+EXPORT_SYMBOL(drm_mode_create_dumb);
 
 int drm_mode_create_dumb_ioctl(struct drm_device *dev,
 			       void *data, struct drm_file *file_priv)
@@ -141,6 +142,7 @@  int drm_mode_destroy_dumb(struct drm_device *dev, u32 handle,
 
 	return drm_gem_handle_delete(file_priv, handle);
 }
+EXPORT_SYMBOL(drm_mode_destroy_dumb);
 
 int drm_mode_destroy_dumb_ioctl(struct drm_device *dev,
 				void *data, struct drm_file *file_priv)
diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c
index 01fde94fe2a9..dd847b574457 100644
--- a/drivers/gpu/drm/drm_file.c
+++ b/drivers/gpu/drm/drm_file.c
@@ -186,6 +186,7 @@  struct drm_file *drm_file_alloc(struct drm_minor *minor)
 
 	return ERR_PTR(ret);
 }
+EXPORT_SYMBOL(drm_file_alloc);
 
 static void drm_events_release(struct drm_file *file_priv)
 {
@@ -261,6 +262,7 @@  void drm_file_free(struct drm_file *file)
 	put_pid(rcu_access_pointer(file->pid));
 	kfree(file);
 }
+EXPORT_SYMBOL(drm_file_free);
 
 static void drm_close_helper(struct file *filp)
 {
diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c
index 47e6e8577b62..761262529416 100644
--- a/drivers/gpu/drm/drm_framebuffer.c
+++ b/drivers/gpu/drm/drm_framebuffer.c
@@ -349,6 +349,7 @@  int drm_mode_addfb2(struct drm_device *dev,
 
 	return 0;
 }
+EXPORT_SYMBOL(drm_mode_addfb2);
 
 int drm_mode_addfb2_ioctl(struct drm_device *dev,
 			  void *data, struct drm_file *file_priv)
@@ -473,6 +474,7 @@  int drm_mode_rmfb(struct drm_device *dev, u32 fb_id,
 
 	return 0;
 }
+EXPORT_SYMBOL(drm_mode_rmfb);
 
 int drm_mode_rmfb_ioctl(struct drm_device *dev,
 			void *data, struct drm_file *file_priv)
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index ee811764c3df..07ae82e35517 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -1191,12 +1191,14 @@  int drm_gem_pin_locked(struct drm_gem_object *obj)
 
 	return 0;
 }
+EXPORT_SYMBOL(drm_gem_pin_locked);
 
 void drm_gem_unpin_locked(struct drm_gem_object *obj)
 {
 	if (obj->funcs->unpin)
 		obj->funcs->unpin(obj);
 }
+EXPORT_SYMBOL(drm_gem_unpin_locked);
 
 int drm_gem_pin(struct drm_gem_object *obj)
 {