coreboot-libre-fam15h-rdimm/3rdparty/chromeec/chip/g/board_space.h

99 lines
3.0 KiB
C

/*
* Copyright 2018 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 __EC_CHIP_G_BOARD_SPACE_H
#define __EC_CHIP_G_BOARD_SPACE_H
#include "compile_time_macros.h"
#include "flash_config.h"
#include "flash_info.h"
#include "stdint.h"
/*
* Structures for data stored in the board space of INFO1.
*/
/* Structure holding Board ID */
struct board_id {
uint32_t type; /* Board type */
uint32_t type_inv; /* Board type (inverted) */
uint32_t flags; /* Flags */
};
/* Structure holding serial number data */
struct sn_data {
uint8_t version;
uint8_t reserved[2];
uint8_t rma_status;
uint32_t sn_hash[3];
};
/* Current sn_data format version */
#define SN_DATA_VERSION 0x0f
/* Size of header elements (everything apart from sn_hash) */
#define SN_HEADER_SIZE offsetof(struct sn_data, sn_hash)
/* Number of bits reserved for RMA counter */
#define RMA_COUNT_BITS 7
/* Value used to indicate device has been RMA'd */
#define RMA_INDICATOR ((uint8_t) ~BIT(RMA_COUNT_BITS))
/* Info1 Board space contents. */
struct info1_board_space {
struct board_id bid;
/* Pad so that board_id occupies it's full 'protect' size */
uint8_t bid_padding[4];
struct sn_data sn;
};
/*
* Layout of the entire 2K INFO1 space.
*
* - ro_info_map - maps controlling ro and rw images rollback protection.
* - rw_info_map
* - board_space - various objects used by Chrome OS applications
* - manufacture_space - seed used for generating and verification of
* endorsement certs.
*/
struct info1_layout {
uint8_t ro_info_map[INFO_RO_MAP_SIZE];
uint8_t rw_info_map[INFO_RW_MAP_SIZE];
struct info1_board_space board_space;
uint8_t padding[FLASH_INFO_MANUFACTURE_STATE_OFFSET - INFO_RO_MAP_SIZE -
INFO_RW_MAP_SIZE - sizeof(struct info1_board_space)];
uint8_t manufacture_space[FLASH_INFO_MANUFACTURE_STATE_SIZE];
};
BUILD_ASSERT(sizeof(struct info1_layout) == FLASH_INFO_SIZE);
#define INFO_BOARD_ID_SIZE sizeof(struct board_id)
#define INFO_BOARD_ID_OFFSET (INFO_BOARD_SPACE_OFFSET + \
offsetof(struct info1_board_space, \
bid))
#define INFO_SN_DATA_SIZE sizeof(struct sn_data)
#define INFO_SN_DATA_OFFSET (INFO_BOARD_SPACE_OFFSET + \
offsetof(struct info1_board_space, \
sn))
/*
* Write protection for the INFO1 space allows windows with sizes that are
* powers of 2 to be protected. Given the different write restrictions on
* the different spaces listed above, we keep them in separate windows.
* This implies that each space must occupy a space that has a size which
* is a power of two.
*/
#define INFO_BOARD_ID_PROTECT_SIZE 16
#define INFO_SN_DATA_PROTECT_SIZE 16
BUILD_ASSERT((INFO_BOARD_ID_SIZE & 3) == 0);
BUILD_ASSERT((INFO_BOARD_ID_OFFSET & 3) == 0);
BUILD_ASSERT(INFO_BOARD_ID_SIZE <= INFO_BOARD_ID_PROTECT_SIZE);
BUILD_ASSERT((INFO_SN_DATA_SIZE & 3) == 0);
BUILD_ASSERT((INFO_SN_DATA_OFFSET & 3) == 0);
BUILD_ASSERT(INFO_SN_DATA_SIZE <= INFO_SN_DATA_PROTECT_SIZE);
#endif /* ! __EC_CHIP_G_BOARD_SPACE_H */