1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2 /* 3 * Copyright(c) 2015 - 2020 Intel Corporation. 4 */ 5 6 #ifndef _HFI1_AFFINITY_H 7 #define _HFI1_AFFINITY_H 8 9 #include "hfi.h" 10 11 enum irq_type { 12 IRQ_SDMA, 13 IRQ_RCVCTXT, 14 IRQ_NETDEVCTXT, 15 IRQ_GENERAL, 16 IRQ_OTHER 17 }; 18 19 /* Can be used for both memory and cpu */ 20 enum affinity_flags { 21 AFF_AUTO, 22 AFF_NUMA_LOCAL, 23 AFF_DEV_LOCAL, 24 AFF_IRQ_LOCAL 25 }; 26 27 struct cpu_mask_set { 28 struct cpumask mask; 29 struct cpumask used; 30 uint gen; 31 }; 32 33 struct hfi1_msix_entry; 34 35 /* Initialize non-HT cpu cores mask */ 36 void init_real_cpu_mask(void); 37 /* Initialize driver affinity data */ 38 int hfi1_dev_affinity_init(struct hfi1_devdata *dd); 39 /* 40 * Set IRQ affinity to a CPU. The function will determine the 41 * CPU and set the affinity to it. 42 */ 43 int hfi1_get_irq_affinity(struct hfi1_devdata *dd, 44 struct hfi1_msix_entry *msix); 45 /* 46 * Remove the IRQ's CPU affinity. This function also updates 47 * any internal CPU tracking data 48 */ 49 void hfi1_put_irq_affinity(struct hfi1_devdata *dd, 50 struct hfi1_msix_entry *msix); 51 /* 52 * Determine a CPU affinity for a user process, if the process does not 53 * have an affinity set yet. 54 */ 55 int hfi1_get_proc_affinity(int node); 56 /* Release a CPU used by a user process. */ 57 void hfi1_put_proc_affinity(int cpu); 58 59 struct hfi1_affinity_node { 60 int node; 61 u16 __percpu *comp_vect_affinity; 62 struct cpu_mask_set def_intr; 63 struct cpu_mask_set rcv_intr; 64 struct cpumask general_intr_mask; 65 struct cpumask comp_vect_mask; 66 struct list_head list; 67 }; 68 69 struct hfi1_affinity_node_list { 70 struct list_head list; 71 struct cpumask real_cpu_mask; 72 struct cpu_mask_set proc; 73 int num_core_siblings; 74 int num_possible_nodes; 75 int num_online_nodes; 76 int num_online_cpus; 77 struct mutex lock; /* protects affinity nodes */ 78 }; 79 80 int node_affinity_init(void); 81 void node_affinity_destroy_all(void); 82 extern struct hfi1_affinity_node_list node_affinity; 83 void hfi1_dev_affinity_clean_up(struct hfi1_devdata *dd); 84 int hfi1_comp_vect_mappings_lookup(struct rvt_dev_info *rdi, int comp_vect); 85 int hfi1_comp_vectors_set_up(struct hfi1_devdata *dd); 86 void hfi1_comp_vectors_clean_up(struct hfi1_devdata *dd); 87 88 #endif /* _HFI1_AFFINITY_H */ 89