From: Suzuki K Poulose <suzuki.poulose@arm.com> To: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org, coresight@lists.linaro.org, rjw@rjwysocki.net, mathieu.poirier@linaro.org, Suzuki K Poulose <suzuki.poulose@arm.com> Subject: [PATCH v3 21/30] coresight: Reuse platform data structure for connection tracking Date: Tue, 7 May 2019 11:52:48 +0100 [thread overview] Message-ID: <1557226378-10131-22-git-send-email-suzuki.poulose@arm.com> (raw) In-Reply-To: <1557226378-10131-1-git-send-email-suzuki.poulose@arm.com> The platform specific information describes the connections and the ports of a given coresigh device. This information is also recorded in the coresight device as separate fields. Let us reuse the original platform description to streamline the handling of the data. Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com> --- drivers/hwtracing/coresight/coresight-tmc-etr.c | 4 +-- drivers/hwtracing/coresight/coresight.c | 46 ++++++++++++------------- include/linux/coresight.h | 8 ++--- 3 files changed, 27 insertions(+), 31 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c index 01718cb..793639f 100644 --- a/drivers/hwtracing/coresight/coresight-tmc-etr.c +++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c @@ -756,8 +756,8 @@ tmc_etr_get_catu_device(struct tmc_drvdata *drvdata) if (!IS_ENABLED(CONFIG_CORESIGHT_CATU)) return NULL; - for (i = 0; i < etr->nr_outport; i++) { - tmp = etr->conns[i].child_dev; + for (i = 0; i < etr->pdata->nr_outport; i++) { + tmp = etr->pdata->conns[i].child_dev; if (tmp && coresight_is_catu_device(tmp)) return tmp; } diff --git a/drivers/hwtracing/coresight/coresight.c b/drivers/hwtracing/coresight/coresight.c index 068bd2f..96e1515 100644 --- a/drivers/hwtracing/coresight/coresight.c +++ b/drivers/hwtracing/coresight/coresight.c @@ -100,8 +100,8 @@ static int coresight_find_link_inport(struct coresight_device *csdev, int i; struct coresight_connection *conn; - for (i = 0; i < parent->nr_outport; i++) { - conn = &parent->conns[i]; + for (i = 0; i < parent->pdata->nr_outport; i++) { + conn = &parent->pdata->conns[i]; if (conn->child_dev == csdev) return conn->child_port; } @@ -118,8 +118,8 @@ static int coresight_find_link_outport(struct coresight_device *csdev, int i; struct coresight_connection *conn; - for (i = 0; i < csdev->nr_outport; i++) { - conn = &csdev->conns[i]; + for (i = 0; i < csdev->pdata->nr_outport; i++) { + conn = &csdev->pdata->conns[i]; if (conn->child_dev == child) return conn->outport; } @@ -306,10 +306,10 @@ static void coresight_disable_link(struct coresight_device *csdev, if (link_subtype == CORESIGHT_DEV_SUBTYPE_LINK_MERG) { refport = inport; - nr_conns = csdev->nr_inport; + nr_conns = csdev->pdata->nr_inport; } else if (link_subtype == CORESIGHT_DEV_SUBTYPE_LINK_SPLIT) { refport = outport; - nr_conns = csdev->nr_outport; + nr_conns = csdev->pdata->nr_outport; } else { refport = 0; nr_conns = 1; @@ -595,9 +595,10 @@ static void coresight_grab_device(struct coresight_device *csdev) { int i; - for (i = 0; i < csdev->nr_outport; i++) { - struct coresight_device *child = csdev->conns[i].child_dev; + for (i = 0; i < csdev->pdata->nr_outport; i++) { + struct coresight_device *child; + child = csdev->pdata->conns[i].child_dev; if (child && child->type == CORESIGHT_DEV_TYPE_HELPER) pm_runtime_get_sync(child->dev.parent); } @@ -613,9 +614,10 @@ static void coresight_drop_device(struct coresight_device *csdev) int i; pm_runtime_put(csdev->dev.parent); - for (i = 0; i < csdev->nr_outport; i++) { - struct coresight_device *child = csdev->conns[i].child_dev; + for (i = 0; i < csdev->pdata->nr_outport; i++) { + struct coresight_device *child; + child = csdev->pdata->conns[i].child_dev; if (child && child->type == CORESIGHT_DEV_TYPE_HELPER) pm_runtime_put(child->dev.parent); } @@ -645,9 +647,10 @@ static int _coresight_build_path(struct coresight_device *csdev, goto out; /* Not a sink - recursively explore each port found on this element */ - for (i = 0; i < csdev->nr_outport; i++) { - struct coresight_device *child_dev = csdev->conns[i].child_dev; + for (i = 0; i < csdev->pdata->nr_outport; i++) { + struct coresight_device *child_dev; + child_dev = csdev->pdata->conns[i].child_dev; if (child_dev && _coresight_build_path(child_dev, sink, path) == 0) { found = true; @@ -1000,8 +1003,8 @@ static int coresight_orphan_match(struct device *dev, void *data) * Circle throuch all the connection of that component. If we find * an orphan connection whose name matches @csdev, link it. */ - for (i = 0; i < i_csdev->nr_outport; i++) { - conn = &i_csdev->conns[i]; + for (i = 0; i < i_csdev->pdata->nr_outport; i++) { + conn = &i_csdev->pdata->conns[i]; /* We have found at least one orphan connection */ if (conn->child_dev == NULL) { @@ -1040,8 +1043,8 @@ static void coresight_fixup_device_conns(struct coresight_device *csdev) { int i; - for (i = 0; i < csdev->nr_outport; i++) { - struct coresight_connection *conn = &csdev->conns[i]; + for (i = 0; i < csdev->pdata->nr_outport; i++) { + struct coresight_connection *conn = &csdev->pdata->conns[i]; struct device *dev = NULL; if (conn->child_name) @@ -1075,8 +1078,8 @@ static int coresight_remove_match(struct device *dev, void *data) * Circle throuch all the connection of that component. If we find * a connection whose name matches @csdev, remove it. */ - for (i = 0; i < iterator->nr_outport; i++) { - conn = &iterator->conns[i]; + for (i = 0; i < iterator->pdata->nr_outport; i++) { + conn = &iterator->pdata->conns[i]; if (conn->child_dev == NULL) continue; @@ -1108,7 +1111,7 @@ static void coresight_remove_conns(struct coresight_device *csdev) * doesn't have at least one input port, there is no point * in searching all the devices. */ - if (csdev->nr_inport) + if (csdev->pdata->nr_inport) bus_for_each_dev(&coresight_bustype, NULL, csdev, coresight_remove_match); } @@ -1195,10 +1198,7 @@ struct coresight_device *coresight_register(struct coresight_desc *desc) csdev->refcnt = refcnts; - csdev->nr_inport = desc->pdata->nr_inport; - csdev->nr_outport = desc->pdata->nr_outport; - - csdev->conns = desc->pdata->conns; + csdev->pdata = desc->pdata; csdev->type = desc->type; csdev->subtype = desc->subtype; diff --git a/include/linux/coresight.h b/include/linux/coresight.h index 298db20..b67d507 100644 --- a/include/linux/coresight.h +++ b/include/linux/coresight.h @@ -140,9 +140,7 @@ struct coresight_connection { /** * struct coresight_device - representation of a device as used by the framework - * @conns: array of coresight_connections associated to this component. - * @nr_inport: number of input port associated to this component. - * @nr_outport: number of output port associated to this component. + * @pdata: Platform data with device connections associated to this device. * @type: as defined by @coresight_dev_type. * @subtype: as defined by @coresight_dev_subtype. * @ops: generic operations for this component, as defined @@ -157,9 +155,7 @@ struct coresight_connection { * @ea: Device attribute for sink representation under PMU directory. */ struct coresight_device { - struct coresight_connection *conns; - int nr_inport; - int nr_outport; + struct coresight_platform_data *pdata; enum coresight_dev_type type; union coresight_dev_subtype subtype; const struct coresight_ops *ops; -- 2.7.4
WARNING: multiple messages have this Message-ID (diff)
From: Suzuki K Poulose <suzuki.poulose@arm.com> To: linux-arm-kernel@lists.infradead.org Cc: coresight@lists.linaro.org, rjw@rjwysocki.net, linux-kernel@vger.kernel.org, mathieu.poirier@linaro.org, Suzuki K Poulose <suzuki.poulose@arm.com> Subject: [PATCH v3 21/30] coresight: Reuse platform data structure for connection tracking Date: Tue, 7 May 2019 11:52:48 +0100 [thread overview] Message-ID: <1557226378-10131-22-git-send-email-suzuki.poulose@arm.com> (raw) In-Reply-To: <1557226378-10131-1-git-send-email-suzuki.poulose@arm.com> The platform specific information describes the connections and the ports of a given coresigh device. This information is also recorded in the coresight device as separate fields. Let us reuse the original platform description to streamline the handling of the data. Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com> --- drivers/hwtracing/coresight/coresight-tmc-etr.c | 4 +-- drivers/hwtracing/coresight/coresight.c | 46 ++++++++++++------------- include/linux/coresight.h | 8 ++--- 3 files changed, 27 insertions(+), 31 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c index 01718cb..793639f 100644 --- a/drivers/hwtracing/coresight/coresight-tmc-etr.c +++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c @@ -756,8 +756,8 @@ tmc_etr_get_catu_device(struct tmc_drvdata *drvdata) if (!IS_ENABLED(CONFIG_CORESIGHT_CATU)) return NULL; - for (i = 0; i < etr->nr_outport; i++) { - tmp = etr->conns[i].child_dev; + for (i = 0; i < etr->pdata->nr_outport; i++) { + tmp = etr->pdata->conns[i].child_dev; if (tmp && coresight_is_catu_device(tmp)) return tmp; } diff --git a/drivers/hwtracing/coresight/coresight.c b/drivers/hwtracing/coresight/coresight.c index 068bd2f..96e1515 100644 --- a/drivers/hwtracing/coresight/coresight.c +++ b/drivers/hwtracing/coresight/coresight.c @@ -100,8 +100,8 @@ static int coresight_find_link_inport(struct coresight_device *csdev, int i; struct coresight_connection *conn; - for (i = 0; i < parent->nr_outport; i++) { - conn = &parent->conns[i]; + for (i = 0; i < parent->pdata->nr_outport; i++) { + conn = &parent->pdata->conns[i]; if (conn->child_dev == csdev) return conn->child_port; } @@ -118,8 +118,8 @@ static int coresight_find_link_outport(struct coresight_device *csdev, int i; struct coresight_connection *conn; - for (i = 0; i < csdev->nr_outport; i++) { - conn = &csdev->conns[i]; + for (i = 0; i < csdev->pdata->nr_outport; i++) { + conn = &csdev->pdata->conns[i]; if (conn->child_dev == child) return conn->outport; } @@ -306,10 +306,10 @@ static void coresight_disable_link(struct coresight_device *csdev, if (link_subtype == CORESIGHT_DEV_SUBTYPE_LINK_MERG) { refport = inport; - nr_conns = csdev->nr_inport; + nr_conns = csdev->pdata->nr_inport; } else if (link_subtype == CORESIGHT_DEV_SUBTYPE_LINK_SPLIT) { refport = outport; - nr_conns = csdev->nr_outport; + nr_conns = csdev->pdata->nr_outport; } else { refport = 0; nr_conns = 1; @@ -595,9 +595,10 @@ static void coresight_grab_device(struct coresight_device *csdev) { int i; - for (i = 0; i < csdev->nr_outport; i++) { - struct coresight_device *child = csdev->conns[i].child_dev; + for (i = 0; i < csdev->pdata->nr_outport; i++) { + struct coresight_device *child; + child = csdev->pdata->conns[i].child_dev; if (child && child->type == CORESIGHT_DEV_TYPE_HELPER) pm_runtime_get_sync(child->dev.parent); } @@ -613,9 +614,10 @@ static void coresight_drop_device(struct coresight_device *csdev) int i; pm_runtime_put(csdev->dev.parent); - for (i = 0; i < csdev->nr_outport; i++) { - struct coresight_device *child = csdev->conns[i].child_dev; + for (i = 0; i < csdev->pdata->nr_outport; i++) { + struct coresight_device *child; + child = csdev->pdata->conns[i].child_dev; if (child && child->type == CORESIGHT_DEV_TYPE_HELPER) pm_runtime_put(child->dev.parent); } @@ -645,9 +647,10 @@ static int _coresight_build_path(struct coresight_device *csdev, goto out; /* Not a sink - recursively explore each port found on this element */ - for (i = 0; i < csdev->nr_outport; i++) { - struct coresight_device *child_dev = csdev->conns[i].child_dev; + for (i = 0; i < csdev->pdata->nr_outport; i++) { + struct coresight_device *child_dev; + child_dev = csdev->pdata->conns[i].child_dev; if (child_dev && _coresight_build_path(child_dev, sink, path) == 0) { found = true; @@ -1000,8 +1003,8 @@ static int coresight_orphan_match(struct device *dev, void *data) * Circle throuch all the connection of that component. If we find * an orphan connection whose name matches @csdev, link it. */ - for (i = 0; i < i_csdev->nr_outport; i++) { - conn = &i_csdev->conns[i]; + for (i = 0; i < i_csdev->pdata->nr_outport; i++) { + conn = &i_csdev->pdata->conns[i]; /* We have found at least one orphan connection */ if (conn->child_dev == NULL) { @@ -1040,8 +1043,8 @@ static void coresight_fixup_device_conns(struct coresight_device *csdev) { int i; - for (i = 0; i < csdev->nr_outport; i++) { - struct coresight_connection *conn = &csdev->conns[i]; + for (i = 0; i < csdev->pdata->nr_outport; i++) { + struct coresight_connection *conn = &csdev->pdata->conns[i]; struct device *dev = NULL; if (conn->child_name) @@ -1075,8 +1078,8 @@ static int coresight_remove_match(struct device *dev, void *data) * Circle throuch all the connection of that component. If we find * a connection whose name matches @csdev, remove it. */ - for (i = 0; i < iterator->nr_outport; i++) { - conn = &iterator->conns[i]; + for (i = 0; i < iterator->pdata->nr_outport; i++) { + conn = &iterator->pdata->conns[i]; if (conn->child_dev == NULL) continue; @@ -1108,7 +1111,7 @@ static void coresight_remove_conns(struct coresight_device *csdev) * doesn't have at least one input port, there is no point * in searching all the devices. */ - if (csdev->nr_inport) + if (csdev->pdata->nr_inport) bus_for_each_dev(&coresight_bustype, NULL, csdev, coresight_remove_match); } @@ -1195,10 +1198,7 @@ struct coresight_device *coresight_register(struct coresight_desc *desc) csdev->refcnt = refcnts; - csdev->nr_inport = desc->pdata->nr_inport; - csdev->nr_outport = desc->pdata->nr_outport; - - csdev->conns = desc->pdata->conns; + csdev->pdata = desc->pdata; csdev->type = desc->type; csdev->subtype = desc->subtype; diff --git a/include/linux/coresight.h b/include/linux/coresight.h index 298db20..b67d507 100644 --- a/include/linux/coresight.h +++ b/include/linux/coresight.h @@ -140,9 +140,7 @@ struct coresight_connection { /** * struct coresight_device - representation of a device as used by the framework - * @conns: array of coresight_connections associated to this component. - * @nr_inport: number of input port associated to this component. - * @nr_outport: number of output port associated to this component. + * @pdata: Platform data with device connections associated to this device. * @type: as defined by @coresight_dev_type. * @subtype: as defined by @coresight_dev_subtype. * @ops: generic operations for this component, as defined @@ -157,9 +155,7 @@ struct coresight_connection { * @ea: Device attribute for sink representation under PMU directory. */ struct coresight_device { - struct coresight_connection *conns; - int nr_inport; - int nr_outport; + struct coresight_platform_data *pdata; enum coresight_dev_type type; union coresight_dev_subtype subtype; const struct coresight_ops *ops; -- 2.7.4 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2019-05-07 10:55 UTC|newest] Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-05-07 10:52 [PATCH v3 00/30] coresight: Support for ACPI bindings Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 01/30] coresight: funnel: Clean up device book keeping Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 02/30] coresight: replicator: Cleanup device tracking Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 03/30] coresight: tmc: Clean up device specific data Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 04/30] coresight: catu: Cleanup " Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 05/30] coresight: tpiu: Clean up " Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 06/30] coresight: stm: Cleanup " Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 07/30] coresight: etm: Clean up " Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 08/30] coresight: etb10: " Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 09/30] coresight: Use coresight device names for sinks in PMU attribute Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 10/30] coresight: Rename of_coresight to coresight-platform Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 11/30] coresight: etm3x: Rearrange cp14 access detection Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 12/30] coresight: stm: Rearrange probing the stimulus area Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 13/30] coresight: tmc-etr: Rearrange probing default buffer size Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 14/30] coresight: platform: Make memory allocation helper generic Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 15/30] coresight: Make sure device uses DT for obsolete compatible check Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-13 16:18 ` Mathieu Poirier 2019-05-13 16:18 ` Mathieu Poirier 2019-05-07 10:52 ` [PATCH v3 16/30] coresight: Introduce generic platform data helper Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-13 16:39 ` Mathieu Poirier 2019-05-13 16:39 ` Mathieu Poirier 2019-05-07 10:52 ` [PATCH v3 17/30] coresight: Make device to CPU mapping generic Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 18/30] coresight: Remove cpu field from platform data Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 19/30] coresight: Remove name from platform description Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 20/30] coresight: Cleanup coresight_remove_conns Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose [this message] 2019-05-07 10:52 ` [PATCH v3 21/30] coresight: Reuse platform data structure for connection tracking Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 22/30] coresight: Rearrange platform data probing Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-13 17:21 ` Mathieu Poirier 2019-05-13 17:21 ` Mathieu Poirier 2019-05-07 10:52 ` [PATCH v3 23/30] coresight: Add support for releasing platform specific data Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-13 22:40 ` Mathieu Poirier 2019-05-13 22:40 ` Mathieu Poirier 2019-05-07 10:52 ` [PATCH v3 24/30] coresight: platform: Use fwnode handle for device search Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-13 17:39 ` Mathieu Poirier 2019-05-13 17:39 ` Mathieu Poirier 2019-05-07 10:52 ` [PATCH v3 25/30] coresight: Use fwnode handle instead of device names Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-13 17:59 ` Mathieu Poirier 2019-05-13 17:59 ` Mathieu Poirier 2019-05-07 10:52 ` [PATCH v3 26/30] coresight: Use platform agnostic names Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 27/30] coresight: stm: ACPI support for parsing stimulus base Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [PATCH v3 28/30] coresight: Support for ACPI bindings Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-13 22:28 ` Mathieu Poirier 2019-05-13 22:28 ` Mathieu Poirier 2019-05-07 10:52 ` [PATCH v3 29/30] coresight: acpi: Support for AMBA components Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-13 22:33 ` Mathieu Poirier 2019-05-13 22:33 ` Mathieu Poirier 2019-05-07 10:52 ` [PATCH v3 30/30] coresight: acpi: Support for platform devices Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose 2019-05-07 10:52 ` [TEST PATCH 31/30][EDK2] edk2-platform: juno: Update ACPI CoreSight Bindings Suzuki K Poulose 2019-05-07 10:52 ` Suzuki K Poulose
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=1557226378-10131-22-git-send-email-suzuki.poulose@arm.com \ --to=suzuki.poulose@arm.com \ --cc=coresight@lists.linaro.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mathieu.poirier@linaro.org \ --cc=rjw@rjwysocki.net \ /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: linkBe 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.