mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
drm/client: Deprecate struct drm_client_buffer.gem
The client buffer's framebuffer holds a reference and pointer on each of its GEM buffer objects. Thus the field gem in the client- buffer struct is not necessary. Deprecated the field and convert the client-buffer helpers to use the framebuffer's objects. In drm_client_buffer_delete(), do a possible vunmap before releasing the framebuffer. Otherwise we'd eventually release the framebuffer before unmaping its buffer objects. v2: - avoid dependency on CONFIG_DRM_KMS_HELPER Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com> Tested-by: Francesco Valla <francesco@valla.it> Link: https://patch.msgid.link/20251027121042.143588-5-tzimmermann@suse.de
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
#include <drm/drm_fourcc.h>
|
||||
#include <drm/drm_framebuffer.h>
|
||||
#include <drm/drm_gem.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/drm_mode.h>
|
||||
#include <drm/drm_print.h>
|
||||
|
||||
@@ -178,17 +179,17 @@ EXPORT_SYMBOL(drm_client_release);
|
||||
|
||||
static void drm_client_buffer_delete(struct drm_client_buffer *buffer)
|
||||
{
|
||||
struct drm_gem_object *gem = buffer->fb->obj[0];
|
||||
int ret;
|
||||
|
||||
drm_gem_vunmap(gem, &buffer->map);
|
||||
|
||||
ret = drm_mode_rmfb(buffer->client->dev, buffer->fb->base.id, buffer->client->file);
|
||||
if (ret)
|
||||
drm_err(buffer->client->dev,
|
||||
"Error removing FB:%u (%d)\n", buffer->fb->base.id, ret);
|
||||
|
||||
if (buffer->gem) {
|
||||
drm_gem_vunmap(buffer->gem, &buffer->map);
|
||||
drm_gem_object_put(buffer->gem);
|
||||
}
|
||||
drm_gem_object_put(buffer->gem);
|
||||
|
||||
kfree(buffer);
|
||||
}
|
||||
@@ -278,7 +279,7 @@ err_delete:
|
||||
int drm_client_buffer_vmap_local(struct drm_client_buffer *buffer,
|
||||
struct iosys_map *map_copy)
|
||||
{
|
||||
struct drm_gem_object *gem = buffer->gem;
|
||||
struct drm_gem_object *gem = buffer->fb->obj[0];
|
||||
struct iosys_map *map = &buffer->map;
|
||||
int ret;
|
||||
|
||||
@@ -307,7 +308,7 @@ EXPORT_SYMBOL(drm_client_buffer_vmap_local);
|
||||
*/
|
||||
void drm_client_buffer_vunmap_local(struct drm_client_buffer *buffer)
|
||||
{
|
||||
struct drm_gem_object *gem = buffer->gem;
|
||||
struct drm_gem_object *gem = buffer->fb->obj[0];
|
||||
struct iosys_map *map = &buffer->map;
|
||||
|
||||
drm_gem_vunmap_locked(gem, map);
|
||||
@@ -338,9 +339,10 @@ EXPORT_SYMBOL(drm_client_buffer_vunmap_local);
|
||||
int drm_client_buffer_vmap(struct drm_client_buffer *buffer,
|
||||
struct iosys_map *map_copy)
|
||||
{
|
||||
struct drm_gem_object *gem = buffer->fb->obj[0];
|
||||
int ret;
|
||||
|
||||
ret = drm_gem_vmap(buffer->gem, &buffer->map);
|
||||
ret = drm_gem_vmap(gem, &buffer->map);
|
||||
if (ret)
|
||||
return ret;
|
||||
*map_copy = buffer->map;
|
||||
@@ -359,7 +361,9 @@ EXPORT_SYMBOL(drm_client_buffer_vmap);
|
||||
*/
|
||||
void drm_client_buffer_vunmap(struct drm_client_buffer *buffer)
|
||||
{
|
||||
drm_gem_vunmap(buffer->gem, &buffer->map);
|
||||
struct drm_gem_object *gem = buffer->fb->obj[0];
|
||||
|
||||
drm_gem_vunmap(gem, &buffer->map);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_client_buffer_vunmap);
|
||||
|
||||
|
||||
@@ -176,12 +176,9 @@ struct drm_client_buffer {
|
||||
/**
|
||||
* @gem: GEM object backing this buffer
|
||||
*
|
||||
* FIXME: The dependency on GEM here isn't required, we could
|
||||
* convert the driver handle to a dma-buf instead and use the
|
||||
* backend-agnostic dma-buf vmap support instead. This would
|
||||
* require that the handle2fd prime ioctl is reworked to pull the
|
||||
* fd_install step out of the driver backend hooks, to make that
|
||||
* final step optional for internal users.
|
||||
* FIXME: The DRM framebuffer holds a reference on its GEM
|
||||
* buffer objects. Do not use this field in new code and
|
||||
* update existing users.
|
||||
*/
|
||||
struct drm_gem_object *gem;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user