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