* [PATCH 1/4] scsi: ufs: core: Fix mcq tag calcualtion
[not found] <20230221152919.25837-1-powen.kao@mediatek.com>
@ 2023-02-21 15:29 ` Po-Wen Kao
2023-02-21 18:59 ` Bart Van Assche
2023-02-21 15:29 ` [PATCH 2/4] scsi: ufs: core: Fix mcq nr_hw_queues Po-Wen Kao
` (2 subsequent siblings)
3 siblings, 1 reply; 5+ messages in thread
From: Po-Wen Kao @ 2023-02-21 15:29 UTC (permalink / raw)
To: Alim Akhtar, Avri Altman, Bart Van Assche, James E.J. Bottomley,
Martin K. Petersen, Matthias Brugger
Cc: wsd_upstream, peter.wang, stanley.chu, powen.kao, alice.chao,
naomi.chu, chun-hung.wu, cc.chou, eddie.huang, mason.zhang,
chaotian.jing, jiajie.hao, linux-scsi, linux-kernel,
linux-arm-kernel, linux-mediatek
Transfer command descriptor is allocated in ufshcd_memory_alloc()
and referenced by transfer request descriptor with stride size
sizeof_utp_transfer_cmd_desc()
instead of
sizeof(struct utp_transfer_cmd_desc).
Consequently, computing tag by address offset should also refer to the
same stride.
As suggested, sizeof_utp_transfer_cmd_desc() is further renamed to
ufshcd_get_ucd_size().
Signed-off-by: Po-Wen Kao <powen.kao@mediatek.com>
---
drivers/ufs/core/ufs-mcq.c | 2 +-
drivers/ufs/core/ufshcd.c | 8 ++++----
include/ufs/ufshcd.h | 2 +-
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index 31df052fbc41..a39746b2a8be 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -265,7 +265,7 @@ static int ufshcd_mcq_get_tag(struct ufs_hba *hba,
addr = (le64_to_cpu(cqe->command_desc_base_addr) & CQE_UCD_BA) -
hba->ucdl_dma_addr;
- return div_u64(addr, sizeof(struct utp_transfer_cmd_desc));
+ return div_u64(addr, ufshcd_get_ucd_size(hba));
}
static void ufshcd_mcq_process_cqe(struct ufs_hba *hba,
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 3b3cf78d3b10..81c9f07ebfc8 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -2823,10 +2823,10 @@ static void ufshcd_map_queues(struct Scsi_Host *shost)
static void ufshcd_init_lrb(struct ufs_hba *hba, struct ufshcd_lrb *lrb, int i)
{
struct utp_transfer_cmd_desc *cmd_descp = (void *)hba->ucdl_base_addr +
- i * sizeof_utp_transfer_cmd_desc(hba);
+ i * ufshcd_get_ucd_size(hba);
struct utp_transfer_req_desc *utrdlp = hba->utrdl_base_addr;
dma_addr_t cmd_desc_element_addr = hba->ucdl_dma_addr +
- i * sizeof_utp_transfer_cmd_desc(hba);
+ i * ufshcd_get_ucd_size(hba);
u16 response_offset = offsetof(struct utp_transfer_cmd_desc,
response_upiu);
u16 prdt_offset = offsetof(struct utp_transfer_cmd_desc, prd_table);
@@ -3735,7 +3735,7 @@ static int ufshcd_memory_alloc(struct ufs_hba *hba)
size_t utmrdl_size, utrdl_size, ucdl_size;
/* Allocate memory for UTP command descriptors */
- ucdl_size = sizeof_utp_transfer_cmd_desc(hba) * hba->nutrs;
+ ucdl_size = ufshcd_get_ucd_size(hba) * hba->nutrs;
hba->ucdl_base_addr = dmam_alloc_coherent(hba->dev,
ucdl_size,
&hba->ucdl_dma_addr,
@@ -3835,7 +3835,7 @@ static void ufshcd_host_memory_configure(struct ufs_hba *hba)
prdt_offset =
offsetof(struct utp_transfer_cmd_desc, prd_table);
- cmd_desc_size = sizeof_utp_transfer_cmd_desc(hba);
+ cmd_desc_size = ufshcd_get_ucd_size(hba);
cmd_desc_dma_addr = hba->ucdl_dma_addr;
for (i = 0; i < hba->nutrs; i++) {
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index ed9e3d5addb3..8f79cca449e1 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -1136,7 +1136,7 @@ static inline size_t ufshcd_sg_entry_size(const struct ufs_hba *hba)
({ (void)(hba); BUILD_BUG_ON(sg_entry_size != sizeof(struct ufshcd_sg_entry)); })
#endif
-static inline size_t sizeof_utp_transfer_cmd_desc(const struct ufs_hba *hba)
+static inline size_t ufshcd_get_ucd_size(const struct ufs_hba *hba)
{
return sizeof(struct utp_transfer_cmd_desc) + SG_ALL * ufshcd_sg_entry_size(hba);
}
--
2.18.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/4] scsi: ufs: core: Fix mcq nr_hw_queues
[not found] <20230221152919.25837-1-powen.kao@mediatek.com>
2023-02-21 15:29 ` [PATCH 1/4] scsi: ufs: core: Fix mcq tag calcualtion Po-Wen Kao
@ 2023-02-21 15:29 ` Po-Wen Kao
2023-02-21 15:29 ` [PATCH 3/4] scsi: ufs: core: Add hwq print for debug Po-Wen Kao
2023-02-21 15:29 ` [PATCH 4/4] scsi: ufs: core: Remove redundant check Po-Wen Kao
3 siblings, 0 replies; 5+ messages in thread
From: Po-Wen Kao @ 2023-02-21 15:29 UTC (permalink / raw)
To: Alim Akhtar, Avri Altman, Bart Van Assche, James E.J. Bottomley,
Martin K. Petersen, Matthias Brugger
Cc: wsd_upstream, peter.wang, stanley.chu, powen.kao, alice.chao,
naomi.chu, chun-hung.wu, cc.chou, eddie.huang, mason.zhang,
chaotian.jing, jiajie.hao, linux-scsi, linux-kernel,
linux-arm-kernel, linux-mediatek
Need to add one to QMAX to obtain number of hardware queue.
Signed-off-by: Po-Wen Kao <powen.kao@mediatek.com>
---
drivers/ufs/core/ufs-mcq.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index a39746b2a8be..5d5bc0bc6e88 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -150,7 +150,7 @@ static int ufshcd_mcq_config_nr_queues(struct ufs_hba *hba)
u32 hba_maxq, rem, tot_queues;
struct Scsi_Host *host = hba->host;
- hba_maxq = FIELD_GET(MAX_QUEUE_SUP, hba->mcq_capabilities);
+ 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;
--
2.18.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 3/4] scsi: ufs: core: Add hwq print for debug
[not found] <20230221152919.25837-1-powen.kao@mediatek.com>
2023-02-21 15:29 ` [PATCH 1/4] scsi: ufs: core: Fix mcq tag calcualtion Po-Wen Kao
2023-02-21 15:29 ` [PATCH 2/4] scsi: ufs: core: Fix mcq nr_hw_queues Po-Wen Kao
@ 2023-02-21 15:29 ` Po-Wen Kao
2023-02-21 15:29 ` [PATCH 4/4] scsi: ufs: core: Remove redundant check Po-Wen Kao
3 siblings, 0 replies; 5+ messages in thread
From: Po-Wen Kao @ 2023-02-21 15:29 UTC (permalink / raw)
To: Alim Akhtar, Avri Altman, Bart Van Assche, James E.J. Bottomley,
Martin K. Petersen, Matthias Brugger
Cc: wsd_upstream, peter.wang, stanley.chu, powen.kao, alice.chao,
naomi.chu, chun-hung.wu, cc.chou, eddie.huang, mason.zhang,
chaotian.jing, jiajie.hao, linux-scsi, linux-kernel,
linux-arm-kernel, linux-mediatek
Introduce hwq printing function for debug purpose.
- ufshcd_mcq_print_hwqs()
Signed-off-by: Po-Wen Kao <powen.kao@mediatek.com>
---
drivers/ufs/core/ufs-mcq.c | 32 +++++++++++++++++++++++++++++++-
drivers/ufs/core/ufshcd-priv.h | 9 +++++++++
drivers/ufs/core/ufshcd.c | 18 +++++++++++-------
include/ufs/ufshci.h | 12 ++++++++++++
4 files changed, 63 insertions(+), 8 deletions(-)
diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index 5d5bc0bc6e88..d1ff3ccd2085 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -23,7 +23,6 @@
#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
#define CQE_UCD_BA GENMASK_ULL(63, 7)
@@ -75,6 +74,13 @@ module_param_cb(poll_queues, &poll_queue_count_ops, &poll_queues, 0644);
MODULE_PARM_DESC(poll_queues,
"Number of poll queues used for r/w. Default value is 1");
+static const int mcq_opr_size[] = {
+ MCQ_SQD_SIZE,
+ MCQ_SQIS_SIZE,
+ MCQ_CQD_SIZE,
+ MCQ_CQIS_SIZE,
+};
+
/**
* ufshcd_mcq_config_mac - Set the #Max Activ Cmds.
* @hba: per adapter instance
@@ -237,6 +243,30 @@ static void __iomem *mcq_opr_base(struct ufs_hba *hba,
return opr->base + opr->stride * i;
}
+void ufshcd_mcq_print_hwqs(struct ufs_hba *hba, unsigned long bitmap)
+{
+ int id, i;
+ char prefix[15];
+
+ if (!is_mcq_enabled(hba))
+ return;
+
+ for_each_set_bit(id, &bitmap, hba->nr_hw_queues) {
+ snprintf(prefix, sizeof(prefix), "q%d SQCFG: ", id);
+ ufshcd_hex_dump(prefix,
+ hba->mcq_base + MCQ_QCFG_SIZE * id, MCQ_QCFG_SQ_SIZE);
+
+ snprintf(prefix, sizeof(prefix), "q%d CQCFG: ", id);
+ ufshcd_hex_dump(prefix,
+ hba->mcq_base + MCQ_QCFG_SIZE * id + MCQ_QCFG_SQ_SIZE, MCQ_QCFG_CQ_SIZE);
+
+ for (i = 0; i < OPR_MAX ; i++) {
+ snprintf(prefix, sizeof(prefix), "q%d OPR%d: ", id, i);
+ ufshcd_hex_dump(prefix, mcq_opr_base(hba, i, id), mcq_opr_size[i]);
+ }
+ }
+}
+
u32 ufshcd_mcq_read_cqis(struct ufs_hba *hba, int i)
{
return readl(mcq_opr_base(hba, OPR_CQIS, i) + REG_CQIS);
diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd-priv.h
index 529f8507a5e4..13534a9a6d0a 100644
--- a/drivers/ufs/core/ufshcd-priv.h
+++ b/drivers/ufs/core/ufshcd-priv.h
@@ -6,6 +6,14 @@
#include <linux/pm_runtime.h>
#include <ufs/ufshcd.h>
+#define ufshcd_hex_dump(prefix_str, buf, len) do { \
+ size_t __len = (len); \
+ print_hex_dump(KERN_ERR, prefix_str, \
+ __len > 4 ? DUMP_PREFIX_OFFSET : DUMP_PREFIX_NONE,\
+ 16, 4, buf, __len, false); \
+} while (0)
+
+
static inline bool ufshcd_is_user_access_allowed(struct ufs_hba *hba)
{
return !hba->shutting_down;
@@ -65,6 +73,7 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,
struct cq_entry *cqe);
int ufshcd_mcq_init(struct ufs_hba *hba);
int ufshcd_mcq_decide_queue_depth(struct ufs_hba *hba);
+void ufshcd_mcq_print_hwqs(struct ufs_hba *hba, unsigned long bitmap);
int ufshcd_mcq_memory_alloc(struct ufs_hba *hba);
void ufshcd_mcq_make_queues_operational(struct ufs_hba *hba);
void ufshcd_mcq_config_mac(struct ufs_hba *hba, u32 max_active_cmds);
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 81c9f07ebfc8..a15a5a78160c 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -135,13 +135,6 @@ MODULE_PARM_DESC(use_mcq_mode, "Control MCQ mode for controllers starting from U
_ret; \
})
-#define ufshcd_hex_dump(prefix_str, buf, len) do { \
- size_t __len = (len); \
- print_hex_dump(KERN_ERR, prefix_str, \
- __len > 4 ? DUMP_PREFIX_OFFSET : DUMP_PREFIX_NONE,\
- 16, 4, buf, __len, false); \
-} while (0)
-
int ufshcd_dump_regs(struct ufs_hba *hba, size_t offset, size_t len,
const char *prefix)
{
@@ -536,6 +529,8 @@ static
void ufshcd_print_trs(struct ufs_hba *hba, unsigned long bitmap, bool pr_prdt)
{
const struct ufshcd_lrb *lrbp;
+ struct ufs_hw_queue *hwq;
+ struct scsi_cmnd *cmd;
int prdt_length;
int tag;
@@ -574,7 +569,16 @@ void ufshcd_print_trs(struct ufs_hba *hba, unsigned long bitmap, bool pr_prdt)
if (pr_prdt)
ufshcd_hex_dump("UPIU PRDT: ", lrbp->ucd_prdt_ptr,
ufshcd_sg_entry_size(hba) * prdt_length);
+
+ if (is_mcq_enabled(hba)) {
+ cmd = lrbp->cmd;
+ if (!cmd)
+ return;
+ hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(cmd));
+ ufshcd_mcq_print_hwqs(hba, 1 << hwq->id);
+ }
}
+
}
static void ufshcd_print_tmrs(struct ufs_hba *hba, unsigned long bitmap)
diff --git a/include/ufs/ufshci.h b/include/ufs/ufshci.h
index 11424bb03814..027a2e884f89 100644
--- a/include/ufs/ufshci.h
+++ b/include/ufs/ufshci.h
@@ -185,6 +185,18 @@ static inline u32 ufshci_version(u32 major, u32 minor)
CRYPTO_ENGINE_FATAL_ERROR |\
UIC_LINK_LOST)
+/* MCQ size */
+#define MCQ_QCFG_SIZE 0x40
+#define MCQ_QCFG_SQ_SIZE 0x20
+#define MCQ_QCFG_CQ_SIZE 0x20
+
+enum {
+ MCQ_SQD_SIZE = 0x14,
+ MCQ_SQIS_SIZE = 0x08,
+ MCQ_CQD_SIZE = 0x08,
+ MCQ_CQIS_SIZE = 0x0C,
+};
+
/* HCS - Host Controller Status 30h */
#define DEVICE_PRESENT 0x1
#define UTP_TRANSFER_REQ_LIST_READY 0x2
--
2.18.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 4/4] scsi: ufs: core: Remove redundant check
[not found] <20230221152919.25837-1-powen.kao@mediatek.com>
` (2 preceding siblings ...)
2023-02-21 15:29 ` [PATCH 3/4] scsi: ufs: core: Add hwq print for debug Po-Wen Kao
@ 2023-02-21 15:29 ` Po-Wen Kao
3 siblings, 0 replies; 5+ messages in thread
From: Po-Wen Kao @ 2023-02-21 15:29 UTC (permalink / raw)
To: Alim Akhtar, Avri Altman, Bart Van Assche, James E.J. Bottomley,
Martin K. Petersen, Matthias Brugger
Cc: wsd_upstream, peter.wang, stanley.chu, powen.kao, alice.chao,
naomi.chu, chun-hung.wu, cc.chou, eddie.huang, mason.zhang,
chaotian.jing, jiajie.hao, linux-scsi, linux-kernel,
linux-arm-kernel, linux-mediatek
is_mcq_supported() already check on use_mcq_mode.
Signed-off-by: Po-Wen Kao <powen.kao@mediatek.com>
---
drivers/ufs/core/ufshcd.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index a15a5a78160c..21e3bf5d8f08 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -8548,7 +8548,7 @@ static int ufshcd_device_init(struct ufs_hba *hba, bool init_dev_params)
hba->scsi_host_added = true;
}
/* MCQ may be disabled if ufshcd_alloc_mcq() fails */
- if (is_mcq_supported(hba) && use_mcq_mode)
+ if (is_mcq_supported(hba))
ufshcd_config_mcq(hba);
}
--
2.18.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/4] scsi: ufs: core: Fix mcq tag calcualtion
2023-02-21 15:29 ` [PATCH 1/4] scsi: ufs: core: Fix mcq tag calcualtion Po-Wen Kao
@ 2023-02-21 18:59 ` Bart Van Assche
0 siblings, 0 replies; 5+ messages in thread
From: Bart Van Assche @ 2023-02-21 18:59 UTC (permalink / raw)
To: Po-Wen Kao, Alim Akhtar, Avri Altman, James E.J. Bottomley,
Martin K. Petersen, Matthias Brugger
Cc: wsd_upstream, peter.wang, stanley.chu, alice.chao, naomi.chu,
chun-hung.wu, cc.chou, eddie.huang, mason.zhang, chaotian.jing,
jiajie.hao, linux-scsi, linux-kernel, linux-arm-kernel,
linux-mediatek
On 2/21/23 07:29, Po-Wen Kao wrote:
> Transfer command descriptor is allocated in ufshcd_memory_alloc()
> and referenced by transfer request descriptor with stride size
> sizeof_utp_transfer_cmd_desc()
> instead of
> sizeof(struct utp_transfer_cmd_desc).
>
> Consequently, computing tag by address offset should also refer to the
> same stride.
>
> As suggested, sizeof_utp_transfer_cmd_desc() is further renamed to
> ufshcd_get_ucd_size().
This patch includes two changes:
(1) a bug fix.
(2) a name change for a function.
A Linux kernel patch should include only one logical change. Please
split this patch.
Thanks,
Bart.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-02-21 18:59 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20230221152919.25837-1-powen.kao@mediatek.com>
2023-02-21 15:29 ` [PATCH 1/4] scsi: ufs: core: Fix mcq tag calcualtion Po-Wen Kao
2023-02-21 18:59 ` Bart Van Assche
2023-02-21 15:29 ` [PATCH 2/4] scsi: ufs: core: Fix mcq nr_hw_queues Po-Wen Kao
2023-02-21 15:29 ` [PATCH 3/4] scsi: ufs: core: Add hwq print for debug Po-Wen Kao
2023-02-21 15:29 ` [PATCH 4/4] scsi: ufs: core: Remove redundant check Po-Wen Kao
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).