Re: [PATCH v6 4/4] PCI: designware: Add iATU Unroll feature
From: kbuild test robot
Date: Wed Aug 17 2016 - 16:47:07 EST
Hi Joao,
[auto build test ERROR on pci/next]
[also build test ERROR on v4.8-rc2 next-20160817]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Bjorn-Helgaas/PCI-designware-Return-data-directly-from-dw_pcie_readl_rc/20160818-040531
base: https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git next
config: x86_64-randconfig-x015-201633 (attached as .config)
compiler: gcc-6 (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64
All error/warnings (new ones prefixed by >>):
drivers/pci/host/pcie-designware.c: In function 'dw_pcie_readl_unroll':
>> drivers/pci/host/pcie-designware.c:161:54: error: expected ')' before ';' token
u32 offset = PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index);
^
>> drivers/pci/host/pcie-designware.c:167:1: error: expected ',' or ';' before '}' token
}
^
>> drivers/pci/host/pcie-designware.c:169:20: error: invalid storage class for function 'dw_pcie_writel_unroll'
static inline void dw_pcie_writel_unroll(struct pcie_port *pp, u32 index,
^~~~~~~~~~~~~~~~~~~~~
drivers/pci/host/pcie-designware.c: In function 'dw_pcie_writel_unroll':
drivers/pci/host/pcie-designware.c:172:54: error: expected ')' before ';' token
u32 offset = PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index);
^
drivers/pci/host/pcie-designware.c:178:1: error: expected ',' or ';' before '}' token
}
^
>> drivers/pci/host/pcie-designware.c:180:12: error: invalid storage class for function 'dw_pcie_rd_own_conf'
static int dw_pcie_rd_own_conf(struct pcie_port *pp, int where, int size,
^~~~~~~~~~~~~~~~~~~
>> drivers/pci/host/pcie-designware.c:189:12: error: invalid storage class for function 'dw_pcie_wr_own_conf'
static int dw_pcie_wr_own_conf(struct pcie_port *pp, int where, int size,
^~~~~~~~~~~~~~~~~~~
>> drivers/pci/host/pcie-designware.c:198:13: error: invalid storage class for function 'dw_pcie_prog_outbound_atu'
static void dw_pcie_prog_outbound_atu(struct pcie_port *pp, int index,
^~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/pci/host/pcie-designware.c:304:13: error: invalid storage class for function 'dw_pcie_msi_clear_irq'
static void dw_pcie_msi_clear_irq(struct pcie_port *pp, int irq)
^~~~~~~~~~~~~~~~~~~~~
>> drivers/pci/host/pcie-designware.c:315:13: error: invalid storage class for function 'clear_irq_range'
static void clear_irq_range(struct pcie_port *pp, unsigned int irq_base,
^~~~~~~~~~~~~~~
>> drivers/pci/host/pcie-designware.c:332:13: error: invalid storage class for function 'dw_pcie_msi_set_irq'
static void dw_pcie_msi_set_irq(struct pcie_port *pp, int irq)
^~~~~~~~~~~~~~~~~~~
>> drivers/pci/host/pcie-designware.c:343:12: error: invalid storage class for function 'assign_irq'
static int assign_irq(int no_irqs, struct msi_desc *desc, int *pos)
^~~~~~~~~~
>> drivers/pci/host/pcie-designware.c:387:13: error: invalid storage class for function 'dw_msi_setup_msg'
static void dw_msi_setup_msg(struct pcie_port *pp, unsigned int irq, u32 pos)
^~~~~~~~~~~~~~~~
>> drivers/pci/host/pcie-designware.c:408:12: error: invalid storage class for function 'dw_msi_setup_irq'
static int dw_msi_setup_irq(struct msi_controller *chip, struct pci_dev *pdev,
^~~~~~~~~~~~~~~~
>> drivers/pci/host/pcie-designware.c:426:12: error: invalid storage class for function 'dw_msi_setup_irqs'
static int dw_msi_setup_irqs(struct msi_controller *chip, struct pci_dev *pdev,
^~~~~~~~~~~~~~~~~
>> drivers/pci/host/pcie-designware.c:453:13: error: invalid storage class for function 'dw_msi_teardown_irq'
static void dw_msi_teardown_irq(struct msi_controller *chip, unsigned int irq)
^~~~~~~~~~~~~~~~~~~
>> drivers/pci/host/pcie-designware.c:463:15: error: initializer element is not constant
.setup_irq = dw_msi_setup_irq,
^~~~~~~~~~~~~~~~
drivers/pci/host/pcie-designware.c:463:15: note: (near initialization for 'dw_pcie_msi_chip.setup_irq')
drivers/pci/host/pcie-designware.c:464:16: error: initializer element is not constant
.setup_irqs = dw_msi_setup_irqs,
^~~~~~~~~~~~~~~~~
drivers/pci/host/pcie-designware.c:464:16: note: (near initialization for 'dw_pcie_msi_chip.setup_irqs')
drivers/pci/host/pcie-designware.c:465:18: error: initializer element is not constant
.teardown_irq = dw_msi_teardown_irq,
^~~~~~~~~~~~~~~~~~~
drivers/pci/host/pcie-designware.c:465:18: note: (near initialization for 'dw_pcie_msi_chip.teardown_irq')
>> drivers/pci/host/pcie-designware.c:497:12: error: invalid storage class for function 'dw_pcie_msi_map'
static int dw_pcie_msi_map(struct irq_domain *domain, unsigned int irq,
^~~~~~~~~~~~~~~
drivers/pci/host/pcie-designware.c:507:9: error: initializer element is not constant
.map = dw_pcie_msi_map,
^~~~~~~~~~~~~~~
drivers/pci/host/pcie-designware.c:507:9: note: (near initialization for 'msi_domain_ops.map')
>> drivers/pci/host/pcie-designware.c:510:11: error: invalid storage class for function 'dw_pcie_iatu_unroll_enabled'
static u8 dw_pcie_iatu_unroll_enabled(struct pcie_port *pp)
^~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/pci/host/pcie-designware.c: In function 'dw_pcie_iatu_unroll_enabled':
>> drivers/pci/host/pcie-designware.c:514:2: error: too many arguments to function 'dw_pcie_readl_rc'
dw_pcie_readl_rc(pp, PCIE_ATU_VIEWPORT, &val);
^~~~~~~~~~~~~~~~
drivers/pci/host/pcie-designware.c:143:19: note: declared here
static inline u32 dw_pcie_readl_rc(struct pcie_port *pp, u32 reg)
^~~~~~~~~~~~~~~~
drivers/pci/host/pcie-designware.c: In function 'dw_pcie_writel_unroll':
>> drivers/pci/host/pcie-designware.c:678:12: error: invalid storage class for function 'dw_pcie_rd_other_conf'
static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus,
^~~~~~~~~~~~~~~~~~~~~
>> drivers/pci/host/pcie-designware.c:715:12: error: invalid storage class for function 'dw_pcie_wr_other_conf'
static int dw_pcie_wr_other_conf(struct pcie_port *pp, struct pci_bus *bus,
^~~~~~~~~~~~~~~~~~~~~
vim +161 drivers/pci/host/pcie-designware.c
137 else
138 return PCIBIOS_BAD_REGISTER_NUMBER;
139
140 return PCIBIOS_SUCCESSFUL;
141 }
142
> 143 static inline u32 dw_pcie_readl_rc(struct pcie_port *pp, u32 reg)
144 {
145 if (pp->ops->readl_rc)
146 return pp->ops->readl_rc(pp, pp->dbi_base + reg);
147
148 return readl(pp->dbi_base + reg);
149 }
150
151 static inline void dw_pcie_writel_rc(struct pcie_port *pp, u32 val, u32 reg)
152 {
153 if (pp->ops->writel_rc)
154 pp->ops->writel_rc(pp, val, pp->dbi_base + reg);
155 else
156 writel(val, pp->dbi_base + reg);
157 }
158
159 static inline u32 dw_pcie_readl_unroll(struct pcie_port *pp, u32 index, u32 reg)
160 {
> 161 u32 offset = PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index);
162
163 if (pp->ops->readl_rc)
164 return pp->ops->readl_rc(pp, pp->dbi_base + offset + reg);
165
166 return readl(pp->dbi_base + offset + reg);
> 167 }
168
> 169 static inline void dw_pcie_writel_unroll(struct pcie_port *pp, u32 index,
170 u32 val, u32 reg)
171 {
> 172 u32 offset = PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index);
173
174 if (pp->ops->writel_rc)
175 pp->ops->writel_rc(pp, val, pp->dbi_base + offset + reg);
176 else
177 writel(val, pp->dbi_base + offset + reg);
> 178 }
179
> 180 static int dw_pcie_rd_own_conf(struct pcie_port *pp, int where, int size,
181 u32 *val)
182 {
183 if (pp->ops->rd_own_conf)
184 return pp->ops->rd_own_conf(pp, where, size, val);
185
186 return dw_pcie_cfg_read(pp->dbi_base + where, size, val);
187 }
188
> 189 static int dw_pcie_wr_own_conf(struct pcie_port *pp, int where, int size,
190 u32 val)
191 {
192 if (pp->ops->wr_own_conf)
193 return pp->ops->wr_own_conf(pp, where, size, val);
194
195 return dw_pcie_cfg_write(pp->dbi_base + where, size, val);
196 }
197
> 198 static void dw_pcie_prog_outbound_atu(struct pcie_port *pp, int index,
199 int type, u64 cpu_addr, u64 pci_addr, u32 size)
200 {
201 u32 retries, val;
202
203 if (pp->iatu_unroll_enabled) {
204 dw_pcie_writel_unroll(pp, index,
205 lower_32_bits(cpu_addr), PCIE_ATU_UNR_LOWER_BASE);
206 dw_pcie_writel_unroll(pp, index,
207 upper_32_bits(cpu_addr), PCIE_ATU_UNR_UPPER_BASE);
208 dw_pcie_writel_unroll(pp, index,
209 lower_32_bits(cpu_addr + size - 1), PCIE_ATU_UNR_LIMIT);
210 dw_pcie_writel_unroll(pp, index,
211 lower_32_bits(pci_addr), PCIE_ATU_UNR_LOWER_TARGET);
212 dw_pcie_writel_unroll(pp, index,
213 upper_32_bits(pci_addr), PCIE_ATU_UNR_UPPER_TARGET);
214 dw_pcie_writel_unroll(pp, index,
215 type, PCIE_ATU_UNR_REGION_CTRL1);
216 dw_pcie_writel_unroll(pp, index,
217 PCIE_ATU_ENABLE, PCIE_ATU_UNR_REGION_CTRL2);
218 } else {
219 dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | index,
220 PCIE_ATU_VIEWPORT);
221 dw_pcie_writel_rc(pp, lower_32_bits(cpu_addr),
222 PCIE_ATU_LOWER_BASE);
223 dw_pcie_writel_rc(pp, upper_32_bits(cpu_addr),
224 PCIE_ATU_UPPER_BASE);
225 dw_pcie_writel_rc(pp, lower_32_bits(cpu_addr + size - 1),
226 PCIE_ATU_LIMIT);
227 dw_pcie_writel_rc(pp, lower_32_bits(pci_addr),
228 PCIE_ATU_LOWER_TARGET);
229 dw_pcie_writel_rc(pp, upper_32_bits(pci_addr),
230 PCIE_ATU_UPPER_TARGET);
231 dw_pcie_writel_rc(pp, type, PCIE_ATU_CR1);
232 dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2);
233 }
234
235 /*
236 * Make sure ATU enable takes effect before any subsequent config
237 * and I/O accesses.
238 */
239 for (retries = 0; retries < LINK_WAIT_MAX_IATU_RETRIES; retries++) {
240 if (pp->iatu_unroll_enabled)
241 val = dw_pcie_readl_unroll(pp, index,
242 PCIE_ATU_UNR_REGION_CTRL2);
243 else
244 val = dw_pcie_readl_rc(pp, PCIE_ATU_CR2);
245
246 if (val == PCIE_ATU_ENABLE)
247 return;
248
249 usleep_range(LINK_WAIT_IATU_MIN, LINK_WAIT_IATU_MAX);
250 }
251 dev_err(pp->dev, "iATU is not being enabled\n");
252 }
253
254 static struct irq_chip dw_msi_irq_chip = {
255 .name = "PCI-MSI",
256 .irq_enable = pci_msi_unmask_irq,
257 .irq_disable = pci_msi_mask_irq,
258 .irq_mask = pci_msi_mask_irq,
259 .irq_unmask = pci_msi_unmask_irq,
260 };
261
262 /* MSI int handler */
263 irqreturn_t dw_handle_msi_irq(struct pcie_port *pp)
264 {
265 unsigned long val;
266 int i, pos, irq;
267 irqreturn_t ret = IRQ_NONE;
268
269 for (i = 0; i < MAX_MSI_CTRLS; i++) {
270 dw_pcie_rd_own_conf(pp, PCIE_MSI_INTR0_STATUS + i * 12, 4,
271 (u32 *)&val);
272 if (val) {
273 ret = IRQ_HANDLED;
274 pos = 0;
275 while ((pos = find_next_bit(&val, 32, pos)) != 32) {
276 irq = irq_find_mapping(pp->irq_domain,
277 i * 32 + pos);
278 dw_pcie_wr_own_conf(pp,
279 PCIE_MSI_INTR0_STATUS + i * 12,
280 4, 1 << pos);
281 generic_handle_irq(irq);
282 pos++;
283 }
284 }
285 }
286
287 return ret;
288 }
289
290 void dw_pcie_msi_init(struct pcie_port *pp)
291 {
292 u64 msi_target;
293
294 pp->msi_data = __get_free_pages(GFP_KERNEL, 0);
295 msi_target = virt_to_phys((void *)pp->msi_data);
296
297 /* program the msi_data */
298 dw_pcie_wr_own_conf(pp, PCIE_MSI_ADDR_LO, 4,
299 (u32)(msi_target & 0xffffffff));
300 dw_pcie_wr_own_conf(pp, PCIE_MSI_ADDR_HI, 4,
301 (u32)(msi_target >> 32 & 0xffffffff));
302 }
303
> 304 static void dw_pcie_msi_clear_irq(struct pcie_port *pp, int irq)
305 {
306 unsigned int res, bit, val;
307
308 res = (irq / 32) * 12;
309 bit = irq % 32;
310 dw_pcie_rd_own_conf(pp, PCIE_MSI_INTR0_ENABLE + res, 4, &val);
311 val &= ~(1 << bit);
312 dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_ENABLE + res, 4, val);
313 }
314
> 315 static void clear_irq_range(struct pcie_port *pp, unsigned int irq_base,
316 unsigned int nvec, unsigned int pos)
317 {
318 unsigned int i;
319
320 for (i = 0; i < nvec; i++) {
321 irq_set_msi_desc_off(irq_base, i, NULL);
322 /* Disable corresponding interrupt on MSI controller */
323 if (pp->ops->msi_clear_irq)
324 pp->ops->msi_clear_irq(pp, pos + i);
325 else
326 dw_pcie_msi_clear_irq(pp, pos + i);
327 }
328
329 bitmap_release_region(pp->msi_irq_in_use, pos, order_base_2(nvec));
330 }
331
> 332 static void dw_pcie_msi_set_irq(struct pcie_port *pp, int irq)
333 {
334 unsigned int res, bit, val;
335
336 res = (irq / 32) * 12;
337 bit = irq % 32;
338 dw_pcie_rd_own_conf(pp, PCIE_MSI_INTR0_ENABLE + res, 4, &val);
339 val |= 1 << bit;
340 dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_ENABLE + res, 4, val);
341 }
342
> 343 static int assign_irq(int no_irqs, struct msi_desc *desc, int *pos)
344 {
345 int irq, pos0, i;
346 struct pcie_port *pp = (struct pcie_port *) msi_desc_to_pci_sysdata(desc);
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
Attachment:
.config.gz
Description: Binary data