123ac4ae8SAndreas Herrmann #ifndef _ASM_X86_AMD_NB_H 223ac4ae8SAndreas Herrmann #define _ASM_X86_AMD_NB_H 323ac4ae8SAndreas Herrmann 424d25dbfSBjorn Helgaas #include <linux/ioport.h> 523ac4ae8SAndreas Herrmann #include <linux/pci.h> 6*473e90b2SElena Reshetova #include <linux/refcount.h> 723ac4ae8SAndreas Herrmann 824d9b70bSJan Beulich struct amd_nb_bus_dev_range { 924d9b70bSJan Beulich u8 bus; 1024d9b70bSJan Beulich u8 dev_base; 1124d9b70bSJan Beulich u8 dev_limit; 1224d9b70bSJan Beulich }; 1324d9b70bSJan Beulich 14691269f0SJan Beulich extern const struct pci_device_id amd_nb_misc_ids[]; 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); 199653a5c7SHans Rosenfeld extern int amd_cache_northbridges(void); 20eec1d4faSHans Rosenfeld extern void amd_flush_garts(void); 21940fed2eSTejun Heo extern int amd_numa_init(void); 22cabb5bd7SHans Rosenfeld extern int amd_get_subcaches(int); 232993ae33SDan Carpenter extern int amd_set_subcaches(int, unsigned long); 2423ac4ae8SAndreas Herrmann 25ddfe43cdSYazen Ghannam extern int amd_smn_read(u16 node, u32 address, u32 *value); 26ddfe43cdSYazen Ghannam extern int amd_smn_write(u16 node, u32 address, u32 value); 27ddfe43cdSYazen Ghannam extern int amd_df_indirect_read(u16 node, u8 func, u16 reg, u8 instance_id, u32 *lo); 28ddfe43cdSYazen Ghannam 29d2946041SThomas Gleixner struct amd_l3_cache { 30d2946041SThomas Gleixner unsigned indices; 31d2946041SThomas Gleixner u8 subcaches[4]; 32d2946041SThomas Gleixner }; 33d2946041SThomas Gleixner 34019f34fcSBorislav Petkov struct threshold_block { 35ea2ca36bSAravind Gopalakrishnan unsigned int block; /* Number within bank */ 36ea2ca36bSAravind Gopalakrishnan unsigned int bank; /* MCA bank the block belongs to */ 37ea2ca36bSAravind Gopalakrishnan unsigned int cpu; /* CPU which controls MCA bank */ 38ea2ca36bSAravind Gopalakrishnan u32 address; /* MSR address for the block */ 39ea2ca36bSAravind Gopalakrishnan u16 interrupt_enable; /* Enable/Disable APIC interrupt */ 40ea2ca36bSAravind Gopalakrishnan bool interrupt_capable; /* Bank can generate an interrupt. */ 41ea2ca36bSAravind Gopalakrishnan 42ea2ca36bSAravind Gopalakrishnan u16 threshold_limit; /* 43ea2ca36bSAravind Gopalakrishnan * Value upon which threshold 44ea2ca36bSAravind Gopalakrishnan * interrupt is generated. 45ea2ca36bSAravind Gopalakrishnan */ 46ea2ca36bSAravind Gopalakrishnan 47ea2ca36bSAravind Gopalakrishnan struct kobject kobj; /* sysfs object */ 48ea2ca36bSAravind Gopalakrishnan struct list_head miscj; /* 49ea2ca36bSAravind Gopalakrishnan * List of threshold blocks 50ea2ca36bSAravind Gopalakrishnan * within a bank. 51ea2ca36bSAravind Gopalakrishnan */ 52019f34fcSBorislav Petkov }; 53019f34fcSBorislav Petkov 54019f34fcSBorislav Petkov struct threshold_bank { 55019f34fcSBorislav Petkov struct kobject *kobj; 56019f34fcSBorislav Petkov struct threshold_block *blocks; 57019f34fcSBorislav Petkov 58019f34fcSBorislav Petkov /* initialized to the number of CPUs on the node sharing this bank */ 59*473e90b2SElena Reshetova refcount_t cpus; 60019f34fcSBorislav Petkov }; 61019f34fcSBorislav Petkov 629653a5c7SHans Rosenfeld struct amd_northbridge { 63ddfe43cdSYazen Ghannam struct pci_dev *root; 649653a5c7SHans Rosenfeld struct pci_dev *misc; 6541b2610cSHans Rosenfeld struct pci_dev *link; 66d2946041SThomas Gleixner struct amd_l3_cache l3_cache; 67019f34fcSBorislav Petkov struct threshold_bank *bank4; 689653a5c7SHans Rosenfeld }; 699653a5c7SHans Rosenfeld 70eec1d4faSHans Rosenfeld struct amd_northbridge_info { 7123ac4ae8SAndreas Herrmann u16 num; 729653a5c7SHans Rosenfeld u64 flags; 739653a5c7SHans Rosenfeld struct amd_northbridge *nb; 7423ac4ae8SAndreas Herrmann }; 7523ac4ae8SAndreas Herrmann 7684fd1d35SBorislav Petkov #define AMD_NB_GART BIT(0) 7784fd1d35SBorislav Petkov #define AMD_NB_L3_INDEX_DISABLE BIT(1) 7884fd1d35SBorislav Petkov #define AMD_NB_L3_PARTITIONING BIT(2) 799653a5c7SHans Rosenfeld 8023ac4ae8SAndreas Herrmann #ifdef CONFIG_AMD_NB 8123ac4ae8SAndreas Herrmann 82c7993890SYazen Ghannam u16 amd_nb_num(void); 83c7993890SYazen Ghannam bool amd_nb_has_feature(unsigned int feature); 84c7993890SYazen Ghannam struct amd_northbridge *node_to_amd_nb(int node); 8523ac4ae8SAndreas Herrmann 861a6775c1SAravind Gopalakrishnan static inline u16 amd_pci_dev_to_node_id(struct pci_dev *pdev) 87772c3ff3SDaniel J Blueman { 88772c3ff3SDaniel J Blueman struct pci_dev *misc; 89772c3ff3SDaniel J Blueman int i; 90772c3ff3SDaniel J Blueman 91772c3ff3SDaniel J Blueman for (i = 0; i != amd_nb_num(); i++) { 92772c3ff3SDaniel J Blueman misc = node_to_amd_nb(i)->misc; 93772c3ff3SDaniel J Blueman 94772c3ff3SDaniel J Blueman if (pci_domain_nr(misc->bus) == pci_domain_nr(pdev->bus) && 95772c3ff3SDaniel J Blueman PCI_SLOT(misc->devfn) == PCI_SLOT(pdev->devfn)) 96772c3ff3SDaniel J Blueman return i; 97772c3ff3SDaniel J Blueman } 98772c3ff3SDaniel J Blueman 99772c3ff3SDaniel J Blueman WARN(1, "Unable to find AMD Northbridge id for %s\n", pci_name(pdev)); 100772c3ff3SDaniel J Blueman return 0; 101772c3ff3SDaniel J Blueman } 102772c3ff3SDaniel J Blueman 1031b457429SAravind Gopalakrishnan static inline bool amd_gart_present(void) 1041b457429SAravind Gopalakrishnan { 1051b457429SAravind Gopalakrishnan /* GART present only on Fam15h, upto model 0fh */ 1061b457429SAravind Gopalakrishnan if (boot_cpu_data.x86 == 0xf || boot_cpu_data.x86 == 0x10 || 1071b457429SAravind Gopalakrishnan (boot_cpu_data.x86 == 0x15 && boot_cpu_data.x86_model < 0x10)) 1081b457429SAravind Gopalakrishnan return true; 1091b457429SAravind Gopalakrishnan 1101b457429SAravind Gopalakrishnan return false; 1111b457429SAravind Gopalakrishnan } 1121b457429SAravind Gopalakrishnan 11323ac4ae8SAndreas Herrmann #else 11423ac4ae8SAndreas Herrmann 1159653a5c7SHans Rosenfeld #define amd_nb_num(x) 0 1169653a5c7SHans Rosenfeld #define amd_nb_has_feature(x) false 1179653a5c7SHans Rosenfeld #define node_to_amd_nb(x) NULL 1181b457429SAravind Gopalakrishnan #define amd_gart_present(x) false 1199653a5c7SHans Rosenfeld 12023ac4ae8SAndreas Herrmann #endif 12123ac4ae8SAndreas Herrmann 12223ac4ae8SAndreas Herrmann 12323ac4ae8SAndreas Herrmann #endif /* _ASM_X86_AMD_NB_H */ 124