* Re: [PATCH v7 08/12] device core: Introduce DMA range map, supplanting dma_pfn_offset
[not found] <20200708193219.47134-9-james.quinlan@broadcom.com>
@ 2020-07-11 8:40 ` kernel test robot
0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2020-07-11 8:40 UTC (permalink / raw)
To: Jim Quinlan, linux-pci, Nicolas Saenz Julienne, bcm-kernel-feedback-list
Cc: kbuild-all, Ulf Hansson, Rich Felker, open list:SUPERH,
David Airlie, Hanjun Guo,
open list:REMOTE PROCESSOR REMOTEPROC SUBSYSTEM
[-- Attachment #1: Type: text/plain, Size: 6936 bytes --]
Hi Jim,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on pci/next]
[also build test ERROR on robh/for-next sunxi/sunxi/for-next linuxtv-media/master usb/usb-testing linus/master v5.8-rc4 next-20200710]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Jim-Quinlan/PCI-brcmstb-enable-PCIe-for-STB-chips/20200709-033557
base: https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git next
config: m68k-randconfig-r035-20200710 (attached as .config)
compiler: m68k-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=m68k
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
drivers/of/device.c: In function 'of_dma_configure':
>> drivers/of/device.c:116:37: error: dereferencing pointer to incomplete type 'const struct bus_dma_region'
116 | for (dma_start = ~(dma_addr_t)0; r->size; r++) {
| ^~
>> drivers/of/device.c:116:46: error: increment of pointer to an incomplete type 'const struct bus_dma_region'
116 | for (dma_start = ~(dma_addr_t)0; r->size; r++) {
| ^~
In file included from drivers/of/device.c:8:
At top level:
include/linux/dma-mapping.h:498:12: warning: 'dma_attach_offset_range' defined but not used [-Wunused-function]
498 | static int dma_attach_offset_range(struct device *dev, phys_addr_t cpu_start,
| ^~~~~~~~~~~~~~~~~~~~~~~
--
drivers/of/address.c: In function 'dma_create_offset_map':
>> drivers/of/address.c:929:37: error: dereferencing pointer to incomplete type 'struct bus_dma_region'
929 | r = kcalloc(num_ranges + 1, sizeof(*r), GFP_KERNEL);
| ^~
>> drivers/of/address.c:950:4: error: increment of pointer to an incomplete type 'struct bus_dma_region'
950 | r++;
| ^~
In file included from include/linux/pci-dma-compat.h:8,
from include/linux/pci.h:2415,
from drivers/of/address.c:11:
At top level:
include/linux/dma-mapping.h:498:12: warning: 'dma_attach_offset_range' defined but not used [-Wunused-function]
498 | static int dma_attach_offset_range(struct device *dev, phys_addr_t cpu_start,
| ^~~~~~~~~~~~~~~~~~~~~~~
vim +116 drivers/of/device.c
74
75 /**
76 * of_dma_configure - Setup DMA configuration
77 * @dev: Device to apply DMA configuration
78 * @np: Pointer to OF node having DMA configuration
79 * @force_dma: Whether device is to be set up by of_dma_configure() even if
80 * DMA capability is not explicitly described by firmware.
81 *
82 * Try to get devices's DMA configuration from DT and update it
83 * accordingly.
84 *
85 * If platform code needs to use its own special DMA configuration, it
86 * can use a platform bus notifier and handle BUS_NOTIFY_ADD_DEVICE events
87 * to fix up DMA configuration.
88 */
89 int of_dma_configure(struct device *dev, struct device_node *np, bool force_dma)
90 {
91 const struct iommu_ops *iommu;
92 const struct bus_dma_region *map;
93 dma_addr_t dma_start = 0;
94 u64 mask, end, size = 0;
95 bool coherent;
96 int ret;
97
98 map = of_dma_get_range(np);
99 ret = PTR_ERR_OR_ZERO(map);
100 if (ret < 0) {
101 /*
102 * For legacy reasons, we have to assume some devices need
103 * DMA configuration regardless of whether "dma-ranges" is
104 * correctly specified or not.
105 */
106 if (!force_dma)
107 return ret == -ENODEV ? 0 : ret;
108
109 dma_start = 0;
110 map = NULL;
111 } else if (map) {
112 const struct bus_dma_region *r = map;
113 dma_addr_t dma_end = 0;
114
115 /* Determine the overall bounds of all DMA regions */
> 116 for (dma_start = ~(dma_addr_t)0; r->size; r++) {
117 /* Take lower and upper limits */
118 if (r->dma_start < dma_start)
119 dma_start = r->dma_start;
120 if (r->dma_start + r->size > dma_end)
121 dma_end = r->dma_start + r->size;
122 }
123 size = dma_end - dma_start;
124
125 /*
126 * Add a work around to treat the size as mask + 1 in case
127 * it is defined in DT as a mask.
128 */
129 if (size & 1) {
130 dev_warn(dev, "Invalid size 0x%llx for dma-range(s)\n", size);
131 size = size + 1;
132 }
133
134 if (!size) {
135 dev_err(dev, "Adjusted size 0x%llx invalid\n", size);
136 kfree(map);
137 return -EINVAL;
138 }
139 }
140
141 /*
142 * If @dev is expected to be DMA-capable then the bus code that created
143 * it should have initialised its dma_mask pointer by this point. For
144 * now, we'll continue the legacy behaviour of coercing it to the
145 * coherent mask if not, but we'll no longer do so quietly.
146 */
147 if (!dev->dma_mask) {
148 dev_warn(dev, "DMA mask not set\n");
149 dev->dma_mask = &dev->coherent_dma_mask;
150 }
151
152 if (!size && dev->coherent_dma_mask)
153 size = max(dev->coherent_dma_mask, dev->coherent_dma_mask + 1);
154 else if (!size)
155 size = 1ULL << 32;
156
157 /*
158 * Limit coherent and dma mask based on size and default mask
159 * set by the driver.
160 */
161 end = dma_start + size - 1;
162 mask = DMA_BIT_MASK(ilog2(end) + 1);
163 dev->coherent_dma_mask &= mask;
164 *dev->dma_mask &= mask;
165 /* ...but only set bus limit if we found valid dma-ranges earlier */
166 if (!ret)
167 dev->bus_dma_limit = end;
168
169 coherent = of_dma_is_coherent(np);
170 dev_dbg(dev, "device is%sdma coherent\n",
171 coherent ? " " : " not ");
172
173 iommu = of_iommu_configure(dev, np);
174 if (PTR_ERR(iommu) == -EPROBE_DEFER) {
175 kfree(map);
176 return -EPROBE_DEFER;
177 }
178
179 dev_dbg(dev, "device is%sbehind an iommu\n",
180 iommu ? " " : " not ");
181
182 arch_setup_dma_ops(dev, dma_start, size, iommu, coherent);
183
184 dev->dma_range_map = map;
185 return 0;
186 }
187 EXPORT_SYMBOL_GPL(of_dma_configure);
188
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 26495 bytes --]
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2020-07-11 8:40 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20200708193219.47134-9-james.quinlan@broadcom.com>
2020-07-11 8:40 ` [PATCH v7 08/12] device core: Introduce DMA range map, supplanting dma_pfn_offset kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).