On Wed, Sep 23, 2020 at 02:24:56PM +0200, Cezary Rojewski wrote:
Implement IRQ handlers for immediate and delayed replies and notifications. Communication is synchronous and allows for serialization of maximum one message at a time.
DSP may respond with ADSP_PENDING status for a request - known as delayed reply - and when situation occurs, framework keeps the lock and awaits upcoming response through IPCD channel which is handled in bottom-half. Immediate replies spawn no BH at all as their processing is very short.
...
+static void catpt_dsp_send_tx(struct catpt_dev *cdev,
const struct catpt_ipc_msg *tx)
+{
- u32 header = tx->header | CATPT_IPCC_BUSY;
- if (tx->size)
This check is not needed.
memcpy_toio(catpt_outbox_addr(cdev), tx->data, tx->size);
- catpt_writel_shim(cdev, IPCC, header);
+}
...
- ret = ipc->rx.rsp.status;
- if (reply) {
reply->header = ipc->rx.header;
So, even in case of error the header is still updated?
if (!ret && reply->data && reply->size)
memcpy(reply->data, ipc->rx.data, ipc->rx.size);
This I didn't get. You copy data by using source size?!
- }
- return ret;
I guess the above piece may be refactored, but I don't know how until it is clear why it's written like this.
...
+static void catpt_dsp_copy_rx(struct catpt_dev *cdev, u32 header) +{
- struct catpt_ipc *ipc = &cdev->ipc;
- ipc->rx.header = header;
- if (ipc->rx.size && ipc->rx.rsp.status == CATPT_REPLY_SUCCESS) {
Check for size is redundant.
memcpy_fromio(ipc->rx.data, catpt_outbox_addr(cdev),
ipc->rx.size);
- }
Can be done like
if (status != SUCCESS) return; memcpy_fromio(...);
+}