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