xref: /openbmc/linux/arch/x86/include/asm/amd_nb.h (revision 473e90b2e8356f084dcf9c815a5170d4d4925897)
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