1 // SPDX-License-Identifier: GPL-2.0 2 // Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. 3 4 #include <linux/device.h> 5 6 #include "hinic3_hw_cfg.h" 7 #include "hinic3_hwdev.h" 8 #include "hinic3_hwif.h" 9 #include "hinic3_mbox.h" 10 11 int hinic3_alloc_irqs(struct hinic3_hwdev *hwdev, u16 num, 12 struct msix_entry *alloc_arr, u16 *act_num) 13 { 14 struct hinic3_irq_info *irq_info; 15 struct hinic3_irq *curr; 16 u16 i, found = 0; 17 18 irq_info = &hwdev->cfg_mgmt->irq_info; 19 mutex_lock(&irq_info->irq_mutex); 20 for (i = 0; i < irq_info->num_irq && found < num; i++) { 21 curr = irq_info->irq + i; 22 if (curr->allocated) 23 continue; 24 curr->allocated = true; 25 alloc_arr[found].vector = curr->irq_id; 26 alloc_arr[found].entry = curr->msix_entry_idx; 27 found++; 28 } 29 mutex_unlock(&irq_info->irq_mutex); 30 31 *act_num = found; 32 33 return found == 0 ? -ENOMEM : 0; 34 } 35 36 void hinic3_free_irq(struct hinic3_hwdev *hwdev, u32 irq_id) 37 { 38 struct hinic3_irq_info *irq_info; 39 struct hinic3_irq *curr; 40 u16 i; 41 42 irq_info = &hwdev->cfg_mgmt->irq_info; 43 mutex_lock(&irq_info->irq_mutex); 44 for (i = 0; i < irq_info->num_irq; i++) { 45 curr = irq_info->irq + i; 46 if (curr->irq_id == irq_id) { 47 curr->allocated = false; 48 break; 49 } 50 } 51 mutex_unlock(&irq_info->irq_mutex); 52 } 53 54 bool hinic3_support_nic(struct hinic3_hwdev *hwdev) 55 { 56 return hwdev->cfg_mgmt->cap.supp_svcs_bitmap & 57 BIT(HINIC3_SERVICE_T_NIC); 58 } 59 60 u16 hinic3_func_max_qnum(struct hinic3_hwdev *hwdev) 61 { 62 return hwdev->cfg_mgmt->cap.nic_svc_cap.max_sqs; 63 } 64 65 u8 hinic3_physical_port_id(struct hinic3_hwdev *hwdev) 66 { 67 return hwdev->cfg_mgmt->cap.port_id; 68 } 69