amd_nb.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #ifndef _ASM_X86_AMD_NB_H
  2. #define _ASM_X86_AMD_NB_H
  3. #include <linux/ioport.h>
  4. #include <linux/pci.h>
  5. struct amd_nb_bus_dev_range {
  6. u8 bus;
  7. u8 dev_base;
  8. u8 dev_limit;
  9. };
  10. extern const struct pci_device_id amd_nb_misc_ids[];
  11. extern const struct amd_nb_bus_dev_range amd_nb_bus_dev_ranges[];
  12. extern bool early_is_amd_nb(u32 value);
  13. extern struct resource *amd_get_mmconfig_range(struct resource *res);
  14. extern int amd_cache_northbridges(void);
  15. extern void amd_flush_garts(void);
  16. extern int amd_numa_init(void);
  17. extern int amd_get_subcaches(int);
  18. extern int amd_set_subcaches(int, int);
  19. struct amd_l3_cache {
  20. unsigned indices;
  21. u8 subcaches[4];
  22. };
  23. struct threshold_block {
  24. unsigned int block;
  25. unsigned int bank;
  26. unsigned int cpu;
  27. u32 address;
  28. u16 interrupt_enable;
  29. bool interrupt_capable;
  30. u16 threshold_limit;
  31. struct kobject kobj;
  32. struct list_head miscj;
  33. };
  34. struct threshold_bank {
  35. struct kobject *kobj;
  36. struct threshold_block *blocks;
  37. /* initialized to the number of CPUs on the node sharing this bank */
  38. atomic_t cpus;
  39. };
  40. struct amd_northbridge {
  41. struct pci_dev *misc;
  42. struct pci_dev *link;
  43. struct amd_l3_cache l3_cache;
  44. struct threshold_bank *bank4;
  45. };
  46. struct amd_northbridge_info {
  47. u16 num;
  48. u64 flags;
  49. struct amd_northbridge *nb;
  50. };
  51. extern struct amd_northbridge_info amd_northbridges;
  52. #define AMD_NB_GART BIT(0)
  53. #define AMD_NB_L3_INDEX_DISABLE BIT(1)
  54. #define AMD_NB_L3_PARTITIONING BIT(2)
  55. #ifdef CONFIG_AMD_NB
  56. static inline u16 amd_nb_num(void)
  57. {
  58. return amd_northbridges.num;
  59. }
  60. static inline bool amd_nb_has_feature(unsigned feature)
  61. {
  62. return ((amd_northbridges.flags & feature) == feature);
  63. }
  64. static inline struct amd_northbridge *node_to_amd_nb(int node)
  65. {
  66. return (node < amd_northbridges.num) ? &amd_northbridges.nb[node] : NULL;
  67. }
  68. static inline u16 amd_get_node_id(struct pci_dev *pdev)
  69. {
  70. struct pci_dev *misc;
  71. int i;
  72. for (i = 0; i != amd_nb_num(); i++) {
  73. misc = node_to_amd_nb(i)->misc;
  74. if (pci_domain_nr(misc->bus) == pci_domain_nr(pdev->bus) &&
  75. PCI_SLOT(misc->devfn) == PCI_SLOT(pdev->devfn))
  76. return i;
  77. }
  78. WARN(1, "Unable to find AMD Northbridge id for %s\n", pci_name(pdev));
  79. return 0;
  80. }
  81. #else
  82. #define amd_nb_num(x) 0
  83. #define amd_nb_has_feature(x) false
  84. #define node_to_amd_nb(x) NULL
  85. #endif
  86. #endif /* _ASM_X86_AMD_NB_H */