Lines Matching +full:mbox +full:- +full:tx

1 // SPDX-License-Identifier: GPL-2.0
11 #include <soc/tegra/bpmp-abi.h>
14 #include "bpmp-private.h"
23 } tx, rx; member
28 } mbox; member
36 priv = container_of(client, struct tegra186_bpmp, mbox.client); in mbox_client_to_bpmp()
38 return priv->parent; in mbox_client_to_bpmp()
45 frame = tegra_ivc_read_get_next_frame(channel->ivc); in tegra186_bpmp_is_message_ready()
47 channel->ib = NULL; in tegra186_bpmp_is_message_ready()
51 channel->ib = frame; in tegra186_bpmp_is_message_ready()
60 frame = tegra_ivc_write_get_next_frame(channel->ivc); in tegra186_bpmp_is_channel_free()
62 channel->ob = NULL; in tegra186_bpmp_is_channel_free()
66 channel->ob = frame; in tegra186_bpmp_is_channel_free()
73 return tegra_ivc_read_advance(channel->ivc); in tegra186_bpmp_ack_message()
78 return tegra_ivc_write_advance(channel->ivc); in tegra186_bpmp_post_message()
83 struct tegra186_bpmp *priv = bpmp->priv; in tegra186_bpmp_ring_doorbell()
86 err = mbox_send_message(priv->mbox.channel, NULL); in tegra186_bpmp_ring_doorbell()
90 mbox_client_txdone(priv->mbox.channel, 0); in tegra186_bpmp_ring_doorbell()
98 struct tegra186_bpmp *priv = bpmp->priv; in tegra186_bpmp_ivc_notify()
100 if (WARN_ON(priv->mbox.channel == NULL)) in tegra186_bpmp_ivc_notify()
110 struct tegra186_bpmp *priv = bpmp->priv; in tegra186_bpmp_channel_init()
115 channel->ivc = devm_kzalloc(bpmp->dev, sizeof(*channel->ivc), in tegra186_bpmp_channel_init()
117 if (!channel->ivc) in tegra186_bpmp_channel_init()
118 return -ENOMEM; in tegra186_bpmp_channel_init()
124 err = tegra_ivc_init(channel->ivc, NULL, in tegra186_bpmp_channel_init()
125 priv->rx.virt + offset, priv->rx.phys + offset, in tegra186_bpmp_channel_init()
126 priv->tx.virt + offset, priv->tx.phys + offset, in tegra186_bpmp_channel_init()
130 dev_err(bpmp->dev, "failed to setup IVC for channel %u: %d\n", in tegra186_bpmp_channel_init()
135 init_completion(&channel->completion); in tegra186_bpmp_channel_init()
136 channel->bpmp = bpmp; in tegra186_bpmp_channel_init()
144 tegra_ivc_reset(channel->ivc); in tegra186_bpmp_channel_reset()
147 while (tegra_ivc_notified(channel->ivc)) in tegra186_bpmp_channel_reset()
153 tegra_ivc_cleanup(channel->ivc); in tegra186_bpmp_channel_cleanup()
169 priv = devm_kzalloc(bpmp->dev, sizeof(*priv), GFP_KERNEL); in tegra186_bpmp_init()
171 return -ENOMEM; in tegra186_bpmp_init()
173 bpmp->priv = priv; in tegra186_bpmp_init()
174 priv->parent = bpmp; in tegra186_bpmp_init()
176 priv->tx.pool = of_gen_pool_get(bpmp->dev->of_node, "shmem", 0); in tegra186_bpmp_init()
177 if (!priv->tx.pool) { in tegra186_bpmp_init()
178 dev_err(bpmp->dev, "TX shmem pool not found\n"); in tegra186_bpmp_init()
179 return -EPROBE_DEFER; in tegra186_bpmp_init()
182 priv->tx.virt = gen_pool_dma_alloc(priv->tx.pool, 4096, &priv->tx.phys); in tegra186_bpmp_init()
183 if (!priv->tx.virt) { in tegra186_bpmp_init()
184 dev_err(bpmp->dev, "failed to allocate from TX pool\n"); in tegra186_bpmp_init()
185 return -ENOMEM; in tegra186_bpmp_init()
188 priv->rx.pool = of_gen_pool_get(bpmp->dev->of_node, "shmem", 1); in tegra186_bpmp_init()
189 if (!priv->rx.pool) { in tegra186_bpmp_init()
190 dev_err(bpmp->dev, "RX shmem pool not found\n"); in tegra186_bpmp_init()
191 err = -EPROBE_DEFER; in tegra186_bpmp_init()
195 priv->rx.virt = gen_pool_dma_alloc(priv->rx.pool, 4096, &priv->rx.phys); in tegra186_bpmp_init()
196 if (!priv->rx.virt) { in tegra186_bpmp_init()
197 dev_err(bpmp->dev, "failed to allocate from RX pool\n"); in tegra186_bpmp_init()
198 err = -ENOMEM; in tegra186_bpmp_init()
202 err = tegra186_bpmp_channel_init(bpmp->tx_channel, bpmp, in tegra186_bpmp_init()
203 bpmp->soc->channels.cpu_tx.offset); in tegra186_bpmp_init()
207 err = tegra186_bpmp_channel_init(bpmp->rx_channel, bpmp, in tegra186_bpmp_init()
208 bpmp->soc->channels.cpu_rx.offset); in tegra186_bpmp_init()
212 for (i = 0; i < bpmp->threaded.count; i++) { in tegra186_bpmp_init()
213 unsigned int index = bpmp->soc->channels.thread.offset + i; in tegra186_bpmp_init()
215 err = tegra186_bpmp_channel_init(&bpmp->threaded_channels[i], in tegra186_bpmp_init()
221 /* mbox registration */ in tegra186_bpmp_init()
222 priv->mbox.client.dev = bpmp->dev; in tegra186_bpmp_init()
223 priv->mbox.client.rx_callback = mbox_handle_rx; in tegra186_bpmp_init()
224 priv->mbox.client.tx_block = false; in tegra186_bpmp_init()
225 priv->mbox.client.knows_txdone = false; in tegra186_bpmp_init()
227 priv->mbox.channel = mbox_request_channel(&priv->mbox.client, 0); in tegra186_bpmp_init()
228 if (IS_ERR(priv->mbox.channel)) { in tegra186_bpmp_init()
229 err = PTR_ERR(priv->mbox.channel); in tegra186_bpmp_init()
230 dev_err(bpmp->dev, "failed to get HSP mailbox: %d\n", err); in tegra186_bpmp_init()
234 tegra186_bpmp_channel_reset(bpmp->tx_channel); in tegra186_bpmp_init()
235 tegra186_bpmp_channel_reset(bpmp->rx_channel); in tegra186_bpmp_init()
237 for (i = 0; i < bpmp->threaded.count; i++) in tegra186_bpmp_init()
238 tegra186_bpmp_channel_reset(&bpmp->threaded_channels[i]); in tegra186_bpmp_init()
243 for (i = 0; i < bpmp->threaded.count; i++) { in tegra186_bpmp_init()
244 if (!bpmp->threaded_channels[i].bpmp) in tegra186_bpmp_init()
247 tegra186_bpmp_channel_cleanup(&bpmp->threaded_channels[i]); in tegra186_bpmp_init()
250 tegra186_bpmp_channel_cleanup(bpmp->rx_channel); in tegra186_bpmp_init()
252 tegra186_bpmp_channel_cleanup(bpmp->tx_channel); in tegra186_bpmp_init()
254 gen_pool_free(priv->rx.pool, (unsigned long)priv->rx.virt, 4096); in tegra186_bpmp_init()
256 gen_pool_free(priv->tx.pool, (unsigned long)priv->tx.virt, 4096); in tegra186_bpmp_init()
263 struct tegra186_bpmp *priv = bpmp->priv; in tegra186_bpmp_deinit()
266 mbox_free_channel(priv->mbox.channel); in tegra186_bpmp_deinit()
268 for (i = 0; i < bpmp->threaded.count; i++) in tegra186_bpmp_deinit()
269 tegra186_bpmp_channel_cleanup(&bpmp->threaded_channels[i]); in tegra186_bpmp_deinit()
271 tegra186_bpmp_channel_cleanup(bpmp->rx_channel); in tegra186_bpmp_deinit()
272 tegra186_bpmp_channel_cleanup(bpmp->tx_channel); in tegra186_bpmp_deinit()
274 gen_pool_free(priv->rx.pool, (unsigned long)priv->rx.virt, 4096); in tegra186_bpmp_deinit()
275 gen_pool_free(priv->tx.pool, (unsigned long)priv->tx.virt, 4096); in tegra186_bpmp_deinit()
283 tegra186_bpmp_channel_reset(bpmp->tx_channel); in tegra186_bpmp_resume()
284 tegra186_bpmp_channel_reset(bpmp->rx_channel); in tegra186_bpmp_resume()
286 for (i = 0; i < bpmp->threaded.count; i++) in tegra186_bpmp_resume()
287 tegra186_bpmp_channel_reset(&bpmp->threaded_channels[i]); in tegra186_bpmp_resume()