Merge "drivers: qcom: rpmh-rsc: add IPC logging support for RSC driver"

This commit is contained in:
qctecmdr 2019-10-01 20:02:44 -07:00 • committed by Gerrit - the friendly Code Review server
commit 557352c895
2 changed files with 30 additions and 5 deletions

View file

@ -94,6 +94,7 @@ struct rpmh_ctrlr {
* @lock: synchronize state of the controller
* @client: handle to the DRV's client.
* @irq: IRQ at gic
* @ipc_log_ctx IPC logger handle
*/
struct rsc_drv {
const char *name;
@ -107,6 +108,7 @@ struct rsc_drv {
spinlock_t lock;
struct rpmh_ctrlr client;
int irq;
void *ipc_log_ctx;
};
extern bool rpmh_standalone;

View file

@ -26,6 +26,9 @@
#define CREATE_TRACE_POINTS
#include "trace-rpmh.h"
#include <linux/ipc_logging.h>
#define RSC_DRV_IPC_LOG_SIZE 2
#define RSC_DRV_TCS_OFFSET 672
#define RSC_DRV_CMD_OFFSET 20
@ -237,6 +240,7 @@ static void __tcs_trigger(struct rsc_drv *drv, int tcs_id, bool trigger)
write_tcs_reg_sync(drv, RSC_DRV_CONTROL, tcs_id, enable);
enable |= TCS_AMC_MODE_TRIGGER;
write_tcs_reg(drv, RSC_DRV_CONTROL, tcs_id, enable);
ipc_log_string(drv->ipc_log_ctx, "TCS trigger: m=%d", tcs_id);
}
}
@ -288,6 +292,8 @@ static irqreturn_t tcs_tx_done(int irq, void *p)
}
trace_rpmh_tx_done(drv, i, req, err);
ipc_log_string(drv->ipc_log_ctx,
"IRQ response: m=%d err=%d", i, err);
/*
* if wake tcs was re-purposed for sending active
@ -344,6 +350,10 @@ static void __tcs_buffer_write(struct rsc_drv *drv, int tcs_id, int cmd_id,
write_tcs_cmd(drv, RSC_DRV_CMD_ADDR, tcs_id, j, cmd->addr);
write_tcs_cmd(drv, RSC_DRV_CMD_DATA, tcs_id, j, cmd->data);
trace_rpmh_send_msg(drv, tcs_id, j, msgid, cmd);
ipc_log_string(drv->ipc_log_ctx,
"TCS write: m=%d n=%d msgid=%#x addr=%#x data=%#x wait=%d",
tcs_id, j, msgid, cmd->addr,
cmd->data, cmd->wait);
}
write_tcs_reg(drv, RSC_DRV_CMD_WAIT_FOR_CMPL, tcs_id, cmd_complete);
@ -462,8 +472,14 @@ int rpmh_rsc_send_data(struct rsc_drv *drv, const struct tcs_request *msg)
do {
ret = tcs_write(drv, msg);
if (ret == -EBUSY) {
pr_info_ratelimited("DRV:%s TCS Busy, retrying RPMH message send: addr=%#x\n",
drv->name, msg->cmds[0].addr);
bool irq_sts;
irq_get_irqchip_state(drv->irq, IRQCHIP_STATE_PENDING,
&irq_sts);
pr_info_ratelimited("DRV:%s TCS Busy, retrying RPMH message send: addr=%#x interrupt status=%s\n",
drv->name, msg->cmds[0].addr,
irq_sts ?
"PENDING" : "NOT PENDING");
udelay(10);
}
} while (ret == -EBUSY);
@ -621,15 +637,19 @@ int rpmh_rsc_write_pdc_data(struct rsc_drv *drv, const struct tcs_request *msg)
{
int i;
void __iomem *addr = drv->base + RSC_PDC_DRV_DATA;
struct tcs_cmd *cmd;
if (!msg || !msg->cmds || msg->num_cmds != RSC_PDC_DATA_SIZE)
return -EINVAL;
for (i = 0; i < msg->num_cmds; i++) {
cmd = &msg->cmds[i];
/* Only data is write capable */
writel_relaxed(msg->cmds[i].data, addr);
trace_rpmh_send_msg(drv, RSC_PDC_DRV_DATA, i, 0,
&msg->cmds[i]);
writel_relaxed(cmd->data, addr);
trace_rpmh_send_msg(drv, RSC_PDC_DRV_DATA, i, 0, cmd);
ipc_log_string(drv->ipc_log_ctx,
"PDC write: n=%d addr=%#x data=%x",
i, cmd->addr, cmd->data);
addr += RSC_PDC_DATA_OFFSET;
}
@ -892,6 +912,9 @@ static int rpmh_rsc_probe(struct platform_device *pdev)
INIT_LIST_HEAD(&drv->client.cache);
INIT_LIST_HEAD(&drv->client.batch_cache);
drv->ipc_log_ctx = ipc_log_context_create(RSC_DRV_IPC_LOG_SIZE,
drv->name, 0);
dev_set_drvdata(&pdev->dev, drv);
__rsc_drv[__rsc_count++] = drv;