static int tegra186_bpmp_remove(struct udevice *dev) { struct tegra186_bpmp *priv = dev_get_priv(dev); debug("%s(dev=%p) (priv=%p)\n", __func__, dev, priv); mbox_free(&priv->mbox); return 0; }
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; }
void mbox_test(void) { int mbox_id = mbox_init(1); assert(mbox_id >= 0); struct mboxbuf __buf, *buf = &__buf; buf->size = 4096; buf->len = buf->size; buf->data = (void *)0xF0000000; assert(mbox_send(mbox_id, buf) < 0); buf->data = malloc(sizeof(char) * buf->size); assert(buf->data != NULL); char *data = (char *)(buf->data); int i; for (i = 0; i < buf->size; i++) { data[i] = (char)i; } buf->len = buf->size; unsigned int timeout = 100, saved_msec = gettime_msec(); assert(mbox_send(mbox_id, buf) == 0); assert(mbox_send_timeout(mbox_id, buf, timeout) == -E_TIMEOUT); assert((unsigned int)(gettime_msec() - saved_msec) >= timeout); size_t saved_size = buf->size; buf->size = 100; assert(mbox_recv(mbox_id, buf) != 0); buf->size = saved_size - 1; assert(mbox_recv(mbox_id, buf) != 0); buf->size = saved_size; memset(buf->data, 0, sizeof(char) * buf->size); assert(mbox_recv(mbox_id, buf) == 0); assert(buf->size == saved_size && buf->len == saved_size); data = (char *)(buf->data); for (i = 0; i < buf->size; i++) { assert(data[i] == (char)i); } saved_msec = gettime_msec(); assert(mbox_recv_timeout(mbox_id, buf, timeout) == -E_TIMEOUT); assert((unsigned int)(gettime_msec() - saved_msec) >= timeout); assert(mbox_free(mbox_id) == 0); assert(mbox_send(mbox_id, buf) != 0); exit(0); }
void config_free (struct config *config) { struct mbox *mbox = config->mailboxes, *mbox_o; while (mbox) { mbox_o = mbox; mbox = mbox->next; mbox_free (mbox_o); } struct signal *signal = config->signals, *signal_o; while (signal) { signal_o = signal; signal = signal->next; signal_free (signal_o); } free (config_filename); config_filename = NULL; free (config); }
int main (int argc, char **argv) { mbox_err_t err; mbox_t *mbox; mbox_mail_t *mail; assert(argc > 1); err = mbox_new(argv[1], &mbox); if (err) { fprintf(stderr, "Mbox error: %s\n", mbox_strerr(err)); exit(1); } printf("Starting to get milk\n"); while ((mail = mbox_next_mail (mbox)) != NULL) { const dlist_t *trace; diter_t *iter; printf("Is to [%s]\n", mbox_mail_getattr(mail, "To")); printf("Mail trace:\n"); trace = mbox_mail_gettrace(mail); iter = dlist_iter_new((dlist_t **)&trace); while (diter_hasnext(iter)) { printf("\t%s\n", (char *)diter_next(iter)); } dlist_iter_free(iter); printf("FOLLOWING TEXT\n"); printf("%s\n", mbox_mail_getbody(mail)); printf("END OF TEXT\n"); mbox_mail_free(mail); } printf("LOL WUT?\n"); mbox_free(mbox); exit(0); }