1 // SPDX-License-Identifier: GPL-2.0
2 /* psycho_common.c: Code common to PSYCHO and derivative PCI controllers.
4 * Copyright (C) 2008 David S. Miller <davem@davemloft.net>
6 #include <linux/kernel.h>
7 #include <linux/interrupt.h>
12 #include "iommu_common.h"
13 #include "psycho_common.h"
15 #define PSYCHO_STRBUF_CTRL_DENAB 0x0000000000000002ULL
16 #define PSYCHO_STCERR_WRITE 0x0000000000000002ULL
17 #define PSYCHO_STCERR_READ 0x0000000000000001ULL
18 #define PSYCHO_STCTAG_PPN 0x0fffffff00000000ULL
19 #define PSYCHO_STCTAG_VPN 0x00000000ffffe000ULL
20 #define PSYCHO_STCTAG_VALID 0x0000000000000002ULL
21 #define PSYCHO_STCTAG_WRITE 0x0000000000000001ULL
22 #define PSYCHO_STCLINE_LINDX 0x0000000001e00000ULL
23 #define PSYCHO_STCLINE_SPTR 0x00000000001f8000ULL
24 #define PSYCHO_STCLINE_LADDR 0x0000000000007f00ULL
25 #define PSYCHO_STCLINE_EPTR 0x00000000000000fcULL
26 #define PSYCHO_STCLINE_VALID 0x0000000000000002ULL
27 #define PSYCHO_STCLINE_FOFN 0x0000000000000001ULL
29 static DEFINE_SPINLOCK(stc_buf_lock
);
30 static unsigned long stc_error_buf
[128];
31 static unsigned long stc_tag_buf
[16];
32 static unsigned long stc_line_buf
[16];
34 static void psycho_check_stc_error(struct pci_pbm_info
*pbm
)
36 unsigned long err_base
, tag_base
, line_base
;
37 struct strbuf
*strbuf
= &pbm
->stc
;
41 if (!strbuf
->strbuf_control
)
44 err_base
= strbuf
->strbuf_err_stat
;
45 tag_base
= strbuf
->strbuf_tag_diag
;
46 line_base
= strbuf
->strbuf_line_diag
;
48 spin_lock(&stc_buf_lock
);
50 /* This is __REALLY__ dangerous. When we put the streaming
51 * buffer into diagnostic mode to probe it's tags and error
52 * status, we _must_ clear all of the line tag valid bits
53 * before re-enabling the streaming buffer. If any dirty data
54 * lives in the STC when we do this, we will end up
55 * invalidating it before it has a chance to reach main
58 control
= upa_readq(strbuf
->strbuf_control
);
59 upa_writeq(control
| PSYCHO_STRBUF_CTRL_DENAB
, strbuf
->strbuf_control
);
60 for (i
= 0; i
< 128; i
++) {
63 val
= upa_readq(err_base
+ (i
* 8UL));
64 upa_writeq(0UL, err_base
+ (i
* 8UL));
65 stc_error_buf
[i
] = val
;
67 for (i
= 0; i
< 16; i
++) {
68 stc_tag_buf
[i
] = upa_readq(tag_base
+ (i
* 8UL));
69 stc_line_buf
[i
] = upa_readq(line_base
+ (i
* 8UL));
70 upa_writeq(0UL, tag_base
+ (i
* 8UL));
71 upa_writeq(0UL, line_base
+ (i
* 8UL));
74 /* OK, state is logged, exit diagnostic mode. */
75 upa_writeq(control
, strbuf
->strbuf_control
);
77 for (i
= 0; i
< 16; i
++) {
78 int j
, saw_error
, first
, last
;
83 for (j
= first
; j
< last
; j
++) {
84 u64 errval
= stc_error_buf
[j
];
87 printk(KERN_ERR
"%s: STC_ERR(%d)[wr(%d)"
91 (errval
& PSYCHO_STCERR_WRITE
) ? 1 : 0,
92 (errval
& PSYCHO_STCERR_READ
) ? 1 : 0);
96 u64 tagval
= stc_tag_buf
[i
];
97 u64 lineval
= stc_line_buf
[i
];
98 printk(KERN_ERR
"%s: STC_TAG(%d)[PA(%016llx)VA(%08llx)"
102 ((tagval
& PSYCHO_STCTAG_PPN
) >> 19UL),
103 (tagval
& PSYCHO_STCTAG_VPN
),
104 ((tagval
& PSYCHO_STCTAG_VALID
) ? 1 : 0),
105 ((tagval
& PSYCHO_STCTAG_WRITE
) ? 1 : 0));
106 printk(KERN_ERR
"%s: STC_LINE(%d)[LIDX(%llx)SP(%llx)"
107 "LADDR(%llx)EP(%llx)V(%d)FOFN(%d)]\n",
110 ((lineval
& PSYCHO_STCLINE_LINDX
) >> 21UL),
111 ((lineval
& PSYCHO_STCLINE_SPTR
) >> 15UL),
112 ((lineval
& PSYCHO_STCLINE_LADDR
) >> 8UL),
113 ((lineval
& PSYCHO_STCLINE_EPTR
) >> 2UL),
114 ((lineval
& PSYCHO_STCLINE_VALID
) ? 1 : 0),
115 ((lineval
& PSYCHO_STCLINE_FOFN
) ? 1 : 0));
119 spin_unlock(&stc_buf_lock
);
122 #define PSYCHO_IOMMU_TAG 0xa580UL
123 #define PSYCHO_IOMMU_DATA 0xa600UL
125 static void psycho_record_iommu_tags_and_data(struct pci_pbm_info
*pbm
,
130 for (i
= 0; i
< 16; i
++) {
131 unsigned long base
= pbm
->controller_regs
;
132 unsigned long off
= i
* 8UL;
134 tag
[i
] = upa_readq(base
+ PSYCHO_IOMMU_TAG
+off
);
135 data
[i
] = upa_readq(base
+ PSYCHO_IOMMU_DATA
+off
);
137 /* Now clear out the entry. */
138 upa_writeq(0, base
+ PSYCHO_IOMMU_TAG
+ off
);
139 upa_writeq(0, base
+ PSYCHO_IOMMU_DATA
+ off
);
143 #define PSYCHO_IOMMU_TAG_ERRSTS (0x3UL << 23UL)
144 #define PSYCHO_IOMMU_TAG_ERR (0x1UL << 22UL)
145 #define PSYCHO_IOMMU_TAG_WRITE (0x1UL << 21UL)
146 #define PSYCHO_IOMMU_TAG_STREAM (0x1UL << 20UL)
147 #define PSYCHO_IOMMU_TAG_SIZE (0x1UL << 19UL)
148 #define PSYCHO_IOMMU_TAG_VPAGE 0x7ffffULL
149 #define PSYCHO_IOMMU_DATA_VALID (1UL << 30UL)
150 #define PSYCHO_IOMMU_DATA_CACHE (1UL << 28UL)
151 #define PSYCHO_IOMMU_DATA_PPAGE 0xfffffffULL
153 static void psycho_dump_iommu_tags_and_data(struct pci_pbm_info
*pbm
,
158 for (i
= 0; i
< 16; i
++) {
159 u64 tag_val
, data_val
;
160 const char *type_str
;
162 if (!(tag_val
& PSYCHO_IOMMU_TAG_ERR
))
166 switch((tag_val
& PSYCHO_IOMMU_TAG_ERRSTS
) >> 23UL) {
168 type_str
= "Protection Error";
171 type_str
= "Invalid Error";
174 type_str
= "TimeOut Error";
178 type_str
= "ECC Error";
182 printk(KERN_ERR
"%s: IOMMU TAG(%d)[error(%s) wr(%d) "
183 "str(%d) sz(%dK) vpg(%08llx)]\n",
184 pbm
->name
, i
, type_str
,
185 ((tag_val
& PSYCHO_IOMMU_TAG_WRITE
) ? 1 : 0),
186 ((tag_val
& PSYCHO_IOMMU_TAG_STREAM
) ? 1 : 0),
187 ((tag_val
& PSYCHO_IOMMU_TAG_SIZE
) ? 64 : 8),
188 (tag_val
& PSYCHO_IOMMU_TAG_VPAGE
) << IOMMU_PAGE_SHIFT
);
189 printk(KERN_ERR
"%s: IOMMU DATA(%d)[valid(%d) cache(%d) "
192 ((data_val
& PSYCHO_IOMMU_DATA_VALID
) ? 1 : 0),
193 ((data_val
& PSYCHO_IOMMU_DATA_CACHE
) ? 1 : 0),
194 (data_val
& PSYCHO_IOMMU_DATA_PPAGE
) << IOMMU_PAGE_SHIFT
);
198 #define PSYCHO_IOMMU_CTRL_XLTESTAT 0x0000000006000000UL
199 #define PSYCHO_IOMMU_CTRL_XLTEERR 0x0000000001000000UL
201 void psycho_check_iommu_error(struct pci_pbm_info
*pbm
,
204 enum psycho_error_type type
)
206 u64 control
, iommu_tag
[16], iommu_data
[16];
207 struct iommu
*iommu
= pbm
->iommu
;
210 spin_lock_irqsave(&iommu
->lock
, flags
);
211 control
= upa_readq(iommu
->iommu_control
);
212 if (control
& PSYCHO_IOMMU_CTRL_XLTEERR
) {
213 const char *type_str
;
215 control
&= ~PSYCHO_IOMMU_CTRL_XLTEERR
;
216 upa_writeq(control
, iommu
->iommu_control
);
218 switch ((control
& PSYCHO_IOMMU_CTRL_XLTESTAT
) >> 25UL) {
220 type_str
= "Protection Error";
223 type_str
= "Invalid Error";
226 type_str
= "TimeOut Error";
230 type_str
= "ECC Error";
233 printk(KERN_ERR
"%s: IOMMU Error, type[%s]\n",
234 pbm
->name
, type_str
);
236 /* It is very possible for another DVMA to occur while
237 * we do this probe, and corrupt the system further.
238 * But we are so screwed at this point that we are
239 * likely to crash hard anyways, so get as much
240 * diagnostic information to the console as we can.
242 psycho_record_iommu_tags_and_data(pbm
, iommu_tag
, iommu_data
);
243 psycho_dump_iommu_tags_and_data(pbm
, iommu_tag
, iommu_data
);
245 psycho_check_stc_error(pbm
);
246 spin_unlock_irqrestore(&iommu
->lock
, flags
);
249 #define PSYCHO_PCICTRL_SBH_ERR 0x0000000800000000UL
250 #define PSYCHO_PCICTRL_SERR 0x0000000400000000UL
252 static irqreturn_t
psycho_pcierr_intr_other(struct pci_pbm_info
*pbm
)
254 irqreturn_t ret
= IRQ_NONE
;
255 u64 csr
, csr_error_bits
;
258 csr
= upa_readq(pbm
->pci_csr
);
259 csr_error_bits
= csr
& (PSYCHO_PCICTRL_SBH_ERR
| PSYCHO_PCICTRL_SERR
);
260 if (csr_error_bits
) {
261 /* Clear the errors. */
262 upa_writeq(csr
, pbm
->pci_csr
);
265 if (csr_error_bits
& PSYCHO_PCICTRL_SBH_ERR
)
266 printk(KERN_ERR
"%s: PCI streaming byte hole "
267 "error asserted.\n", pbm
->name
);
268 if (csr_error_bits
& PSYCHO_PCICTRL_SERR
)
269 printk(KERN_ERR
"%s: PCI SERR signal asserted.\n",
273 addr
= psycho_pci_config_mkaddr(pbm
, pbm
->pci_first_busno
,
275 pci_config_read16(addr
, &stat
);
276 if (stat
& (PCI_STATUS_PARITY
|
277 PCI_STATUS_SIG_TARGET_ABORT
|
278 PCI_STATUS_REC_TARGET_ABORT
|
279 PCI_STATUS_REC_MASTER_ABORT
|
280 PCI_STATUS_SIG_SYSTEM_ERROR
)) {
281 printk(KERN_ERR
"%s: PCI bus error, PCI_STATUS[%04x]\n",
283 pci_config_write16(addr
, 0xffff);
289 #define PSYCHO_PCIAFSR_PMA 0x8000000000000000ULL
290 #define PSYCHO_PCIAFSR_PTA 0x4000000000000000ULL
291 #define PSYCHO_PCIAFSR_PRTRY 0x2000000000000000ULL
292 #define PSYCHO_PCIAFSR_PPERR 0x1000000000000000ULL
293 #define PSYCHO_PCIAFSR_SMA 0x0800000000000000ULL
294 #define PSYCHO_PCIAFSR_STA 0x0400000000000000ULL
295 #define PSYCHO_PCIAFSR_SRTRY 0x0200000000000000ULL
296 #define PSYCHO_PCIAFSR_SPERR 0x0100000000000000ULL
297 #define PSYCHO_PCIAFSR_RESV1 0x00ff000000000000ULL
298 #define PSYCHO_PCIAFSR_BMSK 0x0000ffff00000000ULL
299 #define PSYCHO_PCIAFSR_BLK 0x0000000080000000ULL
300 #define PSYCHO_PCIAFSR_RESV2 0x0000000040000000ULL
301 #define PSYCHO_PCIAFSR_MID 0x000000003e000000ULL
302 #define PSYCHO_PCIAFSR_RESV3 0x0000000001ffffffULL
304 irqreturn_t
psycho_pcierr_intr(int irq
, void *dev_id
)
306 struct pci_pbm_info
*pbm
= dev_id
;
307 u64 afsr
, afar
, error_bits
;
310 afsr
= upa_readq(pbm
->pci_afsr
);
311 afar
= upa_readq(pbm
->pci_afar
);
313 (PSYCHO_PCIAFSR_PMA
| PSYCHO_PCIAFSR_PTA
|
314 PSYCHO_PCIAFSR_PRTRY
| PSYCHO_PCIAFSR_PPERR
|
315 PSYCHO_PCIAFSR_SMA
| PSYCHO_PCIAFSR_STA
|
316 PSYCHO_PCIAFSR_SRTRY
| PSYCHO_PCIAFSR_SPERR
);
318 return psycho_pcierr_intr_other(pbm
);
319 upa_writeq(error_bits
, pbm
->pci_afsr
);
320 printk(KERN_ERR
"%s: PCI Error, primary error type[%s]\n",
322 (((error_bits
& PSYCHO_PCIAFSR_PMA
) ?
324 ((error_bits
& PSYCHO_PCIAFSR_PTA
) ?
326 ((error_bits
& PSYCHO_PCIAFSR_PRTRY
) ?
327 "Excessive Retries" :
328 ((error_bits
& PSYCHO_PCIAFSR_PPERR
) ?
329 "Parity Error" : "???"))))));
330 printk(KERN_ERR
"%s: bytemask[%04llx] UPA_MID[%02llx] was_block(%d)\n",
332 (afsr
& PSYCHO_PCIAFSR_BMSK
) >> 32UL,
333 (afsr
& PSYCHO_PCIAFSR_MID
) >> 25UL,
334 (afsr
& PSYCHO_PCIAFSR_BLK
) ? 1 : 0);
335 printk(KERN_ERR
"%s: PCI AFAR [%016llx]\n", pbm
->name
, afar
);
336 printk(KERN_ERR
"%s: PCI Secondary errors [", pbm
->name
);
338 if (afsr
& PSYCHO_PCIAFSR_SMA
) {
340 printk("(Master Abort)");
342 if (afsr
& PSYCHO_PCIAFSR_STA
) {
344 printk("(Target Abort)");
346 if (afsr
& PSYCHO_PCIAFSR_SRTRY
) {
348 printk("(Excessive Retries)");
350 if (afsr
& PSYCHO_PCIAFSR_SPERR
) {
352 printk("(Parity Error)");
358 if (error_bits
& (PSYCHO_PCIAFSR_PTA
| PSYCHO_PCIAFSR_STA
)) {
359 psycho_check_iommu_error(pbm
, afsr
, afar
, PCI_ERR
);
360 pci_scan_for_target_abort(pbm
, pbm
->pci_bus
);
362 if (error_bits
& (PSYCHO_PCIAFSR_PMA
| PSYCHO_PCIAFSR_SMA
))
363 pci_scan_for_master_abort(pbm
, pbm
->pci_bus
);
365 if (error_bits
& (PSYCHO_PCIAFSR_PPERR
| PSYCHO_PCIAFSR_SPERR
))
366 pci_scan_for_parity_error(pbm
, pbm
->pci_bus
);
371 static void psycho_iommu_flush(struct pci_pbm_info
*pbm
)
375 for (i
= 0; i
< 16; i
++) {
376 unsigned long off
= i
* 8;
378 upa_writeq(0, pbm
->controller_regs
+ PSYCHO_IOMMU_TAG
+ off
);
379 upa_writeq(0, pbm
->controller_regs
+ PSYCHO_IOMMU_DATA
+ off
);
383 #define PSYCHO_IOMMU_CONTROL 0x0200UL
384 #define PSYCHO_IOMMU_CTRL_TSBSZ 0x0000000000070000UL
385 #define PSYCHO_IOMMU_TSBSZ_1K 0x0000000000000000UL
386 #define PSYCHO_IOMMU_TSBSZ_2K 0x0000000000010000UL
387 #define PSYCHO_IOMMU_TSBSZ_4K 0x0000000000020000UL
388 #define PSYCHO_IOMMU_TSBSZ_8K 0x0000000000030000UL
389 #define PSYCHO_IOMMU_TSBSZ_16K 0x0000000000040000UL
390 #define PSYCHO_IOMMU_TSBSZ_32K 0x0000000000050000UL
391 #define PSYCHO_IOMMU_TSBSZ_64K 0x0000000000060000UL
392 #define PSYCHO_IOMMU_TSBSZ_128K 0x0000000000070000UL
393 #define PSYCHO_IOMMU_CTRL_TBWSZ 0x0000000000000004UL
394 #define PSYCHO_IOMMU_CTRL_DENAB 0x0000000000000002UL
395 #define PSYCHO_IOMMU_CTRL_ENAB 0x0000000000000001UL
396 #define PSYCHO_IOMMU_FLUSH 0x0210UL
397 #define PSYCHO_IOMMU_TSBBASE 0x0208UL
399 int psycho_iommu_init(struct pci_pbm_info
*pbm
, int tsbsize
,
400 u32 dvma_offset
, u32 dma_mask
,
401 unsigned long write_complete_offset
)
403 struct iommu
*iommu
= pbm
->iommu
;
407 iommu
->iommu_control
= pbm
->controller_regs
+ PSYCHO_IOMMU_CONTROL
;
408 iommu
->iommu_tsbbase
= pbm
->controller_regs
+ PSYCHO_IOMMU_TSBBASE
;
409 iommu
->iommu_flush
= pbm
->controller_regs
+ PSYCHO_IOMMU_FLUSH
;
410 iommu
->iommu_tags
= pbm
->controller_regs
+ PSYCHO_IOMMU_TAG
;
411 iommu
->write_complete_reg
= (pbm
->controller_regs
+
412 write_complete_offset
);
414 iommu
->iommu_ctxflush
= 0;
416 control
= upa_readq(iommu
->iommu_control
);
417 control
|= PSYCHO_IOMMU_CTRL_DENAB
;
418 upa_writeq(control
, iommu
->iommu_control
);
420 psycho_iommu_flush(pbm
);
422 /* Leave diag mode enabled for full-flushing done in pci_iommu.c */
423 err
= iommu_table_init(iommu
, tsbsize
* 1024 * 8,
424 dvma_offset
, dma_mask
, pbm
->numa_node
);
428 upa_writeq(__pa(iommu
->page_table
), iommu
->iommu_tsbbase
);
430 control
= upa_readq(iommu
->iommu_control
);
431 control
&= ~(PSYCHO_IOMMU_CTRL_TSBSZ
| PSYCHO_IOMMU_CTRL_TBWSZ
);
432 control
|= PSYCHO_IOMMU_CTRL_ENAB
;
436 control
|= PSYCHO_IOMMU_TSBSZ_64K
;
439 control
|= PSYCHO_IOMMU_TSBSZ_128K
;
445 upa_writeq(control
, iommu
->iommu_control
);
451 void psycho_pbm_init_common(struct pci_pbm_info
*pbm
, struct platform_device
*op
,
452 const char *chip_name
, int chip_type
)
454 struct device_node
*dp
= op
->dev
.of_node
;
456 pbm
->name
= dp
->full_name
;
458 pbm
->chip_type
= chip_type
;
459 pbm
->chip_version
= of_getintprop_default(dp
, "version#", 0);
460 pbm
->chip_revision
= of_getintprop_default(dp
, "module-revision#", 0);
462 pbm
->pci_ops
= &sun4u_pci_ops
;
463 pbm
->config_space_reg_bits
= 8;
464 pbm
->index
= pci_num_pbms
++;
465 pci_get_pbm_props(pbm
);
466 pci_determine_mem_io_space(pbm
);
468 printk(KERN_INFO
"%s: %s PCI Bus Module ver[%x:%x]\n",
469 pbm
->name
, chip_name
,
470 pbm
->chip_version
, pbm
->chip_revision
);