xref: /spdk/lib/ftl/upgrade/ftl_sb_prev.h (revision f968b954a94944780711b6c2548cbe7aa1c77d81)
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