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