162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright(c) 2017 Intel Corporation. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include "exp_rcv.h" 762306a36Sopenharmony_ci#include "trace.h" 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci/** 1062306a36Sopenharmony_ci * hfi1_exp_tid_set_init - initialize exp_tid_set 1162306a36Sopenharmony_ci * @set: the set 1262306a36Sopenharmony_ci */ 1362306a36Sopenharmony_cistatic void hfi1_exp_tid_set_init(struct exp_tid_set *set) 1462306a36Sopenharmony_ci{ 1562306a36Sopenharmony_ci INIT_LIST_HEAD(&set->list); 1662306a36Sopenharmony_ci set->count = 0; 1762306a36Sopenharmony_ci} 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/** 2062306a36Sopenharmony_ci * hfi1_exp_tid_group_init - initialize rcd expected receive 2162306a36Sopenharmony_ci * @rcd: the rcd 2262306a36Sopenharmony_ci */ 2362306a36Sopenharmony_civoid hfi1_exp_tid_group_init(struct hfi1_ctxtdata *rcd) 2462306a36Sopenharmony_ci{ 2562306a36Sopenharmony_ci hfi1_exp_tid_set_init(&rcd->tid_group_list); 2662306a36Sopenharmony_ci hfi1_exp_tid_set_init(&rcd->tid_used_list); 2762306a36Sopenharmony_ci hfi1_exp_tid_set_init(&rcd->tid_full_list); 2862306a36Sopenharmony_ci} 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci/** 3162306a36Sopenharmony_ci * hfi1_alloc_ctxt_rcv_groups - initialize expected receive groups 3262306a36Sopenharmony_ci * @rcd: the context to add the groupings to 3362306a36Sopenharmony_ci */ 3462306a36Sopenharmony_ciint hfi1_alloc_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd) 3562306a36Sopenharmony_ci{ 3662306a36Sopenharmony_ci struct hfi1_devdata *dd = rcd->dd; 3762306a36Sopenharmony_ci u32 tidbase; 3862306a36Sopenharmony_ci struct tid_group *grp; 3962306a36Sopenharmony_ci int i; 4062306a36Sopenharmony_ci u32 ngroups; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci ngroups = rcd->expected_count / dd->rcv_entries.group_size; 4362306a36Sopenharmony_ci rcd->groups = 4462306a36Sopenharmony_ci kcalloc_node(ngroups, sizeof(*rcd->groups), 4562306a36Sopenharmony_ci GFP_KERNEL, rcd->numa_id); 4662306a36Sopenharmony_ci if (!rcd->groups) 4762306a36Sopenharmony_ci return -ENOMEM; 4862306a36Sopenharmony_ci tidbase = rcd->expected_base; 4962306a36Sopenharmony_ci for (i = 0; i < ngroups; i++) { 5062306a36Sopenharmony_ci grp = &rcd->groups[i]; 5162306a36Sopenharmony_ci grp->size = dd->rcv_entries.group_size; 5262306a36Sopenharmony_ci grp->base = tidbase; 5362306a36Sopenharmony_ci tid_group_add_tail(grp, &rcd->tid_group_list); 5462306a36Sopenharmony_ci tidbase += dd->rcv_entries.group_size; 5562306a36Sopenharmony_ci } 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci return 0; 5862306a36Sopenharmony_ci} 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci/** 6162306a36Sopenharmony_ci * hfi1_free_ctxt_rcv_groups - free expected receive groups 6262306a36Sopenharmony_ci * @rcd: the context to free 6362306a36Sopenharmony_ci * 6462306a36Sopenharmony_ci * The routine dismantles the expect receive linked 6562306a36Sopenharmony_ci * list and clears any tids associated with the receive 6662306a36Sopenharmony_ci * context. 6762306a36Sopenharmony_ci * 6862306a36Sopenharmony_ci * This should only be called for kernel contexts and the 6962306a36Sopenharmony_ci * a base user context. 7062306a36Sopenharmony_ci */ 7162306a36Sopenharmony_civoid hfi1_free_ctxt_rcv_groups(struct hfi1_ctxtdata *rcd) 7262306a36Sopenharmony_ci{ 7362306a36Sopenharmony_ci kfree(rcd->groups); 7462306a36Sopenharmony_ci rcd->groups = NULL; 7562306a36Sopenharmony_ci hfi1_exp_tid_group_init(rcd); 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci hfi1_clear_tids(rcd); 7862306a36Sopenharmony_ci} 79