1*0a35c928SIngo Molnar /* SPDX-License-Identifier: GPL-2.0 */ 2*0a35c928SIngo Molnar /* 3*0a35c928SIngo Molnar * AMD Node helper functions and common defines 4*0a35c928SIngo Molnar * 5*0a35c928SIngo Molnar * Copyright (c) 2024, Advanced Micro Devices, Inc. 6*0a35c928SIngo Molnar * All Rights Reserved. 7*0a35c928SIngo Molnar * 8*0a35c928SIngo Molnar * Author: Yazen Ghannam <Yazen.Ghannam@amd.com> 9*0a35c928SIngo Molnar * 10*0a35c928SIngo Molnar * Note: 11*0a35c928SIngo Molnar * Items in this file may only be used in a single place. 12*0a35c928SIngo Molnar * However, it's prudent to keep all AMD Node functionality 13*0a35c928SIngo Molnar * in a unified place rather than spreading throughout the 14*0a35c928SIngo Molnar * kernel. 15*0a35c928SIngo Molnar */ 16*0a35c928SIngo Molnar 17*0a35c928SIngo Molnar #ifndef _ASM_X86_AMD_NODE_H_ 18*0a35c928SIngo Molnar #define _ASM_X86_AMD_NODE_H_ 19*0a35c928SIngo Molnar 20*0a35c928SIngo Molnar #include <linux/pci.h> 21*0a35c928SIngo Molnar 22*0a35c928SIngo Molnar #define MAX_AMD_NUM_NODES 8 23*0a35c928SIngo Molnar #define AMD_NODE0_PCI_SLOT 0x18 24*0a35c928SIngo Molnar 25*0a35c928SIngo Molnar struct pci_dev *amd_node_get_func(u16 node, u8 func); 26*0a35c928SIngo Molnar struct pci_dev *amd_node_get_root(u16 node); 27*0a35c928SIngo Molnar 28*0a35c928SIngo Molnar static inline u16 amd_num_nodes(void) 29*0a35c928SIngo Molnar { 30*0a35c928SIngo Molnar return topology_amd_nodes_per_pkg() * topology_max_packages(); 31*0a35c928SIngo Molnar } 32*0a35c928SIngo Molnar 33*0a35c928SIngo Molnar #ifdef CONFIG_AMD_NODE 34*0a35c928SIngo Molnar int __must_check amd_smn_read(u16 node, u32 address, u32 *value); 35*0a35c928SIngo Molnar int __must_check amd_smn_write(u16 node, u32 address, u32 value); 36*0a35c928SIngo Molnar 37*0a35c928SIngo Molnar /* Should only be used by the HSMP driver. */ 38*0a35c928SIngo Molnar int __must_check amd_smn_hsmp_rdwr(u16 node, u32 address, u32 *value, bool write); 39*0a35c928SIngo Molnar #else 40*0a35c928SIngo Molnar static inline int __must_check amd_smn_read(u16 node, u32 address, u32 *value) { return -ENODEV; } 41*0a35c928SIngo Molnar static inline int __must_check amd_smn_write(u16 node, u32 address, u32 value) { return -ENODEV; } 42*0a35c928SIngo Molnar 43*0a35c928SIngo Molnar static inline int __must_check amd_smn_hsmp_rdwr(u16 node, u32 address, u32 *value, bool write) 44*0a35c928SIngo Molnar { 45*0a35c928SIngo Molnar return -ENODEV; 46*0a35c928SIngo Molnar } 47*0a35c928SIngo Molnar #endif /* CONFIG_AMD_NODE */ 48*0a35c928SIngo Molnar 49*0a35c928SIngo Molnar /* helper for use with read_poll_timeout */ 50*0a35c928SIngo Molnar static inline int smn_read_register(u32 reg) 51*0a35c928SIngo Molnar { 52*0a35c928SIngo Molnar int data, rc; 53*0a35c928SIngo Molnar 54*0a35c928SIngo Molnar rc = amd_smn_read(0, reg, &data); 55*0a35c928SIngo Molnar if (rc) 56*0a35c928SIngo Molnar return rc; 57*0a35c928SIngo Molnar 58*0a35c928SIngo Molnar return data; 59*0a35c928SIngo Molnar } 60*0a35c928SIngo Molnar #endif /*_ASM_X86_AMD_NODE_H_*/ 61