Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/client: Move dumb-buffer handling to drm_client_framebuffer_create()

Dumb-buffer creation within the client code is asymetrically balanced
across drm_client_buffer_create() and drm_client_framebuffer_create().
Put all dumb-buffer code into drm_client_framebuffer_create() and leave
client-buffer initialization to drm_client_buffer_create(). Clarifies
responsibility between these functions.

Apart form the architectural improvements, drm_client_buffer_create()
can now be exported if needed by clients. The client will be able to
initialize buffers that have been created from other interfaces than
dumb buffers.

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-3-tzimmermann@suse.de

+30 -28
+30 -28
drivers/gpu/drm/drm_client.c
··· 188 188 189 189 static struct drm_client_buffer * 190 190 drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height, 191 - u32 format, u32 *handle, u32 *pitch) 191 + u32 format, u32 handle, u32 pitch) 192 192 { 193 - const struct drm_format_info *info = drm_format_info(format); 194 - struct drm_mode_create_dumb dumb_args = { }; 195 - struct drm_device *dev = client->dev; 196 193 struct drm_client_buffer *buffer; 197 194 struct drm_gem_object *obj; 198 195 int ret; ··· 200 203 201 204 buffer->client = client; 202 205 203 - dumb_args.width = width; 204 - dumb_args.height = height; 205 - dumb_args.bpp = drm_format_info_bpp(info, 0); 206 - ret = drm_mode_create_dumb(dev, &dumb_args, client->file); 207 - if (ret) 208 - goto err_delete; 209 - 210 - obj = drm_gem_object_lookup(client->file, dumb_args.handle); 206 + obj = drm_gem_object_lookup(client->file, handle); 211 207 if (!obj) { 212 208 ret = -ENOENT; 213 209 goto err_delete; 214 210 } 215 211 216 212 buffer->gem = obj; 217 - *handle = dumb_args.handle; 218 - *pitch = dumb_args.pitch; 219 213 220 214 return buffer; 221 215 222 216 err_delete: 223 - drm_client_buffer_delete(buffer); 224 - 217 + kfree(buffer); 225 218 return ERR_PTR(ret); 226 219 } 227 220 ··· 385 398 struct drm_client_buffer * 386 399 drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format) 387 400 { 401 + const struct drm_format_info *info = drm_format_info(format); 402 + struct drm_device *dev = client->dev; 403 + struct drm_mode_create_dumb dumb_args = { }; 388 404 struct drm_client_buffer *buffer; 389 - u32 handle, pitch; 390 405 int ret; 391 406 392 - buffer = drm_client_buffer_create(client, width, height, format, 393 - &handle, &pitch); 394 - if (IS_ERR(buffer)) 395 - return buffer; 407 + dumb_args.width = width; 408 + dumb_args.height = height; 409 + dumb_args.bpp = drm_format_info_bpp(info, 0); 410 + ret = drm_mode_create_dumb(dev, &dumb_args, client->file); 411 + if (ret) 412 + return ERR_PTR(ret); 396 413 397 - ret = drm_client_buffer_addfb(buffer, width, height, format, handle, pitch); 414 + buffer = drm_client_buffer_create(client, width, height, format, 415 + dumb_args.handle, dumb_args.pitch); 416 + if (IS_ERR(buffer)) { 417 + ret = PTR_ERR(buffer); 418 + goto err_drm_mode_destroy_dumb; 419 + } 420 + 421 + ret = drm_client_buffer_addfb(buffer, width, height, format, 422 + dumb_args.handle, dumb_args.pitch); 423 + if (ret) 424 + goto err_drm_client_buffer_delete; 398 425 399 426 /* 400 427 * The handle is only needed for creating the framebuffer, destroy it ··· 416 415 * object as DMA-buf. The framebuffer and our buffer structure are still 417 416 * holding references to the GEM object to prevent its destruction. 418 417 */ 419 - drm_mode_destroy_dumb(client->dev, handle, client->file); 420 - 421 - if (ret) { 422 - drm_client_buffer_delete(buffer); 423 - return ERR_PTR(ret); 424 - } 418 + drm_mode_destroy_dumb(client->dev, dumb_args.handle, client->file); 425 419 426 420 return buffer; 421 + 422 + err_drm_client_buffer_delete: 423 + drm_client_buffer_delete(buffer); 424 + err_drm_mode_destroy_dumb: 425 + drm_mode_destroy_dumb(client->dev, dumb_args.handle, client->file); 426 + return ERR_PTR(ret); 427 427 } 428 428 EXPORT_SYMBOL(drm_client_framebuffer_create); 429 429