diff options
author | schwartz <none@none> | 2006-07-24 17:34:57 -0700 |
---|---|---|
committer | schwartz <none@none> | 2006-07-24 17:34:57 -0700 |
commit | 7e1db6d255b0a8cfcaa59571a9ecbe6da8b67987 (patch) | |
tree | 76198c73d5b91ed08c91296ee7d4a664b9f6d634 | |
parent | 81490fd2cb9cfe1decc778da2af943195849b47b (diff) | |
download | illumos-gate-7e1db6d255b0a8cfcaa59571a9ecbe6da8b67987.tar.gz |
6450048 Fix fire hardware revision checking
6451125 Cleanup of old px and px_pci driver aliases
-rw-r--r-- | usr/src/uts/sparc/os/driver_aliases | 7 | ||||
-rw-r--r-- | usr/src/uts/sun4u/io/px/px_lib4u.c | 54 | ||||
-rw-r--r-- | usr/src/uts/sun4u/io/px/px_lib4u.h | 35 |
3 files changed, 35 insertions, 61 deletions
diff --git a/usr/src/uts/sparc/os/driver_aliases b/usr/src/uts/sparc/os/driver_aliases index 70c71a19d8..79127666b7 100644 --- a/usr/src/uts/sparc/os/driver_aliases +++ b/usr/src/uts/sparc/os/driver_aliases @@ -143,15 +143,8 @@ sgen "scsa,08.bfcp" sgen "scsa,08.bvhci" ibd "ib.ipib" px "SUNW,sun4v-pci" -px "pci108e,80f0" px "pciex108e,80f0" px "pciex108e,80f8" -px_pci "pci1033,124" -px_pci "pci1033,125" -px_pci "pci8086,340" -px_pci "pci8086,341" -px_pci "pci10b5,8532" -px_pci "pci10b5,8516" px_pci "pciexclass,060400" pxb_bcm "pciex1166,103" vnex "SUNW,sun4v-virtual-devices" diff --git a/usr/src/uts/sun4u/io/px/px_lib4u.c b/usr/src/uts/sun4u/io/px/px_lib4u.c index 732bc7ca60..c8fe7cfc51 100644 --- a/usr/src/uts/sun4u/io/px/px_lib4u.c +++ b/usr/src/uts/sun4u/io/px/px_lib4u.c @@ -64,7 +64,7 @@ uint64_t px_paddr_mask; static int px_goto_l23ready(px_t *px_p); static int px_goto_l0(px_t *px_p); static int px_pre_pwron_check(px_t *px_p); -static uint32_t px_identity_chip(px_t *px_p); +static uint32_t px_identity_init(px_t *px_p); static boolean_t px_cpr_callb(void *arg, int code); static uint_t px_cb_intr(caddr_t arg); @@ -157,38 +157,26 @@ px_lib_dev_init(dev_info_t *dip, devhandle_t *dev_hdl) px_t *px_p = DIP_TO_STATE(dip); caddr_t xbc_csr_base, csr_base; px_dvma_range_prop_t px_dvma_range; - uint32_t chip_id; + px_chip_type_t chip_type = px_identity_init(px_p); pxu_t *pxu_p; - DBG(DBG_ATTACH, dip, "px_lib_dev_init: dip 0x%p\n", dip); + DBG(DBG_ATTACH, dip, "px_lib_dev_init: dip 0x%p", dip); - if ((chip_id = px_identity_chip(px_p)) == PX_CHIP_UNIDENTIFIED) - return (DDI_FAILURE); - - switch (chip_id) { - case FIRE_VER_10: - cmn_err(CE_WARN, "FIRE Hardware Version 1.0 is not supported"); - return (DDI_FAILURE); - case FIRE_VER_20: - DBG(DBG_ATTACH, dip, "FIRE Hardware Version 2.0\n"); - px_paddr_mask = MMU_FIRE_PADDR_MASK; - break; - case OBERON_VER_10: - DBG(DBG_ATTACH, dip, "Oberon Hardware Version 1.0\n"); - px_paddr_mask = MMU_OBERON_PADDR_MASK; - break; - default: - cmn_err(CE_WARN, "%s%d: PX Hardware Version Unknown\n", - ddi_driver_name(dip), ddi_get_instance(dip)); + if (chip_type == PX_CHIP_UNIDENTIFIED) { + cmn_err(CE_WARN, "%s%d: Unrecognized Hardware Version\n", + NAMEINST(dip)); return (DDI_FAILURE); } + px_paddr_mask = (chip_type == PX_CHIP_FIRE) ? MMU_FIRE_PADDR_MASK : + MMU_OBERON_PADDR_MASK; + /* * Allocate platform specific structure and link it to * the px state structure. */ pxu_p = kmem_zalloc(sizeof (pxu_t), KM_SLEEP); - pxu_p->chip_id = chip_id; + pxu_p->chip_type = chip_type; pxu_p->portid = ddi_getprop(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, "portid", -1); @@ -1982,7 +1970,7 @@ l0_done: * the identity defaults to PX_CHIP_UNIDENTIFIED. */ static uint32_t -px_identity_chip(px_t *px_p) +px_identity_init(px_t *px_p) { dev_info_t *dip = px_p->px_dip; char *name = ddi_binding_name(dip); @@ -1992,22 +1980,22 @@ px_identity_chip(px_t *px_p) "module-revision#", 0); /* Check for Fire driver binding name */ - if ((strcmp(name, "pci108e,80f0") == 0) || - (strcmp(name, "pciex108e,80f0") == 0)) { - DBG(DBG_ATTACH, dip, "px_identity_chip: %s%d: " - "name %s module-revision %d\n", ddi_driver_name(dip), - ddi_get_instance(dip), name, revision); + if (strcmp(name, "pciex108e,80f0") == 0) { + DBG(DBG_ATTACH, dip, "px_identity_init: %s%d: " + "(FIRE), module-revision %d\n", NAMEINST(dip), + revision); - return (PX_CHIP_ID(PX_CHIP_FIRE, revision, 0x00)); + return ((revision >= FIRE_MOD_REV_20) ? + PX_CHIP_FIRE : PX_CHIP_UNIDENTIFIED); } /* Check for Oberon driver binding name */ if (strcmp(name, "pciex108e,80f8") == 0) { - DBG(DBG_ATTACH, dip, "px_identity_chip: %s%d: " - "name %s module-revision %d\n", ddi_driver_name(dip), - ddi_get_instance(dip), name, revision); + DBG(DBG_ATTACH, dip, "px_identity_init: %s%d: " + "(OBERON), module-revision %d\n", NAMEINST(dip), + revision); - return (PX_CHIP_ID(PX_CHIP_OBERON, revision, 0x00)); + return (PX_CHIP_OBERON); } DBG(DBG_ATTACH, dip, "%s%d: Unknown PCI Express Host bridge %s %x\n", diff --git a/usr/src/uts/sun4u/io/px/px_lib4u.h b/usr/src/uts/sun4u/io/px/px_lib4u.h index e8333f7e01..cb4567302d 100644 --- a/usr/src/uts/sun4u/io/px/px_lib4u.h +++ b/usr/src/uts/sun4u/io/px/px_lib4u.h @@ -71,6 +71,15 @@ typedef struct px_cb_list { struct px_cb_list *next; } px_cb_list_t; +/* IO chip type */ +typedef enum { + PX_CHIP_UNIDENTIFIED = 0, + PX_CHIP_FIRE = 1, + PX_CHIP_OBERON = 2 +} px_chip_type_t; + +#define PX_CHIP_TYPE(pxu_p) ((pxu_p)->chip_type) + typedef struct px_cb { px_cb_list_t *pxl; /* linked list px */ kmutex_t cb_mutex; /* lock for CB */ @@ -81,7 +90,7 @@ typedef struct px_cb { } px_cb_t; typedef struct pxu { - uint32_t chip_id; + px_chip_type_t chip_type; uint8_t portid; uint16_t tsb_cookie; uint32_t tsb_size; @@ -262,30 +271,14 @@ typedef struct eq_rec { #define PX_BDF_TO_CFGADDR(bdf, offset) (((bdf) << PX_PA_BDF_SHIFT) + (offset)) /* - * The sequence of the chip_type appearance is significant. - * There are code depending on it: PX_CHIP_TYPE(pxu_p) < PX_CHIP_FIRE. - */ -typedef enum { - PX_CHIP_UNIDENTIFIED = 0, - PX_CHIP_FIRE = 1, - PX_CHIP_OBERON = 2 -} px_chip_id_t; - -/* - * [msb] [lsb] - * 0x00 <chip_type> <version#> <module-revision#> + * Fire hardware specific version definitions. + * All Fire versions > 2.0 will be numerically greater than FIRE_MOD_REV_20 */ -#define PX_CHIP_ID(t, v, m) (((t) << 16) | ((v) << 8) | (m)) -#define PX_CHIP_TYPE(pxu_p) (((pxu_p)->chip_id) >> 16) -#define PX_CHIP_REV(pxu_p) (((pxu_p)->chip_id) & 0xFF) -#define PX_CHIP_VER(pxu_p) ((((pxu_p)->chip_id) >> 8) & 0xFF) +#define FIRE_MOD_REV_20 0x03 /* - * Fire hardware specific version definitions. + * Oberon specific definitions. */ -#define FIRE_VER_10 PX_CHIP_ID(PX_CHIP_FIRE, 0x01, 0x00) -#define FIRE_VER_20 PX_CHIP_ID(PX_CHIP_FIRE, 0x03, 0x00) -#define OBERON_VER_10 PX_CHIP_ID(PX_CHIP_OBERON, 0x00, 0x00) #define OBERON_RANGE_PROP_MASK 0x7fff /* |