Commit 5e6e9424 authored by Michael J. Ruhl's avatar Michael J. Ruhl Committed by Doug Ledford

IB/hfi1: Add a patch value to the firmware version string

The HFI firmware now includes a patch level in its version.
Updating the necessary code to include the patch version in the
firmware string.
Reviewed-by: default avatarEaswar Hariharan <easwar.hariharan@intel.com>
Signed-off-by: default avatarMichael J. Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent fb897ad3
/* /*
* Copyright(c) 2015, 2016 Intel Corporation. * Copyright(c) 2015 - 2017 Intel Corporation.
* *
* This file is provided under a dual BSD/GPLv2 license. When using or * This file is provided under a dual BSD/GPLv2 license. When using or
* redistributing this file, you may do so under either license. * redistributing this file, you may do so under either license.
...@@ -7166,7 +7166,7 @@ static void get_link_widths(struct hfi1_devdata *dd, u16 *tx_width, ...@@ -7166,7 +7166,7 @@ static void get_link_widths(struct hfi1_devdata *dd, u16 *tx_width,
* set the max_rate field in handle_verify_cap until v0.19. * set the max_rate field in handle_verify_cap until v0.19.
*/ */
if ((dd->icode == ICODE_RTL_SILICON) && if ((dd->icode == ICODE_RTL_SILICON) &&
(dd->dc8051_ver < dc8051_ver(0, 19))) { (dd->dc8051_ver < dc8051_ver(0, 19, 0))) {
/* max_rate: 0 = 12.5G, 1 = 25G */ /* max_rate: 0 = 12.5G, 1 = 25G */
switch (max_rate) { switch (max_rate) {
case 0: case 0:
...@@ -7351,7 +7351,7 @@ void handle_verify_cap(struct work_struct *work) ...@@ -7351,7 +7351,7 @@ void handle_verify_cap(struct work_struct *work)
} }
ppd->link_speed_active = 0; /* invalid value */ ppd->link_speed_active = 0; /* invalid value */
if (dd->dc8051_ver < dc8051_ver(0, 20)) { if (dd->dc8051_ver < dc8051_ver(0, 20, 0)) {
/* remote_tx_rate: 0 = 12.5G, 1 = 25G */ /* remote_tx_rate: 0 = 12.5G, 1 = 25G */
switch (remote_tx_rate) { switch (remote_tx_rate) {
case 0: case 0:
...@@ -8422,7 +8422,7 @@ static int write_lcb_via_8051(struct hfi1_devdata *dd, u32 addr, u64 data) ...@@ -8422,7 +8422,7 @@ static int write_lcb_via_8051(struct hfi1_devdata *dd, u32 addr, u64 data)
int ret; int ret;
if (dd->icode == ICODE_FUNCTIONAL_SIMULATOR || if (dd->icode == ICODE_FUNCTIONAL_SIMULATOR ||
(dd->dc8051_ver < dc8051_ver(0, 20))) { (dd->dc8051_ver < dc8051_ver(0, 20, 0))) {
if (acquire_lcb_access(dd, 0) == 0) { if (acquire_lcb_access(dd, 0) == 0) {
write_csr(dd, addr, data); write_csr(dd, addr, data);
release_lcb_access(dd, 0); release_lcb_access(dd, 0);
...@@ -8728,13 +8728,20 @@ static void read_remote_device_id(struct hfi1_devdata *dd, u16 *device_id, ...@@ -8728,13 +8728,20 @@ static void read_remote_device_id(struct hfi1_devdata *dd, u16 *device_id,
& REMOTE_DEVICE_REV_MASK; & REMOTE_DEVICE_REV_MASK;
} }
void read_misc_status(struct hfi1_devdata *dd, u8 *ver_a, u8 *ver_b) void read_misc_status(struct hfi1_devdata *dd, u8 *ver_major, u8 *ver_minor,
u8 *ver_patch)
{ {
u32 frame; u32 frame;
read_8051_config(dd, MISC_STATUS, GENERAL_CONFIG, &frame); read_8051_config(dd, MISC_STATUS, GENERAL_CONFIG, &frame);
*ver_a = (frame >> STS_FM_VERSION_A_SHIFT) & STS_FM_VERSION_A_MASK; *ver_major = (frame >> STS_FM_VERSION_MAJOR_SHIFT) &
*ver_b = (frame >> STS_FM_VERSION_B_SHIFT) & STS_FM_VERSION_B_MASK; STS_FM_VERSION_MAJOR_MASK;
*ver_minor = (frame >> STS_FM_VERSION_MINOR_SHIFT) &
STS_FM_VERSION_MINOR_MASK;
read_8051_config(dd, VERSION_PATCH, GENERAL_CONFIG, &frame);
*ver_patch = (frame >> STS_FM_VERSION_PATCH_SHIFT) &
STS_FM_VERSION_PATCH_MASK;
} }
static void read_vc_remote_phy(struct hfi1_devdata *dd, u8 *power_management, static void read_vc_remote_phy(struct hfi1_devdata *dd, u8 *power_management,
...@@ -9130,7 +9137,7 @@ static int set_local_link_attributes(struct hfi1_pportdata *ppd) ...@@ -9130,7 +9137,7 @@ static int set_local_link_attributes(struct hfi1_pportdata *ppd)
if (ret) if (ret)
goto set_local_link_attributes_fail; goto set_local_link_attributes_fail;
if (dd->dc8051_ver < dc8051_ver(0, 20)) { if (dd->dc8051_ver < dc8051_ver(0, 20, 0)) {
/* set the tx rate to the fastest enabled */ /* set the tx rate to the fastest enabled */
if (ppd->link_speed_enabled & OPA_LINK_SPEED_25G) if (ppd->link_speed_enabled & OPA_LINK_SPEED_25G)
ppd->local_tx_rate = 1; ppd->local_tx_rate = 1;
......
#ifndef _CHIP_H #ifndef _CHIP_H
#define _CHIP_H #define _CHIP_H
/* /*
* Copyright(c) 2015, 2016 Intel Corporation. * Copyright(c) 2015 - 2017 Intel Corporation.
* *
* This file is provided under a dual BSD/GPLv2 license. When using or * This file is provided under a dual BSD/GPLv2 license. When using or
* redistributing this file, you may do so under either license. * redistributing this file, you may do so under either license.
...@@ -394,7 +394,8 @@ ...@@ -394,7 +394,8 @@
#define LAST_REMOTE_STATE_COMPLETE 0x13 #define LAST_REMOTE_STATE_COMPLETE 0x13
#define LINK_QUALITY_INFO 0x14 #define LINK_QUALITY_INFO 0x14
#define REMOTE_DEVICE_ID 0x15 #define REMOTE_DEVICE_ID 0x15
#define LINK_DOWN_REASON 0x16 #define LINK_DOWN_REASON 0x16 /* first byte of offset 0x16 */
#define VERSION_PATCH 0x16 /* last byte of offset 0x16 */
/* 8051 lane specific register field IDs */ /* 8051 lane specific register field IDs */
#define TX_EQ_SETTINGS 0x00 #define TX_EQ_SETTINGS 0x00
...@@ -524,10 +525,12 @@ enum { ...@@ -524,10 +525,12 @@ enum {
#define SUPPORTED_CRCS (CAP_CRC_14B | CAP_CRC_48B) #define SUPPORTED_CRCS (CAP_CRC_14B | CAP_CRC_48B)
/* misc status version fields */ /* misc status version fields */
#define STS_FM_VERSION_A_SHIFT 16 #define STS_FM_VERSION_MINOR_SHIFT 16
#define STS_FM_VERSION_A_MASK 0xff #define STS_FM_VERSION_MINOR_MASK 0xff
#define STS_FM_VERSION_B_SHIFT 24 #define STS_FM_VERSION_MAJOR_SHIFT 24
#define STS_FM_VERSION_B_MASK 0xff #define STS_FM_VERSION_MAJOR_MASK 0xff
#define STS_FM_VERSION_PATCH_SHIFT 24
#define STS_FM_VERSION_PATCH_MASK 0xff
/* LCB_CFG_CRC_MODE TX_VAL and RX_VAL CRC mode values */ /* LCB_CFG_CRC_MODE TX_VAL and RX_VAL CRC mode values */
#define LCB_CRC_16B 0x0 /* 16b CRC */ #define LCB_CRC_16B 0x0 /* 16b CRC */
...@@ -698,7 +701,8 @@ void fabric_serdes_reset(struct hfi1_devdata *dd); ...@@ -698,7 +701,8 @@ void fabric_serdes_reset(struct hfi1_devdata *dd);
int read_8051_data(struct hfi1_devdata *dd, u32 addr, u32 len, u64 *result); int read_8051_data(struct hfi1_devdata *dd, u32 addr, u32 len, u64 *result);
/* chip.c */ /* chip.c */
void read_misc_status(struct hfi1_devdata *dd, u8 *ver_a, u8 *ver_b); void read_misc_status(struct hfi1_devdata *dd, u8 *ver_major, u8 *ver_minor,
u8 *ver_patch);
void read_guid(struct hfi1_devdata *dd); void read_guid(struct hfi1_devdata *dd);
int wait_fm_ready(struct hfi1_devdata *dd, u32 mstimeout); int wait_fm_ready(struct hfi1_devdata *dd, u32 mstimeout);
void set_link_down_reason(struct hfi1_pportdata *ppd, u8 lcl_reason, void set_link_down_reason(struct hfi1_pportdata *ppd, u8 lcl_reason,
......
/* /*
* Copyright(c) 2015, 2016 Intel Corporation. * Copyright(c) 2015 - 2017 Intel Corporation.
* *
* This file is provided under a dual BSD/GPLv2 license. When using or * This file is provided under a dual BSD/GPLv2 license. When using or
* redistributing this file, you may do so under either license. * redistributing this file, you may do so under either license.
...@@ -1004,7 +1004,9 @@ static int load_8051_firmware(struct hfi1_devdata *dd, ...@@ -1004,7 +1004,9 @@ static int load_8051_firmware(struct hfi1_devdata *dd,
{ {
u64 reg; u64 reg;
int ret; int ret;
u8 ver_a, ver_b; u8 ver_major;
u8 ver_minor;
u8 ver_patch;
/* /*
* DC Reset sequence * DC Reset sequence
...@@ -1073,10 +1075,10 @@ static int load_8051_firmware(struct hfi1_devdata *dd, ...@@ -1073,10 +1075,10 @@ static int load_8051_firmware(struct hfi1_devdata *dd,
return -ETIMEDOUT; return -ETIMEDOUT;
} }
read_misc_status(dd, &ver_a, &ver_b); read_misc_status(dd, &ver_major, &ver_minor, &ver_patch);
dd_dev_info(dd, "8051 firmware version %d.%d\n", dd_dev_info(dd, "8051 firmware version %d.%d.%d\n",
(int)ver_b, (int)ver_a); (int)ver_major, (int)ver_minor, (int)ver_patch);
dd->dc8051_ver = dc8051_ver(ver_b, ver_a); dd->dc8051_ver = dc8051_ver(ver_major, ver_minor, ver_patch);
return 0; return 0;
} }
......
...@@ -1020,7 +1020,7 @@ struct hfi1_devdata { ...@@ -1020,7 +1020,7 @@ struct hfi1_devdata {
u8 qos_shift; u8 qos_shift;
u16 irev; /* implementation revision */ u16 irev; /* implementation revision */
u16 dc8051_ver; /* 8051 firmware version */ u32 dc8051_ver; /* 8051 firmware version */
spinlock_t hfi1_diag_trans_lock; /* protect diag observer ops */ spinlock_t hfi1_diag_trans_lock; /* protect diag observer ops */
struct platform_config platform_config; struct platform_config platform_config;
...@@ -1173,9 +1173,10 @@ struct hfi1_devdata { ...@@ -1173,9 +1173,10 @@ struct hfi1_devdata {
}; };
/* 8051 firmware version helper */ /* 8051 firmware version helper */
#define dc8051_ver(a, b) ((a) << 8 | (b)) #define dc8051_ver(a, b, c) ((a) << 16 | (b) << 8 | (c))
#define dc8051_ver_maj(a) ((a & 0xff00) >> 8) #define dc8051_ver_maj(a) (((a) & 0xff0000) >> 16)
#define dc8051_ver_min(a) (a & 0x00ff) #define dc8051_ver_min(a) (((a) & 0x00ff00) >> 8)
#define dc8051_ver_patch(a) ((a) & 0x0000ff)
/* f_put_tid types */ /* f_put_tid types */
#define PT_EXPECTED 0 #define PT_EXPECTED 0
......
...@@ -1236,12 +1236,14 @@ int hfi1_verbs_send(struct rvt_qp *qp, struct hfi1_pkt_state *ps) ...@@ -1236,12 +1236,14 @@ int hfi1_verbs_send(struct rvt_qp *qp, struct hfi1_pkt_state *ps)
static void hfi1_fill_device_attr(struct hfi1_devdata *dd) static void hfi1_fill_device_attr(struct hfi1_devdata *dd)
{ {
struct rvt_dev_info *rdi = &dd->verbs_dev.rdi; struct rvt_dev_info *rdi = &dd->verbs_dev.rdi;
u16 ver = dd->dc8051_ver; u32 ver = dd->dc8051_ver;
memset(&rdi->dparms.props, 0, sizeof(rdi->dparms.props)); memset(&rdi->dparms.props, 0, sizeof(rdi->dparms.props));
rdi->dparms.props.fw_ver = ((u64)(dc8051_ver_maj(ver)) << 16) | rdi->dparms.props.fw_ver = ((u64)(dc8051_ver_maj(ver)) << 32) |
(u64)dc8051_ver_min(ver); ((u64)(dc8051_ver_min(ver)) << 16) |
(u64)dc8051_ver_patch(ver);
rdi->dparms.props.device_cap_flags = IB_DEVICE_BAD_PKEY_CNTR | rdi->dparms.props.device_cap_flags = IB_DEVICE_BAD_PKEY_CNTR |
IB_DEVICE_BAD_QKEY_CNTR | IB_DEVICE_SHUTDOWN_PORT | IB_DEVICE_BAD_QKEY_CNTR | IB_DEVICE_SHUTDOWN_PORT |
IB_DEVICE_SYS_IMAGE_GUID | IB_DEVICE_RC_RNR_NAK_GEN | IB_DEVICE_SYS_IMAGE_GUID | IB_DEVICE_RC_RNR_NAK_GEN |
...@@ -1520,10 +1522,10 @@ static void hfi1_get_dev_fw_str(struct ib_device *ibdev, char *str, ...@@ -1520,10 +1522,10 @@ static void hfi1_get_dev_fw_str(struct ib_device *ibdev, char *str,
{ {
struct rvt_dev_info *rdi = ib_to_rvt(ibdev); struct rvt_dev_info *rdi = ib_to_rvt(ibdev);
struct hfi1_ibdev *dev = dev_from_rdi(rdi); struct hfi1_ibdev *dev = dev_from_rdi(rdi);
u16 ver = dd_from_dev(dev)->dc8051_ver; u32 ver = dd_from_dev(dev)->dc8051_ver;
snprintf(str, str_len, "%u.%u", dc8051_ver_maj(ver), snprintf(str, str_len, "%u.%u.%u", dc8051_ver_maj(ver),
dc8051_ver_min(ver)); dc8051_ver_min(ver), dc8051_ver_patch(ver));
} }
static const char * const driver_cntr_names[] = { static const char * const driver_cntr_names[] = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment