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:
Peng Liu
2021-11-10 01:28:10 +00:00
committed by Laxman Dewangan
parent 97ff547e3c
commit 8a2d6e1b54
3 changed files with 159 additions and 4 deletions

View File

@@ -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)