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 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 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