From 18b0b032d444036227747e12c044597b71e435bb Mon Sep 17 00:00:00 2001 From: Johnny Liu Date: Wed, 3 May 2023 10:11:54 +0000 Subject: [PATCH] gpu: host1x: Support updating actmon watermark Add support for updating actmon watermark thresholds so that actmon DFS can work properly. Add support for enabling or disabling watermark interrupts. Bug 3788919 Signed-off-by: Johnny Liu Change-Id: Id1d0b744bc8a0a19fccbb3044d4267ae35cd5feb Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/2897816 Reviewed-by: svcacv Reviewed-by: Rajkumar Kasirajan Reviewed-by: Mikko Perttunen GVS: Gerrit_Virtual_Submit --- drivers/gpu/host1x/actmon.c | 40 +++++++++++++++++++ .../gpu/host1x/include/linux/host1x-next.h | 7 ++++ 2 files changed, 47 insertions(+) diff --git a/drivers/gpu/host1x/actmon.c b/drivers/gpu/host1x/actmon.c index cef6d67c..143a10c5 100644 --- a/drivers/gpu/host1x/actmon.c +++ b/drivers/gpu/host1x/actmon.c @@ -491,3 +491,43 @@ int host1x_actmon_read_avg_count(struct host1x_client *client) return readl(host->actmon_regs + offset + 0xa4); } EXPORT_SYMBOL(host1x_actmon_read_avg_count); + +void host1x_actmon_update_active_wmark(struct host1x_client *client, + u32 avg_upper_wmark, + u32 avg_lower_wmark, + u32 consec_upper_wmark, + u32 consec_lower_wmark, + bool upper_wmark_enabled, + bool lower_wmark_enabled) +{ + struct host1x_actmon *actmon = client->actmon; + struct host1x_actmon_module *module; + u32 val = 0; + + if (!actmon || !actmon->num_modules) + return; + + module = &actmon->modules[HOST1X_ACTMON_MODULE_ACTIVE]; + + /* Update watermark thresholds */ + actmon_module_writel(module, + avg_upper_wmark / 1000 * actmon->usecs_per_sample / 1000, + HOST1X_ACTMON_MODULE_AVG_UPPER_WMARK_REG); + actmon_module_writel(module, + avg_lower_wmark / 1000 * actmon->usecs_per_sample / 1000, + HOST1X_ACTMON_MODULE_AVG_LOWER_WMARK_REG); + actmon_module_writel(module, + consec_upper_wmark / 1000 * actmon->usecs_per_sample / 1000, + HOST1X_ACTMON_MODULE_UPPER_WMARK_REG); + actmon_module_writel(module, + consec_lower_wmark / 1000 * actmon->usecs_per_sample / 1000, + HOST1X_ACTMON_MODULE_LOWER_WMARK_REG); + + /* Update watermark interrupt enable bits */ + val |= HOST1X_ACTMON_MODULE_INTR_AVG_WMARK_ABOVE_ENB(upper_wmark_enabled); + val |= HOST1X_ACTMON_MODULE_INTR_AVG_WMARK_BELOW_ENB(lower_wmark_enabled); + val |= HOST1X_ACTMON_MODULE_INTR_CONSEC_WMARK_ABOVE_ENB(upper_wmark_enabled); + val |= HOST1X_ACTMON_MODULE_INTR_CONSEC_WMARK_BELOW_ENB(lower_wmark_enabled); + actmon_module_writel(module, val, HOST1X_ACTMON_MODULE_INTR_ENB_REG); +} +EXPORT_SYMBOL(host1x_actmon_update_active_wmark); diff --git a/drivers/gpu/host1x/include/linux/host1x-next.h b/drivers/gpu/host1x/include/linux/host1x-next.h index 360a8cc2..ddf5a214 100644 --- a/drivers/gpu/host1x/include/linux/host1x-next.h +++ b/drivers/gpu/host1x/include/linux/host1x-next.h @@ -531,5 +531,12 @@ void host1x_actmon_update_client_rate(struct host1x_client *client, unsigned long rate, u32 *weight); void host1x_actmon_read_active_norm(struct host1x_client *client, unsigned long *usage); +void host1x_actmon_update_active_wmark(struct host1x_client *client, + u32 avg_upper_wmark, + u32 avg_lower_wmark, + u32 consec_upper_wmark, + u32 consec_lower_wmark, + bool upper_wmark_enabled, + bool lower_wmark_enabled); #endif