summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun4v/io/px/px_lib4v.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/sun4v/io/px/px_lib4v.c')
-rw-r--r--usr/src/uts/sun4v/io/px/px_lib4v.c52
1 files changed, 29 insertions, 23 deletions
diff --git a/usr/src/uts/sun4v/io/px/px_lib4v.c b/usr/src/uts/sun4v/io/px/px_lib4v.c
index f6d66e26c7..8ab8f6906b 100644
--- a/usr/src/uts/sun4v/io/px/px_lib4v.c
+++ b/usr/src/uts/sun4v/io/px/px_lib4v.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -1131,15 +1131,15 @@ px_lib_config_put(dev_info_t *dip, pci_device_t bdf, pci_config_offset_t off,
static uint32_t
px_pci_config_get(ddi_acc_impl_t *handle, uint32_t *addr, int size)
{
- px_config_acc_pvt_t *px_pvt = (px_config_acc_pvt_t *)
- handle->ahi_common.ah_bus_private;
+ px_config_acc_pvt_t *px_pvt = (px_config_acc_pvt_t *)
+ handle->ahi_common.ah_bus_private;
uint32_t pci_dev_addr = px_pvt->raddr;
uint32_t vaddr = px_pvt->vaddr;
uint16_t off = (uint16_t)(uintptr_t)(addr - vaddr) & 0xfff;
uint32_t rdata = 0;
if (px_lib_config_get(px_pvt->dip, pci_dev_addr, off,
- size, (pci_cfg_data_t *)&rdata) != DDI_SUCCESS)
+ size, (pci_cfg_data_t *)&rdata) != DDI_SUCCESS)
/* XXX update error kstats */
return (0xffffffff);
return (rdata);
@@ -1149,14 +1149,14 @@ static void
px_pci_config_put(ddi_acc_impl_t *handle, uint32_t *addr,
int size, pci_cfg_data_t wdata)
{
- px_config_acc_pvt_t *px_pvt = (px_config_acc_pvt_t *)
- handle->ahi_common.ah_bus_private;
+ px_config_acc_pvt_t *px_pvt = (px_config_acc_pvt_t *)
+ handle->ahi_common.ah_bus_private;
uint32_t pci_dev_addr = px_pvt->raddr;
uint32_t vaddr = px_pvt->vaddr;
uint16_t off = (uint16_t)(uintptr_t)(addr - vaddr) & 0xfff;
if (px_lib_config_put(px_pvt->dip, pci_dev_addr, off,
- size, wdata) != DDI_SUCCESS) {
+ size, wdata) != DDI_SUCCESS) {
/*EMPTY*/
/* XXX update error kstats */
}
@@ -1187,7 +1187,7 @@ px_pci_config_get64(ddi_acc_impl_t *handle, uint64_t *addr)
rdatal = (uint32_t)px_pci_config_get(handle, (uint32_t *)addr, 4);
rdatah = (uint32_t)px_pci_config_get(handle,
- (uint32_t *)((char *)addr+4), 4);
+ (uint32_t *)((char *)addr+4), 4);
return (((uint64_t)rdatah << 32) | rdatal);
}
@@ -1367,6 +1367,9 @@ px_lib_map_vconfig(dev_info_t *dip,
ddi_map_req_t *mp, pci_config_offset_t off,
pci_regspec_t *rp, caddr_t *addrp)
{
+ int fmcap;
+ ndi_err_t *errp;
+ on_trap_data_t *otp;
ddi_acc_hdl_t *hp;
ddi_acc_impl_t *ap;
uchar_t busnum; /* bus number */
@@ -1379,7 +1382,7 @@ px_lib_map_vconfig(dev_info_t *dip,
/* Check for mapping teardown operation */
if ((mp->map_op == DDI_MO_UNMAP) ||
- (mp->map_op == DDI_MO_UNLOCK)) {
+ (mp->map_op == DDI_MO_UNLOCK)) {
/* free up memory allocated for the private access handle. */
px_pvt = (px_config_acc_pvt_t *)hp->ah_bus_private;
kmem_free((void *)px_pvt, sizeof (px_config_acc_pvt_t));
@@ -1388,6 +1391,17 @@ px_lib_map_vconfig(dev_info_t *dip,
return (DDI_SUCCESS);
}
+ fmcap = ddi_fm_capable(dip);
+ if (DDI_FM_ACC_ERR_CAP(fmcap)) {
+ errp = ((ddi_acc_impl_t *)hp)->ahi_err;
+ otp = (on_trap_data_t *)errp->err_ontrap;
+ otp->ot_handle = (void *)(hp);
+ otp->ot_prot = OT_DATA_ACCESS;
+ errp->err_status = DDI_FM_OK;
+ errp->err_expected = DDI_FM_ERR_UNEXPECTED;
+ errp->err_cf = px_err_cfg_hdl_check;
+ }
+
ap->ahi_get8 = px_pci_config_get8;
ap->ahi_get16 = px_pci_config_get16;
ap->ahi_get32 = px_pci_config_get32;
@@ -1412,7 +1426,7 @@ px_lib_map_vconfig(dev_info_t *dip,
/* allocate memory for our private handle */
px_pvt = (px_config_acc_pvt_t *)
- kmem_zalloc(sizeof (px_config_acc_pvt_t), KM_SLEEP);
+ kmem_zalloc(sizeof (px_config_acc_pvt_t), KM_SLEEP);
hp->ah_bus_private = (void *)px_pvt;
busnum = PCI_REG_BUS_G(rp->pci_phys_hi);
@@ -1436,7 +1450,7 @@ px_lib_map_vconfig(dev_info_t *dip,
px_pvt->dip = dip;
DBG(DBG_LIB_CFG, dip, "px_config_setup: raddr 0x%x, vaddr 0x%x\n",
- px_pvt->raddr, px_pvt->vaddr);
+ px_pvt->raddr, px_pvt->vaddr);
*addrp = (caddr_t)(uintptr_t)px_pvt->vaddr;
return (DDI_SUCCESS);
}
@@ -1494,20 +1508,12 @@ px_lib_log_safeacc_err(px_t *px_p, ddi_acc_handle_t handle, int fme_flag,
}
}
- mutex_enter(&px_p->px_fm_mutex);
+ px_rp_en_q(px_p, bdf, addr, NULL);
- if (!px_lib_is_in_drain_state(px_p)) {
- /*
- * This is to ensure that device corresponding to the addr of
- * the failed PIO/CFG load gets scanned.
- */
- px_rp_en_q(px_p, bdf, addr,
- (PCI_STAT_R_MAST_AB | PCI_STAT_R_TARG_AB));
- (void) pf_scan_fabric(px_p->px_dip, &derr,
- px_p->px_dq_p, &px_p->px_dq_tail);
+ if (px_fm_enter(px_p) == DDI_SUCCESS) {
+ (void) px_scan_fabric(px_p, px_p->px_dip, &derr);
+ px_fm_exit(px_p);
}
-
- mutex_exit(&px_p->px_fm_mutex);
}