• Home
  • Raw
  • Download

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()
96 static int vtbl_check(struct ubi_scan_info *ubi, in vtbl_check() argument
136 if (alignment > ubi->leb_size || alignment == 0) { in vtbl_check()
147 n = ubi->leb_size % alignment; in vtbl_check()
207 static int ubi_read_volume_table(struct ubi_scan_info *ubi, u32 pnum) in ubi_read_volume_table() argument
213 err = ubi_io_read(ubi, &ubi->vtbl, pnum, ubi->leb_start, in ubi_read_volume_table()
220 if (!vtbl_check(ubi, ubi->vtbl)) { in ubi_read_volume_table()
221 ubi->vtbl_valid = 1; in ubi_read_volume_table()
230 static int ubi_io_read_vid_hdr(struct ubi_scan_info *ubi, int pnum, in ubi_io_read_vid_hdr() argument
237 if (test_bit(pnum, ubi->corrupt)) in ubi_io_read_vid_hdr()
242 if (test_and_set_bit(pnum, ubi->scanned)) in ubi_io_read_vid_hdr()
245 res = ubi_io_read(ubi, vh, pnum, ubi->vid_offset, sizeof(*vh)); in ubi_io_read_vid_hdr()
253 generic_set_bit(pnum, ubi->corrupt); in ubi_io_read_vid_hdr()
260 generic_set_bit(pnum, ubi->corrupt); in ubi_io_read_vid_hdr()
271 generic_set_bit(pnum, ubi->corrupt); in ubi_io_read_vid_hdr()
280 static int ubi_rescan_fm_vid_hdr(struct ubi_scan_info *ubi, in ubi_rescan_fm_vid_hdr() argument
286 if (ubi_io_is_bad(ubi, fm_pnum)) in ubi_rescan_fm_vid_hdr()
289 res = ubi_io_read_vid_hdr(ubi, fm_pnum, vh, 0); in ubi_rescan_fm_vid_hdr()
305 static int ubi_add_peb_to_vol(struct ubi_scan_info *ubi, in ubi_add_peb_to_vol() argument
309 struct ubi_vol_info *vi = ubi->volinfo + vol_id; in ubi_add_peb_to_vol()
322 !!test_bit(pnum, ubi->scanned)); in ubi_add_peb_to_vol()
330 struct ubi_vid_hdr *cur = ubi->blockinfo + cur_pnum; in ubi_add_peb_to_vol()
338 if (!test_bit(cur_pnum, ubi->scanned)) { in ubi_add_peb_to_vol()
342 if (ubi_rescan_fm_vid_hdr(ubi, cur, cur_pnum, vol_id, in ubi_add_peb_to_vol()
352 if (test_bit(cur_pnum, ubi->corrupt)) { in ubi_add_peb_to_vol()
375 static int ubi_scan_vid_hdr(struct ubi_scan_info *ubi, struct ubi_vid_hdr *vh, in ubi_scan_vid_hdr() argument
381 if (ubi_io_is_bad(ubi, pnum)) in ubi_scan_vid_hdr()
384 res = ubi_io_read_vid_hdr(ubi, pnum, vh, 0); in ubi_scan_vid_hdr()
393 return ubi->fm_enabled ? UBI_FASTMAP_ANCHOR : 0; in ubi_scan_vid_hdr()
397 if (vol_id == UBI_LAYOUT_VOLUME_ID && !ubi->vtbl_valid) { in ubi_scan_vid_hdr()
398 res = ubi_read_volume_table(ubi, pnum); in ubi_scan_vid_hdr()
409 if (!test_bit(vol_id, ubi->toload)) in ubi_scan_vid_hdr()
413 return ubi_add_peb_to_vol(ubi, vh, vol_id, pnum, lnum); in ubi_scan_vid_hdr()
416 static int assign_aeb_to_av(struct ubi_scan_info *ubi, u32 pnum, u32 lnum, in assign_aeb_to_av() argument
421 if (ubi_io_is_bad(ubi, pnum)) in assign_aeb_to_av()
424 ubi->fastmap_pebs++; in assign_aeb_to_av()
431 if (!test_bit(vol_id, ubi->toload)) in assign_aeb_to_av()
434 vh = ubi->blockinfo + pnum; in assign_aeb_to_av()
436 return ubi_scan_vid_hdr(ubi, vh, pnum); in assign_aeb_to_av()
439 static int scan_pool(struct ubi_scan_info *ubi, __be32 *pebs, int pool_size) in scan_pool() argument
450 if (ubi_io_is_bad(ubi, pnum)) { in scan_pool()
455 vh = ubi->blockinfo + pnum; in scan_pool()
460 ubi_scan_vid_hdr(ubi, vh, pnum); in scan_pool()
473 static int ubi_attach_fastmap(struct ubi_scan_info *ubi, in ubi_attach_fastmap() argument
483 size_t fm_pos = 0, fm_size = ubi->fm_size; in ubi_attach_fastmap()
484 void *fm_raw = ubi->fm_buf; in ubi_attach_fastmap()
486 memset(ubi->fm_used, 0, sizeof(ubi->fm_used)); in ubi_attach_fastmap()
565 generic_set_bit(be32_to_cpu(fmec->pnum), ubi->fm_used); in ubi_attach_fastmap()
625 if (!__test_and_clear_bit(pnum, ubi->fm_used)) in ubi_attach_fastmap()
636 ret = assign_aeb_to_av(ubi, pnum, j, vol_id, in ubi_attach_fastmap()
655 ret = scan_pool(ubi, fmpl1->pebs, pool_size); in ubi_attach_fastmap()
659 ret = scan_pool(ubi, fmpl2->pebs, wl_pool_size); in ubi_attach_fastmap()
670 if (WARN_ON(count_fastmap_pebs(ai) != ubi->peb_count - in ubi_attach_fastmap()
683 static int ubi_scan_fastmap(struct ubi_scan_info *ubi, in ubi_scan_fastmap() argument
695 fmsb = &ubi->fm_sb; in ubi_scan_fastmap()
696 fm = &ubi->fm_layout; in ubi_scan_fastmap()
698 ret = ubi_io_read(ubi, fmsb, fm_anchor, ubi->leb_start, sizeof(*fmsb)); in ubi_scan_fastmap()
725 fm_size = ubi->leb_size * used_blocks; in ubi_scan_fastmap()
726 if (fm_size != ubi->fm_size) { in ubi_scan_fastmap()
728 ubi->fm_size); in ubi_scan_fastmap()
733 vh = &ubi->fm_vh; in ubi_scan_fastmap()
738 if (ubi_io_is_bad(ubi, pnum)) { in ubi_scan_fastmap()
745 ret = ubi_io_read_ec_hdr(ubi, pnum, ech, 0); in ubi_scan_fastmap()
756 if (!ubi->image_seq) in ubi_scan_fastmap()
757 ubi->image_seq = image_seq; in ubi_scan_fastmap()
762 if (image_seq && (image_seq != ubi->image_seq)) { in ubi_scan_fastmap()
764 be32_to_cpu(ech->image_seq), ubi->image_seq); in ubi_scan_fastmap()
769 ret = ubi_io_read_vid_hdr(ubi, pnum, vh, 0); in ubi_scan_fastmap()
781 memcpy(vh, ubi->blockinfo + pnum, sizeof(*fm)); in ubi_scan_fastmap()
806 ret = ubi_io_read(ubi, ubi->fm_buf + (ubi->leb_size * i), pnum, in ubi_scan_fastmap()
807 ubi->leb_start, ubi->leb_size); in ubi_scan_fastmap()
815 fmsb2 = (struct ubi_fm_sb *)(ubi->fm_buf); in ubi_scan_fastmap()
818 crc = crc32(UBI_CRC32_INIT, ubi->fm_buf, fm_size); in ubi_scan_fastmap()
830 ret = ubi_attach_fastmap(ubi, ai, fm); in ubi_scan_fastmap()
837 ubi->fm = fm; in ubi_scan_fastmap()
838 ubi->fm_pool.max_size = ubi->fm->max_pool_size; in ubi_scan_fastmap()
839 ubi->fm_wl_pool.max_size = ubi->fm->max_wl_pool_size; in ubi_scan_fastmap()
841 ubi->fsize_mb, ubi->peb_count); in ubi_scan_fastmap()
842 ubi_dbg("fastmap pool size: %d", ubi->fm_pool.max_size); in ubi_scan_fastmap()
843 ubi_dbg("fastmap WL pool size: %d", ubi->fm_wl_pool.max_size); in ubi_scan_fastmap()
858 static void ipl_scan(struct ubi_scan_info *ubi) in ipl_scan() argument
867 res = ubi_scan_vid_hdr(ubi, ubi->blockinfo + pnum, pnum); in ipl_scan()
880 if (!ubi->fm_enabled) in ipl_scan()
887 if (!ubi_scan_fastmap(ubi, NULL, pnum)) in ipl_scan()
893 memset(ubi->volinfo, 0, sizeof(ubi->volinfo)); in ipl_scan()
902 for (; pnum < ubi->peb_count; pnum++) in ipl_scan()
903 ubi_scan_vid_hdr(ubi, ubi->blockinfo + pnum, pnum); in ipl_scan()
909 static int ubi_load_block(struct ubi_scan_info *ubi, uint8_t *laddr, in ubi_load_block() argument
930 if (ubi_io_is_bad(ubi, pnum)) { in ubi_load_block()
935 if (test_bit(pnum, ubi->corrupt)) in ubi_load_block()
941 vh = ubi->blockinfo + pnum; in ubi_load_block()
943 if (!test_bit(pnum, ubi->scanned)) { in ubi_load_block()
946 if (ubi_rescan_fm_vid_hdr(ubi, vh, pnum, vol_id, lnum)) in ubi_load_block()
957 generic_set_bit(pnum, ubi->corrupt); in ubi_load_block()
971 ubi_io_read(ubi, laddr, pnum, ubi->leb_start, dlen); in ubi_load_block()
979 generic_set_bit(pnum, ubi->corrupt); in ubi_load_block()
991 for (pnum = 0; pnum < ubi->peb_count; pnum++) { in ubi_load_block()
992 struct ubi_vid_hdr *tmp = ubi->blockinfo + pnum; in ubi_load_block()
996 if (test_bit(pnum, ubi->corrupt)) in ubi_load_block()
1002 if (!test_bit(pnum, ubi->scanned)) { in ubi_load_block()
1005 if (ubi_rescan_fm_vid_hdr(ubi, tmp, pnum, vol_id, lnum)) in ubi_load_block()
1026 pnum = vrepl - ubi->blockinfo; in ubi_load_block()
1037 static int ipl_load(struct ubi_scan_info *ubi, const u32 vol_id, uint8_t *laddr) in ipl_load() argument
1046 vi = ubi->volinfo + vol_id; in ipl_load()
1051 int res = ubi_load_block(ubi, laddr, vi, vol_id, lnum, last); in ipl_load()
1067 struct ubi_scan_info *ubi = info->ubi; in ubispl_load_volumes() local
1076 memset(ubi, 0, offsetof(struct ubi_scan_info, fm_buf)); in ubispl_load_volumes()
1078 ubi->read = info->read; in ubispl_load_volumes()
1081 ubi->vid_offset = info->vid_offset; in ubispl_load_volumes()
1082 ubi->leb_start = info->leb_start; in ubispl_load_volumes()
1083 ubi->leb_size = info->peb_size - ubi->leb_start; in ubispl_load_volumes()
1084 ubi->peb_count = info->peb_count; in ubispl_load_volumes()
1085 ubi->peb_offset = info->peb_offset; in ubispl_load_volumes()
1088 ubi->vtbl_valid = 0; in ubispl_load_volumes()
1092 ubi->fsize_mb = fsize >> 20; in ubispl_load_volumes()
1095 ubi->fm_size = ubi_calc_fm_size(ubi); in ubispl_load_volumes()
1096 ubi->fm_enabled = fastmap; in ubispl_load_volumes()
1101 generic_set_bit(lv->vol_id, ubi->toload); in ubispl_load_volumes()
1104 ipl_scan(ubi); in ubispl_load_volumes()
1112 int len = be16_to_cpu(ubi->vtbl[j].name_len); in ubispl_load_volumes()
1115 ubi->vtbl[j].name, in ubispl_load_volumes()
1126 res = ipl_load(ubi, lv->vol_id, lv->load_addr); in ubispl_load_volumes()