From e0d6e449eb8edb285f72a5f7bd0df3e9e9eb3e67 Mon Sep 17 00:00:00 2001 From: Liang Chen Date: Thu, 22 Dec 2022 10:57:26 +0800 Subject: [PATCH] PM / devfreq: rockchip_dmc: dump current opp state when panic for ddr panic log: rockchip-dmc dmc: cur_freq: 528000000 Hz, volt_vdd: 675000 uV, volt_mem: 700000 uV Signed-off-by: Liang Chen Change-Id: Iad0ef4c72f9761e23f68098d1e9ad03dec4d84a1 --- drivers/devfreq/rockchip_dmc.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/devfreq/rockchip_dmc.c b/drivers/devfreq/rockchip_dmc.c index ac484398a2d8..9836cdcce033 100644 --- a/drivers/devfreq/rockchip_dmc.c +++ b/drivers/devfreq/rockchip_dmc.c @@ -118,6 +118,7 @@ struct rockchip_dmcfreq { struct regulator *vdd_center; struct regulator *mem_reg; struct notifier_block status_nb; + struct notifier_block panic_nb; struct list_head video_info_list; struct freq_map_table *cpu_bw_tbl; struct work_struct boost_work; @@ -2619,6 +2620,23 @@ next: return NOTIFY_OK; } +static int rockchip_dmcfreq_panic_notifier(struct notifier_block *nb, + unsigned long v, void *p) +{ + struct rockchip_dmcfreq *dmcfreq = + container_of(nb, struct rockchip_dmcfreq, panic_nb); + struct device *dev = dmcfreq->dev; + + if (dmcfreq->regulator_count == 1) + dev_info(dev, "cur_freq: %lu Hz, volt: %lu uV\n", + dmcfreq->rate, dmcfreq->volt); + else + dev_info(dev, "cur_freq: %lu Hz, volt_vdd: %lu uV, volt_mem: %lu uV\n", + dmcfreq->rate, dmcfreq->volt, dmcfreq->mem_volt); + + return 0; +} + static ssize_t rockchip_dmcfreq_status_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -3172,6 +3190,12 @@ static void rockchip_dmcfreq_register_notifier(struct rockchip_dmcfreq *dmcfreq) if (ret) dev_err(dmcfreq->dev, "failed to register system_status nb\n"); + dmcfreq->panic_nb.notifier_call = rockchip_dmcfreq_panic_notifier; + ret = atomic_notifier_chain_register(&panic_notifier_list, + &dmcfreq->panic_nb); + if (ret) + dev_err(dmcfreq->dev, "failed to register panic nb\n"); + dmc_mdevp.data = dmcfreq->info.devfreq; dmcfreq->mdev_info = rockchip_system_monitor_register(dmcfreq->dev, &dmc_mdevp);