diff options
Diffstat (limited to 'arch/x86/include/asm/amd_nb.h')
| -rw-r--r-- | arch/x86/include/asm/amd_nb.h | 105 | 
1 files changed, 88 insertions, 17 deletions
diff --git a/arch/x86/include/asm/amd_nb.h b/arch/x86/include/asm/amd_nb.h index c8517f81b21..aaac3b2fb74 100644 --- a/arch/x86/include/asm/amd_nb.h +++ b/arch/x86/include/asm/amd_nb.h @@ -1,38 +1,109 @@  #ifndef _ASM_X86_AMD_NB_H  #define _ASM_X86_AMD_NB_H +#include <linux/ioport.h>  #include <linux/pci.h> -extern struct pci_device_id k8_nb_ids[]; -struct bootnode; +struct amd_nb_bus_dev_range { +	u8 bus; +	u8 dev_base; +	u8 dev_limit; +}; + +extern const struct pci_device_id amd_nb_misc_ids[]; +extern const struct amd_nb_bus_dev_range amd_nb_bus_dev_ranges[]; + +extern bool early_is_amd_nb(u32 value); +extern struct resource *amd_get_mmconfig_range(struct resource *res); +extern int amd_cache_northbridges(void); +extern void amd_flush_garts(void); +extern int amd_numa_init(void); +extern int amd_get_subcaches(int); +extern int amd_set_subcaches(int, unsigned long); + +struct amd_l3_cache { +	unsigned indices; +	u8	 subcaches[4]; +}; + +struct threshold_block { +	unsigned int		block; +	unsigned int		bank; +	unsigned int		cpu; +	u32			address; +	u16			interrupt_enable; +	bool			interrupt_capable; +	u16			threshold_limit; +	struct kobject		kobj; +	struct list_head	miscj; +}; -extern int early_is_k8_nb(u32 value); -extern int cache_k8_northbridges(void); -extern void k8_flush_garts(void); -extern int k8_get_nodes(struct bootnode *nodes); -extern int k8_numa_init(unsigned long start_pfn, unsigned long end_pfn); -extern int k8_scan_nodes(void); +struct threshold_bank { +	struct kobject		*kobj; +	struct threshold_block	*blocks; -struct k8_northbridge_info { +	/* initialized to the number of CPUs on the node sharing this bank */ +	atomic_t		cpus; +}; + +struct amd_northbridge { +	struct pci_dev *misc; +	struct pci_dev *link; +	struct amd_l3_cache l3_cache; +	struct threshold_bank *bank4; +}; + +struct amd_northbridge_info {  	u16 num; -	u8 gart_supported; -	struct pci_dev **nb_misc; +	u64 flags; +	struct amd_northbridge *nb;  }; -extern struct k8_northbridge_info k8_northbridges; +extern struct amd_northbridge_info amd_northbridges; + +#define AMD_NB_GART			BIT(0) +#define AMD_NB_L3_INDEX_DISABLE		BIT(1) +#define AMD_NB_L3_PARTITIONING		BIT(2)  #ifdef CONFIG_AMD_NB -static inline struct pci_dev *node_to_k8_nb_misc(int node) +static inline u16 amd_nb_num(void)  { -	return (node < k8_northbridges.num) ? k8_northbridges.nb_misc[node] : NULL; +	return amd_northbridges.num;  } -#else +static inline bool amd_nb_has_feature(unsigned feature) +{ +	return ((amd_northbridges.flags & feature) == feature); +} + +static inline struct amd_northbridge *node_to_amd_nb(int node) +{ +	return (node < amd_northbridges.num) ? &amd_northbridges.nb[node] : NULL; +} -static inline struct pci_dev *node_to_k8_nb_misc(int node) +static inline u16 amd_get_node_id(struct pci_dev *pdev)  { -	return NULL; +	struct pci_dev *misc; +	int i; + +	for (i = 0; i != amd_nb_num(); i++) { +		misc = node_to_amd_nb(i)->misc; + +		if (pci_domain_nr(misc->bus) == pci_domain_nr(pdev->bus) && +		    PCI_SLOT(misc->devfn) == PCI_SLOT(pdev->devfn)) +			return i; +	} + +	WARN(1, "Unable to find AMD Northbridge id for %s\n", pci_name(pdev)); +	return 0;  } + +#else + +#define amd_nb_num(x)		0 +#define amd_nb_has_feature(x)	false +#define node_to_amd_nb(x)	NULL +  #endif  | 
