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