diff options
author | Emily Deng <Emily.Deng@amd.com> | 2016-08-07 23:32:00 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-08-08 13:57:04 -0400 |
commit | f1f5ef92679fd9871b9642916c32b78fc333642a (patch) | |
tree | 9fe18c5b56645f86dfe156ae1decd08a76a7940b /drivers/gpu/drm/amd/amdgpu/dce_virtual.c | |
parent | e13273d4a4702f7cb21a5f6e94919a5b52c45c32 (diff) |
drm/amdgpu: Initialize dce_virtual_crtc_helper_funcs
For virtual display feature, initialize dce_virtual_crtc_helper_funcs.
Signed-off-by: Emily Deng <Emily.Deng@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/dce_virtual.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 137 |
1 files changed, 128 insertions, 9 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c index 985b276e6b25..11f04ec51c9c 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c | |||
@@ -134,16 +134,135 @@ static const struct drm_crtc_funcs dce_virtual_crtc_funcs = { | |||
134 | .page_flip = NULL, | 134 | .page_flip = NULL, |
135 | }; | 135 | }; |
136 | 136 | ||
137 | static void dce_virtual_crtc_dpms(struct drm_crtc *crtc, int mode) | ||
138 | { | ||
139 | struct drm_device *dev = crtc->dev; | ||
140 | struct amdgpu_device *adev = dev->dev_private; | ||
141 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); | ||
142 | unsigned type; | ||
143 | |||
144 | switch (mode) { | ||
145 | case DRM_MODE_DPMS_ON: | ||
146 | amdgpu_crtc->enabled = true; | ||
147 | /* Make sure VBLANK and PFLIP interrupts are still enabled */ | ||
148 | type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc->crtc_id); | ||
149 | amdgpu_irq_update(adev, &adev->crtc_irq, type); | ||
150 | amdgpu_irq_update(adev, &adev->pageflip_irq, type); | ||
151 | drm_vblank_on(dev, amdgpu_crtc->crtc_id); | ||
152 | break; | ||
153 | case DRM_MODE_DPMS_STANDBY: | ||
154 | case DRM_MODE_DPMS_SUSPEND: | ||
155 | case DRM_MODE_DPMS_OFF: | ||
156 | drm_vblank_off(dev, amdgpu_crtc->crtc_id); | ||
157 | amdgpu_crtc->enabled = false; | ||
158 | break; | ||
159 | } | ||
160 | } | ||
161 | |||
162 | |||
163 | static void dce_virtual_crtc_prepare(struct drm_crtc *crtc) | ||
164 | { | ||
165 | dce_virtual_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); | ||
166 | } | ||
167 | |||
168 | static void dce_virtual_crtc_commit(struct drm_crtc *crtc) | ||
169 | { | ||
170 | dce_virtual_crtc_dpms(crtc, DRM_MODE_DPMS_ON); | ||
171 | } | ||
172 | |||
173 | static void dce_virtual_crtc_disable(struct drm_crtc *crtc) | ||
174 | { | ||
175 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); | ||
176 | |||
177 | dce_virtual_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); | ||
178 | if (crtc->primary->fb) { | ||
179 | int r; | ||
180 | struct amdgpu_framebuffer *amdgpu_fb; | ||
181 | struct amdgpu_bo *rbo; | ||
182 | |||
183 | amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb); | ||
184 | rbo = gem_to_amdgpu_bo(amdgpu_fb->obj); | ||
185 | r = amdgpu_bo_reserve(rbo, false); | ||
186 | if (unlikely(r)) | ||
187 | DRM_ERROR("failed to reserve rbo before unpin\n"); | ||
188 | else { | ||
189 | amdgpu_bo_unpin(rbo); | ||
190 | amdgpu_bo_unreserve(rbo); | ||
191 | } | ||
192 | } | ||
193 | |||
194 | amdgpu_crtc->pll_id = ATOM_PPLL_INVALID; | ||
195 | amdgpu_crtc->encoder = NULL; | ||
196 | amdgpu_crtc->connector = NULL; | ||
197 | } | ||
198 | |||
199 | static int dce_virtual_crtc_mode_set(struct drm_crtc *crtc, | ||
200 | struct drm_display_mode *mode, | ||
201 | struct drm_display_mode *adjusted_mode, | ||
202 | int x, int y, struct drm_framebuffer *old_fb) | ||
203 | { | ||
204 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); | ||
205 | |||
206 | /* update the hw version fpr dpm */ | ||
207 | amdgpu_crtc->hw_mode = *adjusted_mode; | ||
208 | |||
209 | return 0; | ||
210 | } | ||
211 | |||
212 | static bool dce_virtual_crtc_mode_fixup(struct drm_crtc *crtc, | ||
213 | const struct drm_display_mode *mode, | ||
214 | struct drm_display_mode *adjusted_mode) | ||
215 | { | ||
216 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); | ||
217 | struct drm_device *dev = crtc->dev; | ||
218 | struct drm_encoder *encoder; | ||
219 | |||
220 | /* assign the encoder to the amdgpu crtc to avoid repeated lookups later */ | ||
221 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { | ||
222 | if (encoder->crtc == crtc) { | ||
223 | amdgpu_crtc->encoder = encoder; | ||
224 | amdgpu_crtc->connector = amdgpu_get_connector_for_encoder(encoder); | ||
225 | break; | ||
226 | } | ||
227 | } | ||
228 | if ((amdgpu_crtc->encoder == NULL) || (amdgpu_crtc->connector == NULL)) { | ||
229 | amdgpu_crtc->encoder = NULL; | ||
230 | amdgpu_crtc->connector = NULL; | ||
231 | return false; | ||
232 | } | ||
233 | |||
234 | return true; | ||
235 | } | ||
236 | |||
237 | |||
238 | static int dce_virtual_crtc_set_base(struct drm_crtc *crtc, int x, int y, | ||
239 | struct drm_framebuffer *old_fb) | ||
240 | { | ||
241 | return 0; | ||
242 | } | ||
243 | |||
244 | static void dce_virtual_crtc_load_lut(struct drm_crtc *crtc) | ||
245 | { | ||
246 | return; | ||
247 | } | ||
248 | |||
249 | static int dce_virtual_crtc_set_base_atomic(struct drm_crtc *crtc, | ||
250 | struct drm_framebuffer *fb, | ||
251 | int x, int y, enum mode_set_atomic state) | ||
252 | { | ||
253 | return 0; | ||
254 | } | ||
255 | |||
137 | static const struct drm_crtc_helper_funcs dce_virtual_crtc_helper_funcs = { | 256 | static const struct drm_crtc_helper_funcs dce_virtual_crtc_helper_funcs = { |
138 | .dpms = NULL, | 257 | .dpms = dce_virtual_crtc_dpms, |
139 | .mode_fixup = NULL, | 258 | .mode_fixup = dce_virtual_crtc_mode_fixup, |
140 | .mode_set = NULL, | 259 | .mode_set = dce_virtual_crtc_mode_set, |
141 | .mode_set_base = NULL, | 260 | .mode_set_base = dce_virtual_crtc_set_base, |
142 | .mode_set_base_atomic = NULL, | 261 | .mode_set_base_atomic = dce_virtual_crtc_set_base_atomic, |
143 | .prepare = NULL, | 262 | .prepare = dce_virtual_crtc_prepare, |
144 | .commit = NULL, | 263 | .commit = dce_virtual_crtc_commit, |
145 | .load_lut = NULL, | 264 | .load_lut = dce_virtual_crtc_load_lut, |
146 | .disable = NULL, | 265 | .disable = dce_virtual_crtc_disable, |
147 | }; | 266 | }; |
148 | 267 | ||
149 | static int dce_virtual_crtc_init(struct amdgpu_device *adev, int index) | 268 | static int dce_virtual_crtc_init(struct amdgpu_device *adev, int index) |