Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 | /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ /* * Intel Speed Select Interface: OS to hardware Interface * Copyright (c) 2019, Intel Corporation. * All rights reserved. * * Author: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> */ #ifndef __ISST_IF_H #define __ISST_IF_H #include <linux/types.h> /** * struct isst_if_platform_info - Define platform information * @api_version: Version of the firmware document, which this driver * can communicate * @driver_version: Driver version, which will help user to send right * commands. Even if the firmware is capable, driver may * not be ready * @max_cmds_per_ioctl: Returns the maximum number of commands driver will * accept in a single ioctl * @mbox_supported: Support of mail box interface * @mmio_supported: Support of mmio interface for core-power feature * * Used to return output of IOCTL ISST_IF_GET_PLATFORM_INFO. This * information can be used by the user space, to get the driver, firmware * support and also number of commands to send in a single IOCTL request. */ struct isst_if_platform_info { __u16 api_version; __u16 driver_version; __u16 max_cmds_per_ioctl; __u8 mbox_supported; __u8 mmio_supported; }; /** * struct isst_if_cpu_map - CPU mapping between logical and physical CPU * @logical_cpu: Linux logical CPU number * @physical_cpu: PUNIT CPU number * * Used to convert from Linux logical CPU to PUNIT CPU numbering scheme. * The PUNIT CPU number is different than APIC ID based CPU numbering. */ struct isst_if_cpu_map { __u32 logical_cpu; __u32 physical_cpu; }; /** * struct isst_if_cpu_maps - structure for CPU map IOCTL * @cmd_count: Number of CPU mapping command in cpu_map[] * @cpu_map[]: Holds one or more CPU map data structure * * This structure used with ioctl ISST_IF_GET_PHY_ID to send * one or more CPU mapping commands. Here IOCTL return value indicates * number of commands sent or error number if no commands have been sent. */ struct isst_if_cpu_maps { __u32 cmd_count; struct isst_if_cpu_map cpu_map[1]; }; /** * struct isst_if_io_reg - Read write PUNIT IO register * @read_write: Value 0: Read, 1: Write * @logical_cpu: Logical CPU number to get target PCI device. * @reg: PUNIT register offset * @value: For write operation value to write and for * read placeholder read value * * Structure to specify read/write data to PUNIT registers. */ struct isst_if_io_reg { __u32 read_write; /* Read:0, Write:1 */ __u32 logical_cpu; __u32 reg; __u32 value; }; /** * struct isst_if_io_regs - structure for IO register commands * @cmd_count: Number of io reg commands in io_reg[] * @io_reg[]: Holds one or more io_reg command structure * * This structure used with ioctl ISST_IF_IO_CMD to send * one or more read/write commands to PUNIT. Here IOCTL return value * indicates number of requests sent or error number if no requests have * been sent. */ struct isst_if_io_regs { __u32 req_count; struct isst_if_io_reg io_reg[1]; }; /** * struct isst_if_mbox_cmd - Structure to define mail box command * @logical_cpu: Logical CPU number to get target PCI device * @parameter: Mailbox parameter value * @req_data: Request data for the mailbox * @resp_data: Response data for mailbox command response * @command: Mailbox command value * @sub_command: Mailbox sub command value * @reserved: Unused, set to 0 * * Structure to specify mailbox command to be sent to PUNIT. */ struct isst_if_mbox_cmd { __u32 logical_cpu; __u32 parameter; __u32 req_data; __u32 resp_data; __u16 command; __u16 sub_command; __u32 reserved; }; /** * struct isst_if_mbox_cmds - structure for mailbox commands * @cmd_count: Number of mailbox commands in mbox_cmd[] * @mbox_cmd[]: Holds one or more mbox commands * * This structure used with ioctl ISST_IF_MBOX_COMMAND to send * one or more mailbox commands to PUNIT. Here IOCTL return value * indicates number of commands sent or error number if no commands have * been sent. */ struct isst_if_mbox_cmds { __u32 cmd_count; struct isst_if_mbox_cmd mbox_cmd[1]; }; /** * struct isst_if_msr_cmd - Structure to define msr command * @read_write: Value 0: Read, 1: Write * @logical_cpu: Logical CPU number * @msr: MSR number * @data: For write operation, data to write, for read * place holder * * Structure to specify MSR command related to PUNIT. */ struct isst_if_msr_cmd { __u32 read_write; /* Read:0, Write:1 */ __u32 logical_cpu; __u64 msr; __u64 data; }; /** * struct isst_if_msr_cmds - structure for msr commands * @cmd_count: Number of mailbox commands in msr_cmd[] * @msr_cmd[]: Holds one or more msr commands * * This structure used with ioctl ISST_IF_MSR_COMMAND to send * one or more MSR commands. IOCTL return value indicates number of * commands sent or error number if no commands have been sent. */ struct isst_if_msr_cmds { __u32 cmd_count; struct isst_if_msr_cmd msr_cmd[1]; }; /** * struct isst_core_power - Structure to get/set core_power feature * @get_set: 0: Get, 1: Set * @socket_id: Socket/package id * @power_domain: Power Domain id * @enable: Feature enable status * @priority_type: Priority type for the feature (ordered/proportional) * * Structure to get/set core_power feature state using IOCTL * ISST_IF_CORE_POWER_STATE. */ struct isst_core_power { __u8 get_set; __u8 socket_id; __u8 power_domain_id; __u8 enable; __u8 supported; __u8 priority_type; }; /** * struct isst_clos_param - Structure to get/set clos praram * @get_set: 0: Get, 1: Set * @socket_id: Socket/package id * @power_domain: Power Domain id * clos: Clos ID for the parameters * min_freq_mhz: Minimum frequency in MHz * max_freq_mhz: Maximum frequency in MHz * prop_prio: Proportional priority from 0-15 * * Structure to get/set per clos property using IOCTL * ISST_IF_CLOS_PARAM. */ struct isst_clos_param { __u8 get_set; __u8 socket_id; __u8 power_domain_id; __u8 clos; __u16 min_freq_mhz; __u16 max_freq_mhz; __u8 prop_prio; }; /** * struct isst_if_clos_assoc - Structure to assign clos to a CPU * @socket_id: Socket/package id * @power_domain: Power Domain id * @logical_cpu: CPU number * @clos: Clos ID to assign to the logical CPU * * Structure to get/set core_power feature. */ struct isst_if_clos_assoc { __u8 socket_id; __u8 power_domain_id; __u16 logical_cpu; __u16 clos; }; /** * struct isst_if_clos_assoc_cmds - Structure to assign clos to CPUs * @cmd_count: Number of cmds (cpus) in this request * @get_set: Request is for get or set * @punit_cpu_map: Set to 1 if the CPU number is punit numbering not * Linux CPU number * * Structure used to get/set associate CPUs to clos using IOCTL * ISST_IF_CLOS_ASSOC. */ struct isst_if_clos_assoc_cmds { __u16 cmd_count; __u16 get_set; __u16 punit_cpu_map; struct isst_if_clos_assoc assoc_info[1]; }; /** * struct isst_tpmi_instance_count - Get number of TPMI instances per socket * @socket_id: Socket/package id * @count: Number of instances * @valid_mask: Mask of instances as there can be holes * * Structure used to get TPMI instances information using * IOCTL ISST_IF_COUNT_TPMI_INSTANCES. */ struct isst_tpmi_instance_count { __u8 socket_id; __u8 count; __u16 valid_mask; }; /** * struct isst_perf_level_info - Structure to get information on SST-PP levels * @socket_id: Socket/package id * @power_domain: Power Domain id * @logical_cpu: CPU number * @clos: Clos ID to assign to the logical CPU * @max_level: Maximum performance level supported by the platform * @feature_rev: The feature revision for SST-PP supported by the platform * @level_mask: Mask of supported performance levels * @current_level: Current performance level * @feature_state: SST-BF and SST-TF (enabled/disabled) status at current level * @locked: SST-PP performance level change is locked/unlocked * @enabled: SST-PP feature is enabled or not * @sst-tf_support: SST-TF support status at this level * @sst-bf_support: SST-BF support status at this level * * Structure to get SST-PP details using IOCTL ISST_IF_PERF_LEVELS. */ struct isst_perf_level_info { __u8 socket_id; __u8 power_domain_id; __u8 max_level; __u8 feature_rev; __u8 level_mask; __u8 current_level; __u8 feature_state; __u8 locked; __u8 enabled; __u8 sst_tf_support; __u8 sst_bf_support; }; /** * struct isst_perf_level_control - Structure to set SST-PP level * @socket_id: Socket/package id * @power_domain: Power Domain id * @level: level to set * * Structure used change SST-PP level using IOCTL ISST_IF_PERF_SET_LEVEL. */ struct isst_perf_level_control { __u8 socket_id; __u8 power_domain_id; __u8 level; }; /** * struct isst_perf_feature_control - Structure to activate SST-BF/SST-TF * @socket_id: Socket/package id * @power_domain: Power Domain id * @feature: bit 0 = SST-BF state, bit 1 = SST-TF state * * Structure used to enable SST-BF/SST-TF using IOCTL ISST_IF_PERF_SET_FEATURE. */ struct isst_perf_feature_control { __u8 socket_id; __u8 power_domain_id; __u8 feature; }; #define TRL_MAX_BUCKETS 8 #define TRL_MAX_LEVELS 6 /** * struct isst_perf_level_data_info - Structure to get SST-PP level details * @socket_id: Socket/package id * @power_domain: Power Domain id * @level: SST-PP level for which caller wants to get information * @tdp_ratio: TDP Ratio * @base_freq_mhz: Base frequency in MHz * @base_freq_avx2_mhz: AVX2 Base frequency in MHz * @base_freq_avx512_mhz: AVX512 base frequency in MHz * @base_freq_amx_mhz: AMX base frequency in MHz * @thermal_design_power_w: Thermal design (TDP) power * @tjunction_max_c: Max junction temperature * @max_memory_freq_mhz: Max memory frequency in MHz * @cooling_type: Type of cooling is used * @p0_freq_mhz: core maximum frequency * @p1_freq_mhz: Core TDP frequency * @pn_freq_mhz: Core maximum efficiency frequency * @pm_freq_mhz: Core minimum frequency * @p0_fabric_freq_mhz: Fabric (Uncore) maximum frequency * @p1_fabric_freq_mhz: Fabric (Uncore) TDP frequency * @pn_fabric_freq_mhz: Fabric (Uncore) minimum efficiency frequency * @pm_fabric_freq_mhz: Fabric (Uncore) minimum frequency * @max_buckets: Maximum trl buckets * @max_trl_levels: Maximum trl levels * @bucket_core_counts[TRL_MAX_BUCKETS]: Number of cores per bucket * @trl_freq_mhz[TRL_MAX_LEVELS][TRL_MAX_BUCKETS]: maximum frequency * for a bucket and trl level * * Structure used to get information on frequencies and TDP for a SST-PP * level using ISST_IF_GET_PERF_LEVEL_INFO. */ struct isst_perf_level_data_info { __u8 socket_id; __u8 power_domain_id; __u16 level; __u16 tdp_ratio; __u16 base_freq_mhz; __u16 base_freq_avx2_mhz; __u16 base_freq_avx512_mhz; __u16 base_freq_amx_mhz; __u16 thermal_design_power_w; __u16 tjunction_max_c; __u16 max_memory_freq_mhz; __u16 cooling_type; __u16 p0_freq_mhz; __u16 p1_freq_mhz; __u16 pn_freq_mhz; __u16 pm_freq_mhz; __u16 p0_fabric_freq_mhz; __u16 p1_fabric_freq_mhz; __u16 pn_fabric_freq_mhz; __u16 pm_fabric_freq_mhz; __u16 max_buckets; __u16 max_trl_levels; __u16 bucket_core_counts[TRL_MAX_BUCKETS]; __u16 trl_freq_mhz[TRL_MAX_LEVELS][TRL_MAX_BUCKETS]; }; /** * struct isst_perf_level_cpu_mask - Structure to get SST-PP level CPU mask * @socket_id: Socket/package id * @power_domain: Power Domain id * @level: SST-PP level for which caller wants to get information * @punit_cpu_map: Set to 1 if the CPU number is punit numbering not * Linux CPU number. If 0 CPU buffer is copied to user space * supplied cpu_buffer of size cpu_buffer_size. Punit * cpu mask is copied to "mask" field. * @mask: cpu mask for this PP level (punit CPU numbering) * @cpu_buffer_size: size of cpu_buffer also used to return the copied CPU * buffer size. * @cpu_buffer: Buffer to copy CPU mask when punit_cpu_map is 0 * * Structure used to get cpumask for a SST-PP level using * IOCTL ISST_IF_GET_PERF_LEVEL_CPU_MASK. Also used to get CPU mask for * IOCTL ISST_IF_GET_BASE_FREQ_CPU_MASK for SST-BF. */ struct isst_perf_level_cpu_mask { __u8 socket_id; __u8 power_domain_id; __u8 level; __u8 punit_cpu_map; __u64 mask; __u16 cpu_buffer_size; __s8 cpu_buffer[1]; }; /** * struct isst_base_freq_info - Structure to get SST-BF frequencies * @socket_id: Socket/package id * @power_domain: Power Domain id * @level: SST-PP level for which caller wants to get information * @high_base_freq_mhz: High priority CPU base frequency * @low_base_freq_mhz: Low priority CPU base frequency * @tjunction_max_c: Max junction temperature * @thermal_design_power_w: Thermal design power in watts * * Structure used to get SST-BF information using * IOCTL ISST_IF_GET_BASE_FREQ_INFO. */ struct isst_base_freq_info { __u8 socket_id; __u8 power_domain_id; __u16 level; __u16 high_base_freq_mhz; __u16 low_base_freq_mhz; __u16 tjunction_max_c; __u16 thermal_design_power_w; }; /** * struct isst_turbo_freq_info - Structure to get SST-TF frequencies * @socket_id: Socket/package id * @power_domain: Power Domain id * @level: SST-PP level for which caller wants to get information * @max_clip_freqs: Maximum number of low priority core clipping frequencies * @lp_clip_freq_mhz: Clip frequencies per trl level * @bucket_core_counts: Maximum number of cores for a bucket * @trl_freq_mhz: Frequencies per trl level for each bucket * * Structure used to get SST-TF information using * IOCTL ISST_IF_GET_TURBO_FREQ_INFO. */ struct isst_turbo_freq_info { __u8 socket_id; __u8 power_domain_id; __u16 level; __u16 max_clip_freqs; __u16 max_buckets; __u16 max_trl_levels; __u16 lp_clip_freq_mhz[TRL_MAX_LEVELS]; __u16 bucket_core_counts[TRL_MAX_BUCKETS]; __u16 trl_freq_mhz[TRL_MAX_LEVELS][TRL_MAX_BUCKETS]; }; #define ISST_IF_MAGIC 0xFE #define ISST_IF_GET_PLATFORM_INFO _IOR(ISST_IF_MAGIC, 0, struct isst_if_platform_info *) #define ISST_IF_GET_PHY_ID _IOWR(ISST_IF_MAGIC, 1, struct isst_if_cpu_map *) #define ISST_IF_IO_CMD _IOW(ISST_IF_MAGIC, 2, struct isst_if_io_regs *) #define ISST_IF_MBOX_COMMAND _IOWR(ISST_IF_MAGIC, 3, struct isst_if_mbox_cmds *) #define ISST_IF_MSR_COMMAND _IOWR(ISST_IF_MAGIC, 4, struct isst_if_msr_cmds *) #define ISST_IF_COUNT_TPMI_INSTANCES _IOR(ISST_IF_MAGIC, 5, struct isst_tpmi_instance_count *) #define ISST_IF_CORE_POWER_STATE _IOWR(ISST_IF_MAGIC, 6, struct isst_core_power *) #define ISST_IF_CLOS_PARAM _IOWR(ISST_IF_MAGIC, 7, struct isst_clos_param *) #define ISST_IF_CLOS_ASSOC _IOWR(ISST_IF_MAGIC, 8, struct isst_if_clos_assoc_cmds *) #define ISST_IF_PERF_LEVELS _IOWR(ISST_IF_MAGIC, 9, struct isst_perf_level_info *) #define ISST_IF_PERF_SET_LEVEL _IOW(ISST_IF_MAGIC, 10, struct isst_perf_level_control *) #define ISST_IF_PERF_SET_FEATURE _IOW(ISST_IF_MAGIC, 11, struct isst_perf_feature_control *) #define ISST_IF_GET_PERF_LEVEL_INFO _IOR(ISST_IF_MAGIC, 12, struct isst_perf_level_data_info *) #define ISST_IF_GET_PERF_LEVEL_CPU_MASK _IOR(ISST_IF_MAGIC, 13, struct isst_perf_level_cpu_mask *) #define ISST_IF_GET_BASE_FREQ_INFO _IOR(ISST_IF_MAGIC, 14, struct isst_base_freq_info *) #define ISST_IF_GET_BASE_FREQ_CPU_MASK _IOR(ISST_IF_MAGIC, 15, struct isst_perf_level_cpu_mask *) #define ISST_IF_GET_TURBO_FREQ_INFO _IOR(ISST_IF_MAGIC, 16, struct isst_turbo_freq_info *) #endif |