Files
2025-08-12 22:16:57 +02:00

129 lines
2.9 KiB
C
Executable File

/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2023-2024, Qualcomm Innovation Center, Inc. All rights reserved.
*/
#ifndef __QCOM_LPM_H__
#define __QCOM_LPM_H__
#include <linux/cpumask.h>
#define MAX_LPM_CPUS 8
#define MAXSAMPLES 5
#define PRED_TIMER_ADD 100
#define PRED_PREMATURE_CNT 3
#define PRED_REF_STDDEV 500
#define CLUST_SMPL_INVLD_TIME 40000
#define CLUST_BIAS_TIME_MSEC 10
#define MAX_CLUSTER_STATES 4
extern bool sleep_disabled;
extern bool prediction_disabled;
struct qcom_cluster_node {
struct lpm_cluster *cluster;
struct kobject *kobj;
int state_idx;
struct kobj_attribute disable_attr;
struct attribute_group *attr_group;
struct attribute **attrs;
};
struct history_lpm {
int mode[MAXSAMPLES];
uint32_t resi[MAXSAMPLES];
int nsamp;
uint32_t samples_idx;
};
struct history_ipi {
uint32_t interval[MAXSAMPLES];
uint32_t current_ptr;
ktime_t cpu_idle_resched_ts;
};
struct lpm_cpu {
int cpu;
int enable;
int last_idx;
struct notifier_block nb;
struct cpuidle_driver *drv;
struct cpuidle_device *dev;
ktime_t next_wakeup;
uint64_t predicted;
uint32_t history_invalid;
bool predict_started;
bool htmr_wkup;
struct hrtimer histtimer;
struct hrtimer biastimer;
struct history_lpm lpm_history;
struct history_ipi ipi_history;
ktime_t now;
uint64_t bias;
int64_t next_pred_time;
uint32_t pred_type;
bool ipi_pending;
spinlock_t lock;
};
struct cluster_history {
uint64_t residency;
int mode;
uint64_t entry_time;
};
struct lpm_cluster {
struct device *dev;
uint32_t samples_idx;
bool history_invalid;
bool htmr_wkup;
int entry_idx;
int restrict_idx;
int nsamp;
u32 samples_invalid_time;
u32 pred_premature_cnt;
struct cluster_history history[MAXSAMPLES];
struct generic_pm_domain *genpd;
struct qcom_cluster_node *dev_node[MAX_CLUSTER_STATES];
struct kobject *dev_kobj;
struct notifier_block genpd_nb;
struct work_struct work;
struct hrtimer histtimer;
ktime_t entry_time;
ktime_t next_wakeup;
ktime_t pred_wakeup;
ktime_t now;
u64 pred_residency;
bool state_allowed[MAX_CLUSTER_STATES];
struct list_head list;
spinlock_t lock;
bool predicted;
bool initialized;
bool is_timer_expired;
bool is_timer_queued;
bool need_timer_requeue;
bool use_bias_timer;
};
struct cluster_governor {
void (*select)(struct lpm_cpu *cpu_gov);
void (*enable)(void);
void (*disable)(void);
void (*reflect)(struct lpm_cpu *cpu_gov);
};
DECLARE_PER_CPU(struct lpm_cpu, lpm_cpu_data);
int qcom_cluster_lpm_governor_init(void);
void qcom_cluster_lpm_governor_deinit(void);
void clear_cpu_predict_history(void);
int create_global_sysfs_nodes(void);
int create_cluster_sysfs_nodes(struct lpm_cluster *cluster_gov);
void register_cluster_governor_ops(struct cluster_governor *ops);
void remove_global_sysfs_nodes(void);
void remove_cluster_sysfs_nodes(struct lpm_cluster *cluster_gov);
s64 get_cpus_qos(const struct cpumask *mask);
#endif /* __QCOM_LPM_H__ */