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

#pragma once

#include <autoconf.h>
#include <sel4/types.h>
#include <allocman/utspace/utspace.h>
#include <vka/cspacepath_t.h>
#include <assert.h>

/* This is an untyped manager that is vaguely related to the twinkle allocator.
   This means it does a simple progressive allocation of untypeds and doesn't
   support free. */

struct utspace_twinkle_ut {
    cspacepath_t path;
    size_t offset;
    size_t size_bits;
};

typedef struct utspace_twinkle {
    size_t num_uts;
    struct utspace_twinkle_ut *uts;
} utspace_twinkle_t;

void utspace_twinkle_create(utspace_twinkle_t *twinkle);
int _utspace_twinkle_add_uts(struct allocman *alloc, void *_twinkle, size_t num, const cspacepath_t *uts, size_t *size_bits, uintptr_t *paddr, int utType);

seL4_Word _utspace_twinkle_alloc(struct allocman *alloc, void *_twinkle, size_t size_bits, seL4_Word type, const cspacepath_t *slot, uintptr_t paddr, bool canBeDev, int *error);
void _utspace_twinkle_free(struct allocman *alloc, void *_twinkle, seL4_Word cookie, size_t size_bits);

static inline uintptr_t _utspace_twinkle_paddr(void *_twinkle, seL4_Word cookie, size_t size_bits) {
    assert(!"not implemented");
    return ALLOCMAN_NO_PADDR;
}

static inline struct utspace_interface utspace_twinkle_make_interface(utspace_twinkle_t *twinkle) {
    return (struct utspace_interface) {
        .alloc = _utspace_twinkle_alloc,
        .free = _utspace_twinkle_free,
        .add_uts = _utspace_twinkle_add_uts,
        .paddr = _utspace_twinkle_paddr,
        .properties = ALLOCMAN_DEFAULT_PROPERTIES,
        .utspace = twinkle
    };
}

