static int tegra186_bpmp_probe(struct udevice *dev) { struct tegra186_bpmp *priv = dev_get_priv(dev); int ret; ulong tx_base, rx_base, start_time; debug("%s(dev=%p) (priv=%p)\n", __func__, dev, priv); ret = mbox_get_by_index(dev, 0, &priv->mbox); if (ret) { error("mbox_get_by_index() failed: %d\n", ret); return ret; } tx_base = tegra186_bpmp_get_shmem(dev, 0); if (IS_ERR_VALUE(tx_base)) { error("tegra186_bpmp_get_shmem failed for tx_base\n"); return tx_base; } rx_base = tegra186_bpmp_get_shmem(dev, 1); if (IS_ERR_VALUE(rx_base)) { error("tegra186_bpmp_get_shmem failed for rx_base\n"); return rx_base; } debug("shmem: rx=%lx, tx=%lx\n", rx_base, tx_base); ret = tegra_ivc_init(&priv->ivc, rx_base, tx_base, BPMP_IVC_FRAME_COUNT, BPMP_IVC_FRAME_SIZE, tegra186_bpmp_ivc_notify); if (ret) { error("tegra_ivc_init() failed: %d\n", ret); return ret; } tegra_ivc_channel_reset(&priv->ivc); start_time = timer_get_us(); for (;;) { ret = tegra_ivc_channel_notified(&priv->ivc); if (!ret) break; /* Timeout 100ms */ if ((timer_get_us() - start_time) > 100 * 1000) { error("Initial IVC reset timed out (%d)\n", ret); ret = -ETIMEDOUT; goto err_free_mbox; } } return 0; err_free_mbox: mbox_free(&priv->mbox); return ret; }
int mbox_get_by_name(struct udevice *dev, const char *name, struct mbox_chan *chan) { int index; debug("%s(dev=%p, name=%s, chan=%p)\n", __func__, dev, name, chan); index = fdt_find_string(gd->fdt_blob, dev->of_offset, "mbox-names", name); if (index < 0) { debug("fdt_find_string() failed: %d\n", index); return index; } return mbox_get_by_index(dev, index, chan); }