From: leonidk Date: Tue, 1 Aug 2006 10:00:03 +0000 (+0000) Subject: [MTHCA] [VSTAT] feature: added uplink info X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=fe1e713690a0d914d33efd7046babb31e483f136;p=~shefty%2Frdma-win.git [MTHCA] [VSTAT] feature: added uplink info git-svn-id: svn://openib.tc.cornell.edu/gen1@433 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/trunk/hw/mthca/kernel/hca_driver.h b/trunk/hw/mthca/kernel/hca_driver.h index ec212508..8633429d 100644 --- a/trunk/hw/mthca/kernel/hca_driver.h +++ b/trunk/hw/mthca/kernel/hca_driver.h @@ -38,6 +38,7 @@ #include #include #include +#include "mthca/mthca_vc.h" #include "hca_data.h" #include "mt_l2w.h" #include "hca_debug.h" diff --git a/trunk/hw/mthca/kernel/hca_pci.c b/trunk/hw/mthca/kernel/hca_pci.c index 85f6c545..17568bbf 100644 --- a/trunk/hw/mthca/kernel/hca_pci.c +++ b/trunk/hw/mthca/kernel/hca_pci.c @@ -594,7 +594,8 @@ resetExit: */ NTSTATUS hca_tune_pci( - IN DEVICE_OBJECT* const pDevObj ) + IN DEVICE_OBJECT* const pDevObj, + OUT uplink_info_t *p_uplink_info ) { NTSTATUS status; PCI_COMMON_CONFIG hcaConfig; @@ -632,6 +633,12 @@ hca_tune_pci( if( capOffset ) { pPciXCap = (PCI_PCIX_CAPABILITY*)(((UCHAR*)&hcaConfig) + capOffset); + + /* fill uplink features */ + p_uplink_info->bus_type = UPLINK_BUS_PCIX; + if (pPciXCap->Status & (1 << 17)) + p_uplink_info->u.pci_x.capabilities = UPLINK_BUS_PCIX_133; + /* Update the command field to max the read byte count if needed. */ if( (pPciXCap->Command & 0x000C) != 0x000C ) { @@ -660,6 +667,12 @@ hca_tune_pci( if( capOffset ) { pPciExpCap = (PCI_PCIEXP_CAPABILITY*)(((UCHAR*)&hcaConfig) + capOffset); + + /* fill uplink features */ + p_uplink_info->bus_type = UPLINK_BUS_PCIE; + if ((pPciExpCap->LinkStatus & 15) == 1) + p_uplink_info->u.pci_e.link_speed = UPLINK_BUS_PCIE_SDR; + p_uplink_info->u.pci_e.link_width = (uint8_t)((pPciExpCap->LinkStatus >> 4) & 0x03f); /* Update Max_Read_Request_Size. */ HCA_PRINT( TRACE_LEVEL_WARNING ,HCA_DBG_PNP, diff --git a/trunk/hw/mthca/kernel/hca_pci.h b/trunk/hw/mthca/kernel/hca_pci.h index fd82e379..dd8e9c0e 100644 --- a/trunk/hw/mthca/kernel/hca_pci.h +++ b/trunk/hw/mthca/kernel/hca_pci.h @@ -17,7 +17,8 @@ void hca_disable_pci( IN PBUS_INTERFACE_STANDARD phcaBusIfc); NTSTATUS -hca_tune_pci( - IN DEVICE_OBJECT* const pDevObj ); + hca_tune_pci( + IN DEVICE_OBJECT* const pDevObj, + OUT uplink_info_t *p_uplink_info ); #endif diff --git a/trunk/hw/mthca/kernel/hca_verbs.c b/trunk/hw/mthca/kernel/hca_verbs.c index 1b331c25..5d6a5d96 100644 --- a/trunk/hw/mthca/kernel/hca_verbs.c +++ b/trunk/hw/mthca/kernel/hca_verbs.c @@ -175,7 +175,9 @@ mlnx_query_ca ( required_size = PTR_ALIGN(sizeof(ib_ca_attr_t)) + PTR_ALIGN(sizeof(uint32_t) * num_page_sizes) + PTR_ALIGN(sizeof(ib_port_attr_t) * num_ports)+ - PTR_ALIGN(MTHCA_BOARD_ID_LEN); + PTR_ALIGN(MTHCA_BOARD_ID_LEN)+ + sizeof(uplink_info_t); /* uplink info */ + // get port properties for (port_num = 0; port_num <= end_port(ib_dev) - start_port(ib_dev); ++port_num) { // request @@ -231,6 +233,8 @@ mlnx_query_ca ( //copy vendor specific data cl_memcpy(last_p,to_mdev(ib_dev)->board_id, MTHCA_BOARD_ID_LEN); last_p += PTR_ALIGN(MTHCA_BOARD_ID_LEN); + *(uplink_info_t*)last_p = to_mdev(ib_dev)->uplink_info; + last_p += sizeof(uplink_info_t); /* uplink info */ // Separate the loops to ensure that table pointers are always setup for (port_num = 0; port_num < num_ports; port_num++) { diff --git a/trunk/hw/mthca/kernel/mthca_dev.h b/trunk/hw/mthca/kernel/mthca_dev.h index 842f87fc..7d3807ef 100644 --- a/trunk/hw/mthca/kernel/mthca_dev.h +++ b/trunk/hw/mthca/kernel/mthca_dev.h @@ -279,6 +279,7 @@ struct mthca_catas_err { struct mthca_dev { struct ib_device ib_dev; hca_dev_ext_t *ext; + uplink_info_t uplink_info; int hca_type; unsigned long mthca_flags; diff --git a/trunk/hw/mthca/kernel/mthca_main.c b/trunk/hw/mthca/kernel/mthca_main.c index 1590bec8..42c822f0 100644 --- a/trunk/hw/mthca/kernel/mthca_main.c +++ b/trunk/hw/mthca/kernel/mthca_main.c @@ -124,7 +124,7 @@ static struct pci_device_id { static NTSTATUS mthca_tune_pci(struct mthca_dev *mdev) { PDEVICE_OBJECT pdo = mdev->ext->cl_ext.p_self_do; - return hca_tune_pci(pdo); + return hca_tune_pci(pdo, &mdev->uplink_info); } int mthca_get_dev_info(struct mthca_dev *mdev, __be64 *node_guid, u32 *hw_id) diff --git a/trunk/inc/mthca/mthca_vc.h b/trunk/inc/mthca/mthca_vc.h index 2a4d9d2f..91beeb62 100644 --- a/trunk/inc/mthca/mthca_vc.h +++ b/trunk/inc/mthca/mthca_vc.h @@ -51,14 +51,38 @@ struct _map_crspace { #define FW_OPEN_IF 0xe7 #define FW_CLOSE_IF 0x7e +/* uplink info */ +typedef struct { + uint8_t bus_type; /* 1 - PCI, 2 - PCI-X, 3 - PCI_E */ +#define UPLINK_BUS_PCI 1 +#define UPLINK_BUS_PCIX 2 +#define UPLINK_BUS_PCIE 3 + union { + struct { + uint8_t capabilities; +#define UPLINK_BUS_PCIX_133 2 /* 133 MHz capable */ + uint16_t frequency; /* in MHz */ + } pci_x; + struct { + uint8_t reserve; + uint8_t link_speed; /* 1X link speed */ +#define UPLINK_BUS_PCIE_SDR 1 /* 2.5 Gbps */ + uint8_t link_width; /* x1, x2, x4, x8, x12, x16, x32 */ + } pci_e; + } u; +} uplink_info_t; /* Defines for get data for vendor specific */ -#define MTHCA_BOARD_ID_LEN 64 +#define MTHCA_BRD_ID_LEN 64 inline char* mthca_get_board_id(ib_ca_attr_t *ca_attr) { - return (char*)(ca_attr)+(ca_attr->size - MTHCA_BOARD_ID_LEN); + return (char*)(ca_attr)+(ca_attr->size - MTHCA_BRD_ID_LEN - sizeof(uplink_info_t)); } +inline void* mthca_get_uplink_info(ib_ca_attr_t *ca_attr) +{ + return (char*)(ca_attr)+(ca_attr->size - sizeof(uplink_info_t)); +} #endif diff --git a/trunk/tools/vstat/user/vstat_main.c b/trunk/tools/vstat/user/vstat_main.c index 7a95f662..86f7edb0 100644 --- a/trunk/tools/vstat/user/vstat_main.c +++ b/trunk/tools/vstat/user/vstat_main.c @@ -166,13 +166,46 @@ void printPortInfo(ib_port_attr_t* portPtr, BOOLEAN fullPrint){ } +void print_uplink_info(ib_ca_attr_t* ca_attr) +{ + uplink_info_t*p_uplink_info = mthca_get_uplink_info(ca_attr); + char *bus_type, *link_speed; + int freq; + + switch (p_uplink_info->bus_type) { + case UPLINK_BUS_PCI: bus_type = "PCI"; break; + case UPLINK_BUS_PCIX: bus_type = "PCI_X"; break; + case UPLINK_BUS_PCIE: bus_type = "PCI_E"; break; + default: printf("\tuplink={BUS=UNRECOGNIZED (%d)}\n", p_uplink_info->bus_type); return; + } + switch (p_uplink_info->bus_type) { + case UPLINK_BUS_PCI: + case UPLINK_BUS_PCIX: + if (p_uplink_info->u.pci_x.capabilities == UPLINK_BUS_PCIX_133) + freq = 133; + else + freq = 66; + printf("\tuplink={BUS=%s, CAPS=%d MHz}\n", bus_type, freq ); + return; + + case UPLINK_BUS_PCIE: + if (p_uplink_info->u.pci_e.link_speed == UPLINK_BUS_PCIE_SDR) + link_speed = "2.5 Gbps"; + else + link_speed = "unknown"; + printf("\tuplink={BUS=%s, SPEED=%s, WIDTH=x%d}\n", + bus_type, link_speed, p_uplink_info->u.pci_e.link_width ); + return; + } +} void vstat_print_ca_attr(int idx, ib_ca_attr_t* ca_attr, BOOLEAN fullPrint){ int i; printf("\n\thca_idx=%d\n",idx); printf("\tpci_location={BUS=NA,DEV/FUNC=NA}\n"); + print_uplink_info(ca_attr); printf("\tvendor_id=0x%04x\n", ca_attr->vend_id); printf("\tvendor_part_id=0x%04x\n", ca_attr->dev_id); printf("\thw_ver=0x%x\n", ca_attr->revision); //TODO: ???