xaiefal
Loading...
Searching...
No Matches
xaiefal-rscmgr-linux.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <memory>
4#include <vector>
5#include <xaiengine.h>
6#include <xaiefal/common/xaiefal-common.hpp>
7#include <xaiefal/common/xaiefal-log.hpp>
8#include <xaiefal/rsc/xaiefal-rscmgr-backend-base.hpp>
9
10#ifdef FAL_LINUX
11#include <xaiengine/xlnx-ai-engine.h>
12#include <sys/ioctl.h>
13namespace xaiefal {
18 class XAieRscMgrLinux : public XAieRscMgrBackend {
19 public:
20 XAieRscMgrLinux() = delete;
21 XAieRscMgrLinux(XAieDevHandle *DevHd):
22 XAieRscMgrBackend(DevHd) {
23 if (DevHd->dev()->Backend->Type != XAIE_IO_BACKEND_LINUX)
24 throw std::invalid_argument("aie rscmgr: Driver not compiled with Linux Backend");
25 PartitionFd = DevHd->dev()->Backend->Ops.GetPartFd((void *)DevHd->dev()->IOInst);
26 }
27
36 AieRC request(XAieUserRsc& RscReq) {
37 struct aie_rsc_req_rsp Req;
38 struct aie_rsc RscRet;
39 int Ret;
40
41 Req.req.num_rscs = 1;
42 Req.req.flag = 0U;
43 Req.req.loc.col = RscReq.Loc.Col;
44 Req.req.loc.row = RscReq.Loc.Row;
45 Req.req.mod = static_cast<uint32_t>(RscReq.Mod);
46 Req.req.type = static_cast<uint32_t>(RscReq.RscType);
47 Req.rscs = (__u64)(uintptr_t)&RscRet;
48
49 Ret = ioctl(PartitionFd, AIE_RSC_REQ_IOCTL, &Req);
50 if (Ret != 0) {
51 return XAIE_ERR;
52 }
53 RscReq.RscId = RscRet.id;
54 return XAIE_OK;
55 }
56
65 AieRC requestAllocated(XAieUserRsc& RscReq) {
66 int Ret;
67
68 struct aie_rsc Rsc = {
69 .loc = {
70 .row = static_cast<uint8_t>(RscReq.Loc.Row),
71 .col = static_cast<uint8_t>(RscReq.Loc.Col),
72 },
73 .mod = static_cast<uint32_t>(RscReq.Mod),
74 .type = static_cast<uint32_t>(RscReq.RscType),
75 .id = RscReq.RscId,
76 };
77 Ret = ioctl(PartitionFd, AIE_RSC_REQ_SPECIFIC_IOCTL, &Rsc);
78 if (Ret != 0) {
79 return XAIE_ERR;
80 }
81 return XAIE_OK;
82 }
83
92 AieRC requestContiguous(std::vector<XAieUserRsc>& RscReq) {
93 struct aie_rsc_req_rsp Req;
94 struct aie_rsc RscRet[RscReq.size()];
95 int Ret;
96
97 Req.req.num_rscs = static_cast<uint32_t>(RscReq.size());
98 Req.req.loc.col = RscReq[0].Loc.Col;
99 Req.req.loc.row = RscReq[0].Loc.Row;
100 Req.req.mod = static_cast<uint32_t>(RscReq[0].Mod);
101 Req.req.type = static_cast<uint32_t>(RscReq[0].RscType);
102 Req.req.flag = XAIE_RSC_MGR_CONTIG_FLAG;
103 Req.rscs = (__u64)(uintptr_t)&RscRet;
104
105 Ret = ioctl(PartitionFd, AIE_RSC_REQ_IOCTL, &Req);
106 if (Ret != 0) {
107 return XAIE_ERR;
108 }
109 for (unsigned int i = 0; i < RscReq.size(); i++)
110 RscReq[i].RscId = RscRet[i].id;
111 return XAIE_OK;
112 }
113
123 AieRC requestBc(std::vector<XAieUserRsc>& RscReq, bool isBcAll) {
124 struct aie_rsc RscRet[RscReq.size()];
125 struct aie_rsc_bc_req Req;
126 int Ret;
127
128 Req.num_rscs = static_cast<uint32_t>(RscReq.size());
129 Req.flag = 0;
130 Req.id = RscReq[0].RscId;
131
132 if (isBcAll) {
133 Req.flag = XAIE_BROADCAST_ALL;
134 } else {
135 for (unsigned int i = 0; i < RscReq.size(); i++) {
136 RscRet[i].loc.col = static_cast<uint8_t>(RscReq[i].Loc.Col);
137 RscRet[i].loc.row = static_cast<uint8_t>(RscReq[i].Loc.Row);
138 RscRet[i].mod = static_cast<uint32_t>(RscReq[i].Mod);
139 }
140 }
141 Req.rscs = (__u64)(uintptr_t)&RscRet;
142
143 if (RscReq[0].RscId == XAIE_RSC_ID_ANY) {
144 Req.id = XAIE_BROADCAST_ID_ANY;
145 }
146
147 Ret = ioctl(PartitionFd, AIE_RSC_GET_COMMON_BROADCAST_IOCTL, &Req);
148 if (Ret != 0) {
149 return XAIE_ERR;
150 }
151 RscReq.resize(Req.num_rscs);
152 for (unsigned int i = 0; i < RscReq.size(); i++) {
153 RscReq[i].Loc.Col = RscRet[i].loc.col;
154 RscReq[i].Loc.Row = RscRet[i].loc.row;
155 RscReq[i].Mod = static_cast<XAie_ModuleType>(RscRet[i].mod);
156 RscReq[i].RscId = RscRet[i].id;
157 RscReq[i].RscType = XAIE_BROADCAST;
158 }
159 return XAIE_OK;
160 }
161
170 AieRC release(XAieUserRsc& RscRel) {
171 struct aie_rsc Rsc = {
172 .loc = {
173 .row = static_cast<uint8_t>(RscRel.Loc.Row),
174 .col = static_cast<uint8_t>(RscRel.Loc.Col),
175 },
176 .mod = static_cast<uint32_t>(RscRel.Mod),
177 .type = static_cast<uint32_t>(RscRel.RscType),
178 .id = RscRel.RscId,
179 };
180
181 ioctl(PartitionFd, AIE_RSC_RELEASE_IOCTL, &Rsc);
182 return XAIE_OK;
183 }
184
193 AieRC free(XAieUserRsc& RscFree) {
194 struct aie_rsc Rsc = {
195 .loc = {
196 .row = static_cast<uint8_t>(RscFree.Loc.Row),
197 .col = static_cast<uint8_t>(RscFree.Loc.Col),
198 },
199 .mod = static_cast<uint32_t>(RscFree.Mod),
200 .type = static_cast<uint32_t>(RscFree.RscType),
201 .id = RscFree.RscId,
202 };
203
204 ioctl(PartitionFd, AIE_RSC_FREE_IOCTL, &Rsc);
205 return XAIE_OK;
206 }
207
214 AieRC getRscStats(std::vector<XAieUserRscStat> &vStats,
215 XAieRscBitmapType BType) {
216 struct aie_rsc_user_stat RStats[vStats.size()];
217 struct aie_rsc_user_stat_array RStatArray;
218 int Ret;
219
220 RStatArray.num_stats = vStats.size();
221 RStatArray.stats = (__u64)(uintptr_t)&RStats;
222 if (BType == XAIE_STATIC_RSC)
223 RStatArray.stats_type = AIE_RSC_STAT_TYPE_STATIC;
224 else if (BType == XAIE_AVAIL_RSC)
225 RStatArray.stats_type = AIE_RSC_STAT_TYPE_AVAIL;
226
227 for (uint32_t i = 0; i < vStats.size(); i++) {
228 RStats[i].loc.col = vStats[i].Loc.Col;
229 RStats[i].loc.row = vStats[i].Loc.Row;
230 RStats[i].mod = static_cast<uint8_t>(vStats[i].Mod);
231 RStats[i].type = static_cast<uint8_t>(vStats[i].RscType);
232 }
233
234 Ret = ioctl(PartitionFd, AIE_RSC_GET_STAT_IOCTL, &RStatArray);
235 if (Ret != 0)
236 return XAIE_ERR;
237
238 for (uint32_t i = 0; i < vStats.size(); i++)
239 vStats[i].NumRscs = RStats[i].num_rscs;
240
241 return XAIE_OK;
242 }
243
244 private:
245 int PartitionFd;
246 }; /* class XAieRscMgrLinux */
247#endif /* FAL_LINUX */
248} /* namespace xaiefal */
Resource Manager Backend Base class.
Definition xaiefal-rscmgr-backend-base.hpp:23
Definition xaiefal-base.hpp:23
@ XAIE_BROADCAST
Definition xaiefal-rsc-group.hpp:33
#define XAIE_RSC_ID_ANY
Definition xaiefal-common.hpp:7