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 77