18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef _ASM_X86_AMD_NB_H
38c2ecf20Sopenharmony_ci#define _ASM_X86_AMD_NB_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <linux/ioport.h>
68c2ecf20Sopenharmony_ci#include <linux/pci.h>
78c2ecf20Sopenharmony_ci#include <linux/refcount.h>
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_cistruct amd_nb_bus_dev_range {
108c2ecf20Sopenharmony_ci	u8 bus;
118c2ecf20Sopenharmony_ci	u8 dev_base;
128c2ecf20Sopenharmony_ci	u8 dev_limit;
138c2ecf20Sopenharmony_ci};
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ciextern const struct amd_nb_bus_dev_range amd_nb_bus_dev_ranges[];
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ciextern bool early_is_amd_nb(u32 value);
188c2ecf20Sopenharmony_ciextern struct resource *amd_get_mmconfig_range(struct resource *res);
198c2ecf20Sopenharmony_ciextern int amd_cache_northbridges(void);
208c2ecf20Sopenharmony_ciextern void amd_flush_garts(void);
218c2ecf20Sopenharmony_ciextern int amd_numa_init(void);
228c2ecf20Sopenharmony_ciextern int amd_get_subcaches(int);
238c2ecf20Sopenharmony_ciextern int amd_set_subcaches(int, unsigned long);
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ciextern int amd_smn_read(u16 node, u32 address, u32 *value);
268c2ecf20Sopenharmony_ciextern int amd_smn_write(u16 node, u32 address, u32 value);
278c2ecf20Sopenharmony_ciextern int amd_df_indirect_read(u16 node, u8 func, u16 reg, u8 instance_id, u32 *lo);
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_cistruct amd_l3_cache {
308c2ecf20Sopenharmony_ci	unsigned indices;
318c2ecf20Sopenharmony_ci	u8	 subcaches[4];
328c2ecf20Sopenharmony_ci};
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_cistruct threshold_block {
358c2ecf20Sopenharmony_ci	unsigned int	 block;			/* Number within bank */
368c2ecf20Sopenharmony_ci	unsigned int	 bank;			/* MCA bank the block belongs to */
378c2ecf20Sopenharmony_ci	unsigned int	 cpu;			/* CPU which controls MCA bank */
388c2ecf20Sopenharmony_ci	u32		 address;		/* MSR address for the block */
398c2ecf20Sopenharmony_ci	u16		 interrupt_enable;	/* Enable/Disable APIC interrupt */
408c2ecf20Sopenharmony_ci	bool		 interrupt_capable;	/* Bank can generate an interrupt. */
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci	u16		 threshold_limit;	/*
438c2ecf20Sopenharmony_ci						 * Value upon which threshold
448c2ecf20Sopenharmony_ci						 * interrupt is generated.
458c2ecf20Sopenharmony_ci						 */
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci	struct kobject	 kobj;			/* sysfs object */
488c2ecf20Sopenharmony_ci	struct list_head miscj;			/*
498c2ecf20Sopenharmony_ci						 * List of threshold blocks
508c2ecf20Sopenharmony_ci						 * within a bank.
518c2ecf20Sopenharmony_ci						 */
528c2ecf20Sopenharmony_ci};
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_cistruct threshold_bank {
558c2ecf20Sopenharmony_ci	struct kobject		*kobj;
568c2ecf20Sopenharmony_ci	struct threshold_block	*blocks;
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci	/* initialized to the number of CPUs on the node sharing this bank */
598c2ecf20Sopenharmony_ci	refcount_t		cpus;
608c2ecf20Sopenharmony_ci	unsigned int		shared;
618c2ecf20Sopenharmony_ci};
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_cistruct amd_northbridge {
648c2ecf20Sopenharmony_ci	struct pci_dev *root;
658c2ecf20Sopenharmony_ci	struct pci_dev *misc;
668c2ecf20Sopenharmony_ci	struct pci_dev *link;
678c2ecf20Sopenharmony_ci	struct amd_l3_cache l3_cache;
688c2ecf20Sopenharmony_ci	struct threshold_bank *bank4;
698c2ecf20Sopenharmony_ci};
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_cistruct amd_northbridge_info {
728c2ecf20Sopenharmony_ci	u16 num;
738c2ecf20Sopenharmony_ci	u64 flags;
748c2ecf20Sopenharmony_ci	struct amd_northbridge *nb;
758c2ecf20Sopenharmony_ci};
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci#define AMD_NB_GART			BIT(0)
788c2ecf20Sopenharmony_ci#define AMD_NB_L3_INDEX_DISABLE		BIT(1)
798c2ecf20Sopenharmony_ci#define AMD_NB_L3_PARTITIONING		BIT(2)
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci#ifdef CONFIG_AMD_NB
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ciu16 amd_nb_num(void);
848c2ecf20Sopenharmony_cibool amd_nb_has_feature(unsigned int feature);
858c2ecf20Sopenharmony_cistruct amd_northbridge *node_to_amd_nb(int node);
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_cistatic inline u16 amd_pci_dev_to_node_id(struct pci_dev *pdev)
888c2ecf20Sopenharmony_ci{
898c2ecf20Sopenharmony_ci	struct pci_dev *misc;
908c2ecf20Sopenharmony_ci	int i;
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci	for (i = 0; i != amd_nb_num(); i++) {
938c2ecf20Sopenharmony_ci		misc = node_to_amd_nb(i)->misc;
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci		if (pci_domain_nr(misc->bus) == pci_domain_nr(pdev->bus) &&
968c2ecf20Sopenharmony_ci		    PCI_SLOT(misc->devfn) == PCI_SLOT(pdev->devfn))
978c2ecf20Sopenharmony_ci			return i;
988c2ecf20Sopenharmony_ci	}
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci	WARN(1, "Unable to find AMD Northbridge id for %s\n", pci_name(pdev));
1018c2ecf20Sopenharmony_ci	return 0;
1028c2ecf20Sopenharmony_ci}
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_cistatic inline bool amd_gart_present(void)
1058c2ecf20Sopenharmony_ci{
1068c2ecf20Sopenharmony_ci	if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD)
1078c2ecf20Sopenharmony_ci		return false;
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci	/* GART present only on Fam15h, upto model 0fh */
1108c2ecf20Sopenharmony_ci	if (boot_cpu_data.x86 == 0xf || boot_cpu_data.x86 == 0x10 ||
1118c2ecf20Sopenharmony_ci	    (boot_cpu_data.x86 == 0x15 && boot_cpu_data.x86_model < 0x10))
1128c2ecf20Sopenharmony_ci		return true;
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_ci	return false;
1158c2ecf20Sopenharmony_ci}
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci#else
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci#define amd_nb_num(x)		0
1208c2ecf20Sopenharmony_ci#define amd_nb_has_feature(x)	false
1218c2ecf20Sopenharmony_ci#define node_to_amd_nb(x)	NULL
1228c2ecf20Sopenharmony_ci#define amd_gart_present(x)	false
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ci#endif
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_ci#endif /* _ASM_X86_AMD_NB_H */
128