rockchip_drm_fb.c 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) Rockchip Electronics Co., Ltd.
  4. * Author:Mark Yao <mark.yao@rock-chips.com>
  5. */
  6. #include <linux/kernel.h>
  7. #include <drm/drm.h>
  8. #include <drm/drm_atomic.h>
  9. #include <drm/drm_damage_helper.h>
  10. #include <drm/drm_fourcc.h>
  11. #include <drm/drm_framebuffer.h>
  12. #include <drm/drm_gem_framebuffer_helper.h>
  13. #include <drm/drm_probe_helper.h>
  14. #include "rockchip_drm_drv.h"
  15. #include "rockchip_drm_fb.h"
  16. #include "rockchip_drm_gem.h"
  17. static const struct drm_framebuffer_funcs rockchip_drm_fb_funcs = {
  18. .destroy = drm_gem_fb_destroy,
  19. .create_handle = drm_gem_fb_create_handle,
  20. .dirty = drm_atomic_helper_dirtyfb,
  21. };
  22. static const struct drm_mode_config_helper_funcs rockchip_mode_config_helpers = {
  23. .atomic_commit_tail = drm_atomic_helper_commit_tail_rpm,
  24. };
  25. static struct drm_framebuffer *
  26. rockchip_fb_create(struct drm_device *dev, struct drm_file *file,
  27. const struct drm_format_info *info,
  28. const struct drm_mode_fb_cmd2 *mode_cmd)
  29. {
  30. struct drm_afbc_framebuffer *afbc_fb;
  31. int ret;
  32. afbc_fb = kzalloc_obj(*afbc_fb);
  33. if (!afbc_fb)
  34. return ERR_PTR(-ENOMEM);
  35. ret = drm_gem_fb_init_with_funcs(dev, &afbc_fb->base,
  36. file, info, mode_cmd,
  37. &rockchip_drm_fb_funcs);
  38. if (ret) {
  39. kfree(afbc_fb);
  40. return ERR_PTR(ret);
  41. }
  42. if (drm_is_afbc(mode_cmd->modifier[0])) {
  43. ret = drm_gem_fb_afbc_init(dev, info, mode_cmd, afbc_fb);
  44. if (ret) {
  45. drm_framebuffer_put(&afbc_fb->base);
  46. return ERR_PTR(ret);
  47. }
  48. }
  49. return &afbc_fb->base;
  50. }
  51. static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs = {
  52. .fb_create = rockchip_fb_create,
  53. .atomic_check = drm_atomic_helper_check,
  54. .atomic_commit = drm_atomic_helper_commit,
  55. };
  56. void rockchip_drm_mode_config_init(struct drm_device *dev)
  57. {
  58. dev->mode_config.min_width = 0;
  59. dev->mode_config.min_height = 0;
  60. /*
  61. * set max width and height as default value(4096x4096).
  62. * this value would be used to check framebuffer size limitation
  63. * at drm_mode_addfb().
  64. */
  65. dev->mode_config.max_width = 4096;
  66. dev->mode_config.max_height = 4096;
  67. dev->mode_config.funcs = &rockchip_drm_mode_config_funcs;
  68. dev->mode_config.helper_private = &rockchip_mode_config_helpers;
  69. dev->mode_config.normalize_zpos = true;
  70. }