1 /* psycho_common.c: Code common to PSYCHO and derivative PCI controllers.
3 * Copyright (C) 2008 David S. Miller <davem@davemloft.net>
5 #include <linux/kernel.h>
6 #include <linux/interrupt.h>
11 #include "iommu_common.h"
12 #include "psycho_common.h"
14 #define PSYCHO_STRBUF_CTRL_DENAB 0x0000000000000002ULL
15 #define PSYCHO_STCERR_WRITE 0x0000000000000002ULL
16 #define PSYCHO_STCERR_READ 0x0000000000000001ULL
17 #define PSYCHO_STCTAG_PPN 0x0fffffff00000000ULL
18 #define PSYCHO_STCTAG_VPN 0x00000000ffffe000ULL
19 #define PSYCHO_STCTAG_VALID 0x0000000000000002ULL
20 #define PSYCHO_STCTAG_WRITE 0x0000000000000001ULL
21 #define PSYCHO_STCLINE_LINDX 0x0000000001e00000ULL
22 #define PSYCHO_STCLINE_SPTR 0x00000000001f8000ULL
23 #define PSYCHO_STCLINE_LADDR 0x0000000000007f00ULL
24 #define PSYCHO_STCLINE_EPTR 0x00000000000000fcULL
25 #define PSYCHO_STCLINE_VALID 0x0000000000000002ULL
26 #define PSYCHO_STCLINE_FOFN 0x0000000000000001ULL
28 static DEFINE_SPINLOCK(stc_buf_lock
);
29 static unsigned long stc_error_buf
[128];
30 static unsigned long stc_tag_buf
[16];
31 static unsigned long stc_line_buf
[16];
33 static void psycho_check_stc_error(struct pci_pbm_info
*pbm
)
35 unsigned long err_base
, tag_base
, line_base
;
36 struct strbuf
*strbuf
= &pbm
->stc
;
40 if (!strbuf
->strbuf_control
)
43 err_base
= strbuf
->strbuf_err_stat
;
44 tag_base
= strbuf
->strbuf_tag_diag
;
45 line_base
= strbuf
->strbuf_line_diag
;
47 spin_lock(&stc_buf_lock
);
49 /* This is __REALLY__ dangerous. When we put the streaming
50 * buffer into diagnostic mode to probe it's tags and error
51 * status, we _must_ clear all of the line tag valid bits
52 * before re-enabling the streaming buffer. If any dirty data
53 * lives in the STC when we do this, we will end up
54 * invalidating it before it has a chance to reach main
57 control
= upa_readq(strbuf
->strbuf_control
);
58 upa_writeq(control
| PSYCHO_STRBUF_CTRL_DENAB
, strbuf
->strbuf_control
);
59 for (i
= 0; i
< 128; i
++) {
62 val
= upa_readq(err_base
+ (i
* 8UL));
63 upa_writeq(0UL, err_base
+ (i
* 8UL));
64 stc_error_buf
[i
] = val
;
66 for (i
= 0; i
< 16; i
++) {
67 stc_tag_buf
[i
] = upa_readq(tag_base
+ (i
* 8UL));
68 stc_line_buf
[i
] = upa_readq(line_base
+ (i
* 8UL));
69 upa_writeq(0UL, tag_base
+ (i
* 8UL));
70 upa_writeq(0UL, line_base
+ (i
* 8UL));
73 /* OK, state is logged, exit diagnostic mode. */
74 upa_writeq(control
, strbuf
->strbuf_control
);
76 for (i
= 0; i
< 16; i
++) {
77 int j
, saw_error
, first
, last
;
82 for (j
= first
; j
< last
; j
++) {
83 u64 errval
= stc_error_buf
[j
];
86 printk(KERN_ERR
"%s: STC_ERR(%d)[wr(%d)"
90 (errval
& PSYCHO_STCERR_WRITE
) ? 1 : 0,
91 (errval
& PSYCHO_STCERR_READ
) ? 1 : 0);
95 u64 tagval
= stc_tag_buf
[i
];
96 u64 lineval
= stc_line_buf
[i
];
97 printk(KERN_ERR
"%s: STC_TAG(%d)[PA(%016llx)VA(%08llx)"
101 ((tagval
& PSYCHO_STCTAG_PPN
) >> 19UL),
102 (tagval
& PSYCHO_STCTAG_VPN
),
103 ((tagval
& PSYCHO_STCTAG_VALID
) ? 1 : 0),
104 ((tagval
& PSYCHO_STCTAG_WRITE
) ? 1 : 0));
105 printk(KERN_ERR
"%s: STC_LINE(%d)[LIDX(%llx)SP(%llx)"
106 "LADDR(%llx)EP(%llx)V(%d)FOFN(%d)]\n",
109 ((lineval
& PSYCHO_STCLINE_LINDX
) >> 21UL),
110 ((lineval
& PSYCHO_STCLINE_SPTR
) >> 15UL),
111 ((lineval
& PSYCHO_STCLINE_LADDR
) >> 8UL),
112 ((lineval
& PSYCHO_STCLINE_EPTR
) >> 2UL),
113 ((lineval
& PSYCHO_STCLINE_VALID
) ? 1 : 0),
114 ((lineval
& PSYCHO_STCLINE_FOFN
) ? 1 : 0));
118 spin_unlock(&stc_buf_lock
);
121 #define PSYCHO_IOMMU_TAG 0xa580UL
122 #define PSYCHO_IOMMU_DATA 0xa600UL
124 static void psycho_record_iommu_tags_and_data(struct pci_pbm_info
*pbm
,
129 for (i
= 0; i
< 16; i
++) {
130 unsigned long base
= pbm
->controller_regs
;
131 unsigned long off
= i
* 8UL;
133 tag
[i
] = upa_readq(base
+ PSYCHO_IOMMU_TAG
+off
);
134 data
[i
] = upa_readq(base
+ PSYCHO_IOMMU_DATA
+off
);
136 /* Now clear out the entry. */
137 upa_writeq(0, base
+ PSYCHO_IOMMU_TAG
+ off
);
138 upa_writeq(0, base
+ PSYCHO_IOMMU_DATA
+ off
);
142 #define PSYCHO_IOMMU_TAG_ERRSTS (0x3UL << 23UL)
143 #define PSYCHO_IOMMU_TAG_ERR (0x1UL << 22UL)
144 #define PSYCHO_IOMMU_TAG_WRITE (0x1UL << 21UL)
145 #define PSYCHO_IOMMU_TAG_STREAM (0x1UL << 20UL)
146 #define PSYCHO_IOMMU_TAG_SIZE (0x1UL << 19UL)
147 #define PSYCHO_IOMMU_TAG_VPAGE 0x7ffffULL
148 #define PSYCHO_IOMMU_DATA_VALID (1UL << 30UL)
149 #define PSYCHO_IOMMU_DATA_CACHE (1UL << 28UL)
150 #define PSYCHO_IOMMU_DATA_PPAGE 0xfffffffULL
152 static void psycho_dump_iommu_tags_and_data(struct pci_pbm_info
*pbm
,
157 for (i
= 0; i
< 16; i
++) {
158 u64 tag_val
, data_val
;
159 const char *type_str
;
161 if (!(tag_val
& PSYCHO_IOMMU_TAG_ERR
))
165 switch((tag_val
& PSYCHO_IOMMU_TAG_ERRSTS
) >> 23UL) {
167 type_str
= "Protection Error";
170 type_str
= "Invalid Error";
173 type_str
= "TimeOut Error";
177 type_str
= "ECC Error";
181 printk(KERN_ERR
"%s: IOMMU TAG(%d)[error(%s) wr(%d) "
182 "str(%d) sz(%dK) vpg(%08llx)]\n",
183 pbm
->name
, i
, type_str
,
184 ((tag_val
& PSYCHO_IOMMU_TAG_WRITE
) ? 1 : 0),
185 ((tag_val
& PSYCHO_IOMMU_TAG_STREAM
) ? 1 : 0),
186 ((tag_val
& PSYCHO_IOMMU_TAG_SIZE
) ? 64 : 8),
187 (tag_val
& PSYCHO_IOMMU_TAG_VPAGE
) << IOMMU_PAGE_SHIFT
);
188 printk(KERN_ERR
"%s: IOMMU DATA(%d)[valid(%d) cache(%d) "
191 ((data_val
& PSYCHO_IOMMU_DATA_VALID
) ? 1 : 0),
192 ((data_val
& PSYCHO_IOMMU_DATA_CACHE
) ? 1 : 0),
193 (data_val
& PSYCHO_IOMMU_DATA_PPAGE
) << IOMMU_PAGE_SHIFT
);
197 #define PSYCHO_IOMMU_CTRL_XLTESTAT 0x0000000006000000UL
198 #define PSYCHO_IOMMU_CTRL_XLTEERR 0x0000000001000000UL
200 void psycho_check_iommu_error(struct pci_pbm_info
*pbm
,
203 enum psycho_error_type type
)
205 u64 control
, iommu_tag
[16], iommu_data
[16];
206 struct iommu
*iommu
= pbm
->iommu
;
209 spin_lock_irqsave(&iommu
->lock
, flags
);
210 control
= upa_readq(iommu
->iommu_control
);
211 if (control
& PSYCHO_IOMMU_CTRL_XLTEERR
) {
212 const char *type_str
;
214 control
&= ~PSYCHO_IOMMU_CTRL_XLTEERR
;
215 upa_writeq(control
, iommu
->iommu_control
);
217 switch ((control
& PSYCHO_IOMMU_CTRL_XLTESTAT
) >> 25UL) {
219 type_str
= "Protection Error";
222 type_str
= "Invalid Error";
225 type_str
= "TimeOut Error";
229 type_str
= "ECC Error";
232 printk(KERN_ERR
"%s: IOMMU Error, type[%s]\n",
233 pbm
->name
, type_str
);
235 /* It is very possible for another DVMA to occur while
236 * we do this probe, and corrupt the system further.
237 * But we are so screwed at this point that we are
238 * likely to crash hard anyways, so get as much
239 * diagnostic information to the console as we can.
241 psycho_record_iommu_tags_and_data(pbm
, iommu_tag
, iommu_data
);
242 psycho_dump_iommu_tags_and_data(pbm
, iommu_tag
, iommu_data
);
244 psycho_check_stc_error(pbm
);
245 spin_unlock_irqrestore(&iommu
->lock
, flags
);
248 #define PSYCHO_PCICTRL_SBH_ERR 0x0000000800000000UL
249 #define PSYCHO_PCICTRL_SERR 0x0000000400000000UL
251 static irqreturn_t
psycho_pcierr_intr_other(struct pci_pbm_info
*pbm
)
253 irqreturn_t ret
= IRQ_NONE
;
254 u64 csr
, csr_error_bits
;
257 csr
= upa_readq(pbm
->pci_csr
);
258 csr_error_bits
= csr
& (PSYCHO_PCICTRL_SBH_ERR
| PSYCHO_PCICTRL_SERR
);
259 if (csr_error_bits
) {
260 /* Clear the errors. */
261 upa_writeq(csr
, pbm
->pci_csr
);
264 if (csr_error_bits
& PSYCHO_PCICTRL_SBH_ERR
)
265 printk(KERN_ERR
"%s: PCI streaming byte hole "
266 "error asserted.\n", pbm
->name
);
267 if (csr_error_bits
& PSYCHO_PCICTRL_SERR
)
268 printk(KERN_ERR
"%s: PCI SERR signal asserted.\n",
272 addr
= psycho_pci_config_mkaddr(pbm
, pbm
->pci_first_busno
,
274 pci_config_read16(addr
, &stat
);
275 if (stat
& (PCI_STATUS_PARITY
|
276 PCI_STATUS_SIG_TARGET_ABORT
|
277 PCI_STATUS_REC_TARGET_ABORT
|
278 PCI_STATUS_REC_MASTER_ABORT
|
279 PCI_STATUS_SIG_SYSTEM_ERROR
)) {
280 printk(KERN_ERR
"%s: PCI bus error, PCI_STATUS[%04x]\n",
282 pci_config_write16(addr
, 0xffff);
288 #define PSYCHO_PCIAFSR_PMA 0x8000000000000000ULL
289 #define PSYCHO_PCIAFSR_PTA 0x4000000000000000ULL
290 #define PSYCHO_PCIAFSR_PRTRY 0x2000000000000000ULL
291 #define PSYCHO_PCIAFSR_PPERR 0x1000000000000000ULL
292 #define PSYCHO_PCIAFSR_SMA 0x0800000000000000ULL
293 #define PSYCHO_PCIAFSR_STA 0x0400000000000000ULL
294 #define PSYCHO_PCIAFSR_SRTRY 0x0200000000000000ULL
295 #define PSYCHO_PCIAFSR_SPERR 0x0100000000000000ULL
296 #define PSYCHO_PCIAFSR_RESV1 0x00ff000000000000ULL
297 #define PSYCHO_PCIAFSR_BMSK 0x0000ffff00000000ULL
298 #define PSYCHO_PCIAFSR_BLK 0x0000000080000000ULL
299 #define PSYCHO_PCIAFSR_RESV2 0x0000000040000000ULL
300 #define PSYCHO_PCIAFSR_MID 0x000000003e000000ULL
301 #define PSYCHO_PCIAFSR_RESV3 0x0000000001ffffffULL
303 irqreturn_t
psycho_pcierr_intr(int irq
, void *dev_id
)
305 struct pci_pbm_info
*pbm
= dev_id
;
306 u64 afsr
, afar
, error_bits
;
309 afsr
= upa_readq(pbm
->pci_afsr
);
310 afar
= upa_readq(pbm
->pci_afar
);
312 (PSYCHO_PCIAFSR_PMA
| PSYCHO_PCIAFSR_PTA
|
313 PSYCHO_PCIAFSR_PRTRY
| PSYCHO_PCIAFSR_PPERR
|
314 PSYCHO_PCIAFSR_SMA
| PSYCHO_PCIAFSR_STA
|
315 PSYCHO_PCIAFSR_SRTRY
| PSYCHO_PCIAFSR_SPERR
);
317 return psycho_pcierr_intr_other(pbm
);
318 upa_writeq(error_bits
, pbm
->pci_afsr
);
319 printk(KERN_ERR
"%s: PCI Error, primary error type[%s]\n",
321 (((error_bits
& PSYCHO_PCIAFSR_PMA
) ?
323 ((error_bits
& PSYCHO_PCIAFSR_PTA
) ?
325 ((error_bits
& PSYCHO_PCIAFSR_PRTRY
) ?
326 "Excessive Retries" :
327 ((error_bits
& PSYCHO_PCIAFSR_PPERR
) ?
328 "Parity Error" : "???"))))));
329 printk(KERN_ERR
"%s: bytemask[%04llx] UPA_MID[%02llx] was_block(%d)\n",
331 (afsr
& PSYCHO_PCIAFSR_BMSK
) >> 32UL,
332 (afsr
& PSYCHO_PCIAFSR_MID
) >> 25UL,
333 (afsr
& PSYCHO_PCIAFSR_BLK
) ? 1 : 0);
334 printk(KERN_ERR
"%s: PCI AFAR [%016llx]\n", pbm
->name
, afar
);
335 printk(KERN_ERR
"%s: PCI Secondary errors [", pbm
->name
);
337 if (afsr
& PSYCHO_PCIAFSR_SMA
) {
339 printk("(Master Abort)");
341 if (afsr
& PSYCHO_PCIAFSR_STA
) {
343 printk("(Target Abort)");
345 if (afsr
& PSYCHO_PCIAFSR_SRTRY
) {
347 printk("(Excessive Retries)");
349 if (afsr
& PSYCHO_PCIAFSR_SPERR
) {
351 printk("(Parity Error)");
357 if (error_bits
& (PSYCHO_PCIAFSR_PTA
| PSYCHO_PCIAFSR_STA
)) {
358 psycho_check_iommu_error(pbm
, afsr
, afar
, PCI_ERR
);
359 pci_scan_for_target_abort(pbm
, pbm
->pci_bus
);
361 if (error_bits
& (PSYCHO_PCIAFSR_PMA
| PSYCHO_PCIAFSR_SMA
))
362 pci_scan_for_master_abort(pbm
, pbm
->pci_bus
);
364 if (error_bits
& (PSYCHO_PCIAFSR_PPERR
| PSYCHO_PCIAFSR_SPERR
))
365 pci_scan_for_parity_error(pbm
, pbm
->pci_bus
);
370 static void psycho_iommu_flush(struct pci_pbm_info
*pbm
)
374 for (i
= 0; i
< 16; i
++) {
375 unsigned long off
= i
* 8;
377 upa_writeq(0, pbm
->controller_regs
+ PSYCHO_IOMMU_TAG
+ off
);
378 upa_writeq(0, pbm
->controller_regs
+ PSYCHO_IOMMU_DATA
+ off
);
382 #define PSYCHO_IOMMU_CONTROL 0x0200UL
383 #define PSYCHO_IOMMU_CTRL_TSBSZ 0x0000000000070000UL
384 #define PSYCHO_IOMMU_TSBSZ_1K 0x0000000000000000UL
385 #define PSYCHO_IOMMU_TSBSZ_2K 0x0000000000010000UL
386 #define PSYCHO_IOMMU_TSBSZ_4K 0x0000000000020000UL
387 #define PSYCHO_IOMMU_TSBSZ_8K 0x0000000000030000UL
388 #define PSYCHO_IOMMU_TSBSZ_16K 0x0000000000040000UL
389 #define PSYCHO_IOMMU_TSBSZ_32K 0x0000000000050000UL
390 #define PSYCHO_IOMMU_TSBSZ_64K 0x0000000000060000UL
391 #define PSYCHO_IOMMU_TSBSZ_128K 0x0000000000070000UL
392 #define PSYCHO_IOMMU_CTRL_TBWSZ 0x0000000000000004UL
393 #define PSYCHO_IOMMU_CTRL_DENAB 0x0000000000000002UL
394 #define PSYCHO_IOMMU_CTRL_ENAB 0x0000000000000001UL
395 #define PSYCHO_IOMMU_FLUSH 0x0210UL
396 #define PSYCHO_IOMMU_TSBBASE 0x0208UL
398 int psycho_iommu_init(struct pci_pbm_info
*pbm
, int tsbsize
,
399 u32 dvma_offset
, u32 dma_mask
,
400 unsigned long write_complete_offset
)
402 struct iommu
*iommu
= pbm
->iommu
;
406 iommu
->iommu_control
= pbm
->controller_regs
+ PSYCHO_IOMMU_CONTROL
;
407 iommu
->iommu_tsbbase
= pbm
->controller_regs
+ PSYCHO_IOMMU_TSBBASE
;
408 iommu
->iommu_flush
= pbm
->controller_regs
+ PSYCHO_IOMMU_FLUSH
;
409 iommu
->iommu_tags
= pbm
->controller_regs
+ PSYCHO_IOMMU_TAG
;
410 iommu
->write_complete_reg
= (pbm
->controller_regs
+
411 write_complete_offset
);
413 iommu
->iommu_ctxflush
= 0;
415 control
= upa_readq(iommu
->iommu_control
);
416 control
|= PSYCHO_IOMMU_CTRL_DENAB
;
417 upa_writeq(control
, iommu
->iommu_control
);
419 psycho_iommu_flush(pbm
);
421 /* Leave diag mode enabled for full-flushing done in pci_iommu.c */
422 err
= iommu_table_init(iommu
, tsbsize
* 1024 * 8,
423 dvma_offset
, dma_mask
, pbm
->numa_node
);
427 upa_writeq(__pa(iommu
->page_table
), iommu
->iommu_tsbbase
);
429 control
= upa_readq(iommu
->iommu_control
);
430 control
&= ~(PSYCHO_IOMMU_CTRL_TSBSZ
| PSYCHO_IOMMU_CTRL_TBWSZ
);
431 control
|= PSYCHO_IOMMU_CTRL_ENAB
;
435 control
|= PSYCHO_IOMMU_TSBSZ_64K
;
438 control
|= PSYCHO_IOMMU_TSBSZ_128K
;
444 upa_writeq(control
, iommu
->iommu_control
);
450 void psycho_pbm_init_common(struct pci_pbm_info
*pbm
, struct of_device
*op
,
451 const char *chip_name
, int chip_type
)
453 struct device_node
*dp
= op
->node
;
455 pbm
->name
= dp
->full_name
;
457 pbm
->chip_type
= chip_type
;
458 pbm
->chip_version
= of_getintprop_default(dp
, "version#", 0);
459 pbm
->chip_revision
= of_getintprop_default(dp
, "module-revision#", 0);
461 pbm
->pci_ops
= &sun4u_pci_ops
;
462 pbm
->config_space_reg_bits
= 8;
463 pbm
->index
= pci_num_pbms
++;
464 pci_get_pbm_props(pbm
);
465 pci_determine_mem_io_space(pbm
);
467 printk(KERN_INFO
"%s: %s PCI Bus Module ver[%x:%x]\n",
468 pbm
->name
, chip_name
,
469 pbm
->chip_version
, pbm
->chip_revision
);