// 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

#ifdef __cplusplus
extern "C" {
#endif

#include <targetos.h>
#include <kernel.h>
#include <fsdriver.h>

/***********************************************************************/
/* Symbol Definitions                                                  */
/***********************************************************************/
#define NDM_PART_NAME_LEN 15            // partition name size in bytes
#define NDM_PART_USER 0                 // number of ui32s in partition for user
#define NDM_PART_NAME NDM_PART_NAME_LEN // obsolete symbol

// Various NAND device types
#define NDM_SLC (1 << 0)
#define NDM_MLC (1 << 1)
#define NDM_WR1 (1 << 2)

// Various function return types
#define NDM_INIT_BAD_BLOCK 1
#define NDM_CTRL_BLOCK 2
#define NDM_REG_BLOCK 3

// Various states for a page - used by data_and_spare_check()
#define NDM_PAGE_ERASED 0
#define NDM_PAGE_VALID 1
#define NDM_PAGE_INVALID 2

// write_data_and_spare action parameter values
#define NDM_NONE 0
#define NDM_ECC 1
#define NDM_ECC_VAL 2

/***********************************************************************/
/* Type Declarations                                                   */
/***********************************************************************/
// NDM Partition Information
typedef struct {
    ui32 first_block; // first virtual block for partition
    ui32 num_blocks;  // number of virtual blocks in partition
#if NDM_PART_USER
    ui32 user[NDM_PART_USER]; // reserved for the user
#endif
    char name[NDM_PART_NAME_LEN]; // partition name
    ui8 type;                     // partition type - same as vstat()
} NDMPartition;

// Driver count statistics for TargetNDM devices
typedef struct {
    ui32 write_page;      // number of write_data_and_spare() calls
    ui32 write_pages;     // number of write_pages() calls
    ui32 read_page;       // number of read_decode_data() calls
    ui32 read_pages;      // number of read_pages() calls
    ui32 xfr_page;        // number of transfer_page() calls
    ui32 read_dec_spare;  // number of read_decode_spare() calls
    ui32 read_spare;      // number of read_spare() calls
    ui32 page_erased;     // number of data_and_spare_erased() calls
    ui32 check_page;      // number of data_and_spare_check() calls
    ui32 erase_block;     // number of erase_block() calls
    ui32 is_block_bad;    // number of is_block_bad() calls
} NdmDvrStats;

// TargetNDM Configuration Structure
typedef struct {
    ui32 num_blocks;     // total number of blocks on device
    ui32 max_bad_blocks; // maximum number of bad blocks
    ui32 block_size;     // block size in bytes
    ui32 page_size;      // page data area in bytes
    ui32 eb_size;        // used spare area in bytes
    ui32 flags;          // option flags
    ui32 type;           // type of device
    void* dev;           // optional value set by driver

    // Driver Functions
    int (*write_data_and_spare)(ui32 pn, const ui8* data, ui8* spare, int action, void* dev);
    int (*write_pages)(ui32 pn, ui32 count, const ui8* data, ui8* spare, int action, void* dev);
    int (*read_decode_data)(ui32 pn, ui8* data, ui8* spare, void* dev);
    int (*read_pages)(ui32 pn, ui32 count, ui8* data, ui8* spare, void* dev);
    int (*transfer_page)(ui32 old_pn, ui32 new_pn, ui8* data, ui8* old_spare, ui8* new_spare,
                         int encode_spare, void* dev);
#if INC_FTL_NDM_MLC
    ui32 (*pair_offset)(ui32 page_offset, void* dev);
#endif
    int (*read_decode_spare)(ui32 pn, ui8* spare, void* dev);
    int (*read_spare)(ui32 pn, ui8* spare, void* dev);
    int (*data_and_spare_erased)(ui32 pn, ui8* data, ui8* spare, void* dev);
    int (*data_and_spare_check)(ui32 pn, ui8* data, ui8* spare, int* status, void* dev);
    int (*erase_block)(ui32 pn, void* dev);
    int (*is_block_bad)(ui32 pn, void* dev);
#if FS_DVR_TEST
    ui32 dev_eb_size; /* device spare area size */
    void (*chip_show)(void* vol);
    int (*rd_raw_spare)(ui32 p, ui8* spare, void* dev);
    int (*rd_raw_page)(ui32 p, void* data, void* dev);
#endif
} NDMDrvr;

/***********************************************************************/
/* Functions Prototypes                                                */
/***********************************************************************/
// General API
NDM ndmAddDev(const NDMDrvr* drvr);
int ndmDelDev(NDM ndm);
ui32 ndmGetNumVBlocks(CNDM ndm);
int ndmUnformat(NDM ndm);
ui32 ndmPastPrevPair(CNDM ndm, ui32 pn);

// Partitions API
ui32 ndmGetNumPartitions(CNDM ndm);
int ndmSetNumPartitions(NDM ndm, ui32 num_partitions);
int ndmReadPartition(CNDM ndm, NDMPartition* part, ui32 part_num);
const NDMPartition* ndmGetPartition(CNDM ndm, ui32 part_num);
int ndmWritePartition(NDM ndm, const NDMPartition* part, ui32 part_num, const char* name);
void ndmDeletePartitionTable(NDM ndm);
int ndmSavePartitionTable(NDM ndm);
int ndmDelVols(CNDM ndm);
int ndmDelVol(CNDM ndm, ui32 part_num);

// FTL Volume API
int ndmAddVolFTL(NDM ndm, ui32 part_no, FtlNdmVol* ftl, XfsVol* xfs);

// Driver Test/Special Routines
int ndmExtractBBL(NDM ndm);
int ndmInsertBBL(NDM ndm);
int NdmDvrTestAdd(const NDMDrvr* dev);

#ifdef __cplusplus
}
#endif
