Skip to content

Commit 82edd86

Browse files
quic-mapamartinkpetersen
authored andcommitted
scsi: ufs: ufs-qcom: Add support to dump MCQ registers
Add support to dump UFS MCQ registers to enhance debugging capabilities for the Qualcomm UFS Host Controller. Signed-off-by: Manish Pandey <quic_mapa@quicinc.com> Link: https://lore.kernel.org/r/20250411121345.16859-3-quic_mapa@quicinc.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent fe016bb commit 82edd86

2 files changed

Lines changed: 67 additions & 0 deletions

File tree

drivers/ufs/host/ufs-qcom.c

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1566,6 +1566,59 @@ int ufs_qcom_testbus_config(struct ufs_qcom_host *host)
15661566
return 0;
15671567
}
15681568

1569+
static int ufs_qcom_dump_regs(struct ufs_hba *hba, size_t offset, size_t len,
1570+
const char *prefix, enum ufshcd_res id)
1571+
{
1572+
u32 *regs __free(kfree) = NULL;
1573+
size_t pos;
1574+
1575+
if (offset % 4 != 0 || len % 4 != 0)
1576+
return -EINVAL;
1577+
1578+
regs = kzalloc(len, GFP_ATOMIC);
1579+
if (!regs)
1580+
return -ENOMEM;
1581+
1582+
for (pos = 0; pos < len; pos += 4)
1583+
regs[pos / 4] = readl(hba->res[id].base + offset + pos);
1584+
1585+
print_hex_dump(KERN_ERR, prefix,
1586+
len > 4 ? DUMP_PREFIX_OFFSET : DUMP_PREFIX_NONE,
1587+
16, 4, regs, len, false);
1588+
1589+
return 0;
1590+
}
1591+
1592+
static void ufs_qcom_dump_mcq_hci_regs(struct ufs_hba *hba)
1593+
{
1594+
struct dump_info {
1595+
size_t offset;
1596+
size_t len;
1597+
const char *prefix;
1598+
enum ufshcd_res id;
1599+
};
1600+
1601+
struct dump_info mcq_dumps[] = {
1602+
{0x0, 256 * 4, "MCQ HCI-0 ", RES_MCQ},
1603+
{0x400, 256 * 4, "MCQ HCI-1 ", RES_MCQ},
1604+
{0x0, 5 * 4, "MCQ VS-0 ", RES_MCQ_VS},
1605+
{0x0, 256 * 4, "MCQ SQD-0 ", RES_MCQ_SQD},
1606+
{0x400, 256 * 4, "MCQ SQD-1 ", RES_MCQ_SQD},
1607+
{0x800, 256 * 4, "MCQ SQD-2 ", RES_MCQ_SQD},
1608+
{0xc00, 256 * 4, "MCQ SQD-3 ", RES_MCQ_SQD},
1609+
{0x1000, 256 * 4, "MCQ SQD-4 ", RES_MCQ_SQD},
1610+
{0x1400, 256 * 4, "MCQ SQD-5 ", RES_MCQ_SQD},
1611+
{0x1800, 256 * 4, "MCQ SQD-6 ", RES_MCQ_SQD},
1612+
{0x1c00, 256 * 4, "MCQ SQD-7 ", RES_MCQ_SQD},
1613+
};
1614+
1615+
for (int i = 0; i < ARRAY_SIZE(mcq_dumps); i++) {
1616+
ufs_qcom_dump_regs(hba, mcq_dumps[i].offset, mcq_dumps[i].len,
1617+
mcq_dumps[i].prefix, mcq_dumps[i].id);
1618+
cond_resched();
1619+
}
1620+
}
1621+
15691622
static void ufs_qcom_dump_dbg_regs(struct ufs_hba *hba)
15701623
{
15711624
u32 reg;
@@ -1624,6 +1677,18 @@ static void ufs_qcom_dump_dbg_regs(struct ufs_hba *hba)
16241677

16251678
reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_TMRLUT);
16261679
ufshcd_dump_regs(hba, reg, 9 * 4, "UFS_DBG_RD_REG_TMRLUT ");
1680+
1681+
if (hba->mcq_enabled) {
1682+
reg = ufs_qcom_get_debug_reg_offset(host, UFS_RD_REG_MCQ);
1683+
ufshcd_dump_regs(hba, reg, 64 * 4, "HCI MCQ Debug Registers ");
1684+
}
1685+
1686+
/* ensure below dumps occur only in task context due to blocking calls. */
1687+
if (in_task()) {
1688+
/* Dump MCQ Host Vendor Specific Registers */
1689+
if (hba->mcq_enabled)
1690+
ufs_qcom_dump_mcq_hci_regs(hba);
1691+
}
16271692
}
16281693

16291694
/**

drivers/ufs/host/ufs-qcom.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ enum {
5050
*/
5151
UFS_AH8_CFG = 0xFC,
5252

53+
UFS_RD_REG_MCQ = 0xD00,
54+
5355
REG_UFS_MEM_ICE_CONFIG = 0x260C,
5456
REG_UFS_MEM_ICE_NUM_CORE = 0x2664,
5557

0 commit comments

Comments
 (0)