Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+8 −23
Original line number Diff line number Diff line
@@ -1236,35 +1236,20 @@ int load_firmware(struct hfi1_devdata *dd)
{
	int ret;

	if (fw_sbus_load || fw_fabric_serdes_load) {
	if (fw_fabric_serdes_load) {
		ret = acquire_hw_mutex(dd);
		if (ret)
			return ret;

		set_sbus_fast_mode(dd);

		/*
		 * The SBus contains part of the fabric firmware and so must
		 * also be downloaded.
		 */
		if (fw_sbus_load) {
			turn_off_spicos(dd, SPICO_SBUS);
			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);
		release_hw_mutex(dd);
		if (ret)
@@ -1583,7 +1568,7 @@ int load_pcie_firmware(struct hfi1_devdata *dd)
	/* both firmware loads below use the SBus */
	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);
		ret = load_sbus_firmware(dd, &fw_sbus);
		if (ret)
+6 −4
Original line number Diff line number Diff line
@@ -947,15 +947,16 @@ int do_pcie_gen3_transition(struct hfi1_devdata *dd)
	}

retry:

	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,
			WRITE_SBUS_RECEIVER, 0x00000040);
		sbus_request(dd, SBUS_MASTER_BROADCAST, 0x01,
			WRITE_SBUS_RECEIVER, 0x00000140);
		dd_dev_info(dd, "%s: toggle SPICO_ENABLE to reset the bus\n",
			    __func__);
	}

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

	/* clear the DC reset */
	write_csr(dd, CCE_DC_CTRL, 0);

	/* Set the LED off */
	if (is_a0(dd))
		setextled(dd, 0);