gud_internal.h 4.9 KB

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