xref: /spdk/lib/ftl/utils/ftl_addr_utils.h (revision a6dbe3721eb3b5990707fc3e378c95e505dd8ab5)
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