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