|  | // 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 <stdalign.h> | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include "sw/device/lib/hw_sha256.h" | 
|  |  | 
|  | /** | 
|  | * The total size of a spiflash frame. | 
|  | */ | 
|  | #define SPIFLASH_RAW_BUFFER_SIZE 1024 | 
|  |  | 
|  | /** | 
|  | * 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. | 
|  | */ | 
|  | uint32_t hash[SHA256_DIGEST_SIZE / sizeof(uint32_t)]; | 
|  | /** | 
|  | * 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_ |