Merge "mhi: core: expose soc reset and register dump debugfs entries"

This commit is contained in:
qctecmdr 2020-06-03 00:09:13 -07:00 • committed by Gerrit - the friendly Code Review server
commit ab69e75913
5 changed files with 99 additions and 0 deletions

View file

@ -677,3 +677,10 @@ error_read:
error_alloc_fw_table:
release_firmware(firmware);
}
void mhi_perform_soc_reset(struct mhi_controller *mhi_cntrl)
{
mhi_cntrl->write_reg(mhi_cntrl, mhi_cntrl->regs,
MHI_SOC_RESET_REQ_OFFSET,
MHI_SOC_RESET_REQ);
}

View file

@ -525,6 +525,12 @@ static int mhi_init_debugfs_mhi_vote_open(struct inode *inode, struct file *fp)
return single_open(fp, mhi_debugfs_mhi_vote_show, inode->i_private);
}
static int mhi_init_debugfs_mhi_regdump_open(struct inode *inode,
struct file *fp)
{
return single_open(fp, mhi_debugfs_mhi_regdump_show, inode->i_private);
}
static const struct file_operations debugfs_state_ops = {
.open = mhi_init_debugfs_mhi_states_open,
.release = single_release,
@ -549,9 +555,18 @@ static const struct file_operations debugfs_vote_ops = {
.read = seq_read,
};
static const struct file_operations debugfs_regdump_ops = {
.open = mhi_init_debugfs_mhi_regdump_open,
.release = single_release,
.read = seq_read,
};
DEFINE_DEBUGFS_ATTRIBUTE(debugfs_trigger_reset_fops, NULL,
mhi_debugfs_trigger_reset, "%llu\n");
DEFINE_DEBUGFS_ATTRIBUTE(debugfs_trigger_soc_reset_fops, NULL,
mhi_debugfs_trigger_soc_reset, "%llu\n");
void mhi_init_debugfs(struct mhi_controller *mhi_cntrl)
{
struct dentry *dentry;
@ -578,6 +593,11 @@ void mhi_init_debugfs(struct mhi_controller *mhi_cntrl)
&debugfs_vote_ops);
debugfs_create_file_unsafe("reset", 0444, dentry, mhi_cntrl,
&debugfs_trigger_reset_fops);
debugfs_create_file_unsafe("regdump", 0444, dentry, mhi_cntrl,
&debugfs_regdump_ops);
debugfs_create_file_unsafe("soc_reset", 0444, dentry, mhi_cntrl,
&debugfs_trigger_soc_reset_fops);
mhi_cntrl->dentry = dentry;
}

View file

@ -755,11 +755,13 @@ extern struct mhi_bus mhi_bus;
struct mhi_controller *find_mhi_controller_by_name(const char *name);
/* debug fs related functions */
int mhi_debugfs_mhi_regdump_show(struct seq_file *m, void *d);
int mhi_debugfs_mhi_vote_show(struct seq_file *m, void *d);
int mhi_debugfs_mhi_chan_show(struct seq_file *m, void *d);
int mhi_debugfs_mhi_event_show(struct seq_file *m, void *d);
int mhi_debugfs_mhi_states_show(struct seq_file *m, void *d);
int mhi_debugfs_trigger_reset(void *data, u64 val);
int mhi_debugfs_trigger_soc_reset(void *data, u64 val);
void mhi_deinit_debugfs(struct mhi_controller *mhi_cntrl);
void mhi_init_debugfs(struct mhi_controller *mhi_cntrl);
@ -966,6 +968,7 @@ int mhi_prepare_channel(struct mhi_controller *mhi_cntrl,
struct mhi_chan *mhi_chan);
void mhi_reset_reg_write_q(struct mhi_controller *mhi_cntrl);
void mhi_force_reg_write(struct mhi_controller *mhi_cntrl);
void mhi_perform_soc_reset(struct mhi_controller *mhi_cntrl);
/* isr handlers */
irqreturn_t mhi_msi_handlr(int irq_number, void *dev);

View file

@ -2088,6 +2088,64 @@ error_invalid_state:
mutex_unlock(&mhi_chan->mutex);
}
int mhi_debugfs_mhi_regdump_show(struct seq_file *m, void *d)
{
struct mhi_controller *mhi_cntrl = m->private;
enum mhi_dev_state state;
enum mhi_ee ee;
int i, ret;
u32 val;
void __iomem *mhi_base = mhi_cntrl->regs;
void __iomem *bhi_base = mhi_cntrl->bhi;
void __iomem *bhie_base = mhi_cntrl->bhie;
void __iomem *wake_db = mhi_cntrl->wake_db;
struct {
const char *name;
int offset;
void __iomem *base;
} debug_reg[] = {
{ "MHI_CNTRL", MHICTRL, mhi_base},
{ "MHI_STATUS", MHISTATUS, mhi_base},
{ "MHI_WAKE_DB", 0, wake_db},
{ "BHI_EXECENV", BHI_EXECENV, bhi_base},
{ "BHI_STATUS", BHI_STATUS, bhi_base},
{ "BHI_ERRCODE", BHI_ERRCODE, bhi_base},
{ "BHI_ERRDBG1", BHI_ERRDBG1, bhi_base},
{ "BHI_ERRDBG2", BHI_ERRDBG2, bhi_base},
{ "BHI_ERRDBG3", BHI_ERRDBG3, bhi_base},
{ "BHIE_TXVEC_DB", BHIE_TXVECDB_OFFS, bhie_base},
{ "BHIE_TXVEC_STATUS", BHIE_TXVECSTATUS_OFFS, bhie_base},
{ "BHIE_RXVEC_DB", BHIE_RXVECDB_OFFS, bhie_base},
{ "BHIE_RXVEC_STATUS", BHIE_RXVECSTATUS_OFFS, bhie_base},
{ NULL },
};
if (!MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state))
return -EIO;
seq_printf(m, "host pm_state:%s dev_state:%s ee:%s\n",
to_mhi_pm_state_str(mhi_cntrl->pm_state),
TO_MHI_STATE_STR(mhi_cntrl->dev_state),
TO_MHI_EXEC_STR(mhi_cntrl->ee));
state = mhi_get_mhi_state(mhi_cntrl);
ee = mhi_get_exec_env(mhi_cntrl);
seq_printf(m, "device ee:%s dev_state:%s\n", TO_MHI_EXEC_STR(ee),
TO_MHI_STATE_STR(state));
for (i = 0; debug_reg[i].name; i++) {
if (!debug_reg[i].base)
continue;
ret = mhi_read_reg(mhi_cntrl, debug_reg[i].base,
debug_reg[i].offset, &val);
seq_printf(m, "reg:%s val:0x%x, ret:%d\n", debug_reg[i].name,
val, ret);
}
return 0;
}
int mhi_debugfs_mhi_states_show(struct seq_file *m, void *d)
{
struct mhi_controller *mhi_cntrl = m->private;

View file

@ -716,6 +716,17 @@ static void mhi_pm_disable_transition(struct mhi_controller *mhi_cntrl,
mutex_unlock(&mhi_cntrl->pm_mutex);
}
int mhi_debugfs_trigger_soc_reset(void *data, u64 val)
{
struct mhi_controller *mhi_cntrl = data;
MHI_LOG("Trigger MHI SOC Reset\n");
mhi_perform_soc_reset(mhi_cntrl);
return 0;
}
int mhi_debugfs_trigger_reset(void *data, u64 val)
{
struct mhi_controller *mhi_cntrl = data;