|
@@ -757,3 +757,136 @@ marvel_print_pox_err(u64 err_sum, struct ev7_pal_io_one_port *port)
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
+ * POx_TRANS_SUM, if appropriate.
|
|
|
+ */
|
|
|
+ if (err_sum & IO7__POX_ERRSUM__TRANS_SUM__MASK)
|
|
|
+ marvel_print_pox_trans_sum(port->pox_trans_sum);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Then TLB_ERR.
|
|
|
+ */
|
|
|
+ if (err_sum & IO7__POX_ERRSUM__TLB_ERR) {
|
|
|
+ printk("%s TLB ERROR\n", err_print_prefix);
|
|
|
+ marvel_print_pox_tlb_err(port->pox_tlb_err);
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * And the single bit status errors.
|
|
|
+ */
|
|
|
+ if (err_sum & IO7__POX_ERRSUM__AGP_REQQ_OVFL)
|
|
|
+ printk("%s AGP Request Queue Overflow\n", err_print_prefix);
|
|
|
+ if (err_sum & IO7__POX_ERRSUM__AGP_SYNC_ERR)
|
|
|
+ printk("%s AGP Sync Error\n", err_print_prefix);
|
|
|
+ if (err_sum & IO7__POX_ERRSUM__PCIX_DISCARD_SPL)
|
|
|
+ printk("%s Discarded split completion\n", err_print_prefix);
|
|
|
+ if (err_sum & IO7__POX_ERRSUM__DMA_RD_TO)
|
|
|
+ printk("%s DMA Read Timeout\n", err_print_prefix);
|
|
|
+ if (err_sum & IO7__POX_ERRSUM__CSR_NXM_RD)
|
|
|
+ printk("%s CSR NXM READ\n", err_print_prefix);
|
|
|
+ if (err_sum & IO7__POX_ERRSUM__CSR_NXM_WR)
|
|
|
+ printk("%s CSR NXM WRITE\n", err_print_prefix);
|
|
|
+ if (err_sum & IO7__POX_ERRSUM__DETECTED_SERR)
|
|
|
+ printk("%s SERR detected\n", err_print_prefix);
|
|
|
+ if (err_sum & IO7__POX_ERRSUM__HUNG_BUS)
|
|
|
+ printk("%s HUNG BUS detected\n", err_print_prefix);
|
|
|
+}
|
|
|
+
|
|
|
+#endif /* CONFIG_VERBOSE_MCHECK */
|
|
|
+
|
|
|
+static struct ev7_pal_io_subpacket *
|
|
|
+marvel_find_io7_with_error(struct ev7_lf_subpackets *lf_subpackets)
|
|
|
+{
|
|
|
+ struct ev7_pal_io_subpacket *io = lf_subpackets->io;
|
|
|
+ struct io7 *io7;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Caller must provide the packet to fill
|
|
|
+ */
|
|
|
+ if (!io)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Fill the subpacket with the console's standard fill pattern
|
|
|
+ */
|
|
|
+ memset(io, 0x55, sizeof(*io));
|
|
|
+
|
|
|
+ for (io7 = NULL; NULL != (io7 = marvel_next_io7(io7)); ) {
|
|
|
+ unsigned long err_sum = 0;
|
|
|
+
|
|
|
+ err_sum |= io7->csrs->PO7_ERROR_SUM.csr;
|
|
|
+ for (i = 0; i < IO7_NUM_PORTS; i++) {
|
|
|
+ if (!io7->ports[i].enabled)
|
|
|
+ continue;
|
|
|
+ err_sum |= io7->ports[i].csrs->POx_ERR_SUM.csr;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Is there at least one error?
|
|
|
+ */
|
|
|
+ if (err_sum & (1UL << 63))
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Did we find an IO7 with an error?
|
|
|
+ */
|
|
|
+ if (!io7)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We have an IO7 with an error.
|
|
|
+ *
|
|
|
+ * Fill in the IO subpacket.
|
|
|
+ */
|
|
|
+ io->io_asic_rev = io7->csrs->IO_ASIC_REV.csr;
|
|
|
+ io->io_sys_rev = io7->csrs->IO_SYS_REV.csr;
|
|
|
+ io->io7_uph = io7->csrs->IO7_UPH.csr;
|
|
|
+ io->hpi_ctl = io7->csrs->HPI_CTL.csr;
|
|
|
+ io->crd_ctl = io7->csrs->CRD_CTL.csr;
|
|
|
+ io->hei_ctl = io7->csrs->HEI_CTL.csr;
|
|
|
+ io->po7_error_sum = io7->csrs->PO7_ERROR_SUM.csr;
|
|
|
+ io->po7_uncrr_sym = io7->csrs->PO7_UNCRR_SYM.csr;
|
|
|
+ io->po7_crrct_sym = io7->csrs->PO7_CRRCT_SYM.csr;
|
|
|
+ io->po7_ugbge_sym = io7->csrs->PO7_UGBGE_SYM.csr;
|
|
|
+ io->po7_err_pkt0 = io7->csrs->PO7_ERR_PKT[0].csr;
|
|
|
+ io->po7_err_pkt1 = io7->csrs->PO7_ERR_PKT[1].csr;
|
|
|
+
|
|
|
+ for (i = 0; i < IO7_NUM_PORTS; i++) {
|
|
|
+ io7_ioport_csrs *csrs = io7->ports[i].csrs;
|
|
|
+
|
|
|
+ if (!io7->ports[i].enabled)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ io->ports[i].pox_err_sum = csrs->POx_ERR_SUM.csr;
|
|
|
+ io->ports[i].pox_tlb_err = csrs->POx_TLB_ERR.csr;
|
|
|
+ io->ports[i].pox_spl_cmplt = csrs->POx_SPL_COMPLT.csr;
|
|
|
+ io->ports[i].pox_trans_sum = csrs->POx_TRANS_SUM.csr;
|
|
|
+ io->ports[i].pox_first_err = csrs->POx_FIRST_ERR.csr;
|
|
|
+ io->ports[i].pox_mult_err = csrs->POx_MULT_ERR.csr;
|
|
|
+ io->ports[i].pox_dm_source = csrs->POx_DM_SOURCE.csr;
|
|
|
+ io->ports[i].pox_dm_dest = csrs->POx_DM_DEST.csr;
|
|
|
+ io->ports[i].pox_dm_size = csrs->POx_DM_SIZE.csr;
|
|
|
+ io->ports[i].pox_dm_ctrl = csrs->POx_DM_CTRL.csr;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Ack this port's errors, if any. POx_ERR_SUM must be last.
|
|
|
+ *
|
|
|
+ * Most of the error registers get cleared and unlocked when
|
|
|
+ * the associated bits in POx_ERR_SUM are cleared (by writing
|
|
|
+ * 1). POx_TLB_ERR is an exception and must be explicitly
|
|
|
+ * cleared.
|
|
|
+ */
|
|
|
+ csrs->POx_TLB_ERR.csr = io->ports[i].pox_tlb_err;
|
|
|
+ csrs->POx_ERR_SUM.csr = io->ports[i].pox_err_sum;
|
|
|
+ mb();
|
|
|
+ csrs->POx_ERR_SUM.csr;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Ack any port 7 error(s).
|
|
|
+ */
|
|
|
+ io7->csrs->PO7_ERROR_SUM.csr = io->po7_error_sum;
|
|
|
+ mb();
|
|
|
+ io7->csrs->PO7_ERROR_SUM.csr;
|
|
|
+
|