1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 223ac4ae8SAndreas Herrmann #ifndef _ASM_X86_AMD_NB_H 323ac4ae8SAndreas Herrmann #define _ASM_X86_AMD_NB_H 423ac4ae8SAndreas Herrmann 524d25dbfSBjorn Helgaas #include <linux/ioport.h> 623ac4ae8SAndreas Herrmann #include <linux/pci.h> 7473e90b2SElena Reshetova #include <linux/refcount.h> 823ac4ae8SAndreas Herrmann 924d9b70bSJan Beulich struct amd_nb_bus_dev_range { 1024d9b70bSJan Beulich u8 bus; 1124d9b70bSJan Beulich u8 dev_base; 1224d9b70bSJan Beulich u8 dev_limit; 1324d9b70bSJan Beulich }; 1424d9b70bSJan Beulich 1524d9b70bSJan Beulich extern const struct amd_nb_bus_dev_range amd_nb_bus_dev_ranges[]; 1623ac4ae8SAndreas Herrmann 1784fd1d35SBorislav Petkov extern bool early_is_amd_nb(u32 value); 1824d25dbfSBjorn Helgaas extern struct resource *amd_get_mmconfig_range(struct resource *res); 19eec1d4faSHans Rosenfeld extern void amd_flush_garts(void); 20940fed2eSTejun Heo extern int amd_numa_init(void); 21cabb5bd7SHans Rosenfeld extern int amd_get_subcaches(int); 222993ae33SDan Carpenter extern int amd_set_subcaches(int, unsigned long); 2323ac4ae8SAndreas Herrmann 24ddfe43cdSYazen Ghannam extern int amd_smn_read(u16 node, u32 address, u32 *value); 25ddfe43cdSYazen Ghannam extern int amd_smn_write(u16 node, u32 address, u32 value); 26ddfe43cdSYazen Ghannam 27d2946041SThomas Gleixner struct amd_l3_cache { 28d2946041SThomas Gleixner unsigned indices; 29d2946041SThomas Gleixner u8 subcaches[4]; 30d2946041SThomas Gleixner }; 31d2946041SThomas Gleixner 32019f34fcSBorislav Petkov struct threshold_block { 33ea2ca36bSAravind Gopalakrishnan unsigned int block; /* Number within bank */ 34ea2ca36bSAravind Gopalakrishnan unsigned int bank; /* MCA bank the block belongs to */ 35ea2ca36bSAravind Gopalakrishnan unsigned int cpu; /* CPU which controls MCA bank */ 36ea2ca36bSAravind Gopalakrishnan u32 address; /* MSR address for the block */ 37ea2ca36bSAravind Gopalakrishnan u16 interrupt_enable; /* Enable/Disable APIC interrupt */ 38ea2ca36bSAravind Gopalakrishnan bool interrupt_capable; /* Bank can generate an interrupt. */ 39ea2ca36bSAravind Gopalakrishnan 40ea2ca36bSAravind Gopalakrishnan u16 threshold_limit; /* 41ea2ca36bSAravind Gopalakrishnan * Value upon which threshold 42ea2ca36bSAravind Gopalakrishnan * interrupt is generated. 43ea2ca36bSAravind Gopalakrishnan */ 44ea2ca36bSAravind Gopalakrishnan 45ea2ca36bSAravind Gopalakrishnan struct kobject kobj; /* sysfs object */ 46ea2ca36bSAravind Gopalakrishnan struct list_head miscj; /* 47ea2ca36bSAravind Gopalakrishnan * List of threshold blocks 48ea2ca36bSAravind Gopalakrishnan * within a bank. 49ea2ca36bSAravind Gopalakrishnan */ 50019f34fcSBorislav Petkov }; 51019f34fcSBorislav Petkov 52019f34fcSBorislav Petkov struct threshold_bank { 53019f34fcSBorislav Petkov struct kobject *kobj; 54019f34fcSBorislav Petkov struct threshold_block *blocks; 55019f34fcSBorislav Petkov 56019f34fcSBorislav Petkov /* initialized to the number of CPUs on the node sharing this bank */ 57473e90b2SElena Reshetova refcount_t cpus; 58f26d2580SThomas Gleixner unsigned int shared; 59019f34fcSBorislav Petkov }; 60019f34fcSBorislav Petkov 619653a5c7SHans Rosenfeld struct amd_northbridge { 62ddfe43cdSYazen Ghannam struct pci_dev *root; 639653a5c7SHans Rosenfeld struct pci_dev *misc; 6441b2610cSHans Rosenfeld struct pci_dev *link; 65d2946041SThomas Gleixner struct amd_l3_cache l3_cache; 66019f34fcSBorislav Petkov struct threshold_bank *bank4; 679653a5c7SHans Rosenfeld }; 689653a5c7SHans Rosenfeld 69eec1d4faSHans Rosenfeld struct amd_northbridge_info { 7023ac4ae8SAndreas Herrmann u16 num; 719653a5c7SHans Rosenfeld u64 flags; 729653a5c7SHans Rosenfeld struct amd_northbridge *nb; 7323ac4ae8SAndreas Herrmann }; 7423ac4ae8SAndreas Herrmann 7584fd1d35SBorislav Petkov #define AMD_NB_GART BIT(0) 7684fd1d35SBorislav Petkov #define AMD_NB_L3_INDEX_DISABLE BIT(1) 7784fd1d35SBorislav Petkov #define AMD_NB_L3_PARTITIONING BIT(2) 789653a5c7SHans Rosenfeld 7923ac4ae8SAndreas Herrmann #ifdef CONFIG_AMD_NB 8023ac4ae8SAndreas Herrmann 81c7993890SYazen Ghannam u16 amd_nb_num(void); 82c7993890SYazen Ghannam bool amd_nb_has_feature(unsigned int feature); 83c7993890SYazen Ghannam struct amd_northbridge *node_to_amd_nb(int node); 8423ac4ae8SAndreas Herrmann amd_pci_dev_to_node_id(struct pci_dev * pdev)851a6775c1SAravind Gopalakrishnanstatic inline u16 amd_pci_dev_to_node_id(struct pci_dev *pdev) 86772c3ff3SDaniel J Blueman { 87772c3ff3SDaniel J Blueman struct pci_dev *misc; 88772c3ff3SDaniel J Blueman int i; 89772c3ff3SDaniel J Blueman 90772c3ff3SDaniel J Blueman for (i = 0; i != amd_nb_num(); i++) { 91772c3ff3SDaniel J Blueman misc = node_to_amd_nb(i)->misc; 92772c3ff3SDaniel J Blueman 93772c3ff3SDaniel J Blueman if (pci_domain_nr(misc->bus) == pci_domain_nr(pdev->bus) && 94772c3ff3SDaniel J Blueman PCI_SLOT(misc->devfn) == PCI_SLOT(pdev->devfn)) 95772c3ff3SDaniel J Blueman return i; 96772c3ff3SDaniel J Blueman } 97772c3ff3SDaniel J Blueman 98772c3ff3SDaniel J Blueman WARN(1, "Unable to find AMD Northbridge id for %s\n", pci_name(pdev)); 99772c3ff3SDaniel J Blueman return 0; 100772c3ff3SDaniel J Blueman } 101772c3ff3SDaniel J Blueman amd_gart_present(void)1021b457429SAravind Gopalakrishnanstatic inline bool amd_gart_present(void) 1031b457429SAravind Gopalakrishnan { 104b7a5cb4fSPu Wen if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD) 105b7a5cb4fSPu Wen return false; 106b7a5cb4fSPu Wen 1071b457429SAravind Gopalakrishnan /* GART present only on Fam15h, upto model 0fh */ 1081b457429SAravind Gopalakrishnan if (boot_cpu_data.x86 == 0xf || boot_cpu_data.x86 == 0x10 || 1091b457429SAravind Gopalakrishnan (boot_cpu_data.x86 == 0x15 && boot_cpu_data.x86_model < 0x10)) 1101b457429SAravind Gopalakrishnan return true; 1111b457429SAravind Gopalakrishnan 1121b457429SAravind Gopalakrishnan return false; 1131b457429SAravind Gopalakrishnan } 1141b457429SAravind Gopalakrishnan 11523ac4ae8SAndreas Herrmann #else 11623ac4ae8SAndreas Herrmann 1179653a5c7SHans Rosenfeld #define amd_nb_num(x) 0 1189653a5c7SHans Rosenfeld #define amd_nb_has_feature(x) false node_to_amd_nb(int node)119*3e3bc9cfSArnd Bergmannstatic inline struct amd_northbridge *node_to_amd_nb(int node) 120*3e3bc9cfSArnd Bergmann { 121*3e3bc9cfSArnd Bergmann return NULL; 122*3e3bc9cfSArnd Bergmann } 1231b457429SAravind Gopalakrishnan #define amd_gart_present(x) false 1249653a5c7SHans Rosenfeld 12523ac4ae8SAndreas Herrmann #endif 12623ac4ae8SAndreas Herrmann 12723ac4ae8SAndreas Herrmann 12823ac4ae8SAndreas Herrmann #endif /* _ASM_X86_AMD_NB_H */ 129