framebuffer.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /**************************************************************************
  3. * Copyright (c) 2007-2011, Intel Corporation.
  4. * All Rights Reserved.
  5. *
  6. **************************************************************************/
  7. #include <drm/drm_framebuffer.h>
  8. #include <drm/drm_gem_framebuffer_helper.h>
  9. #include <drm/drm_modeset_helper.h>
  10. #include "framebuffer.h"
  11. #include "psb_drv.h"
  12. static const struct drm_framebuffer_funcs psb_fb_funcs = {
  13. .destroy = drm_gem_fb_destroy,
  14. .create_handle = drm_gem_fb_create_handle,
  15. };
  16. /**
  17. * psb_framebuffer_init - initialize a framebuffer
  18. * @dev: our DRM device
  19. * @fb: framebuffer to set up
  20. * @mode_cmd: mode description
  21. * @obj: backing object
  22. *
  23. * Configure and fill in the boilerplate for our frame buffer. Return
  24. * 0 on success or an error code if we fail.
  25. */
  26. static int psb_framebuffer_init(struct drm_device *dev,
  27. struct drm_framebuffer *fb,
  28. const struct drm_format_info *info,
  29. const struct drm_mode_fb_cmd2 *mode_cmd,
  30. struct drm_gem_object *obj)
  31. {
  32. int ret;
  33. /*
  34. * Reject unknown formats, YUV formats, and formats with more than
  35. * 4 bytes per pixel.
  36. */
  37. if (!info->depth || info->cpp[0] > 4)
  38. return -EINVAL;
  39. if (mode_cmd->pitches[0] & 63)
  40. return -EINVAL;
  41. drm_helper_mode_fill_fb_struct(dev, fb, info, mode_cmd);
  42. fb->obj[0] = obj;
  43. ret = drm_framebuffer_init(dev, fb, &psb_fb_funcs);
  44. if (ret) {
  45. dev_err(dev->dev, "framebuffer init failed: %d\n", ret);
  46. return ret;
  47. }
  48. return 0;
  49. }
  50. /**
  51. * psb_framebuffer_create - create a framebuffer backed by gt
  52. * @dev: our DRM device
  53. * @info: pixel format information
  54. * @mode_cmd: the description of the requested mode
  55. * @obj: the backing object
  56. *
  57. * Create a framebuffer object backed by the gt, and fill in the
  58. * boilerplate required
  59. *
  60. * TODO: review object references
  61. */
  62. struct drm_framebuffer *psb_framebuffer_create(struct drm_device *dev,
  63. const struct drm_format_info *info,
  64. const struct drm_mode_fb_cmd2 *mode_cmd,
  65. struct drm_gem_object *obj)
  66. {
  67. struct drm_framebuffer *fb;
  68. int ret;
  69. fb = kzalloc_obj(*fb);
  70. if (!fb)
  71. return ERR_PTR(-ENOMEM);
  72. ret = psb_framebuffer_init(dev, fb, info, mode_cmd, obj);
  73. if (ret) {
  74. kfree(fb);
  75. return ERR_PTR(ret);
  76. }
  77. return fb;
  78. }
  79. /**
  80. * psb_user_framebuffer_create - create framebuffer
  81. * @dev: our DRM device
  82. * @filp: client file
  83. * @cmd: mode request
  84. *
  85. * Create a new framebuffer backed by a userspace GEM object
  86. */
  87. static struct drm_framebuffer *psb_user_framebuffer_create
  88. (struct drm_device *dev, struct drm_file *filp,
  89. const struct drm_format_info *info,
  90. const struct drm_mode_fb_cmd2 *cmd)
  91. {
  92. struct drm_gem_object *obj;
  93. struct drm_framebuffer *fb;
  94. /*
  95. * Find the GEM object and thus the gtt range object that is
  96. * to back this space
  97. */
  98. obj = drm_gem_object_lookup(filp, cmd->handles[0]);
  99. if (obj == NULL)
  100. return ERR_PTR(-ENOENT);
  101. /* Let the core code do all the work */
  102. fb = psb_framebuffer_create(dev, info, cmd, obj);
  103. if (IS_ERR(fb))
  104. drm_gem_object_put(obj);
  105. return fb;
  106. }
  107. static const struct drm_mode_config_funcs psb_mode_funcs = {
  108. .fb_create = psb_user_framebuffer_create,
  109. };
  110. static void psb_setup_outputs(struct drm_device *dev)
  111. {
  112. struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
  113. struct drm_connector_list_iter conn_iter;
  114. struct drm_connector *connector;
  115. drm_mode_create_scaling_mode_property(dev);
  116. /* It is ok for this to fail - we just don't get backlight control */
  117. if (!dev_priv->backlight_property)
  118. dev_priv->backlight_property = drm_property_create_range(dev, 0,
  119. "backlight", 0, 100);
  120. dev_priv->ops->output_init(dev);
  121. drm_connector_list_iter_begin(dev, &conn_iter);
  122. drm_for_each_connector_iter(connector, &conn_iter) {
  123. struct gma_encoder *gma_encoder = gma_attached_encoder(connector);
  124. struct drm_encoder *encoder = &gma_encoder->base;
  125. int crtc_mask = 0, clone_mask = 0;
  126. /* valid crtcs */
  127. switch (gma_encoder->type) {
  128. case INTEL_OUTPUT_ANALOG:
  129. crtc_mask = (1 << 0);
  130. clone_mask = (1 << INTEL_OUTPUT_ANALOG);
  131. break;
  132. case INTEL_OUTPUT_SDVO:
  133. crtc_mask = dev_priv->ops->sdvo_mask;
  134. clone_mask = 0;
  135. break;
  136. case INTEL_OUTPUT_LVDS:
  137. crtc_mask = dev_priv->ops->lvds_mask;
  138. clone_mask = 0;
  139. break;
  140. case INTEL_OUTPUT_MIPI:
  141. crtc_mask = (1 << 0);
  142. clone_mask = 0;
  143. break;
  144. case INTEL_OUTPUT_MIPI2:
  145. crtc_mask = (1 << 2);
  146. clone_mask = 0;
  147. break;
  148. case INTEL_OUTPUT_HDMI:
  149. crtc_mask = dev_priv->ops->hdmi_mask;
  150. clone_mask = (1 << INTEL_OUTPUT_HDMI);
  151. break;
  152. case INTEL_OUTPUT_DISPLAYPORT:
  153. crtc_mask = (1 << 0) | (1 << 1);
  154. clone_mask = 0;
  155. break;
  156. case INTEL_OUTPUT_EDP:
  157. crtc_mask = (1 << 1);
  158. clone_mask = 0;
  159. }
  160. encoder->possible_crtcs = crtc_mask;
  161. encoder->possible_clones =
  162. gma_connector_clones(dev, clone_mask);
  163. }
  164. drm_connector_list_iter_end(&conn_iter);
  165. }
  166. void psb_modeset_init(struct drm_device *dev)
  167. {
  168. struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
  169. struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
  170. int i;
  171. if (drmm_mode_config_init(dev))
  172. return;
  173. dev->mode_config.min_width = 0;
  174. dev->mode_config.min_height = 0;
  175. dev->mode_config.funcs = &psb_mode_funcs;
  176. /* num pipes is 2 for PSB but 1 for Mrst */
  177. for (i = 0; i < dev_priv->num_pipe; i++)
  178. psb_intel_crtc_init(dev, i, mode_dev);
  179. dev->mode_config.max_width = 4096;
  180. dev->mode_config.max_height = 4096;
  181. psb_setup_outputs(dev);
  182. if (dev_priv->ops->errata)
  183. dev_priv->ops->errata(dev);
  184. dev_priv->modeset = true;
  185. }
  186. void psb_modeset_cleanup(struct drm_device *dev)
  187. {
  188. struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
  189. if (dev_priv->modeset) {
  190. drm_kms_helper_poll_fini(dev);
  191. }
  192. }