aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmily Deng <Emily.Deng@amd.com>2016-08-07 23:31:13 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-08-08 13:44:30 -0400
commit8e6de75bd1d6fa84c4338f6e2276eb2bc339f5c9 (patch)
tree59f7b5040f99cd0debd0520cec7d945a2becd00e
parentc6e14f40ba1c2d23be03f09ace4b4d78bfc066e4 (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.c222
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 @@
34static void dce_virtual_set_display_funcs(struct amdgpu_device *adev); 34static void dce_virtual_set_display_funcs(struct amdgpu_device *adev);
35static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev); 35static 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 */
45static void dce_virtual_vblank_wait(struct amdgpu_device *adev, int crtc)
46{
47 return;
48}
49
50static 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
58static void dce_virtual_page_flip(struct amdgpu_device *adev,
59 int crtc_id, u64 crtc_base, bool async)
60{
61 return;
62}
63
64static 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
76static bool dce_virtual_hpd_sense(struct amdgpu_device *adev,
77 enum amdgpu_hpd_id hpd)
78{
79 return true;
80}
81
82static void dce_virtual_hpd_set_polarity(struct amdgpu_device *adev,
83 enum amdgpu_hpd_id hpd)
84{
85 return;
86}
87
88static u32 dce_virtual_hpd_get_gpio_reg(struct amdgpu_device *adev)
89{
90 return 0;
91}
92
93static bool dce_virtual_is_display_hung(struct amdgpu_device *adev)
94{
95 return false;
96}
97
98void dce_virtual_stop_mc_access(struct amdgpu_device *adev,
99 struct amdgpu_mode_mc_save *save)
100{
101 return;
102}
103void dce_virtual_resume_mc_access(struct amdgpu_device *adev,
104 struct amdgpu_mode_mc_save *save)
105{
106 return;
107}
108
109void 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 */
123static void dce_virtual_bandwidth_update(struct amdgpu_device *adev)
124{
125 return;
126}
127
37static const struct drm_crtc_funcs dce_virtual_crtc_funcs = { 128static 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 */
348static void dce_virtual_encoder_prepare(struct drm_encoder *encoder)
349{
350 return;
351}
352
353static void dce_virtual_encoder_commit(struct drm_encoder *encoder)
354{
355 return;
356}
357
358static void
359dce_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
366static void dce_virtual_encoder_disable(struct drm_encoder *encoder)
367{
368 return;
369}
370
371static void
372dce_virtual_encoder_dpms(struct drm_encoder *encoder, int mode)
373{
374 return;
375}
376
377static 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
388static 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
397static 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
406static const struct drm_encoder_funcs dce_virtual_encoder_funcs = {
407 .destroy = dce_virtual_encoder_destroy,
408};
409
410static 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
256static const struct amdgpu_display_funcs dce_virtual_display_funcs = { 451static 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
275static void dce_virtual_set_display_funcs(struct amdgpu_device *adev) 470static 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