1 // SPDX-License-Identifier: GPL-2.0
2 /* pci_common.c: PCI controller common support.
4 * Copyright (C) 1999, 2007 David S. Miller (davem@davemloft.net)
7 #include <linux/string.h>
8 #include <linux/slab.h>
10 #include <linux/device.h>
11 #include <linux/of_device.h>
14 #include <asm/oplib.h>
17 #include "pci_sun4v.h"
19 static int config_out_of_range(struct pci_pbm_info
*pbm
,
24 if (bus
< pbm
->pci_first_busno
||
25 bus
> pbm
->pci_last_busno
)
30 static void *sun4u_config_mkaddr(struct pci_pbm_info
*pbm
,
35 unsigned long rbits
= pbm
->config_space_reg_bits
;
37 if (config_out_of_range(pbm
, bus
, devfn
, reg
))
40 reg
= (reg
& ((1 << rbits
) - 1));
44 return (void *) (pbm
->config_space
| bus
| devfn
| reg
);
47 /* At least on Sabre, it is necessary to access all PCI host controller
48 * registers at their natural size, otherwise zeros are returned.
49 * Strange but true, and I see no language in the UltraSPARC-IIi
50 * programmer's manual that mentions this even indirectly.
52 static int sun4u_read_pci_cfg_host(struct pci_pbm_info
*pbm
,
53 unsigned char bus
, unsigned int devfn
,
54 int where
, int size
, u32
*value
)
60 addr
= sun4u_config_mkaddr(pbm
, bus
, devfn
, where
);
62 return PCIBIOS_SUCCESSFUL
;
67 unsigned long align
= (unsigned long) addr
;
70 pci_config_read16((u16
*)align
, &tmp16
);
74 *value
= tmp16
& 0xff;
76 pci_config_read8((u8
*)addr
, &tmp8
);
83 pci_config_read16((u16
*)addr
, &tmp16
);
86 pci_config_read8((u8
*)addr
, &tmp8
);
88 pci_config_read8(((u8
*)addr
) + 1, &tmp8
);
89 *value
|= ((u32
) tmp8
) << 8;
95 sun4u_read_pci_cfg_host(pbm
, bus
, devfn
,
100 sun4u_read_pci_cfg_host(pbm
, bus
, devfn
,
101 where
+ 2, 2, &tmp32
);
102 *value
|= tmp32
<< 16;
105 return PCIBIOS_SUCCESSFUL
;
108 static int sun4u_read_pci_cfg(struct pci_bus
*bus_dev
, unsigned int devfn
,
109 int where
, int size
, u32
*value
)
111 struct pci_pbm_info
*pbm
= bus_dev
->sysdata
;
112 unsigned char bus
= bus_dev
->number
;
129 if (!bus_dev
->number
&& !PCI_SLOT(devfn
))
130 return sun4u_read_pci_cfg_host(pbm
, bus
, devfn
, where
,
133 addr
= sun4u_config_mkaddr(pbm
, bus
, devfn
, where
);
135 return PCIBIOS_SUCCESSFUL
;
139 pci_config_read8((u8
*)addr
, &tmp8
);
145 printk("pci_read_config_word: misaligned reg [%x]\n",
147 return PCIBIOS_SUCCESSFUL
;
149 pci_config_read16((u16
*)addr
, &tmp16
);
150 *value
= (u32
) tmp16
;
155 printk("pci_read_config_dword: misaligned reg [%x]\n",
157 return PCIBIOS_SUCCESSFUL
;
159 pci_config_read32(addr
, value
);
162 return PCIBIOS_SUCCESSFUL
;
165 static int sun4u_write_pci_cfg_host(struct pci_pbm_info
*pbm
,
166 unsigned char bus
, unsigned int devfn
,
167 int where
, int size
, u32 value
)
171 addr
= sun4u_config_mkaddr(pbm
, bus
, devfn
, where
);
173 return PCIBIOS_SUCCESSFUL
;
178 unsigned long align
= (unsigned long) addr
;
182 pci_config_read16((u16
*)align
, &tmp16
);
190 pci_config_write16((u16
*)align
, tmp16
);
192 pci_config_write8((u8
*)addr
, value
);
196 pci_config_write16((u16
*)addr
, value
);
198 pci_config_write8((u8
*)addr
, value
& 0xff);
199 pci_config_write8(((u8
*)addr
) + 1, value
>> 8);
203 sun4u_write_pci_cfg_host(pbm
, bus
, devfn
,
204 where
, 2, value
& 0xffff);
205 sun4u_write_pci_cfg_host(pbm
, bus
, devfn
,
206 where
+ 2, 2, value
>> 16);
209 return PCIBIOS_SUCCESSFUL
;
212 static int sun4u_write_pci_cfg(struct pci_bus
*bus_dev
, unsigned int devfn
,
213 int where
, int size
, u32 value
)
215 struct pci_pbm_info
*pbm
= bus_dev
->sysdata
;
216 unsigned char bus
= bus_dev
->number
;
219 if (!bus_dev
->number
&& !PCI_SLOT(devfn
))
220 return sun4u_write_pci_cfg_host(pbm
, bus
, devfn
, where
,
223 addr
= sun4u_config_mkaddr(pbm
, bus
, devfn
, where
);
225 return PCIBIOS_SUCCESSFUL
;
229 pci_config_write8((u8
*)addr
, value
);
234 printk("pci_write_config_word: misaligned reg [%x]\n",
236 return PCIBIOS_SUCCESSFUL
;
238 pci_config_write16((u16
*)addr
, value
);
243 printk("pci_write_config_dword: misaligned reg [%x]\n",
245 return PCIBIOS_SUCCESSFUL
;
247 pci_config_write32(addr
, value
);
249 return PCIBIOS_SUCCESSFUL
;
252 struct pci_ops sun4u_pci_ops
= {
253 .read
= sun4u_read_pci_cfg
,
254 .write
= sun4u_write_pci_cfg
,
257 static int sun4v_read_pci_cfg(struct pci_bus
*bus_dev
, unsigned int devfn
,
258 int where
, int size
, u32
*value
)
260 struct pci_pbm_info
*pbm
= bus_dev
->sysdata
;
261 u32 devhandle
= pbm
->devhandle
;
262 unsigned int bus
= bus_dev
->number
;
263 unsigned int device
= PCI_SLOT(devfn
);
264 unsigned int func
= PCI_FUNC(devfn
);
267 if (config_out_of_range(pbm
, bus
, devfn
, where
)) {
270 ret
= pci_sun4v_config_get(devhandle
,
271 HV_PCI_DEVICE_BUILD(bus
, device
, func
),
279 *value
= ret
& 0xffff;
282 *value
= ret
& 0xffffffff;
287 return PCIBIOS_SUCCESSFUL
;
290 static int sun4v_write_pci_cfg(struct pci_bus
*bus_dev
, unsigned int devfn
,
291 int where
, int size
, u32 value
)
293 struct pci_pbm_info
*pbm
= bus_dev
->sysdata
;
294 u32 devhandle
= pbm
->devhandle
;
295 unsigned int bus
= bus_dev
->number
;
296 unsigned int device
= PCI_SLOT(devfn
);
297 unsigned int func
= PCI_FUNC(devfn
);
299 if (config_out_of_range(pbm
, bus
, devfn
, where
)) {
302 /* We don't check for hypervisor errors here, but perhaps
303 * we should and influence our return value depending upon
304 * what kind of error is thrown.
306 pci_sun4v_config_put(devhandle
,
307 HV_PCI_DEVICE_BUILD(bus
, device
, func
),
310 return PCIBIOS_SUCCESSFUL
;
313 struct pci_ops sun4v_pci_ops
= {
314 .read
= sun4v_read_pci_cfg
,
315 .write
= sun4v_write_pci_cfg
,
318 void pci_get_pbm_props(struct pci_pbm_info
*pbm
)
320 const u32
*val
= of_get_property(pbm
->op
->dev
.of_node
, "bus-range", NULL
);
322 pbm
->pci_first_busno
= val
[0];
323 pbm
->pci_last_busno
= val
[1];
325 val
= of_get_property(pbm
->op
->dev
.of_node
, "ino-bitmap", NULL
);
327 pbm
->ino_bitmap
= (((u64
)val
[1] << 32UL) |
328 ((u64
)val
[0] << 0UL));
332 static void pci_register_iommu_region(struct pci_pbm_info
*pbm
)
334 const u32
*vdma
= of_get_property(pbm
->op
->dev
.of_node
, "virtual-dma",
338 struct resource
*rp
= kzalloc(sizeof(*rp
), GFP_KERNEL
);
341 pr_info("%s: Cannot allocate IOMMU resource.\n",
346 rp
->start
= pbm
->mem_space
.start
+ (unsigned long) vdma
[0];
347 rp
->end
= rp
->start
+ (unsigned long) vdma
[1] - 1UL;
348 rp
->flags
= IORESOURCE_BUSY
;
349 if (request_resource(&pbm
->mem_space
, rp
)) {
350 pr_info("%s: Unable to request IOMMU resource.\n",
357 void pci_determine_mem_io_space(struct pci_pbm_info
*pbm
)
359 const struct linux_prom_pci_ranges
*pbm_ranges
;
360 int i
, saw_mem
, saw_io
;
363 /* Corresponding generic code in of_pci_get_host_bridge_resources() */
365 saw_mem
= saw_io
= 0;
366 pbm_ranges
= of_get_property(pbm
->op
->dev
.of_node
, "ranges", &i
);
368 prom_printf("PCI: Fatal error, missing PBM ranges property "
374 num_pbm_ranges
= i
/ sizeof(*pbm_ranges
);
375 memset(&pbm
->mem64_space
, 0, sizeof(struct resource
));
377 for (i
= 0; i
< num_pbm_ranges
; i
++) {
378 const struct linux_prom_pci_ranges
*pr
= &pbm_ranges
[i
];
379 unsigned long a
, size
, region_a
;
380 u32 parent_phys_hi
, parent_phys_lo
;
381 u32 child_phys_mid
, child_phys_lo
;
382 u32 size_hi
, size_lo
;
385 parent_phys_hi
= pr
->parent_phys_hi
;
386 parent_phys_lo
= pr
->parent_phys_lo
;
387 child_phys_mid
= pr
->child_phys_mid
;
388 child_phys_lo
= pr
->child_phys_lo
;
389 if (tlb_type
== hypervisor
)
390 parent_phys_hi
&= 0x0fffffff;
392 size_hi
= pr
->size_hi
;
393 size_lo
= pr
->size_lo
;
395 type
= (pr
->child_phys_hi
>> 24) & 0x3;
396 a
= (((unsigned long)parent_phys_hi
<< 32UL) |
397 ((unsigned long)parent_phys_lo
<< 0UL));
398 region_a
= (((unsigned long)child_phys_mid
<< 32UL) |
399 ((unsigned long)child_phys_lo
<< 0UL));
400 size
= (((unsigned long)size_hi
<< 32UL) |
401 ((unsigned long)size_lo
<< 0UL));
405 /* PCI config space, 16MB */
406 pbm
->config_space
= a
;
410 /* 16-bit IO space, 16MB */
411 pbm
->io_space
.start
= a
;
412 pbm
->io_space
.end
= a
+ size
- 1UL;
413 pbm
->io_space
.flags
= IORESOURCE_IO
;
414 pbm
->io_offset
= a
- region_a
;
419 /* 32-bit MEM space, 2GB */
420 pbm
->mem_space
.start
= a
;
421 pbm
->mem_space
.end
= a
+ size
- 1UL;
422 pbm
->mem_space
.flags
= IORESOURCE_MEM
;
423 pbm
->mem_offset
= a
- region_a
;
428 /* 64-bit MEM handling */
429 pbm
->mem64_space
.start
= a
;
430 pbm
->mem64_space
.end
= a
+ size
- 1UL;
431 pbm
->mem64_space
.flags
= IORESOURCE_MEM
;
432 pbm
->mem64_offset
= a
- region_a
;
441 if (!saw_io
|| !saw_mem
) {
442 prom_printf("%s: Fatal error, missing %s PBM range.\n",
444 (!saw_io
? "IO" : "MEM"));
448 if (pbm
->io_space
.flags
)
449 printk("%s: PCI IO %pR offset %llx\n",
450 pbm
->name
, &pbm
->io_space
, pbm
->io_offset
);
451 if (pbm
->mem_space
.flags
)
452 printk("%s: PCI MEM %pR offset %llx\n",
453 pbm
->name
, &pbm
->mem_space
, pbm
->mem_offset
);
454 if (pbm
->mem64_space
.flags
&& pbm
->mem_space
.flags
) {
455 if (pbm
->mem64_space
.start
<= pbm
->mem_space
.end
)
456 pbm
->mem64_space
.start
= pbm
->mem_space
.end
+ 1;
457 if (pbm
->mem64_space
.start
> pbm
->mem64_space
.end
)
458 pbm
->mem64_space
.flags
= 0;
461 if (pbm
->mem64_space
.flags
)
462 printk("%s: PCI MEM64 %pR offset %llx\n",
463 pbm
->name
, &pbm
->mem64_space
, pbm
->mem64_offset
);
465 pbm
->io_space
.name
= pbm
->mem_space
.name
= pbm
->name
;
466 pbm
->mem64_space
.name
= pbm
->name
;
468 request_resource(&ioport_resource
, &pbm
->io_space
);
469 request_resource(&iomem_resource
, &pbm
->mem_space
);
470 if (pbm
->mem64_space
.flags
)
471 request_resource(&iomem_resource
, &pbm
->mem64_space
);
473 pci_register_iommu_region(pbm
);
476 /* Generic helper routines for PCI error reporting. */
477 void pci_scan_for_target_abort(struct pci_pbm_info
*pbm
,
478 struct pci_bus
*pbus
)
480 struct pci_dev
*pdev
;
483 list_for_each_entry(pdev
, &pbus
->devices
, bus_list
) {
484 u16 status
, error_bits
;
486 pci_read_config_word(pdev
, PCI_STATUS
, &status
);
488 (status
& (PCI_STATUS_SIG_TARGET_ABORT
|
489 PCI_STATUS_REC_TARGET_ABORT
));
491 pci_write_config_word(pdev
, PCI_STATUS
, error_bits
);
492 pci_info(pdev
, "%s: Device saw Target Abort [%016x]\n",
497 list_for_each_entry(bus
, &pbus
->children
, node
)
498 pci_scan_for_target_abort(pbm
, bus
);
501 void pci_scan_for_master_abort(struct pci_pbm_info
*pbm
,
502 struct pci_bus
*pbus
)
504 struct pci_dev
*pdev
;
507 list_for_each_entry(pdev
, &pbus
->devices
, bus_list
) {
508 u16 status
, error_bits
;
510 pci_read_config_word(pdev
, PCI_STATUS
, &status
);
512 (status
& (PCI_STATUS_REC_MASTER_ABORT
));
514 pci_write_config_word(pdev
, PCI_STATUS
, error_bits
);
515 pci_info(pdev
, "%s: Device received Master Abort "
516 "[%016x]\n", pbm
->name
, status
);
520 list_for_each_entry(bus
, &pbus
->children
, node
)
521 pci_scan_for_master_abort(pbm
, bus
);
524 void pci_scan_for_parity_error(struct pci_pbm_info
*pbm
,
525 struct pci_bus
*pbus
)
527 struct pci_dev
*pdev
;
530 list_for_each_entry(pdev
, &pbus
->devices
, bus_list
) {
531 u16 status
, error_bits
;
533 pci_read_config_word(pdev
, PCI_STATUS
, &status
);
535 (status
& (PCI_STATUS_PARITY
|
536 PCI_STATUS_DETECTED_PARITY
));
538 pci_write_config_word(pdev
, PCI_STATUS
, error_bits
);
539 pci_info(pdev
, "%s: Device saw Parity Error [%016x]\n",
544 list_for_each_entry(bus
, &pbus
->children
, node
)
545 pci_scan_for_parity_error(pbm
, bus
);