xref: /spdk/lib/ftl/ftl_l2p_flat.c (revision 081f080a49a3dbe31acb2a8557db90b08bbeaf9c)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (c) Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #include "ftl_l2p.h"
7 #include "ftl_core.h"
8 #include "ftl_utils.h"
9 #include "ftl_l2p_flat.h"
10 #include "utils/ftl_addr_utils.h"
11 
12 static struct ftl_md *
13 get_l2p_md(struct spdk_ftl_dev *dev)
14 {
15 	return dev->layout.md[FTL_LAYOUT_REGION_TYPE_L2P];
16 }
17 
18 struct ftl_l2p_flat {
19 	void *l2p;
20 	bool is_halted;
21 };
22 
23 void
24 ftl_l2p_flat_pin(struct spdk_ftl_dev *dev, struct ftl_l2p_pin_ctx *pin_ctx)
25 {
26 	assert(dev->num_lbas >= pin_ctx->lba + pin_ctx->count);
27 
28 	ftl_l2p_pin_complete(dev, 0, pin_ctx);
29 }
30 
31 void
32 ftl_l2p_flat_unpin(struct spdk_ftl_dev *dev, uint64_t lba, uint64_t count)
33 {
34 	assert(dev->num_lbas >= lba + count);
35 }
36 
37 void
38 ftl_l2p_flat_set(struct spdk_ftl_dev *dev, uint64_t lba, ftl_addr addr)
39 {
40 	struct ftl_l2p_flat *l2p_flat = dev->l2p;
41 
42 	assert(dev->num_lbas > lba);
43 
44 	ftl_addr_store(dev, l2p_flat->l2p, lba, addr);
45 }
46 
47 ftl_addr
48 ftl_l2p_flat_get(struct spdk_ftl_dev *dev, uint64_t lba)
49 {
50 	struct ftl_l2p_flat *l2p_flat = dev->l2p;
51 
52 	assert(dev->num_lbas > lba);
53 
54 	return ftl_addr_load(dev, l2p_flat->l2p, lba);
55 }
56 
57 static void
58 md_cb(struct spdk_ftl_dev *dev, struct ftl_md *md, int status)
59 {
60 	ftl_l2p_cb cb = md->owner.private;
61 	void *cb_ctx = md->owner.cb_ctx;
62 
63 	cb(dev, status, cb_ctx);
64 }
65 
66 void
67 ftl_l2p_flat_clear(struct spdk_ftl_dev *dev, ftl_l2p_cb cb, void *cb_ctx)
68 {
69 	struct ftl_l2p_flat *l2p_flat = dev->l2p;
70 	struct ftl_md *md;
71 
72 	memset(l2p_flat->l2p, (int)FTL_ADDR_INVALID,
73 	       ftl_md_get_buffer_size(get_l2p_md(dev)));
74 
75 	md = get_l2p_md(dev);
76 	md->cb = md_cb;
77 	md->owner.cb_ctx = cb_ctx;
78 	md->owner.private = cb;
79 	ftl_md_persist(md);
80 }
81 
82 static int
83 ftl_l2p_flat_init_dram(struct spdk_ftl_dev *dev, struct ftl_l2p_flat *l2p_flat,
84 		       size_t l2p_size)
85 {
86 	struct ftl_md *md = get_l2p_md(dev);
87 
88 	assert(ftl_md_get_buffer_size(md) >= l2p_size);
89 
90 	l2p_flat->l2p = ftl_md_get_buffer(md);
91 	if (!l2p_flat->l2p) {
92 		FTL_ERRLOG(dev, "Failed to allocate l2p table\n");
93 		return -1;
94 	}
95 
96 	return 0;
97 }
98 
99 int
100 ftl_l2p_flat_init(struct spdk_ftl_dev *dev)
101 {
102 	size_t l2p_size = dev->num_lbas * dev->layout.l2p.addr_size;
103 	struct ftl_l2p_flat *l2p_flat;
104 	int ret;
105 
106 	if (dev->num_lbas == 0) {
107 		FTL_ERRLOG(dev, "Invalid l2p table size\n");
108 		return -1;
109 	}
110 
111 	if (dev->l2p) {
112 		FTL_ERRLOG(dev, "L2p table already allocated\n");
113 		return -1;
114 	}
115 
116 	l2p_flat = calloc(1, sizeof(*l2p_flat));
117 	if (!l2p_flat) {
118 		FTL_ERRLOG(dev, "Failed to allocate l2p_flat\n");
119 		return -1;
120 	}
121 
122 	ret = ftl_l2p_flat_init_dram(dev, l2p_flat, l2p_size);
123 
124 	if (ret) {
125 		free(l2p_flat);
126 		return ret;
127 	}
128 
129 	dev->l2p = l2p_flat;
130 	return 0;
131 }
132 
133 void
134 ftl_l2p_flat_deinit(struct spdk_ftl_dev *dev)
135 {
136 	struct ftl_l2p_flat *l2p_flat = dev->l2p;
137 
138 	if (!l2p_flat) {
139 		return;
140 	}
141 
142 	free(l2p_flat);
143 
144 	dev->l2p = NULL;
145 }
146 
147 void
148 ftl_l2p_flat_unmap(struct spdk_ftl_dev *dev, ftl_l2p_cb cb, void *cb_ctx)
149 {
150 	cb(dev, 0, cb_ctx);
151 }
152 
153 void
154 ftl_l2p_flat_process(struct spdk_ftl_dev *dev)
155 {
156 }
157 
158 bool
159 ftl_l2p_flat_is_halted(struct spdk_ftl_dev *dev)
160 {
161 	return true;
162 }
163 
164 void
165 ftl_l2p_flat_halt(struct spdk_ftl_dev *dev)
166 {
167 }
168