// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SRC_GRAPHICS_LIB_COMPUTE_SPINEL_ALLOCATOR_HOST_H_
#define SRC_GRAPHICS_LIB_COMPUTE_SPINEL_ALLOCATOR_HOST_H_

//
//
//

#include <stdint.h>

#include "suballocator.h"

//
//
//

typedef enum spn_mem_flags_e
{
  SPN_MEM_FLAGS_READ_WRITE,
  SPN_MEM_FLAGS_WRITE_ONLY,
  SPN_MEM_FLAGS_READ_ONLY
} spn_mem_flags_e;

//
// Permanent / durable allocations
//

struct spn_allocator_host_perm
{
  uint64_t alignment;
};

//
// Temporary / ephemeral allocations
//
// Note that the temp allocator references the perm allocator used for
// creation because there might be more than one.
//

struct spn_allocator_host_temp
{
  struct spn_allocator_host_perm * host_perm;
  uint8_t *                        extent;
  struct spn_suballocator          suballocator;
};

//
// PERM
//

void
spn_allocator_host_perm_create(struct spn_allocator_host_perm * const host_perm,
                               uint64_t const                         alignment);

void
spn_allocator_host_perm_dispose(struct spn_allocator_host_perm * const host_perm);

void *
spn_allocator_host_perm_alloc(struct spn_allocator_host_perm * const host_perm,
                              spn_mem_flags_e const                  flags,
                              uint64_t const                         size);

void
spn_allocator_host_perm_free(struct spn_allocator_host_perm * const host_perm, void * const mem);
//
// TEMP
//

void
spn_allocator_host_temp_create(struct spn_allocator_host_temp * const host_temp,
                               struct spn_allocator_host_perm * const host_perm,
                               uint32_t const                         subbufs,
                               uint64_t const                         size,
                               uint64_t const                         alignment);

void
spn_allocator_host_temp_dispose(struct spn_allocator_host_temp * const host_temp);

void *
spn_allocator_host_temp_alloc(struct spn_allocator_host_temp * const host_temp,
                              struct spn_device * const              device,
                              spn_result (*const wait)(struct spn_device * const device),
                              spn_mem_flags_e const   flags,
                              uint64_t const          size,
                              spn_subbuf_id_t * const subbuf_id,
                              uint64_t * const        subbuf_size);

void
spn_allocator_host_temp_free(struct spn_allocator_host_temp * const host_temp,
                             spn_subbuf_id_t const                  subbuf_id);

//
//
//

#endif  // SRC_GRAPHICS_LIB_COMPUTE_SPINEL_ALLOCATOR_HOST_H_
