@@ -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+
15691622static 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/**
0 commit comments