xref: /spdk/lib/ftl/utils/ftl_addr_utils.h (revision fecffda6ecf8853b82edccde429b68252f0a62c5)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2022 Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #ifndef FTL_ADDR_UTILS_H
7 #define FTL_ADDR_UTILS_H
8 
9 #include "ftl_core.h"
10 
11 static inline ftl_addr
12 ftl_addr_load(struct spdk_ftl_dev *dev, void *buffer, uint64_t offset)
13 {
14 	if (ftl_addr_packed(dev)) {
15 		uint32_t *b32 = buffer;
16 		ftl_addr addr = b32[offset];
17 
18 		if (addr == (uint32_t)FTL_ADDR_INVALID) {
19 			return FTL_ADDR_INVALID;
20 		} else {
21 			return addr;
22 		}
23 	} else {
24 		uint64_t *b64 = buffer;
25 		return b64[offset];
26 	}
27 }
28 
29 static inline void
30 ftl_addr_store(struct spdk_ftl_dev *dev, void *buffer, uint64_t offset, ftl_addr addr)
31 {
32 	if (ftl_addr_packed(dev)) {
33 		uint32_t *b32 = buffer;
34 		b32[offset] = addr;
35 	} else {
36 		uint64_t *b64 = buffer;
37 		b64[offset] = addr;
38 	}
39 }
40 
41 static inline uint64_t
42 ftl_lba_load(struct spdk_ftl_dev *dev, void *buffer, uint64_t offset)
43 {
44 	if (ftl_addr_packed(dev)) {
45 		uint32_t *b32 = buffer;
46 		uint32_t lba = b32[offset];
47 
48 		if (lba == (uint32_t)FTL_LBA_INVALID) {
49 			return FTL_LBA_INVALID;
50 		} else {
51 			return lba;
52 		}
53 	} else {
54 		uint64_t *b64 = buffer;
55 		return b64[offset];
56 	}
57 }
58 
59 static inline void
60 ftl_lba_store(struct spdk_ftl_dev *dev, void *buffer, uint64_t offset, uint64_t lba)
61 {
62 	if (ftl_addr_packed(dev)) {
63 		uint32_t *b32 = buffer;
64 		b32[offset] = lba;
65 	} else {
66 		uint64_t *b64 = buffer;
67 		b64[offset] = lba;
68 	}
69 }
70 
71 #endif /* FTL_ADDR_UTILS_H */
72