xaiefal
Loading...
Searching...
No Matches
xaiefal-pc.hpp
Go to the documentation of this file.
1// Copyright(C) 2020 - 2021 by Xilinx, Inc. All rights reserved.
2// SPDX-License-Identifier: MIT
3
4#include <fstream>
5#include <functional>
6#include <string.h>
7#include <vector>
8#include <xaiengine.h>
9
10#include <xaiefal/rsc/xaiefal-rsc-base.hpp>
11#include <xaiefal/rsc/xaiefal-rscmgr.hpp>
12
13#pragma once
14
15namespace xaiefal {
21 public:
22 XAiePCEvent() = delete;
23 XAiePCEvent(std::shared_ptr<XAieDevHandle> DevHd,
24 XAie_LocType Loc):
25 XAieSingleTileRsc(DevHd, Loc, XAIE_CORE_MOD, XAIE_PCEVENT),
26 PcAddr(0) {
27 State.Initialized = 1;
28 }
29 XAiePCEvent(XAieDev &Dev, XAie_LocType Loc):
30 XAiePCEvent(Dev.getDevHandle(), Loc) {};
31
37 AieRC updatePcAddr(uint32_t Addr) {
38 PcAddr = Addr;
39 if (State.Running == 1) {
40 XAie_EventPCDisable(dev(), Loc, vRscs[0].RscId);
41 XAie_EventPCEnable(dev(), Loc, vRscs[0].RscId, PcAddr);
42 } else {
43 State.Configured = 1;
44 }
45 return XAIE_OK;
46 }
47
52 uint32_t getPcAddr() const {
53 return PcAddr;
54 }
55
62 AieRC getEvent(XAie_Events &Event) const {
63 AieRC RC = XAIE_OK;
64 if (State.Reserved == 0) {
65 Logger::log(LogLevel::FAL_ERROR) << "PC Event " << __func__ << " (" <<
66 static_cast<uint32_t>(Loc.Col) << "," << static_cast<uint32_t>(Loc.Row) << ")" <<
67 " resource not resesrved." << std::endl;
68 RC = XAIE_ERR;
69 } else {
70 Event = XAIE_EVENT_PC_0_CORE;
71 Event = (XAie_Events)(static_cast<uint32_t>(Event) + vRscs[0].RscId);
72 }
73 return RC;
74 }
75 protected:
76 uint32_t PcAddr;
77 private:
78 AieRC _reserve() {
79 AieRC RC;
80
81 if (XAie_GetTileTypefromLoc(dev(), Loc) != XAIEGBL_TILE_TYPE_AIETILE) {
82 Logger::log(LogLevel::FAL_ERROR) << "PC event " << __func__ << " (" <<
83 static_cast<uint32_t>(Loc.Col) << "," << static_cast<uint32_t>(Loc.Row) << ")" <<
84 " tile is not core tile." << std::endl;
85 RC = XAIE_ERR;
86 } else {
87 XAieUserRsc Rsc;
88
89 Rsc.Loc = Loc;
90 Rsc.Mod = Mod;
91 Rsc.RscType = Type;
92 Rsc.RscId = preferredId;
93 vRscs.push_back(Rsc);
94 RC = AieHd->rscMgr()->request(*this);
95 if (RC != XAIE_OK) {
96 Logger::log(LogLevel::FAL_WARN) << "pcevent " << __func__ << " (" <<
97 static_cast<uint32_t>(Loc.Col) << "," << static_cast<uint32_t>(Loc.Row) << ")" <<
98 " no available resource.\n";
99 } else {
100 reservedId = vRscs[0].RscId;
101 }
102 }
103 return RC;
104 }
105 AieRC _release() {
106 AieRC RC;
107
108 RC = AieHd->rscMgr()->release(*this);
109 vRscs.clear();
110 return RC;
111 }
112 AieRC _start() {
113 return XAie_EventPCEnable(dev(), Loc, vRscs[0].RscId, PcAddr);
114 }
115 AieRC _stop() {
116 return XAie_EventPCDisable(dev(), Loc, vRscs[0].RscId);
117 }
118 };
119
125 public:
126 XAiePCRange() = delete;
127 XAiePCRange(std::shared_ptr<XAieDevHandle> DevHd,
128 XAie_LocType Loc):
130 for (int i = 0;
131 i < (int)(sizeof(PcAddrs)/sizeof(PcAddrs[0]));
132 i++) {
133 PcAddrs[i] = 0;
134 }
135 State.Initialized = 1;
136 }
137 XAiePCRange(XAieDev &Dev, XAie_LocType Loc):
138 XAiePCRange(Dev.getDevHandle(), Loc) {};
139
146 AieRC updatePcAddr(uint32_t Addr0, uint32_t Addr1) {
147 PcAddrs[0] = Addr0;
148 PcAddrs[1] = Addr1;
149 if (State.Running == 1) {
150 XAie_EventPCDisable(dev(), Loc, vRscs[0].RscId);
151 XAie_EventPCDisable(dev(), Loc, vRscs[1].RscId);
152 XAie_EventPCEnable(dev(), Loc, vRscs[0].RscId, PcAddrs[0]);
153 XAie_EventPCEnable(dev(), Loc, vRscs[1].RscId, PcAddrs[1]);
154 } else {
155 State.Configured = 1;
156 }
157 return XAIE_OK;
158 }
159
164 void getPcAddr(uint32_t &Addr0, uint32_t &Addr1) const {
165 Addr0 = PcAddrs[0];
166 Addr1 = PcAddrs[1];
167 }
168
175 AieRC getEvent(XAie_Events &Event) const {
176 AieRC RC = XAIE_OK;
177 if (State.Reserved == 0) {
178 Logger::log(LogLevel::FAL_ERROR) << "PC range " << __func__ << " (" <<
179 static_cast<uint32_t>(Loc.Col) << "," << static_cast<uint32_t>(Loc.Row) << ")" <<
180 " resource not resesrved." << std::endl;
181 RC = XAIE_ERR;
182 } else if (vRscs[0].RscId == 0) {
183 Event = XAIE_EVENT_PC_RANGE_0_1_CORE;
184 } else {
185 Event = XAIE_EVENT_PC_RANGE_2_3_CORE;
186 }
187 return RC;
188 }
189 protected:
190 uint32_t PcAddrs[2];
191 private:
192 AieRC _reserve() {
193 AieRC RC;
194
195 if (XAie_GetTileTypefromLoc(dev(), Loc) != XAIEGBL_TILE_TYPE_AIETILE) {
196 Logger::log(LogLevel::FAL_ERROR) << "PC range " << __func__ << " (" <<
197 static_cast<uint32_t>(Loc.Col) << "," << static_cast<uint32_t>(Loc.Row) << ")" <<
198 " not core tile." << std::endl;
199 RC = XAIE_ERR;
200 } else {
201 XAieUserRsc Rsc;
202
203 Rsc.Loc = Loc;
204 Rsc.Mod = Mod;
205 Rsc.RscType = Type;
206 Rsc.RscId = preferredId;
207
208 vRscs.insert(vRscs.end(), {Rsc, Rsc});
209 RC = AieHd->rscMgr()->request(*this);
210 }
211
212 if (RC != XAIE_OK) {
213 Logger::log(LogLevel::FAL_ERROR) << "PC range " << __func__ << " (" <<
214 static_cast<uint32_t>(Loc.Col) << "," << static_cast<uint32_t>(Loc.Row) << ")" <<
215 " resource not availalble." << std::endl;
216 vRscs.clear();
217 } else {
218 reservedId = vRscs[0].RscId;
219 }
220 return RC;
221 }
222 AieRC _release() {
223 AieRC RC;
224
225 RC = AieHd->rscMgr()->release(*this);
226 vRscs.clear();
227 return RC;
228 }
229 AieRC _start() {
230 AieRC RC;
231
232 RC = XAie_EventPCEnable(dev(), Loc, vRscs[0].RscId, PcAddrs[0]);
233 if (RC == XAIE_OK) {
234 RC = XAie_EventPCEnable(dev(), Loc, vRscs[1].RscId, PcAddrs[1]);
235 }
236 if (RC != XAIE_OK) {
237 Logger::log(LogLevel::FAL_ERROR) << "PC range " << __func__ << " (" <<
238 static_cast<uint32_t>(Loc.Col) << "," << static_cast<uint32_t>(Loc.Row) << ")" <<
239 " failed to start." << std::endl;
240 }
241 return RC;
242 }
243 AieRC _stop() {
244 int iRC;
245 AieRC RC;
246
247 iRC = (int)XAie_EventPCDisable(dev(), Loc, vRscs[0].RscId);
248 iRC |= (int)XAie_EventPCDisable(dev(), Loc, vRscs[1].RscId);
249
250 if (iRC != (int)XAIE_OK) {
251 Logger::log(LogLevel::FAL_ERROR) << "PC range " << __func__ << " (" <<
252 static_cast<uint32_t>(Loc.Col) << "," << static_cast<uint32_t>(Loc.Row) << ")" <<
253 " failed to stop." << std::endl;
254 RC = XAIE_ERR;
255 } else {
256 RC = XAIE_OK;
257 }
258 return RC;
259 }
260 void _getReservedRscs(std::vector<XAieUserRsc> &vOutRscs) const {
261 vOutRscs.insert(vOutRscs.end(), vRscs.begin(), vRscs.end());
262 }
263 };
264}
static std::ostream & log(LogLevel Lvl=LogLevel::FAL_MAX)
Definition xaiefal-log.hpp:50
AI engine device class. It defines AI engine device operations.
Definition xaiefal-base.hpp:259
XAiePCEvent(XAieDev &Dev, XAie_LocType Loc)
Definition xaiefal-pc.hpp:29
uint32_t getPcAddr() const
Definition xaiefal-pc.hpp:52
XAiePCEvent(std::shared_ptr< XAieDevHandle > DevHd, XAie_LocType Loc)
Definition xaiefal-pc.hpp:23
uint32_t PcAddr
Definition xaiefal-pc.hpp:76
AieRC getEvent(XAie_Events &Event) const
Definition xaiefal-pc.hpp:62
AieRC updatePcAddr(uint32_t Addr)
Definition xaiefal-pc.hpp:37
void getPcAddr(uint32_t &Addr0, uint32_t &Addr1) const
Definition xaiefal-pc.hpp:164
XAiePCRange(XAieDev &Dev, XAie_LocType Loc)
Definition xaiefal-pc.hpp:137
uint32_t PcAddrs[2]
Definition xaiefal-pc.hpp:190
XAiePCRange(std::shared_ptr< XAieDevHandle > DevHd, XAie_LocType Loc)
Definition xaiefal-pc.hpp:127
AieRC getEvent(XAie_Events &Event) const
Definition xaiefal-pc.hpp:175
AieRC updatePcAddr(uint32_t Addr0, uint32_t Addr1)
Definition xaiefal-pc.hpp:146
XAieRscType Type
Definition xaiefal-rsc-base.hpp:399
std::vector< XAieUserRsc > vRscs
Definition xaiefal-rsc-base.hpp:403
XAieRscState State
Definition xaiefal-rsc-base.hpp:398
XAie_DevInst * dev()
Definition xaiefal-rsc-base.hpp:373
uint32_t preferredId
Definition xaiefal-rsc-base.hpp:401
uint32_t reservedId
Definition xaiefal-rsc-base.hpp:402
std::shared_ptr< XAieDevHandle > AieHd
Definition xaiefal-rsc-base.hpp:400
XAie_LocType Loc
Definition xaiefal-rsc-base.hpp:594
XAie_ModuleType Mod
Definition xaiefal-rsc-base.hpp:595
Definition xaiefal-base.hpp:23
@ XAIE_PCEVENT
Definition xaiefal-rsc-group.hpp:31
@ FAL_ERROR
Definition xaiefal-log.hpp:14
@ FAL_WARN
Definition xaiefal-log.hpp:13
Data needed to make a resource request.
Definition xaiefal-rsc-base.hpp:27
uint32_t RscId
Definition xaiefal-rsc-base.hpp:41
XAieRscType RscType
Definition xaiefal-rsc-base.hpp:37
XAie_LocType Loc
Definition xaiefal-rsc-base.hpp:29
XAie_ModuleType Mod
Definition xaiefal-rsc-base.hpp:33