blob: e5b4b8bd32755dd9a2874b45a184c5c17117898f [file] [log] [blame]
James Feist6714a252018-09-10 15:26:18 -07001/* SPDX-License-Identifier: GPL-2.0 */
Jae Hyun Yoob9122032019-12-23 15:34:59 -08002/* Copyright (c) 2018-2019 Intel Corporation */
James Feist6714a252018-09-10 15:26:18 -07003
James Feist582be092018-11-27 10:54:59 -08004// clang-format off
5
James Feist6714a252018-09-10 15:26:18 -07006#ifndef __PECI_IOCTL_H
7#define __PECI_IOCTL_H
8
9#include <linux/ioctl.h>
10#include <linux/types.h>
11
Jae Hyun Yoob9122032019-12-23 15:34:59 -080012/* The PECI client's default address of 0x30 */
13#define PECI_BASE_ADDR 0x30
James Feist6714a252018-09-10 15:26:18 -070014
Jae Hyun Yoob9122032019-12-23 15:34:59 -080015/* Max number of CPU clients */
16#define PECI_OFFSET_MAX 8
James Feist6714a252018-09-10 15:26:18 -070017
Jae Hyun Yoob9122032019-12-23 15:34:59 -080018/* PECI read/write data buffer size max */
19#define PECI_BUFFER_SIZE 255
James Feist6714a252018-09-10 15:26:18 -070020
Jae Hyun Yoob9122032019-12-23 15:34:59 -080021/* Device Specific Completion Code (CC) Definition */
22#define PECI_DEV_CC_SUCCESS 0x40
23#define PECI_DEV_CC_NEED_RETRY 0x80
24#define PECI_DEV_CC_OUT_OF_RESOURCE 0x81
25#define PECI_DEV_CC_UNAVAIL_RESOURCE 0x82
26#define PECI_DEV_CC_INVALID_REQ 0x90
27#define PECI_DEV_CC_MCA_ERROR 0x91
28#define PECI_DEV_CC_CATASTROPHIC_MCA_ERROR 0x93
29#define PECI_DEV_CC_FATAL_MCA_DETECTED 0x94
30#define PECI_DEV_CC_PARITY_ERROR_ON_GPSB_OR_PMSB 0x98
31#define PECI_DEV_CC_PARITY_ERROR_ON_GPSB_OR_PMSB_IERR 0x9B
32#define PECI_DEV_CC_PARITY_ERROR_ON_GPSB_OR_PMSB_MCA 0x9C
James Feist6714a252018-09-10 15:26:18 -070033
Jae Hyun Yoob9122032019-12-23 15:34:59 -080034/* Completion Code mask to check retry needs */
35#define PECI_DEV_CC_RETRY_CHECK_MASK 0xf0
James Feist6714a252018-09-10 15:26:18 -070036
Jae Hyun Yoob9122032019-12-23 15:34:59 -080037#define PECI_DEV_RETRY_TIMEOUT msecs_to_jiffies(700)
38#define PECI_DEV_RETRY_INTERVAL_MIN_MSEC 1
39#define PECI_DEV_RETRY_INTERVAL_MAX_MSEC 128
40#define PECI_DEV_RETRY_BIT 0x01
James Feist6714a252018-09-10 15:26:18 -070041
Jae Hyun Yoob9122032019-12-23 15:34:59 -080042/**
43 * enum peci_cmd - PECI client commands
44 * @PECI_CMD_XFER: raw PECI transfer
45 * @PECI_CMD_PING: ping, a required message for all PECI devices
46 * @PECI_CMD_GET_DIB: get DIB (Device Info Byte)
47 * @PECI_CMD_GET_TEMP: get maximum die temperature
48 * @PECI_CMD_RD_PKG_CFG: read access to the PCS (Package Configuration Space)
49 * @PECI_CMD_WR_PKG_CFG: write access to the PCS (Package Configuration Space)
50 * @PECI_CMD_RD_IA_MSR: read access to MSRs (Model Specific Registers)
51 * @PECI_CMD_WR_IA_MSR: write access to MSRs (Model Specific Registers)
52 * @PECI_CMD_RD_IA_MSREX: read access to MSRs (Model Specific Registers)
53 * @PECI_CMD_RD_PCI_CFG: sideband read access to the PCI configuration space
54 * maintained in downstream devices external to the processor
55 * @PECI_CMD_WR_PCI_CFG: sideband write access to the PCI configuration space
56 * maintained in downstream devices external to the processor
57 * @PECI_CMD_RD_PCI_CFG_LOCAL: sideband read access to the PCI configuration
58 * space that resides within the processor
59 * @PECI_CMD_WR_PCI_CFG_LOCAL: sideband write access to the PCI configuration
60 * space that resides within the processor
61 *
62 * Available commands depend on client's PECI revision.
63 */
James Feist6714a252018-09-10 15:26:18 -070064enum peci_cmd {
65 PECI_CMD_XFER = 0,
66 PECI_CMD_PING,
67 PECI_CMD_GET_DIB,
68 PECI_CMD_GET_TEMP,
69 PECI_CMD_RD_PKG_CFG,
70 PECI_CMD_WR_PKG_CFG,
71 PECI_CMD_RD_IA_MSR,
72 PECI_CMD_WR_IA_MSR,
Jae Hyun Yoob9122032019-12-23 15:34:59 -080073 PECI_CMD_RD_IA_MSREX,
James Feist6714a252018-09-10 15:26:18 -070074 PECI_CMD_RD_PCI_CFG,
75 PECI_CMD_WR_PCI_CFG,
76 PECI_CMD_RD_PCI_CFG_LOCAL,
77 PECI_CMD_WR_PCI_CFG_LOCAL,
Jae Hyun Yoob9122032019-12-23 15:34:59 -080078 PECI_CMD_RD_END_PT_CFG,
79 PECI_CMD_WR_END_PT_CFG,
James Feist6714a252018-09-10 15:26:18 -070080 PECI_CMD_CRASHDUMP_DISC,
81 PECI_CMD_CRASHDUMP_GET_FRAME,
82 PECI_CMD_MAX
83};
84
Jae Hyun Yoob9122032019-12-23 15:34:59 -080085/**
86 * struct peci_xfer_msg - raw PECI transfer command
87 * @addr; address of the client
88 * @tx_len: number of data to be written in bytes
89 * @rx_len: number of data to be read in bytes
90 * @tx_buf: data to be written, or NULL
91 * @rx_buf: data to be read, or NULL
92 *
93 * raw PECI transfer
94 */
95struct peci_xfer_msg {
96 __u8 addr;
97 __u8 tx_len;
98 __u8 rx_len;
99 __u8 padding;
100 __u8 *tx_buf;
101 __u8 *rx_buf;
102} __attribute__((__packed__));
103
104/**
105 * struct peci_ping_msg - ping command
106 * @addr: address of the client
107 *
108 * Ping() is a required message for all PECI devices. This message is used to
109 * enumerate devices or determine if a device has been removed, been
110 * powered-off, etc.
111 */
James Feist6714a252018-09-10 15:26:18 -0700112struct peci_ping_msg {
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800113 __u8 addr;
114 __u8 padding[3];
James Feist6714a252018-09-10 15:26:18 -0700115} __attribute__((__packed__));
116
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800117/**
118 * struct peci_get_dib_msg - GetDIB command
119 * @addr: address of the client
120 * @dib: DIB data to be read
121 *
122 * The processor PECI client implementation of GetDIB() includes an 8-byte
123 * response and provides information regarding client revision number and the
124 * number of supported domains. All processor PECI clients support the GetDIB()
125 * command.
126 */
James Feist6714a252018-09-10 15:26:18 -0700127struct peci_get_dib_msg {
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800128#define PECI_GET_DIB_WR_LEN 1
129#define PECI_GET_DIB_RD_LEN 8
130#define PECI_GET_DIB_CMD 0xf7
131
132 __u8 addr;
133 __u8 padding[3];
134 __u64 dib;
James Feist6714a252018-09-10 15:26:18 -0700135} __attribute__((__packed__));
136
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800137/**
138 * struct peci_get_temp_msg - GetTemp command
139 * @addr: address of the client
140 * @temp_raw: raw temperature data to be read
141 *
142 * The GetTemp() command is used to retrieve the maximum die temperature from a
143 * target PECI address. The temperature is used by the external thermal
144 * management system to regulate the temperature on the die. The data is
145 * returned as a negative value representing the number of degrees centigrade
146 * below the maximum processor junction temperature.
147 */
James Feist6714a252018-09-10 15:26:18 -0700148struct peci_get_temp_msg {
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800149#define PECI_GET_TEMP_WR_LEN 1
150#define PECI_GET_TEMP_RD_LEN 2
151#define PECI_GET_TEMP_CMD 0x01
152
153 __u8 addr;
154 __u8 padding;
155 __s16 temp_raw;
James Feist6714a252018-09-10 15:26:18 -0700156} __attribute__((__packed__));
157
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800158/**
159 * struct peci_rd_pkg_cfg_msg - RdPkgConfig command
160 * @addr: address of the client
161 * @index: encoding index for the requested service
162 * @param: specific data being requested
163 * @rx_len: number of data to be read in bytes
164 * @cc: completion code
165 * @pkg_config: package config data to be read
166 *
167 * The RdPkgConfig() command provides read access to the Package Configuration
168 * Space (PCS) within the processor, including various power and thermal
169 * management functions. Typical PCS read services supported by the processor
170 * may include access to temperature data, energy status, run time information,
171 * DIMM temperatures and so on.
172 */
James Feist6714a252018-09-10 15:26:18 -0700173struct peci_rd_pkg_cfg_msg {
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800174#define PECI_RDPKGCFG_WRITE_LEN 5
175#define PECI_RDPKGCFG_READ_LEN_BASE 1
176#define PECI_RDPKGCFG_CMD 0xa1
177
178 __u8 addr;
179 __u8 index;
180#define PECI_MBX_INDEX_CPU_ID 0 /* Package Identifier Read */
181#define PECI_MBX_INDEX_VR_DEBUG 1 /* VR Debug */
182#define PECI_MBX_INDEX_PKG_TEMP_READ 2 /* Package Temperature Read */
183#define PECI_MBX_INDEX_ENERGY_COUNTER 3 /* Energy counter */
184#define PECI_MBX_INDEX_ENERGY_STATUS 4 /* DDR Energy Status */
185#define PECI_MBX_INDEX_WAKE_MODE_BIT 5 /* "Wake on PECI" Mode bit */
186#define PECI_MBX_INDEX_EPI 6 /* Efficient Performance Indication */
187#define PECI_MBX_INDEX_PKG_RAPL_PERF 8 /* Pkg RAPL Performance Status Read */
188#define PECI_MBX_INDEX_PER_CORE_DTS_TEMP 9 /* Per Core DTS Temperature Read */
189#define PECI_MBX_INDEX_DTS_MARGIN 10 /* DTS thermal margin */
190#define PECI_MBX_INDEX_SKT_PWR_THRTL_DUR 11 /* Socket Power Throttled Duration */
191#define PECI_MBX_INDEX_CFG_TDP_CONTROL 12 /* TDP Config Control */
192#define PECI_MBX_INDEX_CFG_TDP_LEVELS 13 /* TDP Config Levels */
193#define PECI_MBX_INDEX_DDR_DIMM_TEMP 14 /* DDR DIMM Temperature */
194#define PECI_MBX_INDEX_CFG_ICCMAX 15 /* Configurable ICCMAX */
195#define PECI_MBX_INDEX_TEMP_TARGET 16 /* Temperature Target Read */
196#define PECI_MBX_INDEX_CURR_CFG_LIMIT 17 /* Current Config Limit */
197#define PECI_MBX_INDEX_DIMM_TEMP_READ 20 /* Package Thermal Status Read */
198#define PECI_MBX_INDEX_DRAM_IMC_TMP_READ 22 /* DRAM IMC Temperature Read */
199#define PECI_MBX_INDEX_DDR_CH_THERM_STAT 23 /* DDR Channel Thermal Status */
200#define PECI_MBX_INDEX_PKG_POWER_LIMIT1 26 /* Package Power Limit1 */
201#define PECI_MBX_INDEX_PKG_POWER_LIMIT2 27 /* Package Power Limit2 */
202#define PECI_MBX_INDEX_TDP 28 /* Thermal design power minimum */
203#define PECI_MBX_INDEX_TDP_HIGH 29 /* Thermal design power maximum */
204#define PECI_MBX_INDEX_TDP_UNITS 30 /* Units for power/energy registers */
205#define PECI_MBX_INDEX_RUN_TIME 31 /* Accumulated Run Time */
206#define PECI_MBX_INDEX_CONSTRAINED_TIME 32 /* Thermally Constrained Time Read */
207#define PECI_MBX_INDEX_TURBO_RATIO 33 /* Turbo Activation Ratio */
208#define PECI_MBX_INDEX_DDR_RAPL_PL1 34 /* DDR RAPL PL1 */
209#define PECI_MBX_INDEX_DDR_PWR_INFO_HIGH 35 /* DRAM Power Info Read (high) */
210#define PECI_MBX_INDEX_DDR_PWR_INFO_LOW 36 /* DRAM Power Info Read (low) */
211#define PECI_MBX_INDEX_DDR_RAPL_PL2 37 /* DDR RAPL PL2 */
212#define PECI_MBX_INDEX_DDR_RAPL_STATUS 38 /* DDR RAPL Performance Status */
213#define PECI_MBX_INDEX_DDR_HOT_ABSOLUTE 43 /* DDR Hottest Dimm Absolute Temp */
214#define PECI_MBX_INDEX_DDR_HOT_RELATIVE 44 /* DDR Hottest Dimm Relative Temp */
215#define PECI_MBX_INDEX_DDR_THROTTLE_TIME 45 /* DDR Throttle Time */
216#define PECI_MBX_INDEX_DDR_THERM_STATUS 46 /* DDR Thermal Status */
217#define PECI_MBX_INDEX_TIME_AVG_TEMP 47 /* Package time-averaged temperature */
218#define PECI_MBX_INDEX_TURBO_RATIO_LIMIT 49 /* Turbo Ratio Limit Read */
219#define PECI_MBX_INDEX_HWP_AUTO_OOB 53 /* HWP Autonomous Out-of-band */
220#define PECI_MBX_INDEX_DDR_WARM_BUDGET 55 /* DDR Warm Power Budget */
221#define PECI_MBX_INDEX_DDR_HOT_BUDGET 56 /* DDR Hot Power Budget */
222#define PECI_MBX_INDEX_PKG_PSYS_PWR_LIM3 57 /* Package/Psys Power Limit3 */
223#define PECI_MBX_INDEX_PKG_PSYS_PWR_LIM1 58 /* Package/Psys Power Limit1 */
224#define PECI_MBX_INDEX_PKG_PSYS_PWR_LIM2 59 /* Package/Psys Power Limit2 */
225#define PECI_MBX_INDEX_PKG_PSYS_PWR_LIM4 60 /* Package/Psys Power Limit4 */
226#define PECI_MBX_INDEX_PERF_LIMIT_REASON 65 /* Performance Limit Reasons */
227
228 __u16 param;
229/* When index is PECI_MBX_INDEX_CPU_ID */
230#define PECI_PKG_ID_CPU_ID 0x0000 /* CPUID Info */
231#define PECI_PKG_ID_PLATFORM_ID 0x0001 /* Platform ID */
232#define PECI_PKG_ID_UNCORE_ID 0x0002 /* Uncore Device ID */
233#define PECI_PKG_ID_MAX_THREAD_ID 0x0003 /* Max Thread ID */
234#define PECI_PKG_ID_MICROCODE_REV 0x0004 /* CPU Microcode Update Revision */
235#define PECI_PKG_ID_MACHINE_CHECK_STATUS 0x0005 /* Machine Check Status */
236
237 __u8 rx_len;
238 __u8 cc;
239 __u8 padding[2];
240 __u8 pkg_config[4];
James Feist6714a252018-09-10 15:26:18 -0700241} __attribute__((__packed__));
242
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800243/**
244 * struct peci_wr_pkg_cfg_msg - WrPkgConfig command
245 * @addr: address of the client
246 * @index: encoding index for the requested service
247 * @param: specific data being requested
248 * @tx_len: number of data to be written in bytes
249 * @cc: completion code
250 * @value: package config data to be written
251 *
252 * The WrPkgConfig() command provides write access to the Package Configuration
253 * Space (PCS) within the processor, including various power and thermal
254 * management functions. Typical PCS write services supported by the processor
255 * may include power limiting, thermal averaging constant programming and so
256 * on.
257 */
James Feist6714a252018-09-10 15:26:18 -0700258struct peci_wr_pkg_cfg_msg {
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800259#define PECI_WRPKGCFG_WRITE_LEN_BASE 6
260#define PECI_WRPKGCFG_READ_LEN 1
261#define PECI_WRPKGCFG_CMD 0xa5
262
263 __u8 addr;
264 __u8 index;
265#define PECI_MBX_INDEX_DIMM_AMBIENT 19
266#define PECI_MBX_INDEX_DIMM_TEMP 24
267
268 __u16 param;
269 __u8 tx_len;
270 __u8 cc;
271 __u8 padding[2];
272 __u32 value;
James Feist6714a252018-09-10 15:26:18 -0700273} __attribute__((__packed__));
274
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800275/**
276 * struct peci_rd_ia_msr_msg - RdIAMSR command
277 * @addr: address of the client
278 * @thread_id: ID of the specific logical processor
279 * @address: address of MSR to read from
280 * @cc: completion code
281 * @value: data to be read
282 *
283 * The RdIAMSR() PECI command provides read access to Model Specific Registers
284 * (MSRs) defined in the processor's Intel Architecture (IA).
285 */
James Feist6714a252018-09-10 15:26:18 -0700286struct peci_rd_ia_msr_msg {
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800287#define PECI_RDIAMSR_WRITE_LEN 5
288#define PECI_RDIAMSR_READ_LEN 9
289#define PECI_RDIAMSR_CMD 0xb1
290
291 __u8 addr;
292 __u8 thread_id;
293 __u16 address;
294 __u8 cc;
295 __u8 padding[3];
296 __u64 value;
James Feist6714a252018-09-10 15:26:18 -0700297} __attribute__((__packed__));
298
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800299/**
300 * struct peci_wr_ia_msr_msg - WrIAMSR command
301 * @addr: address of the client
302 * @thread_id: ID of the specific logical processor
303 * @address: address of MSR to write to
304 * @tx_len: number of data to be written in bytes
305 * @cc: completion code
306 * @value: data to be written
307 *
308 * The WrIAMSR() PECI command provides write access to Model Specific Registers
309 * (MSRs) defined in the processor's Intel Architecture (IA).
310 */
311struct peci_wr_ia_msr_msg {
312#define PECI_WRIAMSR_CMD 0xb5
313
314 __u8 addr;
315 __u8 thread_id;
316 __u16 address;
317 __u8 tx_len;
318 __u8 cc;
319 __u8 padding[2];
320 __u64 value;
321} __attribute__((__packed__));
322
323/**
324 * struct peci_rd_ia_msrex_msg - RdIAMSREX command
325 * @addr: address of the client
326 * @thread_id: ID of the specific logical processor
327 * @address: address of MSR to read from
328 * @cc: completion code
329 * @value: data to be read
330 *
331 * The RdIAMSREX() PECI command provides read access to Model Specific
332 * Registers (MSRs) defined in the processor's Intel Architecture (IA).
333 * The differences between RdIAMSREX() and RdIAMSR() are that:
334 * (1)RdIAMSR() can only read MC registers, RdIAMSREX() can read all MSRs
335 * (2)thread_id of RdIAMSR() is u8, thread_id of RdIAMSREX() is u16
336 */
337struct peci_rd_ia_msrex_msg {
338#define PECI_RDIAMSREX_WRITE_LEN 6
339#define PECI_RDIAMSREX_READ_LEN 9
340#define PECI_RDIAMSREX_CMD 0xd1
341
342 __u8 addr;
343 __u8 padding0;
344 __u16 thread_id;
345 __u16 address;
346 __u8 cc;
347 __u8 padding1;
348 __u64 value;
349} __attribute__((__packed__));
350
351/**
352 * struct peci_rd_pci_cfg_msg - RdPCIConfig command
353 * @addr: address of the client
354 * @bus: PCI bus number
355 * @device: PCI device number
356 * @function: specific function to read from
357 * @reg: specific register to read from
358 * @cc: completion code
359 * @pci_config: config data to be read
360 *
361 * The RdPCIConfig() command provides sideband read access to the PCI
362 * configuration space maintained in downstream devices external to the
363 * processor.
364 */
James Feist6714a252018-09-10 15:26:18 -0700365struct peci_rd_pci_cfg_msg {
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800366#define PECI_RDPCICFG_WRITE_LEN 6
367#define PECI_RDPCICFG_READ_LEN 5
368#define PECI_RDPCICFG_READ_LEN_MAX 24
369#define PECI_RDPCICFG_CMD 0x61
370
371 __u8 addr;
372 __u8 bus;
373#define PECI_PCI_BUS0_CPU0 0x00
374#define PECI_PCI_BUS0_CPU1 0x80
375#define PECI_PCI_CPUBUSNO_BUS 0x00
376#define PECI_PCI_CPUBUSNO_DEV 0x08
377#define PECI_PCI_CPUBUSNO_FUNC 0x02
378#define PECI_PCI_CPUBUSNO 0xcc
379#define PECI_PCI_CPUBUSNO_1 0xd0
380#define PECI_PCI_CPUBUSNO_VALID 0xd4
381
382 __u8 device;
383 __u8 function;
384 __u16 reg;
385 __u8 cc;
386 __u8 padding[1];
387 __u8 pci_config[4];
James Feist6714a252018-09-10 15:26:18 -0700388} __attribute__((__packed__));
389
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800390/**
391 * struct peci_wr_pci_cfg_msg - WrPCIConfig command
392 * @addr: address of the client
393 * @bus: PCI bus number
394 * @device: PCI device number
395 * @function: specific function to write to
396 * @reg: specific register to write to
397 * @tx_len: number of data to be written in bytes
398 * @cc: completion code
399 * @pci_config: config data to be written
400 *
401 * The RdPCIConfig() command provides sideband write access to the PCI
402 * configuration space maintained in downstream devices external to the
403 * processor.
404 */
405struct peci_wr_pci_cfg_msg {
406#define PECI_WRPCICFG_CMD 0x65
407
408 __u8 addr;
409 __u8 bus;
410 __u8 device;
411 __u8 function;
412 __u16 reg;
413 __u8 tx_len;
414 __u8 cc;
415 __u8 pci_config[4];
416} __attribute__((__packed__));
417
418/**
419 * struct peci_rd_pci_cfg_local_msg - RdPCIConfigLocal command
420 * @addr: address of the client
421 * @bus: PCI bus number
422 * @device: PCI device number
423 * @function: specific function to read from
424 * @reg: specific register to read from
425 * @rx_len: number of data to be read in bytes
426 * @cc: completion code
427 * @pci_config: config data to be read
428 *
429 * The RdPCIConfigLocal() command provides sideband read access to the PCI
430 * configuration space that resides within the processor. This includes all
431 * processor IIO and uncore registers within the PCI configuration space.
432 */
James Feist6714a252018-09-10 15:26:18 -0700433struct peci_rd_pci_cfg_local_msg {
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800434#define PECI_RDPCICFGLOCAL_WRITE_LEN 5
435#define PECI_RDPCICFGLOCAL_READ_LEN_BASE 1
436#define PECI_RDPCICFGLOCAL_CMD 0xe1
437
438 __u8 addr;
439 __u8 bus;
440 __u8 device;
441 __u8 function;
442 __u16 reg;
443 __u8 rx_len;
444 __u8 cc;
445 __u8 pci_config[4];
James Feist6714a252018-09-10 15:26:18 -0700446} __attribute__((__packed__));
447
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800448/**
449 * struct peci_wr_pci_cfg_local_msg - WrPCIConfigLocal command
450 * @addr: address of the client
451 * @bus: PCI bus number
452 * @device: PCI device number
453 * @function: specific function to read from
454 * @reg: specific register to read from
455 * @tx_len: number of data to be written in bytes
456 * @cc: completion code
457 * @value: config data to be written
458 *
459 * The WrPCIConfigLocal() command provides sideband write access to the PCI
460 * configuration space that resides within the processor. PECI originators can
461 * access this space even before BIOS enumeration of the system buses.
462 */
James Feist6714a252018-09-10 15:26:18 -0700463struct peci_wr_pci_cfg_local_msg {
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800464#define PECI_WRPCICFGLOCAL_WRITE_LEN_BASE 6
465#define PECI_WRPCICFGLOCAL_READ_LEN 1
466#define PECI_WRPCICFGLOCAL_CMD 0xe5
467
468 __u8 addr;
469 __u8 bus;
470 __u8 device;
471 __u8 function;
472 __u16 reg;
473 __u8 tx_len;
474 __u8 cc;
475 __u32 value;
James Feist6714a252018-09-10 15:26:18 -0700476} __attribute__((__packed__));
477
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800478struct peci_rd_end_pt_cfg_msg {
479#define PECI_RDENDPTCFG_PCI_WRITE_LEN 12
480#define PECI_RDENDPTCFG_MMIO_D_WRITE_LEN 14
481#define PECI_RDENDPTCFG_MMIO_Q_WRITE_LEN 18
482#define PECI_RDENDPTCFG_READ_LEN_BASE 1
483#define PECI_RDENDPTCFG_CMD 0xc1
484
485 __u8 addr;
486 __u8 msg_type;
487#define PECI_ENDPTCFG_TYPE_LOCAL_PCI 0x03
488#define PECI_ENDPTCFG_TYPE_PCI 0x04
489#define PECI_ENDPTCFG_TYPE_MMIO 0x05
490
491 union {
492 struct {
493 __u8 seg;
494 __u8 bus;
495 __u8 device;
496 __u8 function;
497 __u16 reg;
498 } pci_cfg;
499 struct {
500 __u8 seg;
501 __u8 bus;
502 __u8 device;
503 __u8 function;
504 __u8 bar;
505 __u8 addr_type;
506#define PECI_ENDPTCFG_ADDR_TYPE_PCI 0x04
507#define PECI_ENDPTCFG_ADDR_TYPE_MMIO_D 0x05
508#define PECI_ENDPTCFG_ADDR_TYPE_MMIO_Q 0x06
509
510 __u64 offset;
511 } mmio;
512 } params;
513 __u8 rx_len;
514 __u8 cc;
515 __u8 padding[2];
516 __u8 data[8];
517} __attribute__((__packed__));
518
519struct peci_wr_end_pt_cfg_msg {
520#define PECI_WRENDPTCFG_PCI_WRITE_LEN_BASE 13
521#define PECI_WRENDPTCFG_MMIO_D_WRITE_LEN_BASE 15
522#define PECI_WRENDPTCFG_MMIO_Q_WRITE_LEN_BASE 19
523#define PECI_WRENDPTCFG_READ_LEN 1
524#define PECI_WRENDPTCFG_CMD 0xc5
525
526 __u8 addr;
527 __u8 msg_type;
528 /* See msg_type in struct peci_rd_end_pt_cfg_msg */
529
530 union {
531 struct {
532 __u8 seg;
533 __u8 bus;
534 __u8 device;
535 __u8 function;
536 __u16 reg;
537 } pci_cfg;
538 struct {
539 __u8 seg;
540 __u8 bus;
541 __u8 device;
542 __u8 function;
543 __u8 bar;
544 __u8 addr_type;
545 /* See addr_type in struct peci_rd_end_pt_cfg_msg */
546
547 __u64 offset;
548 } mmio;
549 } params;
550 __u8 tx_len;
551 __u8 cc;
552 __u8 padding[2];
553 __u64 value;
554} __attribute__((__packed__));
555
556/* Crashdump Agent */
557#define PECI_CRASHDUMP_CORE 0x00
558#define PECI_CRASHDUMP_TOR 0x01
559
560/* Crashdump Agent Param */
561#define PECI_CRASHDUMP_PAYLOAD_SIZE 0x00
562
563/* Crashdump Agent Data Param */
564#define PECI_CRASHDUMP_AGENT_ID 0x00
565#define PECI_CRASHDUMP_AGENT_PARAM 0x01
566
James Feist6714a252018-09-10 15:26:18 -0700567struct peci_crashdump_disc_msg {
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800568 __u8 addr;
569 __u8 subopcode;
570#define PECI_CRASHDUMP_ENABLED 0x00
571#define PECI_CRASHDUMP_NUM_AGENTS 0x01
572#define PECI_CRASHDUMP_AGENT_DATA 0x02
573
574 __u8 cc;
575 __u8 param0;
576 __u16 param1;
577 __u8 param2;
578 __u8 rx_len;
579 __u8 data[8];
James Feist6714a252018-09-10 15:26:18 -0700580} __attribute__((__packed__));
581
582struct peci_crashdump_get_frame_msg {
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800583#define PECI_CRASHDUMP_DISC_WRITE_LEN 9
584#define PECI_CRASHDUMP_DISC_READ_LEN_BASE 1
585#define PECI_CRASHDUMP_DISC_VERSION 0
586#define PECI_CRASHDUMP_DISC_OPCODE 1
587#define PECI_CRASHDUMP_GET_FRAME_WRITE_LEN 10
588#define PECI_CRASHDUMP_GET_FRAME_READ_LEN_BASE 1
589#define PECI_CRASHDUMP_GET_FRAME_VERSION 0
590#define PECI_CRASHDUMP_GET_FRAME_OPCODE 3
591#define PECI_CRASHDUMP_CMD 0x71
592
593 __u8 addr;
594 __u8 padding0;
595 __u16 param0;
596 __u16 param1;
597 __u16 param2;
598 __u8 rx_len;
599 __u8 cc;
600 __u8 padding1[2];
601 __u8 data[16];
James Feist6714a252018-09-10 15:26:18 -0700602} __attribute__((__packed__));
603
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800604#define PECI_IOC_BASE 0xb7
605
606#define PECI_IOC_XFER \
607 _IOWR(PECI_IOC_BASE, PECI_CMD_XFER, struct peci_xfer_msg)
James Feist6714a252018-09-10 15:26:18 -0700608
609#define PECI_IOC_PING \
610 _IOWR(PECI_IOC_BASE, PECI_CMD_PING, struct peci_ping_msg)
611
612#define PECI_IOC_GET_DIB \
613 _IOWR(PECI_IOC_BASE, PECI_CMD_GET_DIB, struct peci_get_dib_msg)
614
615#define PECI_IOC_GET_TEMP \
616 _IOWR(PECI_IOC_BASE, PECI_CMD_GET_TEMP, struct peci_get_temp_msg)
617
618#define PECI_IOC_RD_PKG_CFG \
619 _IOWR(PECI_IOC_BASE, PECI_CMD_RD_PKG_CFG, struct peci_rd_pkg_cfg_msg)
620
621#define PECI_IOC_WR_PKG_CFG \
622 _IOWR(PECI_IOC_BASE, PECI_CMD_WR_PKG_CFG, struct peci_wr_pkg_cfg_msg)
623
624#define PECI_IOC_RD_IA_MSR \
625 _IOWR(PECI_IOC_BASE, PECI_CMD_RD_IA_MSR, struct peci_rd_ia_msr_msg)
626
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800627#define PECI_IOC_WR_IA_MSR \
628 _IOWR(PECI_IOC_BASE, PECI_CMD_WR_IA_MSR, struct peci_wr_ia_msr_msg)
629
630#define PECI_IOC_RD_IA_MSREX \
631 _IOWR(PECI_IOC_BASE, PECI_CMD_RD_IA_MSREX, struct peci_rd_ia_msrex_msg)
632
James Feist6714a252018-09-10 15:26:18 -0700633#define PECI_IOC_RD_PCI_CFG \
634 _IOWR(PECI_IOC_BASE, PECI_CMD_RD_PCI_CFG, struct peci_rd_pci_cfg_msg)
635
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800636#define PECI_IOC_WR_PCI_CFG \
637 _IOWR(PECI_IOC_BASE, PECI_CMD_WR_PCI_CFG, struct peci_wr_pci_cfg_msg)
638
James Feist6714a252018-09-10 15:26:18 -0700639#define PECI_IOC_RD_PCI_CFG_LOCAL \
640 _IOWR(PECI_IOC_BASE, PECI_CMD_RD_PCI_CFG_LOCAL, \
641 struct peci_rd_pci_cfg_local_msg)
642
643#define PECI_IOC_WR_PCI_CFG_LOCAL \
644 _IOWR(PECI_IOC_BASE, PECI_CMD_WR_PCI_CFG_LOCAL, \
645 struct peci_wr_pci_cfg_local_msg)
646
Jae Hyun Yoob9122032019-12-23 15:34:59 -0800647#define PECI_IOC_RD_END_PT_CFG \
648 _IOWR(PECI_IOC_BASE, PECI_CMD_RD_END_PT_CFG, \
649 struct peci_rd_end_pt_cfg_msg)
650
651#define PECI_IOC_WR_END_PT_CFG \
652 _IOWR(PECI_IOC_BASE, PECI_CMD_WR_END_PT_CFG, \
653 struct peci_wr_end_pt_cfg_msg)
654
James Feist6714a252018-09-10 15:26:18 -0700655#define PECI_IOC_CRASHDUMP_DISC \
656 _IOWR(PECI_IOC_BASE, PECI_CMD_CRASHDUMP_DISC, \
657 struct peci_crashdump_disc_msg)
658
659#define PECI_IOC_CRASHDUMP_GET_FRAME \
660 _IOWR(PECI_IOC_BASE, PECI_CMD_CRASHDUMP_GET_FRAME, \
661 struct peci_crashdump_get_frame_msg)
662
663#endif /* __PECI_IOCTL_H */
James Feist582be092018-11-27 10:54:59 -0800664// clang-format on