From 959779c008a28703f447a32edbee8597e2e4e651 Mon Sep 17 00:00:00 2001 From: Ed Tsai Date: Wed, 14 Jun 2023 08:25:29 +0800 Subject: [PATCH 1/7] UPSTREAM: blk-mq: check on cpu id when there is only one ctx mapping commit f168420c62e7 ("blk-mq: don't redirect completion for hctx withs only one ctx mapping") When nvme applies a 1:1 mapping of hctx and ctx, there will be no remote request. But for ufs, the submission and completion queues could be asymmetric. (e.g. Multiple SQs share one CQ) Therefore, 1:1 mapping of hctx and ctx won't complete request on the submission cpu. In this situation, this nr_ctx check could violate the QUEUE_FLAG_SAME_FORCE, as a result, check on cpu id when there is only one ctx mapping. Bug: 267974767 Bug: 291683964 Signed-off-by: Ed Tsai Signed-off-by: Po-Wen Kao Suggested-by: Keith Busch Reviewed-by: Christoph Hellwig Link: https://lore.kernel.org/r/20230614002529.6636-1-ed.tsai@mediatek.com [axboe: fixed up indentation] Signed-off-by: Jens Axboe (cherry picked from commit 30654614f3d27230200b1650f6025a2ce67900b4) Change-Id: If2b681b1c5163677b40c06735061406da88adc37 --- block/blk-mq.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/block/blk-mq.c b/block/blk-mq.c index 1ad3e4f494df..3a6abebda851 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -1188,8 +1188,9 @@ bool blk_mq_complete_request_remote(struct request *rq) * or a polled request, always complete locally, * it's pointless to redirect the completion. */ - if (rq->mq_hctx->nr_ctx == 1 || - rq->cmd_flags & REQ_POLLED) + if ((rq->mq_hctx->nr_ctx == 1 && + rq->mq_ctx->cpu == raw_smp_processor_id()) || + rq->cmd_flags & REQ_POLLED) return false; if (blk_mq_complete_need_ipi(rq)) { From 5b5514aa3f5242178faed59376f197b3dfdfe234 Mon Sep 17 00:00:00 2001 From: Po-Wen Kao Date: Tue, 14 Feb 2023 10:53:40 +0800 Subject: [PATCH 2/7] FROMLIST: scsi: ufs: core: Export symbols for MTK driver module Export symbols for MediaTek UFS driver's PM flow and irq handler. Bug: 267974767 Bug: 291683964 Link: https://lore.kernel.org/all/20230701124442.10489-2-powen.kao@mediatek.com/ Signed-off-by: Po-Wen Kao Reviewed-by: Bart Van Assche Reviewed-by: Stanley Chu Change-Id: I2349545582f1da04c8cc66874e014afc02f095f8 --- drivers/ufs/core/ufs-mcq.c | 3 +++ include/ufs/ufshcd.h | 3 +++ 2 files changed, 6 insertions(+) diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c index d5445084dfa7..9258bb085830 100644 --- a/drivers/ufs/core/ufs-mcq.c +++ b/drivers/ufs/core/ufs-mcq.c @@ -99,6 +99,7 @@ void ufshcd_mcq_config_mac(struct ufs_hba *hba, u32 max_active_cmds) val |= FIELD_PREP(MCQ_CFG_MAC_MASK, max_active_cmds); ufshcd_writel(hba, val, REG_UFS_MCQ_CFG); } +EXPORT_SYMBOL_GPL(ufshcd_mcq_config_mac); /** * ufshcd_mcq_req_to_hwq - find the hardware queue on which the @@ -249,6 +250,7 @@ u32 ufshcd_mcq_read_cqis(struct ufs_hba *hba, int i) { return readl(mcq_opr_base(hba, OPR_CQIS, i) + REG_CQIS); } +EXPORT_SYMBOL_GPL(ufshcd_mcq_read_cqis); void ufshcd_mcq_write_cqis(struct ufs_hba *hba, u32 val, int i) { @@ -402,6 +404,7 @@ void ufshcd_mcq_make_queues_operational(struct ufs_hba *hba) MCQ_CFG_n(REG_SQATTR, i)); } } +EXPORT_SYMBOL_GPL(ufshcd_mcq_make_queues_operational); void ufshcd_mcq_enable_esi(struct ufs_hba *hba) { diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h index c6962ac122ba..12965946d194 100644 --- a/include/ufs/ufshcd.h +++ b/include/ufs/ufshcd.h @@ -1297,11 +1297,14 @@ void ufshcd_parse_dev_ref_clk_freq(struct ufs_hba *hba, struct clk *refclk); void ufshcd_update_evt_hist(struct ufs_hba *hba, u32 id, u32 val); void ufshcd_hba_stop(struct ufs_hba *hba); void ufshcd_schedule_eh_work(struct ufs_hba *hba); +void ufshcd_mcq_config_mac(struct ufs_hba *hba, u32 max_active_cmds); +u32 ufshcd_mcq_read_cqis(struct ufs_hba *hba, int i); void ufshcd_mcq_write_cqis(struct ufs_hba *hba, u32 val, int i); unsigned long ufshcd_mcq_poll_cqe_nolock(struct ufs_hba *hba, struct ufs_hw_queue *hwq); unsigned long ufshcd_mcq_poll_cqe_lock(struct ufs_hba *hba, struct ufs_hw_queue *hwq); +void ufshcd_mcq_make_queues_operational(struct ufs_hba *hba); void ufshcd_mcq_enable_esi(struct ufs_hba *hba); void ufshcd_mcq_config_esi(struct ufs_hba *hba, struct msi_msg *msg); From 9042fa92856e58ef1bd2b3b1cbc7feeb564ffc6b Mon Sep 17 00:00:00 2001 From: Po-Wen Kao Date: Tue, 14 Feb 2023 16:59:22 +0800 Subject: [PATCH 3/7] FROMLIST: scsi: ufs: ufs-mediatek: Add MCQ support for MTK platform Add UFS MCQ vops and irq handler for MediaTek platform. PM flow is fixed accordingly. Bug: 267974767 Bug: 291683964 Link: https://lore.kernel.org/all/20230701124442.10489-3-powen.kao@mediatek.com/ Signed-off-by: Po-Wen Kao Reviewed-by: Stanley Chu Suggested-by: AngeloGioacchino Del Regno Change-Id: Icc25a11db0dab95e45ed7bbce985bbd77e8fe79c --- drivers/ufs/host/ufs-mediatek.c | 174 +++++++++++++++++++++++++++++++- drivers/ufs/host/ufs-mediatek.h | 33 ++++++ 2 files changed, 205 insertions(+), 2 deletions(-) diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c index 1541917939ff..603183082a56 100644 --- a/drivers/ufs/host/ufs-mediatek.c +++ b/drivers/ufs/host/ufs-mediatek.c @@ -27,8 +27,14 @@ #include #include "ufs-mediatek.h" +static int ufs_mtk_config_mcq(struct ufs_hba *hba, bool irq); + #define CREATE_TRACE_POINTS #include "ufs-mediatek-trace.h" +#undef CREATE_TRACE_POINTS + +#define MAX_SUPP_MAC 64 +#define MCQ_QUEUE_OFFSET(c) ((((c) >> 16) & 0xFF) * 0x200) static const struct ufs_dev_quirk ufs_mtk_dev_fixups[] = { { .wmanufacturerid = UFS_ANY_VENDOR, @@ -843,6 +849,38 @@ static void ufs_mtk_vreg_fix_vccqx(struct ufs_hba *hba) } } +static void ufs_mtk_init_mcq_irq(struct ufs_hba *hba) +{ + struct ufs_mtk_host *host = ufshcd_get_variant(hba); + struct platform_device *pdev; + int i; + int irq; + + host->mcq_nr_intr = UFSHCD_MAX_Q_NR; + pdev = container_of(hba->dev, struct platform_device, dev); + + for (i = 0; i < host->mcq_nr_intr; i++) { + /* irq index 0 is legacy irq, sq/cq irq start from index 1 */ + irq = platform_get_irq(pdev, i + 1); + if (irq < 0) { + host->mcq_intr_info[i].irq = MTK_MCQ_INVALID_IRQ; + dev_err(hba->dev, "get platform mcq irq fail: %d\n", i); + goto failed; + } + host->mcq_intr_info[i].hba = hba; + host->mcq_intr_info[i].irq = irq; + dev_info(hba->dev, "get platform mcq irq: %d, %d\n", i, irq); + } + + return; +failed: + /* invalidate irq info */ + for (i = 0; i < host->mcq_nr_intr; i++) + host->mcq_intr_info[i].irq = MTK_MCQ_INVALID_IRQ; + + host->mcq_nr_intr = 0; +} + /** * ufs_mtk_init - find other essential mmio bases * @hba: host controller instance @@ -879,6 +917,8 @@ static int ufs_mtk_init(struct ufs_hba *hba) /* Initialize host capability */ ufs_mtk_init_host_caps(hba); + ufs_mtk_init_mcq_irq(hba); + err = ufs_mtk_bind_mphy(hba); if (err) goto out_variant_clear; @@ -1176,7 +1216,17 @@ static int ufs_mtk_link_set_hpm(struct ufs_hba *hba) else return err; - err = ufshcd_make_hba_operational(hba); + if (!hba->mcq_enabled) { + err = ufshcd_make_hba_operational(hba); + } else { + ufs_mtk_config_mcq(hba, false); + ufshcd_mcq_make_queues_operational(hba); + ufshcd_mcq_config_mac(hba, hba->nutrs); + /* Enable MCQ mode */ + ufshcd_writel(hba, ufshcd_readl(hba, REG_UFS_MEM_CFG) | 0x1, + REG_UFS_MEM_CFG); + } + if (err) return err; @@ -1500,6 +1550,121 @@ static int ufs_mtk_clk_scale_notify(struct ufs_hba *hba, bool scale_up, return 0; } +static int ufs_mtk_get_hba_mac(struct ufs_hba *hba) +{ + return MAX_SUPP_MAC; +} + +static int ufs_mtk_op_runtime_config(struct ufs_hba *hba) +{ + struct ufshcd_mcq_opr_info_t *opr; + int i; + + hba->mcq_opr[OPR_SQD].offset = REG_UFS_MTK_SQD; + hba->mcq_opr[OPR_SQIS].offset = REG_UFS_MTK_SQIS; + hba->mcq_opr[OPR_CQD].offset = REG_UFS_MTK_CQD; + hba->mcq_opr[OPR_CQIS].offset = REG_UFS_MTK_CQIS; + + for (i = 0; i < OPR_MAX; i++) { + opr = &hba->mcq_opr[i]; + opr->stride = REG_UFS_MCQ_STRIDE; + opr->base = hba->mmio_base + opr->offset; + } + + return 0; +} + +static int ufs_mtk_mcq_config_resource(struct ufs_hba *hba) +{ + struct ufs_mtk_host *host = ufshcd_get_variant(hba); + + /* fail mcq initialization if interrupt is not filled properly */ + if (!host->mcq_nr_intr) { + dev_info(hba->dev, "IRQs not ready. MCQ disabled."); + return -EINVAL; + } + + hba->mcq_base = hba->mmio_base + MCQ_QUEUE_OFFSET(hba->mcq_capabilities); + return 0; +} + +static irqreturn_t ufs_mtk_mcq_intr(int irq, void *__intr_info) +{ + struct ufs_mtk_mcq_intr_info *mcq_intr_info = __intr_info; + struct ufs_hba *hba = mcq_intr_info->hba; + struct ufs_hw_queue *hwq; + u32 events; + int qid = mcq_intr_info->qid; + + hwq = &hba->uhq[qid]; + + events = ufshcd_mcq_read_cqis(hba, qid); + if (events) + ufshcd_mcq_write_cqis(hba, events, qid); + + if (events & UFSHCD_MCQ_CQIS_TAIL_ENT_PUSH_STS) + ufshcd_mcq_poll_cqe_lock(hba, hwq); + + return IRQ_HANDLED; +} + +static int ufs_mtk_config_mcq_irq(struct ufs_hba *hba) +{ + struct ufs_mtk_host *host = ufshcd_get_variant(hba); + u32 irq, i; + int ret; + + for (i = 0; i < host->mcq_nr_intr; i++) { + irq = host->mcq_intr_info[i].irq; + if (irq == MTK_MCQ_INVALID_IRQ) { + dev_err(hba->dev, "invalid irq. %d\n", i); + return -ENOPARAM; + } + + host->mcq_intr_info[i].qid = i; + ret = devm_request_irq(hba->dev, irq, ufs_mtk_mcq_intr, 0, UFSHCD, + &host->mcq_intr_info[i]); + + dev_dbg(hba->dev, "request irq %d intr %s\n", irq, ret ? "failed" : ""); + + if (ret) { + dev_err(hba->dev, "Cannot request irq %d\n", ret); + return ret; + } + } + + return 0; +} + +static int ufs_mtk_config_mcq(struct ufs_hba *hba, bool irq) +{ + struct ufs_mtk_host *host = ufshcd_get_variant(hba); + int ret = 0; + + if (!host->mcq_set_intr) { + /* Disable irq option register */ + ufshcd_rmwl(hba, MCQ_INTR_EN_MSK, 0, REG_UFS_MMIO_OPT_CTRL_0); + + if (irq) { + ret = ufs_mtk_config_mcq_irq(hba); + if (ret) + return ret; + } + + host->mcq_set_intr = true; + } + + ufshcd_rmwl(hba, MCQ_AH8, MCQ_AH8, REG_UFS_MMIO_OPT_CTRL_0); + ufshcd_rmwl(hba, MCQ_INTR_EN_MSK, MCQ_MULTI_INTR_EN, REG_UFS_MMIO_OPT_CTRL_0); + + return 0; +} + +static int ufs_mtk_config_esi(struct ufs_hba *hba) +{ + return ufs_mtk_config_mcq(hba, true); +} + /* * struct ufs_hba_mtk_vops - UFS MTK specific variant operations * @@ -1523,6 +1688,11 @@ static const struct ufs_hba_variant_ops ufs_hba_mtk_vops = { .event_notify = ufs_mtk_event_notify, .config_scaling_param = ufs_mtk_config_scaling_param, .clk_scale_notify = ufs_mtk_clk_scale_notify, + /* mcq vops */ + .get_hba_mac = ufs_mtk_get_hba_mac, + .op_runtime_config = ufs_mtk_op_runtime_config, + .mcq_config_resource = ufs_mtk_mcq_config_resource, + .config_esi = ufs_mtk_config_esi, }; /** @@ -1569,7 +1739,7 @@ skip_reset: out: if (err) - dev_info(dev, "probe failed %d\n", err); + dev_err(dev, "probe failed %d\n", err); of_node_put(reset_node); return err; diff --git a/drivers/ufs/host/ufs-mediatek.h b/drivers/ufs/host/ufs-mediatek.h index 2fc6d7b87694..f76e80d91729 100644 --- a/drivers/ufs/host/ufs-mediatek.h +++ b/drivers/ufs/host/ufs-mediatek.h @@ -10,11 +10,27 @@ #include #include +/* + * MCQ define and struct + */ +#define UFSHCD_MAX_Q_NR 8 +#define MTK_MCQ_INVALID_IRQ 0xFFFF + +/* REG_UFS_MMIO_OPT_CTRL_0 160h */ +#define EHS_EN BIT(0) +#define PFM_IMPV BIT(1) +#define MCQ_MULTI_INTR_EN BIT(2) +#define MCQ_CMB_INTR_EN BIT(3) +#define MCQ_AH8 BIT(4) + +#define MCQ_INTR_EN_MSK (MCQ_MULTI_INTR_EN | MCQ_CMB_INTR_EN) + /* * Vendor specific UFSHCI Registers */ #define REG_UFS_XOUFS_CTRL 0x140 #define REG_UFS_REFCLK_CTRL 0x144 +#define REG_UFS_MMIO_OPT_CTRL_0 0x160 #define REG_UFS_EXTREG 0x2100 #define REG_UFS_MPHYCTRL 0x2200 #define REG_UFS_MTK_IP_VER 0x2240 @@ -26,6 +42,13 @@ #define REG_UFS_DEBUG_SEL_B2 0x22D8 #define REG_UFS_DEBUG_SEL_B3 0x22DC +#define REG_UFS_MTK_SQD 0x2800 +#define REG_UFS_MTK_SQIS 0x2814 +#define REG_UFS_MTK_CQD 0x281C +#define REG_UFS_MTK_CQIS 0x2824 + +#define REG_UFS_MCQ_STRIDE 0x30 + /* * Ref-clk control * @@ -136,6 +159,12 @@ struct ufs_mtk_hw_ver { u8 major; }; +struct ufs_mtk_mcq_intr_info { + struct ufs_hba *hba; + u32 irq; + u8 qid; +}; + struct ufs_mtk_host { struct phy *mphy; struct pm_qos_request pm_qos_req; @@ -155,6 +184,10 @@ struct ufs_mtk_host { u16 ref_clk_ungating_wait_us; u16 ref_clk_gating_wait_us; u32 ip_ver; + + bool mcq_set_intr; + int mcq_nr_intr; + struct ufs_mtk_mcq_intr_info mcq_intr_info[UFSHCD_MAX_Q_NR]; }; /* From 9bd1dc2d4f3e9642fb4a7e9ae302b7ce6ebd3c53 Mon Sep 17 00:00:00 2001 From: Stanley Chu Date: Tue, 6 Jun 2023 12:59:19 +0800 Subject: [PATCH 4/7] BACKPORT: scsi: ufs: mcq: Fix the incorrect OCS value for the device command In MCQ mode, when a device command uses a hardware queue shared with other commands, a race condition may occur in the following scenario: 1. A device command is completed in CQx with CQE entry "e". 2. The interrupt handler copies the "cqe" pointer to "hba->dev_cmd.cqe" and completes "hba->dev_cmd.complete". 3. The "ufshcd_wait_for_dev_cmd()" function is awakened and retrieves the OCS value from "hba->dev_cmd.cqe". However, there is a possibility that the CQE entry "e" will be overwritten by newly completed commands in CQx, resulting in an incorrect OCS value being received by "ufshcd_wait_for_dev_cmd()". To avoid this race condition, the OCS value should be immediately copied to the struct "lrb" of the device command. Then "ufshcd_wait_for_dev_cmd()" can retrieve the OCS value from the struct "lrb". Bug: 267974767 Bug: 291683964 Fixes: 57b1c0ef89ac ("scsi: ufs: core: mcq: Add support to allocate multiple queues") Suggested-by: Can Guo Signed-off-by: Stanley Chu Link: https://lore.kernel.org/r/20230610021553.1213-2-powen.kao@mediatek.com Tested-by: Po-Wen Kao Reviewed-by: Bart Van Assche Signed-off-by: Martin K. Petersen Change-Id: I835e435c8a5fffa63b02bd1481f7b41d2a16e706 (cherry picked from commit 0fef6bb730c490fcdc4347dbd21646d3ffe62cf5) [powen: Keep hba->dev_cmd.cqe for KMI freeze] --- drivers/ufs/core/ufshcd.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index 25e7f7c2d83b..88e636f850c8 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -3166,7 +3166,7 @@ retry: * not trigger any race conditions. */ hba->dev_cmd.complete = NULL; - err = ufshcd_get_tr_ocs(lrbp, hba->dev_cmd.cqe); + err = ufshcd_get_tr_ocs(lrbp, NULL); if (!err) err = ufshcd_dev_cmd_completion(hba, lrbp); } else { @@ -3262,7 +3262,6 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba, goto out; hba->dev_cmd.complete = &wait; - hba->dev_cmd.cqe = NULL; ufshcd_add_query_upiu_trace(hba, UFS_QUERY_SEND, lrbp->ucd_req_ptr); @@ -5520,6 +5519,7 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag, { struct ufshcd_lrb *lrbp; struct scsi_cmnd *cmd; + enum utp_ocs ocs; lrbp = &hba->lrb[task_tag]; lrbp->compl_time_stamp = ktime_get(); @@ -5538,7 +5538,11 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag, lrbp->command_type == UTP_CMD_TYPE_UFS_STORAGE) { if (hba->dev_cmd.complete) { trace_android_vh_ufs_compl_command(hba, lrbp); - hba->dev_cmd.cqe = cqe; + if (cqe) { + ocs = le32_to_cpu(cqe->status) & MASK_OCS; + lrbp->utr_descriptor_ptr->header.dword_2 = + cpu_to_le32(ocs); + } ufshcd_add_command_trace(hba, task_tag, UFS_DEV_COMP); complete(hba->dev_cmd.complete); ufshcd_clk_scaling_update_busy(hba); From 680cfe91d1bd22022b46eb729e976415c531390c Mon Sep 17 00:00:00 2001 From: Po-Wen Kao Date: Sat, 10 Jun 2023 10:15:52 +0800 Subject: [PATCH 5/7] UPSTREAM: scsi: ufs: core: Remove dedicated hwq for dev command This commit depends on "scsi: ufs: core: mcq: Fix the incorrect OCS value for the device command" which takes care of the OCS value of dev commands in MCQ mode. It is safe to share first hwq for dev command and I/O request here. Bug: 267974767 Bug: 291683964 Tested-by: Po-Wen Kao Signed-off-by: Po-Wen Kao Link: https://lore.kernel.org/r/20230610021553.1213-3-powen.kao@mediatek.com Reviewed-by: Stanley Chu Reviewed-by: Bart Van Assche Signed-off-by: Martin K. Petersen (cherry picked from commit ccb23dc3435a0d9dbc07c5156a530a4aae6c851a) Change-Id: I73f1ad5bec71ac6e9efec1fd5231754be92d1b7c --- drivers/ufs/core/ufs-mcq.c | 14 ++++---------- drivers/ufs/core/ufshcd-priv.h | 1 - drivers/ufs/core/ufshcd.c | 4 ++-- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c index 9258bb085830..64bad535f79f 100644 --- a/drivers/ufs/core/ufs-mcq.c +++ b/drivers/ufs/core/ufs-mcq.c @@ -20,12 +20,10 @@ #define MAX_QUEUE_SUP GENMASK(7, 0) #define UFS_MCQ_MIN_RW_QUEUES 2 #define UFS_MCQ_MIN_READ_QUEUES 0 -#define UFS_MCQ_NUM_DEV_CMD_QUEUES 1 #define UFS_MCQ_MIN_POLL_QUEUES 0 #define QUEUE_EN_OFFSET 31 #define QUEUE_ID_OFFSET 16 -#define MAX_DEV_CMD_ENTRIES 2 #define MCQ_CFG_MAC_MASK GENMASK(16, 8) #define MCQ_QCFG_SIZE 0x40 #define MCQ_ENTRY_SIZE_IN_DWORD 8 @@ -116,8 +114,7 @@ struct ufs_hw_queue *ufshcd_mcq_req_to_hwq(struct ufs_hba *hba, u32 utag = blk_mq_unique_tag(req); u32 hwq = blk_mq_unique_tag_to_hwq(utag); - /* uhq[0] is used to serve device commands */ - return &hba->uhq[hwq + UFSHCD_MCQ_IO_QUEUE_OFFSET]; + return &hba->uhq[hwq]; } /** @@ -161,8 +158,7 @@ static int ufshcd_mcq_config_nr_queues(struct ufs_hba *hba) /* maxq is 0 based value */ hba_maxq = FIELD_GET(MAX_QUEUE_SUP, hba->mcq_capabilities) + 1; - tot_queues = UFS_MCQ_NUM_DEV_CMD_QUEUES + read_queues + poll_queues + - rw_queues; + tot_queues = read_queues + poll_queues + rw_queues; if (hba_maxq < tot_queues) { dev_err(hba->dev, "Total queues (%d) exceeds HC capacity (%d)\n", @@ -170,7 +166,7 @@ static int ufshcd_mcq_config_nr_queues(struct ufs_hba *hba) return -EOPNOTSUPP; } - rem = hba_maxq - UFS_MCQ_NUM_DEV_CMD_QUEUES; + rem = hba_maxq; if (rw_queues) { hba->nr_queues[HCTX_TYPE_DEFAULT] = rw_queues; @@ -196,7 +192,7 @@ static int ufshcd_mcq_config_nr_queues(struct ufs_hba *hba) for (i = 0; i < HCTX_MAX_TYPES; i++) host->nr_hw_queues += hba->nr_queues[i]; - hba->nr_hw_queues = host->nr_hw_queues + UFS_MCQ_NUM_DEV_CMD_QUEUES; + hba->nr_hw_queues = host->nr_hw_queues; return 0; } @@ -458,8 +454,6 @@ int ufshcd_mcq_init(struct ufs_hba *hba) /* The very first HW queue serves device commands */ hba->dev_cmd_queue = &hba->uhq[0]; - /* Give dev_cmd_queue the minimal number of entries */ - hba->dev_cmd_queue->max_entries = MAX_DEV_CMD_ENTRIES; host->host_tagset = 1; return 0; diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd-priv.h index 2541a52ecb8b..83cf0a47ec14 100644 --- a/drivers/ufs/core/ufshcd-priv.h +++ b/drivers/ufs/core/ufshcd-priv.h @@ -84,7 +84,6 @@ int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag); void ufshcd_release_scsi_cmd(struct ufs_hba *hba, struct ufshcd_lrb *lrbp); -#define UFSHCD_MCQ_IO_QUEUE_OFFSET 1 #define SD_ASCII_STD true #define SD_RAW false int ufshcd_read_string_desc(struct ufs_hba *hba, u8 desc_index, diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index 88e636f850c8..1df28ecf6226 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -5596,7 +5596,7 @@ static int ufshcd_poll(struct Scsi_Host *shost, unsigned int queue_num) struct ufs_hw_queue *hwq; if (is_mcq_enabled(hba)) { - hwq = &hba->uhq[queue_num + UFSHCD_MCQ_IO_QUEUE_OFFSET]; + hwq = &hba->uhq[queue_num]; return ufshcd_mcq_poll_cqe_lock(hba, hwq); } @@ -5650,7 +5650,7 @@ static void ufshcd_mcq_compl_pending_transfer(struct ufs_hba *hba, utag = blk_mq_unique_tag(scsi_cmd_to_rq(cmd)); hwq_num = blk_mq_unique_tag_to_hwq(utag); - hwq = &hba->uhq[hwq_num + UFSHCD_MCQ_IO_QUEUE_OFFSET]; + hwq = &hba->uhq[hwq_num]; if (force_compl) { ufshcd_mcq_compl_all_cqes_lock(hba, hwq); From c5a5b121a64931a30411c90a3926f845b17f6bb2 Mon Sep 17 00:00:00 2001 From: Po-Wen Kao Date: Wed, 14 Jun 2023 17:40:48 +0800 Subject: [PATCH 6/7] ANDROID: GKI: Update symbol list for MediatTek INFO: ABI DIFFERENCES HAVE BEEN DETECTED! INFO: 3 function symbol(s) added 'void ufshcd_mcq_config_mac(struct ufs_hba*, u32)' 'void ufshcd_mcq_make_queues_operational(struct ufs_hba*)' 'u32 ufshcd_mcq_read_cqis(struct ufs_hba*, int) Bug: 267974767 Bug: 291683964 Change-Id: I9fc895406023a9456d13e502b8b7f3b09f352cfd Signed-off-by: Po-Wen Kao --- android/abi_gki_aarch64_mtk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/android/abi_gki_aarch64_mtk b/android/abi_gki_aarch64_mtk index f3af0c1114ba..3ffc07d77c5e 100644 --- a/android/abi_gki_aarch64_mtk +++ b/android/abi_gki_aarch64_mtk @@ -2813,6 +2813,9 @@ ufshcd_init_pwr_dev_param ufshcd_link_recovery ufshcd_make_hba_operational + ufshcd_mcq_config_mac + ufshcd_mcq_make_queues_operational + ufshcd_mcq_read_cqis ufshcd_pltfrm_init ufshcd_query_attr ufshcd_query_descriptor_retry From 14c33e01ba60dc9cd9665f4f445f6c04d6030ecc Mon Sep 17 00:00:00 2001 From: Chun-Hung Wu Date: Mon, 10 Jul 2023 19:35:43 +0800 Subject: [PATCH 7/7] ANDROID: Update symbol list for mtk INFO: 4 function symbol(s) added 'bool sk_capable(const struct sock*, int)' 'void ufshcd_mcq_config_mac(struct ufs_hba*, u32)' 'void ufshcd_mcq_make_queues_operational(struct ufs_hba*)' 'u32 ufshcd_mcq_read_cqis(struct ufs_hba*, int)' Needed by bluetooth.ko. Bug: 290584277 Bug: 291683964 Change-Id: I9d8b42057d263f451caa36b7d176bdf2560cce38 Signed-off-by: Chun-Hung Wu --- android/abi_gki_aarch64.stg | 46 +++++++++++++++++++++++++++++++++++++ android/abi_gki_aarch64_mtk | 27 ++++++++++++++++++---- 2 files changed, 69 insertions(+), 4 deletions(-) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 2476e2318697..9c4e9ff33db0 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -293396,6 +293396,12 @@ function { parameter_id: 0x18bd6530 parameter_id: 0x3f54a013 } +function { + id: 0x45846d91 + return_type_id: 0xc9082b19 + parameter_id: 0x078316ff + parameter_id: 0x6720d32f +} function { id: 0x45a8a3c4 return_type_id: 0x00c83ba6 @@ -368457,6 +368463,15 @@ elf_symbol { type_id: 0x6ecc6402 full_name: "sk_alloc" } +elf_symbol { + id: 0x1295815b + name: "sk_capable" + is_defined: true + symbol_type: FUNCTION + crc: 0x9bced1ab + type_id: 0xf1208847 + full_name: "sk_capable" +} elf_symbol { id: 0xd7cc5056 name: "sk_common_release" @@ -375039,6 +375054,15 @@ elf_symbol { type_id: 0x11ebebf2 full_name: "ufshcd_mcq_config_esi" } +elf_symbol { + id: 0x71dad1b2 + name: "ufshcd_mcq_config_mac" + is_defined: true + symbol_type: FUNCTION + crc: 0xd1787215 + type_id: 0x125cb480 + full_name: "ufshcd_mcq_config_mac" +} elf_symbol { id: 0x051c0489 name: "ufshcd_mcq_enable_esi" @@ -375048,6 +375072,15 @@ elf_symbol { type_id: 0x1178942c full_name: "ufshcd_mcq_enable_esi" } +elf_symbol { + id: 0x562c9a11 + name: "ufshcd_mcq_make_queues_operational" + is_defined: true + symbol_type: FUNCTION + crc: 0x1d22bd73 + type_id: 0x1178942c + full_name: "ufshcd_mcq_make_queues_operational" +} elf_symbol { id: 0x56d1da85 name: "ufshcd_mcq_poll_cqe_lock" @@ -375066,6 +375099,15 @@ elf_symbol { type_id: 0x30f8e5d3 full_name: "ufshcd_mcq_poll_cqe_nolock" } +elf_symbol { + id: 0xaefd3622 + name: "ufshcd_mcq_read_cqis" + is_defined: true + symbol_type: FUNCTION + crc: 0xeafc7b98 + type_id: 0x45846d91 + full_name: "ufshcd_mcq_read_cqis" +} elf_symbol { id: 0x3ecd46f0 name: "ufshcd_mcq_write_cqis" @@ -386280,6 +386322,7 @@ interface { symbol_id: 0x4f6b19f1 symbol_id: 0xd4ea779d symbol_id: 0x67a38bc7 + symbol_id: 0x1295815b symbol_id: 0xd7cc5056 symbol_id: 0x40df740b symbol_id: 0x89a97545 @@ -387012,9 +387055,12 @@ interface { symbol_id: 0xcd6f9634 symbol_id: 0xba7435fd symbol_id: 0xb59c5eaf + symbol_id: 0x71dad1b2 symbol_id: 0x051c0489 + symbol_id: 0x562c9a11 symbol_id: 0x56d1da85 symbol_id: 0xe74af45a + symbol_id: 0xaefd3622 symbol_id: 0x3ecd46f0 symbol_id: 0xde541a7b symbol_id: 0xe6e08555 diff --git a/android/abi_gki_aarch64_mtk b/android/abi_gki_aarch64_mtk index 3ffc07d77c5e..e3872c033f45 100644 --- a/android/abi_gki_aarch64_mtk +++ b/android/abi_gki_aarch64_mtk @@ -98,10 +98,10 @@ blocking_notifier_call_chain blocking_notifier_chain_register blocking_notifier_chain_unregister + bpf_trace_run1 bpf_trace_run10 bpf_trace_run11 bpf_trace_run12 - bpf_trace_run1 bpf_trace_run2 bpf_trace_run3 bpf_trace_run4 @@ -690,8 +690,11 @@ drm_atomic_helper_commit_modeset_disables drm_atomic_helper_commit_modeset_enables drm_atomic_helper_commit_planes + __drm_atomic_helper_connector_destroy_state drm_atomic_helper_connector_destroy_state + __drm_atomic_helper_connector_duplicate_state drm_atomic_helper_connector_duplicate_state + __drm_atomic_helper_connector_reset drm_atomic_helper_connector_reset __drm_atomic_helper_crtc_destroy_state __drm_atomic_helper_crtc_duplicate_state @@ -1089,6 +1092,7 @@ ida_destroy ida_free idr_alloc + idr_alloc_cyclic idr_alloc_u32 idr_destroy idr_find @@ -1180,6 +1184,7 @@ iommu_report_device_fault iommu_unmap ioremap_prot + io_schedule_timeout iounmap iov_iter_init iov_iter_kvec @@ -1235,9 +1240,9 @@ is_vmalloc_addr iterate_dir iterate_fd + jiffies jiffies_64_to_clock_t jiffies64_to_nsecs - jiffies jiffies_to_msecs jiffies_to_usecs kasan_flag_enabled @@ -1430,8 +1435,8 @@ memremap memscan mem_section - memset64 memset + memset64 __memset_io memstart_addr memunmap @@ -1563,8 +1568,8 @@ nla_find nla_memcpy __nla_parse - nla_put_64bit nla_put + nla_put_64bit nla_put_nohdr nla_reserve nla_strscpy @@ -1687,6 +1692,8 @@ out_of_line_wait_on_bit_timeout overflowuid page_endio + page_pinner_inited + __page_pinner_put_page page_pool_alloc_pages page_pool_create page_pool_destroy @@ -1856,6 +1863,7 @@ pm_runtime_force_suspend pm_runtime_get_if_active __pm_runtime_idle + pm_runtime_irq_safe __pm_runtime_resume pm_runtime_set_autosuspend_delay __pm_runtime_set_status @@ -2061,6 +2069,7 @@ remove_proc_subtree remove_wait_queue request_firmware + request_firmware_direct request_firmware_nowait __request_module __request_percpu_irq @@ -2123,6 +2132,7 @@ rtnl_unregister rtnl_unregister_all runqueues + sbitmap_weight sched_clock sched_clock_register sched_feat_keys @@ -2145,11 +2155,13 @@ scnprintf scsi_autopm_get_device scsi_autopm_put_device + scsi_block_requests scsi_device_get scsi_device_put scsi_execute_cmd __scsi_iterate_devices scsi_print_sense_hdr + scsi_unblock_requests sdio_claim_host sdio_claim_irq sdio_disable_func @@ -2283,6 +2295,7 @@ skb_try_coalesce skb_tstamp_tx skb_unlink + sk_capable sk_common_release sk_error_report sk_filter_trim_cap @@ -2501,6 +2514,7 @@ tasklist_lock __task_pid_nr_ns __task_rq_lock + task_rq_lock thermal_cooling_device_unregister thermal_of_cooling_device_register thermal_pressure @@ -2576,6 +2590,7 @@ __traceiter_android_rvh_tick_entry __traceiter_android_rvh_try_to_wake_up __traceiter_android_rvh_try_to_wake_up_success + __traceiter_android_rvh_uclamp_eff_get __traceiter_android_rvh_update_cpu_capacity __traceiter_android_rvh_wake_up_new_task __traceiter_android_vh_alter_futex_plist_add @@ -2670,6 +2685,7 @@ __tracepoint_android_rvh_tick_entry __tracepoint_android_rvh_try_to_wake_up __tracepoint_android_rvh_try_to_wake_up_success + __tracepoint_android_rvh_uclamp_eff_get __tracepoint_android_rvh_update_cpu_capacity __tracepoint_android_rvh_wake_up_new_task __tracepoint_android_vh_alter_futex_plist_add @@ -2801,6 +2817,7 @@ udp_tunnel6_xmit_skb udp_tunnel_sock_release udp_tunnel_xmit_skb + ufshcd_config_pwr_mode ufshcd_delay_us ufshcd_dme_configure_adapt ufshcd_dme_get_attr @@ -2810,6 +2827,7 @@ ufshcd_get_pwr_dev_param ufshcd_hba_enable ufshcd_hba_stop + ufshcd_hold ufshcd_init_pwr_dev_param ufshcd_link_recovery ufshcd_make_hba_operational @@ -2821,6 +2839,7 @@ ufshcd_query_descriptor_retry ufshcd_query_flag ufshcd_read_desc_param + ufshcd_release ufshcd_remove ufshcd_resume_complete ufshcd_runtime_resume