Skip to contentSkip to conversation

ufs: host: mediatek: Provide fixes in MediaTek platforms

PATCH Applied [email protected] 3 participants 9 messages Dec 21, 2023 – Jan 30, 2024

Subsystems (3)
lore
Share & tools
lore

[email protected]

author maintainer
#0 lore raw

cover ufs: host: mediatek: Provide fixes in MediaTek platforms

From: Peter Wang <[email protected]>

This patch fix MediaTek platform exit hibern8 and mcq related error.

Peter Wang (3):
ufs: host: mediatek: check link status after exit hibern8
ufs: host: mediatek: fix mcq mode tm cmd timeout
ufs: host: mediatek: disable mcq irq when clock off

 drivers/ufs/host/ufs-mediatek.c | 65 ++++++++++++++++++++++++++++-----
 drivers/ufs/host/ufs-mediatek.h |  1 +
 2 files changed, 57 insertions(+), 9 deletions(-)
Signature · 1 line
2.18.0
author maintainer
#1 lore raw

PATCH 1/3 ufs: host: mediatek: check link status after exit hibern8

From: Peter Wang <[email protected]>

To prevent SSU(Active) error, check link status after exit hibern8. If link is not VS_LINK_UP, return error and do ufshcd_link_recovery.

---
 drivers/ufs/host/ufs-mediatek.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)
drivers/ufs/host/ufs-mediatek.c +10 -3
index fc61790d289b..104354a4d899 100644
@@ -1208,11 +1208,18 @@ static int ufs_mtk_link_set_hpm(struct ufs_hba *hba)
 		return err;
 
 	err = ufshcd_uic_hibern8_exit(hba);
-	if (!err)
-		ufshcd_set_link_active(hba);
-	else
+	if (err)
 		return err;
 
+	/* Check link state to make sure exit h8 success */
+	ufs_mtk_wait_idle_state(hba, 5);
+	err = ufs_mtk_wait_link_state(hba, VS_LINK_UP, 100);
+	if (err) {
+		dev_warn(hba->dev, "exit h8 state fail, err=%d\n", err);
+		return err;
+	}
+	ufshcd_set_link_active(hba);
+
 	if (!hba->mcq_enabled) {
 		err = ufshcd_make_hba_operational(hba);
 	} else {
Signature · 1 line
2.18.0
Reviewed-by on v1 1/3
#2 lore raw

Re: [PATCH v1 1/3] ufs: host: mediatek: check link status after exit hibern8

Quoted 37 lines · On Thu, 2023-12-21 at 19:04 +0800, [email protected] wrote:

From: Peter Wang <[email protected]>

To prevent SSU(Active) error, check link status after exit hibern8. If link is not VS_LINK_UP, return error and do ufshcd_link_recovery.

---
 drivers/ufs/host/ufs-mediatek.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)
drivers/ufs/host/ufs- renamed from drivers/ufs/host/ufs-mediatek.c +0 -0

mediatek.c
index fc61790d289b..104354a4d899 100644

drivers/ufs/host/ufs-mediatek.c +10 -3
@@ -1208,11 +1208,18 @@ static int ufs_mtk_link_set_hpm(struct
 ufs_hba *hba)
 		return err;
 
 	err = ufshcd_uic_hibern8_exit(hba);
-	if (!err)
-		ufshcd_set_link_active(hba);
-	else
+	if (err)
 		return err;
 
+	/* Check link state to make sure exit h8 success */
+	ufs_mtk_wait_idle_state(hba, 5);
+	err = ufs_mtk_wait_link_state(hba, VS_LINK_UP, 100);
+	if (err) {
+		dev_warn(hba->dev, "exit h8 state fail, err=%d\n",
 err);
+		return err;
+	}
+	ufshcd_set_link_active(hba);
+
 	if (!hba->mcq_enabled) {

drivers/ufs/host/ufs-mediatek.c static int ufs_mtk_link_set_hpm(struct ufs_hba *hba) · line 1225

Quoted 2 lines
drivers/ufs/host/ufs-mediatek.c +0 -0
 		err = ufshcd_make_hba_operational(hba);
 	} else {

Chun-Hung

author maintainer
#3 lore raw

PATCH 2/3 ufs: host: mediatek: fix mcq mode tm cmd timeout

In reply to [email protected]

From: Peter Wang <[email protected]>

Fix tm cmd timeout issue in mcq mode by default resume call ufshcd_make_hba_operational to set tm cmd dma address. This flow same as ufs init make operational after link startup then set mcq related register if use mcq mode.

---
 drivers/ufs/host/ufs-mediatek.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/ufs/host/ufs-mediatek.c +5 -6
index 104354a4d899..eb1934126c87 100644
@@ -1220,9 +1220,11 @@ static int ufs_mtk_link_set_hpm(struct ufs_hba *hba)
 	}
 	ufshcd_set_link_active(hba);
 
-	if (!hba->mcq_enabled) {
-		err = ufshcd_make_hba_operational(hba);
-	} else {
+	err = ufshcd_make_hba_operational(hba);
+	if (err)
+		return err;
+
+	if (is_mcq_enabled(hba)) {
 		ufs_mtk_config_mcq(hba, false);
 		ufshcd_mcq_make_queues_operational(hba);
 		ufshcd_mcq_config_mac(hba, hba->nutrs);
@@ -1231,9 +1233,6 @@ static int ufs_mtk_link_set_hpm(struct ufs_hba *hba)
 			      REG_UFS_MEM_CFG);
 	}
 
-	if (err)
-		return err;
-
 	return 0;
 }
 
Signature · 1 line
2.18.0
Reviewed-by on v1 2/3
#4 lore raw

Re: [PATCH v1 2/3] ufs: host: mediatek: fix mcq mode tm cmd timeout

Quoted 35 lines · On Thu, 2023-12-21 at 19:04 +0800, [email protected] wrote:

From: Peter Wang <[email protected]>

Fix tm cmd timeout issue in mcq mode by default resume call ufshcd_make_hba_operational to set tm cmd dma address. This flow same as ufs init make operational after link startup then set mcq related register if use mcq mode.

---
 drivers/ufs/host/ufs-mediatek.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/ufs/host/ufs- renamed from drivers/ufs/host/ufs-mediatek.c +0 -0

mediatek.c
index 104354a4d899..eb1934126c87 100644

drivers/ufs/host/ufs-mediatek.c +5 -3
@@ -1220,9 +1220,11 @@ static int ufs_mtk_link_set_hpm(struct ufs_hba
 *hba)
 	}
 	ufshcd_set_link_active(hba);
 
-	if (!hba->mcq_enabled) {
-		err = ufshcd_make_hba_operational(hba);
-	} else {
+	err = ufshcd_make_hba_operational(hba);
+	if (err)
+		return err;
+
+	if (is_mcq_enabled(hba)) {
 		ufs_mtk_config_mcq(hba, false);
 		ufshcd_mcq_make_queues_operational(hba);
drivers/ufs/host/ufs-mediatek.c +0 -0
 		ufshcd_mcq_config_mac(hba, hba->nutrs);

drivers/ufs/host/ufs-mediatek.c static int ufs_mtk_link_set_hpm(struct ufs_hba · line 1238

Quoted 9 lines
drivers/ufs/host/ufs-mediatek.c +0 -3
@@ -1231,9 +1233,6 @@ static int ufs_mtk_link_set_hpm(struct ufs_hba
 *hba)
 			      REG_UFS_MEM_CFG);
 	}
 
-	if (err)
-		return err;
-
 	return 0;
 }

Chun-Hung

author maintainer
#5 lore raw

PATCH 3/3 ufs: host: mediatek: disable mcq irq when clock off

In reply to [email protected]

From: Peter Wang <[email protected]>

Disable mcq irq when clock off, this is same as legacy mode.

---
 drivers/ufs/host/ufs-mediatek.c | 41 +++++++++++++++++++++++++++++++++
 drivers/ufs/host/ufs-mediatek.h |  1 +
 2 files changed, 42 insertions(+)
drivers/ufs/host/ufs-mediatek.c +41 -0
index eb1934126c87..51f05038408a 100644
@@ -660,6 +660,45 @@ static void ufs_mtk_pwr_ctrl(struct ufs_hba *hba, bool on)
 	}
 }
 
+static void ufs_mtk_mcq_disable_irq(struct ufs_hba *hba)
+{
+	struct ufs_mtk_host *host = ufshcd_get_variant(hba);
+	u32 irq, i;
+
+	if (!is_mcq_enabled(hba))
+		return;
+
+	if (host->mcq_nr_intr == 0)
+		return;
+
+	for (i = 0; i < host->mcq_nr_intr; i++) {
+		irq = host->mcq_intr_info[i].irq;
+		disable_irq(irq);
+	}
+	host->is_mcq_intr_enabled = false;
+}
+
+static void ufs_mtk_mcq_enable_irq(struct ufs_hba *hba)
+{
+	struct ufs_mtk_host *host = ufshcd_get_variant(hba);
+	u32 irq, i;
+
+	if (!is_mcq_enabled(hba))
+		return;
+
+	if (host->mcq_nr_intr == 0)
+		return;
+
+	if (host->is_mcq_intr_enabled == true)
+		return;
+
+	for (i = 0; i < host->mcq_nr_intr; i++) {
+		irq = host->mcq_intr_info[i].irq;
+		enable_irq(irq);
+	}
+	host->is_mcq_intr_enabled = true;
+}
+
 /**
  * ufs_mtk_setup_clocks - enables/disable clocks
  * @hba: host controller instance
@@ -703,8 +742,10 @@ static int ufs_mtk_setup_clocks(struct ufs_hba *hba, bool on,
 
 		if (clk_pwr_off)
 			ufs_mtk_pwr_ctrl(hba, false);
+		ufs_mtk_mcq_disable_irq(hba);
 	} else if (on && status == POST_CHANGE) {
 		ufs_mtk_pwr_ctrl(hba, true);
+		ufs_mtk_mcq_enable_irq(hba);
 	}
 
 	return ret;
drivers/ufs/host/ufs-mediatek.h +1 -0
index f76e80d91729..922f1e51a60c 100644
@@ -186,6 +186,7 @@ struct ufs_mtk_host {
 	u32 ip_ver;
 
 	bool mcq_set_intr;
+	bool is_mcq_intr_enabled;
 	int mcq_nr_intr;
 	struct ufs_mtk_mcq_intr_info mcq_intr_info[UFSHCD_MAX_Q_NR];
 };
Signature · 1 line
2.18.0
Reviewed-by on v1 3/3
#6 lore raw

Re: [PATCH v1 3/3] ufs: host: mediatek: disable mcq irq when clock off

Quoted 81 lines · On Thu, 2023-12-21 at 19:04 +0800, [email protected] wrote:

From: Peter Wang <[email protected]>

Disable mcq irq when clock off, this is same as legacy mode.

---
 drivers/ufs/host/ufs-mediatek.c | 41
+++++++++++++++++++++++++++++++++
 drivers/ufs/host/ufs-mediatek.h |  1 +
 2 files changed, 42 insertions(+)
drivers/ufs/host/ufs- renamed from drivers/ufs/host/ufs-mediatek.c +0 -0

mediatek.c
index eb1934126c87..51f05038408a 100644

drivers/ufs/host/ufs-mediatek.c +39 -0
@@ -660,6 +660,45 @@ static void ufs_mtk_pwr_ctrl(struct ufs_hba
 *hba, bool on)
 	}
 }
 
+static void ufs_mtk_mcq_disable_irq(struct ufs_hba *hba)
+{
+	struct ufs_mtk_host *host = ufshcd_get_variant(hba);
+	u32 irq, i;
+
+	if (!is_mcq_enabled(hba))
+		return;
+
+	if (host->mcq_nr_intr == 0)
+		return;
+
+	for (i = 0; i < host->mcq_nr_intr; i++) {
+		irq = host->mcq_intr_info[i].irq;
+		disable_irq(irq);
+	}
+	host->is_mcq_intr_enabled = false;
+}
+
+static void ufs_mtk_mcq_enable_irq(struct ufs_hba *hba)
+{
+	struct ufs_mtk_host *host = ufshcd_get_variant(hba);
+	u32 irq, i;
+
+	if (!is_mcq_enabled(hba))
+		return;
+
+	if (host->mcq_nr_intr == 0)
+		return;
+
+	if (host->is_mcq_intr_enabled == true)
+		return;
+
+	for (i = 0; i < host->mcq_nr_intr; i++) {
+		irq = host->mcq_intr_info[i].irq;
+		enable_irq(irq);
+	}
+	host->is_mcq_intr_enabled = true;
+}
+
 /**
  * ufs_mtk_setup_clocks - enables/disable clocks

* @hba: host controller instance

drivers/ufs/host/ufs-mediatek.c +2 -0
@@ -703,8 +742,10 @@ static int ufs_mtk_setup_clocks(struct ufs_hba
 *hba, bool on,
 
 		if (clk_pwr_off)
 			ufs_mtk_pwr_ctrl(hba, false);
+		ufs_mtk_mcq_disable_irq(hba);
 	} else if (on && status == POST_CHANGE) {
 		ufs_mtk_pwr_ctrl(hba, true);
+		ufs_mtk_mcq_enable_irq(hba);
 	}
 
drivers/ufs/host/ufs-mediatek.c +0 -0
 	return ret;
drivers/ufs/host/ufs- renamed from drivers/ufs/host/ufs-mediatek.h +0 -0

mediatek.h
index f76e80d91729..922f1e51a60c 100644

drivers/ufs/host/ufs-mediatek.h struct ufs_mtk_host { · line 192

Quoted 7 lines
drivers/ufs/host/ufs-mediatek.h +1 -0
@@ -186,6 +186,7 @@ struct ufs_mtk_host {
 	u32 ip_ver;
 
 	bool mcq_set_intr;
+	bool is_mcq_intr_enabled;
 	int mcq_nr_intr;
 	struct ufs_mtk_mcq_intr_info mcq_intr_info[UFSHCD_MAX_Q_NR];
 };

Chun-Hung

#8 lore raw
In reply to [email protected]
Quoted 8 lines · On Thu, 21 Dec 2023 19:04:13 +0800, [email protected] wrote:

This patch fix MediaTek platform exit hibern8 and mcq related error.

Peter Wang (3):
ufs: host: mediatek: check link status after exit hibern8
ufs: host: mediatek: fix mcq mode tm cmd timeout
ufs: host: mediatek: disable mcq irq when clock off

[...]

Applied to 6.9/scsi-queue, thanks!

[1/3] ufs: host: mediatek: check link status after exit hibern8

      https://git.kernel.org/mkp/scsi/c/29b3a373e2df
[2/3] ufs: host: mediatek: fix mcq mode tm cmd timeout
      https://git.kernel.org/mkp/scsi/c/468b3e0a3bca
[3/3] ufs: host: mediatek: disable mcq irq when clock off
      https://git.kernel.org/mkp/scsi/c/e0dc13e5a3cb
Signature · 1 line
Martin K. Petersen	Oracle Linux Engineering