aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
diff options
context:
space:
mode:
authorEmily Deng <Emily.Deng@amd.com>2016-08-07 23:32:00 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-08-08 13:57:04 -0400
commitf1f5ef92679fd9871b9642916c32b78fc333642a (patch)
tree9fe18c5b56645f86dfe156ae1decd08a76a7940b /drivers/gpu/drm/amd/amdgpu/dce_virtual.c
parente13273d4a4702f7cb21a5f6e94919a5b52c45c32 (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.c137
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
137static 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
163static void dce_virtual_crtc_prepare(struct drm_crtc *crtc)
164{
165 dce_virtual_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
166}
167
168static void dce_virtual_crtc_commit(struct drm_crtc *crtc)
169{
170 dce_virtual_crtc_dpms(crtc, DRM_MODE_DPMS_ON);
171}
172
173static 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
199static 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
212static 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
238static 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
244static void dce_virtual_crtc_load_lut(struct drm_crtc *crtc)
245{
246 return;
247}
248
249static 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
137static const struct drm_crtc_helper_funcs dce_virtual_crtc_helper_funcs = { 256static 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
149static int dce_virtual_crtc_init(struct amdgpu_device *adev, int index) 268static int dce_virtual_crtc_init(struct amdgpu_device *adev, int index)