* [PATCH 1/7] drm/amdgpu/virtual_dce: drop pageflip_irq funcs @ 2016-09-30 17:08 Alex Deucher [not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> 0 siblings, 1 reply; 16+ messages in thread From: Alex Deucher @ 2016-09-30 17:08 UTC (permalink / raw) To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Alex Deucher Never used. Signed-off-by: Alex Deucher <alexander.deucher@amd.com> --- drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 35 ++++++-------------------------- 1 file changed, 6 insertions(+), 29 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c index 359fe56..cf43caa 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c @@ -209,10 +209,9 @@ static void dce_virtual_crtc_dpms(struct drm_crtc *crtc, int mode) switch (mode) { case DRM_MODE_DPMS_ON: amdgpu_crtc->enabled = true; - /* Make sure VBLANK and PFLIP interrupts are still enabled */ + /* Make sure VBLANK interrupts are still enabled */ type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc->crtc_id); amdgpu_irq_update(adev, &adev->crtc_irq, type); - amdgpu_irq_update(adev, &adev->pageflip_irq, type); drm_vblank_on(dev, amdgpu_crtc->crtc_id); break; case DRM_MODE_DPMS_STANDBY: @@ -672,8 +671,8 @@ static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer *vbla } static void dce_virtual_set_crtc_vblank_interrupt_state(struct amdgpu_device *adev, - int crtc, - enum amdgpu_interrupt_state state) + int crtc, + enum amdgpu_interrupt_state state) { if (crtc >= adev->mode_info.num_crtc) { DRM_DEBUG("invalid crtc %d\n", crtc); @@ -697,9 +696,9 @@ static void dce_virtual_set_crtc_vblank_interrupt_state(struct amdgpu_device *ad static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev, - struct amdgpu_irq_src *source, - unsigned type, - enum amdgpu_interrupt_state state) + struct amdgpu_irq_src *source, + unsigned type, + enum amdgpu_interrupt_state state) { switch (type) { case AMDGPU_CRTC_IRQ_VBLANK1: @@ -726,20 +725,6 @@ static int dce_virtual_crtc_irq(struct amdgpu_device *adev, return 0; } -static int dce_virtual_set_pageflip_irq_state(struct amdgpu_device *adev, - struct amdgpu_irq_src *src, - unsigned type, - enum amdgpu_interrupt_state state) -{ - if (type >= adev->mode_info.num_crtc) { - DRM_ERROR("invalid pageflip crtc %d\n", type); - return -EINVAL; - } - DRM_DEBUG("[FM]set pageflip irq type %d state %d\n", type, state); - - return 0; -} - static int dce_virtual_pageflip_irq(struct amdgpu_device *adev, struct amdgpu_irq_src *source, struct amdgpu_iv_entry *entry) @@ -793,17 +778,9 @@ static const struct amdgpu_irq_src_funcs dce_virtual_crtc_irq_funcs = { .process = dce_virtual_crtc_irq, }; -static const struct amdgpu_irq_src_funcs dce_virtual_pageflip_irq_funcs = { - .set = dce_virtual_set_pageflip_irq_state, - .process = dce_virtual_pageflip_irq, -}; - static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev) { adev->crtc_irq.num_types = AMDGPU_CRTC_IRQ_LAST; adev->crtc_irq.funcs = &dce_virtual_crtc_irq_funcs; - - adev->pageflip_irq.num_types = AMDGPU_PAGEFLIP_IRQ_LAST; - adev->pageflip_irq.funcs = &dce_virtual_pageflip_irq_funcs; } -- 2.5.5 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 16+ messages in thread
[parent not found: <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>]
* [PATCH 2/7] drm/amdgpu/virtual_dce: no need to an irq process callback [not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> @ 2016-09-30 17:08 ` Alex Deucher [not found] ` <1475255328-21598-2-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> 2016-09-30 17:08 ` [PATCH 3/7] drm/amdgpu/virtual_dce: clean up interrupt handling Alex Deucher ` (6 subsequent siblings) 7 siblings, 1 reply; 16+ messages in thread From: Alex Deucher @ 2016-09-30 17:08 UTC (permalink / raw) To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Alex Deucher Virtual crtcs interrupts do not show up in the IV ring, so it will never be called. Signed-off-by: Alex Deucher <alexander.deucher@amd.com> --- drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c index cf43caa..8163622 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c @@ -710,21 +710,6 @@ static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev, return 0; } -static int dce_virtual_crtc_irq(struct amdgpu_device *adev, - struct amdgpu_irq_src *source, - struct amdgpu_iv_entry *entry) -{ - unsigned crtc = 0; - unsigned irq_type = AMDGPU_CRTC_IRQ_VBLANK1; - - if (amdgpu_irq_enabled(adev, source, irq_type)) { - drm_handle_vblank(adev->ddev, crtc); - } - dce_virtual_pageflip_irq(adev, NULL, NULL); - DRM_DEBUG("IH: D%d vblank\n", crtc + 1); - return 0; -} - static int dce_virtual_pageflip_irq(struct amdgpu_device *adev, struct amdgpu_irq_src *source, struct amdgpu_iv_entry *entry) @@ -775,7 +760,7 @@ static int dce_virtual_pageflip_irq(struct amdgpu_device *adev, static const struct amdgpu_irq_src_funcs dce_virtual_crtc_irq_funcs = { .set = dce_virtual_set_crtc_irq_state, - .process = dce_virtual_crtc_irq, + .process = NULL, }; static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev) -- 2.5.5 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 16+ messages in thread
[parent not found: <1475255328-21598-2-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>]
* RE: [PATCH 2/7] drm/amdgpu/virtual_dce: no need to an irq process callback [not found] ` <1475255328-21598-2-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> @ 2016-10-08 8:22 ` Deng, Emily 0 siblings, 0 replies; 16+ messages in thread From: Deng, Emily @ 2016-10-08 8:22 UTC (permalink / raw) To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Deucher, Alexander Reviewed-By: Emily Deng <Emily.Deng@amd.com> > -----Original Message----- > From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf > Of Alex Deucher > Sent: Saturday, October 01, 2016 1:09 AM > To: amd-gfx@lists.freedesktop.org > Cc: Deucher, Alexander <Alexander.Deucher@amd.com> > Subject: [PATCH 2/7] drm/amdgpu/virtual_dce: no need to an irq process > callback > > Virtual crtcs interrupts do not show up in the IV ring, so it will never be called. > > Signed-off-by: Alex Deucher <alexander.deucher@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 17 +---------------- > 1 file changed, 1 insertion(+), 16 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > index cf43caa..8163622 100644 > --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > @@ -710,21 +710,6 @@ static int dce_virtual_set_crtc_irq_state(struct > amdgpu_device *adev, > return 0; > } > > -static int dce_virtual_crtc_irq(struct amdgpu_device *adev, > - struct amdgpu_irq_src *source, > - struct amdgpu_iv_entry *entry) > -{ > - unsigned crtc = 0; > - unsigned irq_type = AMDGPU_CRTC_IRQ_VBLANK1; > - > - if (amdgpu_irq_enabled(adev, source, irq_type)) { > - drm_handle_vblank(adev->ddev, crtc); > - } > - dce_virtual_pageflip_irq(adev, NULL, NULL); > - DRM_DEBUG("IH: D%d vblank\n", crtc + 1); > - return 0; > -} > - > static int dce_virtual_pageflip_irq(struct amdgpu_device *adev, > struct amdgpu_irq_src *source, > struct amdgpu_iv_entry *entry) > @@ -775,7 +760,7 @@ static int dce_virtual_pageflip_irq(struct > amdgpu_device *adev, > > static const struct amdgpu_irq_src_funcs dce_virtual_crtc_irq_funcs = { > .set = dce_virtual_set_crtc_irq_state, > - .process = dce_virtual_crtc_irq, > + .process = NULL, > }; > > static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev) > -- > 2.5.5 > > _______________________________________________ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 3/7] drm/amdgpu/virtual_dce: clean up interrupt handling [not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> 2016-09-30 17:08 ` [PATCH 2/7] drm/amdgpu/virtual_dce: no need to an irq process callback Alex Deucher @ 2016-09-30 17:08 ` Alex Deucher [not found] ` <1475255328-21598-3-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> 2016-09-30 17:08 ` [PATCH 4/7] drm/amdgpu: simplify encoder and connector setup Alex Deucher ` (5 subsequent siblings) 7 siblings, 1 reply; 16+ messages in thread From: Alex Deucher @ 2016-09-30 17:08 UTC (permalink / raw) To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Alex Deucher We handle the virtual interrupts from a timer so no need to try an look like we are handling IV ring events. Signed-off-by: Alex Deucher <alexander.deucher@amd.com> --- drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 109 +++++++++++++++---------------- 1 file changed, 54 insertions(+), 55 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c index 8163622..29e0ce0 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c @@ -39,9 +39,6 @@ static void dce_virtual_set_display_funcs(struct amdgpu_device *adev); static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev); -static int dce_virtual_pageflip_irq(struct amdgpu_device *adev, - struct amdgpu_irq_src *source, - struct amdgpu_iv_entry *entry); /** * dce_virtual_vblank_wait - vblank wait asic callback. @@ -659,14 +656,64 @@ static void dce_virtual_set_display_funcs(struct amdgpu_device *adev) adev->mode_info.funcs = &dce_virtual_display_funcs; } +static int dce_virtual_pageflip(struct amdgpu_device *adev, + unsigned crtc_id) +{ + unsigned long flags; + struct amdgpu_crtc *amdgpu_crtc; + struct amdgpu_flip_work *works; + + amdgpu_crtc = adev->mode_info.crtcs[crtc_id]; + + if (crtc_id >= adev->mode_info.num_crtc) { + DRM_ERROR("invalid pageflip crtc %d\n", crtc_id); + return -EINVAL; + } + + /* IRQ could occur when in initial stage */ + if (amdgpu_crtc == NULL) + return 0; + + spin_lock_irqsave(&adev->ddev->event_lock, flags); + works = amdgpu_crtc->pflip_works; + if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED) { + DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != " + "AMDGPU_FLIP_SUBMITTED(%d)\n", + amdgpu_crtc->pflip_status, + AMDGPU_FLIP_SUBMITTED); + spin_unlock_irqrestore(&adev->ddev->event_lock, flags); + return 0; + } + + /* page flip completed. clean up */ + amdgpu_crtc->pflip_status = AMDGPU_FLIP_NONE; + amdgpu_crtc->pflip_works = NULL; + + /* wakeup usersapce */ + if (works->event) + drm_crtc_send_vblank_event(&amdgpu_crtc->base, works->event); + + spin_unlock_irqrestore(&adev->ddev->event_lock, flags); + + drm_crtc_vblank_put(&amdgpu_crtc->base); + schedule_work(&works->unpin_work); + + return 0; +} + static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer *vblank_timer) { - struct amdgpu_mode_info *mode_info = container_of(vblank_timer, struct amdgpu_mode_info ,vblank_timer); - struct amdgpu_device *adev = container_of(mode_info, struct amdgpu_device ,mode_info); + struct amdgpu_mode_info *mode_info = + container_of(vblank_timer, struct amdgpu_mode_info , vblank_timer); + struct amdgpu_device *adev = + container_of(mode_info, struct amdgpu_device , mode_info); unsigned crtc = 0; + drm_handle_vblank(adev->ddev, crtc); - dce_virtual_pageflip_irq(adev, NULL, NULL); - hrtimer_start(vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL); + dce_virtual_pageflip(adev, crtc); + hrtimer_start(vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), + HRTIMER_MODE_REL); + return HRTIMER_NORESTART; } @@ -710,54 +757,6 @@ static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev, return 0; } -static int dce_virtual_pageflip_irq(struct amdgpu_device *adev, - struct amdgpu_irq_src *source, - struct amdgpu_iv_entry *entry) -{ - unsigned long flags; - unsigned crtc_id = 0; - struct amdgpu_crtc *amdgpu_crtc; - struct amdgpu_flip_work *works; - - crtc_id = 0; - amdgpu_crtc = adev->mode_info.crtcs[crtc_id]; - - if (crtc_id >= adev->mode_info.num_crtc) { - DRM_ERROR("invalid pageflip crtc %d\n", crtc_id); - return -EINVAL; - } - - /* IRQ could occur when in initial stage */ - if (amdgpu_crtc == NULL) - return 0; - - spin_lock_irqsave(&adev->ddev->event_lock, flags); - works = amdgpu_crtc->pflip_works; - if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED) { - DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != " - "AMDGPU_FLIP_SUBMITTED(%d)\n", - amdgpu_crtc->pflip_status, - AMDGPU_FLIP_SUBMITTED); - spin_unlock_irqrestore(&adev->ddev->event_lock, flags); - return 0; - } - - /* page flip completed. clean up */ - amdgpu_crtc->pflip_status = AMDGPU_FLIP_NONE; - amdgpu_crtc->pflip_works = NULL; - - /* wakeup usersapce */ - if (works->event) - drm_crtc_send_vblank_event(&amdgpu_crtc->base, works->event); - - spin_unlock_irqrestore(&adev->ddev->event_lock, flags); - - drm_crtc_vblank_put(&amdgpu_crtc->base); - schedule_work(&works->unpin_work); - - return 0; -} - static const struct amdgpu_irq_src_funcs dce_virtual_crtc_irq_funcs = { .set = dce_virtual_set_crtc_irq_state, .process = NULL, -- 2.5.5 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 16+ messages in thread
[parent not found: <1475255328-21598-3-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>]
* RE: [PATCH 3/7] drm/amdgpu/virtual_dce: clean up interrupt handling [not found] ` <1475255328-21598-3-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> @ 2016-10-08 8:23 ` Deng, Emily 2016-10-08 8:23 ` Deng, Emily 1 sibling, 0 replies; 16+ messages in thread From: Deng, Emily @ 2016-10-08 8:23 UTC (permalink / raw) To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Deucher, Alexander Reviewed-By: Emily Deng <Emily.Deng@amd.com> > -----Original Message----- > From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf > Of Alex Deucher > Sent: Saturday, October 01, 2016 1:09 AM > To: amd-gfx@lists.freedesktop.org > Cc: Deucher, Alexander <Alexander.Deucher@amd.com> > Subject: [PATCH 3/7] drm/amdgpu/virtual_dce: clean up interrupt handling > > We handle the virtual interrupts from a timer so no need to try an look like > we are handling IV ring events. > > Signed-off-by: Alex Deucher <alexander.deucher@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 109 +++++++++++++++-------- > -------- > 1 file changed, 54 insertions(+), 55 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > index 8163622..29e0ce0 100644 > --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > @@ -39,9 +39,6 @@ > > static void dce_virtual_set_display_funcs(struct amdgpu_device *adev); > static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev); -static > int dce_virtual_pageflip_irq(struct amdgpu_device *adev, > - struct amdgpu_irq_src *source, > - struct amdgpu_iv_entry *entry); > > /** > * dce_virtual_vblank_wait - vblank wait asic callback. > @@ -659,14 +656,64 @@ static void dce_virtual_set_display_funcs(struct > amdgpu_device *adev) > adev->mode_info.funcs = &dce_virtual_display_funcs; } > > +static int dce_virtual_pageflip(struct amdgpu_device *adev, > + unsigned crtc_id) > +{ > + unsigned long flags; > + struct amdgpu_crtc *amdgpu_crtc; > + struct amdgpu_flip_work *works; > + > + amdgpu_crtc = adev->mode_info.crtcs[crtc_id]; > + > + if (crtc_id >= adev->mode_info.num_crtc) { > + DRM_ERROR("invalid pageflip crtc %d\n", crtc_id); > + return -EINVAL; > + } > + > + /* IRQ could occur when in initial stage */ > + if (amdgpu_crtc == NULL) > + return 0; > + > + spin_lock_irqsave(&adev->ddev->event_lock, flags); > + works = amdgpu_crtc->pflip_works; > + if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED) { > + DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != " > + "AMDGPU_FLIP_SUBMITTED(%d)\n", > + amdgpu_crtc->pflip_status, > + AMDGPU_FLIP_SUBMITTED); > + spin_unlock_irqrestore(&adev->ddev->event_lock, flags); > + return 0; > + } > + > + /* page flip completed. clean up */ > + amdgpu_crtc->pflip_status = AMDGPU_FLIP_NONE; > + amdgpu_crtc->pflip_works = NULL; > + > + /* wakeup usersapce */ > + if (works->event) > + drm_crtc_send_vblank_event(&amdgpu_crtc->base, works- > >event); > + > + spin_unlock_irqrestore(&adev->ddev->event_lock, flags); > + > + drm_crtc_vblank_put(&amdgpu_crtc->base); > + schedule_work(&works->unpin_work); > + > + return 0; > +} > + > static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer > *vblank_timer) { > - struct amdgpu_mode_info *mode_info = container_of(vblank_timer, > struct amdgpu_mode_info ,vblank_timer); > - struct amdgpu_device *adev = container_of(mode_info, struct > amdgpu_device ,mode_info); > + struct amdgpu_mode_info *mode_info = > + container_of(vblank_timer, struct amdgpu_mode_info , > vblank_timer); > + struct amdgpu_device *adev = > + container_of(mode_info, struct amdgpu_device , > mode_info); > unsigned crtc = 0; > + > drm_handle_vblank(adev->ddev, crtc); > - dce_virtual_pageflip_irq(adev, NULL, NULL); > - hrtimer_start(vblank_timer, ktime_set(0, > DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL); > + dce_virtual_pageflip(adev, crtc); > + hrtimer_start(vblank_timer, ktime_set(0, > DCE_VIRTUAL_VBLANK_PERIOD), > + HRTIMER_MODE_REL); > + > return HRTIMER_NORESTART; > } > > @@ -710,54 +757,6 @@ static int dce_virtual_set_crtc_irq_state(struct > amdgpu_device *adev, > return 0; > } > > -static int dce_virtual_pageflip_irq(struct amdgpu_device *adev, > - struct amdgpu_irq_src *source, > - struct amdgpu_iv_entry *entry) > -{ > - unsigned long flags; > - unsigned crtc_id = 0; > - struct amdgpu_crtc *amdgpu_crtc; > - struct amdgpu_flip_work *works; > - > - crtc_id = 0; > - amdgpu_crtc = adev->mode_info.crtcs[crtc_id]; > - > - if (crtc_id >= adev->mode_info.num_crtc) { > - DRM_ERROR("invalid pageflip crtc %d\n", crtc_id); > - return -EINVAL; > - } > - > - /* IRQ could occur when in initial stage */ > - if (amdgpu_crtc == NULL) > - return 0; > - > - spin_lock_irqsave(&adev->ddev->event_lock, flags); > - works = amdgpu_crtc->pflip_works; > - if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED) { > - DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != " > - "AMDGPU_FLIP_SUBMITTED(%d)\n", > - amdgpu_crtc->pflip_status, > - AMDGPU_FLIP_SUBMITTED); > - spin_unlock_irqrestore(&adev->ddev->event_lock, flags); > - return 0; > - } > - > - /* page flip completed. clean up */ > - amdgpu_crtc->pflip_status = AMDGPU_FLIP_NONE; > - amdgpu_crtc->pflip_works = NULL; > - > - /* wakeup usersapce */ > - if (works->event) > - drm_crtc_send_vblank_event(&amdgpu_crtc->base, works- > >event); > - > - spin_unlock_irqrestore(&adev->ddev->event_lock, flags); > - > - drm_crtc_vblank_put(&amdgpu_crtc->base); > - schedule_work(&works->unpin_work); > - > - return 0; > -} > - > static const struct amdgpu_irq_src_funcs dce_virtual_crtc_irq_funcs = { > .set = dce_virtual_set_crtc_irq_state, > .process = NULL, > -- > 2.5.5 > > _______________________________________________ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 16+ messages in thread
* RE: [PATCH 3/7] drm/amdgpu/virtual_dce: clean up interrupt handling [not found] ` <1475255328-21598-3-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> 2016-10-08 8:23 ` Deng, Emily @ 2016-10-08 8:23 ` Deng, Emily 1 sibling, 0 replies; 16+ messages in thread From: Deng, Emily @ 2016-10-08 8:23 UTC (permalink / raw) To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Deucher, Alexander Reviewed-By: Emily Deng <Emily.Deng@amd.com> > -----Original Message----- > From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf > Of Alex Deucher > Sent: Saturday, October 01, 2016 1:09 AM > To: amd-gfx@lists.freedesktop.org > Cc: Deucher, Alexander <Alexander.Deucher@amd.com> > Subject: [PATCH 3/7] drm/amdgpu/virtual_dce: clean up interrupt handling > > We handle the virtual interrupts from a timer so no need to try an look like > we are handling IV ring events. > > Signed-off-by: Alex Deucher <alexander.deucher@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 109 +++++++++++++++-------- > -------- > 1 file changed, 54 insertions(+), 55 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > index 8163622..29e0ce0 100644 > --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > @@ -39,9 +39,6 @@ > > static void dce_virtual_set_display_funcs(struct amdgpu_device *adev); > static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev); -static > int dce_virtual_pageflip_irq(struct amdgpu_device *adev, > - struct amdgpu_irq_src *source, > - struct amdgpu_iv_entry *entry); > > /** > * dce_virtual_vblank_wait - vblank wait asic callback. > @@ -659,14 +656,64 @@ static void dce_virtual_set_display_funcs(struct > amdgpu_device *adev) > adev->mode_info.funcs = &dce_virtual_display_funcs; } > > +static int dce_virtual_pageflip(struct amdgpu_device *adev, > + unsigned crtc_id) > +{ > + unsigned long flags; > + struct amdgpu_crtc *amdgpu_crtc; > + struct amdgpu_flip_work *works; > + > + amdgpu_crtc = adev->mode_info.crtcs[crtc_id]; > + > + if (crtc_id >= adev->mode_info.num_crtc) { > + DRM_ERROR("invalid pageflip crtc %d\n", crtc_id); > + return -EINVAL; > + } > + > + /* IRQ could occur when in initial stage */ > + if (amdgpu_crtc == NULL) > + return 0; > + > + spin_lock_irqsave(&adev->ddev->event_lock, flags); > + works = amdgpu_crtc->pflip_works; > + if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED) { > + DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != " > + "AMDGPU_FLIP_SUBMITTED(%d)\n", > + amdgpu_crtc->pflip_status, > + AMDGPU_FLIP_SUBMITTED); > + spin_unlock_irqrestore(&adev->ddev->event_lock, flags); > + return 0; > + } > + > + /* page flip completed. clean up */ > + amdgpu_crtc->pflip_status = AMDGPU_FLIP_NONE; > + amdgpu_crtc->pflip_works = NULL; > + > + /* wakeup usersapce */ > + if (works->event) > + drm_crtc_send_vblank_event(&amdgpu_crtc->base, works- > >event); > + > + spin_unlock_irqrestore(&adev->ddev->event_lock, flags); > + > + drm_crtc_vblank_put(&amdgpu_crtc->base); > + schedule_work(&works->unpin_work); > + > + return 0; > +} > + > static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer > *vblank_timer) { > - struct amdgpu_mode_info *mode_info = container_of(vblank_timer, > struct amdgpu_mode_info ,vblank_timer); > - struct amdgpu_device *adev = container_of(mode_info, struct > amdgpu_device ,mode_info); > + struct amdgpu_mode_info *mode_info = > + container_of(vblank_timer, struct amdgpu_mode_info , > vblank_timer); > + struct amdgpu_device *adev = > + container_of(mode_info, struct amdgpu_device , > mode_info); > unsigned crtc = 0; > + > drm_handle_vblank(adev->ddev, crtc); > - dce_virtual_pageflip_irq(adev, NULL, NULL); > - hrtimer_start(vblank_timer, ktime_set(0, > DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL); > + dce_virtual_pageflip(adev, crtc); > + hrtimer_start(vblank_timer, ktime_set(0, > DCE_VIRTUAL_VBLANK_PERIOD), > + HRTIMER_MODE_REL); > + > return HRTIMER_NORESTART; > } > > @@ -710,54 +757,6 @@ static int dce_virtual_set_crtc_irq_state(struct > amdgpu_device *adev, > return 0; > } > > -static int dce_virtual_pageflip_irq(struct amdgpu_device *adev, > - struct amdgpu_irq_src *source, > - struct amdgpu_iv_entry *entry) > -{ > - unsigned long flags; > - unsigned crtc_id = 0; > - struct amdgpu_crtc *amdgpu_crtc; > - struct amdgpu_flip_work *works; > - > - crtc_id = 0; > - amdgpu_crtc = adev->mode_info.crtcs[crtc_id]; > - > - if (crtc_id >= adev->mode_info.num_crtc) { > - DRM_ERROR("invalid pageflip crtc %d\n", crtc_id); > - return -EINVAL; > - } > - > - /* IRQ could occur when in initial stage */ > - if (amdgpu_crtc == NULL) > - return 0; > - > - spin_lock_irqsave(&adev->ddev->event_lock, flags); > - works = amdgpu_crtc->pflip_works; > - if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED) { > - DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != " > - "AMDGPU_FLIP_SUBMITTED(%d)\n", > - amdgpu_crtc->pflip_status, > - AMDGPU_FLIP_SUBMITTED); > - spin_unlock_irqrestore(&adev->ddev->event_lock, flags); > - return 0; > - } > - > - /* page flip completed. clean up */ > - amdgpu_crtc->pflip_status = AMDGPU_FLIP_NONE; > - amdgpu_crtc->pflip_works = NULL; > - > - /* wakeup usersapce */ > - if (works->event) > - drm_crtc_send_vblank_event(&amdgpu_crtc->base, works- > >event); > - > - spin_unlock_irqrestore(&adev->ddev->event_lock, flags); > - > - drm_crtc_vblank_put(&amdgpu_crtc->base); > - schedule_work(&works->unpin_work); > - > - return 0; > -} > - > static const struct amdgpu_irq_src_funcs dce_virtual_crtc_irq_funcs = { > .set = dce_virtual_set_crtc_irq_state, > .process = NULL, > -- > 2.5.5 > > _______________________________________________ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 4/7] drm/amdgpu: simplify encoder and connector setup [not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> 2016-09-30 17:08 ` [PATCH 2/7] drm/amdgpu/virtual_dce: no need to an irq process callback Alex Deucher 2016-09-30 17:08 ` [PATCH 3/7] drm/amdgpu/virtual_dce: clean up interrupt handling Alex Deucher @ 2016-09-30 17:08 ` Alex Deucher [not found] ` <1475255328-21598-4-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> 2016-09-30 17:08 ` [PATCH 5/7] Revert "drm/amdgpu: Add virtual connector and encoder macros." Alex Deucher ` (4 subsequent siblings) 7 siblings, 1 reply; 16+ messages in thread From: Alex Deucher @ 2016-09-30 17:08 UTC (permalink / raw) To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Alex Deucher No need to emulate all of the stuff for real hw. Signed-off-by: Alex Deucher <alexander.deucher@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 93 ---------- drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 231 +++++++++++++++---------- 2 files changed, 144 insertions(+), 180 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c index decbba5..ff0b55a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c @@ -1504,88 +1504,6 @@ static const struct drm_connector_funcs amdgpu_connector_edp_funcs = { .force = amdgpu_connector_dvi_force, }; -static struct drm_encoder * -amdgpu_connector_virtual_encoder(struct drm_connector *connector) -{ - int enc_id = connector->encoder_ids[0]; - struct drm_encoder *encoder; - int i; - for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { - if (connector->encoder_ids[i] == 0) - break; - - encoder = drm_encoder_find(connector->dev, connector->encoder_ids[i]); - if (!encoder) - continue; - - if (encoder->encoder_type == DRM_MODE_ENCODER_VIRTUAL) - return encoder; - } - - /* pick the first one */ - if (enc_id) - return drm_encoder_find(connector->dev, enc_id); - return NULL; -} - -static int amdgpu_connector_virtual_get_modes(struct drm_connector *connector) -{ - struct drm_encoder *encoder = amdgpu_connector_best_single_encoder(connector); - - if (encoder) { - amdgpu_connector_add_common_modes(encoder, connector); - } - - return 0; -} - -static int amdgpu_connector_virtual_mode_valid(struct drm_connector *connector, - struct drm_display_mode *mode) -{ - return MODE_OK; -} - -static int -amdgpu_connector_virtual_dpms(struct drm_connector *connector, int mode) -{ - return 0; -} - -static enum drm_connector_status - -amdgpu_connector_virtual_detect(struct drm_connector *connector, bool force) -{ - return connector_status_connected; -} - -static int -amdgpu_connector_virtual_set_property(struct drm_connector *connector, - struct drm_property *property, - uint64_t val) -{ - return 0; -} - -static void amdgpu_connector_virtual_force(struct drm_connector *connector) -{ - return; -} - -static const struct drm_connector_helper_funcs amdgpu_connector_virtual_helper_funcs = { - .get_modes = amdgpu_connector_virtual_get_modes, - .mode_valid = amdgpu_connector_virtual_mode_valid, - .best_encoder = amdgpu_connector_virtual_encoder, -}; - -static const struct drm_connector_funcs amdgpu_connector_virtual_funcs = { - .dpms = amdgpu_connector_virtual_dpms, - .detect = amdgpu_connector_virtual_detect, - .fill_modes = drm_helper_probe_single_connector_modes, - .set_property = amdgpu_connector_virtual_set_property, - .destroy = amdgpu_connector_destroy, - .force = amdgpu_connector_virtual_force, -}; - void amdgpu_connector_add(struct amdgpu_device *adev, uint32_t connector_id, @@ -1970,17 +1888,6 @@ amdgpu_connector_add(struct amdgpu_device *adev, connector->interlace_allowed = false; connector->doublescan_allowed = false; break; - case DRM_MODE_CONNECTOR_VIRTUAL: - amdgpu_dig_connector = kzalloc(sizeof(struct amdgpu_connector_atom_dig), GFP_KERNEL); - if (!amdgpu_dig_connector) - goto failed; - amdgpu_connector->con_priv = amdgpu_dig_connector; - drm_connector_init(dev, &amdgpu_connector->base, &amdgpu_connector_virtual_funcs, connector_type); - drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_virtual_helper_funcs); - subpixel_order = SubPixelHorizontalRGB; - connector->interlace_allowed = false; - connector->doublescan_allowed = false; - break; } } diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c index 29e0ce0..0c8b21e 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c @@ -39,6 +39,8 @@ static void dce_virtual_set_display_funcs(struct amdgpu_device *adev); static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev); +static int dce_virtual_connector_encoder_init(struct amdgpu_device *adev, + int index); /** * dce_virtual_vblank_wait - vblank wait asic callback. @@ -274,24 +276,6 @@ static bool dce_virtual_crtc_mode_fixup(struct drm_crtc *crtc, const struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode) { - struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); - struct drm_device *dev = crtc->dev; - struct drm_encoder *encoder; - - /* assign the encoder to the amdgpu crtc to avoid repeated lookups later */ - list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { - if (encoder->crtc == crtc) { - amdgpu_crtc->encoder = encoder; - amdgpu_crtc->connector = amdgpu_get_connector_for_encoder(encoder); - break; - } - } - if ((amdgpu_crtc->encoder == NULL) || (amdgpu_crtc->connector == NULL)) { - amdgpu_crtc->encoder = NULL; - amdgpu_crtc->connector = NULL; - return false; - } - return true; } @@ -370,38 +354,120 @@ static int dce_virtual_early_init(void *handle) return 0; } -static bool dce_virtual_get_connector_info(struct amdgpu_device *adev) +static struct drm_encoder * +dce_virtual_encoder(struct drm_connector *connector) { - struct amdgpu_i2c_bus_rec ddc_bus; - struct amdgpu_router router; - struct amdgpu_hpd hpd; + int enc_id = connector->encoder_ids[0]; + struct drm_encoder *encoder; + int i; + + for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { + if (connector->encoder_ids[i] == 0) + break; + + encoder = drm_encoder_find(connector->dev, connector->encoder_ids[i]); + if (!encoder) + continue; - /* look up gpio for ddc, hpd */ - ddc_bus.valid = false; - hpd.hpd = AMDGPU_HPD_NONE; - /* needed for aux chan transactions */ - ddc_bus.hpd = hpd.hpd; + if (encoder->encoder_type == DRM_MODE_ENCODER_VIRTUAL) + return encoder; + } - memset(&router, 0, sizeof(router)); - router.ddc_valid = false; - router.cd_valid = false; - amdgpu_display_add_connector(adev, - 0, - ATOM_DEVICE_CRT1_SUPPORT, - DRM_MODE_CONNECTOR_VIRTUAL, &ddc_bus, - CONNECTOR_OBJECT_ID_VIRTUAL, - &hpd, - &router); + /* pick the first one */ + if (enc_id) + return drm_encoder_find(connector->dev, enc_id); + return NULL; +} + +static int dce_virtual_get_modes(struct drm_connector *connector) +{ + struct drm_device *dev = connector->dev; + struct drm_display_mode *mode = NULL; + unsigned i; + static const struct mode_size { + int w; + int h; + } common_modes[17] = { + { 640, 480}, + { 720, 480}, + { 800, 600}, + { 848, 480}, + {1024, 768}, + {1152, 768}, + {1280, 720}, + {1280, 800}, + {1280, 854}, + {1280, 960}, + {1280, 1024}, + {1440, 900}, + {1400, 1050}, + {1680, 1050}, + {1600, 1200}, + {1920, 1080}, + {1920, 1200} + }; + + for (i = 0; i < 17; i++) { + mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h, 60, false, false, false); + drm_mode_probed_add(connector, mode); + } - amdgpu_display_add_encoder(adev, ENCODER_VIRTUAL_ENUM_VIRTUAL, - ATOM_DEVICE_CRT1_SUPPORT, - 0); + return 0; +} - amdgpu_link_encoder_connector(adev->ddev); +static int dce_virtual_mode_valid(struct drm_connector *connector, + struct drm_display_mode *mode) +{ + return MODE_OK; +} - return true; +static int +dce_virtual_dpms(struct drm_connector *connector, int mode) +{ + return 0; } +static enum drm_connector_status +dce_virtual_detect(struct drm_connector *connector, bool force) +{ + return connector_status_connected; +} + +static int +dce_virtual_set_property(struct drm_connector *connector, + struct drm_property *property, + uint64_t val) +{ + return 0; +} + +static void dce_virtual_destroy(struct drm_connector *connector) +{ + drm_connector_unregister(connector); + drm_connector_cleanup(connector); + kfree(connector); +} + +static void dce_virtual_force(struct drm_connector *connector) +{ + return; +} + +static const struct drm_connector_helper_funcs dce_virtual_connector_helper_funcs = { + .get_modes = dce_virtual_get_modes, + .mode_valid = dce_virtual_mode_valid, + .best_encoder = dce_virtual_encoder, +}; + +static const struct drm_connector_funcs dce_virtual_connector_funcs = { + .dpms = dce_virtual_dpms, + .detect = dce_virtual_detect, + .fill_modes = drm_helper_probe_single_connector_modes, + .set_property = dce_virtual_set_property, + .destroy = dce_virtual_destroy, + .force = dce_virtual_force, +}; + static int dce_virtual_sw_init(void *handle) { int r, i; @@ -430,16 +496,16 @@ static int dce_virtual_sw_init(void *handle) adev->ddev->mode_config.max_width = 16384; adev->ddev->mode_config.max_height = 16384; - /* allocate crtcs */ + /* allocate crtcs, encoders, connectors */ for (i = 0; i < adev->mode_info.num_crtc; i++) { r = dce_virtual_crtc_init(adev, i); if (r) return r; + r = dce_virtual_connector_encoder_init(adev, i); + if (r) + return r; } - dce_virtual_get_connector_info(adev); - amdgpu_print_display_setup(adev->ddev); - drm_kms_helper_poll_init(adev->ddev); adev->mode_info.mode_config_initialized = true; @@ -540,8 +606,8 @@ static void dce_virtual_encoder_commit(struct drm_encoder *encoder) static void dce_virtual_encoder_mode_set(struct drm_encoder *encoder, - struct drm_display_mode *mode, - struct drm_display_mode *adjusted_mode) + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) { return; } @@ -561,10 +627,6 @@ static bool dce_virtual_encoder_mode_fixup(struct drm_encoder *encoder, const struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode) { - - /* set the active encoder to connector routing */ - amdgpu_encoder_set_active_device(encoder); - return true; } @@ -590,45 +652,40 @@ static const struct drm_encoder_funcs dce_virtual_encoder_funcs = { .destroy = dce_virtual_encoder_destroy, }; -static void dce_virtual_encoder_add(struct amdgpu_device *adev, - uint32_t encoder_enum, - uint32_t supported_device, - u16 caps) +static int dce_virtual_connector_encoder_init(struct amdgpu_device *adev, + int index) { - struct drm_device *dev = adev->ddev; struct drm_encoder *encoder; - struct amdgpu_encoder *amdgpu_encoder; - - /* see if we already added it */ - list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { - amdgpu_encoder = to_amdgpu_encoder(encoder); - if (amdgpu_encoder->encoder_enum == encoder_enum) { - amdgpu_encoder->devices |= supported_device; - return; - } + struct drm_connector *connector; + /* add a new encoder */ + encoder = kzalloc(sizeof(struct drm_encoder), GFP_KERNEL); + if (!encoder) { + kfree(connector); + return -ENOMEM; } + encoder->possible_crtcs = 1 << index; + drm_encoder_init(adev->ddev, encoder, &dce_virtual_encoder_funcs, + DRM_MODE_ENCODER_VIRTUAL, NULL); + drm_encoder_helper_add(encoder, &dce_virtual_encoder_helper_funcs); - /* add a new one */ - amdgpu_encoder = kzalloc(sizeof(struct amdgpu_encoder), GFP_KERNEL); - if (!amdgpu_encoder) - return; + connector = kzalloc(sizeof(struct drm_connector), GFP_KERNEL); + if (!connector) + return -ENOMEM; - encoder = &amdgpu_encoder->base; - encoder->possible_crtcs = 0x1; - amdgpu_encoder->enc_priv = NULL; - amdgpu_encoder->encoder_enum = encoder_enum; - amdgpu_encoder->encoder_id = (encoder_enum & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; - amdgpu_encoder->devices = supported_device; - amdgpu_encoder->rmx_type = RMX_OFF; - amdgpu_encoder->underscan_type = UNDERSCAN_OFF; - amdgpu_encoder->is_ext_encoder = false; - amdgpu_encoder->caps = caps; - - drm_encoder_init(dev, encoder, &dce_virtual_encoder_funcs, - DRM_MODE_ENCODER_VIRTUAL, NULL); - drm_encoder_helper_add(encoder, &dce_virtual_encoder_helper_funcs); - DRM_INFO("[FM]encoder: %d is VIRTUAL\n", amdgpu_encoder->encoder_id); + /* add a new connector */ + drm_connector_init(adev->ddev, connector, &dce_virtual_connector_funcs, + DRM_MODE_CONNECTOR_VIRTUAL); + drm_connector_helper_add(connector, &dce_virtual_connector_helper_funcs); + connector->display_info.subpixel_order = SubPixelHorizontalRGB; + connector->interlace_allowed = false; + connector->doublescan_allowed = false; + drm_connector_register(connector); + + /* link them */ + drm_mode_connector_attach_encoder(connector, encoder); + + return 0; } static const struct amdgpu_display_funcs dce_virtual_display_funcs = { @@ -644,8 +701,8 @@ static const struct amdgpu_display_funcs dce_virtual_display_funcs = { .hpd_get_gpio_reg = &dce_virtual_hpd_get_gpio_reg, .page_flip = &dce_virtual_page_flip, .page_flip_get_scanoutpos = &dce_virtual_crtc_get_scanoutpos, - .add_encoder = &dce_virtual_encoder_add, - .add_connector = &amdgpu_connector_add, + .add_encoder = NULL, + .add_connector = NULL, .stop_mc_access = &dce_virtual_stop_mc_access, .resume_mc_access = &dce_virtual_resume_mc_access, }; -- 2.5.5 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 16+ messages in thread
[parent not found: <1475255328-21598-4-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>]
* RE: [PATCH 4/7] drm/amdgpu: simplify encoder and connector setup [not found] ` <1475255328-21598-4-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> @ 2016-10-08 8:22 ` Deng, Emily 0 siblings, 0 replies; 16+ messages in thread From: Deng, Emily @ 2016-10-08 8:22 UTC (permalink / raw) To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Deucher, Alexander Reviewed-By: Emily Deng <Emily.Deng@amd.com> > -----Original Message----- > From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf > Of Alex Deucher > Sent: Saturday, October 01, 2016 1:09 AM > To: amd-gfx@lists.freedesktop.org > Cc: Deucher, Alexander <Alexander.Deucher@amd.com> > Subject: [PATCH 4/7] drm/amdgpu: simplify encoder and connector setup > > No need to emulate all of the stuff for real hw. > > Signed-off-by: Alex Deucher <alexander.deucher@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 93 ---------- > drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 231 +++++++++++++++---- > ------ > 2 files changed, 144 insertions(+), 180 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c > index decbba5..ff0b55a 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c > @@ -1504,88 +1504,6 @@ static const struct drm_connector_funcs > amdgpu_connector_edp_funcs = { > .force = amdgpu_connector_dvi_force, > }; > > -static struct drm_encoder * > -amdgpu_connector_virtual_encoder(struct drm_connector *connector) -{ > - int enc_id = connector->encoder_ids[0]; > - struct drm_encoder *encoder; > - int i; > - for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { > - if (connector->encoder_ids[i] == 0) > - break; > - > - encoder = drm_encoder_find(connector->dev, connector- > >encoder_ids[i]); > - if (!encoder) > - continue; > - > - if (encoder->encoder_type == > DRM_MODE_ENCODER_VIRTUAL) > - return encoder; > - } > - > - /* pick the first one */ > - if (enc_id) > - return drm_encoder_find(connector->dev, enc_id); > - return NULL; > -} > - > -static int amdgpu_connector_virtual_get_modes(struct drm_connector > *connector) -{ > - struct drm_encoder *encoder = > amdgpu_connector_best_single_encoder(connector); > - > - if (encoder) { > - amdgpu_connector_add_common_modes(encoder, > connector); > - } > - > - return 0; > -} > - > -static int amdgpu_connector_virtual_mode_valid(struct drm_connector > *connector, > - struct drm_display_mode *mode) > -{ > - return MODE_OK; > -} > - > -static int > -amdgpu_connector_virtual_dpms(struct drm_connector *connector, int > mode) -{ > - return 0; > -} > - > -static enum drm_connector_status > - > -amdgpu_connector_virtual_detect(struct drm_connector *connector, bool > force) -{ > - return connector_status_connected; > -} > - > -static int > -amdgpu_connector_virtual_set_property(struct drm_connector *connector, > - struct drm_property *property, > - uint64_t val) > -{ > - return 0; > -} > - > -static void amdgpu_connector_virtual_force(struct drm_connector > *connector) -{ > - return; > -} > - > -static const struct drm_connector_helper_funcs > amdgpu_connector_virtual_helper_funcs = { > - .get_modes = amdgpu_connector_virtual_get_modes, > - .mode_valid = amdgpu_connector_virtual_mode_valid, > - .best_encoder = amdgpu_connector_virtual_encoder, > -}; > - > -static const struct drm_connector_funcs amdgpu_connector_virtual_funcs > = { > - .dpms = amdgpu_connector_virtual_dpms, > - .detect = amdgpu_connector_virtual_detect, > - .fill_modes = drm_helper_probe_single_connector_modes, > - .set_property = amdgpu_connector_virtual_set_property, > - .destroy = amdgpu_connector_destroy, > - .force = amdgpu_connector_virtual_force, > -}; > - > void > amdgpu_connector_add(struct amdgpu_device *adev, > uint32_t connector_id, > @@ -1970,17 +1888,6 @@ amdgpu_connector_add(struct amdgpu_device > *adev, > connector->interlace_allowed = false; > connector->doublescan_allowed = false; > break; > - case DRM_MODE_CONNECTOR_VIRTUAL: > - amdgpu_dig_connector = kzalloc(sizeof(struct > amdgpu_connector_atom_dig), GFP_KERNEL); > - if (!amdgpu_dig_connector) > - goto failed; > - amdgpu_connector->con_priv = > amdgpu_dig_connector; > - drm_connector_init(dev, &amdgpu_connector->base, > &amdgpu_connector_virtual_funcs, connector_type); > - drm_connector_helper_add(&amdgpu_connector- > >base, &amdgpu_connector_virtual_helper_funcs); > - subpixel_order = SubPixelHorizontalRGB; > - connector->interlace_allowed = false; > - connector->doublescan_allowed = false; > - break; > } > } > > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > index 29e0ce0..0c8b21e 100644 > --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > @@ -39,6 +39,8 @@ > > static void dce_virtual_set_display_funcs(struct amdgpu_device *adev); > static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev); > +static int dce_virtual_connector_encoder_init(struct amdgpu_device *adev, > + int index); > > /** > * dce_virtual_vblank_wait - vblank wait asic callback. > @@ -274,24 +276,6 @@ static bool dce_virtual_crtc_mode_fixup(struct > drm_crtc *crtc, > const struct drm_display_mode *mode, > struct drm_display_mode *adjusted_mode) > { > - struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); > - struct drm_device *dev = crtc->dev; > - struct drm_encoder *encoder; > - > - /* assign the encoder to the amdgpu crtc to avoid repeated lookups > later */ > - list_for_each_entry(encoder, &dev->mode_config.encoder_list, > head) { > - if (encoder->crtc == crtc) { > - amdgpu_crtc->encoder = encoder; > - amdgpu_crtc->connector = > amdgpu_get_connector_for_encoder(encoder); > - break; > - } > - } > - if ((amdgpu_crtc->encoder == NULL) || (amdgpu_crtc->connector == > NULL)) { > - amdgpu_crtc->encoder = NULL; > - amdgpu_crtc->connector = NULL; > - return false; > - } > - > return true; > } > > @@ -370,38 +354,120 @@ static int dce_virtual_early_init(void *handle) > return 0; > } > > -static bool dce_virtual_get_connector_info(struct amdgpu_device *adev) > +static struct drm_encoder * > +dce_virtual_encoder(struct drm_connector *connector) > { > - struct amdgpu_i2c_bus_rec ddc_bus; > - struct amdgpu_router router; > - struct amdgpu_hpd hpd; > + int enc_id = connector->encoder_ids[0]; > + struct drm_encoder *encoder; > + int i; > + > + for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { > + if (connector->encoder_ids[i] == 0) > + break; > + > + encoder = drm_encoder_find(connector->dev, connector- > >encoder_ids[i]); > + if (!encoder) > + continue; > > - /* look up gpio for ddc, hpd */ > - ddc_bus.valid = false; > - hpd.hpd = AMDGPU_HPD_NONE; > - /* needed for aux chan transactions */ > - ddc_bus.hpd = hpd.hpd; > + if (encoder->encoder_type == > DRM_MODE_ENCODER_VIRTUAL) > + return encoder; > + } > > - memset(&router, 0, sizeof(router)); > - router.ddc_valid = false; > - router.cd_valid = false; > - amdgpu_display_add_connector(adev, > - 0, > - ATOM_DEVICE_CRT1_SUPPORT, > - DRM_MODE_CONNECTOR_VIRTUAL, > &ddc_bus, > - CONNECTOR_OBJECT_ID_VIRTUAL, > - &hpd, > - &router); > + /* pick the first one */ > + if (enc_id) > + return drm_encoder_find(connector->dev, enc_id); > + return NULL; > +} > + > +static int dce_virtual_get_modes(struct drm_connector *connector) { > + struct drm_device *dev = connector->dev; > + struct drm_display_mode *mode = NULL; > + unsigned i; > + static const struct mode_size { > + int w; > + int h; > + } common_modes[17] = { > + { 640, 480}, > + { 720, 480}, > + { 800, 600}, > + { 848, 480}, > + {1024, 768}, > + {1152, 768}, > + {1280, 720}, > + {1280, 800}, > + {1280, 854}, > + {1280, 960}, > + {1280, 1024}, > + {1440, 900}, > + {1400, 1050}, > + {1680, 1050}, > + {1600, 1200}, > + {1920, 1080}, > + {1920, 1200} > + }; > + > + for (i = 0; i < 17; i++) { > + mode = drm_cvt_mode(dev, common_modes[i].w, > common_modes[i].h, 60, false, false, false); > + drm_mode_probed_add(connector, mode); > + } > > - amdgpu_display_add_encoder(adev, > ENCODER_VIRTUAL_ENUM_VIRTUAL, > - > ATOM_DEVICE_CRT1_SUPPORT, > - 0); > + return 0; > +} > > - amdgpu_link_encoder_connector(adev->ddev); > +static int dce_virtual_mode_valid(struct drm_connector *connector, > + struct drm_display_mode *mode) > +{ > + return MODE_OK; > +} > > - return true; > +static int > +dce_virtual_dpms(struct drm_connector *connector, int mode) { > + return 0; > } > > +static enum drm_connector_status > +dce_virtual_detect(struct drm_connector *connector, bool force) { > + return connector_status_connected; > +} > + > +static int > +dce_virtual_set_property(struct drm_connector *connector, > + struct drm_property *property, > + uint64_t val) > +{ > + return 0; > +} > + > +static void dce_virtual_destroy(struct drm_connector *connector) { > + drm_connector_unregister(connector); > + drm_connector_cleanup(connector); > + kfree(connector); > +} > + > +static void dce_virtual_force(struct drm_connector *connector) { > + return; > +} > + > +static const struct drm_connector_helper_funcs > dce_virtual_connector_helper_funcs = { > + .get_modes = dce_virtual_get_modes, > + .mode_valid = dce_virtual_mode_valid, > + .best_encoder = dce_virtual_encoder, > +}; > + > +static const struct drm_connector_funcs dce_virtual_connector_funcs = { > + .dpms = dce_virtual_dpms, > + .detect = dce_virtual_detect, > + .fill_modes = drm_helper_probe_single_connector_modes, > + .set_property = dce_virtual_set_property, > + .destroy = dce_virtual_destroy, > + .force = dce_virtual_force, > +}; > + > static int dce_virtual_sw_init(void *handle) { > int r, i; > @@ -430,16 +496,16 @@ static int dce_virtual_sw_init(void *handle) > adev->ddev->mode_config.max_width = 16384; > adev->ddev->mode_config.max_height = 16384; > > - /* allocate crtcs */ > + /* allocate crtcs, encoders, connectors */ > for (i = 0; i < adev->mode_info.num_crtc; i++) { > r = dce_virtual_crtc_init(adev, i); > if (r) > return r; > + r = dce_virtual_connector_encoder_init(adev, i); > + if (r) > + return r; > } > > - dce_virtual_get_connector_info(adev); > - amdgpu_print_display_setup(adev->ddev); > - > drm_kms_helper_poll_init(adev->ddev); > > adev->mode_info.mode_config_initialized = true; @@ -540,8 +606,8 > @@ static void dce_virtual_encoder_commit(struct drm_encoder *encoder) > > static void > dce_virtual_encoder_mode_set(struct drm_encoder *encoder, > - struct drm_display_mode *mode, > - struct drm_display_mode *adjusted_mode) > + struct drm_display_mode *mode, > + struct drm_display_mode *adjusted_mode) > { > return; > } > @@ -561,10 +627,6 @@ static bool dce_virtual_encoder_mode_fixup(struct > drm_encoder *encoder, > const struct drm_display_mode *mode, > struct drm_display_mode *adjusted_mode) > { > - > - /* set the active encoder to connector routing */ > - amdgpu_encoder_set_active_device(encoder); > - > return true; > } > > @@ -590,45 +652,40 @@ static const struct drm_encoder_funcs > dce_virtual_encoder_funcs = { > .destroy = dce_virtual_encoder_destroy, }; > > -static void dce_virtual_encoder_add(struct amdgpu_device *adev, > - uint32_t encoder_enum, > - uint32_t supported_device, > - u16 caps) > +static int dce_virtual_connector_encoder_init(struct amdgpu_device *adev, > + int index) > { > - struct drm_device *dev = adev->ddev; > struct drm_encoder *encoder; > - struct amdgpu_encoder *amdgpu_encoder; > - > - /* see if we already added it */ > - list_for_each_entry(encoder, &dev->mode_config.encoder_list, > head) { > - amdgpu_encoder = to_amdgpu_encoder(encoder); > - if (amdgpu_encoder->encoder_enum == encoder_enum) { > - amdgpu_encoder->devices |= supported_device; > - return; > - } > + struct drm_connector *connector; > > + /* add a new encoder */ > + encoder = kzalloc(sizeof(struct drm_encoder), GFP_KERNEL); > + if (!encoder) { > + kfree(connector); > + return -ENOMEM; > } > + encoder->possible_crtcs = 1 << index; > + drm_encoder_init(adev->ddev, encoder, > &dce_virtual_encoder_funcs, > + DRM_MODE_ENCODER_VIRTUAL, NULL); > + drm_encoder_helper_add(encoder, > &dce_virtual_encoder_helper_funcs); > > - /* add a new one */ > - amdgpu_encoder = kzalloc(sizeof(struct amdgpu_encoder), > GFP_KERNEL); > - if (!amdgpu_encoder) > - return; > + connector = kzalloc(sizeof(struct drm_connector), GFP_KERNEL); > + if (!connector) > + return -ENOMEM; > > - encoder = &amdgpu_encoder->base; > - encoder->possible_crtcs = 0x1; > - amdgpu_encoder->enc_priv = NULL; > - amdgpu_encoder->encoder_enum = encoder_enum; > - amdgpu_encoder->encoder_id = (encoder_enum & > OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; > - amdgpu_encoder->devices = supported_device; > - amdgpu_encoder->rmx_type = RMX_OFF; > - amdgpu_encoder->underscan_type = UNDERSCAN_OFF; > - amdgpu_encoder->is_ext_encoder = false; > - amdgpu_encoder->caps = caps; > - > - drm_encoder_init(dev, encoder, &dce_virtual_encoder_funcs, > - DRM_MODE_ENCODER_VIRTUAL, > NULL); > - drm_encoder_helper_add(encoder, > &dce_virtual_encoder_helper_funcs); > - DRM_INFO("[FM]encoder: %d is VIRTUAL\n", amdgpu_encoder- > >encoder_id); > + /* add a new connector */ > + drm_connector_init(adev->ddev, connector, > &dce_virtual_connector_funcs, > + DRM_MODE_CONNECTOR_VIRTUAL); > + drm_connector_helper_add(connector, > &dce_virtual_connector_helper_funcs); > + connector->display_info.subpixel_order = SubPixelHorizontalRGB; > + connector->interlace_allowed = false; > + connector->doublescan_allowed = false; > + drm_connector_register(connector); > + > + /* link them */ > + drm_mode_connector_attach_encoder(connector, encoder); > + > + return 0; > } > > static const struct amdgpu_display_funcs dce_virtual_display_funcs = { @@ > -644,8 +701,8 @@ static const struct amdgpu_display_funcs > dce_virtual_display_funcs = { > .hpd_get_gpio_reg = &dce_virtual_hpd_get_gpio_reg, > .page_flip = &dce_virtual_page_flip, > .page_flip_get_scanoutpos = &dce_virtual_crtc_get_scanoutpos, > - .add_encoder = &dce_virtual_encoder_add, > - .add_connector = &amdgpu_connector_add, > + .add_encoder = NULL, > + .add_connector = NULL, > .stop_mc_access = &dce_virtual_stop_mc_access, > .resume_mc_access = &dce_virtual_resume_mc_access, }; > -- > 2.5.5 > > _______________________________________________ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 5/7] Revert "drm/amdgpu: Add virtual connector and encoder macros." [not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> ` (2 preceding siblings ...) 2016-09-30 17:08 ` [PATCH 4/7] drm/amdgpu: simplify encoder and connector setup Alex Deucher @ 2016-09-30 17:08 ` Alex Deucher [not found] ` <1475255328-21598-5-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> 2016-09-30 17:08 ` [PATCH 6/7] drm/amdgpu: rename amdgpu_whether_enable_virtual_display Alex Deucher ` (3 subsequent siblings) 7 siblings, 1 reply; 16+ messages in thread From: Alex Deucher @ 2016-09-30 17:08 UTC (permalink / raw) To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Alex Deucher This reverts commit 16925c92dbd97524655525b6816625e1f0063d12. This is no longer necessary. --- drivers/gpu/drm/amd/amdgpu/ObjectID.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/ObjectID.h b/drivers/gpu/drm/amd/amdgpu/ObjectID.h index b8d6667..0619269 100644 --- a/drivers/gpu/drm/amd/amdgpu/ObjectID.h +++ b/drivers/gpu/drm/amd/amdgpu/ObjectID.h @@ -90,7 +90,6 @@ #define ENCODER_OBJECT_ID_INTERNAL_VCE 0x24 #define ENCODER_OBJECT_ID_INTERNAL_UNIPHY3 0x25 #define ENCODER_OBJECT_ID_INTERNAL_AMCLK 0x27 -#define ENCODER_OBJECT_ID_VIRTUAL 0x28 #define ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO 0xFF @@ -120,7 +119,6 @@ #define CONNECTOR_OBJECT_ID_eDP 0x14 #define CONNECTOR_OBJECT_ID_MXM 0x15 #define CONNECTOR_OBJECT_ID_LVDS_eDP 0x16 -#define CONNECTOR_OBJECT_ID_VIRTUAL 0x17 /* deleted */ @@ -149,7 +147,6 @@ #define GRAPH_OBJECT_ENUM_ID5 0x05 #define GRAPH_OBJECT_ENUM_ID6 0x06 #define GRAPH_OBJECT_ENUM_ID7 0x07 -#define GRAPH_OBJECT_ENUM_VIRTUAL 0x08 /****************************************************/ /* Graphics Object ID Bit definition */ @@ -411,10 +408,6 @@ GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ ENCODER_OBJECT_ID_HDMI_ANX9805 << OBJECT_ID_SHIFT) -#define ENCODER_VIRTUAL_ENUM_VIRTUAL ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_VIRTUAL << ENUM_ID_SHIFT |\ - ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT) - /****************************************************/ /* Connector Object ID definition - Shared with BIOS */ /****************************************************/ -- 2.5.5 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 16+ messages in thread
[parent not found: <1475255328-21598-5-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>]
* RE: [PATCH 5/7] Revert "drm/amdgpu: Add virtual connector and encoder macros." [not found] ` <1475255328-21598-5-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> @ 2016-10-08 8:22 ` Deng, Emily 0 siblings, 0 replies; 16+ messages in thread From: Deng, Emily @ 2016-10-08 8:22 UTC (permalink / raw) To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Deucher, Alexander Reviewed-By: Emily Deng <Emily.Deng@amd.com> > -----Original Message----- > From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf > Of Alex Deucher > Sent: Saturday, October 01, 2016 1:09 AM > To: amd-gfx@lists.freedesktop.org > Cc: Deucher, Alexander <Alexander.Deucher@amd.com> > Subject: [PATCH 5/7] Revert "drm/amdgpu: Add virtual connector and > encoder macros." > > This reverts commit 16925c92dbd97524655525b6816625e1f0063d12. > > This is no longer necessary. > --- > drivers/gpu/drm/amd/amdgpu/ObjectID.h | 7 ------- > 1 file changed, 7 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/ObjectID.h > b/drivers/gpu/drm/amd/amdgpu/ObjectID.h > index b8d6667..0619269 100644 > --- a/drivers/gpu/drm/amd/amdgpu/ObjectID.h > +++ b/drivers/gpu/drm/amd/amdgpu/ObjectID.h > @@ -90,7 +90,6 @@ > #define ENCODER_OBJECT_ID_INTERNAL_VCE 0x24 > #define ENCODER_OBJECT_ID_INTERNAL_UNIPHY3 0x25 > #define ENCODER_OBJECT_ID_INTERNAL_AMCLK 0x27 > -#define ENCODER_OBJECT_ID_VIRTUAL 0x28 > > #define ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO 0xFF > > @@ -120,7 +119,6 @@ > #define CONNECTOR_OBJECT_ID_eDP 0x14 > #define CONNECTOR_OBJECT_ID_MXM 0x15 > #define CONNECTOR_OBJECT_ID_LVDS_eDP 0x16 > -#define CONNECTOR_OBJECT_ID_VIRTUAL 0x17 > > /* deleted */ > > @@ -149,7 +147,6 @@ > #define GRAPH_OBJECT_ENUM_ID5 0x05 > #define GRAPH_OBJECT_ENUM_ID6 0x06 > #define GRAPH_OBJECT_ENUM_ID7 0x07 > -#define GRAPH_OBJECT_ENUM_VIRTUAL 0x08 > > /****************************************************/ > /* Graphics Object ID Bit definition */ > @@ -411,10 +408,6 @@ > GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT > |\ > ENCODER_OBJECT_ID_HDMI_ANX9805 << > OBJECT_ID_SHIFT) > > -#define ENCODER_VIRTUAL_ENUM_VIRTUAL > ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ > - GRAPH_OBJECT_ENUM_VIRTUAL << > ENUM_ID_SHIFT |\ > - ENCODER_OBJECT_ID_VIRTUAL << > OBJECT_ID_SHIFT) > - > /****************************************************/ > /* Connector Object ID definition - Shared with BIOS */ > /****************************************************/ > -- > 2.5.5 > > _______________________________________________ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 6/7] drm/amdgpu: rename amdgpu_whether_enable_virtual_display [not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> ` (3 preceding siblings ...) 2016-09-30 17:08 ` [PATCH 5/7] Revert "drm/amdgpu: Add virtual connector and encoder macros." Alex Deucher @ 2016-09-30 17:08 ` Alex Deucher [not found] ` <1475255328-21598-6-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> 2016-09-30 17:08 ` [PATCH 7/7] drm/amd/amdgpu: For virtual display, enable multi crtcs. (v3) Alex Deucher ` (2 subsequent siblings) 7 siblings, 1 reply; 16+ messages in thread From: Alex Deucher @ 2016-09-30 17:08 UTC (permalink / raw) To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Alex Deucher to match the other functions in that file. Signed-off-by: Alex Deucher <alexander.deucher@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 99a15ca..13caa52 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -1231,7 +1231,7 @@ int amdgpu_ip_block_version_cmp(struct amdgpu_device *adev, return 1; } -static void amdgpu_whether_enable_virtual_display(struct amdgpu_device *adev) +static void amdgpu_device_enable_virtual_display(struct amdgpu_device *adev) { adev->enable_virtual_display = false; @@ -1261,7 +1261,7 @@ static int amdgpu_early_init(struct amdgpu_device *adev) { int i, r; - amdgpu_whether_enable_virtual_display(adev); + amdgpu_device_enable_virtual_display(adev); switch (adev->asic_type) { case CHIP_TOPAZ: -- 2.5.5 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 16+ messages in thread
[parent not found: <1475255328-21598-6-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>]
* RE: [PATCH 6/7] drm/amdgpu: rename amdgpu_whether_enable_virtual_display [not found] ` <1475255328-21598-6-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> @ 2016-10-08 8:23 ` Deng, Emily 0 siblings, 0 replies; 16+ messages in thread From: Deng, Emily @ 2016-10-08 8:23 UTC (permalink / raw) To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Deucher, Alexander Reviewed-By: Emily Deng <Emily.Deng@amd.com> > -----Original Message----- > From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf > Of Alex Deucher > Sent: Saturday, October 01, 2016 1:09 AM > To: amd-gfx@lists.freedesktop.org > Cc: Deucher, Alexander <Alexander.Deucher@amd.com> > Subject: [PATCH 6/7] drm/amdgpu: rename > amdgpu_whether_enable_virtual_display > > to match the other functions in that file. > > Signed-off-by: Alex Deucher <alexander.deucher@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > index 99a15ca..13caa52 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > @@ -1231,7 +1231,7 @@ int amdgpu_ip_block_version_cmp(struct > amdgpu_device *adev, > return 1; > } > > -static void amdgpu_whether_enable_virtual_display(struct amdgpu_device > *adev) > +static void amdgpu_device_enable_virtual_display(struct amdgpu_device > +*adev) > { > adev->enable_virtual_display = false; > > @@ -1261,7 +1261,7 @@ static int amdgpu_early_init(struct > amdgpu_device *adev) { > int i, r; > > - amdgpu_whether_enable_virtual_display(adev); > + amdgpu_device_enable_virtual_display(adev); > > switch (adev->asic_type) { > case CHIP_TOPAZ: > -- > 2.5.5 > > _______________________________________________ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 7/7] drm/amd/amdgpu: For virtual display, enable multi crtcs. (v3) [not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> ` (4 preceding siblings ...) 2016-09-30 17:08 ` [PATCH 6/7] drm/amdgpu: rename amdgpu_whether_enable_virtual_display Alex Deucher @ 2016-09-30 17:08 ` Alex Deucher [not found] ` <1475255328-21598-7-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> 2016-09-30 17:52 ` [PATCH 1/7] drm/amdgpu/virtual_dce: drop pageflip_irq funcs Christian König 2016-10-08 8:24 ` Deng, Emily 7 siblings, 1 reply; 16+ messages in thread From: Alex Deucher @ 2016-09-30 17:08 UTC (permalink / raw) To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Alex Deucher, Emily Deng From: Emily Deng <Emily.Deng@amd.com> Enable multi crtcs for virtual display, user can set the number of crtcs by amdgpu module parameter virtual_display. v2: make timers per crtc v3: agd: simplify implementation Signed-off-by: Alex Deucher <alexander.deucher@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 28 +++++++++++++---- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 3 +- drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 5 ++-- drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 48 +++++++++++++++--------------- 4 files changed, 52 insertions(+), 32 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 13caa52..91dc851 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -1238,20 +1238,38 @@ static void amdgpu_device_enable_virtual_display(struct amdgpu_device *adev) if (amdgpu_virtual_display) { struct drm_device *ddev = adev->ddev; const char *pci_address_name = pci_name(ddev->pdev); - char *pciaddstr, *pciaddstr_tmp, *pciaddname; + char *pciaddstr, *pciaddstr_tmp, *pciaddname_tmp, *pciaddname; pciaddstr = kstrdup(amdgpu_virtual_display, GFP_KERNEL); pciaddstr_tmp = pciaddstr; - while ((pciaddname = strsep(&pciaddstr_tmp, ";"))) { + while ((pciaddname_tmp = strsep(&pciaddstr_tmp, ";"))) { + pciaddname = strsep(&pciaddname_tmp, ","); if (!strcmp(pci_address_name, pciaddname)) { + long num_crtc; + int res = -1; + adev->enable_virtual_display = true; + + if (pciaddname_tmp) + res = kstrtol(pciaddname_tmp, 10, + &num_crtc); + + if (!res) { + if (num_crtc < 1) + num_crtc = 1; + if (num_crtc > 6) + num_crtc = 6; + adev->mode_info.num_crtc = num_crtc; + } else { + adev->mode_info.num_crtc = 1; + } break; } } - DRM_INFO("virtual display string:%s, %s:virtual_display:%d\n", - amdgpu_virtual_display, pci_address_name, - adev->enable_virtual_display); + DRM_INFO("virtual display string:%s, %s:virtual_display:%d, num_crtc:%d\n", + amdgpu_virtual_display, pci_address_name, + adev->enable_virtual_display, adev->mode_info.num_crtc); kfree(pciaddstr); } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 728e8ca..721ef24 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -201,7 +201,8 @@ module_param_named(pg_mask, amdgpu_pg_mask, uint, 0444); MODULE_PARM_DESC(disable_cu, "Disable CUs (se.sh.cu,...)"); module_param_named(disable_cu, amdgpu_disable_cu, charp, 0444); -MODULE_PARM_DESC(virtual_display, "Enable virtual display feature (the virtual_display will be set like xxxx:xx:xx.x;xxxx:xx:xx.x)"); +MODULE_PARM_DESC(virtual_display, + "Enable virtual display feature (the virtual_display will be set like xxxx:xx:xx.x,x;xxxx:xx:xx.x,x)"); module_param_named(virtual_display, amdgpu_virtual_display, charp, 0444); static const struct pci_device_id pciidlist[] = { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h index 7b0eff7..1e23334 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h @@ -341,8 +341,6 @@ struct amdgpu_mode_info { int num_dig; /* number of dig blocks */ int disp_priority; const struct amdgpu_display_funcs *funcs; - struct hrtimer vblank_timer; - enum amdgpu_interrupt_state vsync_timer_enabled; }; #define AMDGPU_MAX_BL_LEVEL 0xFF @@ -413,6 +411,9 @@ struct amdgpu_crtc { u32 wm_high; u32 lb_vblank_lead_lines; struct drm_display_mode hw_mode; + /* for virtual dce */ + struct hrtimer vblank_timer; + enum amdgpu_interrupt_state vsync_timer_enabled; }; struct amdgpu_encoder_atom_dig { diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c index 0c8b21e..682e066 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c @@ -335,6 +335,7 @@ static int dce_virtual_crtc_init(struct amdgpu_device *adev, int index) amdgpu_crtc->pll_id = ATOM_PPLL_INVALID; amdgpu_crtc->encoder = NULL; amdgpu_crtc->connector = NULL; + amdgpu_crtc->vsync_timer_enabled = AMDGPU_IRQ_STATE_DISABLE; drm_crtc_helper_add(&amdgpu_crtc->base, &dce_virtual_crtc_helper_funcs); return 0; @@ -344,11 +345,9 @@ static int dce_virtual_early_init(void *handle) { struct amdgpu_device *adev = (struct amdgpu_device *)handle; - adev->mode_info.vsync_timer_enabled = AMDGPU_IRQ_STATE_DISABLE; dce_virtual_set_display_funcs(adev); dce_virtual_set_irq_funcs(adev); - adev->mode_info.num_crtc = 1; adev->mode_info.num_hpd = 1; adev->mode_info.num_dig = 1; return 0; @@ -760,14 +759,13 @@ static int dce_virtual_pageflip(struct amdgpu_device *adev, static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer *vblank_timer) { - struct amdgpu_mode_info *mode_info = - container_of(vblank_timer, struct amdgpu_mode_info , vblank_timer); - struct amdgpu_device *adev = - container_of(mode_info, struct amdgpu_device , mode_info); - unsigned crtc = 0; + struct amdgpu_crtc *amdgpu_crtc = container_of(vblank_timer, + struct amdgpu_crtc, vblank_timer); + struct drm_device *ddev = amdgpu_crtc->base.dev; + struct amdgpu_device *adev = ddev->dev_private; - drm_handle_vblank(adev->ddev, crtc); - dce_virtual_pageflip(adev, crtc); + drm_handle_vblank(ddev, amdgpu_crtc->crtc_id); + dce_virtual_pageflip(adev, amdgpu_crtc->crtc_id); hrtimer_start(vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL); @@ -783,18 +781,22 @@ static void dce_virtual_set_crtc_vblank_interrupt_state(struct amdgpu_device *ad return; } - if (state && !adev->mode_info.vsync_timer_enabled) { + if (state && !adev->mode_info.crtcs[crtc]->vsync_timer_enabled) { DRM_DEBUG("Enable software vsync timer\n"); - hrtimer_init(&adev->mode_info.vblank_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); - hrtimer_set_expires(&adev->mode_info.vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD)); - adev->mode_info.vblank_timer.function = dce_virtual_vblank_timer_handle; - hrtimer_start(&adev->mode_info.vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL); - } else if (!state && adev->mode_info.vsync_timer_enabled) { + hrtimer_init(&adev->mode_info.crtcs[crtc]->vblank_timer, + CLOCK_MONOTONIC, HRTIMER_MODE_REL); + hrtimer_set_expires(&adev->mode_info.crtcs[crtc]->vblank_timer, + ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD)); + adev->mode_info.crtcs[crtc]->vblank_timer.function = + dce_virtual_vblank_timer_handle; + hrtimer_start(&adev->mode_info.crtcs[crtc]->vblank_timer, + ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL); + } else if (!state && adev->mode_info.crtcs[crtc]->vsync_timer_enabled) { DRM_DEBUG("Disable software vsync timer\n"); - hrtimer_cancel(&adev->mode_info.vblank_timer); + hrtimer_cancel(&adev->mode_info.crtcs[crtc]->vblank_timer); } - adev->mode_info.vsync_timer_enabled = state; + adev->mode_info.crtcs[crtc]->vsync_timer_enabled = state; DRM_DEBUG("[FM]set crtc %d vblank interrupt state %d\n", crtc, state); } @@ -804,13 +806,11 @@ static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev, unsigned type, enum amdgpu_interrupt_state state) { - switch (type) { - case AMDGPU_CRTC_IRQ_VBLANK1: - dce_virtual_set_crtc_vblank_interrupt_state(adev, 0, state); - break; - default: - break; - } + if (type > AMDGPU_CRTC_IRQ_VBLANK6) + return -EINVAL; + + dce_virtual_set_crtc_vblank_interrupt_state(adev, type, state); + return 0; } -- 2.5.5 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 16+ messages in thread
[parent not found: <1475255328-21598-7-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org>]
* RE: [PATCH 7/7] drm/amd/amdgpu: For virtual display, enable multi crtcs. (v3) [not found] ` <1475255328-21598-7-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> @ 2016-10-08 8:22 ` Deng, Emily 0 siblings, 0 replies; 16+ messages in thread From: Deng, Emily @ 2016-10-08 8:22 UTC (permalink / raw) To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Deucher, Alexander Reviewed-By: Emily Deng <Emily.Deng@amd.com> > -----Original Message----- > From: Alex Deucher [mailto:alexdeucher@gmail.com] > Sent: Saturday, October 01, 2016 1:09 AM > To: amd-gfx@lists.freedesktop.org > Cc: Deng, Emily <Emily.Deng@amd.com>; Deucher, Alexander > <Alexander.Deucher@amd.com> > Subject: [PATCH 7/7] drm/amd/amdgpu: For virtual display, enable multi > crtcs. (v3) > > From: Emily Deng <Emily.Deng@amd.com> > > Enable multi crtcs for virtual display, user can set the number of crtcs by > amdgpu module parameter virtual_display. > > v2: make timers per crtc > v3: agd: simplify implementation > > Signed-off-by: Alex Deucher <alexander.deucher@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 28 +++++++++++++---- > drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 3 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 5 ++-- > drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 48 +++++++++++++++-------- > ------- > 4 files changed, 52 insertions(+), 32 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > index 13caa52..91dc851 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > @@ -1238,20 +1238,38 @@ static void > amdgpu_device_enable_virtual_display(struct amdgpu_device *adev) > if (amdgpu_virtual_display) { > struct drm_device *ddev = adev->ddev; > const char *pci_address_name = pci_name(ddev->pdev); > - char *pciaddstr, *pciaddstr_tmp, *pciaddname; > + char *pciaddstr, *pciaddstr_tmp, *pciaddname_tmp, > *pciaddname; > > pciaddstr = kstrdup(amdgpu_virtual_display, GFP_KERNEL); > pciaddstr_tmp = pciaddstr; > - while ((pciaddname = strsep(&pciaddstr_tmp, ";"))) { > + while ((pciaddname_tmp = strsep(&pciaddstr_tmp, ";"))) { > + pciaddname = strsep(&pciaddname_tmp, ","); > if (!strcmp(pci_address_name, pciaddname)) { > + long num_crtc; > + int res = -1; > + > adev->enable_virtual_display = true; > + > + if (pciaddname_tmp) > + res = kstrtol(pciaddname_tmp, 10, > + &num_crtc); > + > + if (!res) { > + if (num_crtc < 1) > + num_crtc = 1; > + if (num_crtc > 6) > + num_crtc = 6; > + adev->mode_info.num_crtc = > num_crtc; > + } else { > + adev->mode_info.num_crtc = 1; > + } > break; > } > } > > - DRM_INFO("virtual display > string:%s, %s:virtual_display:%d\n", > - amdgpu_virtual_display, pci_address_name, > - adev->enable_virtual_display); > + DRM_INFO("virtual display string:%s, %s:virtual_display:%d, > num_crtc:%d\n", > + amdgpu_virtual_display, pci_address_name, > + adev->enable_virtual_display, adev- > >mode_info.num_crtc); > > kfree(pciaddstr); > } > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c > index 728e8ca..721ef24 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c > @@ -201,7 +201,8 @@ module_param_named(pg_mask, amdgpu_pg_mask, > uint, 0444); MODULE_PARM_DESC(disable_cu, "Disable CUs (se.sh.cu,...)"); > module_param_named(disable_cu, amdgpu_disable_cu, charp, 0444); > > -MODULE_PARM_DESC(virtual_display, "Enable virtual display feature (the > virtual_display will be set like xxxx:xx:xx.x;xxxx:xx:xx.x)"); > +MODULE_PARM_DESC(virtual_display, > + "Enable virtual display feature (the virtual_display will be set > +like xxxx:xx:xx.x,x;xxxx:xx:xx.x,x)"); > module_param_named(virtual_display, amdgpu_virtual_display, charp, > 0444); > > static const struct pci_device_id pciidlist[] = { diff --git > a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h > b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h > index 7b0eff7..1e23334 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h > @@ -341,8 +341,6 @@ struct amdgpu_mode_info { > int num_dig; /* number of dig blocks */ > int disp_priority; > const struct amdgpu_display_funcs *funcs; > - struct hrtimer vblank_timer; > - enum amdgpu_interrupt_state vsync_timer_enabled; > }; > > #define AMDGPU_MAX_BL_LEVEL 0xFF > @@ -413,6 +411,9 @@ struct amdgpu_crtc { > u32 wm_high; > u32 lb_vblank_lead_lines; > struct drm_display_mode hw_mode; > + /* for virtual dce */ > + struct hrtimer vblank_timer; > + enum amdgpu_interrupt_state vsync_timer_enabled; > }; > > struct amdgpu_encoder_atom_dig { > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > index 0c8b21e..682e066 100644 > --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > @@ -335,6 +335,7 @@ static int dce_virtual_crtc_init(struct amdgpu_device > *adev, int index) > amdgpu_crtc->pll_id = ATOM_PPLL_INVALID; > amdgpu_crtc->encoder = NULL; > amdgpu_crtc->connector = NULL; > + amdgpu_crtc->vsync_timer_enabled = > AMDGPU_IRQ_STATE_DISABLE; > drm_crtc_helper_add(&amdgpu_crtc->base, > &dce_virtual_crtc_helper_funcs); > > return 0; > @@ -344,11 +345,9 @@ static int dce_virtual_early_init(void *handle) { > struct amdgpu_device *adev = (struct amdgpu_device *)handle; > > - adev->mode_info.vsync_timer_enabled = > AMDGPU_IRQ_STATE_DISABLE; > dce_virtual_set_display_funcs(adev); > dce_virtual_set_irq_funcs(adev); > > - adev->mode_info.num_crtc = 1; > adev->mode_info.num_hpd = 1; > adev->mode_info.num_dig = 1; > return 0; > @@ -760,14 +759,13 @@ static int dce_virtual_pageflip(struct > amdgpu_device *adev, > > static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer > *vblank_timer) { > - struct amdgpu_mode_info *mode_info = > - container_of(vblank_timer, struct amdgpu_mode_info , > vblank_timer); > - struct amdgpu_device *adev = > - container_of(mode_info, struct amdgpu_device , > mode_info); > - unsigned crtc = 0; > + struct amdgpu_crtc *amdgpu_crtc = container_of(vblank_timer, > + struct amdgpu_crtc, > vblank_timer); > + struct drm_device *ddev = amdgpu_crtc->base.dev; > + struct amdgpu_device *adev = ddev->dev_private; > > - drm_handle_vblank(adev->ddev, crtc); > - dce_virtual_pageflip(adev, crtc); > + drm_handle_vblank(ddev, amdgpu_crtc->crtc_id); > + dce_virtual_pageflip(adev, amdgpu_crtc->crtc_id); > hrtimer_start(vblank_timer, ktime_set(0, > DCE_VIRTUAL_VBLANK_PERIOD), > HRTIMER_MODE_REL); > > @@ -783,18 +781,22 @@ static void > dce_virtual_set_crtc_vblank_interrupt_state(struct amdgpu_device *ad > return; > } > > - if (state && !adev->mode_info.vsync_timer_enabled) { > + if (state && !adev->mode_info.crtcs[crtc]->vsync_timer_enabled) { > DRM_DEBUG("Enable software vsync timer\n"); > - hrtimer_init(&adev->mode_info.vblank_timer, > CLOCK_MONOTONIC, HRTIMER_MODE_REL); > - hrtimer_set_expires(&adev->mode_info.vblank_timer, > ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD)); > - adev->mode_info.vblank_timer.function = > dce_virtual_vblank_timer_handle; > - hrtimer_start(&adev->mode_info.vblank_timer, ktime_set(0, > DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL); > - } else if (!state && adev->mode_info.vsync_timer_enabled) { > + hrtimer_init(&adev->mode_info.crtcs[crtc]->vblank_timer, > + CLOCK_MONOTONIC, HRTIMER_MODE_REL); > + hrtimer_set_expires(&adev->mode_info.crtcs[crtc]- > >vblank_timer, > + ktime_set(0, > DCE_VIRTUAL_VBLANK_PERIOD)); > + adev->mode_info.crtcs[crtc]->vblank_timer.function = > + dce_virtual_vblank_timer_handle; > + hrtimer_start(&adev->mode_info.crtcs[crtc]->vblank_timer, > + ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), > HRTIMER_MODE_REL); > + } else if (!state && adev->mode_info.crtcs[crtc]- > >vsync_timer_enabled) > +{ > DRM_DEBUG("Disable software vsync timer\n"); > - hrtimer_cancel(&adev->mode_info.vblank_timer); > + hrtimer_cancel(&adev->mode_info.crtcs[crtc]- > >vblank_timer); > } > > - adev->mode_info.vsync_timer_enabled = state; > + adev->mode_info.crtcs[crtc]->vsync_timer_enabled = state; > DRM_DEBUG("[FM]set crtc %d vblank interrupt state %d\n", crtc, > state); } > > @@ -804,13 +806,11 @@ static int dce_virtual_set_crtc_irq_state(struct > amdgpu_device *adev, > unsigned type, > enum amdgpu_interrupt_state state) > { > - switch (type) { > - case AMDGPU_CRTC_IRQ_VBLANK1: > - dce_virtual_set_crtc_vblank_interrupt_state(adev, 0, state); > - break; > - default: > - break; > - } > + if (type > AMDGPU_CRTC_IRQ_VBLANK6) > + return -EINVAL; > + > + dce_virtual_set_crtc_vblank_interrupt_state(adev, type, state); > + > return 0; > } > > -- > 2.5.5 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/7] drm/amdgpu/virtual_dce: drop pageflip_irq funcs [not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> ` (5 preceding siblings ...) 2016-09-30 17:08 ` [PATCH 7/7] drm/amd/amdgpu: For virtual display, enable multi crtcs. (v3) Alex Deucher @ 2016-09-30 17:52 ` Christian König 2016-10-08 8:24 ` Deng, Emily 7 siblings, 0 replies; 16+ messages in thread From: Christian König @ 2016-09-30 17:52 UTC (permalink / raw) To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Alex Deucher Am 30.09.2016 um 19:08 schrieb Alex Deucher: > Never used. > > Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Acked-by: Christian König <christian.koenig@amd.com>. > --- > drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 35 ++++++-------------------------- > 1 file changed, 6 insertions(+), 29 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > index 359fe56..cf43caa 100644 > --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > @@ -209,10 +209,9 @@ static void dce_virtual_crtc_dpms(struct drm_crtc *crtc, int mode) > switch (mode) { > case DRM_MODE_DPMS_ON: > amdgpu_crtc->enabled = true; > - /* Make sure VBLANK and PFLIP interrupts are still enabled */ > + /* Make sure VBLANK interrupts are still enabled */ > type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc->crtc_id); > amdgpu_irq_update(adev, &adev->crtc_irq, type); > - amdgpu_irq_update(adev, &adev->pageflip_irq, type); > drm_vblank_on(dev, amdgpu_crtc->crtc_id); > break; > case DRM_MODE_DPMS_STANDBY: > @@ -672,8 +671,8 @@ static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer *vbla > } > > static void dce_virtual_set_crtc_vblank_interrupt_state(struct amdgpu_device *adev, > - int crtc, > - enum amdgpu_interrupt_state state) > + int crtc, > + enum amdgpu_interrupt_state state) > { > if (crtc >= adev->mode_info.num_crtc) { > DRM_DEBUG("invalid crtc %d\n", crtc); > @@ -697,9 +696,9 @@ static void dce_virtual_set_crtc_vblank_interrupt_state(struct amdgpu_device *ad > > > static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev, > - struct amdgpu_irq_src *source, > - unsigned type, > - enum amdgpu_interrupt_state state) > + struct amdgpu_irq_src *source, > + unsigned type, > + enum amdgpu_interrupt_state state) > { > switch (type) { > case AMDGPU_CRTC_IRQ_VBLANK1: > @@ -726,20 +725,6 @@ static int dce_virtual_crtc_irq(struct amdgpu_device *adev, > return 0; > } > > -static int dce_virtual_set_pageflip_irq_state(struct amdgpu_device *adev, > - struct amdgpu_irq_src *src, > - unsigned type, > - enum amdgpu_interrupt_state state) > -{ > - if (type >= adev->mode_info.num_crtc) { > - DRM_ERROR("invalid pageflip crtc %d\n", type); > - return -EINVAL; > - } > - DRM_DEBUG("[FM]set pageflip irq type %d state %d\n", type, state); > - > - return 0; > -} > - > static int dce_virtual_pageflip_irq(struct amdgpu_device *adev, > struct amdgpu_irq_src *source, > struct amdgpu_iv_entry *entry) > @@ -793,17 +778,9 @@ static const struct amdgpu_irq_src_funcs dce_virtual_crtc_irq_funcs = { > .process = dce_virtual_crtc_irq, > }; > > -static const struct amdgpu_irq_src_funcs dce_virtual_pageflip_irq_funcs = { > - .set = dce_virtual_set_pageflip_irq_state, > - .process = dce_virtual_pageflip_irq, > -}; > - > static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev) > { > adev->crtc_irq.num_types = AMDGPU_CRTC_IRQ_LAST; > adev->crtc_irq.funcs = &dce_virtual_crtc_irq_funcs; > - > - adev->pageflip_irq.num_types = AMDGPU_PAGEFLIP_IRQ_LAST; > - adev->pageflip_irq.funcs = &dce_virtual_pageflip_irq_funcs; > } > _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 16+ messages in thread
* RE: [PATCH 1/7] drm/amdgpu/virtual_dce: drop pageflip_irq funcs [not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> ` (6 preceding siblings ...) 2016-09-30 17:52 ` [PATCH 1/7] drm/amdgpu/virtual_dce: drop pageflip_irq funcs Christian König @ 2016-10-08 8:24 ` Deng, Emily 7 siblings, 0 replies; 16+ messages in thread From: Deng, Emily @ 2016-10-08 8:24 UTC (permalink / raw) To: Alex Deucher, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Deucher, Alexander Reviewed-By: Emily Deng <Emily.Deng@amd.com> > -----Original Message----- > From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf > Of Alex Deucher > Sent: Saturday, October 01, 2016 1:09 AM > To: amd-gfx@lists.freedesktop.org > Cc: Deucher, Alexander <Alexander.Deucher@amd.com> > Subject: [PATCH 1/7] drm/amdgpu/virtual_dce: drop pageflip_irq funcs > > Never used. > > Signed-off-by: Alex Deucher <alexander.deucher@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/dce_virtual.c | 35 ++++++----------------------- > --- > 1 file changed, 6 insertions(+), 29 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > index 359fe56..cf43caa 100644 > --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c > @@ -209,10 +209,9 @@ static void dce_virtual_crtc_dpms(struct drm_crtc > *crtc, int mode) > switch (mode) { > case DRM_MODE_DPMS_ON: > amdgpu_crtc->enabled = true; > - /* Make sure VBLANK and PFLIP interrupts are still enabled */ > + /* Make sure VBLANK interrupts are still enabled */ > type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc- > >crtc_id); > amdgpu_irq_update(adev, &adev->crtc_irq, type); > - amdgpu_irq_update(adev, &adev->pageflip_irq, type); > drm_vblank_on(dev, amdgpu_crtc->crtc_id); > break; > case DRM_MODE_DPMS_STANDBY: > @@ -672,8 +671,8 @@ static enum hrtimer_restart > dce_virtual_vblank_timer_handle(struct hrtimer *vbla } > > static void dce_virtual_set_crtc_vblank_interrupt_state(struct > amdgpu_device *adev, > - int crtc, > - enum > amdgpu_interrupt_state state) > + int crtc, > + enum > amdgpu_interrupt_state state) > { > if (crtc >= adev->mode_info.num_crtc) { > DRM_DEBUG("invalid crtc %d\n", crtc); @@ -697,9 +696,9 > @@ static void dce_virtual_set_crtc_vblank_interrupt_state(struct > amdgpu_device *ad > > > static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev, > - struct amdgpu_irq_src *source, > - unsigned type, > - enum amdgpu_interrupt_state state) > + struct amdgpu_irq_src *source, > + unsigned type, > + enum amdgpu_interrupt_state state) > { > switch (type) { > case AMDGPU_CRTC_IRQ_VBLANK1: > @@ -726,20 +725,6 @@ static int dce_virtual_crtc_irq(struct > amdgpu_device *adev, > return 0; > } > > -static int dce_virtual_set_pageflip_irq_state(struct amdgpu_device *adev, > - struct amdgpu_irq_src *src, > - unsigned type, > - enum amdgpu_interrupt_state > state) > -{ > - if (type >= adev->mode_info.num_crtc) { > - DRM_ERROR("invalid pageflip crtc %d\n", type); > - return -EINVAL; > - } > - DRM_DEBUG("[FM]set pageflip irq type %d state %d\n", type, state); > - > - return 0; > -} > - > static int dce_virtual_pageflip_irq(struct amdgpu_device *adev, > struct amdgpu_irq_src *source, > struct amdgpu_iv_entry *entry) > @@ -793,17 +778,9 @@ static const struct amdgpu_irq_src_funcs > dce_virtual_crtc_irq_funcs = { > .process = dce_virtual_crtc_irq, > }; > > -static const struct amdgpu_irq_src_funcs dce_virtual_pageflip_irq_funcs = { > - .set = dce_virtual_set_pageflip_irq_state, > - .process = dce_virtual_pageflip_irq, > -}; > - > static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev) { > adev->crtc_irq.num_types = AMDGPU_CRTC_IRQ_LAST; > adev->crtc_irq.funcs = &dce_virtual_crtc_irq_funcs; > - > - adev->pageflip_irq.num_types = AMDGPU_PAGEFLIP_IRQ_LAST; > - adev->pageflip_irq.funcs = &dce_virtual_pageflip_irq_funcs; > } > > -- > 2.5.5 > > _______________________________________________ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2016-10-08 8:24 UTC | newest] Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2016-09-30 17:08 [PATCH 1/7] drm/amdgpu/virtual_dce: drop pageflip_irq funcs Alex Deucher [not found] ` <1475255328-21598-1-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> 2016-09-30 17:08 ` [PATCH 2/7] drm/amdgpu/virtual_dce: no need to an irq process callback Alex Deucher [not found] ` <1475255328-21598-2-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> 2016-10-08 8:22 ` Deng, Emily 2016-09-30 17:08 ` [PATCH 3/7] drm/amdgpu/virtual_dce: clean up interrupt handling Alex Deucher [not found] ` <1475255328-21598-3-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> 2016-10-08 8:23 ` Deng, Emily 2016-10-08 8:23 ` Deng, Emily 2016-09-30 17:08 ` [PATCH 4/7] drm/amdgpu: simplify encoder and connector setup Alex Deucher [not found] ` <1475255328-21598-4-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> 2016-10-08 8:22 ` Deng, Emily 2016-09-30 17:08 ` [PATCH 5/7] Revert "drm/amdgpu: Add virtual connector and encoder macros." Alex Deucher [not found] ` <1475255328-21598-5-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> 2016-10-08 8:22 ` Deng, Emily 2016-09-30 17:08 ` [PATCH 6/7] drm/amdgpu: rename amdgpu_whether_enable_virtual_display Alex Deucher [not found] ` <1475255328-21598-6-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> 2016-10-08 8:23 ` Deng, Emily 2016-09-30 17:08 ` [PATCH 7/7] drm/amd/amdgpu: For virtual display, enable multi crtcs. (v3) Alex Deucher [not found] ` <1475255328-21598-7-git-send-email-alexander.deucher-5C7GfCeVMHo@public.gmane.org> 2016-10-08 8:22 ` Deng, Emily 2016-09-30 17:52 ` [PATCH 1/7] drm/amdgpu/virtual_dce: drop pageflip_irq funcs Christian König 2016-10-08 8:24 ` Deng, Emily
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.