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

Commit e8401e85 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "mhi: cntrl: qcom: Add support for fatal error processing"

parents d172f2dc 343191b7
Loading
Loading
Loading
Loading
+26 −2
Original line number Diff line number Diff line
@@ -516,6 +516,22 @@ static int mhi_qcom_power_up(struct mhi_controller *mhi_cntrl)
	return ret;
}

static void mhi_qcom_fatal_worker(struct work_struct *work)
{
	struct mhi_dev *mhi_dev = container_of(work, struct mhi_dev,
					       fatal_worker);
	struct device *dev = &mhi_dev->pci_dev->dev;
	struct mhi_controller *mhi_cntrl = dev_get_drvdata(dev);
	int ret;

	mhi_power_down(mhi_cntrl, true);

	ret = mhi_qcom_power_up(mhi_cntrl);
	if (ret)
		MHI_ERR("Power up failure after SYS ERROR in PBL, ret:%d\n",
			ret);
}

static int mhi_runtime_get(struct mhi_controller *mhi_cntrl, void *priv)
{
	struct mhi_dev *mhi_dev = priv;
@@ -560,6 +576,10 @@ static void mhi_status_cb(struct mhi_controller *mhi_cntrl,
		pm_runtime_put(dev);
		mhi_arch_mission_mode_enter(mhi_cntrl);
		break;
	case MHI_CB_FATAL_ERROR:
		MHI_CNTRL_ERR("Perform power cycle due to SYS ERROR in PBL\n");
		schedule_work(&mhi_dev->fatal_worker);
		break;
	default:
		MHI_CNTRL_LOG("Unhandled cb:0x%x\n", reason);
	}
@@ -668,7 +688,7 @@ static struct mhi_controller *mhi_register_controller(struct pci_dev *pci_dev)
	struct mhi_controller *mhi_cntrl;
	struct mhi_dev *mhi_dev;
	struct device_node *of_node = pci_dev->dev.of_node;
	const struct firmware_info *firmware_info;
	const struct firmware_info *firmware_info, *debug_info;
	bool use_bb;
	u64 addr_win[2];
	int ret, i, len;
@@ -761,8 +781,11 @@ static struct mhi_controller *mhi_register_controller(struct pci_dev *pci_dev)
	}

	if (debug_mode) {
		debug_info = firmware_table + (len - 1);
		mhi_cntrl->fw_image_fallback = debug_info->fw_image;

		if (debug_mode <= MHI_DEBUG_D3)
			firmware_info = firmware_table + (len - 1);
			firmware_info = debug_info;
		MHI_CNTRL_LOG("fw info: debug_mode:%d dev_id:%d image:%s\n",
			      debug_mode, firmware_info->dev_id,
			      firmware_info->fw_image);
@@ -785,6 +808,7 @@ static struct mhi_controller *mhi_register_controller(struct pci_dev *pci_dev)
		goto error_register;

	INIT_WORK(&mhi_cntrl->reg_write_work, mhi_reg_write_work);
	INIT_WORK(&mhi_dev->fatal_worker, mhi_qcom_fatal_worker);

	mhi_cntrl->reg_write_q = kcalloc(REG_WRITE_QUEUE_LEN,
					sizeof(*mhi_cntrl->reg_write_q),
+1 −0
Original line number Diff line number Diff line
@@ -76,6 +76,7 @@ struct mhi_dev {
	dma_addr_t iova_start;
	dma_addr_t iova_stop;
	enum mhi_suspend_mode suspend_mode;
	struct work_struct fatal_worker;

	/* hardware info */
	u32 serial_num;
+15 −2
Original line number Diff line number Diff line
@@ -574,10 +574,23 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl)

	ret = request_firmware(&firmware, fw_name, mhi_cntrl->dev);
	if (ret) {
		MHI_CNTRL_ERR("Error loading firmware, ret:%d\n", ret);
		if (!mhi_cntrl->fw_image_fallback) {
			MHI_CNTRL_ERR("Error loading fw, ret:%d\n", ret);
			return;
		}

		/* re-try with fall back fw image */
		ret = request_firmware(&firmware, mhi_cntrl->fw_image_fallback,
				mhi_cntrl->dev);
		if (ret) {
			MHI_CNTRL_ERR("Error loading fw_fb, ret:%d\n", ret);
			return;
		}

		mhi_cntrl->status_cb(mhi_cntrl, mhi_cntrl->priv_data,
				     MHI_CB_FW_FALLBACK_IMG);
	}

	size = (mhi_cntrl->fbc_download) ? mhi_cntrl->sbl_size : firmware->size;

	/* the sbl size provided is maximum size, not necessarily image size */
+2 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ enum MHI_CB {
	MHI_CB_EE_MISSION_MODE,
	MHI_CB_SYS_ERROR,
	MHI_CB_FATAL_ERROR,
	MHI_CB_FW_FALLBACK_IMG,
};

/**
@@ -290,6 +291,7 @@ struct mhi_controller {

	/* fw images */
	const char *fw_image;
	const char *fw_image_fallback;
	const char *edl_image;

	/* mhi host manages downloading entire fbc images */