Lines Matching defs:layout
138 ftl_validate_regions(struct spdk_ftl_dev *dev, struct ftl_layout *layout)
195 struct ftl_layout_region *reg = &dev->layout.region[reg_type];
218 &dev->layout.region[reg_type])) {
235 &dev->layout.region[reg_type])) {
254 /* Only a single region version is present in upgrade from the legacy layout */
266 struct ftl_layout_region *reg = &dev->layout.region[reg_type];
277 struct ftl_layout_region *reg = &dev->layout.region[reg_type];
289 struct ftl_layout *layout = &dev->layout;
293 blocks = ftl_md_region_blocks(dev, layout->l2p.addr_size * dev->num_lbas);
310 layout->region[FTL_LAYOUT_REGION_TYPE_BAND_MD].mirror_type = FTL_LAYOUT_REGION_TYPE_BAND_MD_MIRROR;
335 blocks = layout->region[FTL_LAYOUT_REGION_TYPE_L2P].current.blocks;
346 layout->region[FTL_LAYOUT_REGION_TYPE_TRIM_MD].mirror_type = FTL_LAYOUT_REGION_TYPE_TRIM_MD_MIRROR;
375 layout->region[FTL_LAYOUT_REGION_TYPE_NVC_MD].mirror_type = FTL_LAYOUT_REGION_TYPE_NVC_MD_MIRROR;
381 layout->nvc.chunk_data_blocks * FTL_BLOCK_SIZE, chunk_count)) {
394 FTL_ERRLOG(dev, "Invalid legacy NV Cache metadata layout\n");
401 struct ftl_layout *layout = &dev->layout;
403 /* Base device layout is as follows:
414 ftl_md_region_blocks(dev, spdk_divide_round_up(layout->base.total_blocks + layout->nvc.total_blocks,
436 struct ftl_layout *layout = &dev->layout;
439 blocks = ftl_md_region_blocks(dev, layout->l2p.addr_size * dev->num_lbas);
455 layout->region[FTL_LAYOUT_REGION_TYPE_BAND_MD].mirror_type = FTL_LAYOUT_REGION_TYPE_BAND_MD_MIRROR;
464 layout->p2l.ckpt_pages)) {
472 blocks = layout->region[FTL_LAYOUT_REGION_TYPE_L2P].current.blocks;
483 layout->region[FTL_LAYOUT_REGION_TYPE_TRIM_MD].mirror_type = FTL_LAYOUT_REGION_TYPE_TRIM_MD_MIRROR;
499 layout->region[FTL_LAYOUT_REGION_TYPE_TRIM_LOG].mirror_type =
505 if (0 == layout->nvc.chunk_count) {
509 sizeof(struct ftl_nv_cache_chunk_md), layout->nvc.chunk_count)) {
517 sizeof(struct ftl_nv_cache_chunk_md), layout->nvc.chunk_count)) {
520 layout->region[FTL_LAYOUT_REGION_TYPE_NVC_MD].mirror_type = FTL_LAYOUT_REGION_TYPE_NVC_MD_MIRROR;
536 struct ftl_layout *layout = &dev->layout;
539 /* Base device layout is as follows:
549 valid_map_size = spdk_divide_round_up(layout->base.total_blocks + layout->nvc.total_blocks, 8);
582 struct ftl_layout *layout = &dev->layout;
591 * 1. When upgrading from pre-v5 SB, only the legacy default layout is created.
592 * Pre-v5: some regions were static and not stored in the SB layout. These must be created to match
593 * the legacy default layout.
594 * v5: all regions are stored in the SB layout. Upon the SB upgrade, the legacy default layout
595 * is updated with pre-v5 layout stored in the SB. The whole layout is then stored in v5 SB.
597 * 2. When SB v5 or later was loaded, the layout is instantiated from the nvc and base layout blobs.
598 * No default layout is created.
600 * 3. When the FTL layout is being created for the first time, there are no restrictions.
613 FTL_NOTICELOG(dev, "FTL layout setup mode %d\n", (int)setup_mode);
622 layout->region[i].mirror_type = FTL_LAYOUT_REGION_TYPE_INVALID;
624 layout->region[i].type = FTL_LAYOUT_REGION_TYPE_INVALID;
639 layout->l2p.addr_length = spdk_u64log2(layout->base.total_blocks + layout->nvc.total_blocks) + 1;
640 layout->l2p.addr_size = layout->l2p.addr_length > 32 ? 8 : 4;
641 layout->l2p.lbas_in_page = FTL_BLOCK_SIZE / layout->l2p.addr_size;
644 layout->p2l.pages_per_xfer = spdk_divide_round_up(dev->xfer_size, FTL_NUM_P2L_ENTRIES_NO_VSS);
645 layout->p2l.ckpt_pages = spdk_divide_round_up(ftl_get_num_blocks_in_band(dev),
646 dev->xfer_size) * layout->p2l.pages_per_xfer;
648 layout->nvc.chunk_data_blocks = ftl_get_num_blocks_in_band(dev);
649 layout->nvc.chunk_count = layout->nvc.total_blocks / ftl_get_num_blocks_in_band(dev);
650 layout->nvc.chunk_tail_md_num_blocks = ftl_nv_cache_chunk_tail_md_num_blocks(&dev->nv_cache);
652 layout->base.num_usable_blocks = ftl_get_num_blocks_in_band(dev);
653 layout->base.user_blocks = ftl_band_user_blocks(dev->bands);
679 if (ftl_validate_regions(dev, layout)) {
686 blocks2mib(layout->base.total_blocks));
688 blocks2mib(layout->nvc.total_blocks));
690 FTL_NOTICELOG(dev, "L2P address size: %"PRIu64"\n", layout->l2p.addr_size);
691 FTL_NOTICELOG(dev, "P2L checkpoint pages: %"PRIu64"\n", layout->p2l.ckpt_pages);
692 FTL_NOTICELOG(dev, "NV cache chunk count %"PRIu64"\n", dev->layout.nvc.chunk_count);
701 struct ftl_layout *layout = &dev->layout;
702 struct ftl_layout_region *region = &layout->region[FTL_LAYOUT_REGION_TYPE_SB];
705 assert(layout->md[FTL_LAYOUT_REGION_TYPE_SB] == NULL);
708 layout->base.total_blocks = spdk_bdev_get_num_blocks(bdev);
711 layout->nvc.total_blocks = spdk_bdev_get_num_blocks(bdev);
729 layout->region[FTL_LAYOUT_REGION_TYPE_SB].mirror_type = FTL_LAYOUT_REGION_TYPE_SB_BASE;
731 region = &layout->region[FTL_LAYOUT_REGION_TYPE_SB_BASE];
768 FTL_NOTICELOG(dev, "NV cache layout:\n");
775 FTL_NOTICELOG(dev, "Base device layout:\n");
823 reg = &dev->layout.region[reg_type];
855 reg = &dev->layout.region[blob_entry->type];
874 dev->layout.region[reg_type].type = reg_type;
875 dev->layout.region[reg_type].current.version = 0;
876 dev->layout.region[reg_type].current.offset = UINT64_MAX;
877 dev->layout.region[reg_type].current.blocks = 0;