// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

#ifndef OPENTITAN_SW_DEVICE_BOOT_ROM_SPIFLASH_FRAME_H_
#define OPENTITAN_SW_DEVICE_BOOT_ROM_SPIFLASH_FRAME_H_

#include <stdint.h>

#include "sw/device/lib/dif/dif_hmac.h"

/**
 * The total size of a spiflash frame.
 */
#define SPIFLASH_RAW_BUFFER_SIZE 2048

/**
 * The EOF flag on a spiflash frame, indicating that a frame is the last one in
 * the sequence.
 */
#define SPIFLASH_FRAME_EOF_MARKER 0x80000000

/**
 * Extracts the "number" part of a `frame_num`.
 */
#define SPIFLASH_FRAME_NUM(k) ((k)&0xffffff)

/**
 * Checks whether a `frame_num` represents an EOF.
 */
#define SPIFLASH_FRAME_IS_EOF(k) (((k)&SPIFLASH_FRAME_EOF_MARKER) != 0)

/**
 * The length, in words, of a frame's data buffer.
 */
#define SPIFLASH_FRAME_DATA_WORDS                                 \
  ((SPIFLASH_RAW_BUFFER_SIZE - sizeof(spiflash_frame_header_t)) / \
   sizeof(uint32_t))

/**
 * A spiflash frame header.
 */
typedef struct spiflash_frame_header {
  /**
   * SHA256 of the entire frame_t message starting at the `frame_num` offset.
   */
  dif_hmac_digest_t hash;
  /**
   * Frame number starting at 0. The last frame should be OR'd with
   * FRAME_EOF_MARKER.
   */
  uint32_t frame_num;
  /**
   * Offset in flash, indexed from 0, where the frame should be
   * written.
   */
  uint32_t flash_offset;
} spiflash_frame_header_t;

/**
 * A spiflash frame, as it would arrive on the wire.
 */
typedef struct spiflash_frame {
  /**
   * Frame header.
   */
  spiflash_frame_header_t header;
  /**
   * Frame data, word-aligned.
   */
  uint32_t data[SPIFLASH_FRAME_DATA_WORDS];
} spiflash_frame_t;

_Static_assert(sizeof(spiflash_frame_t) == SPIFLASH_RAW_BUFFER_SIZE,
               "spiflash_frame_t is the wrong size!");

#endif  // OPENTITAN_SW_DEVICE_BOOT_ROM_SPIFLASH_FRAME_H_
