xref: /linux/drivers/net/ethernet/huawei/hinic3/hinic3_hw_cfg.c (revision da0e2197645c8e01bb6080c7a2b86d9a56cc64a9)
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