sti_layer.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. /*
  2. * Copyright (C) STMicroelectronics SA 2014
  3. * Authors: Benjamin Gaignard <benjamin.gaignard@st.com>
  4. * Fabien Dessenne <fabien.dessenne@st.com>
  5. * for STMicroelectronics.
  6. * License terms: GNU General Public License (GPL), version 2
  7. */
  8. #include <drm/drmP.h>
  9. #include <drm/drm_gem_cma_helper.h>
  10. #include <drm/drm_fb_cma_helper.h>
  11. #include "sti_compositor.h"
  12. #include "sti_cursor.h"
  13. #include "sti_gdp.h"
  14. #include "sti_hqvdp.h"
  15. #include "sti_layer.h"
  16. #include "sti_vid.h"
  17. const char *sti_layer_to_str(struct sti_layer *layer)
  18. {
  19. switch (layer->desc) {
  20. case STI_GDP_0:
  21. return "GDP0";
  22. case STI_GDP_1:
  23. return "GDP1";
  24. case STI_GDP_2:
  25. return "GDP2";
  26. case STI_GDP_3:
  27. return "GDP3";
  28. case STI_VID_0:
  29. return "VID0";
  30. case STI_VID_1:
  31. return "VID1";
  32. case STI_CURSOR:
  33. return "CURSOR";
  34. case STI_HQVDP_0:
  35. return "HQVDP0";
  36. default:
  37. return "<UNKNOWN LAYER>";
  38. }
  39. }
  40. EXPORT_SYMBOL(sti_layer_to_str);
  41. struct sti_layer *sti_layer_create(struct device *dev, int desc,
  42. void __iomem *baseaddr)
  43. {
  44. struct sti_layer *layer = NULL;
  45. switch (desc & STI_LAYER_TYPE_MASK) {
  46. case STI_GDP:
  47. layer = sti_gdp_create(dev, desc);
  48. break;
  49. case STI_VID:
  50. layer = sti_vid_create(dev);
  51. break;
  52. case STI_CUR:
  53. layer = sti_cursor_create(dev);
  54. break;
  55. case STI_VDP:
  56. layer = sti_hqvdp_create(dev);
  57. break;
  58. }
  59. if (!layer) {
  60. DRM_ERROR("Failed to create layer\n");
  61. return NULL;
  62. }
  63. layer->desc = desc;
  64. layer->dev = dev;
  65. layer->regs = baseaddr;
  66. layer->ops->init(layer);
  67. DRM_DEBUG_DRIVER("%s created\n", sti_layer_to_str(layer));
  68. return layer;
  69. }
  70. EXPORT_SYMBOL(sti_layer_create);
  71. int sti_layer_prepare(struct sti_layer *layer,
  72. struct drm_crtc *crtc,
  73. struct drm_framebuffer *fb,
  74. struct drm_display_mode *mode, int mixer_id,
  75. int dest_x, int dest_y, int dest_w, int dest_h,
  76. int src_x, int src_y, int src_w, int src_h)
  77. {
  78. int ret;
  79. unsigned int i;
  80. struct drm_gem_cma_object *cma_obj;
  81. if (!layer || !fb || !mode) {
  82. DRM_ERROR("Null fb, layer or mode\n");
  83. return 1;
  84. }
  85. cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
  86. if (!cma_obj) {
  87. DRM_ERROR("Can't get CMA GEM object for fb\n");
  88. return 1;
  89. }
  90. layer->crtc = crtc;
  91. layer->fb = fb;
  92. layer->mode = mode;
  93. layer->mixer_id = mixer_id;
  94. layer->dst_x = dest_x;
  95. layer->dst_y = dest_y;
  96. layer->dst_w = clamp_val(dest_w, 0, mode->crtc_hdisplay - dest_x);
  97. layer->dst_h = clamp_val(dest_h, 0, mode->crtc_vdisplay - dest_y);
  98. layer->src_x = src_x;
  99. layer->src_y = src_y;
  100. layer->src_w = src_w;
  101. layer->src_h = src_h;
  102. layer->format = fb->pixel_format;
  103. layer->vaddr = cma_obj->vaddr;
  104. layer->paddr = cma_obj->paddr;
  105. for (i = 0; i < 4; i++) {
  106. layer->pitches[i] = fb->pitches[i];
  107. layer->offsets[i] = fb->offsets[i];
  108. }
  109. DRM_DEBUG_DRIVER("%s is associated with mixer_id %d\n",
  110. sti_layer_to_str(layer),
  111. layer->mixer_id);
  112. DRM_DEBUG_DRIVER("%s dst=(%dx%d)@(%d,%d) - src=(%dx%d)@(%d,%d)\n",
  113. sti_layer_to_str(layer),
  114. layer->dst_w, layer->dst_h, layer->dst_x, layer->dst_y,
  115. layer->src_w, layer->src_h, layer->src_x,
  116. layer->src_y);
  117. DRM_DEBUG_DRIVER("drm FB:%d format:%.4s phys@:0x%lx\n", fb->base.id,
  118. (char *)&layer->format, (unsigned long)layer->paddr);
  119. if (!layer->ops->prepare)
  120. goto err_no_prepare;
  121. ret = layer->ops->prepare(layer, !layer->enabled);
  122. if (!ret)
  123. layer->enabled = true;
  124. return ret;
  125. err_no_prepare:
  126. DRM_ERROR("Cannot prepare\n");
  127. return 1;
  128. }
  129. int sti_layer_commit(struct sti_layer *layer)
  130. {
  131. if (!layer)
  132. return 1;
  133. if (!layer->ops->commit)
  134. goto err_no_commit;
  135. return layer->ops->commit(layer);
  136. err_no_commit:
  137. DRM_ERROR("Cannot commit\n");
  138. return 1;
  139. }
  140. int sti_layer_disable(struct sti_layer *layer)
  141. {
  142. int ret;
  143. DRM_DEBUG_DRIVER("%s\n", sti_layer_to_str(layer));
  144. if (!layer)
  145. return 1;
  146. if (!layer->enabled)
  147. return 0;
  148. if (!layer->ops->disable)
  149. goto err_no_disable;
  150. ret = layer->ops->disable(layer);
  151. if (!ret)
  152. layer->enabled = false;
  153. else
  154. DRM_ERROR("Disable failed\n");
  155. return ret;
  156. err_no_disable:
  157. DRM_ERROR("Cannot disable\n");
  158. return 1;
  159. }
  160. const uint32_t *sti_layer_get_formats(struct sti_layer *layer)
  161. {
  162. if (!layer)
  163. return NULL;
  164. if (!layer->ops->get_formats)
  165. return NULL;
  166. return layer->ops->get_formats(layer);
  167. }
  168. unsigned int sti_layer_get_nb_formats(struct sti_layer *layer)
  169. {
  170. if (!layer)
  171. return 0;
  172. if (!layer->ops->get_nb_formats)
  173. return 0;
  174. return layer->ops->get_nb_formats(layer);
  175. }