diff options
Diffstat (limited to 'drivers/gpu/drm/bochs/bochs_mm.c')
| -rw-r--r-- | drivers/gpu/drm/bochs/bochs_mm.c | 74 |
1 files changed, 0 insertions, 74 deletions
diff --git a/drivers/gpu/drm/bochs/bochs_mm.c b/drivers/gpu/drm/bochs/bochs_mm.c index c9c7097030ca..a61c1ecb2bdc 100644 --- a/drivers/gpu/drm/bochs/bochs_mm.c +++ b/drivers/gpu/drm/bochs/bochs_mm.c | |||
| @@ -457,77 +457,3 @@ int bochs_dumb_mmap_offset(struct drm_file *file, struct drm_device *dev, | |||
| 457 | drm_gem_object_unreference_unlocked(obj); | 457 | drm_gem_object_unreference_unlocked(obj); |
| 458 | return 0; | 458 | return 0; |
| 459 | } | 459 | } |
| 460 | |||
| 461 | /* ---------------------------------------------------------------------- */ | ||
| 462 | |||
| 463 | static void bochs_user_framebuffer_destroy(struct drm_framebuffer *fb) | ||
| 464 | { | ||
| 465 | struct bochs_framebuffer *bochs_fb = to_bochs_framebuffer(fb); | ||
| 466 | |||
| 467 | drm_gem_object_unreference_unlocked(bochs_fb->obj); | ||
| 468 | drm_framebuffer_cleanup(fb); | ||
| 469 | kfree(fb); | ||
| 470 | } | ||
| 471 | |||
| 472 | static const struct drm_framebuffer_funcs bochs_fb_funcs = { | ||
| 473 | .destroy = bochs_user_framebuffer_destroy, | ||
| 474 | }; | ||
| 475 | |||
| 476 | int bochs_framebuffer_init(struct drm_device *dev, | ||
| 477 | struct bochs_framebuffer *gfb, | ||
| 478 | const struct drm_mode_fb_cmd2 *mode_cmd, | ||
| 479 | struct drm_gem_object *obj) | ||
| 480 | { | ||
| 481 | int ret; | ||
| 482 | |||
| 483 | drm_helper_mode_fill_fb_struct(dev, &gfb->base, mode_cmd); | ||
| 484 | gfb->obj = obj; | ||
| 485 | ret = drm_framebuffer_init(dev, &gfb->base, &bochs_fb_funcs); | ||
| 486 | if (ret) { | ||
| 487 | DRM_ERROR("drm_framebuffer_init failed: %d\n", ret); | ||
| 488 | return ret; | ||
| 489 | } | ||
| 490 | return 0; | ||
| 491 | } | ||
| 492 | |||
| 493 | static struct drm_framebuffer * | ||
| 494 | bochs_user_framebuffer_create(struct drm_device *dev, | ||
| 495 | struct drm_file *filp, | ||
| 496 | const struct drm_mode_fb_cmd2 *mode_cmd) | ||
| 497 | { | ||
| 498 | struct drm_gem_object *obj; | ||
| 499 | struct bochs_framebuffer *bochs_fb; | ||
| 500 | int ret; | ||
| 501 | |||
| 502 | DRM_DEBUG_DRIVER("%dx%d, format %c%c%c%c\n", | ||
| 503 | mode_cmd->width, mode_cmd->height, | ||
| 504 | (mode_cmd->pixel_format) & 0xff, | ||
| 505 | (mode_cmd->pixel_format >> 8) & 0xff, | ||
| 506 | (mode_cmd->pixel_format >> 16) & 0xff, | ||
| 507 | (mode_cmd->pixel_format >> 24) & 0xff); | ||
| 508 | |||
| 509 | if (mode_cmd->pixel_format != DRM_FORMAT_XRGB8888) | ||
| 510 | return ERR_PTR(-ENOENT); | ||
| 511 | |||
| 512 | obj = drm_gem_object_lookup(filp, mode_cmd->handles[0]); | ||
| 513 | if (obj == NULL) | ||
| 514 | return ERR_PTR(-ENOENT); | ||
| 515 | |||
| 516 | bochs_fb = kzalloc(sizeof(*bochs_fb), GFP_KERNEL); | ||
| 517 | if (!bochs_fb) { | ||
| 518 | drm_gem_object_unreference_unlocked(obj); | ||
| 519 | return ERR_PTR(-ENOMEM); | ||
| 520 | } | ||
| 521 | |||
| 522 | ret = bochs_framebuffer_init(dev, bochs_fb, mode_cmd, obj); | ||
| 523 | if (ret) { | ||
| 524 | drm_gem_object_unreference_unlocked(obj); | ||
| 525 | kfree(bochs_fb); | ||
| 526 | return ERR_PTR(ret); | ||
| 527 | } | ||
| 528 | return &bochs_fb->base; | ||
| 529 | } | ||
| 530 | |||
| 531 | const struct drm_mode_config_funcs bochs_mode_funcs = { | ||
| 532 | .fb_create = bochs_user_framebuffer_create, | ||
| 533 | }; | ||
