1
2
3
4
5
6
7
8#ifndef __MSM_KMS_H__
9#define __MSM_KMS_H__
10
11#include <linux/clk.h>
12#include <linux/regulator/consumer.h>
13
14#include "msm_drv.h"
15
16#define MAX_PLANE 4
17
18
19
20
21
22
23struct msm_kms_funcs {
24
25 int (*hw_init)(struct msm_kms *kms);
26
27 void (*irq_preinstall)(struct msm_kms *kms);
28 int (*irq_postinstall)(struct msm_kms *kms);
29 void (*irq_uninstall)(struct msm_kms *kms);
30 irqreturn_t (*irq)(struct msm_kms *kms);
31 int (*enable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc);
32 void (*disable_vblank)(struct msm_kms *kms, struct drm_crtc *crtc);
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 void (*enable_commit)(struct msm_kms *kms);
60 void (*disable_commit)(struct msm_kms *kms);
61
62
63
64
65
66
67
68 ktime_t (*vsync_time)(struct msm_kms *kms, struct drm_crtc *crtc);
69
70
71
72
73
74 void (*prepare_commit)(struct msm_kms *kms, struct drm_atomic_state *state);
75
76
77
78
79
80
81 void (*flush_commit)(struct msm_kms *kms, unsigned crtc_mask);
82
83
84
85
86
87
88
89
90 void (*wait_flush)(struct msm_kms *kms, unsigned crtc_mask);
91
92
93
94
95
96
97 void (*complete_commit)(struct msm_kms *kms, unsigned crtc_mask);
98
99
100
101
102
103
104 const struct msm_format *(*get_format)(struct msm_kms *kms,
105 const uint32_t format,
106 const uint64_t modifiers);
107
108 int (*check_modified_format)(const struct msm_kms *kms,
109 const struct msm_format *msm_fmt,
110 const struct drm_mode_fb_cmd2 *cmd,
111 struct drm_gem_object **bos);
112
113
114 long (*round_pixclk)(struct msm_kms *kms, unsigned long rate,
115 struct drm_encoder *encoder);
116 int (*set_split_display)(struct msm_kms *kms,
117 struct drm_encoder *encoder,
118 struct drm_encoder *slave_encoder,
119 bool is_cmd_mode);
120 void (*set_encoder_mode)(struct msm_kms *kms,
121 struct drm_encoder *encoder,
122 bool cmd_mode);
123
124 void (*destroy)(struct msm_kms *kms);
125#ifdef CONFIG_DEBUG_FS
126
127 int (*debugfs_init)(struct msm_kms *kms, struct drm_minor *minor);
128#endif
129};
130
131struct msm_kms;
132
133
134
135
136
137struct msm_pending_timer {
138 struct hrtimer timer;
139 struct kthread_work work;
140 struct kthread_worker *worker;
141 struct msm_kms *kms;
142 unsigned crtc_idx;
143};
144
145struct msm_kms {
146 const struct msm_kms_funcs *funcs;
147 struct drm_device *dev;
148
149
150 int irq;
151
152
153 struct msm_gem_address_space *aspace;
154
155
156
157
158
159 struct mutex commit_lock[MAX_CRTCS];
160 unsigned pending_crtc_mask;
161 struct msm_pending_timer pending_timers[MAX_CRTCS];
162};
163
164static inline int msm_kms_init(struct msm_kms *kms,
165 const struct msm_kms_funcs *funcs)
166{
167 unsigned i, ret;
168
169 for (i = 0; i < ARRAY_SIZE(kms->commit_lock); i++)
170 mutex_init(&kms->commit_lock[i]);
171
172 kms->funcs = funcs;
173
174 for (i = 0; i < ARRAY_SIZE(kms->pending_timers); i++) {
175 ret = msm_atomic_init_pending_timer(&kms->pending_timers[i], kms, i);
176 if (ret) {
177 return ret;
178 }
179 }
180
181 return 0;
182}
183
184static inline void msm_kms_destroy(struct msm_kms *kms)
185{
186 unsigned i;
187
188 for (i = 0; i < ARRAY_SIZE(kms->pending_timers); i++)
189 msm_atomic_destroy_pending_timer(&kms->pending_timers[i]);
190}
191
192struct msm_kms *mdp4_kms_init(struct drm_device *dev);
193struct msm_kms *mdp5_kms_init(struct drm_device *dev);
194struct msm_kms *dpu_kms_init(struct drm_device *dev);
195
196struct msm_mdss_funcs {
197 int (*enable)(struct msm_mdss *mdss);
198 int (*disable)(struct msm_mdss *mdss);
199 void (*destroy)(struct drm_device *dev);
200};
201
202struct msm_mdss {
203 struct drm_device *dev;
204 const struct msm_mdss_funcs *funcs;
205};
206
207int mdp5_mdss_init(struct drm_device *dev);
208int dpu_mdss_init(struct drm_device *dev);
209
210#define for_each_crtc_mask(dev, crtc, crtc_mask) \
211 drm_for_each_crtc(crtc, dev) \
212 for_each_if (drm_crtc_mask(crtc) & (crtc_mask))
213
214#define for_each_crtc_mask_reverse(dev, crtc, crtc_mask) \
215 drm_for_each_crtc_reverse(crtc, dev) \
216 for_each_if (drm_crtc_mask(crtc) & (crtc_mask))
217
218#endif
219