xref: /src/sys/dev/amdsmu/amdsmu.h (revision 2c60fce365f4398ff02a86b46e2862905f88fa97)
1 /*
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2025 The FreeBSD Foundation
5  *
6  * This software was developed by Aymeric Wibo <obiwac@freebsd.org>
7  * under sponsorship from the FreeBSD Foundation.
8  */
9 
10 #ifndef _AMDSMU_H_
11 #define	_AMDSMU_H_
12 
13 #include <sys/param.h>
14 #include <sys/bus.h>
15 #include <sys/eventhandler.h>
16 #include <sys/kernel.h>
17 #include <machine/bus.h>
18 #include <x86/cputypes.h>
19 
20 #include <dev/amdsmu/amdsmu_reg.h>
21 
22 #define SMU_RES_READ_PERIOD_US	50
23 #define SMU_RES_READ_MAX	20000
24 
25 static const struct amdsmu_product {
26 	uint16_t	amdsmu_vendorid;
27 	uint16_t	amdsmu_deviceid;
28 } amdsmu_products[] = {
29 	{ CPU_VENDOR_AMD,	PCI_DEVICEID_AMD_REMBRANDT_ROOT },
30 	{ CPU_VENDOR_AMD,	PCI_DEVICEID_AMD_PHOENIX_ROOT },
31 	{ CPU_VENDOR_AMD,	PCI_DEVICEID_AMD_STRIX_POINT_ROOT },
32 };
33 
34 static const char *const amdsmu_ip_blocks_names[] = {
35     "DISPLAY",
36     "CPU",
37     "GFX",
38     "VDD",
39     "ACP",
40     "VCN",
41     "ISP",
42     "NBIO",
43     "DF",
44     "USB3_0",
45     "USB3_1",
46     "LAPIC",
47     "USB3_2",
48     "USB3_3",
49     "USB3_4",
50     "USB4_0",
51     "USB4_1",
52     "MPM",
53     "JPEG",
54     "IPU",
55     "UMSCH",
56     "VPE",
57 };
58 
59 CTASSERT(nitems(amdsmu_ip_blocks_names) <= 32);
60 
61 struct amdsmu_softc {
62 	struct sysctl_ctx_list	*sysctlctx;
63 	struct sysctl_oid	*sysctlnode;
64 
65 	struct eventhandler_entry	*eh_suspend;
66 	struct eventhandler_entry	*eh_resume;
67 
68 	struct resource		*res;
69 	bus_space_tag_t 	bus_tag;
70 
71 	bus_space_handle_t	smu_space;
72 	bus_space_handle_t	reg_space;
73 
74 	uint8_t			smu_program;
75 	uint8_t			smu_maj, smu_min, smu_rev;
76 
77 	uint32_t		active_ip_blocks;
78 	struct sysctl_oid	*ip_blocks_sysctlnode;
79 	size_t			ip_block_count;
80 	struct sysctl_oid	*ip_block_sysctlnodes[
81 				    nitems(amdsmu_ip_blocks_names)];
82 	bool			ip_blocks_active[
83 				    nitems(amdsmu_ip_blocks_names)];
84 
85 	bus_space_handle_t	metrics_space;
86 	struct amdsmu_metrics	metrics;
87 	uint32_t		idlemask;
88 };
89 
90 static inline uint32_t
amdsmu_read4(const struct amdsmu_softc * sc,bus_size_t reg)91 amdsmu_read4(const struct amdsmu_softc *sc, bus_size_t reg)
92 {
93 	return (bus_space_read_4(sc->bus_tag, sc->reg_space, reg));
94 }
95 
96 static inline void
amdsmu_write4(const struct amdsmu_softc * sc,bus_size_t reg,uint32_t val)97 amdsmu_write4(const struct amdsmu_softc *sc, bus_size_t reg, uint32_t val)
98 {
99 	bus_space_write_4(sc->bus_tag, sc->reg_space, reg, val);
100 }
101 
102 #endif /* _AMDSMU_H_ */
103