Lines Matching refs:ubi

23 static size_t ubi_calc_fm_size(struct ubi_scan_info *ubi)  in ubi_calc_fm_size()  argument
31 (ubi->peb_count * sizeof(struct ubi_fm_ec)) + in ubi_calc_fm_size()
33 (ubi->peb_count * sizeof(__be32))) + in ubi_calc_fm_size()
35 return roundup(size, ubi->leb_size); in ubi_calc_fm_size()
38 static int ubi_io_read(struct ubi_scan_info *ubi, void *buf, int pnum, in ubi_io_read() argument
41 return ubi->read(pnum + ubi->peb_offset, from, len, buf); in ubi_io_read()
44 static int ubi_io_is_bad(struct ubi_scan_info *ubi, int peb) in ubi_io_is_bad() argument
46 return peb >= ubi->peb_count || peb < 0; in ubi_io_is_bad()
49 static int ubi_io_read_vid_hdr(struct ubi_scan_info *ubi, int pnum, in ubi_io_read_vid_hdr() argument
56 if (test_bit(pnum, ubi->corrupt)) in ubi_io_read_vid_hdr()
61 if (test_and_set_bit(pnum, ubi->scanned)) in ubi_io_read_vid_hdr()
64 res = ubi_io_read(ubi, vh, pnum, ubi->vid_offset, sizeof(*vh)); in ubi_io_read_vid_hdr()
72 generic_set_bit(pnum, ubi->corrupt); in ubi_io_read_vid_hdr()
79 generic_set_bit(pnum, ubi->corrupt); in ubi_io_read_vid_hdr()
90 generic_set_bit(pnum, ubi->corrupt); in ubi_io_read_vid_hdr()
99 static int ubi_rescan_fm_vid_hdr(struct ubi_scan_info *ubi, in ubi_rescan_fm_vid_hdr() argument
105 if (ubi_io_is_bad(ubi, fm_pnum)) in ubi_rescan_fm_vid_hdr()
108 res = ubi_io_read_vid_hdr(ubi, fm_pnum, vh, 0); in ubi_rescan_fm_vid_hdr()
124 static int ubi_add_peb_to_vol(struct ubi_scan_info *ubi, in ubi_add_peb_to_vol() argument
128 struct ubi_vol_info *vi = ubi->volinfo + vol_id; in ubi_add_peb_to_vol()
141 !!test_bit(pnum, ubi->scanned)); in ubi_add_peb_to_vol()
149 struct ubi_vid_hdr *cur = ubi->blockinfo + cur_pnum; in ubi_add_peb_to_vol()
157 if (!test_bit(cur_pnum, ubi->scanned)) { in ubi_add_peb_to_vol()
161 if (ubi_rescan_fm_vid_hdr(ubi, cur, cur_pnum, vol_id, in ubi_add_peb_to_vol()
171 if (test_bit(cur_pnum, ubi->corrupt)) { in ubi_add_peb_to_vol()
194 static int ubi_scan_vid_hdr(struct ubi_scan_info *ubi, struct ubi_vid_hdr *vh, in ubi_scan_vid_hdr() argument
200 if (ubi_io_is_bad(ubi, pnum)) in ubi_scan_vid_hdr()
203 res = ubi_io_read_vid_hdr(ubi, pnum, vh, 0); in ubi_scan_vid_hdr()
212 return ubi->fm_enabled ? UBI_FASTMAP_ANCHOR : 0; in ubi_scan_vid_hdr()
219 if (!test_bit(vol_id, ubi->toload)) in ubi_scan_vid_hdr()
223 return ubi_add_peb_to_vol(ubi, vh, vol_id, pnum, lnum); in ubi_scan_vid_hdr()
226 static int assign_aeb_to_av(struct ubi_scan_info *ubi, u32 pnum, u32 lnum, in assign_aeb_to_av() argument
231 if (ubi_io_is_bad(ubi, pnum)) in assign_aeb_to_av()
234 ubi->fastmap_pebs++; in assign_aeb_to_av()
240 if (!test_bit(vol_id, ubi->toload)) in assign_aeb_to_av()
243 vh = ubi->blockinfo + pnum; in assign_aeb_to_av()
245 return ubi_scan_vid_hdr(ubi, vh, pnum); in assign_aeb_to_av()
248 static int scan_pool(struct ubi_scan_info *ubi, __be32 *pebs, int pool_size) in scan_pool() argument
259 if (ubi_io_is_bad(ubi, pnum)) { in scan_pool()
264 vh = ubi->blockinfo + pnum; in scan_pool()
269 ubi_scan_vid_hdr(ubi, vh, pnum); in scan_pool()
282 static int ubi_attach_fastmap(struct ubi_scan_info *ubi, in ubi_attach_fastmap() argument
292 size_t fm_pos = 0, fm_size = ubi->fm_size; in ubi_attach_fastmap()
293 void *fm_raw = ubi->fm_buf; in ubi_attach_fastmap()
295 memset(ubi->fm_used, 0, sizeof(ubi->fm_used)); in ubi_attach_fastmap()
374 generic_set_bit(be32_to_cpu(fmec->pnum), ubi->fm_used); in ubi_attach_fastmap()
434 if (!__test_and_clear_bit(pnum, ubi->fm_used)) in ubi_attach_fastmap()
445 ret = assign_aeb_to_av(ubi, pnum, j, vol_id, in ubi_attach_fastmap()
464 ret = scan_pool(ubi, fmpl1->pebs, pool_size); in ubi_attach_fastmap()
468 ret = scan_pool(ubi, fmpl2->pebs, wl_pool_size); in ubi_attach_fastmap()
479 if (WARN_ON(count_fastmap_pebs(ai) != ubi->peb_count - in ubi_attach_fastmap()
492 static int ubi_scan_fastmap(struct ubi_scan_info *ubi, in ubi_scan_fastmap() argument
504 fmsb = &ubi->fm_sb; in ubi_scan_fastmap()
505 fm = &ubi->fm_layout; in ubi_scan_fastmap()
507 ret = ubi_io_read(ubi, fmsb, fm_anchor, ubi->leb_start, sizeof(*fmsb)); in ubi_scan_fastmap()
534 fm_size = ubi->leb_size * used_blocks; in ubi_scan_fastmap()
535 if (fm_size != ubi->fm_size) { in ubi_scan_fastmap()
537 ubi->fm_size); in ubi_scan_fastmap()
542 vh = &ubi->fm_vh; in ubi_scan_fastmap()
547 if (ubi_io_is_bad(ubi, pnum)) { in ubi_scan_fastmap()
554 ret = ubi_io_read_ec_hdr(ubi, pnum, ech, 0); in ubi_scan_fastmap()
565 if (!ubi->image_seq) in ubi_scan_fastmap()
566 ubi->image_seq = image_seq; in ubi_scan_fastmap()
571 if (image_seq && (image_seq != ubi->image_seq)) { in ubi_scan_fastmap()
573 be32_to_cpu(ech->image_seq), ubi->image_seq); in ubi_scan_fastmap()
578 ret = ubi_io_read_vid_hdr(ubi, pnum, vh, 0); in ubi_scan_fastmap()
590 memcpy(vh, ubi->blockinfo + pnum, sizeof(*fm)); in ubi_scan_fastmap()
615 ret = ubi_io_read(ubi, ubi->fm_buf + (ubi->leb_size * i), pnum, in ubi_scan_fastmap()
616 ubi->leb_start, ubi->leb_size); in ubi_scan_fastmap()
624 fmsb2 = (struct ubi_fm_sb *)(ubi->fm_buf); in ubi_scan_fastmap()
627 crc = crc32(UBI_CRC32_INIT, ubi->fm_buf, fm_size); in ubi_scan_fastmap()
639 ret = ubi_attach_fastmap(ubi, ai, fm); in ubi_scan_fastmap()
646 ubi->fm = fm; in ubi_scan_fastmap()
647 ubi->fm_pool.max_size = ubi->fm->max_pool_size; in ubi_scan_fastmap()
648 ubi->fm_wl_pool.max_size = ubi->fm->max_wl_pool_size; in ubi_scan_fastmap()
650 ubi->fsize_mb, ubi->peb_count); in ubi_scan_fastmap()
651 ubi_dbg("fastmap pool size: %d", ubi->fm_pool.max_size); in ubi_scan_fastmap()
652 ubi_dbg("fastmap WL pool size: %d", ubi->fm_wl_pool.max_size); in ubi_scan_fastmap()
667 static void ipl_scan(struct ubi_scan_info *ubi) in ipl_scan() argument
676 res = ubi_scan_vid_hdr(ubi, ubi->blockinfo + pnum, pnum); in ipl_scan()
689 if (!ubi->fm_enabled) in ipl_scan()
696 if (!ubi_scan_fastmap(ubi, NULL, pnum)) in ipl_scan()
702 memset(ubi->volinfo, 0, sizeof(ubi->volinfo)); in ipl_scan()
711 for (; pnum < ubi->peb_count; pnum++) in ipl_scan()
712 ubi_scan_vid_hdr(ubi, ubi->blockinfo + pnum, pnum); in ipl_scan()
718 static int ubi_load_block(struct ubi_scan_info *ubi, uint8_t *laddr, in ubi_load_block() argument
739 if (ubi_io_is_bad(ubi, pnum)) { in ubi_load_block()
744 if (test_bit(pnum, ubi->corrupt)) in ubi_load_block()
750 vh = ubi->blockinfo + pnum; in ubi_load_block()
752 if (!test_bit(pnum, ubi->scanned)) { in ubi_load_block()
755 if (ubi_rescan_fm_vid_hdr(ubi, vh, pnum, vol_id, lnum)) in ubi_load_block()
766 generic_set_bit(pnum, ubi->corrupt); in ubi_load_block()
780 ubi_io_read(ubi, laddr, pnum, ubi->leb_start, dlen); in ubi_load_block()
788 generic_set_bit(pnum, ubi->corrupt); in ubi_load_block()
800 for (pnum = 0; pnum < ubi->peb_count; pnum++) { in ubi_load_block()
801 struct ubi_vid_hdr *tmp = ubi->blockinfo + pnum; in ubi_load_block()
805 if (test_bit(pnum, ubi->corrupt)) in ubi_load_block()
811 if (!test_bit(pnum, ubi->scanned)) { in ubi_load_block()
814 if (ubi_rescan_fm_vid_hdr(ubi, tmp, pnum, vol_id, lnum)) in ubi_load_block()
835 pnum = vrepl - ubi->blockinfo; in ubi_load_block()
846 static int ipl_load(struct ubi_scan_info *ubi, const u32 vol_id, uint8_t *laddr) in ipl_load() argument
855 vi = ubi->volinfo + vol_id; in ipl_load()
860 int res = ubi_load_block(ubi, laddr, vi, vol_id, lnum, last); in ipl_load()
876 struct ubi_scan_info *ubi = info->ubi; in ubispl_load_volumes() local
885 memset(ubi, 0, offsetof(struct ubi_scan_info, fm_buf)); in ubispl_load_volumes()
887 ubi->read = info->read; in ubispl_load_volumes()
890 ubi->vid_offset = info->vid_offset; in ubispl_load_volumes()
891 ubi->leb_start = info->leb_start; in ubispl_load_volumes()
892 ubi->leb_size = info->peb_size - ubi->leb_start; in ubispl_load_volumes()
893 ubi->peb_count = info->peb_count; in ubispl_load_volumes()
894 ubi->peb_offset = info->peb_offset; in ubispl_load_volumes()
897 ubi->fsize_mb = fsize >> 20; in ubispl_load_volumes()
900 ubi->fm_size = ubi_calc_fm_size(ubi); in ubispl_load_volumes()
901 ubi->fm_enabled = fastmap; in ubispl_load_volumes()
906 generic_set_bit(lv->vol_id, ubi->toload); in ubispl_load_volumes()
909 ipl_scan(ubi); in ubispl_load_volumes()
915 res = ipl_load(ubi, lv->vol_id, lv->load_addr); in ubispl_load_volumes()