xref: /openbmc/linux/arch/x86/include/asm/amd_nb.h (revision ecc23d0a422a3118fcf6e4f0a46e17a6c2047b02)
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 Gopalakrishnan static 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 Gopalakrishnan static 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 Bergmann static 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