diff options
author | Emily Deng <Emily.Deng@amd.com> | 2016-08-07 23:31:13 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-08-08 13:44:30 -0400 |
commit | 8e6de75bd1d6fa84c4338f6e2276eb2bc339f5c9 (patch) | |
tree | 59f7b5040f99cd0debd0520cec7d945a2becd00e | |
parent | c6e14f40ba1c2d23be03f09ace4b4d78bfc066e4 (diff) |
drm/amdgpu: Initialize dce_virtual_display_funcs.
For virtual display feature, initialize dce_virtual_display_funcs,
which will be used in function dce_virtual_set_display_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>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 222 |
1 files changed, 208 insertions, 14 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c index 953ee1a501a5..2da8847f8938 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c | |||
@@ -34,6 +34,97 @@ | |||
34 | static void dce_virtual_set_display_funcs(struct amdgpu_device *adev); | 34 | static void dce_virtual_set_display_funcs(struct amdgpu_device *adev); |
35 | static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev); | 35 | static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev); |
36 | 36 | ||
37 | /** | ||
38 | * dce_virtual_vblank_wait - vblank wait asic callback. | ||
39 | * | ||
40 | * @adev: amdgpu_device pointer | ||
41 | * @crtc: crtc to wait for vblank on | ||
42 | * | ||
43 | * Wait for vblank on the requested crtc (evergreen+). | ||
44 | */ | ||
45 | static void dce_virtual_vblank_wait(struct amdgpu_device *adev, int crtc) | ||
46 | { | ||
47 | return; | ||
48 | } | ||
49 | |||
50 | static u32 dce_virtual_vblank_get_counter(struct amdgpu_device *adev, int crtc) | ||
51 | { | ||
52 | if (crtc >= adev->mode_info.num_crtc) | ||
53 | return 0; | ||
54 | else | ||
55 | return adev->ddev->vblank[crtc].count; | ||
56 | } | ||
57 | |||
58 | static void dce_virtual_page_flip(struct amdgpu_device *adev, | ||
59 | int crtc_id, u64 crtc_base, bool async) | ||
60 | { | ||
61 | return; | ||
62 | } | ||
63 | |||
64 | static int dce_virtual_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc, | ||
65 | u32 *vbl, u32 *position) | ||
66 | { | ||
67 | if ((crtc < 0) || (crtc >= adev->mode_info.num_crtc)) | ||
68 | return -EINVAL; | ||
69 | |||
70 | *vbl = 0; | ||
71 | *position = 0; | ||
72 | |||
73 | return 0; | ||
74 | } | ||
75 | |||
76 | static bool dce_virtual_hpd_sense(struct amdgpu_device *adev, | ||
77 | enum amdgpu_hpd_id hpd) | ||
78 | { | ||
79 | return true; | ||
80 | } | ||
81 | |||
82 | static void dce_virtual_hpd_set_polarity(struct amdgpu_device *adev, | ||
83 | enum amdgpu_hpd_id hpd) | ||
84 | { | ||
85 | return; | ||
86 | } | ||
87 | |||
88 | static u32 dce_virtual_hpd_get_gpio_reg(struct amdgpu_device *adev) | ||
89 | { | ||
90 | return 0; | ||
91 | } | ||
92 | |||
93 | static bool dce_virtual_is_display_hung(struct amdgpu_device *adev) | ||
94 | { | ||
95 | return false; | ||
96 | } | ||
97 | |||
98 | void dce_virtual_stop_mc_access(struct amdgpu_device *adev, | ||
99 | struct amdgpu_mode_mc_save *save) | ||
100 | { | ||
101 | return; | ||
102 | } | ||
103 | void dce_virtual_resume_mc_access(struct amdgpu_device *adev, | ||
104 | struct amdgpu_mode_mc_save *save) | ||
105 | { | ||
106 | return; | ||
107 | } | ||
108 | |||
109 | void dce_virtual_set_vga_render_state(struct amdgpu_device *adev, | ||
110 | bool render) | ||
111 | { | ||
112 | return; | ||
113 | } | ||
114 | |||
115 | /** | ||
116 | * dce_virtual_bandwidth_update - program display watermarks | ||
117 | * | ||
118 | * @adev: amdgpu_device pointer | ||
119 | * | ||
120 | * Calculate and program the display watermarks and line | ||
121 | * buffer allocation (CIK). | ||
122 | */ | ||
123 | static void dce_virtual_bandwidth_update(struct amdgpu_device *adev) | ||
124 | { | ||
125 | return; | ||
126 | } | ||
127 | |||
37 | static const struct drm_crtc_funcs dce_virtual_crtc_funcs = { | 128 | static const struct drm_crtc_funcs dce_virtual_crtc_funcs = { |
38 | .cursor_set2 = NULL, | 129 | .cursor_set2 = NULL, |
39 | .cursor_move = NULL, | 130 | .cursor_move = NULL, |
@@ -253,23 +344,127 @@ const struct amd_ip_funcs dce_virtual_ip_funcs = { | |||
253 | .set_powergating_state = dce_virtual_set_powergating_state, | 344 | .set_powergating_state = dce_virtual_set_powergating_state, |
254 | }; | 345 | }; |
255 | 346 | ||
347 | /* these are handled by the primary encoders */ | ||
348 | static void dce_virtual_encoder_prepare(struct drm_encoder *encoder) | ||
349 | { | ||
350 | return; | ||
351 | } | ||
352 | |||
353 | static void dce_virtual_encoder_commit(struct drm_encoder *encoder) | ||
354 | { | ||
355 | return; | ||
356 | } | ||
357 | |||
358 | static void | ||
359 | dce_virtual_encoder_mode_set(struct drm_encoder *encoder, | ||
360 | struct drm_display_mode *mode, | ||
361 | struct drm_display_mode *adjusted_mode) | ||
362 | { | ||
363 | return; | ||
364 | } | ||
365 | |||
366 | static void dce_virtual_encoder_disable(struct drm_encoder *encoder) | ||
367 | { | ||
368 | return; | ||
369 | } | ||
370 | |||
371 | static void | ||
372 | dce_virtual_encoder_dpms(struct drm_encoder *encoder, int mode) | ||
373 | { | ||
374 | return; | ||
375 | } | ||
376 | |||
377 | static bool dce_virtual_encoder_mode_fixup(struct drm_encoder *encoder, | ||
378 | const struct drm_display_mode *mode, | ||
379 | struct drm_display_mode *adjusted_mode) | ||
380 | { | ||
381 | |||
382 | /* set the active encoder to connector routing */ | ||
383 | amdgpu_encoder_set_active_device(encoder); | ||
384 | |||
385 | return true; | ||
386 | } | ||
387 | |||
388 | static const struct drm_encoder_helper_funcs dce_virtual_encoder_helper_funcs = { | ||
389 | .dpms = dce_virtual_encoder_dpms, | ||
390 | .mode_fixup = dce_virtual_encoder_mode_fixup, | ||
391 | .prepare = dce_virtual_encoder_prepare, | ||
392 | .mode_set = dce_virtual_encoder_mode_set, | ||
393 | .commit = dce_virtual_encoder_commit, | ||
394 | .disable = dce_virtual_encoder_disable, | ||
395 | }; | ||
396 | |||
397 | static void dce_virtual_encoder_destroy(struct drm_encoder *encoder) | ||
398 | { | ||
399 | struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); | ||
400 | |||
401 | kfree(amdgpu_encoder->enc_priv); | ||
402 | drm_encoder_cleanup(encoder); | ||
403 | kfree(amdgpu_encoder); | ||
404 | } | ||
405 | |||
406 | static const struct drm_encoder_funcs dce_virtual_encoder_funcs = { | ||
407 | .destroy = dce_virtual_encoder_destroy, | ||
408 | }; | ||
409 | |||
410 | static void dce_virtual_encoder_add(struct amdgpu_device *adev, | ||
411 | uint32_t encoder_enum, | ||
412 | uint32_t supported_device, | ||
413 | u16 caps) | ||
414 | { | ||
415 | struct drm_device *dev = adev->ddev; | ||
416 | struct drm_encoder *encoder; | ||
417 | struct amdgpu_encoder *amdgpu_encoder; | ||
418 | |||
419 | /* see if we already added it */ | ||
420 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { | ||
421 | amdgpu_encoder = to_amdgpu_encoder(encoder); | ||
422 | if (amdgpu_encoder->encoder_enum == encoder_enum) { | ||
423 | amdgpu_encoder->devices |= supported_device; | ||
424 | return; | ||
425 | } | ||
426 | |||
427 | } | ||
428 | |||
429 | /* add a new one */ | ||
430 | amdgpu_encoder = kzalloc(sizeof(struct amdgpu_encoder), GFP_KERNEL); | ||
431 | if (!amdgpu_encoder) | ||
432 | return; | ||
433 | |||
434 | encoder = &amdgpu_encoder->base; | ||
435 | encoder->possible_crtcs = 0x1; | ||
436 | amdgpu_encoder->enc_priv = NULL; | ||
437 | amdgpu_encoder->encoder_enum = encoder_enum; | ||
438 | amdgpu_encoder->encoder_id = (encoder_enum & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; | ||
439 | amdgpu_encoder->devices = supported_device; | ||
440 | amdgpu_encoder->rmx_type = RMX_OFF; | ||
441 | amdgpu_encoder->underscan_type = UNDERSCAN_OFF; | ||
442 | amdgpu_encoder->is_ext_encoder = false; | ||
443 | amdgpu_encoder->caps = caps; | ||
444 | |||
445 | drm_encoder_init(dev, encoder, &dce_virtual_encoder_funcs, | ||
446 | DRM_MODE_ENCODER_VIRTUAL, NULL); | ||
447 | drm_encoder_helper_add(encoder, &dce_virtual_encoder_helper_funcs); | ||
448 | DRM_INFO("[FM]encoder: %d is VIRTUAL\n", amdgpu_encoder->encoder_id); | ||
449 | } | ||
450 | |||
256 | static const struct amdgpu_display_funcs dce_virtual_display_funcs = { | 451 | static const struct amdgpu_display_funcs dce_virtual_display_funcs = { |
257 | .set_vga_render_state = NULL, | 452 | .set_vga_render_state = &dce_virtual_set_vga_render_state, |
258 | .bandwidth_update = NULL, | 453 | .bandwidth_update = &dce_virtual_bandwidth_update, |
259 | .vblank_get_counter = NULL, | 454 | .vblank_get_counter = &dce_virtual_vblank_get_counter, |
260 | .vblank_wait = NULL, | 455 | .vblank_wait = &dce_virtual_vblank_wait, |
261 | .is_display_hung = NULL, | 456 | .is_display_hung = &dce_virtual_is_display_hung, |
262 | .backlight_set_level = NULL, | 457 | .backlight_set_level = NULL, |
263 | .backlight_get_level = NULL, | 458 | .backlight_get_level = NULL, |
264 | .hpd_sense = NULL, | 459 | .hpd_sense = &dce_virtual_hpd_sense, |
265 | .hpd_set_polarity = NULL, | 460 | .hpd_set_polarity = &dce_virtual_hpd_set_polarity, |
266 | .hpd_get_gpio_reg = NULL, | 461 | .hpd_get_gpio_reg = &dce_virtual_hpd_get_gpio_reg, |
267 | .page_flip = NULL, | 462 | .page_flip = &dce_virtual_page_flip, |
268 | .page_flip_get_scanoutpos = NULL, | 463 | .page_flip_get_scanoutpos = &dce_virtual_crtc_get_scanoutpos, |
269 | .add_encoder = NULL, | 464 | .add_encoder = &dce_virtual_encoder_add, |
270 | .add_connector = &amdgpu_connector_add, | 465 | .add_connector = &amdgpu_connector_add, |
271 | .stop_mc_access = NULL, | 466 | .stop_mc_access = &dce_virtual_stop_mc_access, |
272 | .resume_mc_access = NULL, | 467 | .resume_mc_access = &dce_virtual_resume_mc_access, |
273 | }; | 468 | }; |
274 | 469 | ||
275 | static void dce_virtual_set_display_funcs(struct amdgpu_device *adev) | 470 | static void dce_virtual_set_display_funcs(struct amdgpu_device *adev) |
@@ -305,4 +500,3 @@ static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev) | |||
305 | adev->hpd_irq.funcs = &dce_virtual_hpd_irq_funcs; | 500 | adev->hpd_irq.funcs = &dce_virtual_hpd_irq_funcs; |
306 | } | 501 | } |
307 | 502 | ||
308 | |||