mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-24 10:11:26 +03:00
devfreq: pod v2: build as ext module for kstable
governor_pod_scaling_v2 will be provided as a kernel module in future NVIDIA software deliverables for Linux platforms. As of this moment, the function that returns the range of the device's scaling frequency hasn't been exposed from Linux kernel for modules to call. A similar function is implemented in the governor_pod_scaling_v2, but this function cannot get the frequency constraints put through the PM QOS interface due to the same reason, lack of kernel API function. An upstream kernel patch has been proposed by the power management maintainer to provide the function needed by governor_pod_scaling_v2, but it's not in any release kernel yet. For now, PM QOS support is removed from governor_pod_scaling_v2 and it will be added back when the upstream kernel patch is available in kernel releases. drivers_devfreq_governor_5_14.h is a copy of drivers/devfreq/governor.h of Linux kernel 5.14. Having this copy is to avoid introducing the dependency on Linux source for building the podgov as external module. JIRA ID: LS-418 Signed-off-by: Peng Liu <pengliu@nvidia.com> Change-Id: I0c70acf5679fed53f30bc3ba7c01ea571036cc5e Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2638232 Reviewed-by: svc_kernel_abi <svc_kernel_abi@nvidia.com> Reviewed-by: Vijayakumar Subbu <vsubbu@nvidia.com> Reviewed-by: Jonathan Hunter <jonathanh@nvidia.com> Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com> Reviewed-by: svc-mobile-cert <svc-mobile-cert@nvidia.com> GVS: Gerrit_Virtual_Submit
This commit is contained in:
committed by
Laxman Dewangan
parent
97ff547e3c
commit
8a2d6e1b54
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012-2020, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2012-2022, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
@@ -32,11 +32,15 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/clk/tegra.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <linux/version.h>
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/nvhost_podgov.h>
|
||||
|
||||
#ifndef GOVERNOR_POD_SCALING_V2_MODULE
|
||||
#include "governor.h"
|
||||
#else
|
||||
#include "governor_v2.h"
|
||||
#endif // GOVERNOR_POD_SCALING_V2_MODULE
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
@@ -121,6 +125,45 @@ enum podgov_adjustment_type {
|
||||
|
||||
#define HZ_PER_KHZ 1000
|
||||
|
||||
#ifdef GOVERNOR_POD_SCALING_V2_MODULE
|
||||
static void get_freq_range(struct devfreq *devfreq,
|
||||
unsigned long *min_freq,
|
||||
unsigned long *max_freq)
|
||||
{
|
||||
unsigned long *freq_table = devfreq->profile->freq_table;
|
||||
|
||||
lockdep_assert_held(&devfreq->lock);
|
||||
|
||||
if (freq_table[0] < freq_table[devfreq->profile->max_state - 1]) {
|
||||
*min_freq = freq_table[0];
|
||||
*max_freq = freq_table[devfreq->profile->max_state - 1];
|
||||
} else {
|
||||
*min_freq = freq_table[devfreq->profile->max_state - 1];
|
||||
*max_freq = freq_table[0];
|
||||
}
|
||||
|
||||
/* Apply constraints from OPP interface */
|
||||
*min_freq = max(*min_freq, devfreq->scaling_min_freq);
|
||||
*max_freq = min(*max_freq, devfreq->scaling_max_freq);
|
||||
|
||||
if (*min_freq > *max_freq)
|
||||
*min_freq = *max_freq;
|
||||
}
|
||||
|
||||
static void get_min_freq_limit(struct devfreq *df, unsigned long *min_freq_hz)
|
||||
{
|
||||
unsigned long max_freq_hz;
|
||||
|
||||
get_freq_range(df, min_freq_hz, &max_freq_hz);
|
||||
}
|
||||
|
||||
static void get_max_freq_limit(struct devfreq *df, unsigned long *max_freq_hz)
|
||||
{
|
||||
unsigned long min_freq_hz;
|
||||
|
||||
get_freq_range(df, &min_freq_hz, max_freq_hz);
|
||||
}
|
||||
#else
|
||||
static void get_min_freq_limit(struct devfreq *df, unsigned long *min_freq_hz)
|
||||
{
|
||||
s32 qos_min_freq = 0;
|
||||
@@ -142,6 +185,7 @@ static void get_max_freq_limit(struct devfreq *df, unsigned long *max_freq_hz)
|
||||
|
||||
*max_freq_hz = (unsigned long)HZ_PER_KHZ * qos_max_freq;
|
||||
}
|
||||
#endif // GOVERNOR_POD_SCALING_V2_MODULE
|
||||
|
||||
/*******************************************************************************
|
||||
* scaling_limit(df, freq)
|
||||
|
||||
Reference in New Issue
Block a user