/*
 * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230)
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#include <stdio.h>
#include <stdlib.h>
#include <camkes.h>
#include <camkes/dma.h>

int run(void)
{
    printf("Starting client...\n");

    /* Test the legacy allocation functions. */

    printf("Allocating some DMA pages...\n");
    void *buffers[100];
    int i;
    for (i = 0; i < sizeof(buffers) / sizeof(void *); i++) {
        buffers[i] = camkes_dma_alloc(4096, 4096, false);
        if (buffers[i] == NULL) {
            printf("Ran out of memory after %d of them\n", i);
            break;
        }
    }

    printf("Reversing some offsets into them...\n");
    for (int j = 0; j < i; j++) {
        printf(" vaddr %p reversed to %p\n", buffers[j] + j * 13, (void *)camkes_dma_get_paddr(buffers[j] + j * 13));
    }

    printf("Freeing them...\n");
    for (int j = 0; j < i; j++) {
        camkes_dma_free(buffers[j], 4096);
    }

    /* Test the newer API. */
    printf("Attempting to allocate 0x2000...");
    void *p = camkes_dma_alloc(0x2000, 0, false);
    /* This is not guaranteed to work, but does so coincidentally. Assert on
     * this for now to catch accidental regressions in this behaviour.
     */
    assert(p != NULL && "DMA allocation >4K failed");
    if (p == NULL) {
        printf("Failed\n");
    } else {
        printf("%p\nReversing some offsets...\n", p);
        for (int j = 0; j < 7; j++) {
            printf(" vaddr %p reversed to %p\n", p + j * 0x513,
                   (void *)camkes_dma_get_paddr(p + j * 0x513));
        }
        camkes_dma_free(p, 0x2000);
    }

    printf("Freeing NULL...\n");
    camkes_dma_free(NULL, /* irrelevant */ 0x20000);

    printf("Allocating with different alignment requirements...\n");
    for (int j = 0; j < 14; j++) {
        printf(" Allocating 0x1000 with alignment %d...", 1 << j);
        void *p = camkes_dma_alloc(0x1000, 1 << j, false);
        if (p == NULL) {
            printf("Failed\n");
        } else {
            printf("%p\n", p);
            camkes_dma_free(p, 0x1000);
        }
    }

    printf("Allocating 4MB...\n");
    p = camkes_dma_alloc(4 * 1024 * 1024, 0, false);
    if (p == NULL) {
        printf("Failed\n");
    } else {
        printf("Succeeded\n");
        camkes_dma_free(p, 4 * 1024 * 1024);
    }

    printf("Done.\n");
    return 0;
}
