2 * Alchemy PCI host mode support.
4 * Copyright 2001-2003, 2007-2008 MontaVista Software Inc.
5 * Author: MontaVista Software, Inc. <source@mvista.com>
7 * Support for all devices (greater than 16) added by David Gathright.
10 #include <linux/types.h>
11 #include <linux/pci.h>
12 #include <linux/platform_device.h>
13 #include <linux/kernel.h>
14 #include <linux/init.h>
15 #include <linux/vmalloc.h>
17 #include <asm/mach-au1x00/au1000.h>
19 #ifdef CONFIG_DEBUG_PCI
20 #define DBG(x...) printk(KERN_DEBUG x)
22 #define DBG(x...) do {} while (0)
25 #define PCI_ACCESS_READ 0
26 #define PCI_ACCESS_WRITE 1
28 struct alchemy_pci_context
{
29 struct pci_controller alchemy_pci_ctrl
; /* leave as first member! */
30 void __iomem
*regs
; /* ctrl base */
31 /* tools for wired entry for config space access */
32 unsigned long last_elo0
;
33 unsigned long last_elo1
;
35 struct vm_struct
*pci_cfg_vm
;
39 int (*board_map_irq
)(const struct pci_dev
*d
, u8 slot
, u8 pin
);
40 int (*board_pci_idsel
)(unsigned int devsel
, int assert);
43 /* IO/MEM resources for PCI. Keep the memres in sync with __fixup_bigphys_addr
44 * in arch/mips/alchemy/common/setup.c
46 static struct resource alchemy_pci_def_memres
= {
47 .start
= ALCHEMY_PCI_MEMWIN_START
,
48 .end
= ALCHEMY_PCI_MEMWIN_END
,
49 .name
= "PCI memory space",
50 .flags
= IORESOURCE_MEM
53 static struct resource alchemy_pci_def_iores
= {
54 .start
= ALCHEMY_PCI_IOWIN_START
,
55 .end
= ALCHEMY_PCI_IOWIN_END
,
56 .name
= "PCI IO space",
57 .flags
= IORESOURCE_IO
60 static void mod_wired_entry(int entry
, unsigned long entrylo0
,
61 unsigned long entrylo1
, unsigned long entryhi
,
62 unsigned long pagemask
)
64 unsigned long old_pagemask
;
65 unsigned long old_ctx
;
67 /* Save old context and create impossible VPN2 value */
68 old_ctx
= read_c0_entryhi() & 0xff;
69 old_pagemask
= read_c0_pagemask();
70 write_c0_index(entry
);
71 write_c0_pagemask(pagemask
);
72 write_c0_entryhi(entryhi
);
73 write_c0_entrylo0(entrylo0
);
74 write_c0_entrylo1(entrylo1
);
76 write_c0_entryhi(old_ctx
);
77 write_c0_pagemask(old_pagemask
);
80 static void alchemy_pci_wired_entry(struct alchemy_pci_context
*ctx
)
82 ctx
->wired_entry
= read_c0_wired();
83 add_wired_entry(0, 0, (unsigned long)ctx
->pci_cfg_vm
->addr
, PM_4K
);
84 ctx
->last_elo0
= ctx
->last_elo1
= ~0;
87 static int config_access(unsigned char access_type
, struct pci_bus
*bus
,
88 unsigned int dev_fn
, unsigned char where
, u32
*data
)
90 struct alchemy_pci_context
*ctx
= bus
->sysdata
;
91 unsigned int device
= PCI_SLOT(dev_fn
);
92 unsigned int function
= PCI_FUNC(dev_fn
);
93 unsigned long offset
, status
, cfg_base
, flags
, entryLo0
, entryLo1
, r
;
94 int error
= PCIBIOS_SUCCESSFUL
;
101 /* YAMON on all db1xxx boards wipes the TLB and writes zero to C0_wired
102 * on resume, clearing our wired entry. Unfortunately the ->resume()
103 * callback is called way way way too late (and ->suspend() too early)
104 * to have them destroy and recreate it. Instead just test if c0_wired
105 * is now lower than the index we retrieved before suspending and then
106 * recreate the entry if necessary. Of course this is totally bonkers
107 * and breaks as soon as someone else adds another wired entry somewhere
108 * else. Anyone have any ideas how to handle this better?
110 if (unlikely(read_c0_wired() < ctx
->wired_entry
))
111 alchemy_pci_wired_entry(ctx
);
113 local_irq_save(flags
);
114 r
= __raw_readl(ctx
->regs
+ PCI_REG_STATCMD
) & 0x0000ffff;
115 r
|= PCI_STATCMD_STATUS(0x2000);
116 __raw_writel(r
, ctx
->regs
+ PCI_REG_STATCMD
);
119 /* Allow board vendors to implement their own off-chip IDSEL.
120 * If it doesn't succeed, may as well bail out at this point.
122 if (ctx
->board_pci_idsel(device
, 1) == 0) {
124 local_irq_restore(flags
);
128 /* Setup the config window */
129 if (bus
->number
== 0)
130 cfg_base
= (1 << device
) << 11;
132 cfg_base
= 0x80000000 | (bus
->number
<< 16) | (device
<< 11);
134 /* Setup the lower bits of the 36-bit address */
135 offset
= (function
<< 8) | (where
& ~0x3);
136 /* Pick up any address that falls below the page mask */
137 offset
|= cfg_base
& ~PAGE_MASK
;
140 cfg_base
= cfg_base
& PAGE_MASK
;
142 /* To improve performance, if the current device is the same as
143 * the last device accessed, we don't touch the TLB.
145 entryLo0
= (6 << 26) | (cfg_base
>> 6) | (2 << 3) | 7;
146 entryLo1
= (6 << 26) | (cfg_base
>> 6) | (0x1000 >> 6) | (2 << 3) | 7;
147 if ((entryLo0
!= ctx
->last_elo0
) || (entryLo1
!= ctx
->last_elo1
)) {
148 mod_wired_entry(ctx
->wired_entry
, entryLo0
, entryLo1
,
149 (unsigned long)ctx
->pci_cfg_vm
->addr
, PM_4K
);
150 ctx
->last_elo0
= entryLo0
;
151 ctx
->last_elo1
= entryLo1
;
154 if (access_type
== PCI_ACCESS_WRITE
)
155 __raw_writel(*data
, ctx
->pci_cfg_vm
->addr
+ offset
);
157 *data
= __raw_readl(ctx
->pci_cfg_vm
->addr
+ offset
);
160 DBG("alchemy-pci: cfg access %d bus %u dev %u at %x dat %x conf %lx\n",
161 access_type
, bus
->number
, device
, where
, *data
, offset
);
163 /* check for errors, master abort */
164 status
= __raw_readl(ctx
->regs
+ PCI_REG_STATCMD
);
165 if (status
& (1 << 29)) {
168 DBG("alchemy-pci: master abort on cfg access %d bus %d dev %d",
169 access_type
, bus
->number
, device
);
170 } else if ((status
>> 28) & 0xf) {
171 DBG("alchemy-pci: PCI ERR detected: dev %d, status %lx\n",
172 device
, (status
>> 28) & 0xf);
175 __raw_writel(status
& 0xf000ffff, ctx
->regs
+ PCI_REG_STATCMD
);
181 /* Take away the IDSEL. */
182 (void)ctx
->board_pci_idsel(device
, 0);
184 local_irq_restore(flags
);
188 static int read_config_byte(struct pci_bus
*bus
, unsigned int devfn
,
192 int ret
= config_access(PCI_ACCESS_READ
, bus
, devfn
, where
, &data
);
202 static int read_config_word(struct pci_bus
*bus
, unsigned int devfn
,
206 int ret
= config_access(PCI_ACCESS_READ
, bus
, devfn
, where
, &data
);
210 *val
= data
& 0xffff;
214 static int read_config_dword(struct pci_bus
*bus
, unsigned int devfn
,
217 return config_access(PCI_ACCESS_READ
, bus
, devfn
, where
, val
);
220 static int write_config_byte(struct pci_bus
*bus
, unsigned int devfn
,
225 if (config_access(PCI_ACCESS_READ
, bus
, devfn
, where
, &data
))
228 data
= (data
& ~(0xff << ((where
& 3) << 3))) |
229 (val
<< ((where
& 3) << 3));
231 if (config_access(PCI_ACCESS_WRITE
, bus
, devfn
, where
, &data
))
234 return PCIBIOS_SUCCESSFUL
;
237 static int write_config_word(struct pci_bus
*bus
, unsigned int devfn
,
242 if (config_access(PCI_ACCESS_READ
, bus
, devfn
, where
, &data
))
245 data
= (data
& ~(0xffff << ((where
& 3) << 3))) |
246 (val
<< ((where
& 3) << 3));
248 if (config_access(PCI_ACCESS_WRITE
, bus
, devfn
, where
, &data
))
251 return PCIBIOS_SUCCESSFUL
;
254 static int write_config_dword(struct pci_bus
*bus
, unsigned int devfn
,
257 return config_access(PCI_ACCESS_WRITE
, bus
, devfn
, where
, &val
);
260 static int alchemy_pci_read(struct pci_bus
*bus
, unsigned int devfn
,
261 int where
, int size
, u32
*val
)
266 int rc
= read_config_byte(bus
, devfn
, where
, &_val
);
273 int rc
= read_config_word(bus
, devfn
, where
, &_val
);
279 return read_config_dword(bus
, devfn
, where
, val
);
283 static int alchemy_pci_write(struct pci_bus
*bus
, unsigned int devfn
,
284 int where
, int size
, u32 val
)
288 return write_config_byte(bus
, devfn
, where
, (u8
) val
);
290 return write_config_word(bus
, devfn
, where
, (u16
) val
);
292 return write_config_dword(bus
, devfn
, where
, val
);
296 static struct pci_ops alchemy_pci_ops
= {
297 .read
= alchemy_pci_read
,
298 .write
= alchemy_pci_write
,
301 static int alchemy_pci_def_idsel(unsigned int devsel
, int assert)
303 return 1; /* success */
306 static int __devinit
alchemy_pci_probe(struct platform_device
*pdev
)
308 struct alchemy_pci_platdata
*pd
= pdev
->dev
.platform_data
;
309 struct alchemy_pci_context
*ctx
;
310 void __iomem
*virt_io
;
315 /* need at least PCI IRQ mapping table */
317 dev_err(&pdev
->dev
, "need platform data for PCI setup\n");
322 ctx
= kzalloc(sizeof(*ctx
), GFP_KERNEL
);
324 dev_err(&pdev
->dev
, "no memory for pcictl context\n");
329 r
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
331 dev_err(&pdev
->dev
, "no pcictl ctrl regs resource\n");
336 if (!request_mem_region(r
->start
, resource_size(r
), pdev
->name
)) {
337 dev_err(&pdev
->dev
, "cannot claim pci regs\n");
342 ctx
->regs
= ioremap_nocache(r
->start
, resource_size(r
));
344 dev_err(&pdev
->dev
, "cannot map pci regs\n");
349 /* map parts of the PCI IO area */
350 /* REVISIT: if this changes with a newer variant (doubt it) make this
351 * a platform resource.
353 virt_io
= ioremap(AU1500_PCI_IO_PHYS_ADDR
, 0x00100000);
355 dev_err(&pdev
->dev
, "cannot remap pci io space\n");
359 ctx
->alchemy_pci_ctrl
.io_map_base
= (unsigned long)virt_io
;
361 #ifdef CONFIG_DMA_NONCOHERENT
362 /* Au1500 revisions older than AD have borked coherent PCI */
363 if ((alchemy_get_cputype() == ALCHEMY_CPU_AU1500
) &&
364 (read_c0_prid() < 0x01030202)) {
365 val
= __raw_readl(ctx
->regs
+ PCI_REG_CONFIG
);
366 val
|= PCI_CONFIG_NC
;
367 __raw_writel(val
, ctx
->regs
+ PCI_REG_CONFIG
);
369 dev_info(&pdev
->dev
, "non-coherent PCI on Au1500 AA/AB/AC\n");
373 if (pd
->board_map_irq
)
374 ctx
->board_map_irq
= pd
->board_map_irq
;
376 if (pd
->board_pci_idsel
)
377 ctx
->board_pci_idsel
= pd
->board_pci_idsel
;
379 ctx
->board_pci_idsel
= alchemy_pci_def_idsel
;
381 /* fill in relevant pci_controller members */
382 ctx
->alchemy_pci_ctrl
.pci_ops
= &alchemy_pci_ops
;
383 ctx
->alchemy_pci_ctrl
.mem_resource
= &alchemy_pci_def_memres
;
384 ctx
->alchemy_pci_ctrl
.io_resource
= &alchemy_pci_def_iores
;
386 /* we can't ioremap the entire pci config space because it's too large,
387 * nor can we dynamically ioremap it because some drivers use the
388 * PCI config routines from within atomic contex and that becomes a
389 * problem in get_vm_area(). Instead we use one wired TLB entry to
390 * handle all config accesses for all busses.
392 ctx
->pci_cfg_vm
= get_vm_area(0x2000, VM_IOREMAP
);
393 if (!ctx
->pci_cfg_vm
) {
394 dev_err(&pdev
->dev
, "unable to get vm area\n");
398 ctx
->wired_entry
= 8192; /* impossibly high value */
400 set_io_port_base((unsigned long)ctx
->alchemy_pci_ctrl
.io_map_base
);
402 /* board may want to modify bits in the config register, do it now */
403 val
= __raw_readl(ctx
->regs
+ PCI_REG_CONFIG
);
404 val
&= ~pd
->pci_cfg_clr
;
405 val
|= pd
->pci_cfg_set
;
406 val
&= ~PCI_CONFIG_PD
; /* clear disable bit */
407 __raw_writel(val
, ctx
->regs
+ PCI_REG_CONFIG
);
410 platform_set_drvdata(pdev
, ctx
);
411 register_pci_controller(&ctx
->alchemy_pci_ctrl
);
420 release_mem_region(r
->start
, resource_size(r
));
429 /* save PCI controller register contents. */
430 static int alchemy_pci_suspend(struct device
*dev
)
432 struct alchemy_pci_context
*ctx
= dev_get_drvdata(dev
);
434 ctx
->pm
[0] = __raw_readl(ctx
->regs
+ PCI_REG_CMEM
);
435 ctx
->pm
[1] = __raw_readl(ctx
->regs
+ PCI_REG_CONFIG
) & 0x0009ffff;
436 ctx
->pm
[2] = __raw_readl(ctx
->regs
+ PCI_REG_B2BMASK_CCH
);
437 ctx
->pm
[3] = __raw_readl(ctx
->regs
+ PCI_REG_B2BBASE0_VID
);
438 ctx
->pm
[4] = __raw_readl(ctx
->regs
+ PCI_REG_B2BBASE1_SID
);
439 ctx
->pm
[5] = __raw_readl(ctx
->regs
+ PCI_REG_MWMASK_DEV
);
440 ctx
->pm
[6] = __raw_readl(ctx
->regs
+ PCI_REG_MWBASE_REV_CCL
);
441 ctx
->pm
[7] = __raw_readl(ctx
->regs
+ PCI_REG_ID
);
442 ctx
->pm
[8] = __raw_readl(ctx
->regs
+ PCI_REG_CLASSREV
);
443 ctx
->pm
[9] = __raw_readl(ctx
->regs
+ PCI_REG_PARAM
);
444 ctx
->pm
[10] = __raw_readl(ctx
->regs
+ PCI_REG_MBAR
);
445 ctx
->pm
[11] = __raw_readl(ctx
->regs
+ PCI_REG_TIMEOUT
);
450 static int alchemy_pci_resume(struct device
*dev
)
452 struct alchemy_pci_context
*ctx
= dev_get_drvdata(dev
);
454 __raw_writel(ctx
->pm
[0], ctx
->regs
+ PCI_REG_CMEM
);
455 __raw_writel(ctx
->pm
[2], ctx
->regs
+ PCI_REG_B2BMASK_CCH
);
456 __raw_writel(ctx
->pm
[3], ctx
->regs
+ PCI_REG_B2BBASE0_VID
);
457 __raw_writel(ctx
->pm
[4], ctx
->regs
+ PCI_REG_B2BBASE1_SID
);
458 __raw_writel(ctx
->pm
[5], ctx
->regs
+ PCI_REG_MWMASK_DEV
);
459 __raw_writel(ctx
->pm
[6], ctx
->regs
+ PCI_REG_MWBASE_REV_CCL
);
460 __raw_writel(ctx
->pm
[7], ctx
->regs
+ PCI_REG_ID
);
461 __raw_writel(ctx
->pm
[8], ctx
->regs
+ PCI_REG_CLASSREV
);
462 __raw_writel(ctx
->pm
[9], ctx
->regs
+ PCI_REG_PARAM
);
463 __raw_writel(ctx
->pm
[10], ctx
->regs
+ PCI_REG_MBAR
);
464 __raw_writel(ctx
->pm
[11], ctx
->regs
+ PCI_REG_TIMEOUT
);
466 __raw_writel(ctx
->pm
[1], ctx
->regs
+ PCI_REG_CONFIG
);
472 static const struct dev_pm_ops alchemy_pci_pmops
= {
473 .suspend
= alchemy_pci_suspend
,
474 .resume
= alchemy_pci_resume
,
477 #define ALCHEMY_PCICTL_PM (&alchemy_pci_pmops)
480 #define ALCHEMY_PCICTL_PM NULL
483 static struct platform_driver alchemy_pcictl_driver
= {
484 .probe
= alchemy_pci_probe
,
486 .name
= "alchemy-pci",
487 .owner
= THIS_MODULE
,
488 .pm
= ALCHEMY_PCICTL_PM
,
492 static int __init
alchemy_pci_init(void)
494 /* Au1500/Au1550 have PCI */
495 switch (alchemy_get_cputype()) {
496 case ALCHEMY_CPU_AU1500
:
497 case ALCHEMY_CPU_AU1550
:
498 return platform_driver_register(&alchemy_pcictl_driver
);
502 arch_initcall(alchemy_pci_init
);
505 int __init
pcibios_map_irq(const struct pci_dev
*dev
, u8 slot
, u8 pin
)
507 struct alchemy_pci_context
*ctx
= dev
->sysdata
;
508 if (ctx
&& ctx
->board_map_irq
)
509 return ctx
->board_map_irq(dev
, slot
, pin
);
513 int pcibios_plat_dev_init(struct pci_dev
*dev
)