On 04/12/2023 17:33, Boris Brezillon wrote: > Contains everything that's FW related, that includes the code dealing > with the microcontroller unit (MCU) that's running the FW, and anything > related to allocating memory shared between the FW and the CPU. > > A few global FW events are processed in the IRQ handler, the rest is > forwarded to the scheduler, since scheduling is the primary reason for > the FW existence, and also the main source of FW <-> kernel > interactions. > > v3: > - Make the FW path more future-proof (Liviu) > - Use one waitqueue for all FW events > - Simplify propagation of FW events to the scheduler logic > - Drop the panthor_fw_mem abstraction and use panthor_kernel_bo instead > - Account for the panthor_vm changes > - Replace magic number with 0x7fffffff with ~0 to better signify that > it's the maximum permitted value. > - More accurate rounding when computing the firmware timeout. > - Add a 'sub iterator' helper function. This also adds a check that a > firmware entry doesn't overflow the firmware image. > - Drop __packed from FW structures, natural alignment is good enough. > - Other minor code improvements. > > Signed-off-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxxxx> > Signed-off-by: Steven Price <steven.price@xxxxxxx> One typo below (I think it might even have been mine...), but otherwise Reviewed-by: Steven Price <steven.price@xxxxxxx> > --- > drivers/gpu/drm/panthor/panthor_fw.c | 1332 ++++++++++++++++++++++++++ > drivers/gpu/drm/panthor/panthor_fw.h | 504 ++++++++++ > 2 files changed, 1836 insertions(+) > create mode 100644 drivers/gpu/drm/panthor/panthor_fw.c > create mode 100644 drivers/gpu/drm/panthor/panthor_fw.h > > diff --git a/drivers/gpu/drm/panthor/panthor_fw.c b/drivers/gpu/drm/panthor/panthor_fw.c > new file mode 100644 > index 000000000000..85afe769f567 > --- /dev/null > +++ b/drivers/gpu/drm/panthor/panthor_fw.c <snip> > +/** > + * panthor_fw_csg_wait_acks() - Wait for command stream group requests to be acknowledged. > + * @ptdev: Device. > + * @csg_slot: CSG slot ID. > + * @req_mask: Mask of requests to wait for. > + * @acked: Pointer to field that's updated with the acked requests. > + * If the function returns 0, *acked == req_mask. > + * @timeout_ms: Timeout expressed in milliseconds. > + * > + * Return: 0 on success, -ETIMEDOUT otherwise. > + */ > +int panthor_fw_csg_wait_acks(struct panthor_device *ptdev, u32 csg_slot, > + u32 req_mask, u32 *acked, u32 timeout_ms) > +{ > + struct panthor_fw_csg_iface *csg_iface = panthor_fw_get_csg_iface(ptdev, csg_slot); > + int ret; > + > + if (drm_WARN_ON(&ptdev->base, req_mask & ~CSG_REQ_MASK)) > + return -EINVAL; > + > + ret = panthor_fw_wait_acks(&csg_iface->input->req, > + &csg_iface->output->ack, > + &ptdev->fw->req_waitqueue, > + req_mask, acked, timeout_ms); > + > + /* > + * Check that all bits in the state field were updated, is any mismatch NIT: ..., *if* any mismatch Steve