@@ -67,6 +67,123 @@ LogicalResult TransactionBuilder::appendAddressPatch(uint32_t addr,
6767 return configureCustomTxnOp (deviceModel, opCode, data, size);
6868}
6969
70+ LogicalResult TransactionBuilder::appendLockOp (AMDAIE::LockOp lockOp) {
71+ auto tile = lockOp.getTile ().getDefiningOp <AMDAIE::TileOp>();
72+ std::optional<int64_t > maybeCol = getConstantIntValue (tile.getCol ());
73+ std::optional<int64_t > maybeRow = getConstantIntValue (tile.getRow ());
74+ if (!maybeCol || !maybeRow) {
75+ return tile->emitOpError ()
76+ << " expected column and row integer value/constant" ;
77+ }
78+ XAie_LocType tileLoc = XAie_TileLoc (*maybeCol, *maybeRow);
79+ Lock lock{tileLoc, static_cast <uint8_t >(lockOp.getValue ()),
80+ static_cast <int8_t >(*lockOp.getInitValue ())};
81+ if (failed (initializeLock (deviceModel, lock))) return failure ();
82+ return success ();
83+ }
84+
85+ LogicalResult TransactionBuilder::appendDmaStartOp (
86+ AMDAIE::DMAStartOp dmaStartOp) {
87+ // Configure DMA Locks.
88+ auto tile = dmaStartOp.getTile ().getDefiningOp <AMDAIE::TileOp>();
89+ std::optional<int64_t > maybeCol = getConstantIntValue (tile.getCol ());
90+ std::optional<int64_t > maybeRow = getConstantIntValue (tile.getRow ());
91+ if (!maybeCol || !maybeRow) {
92+ return tile->emitOpError ()
93+ << " expected column and row integer value/constant" ;
94+ }
95+ XAie_LocType tileLoc = XAie_TileLoc (*maybeCol, *maybeRow);
96+ FailureOr<XAie_DmaDesc> dmaDesc = initDMADesc (deviceModel, tileLoc);
97+ if (failed (dmaDesc)) return failure ();
98+
99+ auto dmaBdOps = dmaStartOp.getOps <AMDAIE::DMABDOp>();
100+ // We currently expect only one DMABDOp within DMAStartOp.
101+ if (std::distance (dmaBdOps.begin (), dmaBdOps.end ()) != 1 ) return failure ();
102+ // Configure DMA BD ops within DMA Start op.
103+ AMDAIE::DMABDOp dmaBdOp = *dmaBdOps.begin ();
104+ Block *parentBlock = dmaBdOp->getBlock ();
105+ std::optional<int > acqValue, relValue, acqLockId, relLockId;
106+ for (AMDAIE::UseLockOp useLockOp : parentBlock->getOps <AMDAIE::UseLockOp>()) {
107+ auto lockOp = useLockOp.getLock ().getDefiningOp <AMDAIE::LockOp>();
108+ if (useLockOp.getAction () == AMDAIE::LockAction::AcquireGreaterOrEqual ||
109+ useLockOp.getAction () == AMDAIE::LockAction::Acquire) {
110+ acqValue = useLockOp.getValue ();
111+ if (useLockOp.getAction () == AMDAIE::LockAction::AcquireGreaterOrEqual)
112+ acqValue.value () = -acqValue.value ();
113+ acqLockId = lockOp.getValue ();
114+ } else if (useLockOp.getAction () == AMDAIE::LockAction::Release) {
115+ relValue = useLockOp.getValue ();
116+ relLockId = lockOp.getValue ();
117+ }
118+ }
119+ // Disable acquire and release locks if not set.
120+ if (!acqLockId) {
121+ acqLockId = 0 ;
122+ acqValue = 0 ;
123+ }
124+ if (!relLockId) {
125+ relLockId = 0 ;
126+ relValue = 0 ;
127+ }
128+ assert (acqValue && relValue && acqLockId && relLockId &&
129+ " expected both use_lock(acquire) and use_lock(release) with bd" );
130+ if (failed (configureDMALocks (deviceModel, dmaDesc.value (), tileLoc, *acqValue,
131+ *relValue, *acqLockId, *relLockId,
132+ /* acqEn=*/ true ))) {
133+ return failure ();
134+ }
135+ // Pull metadata related to packet routing, bdId, buffer length, size,
136+ // stride to pass to aie-rt.
137+ std::optional<uint32_t > bdId = dmaBdOp.getBdId ();
138+ if (!bdId) return failure ();
139+ bool validBd = true ;
140+ std::optional<uint8_t > packetType;
141+ std::optional<uint8_t > packetID;
142+ bool enablePacket = false ;
143+
144+ auto bufferOp = dmaBdOp.getBuffer ().getDefiningOp <AMDAIE::BufferOp>();
145+ if (!bufferOp) return failure ();
146+ std::optional<uint32_t > baseAddr = bufferOp.getAddress ();
147+ if (!baseAddr) return failure ();
148+
149+ std::optional<llvm::ArrayRef<BDDimLayoutAttr>> dims = dmaBdOp.getDimensions ();
150+ if (!dims) return failure ();
151+ std::optional<SmallVector<BDDimLayout>> maybeDims;
152+ maybeDims = llvm::map_to_vector (*dims, [](BDDimLayoutAttr attr) {
153+ return BDDimLayout{attr.getSize (), attr.getStride ()};
154+ });
155+ std::optional<SmallVector<BDPadLayout>> maybePadDims;
156+
157+ bool enableNextBd = dmaBdOp.getNextBdId ().has_value ();
158+ std::optional<uint8_t > nextBdId =
159+ enableNextBd
160+ ? std::optional<uint8_t >{static_cast <uint8_t >(*dmaBdOp.getNextBdId ())}
161+ : std::nullopt ;
162+ std::optional<BDIterLayout> maybeIter = std::nullopt ;
163+ if (failed (configureDMABD (deviceModel, dmaDesc.value (), tileLoc, validBd,
164+ static_cast <uint8_t >(*bdId), enableNextBd, nextBdId,
165+ enablePacket, packetType, packetID, *baseAddr,
166+ dmaBdOp.getLenInBytes (), dmaBdOp.getOffsetInBytes (),
167+ dmaBdOp.getBufferElementTypeWidthInBytes (),
168+ maybeDims, maybePadDims, maybeIter))) {
169+ return failure ();
170+ }
171+
172+ // Configure push to BD queue.
173+ // TODO: Generalize it as this is currently hardcoded to only shim side for
174+ // now.
175+ int chNum = dmaStartOp.getChannelIndex ();
176+ auto channelDir = static_cast <DMAChannelDir>(dmaStartOp.getChannelDir ());
177+ bool issueToken = tileLoc.Row == 0 && channelDir == DMAChannelDir::MM2S;
178+ bool setChannelEnable = true ;
179+ if (failed (configurePushToBdQueue (
180+ deviceModel, tileLoc, chNum, channelDir, dmaBdOp.getBdId ().value (),
181+ dmaStartOp.getRepeatCount (), issueToken, setChannelEnable))) {
182+ return failure ();
183+ }
184+ return success ();
185+ }
186+
70187LogicalResult TransactionBuilder::appendTCTSync (uint32_t col, uint32_t row,
71188 uint32_t direction,
72189 uint32_t rowNum,
@@ -126,11 +243,11 @@ LogicalResult TransactionBuilder::appendWriteBdOp(
126243 uint32_t minStrideBitWidth = deviceModel.getMinStrideBitWidth ();
127244 uint32_t bufferElementTypeWidthInBytes = minStrideBitWidth / 8 ;
128245 uint32_t bufferLengthInBytes = bufferLength * bufferElementTypeWidthInBytes;
129- std::vector <BDDimLayout> dims = {
246+ SmallVector <BDDimLayout> dims = {
130247 {static_cast <uint16_t >(sizes[0 ]), static_cast <uint32_t >(strides[0 ])},
131248 {static_cast <uint16_t >(sizes[1 ]), static_cast <uint32_t >(strides[1 ])},
132249 {static_cast <uint16_t >(sizes[2 ]), static_cast <uint32_t >(strides[2 ])}};
133- std::optional<std::vector <BDPadLayout>> pads = std::nullopt ;
250+ std::optional<SmallVector <BDPadLayout>> pads = std::nullopt ;
134251 BDIterLayout iter = {iterationStride, static_cast <uint8_t >(iterationSize),
135252 static_cast <uint8_t >(iterationCurrent)};
136253 return configureDMABD (deviceModel, dmaTileBd.value (), tileLoc, validBd, bdId,
0 commit comments