From caeb85ae6fc056f0c1f0f7f8e1a79e3b7124129c Mon Sep 17 00:00:00 2001 From: Yandong Lin Date: Tue, 6 Feb 2024 10:44:38 +0800 Subject: [PATCH] video: rockchip: mpp: fix rockchip_ipa_get_static_power crash When echo userspace > /sys/class/devfreq/ffbb0000.rkvenc/governor,the devfreq->data will be reassign to userspace data. So cannot get struct rkvenc_dev *enc by devfreq->data. [] (rockchip_ipa_get_static_power) from [] (devfreq_cooling_get_requested_power+0x140/0x150) [] (devfreq_cooling_get_requested_power) from [] (power_allocator_throttle+0x224/0x8b0) [] (power_allocator_throttle) from [] (handle_thermal_trip+0xb0/0x1c8) [] (handle_thermal_trip) from [] (thermal_zone_device_update.part.3+0x70/0xc4) [] (thermal_zone_device_update.part.3) from [] (process_one_work+0x1f0/0x408) [] (process_one_work) from [] (worker_thread+0x30/0x564) [] (worker_thread) from [] (kthread+0x160/0x190) [] (kthread) from [] (ret_from_fork+0x14/0x3c) Change-Id: I46977c8dd23d2fc286afa0ae8b87aea1cb0be0d7 Signed-off-by: Yandong Lin --- drivers/video/rockchip/mpp/mpp_rkvdec2.c | 11 ++++++----- drivers/video/rockchip/mpp/mpp_rkvenc.c | 11 ++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/drivers/video/rockchip/mpp/mpp_rkvdec2.c index a463fc2eeccc..decd5e25c252 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvdec2.c +++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.c @@ -816,13 +816,14 @@ static struct devfreq_governor devfreq_vdec2_ondemand = { static unsigned long rkvdec2_get_static_power(struct devfreq *devfreq, unsigned long voltage) { - struct rkvdec2_dev *dec = devfreq->data; + struct device *dev = devfreq->dev.parent; + struct mpp_dev *mpp = dev_get_drvdata(dev); + struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); - if (!dec->model_data) + if (!dec || !dec->model_data) return 0; - else - return rockchip_ipa_get_static_power(dec->model_data, - voltage); + + return rockchip_ipa_get_static_power(dec->model_data, voltage); } static struct devfreq_cooling_power vdec2_cooling_power_data = { diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc.c b/drivers/video/rockchip/mpp/mpp_rkvenc.c index c71c03fb91eb..624d15e6783b 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvenc.c +++ b/drivers/video/rockchip/mpp/mpp_rkvenc.c @@ -955,13 +955,14 @@ static struct devfreq_governor devfreq_venc_ondemand = { static unsigned long rkvenc_get_static_power(struct devfreq *devfreq, unsigned long voltage) { - struct rkvenc_dev *enc = devfreq->data; + struct device *dev = devfreq->dev.parent; + struct mpp_dev *mpp = dev_get_drvdata(dev); + struct rkvenc_dev *enc = to_rkvenc_dev(mpp); - if (!enc->model_data) + if (!enc || !enc->model_data) return 0; - else - return rockchip_ipa_get_static_power(enc->model_data, - voltage); + + return rockchip_ipa_get_static_power(enc->model_data, voltage); } static struct devfreq_cooling_power venc_cooling_power_data = {