1 /* SPDX-License-Identifier: MIT */
2 /*
3 * Copyright 2023 Advanced Micro Devices, Inc.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21 * OTHER DEALINGS IN THE SOFTWARE.
22 *
23 */
24
25 #ifndef __AMDGPU_REG_STATE_H__
26 #define __AMDGPU_REG_STATE_H__
27
28 enum amdgpu_reg_state {
29 AMDGPU_REG_STATE_TYPE_INVALID = 0,
30 AMDGPU_REG_STATE_TYPE_XGMI = 1,
31 AMDGPU_REG_STATE_TYPE_WAFL = 2,
32 AMDGPU_REG_STATE_TYPE_PCIE = 3,
33 AMDGPU_REG_STATE_TYPE_USR = 4,
34 AMDGPU_REG_STATE_TYPE_USR_1 = 5
35 };
36
37 enum amdgpu_sysfs_reg_offset {
38 AMDGPU_SYS_REG_STATE_XGMI = 0x0000,
39 AMDGPU_SYS_REG_STATE_WAFL = 0x1000,
40 AMDGPU_SYS_REG_STATE_PCIE = 0x2000,
41 AMDGPU_SYS_REG_STATE_USR = 0x3000,
42 AMDGPU_SYS_REG_STATE_USR_1 = 0x4000,
43 AMDGPU_SYS_REG_STATE_END = 0x5000,
44 };
45
46 struct amdgpu_reg_state_header {
47 uint16_t structure_size;
48 uint8_t format_revision;
49 uint8_t content_revision;
50 uint8_t state_type;
51 uint8_t num_instances;
52 uint16_t pad;
53 };
54
55 enum amdgpu_reg_inst_state {
56 AMDGPU_INST_S_OK,
57 AMDGPU_INST_S_EDISABLED,
58 AMDGPU_INST_S_EACCESS,
59 };
60
61 struct amdgpu_smn_reg_data {
62 uint64_t addr;
63 uint32_t value;
64 uint32_t pad;
65 };
66
67 struct amdgpu_reg_inst_header {
68 uint16_t instance;
69 uint16_t state;
70 uint16_t num_smn_regs;
71 uint16_t pad;
72 };
73
74
75 struct amdgpu_regs_xgmi_v1_0 {
76 struct amdgpu_reg_inst_header inst_header;
77
78 struct amdgpu_smn_reg_data smn_reg_values[];
79 };
80
81 struct amdgpu_reg_state_xgmi_v1_0 {
82 /* common_header.state_type must be AMDGPU_REG_STATE_TYPE_XGMI */
83 struct amdgpu_reg_state_header common_header;
84
85 struct amdgpu_regs_xgmi_v1_0 xgmi_state_regs[];
86 };
87
88 struct amdgpu_regs_wafl_v1_0 {
89 struct amdgpu_reg_inst_header inst_header;
90
91 struct amdgpu_smn_reg_data smn_reg_values[];
92 };
93
94 struct amdgpu_reg_state_wafl_v1_0 {
95 /* common_header.state_type must be AMDGPU_REG_STATE_TYPE_WAFL */
96 struct amdgpu_reg_state_header common_header;
97
98 struct amdgpu_regs_wafl_v1_0 wafl_state_regs[];
99 };
100
101 struct amdgpu_regs_pcie_v1_0 {
102 struct amdgpu_reg_inst_header inst_header;
103
104 uint16_t device_status;
105 uint16_t link_status;
106 uint32_t sub_bus_number_latency;
107 uint32_t pcie_corr_err_status;
108 uint32_t pcie_uncorr_err_status;
109
110 struct amdgpu_smn_reg_data smn_reg_values[];
111 };
112
113 struct amdgpu_reg_state_pcie_v1_0 {
114 /* common_header.state_type must be AMDGPU_REG_STATE_TYPE_PCIE */
115 struct amdgpu_reg_state_header common_header;
116
117 struct amdgpu_regs_pcie_v1_0 pci_state_regs[];
118 };
119
120 struct amdgpu_regs_usr_v1_0 {
121 struct amdgpu_reg_inst_header inst_header;
122
123 struct amdgpu_smn_reg_data smn_reg_values[];
124 };
125
126 struct amdgpu_reg_state_usr_v1_0 {
127 /* common_header.state_type must be AMDGPU_REG_STATE_TYPE_USR */
128 struct amdgpu_reg_state_header common_header;
129
130 struct amdgpu_regs_usr_v1_0 usr_state_regs[];
131 };
132
amdgpu_reginst_size(uint16_t num_inst,size_t inst_size,uint16_t num_regs)133 static inline size_t amdgpu_reginst_size(uint16_t num_inst, size_t inst_size,
134 uint16_t num_regs)
135 {
136 return num_inst *
137 (inst_size + num_regs * sizeof(struct amdgpu_smn_reg_data));
138 }
139
140 #define amdgpu_asic_get_reg_state_supported(adev) \
141 (((adev)->asic_funcs && (adev)->asic_funcs->get_reg_state) ? 1 : 0)
142
143 #define amdgpu_asic_get_reg_state(adev, state, buf, size) \
144 ((adev)->asic_funcs->get_reg_state ? \
145 (adev)->asic_funcs->get_reg_state((adev), (state), (buf), \
146 (size)) : \
147 0)
148
149
150 int amdgpu_reg_state_sysfs_init(struct amdgpu_device *adev);
151 void amdgpu_reg_state_sysfs_fini(struct amdgpu_device *adev);
152
153 #endif
154