Lines Matching full:ubi

19  * ubi_calc_fm_size - calculates the fastmap size in bytes for an UBI device.
20 * @ubi: UBI device description object
22 static size_t ubi_calc_fm_size(struct ubi_scan_info *ubi) in ubi_calc_fm_size() argument
30 (ubi->peb_count * sizeof(struct ubi_fm_ec)) + in ubi_calc_fm_size()
32 (ubi->peb_count * sizeof(__be32))) + in ubi_calc_fm_size()
34 return roundup(size, ubi->leb_size); in ubi_calc_fm_size()
37 static int ubi_io_read(struct ubi_scan_info *ubi, void *buf, int pnum, in ubi_io_read() argument
40 return ubi->read(pnum + ubi->peb_offset, from, len, buf); in ubi_io_read()
43 static int ubi_io_is_bad(struct ubi_scan_info *ubi, int peb) in ubi_io_is_bad() argument
45 return peb >= ubi->peb_count || peb < 0; in ubi_io_is_bad()
48 static int ubi_io_read_vid_hdr(struct ubi_scan_info *ubi, int pnum, in ubi_io_read_vid_hdr() argument
55 if (test_bit(pnum, ubi->corrupt)) in ubi_io_read_vid_hdr()
60 if (test_and_set_bit(pnum, ubi->scanned)) in ubi_io_read_vid_hdr()
63 res = ubi_io_read(ubi, vh, pnum, ubi->vid_offset, sizeof(*vh)); in ubi_io_read_vid_hdr()
71 generic_set_bit(pnum, ubi->corrupt); in ubi_io_read_vid_hdr()
78 generic_set_bit(pnum, ubi->corrupt); in ubi_io_read_vid_hdr()
89 generic_set_bit(pnum, ubi->corrupt); in ubi_io_read_vid_hdr()
98 static int ubi_rescan_fm_vid_hdr(struct ubi_scan_info *ubi, in ubi_rescan_fm_vid_hdr() argument
104 if (ubi_io_is_bad(ubi, fm_pnum)) in ubi_rescan_fm_vid_hdr()
107 res = ubi_io_read_vid_hdr(ubi, fm_pnum, vh, 0); in ubi_rescan_fm_vid_hdr()
123 static int ubi_add_peb_to_vol(struct ubi_scan_info *ubi, in ubi_add_peb_to_vol() argument
127 struct ubi_vol_info *vi = ubi->volinfo + vol_id; in ubi_add_peb_to_vol()
140 !!test_bit(pnum, ubi->scanned)); in ubi_add_peb_to_vol()
148 struct ubi_vid_hdr *cur = ubi->blockinfo + cur_pnum; in ubi_add_peb_to_vol()
156 if (!test_bit(cur_pnum, ubi->scanned)) { in ubi_add_peb_to_vol()
160 if (ubi_rescan_fm_vid_hdr(ubi, cur, cur_pnum, vol_id, in ubi_add_peb_to_vol()
170 if (test_bit(cur_pnum, ubi->corrupt)) { in ubi_add_peb_to_vol()
193 static int ubi_scan_vid_hdr(struct ubi_scan_info *ubi, struct ubi_vid_hdr *vh, in ubi_scan_vid_hdr() argument
199 if (ubi_io_is_bad(ubi, pnum)) in ubi_scan_vid_hdr()
202 res = ubi_io_read_vid_hdr(ubi, pnum, vh, 0); in ubi_scan_vid_hdr()
211 return ubi->fm_enabled ? UBI_FASTMAP_ANCHOR : 0; in ubi_scan_vid_hdr()
218 if (!test_bit(vol_id, ubi->toload)) in ubi_scan_vid_hdr()
222 return ubi_add_peb_to_vol(ubi, vh, vol_id, pnum, lnum); in ubi_scan_vid_hdr()
225 static int assign_aeb_to_av(struct ubi_scan_info *ubi, u32 pnum, u32 lnum, in assign_aeb_to_av() argument
230 if (ubi_io_is_bad(ubi, pnum)) in assign_aeb_to_av()
233 ubi->fastmap_pebs++; in assign_aeb_to_av()
239 if (!test_bit(vol_id, ubi->toload)) in assign_aeb_to_av()
242 vh = ubi->blockinfo + pnum; in assign_aeb_to_av()
244 return ubi_scan_vid_hdr(ubi, vh, pnum); in assign_aeb_to_av()
247 static int scan_pool(struct ubi_scan_info *ubi, __be32 *pebs, int pool_size) in scan_pool() argument
258 if (ubi_io_is_bad(ubi, pnum)) { in scan_pool()
263 vh = ubi->blockinfo + pnum; in scan_pool()
268 ubi_scan_vid_hdr(ubi, vh, pnum); in scan_pool()
281 static int ubi_attach_fastmap(struct ubi_scan_info *ubi, in ubi_attach_fastmap() argument
291 size_t fm_pos = 0, fm_size = ubi->fm_size; in ubi_attach_fastmap()
292 void *fm_raw = ubi->fm_buf; in ubi_attach_fastmap()
294 memset(ubi->fm_used, 0, sizeof(ubi->fm_used)); in ubi_attach_fastmap()
373 generic_set_bit(be32_to_cpu(fmec->pnum), ubi->fm_used); in ubi_attach_fastmap()
433 if (!__test_and_clear_bit(pnum, ubi->fm_used)) in ubi_attach_fastmap()
444 ret = assign_aeb_to_av(ubi, pnum, j, vol_id, in ubi_attach_fastmap()
463 ret = scan_pool(ubi, fmpl1->pebs, pool_size); in ubi_attach_fastmap()
467 ret = scan_pool(ubi, fmpl2->pebs, wl_pool_size); in ubi_attach_fastmap()
478 if (WARN_ON(count_fastmap_pebs(ai) != ubi->peb_count - in ubi_attach_fastmap()
491 static int ubi_scan_fastmap(struct ubi_scan_info *ubi, in ubi_scan_fastmap() argument
503 fmsb = &ubi->fm_sb; in ubi_scan_fastmap()
504 fm = &ubi->fm_layout; in ubi_scan_fastmap()
506 ret = ubi_io_read(ubi, fmsb, fm_anchor, ubi->leb_start, sizeof(*fmsb)); in ubi_scan_fastmap()
533 fm_size = ubi->leb_size * used_blocks; in ubi_scan_fastmap()
534 if (fm_size != ubi->fm_size) { in ubi_scan_fastmap()
536 ubi->fm_size); in ubi_scan_fastmap()
541 vh = &ubi->fm_vh; in ubi_scan_fastmap()
546 if (ubi_io_is_bad(ubi, pnum)) { in ubi_scan_fastmap()
553 ret = ubi_io_read_ec_hdr(ubi, pnum, ech, 0); in ubi_scan_fastmap()
564 if (!ubi->image_seq) in ubi_scan_fastmap()
565 ubi->image_seq = image_seq; in ubi_scan_fastmap()
567 * Older UBI implementations have image_seq set to zero, so in ubi_scan_fastmap()
570 if (image_seq && (image_seq != ubi->image_seq)) { in ubi_scan_fastmap()
572 be32_to_cpu(ech->image_seq), ubi->image_seq); in ubi_scan_fastmap()
577 ret = ubi_io_read_vid_hdr(ubi, pnum, vh, 0); in ubi_scan_fastmap()
589 memcpy(vh, ubi->blockinfo + pnum, sizeof(*fm)); in ubi_scan_fastmap()
614 ret = ubi_io_read(ubi, ubi->fm_buf + (ubi->leb_size * i), pnum, in ubi_scan_fastmap()
615 ubi->leb_start, ubi->leb_size); in ubi_scan_fastmap()
623 fmsb2 = (struct ubi_fm_sb *)(ubi->fm_buf); in ubi_scan_fastmap()
626 crc = crc32(UBI_CRC32_INIT, ubi->fm_buf, fm_size); in ubi_scan_fastmap()
638 ret = ubi_attach_fastmap(ubi, ai, fm); in ubi_scan_fastmap()
645 ubi->fm = fm; in ubi_scan_fastmap()
646 ubi->fm_pool.max_size = ubi->fm->max_pool_size; in ubi_scan_fastmap()
647 ubi->fm_wl_pool.max_size = ubi->fm->max_wl_pool_size; in ubi_scan_fastmap()
649 ubi->fsize_mb, ubi->peb_count); in ubi_scan_fastmap()
650 ubi_dbg("fastmap pool size: %d", ubi->fm_pool.max_size); in ubi_scan_fastmap()
651 ubi_dbg("fastmap WL pool size: %d", ubi->fm_wl_pool.max_size); in ubi_scan_fastmap()
666 static void ipl_scan(struct ubi_scan_info *ubi) in ipl_scan() argument
675 res = ubi_scan_vid_hdr(ubi, ubi->blockinfo + pnum, pnum); in ipl_scan()
688 if (!ubi->fm_enabled) in ipl_scan()
695 if (!ubi_scan_fastmap(ubi, NULL, pnum)) in ipl_scan()
701 memset(ubi->volinfo, 0, sizeof(ubi->volinfo)); in ipl_scan()
710 for (; pnum < ubi->peb_count; pnum++) in ipl_scan()
711 ubi_scan_vid_hdr(ubi, ubi->blockinfo + pnum, pnum); in ipl_scan()
717 static int ubi_load_block(struct ubi_scan_info *ubi, uint8_t *laddr, in ubi_load_block() argument
738 if (ubi_io_is_bad(ubi, pnum)) { in ubi_load_block()
743 if (test_bit(pnum, ubi->corrupt)) in ubi_load_block()
749 vh = ubi->blockinfo + pnum; in ubi_load_block()
751 if (!test_bit(pnum, ubi->scanned)) { in ubi_load_block()
754 if (ubi_rescan_fm_vid_hdr(ubi, vh, pnum, vol_id, lnum)) in ubi_load_block()
765 generic_set_bit(pnum, ubi->corrupt); in ubi_load_block()
779 ubi_io_read(ubi, laddr, pnum, ubi->leb_start, dlen); in ubi_load_block()
787 generic_set_bit(pnum, ubi->corrupt); in ubi_load_block()
799 for (pnum = 0; pnum < ubi->peb_count; pnum++) { in ubi_load_block()
800 struct ubi_vid_hdr *tmp = ubi->blockinfo + pnum; in ubi_load_block()
804 if (test_bit(pnum, ubi->corrupt)) in ubi_load_block()
810 if (!test_bit(pnum, ubi->scanned)) { in ubi_load_block()
813 if (ubi_rescan_fm_vid_hdr(ubi, tmp, pnum, vol_id, lnum)) in ubi_load_block()
834 pnum = vrepl - ubi->blockinfo; in ubi_load_block()
845 static int ipl_load(struct ubi_scan_info *ubi, const u32 vol_id, uint8_t *laddr) in ipl_load() argument
854 vi = ubi->volinfo + vol_id; in ipl_load()
859 int res = ubi_load_block(ubi, laddr, vi, vol_id, lnum, last); in ipl_load()
875 struct ubi_scan_info *ubi = info->ubi; in ubispl_load_volumes() local
881 * We do a partial initializiation of @ubi. Cleaning fm_buf is in ubispl_load_volumes()
884 memset(ubi, 0, offsetof(struct ubi_scan_info, fm_buf)); in ubispl_load_volumes()
886 ubi->read = info->read; in ubispl_load_volumes()
889 ubi->vid_offset = info->vid_offset; in ubispl_load_volumes()
890 ubi->leb_start = info->leb_start; in ubispl_load_volumes()
891 ubi->leb_size = info->peb_size - ubi->leb_start; in ubispl_load_volumes()
892 ubi->peb_count = info->peb_count; in ubispl_load_volumes()
893 ubi->peb_offset = info->peb_offset; in ubispl_load_volumes()
896 ubi->fsize_mb = fsize >> 20; in ubispl_load_volumes()
899 ubi->fm_size = ubi_calc_fm_size(ubi); in ubispl_load_volumes()
900 ubi->fm_enabled = fastmap; in ubispl_load_volumes()
905 generic_set_bit(lv->vol_id, ubi->toload); in ubispl_load_volumes()
908 ipl_scan(ubi); in ubispl_load_volumes()
914 res = ipl_load(ubi, lv->vol_id, lv->load_addr); in ubispl_load_volumes()