1dbce412aSSrinivas Pandruvada /* SPDX-License-Identifier: GPL-2.0 */
2dbce412aSSrinivas Pandruvada /*
3dbce412aSSrinivas Pandruvada  * Intel Uncore Frequency Control: Common defines and prototypes
4dbce412aSSrinivas Pandruvada  * Copyright (c) 2022, Intel Corporation.
5dbce412aSSrinivas Pandruvada  * All rights reserved.
6dbce412aSSrinivas Pandruvada  *
7dbce412aSSrinivas Pandruvada  */
8dbce412aSSrinivas Pandruvada 
9dbce412aSSrinivas Pandruvada #ifndef __INTEL_UNCORE_FREQ_COMMON_H
10dbce412aSSrinivas Pandruvada #define __INTEL_UNCORE_FREQ_COMMON_H
11dbce412aSSrinivas Pandruvada 
12dbce412aSSrinivas Pandruvada #include <linux/device.h>
13dbce412aSSrinivas Pandruvada 
14dbce412aSSrinivas Pandruvada /**
15dbce412aSSrinivas Pandruvada  * struct uncore_data - Encapsulate all uncore data
16dbce412aSSrinivas Pandruvada  * @stored_uncore_data: Last user changed MSR 620 value, which will be restored
17dbce412aSSrinivas Pandruvada  *			on system resume.
18dbce412aSSrinivas Pandruvada  * @initial_min_freq_khz: Sampled minimum uncore frequency at driver init
19dbce412aSSrinivas Pandruvada  * @initial_max_freq_khz: Sampled maximum uncore frequency at driver init
20dbce412aSSrinivas Pandruvada  * @control_cpu:	Designated CPU for a die to read/write
21dbce412aSSrinivas Pandruvada  * @valid:		Mark the data valid/invalid
22dbce412aSSrinivas Pandruvada  * @package_id:	Package id for this instance
23dbce412aSSrinivas Pandruvada  * @die_id:		Die id for this instance
249b8dea80SSrinivas Pandruvada  * @domain_id:		Power domain id for this instance
259b8dea80SSrinivas Pandruvada  * @cluster_id:		cluster id in a domain
269b8dea80SSrinivas Pandruvada  * @instance_id:	Unique instance id to append to directory name
27dbce412aSSrinivas Pandruvada  * @name:		Sysfs entry name for this instance
28dbce412aSSrinivas Pandruvada  * @uncore_attr_group:	Attribute group storage
29*ace6fb9dSNathan Chancellor  * @max_freq_khz_kobj_attr: Storage for kobject attribute max_freq_khz
30*ace6fb9dSNathan Chancellor  * @mix_freq_khz_kobj_attr: Storage for kobject attribute min_freq_khz
31*ace6fb9dSNathan Chancellor  * @initial_max_freq_khz_kobj_attr: Storage for kobject attribute initial_max_freq_khz
32*ace6fb9dSNathan Chancellor  * @initial_min_freq_khz_kobj_attr: Storage for kobject attribute initial_min_freq_khz
33*ace6fb9dSNathan Chancellor  * @current_freq_khz_kobj_attr: Storage for kobject attribute current_freq_khz
34*ace6fb9dSNathan Chancellor  * @domain_id_kobj_attr: Storage for kobject attribute domain_id
35*ace6fb9dSNathan Chancellor  * @fabric_cluster_id_kobj_attr: Storage for kobject attribute fabric_cluster_id
36*ace6fb9dSNathan Chancellor  * @package_id_kobj_attr: Storage for kobject attribute package_id
37dbce412aSSrinivas Pandruvada  * @uncore_attrs:	Attribute storage for group creation
38dbce412aSSrinivas Pandruvada  *
39dbce412aSSrinivas Pandruvada  * This structure is used to encapsulate all data related to uncore sysfs
40dbce412aSSrinivas Pandruvada  * settings for a die/package.
41dbce412aSSrinivas Pandruvada  */
42dbce412aSSrinivas Pandruvada struct uncore_data {
43dbce412aSSrinivas Pandruvada 	u64 stored_uncore_data;
44dbce412aSSrinivas Pandruvada 	u32 initial_min_freq_khz;
45dbce412aSSrinivas Pandruvada 	u32 initial_max_freq_khz;
46dbce412aSSrinivas Pandruvada 	int control_cpu;
47dbce412aSSrinivas Pandruvada 	bool valid;
48dbce412aSSrinivas Pandruvada 	int package_id;
49dbce412aSSrinivas Pandruvada 	int die_id;
509b8dea80SSrinivas Pandruvada 	int domain_id;
519b8dea80SSrinivas Pandruvada 	int cluster_id;
529b8dea80SSrinivas Pandruvada 	int instance_id;
53dbce412aSSrinivas Pandruvada 	char name[32];
54dbce412aSSrinivas Pandruvada 
55dbce412aSSrinivas Pandruvada 	struct attribute_group uncore_attr_group;
56*ace6fb9dSNathan Chancellor 	struct kobj_attribute max_freq_khz_kobj_attr;
57*ace6fb9dSNathan Chancellor 	struct kobj_attribute min_freq_khz_kobj_attr;
58*ace6fb9dSNathan Chancellor 	struct kobj_attribute initial_max_freq_khz_kobj_attr;
59*ace6fb9dSNathan Chancellor 	struct kobj_attribute initial_min_freq_khz_kobj_attr;
60*ace6fb9dSNathan Chancellor 	struct kobj_attribute current_freq_khz_kobj_attr;
61*ace6fb9dSNathan Chancellor 	struct kobj_attribute domain_id_kobj_attr;
62*ace6fb9dSNathan Chancellor 	struct kobj_attribute fabric_cluster_id_kobj_attr;
63*ace6fb9dSNathan Chancellor 	struct kobj_attribute package_id_kobj_attr;
649b8dea80SSrinivas Pandruvada 	struct attribute *uncore_attrs[9];
65dbce412aSSrinivas Pandruvada };
66dbce412aSSrinivas Pandruvada 
679b8dea80SSrinivas Pandruvada #define UNCORE_DOMAIN_ID_INVALID	-1
689b8dea80SSrinivas Pandruvada 
69dbce412aSSrinivas Pandruvada int uncore_freq_common_init(int (*read_control_freq)(struct uncore_data *data, unsigned int *min, unsigned int *max),
70dbce412aSSrinivas Pandruvada 			     int (*write_control_freq)(struct uncore_data *data, unsigned int input, unsigned int min_max),
71dbce412aSSrinivas Pandruvada 			     int (*uncore_read_freq)(struct uncore_data *data, unsigned int *freq));
72dbce412aSSrinivas Pandruvada void uncore_freq_common_exit(void);
73dbce412aSSrinivas Pandruvada int uncore_freq_add_entry(struct uncore_data *data, int cpu);
74dbce412aSSrinivas Pandruvada void uncore_freq_remove_die_entry(struct uncore_data *data);
75dbce412aSSrinivas Pandruvada 
76dbce412aSSrinivas Pandruvada #endif
77