From: Archit Taneja <a0393947@ti.com>
To: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: linux-fbdev@vger.kernel.org, linux-omap@vger.kernel.org, archit@ti.com
Subject: Re: [PATCH 06/65] OMAPDSS: remove partial update from the overlay
Date: Tue, 22 Nov 2011 11:53:53 +0000 [thread overview]
Message-ID: <4ECB8A81.9090701@ti.com> (raw)
In-Reply-To: <1321953724-6350-7-git-send-email-tomi.valkeinen@ti.com>
On Tuesday 22 November 2011 02:51 PM, Tomi Valkeinen wrote:
> Partial update for manual update displays has never worked quite well:
> * The HW has limitations on the update area, and the x and width need to
> be even.
There are also some issues with partial update on OMAP4 even when 'x and
width are even'. There seems to be DISPC timeouts when the update area
is too small. Its easy to reproduce it by running the 'rect' test for a
while. For those who are interested, the rect testcase can be found in:
git://gitorious.org/linux-omap-dss2/omapfb-tests.git
Archit
> * Showing a part of a scaled overlay causes artifacts.
> * Makes the management of dispc very complex
>
> Considering the above points and the fact that partial update is not
> used anywhere, this and the following patches remove the partial update
> support. This will greatly simplify the following re-write of the apply
> mechanism to get proper locking and additional features like fifo-merge.
>
> This patch removes the partial update from the manager.c.
>
> Signed-off-by: Tomi Valkeinen<tomi.valkeinen@ti.com>
> ---
> drivers/video/omap2/dss/dsi.c | 2 -
> drivers/video/omap2/dss/dss.h | 3 -
> drivers/video/omap2/dss/manager.c | 333 +------------------------------------
> drivers/video/omap2/dss/rfbi.c | 1 -
> 4 files changed, 6 insertions(+), 333 deletions(-)
>
> diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
> index 5abf8e7..787cebd 100644
> --- a/drivers/video/omap2/dss/dsi.c
> +++ b/drivers/video/omap2/dss/dsi.c
> @@ -4172,8 +4172,6 @@ int omap_dsi_prepare_update(struct omap_dss_device *dssdev,
>
> dsi_perf_mark_setup(dsidev);
>
> - dss_setup_partial_planes(dssdev, x, y, w, h,
> - enlarge_update_area);
> dispc_mgr_set_lcd_size(dssdev->manager->id, *w, *h);
>
> return 0;
> diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
> index 313a7ca..7f6a612 100644
> --- a/drivers/video/omap2/dss/dss.h
> +++ b/drivers/video/omap2/dss/dss.h
> @@ -182,9 +182,6 @@ void default_get_overlay_fifo_thresholds(enum omap_plane plane,
> int dss_init_overlay_managers(struct platform_device *pdev);
> void dss_uninit_overlay_managers(struct platform_device *pdev);
> int dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl);
> -void dss_setup_partial_planes(struct omap_dss_device *dssdev,
> - u16 *x, u16 *y, u16 *w, u16 *h,
> - bool enlarge_update_area);
> void dss_start_update(struct omap_dss_device *dssdev);
>
> /* overlay */
> diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
> index 1be5f47..c616f85 100644
> --- a/drivers/video/omap2/dss/manager.c
> +++ b/drivers/video/omap2/dss/manager.c
> @@ -530,13 +530,6 @@ struct manager_cache_data {
>
> bool manual_update;
> bool do_manual_update;
> -
> - /* manual update region */
> - u16 x, y, w, h;
> -
> - /* enlarge the update area if the update area contains scaled
> - * overlays */
> - bool enlarge_update_area;
> };
>
> static struct {
> @@ -762,65 +755,11 @@ static int overlay_enabled(struct omap_overlay *ovl)
> return ovl->info.enabled&& ovl->manager&& ovl->manager->device;
> }
>
> -/* Is rect1 a subset of rect2? */
> -static bool rectangle_subset(int x1, int y1, int w1, int h1,
> - int x2, int y2, int w2, int h2)
> -{
> - if (x1< x2 || y1< y2)
> - return false;
> -
> - if (x1 + w1> x2 + w2)
> - return false;
> -
> - if (y1 + h1> y2 + h2)
> - return false;
> -
> - return true;
> -}
> -
> -/* Do rect1 and rect2 overlap? */
> -static bool rectangle_intersects(int x1, int y1, int w1, int h1,
> - int x2, int y2, int w2, int h2)
> -{
> - if (x1>= x2 + w2)
> - return false;
> -
> - if (x2>= x1 + w1)
> - return false;
> -
> - if (y1>= y2 + h2)
> - return false;
> -
> - if (y2>= y1 + h1)
> - return false;
> -
> - return true;
> -}
> -
> -static bool dispc_is_overlay_scaled(struct overlay_cache_data *oc)
> -{
> - struct omap_overlay_info *oi =&oc->info;
> -
> - if (oi->out_width != 0&& oi->width != oi->out_width)
> - return true;
> -
> - if (oi->out_height != 0&& oi->height != oi->out_height)
> - return true;
> -
> - return false;
> -}
> -
> static int configure_overlay(enum omap_plane plane)
> {
> struct overlay_cache_data *c;
> - struct manager_cache_data *mc;
> - struct omap_overlay_info *oi, new_oi;
> - struct omap_overlay_manager_info *mi;
> - u16 outw, outh;
> - u16 x, y, w, h;
> - u32 paddr;
> + struct omap_overlay_info *oi;
> int r;
> - u16 orig_w, orig_h, orig_outw, orig_outh;
>
> DSSDBGF("%d", plane);
>
> @@ -832,120 +771,7 @@ static int configure_overlay(enum omap_plane plane)
> return 0;
> }
>
> - mc =&dss_cache.manager_cache[c->channel];
> - mi =&mc->info;
> -
> - x = oi->pos_x;
> - y = oi->pos_y;
> - w = oi->width;
> - h = oi->height;
> - outw = oi->out_width = 0 ? oi->width : oi->out_width;
> - outh = oi->out_height = 0 ? oi->height : oi->out_height;
> - paddr = oi->paddr;
> -
> - orig_w = w;
> - orig_h = h;
> - orig_outw = outw;
> - orig_outh = outh;
> -
> - if (mc->manual_update&& mc->do_manual_update) {
> - unsigned bpp;
> - unsigned scale_x_m = w, scale_x_d = outw;
> - unsigned scale_y_m = h, scale_y_d = outh;
> -
> - /* If the overlay is outside the update region, disable it */
> - if (!rectangle_intersects(mc->x, mc->y, mc->w, mc->h,
> - x, y, outw, outh)) {
> - dispc_ovl_enable(plane, 0);
> - return 0;
> - }
> -
> - switch (oi->color_mode) {
> - case OMAP_DSS_COLOR_NV12:
> - bpp = 8;
> - break;
> - case OMAP_DSS_COLOR_RGB16:
> - case OMAP_DSS_COLOR_ARGB16:
> - case OMAP_DSS_COLOR_YUV2:
> - case OMAP_DSS_COLOR_UYVY:
> - case OMAP_DSS_COLOR_RGBA16:
> - case OMAP_DSS_COLOR_RGBX16:
> - case OMAP_DSS_COLOR_ARGB16_1555:
> - case OMAP_DSS_COLOR_XRGB16_1555:
> - bpp = 16;
> - break;
> -
> - case OMAP_DSS_COLOR_RGB24P:
> - bpp = 24;
> - break;
> -
> - case OMAP_DSS_COLOR_RGB24U:
> - case OMAP_DSS_COLOR_ARGB32:
> - case OMAP_DSS_COLOR_RGBA32:
> - case OMAP_DSS_COLOR_RGBX32:
> - bpp = 32;
> - break;
> -
> - default:
> - BUG();
> - }
> -
> - if (mc->x> oi->pos_x) {
> - x = 0;
> - outw -= (mc->x - oi->pos_x);
> - paddr += (mc->x - oi->pos_x) *
> - scale_x_m / scale_x_d * bpp / 8;
> - } else {
> - x = oi->pos_x - mc->x;
> - }
> -
> - if (mc->y> oi->pos_y) {
> - y = 0;
> - outh -= (mc->y - oi->pos_y);
> - paddr += (mc->y - oi->pos_y) *
> - scale_y_m / scale_y_d *
> - oi->screen_width * bpp / 8;
> - } else {
> - y = oi->pos_y - mc->y;
> - }
> -
> - if (mc->w< (x + outw))
> - outw -= (x + outw) - (mc->w);
> -
> - if (mc->h< (y + outh))
> - outh -= (y + outh) - (mc->h);
> -
> - w = w * outw / orig_outw;
> - h = h * outh / orig_outh;
> -
> - /* YUV mode overlay's input width has to be even and the
> - * algorithm above may adjust the width to be odd.
> - *
> - * Here we adjust the width if needed, preferring to increase
> - * the width if the original width was bigger.
> - */
> - if ((w& 1)&&
> - (oi->color_mode = OMAP_DSS_COLOR_YUV2 ||
> - oi->color_mode = OMAP_DSS_COLOR_UYVY)) {
> - if (orig_w> w)
> - w += 1;
> - else
> - w -= 1;
> - }
> - }
> -
> - new_oi = *oi;
> -
> - /* update new_oi members which could have been possibly updated */
> - new_oi.pos_x = x;
> - new_oi.pos_y = y;
> - new_oi.width = w;
> - new_oi.height = h;
> - new_oi.out_width = outw;
> - new_oi.out_height = outh;
> - new_oi.paddr = paddr;
> -
> - r = dispc_ovl_setup(plane,&new_oi, c->ilace, c->channel,
> + r = dispc_ovl_setup(plane, oi, c->ilace, c->channel,
> c->replication, c->fifo_low, c->fifo_high);
> if (r) {
> /* this shouldn't happen */
> @@ -1070,170 +896,23 @@ static int configure_dispc(void)
> return r;
> }
>
> -/* Make the coordinates even. There are some strange problems with OMAP and
> - * partial DSI update when the update widths are odd. */
> -static void make_even(u16 *x, u16 *w)
> -{
> - u16 x1, x2;
> -
> - x1 = *x;
> - x2 = *x + *w;
> -
> - x1&= ~1;
> - x2 = ALIGN(x2, 2);
> -
> - *x = x1;
> - *w = x2 - x1;
> -}
> -
> -/* Configure dispc for partial update. Return possibly modified update
> - * area */
> -void dss_setup_partial_planes(struct omap_dss_device *dssdev,
> - u16 *xi, u16 *yi, u16 *wi, u16 *hi, bool enlarge_update_area)
> +void dss_start_update(struct omap_dss_device *dssdev)
> {
> - struct overlay_cache_data *oc;
> struct manager_cache_data *mc;
> - struct omap_overlay_info *oi;
> + struct overlay_cache_data *oc;
> const int num_ovls = dss_feat_get_num_ovls();
> + const int num_mgrs = dss_feat_get_num_mgrs();
> struct omap_overlay_manager *mgr;
> int i;
> - u16 x, y, w, h;
> - unsigned long flags;
> - bool area_changed;
> -
> - x = *xi;
> - y = *yi;
> - w = *wi;
> - h = *hi;
> -
> - DSSDBG("dispc_setup_partial_planes %d,%d %dx%d\n",
> - *xi, *yi, *wi, *hi);
>
> mgr = dssdev->manager;
>
> - if (!mgr) {
> - DSSDBG("no manager\n");
> - return;
> - }
> -
> - make_even(&x,&w);
> -
> - spin_lock_irqsave(&dss_cache.lock, flags);
> -
> - /*
> - * Execute the outer loop until the inner loop has completed
> - * once without increasing the update area. This will ensure that
> - * all scaled overlays end up completely within the update area.
> - */
> - do {
> - area_changed = false;
> -
> - /* We need to show the whole overlay if it is scaled. So look
> - * for those, and make the update area larger if found.
> - * Also mark the overlay cache dirty */
> - for (i = 0; i< num_ovls; ++i) {
> - unsigned x1, y1, x2, y2;
> - unsigned outw, outh;
> -
> - oc =&dss_cache.overlay_cache[i];
> - oi =&oc->info;
> -
> - if (oc->channel != mgr->id)
> - continue;
> -
> - oc->dirty = true;
> -
> - if (!enlarge_update_area)
> - continue;
> -
> - if (!oc->enabled)
> - continue;
> -
> - if (!dispc_is_overlay_scaled(oc))
> - continue;
> -
> - outw = oi->out_width = 0 ?
> - oi->width : oi->out_width;
> - outh = oi->out_height = 0 ?
> - oi->height : oi->out_height;
> -
> - /* is the overlay outside the update region? */
> - if (!rectangle_intersects(x, y, w, h,
> - oi->pos_x, oi->pos_y,
> - outw, outh))
> - continue;
> -
> - /* if the overlay totally inside the update region? */
> - if (rectangle_subset(oi->pos_x, oi->pos_y, outw, outh,
> - x, y, w, h))
> - continue;
> -
> - if (x> oi->pos_x)
> - x1 = oi->pos_x;
> - else
> - x1 = x;
> -
> - if (y> oi->pos_y)
> - y1 = oi->pos_y;
> - else
> - y1 = y;
> -
> - if ((x + w)< (oi->pos_x + outw))
> - x2 = oi->pos_x + outw;
> - else
> - x2 = x + w;
> -
> - if ((y + h)< (oi->pos_y + outh))
> - y2 = oi->pos_y + outh;
> - else
> - y2 = y + h;
> -
> - x = x1;
> - y = y1;
> - w = x2 - x1;
> - h = y2 - y1;
> -
> - make_even(&x,&w);
> -
> - DSSDBG("changing upd area due to ovl(%d) "
> - "scaling %d,%d %dx%d\n",
> - i, x, y, w, h);
> -
> - area_changed = true;
> - }
> - } while (area_changed);
> -
> mc =&dss_cache.manager_cache[mgr->id];
> - mc->do_manual_update = true;
> - mc->enlarge_update_area = enlarge_update_area;
> - mc->x = x;
> - mc->y = y;
> - mc->w = w;
> - mc->h = h;
>
> + mc->do_manual_update = true;
> configure_dispc();
> -
> mc->do_manual_update = false;
>
> - spin_unlock_irqrestore(&dss_cache.lock, flags);
> -
> - *xi = x;
> - *yi = y;
> - *wi = w;
> - *hi = h;
> -}
> -
> -void dss_start_update(struct omap_dss_device *dssdev)
> -{
> - struct manager_cache_data *mc;
> - struct overlay_cache_data *oc;
> - const int num_ovls = dss_feat_get_num_ovls();
> - const int num_mgrs = dss_feat_get_num_mgrs();
> - struct omap_overlay_manager *mgr;
> - int i;
> -
> - mgr = dssdev->manager;
> -
> for (i = 0; i< num_ovls; ++i) {
> oc =&dss_cache.overlay_cache[i];
> if (oc->channel != mgr->id)
> diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c
> index 1130c60..814bb95 100644
> --- a/drivers/video/omap2/dss/rfbi.c
> +++ b/drivers/video/omap2/dss/rfbi.c
> @@ -784,7 +784,6 @@ int omap_rfbi_prepare_update(struct omap_dss_device *dssdev,
> if (*w = 0 || *h = 0)
> return -EINVAL;
>
> - dss_setup_partial_planes(dssdev, x, y, w, h, true);
> dispc_mgr_set_lcd_size(dssdev->manager->id, *w, *h);
>
> return 0;
WARNING: multiple messages have this Message-ID (diff)
From: Archit Taneja <a0393947@ti.com>
To: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: linux-fbdev@vger.kernel.org, linux-omap@vger.kernel.org, archit@ti.com
Subject: Re: [PATCH 06/65] OMAPDSS: remove partial update from the overlay manager
Date: Tue, 22 Nov 2011 17:11:53 +0530 [thread overview]
Message-ID: <4ECB8A81.9090701@ti.com> (raw)
In-Reply-To: <1321953724-6350-7-git-send-email-tomi.valkeinen@ti.com>
On Tuesday 22 November 2011 02:51 PM, Tomi Valkeinen wrote:
> Partial update for manual update displays has never worked quite well:
> * The HW has limitations on the update area, and the x and width need to
> be even.
There are also some issues with partial update on OMAP4 even when 'x and
width are even'. There seems to be DISPC timeouts when the update area
is too small. Its easy to reproduce it by running the 'rect' test for a
while. For those who are interested, the rect testcase can be found in:
git://gitorious.org/linux-omap-dss2/omapfb-tests.git
Archit
> * Showing a part of a scaled overlay causes artifacts.
> * Makes the management of dispc very complex
>
> Considering the above points and the fact that partial update is not
> used anywhere, this and the following patches remove the partial update
> support. This will greatly simplify the following re-write of the apply
> mechanism to get proper locking and additional features like fifo-merge.
>
> This patch removes the partial update from the manager.c.
>
> Signed-off-by: Tomi Valkeinen<tomi.valkeinen@ti.com>
> ---
> drivers/video/omap2/dss/dsi.c | 2 -
> drivers/video/omap2/dss/dss.h | 3 -
> drivers/video/omap2/dss/manager.c | 333 +------------------------------------
> drivers/video/omap2/dss/rfbi.c | 1 -
> 4 files changed, 6 insertions(+), 333 deletions(-)
>
> diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
> index 5abf8e7..787cebd 100644
> --- a/drivers/video/omap2/dss/dsi.c
> +++ b/drivers/video/omap2/dss/dsi.c
> @@ -4172,8 +4172,6 @@ int omap_dsi_prepare_update(struct omap_dss_device *dssdev,
>
> dsi_perf_mark_setup(dsidev);
>
> - dss_setup_partial_planes(dssdev, x, y, w, h,
> - enlarge_update_area);
> dispc_mgr_set_lcd_size(dssdev->manager->id, *w, *h);
>
> return 0;
> diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
> index 313a7ca..7f6a612 100644
> --- a/drivers/video/omap2/dss/dss.h
> +++ b/drivers/video/omap2/dss/dss.h
> @@ -182,9 +182,6 @@ void default_get_overlay_fifo_thresholds(enum omap_plane plane,
> int dss_init_overlay_managers(struct platform_device *pdev);
> void dss_uninit_overlay_managers(struct platform_device *pdev);
> int dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl);
> -void dss_setup_partial_planes(struct omap_dss_device *dssdev,
> - u16 *x, u16 *y, u16 *w, u16 *h,
> - bool enlarge_update_area);
> void dss_start_update(struct omap_dss_device *dssdev);
>
> /* overlay */
> diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
> index 1be5f47..c616f85 100644
> --- a/drivers/video/omap2/dss/manager.c
> +++ b/drivers/video/omap2/dss/manager.c
> @@ -530,13 +530,6 @@ struct manager_cache_data {
>
> bool manual_update;
> bool do_manual_update;
> -
> - /* manual update region */
> - u16 x, y, w, h;
> -
> - /* enlarge the update area if the update area contains scaled
> - * overlays */
> - bool enlarge_update_area;
> };
>
> static struct {
> @@ -762,65 +755,11 @@ static int overlay_enabled(struct omap_overlay *ovl)
> return ovl->info.enabled&& ovl->manager&& ovl->manager->device;
> }
>
> -/* Is rect1 a subset of rect2? */
> -static bool rectangle_subset(int x1, int y1, int w1, int h1,
> - int x2, int y2, int w2, int h2)
> -{
> - if (x1< x2 || y1< y2)
> - return false;
> -
> - if (x1 + w1> x2 + w2)
> - return false;
> -
> - if (y1 + h1> y2 + h2)
> - return false;
> -
> - return true;
> -}
> -
> -/* Do rect1 and rect2 overlap? */
> -static bool rectangle_intersects(int x1, int y1, int w1, int h1,
> - int x2, int y2, int w2, int h2)
> -{
> - if (x1>= x2 + w2)
> - return false;
> -
> - if (x2>= x1 + w1)
> - return false;
> -
> - if (y1>= y2 + h2)
> - return false;
> -
> - if (y2>= y1 + h1)
> - return false;
> -
> - return true;
> -}
> -
> -static bool dispc_is_overlay_scaled(struct overlay_cache_data *oc)
> -{
> - struct omap_overlay_info *oi =&oc->info;
> -
> - if (oi->out_width != 0&& oi->width != oi->out_width)
> - return true;
> -
> - if (oi->out_height != 0&& oi->height != oi->out_height)
> - return true;
> -
> - return false;
> -}
> -
> static int configure_overlay(enum omap_plane plane)
> {
> struct overlay_cache_data *c;
> - struct manager_cache_data *mc;
> - struct omap_overlay_info *oi, new_oi;
> - struct omap_overlay_manager_info *mi;
> - u16 outw, outh;
> - u16 x, y, w, h;
> - u32 paddr;
> + struct omap_overlay_info *oi;
> int r;
> - u16 orig_w, orig_h, orig_outw, orig_outh;
>
> DSSDBGF("%d", plane);
>
> @@ -832,120 +771,7 @@ static int configure_overlay(enum omap_plane plane)
> return 0;
> }
>
> - mc =&dss_cache.manager_cache[c->channel];
> - mi =&mc->info;
> -
> - x = oi->pos_x;
> - y = oi->pos_y;
> - w = oi->width;
> - h = oi->height;
> - outw = oi->out_width == 0 ? oi->width : oi->out_width;
> - outh = oi->out_height == 0 ? oi->height : oi->out_height;
> - paddr = oi->paddr;
> -
> - orig_w = w;
> - orig_h = h;
> - orig_outw = outw;
> - orig_outh = outh;
> -
> - if (mc->manual_update&& mc->do_manual_update) {
> - unsigned bpp;
> - unsigned scale_x_m = w, scale_x_d = outw;
> - unsigned scale_y_m = h, scale_y_d = outh;
> -
> - /* If the overlay is outside the update region, disable it */
> - if (!rectangle_intersects(mc->x, mc->y, mc->w, mc->h,
> - x, y, outw, outh)) {
> - dispc_ovl_enable(plane, 0);
> - return 0;
> - }
> -
> - switch (oi->color_mode) {
> - case OMAP_DSS_COLOR_NV12:
> - bpp = 8;
> - break;
> - case OMAP_DSS_COLOR_RGB16:
> - case OMAP_DSS_COLOR_ARGB16:
> - case OMAP_DSS_COLOR_YUV2:
> - case OMAP_DSS_COLOR_UYVY:
> - case OMAP_DSS_COLOR_RGBA16:
> - case OMAP_DSS_COLOR_RGBX16:
> - case OMAP_DSS_COLOR_ARGB16_1555:
> - case OMAP_DSS_COLOR_XRGB16_1555:
> - bpp = 16;
> - break;
> -
> - case OMAP_DSS_COLOR_RGB24P:
> - bpp = 24;
> - break;
> -
> - case OMAP_DSS_COLOR_RGB24U:
> - case OMAP_DSS_COLOR_ARGB32:
> - case OMAP_DSS_COLOR_RGBA32:
> - case OMAP_DSS_COLOR_RGBX32:
> - bpp = 32;
> - break;
> -
> - default:
> - BUG();
> - }
> -
> - if (mc->x> oi->pos_x) {
> - x = 0;
> - outw -= (mc->x - oi->pos_x);
> - paddr += (mc->x - oi->pos_x) *
> - scale_x_m / scale_x_d * bpp / 8;
> - } else {
> - x = oi->pos_x - mc->x;
> - }
> -
> - if (mc->y> oi->pos_y) {
> - y = 0;
> - outh -= (mc->y - oi->pos_y);
> - paddr += (mc->y - oi->pos_y) *
> - scale_y_m / scale_y_d *
> - oi->screen_width * bpp / 8;
> - } else {
> - y = oi->pos_y - mc->y;
> - }
> -
> - if (mc->w< (x + outw))
> - outw -= (x + outw) - (mc->w);
> -
> - if (mc->h< (y + outh))
> - outh -= (y + outh) - (mc->h);
> -
> - w = w * outw / orig_outw;
> - h = h * outh / orig_outh;
> -
> - /* YUV mode overlay's input width has to be even and the
> - * algorithm above may adjust the width to be odd.
> - *
> - * Here we adjust the width if needed, preferring to increase
> - * the width if the original width was bigger.
> - */
> - if ((w& 1)&&
> - (oi->color_mode == OMAP_DSS_COLOR_YUV2 ||
> - oi->color_mode == OMAP_DSS_COLOR_UYVY)) {
> - if (orig_w> w)
> - w += 1;
> - else
> - w -= 1;
> - }
> - }
> -
> - new_oi = *oi;
> -
> - /* update new_oi members which could have been possibly updated */
> - new_oi.pos_x = x;
> - new_oi.pos_y = y;
> - new_oi.width = w;
> - new_oi.height = h;
> - new_oi.out_width = outw;
> - new_oi.out_height = outh;
> - new_oi.paddr = paddr;
> -
> - r = dispc_ovl_setup(plane,&new_oi, c->ilace, c->channel,
> + r = dispc_ovl_setup(plane, oi, c->ilace, c->channel,
> c->replication, c->fifo_low, c->fifo_high);
> if (r) {
> /* this shouldn't happen */
> @@ -1070,170 +896,23 @@ static int configure_dispc(void)
> return r;
> }
>
> -/* Make the coordinates even. There are some strange problems with OMAP and
> - * partial DSI update when the update widths are odd. */
> -static void make_even(u16 *x, u16 *w)
> -{
> - u16 x1, x2;
> -
> - x1 = *x;
> - x2 = *x + *w;
> -
> - x1&= ~1;
> - x2 = ALIGN(x2, 2);
> -
> - *x = x1;
> - *w = x2 - x1;
> -}
> -
> -/* Configure dispc for partial update. Return possibly modified update
> - * area */
> -void dss_setup_partial_planes(struct omap_dss_device *dssdev,
> - u16 *xi, u16 *yi, u16 *wi, u16 *hi, bool enlarge_update_area)
> +void dss_start_update(struct omap_dss_device *dssdev)
> {
> - struct overlay_cache_data *oc;
> struct manager_cache_data *mc;
> - struct omap_overlay_info *oi;
> + struct overlay_cache_data *oc;
> const int num_ovls = dss_feat_get_num_ovls();
> + const int num_mgrs = dss_feat_get_num_mgrs();
> struct omap_overlay_manager *mgr;
> int i;
> - u16 x, y, w, h;
> - unsigned long flags;
> - bool area_changed;
> -
> - x = *xi;
> - y = *yi;
> - w = *wi;
> - h = *hi;
> -
> - DSSDBG("dispc_setup_partial_planes %d,%d %dx%d\n",
> - *xi, *yi, *wi, *hi);
>
> mgr = dssdev->manager;
>
> - if (!mgr) {
> - DSSDBG("no manager\n");
> - return;
> - }
> -
> - make_even(&x,&w);
> -
> - spin_lock_irqsave(&dss_cache.lock, flags);
> -
> - /*
> - * Execute the outer loop until the inner loop has completed
> - * once without increasing the update area. This will ensure that
> - * all scaled overlays end up completely within the update area.
> - */
> - do {
> - area_changed = false;
> -
> - /* We need to show the whole overlay if it is scaled. So look
> - * for those, and make the update area larger if found.
> - * Also mark the overlay cache dirty */
> - for (i = 0; i< num_ovls; ++i) {
> - unsigned x1, y1, x2, y2;
> - unsigned outw, outh;
> -
> - oc =&dss_cache.overlay_cache[i];
> - oi =&oc->info;
> -
> - if (oc->channel != mgr->id)
> - continue;
> -
> - oc->dirty = true;
> -
> - if (!enlarge_update_area)
> - continue;
> -
> - if (!oc->enabled)
> - continue;
> -
> - if (!dispc_is_overlay_scaled(oc))
> - continue;
> -
> - outw = oi->out_width == 0 ?
> - oi->width : oi->out_width;
> - outh = oi->out_height == 0 ?
> - oi->height : oi->out_height;
> -
> - /* is the overlay outside the update region? */
> - if (!rectangle_intersects(x, y, w, h,
> - oi->pos_x, oi->pos_y,
> - outw, outh))
> - continue;
> -
> - /* if the overlay totally inside the update region? */
> - if (rectangle_subset(oi->pos_x, oi->pos_y, outw, outh,
> - x, y, w, h))
> - continue;
> -
> - if (x> oi->pos_x)
> - x1 = oi->pos_x;
> - else
> - x1 = x;
> -
> - if (y> oi->pos_y)
> - y1 = oi->pos_y;
> - else
> - y1 = y;
> -
> - if ((x + w)< (oi->pos_x + outw))
> - x2 = oi->pos_x + outw;
> - else
> - x2 = x + w;
> -
> - if ((y + h)< (oi->pos_y + outh))
> - y2 = oi->pos_y + outh;
> - else
> - y2 = y + h;
> -
> - x = x1;
> - y = y1;
> - w = x2 - x1;
> - h = y2 - y1;
> -
> - make_even(&x,&w);
> -
> - DSSDBG("changing upd area due to ovl(%d) "
> - "scaling %d,%d %dx%d\n",
> - i, x, y, w, h);
> -
> - area_changed = true;
> - }
> - } while (area_changed);
> -
> mc =&dss_cache.manager_cache[mgr->id];
> - mc->do_manual_update = true;
> - mc->enlarge_update_area = enlarge_update_area;
> - mc->x = x;
> - mc->y = y;
> - mc->w = w;
> - mc->h = h;
>
> + mc->do_manual_update = true;
> configure_dispc();
> -
> mc->do_manual_update = false;
>
> - spin_unlock_irqrestore(&dss_cache.lock, flags);
> -
> - *xi = x;
> - *yi = y;
> - *wi = w;
> - *hi = h;
> -}
> -
> -void dss_start_update(struct omap_dss_device *dssdev)
> -{
> - struct manager_cache_data *mc;
> - struct overlay_cache_data *oc;
> - const int num_ovls = dss_feat_get_num_ovls();
> - const int num_mgrs = dss_feat_get_num_mgrs();
> - struct omap_overlay_manager *mgr;
> - int i;
> -
> - mgr = dssdev->manager;
> -
> for (i = 0; i< num_ovls; ++i) {
> oc =&dss_cache.overlay_cache[i];
> if (oc->channel != mgr->id)
> diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c
> index 1130c60..814bb95 100644
> --- a/drivers/video/omap2/dss/rfbi.c
> +++ b/drivers/video/omap2/dss/rfbi.c
> @@ -784,7 +784,6 @@ int omap_rfbi_prepare_update(struct omap_dss_device *dssdev,
> if (*w == 0 || *h == 0)
> return -EINVAL;
>
> - dss_setup_partial_planes(dssdev, x, y, w, h, true);
> dispc_mgr_set_lcd_size(dssdev->manager->id, *w, *h);
>
> return 0;
next prev parent reply other threads:[~2011-11-22 11:53 UTC|newest]
Thread overview: 182+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-22 9:20 [PATCH 00/65] OMAPDSS: manager/apply improvements Tomi Valkeinen
2011-11-22 9:20 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 01/65] OMAPDSS: DISPC: add missing prototype Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 02/65] OMAPDSS: Remove old fifomerge hacks Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 03/65] OMAPDSS: remove L4_EXAMPLE code Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 04/65] OMAPDSS: DISPC: make dispc_ovl_set_channel_out() public Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 05/65] OMAPDSS: DISPC: make dispc_ovl_set_fifo_threshold() public Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 06/65] OMAPDSS: remove partial update from the overlay manager Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 11:41 ` Archit Taneja [this message]
2011-11-22 11:53 ` [PATCH 06/65] OMAPDSS: remove partial update from the overlay Archit Taneja
2011-11-22 9:21 ` [PATCH 07/65] OMAPDSS: remove partial update from DSI Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 08/65] OMAPDSS: remove partial update from panel-taal Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 11:53 ` Archit Taneja
2011-11-22 11:55 ` Archit Taneja
2011-11-22 12:32 ` Tomi Valkeinen
2011-11-22 12:32 ` Tomi Valkeinen
2011-11-23 5:49 ` Archit Taneja
2011-11-23 5:51 ` Archit Taneja
2011-11-22 9:21 ` [PATCH 09/65] OMAPDSS: pass ovl manager to dss_start_update Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-23 5:53 ` Archit Taneja
2011-11-23 5:55 ` Archit Taneja
2011-11-23 7:32 ` Tomi Valkeinen
2011-11-23 7:32 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 10/65] OMAPDSS: DISPC: handle 0 out_width/out_height in ovl_setup() Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 11/65] OMAPDSS: handle ilace/replication when configuring overlay Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 12/65] OMAPDSS: separate FIFO threshold setup from ovl_setup Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 13/65] OMAPDSS: separate overlay channel " Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 14/65] OMAPDSS: setup manager with dispc_mgr_setup() Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 15/65] OMAPDSS: DISPC: remove unused functions Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 16/65] OMAPDSS: remove unneeded dss_ovl_wait_for_go() Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 17/65] OMAPDSS: add ovl/mgr_manual_update() helpers Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 18/65] OMAPDSS: split omap_dss_mgr_apply() to smaller funcs Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 19/65] OMAPDSS: apply affects only one overlay manager Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 20/65] OMAPDSS: create apply.c Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 21/65] OMAPDSS: hide manager's enable/disable() Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 22/65] OMAPDSS: APPLY: track whether a manager is enabled Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 23/65] OMAPDSS: APPLY: skip isr register and config for manual update displays Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 24/65] OMAPDSS: APPLY: skip isr register and config for disabled displays Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 25/65] OMAPDSS: APPLY: cleanup dss_start_update Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 26/65] OMAPDSS: store overlays in an array Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 27/65] OMAPDSS: store managers " Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 28/65] OMAPDSS: store overlays in a list for each manager Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 29/65] OMAPDSS: APPLY: separate vsync isr register/unregister Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 30/65] OMAPDSS: DISPC: Add dispc_mgr_get_vsync_irq() Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 31/65] OMAPDSS: APPLY: use dispc_mgr_get_vsync_irq() Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 32/65] OMAPDSS: APPLY: configure_* funcs take ovl/manager as args Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 33/65] OMAPDSS: APPLY: rename overlay_cache_data Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 34/65] OMAPDSS: APPLY: rename manager_cache_data Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 35/65] OMAPDSS: APPLY: move spinlock outside the struct Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-23 9:25 ` Archit Taneja
2011-11-23 9:37 ` Archit Taneja
2011-11-23 9:27 ` Archit Taneja
2011-11-23 9:39 ` Archit Taneja
2011-11-23 10:29 ` Sergey Kibrik
2011-11-23 10:29 ` Sergey Kibrik
2011-11-23 10:47 ` Tomi Valkeinen
2011-11-23 10:47 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 36/65] OMAPDSS: APPLY: rename dss_cache to dss_data Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 37/65] OMAPDSS: APPLY: move ovl funcs to apply.c Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 38/65] OMAPDSS: APPLY: move mgr " Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 39/65] OMAPDSS: remove ovl/mgr check-code temporarily Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 40/65] OMAPDSS: APPLY: add mutex Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-23 9:48 ` Archit Taneja
2011-11-23 9:49 ` Archit Taneja
2011-11-23 10:17 ` Tomi Valkeinen
2011-11-23 10:17 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 41/65] OMAPDSS: APPLY: add missing uses of spinlock Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-23 9:56 ` Archit Taneja
2011-11-23 9:57 ` Archit Taneja
2011-11-23 10:12 ` Tomi Valkeinen
2011-11-23 10:12 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 42/65] OMAPDSS: DSI: call mgr_enable/disable for cmd mode displays Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-23 10:10 ` Archit Taneja
2011-11-23 10:22 ` [PATCH 42/65] OMAPDSS: DSI: call mgr_enable/disable for cmd mode Archit Taneja
2011-11-23 10:42 ` [PATCH 42/65] OMAPDSS: DSI: call mgr_enable/disable for cmd Tomi Valkeinen
2011-11-23 10:42 ` [PATCH 42/65] OMAPDSS: DSI: call mgr_enable/disable for cmd mode displays Tomi Valkeinen
2011-11-23 11:08 ` Archit Taneja
2011-11-23 11:20 ` [PATCH 42/65] OMAPDSS: DSI: call mgr_enable/disable for cmd mode Archit Taneja
2011-11-23 11:27 ` [PATCH 42/65] OMAPDSS: DSI: call mgr_enable/disable for cmd Tomi Valkeinen
2011-11-23 11:27 ` [PATCH 42/65] OMAPDSS: DSI: call mgr_enable/disable for cmd mode displays Tomi Valkeinen
2011-11-23 12:13 ` Archit Taneja
2011-11-23 12:25 ` [PATCH 42/65] OMAPDSS: DSI: call mgr_enable/disable for cmd mode Archit Taneja
2011-11-22 9:21 ` [PATCH 43/65] OMAPDSS: APPLY: move mgr->enabled to mgr_priv_data Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 44/65] OMAPDSS: APPLY: add busy field " Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 45/65] OMAPDSS: APPLY: rewrite overlay enable/disable Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 46/65] OMAPDSS: APPLY: rewrite register writing Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 47/65] OMAPDSS: DISPC: add dispc_mgr_get_framedone_irq Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 48/65] OMAPDSS: APPLY: add updating flag Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 49/65] OMAPDSS: APPLY: clean up isr_handler Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 50/65] OMAPDSS: APPLY: move mgr->info to apply.c Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 51/65] OMAPDSS: APPLY: move ovl->info " Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 52/65] OMAPDSS: APPLY: move channel-field to extra_info set Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 53/65] OMAPDSS: APPLY: move fifo thresholds " Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 54/65] OMAPDSS: APPLY: rename dirty & shadow_dirty Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 55/65] OMAPDSS: APPLY: remove device_changed field Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 56/65] OMAPDSS: APPLY: add dss_apply_ovl_enable() Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 57/65] OMAPDSS: APPLY: skip enable/disable if already enabled/disabled Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 58/65] OMAPDSS: APPLY: add wait_pending_extra_info_updates() Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-12-07 13:07 ` Archit Taneja
2011-12-07 13:19 ` Archit Taneja
2011-12-07 13:15 ` [PATCH 58/65] OMAPDSS: APPLY: add Tomi Valkeinen
2011-12-07 13:15 ` [PATCH 58/65] OMAPDSS: APPLY: add wait_pending_extra_info_updates() Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 59/65] OMAPDSS: APPLY: remove runtime_get Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:21 ` [PATCH 60/65] OMAPDSS: Add comments about blocking of ovl/mgr functions Tomi Valkeinen
2011-11-22 9:21 ` Tomi Valkeinen
2011-11-22 9:22 ` [PATCH 61/65] OMAPDSS: APPLY: add dss_ovl_simple_check() Tomi Valkeinen
2011-11-22 9:22 ` Tomi Valkeinen
2011-11-22 9:22 ` [PATCH 62/65] OMAPDSS: APPLY: add dss_mgr_simple_check() Tomi Valkeinen
2011-11-22 9:22 ` Tomi Valkeinen
2011-11-22 9:22 ` [PATCH 63/65] OMAPDSS: APPLY: add checking of ovls/mgrs settings Tomi Valkeinen
2011-11-22 9:22 ` Tomi Valkeinen
2011-12-07 13:05 ` Archit Taneja
2011-12-07 13:17 ` Archit Taneja
2011-12-08 8:29 ` [PATCH 63/65] OMAPDSS: APPLY: add checking of ovls/mgrs Tomi Valkeinen
2011-12-08 8:29 ` [PATCH 63/65] OMAPDSS: APPLY: add checking of ovls/mgrs settings Tomi Valkeinen
2011-12-13 10:02 ` Archit Taneja
2011-12-13 10:14 ` Archit Taneja
2011-12-13 11:16 ` [PATCH 63/65] OMAPDSS: APPLY: add checking of ovls/mgrs Tomi Valkeinen
2011-12-13 11:16 ` [PATCH 63/65] OMAPDSS: APPLY: add checking of ovls/mgrs settings Tomi Valkeinen
2011-11-22 9:22 ` [PATCH 64/65] OMAPDSS: APPLY: add return value to dss_mgr_enable() Tomi Valkeinen
2011-11-22 9:22 ` Tomi Valkeinen
2011-11-22 9:22 ` [PATCH 65/65] OMAPDSS: check the return value of dss_mgr_enable() Tomi Valkeinen
2011-11-22 9:22 ` Tomi Valkeinen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4ECB8A81.9090701@ti.com \
--to=a0393947@ti.com \
--cc=archit@ti.com \
--cc=linux-fbdev@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=tomi.valkeinen@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.