framebuffer.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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_mode_fb_cmd2 *mode_cmd,
  29. struct drm_gem_object *obj)
  30. {
  31. const struct drm_format_info *info;
  32. int ret;
  33. /*
  34. * Reject unknown formats, YUV formats, and formats with more than
  35. * 4 bytes per pixel.
  36. */
  37. info = drm_get_format_info(dev, mode_cmd);
  38. if (!info || !info->depth || info->cpp[0] > 4)
  39. return -EINVAL;
  40. if (mode_cmd->pitches[0] & 63)
  41. return -EINVAL;
  42. drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
  43. fb->obj[0] = obj;
  44. ret = drm_framebuffer_init(dev, fb, &psb_fb_funcs);
  45. if (ret) {
  46. dev_err(dev->dev, "framebuffer init failed: %d\n", ret);
  47. return ret;
  48. }
  49. return 0;
  50. }
  51. /**
  52. * psb_framebuffer_create - create a framebuffer backed by gt
  53. * @dev: our DRM device
  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_mode_fb_cmd2 *mode_cmd,
  64. struct drm_gem_object *obj)
  65. {
  66. struct drm_framebuffer *fb;
  67. int ret;
  68. fb = kzalloc(sizeof(*fb), GFP_KERNEL);
  69. if (!fb)
  70. return ERR_PTR(-ENOMEM);
  71. ret = psb_framebuffer_init(dev, fb, mode_cmd, obj);
  72. if (ret) {
  73. kfree(fb);
  74. return ERR_PTR(ret);
  75. }
  76. return fb;
  77. }
  78. /**
  79. * psb_user_framebuffer_create - create framebuffer
  80. * @dev: our DRM device
  81. * @filp: client file
  82. * @cmd: mode request
  83. *
  84. * Create a new framebuffer backed by a userspace GEM object
  85. */
  86. static struct drm_framebuffer *psb_user_framebuffer_create
  87. (struct drm_device *dev, struct drm_file *filp,
  88. const struct drm_mode_fb_cmd2 *cmd)
  89. {
  90. struct drm_gem_object *obj;
  91. struct drm_framebuffer *fb;
  92. /*
  93. * Find the GEM object and thus the gtt range object that is
  94. * to back this space
  95. */
  96. obj = drm_gem_object_lookup(filp, cmd->handles[0]);
  97. if (obj == NULL)
  98. return ERR_PTR(-ENOENT);
  99. /* Let the core code do all the work */
  100. fb = psb_framebuffer_create(dev, cmd, obj);
  101. if (IS_ERR(fb))
  102. drm_gem_object_put(obj);
  103. return fb;
  104. }
  105. static const struct drm_mode_config_funcs psb_mode_funcs = {
  106. .fb_create = psb_user_framebuffer_create,
  107. };
  108. static void psb_setup_outputs(struct drm_device *dev)
  109. {
  110. struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
  111. struct drm_connector_list_iter conn_iter;
  112. struct drm_connector *connector;
  113. drm_mode_create_scaling_mode_property(dev);
  114. /* It is ok for this to fail - we just don't get backlight control */
  115. if (!dev_priv->backlight_property)
  116. dev_priv->backlight_property = drm_property_create_range(dev, 0,
  117. "backlight", 0, 100);
  118. dev_priv->ops->output_init(dev);
  119. drm_connector_list_iter_begin(dev, &conn_iter);
  120. drm_for_each_connector_iter(connector, &conn_iter) {
  121. struct gma_encoder *gma_encoder = gma_attached_encoder(connector);
  122. struct drm_encoder *encoder = &gma_encoder->base;
  123. int crtc_mask = 0, clone_mask = 0;
  124. /* valid crtcs */
  125. switch (gma_encoder->type) {
  126. case INTEL_OUTPUT_ANALOG:
  127. crtc_mask = (1 << 0);
  128. clone_mask = (1 << INTEL_OUTPUT_ANALOG);
  129. break;
  130. case INTEL_OUTPUT_SDVO:
  131. crtc_mask = dev_priv->ops->sdvo_mask;
  132. clone_mask = 0;
  133. break;
  134. case INTEL_OUTPUT_LVDS:
  135. crtc_mask = dev_priv->ops->lvds_mask;
  136. clone_mask = 0;
  137. break;
  138. case INTEL_OUTPUT_MIPI:
  139. crtc_mask = (1 << 0);
  140. clone_mask = 0;
  141. break;
  142. case INTEL_OUTPUT_MIPI2:
  143. crtc_mask = (1 << 2);
  144. clone_mask = 0;
  145. break;
  146. case INTEL_OUTPUT_HDMI:
  147. crtc_mask = dev_priv->ops->hdmi_mask;
  148. clone_mask = (1 << INTEL_OUTPUT_HDMI);
  149. break;
  150. case INTEL_OUTPUT_DISPLAYPORT:
  151. crtc_mask = (1 << 0) | (1 << 1);
  152. clone_mask = 0;
  153. break;
  154. case INTEL_OUTPUT_EDP:
  155. crtc_mask = (1 << 1);
  156. clone_mask = 0;
  157. }
  158. encoder->possible_crtcs = crtc_mask;
  159. encoder->possible_clones =
  160. gma_connector_clones(dev, clone_mask);
  161. }
  162. drm_connector_list_iter_end(&conn_iter);
  163. }
  164. void psb_modeset_init(struct drm_device *dev)
  165. {
  166. struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
  167. struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
  168. int i;
  169. if (drmm_mode_config_init(dev))
  170. return;
  171. dev->mode_config.min_width = 0;
  172. dev->mode_config.min_height = 0;
  173. dev->mode_config.funcs = &psb_mode_funcs;
  174. /* num pipes is 2 for PSB but 1 for Mrst */
  175. for (i = 0; i < dev_priv->num_pipe; i++)
  176. psb_intel_crtc_init(dev, i, mode_dev);
  177. dev->mode_config.max_width = 4096;
  178. dev->mode_config.max_height = 4096;
  179. psb_setup_outputs(dev);
  180. if (dev_priv->ops->errata)
  181. dev_priv->ops->errata(dev);
  182. dev_priv->modeset = true;
  183. }
  184. void psb_modeset_cleanup(struct drm_device *dev)
  185. {
  186. struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
  187. if (dev_priv->modeset) {
  188. drm_kms_helper_poll_fini(dev);
  189. }
  190. }