1c8ab874dSKozlowski Mateusz /* SPDX-License-Identifier: BSD-3-Clause 2a6dbe372Spaul luse * Copyright (C) 2022 Intel Corporation. 3c8ab874dSKozlowski Mateusz * All rights reserved. 4c8ab874dSKozlowski Mateusz */ 5c8ab874dSKozlowski Mateusz 6c8ab874dSKozlowski Mateusz #ifndef FTL_SB_PREV_H 7c8ab874dSKozlowski Mateusz #define FTL_SB_PREV_H 8c8ab874dSKozlowski Mateusz 9c8ab874dSKozlowski Mateusz #include "spdk/uuid.h" 10c8ab874dSKozlowski Mateusz #include "ftl_sb_common.h" 11c8ab874dSKozlowski Mateusz 12c8ab874dSKozlowski Mateusz /** 13c8ab874dSKozlowski Mateusz * Magic number identifies FTL superblock 14c8ab874dSKozlowski Mateusz * 15c8ab874dSKozlowski Mateusz * This old (pre v3) version has a bug - it's generating the magic number off 16b numbers, but only utilizing 8b from each 16c8ab874dSKozlowski Mateusz */ 17c8ab874dSKozlowski Mateusz #define FTL_MAGIC_V2(a, b, c, d) \ 18c8ab874dSKozlowski Mateusz ((UINT64_C(a) << 24) | (UINT64_C(b) << 16) | (UINT64_C(c) << 8) | UINT64_C(d)) 19c8ab874dSKozlowski Mateusz 20c8ab874dSKozlowski Mateusz #define FTL_SUPERBLOCK_MAGIC_V2 FTL_MAGIC_V2(0x1410, 0x1683, 0x1920, 0x1989) 21c8ab874dSKozlowski Mateusz 22c8ab874dSKozlowski Mateusz #define FTL_SB_VERSION_0 0 23c8ab874dSKozlowski Mateusz #define FTL_SB_VERSION_1 1 24c8ab874dSKozlowski Mateusz #define FTL_SB_VERSION_2 2 25c8ab874dSKozlowski Mateusz #define FTL_SB_VERSION_3 3 26fa1fc76cSLukasz Lasek #define FTL_SB_VERSION_4 4 27c8ab874dSKozlowski Mateusz 28c8ab874dSKozlowski Mateusz struct ftl_superblock_v2 { 29c8ab874dSKozlowski Mateusz struct ftl_superblock_header header; 30c8ab874dSKozlowski Mateusz 31c8ab874dSKozlowski Mateusz struct spdk_uuid uuid; 32c8ab874dSKozlowski Mateusz 33c8ab874dSKozlowski Mateusz /* Current sequence number */ 34c8ab874dSKozlowski Mateusz uint64_t seq_id; 35c8ab874dSKozlowski Mateusz 36c8ab874dSKozlowski Mateusz /* Flag describing clean shutdown */ 37c8ab874dSKozlowski Mateusz uint64_t clean; 38c8ab874dSKozlowski Mateusz 39c8ab874dSKozlowski Mateusz /* Number of surfaced LBAs */ 40c8ab874dSKozlowski Mateusz uint64_t lba_cnt; 41c8ab874dSKozlowski Mateusz /* Number of reserved addresses not exposed to the user */ 42c8ab874dSKozlowski Mateusz size_t lba_rsvd; 43c8ab874dSKozlowski Mateusz 44c8ab874dSKozlowski Mateusz /* Maximum IO depth per band relocate */ 45c8ab874dSKozlowski Mateusz size_t max_reloc_qdepth; 46c8ab874dSKozlowski Mateusz 47c8ab874dSKozlowski Mateusz /* Maximum active band relocates */ 48c8ab874dSKozlowski Mateusz size_t max_active_relocs; 49c8ab874dSKozlowski Mateusz 50c8ab874dSKozlowski Mateusz /* Use append instead of write */ 51c8ab874dSKozlowski Mateusz bool use_append; 52c8ab874dSKozlowski Mateusz 53c8ab874dSKozlowski Mateusz /* Maximum supported number of IO channels */ 54c8ab874dSKozlowski Mateusz uint32_t max_io_channels; 55c8ab874dSKozlowski Mateusz 56c8ab874dSKozlowski Mateusz /* Last L2P checkpoint +1 (i.e. min_seq_id, 0:no ckpt) */ 57c8ab874dSKozlowski Mateusz uint64_t ckpt_seq_id; 58c8ab874dSKozlowski Mateusz 59c8ab874dSKozlowski Mateusz struct ftl_superblock_gc_info gc_info; 60c8ab874dSKozlowski Mateusz }; 61c8ab874dSKozlowski Mateusz 62c8ab874dSKozlowski Mateusz 63c8ab874dSKozlowski Mateusz SPDK_STATIC_ASSERT(offsetof(struct ftl_superblock_v2, header) == 0, 64c8ab874dSKozlowski Mateusz "Invalid placement of header"); 65c8ab874dSKozlowski Mateusz 66c8ab874dSKozlowski Mateusz SPDK_STATIC_ASSERT(FTL_SUPERBLOCK_SIZE >= sizeof(struct ftl_superblock_v2), 67c8ab874dSKozlowski Mateusz "FTL SB metadata size is invalid"); 68c8ab874dSKozlowski Mateusz 69fa1fc76cSLukasz Lasek struct ftl_superblock_v3 { 70fa1fc76cSLukasz Lasek struct ftl_superblock_header header; 71fa1fc76cSLukasz Lasek 72fa1fc76cSLukasz Lasek struct spdk_uuid uuid; 73fa1fc76cSLukasz Lasek 74fa1fc76cSLukasz Lasek /* Current sequence number */ 75fa1fc76cSLukasz Lasek uint64_t seq_id; 76fa1fc76cSLukasz Lasek 77fa1fc76cSLukasz Lasek /* Flag describing clean shutdown */ 78fa1fc76cSLukasz Lasek uint64_t clean; 79fa1fc76cSLukasz Lasek 80fa1fc76cSLukasz Lasek /* Number of surfaced LBAs */ 81fa1fc76cSLukasz Lasek uint64_t lba_cnt; 82fa1fc76cSLukasz Lasek 83fa1fc76cSLukasz Lasek /* Percentage of base device blocks not exposed to the user */ 84fa1fc76cSLukasz Lasek uint64_t overprovisioning; 85fa1fc76cSLukasz Lasek 86fa1fc76cSLukasz Lasek /* Maximum IO depth per band relocate */ 87fa1fc76cSLukasz Lasek uint64_t max_reloc_qdepth; 88fa1fc76cSLukasz Lasek 89fa1fc76cSLukasz Lasek /* Reserved field */ 90fa1fc76cSLukasz Lasek uint8_t reserved3[16]; 91fa1fc76cSLukasz Lasek 92fa1fc76cSLukasz Lasek /* Last L2P checkpoint +1 (i.e. min_seq_id, 0:no ckpt) */ 93fa1fc76cSLukasz Lasek uint64_t ckpt_seq_id; 94fa1fc76cSLukasz Lasek 95fa1fc76cSLukasz Lasek struct ftl_superblock_gc_info gc_info; 96fa1fc76cSLukasz Lasek 97fa1fc76cSLukasz Lasek struct ftl_superblock_v3_md_region md_layout_head; 98fa1fc76cSLukasz Lasek } __attribute__((packed)); 99fa1fc76cSLukasz Lasek 100fa1fc76cSLukasz Lasek SPDK_STATIC_ASSERT(offsetof(struct ftl_superblock_v3, header) == 0, 101fa1fc76cSLukasz Lasek "Invalid placement of header"); 102fa1fc76cSLukasz Lasek 103fa1fc76cSLukasz Lasek SPDK_STATIC_ASSERT(FTL_SUPERBLOCK_SIZE >= sizeof(struct ftl_superblock_v3), 104fa1fc76cSLukasz Lasek "FTL SB metadata size is invalid"); 105fa1fc76cSLukasz Lasek 106*f968b954SMateusz Kozlowski struct ftl_superblock_v5 { 107*f968b954SMateusz Kozlowski struct ftl_superblock_header header; 108*f968b954SMateusz Kozlowski 109*f968b954SMateusz Kozlowski struct spdk_uuid uuid; 110*f968b954SMateusz Kozlowski 111*f968b954SMateusz Kozlowski /* Current sequence number */ 112*f968b954SMateusz Kozlowski uint64_t seq_id; 113*f968b954SMateusz Kozlowski 114*f968b954SMateusz Kozlowski /* Flag describing clean shutdown */ 115*f968b954SMateusz Kozlowski uint64_t clean; 116*f968b954SMateusz Kozlowski 117*f968b954SMateusz Kozlowski /* Number of surfaced LBAs */ 118*f968b954SMateusz Kozlowski uint64_t lba_cnt; 119*f968b954SMateusz Kozlowski 120*f968b954SMateusz Kozlowski /* Percentage of base device blocks not exposed to the user */ 121*f968b954SMateusz Kozlowski uint64_t overprovisioning; 122*f968b954SMateusz Kozlowski 123*f968b954SMateusz Kozlowski /* Maximum IO depth per band relocate */ 124*f968b954SMateusz Kozlowski uint64_t max_reloc_qdepth; 125*f968b954SMateusz Kozlowski 126*f968b954SMateusz Kozlowski /* Reserved field */ 127*f968b954SMateusz Kozlowski uint8_t reserved3[16]; 128*f968b954SMateusz Kozlowski 129*f968b954SMateusz Kozlowski /* Last L2P checkpoint +1 (i.e. min_seq_id, 0:no ckpt) */ 130*f968b954SMateusz Kozlowski uint64_t ckpt_seq_id; 131*f968b954SMateusz Kozlowski 132*f968b954SMateusz Kozlowski struct ftl_superblock_gc_info gc_info; 133*f968b954SMateusz Kozlowski 134*f968b954SMateusz Kozlowski /* Points to the end of blob area */ 135*f968b954SMateusz Kozlowski ftl_df_obj_id blob_area_end; 136*f968b954SMateusz Kozlowski 137*f968b954SMateusz Kozlowski /* NVC device name */ 138*f968b954SMateusz Kozlowski char nvc_dev_name[16]; 139*f968b954SMateusz Kozlowski 140*f968b954SMateusz Kozlowski /* NVC-stored MD layout tracking info */ 141*f968b954SMateusz Kozlowski struct ftl_superblock_v5_md_blob_hdr md_layout_nvc; 142*f968b954SMateusz Kozlowski 143*f968b954SMateusz Kozlowski /* Base device name */ 144*f968b954SMateusz Kozlowski char base_dev_name[16]; 145*f968b954SMateusz Kozlowski 146*f968b954SMateusz Kozlowski /* Base dev-stored MD layout tracking info */ 147*f968b954SMateusz Kozlowski struct ftl_superblock_v5_md_blob_hdr md_layout_base; 148*f968b954SMateusz Kozlowski 149*f968b954SMateusz Kozlowski /* FTL layout params */ 150*f968b954SMateusz Kozlowski struct ftl_superblock_v5_md_blob_hdr layout_params; 151*f968b954SMateusz Kozlowski 152*f968b954SMateusz Kozlowski /* Start of the blob area */ 153*f968b954SMateusz Kozlowski char blob_area[0]; 154*f968b954SMateusz Kozlowski } __attribute__((packed)); 155*f968b954SMateusz Kozlowski 156*f968b954SMateusz Kozlowski SPDK_STATIC_ASSERT(offsetof(struct ftl_superblock_v5, header) == 0, 157*f968b954SMateusz Kozlowski "Invalid placement of header"); 158*f968b954SMateusz Kozlowski 159*f968b954SMateusz Kozlowski SPDK_STATIC_ASSERT(FTL_SUPERBLOCK_SIZE >= sizeof(struct ftl_superblock_v5), 160*f968b954SMateusz Kozlowski "FTL SB metadata size is invalid"); 161*f968b954SMateusz Kozlowski 162c8ab874dSKozlowski Mateusz #endif /* FTL_SB_PREV_H */ 163