// Copyright 2018 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.

#pragma once

#include <stdlib.h>

/***********************************************************************/
/* Type Declarations                                                   */
/***********************************************************************/
// Cache miss read/write interface
typedef int (*ftlmcFuncW)(void* ftl, ui32 mpn, void* buf);
typedef int (*ftlmcFuncR)(void* ftl, ui32 mpn, void* buf, int* unmapped);

// Cache Entry Type
typedef struct ftlmc_cache_entry ftlmcEntry;

// Cache Type
typedef struct {
    ftlmcEntry* entry;     // array containing all cache entries
    ftlmcEntry** hash_tbl; // hash table used to index cached pages
    CircLink lru_list;     // least recently used entry list
    void* ftl;             // handle to FTL volume using cache
    ftlmcFuncW write;      // write function on cache miss
    ftlmcFuncR read;       // read function on cache miss
    ui32 num_mpgs;         // number of cached map pages
    ui32 num_dirty;        // number of dirty cached entries
    ui32 mpg_sz;           // size of a cached map page in bytes
} FTLMC;

/***********************************************************************/
/* Function Prototypes                                                 */
/***********************************************************************/
FTLMC* ftlmcNew(void* ftl_ndm, ui32 cache_size, ftlmcFuncW wf, ftlmcFuncR rf, ui32 mpg_sz);
void ftlmcDelete(FTLMC** ftlmc_ptr);
void ftlmcInit(FTLMC* ftlmc);
void* ftlmcGetPage(FTLMC* ftlmc, ui32 mpn, int* new_map);
int ftlmcFlushPage(FTLMC* ftlmc, ui32 mpn);
int ftlmcFlushMap(FTLMC* ftlmc);
ui32* ftlmcInCache(FTLMC* ftlmc, ui32 mpn);
ui32 ftlmcRAM(const FTLMC* ftlmc);
