<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jan 8, 2013 at 4:18 AM, Mandeep Singh Baines <span dir="ltr"><<a href="mailto:msb@chromium.org" target="_blank">msb@chromium.org</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="im">On Wed, Dec 26, 2012 at 3:27 AM, Prathyush K <<a href="mailto:prathyush.k@samsung.com">prathyush.k@samsung.com</a>> wrote:<br>
</div><div class="im">> The wait_for_vblank interface is modified to the complete_scanout<br>
> function in fimd. This patch adds the fimd_complete_scanout function<br>
><br>
<br>
</div>With this series, you have a race if the rmfb happens before the flip<br>
has completed.<br>
<br></blockquote><div><div>How will there be a race? Can you explain the scenario in more detail?</div><div><br></div><div>If the current fb (fb1) is being removed, (i.e the shadow register has fb1),</div><div>then we wait for vblank before returning. This ensures that the flip has been handled</div>
<div>before remove fb is complete.</div></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Why not just use reference counts as is done in the i915 driver: see unpin_work.<br>
The reference counts also allow you to avoid blocking in rmfb.<br>
<br></blockquote><div style>Will look into it. Thanks.</div><div style><br></div><div style>Regards,</div><div style>Prathyush</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Regards,<br>
Mandeep<br>
<div class=""><div class="h5"><br>
> Inside fimd_complete_scanout, we read the shadow register for each<br>
> window and compare it with the dma address of the framebuffer. If<br>
> the dma_address is in the shadow register, then the function waits<br>
> for the next vblank and returns.<br>
><br>
> Signed-off-by: Prathyush K <<a href="mailto:prathyush.k@samsung.com">prathyush.k@samsung.com</a>><br>
> ---<br>
> drivers/gpu/drm/exynos/exynos_drm_fimd.c | 32 +++++++++++++++++++++++++++++++-<br>
> include/video/samsung_fimd.h | 1 +<br>
> 2 files changed, 32 insertions(+), 1 deletion(-)<br>
><br>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c<br>
> index 3aeedf5..190ffde9 100644<br>
> --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c<br>
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c<br>
> @@ -46,6 +46,7 @@<br>
> #define VIDOSD_D(win) (VIDOSD_BASE + 0x0C + (win) * 16)<br>
><br>
> #define VIDWx_BUF_START(win, buf) (VIDW_BUF_START(buf) + (win) * 8)<br>
> +#define VIDWx_BUF_START_S(win, buf) (VIDW_BUF_START_S(buf) + (win) * 8)<br>
> #define VIDWx_BUF_END(win, buf) (VIDW_BUF_END(buf) + (win) * 8)<br>
> #define VIDWx_BUF_SIZE(win, buf) (VIDW_BUF_SIZE(buf) + (win) * 4)<br>
><br>
> @@ -363,13 +364,42 @@ static void fimd_wait_for_vblank(struct device *dev)<br>
> fimd_disable_vblank(dev);<br>
> }<br>
><br>
> +static void fimd_complete_scanout(struct device *dev, dma_addr_t dma_addr,<br>
> + unsigned long size)<br>
> +{<br>
> + struct fimd_context *ctx = get_fimd_context(dev);<br>
> + int win;<br>
> + bool in_use = false;<br>
> +<br>
> + if (ctx->suspended)<br>
> + return;<br>
> +<br>
> + for (win = 0; win < WINDOWS_NR; win++) {<br>
> + dma_addr_t dma_addr_in_use;<br>
> +<br>
> + if (!ctx->win_data[win].enabled)<br>
> + continue;<br>
> +<br>
> + dma_addr_in_use = readl(ctx->regs + VIDWx_BUF_START_S(win, 0));<br>
> + if (dma_addr_in_use >= dma_addr &&<br>
> + dma_addr_in_use < (dma_addr + size)) {<br>
> + in_use = true;<br>
> + break;<br>
> + }<br>
> + }<br>
> +<br>
> + if (in_use)<br>
> + fimd_wait_for_vblank(dev);<br>
> + return;<br>
> +}<br>
> +<br>
> static struct exynos_drm_manager_ops fimd_manager_ops = {<br>
> .dpms = fimd_dpms,<br>
> .apply = fimd_apply,<br>
> .commit = fimd_commit,<br>
> .enable_vblank = fimd_enable_vblank,<br>
> .disable_vblank = fimd_disable_vblank,<br>
> - .wait_for_vblank = fimd_wait_for_vblank,<br>
> + .complete_scanout = fimd_complete_scanout,<br>
> };<br>
><br>
> static void fimd_win_mode_set(struct device *dev,<br>
> diff --git a/include/video/samsung_fimd.h b/include/video/samsung_fimd.h<br>
> index 7ae6c07..382eaec 100644<br>
> --- a/include/video/samsung_fimd.h<br>
> +++ b/include/video/samsung_fimd.h<br>
> @@ -274,6 +274,7 @@<br>
><br>
> /* Video buffer addresses */<br>
> #define VIDW_BUF_START(_buff) (0xA0 + ((_buff) * 8))<br>
> +#define VIDW_BUF_START_S(_buff) (0x40A0 + ((_buff) * 8))<br>
> #define VIDW_BUF_START1(_buff) (0xA4 + ((_buff) * 8))<br>
> #define VIDW_BUF_END(_buff) (0xD0 + ((_buff) * 8))<br>
> #define VIDW_BUF_END1(_buff) (0xD4 + ((_buff) * 8))<br>
> --<br>
> 1.8.0<br>
><br>
> _______________________________________________<br>
> dri-devel mailing list<br>
> <a href="mailto:dri-devel@lists.freedesktop.org">dri-devel@lists.freedesktop.org</a><br>
> <a href="http://lists.freedesktop.org/mailman/listinfo/dri-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/dri-devel</a><br>
_______________________________________________<br>
dri-devel mailing list<br>
<a href="mailto:dri-devel@lists.freedesktop.org">dri-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/dri-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/dri-devel</a><br>
</div></div></blockquote></div><br></div></div>