Lines Matching refs:ipc
16 void catpt_ipc_init(struct catpt_ipc *ipc, struct device *dev)
18 ipc->dev = dev;
19 ipc->ready = false;
20 ipc->default_timeout = CATPT_IPC_TIMEOUT_MS;
21 init_completion(&ipc->done_completion);
22 init_completion(&ipc->busy_completion);
23 spin_lock_init(&ipc->lock);
24 mutex_init(&ipc->mutex);
27 static int catpt_ipc_arm(struct catpt_ipc *ipc, struct catpt_fw_ready *config)
34 ipc->rx.data = devm_kzalloc(ipc->dev, config->outbox_size, GFP_KERNEL);
35 if (!ipc->rx.data)
38 memcpy(&ipc->config, config, sizeof(*config));
39 ipc->ready = true;
44 static void catpt_ipc_msg_init(struct catpt_ipc *ipc,
47 lockdep_assert_held(&ipc->lock);
49 ipc->rx.header = 0;
50 ipc->rx.size = reply ? reply->size : 0;
51 reinit_completion(&ipc->done_completion);
52 reinit_completion(&ipc->busy_completion);
69 struct catpt_ipc *ipc = &cdev->ipc;
72 ret = wait_for_completion_timeout(&ipc->done_completion,
76 if (ipc->rx.rsp.status != CATPT_REPLY_PENDING)
80 ret = wait_for_completion_timeout(&ipc->busy_completion,
89 struct catpt_ipc *ipc = &cdev->ipc;
93 if (!ipc->ready)
95 if (request.size > ipc->config.outbox_size ||
96 (reply && reply->size > ipc->config.outbox_size))
99 spin_lock_irqsave(&ipc->lock, flags);
100 catpt_ipc_msg_init(ipc, reply);
102 spin_unlock_irqrestore(&ipc->lock, flags);
108 ipc->ready = false;
113 ret = ipc->rx.rsp.status;
115 reply->header = ipc->rx.header;
118 memcpy(reply->data, ipc->rx.data, reply->size);
128 struct catpt_ipc *ipc = &cdev->ipc;
131 mutex_lock(&ipc->mutex);
133 mutex_unlock(&ipc->mutex);
142 cdev->ipc.default_timeout);
185 struct catpt_ipc *ipc = &cdev->ipc;
187 ipc->rx.header = header;
188 if (ipc->rx.rsp.status != CATPT_REPLY_SUCCESS)
191 memcpy_fromio(ipc->rx.data, catpt_outbox_addr(cdev), ipc->rx.size);
192 trace_catpt_ipc_payload(ipc->rx.data, ipc->rx.size);
198 struct catpt_ipc *ipc = &cdev->ipc;
208 catpt_ipc_arm(ipc, &config);
216 ipc->ready = false;
229 complete(&ipc->busy_completion);
281 complete(&cdev->ipc.done_completion);