gud_internal.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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. };
  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. int gud_pipe_check(struct drm_simple_display_pipe *pipe,
  52. struct drm_plane_state *new_plane_state,
  53. struct drm_crtc_state *new_crtc_state);
  54. void gud_pipe_update(struct drm_simple_display_pipe *pipe,
  55. struct drm_plane_state *old_state);
  56. int gud_connector_fill_properties(struct drm_connector_state *connector_state,
  57. struct gud_property_req *properties);
  58. int gud_get_connectors(struct gud_device *gdrm);
  59. /* Driver internal fourcc transfer formats */
  60. #define GUD_DRM_FORMAT_R1 0x00000122
  61. #define GUD_DRM_FORMAT_XRGB1111 0x03121722
  62. static inline u8 gud_from_fourcc(u32 fourcc)
  63. {
  64. switch (fourcc) {
  65. case GUD_DRM_FORMAT_R1:
  66. return GUD_PIXEL_FORMAT_R1;
  67. case DRM_FORMAT_R8:
  68. return GUD_PIXEL_FORMAT_R8;
  69. case GUD_DRM_FORMAT_XRGB1111:
  70. return GUD_PIXEL_FORMAT_XRGB1111;
  71. case DRM_FORMAT_RGB332:
  72. return GUD_PIXEL_FORMAT_RGB332;
  73. case DRM_FORMAT_RGB565:
  74. return GUD_PIXEL_FORMAT_RGB565;
  75. case DRM_FORMAT_RGB888:
  76. return GUD_PIXEL_FORMAT_RGB888;
  77. case DRM_FORMAT_XRGB8888:
  78. return GUD_PIXEL_FORMAT_XRGB8888;
  79. case DRM_FORMAT_ARGB8888:
  80. return GUD_PIXEL_FORMAT_ARGB8888;
  81. }
  82. return 0;
  83. }
  84. static inline u32 gud_to_fourcc(u8 format)
  85. {
  86. switch (format) {
  87. case GUD_PIXEL_FORMAT_R1:
  88. return GUD_DRM_FORMAT_R1;
  89. case GUD_PIXEL_FORMAT_R8:
  90. return DRM_FORMAT_R8;
  91. case GUD_PIXEL_FORMAT_XRGB1111:
  92. return GUD_DRM_FORMAT_XRGB1111;
  93. case GUD_PIXEL_FORMAT_RGB332:
  94. return DRM_FORMAT_RGB332;
  95. case GUD_PIXEL_FORMAT_RGB565:
  96. return DRM_FORMAT_RGB565;
  97. case GUD_PIXEL_FORMAT_RGB888:
  98. return DRM_FORMAT_RGB888;
  99. case GUD_PIXEL_FORMAT_XRGB8888:
  100. return DRM_FORMAT_XRGB8888;
  101. case GUD_PIXEL_FORMAT_ARGB8888:
  102. return DRM_FORMAT_ARGB8888;
  103. }
  104. return 0;
  105. }
  106. static inline void gud_from_display_mode(struct gud_display_mode_req *dst,
  107. const struct drm_display_mode *src)
  108. {
  109. u32 flags = src->flags & GUD_DISPLAY_MODE_FLAG_USER_MASK;
  110. if (src->type & DRM_MODE_TYPE_PREFERRED)
  111. flags |= GUD_DISPLAY_MODE_FLAG_PREFERRED;
  112. dst->clock = cpu_to_le32(src->clock);
  113. dst->hdisplay = cpu_to_le16(src->hdisplay);
  114. dst->hsync_start = cpu_to_le16(src->hsync_start);
  115. dst->hsync_end = cpu_to_le16(src->hsync_end);
  116. dst->htotal = cpu_to_le16(src->htotal);
  117. dst->vdisplay = cpu_to_le16(src->vdisplay);
  118. dst->vsync_start = cpu_to_le16(src->vsync_start);
  119. dst->vsync_end = cpu_to_le16(src->vsync_end);
  120. dst->vtotal = cpu_to_le16(src->vtotal);
  121. dst->flags = cpu_to_le32(flags);
  122. }
  123. static inline void gud_to_display_mode(struct drm_display_mode *dst,
  124. const struct gud_display_mode_req *src)
  125. {
  126. u32 flags = le32_to_cpu(src->flags);
  127. memset(dst, 0, sizeof(*dst));
  128. dst->clock = le32_to_cpu(src->clock);
  129. dst->hdisplay = le16_to_cpu(src->hdisplay);
  130. dst->hsync_start = le16_to_cpu(src->hsync_start);
  131. dst->hsync_end = le16_to_cpu(src->hsync_end);
  132. dst->htotal = le16_to_cpu(src->htotal);
  133. dst->vdisplay = le16_to_cpu(src->vdisplay);
  134. dst->vsync_start = le16_to_cpu(src->vsync_start);
  135. dst->vsync_end = le16_to_cpu(src->vsync_end);
  136. dst->vtotal = le16_to_cpu(src->vtotal);
  137. dst->flags = flags & GUD_DISPLAY_MODE_FLAG_USER_MASK;
  138. dst->type = DRM_MODE_TYPE_DRIVER;
  139. if (flags & GUD_DISPLAY_MODE_FLAG_PREFERRED)
  140. dst->type |= DRM_MODE_TYPE_PREFERRED;
  141. drm_mode_set_name(dst);
  142. }
  143. #endif