]>
Commit | Line | Data |
---|---|---|
f67539c2 TL |
1 | /* SPDX-License-Identifier: BSD-3-Clause |
2 | * Copyright(C) 2019 Marvell International Ltd. | |
3 | */ | |
4 | ||
5 | #ifndef _DPI_MSG_H_ | |
6 | #define _DPI_MSG_H_ | |
7 | ||
8 | #include <dirent.h> | |
9 | #include <fcntl.h> | |
10 | #include <string.h> | |
11 | #include <unistd.h> | |
12 | ||
13 | #include "otx2_dpi_rawdev.h" | |
14 | ||
15 | /* DPI PF DBDF information macro's */ | |
16 | #define DPI_PF_DBDF_DOMAIN 0 | |
17 | #define DPI_PF_DBDF_BUS 5 | |
18 | #define DPI_PF_DBDF_DEVICE 0 | |
19 | #define DPI_PF_DBDF_FUNCTION 0 | |
20 | ||
21 | #define DPI_PF_MBOX_SYSFS_ENTRY "dpi_device_config" | |
22 | ||
23 | union dpi_mbox_message_u { | |
24 | uint64_t u[2]; | |
25 | struct dpi_mbox_message_s { | |
26 | /* VF ID to configure */ | |
27 | uint64_t vfid :4; | |
28 | /* Command code */ | |
29 | uint64_t cmd :4; | |
30 | /* Command buffer size in 8-byte words */ | |
31 | uint64_t csize :14; | |
32 | /* aura of the command buffer */ | |
33 | uint64_t aura :20; | |
34 | /* SSO PF function */ | |
35 | uint64_t sso_pf_func :16; | |
36 | /* NPA PF function */ | |
37 | uint64_t npa_pf_func :16; | |
38 | } s; | |
39 | }; | |
40 | ||
41 | static inline int | |
42 | send_msg_to_pf(const char *value, int size) | |
43 | { | |
44 | char buff[255] = { 0 }; | |
45 | int res, fd; | |
46 | ||
47 | res = snprintf(buff, sizeof(buff), "%s/" PCI_PRI_FMT "/%s", | |
48 | rte_pci_get_sysfs_path(), DPI_PF_DBDF_DOMAIN, | |
49 | DPI_PF_DBDF_BUS, DPI_PF_DBDF_DEVICE & 0x7, | |
50 | DPI_PF_DBDF_FUNCTION & 0x7, DPI_PF_MBOX_SYSFS_ENTRY); | |
51 | if ((res < 0) || ((size_t)res > sizeof(buff))) | |
52 | return -ERANGE; | |
53 | ||
54 | fd = open(buff, O_WRONLY); | |
55 | if (fd < 0) | |
56 | return -EACCES; | |
57 | res = write(fd, value, size); | |
58 | close(fd); | |
59 | if (res < 0) | |
60 | return -EACCES; | |
61 | ||
62 | return 0; | |
63 | } | |
64 | ||
65 | int | |
66 | otx2_dpi_queue_open(uint16_t vf_id, uint32_t size, uint32_t gaura) | |
67 | { | |
68 | union dpi_mbox_message_u mbox_msg; | |
69 | int ret = 0; | |
70 | ||
71 | /* DPI PF driver expects vfid starts from index 0 */ | |
72 | mbox_msg.s.vfid = vf_id; | |
73 | mbox_msg.s.cmd = DPI_QUEUE_OPEN; | |
74 | mbox_msg.s.csize = size; | |
75 | mbox_msg.s.aura = gaura; | |
76 | mbox_msg.s.sso_pf_func = otx2_sso_pf_func_get(); | |
77 | mbox_msg.s.npa_pf_func = otx2_npa_pf_func_get(); | |
78 | ||
79 | ret = send_msg_to_pf((const char *)&mbox_msg, | |
80 | sizeof(mbox_msg)); | |
81 | if (ret < 0) | |
82 | otx2_dpi_dbg("Failed to send mbox message to dpi pf"); | |
83 | ||
84 | return ret; | |
85 | } | |
86 | ||
87 | int | |
88 | otx2_dpi_queue_close(uint16_t vf_id) | |
89 | { | |
90 | union dpi_mbox_message_u mbox_msg; | |
91 | int ret = 0; | |
92 | ||
93 | /* DPI PF driver expects vfid starts from index 0 */ | |
94 | mbox_msg.s.vfid = vf_id; | |
95 | mbox_msg.s.cmd = DPI_QUEUE_CLOSE; | |
96 | ||
97 | ret = send_msg_to_pf((const char *)&mbox_msg, | |
98 | sizeof(mbox_msg)); | |
99 | if (ret < 0) | |
100 | otx2_dpi_dbg("Failed to send mbox message to dpi pf"); | |
101 | ||
102 | return ret; | |
103 | } | |
104 | ||
105 | #endif /* _DPI_MSG_H_ */ |