~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/u-boot/drivers/mtd/ubi/misc.c

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) International Business Machines Corp., 2006
 
3
 *
 
4
 * SPDX-License-Identifier:     GPL-2.0+
 
5
 *
 
6
 * Author: Artem Bityutskiy (Битюцкий Артём)
 
7
 */
 
8
 
 
9
/* Here we keep miscellaneous functions which are used all over the UBI code */
 
10
 
 
11
#include <ubi_uboot.h>
 
12
#include "ubi.h"
 
13
 
 
14
/**
 
15
 * calc_data_len - calculate how much real data is stored in a buffer.
 
16
 * @ubi: UBI device description object
 
17
 * @buf: a buffer with the contents of the physical eraseblock
 
18
 * @length: the buffer length
 
19
 *
 
20
 * This function calculates how much "real data" is stored in @buf and returnes
 
21
 * the length. Continuous 0xFF bytes at the end of the buffer are not
 
22
 * considered as "real data".
 
23
 */
 
24
int ubi_calc_data_len(const struct ubi_device *ubi, const void *buf,
 
25
                      int length)
 
26
{
 
27
        int i;
 
28
 
 
29
        ubi_assert(!(length & (ubi->min_io_size - 1)));
 
30
 
 
31
        for (i = length - 1; i >= 0; i--)
 
32
                if (((const uint8_t *)buf)[i] != 0xFF)
 
33
                        break;
 
34
 
 
35
        /* The resulting length must be aligned to the minimum flash I/O size */
 
36
        length = ALIGN(i + 1, ubi->min_io_size);
 
37
        return length;
 
38
}
 
39
 
 
40
/**
 
41
 * ubi_check_volume - check the contents of a static volume.
 
42
 * @ubi: UBI device description object
 
43
 * @vol_id: ID of the volume to check
 
44
 *
 
45
 * This function checks if static volume @vol_id is corrupted by fully reading
 
46
 * it and checking data CRC. This function returns %0 if the volume is not
 
47
 * corrupted, %1 if it is corrupted and a negative error code in case of
 
48
 * failure. Dynamic volumes are not checked and zero is returned immediately.
 
49
 */
 
50
int ubi_check_volume(struct ubi_device *ubi, int vol_id)
 
51
{
 
52
        void *buf;
 
53
        int err = 0, i;
 
54
        struct ubi_volume *vol = ubi->volumes[vol_id];
 
55
 
 
56
        if (vol->vol_type != UBI_STATIC_VOLUME)
 
57
                return 0;
 
58
 
 
59
        buf = vmalloc(vol->usable_leb_size);
 
60
        if (!buf)
 
61
                return -ENOMEM;
 
62
 
 
63
        for (i = 0; i < vol->used_ebs; i++) {
 
64
                int size;
 
65
 
 
66
                if (i == vol->used_ebs - 1)
 
67
                        size = vol->last_eb_bytes;
 
68
                else
 
69
                        size = vol->usable_leb_size;
 
70
 
 
71
                err = ubi_eba_read_leb(ubi, vol, i, buf, 0, size, 1);
 
72
                if (err) {
 
73
                        if (mtd_is_eccerr(err))
 
74
                                err = 1;
 
75
                        break;
 
76
                }
 
77
        }
 
78
 
 
79
        vfree(buf);
 
80
        return err;
 
81
}
 
82
 
 
83
/**
 
84
 * ubi_calculate_rsvd_pool - calculate how many PEBs must be reserved for bad
 
85
 * eraseblock handling.
 
86
 * @ubi: UBI device description object
 
87
 */
 
88
void ubi_calculate_reserved(struct ubi_device *ubi)
 
89
{
 
90
        ubi->beb_rsvd_level = ubi->good_peb_count/100;
 
91
        ubi->beb_rsvd_level *= CONFIG_MTD_UBI_BEB_RESERVE;
 
92
        if (ubi->beb_rsvd_level < MIN_RESEVED_PEBS)
 
93
                ubi->beb_rsvd_level = MIN_RESEVED_PEBS;
 
94
}