All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: Rob Herring <robh@kernel.org>
Cc: oe-kbuild-all@lists.linux.dev
Subject: [robh:dt/header-cleanups 20/20] drivers/of/device.c:35:5: warning: no previous prototype for 'of_device_add'
Date: Sat, 10 Jun 2023 08:34:03 +0800	[thread overview]
Message-ID: <202306100825.rfSNXbl6-lkp@intel.com> (raw)

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git dt/header-cleanups
head:   3118a5812ec5b3b83ca38f2d1c4162ccda268c0d
commit: 3118a5812ec5b3b83ca38f2d1c4162ccda268c0d [20/20] of: header cleanups
config: parisc-randconfig-r011-20230610 (https://download.01.org/0day-ci/archive/20230610/202306100825.rfSNXbl6-lkp@intel.com/config)
compiler: hppa-linux-gcc (GCC) 12.3.0
reproduce (this is a W=1 build):
        mkdir -p ~/bin
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git/commit/?id=3118a5812ec5b3b83ca38f2d1c4162ccda268c0d
        git remote add robh https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git
        git fetch --no-tags robh dt/header-cleanups
        git checkout 3118a5812ec5b3b83ca38f2d1c4162ccda268c0d
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.3.0 ~/bin/make.cross W=1 O=build_dir ARCH=parisc olddefconfig
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.3.0 ~/bin/make.cross W=1 O=build_dir ARCH=parisc SHELL=/bin/bash drivers/of/ lib/ net/core/

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202306100825.rfSNXbl6-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> drivers/of/device.c:35:5: warning: no previous prototype for 'of_device_add' [-Wmissing-prototypes]
      35 | int of_device_add(struct platform_device *ofdev)
         |     ^~~~~~~~~~~~~
>> drivers/of/device.c:224:5: warning: no previous prototype for 'of_device_register' [-Wmissing-prototypes]
     224 | int of_device_register(struct platform_device *pdev)
         |     ^~~~~~~~~~~~~~~~~~
>> drivers/of/device.c:231:6: warning: no previous prototype for 'of_device_unregister' [-Wmissing-prototypes]
     231 | void of_device_unregister(struct platform_device *ofdev)
         |      ^~~~~~~~~~~~~~~~~~~~


vim +/of_device_add +35 drivers/of/device.c

f85ff3056cefdf Stephen Rothwell       2007-05-01   34  
7096d0422153ff Grant Likely           2010-10-20  @35  int of_device_add(struct platform_device *ofdev)
f85ff3056cefdf Stephen Rothwell       2007-05-01   36  {
61c7a080a5a061 Grant Likely           2010-04-13   37  	BUG_ON(ofdev->dev.of_node == NULL);
6098e2ee14849e Jeremy Kerr            2008-10-26   38  
eca3930163ba88 Grant Likely           2010-06-08   39  	/* name and id have to be set so that the platform bus doesn't get
eca3930163ba88 Grant Likely           2010-06-08   40  	 * confused on matching */
eca3930163ba88 Grant Likely           2010-06-08   41  	ofdev->name = dev_name(&ofdev->dev);
6d7e3bf8d12c0a Andy Shevchenko        2017-08-25   42  	ofdev->id = PLATFORM_DEVID_NONE;
eca3930163ba88 Grant Likely           2010-06-08   43  
56f2de81e020c5 Zhen Lei               2015-08-25   44  	/*
56f2de81e020c5 Zhen Lei               2015-08-25   45  	 * If this device has not binding numa node in devicetree, that is
56f2de81e020c5 Zhen Lei               2015-08-25   46  	 * of_node_to_nid returns NUMA_NO_NODE. device_add will assume that this
56f2de81e020c5 Zhen Lei               2015-08-25   47  	 * device is on the same node as the parent.
56f2de81e020c5 Zhen Lei               2015-08-25   48  	 */
61c7a080a5a061 Grant Likely           2010-04-13   49  	set_dev_node(&ofdev->dev, of_node_to_nid(ofdev->dev.of_node));
6098e2ee14849e Jeremy Kerr            2008-10-26   50  
6098e2ee14849e Jeremy Kerr            2008-10-26   51  	return device_add(&ofdev->dev);
f85ff3056cefdf Stephen Rothwell       2007-05-01   52  }
7096d0422153ff Grant Likely           2010-10-20   53  
f3cfd136aef018 Will Deacon            2021-08-16   54  static void
ce5cb67c664fbc Will Deacon            2021-08-16   55  of_dma_set_restricted_buffer(struct device *dev, struct device_node *np)
ce5cb67c664fbc Will Deacon            2021-08-16   56  {
ce5cb67c664fbc Will Deacon            2021-08-16   57  	struct device_node *node, *of_node = dev->of_node;
ce5cb67c664fbc Will Deacon            2021-08-16   58  	int count, i;
ce5cb67c664fbc Will Deacon            2021-08-16   59  
f3cfd136aef018 Will Deacon            2021-08-16   60  	if (!IS_ENABLED(CONFIG_DMA_RESTRICTED_POOL))
f3cfd136aef018 Will Deacon            2021-08-16   61  		return;
f3cfd136aef018 Will Deacon            2021-08-16   62  
ce5cb67c664fbc Will Deacon            2021-08-16   63  	count = of_property_count_elems_of_size(of_node, "memory-region",
ce5cb67c664fbc Will Deacon            2021-08-16   64  						sizeof(u32));
ce5cb67c664fbc Will Deacon            2021-08-16   65  	/*
ce5cb67c664fbc Will Deacon            2021-08-16   66  	 * If dev->of_node doesn't exist or doesn't contain memory-region, try
ce5cb67c664fbc Will Deacon            2021-08-16   67  	 * the OF node having DMA configuration.
ce5cb67c664fbc Will Deacon            2021-08-16   68  	 */
ce5cb67c664fbc Will Deacon            2021-08-16   69  	if (count <= 0) {
ce5cb67c664fbc Will Deacon            2021-08-16   70  		of_node = np;
ce5cb67c664fbc Will Deacon            2021-08-16   71  		count = of_property_count_elems_of_size(
ce5cb67c664fbc Will Deacon            2021-08-16   72  			of_node, "memory-region", sizeof(u32));
ce5cb67c664fbc Will Deacon            2021-08-16   73  	}
ce5cb67c664fbc Will Deacon            2021-08-16   74  
ce5cb67c664fbc Will Deacon            2021-08-16   75  	for (i = 0; i < count; i++) {
ce5cb67c664fbc Will Deacon            2021-08-16   76  		node = of_parse_phandle(of_node, "memory-region", i);
ce5cb67c664fbc Will Deacon            2021-08-16   77  		/*
ce5cb67c664fbc Will Deacon            2021-08-16   78  		 * There might be multiple memory regions, but only one
ce5cb67c664fbc Will Deacon            2021-08-16   79  		 * restricted-dma-pool region is allowed.
ce5cb67c664fbc Will Deacon            2021-08-16   80  		 */
ce5cb67c664fbc Will Deacon            2021-08-16   81  		if (of_device_is_compatible(node, "restricted-dma-pool") &&
d17e37c41b7ed3 Liang He               2022-07-02   82  		    of_device_is_available(node)) {
d17e37c41b7ed3 Liang He               2022-07-02   83  			of_node_put(node);
f3cfd136aef018 Will Deacon            2021-08-16   84  			break;
ce5cb67c664fbc Will Deacon            2021-08-16   85  		}
d17e37c41b7ed3 Liang He               2022-07-02   86  		of_node_put(node);
d17e37c41b7ed3 Liang He               2022-07-02   87  	}
ce5cb67c664fbc Will Deacon            2021-08-16   88  
31c8025fac3d8b David Brazdil          2021-09-17   89  	/*
31c8025fac3d8b David Brazdil          2021-09-17   90  	 * Attempt to initialize a restricted-dma-pool region if one was found.
31c8025fac3d8b David Brazdil          2021-09-17   91  	 * Note that count can hold a negative error code.
31c8025fac3d8b David Brazdil          2021-09-17   92  	 */
31c8025fac3d8b David Brazdil          2021-09-17   93  	if (i < count && of_reserved_mem_device_init_by_idx(dev, of_node, i))
f3cfd136aef018 Will Deacon            2021-08-16   94  		dev_warn(dev, "failed to initialise \"restricted-dma-pool\" memory node\n");
ce5cb67c664fbc Will Deacon            2021-08-16   95  }
ce5cb67c664fbc Will Deacon            2021-08-16   96  
1f5c69aa51f9c7 Murali Karicheri       2015-03-03   97  /**
cb61e9dbeee9b3 Lee Jones              2021-03-18   98   * of_dma_configure_id - Setup DMA configuration
1f5c69aa51f9c7 Murali Karicheri       2015-03-03   99   * @dev:	Device to apply DMA configuration
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  100   * @np:		Pointer to OF node having DMA configuration
3d6ce86ee79465 Christoph Hellwig      2018-05-03  101   * @force_dma:  Whether device is to be set up by of_dma_configure() even if
3d6ce86ee79465 Christoph Hellwig      2018-05-03  102   *		DMA capability is not explicitly described by firmware.
a081bd4af4ce80 Lorenzo Pieralisi      2020-06-19  103   * @id:		Optional const pointer value input id
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  104   *
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  105   * Try to get devices's DMA configuration from DT and update it
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  106   * accordingly.
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  107   *
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  108   * If platform code needs to use its own special DMA configuration, it
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  109   * can use a platform bus notifier and handle BUS_NOTIFY_ADD_DEVICE events
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  110   * to fix up DMA configuration.
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  111   */
a081bd4af4ce80 Lorenzo Pieralisi      2020-06-19  112  int of_dma_configure_id(struct device *dev, struct device_node *np,
a081bd4af4ce80 Lorenzo Pieralisi      2020-06-19  113  			bool force_dma, const u32 *id)
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  114  {
53c92d793395fd Robin Murphy           2016-04-07  115  	const struct iommu_ops *iommu;
e0d072782c734d Jim Quinlan            2020-09-17  116  	const struct bus_dma_region *map = NULL;
f1ad5338a4d57f Robin Murphy           2022-09-29  117  	struct device_node *bus_np;
48ab6d5d1f096d Geert Uytterhoeven     2020-10-26  118  	u64 dma_start = 0;
e0d072782c734d Jim Quinlan            2020-09-17  119  	u64 mask, end, size = 0;
e0d072782c734d Jim Quinlan            2020-09-17  120  	bool coherent;
e0d072782c734d Jim Quinlan            2020-09-17  121  	int ret;
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  122  
f1ad5338a4d57f Robin Murphy           2022-09-29  123  	if (np == dev->of_node)
f1ad5338a4d57f Robin Murphy           2022-09-29  124  		bus_np = __of_get_dma_parent(np);
f1ad5338a4d57f Robin Murphy           2022-09-29  125  	else
f1ad5338a4d57f Robin Murphy           2022-09-29  126  		bus_np = of_node_get(np);
f1ad5338a4d57f Robin Murphy           2022-09-29  127  
f1ad5338a4d57f Robin Murphy           2022-09-29  128  	ret = of_dma_get_range(bus_np, &map);
f1ad5338a4d57f Robin Murphy           2022-09-29  129  	of_node_put(bus_np);
723288836628bc Robin Murphy           2017-08-31  130  	if (ret < 0) {
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  131  		/*
723288836628bc Robin Murphy           2017-08-31  132  		 * For legacy reasons, we have to assume some devices need
723288836628bc Robin Murphy           2017-08-31  133  		 * DMA configuration regardless of whether "dma-ranges" is
723288836628bc Robin Murphy           2017-08-31  134  		 * correctly specified or not.
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  135  		 */
3d6ce86ee79465 Christoph Hellwig      2018-05-03  136  		if (!force_dma)
723288836628bc Robin Murphy           2017-08-31  137  			return ret == -ENODEV ? 0 : ret;
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  138  	} else {
e0d072782c734d Jim Quinlan            2020-09-17  139  		const struct bus_dma_region *r = map;
48ab6d5d1f096d Geert Uytterhoeven     2020-10-26  140  		u64 dma_end = 0;
e0d072782c734d Jim Quinlan            2020-09-17  141  
e0d072782c734d Jim Quinlan            2020-09-17  142  		/* Determine the overall bounds of all DMA regions */
495023e4e49e4b Geert Uytterhoeven     2020-11-02  143  		for (dma_start = ~0; r->size; r++) {
e0d072782c734d Jim Quinlan            2020-09-17  144  			/* Take lower and upper limits */
e0d072782c734d Jim Quinlan            2020-09-17  145  			if (r->dma_start < dma_start)
e0d072782c734d Jim Quinlan            2020-09-17  146  				dma_start = r->dma_start;
e0d072782c734d Jim Quinlan            2020-09-17  147  			if (r->dma_start + r->size > dma_end)
e0d072782c734d Jim Quinlan            2020-09-17  148  				dma_end = r->dma_start + r->size;
e0d072782c734d Jim Quinlan            2020-09-17  149  		}
e0d072782c734d Jim Quinlan            2020-09-17  150  		size = dma_end - dma_start;
0c79c81c779fe5 Murali Karicheri       2015-03-03  151  
0c79c81c779fe5 Murali Karicheri       2015-03-03  152  		/*
0c79c81c779fe5 Murali Karicheri       2015-03-03  153  		 * Add a work around to treat the size as mask + 1 in case
0c79c81c779fe5 Murali Karicheri       2015-03-03  154  		 * it is defined in DT as a mask.
0c79c81c779fe5 Murali Karicheri       2015-03-03  155  		 */
0c79c81c779fe5 Murali Karicheri       2015-03-03  156  		if (size & 1) {
e0d072782c734d Jim Quinlan            2020-09-17  157  			dev_warn(dev, "Invalid size 0x%llx for dma-range(s)\n",
0c79c81c779fe5 Murali Karicheri       2015-03-03  158  				 size);
0c79c81c779fe5 Murali Karicheri       2015-03-03  159  			size = size + 1;
0c79c81c779fe5 Murali Karicheri       2015-03-03  160  		}
0c79c81c779fe5 Murali Karicheri       2015-03-03  161  
0c79c81c779fe5 Murali Karicheri       2015-03-03  162  		if (!size) {
0c79c81c779fe5 Murali Karicheri       2015-03-03  163  			dev_err(dev, "Adjusted size 0x%llx invalid\n", size);
e0d072782c734d Jim Quinlan            2020-09-17  164  			kfree(map);
7b07cbefb68d48 Laurent Pinchart       2017-04-10  165  			return -EINVAL;
0c79c81c779fe5 Murali Karicheri       2015-03-03  166  		}
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  167  	}
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  168  
723288836628bc Robin Murphy           2017-08-31  169  	/*
4d8bde883bfba3 Robin Murphy           2018-07-23  170  	 * If @dev is expected to be DMA-capable then the bus code that created
4d8bde883bfba3 Robin Murphy           2018-07-23  171  	 * it should have initialised its dma_mask pointer by this point. For
4d8bde883bfba3 Robin Murphy           2018-07-23  172  	 * now, we'll continue the legacy behaviour of coercing it to the
4d8bde883bfba3 Robin Murphy           2018-07-23  173  	 * coherent mask if not, but we'll no longer do so quietly.
723288836628bc Robin Murphy           2017-08-31  174  	 */
4d8bde883bfba3 Robin Murphy           2018-07-23  175  	if (!dev->dma_mask) {
4d8bde883bfba3 Robin Murphy           2018-07-23  176  		dev_warn(dev, "DMA mask not set\n");
723288836628bc Robin Murphy           2017-08-31  177  		dev->dma_mask = &dev->coherent_dma_mask;
4d8bde883bfba3 Robin Murphy           2018-07-23  178  	}
723288836628bc Robin Murphy           2017-08-31  179  
4d8bde883bfba3 Robin Murphy           2018-07-23  180  	if (!size && dev->coherent_dma_mask)
723288836628bc Robin Murphy           2017-08-31  181  		size = max(dev->coherent_dma_mask, dev->coherent_dma_mask + 1);
4d8bde883bfba3 Robin Murphy           2018-07-23  182  	else if (!size)
4d8bde883bfba3 Robin Murphy           2018-07-23  183  		size = 1ULL << 32;
723288836628bc Robin Murphy           2017-08-31  184  
9a6d7298b08336 Murali Karicheri       2015-03-03  185  	/*
9a6d7298b08336 Murali Karicheri       2015-03-03  186  	 * Limit coherent and dma mask based on size and default mask
9a6d7298b08336 Murali Karicheri       2015-03-03  187  	 * set by the driver.
9a6d7298b08336 Murali Karicheri       2015-03-03  188  	 */
e0d072782c734d Jim Quinlan            2020-09-17  189  	end = dma_start + size - 1;
a7ba70f1787f97 Nicolas Saenz Julienne 2019-11-21  190  	mask = DMA_BIT_MASK(ilog2(end) + 1);
ee7b1f31200d9f Robin Murphy           2017-08-11  191  	dev->coherent_dma_mask &= mask;
ee7b1f31200d9f Robin Murphy           2017-08-11  192  	*dev->dma_mask &= mask;
89c7cb1608ac3c Yong Wu                2021-01-19  193  	/* ...but only set bus limit and range map if we found valid dma-ranges earlier */
89c7cb1608ac3c Yong Wu                2021-01-19  194  	if (!ret) {
a7ba70f1787f97 Nicolas Saenz Julienne 2019-11-21  195  		dev->bus_dma_limit = end;
89c7cb1608ac3c Yong Wu                2021-01-19  196  		dev->dma_range_map = map;
89c7cb1608ac3c Yong Wu                2021-01-19  197  	}
9a6d7298b08336 Murali Karicheri       2015-03-03  198  
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  199  	coherent = of_dma_is_coherent(np);
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  200  	dev_dbg(dev, "device is%sdma coherent\n",
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  201  		coherent ? " " : " not ");
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  202  
a081bd4af4ce80 Lorenzo Pieralisi      2020-06-19  203  	iommu = of_iommu_configure(dev, np, id);
e0d072782c734d Jim Quinlan            2020-09-17  204  	if (PTR_ERR(iommu) == -EPROBE_DEFER) {
89c7cb1608ac3c Yong Wu                2021-01-19  205  		/* Don't touch range map if it wasn't set from a valid dma-ranges */
89c7cb1608ac3c Yong Wu                2021-01-19  206  		if (!ret)
89c7cb1608ac3c Yong Wu                2021-01-19  207  			dev->dma_range_map = NULL;
e0d072782c734d Jim Quinlan            2020-09-17  208  		kfree(map);
a37b19a384914c Sricharan R            2017-05-27  209  		return -EPROBE_DEFER;
e0d072782c734d Jim Quinlan            2020-09-17  210  	}
7b07cbefb68d48 Laurent Pinchart       2017-04-10  211  
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  212  	dev_dbg(dev, "device is%sbehind an iommu\n",
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  213  		iommu ? " " : " not ");
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  214  
e0d072782c734d Jim Quinlan            2020-09-17  215  	arch_setup_dma_ops(dev, dma_start, size, iommu, coherent);
7b07cbefb68d48 Laurent Pinchart       2017-04-10  216  
fec9b625095f73 Claire Chang           2021-06-19  217  	if (!iommu)
f3cfd136aef018 Will Deacon            2021-08-16  218  		of_dma_set_restricted_buffer(dev, np);
fec9b625095f73 Claire Chang           2021-06-19  219  
7b07cbefb68d48 Laurent Pinchart       2017-04-10  220  	return 0;
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  221  }
a081bd4af4ce80 Lorenzo Pieralisi      2020-06-19  222  EXPORT_SYMBOL_GPL(of_dma_configure_id);
1f5c69aa51f9c7 Murali Karicheri       2015-03-03  223  
7096d0422153ff Grant Likely           2010-10-20 @224  int of_device_register(struct platform_device *pdev)
7096d0422153ff Grant Likely           2010-10-20  225  {
7096d0422153ff Grant Likely           2010-10-20  226  	device_initialize(&pdev->dev);
7096d0422153ff Grant Likely           2010-10-20  227  	return of_device_add(pdev);
7096d0422153ff Grant Likely           2010-10-20  228  }
f85ff3056cefdf Stephen Rothwell       2007-05-01  229  EXPORT_SYMBOL(of_device_register);
f85ff3056cefdf Stephen Rothwell       2007-05-01  230  
94a0cb1fc61ab7 Grant Likely           2010-07-22 @231  void of_device_unregister(struct platform_device *ofdev)
f85ff3056cefdf Stephen Rothwell       2007-05-01  232  {
f85ff3056cefdf Stephen Rothwell       2007-05-01  233  	device_unregister(&ofdev->dev);
f85ff3056cefdf Stephen Rothwell       2007-05-01  234  }
f85ff3056cefdf Stephen Rothwell       2007-05-01  235  EXPORT_SYMBOL(of_device_unregister);
09e67ca2c52354 Stephen Rothwell       2008-05-16  236  

:::::: The code at line 35 was first introduced by commit
:::::: 7096d0422153ffcc2264eef652fc3a7bca3e6d3c of/device: Rework to use common platform_device_alloc() for allocating devices

:::::: TO: Grant Likely <grant.likely@secretlab.ca>
:::::: CC: Grant Likely <grant.likely@secretlab.ca>

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

                 reply	other threads:[~2023-06-10  0:35 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=202306100825.rfSNXbl6-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=oe-kbuild-all@lists.linux.dev \
    --cc=robh@kernel.org \
    /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.