xref: /freebsd/sys/dev/amdsmu/amdsmu_reg.h (revision f2de5a6dd7bb32f09d5ad290307c2533d3071fee)
1f261b633SAymeric Wibo /*
2f261b633SAymeric Wibo  * SPDX-License-Identifier: BSD-2-Clause
3f261b633SAymeric Wibo  *
4f261b633SAymeric Wibo  * Copyright (c) 2025 The FreeBSD Foundation
5f261b633SAymeric Wibo  *
6f261b633SAymeric Wibo  * This software was developed by Aymeric Wibo <obiwac@freebsd.org>
7f261b633SAymeric Wibo  * under sponsorship from the FreeBSD Foundation.
8f261b633SAymeric Wibo  */
9f261b633SAymeric Wibo #ifndef _AMDSMU_REG_H_
10f261b633SAymeric Wibo #define	_AMDSMU_REG_H_
11f261b633SAymeric Wibo 
12e4e44f69SAymeric Wibo #include <sys/types.h>
13e4e44f69SAymeric Wibo 
14f261b633SAymeric Wibo /*
15f261b633SAymeric Wibo  * TODO These are in common with amdtemp; should we find a way to factor these
16f261b633SAymeric Wibo  * out?  Also, there are way more of these.  I couldn't find a centralized place
17f261b633SAymeric Wibo  * which lists them though.
18f261b633SAymeric Wibo  */
19f261b633SAymeric Wibo #define PCI_DEVICEID_AMD_REMBRANDT_ROOT		0x14B5
20f261b633SAymeric Wibo #define PCI_DEVICEID_AMD_PHOENIX_ROOT		0x14E8
21f261b633SAymeric Wibo #define PCI_DEVICEID_AMD_STRIX_POINT_ROOT	0x14A4
22f261b633SAymeric Wibo 
23f261b633SAymeric Wibo #define SMU_INDEX_ADDRESS	0xB8
24f261b633SAymeric Wibo #define SMU_INDEX_DATA		0xBC
25f261b633SAymeric Wibo 
26f261b633SAymeric Wibo #define SMU_PHYSBASE_ADDR_LO	0x13B102E8
27f261b633SAymeric Wibo #define SMU_PHYSBASE_ADDR_HI	0x13B102EC
28f261b633SAymeric Wibo 
29f261b633SAymeric Wibo #define SMU_MEM_SIZE		0x1000
30f261b633SAymeric Wibo #define SMU_REG_SPACE_OFF	0x10000
31f261b633SAymeric Wibo 
32f261b633SAymeric Wibo #define SMU_REG_MESSAGE		0x538
33f261b633SAymeric Wibo #define SMU_REG_RESPONSE	0x980
34f261b633SAymeric Wibo #define SMU_REG_ARGUMENT	0x9BC
35*f2de5a6dSAymeric Wibo #define SMU_REG_IDLEMASK	0xD14
36f261b633SAymeric Wibo 
37f261b633SAymeric Wibo enum amdsmu_res {
38f261b633SAymeric Wibo 	SMU_RES_WAIT		= 0x00,
39f261b633SAymeric Wibo 	SMU_RES_OK		= 0x01,
40f261b633SAymeric Wibo 	SMU_RES_REJECT_BUSY	= 0xFC,
41f261b633SAymeric Wibo 	SMU_RES_REJECT_PREREQ	= 0xFD,
42f261b633SAymeric Wibo 	SMU_RES_UNKNOWN		= 0xFE,
43f261b633SAymeric Wibo 	SMU_RES_FAILED		= 0xFF,
44f261b633SAymeric Wibo };
45f261b633SAymeric Wibo 
46f261b633SAymeric Wibo enum amdsmu_msg {
47f261b633SAymeric Wibo 	SMU_MSG_GETSMUVERSION		= 0x02,
48f261b633SAymeric Wibo 	SMU_MSG_LOG_GETDRAM_ADDR_HI	= 0x04,
49f261b633SAymeric Wibo 	SMU_MSG_LOG_GETDRAM_ADDR_LO	= 0x05,
50f261b633SAymeric Wibo 	SMU_MSG_LOG_START		= 0x06,
51f261b633SAymeric Wibo 	SMU_MSG_LOG_RESET		= 0x07,
52f261b633SAymeric Wibo 	SMU_MSG_LOG_DUMP_DATA		= 0x08,
53f261b633SAymeric Wibo 	SMU_MSG_GET_SUP_CONSTRAINTS	= 0x09,
54f261b633SAymeric Wibo };
55f261b633SAymeric Wibo 
56e4e44f69SAymeric Wibo /* XXX Copied from Linux struct smu_metrics. */
57e4e44f69SAymeric Wibo struct amdsmu_metrics {
58e4e44f69SAymeric Wibo 	uint32_t table_version;
59e4e44f69SAymeric Wibo 	uint32_t hint_count;
60e4e44f69SAymeric Wibo 	uint32_t s0i3_last_entry_status;
61e4e44f69SAymeric Wibo 	uint32_t time_last_in_s0i2;
62e4e44f69SAymeric Wibo 	uint64_t time_last_entering_s0i3;
63e4e44f69SAymeric Wibo 	uint64_t total_time_entering_s0i3;
64e4e44f69SAymeric Wibo 	uint64_t time_last_resuming;
65e4e44f69SAymeric Wibo 	uint64_t total_time_resuming;
66e4e44f69SAymeric Wibo 	uint64_t time_last_in_s0i3;
67e4e44f69SAymeric Wibo 	uint64_t total_time_in_s0i3;
68e4e44f69SAymeric Wibo 	uint64_t time_last_in_sw_drips;
69e4e44f69SAymeric Wibo 	uint64_t total_time_in_sw_drips;
70e4e44f69SAymeric Wibo 	/*
71e4e44f69SAymeric Wibo 	 * This is how long each IP block was active for (us), i.e., blocking
72e4e44f69SAymeric Wibo 	 * entry to S0i3.  In Linux, these are called "timecondition_notmet_*".
73e4e44f69SAymeric Wibo 	 *
74e4e44f69SAymeric Wibo 	 * XXX Total active time for IP blocks seems to be buggy and reporting
75e4e44f69SAymeric Wibo 	 * garbage (at least on Phoenix), so it's disabled for now.  The last
76e4e44f69SAymeric Wibo 	 * active time for the USB4_0 IP block also seems to be buggy.
77e4e44f69SAymeric Wibo 	 */
78e4e44f69SAymeric Wibo 	uint64_t ip_block_last_active_time[32];
79e4e44f69SAymeric Wibo #ifdef IP_BLOCK_TOTAL_ACTIVE_TIME
80e4e44f69SAymeric Wibo 	uint64_t ip_block_total_active_time[32];
81e4e44f69SAymeric Wibo #endif
82e4e44f69SAymeric Wibo } __attribute__((packed));
83e4e44f69SAymeric Wibo 
84f261b633SAymeric Wibo #endif /* _AMDSMU_REG_H_ */
85