turnip: provide both emit_ib and emit_call

tu_cs_emit_ib emits a CP_INDIRECT_BUFFER for a BO.  tu_cs_emit_call
emits a CP_INDIRECT_BUFFER for each entry of a target cs.
This commit is contained in:
Chia-I Wu 2019-01-29 10:43:48 -08:00
parent 741a4325df
commit 5c63fc626f
1 changed files with 30 additions and 7 deletions

View File

@ -47,6 +47,16 @@ tu_cs_reserve_space(struct tu_device *dev,
void void
tu_cs_reset(struct tu_device *dev, struct tu_cs *cs); tu_cs_reset(struct tu_device *dev, struct tu_cs *cs);
/**
* Get the size needed for tu_cs_emit_call.
*/
static inline uint32_t
tu_cs_get_call_size(const struct tu_cs *cs)
{
/* each CP_INDIRECT_BUFFER needs 4 dwords */
return cs->entry_count * 4;
}
/** /**
* Assert that we did not exceed the reserved space. * Assert that we did not exceed the reserved space.
*/ */
@ -124,16 +134,29 @@ tu_cs_emit_write_reg(struct tu_cs *cs, uint16_t reg, uint32_t value)
tu_cs_emit(cs, value); tu_cs_emit(cs, value);
} }
/**
* Emit a CP_INDIRECT_BUFFER command packet.
*/
static inline void static inline void
tu_cs_emit_ib(struct tu_cs *cs, const struct tu_cs *target) tu_cs_emit_ib(struct tu_cs *cs, const struct tu_cs_entry *entry)
{ {
for (uint32_t i = 0; i < target->entry_count; i++) { assert(entry->offset % sizeof(uint32_t) == 0);
const struct tu_cs_entry *entry = target->entries + i; assert(entry->size % sizeof(uint32_t) == 0);
tu_cs_emit_pkt7(cs, CP_INDIRECT_BUFFER, 3); tu_cs_emit_pkt7(cs, CP_INDIRECT_BUFFER, 3);
tu_cs_emit_qw(cs, entry->bo->iova + entry->offset); tu_cs_emit_qw(cs, entry->bo->iova + entry->offset);
tu_cs_emit(cs, entry->size / sizeof(uint32_t)); tu_cs_emit(cs, entry->size / sizeof(uint32_t));
} }
/**
* Emit a CP_INDIRECT_BUFFER command packet for each entry in the target
* command stream.
*/
static inline void
tu_cs_emit_call(struct tu_cs *cs, const struct tu_cs *target)
{
for (uint32_t i = 0; i < target->entry_count; i++)
tu_cs_emit_ib(cs, target->entries + i);
} }
#endif /* TU_CS_H */ #endif /* TU_CS_H */