2 * Workaround for device erratum PCI 9.
3 * See Motorola's "XPC826xA Family Device Errata Reference."
4 * The erratum applies to all 8260 family Hip4 processors. It is scheduled
5 * to be fixed in HiP4 Rev C. Erratum PCI 9 states that a simultaneous PCI
6 * inbound write transaction and PCI outbound read transaction can result in a
7 * bus deadlock. The suggested workaround is to use the IDMA controller to
8 * perform all reads from PCI configuration, memory, and I/O space.
10 * Author: andy_lowe@mvista.com
12 * 2003 (c) MontaVista Software, Inc. This file is licensed under
13 * the terms of the GNU General Public License version 2. This program
14 * is licensed "as is" without any warranty of any kind, whether express
17 #include <linux/kernel.h>
18 #include <linux/module.h>
19 #include <linux/pci.h>
20 #include <linux/types.h>
21 #include <linux/string.h>
24 #include <asm/pci-bridge.h>
25 #include <asm/machdep.h>
26 #include <asm/byteorder.h>
27 #include <asm/mpc8260.h>
28 #include <asm/immap_cpm2.h>
31 #include "m82xx_pci.h"
33 #ifdef CONFIG_8260_PCI9
34 /*#include <asm/mpc8260_pci9.h>*/ /* included in asm/io.h */
36 #define IDMA_XFER_BUF_SIZE 64 /* size of the IDMA transfer buffer */
38 /* define a structure for the IDMA dpram usage */
39 typedef struct idma_dpram_s
{
40 idma_t pram
; /* IDMA parameter RAM */
41 u_char xfer_buf
[IDMA_XFER_BUF_SIZE
]; /* IDMA transfer buffer */
42 idma_bd_t bd
; /* buffer descriptor */
45 /* define offsets relative to start of IDMA dpram */
46 #define IDMA_XFER_BUF_OFFSET (sizeof(idma_t))
47 #define IDMA_BD_OFFSET (sizeof(idma_t) + IDMA_XFER_BUF_SIZE)
50 static volatile idma_dpram_t
*idma_dpram
;
52 /* Exactly one of CONFIG_8260_PCI9_IDMAn must be defined,
53 * where n is 1, 2, 3, or 4. This selects the IDMA channel used for
54 * the PCI9 workaround.
56 #ifdef CONFIG_8260_PCI9_IDMA1
58 #define PROFF_IDMA PROFF_IDMA1_BASE
59 #define IDMA_PAGE CPM_CR_IDMA1_PAGE
60 #define IDMA_SBLOCK CPM_CR_IDMA1_SBLOCK
62 #ifdef CONFIG_8260_PCI9_IDMA2
64 #define PROFF_IDMA PROFF_IDMA2_BASE
65 #define IDMA_PAGE CPM_CR_IDMA2_PAGE
66 #define IDMA_SBLOCK CPM_CR_IDMA2_SBLOCK
68 #ifdef CONFIG_8260_PCI9_IDMA3
70 #define PROFF_IDMA PROFF_IDMA3_BASE
71 #define IDMA_PAGE CPM_CR_IDMA3_PAGE
72 #define IDMA_SBLOCK CPM_CR_IDMA3_SBLOCK
74 #ifdef CONFIG_8260_PCI9_IDMA4
76 #define PROFF_IDMA PROFF_IDMA4_BASE
77 #define IDMA_PAGE CPM_CR_IDMA4_PAGE
78 #define IDMA_SBLOCK CPM_CR_IDMA4_SBLOCK
81 void idma_pci9_init(void)
84 volatile idma_t
*pram
;
85 volatile im_idma_t
*idma_reg
;
86 volatile cpm2_map_t
*immap
= cpm2_immr
;
88 /* allocate IDMA dpram */
89 dpram_offset
= cpm_dpalloc(sizeof(idma_dpram_t
), 64);
90 idma_dpram
= cpm_dpram_addr(dpram_offset
);
92 /* initialize the IDMA parameter RAM */
93 memset((void *)idma_dpram
, 0, sizeof(idma_dpram_t
));
94 pram
= &idma_dpram
->pram
;
95 pram
->ibase
= dpram_offset
+ IDMA_BD_OFFSET
;
96 pram
->dpr_buf
= dpram_offset
+ IDMA_XFER_BUF_OFFSET
;
100 /* initialize the IDMA_BASE pointer to the IDMA parameter RAM */
101 *((ushort
*) &immap
->im_dprambase
[PROFF_IDMA
]) = dpram_offset
;
103 /* initialize the IDMA registers */
104 idma_reg
= (volatile im_idma_t
*) &immap
->im_sdma
.sdma_idsr1
;
105 idma_reg
[IDMA_CHAN
].idmr
= 0; /* mask all IDMA interrupts */
106 idma_reg
[IDMA_CHAN
].idsr
= 0xff; /* clear all event flags */
109 "Using IDMA%d for MPC8260 device erratum PCI 9 workaround\n",
115 /* Use the IDMA controller to transfer data from I/O memory to local RAM.
116 * The src address must be a physical address suitable for use by the DMA
117 * controller with no translation. The dst address must be a kernel virtual
118 * address. The dst address is translated to a physical address via
120 * The sinc argument specifies whether or not the source address is incremented
121 * by the DMA controller. The source address is incremented if and only if sinc
122 * is non-zero. The destination address is always incremented since the
123 * destination is always host RAM.
126 idma_pci9_read(u8
*dst
, u8
*src
, int bytes
, int unit_size
, int sinc
)
129 volatile idma_t
*pram
= &idma_dpram
->pram
;
130 volatile idma_bd_t
*bd
= &idma_dpram
->bd
;
131 volatile cpm2_map_t
*immap
= cpm2_immr
;
133 local_irq_save(flags
);
135 /* initialize IDMA parameter RAM for this transfer */
137 pram
->dcm
= IDMA_DCM_DMA_WRAP_64
| IDMA_DCM_SINC
138 | IDMA_DCM_DINC
| IDMA_DCM_SD_MEM2MEM
;
140 pram
->dcm
= IDMA_DCM_DMA_WRAP_64
| IDMA_DCM_DINC
141 | IDMA_DCM_SD_MEM2MEM
;
142 pram
->ibdptr
= pram
->ibase
;
143 pram
->sts
= unit_size
;
146 /* initialize the buffer descriptor */
147 bd
->dst
= virt_to_phys(dst
);
148 bd
->src
= (uint
) src
;
150 bd
->flags
= IDMA_BD_V
| IDMA_BD_W
| IDMA_BD_I
| IDMA_BD_L
| IDMA_BD_DGBL
151 | IDMA_BD_DBO_BE
| IDMA_BD_SBO_BE
| IDMA_BD_SDTB
;
153 /* issue the START_IDMA command to the CP */
154 while (immap
->im_cpm
.cp_cpcr
& CPM_CR_FLG
);
155 immap
->im_cpm
.cp_cpcr
= mk_cr_cmd(IDMA_PAGE
, IDMA_SBLOCK
, 0,
156 CPM_CR_START_IDMA
) | CPM_CR_FLG
;
157 while (immap
->im_cpm
.cp_cpcr
& CPM_CR_FLG
);
159 /* wait for transfer to complete */
160 while(bd
->flags
& IDMA_BD_V
);
162 local_irq_restore(flags
);
167 /* Use the IDMA controller to transfer data from I/O memory to local RAM.
168 * The dst address must be a physical address suitable for use by the DMA
169 * controller with no translation. The src address must be a kernel virtual
170 * address. The src address is translated to a physical address via
172 * The dinc argument specifies whether or not the dest address is incremented
173 * by the DMA controller. The source address is incremented if and only if sinc
174 * is non-zero. The source address is always incremented since the
175 * source is always host RAM.
178 idma_pci9_write(u8
*dst
, u8
*src
, int bytes
, int unit_size
, int dinc
)
181 volatile idma_t
*pram
= &idma_dpram
->pram
;
182 volatile idma_bd_t
*bd
= &idma_dpram
->bd
;
183 volatile cpm2_map_t
*immap
= cpm2_immr
;
185 local_irq_save(flags
);
187 /* initialize IDMA parameter RAM for this transfer */
189 pram
->dcm
= IDMA_DCM_DMA_WRAP_64
| IDMA_DCM_SINC
190 | IDMA_DCM_DINC
| IDMA_DCM_SD_MEM2MEM
;
192 pram
->dcm
= IDMA_DCM_DMA_WRAP_64
| IDMA_DCM_SINC
193 | IDMA_DCM_SD_MEM2MEM
;
194 pram
->ibdptr
= pram
->ibase
;
195 pram
->sts
= unit_size
;
198 /* initialize the buffer descriptor */
199 bd
->dst
= (uint
) dst
;
200 bd
->src
= virt_to_phys(src
);
202 bd
->flags
= IDMA_BD_V
| IDMA_BD_W
| IDMA_BD_I
| IDMA_BD_L
| IDMA_BD_DGBL
203 | IDMA_BD_DBO_BE
| IDMA_BD_SBO_BE
| IDMA_BD_SDTB
;
205 /* issue the START_IDMA command to the CP */
206 while (immap
->im_cpm
.cp_cpcr
& CPM_CR_FLG
);
207 immap
->im_cpm
.cp_cpcr
= mk_cr_cmd(IDMA_PAGE
, IDMA_SBLOCK
, 0,
208 CPM_CR_START_IDMA
) | CPM_CR_FLG
;
209 while (immap
->im_cpm
.cp_cpcr
& CPM_CR_FLG
);
211 /* wait for transfer to complete */
212 while(bd
->flags
& IDMA_BD_V
);
214 local_irq_restore(flags
);
219 /* Same as idma_pci9_read, but 16-bit little-endian byte swapping is performed
220 * if the unit_size is 2, and 32-bit little-endian byte swapping is performed if
221 * the unit_size is 4.
224 idma_pci9_read_le(u8
*dst
, u8
*src
, int bytes
, int unit_size
, int sinc
)
229 idma_pci9_read(dst
, src
, bytes
, unit_size
, sinc
);
232 for (i
= 0, p
= dst
; i
< bytes
; i
+= 2, p
+= 2)
236 for (i
= 0, p
= dst
; i
< bytes
; i
+= 4, p
+= 4)
243 EXPORT_SYMBOL(idma_pci9_init
);
244 EXPORT_SYMBOL(idma_pci9_read
);
245 EXPORT_SYMBOL(idma_pci9_read_le
);
247 static inline int is_pci_mem(unsigned long addr
)
249 if (addr
>= M82xx_PCI_LOWER_MMIO
&&
250 addr
<= M82xx_PCI_UPPER_MMIO
)
252 if (addr
>= M82xx_PCI_LOWER_MEM
&&
253 addr
<= M82xx_PCI_UPPER_MEM
)
258 #define is_pci_mem(pa) ( (pa > 0x80000000) && (pa < 0xc0000000))
259 int readb(volatile unsigned char *addr
)
262 unsigned long pa
= iopa((unsigned long) addr
);
267 idma_pci9_read((u8
*)&val
, (u8
*)pa
, sizeof(val
), sizeof(val
), 0);
271 int readw(volatile unsigned short *addr
)
274 unsigned long pa
= iopa((unsigned long) addr
);
277 return in_le16(addr
);
279 idma_pci9_read((u8
*)&val
, (u8
*)pa
, sizeof(val
), sizeof(val
), 0);
283 unsigned readl(volatile unsigned *addr
)
286 unsigned long pa
= iopa((unsigned long) addr
);
289 return in_le32(addr
);
291 idma_pci9_read((u8
*)&val
, (u8
*)pa
, sizeof(val
), sizeof(val
), 0);
295 int inb(unsigned port
)
298 u8
*addr
= (u8
*)(port
+ _IO_BASE
);
300 idma_pci9_read((u8
*)&val
, (u8
*)addr
, sizeof(val
), sizeof(val
), 0);
304 int inw(unsigned port
)
307 u8
*addr
= (u8
*)(port
+ _IO_BASE
);
309 idma_pci9_read((u8
*)&val
, (u8
*)addr
, sizeof(val
), sizeof(val
), 0);
313 unsigned inl(unsigned port
)
316 u8
*addr
= (u8
*)(port
+ _IO_BASE
);
318 idma_pci9_read((u8
*)&val
, (u8
*)addr
, sizeof(val
), sizeof(val
), 0);
322 void insb(unsigned port
, void *buf
, int ns
)
324 u8
*addr
= (u8
*)(port
+ _IO_BASE
);
326 idma_pci9_read((u8
*)buf
, (u8
*)addr
, ns
*sizeof(u8
), sizeof(u8
), 0);
329 void insw(unsigned port
, void *buf
, int ns
)
331 u8
*addr
= (u8
*)(port
+ _IO_BASE
);
333 idma_pci9_read((u8
*)buf
, (u8
*)addr
, ns
*sizeof(u16
), sizeof(u16
), 0);
336 void insl(unsigned port
, void *buf
, int nl
)
338 u8
*addr
= (u8
*)(port
+ _IO_BASE
);
340 idma_pci9_read((u8
*)buf
, (u8
*)addr
, nl
*sizeof(u32
), sizeof(u32
), 0);
343 void *memcpy_fromio(void *dest
, unsigned long src
, size_t count
)
345 unsigned long pa
= iopa((unsigned long) src
);
348 idma_pci9_read((u8
*)dest
, (u8
*)pa
, count
, 32, 1);
350 memcpy(dest
, (void *)src
, count
);
354 EXPORT_SYMBOL(readb
);
355 EXPORT_SYMBOL(readw
);
356 EXPORT_SYMBOL(readl
);
363 EXPORT_SYMBOL(memcpy_fromio
);
365 #endif /* ifdef CONFIG_8260_PCI9 */
367 /* Indirect PCI routines adapted from arch/ppc/kernel/indirect_pci.c.
368 * Copyright (C) 1998 Gabriel Paubert.
370 #ifndef CONFIG_8260_PCI9
371 #define cfg_read(val, addr, type, op) *val = op((type)(addr))
373 #define cfg_read(val, addr, type, op) \
374 idma_pci9_read_le((u8*)(val),(u8*)(addr),sizeof(*(val)),sizeof(*(val)),0)
377 #define cfg_write(val, addr, type, op) op((type *)(addr), (val))
379 static int indirect_write_config(struct pci_bus
*pbus
, unsigned int devfn
, int where
,
382 struct pci_controller
*hose
= pbus
->sysdata
;
384 if (ppc_md
.pci_exclude_device
)
385 if (ppc_md
.pci_exclude_device(pbus
->number
, devfn
))
386 return PCIBIOS_DEVICE_NOT_FOUND
;
388 if (hose
->set_cfg_type
)
389 if (pbus
->number
!= hose
->first_busno
)
392 out_be32(hose
->cfg_addr
,
393 (((where
& 0xfc) | cfg_type
) << 24) | (devfn
<< 16)
394 | ((pbus
->number
- hose
->bus_offset
) << 8) | 0x80);
399 cfg_write(value
, hose
->cfg_data
+ (where
& 3), u8
, out_8
);
402 cfg_write(value
, hose
->cfg_data
+ (where
& 2), u16
, out_le16
);
405 cfg_write(value
, hose
->cfg_data
+ (where
& 0), u32
, out_le32
);
408 return PCIBIOS_SUCCESSFUL
;
411 static int indirect_read_config(struct pci_bus
*pbus
, unsigned int devfn
, int where
,
412 int size
, u32
*value
)
414 struct pci_controller
*hose
= pbus
->sysdata
;
416 if (ppc_md
.pci_exclude_device
)
417 if (ppc_md
.pci_exclude_device(pbus
->number
, devfn
))
418 return PCIBIOS_DEVICE_NOT_FOUND
;
420 if (hose
->set_cfg_type
)
421 if (pbus
->number
!= hose
->first_busno
)
424 out_be32(hose
->cfg_addr
,
425 (((where
& 0xfc) | cfg_type
) << 24) | (devfn
<< 16)
426 | ((pbus
->number
- hose
->bus_offset
) << 8) | 0x80);
431 cfg_read(value
, hose
->cfg_data
+ (where
& 3), u8
*, in_8
);
434 cfg_read(value
, hose
->cfg_data
+ (where
& 2), u16
*, in_le16
);
437 cfg_read(value
, hose
->cfg_data
+ (where
& 0), u32
*, in_le32
);
440 return PCIBIOS_SUCCESSFUL
;
443 static struct pci_ops indirect_pci_ops
=
445 .read
= indirect_read_config
,
446 .write
= indirect_write_config
,
450 setup_m8260_indirect_pci(struct pci_controller
* hose
, u32 cfg_addr
, u32 cfg_data
)
452 hose
->ops
= &indirect_pci_ops
;
453 hose
->cfg_addr
= (unsigned int *) ioremap(cfg_addr
, 4);
454 hose
->cfg_data
= (unsigned char *) ioremap(cfg_data
, 4);