54 std::string errStr =
"Could not create resource manager";
55 if (rscBitmapsInit() != XAIE_OK) {
56 throw std::runtime_error(errStr);
60 for(uint8_t TType = 0U; TType < (uint8_t)XAIEGBL_TILE_TYPE_MAX; TType++) {
61 if (TType == XAIEGBL_TILE_TYPE_SHIMNOC)
64 for (uint8_t RType = 0U; RType < (uint8_t)
XAIE_MAXRSC; RType++) {
65 auto MaxRsc = RscMaps[TType].MaxRscs[RType];
74 delete RscMaps[TType].Bitmaps[RType];
88 uint8_t TileType = XAie_GetTileTypefromLoc(
dev(), RscReq.
Loc);
89 uint32_t StartBit, StaticOffset, MaxRscId;
91 if ((XAie_CheckModule(
dev(), RscReq.
Loc, RscReq.
Mod) != XAIE_OK) ||
92 TileType >= XAIEGBL_TILE_TYPE_MAX) {
94 " Invalid Location/Module for request" << std::endl;
95 return XAIE_INVALID_ARGS;
98 StaticOffset = getStaticOff(RscReq.
Loc, RscReq.
Mod, RscReq.
RscType);
99 StartBit = getStartBit(RscReq.
Loc, RscReq.
Mod, RscReq.
RscType);
100 MaxRscId = getMaxRsc(RscReq.
Loc, RscReq.
Mod, RscReq.
RscType);
101 auto Bitmap = RscMaps[TileType].Bitmaps[RscReq.
RscType];
103 for (uint32_t i = 0; i < MaxRscId; i++) {
104 uint32_t sIndex, rIndex, rBit, sBit;
106 sIndex = (StartBit + StaticOffset) / 32U;
107 sBit = (StartBit + StaticOffset) % 32U;
108 rIndex = StartBit / 32U;
109 rBit = StartBit % 32U;
114 if (!(Bitmap->at(sIndex).test(sBit) |
115 Bitmap->at(rIndex).test(rBit))) {
116 Bitmap->at(rIndex).set(rBit);
134 uint8_t TileType = XAie_GetTileTypefromLoc(
dev(), RscReq.
Loc);
135 uint32_t StaticOff, rBit, sBit, rIndex, sIndex;
137 if ((XAie_CheckModule(
dev(), RscReq.
Loc, RscReq.
Mod) != XAIE_OK) ||
138 TileType >= XAIEGBL_TILE_TYPE_MAX) {
140 " Invalid Location/Module for request" << std::endl;
141 return XAIE_INVALID_ARGS;
146 " Invalid resource id for request" << std::endl;
147 return XAIE_INVALID_ARGS;
151 StaticOff = getStaticOff(RscReq.
Loc, RscReq.
Mod, RscReq.
RscType);
152 auto Bitmap = RscMaps[TileType].Bitmaps[RscReq.
RscType];
154 sIndex = (rBit + StaticOff) / 32U;
155 sBit = (rBit + StaticOff) % 32U;
159 if (!(Bitmap->at(sIndex).test(sBit) |
160 Bitmap->at(rIndex).test(rBit))) {
161 Bitmap->at(rIndex).set(rBit);
176 uint32_t StaticOff, StartBit, MaxRscId, NumContigRscs;
179 if (RscReq.size() <= 0) {
183 TileType = XAie_GetTileTypefromLoc(
dev(), RscReq[0].Loc);
184 if ((XAie_CheckModule(
dev(), RscReq[0].Loc, RscReq[0].Mod) != XAIE_OK) ||
185 TileType >= XAIEGBL_TILE_TYPE_MAX) {
187 " Invalid Location/Module for request" << std::endl;
188 return XAIE_INVALID_ARGS;
191 StaticOff = getStaticOff(RscReq[0].Loc, RscReq[0].Mod, RscReq[0].RscType);
192 StartBit = getStartBit(RscReq[0].Loc, RscReq[0].Mod, RscReq[0].RscType);
193 MaxRscId = getMaxRsc(RscReq[0].Loc, RscReq[0].Mod, RscReq[0].RscType);
194 NumContigRscs = RscReq.size();
195 auto Bitmap = RscMaps[TileType].Bitmaps[RscReq[0].RscType];
197 for (uint32_t i = 0; i < MaxRscId; i++) {
198 uint32_t sIndex, rIndex, sBit, rBit;
201 sIndex = (StartBit + StaticOff) / 32U;
202 sBit = (StartBit + StaticOff) % 32U;
203 rIndex = StartBit / 32U;
204 rBit = StartBit % 32U;
206 if (!(Bitmap->at(sIndex).test(sBit) |
207 Bitmap->at(rIndex).test(rBit))) {
208 for (j = 1; j < NumContigRscs; j++) {
209 if ((sBit + j) >= 32U)
211 if ((rBit + j) >= 32U)
214 if (Bitmap->at(sIndex).test((sBit + j) % 32U) |
215 Bitmap->at(rIndex).test((rBit + j) % 32U)) {
219 if (j == NumContigRscs) {
220 for (k = 0; k < j; k++) {
221 rIndex = (StartBit + k) / 32U;
222 rBit = (StartBit + k) % 32U;
223 Bitmap->at(rIndex).set(rBit);
224 RscReq[k].RscId = i + k;
243 AieRC
requestBc(std::vector<XAieUserRsc>& RscReq,
bool isBcAll) {
244 uint32_t preferredId, MaxRscId, CommonId;
246 preferredId = RscReq[0].RscId;
248 if (setBcAllRscs(RscReq, preferredId) != XAIE_OK)
252 MaxRscId = getMaxRsc(RscReq[0].Loc, RscReq[0].Mod, RscReq[0].RscType);
254 (preferredId >= MaxRscId)) {
256 " Invalid resource id for request" << std::endl;
257 return XAIE_INVALID_ARGS;
260 CommonId = getCommonRscId(RscReq);
263 " Unable to find common broadcast channel"
268 for (uint32_t i = 0; i < RscReq.size(); i++) {
269 uint8_t TType = XAie_GetTileTypefromLoc(
dev(), RscReq[i].Loc);
270 auto Bitmap = RscMaps[TType].Bitmaps[RscReq[i].RscType];
271 uint32_t StartBit, rBit, rIndex;
273 if (TType == XAIEGBL_TILE_TYPE_MAX) {
275 " Invalid Tile Type" << std::endl;
276 return XAIE_INVALID_TILE;
279 RscReq[i].RscId = CommonId;
280 StartBit = CommonId + getStartBit(RscReq[i].Loc, RscReq[i].Mod,
282 rIndex = StartBit / 32U;
283 rBit = StartBit % 32U;
285 Bitmap->at(rIndex).set(rBit);
299 uint8_t TileType = XAie_GetTileTypefromLoc(
dev(), RscRel.
Loc);
300 uint32_t sBit, rBit, sIndex, rIndex, StaticOff;
302 if ((XAie_CheckModule(
dev(), RscRel.
Loc, RscRel.
Mod) != XAIE_OK) ||
303 TileType >= XAIEGBL_TILE_TYPE_MAX) {
305 " Invalid Location/Module for release" << std::endl;
306 return XAIE_INVALID_ARGS;
311 " Invalid resource id for release" << std::endl;
312 return XAIE_INVALID_ARGS;
316 StaticOff = getStaticOff(RscRel.
Loc, RscRel.
Mod, RscRel.
RscType);
317 auto Bitmap = RscMaps[TileType].Bitmaps[RscRel.
RscType];
319 sIndex = (rBit + StaticOff) / 32U;
320 sBit = (rBit + StaticOff) % 32U;
324 Bitmap->at(rIndex).reset(rBit);
325 Bitmap->at(sIndex).reset(sBit);
338 uint8_t TileType = XAie_GetTileTypefromLoc(
dev(), RscFree.
Loc);
339 uint32_t rBit, rIndex;
341 if ((XAie_CheckModule(
dev(), RscFree.
Loc, RscFree.
Mod) != XAIE_OK) ||
342 TileType >= XAIEGBL_TILE_TYPE_MAX) {
344 " Invalid Location/Module for free" << std::endl;
345 return XAIE_INVALID_ARGS;
350 " Invalid resource id for free" << std::endl;
351 return XAIE_INVALID_ARGS;
355 auto Bitmap = RscMaps[TileType].Bitmaps[RscFree.
RscType];
360 Bitmap->at(rIndex).reset(rBit);
372 for (uint32_t i = 0; i < vStats.size(); i++) {
373 uint32_t StartBit, StaticOff, MaxRscId, NumRscs = 0;
374 uint32_t sBit, sIndex, rBit, rIndex;
377 XAie_LocType Loc = vStats[i].Loc;
378 uint8_t TileType = XAie_GetTileTypefromLoc(
dev(), Loc);
380 if ((XAie_CheckModule(
dev(), Loc, Mod) != XAIE_OK) ||
381 TileType >= XAIEGBL_TILE_TYPE_MAX) {
383 " Invalid Location/Module for stat request"
385 return XAIE_INVALID_ARGS;
389 " Invalid resource type for stat request"
391 return XAIE_INVALID_ARGS;
394 MaxRscId = getMaxRsc(Loc, Mod, Type);
395 StartBit = getStartBit(Loc, Mod, Type);
396 StaticOff = getStaticOff(Loc, Mod, Type);
397 auto Bitmap = RscMaps[TileType].Bitmaps[Type];
399 sIndex = (StartBit + StaticOff) / 32U;
400 sBit = (StartBit + StaticOff) % 32U;
401 rIndex = StartBit / 32U;
402 rBit = StartBit % 32U;
404 for (uint8_t j = 0; j < MaxRscId; j++) {
414 if (Bitmap->at(sIndex).test(sBit))
417 if (!(Bitmap->at(sIndex).test(sBit) |
418 Bitmap->at(rIndex).test(rBit)))
425 vStats[i].NumRscs = NumRscs;
441 uint8_t TType, RType;
444 for (TType = 0; TType < XAIEGBL_TILE_TYPE_MAX; TType++) {
445 uint32_t NumRows, NumMods;
447 if (TType == XAIEGBL_TILE_TYPE_SHIMNOC)
450 NumMods =
dev()->DevProp.DevMod[TType].NumModules;
451 NumRows = XAie_GetNumRows(
dev(), TType);
454 auto MaxRsc = &RscMaps[TType].MaxRscs[RType];
455 auto Bitmap = RscMaps[TType].Bitmaps[RType];
465 for (uint8_t i = 0; i < NumMods; i++) {
466 uint32_t Size, ModOff = 0U;
470 if (MaxRsc->at(i).second == 0U)
473 Mod = estimateModfromIndex(TType, i);
474 Size = roundUp(NumRows *
dev()->NumCols *
475 MaxRsc->at(i).second, 32U);
478 RscHeader = createRscHeader(TType,
481 Fs.write(
reinterpret_cast<char *
>(&RscHeader),
486 if (Mod == XAIE_CORE_MOD) {
487 ModOff = (MaxRsc->at(XAIE_MEM_MOD).second *
488 dev()->NumCols * NumRows * 2U) / 32U;
491 for (uint32_t Word = 0U; Word < Size; Word += 2U) {
492 uint32_t Index = Word + ModOff;
493 uint64_t Payload = 0U;
500 if (Word != Size - 1U) {
501 Payload |= (uint64_t)Bitmap->at(Index +
502 1).to_ulong() << 32U;
503 Payload |= Bitmap->at(Index).to_ulong();
505 Payload = Bitmap->at(Index).to_ulong();
507 Fs.write(
reinterpret_cast<char *
>(&Payload),
529 uint64_t *Data = (uint64_t *)MetaData;
531 for (uint32_t i = 0; i < NumBitmaps; i++) {
532 uint32_t BitmapSize, Bitmap64Size, BitmapOffset = 0U;
533 uint32_t RscSize, NumRows, NumRscs;
534 const uint64_t *Bits64;
540 RscHeader = Data[0U];
554 "Invalid resource length in bitmap"
556 return XAIE_INVALID_ARGS;
559 if (TileType == XAIEGBL_TILE_TYPE_SHIMNOC ||
560 TileType >= XAIEGBL_TILE_TYPE_MAX) {
562 "Invalid tile type in bitmap"
564 return XAIE_INVALID_ARGS;
567 NumRows = XAie_GetNumRows(
dev(), TileType);
568 NumRscs = getTotalRscs(TileType, Mod, RscType);
569 BitmapSize = NumRows *
dev()->NumCols * NumRscs;
570 Bitmap64Size = roundUp(BitmapSize, 64U) / 64U;
572 if (RscSize != Bitmap64Size) {
574 "Invalid resource length in bitmap"
576 return XAIE_INVALID_ARGS;
579 if (Mod == XAIE_CORE_MOD) {
582 MemModRscs = getTotalRscs(TileType, XAIE_MEM_MOD,
584 BitmapOffset = MemModRscs *
dev()->NumCols *
588 BitmapOffset += BitmapSize;
592 auto StaticBitmap = RscMaps[TileType].Bitmaps[RscType];
593 for (uint32_t j = 0; j < RscSize; j++) {
594 uint64_t Val64 = Bits64[j];
596 for (uint8_t k = 0; k < 64U; k++) {
600 if (Pos > BitmapSize)
606 Index = BitmapOffset + (Pos / 32U);
607 StaticBitmap->at(Index).set(Pos % 32U);
613 Data = (uint64_t *)((
const char *)Data +
sizeof(RscHeader)
614 + (RscSize *
sizeof(uint64_t)));
620 AieRscMap RscMaps[XAIEGBL_TILE_TYPE_MAX];
628 AieRC rscBitmapsInit() {
629 uint8_t TType, RType;
631 for (TType = 0; TType < XAIEGBL_TILE_TYPE_MAX; TType++) {
634 if (TType == XAIEGBL_TILE_TYPE_SHIMNOC)
637 NumRows = XAie_GetNumRows(
dev(), TType);
638 for (RType = 0; RType < (uint8_t)
XAIE_MAXRSC; RType++) {
639 auto MaxRsc = &RscMaps[TType].
MaxRscs[RType];
640 uint32_t BitmapSize, TotalRscs = 0;
642 if (TType == XAIEGBL_TILE_TYPE_AIETILE) {
643 uint32_t numRscs = 0;
646 numRscs = getTotalRscs(TType, XAIE_MEM_MOD,
648 MaxRsc->push_back(std::make_pair(XAIE_MEM_MOD, numRscs));
649 TotalRscs += numRscs;
651 numRscs = getTotalRscs(TType, XAIE_CORE_MOD,
653 MaxRsc->push_back(std::make_pair(XAIE_CORE_MOD, numRscs));
654 TotalRscs += numRscs;
655 }
else if (TType == XAIEGBL_TILE_TYPE_MEMTILE) {
656 uint32_t numRscs = 0;
658 numRscs = getTotalRscs(TType, XAIE_MEM_MOD,
660 MaxRsc->push_back(std::make_pair(XAIE_MEM_MOD, numRscs));
661 TotalRscs += numRscs;
663 uint32_t numRscs = 0;
665 numRscs = getTotalRscs(TType, XAIE_PL_MOD,
667 MaxRsc->push_back(std::make_pair(XAIE_PL_MOD, numRscs));
668 TotalRscs += numRscs;
676 BitmapSize = roundUp(NumRows *
dev()->NumCols * TotalRscs * 2U, 32U);
677 if (BitmapSize == 0U)
681 RscMaps[TType].Bitmaps[RType] =
new XAieRscBitmap(BitmapSize + 1);
684 RscMaps[XAIEGBL_TILE_TYPE_SHIMNOC] = RscMaps[XAIEGBL_TILE_TYPE_SHIMPL];
698 uint32_t getStaticOff(XAie_LocType Loc, XAie_ModuleType Mod,
XAieRscType Type) {
699 uint8_t TileType = XAie_GetTileTypefromLoc(
dev(), Loc);
700 uint32_t NumCols, NumRows, MaxRscId;
702 NumRows = XAie_GetNumRows(
dev(), TileType);
703 MaxRscId = getMaxRsc(Loc, Mod, Type);
704 NumCols =
dev()->NumCols;
706 return NumRows * NumCols * MaxRscId;
720 uint32_t getStartBit(XAie_LocType Loc, XAie_ModuleType Mod,
XAieRscType Type) {
721 uint8_t TileType = XAie_GetTileTypefromLoc(
dev(), Loc);
722 uint32_t NumCols, NumRows, StartRow;
723 uint32_t StartBit, ModOffset = 0U;
725 StartRow = XAie_GetStartRow(
dev(), TileType);
726 NumRows = XAie_GetNumRows(
dev(), TileType);
727 NumCols =
dev()->NumCols;
729 if (Mod == XAIE_CORE_MOD)
730 ModOffset = getMaxRsc(Loc, XAIE_MEM_MOD, Type) *
731 NumCols * NumRows * 2U;
733 StartBit = ModOffset + (getMaxRsc(Loc, Mod, Type) *
734 (Loc.Col * NumRows + (Loc.Row - StartRow)));
750 uint32_t getMaxRsc(XAie_LocType Loc, XAie_ModuleType Mod,
XAieRscType Type) {
751 uint8_t TileType = XAie_GetTileTypefromLoc(
dev(), Loc);
753 auto vMaxRscs = RscMaps[TileType].MaxRscs[Type];
754 for (
auto x : vMaxRscs)
770 uint32_t getCommonRscId(std::vector<XAieUserRsc> vRscs) {
771 std::bitset<32> RscStatus;
774 for (
auto rsc : vRscs) {
775 uint8_t TType = XAie_GetTileTypefromLoc(
dev(), rsc.Loc);
776 uint32_t sIndex, rIndex, sBit, rBit;
777 uint32_t StartBit, StaticOff, Mask;
779 if ((XAie_CheckModule(
dev(), rsc.Loc, rsc.Mod) != XAIE_OK) ||
780 TType >= XAIEGBL_TILE_TYPE_MAX) {
782 " Invalid Location/Module for request" << std::endl;
786 MaxRscId = getMaxRsc(rsc.Loc, rsc.Mod, rsc.RscType);
787 if (MaxRscId > 32U) {
789 " Max resource ID larger than bitmap size"
794 StaticOff = getStaticOff(rsc.Loc, rsc.Mod, rsc.RscType);
795 StartBit = getStartBit(rsc.Loc, rsc.Mod, rsc.RscType);
796 auto Bitmap = RscMaps[TType].Bitmaps[rsc.RscType];
797 Mask = (1 << MaxRscId) - 1;
799 sIndex = (StartBit + StaticOff) / 32U;
800 sBit = (StartBit + StaticOff) % 32U;
801 rIndex = StartBit / 32U;
802 rBit = StartBit % 32U;
805 RscStatus |= (Bitmap->at(sIndex) >> sBit) |
806 (Bitmap->at(rIndex) >> rBit);
809 if ((sBit + MaxRscId) > 32U) {
810 uint32_t remBits = (sBit + MaxRscId) % 32U;
811 std::bitset<32> Temp;
813 Mask = (1 << remBits) - 1 ;
814 Temp |= Bitmap->at(sIndex + 1);
816 Temp << (MaxRscId - remBits);
819 if ((rBit + MaxRscId) > 32U) {
820 uint32_t remBits = (rBit + MaxRscId) % 32U;
821 std::bitset<32> Temp;
823 Mask = (1 << remBits) - 1 ;
824 Temp |= Bitmap->at(rIndex + 1);
826 Temp << (MaxRscId - remBits);
832 for (uint8_t i = 0; i < MaxRscId; i++)
833 if (!RscStatus.test(i))
836 if (RscStatus.test(vRscs[0].RscId))
839 return vRscs[0].RscId;
853 AieRC setBcAllRscs(std::vector<XAieUserRsc> &vRscs, uint32_t preferredId) {
854 std::vector<XAie_LocType> Locs;
860 NumTiles =
dev()->NumCols *
dev()->NumRows;
861 Locs.resize(NumTiles);
862 RC = XAie_GetUngatedLocsInPartition(
dev(),
863 &NumTiles, Locs.data());
866 "Unable to get ungated locs" <<
870 Locs.resize(NumTiles);
873 Rsc.RscId = preferredId;
874 for (
auto loc : Locs) {
877 TType = XAie_GetTileTypefromLoc(
dev(), loc);
879 if (TType == XAIEGBL_TILE_TYPE_AIETILE) {
880 Rsc.Mod = XAIE_MEM_MOD;
881 vRscs.push_back(Rsc);
882 Rsc.Mod = XAIE_CORE_MOD;
883 vRscs.push_back(Rsc);
884 }
else if (TType == XAIEGBL_TILE_TYPE_MEMTILE) {
885 Rsc.Mod = XAIE_MEM_MOD;
886 vRscs.push_back(Rsc);
888 Rsc.Mod = XAIE_PL_MOD;
889 vRscs.push_back(Rsc);
905 uint32_t getTotalRscs(uint8_t TileType, XAie_ModuleType Mod,
XAieRscType RscType) {
909 const XAie_PerfMod *PerfMod;
911 if (Mod == XAIE_PL_MOD)
912 PerfMod = &
dev()->DevProp.DevMod[TileType].PerfMod[0U];
914 PerfMod = &
dev()->DevProp.DevMod[TileType].PerfMod[Mod];
919 return PerfMod->MaxCounterVal;
923 const XAie_EvntMod *EventMod;
925 if (Mod == XAIE_PL_MOD)
926 EventMod = &
dev()->DevProp.DevMod[TileType].EvntMod[0U];
928 EventMod = &
dev()->DevProp.DevMod[TileType].EvntMod[Mod];
933 return EventMod->NumUserEvents;
937 if (XAie_GetNumRows(
dev(), TileType) > 0U)
944 const XAie_EvntMod *EventMod;
946 if (Mod == XAIE_PL_MOD)
947 EventMod = &
dev()->DevProp.DevMod[TileType].EvntMod[0U];
949 EventMod = &
dev()->DevProp.DevMod[TileType].EvntMod[Mod];
954 return EventMod->NumPCEvents;
958 const XAie_EvntMod *EventMod;
960 if (Mod == XAIE_PL_MOD)
961 EventMod = &
dev()->DevProp.DevMod[TileType].EvntMod[0U];
963 EventMod = &
dev()->DevProp.DevMod[TileType].EvntMod[Mod];
968 return EventMod->NumStrmPortSelectIds;
973 const XAie_EvntMod *EventMod;
975 if (Mod == XAIE_PL_MOD)
976 EventMod = &
dev()->DevProp.DevMod[TileType].EvntMod[0U];
978 EventMod = &
dev()->DevProp.DevMod[TileType].EvntMod[Mod];
983 return EventMod->NumBroadcastIds;
988 if (XAie_GetNumRows(
dev(), TileType) > 0U)
995 const XAie_EvntMod *EventMod;
997 if (Mod == XAIE_PL_MOD)
998 EventMod = &
dev()->DevProp.DevMod[TileType].EvntMod[0U];
1000 EventMod = &
dev()->DevProp.DevMod[TileType].EvntMod[Mod];
1005 return EventMod->NumGroupEvents;
1010 if ((XAie_GetNumRows(
dev(), TileType) > 0U) &&
1011 (Mod == XAIE_PL_MOD))
1032 uint64_t createRscHeader(uint8_t TType,
XAieRscType RType,
1033 XAie_ModuleType Mod, uint32_t Size) {
1036 Size = (Size % 2U) ? (Size + 1U) : Size;
1039 Ret |= (
static_cast<uint64_t
>(TType) &
1042 Ret |= (
static_cast<uint64_t
>(RType) &
1045 Ret |= (
static_cast<uint64_t
>(Mod) &
1048 Ret |= (
static_cast<uint64_t
>(Size) &
1059 XAie_ModuleType estimateModfromIndex(uint8_t TileType, uint32_t Index) {
1060 XAie_ModuleType Mod =
static_cast<XAie_ModuleType
>(
XAIE_MOD_ANY);
1063 case XAIEGBL_TILE_TYPE_AIETILE:
1068 Mod = XAIE_CORE_MOD;
1072 case XAIEGBL_TILE_TYPE_MEMTILE:
1079 case XAIEGBL_TILE_TYPE_SHIMNOC:
1080 case XAIEGBL_TILE_TYPE_SHIMPL:
1101 uint32_t roundUp(uint32_t Val, uint32_t Aligned) {
1102 return (Aligned * ((Val + (Aligned - 1U)) / Aligned));