Skip to content

Commit abfc445

Browse files
Easwar Hariharangregkh
authored andcommitted
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: Dean Luick <dean.luick@intel.com> Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Easwar Hariharan <easwar.hariharan@intel.com> Signed-off-by: Ira Weiny <ira.weiny@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent f4f3003 commit abfc445

File tree

2 files changed

+14
-27
lines changed

2 files changed

+14
-27
lines changed

drivers/staging/rdma/hfi1/firmware.c

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1236,35 +1236,20 @@ int load_firmware(struct hfi1_devdata *dd)
12361236
{
12371237
int ret;
12381238

1239-
if (fw_sbus_load || fw_fabric_serdes_load) {
1239+
if (fw_fabric_serdes_load) {
12401240
ret = acquire_hw_mutex(dd);
12411241
if (ret)
12421242
return ret;
12431243

12441244
set_sbus_fast_mode(dd);
12451245

1246-
/*
1247-
* The SBus contains part of the fabric firmware and so must
1248-
* also be downloaded.
1249-
*/
1250-
if (fw_sbus_load) {
1251-
turn_off_spicos(dd, SPICO_SBUS);
1252-
ret = load_sbus_firmware(dd, &fw_sbus);
1253-
if (ret)
1254-
goto clear;
1255-
fw_sbus_load = 0;
1256-
}
1246+
set_serdes_broadcast(dd, all_fabric_serdes_broadcast,
1247+
fabric_serdes_broadcast[dd->hfi1_id],
1248+
fabric_serdes_addrs[dd->hfi1_id],
1249+
NUM_FABRIC_SERDES);
1250+
turn_off_spicos(dd, SPICO_FABRIC);
1251+
ret = load_fabric_serdes_firmware(dd, &fw_fabric);
12571252

1258-
if (fw_fabric_serdes_load) {
1259-
set_serdes_broadcast(dd, all_fabric_serdes_broadcast,
1260-
fabric_serdes_broadcast[dd->hfi1_id],
1261-
fabric_serdes_addrs[dd->hfi1_id],
1262-
NUM_FABRIC_SERDES);
1263-
turn_off_spicos(dd, SPICO_FABRIC);
1264-
ret = load_fabric_serdes_firmware(dd, &fw_fabric);
1265-
}
1266-
1267-
clear:
12681253
clear_sbus_fast_mode(dd);
12691254
release_hw_mutex(dd);
12701255
if (ret)
@@ -1583,7 +1568,7 @@ int load_pcie_firmware(struct hfi1_devdata *dd)
15831568
/* both firmware loads below use the SBus */
15841569
set_sbus_fast_mode(dd);
15851570

1586-
if (fw_sbus_load) {
1571+
if (fw_sbus_load && (dd->flags & HFI1_DO_INIT_ASIC)) {
15871572
turn_off_spicos(dd, SPICO_SBUS);
15881573
ret = load_sbus_firmware(dd, &fw_sbus);
15891574
if (ret)

drivers/staging/rdma/hfi1/pcie.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -947,15 +947,16 @@ int do_pcie_gen3_transition(struct hfi1_devdata *dd)
947947
}
948948

949949
retry:
950+
950951
if (therm) {
951-
/* toggle SPICO_ENABLE to get back to the state
952-
just after the firmware load */
952+
/*
953+
* toggle SPICO_ENABLE to get back to the state
954+
* just after the firmware load
955+
*/
953956
sbus_request(dd, SBUS_MASTER_BROADCAST, 0x01,
954957
WRITE_SBUS_RECEIVER, 0x00000040);
955958
sbus_request(dd, SBUS_MASTER_BROADCAST, 0x01,
956959
WRITE_SBUS_RECEIVER, 0x00000140);
957-
dd_dev_info(dd, "%s: toggle SPICO_ENABLE to reset the bus\n",
958-
__func__);
959960
}
960961

961962
/* step 3: download SBus Master firmware */
@@ -1198,6 +1199,7 @@ int do_pcie_gen3_transition(struct hfi1_devdata *dd)
11981199

11991200
/* clear the DC reset */
12001201
write_csr(dd, CCE_DC_CTRL, 0);
1202+
12011203
/* Set the LED off */
12021204
if (is_a0(dd))
12031205
setextled(dd, 0);

0 commit comments

Comments
 (0)