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
ftl_addr_load(struct spdk_ftl_dev * dev,void * buffer,uint64_t offset)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
ftl_addr_store(struct spdk_ftl_dev * dev,void * buffer,uint64_t offset,ftl_addr addr)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
ftl_lba_load(struct spdk_ftl_dev * dev,void * buffer,uint64_t offset)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
ftl_lba_store(struct spdk_ftl_dev * dev,void * buffer,uint64_t offset,uint64_t lba)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