From: Sam Ravnborg <sam@ravnborg.org>
To: Joe Perches <joe@perches.com>
Cc: "Thierry Reding" <thierry.reding@gmail.com>,
"Guido Günther" <agx@sigxcpu.org>,
"David Airlie" <airlied@linux.ie>,
"Daniel Vetter" <daniel@ffwll.ch>,
"Rob Herring" <robh+dt@kernel.org>,
"Mark Rutland" <mark.rutland@arm.com>,
"Kevin Hilman" <khilman@baylibre.com>,
"Manivannan Sadhasivam" <manivannan.sadhasivam@linaro.org>,
"Shawn Guo" <shawnguo@kernel.org>,
"Jagan Teki" <jagan@amarulasolutions.com>,
"Martin Blumenstingl" <martin.blumenstingl@googlemail.com>,
"Johan Hovold" <johan@kernel.org>,
"David S. Miller" <davem@davemloft.net>,
"Mauro Carvalho Chehab" <mchehab+samsung@kernel.org>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Nicolas Ferre" <nicolas.ferre@microchip.com>,
dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org,
linux-kernel@vger.ke
Subject: Re: [PATCH v5 0/3] drm/panel: Support Rocktech jh057n00900 DSI panel
Date: Wed, 3 Apr 2019 23:07:38 +0200 [thread overview]
Message-ID: <20190403210738.GA9173@ravnborg.org> (raw)
In-Reply-To: <c2f6a9f0ea59dc1491a8429a51afe56e488dfb3c.camel@perches.com>
Hi Joe.
Thanks for your patch.
> ---
> drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c | 210 +++++++++++++--------
> 1 file changed, 136 insertions(+), 74 deletions(-)
Hmmm, add more lines than it deletes.
>
> diff --git a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> index 158a6d548068..7862863db5f7 100644
> --- a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> +++ b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> @@ -20,27 +20,6 @@
>
> #define DRV_NAME "panel-rocktech-jh057n00900"
>
> -/* Manufacturer specific Commands send via DSI */
> -#define ST7703_CMD_ALL_PIXEL_OFF 0x22
> -#define ST7703_CMD_ALL_PIXEL_ON 0x23
> -#define ST7703_CMD_SETDISP 0xB2
> -#define ST7703_CMD_SETRGBIF 0xB3
> -#define ST7703_CMD_SETCYC 0xB4
> -#define ST7703_CMD_SETBGP 0xB5
> -#define ST7703_CMD_SETVCOM 0xB6
> -#define ST7703_CMD_SETOTP 0xB7
> -#define ST7703_CMD_SETPOWER_EXT 0xB8
> -#define ST7703_CMD_SETEXTC 0xB9
> -#define ST7703_CMD_SETMIPI 0xBA
> -#define ST7703_CMD_SETVDC 0xBC
> -#define ST7703_CMD_SETSCR 0xC0
> -#define ST7703_CMD_SETPOWER 0xC1
> -#define ST7703_CMD_SETPANEL 0xCC
> -#define ST7703_CMD_SETGAMMA 0xE0
> -#define ST7703_CMD_SETEQ 0xE3
> -#define ST7703_CMD_SETGIP1 0xE9
> -#define ST7703_CMD_SETGIP2 0xEA
> -
> struct jh057n {
> struct device *dev;
> struct drm_panel panel;
> @@ -51,75 +30,153 @@ struct jh057n {
> struct dentry *debugfs;
> };
>
> +struct st7703_cmd {
> + const size_t size;
> + const u8 data[];
> +};
> +
> +#define st7703_cmd_data(cmd, ...) \
> + .size = 1 + (sizeof((u8[]){__VA_ARGS__})/sizeof(u8)), \
> + .data = {cmd, __VA_ARGS__}
> +
> +/* Manufacturer specific Commands send via DSI */
> +static const struct st7703_cmd ST7703_CMD_ALL_PIXEL_OFF = {
> + st7703_cmd_data(0x22)
> +};
> +static const struct st7703_cmd ST7703_CMD_ALL_PIXEL_ON = {
> + st7703_cmd_data(0x23)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETDISP = {
> + st7703_cmd_data(0xB2,
> + 0xF0, 0x12, 0x30)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETRGBIF = {
> + st7703_cmd_data(0xB3,
> + 0x10, 0x10, 0x05, 0x05, 0x03, 0xFF, 0x00, 0x00,
> + 0x00, 0x00)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETCYC = {
> + st7703_cmd_data(0xB4,
> + 0x80)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETBGP = {
> + st7703_cmd_data(0xB5,
> + 0x08, 0x08)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETVCOM = {
> + st7703_cmd_data(0xB6,
> + 0x3F, 0x3F)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETOTP = {
> + st7703_cmd_data(0xB7)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETPOWER_EXT = {
> + st7703_cmd_data(0xB8)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETEXTC = {
> + st7703_cmd_data(0xB9,
> + 0xF1, 0x12, 0x83)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETMIPI = {
> + st7703_cmd_data(0xBA)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETVDC = {
> + st7703_cmd_data(0xBC,
> + 0x4E)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETSCR = {
> + st7703_cmd_data(0xC0,
> + 0x73, 0x73, 0x50, 0x50, 0x00, 0x00, 0x08, 0x70,
> + 0x00)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETPOWER = {
> + st7703_cmd_data(0xC1)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETPANEL = {
> + st7703_cmd_data(0xCC,
> + 0x0B)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETGAMMA = {
> + st7703_cmd_data(0xE0,
> + 0x00, 0x09, 0x0E, 0x29, 0x2D, 0x3C, 0x41, 0x37,
> + 0x07, 0x0B, 0x0D, 0x10, 0x11, 0x0F, 0x10, 0x11,
> + 0x18, 0x00, 0x09, 0x0E, 0x29, 0x2D, 0x3C, 0x41,
> + 0x37, 0x07, 0x0B, 0x0D, 0x10, 0x11, 0x0F, 0x10,
> + 0x11, 0x18)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETEQ = {
> + st7703_cmd_data(0xE3,
> + 0x07, 0x07, 0x0B, 0x0B, 0x03, 0x0B, 0x00, 0x00,
> + 0x00, 0x00, 0xFF, 0x00, 0xC0, 0x10)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETGIP1 = {
> + st7703_cmd_data(0xE9,
> + 0x82, 0x10, 0x06, 0x05, 0x9E, 0x0A, 0xA5, 0x12,
> + 0x31, 0x23, 0x37, 0x83, 0x04, 0xBC, 0x27, 0x38,
> + 0x0C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00,
> + 0x03, 0x00, 0x00, 0x00, 0x75, 0x75, 0x31, 0x88,
> + 0x88, 0x88, 0x88, 0x88, 0x88, 0x13, 0x88, 0x64,
> + 0x64, 0x20, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
> + 0x02, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
> +};
> +
> +static const struct st7703_cmd ST7703_CMD_SETGIP2 = {
> + st7703_cmd_data(0xEA,
> + 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> + 0x00, 0x00, 0x00, 0x00, 0x02, 0x46, 0x02, 0x88,
> + 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x88, 0x13,
> + 0x57, 0x13, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
> + 0x75, 0x88, 0x23, 0x14, 0x00, 0x00, 0x02, 0x00,
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0A,
> + 0xA5, 0x00, 0x00, 0x00, 0x00)
> +};
> +
> static inline struct jh057n *panel_to_jh057n(struct drm_panel *panel)
> {
> return container_of(panel, struct jh057n, panel);
> }
>
> -#define dsi_generic_write_seq(dsi, seq...) do { \
> - static const u8 d[] = { seq }; \
> - int ret; \
> - ret = mipi_dsi_generic_write(dsi, d, ARRAY_SIZE(d)); \
> - if (ret < 0) \
> - return ret; \
> - } while (0)
The above macro was the one triggering this patch.
And frankly it looks nice and simple.
The old code is IMO more readable.
- We have all the commands listed in the order they
are used and in a rahter compatch format.
- It is obvious when we need delays.
- We have traditional #defines for the constants we know
This macro:
> +#define st7703_cmd_data(cmd, ...) \
> + .size = 1 + (sizeof((u8[]){__VA_ARGS__})/sizeof(u8)), \
> + .data = {cmd, __VA_ARGS__}
is again IMO not easier to follow than the above.
This is all to some extent bikeshedding, but I suggest
to keep the current code.
It is simple and it is tested.
Thanks for trying to come up with a better solution.
Sam
WARNING: multiple messages have this Message-ID (diff)
From: Sam Ravnborg <sam@ravnborg.org>
To: Joe Perches <joe@perches.com>
Cc: "Thierry Reding" <thierry.reding@gmail.com>,
"Guido Günther" <agx@sigxcpu.org>,
"David Airlie" <airlied@linux.ie>,
"Daniel Vetter" <daniel@ffwll.ch>,
"Rob Herring" <robh+dt@kernel.org>,
"Mark Rutland" <mark.rutland@arm.com>,
"Kevin Hilman" <khilman@baylibre.com>,
"Manivannan Sadhasivam" <manivannan.sadhasivam@linaro.org>,
"Shawn Guo" <shawnguo@kernel.org>,
"Jagan Teki" <jagan@amarulasolutions.com>,
"Martin Blumenstingl" <martin.blumenstingl@googlemail.com>,
"Johan Hovold" <johan@kernel.org>,
"David S. Miller" <davem@davemloft.net>,
"Mauro Carvalho Chehab" <mchehab+samsung@kernel.org>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Nicolas Ferre" <nicolas.ferre@microchip.com>,
dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v5 0/3] drm/panel: Support Rocktech jh057n00900 DSI panel
Date: Wed, 3 Apr 2019 23:07:38 +0200 [thread overview]
Message-ID: <20190403210738.GA9173@ravnborg.org> (raw)
In-Reply-To: <c2f6a9f0ea59dc1491a8429a51afe56e488dfb3c.camel@perches.com>
Hi Joe.
Thanks for your patch.
> ---
> drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c | 210 +++++++++++++--------
> 1 file changed, 136 insertions(+), 74 deletions(-)
Hmmm, add more lines than it deletes.
>
> diff --git a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> index 158a6d548068..7862863db5f7 100644
> --- a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> +++ b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
> @@ -20,27 +20,6 @@
>
> #define DRV_NAME "panel-rocktech-jh057n00900"
>
> -/* Manufacturer specific Commands send via DSI */
> -#define ST7703_CMD_ALL_PIXEL_OFF 0x22
> -#define ST7703_CMD_ALL_PIXEL_ON 0x23
> -#define ST7703_CMD_SETDISP 0xB2
> -#define ST7703_CMD_SETRGBIF 0xB3
> -#define ST7703_CMD_SETCYC 0xB4
> -#define ST7703_CMD_SETBGP 0xB5
> -#define ST7703_CMD_SETVCOM 0xB6
> -#define ST7703_CMD_SETOTP 0xB7
> -#define ST7703_CMD_SETPOWER_EXT 0xB8
> -#define ST7703_CMD_SETEXTC 0xB9
> -#define ST7703_CMD_SETMIPI 0xBA
> -#define ST7703_CMD_SETVDC 0xBC
> -#define ST7703_CMD_SETSCR 0xC0
> -#define ST7703_CMD_SETPOWER 0xC1
> -#define ST7703_CMD_SETPANEL 0xCC
> -#define ST7703_CMD_SETGAMMA 0xE0
> -#define ST7703_CMD_SETEQ 0xE3
> -#define ST7703_CMD_SETGIP1 0xE9
> -#define ST7703_CMD_SETGIP2 0xEA
> -
> struct jh057n {
> struct device *dev;
> struct drm_panel panel;
> @@ -51,75 +30,153 @@ struct jh057n {
> struct dentry *debugfs;
> };
>
> +struct st7703_cmd {
> + const size_t size;
> + const u8 data[];
> +};
> +
> +#define st7703_cmd_data(cmd, ...) \
> + .size = 1 + (sizeof((u8[]){__VA_ARGS__})/sizeof(u8)), \
> + .data = {cmd, __VA_ARGS__}
> +
> +/* Manufacturer specific Commands send via DSI */
> +static const struct st7703_cmd ST7703_CMD_ALL_PIXEL_OFF = {
> + st7703_cmd_data(0x22)
> +};
> +static const struct st7703_cmd ST7703_CMD_ALL_PIXEL_ON = {
> + st7703_cmd_data(0x23)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETDISP = {
> + st7703_cmd_data(0xB2,
> + 0xF0, 0x12, 0x30)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETRGBIF = {
> + st7703_cmd_data(0xB3,
> + 0x10, 0x10, 0x05, 0x05, 0x03, 0xFF, 0x00, 0x00,
> + 0x00, 0x00)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETCYC = {
> + st7703_cmd_data(0xB4,
> + 0x80)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETBGP = {
> + st7703_cmd_data(0xB5,
> + 0x08, 0x08)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETVCOM = {
> + st7703_cmd_data(0xB6,
> + 0x3F, 0x3F)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETOTP = {
> + st7703_cmd_data(0xB7)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETPOWER_EXT = {
> + st7703_cmd_data(0xB8)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETEXTC = {
> + st7703_cmd_data(0xB9,
> + 0xF1, 0x12, 0x83)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETMIPI = {
> + st7703_cmd_data(0xBA)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETVDC = {
> + st7703_cmd_data(0xBC,
> + 0x4E)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETSCR = {
> + st7703_cmd_data(0xC0,
> + 0x73, 0x73, 0x50, 0x50, 0x00, 0x00, 0x08, 0x70,
> + 0x00)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETPOWER = {
> + st7703_cmd_data(0xC1)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETPANEL = {
> + st7703_cmd_data(0xCC,
> + 0x0B)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETGAMMA = {
> + st7703_cmd_data(0xE0,
> + 0x00, 0x09, 0x0E, 0x29, 0x2D, 0x3C, 0x41, 0x37,
> + 0x07, 0x0B, 0x0D, 0x10, 0x11, 0x0F, 0x10, 0x11,
> + 0x18, 0x00, 0x09, 0x0E, 0x29, 0x2D, 0x3C, 0x41,
> + 0x37, 0x07, 0x0B, 0x0D, 0x10, 0x11, 0x0F, 0x10,
> + 0x11, 0x18)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETEQ = {
> + st7703_cmd_data(0xE3,
> + 0x07, 0x07, 0x0B, 0x0B, 0x03, 0x0B, 0x00, 0x00,
> + 0x00, 0x00, 0xFF, 0x00, 0xC0, 0x10)
> +};
> +static const struct st7703_cmd ST7703_CMD_SETGIP1 = {
> + st7703_cmd_data(0xE9,
> + 0x82, 0x10, 0x06, 0x05, 0x9E, 0x0A, 0xA5, 0x12,
> + 0x31, 0x23, 0x37, 0x83, 0x04, 0xBC, 0x27, 0x38,
> + 0x0C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00,
> + 0x03, 0x00, 0x00, 0x00, 0x75, 0x75, 0x31, 0x88,
> + 0x88, 0x88, 0x88, 0x88, 0x88, 0x13, 0x88, 0x64,
> + 0x64, 0x20, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
> + 0x02, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
> +};
> +
> +static const struct st7703_cmd ST7703_CMD_SETGIP2 = {
> + st7703_cmd_data(0xEA,
> + 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> + 0x00, 0x00, 0x00, 0x00, 0x02, 0x46, 0x02, 0x88,
> + 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x88, 0x13,
> + 0x57, 0x13, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
> + 0x75, 0x88, 0x23, 0x14, 0x00, 0x00, 0x02, 0x00,
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0A,
> + 0xA5, 0x00, 0x00, 0x00, 0x00)
> +};
> +
> static inline struct jh057n *panel_to_jh057n(struct drm_panel *panel)
> {
> return container_of(panel, struct jh057n, panel);
> }
>
> -#define dsi_generic_write_seq(dsi, seq...) do { \
> - static const u8 d[] = { seq }; \
> - int ret; \
> - ret = mipi_dsi_generic_write(dsi, d, ARRAY_SIZE(d)); \
> - if (ret < 0) \
> - return ret; \
> - } while (0)
The above macro was the one triggering this patch.
And frankly it looks nice and simple.
The old code is IMO more readable.
- We have all the commands listed in the order they
are used and in a rahter compatch format.
- It is obvious when we need delays.
- We have traditional #defines for the constants we know
This macro:
> +#define st7703_cmd_data(cmd, ...) \
> + .size = 1 + (sizeof((u8[]){__VA_ARGS__})/sizeof(u8)), \
> + .data = {cmd, __VA_ARGS__}
is again IMO not easier to follow than the above.
This is all to some extent bikeshedding, but I suggest
to keep the current code.
It is simple and it is tested.
Thanks for trying to come up with a better solution.
Sam
next prev parent reply other threads:[~2019-04-03 21:07 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-01 10:35 [PATCH v5 0/3] drm/panel: Support Rocktech jh057n00900 DSI panel Guido Günther
2019-04-01 10:35 ` [PATCH v5 1/3] dt-bindings: Add vendor prefix for ROCKTECH DISPLAYS LIMITED Guido Günther
2019-04-01 10:35 ` [PATCH v5 2/3] dt-bindings: Add Rocktech jh057n00900 panel bindings Guido Günther
2019-04-01 10:35 ` [PATCH v5 3/3] drm/panel: Add Rocktech jh057n00900 panel driver Guido Günther
2019-04-01 10:35 ` Guido Günther
2019-04-03 16:17 ` [PATCH v5 0/3] drm/panel: Support Rocktech jh057n00900 DSI panel Thierry Reding
2019-04-03 17:11 ` Joe Perches
2019-04-03 20:09 ` Joe Perches
2019-04-03 21:07 ` Sam Ravnborg [this message]
2019-04-03 21:07 ` Sam Ravnborg
2019-04-04 5:02 ` Joe Perches
2019-04-04 5:02 ` Joe Perches
2019-04-04 10:53 ` Guido Günther
2019-04-04 15:06 ` [PATCH] drm/panel: Rocktech jh057n00900: Add terminating newlines to logging Joe Perches
2019-04-04 15:48 ` Guido Günther
2019-04-04 16:19 ` Joe Perches
2019-04-04 17:09 ` Thierry Reding
2019-04-04 17:09 ` Thierry Reding
2019-04-04 17:00 ` Sam Ravnborg
2019-04-04 17:00 ` Sam Ravnborg
2019-04-04 18:55 ` Joe Perches
2019-04-04 18:55 ` Joe Perches
2019-04-04 19:08 ` Sam Ravnborg
2019-04-04 19:08 ` Sam Ravnborg
2019-04-04 17:08 ` Thierry Reding
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=20190403210738.GA9173@ravnborg.org \
--to=sam@ravnborg.org \
--cc=agx@sigxcpu.org \
--cc=airlied@linux.ie \
--cc=daniel@ffwll.ch \
--cc=davem@davemloft.net \
--cc=devicetree@vger.kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=gregkh@linuxfoundation.org \
--cc=jagan@amarulasolutions.com \
--cc=joe@perches.com \
--cc=johan@kernel.org \
--cc=khilman@baylibre.com \
--cc=linux-kernel@vger.ke \
--cc=manivannan.sadhasivam@linaro.org \
--cc=mark.rutland@arm.com \
--cc=martin.blumenstingl@googlemail.com \
--cc=mchehab+samsung@kernel.org \
--cc=nicolas.ferre@microchip.com \
--cc=robh+dt@kernel.org \
--cc=shawnguo@kernel.org \
--cc=thierry.reding@gmail.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.