Commit abfc4459 authored by Easwar Hariharan's avatar Easwar Hariharan Committed by Greg Kroah-Hartman

staging/rdma/hfi1: Load SBus firmware once per ASIC

Using fw_sbus_load to control SBus firmware load doesn't scale across multiple
HFI1 cards in a single system. This patch ensures that the SBus firmware is
loaded once per ASIC.
Reviewed-by: default avatarDean Luick <dean.luick@intel.com>
Reviewed-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarEaswar Hariharan <easwar.hariharan@intel.com>
Signed-off-by: default avatarIra Weiny <ira.weiny@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent f4f30031
...@@ -1236,35 +1236,20 @@ int load_firmware(struct hfi1_devdata *dd) ...@@ -1236,35 +1236,20 @@ int load_firmware(struct hfi1_devdata *dd)
{ {
int ret; int ret;
if (fw_sbus_load || fw_fabric_serdes_load) { if (fw_fabric_serdes_load) {
ret = acquire_hw_mutex(dd); ret = acquire_hw_mutex(dd);
if (ret) if (ret)
return ret; return ret;
set_sbus_fast_mode(dd); set_sbus_fast_mode(dd);
/* set_serdes_broadcast(dd, all_fabric_serdes_broadcast,
* The SBus contains part of the fabric firmware and so must fabric_serdes_broadcast[dd->hfi1_id],
* also be downloaded. fabric_serdes_addrs[dd->hfi1_id],
*/ NUM_FABRIC_SERDES);
if (fw_sbus_load) { turn_off_spicos(dd, SPICO_FABRIC);
turn_off_spicos(dd, SPICO_SBUS); ret = load_fabric_serdes_firmware(dd, &fw_fabric);
ret = load_sbus_firmware(dd, &fw_sbus);
if (ret)
goto clear;
fw_sbus_load = 0;
}
if (fw_fabric_serdes_load) {
set_serdes_broadcast(dd, all_fabric_serdes_broadcast,
fabric_serdes_broadcast[dd->hfi1_id],
fabric_serdes_addrs[dd->hfi1_id],
NUM_FABRIC_SERDES);
turn_off_spicos(dd, SPICO_FABRIC);
ret = load_fabric_serdes_firmware(dd, &fw_fabric);
}
clear:
clear_sbus_fast_mode(dd); clear_sbus_fast_mode(dd);
release_hw_mutex(dd); release_hw_mutex(dd);
if (ret) if (ret)
...@@ -1583,7 +1568,7 @@ int load_pcie_firmware(struct hfi1_devdata *dd) ...@@ -1583,7 +1568,7 @@ int load_pcie_firmware(struct hfi1_devdata *dd)
/* both firmware loads below use the SBus */ /* both firmware loads below use the SBus */
set_sbus_fast_mode(dd); set_sbus_fast_mode(dd);
if (fw_sbus_load) { if (fw_sbus_load && (dd->flags & HFI1_DO_INIT_ASIC)) {
turn_off_spicos(dd, SPICO_SBUS); turn_off_spicos(dd, SPICO_SBUS);
ret = load_sbus_firmware(dd, &fw_sbus); ret = load_sbus_firmware(dd, &fw_sbus);
if (ret) if (ret)
......
...@@ -947,15 +947,16 @@ int do_pcie_gen3_transition(struct hfi1_devdata *dd) ...@@ -947,15 +947,16 @@ int do_pcie_gen3_transition(struct hfi1_devdata *dd)
} }
retry: retry:
if (therm) { if (therm) {
/* toggle SPICO_ENABLE to get back to the state /*
just after the firmware load */ * toggle SPICO_ENABLE to get back to the state
* just after the firmware load
*/
sbus_request(dd, SBUS_MASTER_BROADCAST, 0x01, sbus_request(dd, SBUS_MASTER_BROADCAST, 0x01,
WRITE_SBUS_RECEIVER, 0x00000040); WRITE_SBUS_RECEIVER, 0x00000040);
sbus_request(dd, SBUS_MASTER_BROADCAST, 0x01, sbus_request(dd, SBUS_MASTER_BROADCAST, 0x01,
WRITE_SBUS_RECEIVER, 0x00000140); WRITE_SBUS_RECEIVER, 0x00000140);
dd_dev_info(dd, "%s: toggle SPICO_ENABLE to reset the bus\n",
__func__);
} }
/* step 3: download SBus Master firmware */ /* step 3: download SBus Master firmware */
...@@ -1198,6 +1199,7 @@ int do_pcie_gen3_transition(struct hfi1_devdata *dd) ...@@ -1198,6 +1199,7 @@ int do_pcie_gen3_transition(struct hfi1_devdata *dd)
/* clear the DC reset */ /* clear the DC reset */
write_csr(dd, CCE_DC_CTRL, 0); write_csr(dd, CCE_DC_CTRL, 0);
/* Set the LED off */ /* Set the LED off */
if (is_a0(dd)) if (is_a0(dd))
setextled(dd, 0); setextled(dd, 0);
......
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