/* Copyright (c) 2018 Laczen * Copyright (c) 2024 BayLibre SAS * * SPDX-License-Identifier: Apache-2.0 * * ZMS: Zephyr Memory Storage */ #ifndef __ZMS_PRIV_H_ #define __ZMS_PRIV_H_ /* * MASKS AND SHIFT FOR ADDRESSES. * An address in zms is an uint64_t where: * - high 4 bytes represent the sector number * - low 4 bytes represent the offset in a sector */ #define ADDR_SECT_MASK GENMASK64(63, 32) #define ADDR_SECT_SHIFT 32 #define ADDR_OFFS_MASK GENMASK64(31, 0) #define SECTOR_NUM(x) FIELD_GET(ADDR_SECT_MASK, x) #define SECTOR_OFFSET(x) FIELD_GET(ADDR_OFFS_MASK, x) #if defined(CONFIG_ZMS_CUSTOMIZE_BLOCK_SIZE) #define ZMS_BLOCK_SIZE CONFIG_ZMS_CUSTOM_BLOCK_SIZE #else #define ZMS_BLOCK_SIZE 32 #endif #define ZMS_LOOKUP_CACHE_NO_ADDR GENMASK64(63, 0) #define ZMS_HEAD_ID GENMASK(31, 0) #define ZMS_VERSION_MASK GENMASK(7, 0) #define ZMS_GET_VERSION(x) FIELD_GET(ZMS_VERSION_MASK, x) #define ZMS_DEFAULT_VERSION 1 #define ZMS_MAGIC_NUMBER 0x42 /* murmur3a hash of "ZMS" (MSB) */ #define ZMS_MAGIC_NUMBER_MASK GENMASK(15, 8) #define ZMS_GET_MAGIC_NUMBER(x) FIELD_GET(ZMS_MAGIC_NUMBER_MASK, x) #define ZMS_MIN_ATE_NUM 5 #define ZMS_INVALID_SECTOR_NUM -1 #define ZMS_DATA_IN_ATE_SIZE 8 /** * @ingroup zms_data_structures * ZMS Allocation Table Entry (ATE) structure */ struct zms_ate { /** crc8 check of the entry */ uint8_t crc8; /** cycle counter for non erasable devices */ uint8_t cycle_cnt; /** data len within sector */ uint16_t len; /** data id */ uint32_t id; union { /** data field used to store small sized data */ uint8_t data[8]; struct { /** data offset within sector */ uint32_t offset; union { /** * crc for data: The data CRC is checked only when the whole data * of the element is read. * The data CRC is not checked for a partial read, as it is computed * for the complete set of data. */ uint32_t data_crc; /** * Used to store metadata information such as storage version. */ uint32_t metadata; }; }; }; } __packed; #endif /* __ZMS_PRIV_H_ */