19a5095e7SAlex Deucher /* SPDX-License-Identifier: MIT */
29a5095e7SAlex Deucher /*
39a5095e7SAlex Deucher * Copyright 2023 Advanced Micro Devices, Inc.
49a5095e7SAlex Deucher *
59a5095e7SAlex Deucher * Permission is hereby granted, free of charge, to any person obtaining a
69a5095e7SAlex Deucher * copy of this software and associated documentation files (the "Software"),
79a5095e7SAlex Deucher * to deal in the Software without restriction, including without limitation
89a5095e7SAlex Deucher * the rights to use, copy, modify, merge, publish, distribute, sublicense,
99a5095e7SAlex Deucher * and/or sell copies of the Software, and to permit persons to whom the
109a5095e7SAlex Deucher * Software is furnished to do so, subject to the following conditions:
119a5095e7SAlex Deucher *
129a5095e7SAlex Deucher * The above copyright notice and this permission notice shall be included in
139a5095e7SAlex Deucher * all copies or substantial portions of the Software.
149a5095e7SAlex Deucher *
159a5095e7SAlex Deucher * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
169a5095e7SAlex Deucher * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
179a5095e7SAlex Deucher * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
189a5095e7SAlex Deucher * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
199a5095e7SAlex Deucher * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
209a5095e7SAlex Deucher * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
219a5095e7SAlex Deucher * OTHER DEALINGS IN THE SOFTWARE.
229a5095e7SAlex Deucher *
239a5095e7SAlex Deucher */
249a5095e7SAlex Deucher
259a5095e7SAlex Deucher #ifndef __AMDGPU_REG_STATE_H__
269a5095e7SAlex Deucher #define __AMDGPU_REG_STATE_H__
279a5095e7SAlex Deucher
289a5095e7SAlex Deucher enum amdgpu_reg_state {
299a5095e7SAlex Deucher AMDGPU_REG_STATE_TYPE_INVALID = 0,
309a5095e7SAlex Deucher AMDGPU_REG_STATE_TYPE_XGMI = 1,
319a5095e7SAlex Deucher AMDGPU_REG_STATE_TYPE_WAFL = 2,
329a5095e7SAlex Deucher AMDGPU_REG_STATE_TYPE_PCIE = 3,
339a5095e7SAlex Deucher AMDGPU_REG_STATE_TYPE_USR = 4,
349a5095e7SAlex Deucher AMDGPU_REG_STATE_TYPE_USR_1 = 5
359a5095e7SAlex Deucher };
369a5095e7SAlex Deucher
37af39e6f4SLijo Lazar enum amdgpu_sysfs_reg_offset {
38af39e6f4SLijo Lazar AMDGPU_SYS_REG_STATE_XGMI = 0x0000,
39af39e6f4SLijo Lazar AMDGPU_SYS_REG_STATE_WAFL = 0x1000,
40af39e6f4SLijo Lazar AMDGPU_SYS_REG_STATE_PCIE = 0x2000,
41af39e6f4SLijo Lazar AMDGPU_SYS_REG_STATE_USR = 0x3000,
42af39e6f4SLijo Lazar AMDGPU_SYS_REG_STATE_USR_1 = 0x4000,
43af39e6f4SLijo Lazar AMDGPU_SYS_REG_STATE_END = 0x5000,
44af39e6f4SLijo Lazar };
45af39e6f4SLijo Lazar
469a5095e7SAlex Deucher struct amdgpu_reg_state_header {
479a5095e7SAlex Deucher uint16_t structure_size;
489a5095e7SAlex Deucher uint8_t format_revision;
499a5095e7SAlex Deucher uint8_t content_revision;
509a5095e7SAlex Deucher uint8_t state_type;
519a5095e7SAlex Deucher uint8_t num_instances;
529a5095e7SAlex Deucher uint16_t pad;
539a5095e7SAlex Deucher };
549a5095e7SAlex Deucher
559a5095e7SAlex Deucher enum amdgpu_reg_inst_state {
569a5095e7SAlex Deucher AMDGPU_INST_S_OK,
579a5095e7SAlex Deucher AMDGPU_INST_S_EDISABLED,
589a5095e7SAlex Deucher AMDGPU_INST_S_EACCESS,
599a5095e7SAlex Deucher };
609a5095e7SAlex Deucher
619a5095e7SAlex Deucher struct amdgpu_smn_reg_data {
629a5095e7SAlex Deucher uint64_t addr;
639a5095e7SAlex Deucher uint32_t value;
649a5095e7SAlex Deucher uint32_t pad;
659a5095e7SAlex Deucher };
669a5095e7SAlex Deucher
679a5095e7SAlex Deucher struct amdgpu_reg_inst_header {
689a5095e7SAlex Deucher uint16_t instance;
699a5095e7SAlex Deucher uint16_t state;
709a5095e7SAlex Deucher uint16_t num_smn_regs;
719a5095e7SAlex Deucher uint16_t pad;
729a5095e7SAlex Deucher };
739a5095e7SAlex Deucher
749a5095e7SAlex Deucher
759a5095e7SAlex Deucher struct amdgpu_regs_xgmi_v1_0 {
769a5095e7SAlex Deucher struct amdgpu_reg_inst_header inst_header;
779a5095e7SAlex Deucher
789a5095e7SAlex Deucher struct amdgpu_smn_reg_data smn_reg_values[];
799a5095e7SAlex Deucher };
809a5095e7SAlex Deucher
819a5095e7SAlex Deucher struct amdgpu_reg_state_xgmi_v1_0 {
829a5095e7SAlex Deucher /* common_header.state_type must be AMDGPU_REG_STATE_TYPE_XGMI */
839a5095e7SAlex Deucher struct amdgpu_reg_state_header common_header;
849a5095e7SAlex Deucher
859a5095e7SAlex Deucher struct amdgpu_regs_xgmi_v1_0 xgmi_state_regs[];
869a5095e7SAlex Deucher };
879a5095e7SAlex Deucher
889a5095e7SAlex Deucher struct amdgpu_regs_wafl_v1_0 {
899a5095e7SAlex Deucher struct amdgpu_reg_inst_header inst_header;
909a5095e7SAlex Deucher
919a5095e7SAlex Deucher struct amdgpu_smn_reg_data smn_reg_values[];
929a5095e7SAlex Deucher };
939a5095e7SAlex Deucher
949a5095e7SAlex Deucher struct amdgpu_reg_state_wafl_v1_0 {
959a5095e7SAlex Deucher /* common_header.state_type must be AMDGPU_REG_STATE_TYPE_WAFL */
969a5095e7SAlex Deucher struct amdgpu_reg_state_header common_header;
979a5095e7SAlex Deucher
989a5095e7SAlex Deucher struct amdgpu_regs_wafl_v1_0 wafl_state_regs[];
999a5095e7SAlex Deucher };
1009a5095e7SAlex Deucher
1019a5095e7SAlex Deucher struct amdgpu_regs_pcie_v1_0 {
1029a5095e7SAlex Deucher struct amdgpu_reg_inst_header inst_header;
1039a5095e7SAlex Deucher
1049a5095e7SAlex Deucher uint16_t device_status;
1059a5095e7SAlex Deucher uint16_t link_status;
1069a5095e7SAlex Deucher uint32_t sub_bus_number_latency;
1079a5095e7SAlex Deucher uint32_t pcie_corr_err_status;
1089a5095e7SAlex Deucher uint32_t pcie_uncorr_err_status;
1099a5095e7SAlex Deucher
1109a5095e7SAlex Deucher struct amdgpu_smn_reg_data smn_reg_values[];
1119a5095e7SAlex Deucher };
1129a5095e7SAlex Deucher
1139a5095e7SAlex Deucher struct amdgpu_reg_state_pcie_v1_0 {
1149a5095e7SAlex Deucher /* common_header.state_type must be AMDGPU_REG_STATE_TYPE_PCIE */
1159a5095e7SAlex Deucher struct amdgpu_reg_state_header common_header;
1169a5095e7SAlex Deucher
1179a5095e7SAlex Deucher struct amdgpu_regs_pcie_v1_0 pci_state_regs[];
1189a5095e7SAlex Deucher };
1199a5095e7SAlex Deucher
1209a5095e7SAlex Deucher struct amdgpu_regs_usr_v1_0 {
1219a5095e7SAlex Deucher struct amdgpu_reg_inst_header inst_header;
1229a5095e7SAlex Deucher
1239a5095e7SAlex Deucher struct amdgpu_smn_reg_data smn_reg_values[];
1249a5095e7SAlex Deucher };
1259a5095e7SAlex Deucher
1269a5095e7SAlex Deucher struct amdgpu_reg_state_usr_v1_0 {
1279a5095e7SAlex Deucher /* common_header.state_type must be AMDGPU_REG_STATE_TYPE_USR */
1289a5095e7SAlex Deucher struct amdgpu_reg_state_header common_header;
1299a5095e7SAlex Deucher
1309a5095e7SAlex Deucher struct amdgpu_regs_usr_v1_0 usr_state_regs[];
1319a5095e7SAlex Deucher };
1329a5095e7SAlex Deucher
amdgpu_reginst_size(uint16_t num_inst,size_t inst_size,uint16_t num_regs)1339a5095e7SAlex Deucher static inline size_t amdgpu_reginst_size(uint16_t num_inst, size_t inst_size,
1349a5095e7SAlex Deucher uint16_t num_regs)
1359a5095e7SAlex Deucher {
1369a5095e7SAlex Deucher return num_inst *
1379a5095e7SAlex Deucher (inst_size + num_regs * sizeof(struct amdgpu_smn_reg_data));
1389a5095e7SAlex Deucher }
1399a5095e7SAlex Deucher
1409a5095e7SAlex Deucher #define amdgpu_asic_get_reg_state_supported(adev) \
141*bc8f6d42SHawking Zhang (((adev)->asic_funcs && (adev)->asic_funcs->get_reg_state) ? 1 : 0)
1429a5095e7SAlex Deucher
1439a5095e7SAlex Deucher #define amdgpu_asic_get_reg_state(adev, state, buf, size) \
1449a5095e7SAlex Deucher ((adev)->asic_funcs->get_reg_state ? \
1459a5095e7SAlex Deucher (adev)->asic_funcs->get_reg_state((adev), (state), (buf), \
1469a5095e7SAlex Deucher (size)) : \
1479a5095e7SAlex Deucher 0)
1489a5095e7SAlex Deucher
149af39e6f4SLijo Lazar
150af39e6f4SLijo Lazar int amdgpu_reg_state_sysfs_init(struct amdgpu_device *adev);
151af39e6f4SLijo Lazar void amdgpu_reg_state_sysfs_fini(struct amdgpu_device *adev);
152af39e6f4SLijo Lazar
1539a5095e7SAlex Deucher #endif
154