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