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