Deleted Added
full compact
35c35
< __FBSDID("$FreeBSD: head/sys/sparc64/pci/schizo.c 206020 2010-03-31 22:32:56Z marius $");
---
> __FBSDID("$FreeBSD: head/sys/sparc64/pci/schizo.c 208097 2010-05-14 20:00:21Z marius $");
54a55
> #include <sys/sysctl.h>
387a389,403
> * Enable DMA write parity error interrupts of version >= 7 (i.e.
> * revision >= 2.5) Schizo.
> */
> if (mode == SCHIZO_MODE_SCZ && sc->sc_ver >= 7) {
> reg = SCHIZO_PCI_READ_8(sc, SX_PCI_CFG_ICD);
> reg |= SX_PCI_CFG_ICD_DMAW_PERR_IEN;
> #ifdef SCHIZO_DEBUG
> device_printf(dev, "PCI CFG/ICD 0x%016llx -> 0x%016llx\n",
> (unsigned long long)SCHIZO_PCI_READ_8(sc, SX_PCI_CFG_ICD),
> (unsigned long long)reg);
> #endif
> SCHIZO_PCI_WRITE_8(sc, SX_PCI_CFG_ICD, reg);
> }
>
> /*
700,707c716,727
< /*
< * At least when booting Fire V890 from disk a Schizo comes up with
< * a PCI bus error residing which triggers as soon as we register
< * schizo_pci_bus() even when clearing it from all involved registers
< * beforehand (but is quiet once it has fired). Thus we make PCI bus
< * errors non-fatal until we actually touch the bus.
< */
< sc->sc_flags |= SCHIZO_FLAGS_ARMED;
---
> #define SCHIZO_SYSCTL_ADD_UINT(name, arg, desc) \
> SYSCTL_ADD_UINT(device_get_sysctl_ctx(dev), \
> SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, \
> (name), CTLFLAG_RD, (arg), 0, (desc))
>
> SCHIZO_SYSCTL_ADD_UINT("dma_ce", &sc->sc_stats_dma_ce,
> "DMA correctable errors");
> SCHIZO_SYSCTL_ADD_UINT("pci_non_fatal", &sc->sc_stats_pci_non_fatal,
> "PCI bus non-fatal errors");
>
> #undef SCHIZO_SYSCTL_ADD_UINT
>
803a824
> u_int fatal;
804a826,829
> fatal = 0;
>
> mtx_lock_spin(sc->sc_mtx);
>
811,815d835
< if ((sc->sc_flags & SCHIZO_FLAGS_ARMED) == 0)
< goto clear_error;
< if ((csr & STX_PCI_CTRL_MMU_ERR) != 0) {
< if ((iommu & TOM_PCI_IOMMU_ERR) == 0)
< goto clear_error;
817,826c837,861
< /* These are non-fatal if target abort was signaled. */
< if ((status & PCIM_STATUS_STABORT) != 0 &&
< ((iommu & TOM_PCI_IOMMU_ERRMASK) ==
< TOM_PCI_IOMMU_INVALID_ERR ||
< (iommu & TOM_PCI_IOMMU_ERR_ILLTSBTBW) != 0 ||
< (iommu & TOM_PCI_IOMMU_ERR_BAD_VA) != 0)) {
< SCHIZO_PCI_WRITE_8(sc, STX_PCI_IOMMU, iommu);
< goto clear_error;
< }
< }
---
> /*
> * IOMMU errors are only fatal on Tomatillo and there also only if
> * target abort was not signaled.
> */
> if ((csr & STX_PCI_CTRL_MMU_ERR) != 0 &&
> (iommu & TOM_PCI_IOMMU_ERR) != 0 &&
> ((status & PCIM_STATUS_STABORT) == 0 ||
> ((iommu & TOM_PCI_IOMMU_ERRMASK) != TOM_PCI_IOMMU_INVALID_ERR &&
> (iommu & TOM_PCI_IOMMU_ERR_ILLTSBTBW) == 0 &&
> (iommu & TOM_PCI_IOMMU_ERR_BAD_VA) == 0)))
> fatal = 1;
> else if ((status & PCIM_STATUS_STABORT) != 0)
> fatal = 1;
> if ((status & (PCIM_STATUS_PERR | PCIM_STATUS_SERR |
> PCIM_STATUS_RMABORT | PCIM_STATUS_RTABORT |
> PCIM_STATUS_PERRREPORT)) != 0 ||
> (csr & (SCZ_PCI_CTRL_BUS_UNUS | TOM_PCI_CTRL_DTO_ERR |
> STX_PCI_CTRL_TTO_ERR | STX_PCI_CTRL_RTRY_ERR |
> SCZ_PCI_CTRL_SBH_ERR | STX_PCI_CTRL_SERR)) != 0 ||
> (afsr & (STX_PCI_AFSR_P_MA | STX_PCI_AFSR_P_TA |
> STX_PCI_AFSR_P_RTRY | STX_PCI_AFSR_P_PERR | STX_PCI_AFSR_P_TTO |
> STX_PCI_AFSR_P_UNUS)) != 0)
> fatal = 1;
> if (fatal == 0)
> sc->sc_stats_pci_non_fatal++;
828,832c863,867
< panic("%s: PCI bus %c error AFAR %#llx AFSR %#llx PCI CSR %#llx "
< "IOMMU %#llx STATUS %#llx", device_get_nameunit(sc->sc_dev),
< 'A' + sc->sc_half, (unsigned long long)afar,
< (unsigned long long)afsr, (unsigned long long)csr,
< (unsigned long long)iommu, (unsigned long long)status);
---
> device_printf(sc->sc_dev, "PCI bus %c error AFAR %#llx AFSR %#llx "
> "PCI CSR %#llx IOMMU %#llx STATUS %#llx\n", 'A' + sc->sc_half,
> (unsigned long long)afar, (unsigned long long)afsr,
> (unsigned long long)csr, (unsigned long long)iommu,
> (unsigned long long)status);
834,840d868
< clear_error:
< if (bootverbose)
< device_printf(sc->sc_dev,
< "PCI bus %c error AFAR %#llx AFSR %#llx PCI CSR %#llx "
< "STATUS %#llx", 'A' + sc->sc_half,
< (unsigned long long)afar, (unsigned long long)afsr,
< (unsigned long long)csr, (unsigned long long)status);
845a874,880
> SCHIZO_PCI_WRITE_8(sc, STX_PCI_IOMMU, iommu);
>
> mtx_unlock_spin(sc->sc_mtx);
>
> if (fatal != 0)
> panic("%s: fatal PCI bus error",
> device_get_nameunit(sc->sc_dev));
856d890
< mtx_lock_spin(sc->sc_mtx);
862d895
< mtx_unlock_spin(sc->sc_mtx);
876a910
>
881a916
> sc->sc_stats_dma_ce++;
884a920
>
886a923
>
887a925
>