gud_internal.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /* SPDX-License-Identifier: MIT */
  2. #ifndef __LINUX_GUD_INTERNAL_H
  3. #define __LINUX_GUD_INTERNAL_H
  4. #include <linux/list.h>
  5. #include <linux/mutex.h>
  6. #include <linux/scatterlist.h>
  7. #include <linux/usb.h>
  8. #include <linux/workqueue.h>
  9. #include <uapi/drm/drm_fourcc.h>
  10. #include <drm/drm_modes.h>
  11. #include <drm/drm_simple_kms_helper.h>
  12. struct gud_device {
  13. struct drm_device drm;
  14. struct drm_simple_display_pipe pipe;
  15. struct device *dmadev;
  16. struct work_struct work;
  17. u32 flags;
  18. const struct drm_format_info *xrgb8888_emulation_format;
  19. u16 *properties;
  20. unsigned int num_properties;
  21. unsigned int bulk_pipe;
  22. void *bulk_buf;
  23. size_t bulk_len;
  24. struct sg_table bulk_sgt;
  25. u8 compression;
  26. void *lz4_comp_mem;
  27. void *compress_buf;
  28. u64 stats_length;
  29. u64 stats_actual_length;
  30. unsigned int stats_num_errors;
  31. struct mutex ctrl_lock; /* Serialize get/set and status transfers */
  32. struct mutex damage_lock; /* Protects the following members: */
  33. struct drm_framebuffer *fb;
  34. struct drm_rect damage;
  35. bool prev_flush_failed;
  36. void *shadow_buf;
  37. };
  38. static inline struct gud_device *to_gud_device(struct drm_device *drm)
  39. {
  40. return container_of(drm, struct gud_device, drm);
  41. }
  42. static inline struct usb_device *gud_to_usb_device(struct gud_device *gdrm)
  43. {
  44. return interface_to_usbdev(to_usb_interface(gdrm->drm.dev));
  45. }
  46. int gud_usb_get(struct gud_device *gdrm, u8 request, u16 index, void *buf, size_t len);
  47. int gud_usb_set(struct gud_device *gdrm, u8 request, u16 index, void *buf, size_t len);
  48. int gud_usb_get_u8(struct gud_device *gdrm, u8 request, u16 index, u8 *val);
  49. int gud_usb_set_u8(struct gud_device *gdrm, u8 request, u8 val);
  50. void gud_clear_damage(struct gud_device *gdrm);
  51. void gud_flush_work(struct work_struct *work);
  52. int gud_pipe_check(struct drm_simple_display_pipe *pipe,
  53. struct drm_plane_state *new_plane_state,
  54. struct drm_crtc_state *new_crtc_state);
  55. void gud_pipe_update(struct drm_simple_display_pipe *pipe,
  56. struct drm_plane_state *old_state);
  57. int gud_connector_fill_properties(struct drm_connector_state *connector_state,
  58. struct gud_property_req *properties);
  59. int gud_get_connectors(struct gud_device *gdrm);
  60. /* Driver internal fourcc transfer formats */
  61. #define GUD_DRM_FORMAT_R1 0x00000122
  62. #define GUD_DRM_FORMAT_XRGB1111 0x03121722
  63. static inline u8 gud_from_fourcc(u32 fourcc)
  64. {
  65. switch (fourcc) {
  66. case GUD_DRM_FORMAT_R1:
  67. return GUD_PIXEL_FORMAT_R1;
  68. case DRM_FORMAT_R8:
  69. return GUD_PIXEL_FORMAT_R8;
  70. case GUD_DRM_FORMAT_XRGB1111:
  71. return GUD_PIXEL_FORMAT_XRGB1111;
  72. case DRM_FORMAT_RGB332:
  73. return GUD_PIXEL_FORMAT_RGB332;
  74. case DRM_FORMAT_RGB565:
  75. return GUD_PIXEL_FORMAT_RGB565;
  76. case DRM_FORMAT_RGB888:
  77. return GUD_PIXEL_FORMAT_RGB888;
  78. case DRM_FORMAT_XRGB8888:
  79. return GUD_PIXEL_FORMAT_XRGB8888;
  80. case DRM_FORMAT_ARGB8888:
  81. return GUD_PIXEL_FORMAT_ARGB8888;
  82. }
  83. return 0;
  84. }
  85. static inline u32 gud_to_fourcc(u8 format)
  86. {
  87. switch (format) {
  88. case GUD_PIXEL_FORMAT_R1:
  89. return GUD_DRM_FORMAT_R1;
  90. case GUD_PIXEL_FORMAT_R8:
  91. return DRM_FORMAT_R8;
  92. case GUD_PIXEL_FORMAT_XRGB1111:
  93. return GUD_DRM_FORMAT_XRGB1111;
  94. case GUD_PIXEL_FORMAT_RGB332:
  95. return DRM_FORMAT_RGB332;
  96. case GUD_PIXEL_FORMAT_RGB565:
  97. return DRM_FORMAT_RGB565;
  98. case GUD_PIXEL_FORMAT_RGB888:
  99. return DRM_FORMAT_RGB888;
  100. case GUD_PIXEL_FORMAT_XRGB8888:
  101. return DRM_FORMAT_XRGB8888;
  102. case GUD_PIXEL_FORMAT_ARGB8888:
  103. return DRM_FORMAT_ARGB8888;
  104. }
  105. return 0;
  106. }
  107. static inline void gud_from_display_mode(struct gud_display_mode_req *dst,
  108. const struct drm_display_mode *src)
  109. {
  110. u32 flags = src->flags & GUD_DISPLAY_MODE_FLAG_USER_MASK;
  111. if (src->type & DRM_MODE_TYPE_PREFERRED)
  112. flags |= GUD_DISPLAY_MODE_FLAG_PREFERRED;
  113. dst->clock = cpu_to_le32(src->clock);
  114. dst->hdisplay = cpu_to_le16(src->hdisplay);
  115. dst->hsync_start = cpu_to_le16(src->hsync_start);
  116. dst->hsync_end = cpu_to_le16(src->hsync_end);
  117. dst->htotal = cpu_to_le16(src->htotal);
  118. dst->vdisplay = cpu_to_le16(src->vdisplay);
  119. dst->vsync_start = cpu_to_le16(src->vsync_start);
  120. dst->vsync_end = cpu_to_le16(src->vsync_end);
  121. dst->vtotal = cpu_to_le16(src->vtotal);
  122. dst->flags = cpu_to_le32(flags);
  123. }
  124. static inline void gud_to_display_mode(struct drm_display_mode *dst,
  125. const struct gud_display_mode_req *src)
  126. {
  127. u32 flags = le32_to_cpu(src->flags);
  128. memset(dst, 0, sizeof(*dst));
  129. dst->clock = le32_to_cpu(src->clock);
  130. dst->hdisplay = le16_to_cpu(src->hdisplay);
  131. dst->hsync_start = le16_to_cpu(src->hsync_start);
  132. dst->hsync_end = le16_to_cpu(src->hsync_end);
  133. dst->htotal = le16_to_cpu(src->htotal);
  134. dst->vdisplay = le16_to_cpu(src->vdisplay);
  135. dst->vsync_start = le16_to_cpu(src->vsync_start);
  136. dst->vsync_end = le16_to_cpu(src->vsync_end);
  137. dst->vtotal = le16_to_cpu(src->vtotal);
  138. dst->flags = flags & GUD_DISPLAY_MODE_FLAG_USER_MASK;
  139. dst->type = DRM_MODE_TYPE_DRIVER;
  140. if (flags & GUD_DISPLAY_MODE_FLAG_PREFERRED)
  141. dst->type |= DRM_MODE_TYPE_PREFERRED;
  142. drm_mode_set_name(dst);
  143. }
  144. #endif