1*145eba1aSCai Huoqing /* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */ 2f48ad614SDennis Dalessandro /* 30bae02d5SGrzegorz Andrejczuk * Copyright(c) 2015 - 2020 Intel Corporation. 4f48ad614SDennis Dalessandro */ 5*145eba1aSCai Huoqing 6f48ad614SDennis Dalessandro #ifndef _HFI1_AFFINITY_H 7f48ad614SDennis Dalessandro #define _HFI1_AFFINITY_H 8f48ad614SDennis Dalessandro 9f48ad614SDennis Dalessandro #include "hfi.h" 10f48ad614SDennis Dalessandro 11f48ad614SDennis Dalessandro enum irq_type { 12f48ad614SDennis Dalessandro IRQ_SDMA, 13f48ad614SDennis Dalessandro IRQ_RCVCTXT, 140bae02d5SGrzegorz Andrejczuk IRQ_NETDEVCTXT, 15f48ad614SDennis Dalessandro IRQ_GENERAL, 16f48ad614SDennis Dalessandro IRQ_OTHER 17f48ad614SDennis Dalessandro }; 18f48ad614SDennis Dalessandro 19f48ad614SDennis Dalessandro /* Can be used for both memory and cpu */ 20f48ad614SDennis Dalessandro enum affinity_flags { 21f48ad614SDennis Dalessandro AFF_AUTO, 22f48ad614SDennis Dalessandro AFF_NUMA_LOCAL, 23f48ad614SDennis Dalessandro AFF_DEV_LOCAL, 24f48ad614SDennis Dalessandro AFF_IRQ_LOCAL 25f48ad614SDennis Dalessandro }; 26f48ad614SDennis Dalessandro 27f48ad614SDennis Dalessandro struct cpu_mask_set { 28f48ad614SDennis Dalessandro struct cpumask mask; 29f48ad614SDennis Dalessandro struct cpumask used; 30f48ad614SDennis Dalessandro uint gen; 31f48ad614SDennis Dalessandro }; 32f48ad614SDennis Dalessandro 33f48ad614SDennis Dalessandro struct hfi1_msix_entry; 34f48ad614SDennis Dalessandro 35f48ad614SDennis Dalessandro /* Initialize non-HT cpu cores mask */ 364197344bSDennis Dalessandro void init_real_cpu_mask(void); 37f48ad614SDennis Dalessandro /* Initialize driver affinity data */ 38721c4621SMichael J. Ruhl int hfi1_dev_affinity_init(struct hfi1_devdata *dd); 39f48ad614SDennis Dalessandro /* 40f48ad614SDennis Dalessandro * Set IRQ affinity to a CPU. The function will determine the 41f48ad614SDennis Dalessandro * CPU and set the affinity to it. 42f48ad614SDennis Dalessandro */ 43721c4621SMichael J. Ruhl int hfi1_get_irq_affinity(struct hfi1_devdata *dd, 44721c4621SMichael J. Ruhl struct hfi1_msix_entry *msix); 45f48ad614SDennis Dalessandro /* 46f48ad614SDennis Dalessandro * Remove the IRQ's CPU affinity. This function also updates 47f48ad614SDennis Dalessandro * any internal CPU tracking data 48f48ad614SDennis Dalessandro */ 49721c4621SMichael J. Ruhl void hfi1_put_irq_affinity(struct hfi1_devdata *dd, 50721c4621SMichael J. Ruhl struct hfi1_msix_entry *msix); 51f48ad614SDennis Dalessandro /* 52f48ad614SDennis Dalessandro * Determine a CPU affinity for a user process, if the process does not 53f48ad614SDennis Dalessandro * have an affinity set yet. 54f48ad614SDennis Dalessandro */ 55721c4621SMichael J. Ruhl int hfi1_get_proc_affinity(int node); 56f48ad614SDennis Dalessandro /* Release a CPU used by a user process. */ 57721c4621SMichael J. Ruhl void hfi1_put_proc_affinity(int cpu); 58f48ad614SDennis Dalessandro 594197344bSDennis Dalessandro struct hfi1_affinity_node { 604197344bSDennis Dalessandro int node; 615d18ee67SSebastian Sanchez u16 __percpu *comp_vect_affinity; 624197344bSDennis Dalessandro struct cpu_mask_set def_intr; 634197344bSDennis Dalessandro struct cpu_mask_set rcv_intr; 64d6373019SSebastian Sanchez struct cpumask general_intr_mask; 655d18ee67SSebastian Sanchez struct cpumask comp_vect_mask; 664197344bSDennis Dalessandro struct list_head list; 674197344bSDennis Dalessandro }; 684197344bSDennis Dalessandro 694197344bSDennis Dalessandro struct hfi1_affinity_node_list { 704197344bSDennis Dalessandro struct list_head list; 714197344bSDennis Dalessandro struct cpumask real_cpu_mask; 724197344bSDennis Dalessandro struct cpu_mask_set proc; 73b094a36fSSebastian Sanchez int num_core_siblings; 749d8145a6SHarish Chegondi int num_possible_nodes; 75b094a36fSSebastian Sanchez int num_online_nodes; 76b094a36fSSebastian Sanchez int num_online_cpus; 77584d9577STadeusz Struk struct mutex lock; /* protects affinity nodes */ 784197344bSDennis Dalessandro }; 794197344bSDennis Dalessandro 80d6373019SSebastian Sanchez int node_affinity_init(void); 815d18ee67SSebastian Sanchez void node_affinity_destroy_all(void); 824197344bSDennis Dalessandro extern struct hfi1_affinity_node_list node_affinity; 835d18ee67SSebastian Sanchez void hfi1_dev_affinity_clean_up(struct hfi1_devdata *dd); 845d18ee67SSebastian Sanchez int hfi1_comp_vect_mappings_lookup(struct rvt_dev_info *rdi, int comp_vect); 855d18ee67SSebastian Sanchez int hfi1_comp_vectors_set_up(struct hfi1_devdata *dd); 865d18ee67SSebastian Sanchez void hfi1_comp_vectors_clean_up(struct hfi1_devdata *dd); 874197344bSDennis Dalessandro 88f48ad614SDennis Dalessandro #endif /* _HFI1_AFFINITY_H */ 89