1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright(c) 2015 - 2020 Intel Corporation. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * This file is provided under a dual BSD/GPLv2 license. When using or 5*4882a593Smuzhiyun * redistributing this file, you may do so under either license. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * GPL LICENSE SUMMARY 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify 10*4882a593Smuzhiyun * it under the terms of version 2 of the GNU General Public License as 11*4882a593Smuzhiyun * published by the Free Software Foundation. 12*4882a593Smuzhiyun * 13*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but 14*4882a593Smuzhiyun * WITHOUT ANY WARRANTY; without even the implied warranty of 15*4882a593Smuzhiyun * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16*4882a593Smuzhiyun * General Public License for more details. 17*4882a593Smuzhiyun * 18*4882a593Smuzhiyun * BSD LICENSE 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or without 21*4882a593Smuzhiyun * modification, are permitted provided that the following conditions 22*4882a593Smuzhiyun * are met: 23*4882a593Smuzhiyun * 24*4882a593Smuzhiyun * - Redistributions of source code must retain the above copyright 25*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer. 26*4882a593Smuzhiyun * - Redistributions in binary form must reproduce the above copyright 27*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer in 28*4882a593Smuzhiyun * the documentation and/or other materials provided with the 29*4882a593Smuzhiyun * distribution. 30*4882a593Smuzhiyun * - Neither the name of Intel Corporation nor the names of its 31*4882a593Smuzhiyun * contributors may be used to endorse or promote products derived 32*4882a593Smuzhiyun * from this software without specific prior written permission. 33*4882a593Smuzhiyun * 34*4882a593Smuzhiyun * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 35*4882a593Smuzhiyun * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 36*4882a593Smuzhiyun * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 37*4882a593Smuzhiyun * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 38*4882a593Smuzhiyun * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 39*4882a593Smuzhiyun * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 40*4882a593Smuzhiyun * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 41*4882a593Smuzhiyun * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 42*4882a593Smuzhiyun * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 43*4882a593Smuzhiyun * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 44*4882a593Smuzhiyun * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 45*4882a593Smuzhiyun * 46*4882a593Smuzhiyun */ 47*4882a593Smuzhiyun #ifndef _HFI1_AFFINITY_H 48*4882a593Smuzhiyun #define _HFI1_AFFINITY_H 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #include "hfi.h" 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun enum irq_type { 53*4882a593Smuzhiyun IRQ_SDMA, 54*4882a593Smuzhiyun IRQ_RCVCTXT, 55*4882a593Smuzhiyun IRQ_NETDEVCTXT, 56*4882a593Smuzhiyun IRQ_GENERAL, 57*4882a593Smuzhiyun IRQ_OTHER 58*4882a593Smuzhiyun }; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun /* Can be used for both memory and cpu */ 61*4882a593Smuzhiyun enum affinity_flags { 62*4882a593Smuzhiyun AFF_AUTO, 63*4882a593Smuzhiyun AFF_NUMA_LOCAL, 64*4882a593Smuzhiyun AFF_DEV_LOCAL, 65*4882a593Smuzhiyun AFF_IRQ_LOCAL 66*4882a593Smuzhiyun }; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun struct cpu_mask_set { 69*4882a593Smuzhiyun struct cpumask mask; 70*4882a593Smuzhiyun struct cpumask used; 71*4882a593Smuzhiyun uint gen; 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun struct hfi1_msix_entry; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* Initialize non-HT cpu cores mask */ 77*4882a593Smuzhiyun void init_real_cpu_mask(void); 78*4882a593Smuzhiyun /* Initialize driver affinity data */ 79*4882a593Smuzhiyun int hfi1_dev_affinity_init(struct hfi1_devdata *dd); 80*4882a593Smuzhiyun /* 81*4882a593Smuzhiyun * Set IRQ affinity to a CPU. The function will determine the 82*4882a593Smuzhiyun * CPU and set the affinity to it. 83*4882a593Smuzhiyun */ 84*4882a593Smuzhiyun int hfi1_get_irq_affinity(struct hfi1_devdata *dd, 85*4882a593Smuzhiyun struct hfi1_msix_entry *msix); 86*4882a593Smuzhiyun /* 87*4882a593Smuzhiyun * Remove the IRQ's CPU affinity. This function also updates 88*4882a593Smuzhiyun * any internal CPU tracking data 89*4882a593Smuzhiyun */ 90*4882a593Smuzhiyun void hfi1_put_irq_affinity(struct hfi1_devdata *dd, 91*4882a593Smuzhiyun struct hfi1_msix_entry *msix); 92*4882a593Smuzhiyun /* 93*4882a593Smuzhiyun * Determine a CPU affinity for a user process, if the process does not 94*4882a593Smuzhiyun * have an affinity set yet. 95*4882a593Smuzhiyun */ 96*4882a593Smuzhiyun int hfi1_get_proc_affinity(int node); 97*4882a593Smuzhiyun /* Release a CPU used by a user process. */ 98*4882a593Smuzhiyun void hfi1_put_proc_affinity(int cpu); 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun struct hfi1_affinity_node { 101*4882a593Smuzhiyun int node; 102*4882a593Smuzhiyun u16 __percpu *comp_vect_affinity; 103*4882a593Smuzhiyun struct cpu_mask_set def_intr; 104*4882a593Smuzhiyun struct cpu_mask_set rcv_intr; 105*4882a593Smuzhiyun struct cpumask general_intr_mask; 106*4882a593Smuzhiyun struct cpumask comp_vect_mask; 107*4882a593Smuzhiyun struct list_head list; 108*4882a593Smuzhiyun }; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun struct hfi1_affinity_node_list { 111*4882a593Smuzhiyun struct list_head list; 112*4882a593Smuzhiyun struct cpumask real_cpu_mask; 113*4882a593Smuzhiyun struct cpu_mask_set proc; 114*4882a593Smuzhiyun int num_core_siblings; 115*4882a593Smuzhiyun int num_possible_nodes; 116*4882a593Smuzhiyun int num_online_nodes; 117*4882a593Smuzhiyun int num_online_cpus; 118*4882a593Smuzhiyun struct mutex lock; /* protects affinity nodes */ 119*4882a593Smuzhiyun }; 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun int node_affinity_init(void); 122*4882a593Smuzhiyun void node_affinity_destroy_all(void); 123*4882a593Smuzhiyun extern struct hfi1_affinity_node_list node_affinity; 124*4882a593Smuzhiyun void hfi1_dev_affinity_clean_up(struct hfi1_devdata *dd); 125*4882a593Smuzhiyun int hfi1_comp_vect_mappings_lookup(struct rvt_dev_info *rdi, int comp_vect); 126*4882a593Smuzhiyun int hfi1_comp_vectors_set_up(struct hfi1_devdata *dd); 127*4882a593Smuzhiyun void hfi1_comp_vectors_clean_up(struct hfi1_devdata *dd); 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun #endif /* _HFI1_AFFINITY_H */ 130