qcacld-3.0: Add PM QoS CPU affinity support on 5.x kernel
Enable PM QoS support for 5.x kernel by adopting dev PM QoS APIs to request device structures for CPUs and then requesting QoS on those CPU devices. Change-Id: I9c7565b44a72145e11178fe360f413ff578142cf CRs-Fixed: 2734025
This commit is contained in:
parent
86fb15e555
commit
c2c66700ac
1
Kbuild
1
Kbuild
@ -3172,6 +3172,7 @@ endif
|
||||
cppflags-$(CONFIG_WLAN_FEATURE_LL_MODE) += -DWLAN_FEATURE_LL_MODE
|
||||
|
||||
cppflags-$(CONFIG_WLAN_CLD_PM_QOS) += -DCLD_PM_QOS
|
||||
cppflags-$(CONFIG_WLAN_CLD_DEV_PM_QOS) += -DCLD_DEV_PM_QOS
|
||||
cppflags-$(CONFIG_REO_DESC_DEFER_FREE) += -DREO_DESC_DEFER_FREE
|
||||
cppflags-$(CONFIG_WLAN_FEATURE_11AX) += -DWLAN_FEATURE_11AX
|
||||
cppflags-$(CONFIG_WLAN_FEATURE_11AX) += -DWLAN_FEATURE_11AX_BSS_COLOR
|
||||
|
@ -513,6 +513,7 @@ CONFIG_RX_OL := y
|
||||
CONFIG_TX_TID_OVERRIDE := y
|
||||
CONFIG_DP_TXRX_SOC_ATTACH := y
|
||||
CONFIG_WLAN_CLD_PM_QOS := y
|
||||
CONFIG_WLAN_CLD_DEV_PM_QOS := y
|
||||
CONFIG_DISABLE_DP_STATS := n
|
||||
CONFIG_MAX_ALLOC_PAGE_SIZE := y
|
||||
CONFIG_REO_DESC_DEFER_FREE := y
|
||||
|
@ -111,8 +111,7 @@
|
||||
#include "qdf_periodic_work.h"
|
||||
#endif
|
||||
|
||||
#if defined(CLD_PM_QOS) && \
|
||||
(LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
|
||||
#ifdef CLD_PM_QOS
|
||||
#include <linux/pm_qos.h>
|
||||
#endif
|
||||
|
||||
@ -1684,6 +1683,8 @@ struct hdd_fw_ver_info {
|
||||
* @rx_aggregation: rx aggregation enable or disable state
|
||||
* @gro_force_flush: gro force flushed indication flag
|
||||
* @current_pcie_gen_speed: current pcie gen speed
|
||||
* @pm_qos_req: pm_qos request for all cpu cores
|
||||
* @qos_cpu_mask: voted cpu core mask
|
||||
*/
|
||||
struct hdd_context {
|
||||
struct wlan_objmgr_psoc *psoc;
|
||||
@ -1993,8 +1994,10 @@ struct hdd_context {
|
||||
|
||||
qdf_time_t runtime_resume_start_time_stamp;
|
||||
qdf_time_t runtime_suspend_done_time_stamp;
|
||||
#if defined(CLD_PM_QOS) && \
|
||||
(LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
|
||||
#if defined(CLD_PM_QOS) && defined(CLD_DEV_PM_QOS)
|
||||
struct dev_pm_qos_request pm_qos_req[NR_CPUS];
|
||||
struct cpumask qos_cpu_mask;
|
||||
#elif defined(CLD_PM_QOS)
|
||||
struct pm_qos_request pm_qos_req;
|
||||
#endif
|
||||
#ifdef WLAN_FEATURE_PKT_CAPTURE
|
||||
|
@ -9106,10 +9106,11 @@ static void hdd_clear_rps_cpu_mask(struct hdd_context *hdd_ctx)
|
||||
hdd_send_rps_disable_ind(adapter);
|
||||
}
|
||||
|
||||
#if defined(CLD_PM_QOS) && \
|
||||
(LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
|
||||
#ifdef CLD_PM_QOS
|
||||
#define PLD_REMOVE_PM_QOS(x)
|
||||
#define PLD_REQUEST_PM_QOS(x, y)
|
||||
#define HDD_PM_QOS_HIGH_TPUT_LATENCY_US 1
|
||||
|
||||
/**
|
||||
* hdd_pm_qos_update_cpu_mask() - Prepare CPU mask for PM_qos voting
|
||||
* @mask: return variable of cpumask for the TPUT
|
||||
@ -9133,6 +9134,18 @@ static inline void hdd_pm_qos_update_cpu_mask(cpumask_t *mask,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef FEATURE_RUNTIME_PM
|
||||
static inline bool hdd_is_dynamic_runtime_pm_enabled(struct hdd_context *hdd_ctx)
|
||||
{
|
||||
return hdd_ctx->config->runtime_pm == hdd_runtime_pm_dynamic;
|
||||
}
|
||||
#else
|
||||
static inline bool hdd_is_dynamic_runtime_pm_enabled(struct hdd_context *hdd_ctx)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef MSM_PLATFORM
|
||||
#define COPY_CPU_MASK(a, b) cpumask_copy(a, b)
|
||||
#define DUMP_CPU_AFFINE() hdd_info("Set cpu_mask %*pb for affine_cores", \
|
||||
@ -9142,6 +9155,7 @@ static inline void hdd_pm_qos_update_cpu_mask(cpumask_t *mask,
|
||||
#define DUMP_CPU_AFFINE() /* no-op*/
|
||||
#endif
|
||||
|
||||
#ifdef CLD_DEV_PM_QOS
|
||||
/**
|
||||
* hdd_pm_qos_update_request() - API to request for pm_qos
|
||||
* @hdd_ctx: handle to hdd context
|
||||
@ -9149,56 +9163,100 @@ static inline void hdd_pm_qos_update_cpu_mask(cpumask_t *mask,
|
||||
*
|
||||
* Return: none
|
||||
*/
|
||||
#ifdef FEATURE_RUNTIME_PM
|
||||
static inline void hdd_pm_qos_update_request(struct hdd_context *hdd_ctx,
|
||||
cpumask_t *pm_qos_cpu_mask)
|
||||
{
|
||||
COPY_CPU_MASK(&hdd_ctx->pm_qos_req.cpus_affine, pm_qos_cpu_mask);
|
||||
int cpu;
|
||||
unsigned int latency;
|
||||
|
||||
cpumask_copy(&hdd_ctx->qos_cpu_mask, pm_qos_cpu_mask);
|
||||
|
||||
/* Latency value to be read from INI */
|
||||
if (cpumask_empty(pm_qos_cpu_mask) &&
|
||||
hdd_ctx->config->runtime_pm == hdd_runtime_pm_dynamic)
|
||||
pm_qos_update_request(&hdd_ctx->pm_qos_req,
|
||||
PM_QOS_DEFAULT_VALUE);
|
||||
hdd_is_dynamic_runtime_pm_enabled(hdd_ctx))
|
||||
latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;
|
||||
else
|
||||
pm_qos_update_request(&hdd_ctx->pm_qos_req, 1);
|
||||
latency = HDD_PM_QOS_HIGH_TPUT_LATENCY_US;
|
||||
|
||||
for_each_cpu(cpu, &hdd_ctx->qos_cpu_mask) {
|
||||
dev_pm_qos_update_request(&hdd_ctx->pm_qos_req[cpu],
|
||||
latency);
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
||||
static inline void hdd_pm_qos_add_request(struct hdd_context *hdd_ctx)
|
||||
{
|
||||
struct device *cpu_dev;
|
||||
int cpu;
|
||||
|
||||
qdf_cpumask_clear(&hdd_ctx->qos_cpu_mask);
|
||||
hdd_pm_qos_update_cpu_mask(&hdd_ctx->qos_cpu_mask, false);
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
cpu_dev = get_cpu_device(cpu);
|
||||
|
||||
dev_pm_qos_add_request(cpu_dev, &hdd_ctx->pm_qos_req[cpu],
|
||||
DEV_PM_QOS_RESUME_LATENCY,
|
||||
PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE);
|
||||
hdd_debug("Set qos_cpu_mask %*pb for affine_cores",
|
||||
cpumask_pr_args(&hdd_ctx->qos_cpu_mask));
|
||||
}
|
||||
}
|
||||
|
||||
static inline void hdd_pm_qos_remove_request(struct hdd_context *hdd_ctx)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
dev_pm_qos_remove_request(&hdd_ctx->pm_qos_req[cpu]);
|
||||
hdd_debug("Remove dev_pm_qos_request for all cpus: %d", cpu);
|
||||
}
|
||||
qdf_cpumask_clear(&hdd_ctx->qos_cpu_mask);
|
||||
}
|
||||
|
||||
#else /* CLD_DEV_PM_QOS */
|
||||
|
||||
/**
|
||||
* hdd_pm_qos_update_request() - API to request for pm_qos
|
||||
* @hdd_ctx: handle to hdd context
|
||||
* @pm_qos_cpu_mask: cpu_mask to apply
|
||||
*
|
||||
* Return: none
|
||||
*/
|
||||
static inline void hdd_pm_qos_update_request(struct hdd_context *hdd_ctx,
|
||||
cpumask_t *pm_qos_cpu_mask)
|
||||
{
|
||||
COPY_CPU_MASK(&hdd_ctx->pm_qos_req.cpus_affine, pm_qos_cpu_mask);
|
||||
|
||||
/* Latency value to be read from INI */
|
||||
if (cpumask_empty(pm_qos_cpu_mask))
|
||||
if (cpumask_empty(pm_qos_cpu_mask) &&
|
||||
hdd_is_dynamic_runtime_pm_enabled(hdd_ctx))
|
||||
pm_qos_update_request(&hdd_ctx->pm_qos_req,
|
||||
PM_QOS_DEFAULT_VALUE);
|
||||
else
|
||||
pm_qos_update_request(&hdd_ctx->pm_qos_req, 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SMP) && defined(MSM_PLATFORM)
|
||||
/**
|
||||
* hdd_update_pm_qos_affine_cores() - Update PM_qos request for AFFINE_CORES
|
||||
* hdd_set_default_pm_qos_mask() - Update PM_qos request for AFFINE_CORES
|
||||
* @hdd_ctx: handle to hdd context
|
||||
*
|
||||
* Return: none
|
||||
*/
|
||||
static inline void hdd_update_pm_qos_affine_cores(struct hdd_context *hdd_ctx)
|
||||
static inline void hdd_set_default_pm_qos_mask(struct hdd_context *hdd_ctx)
|
||||
{
|
||||
hdd_ctx->pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES;
|
||||
qdf_cpumask_clear(&hdd_ctx->pm_qos_req.cpus_affine);
|
||||
hdd_pm_qos_update_cpu_mask(&hdd_ctx->pm_qos_req.cpus_affine, false);
|
||||
}
|
||||
#else
|
||||
static inline void hdd_update_pm_qos_affine_cores(struct hdd_context *hdd_ctx)
|
||||
static inline void hdd_set_default_pm_qos_mask(struct hdd_context *hdd_ctx)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline void hdd_pm_qos_add_request(struct hdd_context *hdd_ctx)
|
||||
{
|
||||
hdd_update_pm_qos_affine_cores(hdd_ctx);
|
||||
hdd_set_default_pm_qos_mask(hdd_ctx);
|
||||
pm_qos_add_request(&hdd_ctx->pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
|
||||
PM_QOS_DEFAULT_VALUE);
|
||||
DUMP_CPU_AFFINE();
|
||||
@ -9208,7 +9266,9 @@ static inline void hdd_pm_qos_remove_request(struct hdd_context *hdd_ctx)
|
||||
{
|
||||
pm_qos_remove_request(&hdd_ctx->pm_qos_req);
|
||||
}
|
||||
#else
|
||||
#endif /* CLD_DEV_PM_QOS */
|
||||
|
||||
#else /* CLD_PM_QOS */
|
||||
#define PLD_REMOVE_PM_QOS(x) pld_remove_pm_qos(x)
|
||||
#define PLD_REQUEST_PM_QOS(x, y) pld_request_pm_qos(x, y)
|
||||
|
||||
@ -9229,7 +9289,7 @@ static inline void hdd_pm_qos_update_request(struct hdd_context *hdd_ctx,
|
||||
cpumask_t *pm_qos_cpu_mask)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
#endif /* CLD_PM_QOS */
|
||||
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0))
|
||||
static inline void hdd_low_tput_gro_flush_skip_check(
|
||||
|
Loading…
Reference in New Issue
Block a user