rockchip_drm_fb.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) Fuzhou 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_mode_fb_cmd2 *mode_cmd)
  28. {
  29. struct drm_afbc_framebuffer *afbc_fb;
  30. const struct drm_format_info *info;
  31. int ret;
  32. info = drm_get_format_info(dev, mode_cmd);
  33. if (!info)
  34. return ERR_PTR(-ENOMEM);
  35. afbc_fb = kzalloc(sizeof(*afbc_fb), GFP_KERNEL);
  36. if (!afbc_fb)
  37. return ERR_PTR(-ENOMEM);
  38. ret = drm_gem_fb_init_with_funcs(dev, &afbc_fb->base, file, mode_cmd,
  39. &rockchip_drm_fb_funcs);
  40. if (ret) {
  41. kfree(afbc_fb);
  42. return ERR_PTR(ret);
  43. }
  44. if (drm_is_afbc(mode_cmd->modifier[0])) {
  45. ret = drm_gem_fb_afbc_init(dev, mode_cmd, afbc_fb);
  46. if (ret) {
  47. drm_framebuffer_put(&afbc_fb->base);
  48. return ERR_PTR(ret);
  49. }
  50. }
  51. return &afbc_fb->base;
  52. }
  53. static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs = {
  54. .fb_create = rockchip_fb_create,
  55. .atomic_check = drm_atomic_helper_check,
  56. .atomic_commit = drm_atomic_helper_commit,
  57. };
  58. void rockchip_drm_mode_config_init(struct drm_device *dev)
  59. {
  60. dev->mode_config.min_width = 0;
  61. dev->mode_config.min_height = 0;
  62. /*
  63. * set max width and height as default value(4096x4096).
  64. * this value would be used to check framebuffer size limitation
  65. * at drm_mode_addfb().
  66. */
  67. dev->mode_config.max_width = 4096;
  68. dev->mode_config.max_height = 4096;
  69. dev->mode_config.funcs = &rockchip_drm_mode_config_funcs;
  70. dev->mode_config.helper_private = &rockchip_mode_config_helpers;
  71. dev->mode_config.normalize_zpos = true;
  72. }