/* Copyright (c) 2013 The Chromium OS 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 VBOOT_REFERENCE_MTDLIB_H_
#define VBOOT_REFERENCE_MTDLIB_H_

#include "cgptlib.h"
#include "sysincludes.h"


#define MTD_DRIVE_SIGNATURE "CrOSPart" /* This must be exactly 8 chars */

/*
 * Bit definitions and masks for MTD attributes.
 *
 * 13-16 -- partition number
 *  9-12 -- partition type
 *    8  -- success
 *  7-4  -- tries
 *  3-0  -- priority
 */
#define MTD_ATTRIBUTE_PRIORITY_OFFSET (0)
#define MTD_ATTRIBUTE_MAX_PRIORITY (15UL)
#define MTD_ATTRIBUTE_PRIORITY_MASK (MTD_ATTRIBUTE_MAX_PRIORITY << \
                                     MTD_ATTRIBUTE_PRIORITY_OFFSET)

#define MTD_ATTRIBUTE_TRIES_OFFSET (4)
#define MTD_ATTRIBUTE_MAX_TRIES (15UL)
#define MTD_ATTRIBUTE_TRIES_MASK (MTD_ATTRIBUTE_MAX_TRIES << \
                                  MTD_ATTRIBUTE_TRIES_OFFSET)

#define MTD_ATTRIBUTE_SUCCESSFUL_OFFSET (8)
#define MTD_ATTRIBUTE_MAX_SUCCESSFUL (1UL)
#define MTD_ATTRIBUTE_SUCCESSFUL_MASK (MTD_ATTRIBUTE_MAX_SUCCESSFUL << \
                                       MTD_ATTRIBUTE_SUCCESSFUL_OFFSET)

#define MTD_ATTRIBUTE_TYPE_OFFSET (9)
#define MTD_ATTRIBUTE_MAX_TYPE (15UL)
#define MTD_ATTRIBUTE_TYPE_MASK (MTD_ATTRIBUTE_MAX_TYPE << \
                                 MTD_ATTRIBUTE_TYPE_OFFSET)

#define MTD_ATTRIBUTE_NUMBER_OFFSET (13)
#define MTD_ATTRIBUTE_MAX_NUMBER (15UL)
#define MTD_ATTRIBUTE_NUMBER_MASK (MTD_ATTRIBUTE_MAX_NUMBER << \
                                   MTD_ATTRIBUTE_NUMBER_OFFSET)


#define MTD_PARTITION_TYPE_UNUSED             0
#define MTD_PARTITION_TYPE_CHROMEOS_KERNEL    1
#define MTD_PARTITION_TYPE_CHROMEOS_FIRMWARE  2
#define MTD_PARTITION_TYPE_CHROMEOS_ROOTFS    3
#define MTD_PARTITION_TYPE_CHROMEOS_RESERVED  4
#define MTD_PARTITION_TYPE_CHROMEOS_FLAGSTORE 5
#define MTD_PARTITION_TYPE_LINUX_DATA         6
#define MTD_PARTITION_TYPE_EFI                7
#define MTD_PARTITION_TYPE_OTHER              8

/* This is mostly arbitrary at the moment, but gives a little room to expand. */
#define MTD_MAX_PARTITIONS 16



typedef struct {
  uint64_t starting_offset;
  uint64_t ending_offset;
  uint32_t flags;

  /* 28 characters is a balance between GPT parity and size constraints, at
   * current sizes this table occupies 10% of the FTS data store.
   */
  char label[28];
} __attribute__((packed)) MtdDiskPartition;

typedef struct {
  unsigned char signature[8];
  /* For compatibility, this is only ever the CRC of the first
   * MTD_DRIVE_V1_SIZE bytes. Further extensions must include their own CRCs,
   * so older FW can boot newer layouts if we expand in the future.
   */
  uint32_t crc32;
  uint32_t size;
  uint64_t first_offset;
  uint64_t last_offset;
  MtdDiskPartition partitions[MTD_MAX_PARTITIONS];
} __attribute__((packed)) MtdDiskLayout;

#define MTD_DRIVE_V1_SIZE (32 + 16*48)

#define MTDENTRY_EXPECTED_SIZE (48)
#define MTDLAYOUT_EXPECTED_SIZE (32 + 16 * MTDENTRY_EXPECTED_SIZE)


typedef struct {
  /* Specifies the flash geometry, in erase blocks & write pages */
  uint32_t flash_block_bytes;
  uint32_t flash_page_bytes;

  /* Location, in blocks, of FTS partition */
  uint32_t fts_block_offset;
  /* Size, in blocks, of FTS partition */
  uint32_t fts_block_size;

  /* Size of a LBA sector, in bytes */
  uint32_t sector_bytes;
  /* Size of drive in LBA sectors, in sectors */
  uint64_t drive_sectors;

  /*
   * The current chromeos kernel index in partition table.  -1 means not
   * found on drive.
   */
  int current_kernel;
  int current_priority;

  /* If set, the flags partition has been modified and needs to be flushed */
  int modified;

  /* Internal variables */
  MtdDiskLayout primary;
} MtdData;


/* APIs are documented in cgptlib.h & cgptlib_internal.h */
int MtdInit(MtdData *mtd);
int MtdCheckParameters(MtdData *mtd);

int MtdNextKernelEntry(MtdData *gpt, uint64_t *start_sector, uint64_t *size);
int MtdUpdateKernelEntry(MtdData *gpt, uint32_t update_type);

int MtdGetEntryPriority(const MtdDiskPartition *e);
int MtdGetEntryTries(const MtdDiskPartition *e);
int MtdGetEntrySuccessful(const MtdDiskPartition *e);
int MtdGetEntryType(const MtdDiskPartition *e);
int MtdIsKernelEntry(const MtdDiskPartition *e);
void MtdSetEntrySuccessful(MtdDiskPartition *e, int successful) ;
void MtdSetEntryPriority(MtdDiskPartition *e, int priority);
void MtdSetEntryTries(MtdDiskPartition *e, int tries);
void MtdSetEntryType(MtdDiskPartition *e, int type);

void MtdGetPartitionSize(const MtdDiskPartition *e,
                         uint64_t *start, uint64_t *end, uint64_t *size);

void MtdGetPartitionSizeInSectors(const MtdDiskPartition *e, uint64_t *start,
                                  uint64_t *end, uint64_t *size);

void MtdModified(MtdData *mtd);
int MtdGptInit(MtdData *mtd);
int MtdIsPartitionValid(const MtdDiskPartition *part);
int MtdCheckEntries(MtdDiskPartition *entries, MtdDiskLayout *h);
int MtdSanityCheck(MtdData *disk);
void MtdRepair(MtdData *gpt);
void MtdGetCurrentKernelUniqueGuid(MtdData *gpt, void *dest);
uint32_t MtdHeaderCrc(MtdDiskLayout *h);


#endif

