xref: /openbmc/u-boot/drivers/mtd/ubi/build.c (revision 7868909e)
183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2f399d4a2SKyungmin Park /*
3f399d4a2SKyungmin Park  * Copyright (c) International Business Machines Corp., 2006
4f399d4a2SKyungmin Park  * Copyright (c) Nokia Corporation, 2007
5f399d4a2SKyungmin Park  *
6f399d4a2SKyungmin Park  * Author: Artem Bityutskiy (Битюцкий Артём),
7f399d4a2SKyungmin Park  *         Frank Haverkamp
8f399d4a2SKyungmin Park  */
9f399d4a2SKyungmin Park 
10f399d4a2SKyungmin Park /*
11f399d4a2SKyungmin Park  * This file includes UBI initialization and building of UBI devices.
12f399d4a2SKyungmin Park  *
13f399d4a2SKyungmin Park  * When UBI is initialized, it attaches all the MTD devices specified as the
14f399d4a2SKyungmin Park  * module load parameters or the kernel boot parameters. If MTD devices were
15f399d4a2SKyungmin Park  * specified, UBI does not attach any MTD device, but it is possible to do
16f399d4a2SKyungmin Park  * later using the "UBI control device".
17f399d4a2SKyungmin Park  */
18f399d4a2SKyungmin Park 
19ff94bc40SHeiko Schocher #ifndef __UBOOT__
20f399d4a2SKyungmin Park #include <linux/module.h>
21f399d4a2SKyungmin Park #include <linux/moduleparam.h>
22f399d4a2SKyungmin Park #include <linux/stringify.h>
23ff94bc40SHeiko Schocher #include <linux/namei.h>
24f399d4a2SKyungmin Park #include <linux/stat.h>
25f399d4a2SKyungmin Park #include <linux/miscdevice.h>
26f399d4a2SKyungmin Park #include <linux/log2.h>
27f399d4a2SKyungmin Park #include <linux/kthread.h>
28ff94bc40SHeiko Schocher #include <linux/kernel.h>
29ff94bc40SHeiko Schocher #include <linux/slab.h>
30ff94bc40SHeiko Schocher #include <linux/major.h>
31ff94bc40SHeiko Schocher #else
3284b8bf6dSMasahiro Yamada #include <linux/bug.h>
33f8fdb81fSFabio Estevam #include <linux/log2.h>
34f399d4a2SKyungmin Park #endif
35ff94bc40SHeiko Schocher #include <linux/err.h>
36f399d4a2SKyungmin Park #include <ubi_uboot.h>
37ff94bc40SHeiko Schocher #include <linux/mtd/partitions.h>
38ff94bc40SHeiko Schocher 
39f399d4a2SKyungmin Park #include "ubi.h"
40f399d4a2SKyungmin Park 
41ff94bc40SHeiko Schocher /* Maximum length of the 'mtd=' parameter */
42ff94bc40SHeiko Schocher #define MTD_PARAM_LEN_MAX 64
43ff94bc40SHeiko Schocher 
44ff94bc40SHeiko Schocher /* Maximum number of comma-separated items in the 'mtd=' parameter */
45ff94bc40SHeiko Schocher #define MTD_PARAM_MAX_COUNT 4
46ff94bc40SHeiko Schocher 
47ff94bc40SHeiko Schocher /* Maximum value for the number of bad PEBs per 1024 PEBs */
48ff94bc40SHeiko Schocher #define MAX_MTD_UBI_BEB_LIMIT 768
49ff94bc40SHeiko Schocher 
50ff94bc40SHeiko Schocher #ifdef CONFIG_MTD_UBI_MODULE
51ff94bc40SHeiko Schocher #define ubi_is_module() 1
52ff94bc40SHeiko Schocher #else
53ff94bc40SHeiko Schocher #define ubi_is_module() 0
54ff94bc40SHeiko Schocher #endif
55ff94bc40SHeiko Schocher 
5660cfe87bSStefan Roese #if (CONFIG_SYS_MALLOC_LEN < (512 << 10))
5760cfe87bSStefan Roese #error Malloc area too small for UBI, increase CONFIG_SYS_MALLOC_LEN to >= 512k
5860cfe87bSStefan Roese #endif
5960cfe87bSStefan Roese 
60f399d4a2SKyungmin Park /**
61f399d4a2SKyungmin Park  * struct mtd_dev_param - MTD device parameter description data structure.
62ff94bc40SHeiko Schocher  * @name: MTD character device node path, MTD device name, or MTD device number
63ff94bc40SHeiko Schocher  *        string
64f399d4a2SKyungmin Park  * @vid_hdr_offs: VID header offset
65ff94bc40SHeiko Schocher  * @max_beb_per1024: maximum expected number of bad PEBs per 1024 PEBs
66f399d4a2SKyungmin Park  */
67ff94bc40SHeiko Schocher struct mtd_dev_param {
68f399d4a2SKyungmin Park 	char name[MTD_PARAM_LEN_MAX];
69ff94bc40SHeiko Schocher 	int ubi_num;
70f399d4a2SKyungmin Park 	int vid_hdr_offs;
71ff94bc40SHeiko Schocher 	int max_beb_per1024;
72f399d4a2SKyungmin Park };
73f399d4a2SKyungmin Park 
74f399d4a2SKyungmin Park /* Numbers of elements set in the @mtd_dev_param array */
75ff94bc40SHeiko Schocher static int __initdata mtd_devs;
76f399d4a2SKyungmin Park 
77f399d4a2SKyungmin Park /* MTD devices specification parameters */
78ff94bc40SHeiko Schocher static struct mtd_dev_param __initdata mtd_dev_param[UBI_MAX_DEVICES];
79ff94bc40SHeiko Schocher #ifndef __UBOOT__
80ff94bc40SHeiko Schocher #ifdef CONFIG_MTD_UBI_FASTMAP
81ff94bc40SHeiko Schocher /* UBI module parameter to enable fastmap automatically on non-fastmap images */
82ff94bc40SHeiko Schocher static bool fm_autoconvert;
830195a7bbSHeiko Schocher static bool fm_debug;
84ff94bc40SHeiko Schocher #endif
85ff94bc40SHeiko Schocher #else
86ff94bc40SHeiko Schocher #ifdef CONFIG_MTD_UBI_FASTMAP
87ff94bc40SHeiko Schocher #if !defined(CONFIG_MTD_UBI_FASTMAP_AUTOCONVERT)
88ff94bc40SHeiko Schocher #define CONFIG_MTD_UBI_FASTMAP_AUTOCONVERT 0
89ff94bc40SHeiko Schocher #endif
90ff94bc40SHeiko Schocher static bool fm_autoconvert = CONFIG_MTD_UBI_FASTMAP_AUTOCONVERT;
910195a7bbSHeiko Schocher #if !defined(CONFIG_MTD_UBI_FM_DEBUG)
920195a7bbSHeiko Schocher #define CONFIG_MTD_UBI_FM_DEBUG 0
930195a7bbSHeiko Schocher #endif
940195a7bbSHeiko Schocher static bool fm_debug = CONFIG_MTD_UBI_FM_DEBUG;
95ff94bc40SHeiko Schocher #endif
96ff94bc40SHeiko Schocher #endif
97f399d4a2SKyungmin Park 
98f399d4a2SKyungmin Park /* Slab cache for wear-leveling entries */
99f399d4a2SKyungmin Park struct kmem_cache *ubi_wl_entry_slab;
100f399d4a2SKyungmin Park 
101ff94bc40SHeiko Schocher #ifndef __UBOOT__
102f399d4a2SKyungmin Park /* UBI control character device */
103f399d4a2SKyungmin Park static struct miscdevice ubi_ctrl_cdev = {
104f399d4a2SKyungmin Park 	.minor = MISC_DYNAMIC_MINOR,
105f399d4a2SKyungmin Park 	.name = "ubi_ctrl",
106f399d4a2SKyungmin Park 	.fops = &ubi_ctrl_cdev_operations,
107f399d4a2SKyungmin Park };
108f399d4a2SKyungmin Park #endif
109f399d4a2SKyungmin Park 
110f399d4a2SKyungmin Park /* All UBI devices in system */
111ff94bc40SHeiko Schocher #ifndef __UBOOT__
112ff94bc40SHeiko Schocher static struct ubi_device *ubi_devices[UBI_MAX_DEVICES];
113ff94bc40SHeiko Schocher #else
114f399d4a2SKyungmin Park struct ubi_device *ubi_devices[UBI_MAX_DEVICES];
115ff94bc40SHeiko Schocher #endif
116f399d4a2SKyungmin Park 
117ff94bc40SHeiko Schocher #ifndef __UBOOT__
118f399d4a2SKyungmin Park /* Serializes UBI devices creations and removals */
119f399d4a2SKyungmin Park DEFINE_MUTEX(ubi_devices_mutex);
120f399d4a2SKyungmin Park 
121f399d4a2SKyungmin Park /* Protects @ubi_devices and @ubi->ref_count */
122f399d4a2SKyungmin Park static DEFINE_SPINLOCK(ubi_devices_lock);
123f399d4a2SKyungmin Park 
124f399d4a2SKyungmin Park /* "Show" method for files in '/<sysfs>/class/ubi/' */
ubi_version_show(struct class * class,struct class_attribute * attr,char * buf)125ff94bc40SHeiko Schocher static ssize_t ubi_version_show(struct class *class,
126ff94bc40SHeiko Schocher 				struct class_attribute *attr, char *buf)
127f399d4a2SKyungmin Park {
128f399d4a2SKyungmin Park 	return sprintf(buf, "%d\n", UBI_VERSION);
129f399d4a2SKyungmin Park }
130f399d4a2SKyungmin Park 
131f399d4a2SKyungmin Park /* UBI version attribute ('/<sysfs>/class/ubi/version') */
1320195a7bbSHeiko Schocher static struct class_attribute ubi_class_attrs[] = {
1330195a7bbSHeiko Schocher 	__ATTR(version, S_IRUGO, ubi_version_show, NULL),
1340195a7bbSHeiko Schocher 	__ATTR_NULL
1350195a7bbSHeiko Schocher };
1360195a7bbSHeiko Schocher 
1370195a7bbSHeiko Schocher /* Root UBI "class" object (corresponds to '/<sysfs>/class/ubi/') */
1380195a7bbSHeiko Schocher struct class ubi_class = {
1390195a7bbSHeiko Schocher 	.name		= UBI_NAME_STR,
1400195a7bbSHeiko Schocher 	.owner		= THIS_MODULE,
1410195a7bbSHeiko Schocher 	.class_attrs	= ubi_class_attrs,
1420195a7bbSHeiko Schocher };
143f399d4a2SKyungmin Park 
144f399d4a2SKyungmin Park static ssize_t dev_attribute_show(struct device *dev,
145f399d4a2SKyungmin Park 				  struct device_attribute *attr, char *buf);
146f399d4a2SKyungmin Park 
147f399d4a2SKyungmin Park /* UBI device attributes (correspond to files in '/<sysfs>/class/ubi/ubiX') */
148f399d4a2SKyungmin Park static struct device_attribute dev_eraseblock_size =
149f399d4a2SKyungmin Park 	__ATTR(eraseblock_size, S_IRUGO, dev_attribute_show, NULL);
150f399d4a2SKyungmin Park static struct device_attribute dev_avail_eraseblocks =
151f399d4a2SKyungmin Park 	__ATTR(avail_eraseblocks, S_IRUGO, dev_attribute_show, NULL);
152f399d4a2SKyungmin Park static struct device_attribute dev_total_eraseblocks =
153f399d4a2SKyungmin Park 	__ATTR(total_eraseblocks, S_IRUGO, dev_attribute_show, NULL);
154f399d4a2SKyungmin Park static struct device_attribute dev_volumes_count =
155f399d4a2SKyungmin Park 	__ATTR(volumes_count, S_IRUGO, dev_attribute_show, NULL);
156f399d4a2SKyungmin Park static struct device_attribute dev_max_ec =
157f399d4a2SKyungmin Park 	__ATTR(max_ec, S_IRUGO, dev_attribute_show, NULL);
158f399d4a2SKyungmin Park static struct device_attribute dev_reserved_for_bad =
159f399d4a2SKyungmin Park 	__ATTR(reserved_for_bad, S_IRUGO, dev_attribute_show, NULL);
160f399d4a2SKyungmin Park static struct device_attribute dev_bad_peb_count =
161f399d4a2SKyungmin Park 	__ATTR(bad_peb_count, S_IRUGO, dev_attribute_show, NULL);
162f399d4a2SKyungmin Park static struct device_attribute dev_max_vol_count =
163f399d4a2SKyungmin Park 	__ATTR(max_vol_count, S_IRUGO, dev_attribute_show, NULL);
164f399d4a2SKyungmin Park static struct device_attribute dev_min_io_size =
165f399d4a2SKyungmin Park 	__ATTR(min_io_size, S_IRUGO, dev_attribute_show, NULL);
166f399d4a2SKyungmin Park static struct device_attribute dev_bgt_enabled =
167f399d4a2SKyungmin Park 	__ATTR(bgt_enabled, S_IRUGO, dev_attribute_show, NULL);
168f399d4a2SKyungmin Park static struct device_attribute dev_mtd_num =
169f399d4a2SKyungmin Park 	__ATTR(mtd_num, S_IRUGO, dev_attribute_show, NULL);
170f399d4a2SKyungmin Park #endif
171f399d4a2SKyungmin Park 
172f399d4a2SKyungmin Park /**
173ff94bc40SHeiko Schocher  * ubi_volume_notify - send a volume change notification.
174ff94bc40SHeiko Schocher  * @ubi: UBI device description object
175ff94bc40SHeiko Schocher  * @vol: volume description object of the changed volume
176ff94bc40SHeiko Schocher  * @ntype: notification type to send (%UBI_VOLUME_ADDED, etc)
177ff94bc40SHeiko Schocher  *
178ff94bc40SHeiko Schocher  * This is a helper function which notifies all subscribers about a volume
179ff94bc40SHeiko Schocher  * change event (creation, removal, re-sizing, re-naming, updating). Returns
180ff94bc40SHeiko Schocher  * zero in case of success and a negative error code in case of failure.
181ff94bc40SHeiko Schocher  */
ubi_volume_notify(struct ubi_device * ubi,struct ubi_volume * vol,int ntype)182ff94bc40SHeiko Schocher int ubi_volume_notify(struct ubi_device *ubi, struct ubi_volume *vol, int ntype)
183ff94bc40SHeiko Schocher {
1840195a7bbSHeiko Schocher 	int ret;
185ff94bc40SHeiko Schocher 	struct ubi_notification nt;
186ff94bc40SHeiko Schocher 
187ff94bc40SHeiko Schocher 	ubi_do_get_device_info(ubi, &nt.di);
188ff94bc40SHeiko Schocher 	ubi_do_get_volume_info(ubi, vol, &nt.vi);
189ff94bc40SHeiko Schocher 
190ff94bc40SHeiko Schocher 	switch (ntype) {
191ff94bc40SHeiko Schocher 	case UBI_VOLUME_ADDED:
192ff94bc40SHeiko Schocher 	case UBI_VOLUME_REMOVED:
193ff94bc40SHeiko Schocher 	case UBI_VOLUME_RESIZED:
194ff94bc40SHeiko Schocher 	case UBI_VOLUME_RENAMED:
1950195a7bbSHeiko Schocher 		ret = ubi_update_fastmap(ubi);
1960195a7bbSHeiko Schocher 		if (ret)
1970195a7bbSHeiko Schocher 			ubi_msg(ubi, "Unable to write a new fastmap: %i", ret);
198ff94bc40SHeiko Schocher 	}
1990195a7bbSHeiko Schocher 
200ff94bc40SHeiko Schocher 	return blocking_notifier_call_chain(&ubi_notifiers, ntype, &nt);
201ff94bc40SHeiko Schocher }
202ff94bc40SHeiko Schocher 
203ff94bc40SHeiko Schocher /**
204ff94bc40SHeiko Schocher  * ubi_notify_all - send a notification to all volumes.
205ff94bc40SHeiko Schocher  * @ubi: UBI device description object
206ff94bc40SHeiko Schocher  * @ntype: notification type to send (%UBI_VOLUME_ADDED, etc)
207ff94bc40SHeiko Schocher  * @nb: the notifier to call
208ff94bc40SHeiko Schocher  *
209ff94bc40SHeiko Schocher  * This function walks all volumes of UBI device @ubi and sends the @ntype
210ff94bc40SHeiko Schocher  * notification for each volume. If @nb is %NULL, then all registered notifiers
211ff94bc40SHeiko Schocher  * are called, otherwise only the @nb notifier is called. Returns the number of
212ff94bc40SHeiko Schocher  * sent notifications.
213ff94bc40SHeiko Schocher  */
ubi_notify_all(struct ubi_device * ubi,int ntype,struct notifier_block * nb)214ff94bc40SHeiko Schocher int ubi_notify_all(struct ubi_device *ubi, int ntype, struct notifier_block *nb)
215ff94bc40SHeiko Schocher {
216ff94bc40SHeiko Schocher 	struct ubi_notification nt;
217ff94bc40SHeiko Schocher 	int i, count = 0;
218ff94bc40SHeiko Schocher #ifndef __UBOOT__
219ff94bc40SHeiko Schocher 	int ret;
220ff94bc40SHeiko Schocher #endif
221ff94bc40SHeiko Schocher 
222ff94bc40SHeiko Schocher 	ubi_do_get_device_info(ubi, &nt.di);
223ff94bc40SHeiko Schocher 
224ff94bc40SHeiko Schocher 	mutex_lock(&ubi->device_mutex);
225ff94bc40SHeiko Schocher 	for (i = 0; i < ubi->vtbl_slots; i++) {
226ff94bc40SHeiko Schocher 		/*
227ff94bc40SHeiko Schocher 		 * Since the @ubi->device is locked, and we are not going to
228ff94bc40SHeiko Schocher 		 * change @ubi->volumes, we do not have to lock
229ff94bc40SHeiko Schocher 		 * @ubi->volumes_lock.
230ff94bc40SHeiko Schocher 		 */
231ff94bc40SHeiko Schocher 		if (!ubi->volumes[i])
232ff94bc40SHeiko Schocher 			continue;
233ff94bc40SHeiko Schocher 
234ff94bc40SHeiko Schocher 		ubi_do_get_volume_info(ubi, ubi->volumes[i], &nt.vi);
235ff94bc40SHeiko Schocher #ifndef __UBOOT__
236ff94bc40SHeiko Schocher 		if (nb)
237ff94bc40SHeiko Schocher 			nb->notifier_call(nb, ntype, &nt);
238ff94bc40SHeiko Schocher 		else
239ff94bc40SHeiko Schocher 			ret = blocking_notifier_call_chain(&ubi_notifiers, ntype,
240ff94bc40SHeiko Schocher 						     &nt);
241ff94bc40SHeiko Schocher #endif
242ff94bc40SHeiko Schocher 		count += 1;
243ff94bc40SHeiko Schocher 	}
244ff94bc40SHeiko Schocher 	mutex_unlock(&ubi->device_mutex);
245ff94bc40SHeiko Schocher 
246ff94bc40SHeiko Schocher 	return count;
247ff94bc40SHeiko Schocher }
248ff94bc40SHeiko Schocher 
249ff94bc40SHeiko Schocher /**
250ff94bc40SHeiko Schocher  * ubi_enumerate_volumes - send "add" notification for all existing volumes.
251ff94bc40SHeiko Schocher  * @nb: the notifier to call
252ff94bc40SHeiko Schocher  *
253ff94bc40SHeiko Schocher  * This function walks all UBI devices and volumes and sends the
254ff94bc40SHeiko Schocher  * %UBI_VOLUME_ADDED notification for each volume. If @nb is %NULL, then all
255ff94bc40SHeiko Schocher  * registered notifiers are called, otherwise only the @nb notifier is called.
256ff94bc40SHeiko Schocher  * Returns the number of sent notifications.
257ff94bc40SHeiko Schocher  */
ubi_enumerate_volumes(struct notifier_block * nb)258ff94bc40SHeiko Schocher int ubi_enumerate_volumes(struct notifier_block *nb)
259ff94bc40SHeiko Schocher {
260ff94bc40SHeiko Schocher 	int i, count = 0;
261ff94bc40SHeiko Schocher 
262ff94bc40SHeiko Schocher 	/*
263ff94bc40SHeiko Schocher 	 * Since the @ubi_devices_mutex is locked, and we are not going to
264ff94bc40SHeiko Schocher 	 * change @ubi_devices, we do not have to lock @ubi_devices_lock.
265ff94bc40SHeiko Schocher 	 */
266ff94bc40SHeiko Schocher 	for (i = 0; i < UBI_MAX_DEVICES; i++) {
267ff94bc40SHeiko Schocher 		struct ubi_device *ubi = ubi_devices[i];
268ff94bc40SHeiko Schocher 
269ff94bc40SHeiko Schocher 		if (!ubi)
270ff94bc40SHeiko Schocher 			continue;
271ff94bc40SHeiko Schocher 		count += ubi_notify_all(ubi, UBI_VOLUME_ADDED, nb);
272ff94bc40SHeiko Schocher 	}
273ff94bc40SHeiko Schocher 
274ff94bc40SHeiko Schocher 	return count;
275ff94bc40SHeiko Schocher }
276ff94bc40SHeiko Schocher 
277ff94bc40SHeiko Schocher /**
278f399d4a2SKyungmin Park  * ubi_get_device - get UBI device.
279f399d4a2SKyungmin Park  * @ubi_num: UBI device number
280f399d4a2SKyungmin Park  *
281f399d4a2SKyungmin Park  * This function returns UBI device description object for UBI device number
282f399d4a2SKyungmin Park  * @ubi_num, or %NULL if the device does not exist. This function increases the
283f399d4a2SKyungmin Park  * device reference count to prevent removal of the device. In other words, the
284f399d4a2SKyungmin Park  * device cannot be removed if its reference count is not zero.
285f399d4a2SKyungmin Park  */
ubi_get_device(int ubi_num)286f399d4a2SKyungmin Park struct ubi_device *ubi_get_device(int ubi_num)
287f399d4a2SKyungmin Park {
288f399d4a2SKyungmin Park 	struct ubi_device *ubi;
289f399d4a2SKyungmin Park 
290f399d4a2SKyungmin Park 	spin_lock(&ubi_devices_lock);
291f399d4a2SKyungmin Park 	ubi = ubi_devices[ubi_num];
292f399d4a2SKyungmin Park 	if (ubi) {
293f399d4a2SKyungmin Park 		ubi_assert(ubi->ref_count >= 0);
294f399d4a2SKyungmin Park 		ubi->ref_count += 1;
295f399d4a2SKyungmin Park 		get_device(&ubi->dev);
296f399d4a2SKyungmin Park 	}
297f399d4a2SKyungmin Park 	spin_unlock(&ubi_devices_lock);
298f399d4a2SKyungmin Park 
299f399d4a2SKyungmin Park 	return ubi;
300f399d4a2SKyungmin Park }
301f399d4a2SKyungmin Park 
302f399d4a2SKyungmin Park /**
303f399d4a2SKyungmin Park  * ubi_put_device - drop an UBI device reference.
304f399d4a2SKyungmin Park  * @ubi: UBI device description object
305f399d4a2SKyungmin Park  */
ubi_put_device(struct ubi_device * ubi)306f399d4a2SKyungmin Park void ubi_put_device(struct ubi_device *ubi)
307f399d4a2SKyungmin Park {
308f399d4a2SKyungmin Park 	spin_lock(&ubi_devices_lock);
309f399d4a2SKyungmin Park 	ubi->ref_count -= 1;
310f399d4a2SKyungmin Park 	put_device(&ubi->dev);
311f399d4a2SKyungmin Park 	spin_unlock(&ubi_devices_lock);
312f399d4a2SKyungmin Park }
313f399d4a2SKyungmin Park 
314f399d4a2SKyungmin Park /**
315ff94bc40SHeiko Schocher  * ubi_get_by_major - get UBI device by character device major number.
316f399d4a2SKyungmin Park  * @major: major number
317f399d4a2SKyungmin Park  *
318f399d4a2SKyungmin Park  * This function is similar to 'ubi_get_device()', but it searches the device
319f399d4a2SKyungmin Park  * by its major number.
320f399d4a2SKyungmin Park  */
ubi_get_by_major(int major)321f399d4a2SKyungmin Park struct ubi_device *ubi_get_by_major(int major)
322f399d4a2SKyungmin Park {
323f399d4a2SKyungmin Park 	int i;
324f399d4a2SKyungmin Park 	struct ubi_device *ubi;
325f399d4a2SKyungmin Park 
326f399d4a2SKyungmin Park 	spin_lock(&ubi_devices_lock);
327f399d4a2SKyungmin Park 	for (i = 0; i < UBI_MAX_DEVICES; i++) {
328f399d4a2SKyungmin Park 		ubi = ubi_devices[i];
329f399d4a2SKyungmin Park 		if (ubi && MAJOR(ubi->cdev.dev) == major) {
330f399d4a2SKyungmin Park 			ubi_assert(ubi->ref_count >= 0);
331f399d4a2SKyungmin Park 			ubi->ref_count += 1;
332f399d4a2SKyungmin Park 			get_device(&ubi->dev);
333f399d4a2SKyungmin Park 			spin_unlock(&ubi_devices_lock);
334f399d4a2SKyungmin Park 			return ubi;
335f399d4a2SKyungmin Park 		}
336f399d4a2SKyungmin Park 	}
337f399d4a2SKyungmin Park 	spin_unlock(&ubi_devices_lock);
338f399d4a2SKyungmin Park 
339f399d4a2SKyungmin Park 	return NULL;
340f399d4a2SKyungmin Park }
341f399d4a2SKyungmin Park 
342f399d4a2SKyungmin Park /**
343f399d4a2SKyungmin Park  * ubi_major2num - get UBI device number by character device major number.
344f399d4a2SKyungmin Park  * @major: major number
345f399d4a2SKyungmin Park  *
346f399d4a2SKyungmin Park  * This function searches UBI device number object by its major number. If UBI
347f399d4a2SKyungmin Park  * device was not found, this function returns -ENODEV, otherwise the UBI device
348f399d4a2SKyungmin Park  * number is returned.
349f399d4a2SKyungmin Park  */
ubi_major2num(int major)350f399d4a2SKyungmin Park int ubi_major2num(int major)
351f399d4a2SKyungmin Park {
352f399d4a2SKyungmin Park 	int i, ubi_num = -ENODEV;
353f399d4a2SKyungmin Park 
354f399d4a2SKyungmin Park 	spin_lock(&ubi_devices_lock);
355f399d4a2SKyungmin Park 	for (i = 0; i < UBI_MAX_DEVICES; i++) {
356f399d4a2SKyungmin Park 		struct ubi_device *ubi = ubi_devices[i];
357f399d4a2SKyungmin Park 
358f399d4a2SKyungmin Park 		if (ubi && MAJOR(ubi->cdev.dev) == major) {
359f399d4a2SKyungmin Park 			ubi_num = ubi->ubi_num;
360f399d4a2SKyungmin Park 			break;
361f399d4a2SKyungmin Park 		}
362f399d4a2SKyungmin Park 	}
363f399d4a2SKyungmin Park 	spin_unlock(&ubi_devices_lock);
364f399d4a2SKyungmin Park 
365f399d4a2SKyungmin Park 	return ubi_num;
366f399d4a2SKyungmin Park }
367f399d4a2SKyungmin Park 
368ff94bc40SHeiko Schocher #ifndef __UBOOT__
369f399d4a2SKyungmin Park /* "Show" method for files in '/<sysfs>/class/ubi/ubiX/' */
dev_attribute_show(struct device * dev,struct device_attribute * attr,char * buf)370f399d4a2SKyungmin Park static ssize_t dev_attribute_show(struct device *dev,
371f399d4a2SKyungmin Park 				  struct device_attribute *attr, char *buf)
372f399d4a2SKyungmin Park {
373f399d4a2SKyungmin Park 	ssize_t ret;
374f399d4a2SKyungmin Park 	struct ubi_device *ubi;
375f399d4a2SKyungmin Park 
376f399d4a2SKyungmin Park 	/*
377f399d4a2SKyungmin Park 	 * The below code looks weird, but it actually makes sense. We get the
378f399d4a2SKyungmin Park 	 * UBI device reference from the contained 'struct ubi_device'. But it
379f399d4a2SKyungmin Park 	 * is unclear if the device was removed or not yet. Indeed, if the
380f399d4a2SKyungmin Park 	 * device was removed before we increased its reference count,
381f399d4a2SKyungmin Park 	 * 'ubi_get_device()' will return -ENODEV and we fail.
382f399d4a2SKyungmin Park 	 *
383f399d4a2SKyungmin Park 	 * Remember, 'struct ubi_device' is freed in the release function, so
384f399d4a2SKyungmin Park 	 * we still can use 'ubi->ubi_num'.
385f399d4a2SKyungmin Park 	 */
386f399d4a2SKyungmin Park 	ubi = container_of(dev, struct ubi_device, dev);
387f399d4a2SKyungmin Park 	ubi = ubi_get_device(ubi->ubi_num);
388f399d4a2SKyungmin Park 	if (!ubi)
389f399d4a2SKyungmin Park 		return -ENODEV;
390f399d4a2SKyungmin Park 
391f399d4a2SKyungmin Park 	if (attr == &dev_eraseblock_size)
392f399d4a2SKyungmin Park 		ret = sprintf(buf, "%d\n", ubi->leb_size);
393f399d4a2SKyungmin Park 	else if (attr == &dev_avail_eraseblocks)
394f399d4a2SKyungmin Park 		ret = sprintf(buf, "%d\n", ubi->avail_pebs);
395f399d4a2SKyungmin Park 	else if (attr == &dev_total_eraseblocks)
396f399d4a2SKyungmin Park 		ret = sprintf(buf, "%d\n", ubi->good_peb_count);
397f399d4a2SKyungmin Park 	else if (attr == &dev_volumes_count)
398f399d4a2SKyungmin Park 		ret = sprintf(buf, "%d\n", ubi->vol_count - UBI_INT_VOL_COUNT);
399f399d4a2SKyungmin Park 	else if (attr == &dev_max_ec)
400f399d4a2SKyungmin Park 		ret = sprintf(buf, "%d\n", ubi->max_ec);
401f399d4a2SKyungmin Park 	else if (attr == &dev_reserved_for_bad)
402f399d4a2SKyungmin Park 		ret = sprintf(buf, "%d\n", ubi->beb_rsvd_pebs);
403f399d4a2SKyungmin Park 	else if (attr == &dev_bad_peb_count)
404f399d4a2SKyungmin Park 		ret = sprintf(buf, "%d\n", ubi->bad_peb_count);
405f399d4a2SKyungmin Park 	else if (attr == &dev_max_vol_count)
406f399d4a2SKyungmin Park 		ret = sprintf(buf, "%d\n", ubi->vtbl_slots);
407f399d4a2SKyungmin Park 	else if (attr == &dev_min_io_size)
408f399d4a2SKyungmin Park 		ret = sprintf(buf, "%d\n", ubi->min_io_size);
409f399d4a2SKyungmin Park 	else if (attr == &dev_bgt_enabled)
410f399d4a2SKyungmin Park 		ret = sprintf(buf, "%d\n", ubi->thread_enabled);
411f399d4a2SKyungmin Park 	else if (attr == &dev_mtd_num)
412f399d4a2SKyungmin Park 		ret = sprintf(buf, "%d\n", ubi->mtd->index);
413f399d4a2SKyungmin Park 	else
414f399d4a2SKyungmin Park 		ret = -EINVAL;
415f399d4a2SKyungmin Park 
416f399d4a2SKyungmin Park 	ubi_put_device(ubi);
417f399d4a2SKyungmin Park 	return ret;
418f399d4a2SKyungmin Park }
419f399d4a2SKyungmin Park 
4200195a7bbSHeiko Schocher static struct attribute *ubi_dev_attrs[] = {
4210195a7bbSHeiko Schocher 	&dev_eraseblock_size.attr,
4220195a7bbSHeiko Schocher 	&dev_avail_eraseblocks.attr,
4230195a7bbSHeiko Schocher 	&dev_total_eraseblocks.attr,
4240195a7bbSHeiko Schocher 	&dev_volumes_count.attr,
4250195a7bbSHeiko Schocher 	&dev_max_ec.attr,
4260195a7bbSHeiko Schocher 	&dev_reserved_for_bad.attr,
4270195a7bbSHeiko Schocher 	&dev_bad_peb_count.attr,
4280195a7bbSHeiko Schocher 	&dev_max_vol_count.attr,
4290195a7bbSHeiko Schocher 	&dev_min_io_size.attr,
4300195a7bbSHeiko Schocher 	&dev_bgt_enabled.attr,
4310195a7bbSHeiko Schocher 	&dev_mtd_num.attr,
4320195a7bbSHeiko Schocher 	NULL
4330195a7bbSHeiko Schocher };
4340195a7bbSHeiko Schocher ATTRIBUTE_GROUPS(ubi_dev);
4350195a7bbSHeiko Schocher 
dev_release(struct device * dev)436ff94bc40SHeiko Schocher static void dev_release(struct device *dev)
437ff94bc40SHeiko Schocher {
438ff94bc40SHeiko Schocher 	struct ubi_device *ubi = container_of(dev, struct ubi_device, dev);
439ff94bc40SHeiko Schocher 
440ff94bc40SHeiko Schocher 	kfree(ubi);
441ff94bc40SHeiko Schocher }
442f399d4a2SKyungmin Park 
443f399d4a2SKyungmin Park /**
444f399d4a2SKyungmin Park  * ubi_sysfs_init - initialize sysfs for an UBI device.
445f399d4a2SKyungmin Park  * @ubi: UBI device description object
446ff94bc40SHeiko Schocher  * @ref: set to %1 on exit in case of failure if a reference to @ubi->dev was
447ff94bc40SHeiko Schocher  *       taken
448f399d4a2SKyungmin Park  *
449f399d4a2SKyungmin Park  * This function returns zero in case of success and a negative error code in
450f399d4a2SKyungmin Park  * case of failure.
451f399d4a2SKyungmin Park  */
ubi_sysfs_init(struct ubi_device * ubi,int * ref)452ff94bc40SHeiko Schocher static int ubi_sysfs_init(struct ubi_device *ubi, int *ref)
453f399d4a2SKyungmin Park {
454f399d4a2SKyungmin Park 	int err;
455f399d4a2SKyungmin Park 
456f399d4a2SKyungmin Park 	ubi->dev.release = dev_release;
457f399d4a2SKyungmin Park 	ubi->dev.devt = ubi->cdev.dev;
4580195a7bbSHeiko Schocher 	ubi->dev.class = &ubi_class;
4590195a7bbSHeiko Schocher 	ubi->dev.groups = ubi_dev_groups;
460ff94bc40SHeiko Schocher 	dev_set_name(&ubi->dev, UBI_NAME_STR"%d", ubi->ubi_num);
461f399d4a2SKyungmin Park 	err = device_register(&ubi->dev);
462f399d4a2SKyungmin Park 	if (err)
463f399d4a2SKyungmin Park 		return err;
464f399d4a2SKyungmin Park 
465ff94bc40SHeiko Schocher 	*ref = 1;
4660195a7bbSHeiko Schocher 	return 0;
467f399d4a2SKyungmin Park }
468f399d4a2SKyungmin Park 
469f399d4a2SKyungmin Park /**
470f399d4a2SKyungmin Park  * ubi_sysfs_close - close sysfs for an UBI device.
471f399d4a2SKyungmin Park  * @ubi: UBI device description object
472f399d4a2SKyungmin Park  */
ubi_sysfs_close(struct ubi_device * ubi)473f399d4a2SKyungmin Park static void ubi_sysfs_close(struct ubi_device *ubi)
474f399d4a2SKyungmin Park {
475f399d4a2SKyungmin Park 	device_unregister(&ubi->dev);
476f399d4a2SKyungmin Park }
477f399d4a2SKyungmin Park #endif
478f399d4a2SKyungmin Park 
479f399d4a2SKyungmin Park /**
480ff94bc40SHeiko Schocher  * kill_volumes - destroy all user volumes.
481f399d4a2SKyungmin Park  * @ubi: UBI device description object
482f399d4a2SKyungmin Park  */
kill_volumes(struct ubi_device * ubi)483f399d4a2SKyungmin Park static void kill_volumes(struct ubi_device *ubi)
484f399d4a2SKyungmin Park {
485f399d4a2SKyungmin Park 	int i;
486f399d4a2SKyungmin Park 
487f399d4a2SKyungmin Park 	for (i = 0; i < ubi->vtbl_slots; i++)
488f399d4a2SKyungmin Park 		if (ubi->volumes[i])
489f399d4a2SKyungmin Park 			ubi_free_volume(ubi, ubi->volumes[i]);
490f399d4a2SKyungmin Park }
491f399d4a2SKyungmin Park 
492f399d4a2SKyungmin Park /**
493f399d4a2SKyungmin Park  * uif_init - initialize user interfaces for an UBI device.
494f399d4a2SKyungmin Park  * @ubi: UBI device description object
495ff94bc40SHeiko Schocher  * @ref: set to %1 on exit in case of failure if a reference to @ubi->dev was
496ff94bc40SHeiko Schocher  *       taken, otherwise set to %0
497ff94bc40SHeiko Schocher  *
498ff94bc40SHeiko Schocher  * This function initializes various user interfaces for an UBI device. If the
499ff94bc40SHeiko Schocher  * initialization fails at an early stage, this function frees all the
500ff94bc40SHeiko Schocher  * resources it allocated, returns an error, and @ref is set to %0. However,
501ff94bc40SHeiko Schocher  * if the initialization fails after the UBI device was registered in the
502ff94bc40SHeiko Schocher  * driver core subsystem, this function takes a reference to @ubi->dev, because
503ff94bc40SHeiko Schocher  * otherwise the release function ('dev_release()') would free whole @ubi
504ff94bc40SHeiko Schocher  * object. The @ref argument is set to %1 in this case. The caller has to put
505ff94bc40SHeiko Schocher  * this reference.
506f399d4a2SKyungmin Park  *
507f399d4a2SKyungmin Park  * This function returns zero in case of success and a negative error code in
508f399d4a2SKyungmin Park  * case of failure.
509f399d4a2SKyungmin Park  */
uif_init(struct ubi_device * ubi,int * ref)510ff94bc40SHeiko Schocher static int uif_init(struct ubi_device *ubi, int *ref)
511f399d4a2SKyungmin Park {
512f399d4a2SKyungmin Park 	int i, err;
513ff94bc40SHeiko Schocher #ifndef __UBOOT__
514f399d4a2SKyungmin Park 	dev_t dev;
515f399d4a2SKyungmin Park #endif
516f399d4a2SKyungmin Park 
517ff94bc40SHeiko Schocher 	*ref = 0;
518f399d4a2SKyungmin Park 	sprintf(ubi->ubi_name, UBI_NAME_STR "%d", ubi->ubi_num);
519f399d4a2SKyungmin Park 
520f399d4a2SKyungmin Park 	/*
521f399d4a2SKyungmin Park 	 * Major numbers for the UBI character devices are allocated
522f399d4a2SKyungmin Park 	 * dynamically. Major numbers of volume character devices are
523f399d4a2SKyungmin Park 	 * equivalent to ones of the corresponding UBI character device. Minor
524f399d4a2SKyungmin Park 	 * numbers of UBI character devices are 0, while minor numbers of
525f399d4a2SKyungmin Park 	 * volume character devices start from 1. Thus, we allocate one major
526f399d4a2SKyungmin Park 	 * number and ubi->vtbl_slots + 1 minor numbers.
527f399d4a2SKyungmin Park 	 */
528f399d4a2SKyungmin Park 	err = alloc_chrdev_region(&dev, 0, ubi->vtbl_slots + 1, ubi->ubi_name);
529f399d4a2SKyungmin Park 	if (err) {
5300195a7bbSHeiko Schocher 		ubi_err(ubi, "cannot register UBI character devices");
531f399d4a2SKyungmin Park 		return err;
532f399d4a2SKyungmin Park 	}
533f399d4a2SKyungmin Park 
534f399d4a2SKyungmin Park 	ubi_assert(MINOR(dev) == 0);
535f399d4a2SKyungmin Park 	cdev_init(&ubi->cdev, &ubi_cdev_operations);
536ff94bc40SHeiko Schocher 	dbg_gen("%s major is %u", ubi->ubi_name, MAJOR(dev));
537f399d4a2SKyungmin Park 	ubi->cdev.owner = THIS_MODULE;
538f399d4a2SKyungmin Park 
539f399d4a2SKyungmin Park 	err = cdev_add(&ubi->cdev, dev, 1);
540f399d4a2SKyungmin Park 	if (err) {
5410195a7bbSHeiko Schocher 		ubi_err(ubi, "cannot add character device");
542f399d4a2SKyungmin Park 		goto out_unreg;
543f399d4a2SKyungmin Park 	}
544f399d4a2SKyungmin Park 
545ff94bc40SHeiko Schocher 	err = ubi_sysfs_init(ubi, ref);
546f399d4a2SKyungmin Park 	if (err)
547f399d4a2SKyungmin Park 		goto out_sysfs;
548f399d4a2SKyungmin Park 
549f399d4a2SKyungmin Park 	for (i = 0; i < ubi->vtbl_slots; i++)
550f399d4a2SKyungmin Park 		if (ubi->volumes[i]) {
551f399d4a2SKyungmin Park 			err = ubi_add_volume(ubi, ubi->volumes[i]);
552f399d4a2SKyungmin Park 			if (err) {
5530195a7bbSHeiko Schocher 				ubi_err(ubi, "cannot add volume %d", i);
554f399d4a2SKyungmin Park 				goto out_volumes;
555f399d4a2SKyungmin Park 			}
556f399d4a2SKyungmin Park 		}
557f399d4a2SKyungmin Park 
558f399d4a2SKyungmin Park 	return 0;
559f399d4a2SKyungmin Park 
560f399d4a2SKyungmin Park out_volumes:
561f399d4a2SKyungmin Park 	kill_volumes(ubi);
562f399d4a2SKyungmin Park out_sysfs:
563ff94bc40SHeiko Schocher 	if (*ref)
564ff94bc40SHeiko Schocher 		get_device(&ubi->dev);
565f399d4a2SKyungmin Park 	ubi_sysfs_close(ubi);
566f399d4a2SKyungmin Park 	cdev_del(&ubi->cdev);
567f399d4a2SKyungmin Park out_unreg:
568f399d4a2SKyungmin Park 	unregister_chrdev_region(ubi->cdev.dev, ubi->vtbl_slots + 1);
5690195a7bbSHeiko Schocher 	ubi_err(ubi, "cannot initialize UBI %s, error %d",
5700195a7bbSHeiko Schocher 		ubi->ubi_name, err);
571f399d4a2SKyungmin Park 	return err;
572f399d4a2SKyungmin Park }
573f399d4a2SKyungmin Park 
574f399d4a2SKyungmin Park /**
575f399d4a2SKyungmin Park  * uif_close - close user interfaces for an UBI device.
576f399d4a2SKyungmin Park  * @ubi: UBI device description object
577ff94bc40SHeiko Schocher  *
578ff94bc40SHeiko Schocher  * Note, since this function un-registers UBI volume device objects (@vol->dev),
579ff94bc40SHeiko Schocher  * the memory allocated voe the volumes is freed as well (in the release
580ff94bc40SHeiko Schocher  * function).
581f399d4a2SKyungmin Park  */
uif_close(struct ubi_device * ubi)582f399d4a2SKyungmin Park static void uif_close(struct ubi_device *ubi)
583f399d4a2SKyungmin Park {
584f399d4a2SKyungmin Park 	kill_volumes(ubi);
585f399d4a2SKyungmin Park 	ubi_sysfs_close(ubi);
586f399d4a2SKyungmin Park 	cdev_del(&ubi->cdev);
587f399d4a2SKyungmin Park 	unregister_chrdev_region(ubi->cdev.dev, ubi->vtbl_slots + 1);
588f399d4a2SKyungmin Park }
589f399d4a2SKyungmin Park 
590f399d4a2SKyungmin Park /**
591ff94bc40SHeiko Schocher  * ubi_free_internal_volumes - free internal volumes.
592ff94bc40SHeiko Schocher  * @ubi: UBI device description object
593f399d4a2SKyungmin Park  */
ubi_free_internal_volumes(struct ubi_device * ubi)594ff94bc40SHeiko Schocher void ubi_free_internal_volumes(struct ubi_device *ubi)
595f399d4a2SKyungmin Park {
596ff94bc40SHeiko Schocher 	int i;
597f399d4a2SKyungmin Park 
598ff94bc40SHeiko Schocher 	for (i = ubi->vtbl_slots;
599ff94bc40SHeiko Schocher 	     i < ubi->vtbl_slots + UBI_INT_VOL_COUNT; i++) {
600ff94bc40SHeiko Schocher 		kfree(ubi->volumes[i]->eba_tbl);
601ff94bc40SHeiko Schocher 		kfree(ubi->volumes[i]);
602ff94bc40SHeiko Schocher 	}
603ff94bc40SHeiko Schocher }
604f399d4a2SKyungmin Park 
get_bad_peb_limit(const struct ubi_device * ubi,int max_beb_per1024)605ff94bc40SHeiko Schocher static int get_bad_peb_limit(const struct ubi_device *ubi, int max_beb_per1024)
606ff94bc40SHeiko Schocher {
607ff94bc40SHeiko Schocher 	int limit, device_pebs;
608ff94bc40SHeiko Schocher 	uint64_t device_size;
609f399d4a2SKyungmin Park 
610ff94bc40SHeiko Schocher 	if (!max_beb_per1024)
611f399d4a2SKyungmin Park 		return 0;
612f399d4a2SKyungmin Park 
613ff94bc40SHeiko Schocher 	/*
614ff94bc40SHeiko Schocher 	 * Here we are using size of the entire flash chip and
615ff94bc40SHeiko Schocher 	 * not just the MTD partition size because the maximum
616ff94bc40SHeiko Schocher 	 * number of bad eraseblocks is a percentage of the
617ff94bc40SHeiko Schocher 	 * whole device and bad eraseblocks are not fairly
618ff94bc40SHeiko Schocher 	 * distributed over the flash chip. So the worst case
619ff94bc40SHeiko Schocher 	 * is that all the bad eraseblocks of the chip are in
620ff94bc40SHeiko Schocher 	 * the MTD partition we are attaching (ubi->mtd).
621ff94bc40SHeiko Schocher 	 */
622ff94bc40SHeiko Schocher 	device_size = mtd_get_device_size(ubi->mtd);
623ff94bc40SHeiko Schocher 	device_pebs = mtd_div_by_eb(device_size, ubi->mtd);
624ff94bc40SHeiko Schocher 	limit = mult_frac(device_pebs, max_beb_per1024, 1024);
625ff94bc40SHeiko Schocher 
626ff94bc40SHeiko Schocher 	/* Round it up */
627ff94bc40SHeiko Schocher 	if (mult_frac(limit, 1024, max_beb_per1024) < device_pebs)
628ff94bc40SHeiko Schocher 		limit += 1;
629ff94bc40SHeiko Schocher 
630ff94bc40SHeiko Schocher 	return limit;
631f399d4a2SKyungmin Park }
632f399d4a2SKyungmin Park 
633f399d4a2SKyungmin Park /**
634ff94bc40SHeiko Schocher  * io_init - initialize I/O sub-system for a given UBI device.
635f399d4a2SKyungmin Park  * @ubi: UBI device description object
636ff94bc40SHeiko Schocher  * @max_beb_per1024: maximum expected number of bad PEB per 1024 PEBs
637f399d4a2SKyungmin Park  *
638f399d4a2SKyungmin Park  * If @ubi->vid_hdr_offset or @ubi->leb_start is zero, default offsets are
639f399d4a2SKyungmin Park  * assumed:
640f399d4a2SKyungmin Park  *   o EC header is always at offset zero - this cannot be changed;
641f399d4a2SKyungmin Park  *   o VID header starts just after the EC header at the closest address
642f399d4a2SKyungmin Park  *     aligned to @io->hdrs_min_io_size;
643f399d4a2SKyungmin Park  *   o data starts just after the VID header at the closest address aligned to
644f399d4a2SKyungmin Park  *     @io->min_io_size
645f399d4a2SKyungmin Park  *
646f399d4a2SKyungmin Park  * This function returns zero in case of success and a negative error code in
647f399d4a2SKyungmin Park  * case of failure.
648f399d4a2SKyungmin Park  */
io_init(struct ubi_device * ubi,int max_beb_per1024)649ff94bc40SHeiko Schocher static int io_init(struct ubi_device *ubi, int max_beb_per1024)
650f399d4a2SKyungmin Park {
651ff94bc40SHeiko Schocher 	dbg_gen("sizeof(struct ubi_ainf_peb) %zu", sizeof(struct ubi_ainf_peb));
652ff94bc40SHeiko Schocher 	dbg_gen("sizeof(struct ubi_wl_entry) %zu", sizeof(struct ubi_wl_entry));
653ff94bc40SHeiko Schocher 
654f399d4a2SKyungmin Park 	if (ubi->mtd->numeraseregions != 0) {
655f399d4a2SKyungmin Park 		/*
656f399d4a2SKyungmin Park 		 * Some flashes have several erase regions. Different regions
657f399d4a2SKyungmin Park 		 * may have different eraseblock size and other
658f399d4a2SKyungmin Park 		 * characteristics. It looks like mostly multi-region flashes
659f399d4a2SKyungmin Park 		 * have one "main" region and one or more small regions to
660f399d4a2SKyungmin Park 		 * store boot loader code or boot parameters or whatever. I
661f399d4a2SKyungmin Park 		 * guess we should just pick the largest region. But this is
662f399d4a2SKyungmin Park 		 * not implemented.
663f399d4a2SKyungmin Park 		 */
6640195a7bbSHeiko Schocher 		ubi_err(ubi, "multiple regions, not implemented");
665f399d4a2SKyungmin Park 		return -EINVAL;
666f399d4a2SKyungmin Park 	}
667f399d4a2SKyungmin Park 
668f399d4a2SKyungmin Park 	if (ubi->vid_hdr_offset < 0)
669f399d4a2SKyungmin Park 		return -EINVAL;
670f399d4a2SKyungmin Park 
671f399d4a2SKyungmin Park 	/*
672f399d4a2SKyungmin Park 	 * Note, in this implementation we support MTD devices with 0x7FFFFFFF
673f399d4a2SKyungmin Park 	 * physical eraseblocks maximum.
674f399d4a2SKyungmin Park 	 */
675f399d4a2SKyungmin Park 
676f399d4a2SKyungmin Park 	ubi->peb_size   = ubi->mtd->erasesize;
677d318d0c4SStefan Roese 	ubi->peb_count  = mtd_div_by_eb(ubi->mtd->size, ubi->mtd);
678f399d4a2SKyungmin Park 	ubi->flash_size = ubi->mtd->size;
679f399d4a2SKyungmin Park 
680ff94bc40SHeiko Schocher 	if (mtd_can_have_bb(ubi->mtd)) {
681f399d4a2SKyungmin Park 		ubi->bad_allowed = 1;
682ff94bc40SHeiko Schocher 		ubi->bad_peb_limit = get_bad_peb_limit(ubi, max_beb_per1024);
683ff94bc40SHeiko Schocher 	}
684ff94bc40SHeiko Schocher 
685ff94bc40SHeiko Schocher 	if (ubi->mtd->type == MTD_NORFLASH) {
686ff94bc40SHeiko Schocher 		ubi_assert(ubi->mtd->writesize == 1);
687ff94bc40SHeiko Schocher 		ubi->nor_flash = 1;
688ff94bc40SHeiko Schocher 	}
689f399d4a2SKyungmin Park 
690f399d4a2SKyungmin Park 	ubi->min_io_size = ubi->mtd->writesize;
691f399d4a2SKyungmin Park 	ubi->hdrs_min_io_size = ubi->mtd->writesize >> ubi->mtd->subpage_sft;
692f399d4a2SKyungmin Park 
693f399d4a2SKyungmin Park 	/*
694f399d4a2SKyungmin Park 	 * Make sure minimal I/O unit is power of 2. Note, there is no
695f399d4a2SKyungmin Park 	 * fundamental reason for this assumption. It is just an optimization
696f399d4a2SKyungmin Park 	 * which allows us to avoid costly division operations.
697f399d4a2SKyungmin Park 	 */
698f399d4a2SKyungmin Park 	if (!is_power_of_2(ubi->min_io_size)) {
6990195a7bbSHeiko Schocher 		ubi_err(ubi, "min. I/O unit (%d) is not power of 2",
700f399d4a2SKyungmin Park 			ubi->min_io_size);
701f399d4a2SKyungmin Park 		return -EINVAL;
702f399d4a2SKyungmin Park 	}
703f399d4a2SKyungmin Park 
704f399d4a2SKyungmin Park 	ubi_assert(ubi->hdrs_min_io_size > 0);
705f399d4a2SKyungmin Park 	ubi_assert(ubi->hdrs_min_io_size <= ubi->min_io_size);
706f399d4a2SKyungmin Park 	ubi_assert(ubi->min_io_size % ubi->hdrs_min_io_size == 0);
707f399d4a2SKyungmin Park 
708ff94bc40SHeiko Schocher 	ubi->max_write_size = ubi->mtd->writebufsize;
709ff94bc40SHeiko Schocher 	/*
710ff94bc40SHeiko Schocher 	 * Maximum write size has to be greater or equivalent to min. I/O
711ff94bc40SHeiko Schocher 	 * size, and be multiple of min. I/O size.
712ff94bc40SHeiko Schocher 	 */
713ff94bc40SHeiko Schocher 	if (ubi->max_write_size < ubi->min_io_size ||
714ff94bc40SHeiko Schocher 	    ubi->max_write_size % ubi->min_io_size ||
715ff94bc40SHeiko Schocher 	    !is_power_of_2(ubi->max_write_size)) {
7160195a7bbSHeiko Schocher 		ubi_err(ubi, "bad write buffer size %d for %d min. I/O unit",
717ff94bc40SHeiko Schocher 			ubi->max_write_size, ubi->min_io_size);
718ff94bc40SHeiko Schocher 		return -EINVAL;
719ff94bc40SHeiko Schocher 	}
720ff94bc40SHeiko Schocher 
721f399d4a2SKyungmin Park 	/* Calculate default aligned sizes of EC and VID headers */
722f399d4a2SKyungmin Park 	ubi->ec_hdr_alsize = ALIGN(UBI_EC_HDR_SIZE, ubi->hdrs_min_io_size);
723f399d4a2SKyungmin Park 	ubi->vid_hdr_alsize = ALIGN(UBI_VID_HDR_SIZE, ubi->hdrs_min_io_size);
724f399d4a2SKyungmin Park 
725ff94bc40SHeiko Schocher 	dbg_gen("min_io_size      %d", ubi->min_io_size);
726ff94bc40SHeiko Schocher 	dbg_gen("max_write_size   %d", ubi->max_write_size);
727ff94bc40SHeiko Schocher 	dbg_gen("hdrs_min_io_size %d", ubi->hdrs_min_io_size);
728ff94bc40SHeiko Schocher 	dbg_gen("ec_hdr_alsize    %d", ubi->ec_hdr_alsize);
729ff94bc40SHeiko Schocher 	dbg_gen("vid_hdr_alsize   %d", ubi->vid_hdr_alsize);
730f399d4a2SKyungmin Park 
731f399d4a2SKyungmin Park 	if (ubi->vid_hdr_offset == 0)
732f399d4a2SKyungmin Park 		/* Default offset */
733f399d4a2SKyungmin Park 		ubi->vid_hdr_offset = ubi->vid_hdr_aloffset =
734f399d4a2SKyungmin Park 				      ubi->ec_hdr_alsize;
735f399d4a2SKyungmin Park 	else {
736f399d4a2SKyungmin Park 		ubi->vid_hdr_aloffset = ubi->vid_hdr_offset &
737f399d4a2SKyungmin Park 						~(ubi->hdrs_min_io_size - 1);
738f399d4a2SKyungmin Park 		ubi->vid_hdr_shift = ubi->vid_hdr_offset -
739f399d4a2SKyungmin Park 						ubi->vid_hdr_aloffset;
740f399d4a2SKyungmin Park 	}
741f399d4a2SKyungmin Park 
742f399d4a2SKyungmin Park 	/* Similar for the data offset */
743ff94bc40SHeiko Schocher 	ubi->leb_start = ubi->vid_hdr_offset + UBI_VID_HDR_SIZE;
744f399d4a2SKyungmin Park 	ubi->leb_start = ALIGN(ubi->leb_start, ubi->min_io_size);
745f399d4a2SKyungmin Park 
746ff94bc40SHeiko Schocher 	dbg_gen("vid_hdr_offset   %d", ubi->vid_hdr_offset);
747ff94bc40SHeiko Schocher 	dbg_gen("vid_hdr_aloffset %d", ubi->vid_hdr_aloffset);
748ff94bc40SHeiko Schocher 	dbg_gen("vid_hdr_shift    %d", ubi->vid_hdr_shift);
749ff94bc40SHeiko Schocher 	dbg_gen("leb_start        %d", ubi->leb_start);
750f399d4a2SKyungmin Park 
751f399d4a2SKyungmin Park 	/* The shift must be aligned to 32-bit boundary */
752f399d4a2SKyungmin Park 	if (ubi->vid_hdr_shift % 4) {
7530195a7bbSHeiko Schocher 		ubi_err(ubi, "unaligned VID header shift %d",
754f399d4a2SKyungmin Park 			ubi->vid_hdr_shift);
755f399d4a2SKyungmin Park 		return -EINVAL;
756f399d4a2SKyungmin Park 	}
757f399d4a2SKyungmin Park 
758f399d4a2SKyungmin Park 	/* Check sanity */
759f399d4a2SKyungmin Park 	if (ubi->vid_hdr_offset < UBI_EC_HDR_SIZE ||
760f399d4a2SKyungmin Park 	    ubi->leb_start < ubi->vid_hdr_offset + UBI_VID_HDR_SIZE ||
761f399d4a2SKyungmin Park 	    ubi->leb_start > ubi->peb_size - UBI_VID_HDR_SIZE ||
762f399d4a2SKyungmin Park 	    ubi->leb_start & (ubi->min_io_size - 1)) {
7630195a7bbSHeiko Schocher 		ubi_err(ubi, "bad VID header (%d) or data offsets (%d)",
764f399d4a2SKyungmin Park 			ubi->vid_hdr_offset, ubi->leb_start);
765f399d4a2SKyungmin Park 		return -EINVAL;
766f399d4a2SKyungmin Park 	}
767f399d4a2SKyungmin Park 
768f399d4a2SKyungmin Park 	/*
769ff94bc40SHeiko Schocher 	 * Set maximum amount of physical erroneous eraseblocks to be 10%.
770ff94bc40SHeiko Schocher 	 * Erroneous PEB are those which have read errors.
771ff94bc40SHeiko Schocher 	 */
772ff94bc40SHeiko Schocher 	ubi->max_erroneous = ubi->peb_count / 10;
773ff94bc40SHeiko Schocher 	if (ubi->max_erroneous < 16)
774ff94bc40SHeiko Schocher 		ubi->max_erroneous = 16;
775ff94bc40SHeiko Schocher 	dbg_gen("max_erroneous    %d", ubi->max_erroneous);
776ff94bc40SHeiko Schocher 
777ff94bc40SHeiko Schocher 	/*
778f399d4a2SKyungmin Park 	 * It may happen that EC and VID headers are situated in one minimal
779f399d4a2SKyungmin Park 	 * I/O unit. In this case we can only accept this UBI image in
780f399d4a2SKyungmin Park 	 * read-only mode.
781f399d4a2SKyungmin Park 	 */
782f399d4a2SKyungmin Park 	if (ubi->vid_hdr_offset + UBI_VID_HDR_SIZE <= ubi->hdrs_min_io_size) {
7830195a7bbSHeiko Schocher 		ubi_warn(ubi, "EC and VID headers are in the same minimal I/O unit, switch to read-only mode");
784f399d4a2SKyungmin Park 		ubi->ro_mode = 1;
785f399d4a2SKyungmin Park 	}
786f399d4a2SKyungmin Park 
787f399d4a2SKyungmin Park 	ubi->leb_size = ubi->peb_size - ubi->leb_start;
788f399d4a2SKyungmin Park 
789f399d4a2SKyungmin Park 	if (!(ubi->mtd->flags & MTD_WRITEABLE)) {
7900195a7bbSHeiko Schocher 		ubi_msg(ubi, "MTD device %d is write-protected, attach in read-only mode",
791ff94bc40SHeiko Schocher 			ubi->mtd->index);
792f399d4a2SKyungmin Park 		ubi->ro_mode = 1;
793f399d4a2SKyungmin Park 	}
794f399d4a2SKyungmin Park 
795f399d4a2SKyungmin Park 	/*
796ff94bc40SHeiko Schocher 	 * Note, ideally, we have to initialize @ubi->bad_peb_count here. But
797f399d4a2SKyungmin Park 	 * unfortunately, MTD does not provide this information. We should loop
798f399d4a2SKyungmin Park 	 * over all physical eraseblocks and invoke mtd->block_is_bad() for
799ff94bc40SHeiko Schocher 	 * each physical eraseblock. So, we leave @ubi->bad_peb_count
800ff94bc40SHeiko Schocher 	 * uninitialized so far.
801f399d4a2SKyungmin Park 	 */
802f399d4a2SKyungmin Park 
803f399d4a2SKyungmin Park 	return 0;
804f399d4a2SKyungmin Park }
805f399d4a2SKyungmin Park 
806f399d4a2SKyungmin Park /**
807f399d4a2SKyungmin Park  * autoresize - re-size the volume which has the "auto-resize" flag set.
808f399d4a2SKyungmin Park  * @ubi: UBI device description object
809f399d4a2SKyungmin Park  * @vol_id: ID of the volume to re-size
810f399d4a2SKyungmin Park  *
811ff94bc40SHeiko Schocher  * This function re-sizes the volume marked by the %UBI_VTBL_AUTORESIZE_FLG in
812f399d4a2SKyungmin Park  * the volume table to the largest possible size. See comments in ubi-header.h
813f399d4a2SKyungmin Park  * for more description of the flag. Returns zero in case of success and a
814f399d4a2SKyungmin Park  * negative error code in case of failure.
815f399d4a2SKyungmin Park  */
autoresize(struct ubi_device * ubi,int vol_id)816f399d4a2SKyungmin Park static int autoresize(struct ubi_device *ubi, int vol_id)
817f399d4a2SKyungmin Park {
818f399d4a2SKyungmin Park 	struct ubi_volume_desc desc;
819f399d4a2SKyungmin Park 	struct ubi_volume *vol = ubi->volumes[vol_id];
820f399d4a2SKyungmin Park 	int err, old_reserved_pebs = vol->reserved_pebs;
821f399d4a2SKyungmin Park 
822ff94bc40SHeiko Schocher 	if (ubi->ro_mode) {
8230195a7bbSHeiko Schocher 		ubi_warn(ubi, "skip auto-resize because of R/O mode");
824ff94bc40SHeiko Schocher 		return 0;
825ff94bc40SHeiko Schocher 	}
826ff94bc40SHeiko Schocher 
827f399d4a2SKyungmin Park 	/*
828f399d4a2SKyungmin Park 	 * Clear the auto-resize flag in the volume in-memory copy of the
829ff94bc40SHeiko Schocher 	 * volume table, and 'ubi_resize_volume()' will propagate this change
830f399d4a2SKyungmin Park 	 * to the flash.
831f399d4a2SKyungmin Park 	 */
832f399d4a2SKyungmin Park 	ubi->vtbl[vol_id].flags &= ~UBI_VTBL_AUTORESIZE_FLG;
833f399d4a2SKyungmin Park 
834f399d4a2SKyungmin Park 	if (ubi->avail_pebs == 0) {
835f399d4a2SKyungmin Park 		struct ubi_vtbl_record vtbl_rec;
836f399d4a2SKyungmin Park 
837f399d4a2SKyungmin Park 		/*
838ff94bc40SHeiko Schocher 		 * No available PEBs to re-size the volume, clear the flag on
839f399d4a2SKyungmin Park 		 * flash and exit.
840f399d4a2SKyungmin Park 		 */
841ff94bc40SHeiko Schocher 		vtbl_rec = ubi->vtbl[vol_id];
842f399d4a2SKyungmin Park 		err = ubi_change_vtbl_record(ubi, vol_id, &vtbl_rec);
843f399d4a2SKyungmin Park 		if (err)
8440195a7bbSHeiko Schocher 			ubi_err(ubi, "cannot clean auto-resize flag for volume %d",
845f399d4a2SKyungmin Park 				vol_id);
846f399d4a2SKyungmin Park 	} else {
847f399d4a2SKyungmin Park 		desc.vol = vol;
848f399d4a2SKyungmin Park 		err = ubi_resize_volume(&desc,
849f399d4a2SKyungmin Park 					old_reserved_pebs + ubi->avail_pebs);
850f399d4a2SKyungmin Park 		if (err)
8510195a7bbSHeiko Schocher 			ubi_err(ubi, "cannot auto-resize volume %d",
8520195a7bbSHeiko Schocher 				vol_id);
853f399d4a2SKyungmin Park 	}
854f399d4a2SKyungmin Park 
855f399d4a2SKyungmin Park 	if (err)
856f399d4a2SKyungmin Park 		return err;
857f399d4a2SKyungmin Park 
8580195a7bbSHeiko Schocher 	ubi_msg(ubi, "volume %d (\"%s\") re-sized from %d to %d LEBs",
8590195a7bbSHeiko Schocher 		vol_id, vol->name, old_reserved_pebs, vol->reserved_pebs);
860f399d4a2SKyungmin Park 	return 0;
861f399d4a2SKyungmin Park }
862f399d4a2SKyungmin Park 
863f399d4a2SKyungmin Park /**
864f399d4a2SKyungmin Park  * ubi_attach_mtd_dev - attach an MTD device.
865ff94bc40SHeiko Schocher  * @mtd: MTD device description object
866f399d4a2SKyungmin Park  * @ubi_num: number to assign to the new UBI device
867f399d4a2SKyungmin Park  * @vid_hdr_offset: VID header offset
868ff94bc40SHeiko Schocher  * @max_beb_per1024: maximum expected number of bad PEB per 1024 PEBs
869f399d4a2SKyungmin Park  *
870f399d4a2SKyungmin Park  * This function attaches MTD device @mtd_dev to UBI and assign @ubi_num number
871f399d4a2SKyungmin Park  * to the newly created UBI device, unless @ubi_num is %UBI_DEV_NUM_AUTO, in
872ff94bc40SHeiko Schocher  * which case this function finds a vacant device number and assigns it
873f399d4a2SKyungmin Park  * automatically. Returns the new UBI device number in case of success and a
874f399d4a2SKyungmin Park  * negative error code in case of failure.
875f399d4a2SKyungmin Park  *
876f399d4a2SKyungmin Park  * Note, the invocations of this function has to be serialized by the
877f399d4a2SKyungmin Park  * @ubi_devices_mutex.
878f399d4a2SKyungmin Park  */
ubi_attach_mtd_dev(struct mtd_info * mtd,int ubi_num,int vid_hdr_offset,int max_beb_per1024)879ff94bc40SHeiko Schocher int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
880ff94bc40SHeiko Schocher 		       int vid_hdr_offset, int max_beb_per1024)
881f399d4a2SKyungmin Park {
882f399d4a2SKyungmin Park 	struct ubi_device *ubi;
883ff94bc40SHeiko Schocher 	int i, err, ref = 0;
884ff94bc40SHeiko Schocher 
885ff94bc40SHeiko Schocher 	if (max_beb_per1024 < 0 || max_beb_per1024 > MAX_MTD_UBI_BEB_LIMIT)
886ff94bc40SHeiko Schocher 		return -EINVAL;
887ff94bc40SHeiko Schocher 
888ff94bc40SHeiko Schocher 	if (!max_beb_per1024)
889ff94bc40SHeiko Schocher 		max_beb_per1024 = CONFIG_MTD_UBI_BEB_LIMIT;
890f399d4a2SKyungmin Park 
891f399d4a2SKyungmin Park 	/*
892f399d4a2SKyungmin Park 	 * Check if we already have the same MTD device attached.
893f399d4a2SKyungmin Park 	 *
894f399d4a2SKyungmin Park 	 * Note, this function assumes that UBI devices creations and deletions
895f399d4a2SKyungmin Park 	 * are serialized, so it does not take the &ubi_devices_lock.
896f399d4a2SKyungmin Park 	 */
897f399d4a2SKyungmin Park 	for (i = 0; i < UBI_MAX_DEVICES; i++) {
898f399d4a2SKyungmin Park 		ubi = ubi_devices[i];
899f399d4a2SKyungmin Park 		if (ubi && mtd->index == ubi->mtd->index) {
9000195a7bbSHeiko Schocher 			ubi_err(ubi, "mtd%d is already attached to ubi%d",
901f399d4a2SKyungmin Park 				mtd->index, i);
902f399d4a2SKyungmin Park 			return -EEXIST;
903f399d4a2SKyungmin Park 		}
904f399d4a2SKyungmin Park 	}
905f399d4a2SKyungmin Park 
906f399d4a2SKyungmin Park 	/*
907f399d4a2SKyungmin Park 	 * Make sure this MTD device is not emulated on top of an UBI volume
908f399d4a2SKyungmin Park 	 * already. Well, generally this recursion works fine, but there are
909f399d4a2SKyungmin Park 	 * different problems like the UBI module takes a reference to itself
910f399d4a2SKyungmin Park 	 * by attaching (and thus, opening) the emulated MTD device. This
911f399d4a2SKyungmin Park 	 * results in inability to unload the module. And in general it makes
912f399d4a2SKyungmin Park 	 * no sense to attach emulated MTD devices, so we prohibit this.
913f399d4a2SKyungmin Park 	 */
914f399d4a2SKyungmin Park 	if (mtd->type == MTD_UBIVOLUME) {
9150195a7bbSHeiko Schocher 		ubi_err(ubi, "refuse attaching mtd%d - it is already emulated on top of UBI",
916ff94bc40SHeiko Schocher 			mtd->index);
917f399d4a2SKyungmin Park 		return -EINVAL;
918f399d4a2SKyungmin Park 	}
919f399d4a2SKyungmin Park 
920f399d4a2SKyungmin Park 	if (ubi_num == UBI_DEV_NUM_AUTO) {
921f399d4a2SKyungmin Park 		/* Search for an empty slot in the @ubi_devices array */
922f399d4a2SKyungmin Park 		for (ubi_num = 0; ubi_num < UBI_MAX_DEVICES; ubi_num++)
923f399d4a2SKyungmin Park 			if (!ubi_devices[ubi_num])
924f399d4a2SKyungmin Park 				break;
925f399d4a2SKyungmin Park 		if (ubi_num == UBI_MAX_DEVICES) {
9260195a7bbSHeiko Schocher 			ubi_err(ubi, "only %d UBI devices may be created",
927ff94bc40SHeiko Schocher 				UBI_MAX_DEVICES);
928f399d4a2SKyungmin Park 			return -ENFILE;
929f399d4a2SKyungmin Park 		}
930f399d4a2SKyungmin Park 	} else {
931f399d4a2SKyungmin Park 		if (ubi_num >= UBI_MAX_DEVICES)
932f399d4a2SKyungmin Park 			return -EINVAL;
933f399d4a2SKyungmin Park 
934f399d4a2SKyungmin Park 		/* Make sure ubi_num is not busy */
935f399d4a2SKyungmin Park 		if (ubi_devices[ubi_num]) {
9360195a7bbSHeiko Schocher 			ubi_err(ubi, "already exists");
937f399d4a2SKyungmin Park 			return -EEXIST;
938f399d4a2SKyungmin Park 		}
939f399d4a2SKyungmin Park 	}
940f399d4a2SKyungmin Park 
941f399d4a2SKyungmin Park 	ubi = kzalloc(sizeof(struct ubi_device), GFP_KERNEL);
942f399d4a2SKyungmin Park 	if (!ubi)
943f399d4a2SKyungmin Park 		return -ENOMEM;
944f399d4a2SKyungmin Park 
945f399d4a2SKyungmin Park 	ubi->mtd = mtd;
946f399d4a2SKyungmin Park 	ubi->ubi_num = ubi_num;
947f399d4a2SKyungmin Park 	ubi->vid_hdr_offset = vid_hdr_offset;
948f399d4a2SKyungmin Park 	ubi->autoresize_vol_id = -1;
949f399d4a2SKyungmin Park 
950ff94bc40SHeiko Schocher #ifdef CONFIG_MTD_UBI_FASTMAP
951ff94bc40SHeiko Schocher 	ubi->fm_pool.used = ubi->fm_pool.size = 0;
952ff94bc40SHeiko Schocher 	ubi->fm_wl_pool.used = ubi->fm_wl_pool.size = 0;
953ff94bc40SHeiko Schocher 
954ff94bc40SHeiko Schocher 	/*
955ff94bc40SHeiko Schocher 	 * fm_pool.max_size is 5% of the total number of PEBs but it's also
956ff94bc40SHeiko Schocher 	 * between UBI_FM_MAX_POOL_SIZE and UBI_FM_MIN_POOL_SIZE.
957ff94bc40SHeiko Schocher 	 */
958ff94bc40SHeiko Schocher 	ubi->fm_pool.max_size = min(((int)mtd_div_by_eb(ubi->mtd->size,
959ff94bc40SHeiko Schocher 		ubi->mtd) / 100) * 5, UBI_FM_MAX_POOL_SIZE);
9600195a7bbSHeiko Schocher 	ubi->fm_pool.max_size = max(ubi->fm_pool.max_size,
9610195a7bbSHeiko Schocher 		UBI_FM_MIN_POOL_SIZE);
962ff94bc40SHeiko Schocher 
9630195a7bbSHeiko Schocher 	ubi->fm_wl_pool.max_size = ubi->fm_pool.max_size / 2;
964ff94bc40SHeiko Schocher 	ubi->fm_disabled = !fm_autoconvert;
9650195a7bbSHeiko Schocher 	if (fm_debug)
9660195a7bbSHeiko Schocher 		ubi_enable_dbg_chk_fastmap(ubi);
967ff94bc40SHeiko Schocher 
968ff94bc40SHeiko Schocher 	if (!ubi->fm_disabled && (int)mtd_div_by_eb(ubi->mtd->size, ubi->mtd)
969ff94bc40SHeiko Schocher 	    <= UBI_FM_MAX_START) {
9700195a7bbSHeiko Schocher 		ubi_err(ubi, "More than %i PEBs are needed for fastmap, sorry.",
971ff94bc40SHeiko Schocher 			UBI_FM_MAX_START);
972ff94bc40SHeiko Schocher 		ubi->fm_disabled = 1;
973ff94bc40SHeiko Schocher 	}
974ff94bc40SHeiko Schocher 
9750195a7bbSHeiko Schocher 	ubi_msg(ubi, "default fastmap pool size: %d", ubi->fm_pool.max_size);
9760195a7bbSHeiko Schocher 	ubi_msg(ubi, "default fastmap WL pool size: %d",
9770195a7bbSHeiko Schocher 		ubi->fm_wl_pool.max_size);
978ff94bc40SHeiko Schocher #else
979ff94bc40SHeiko Schocher 	ubi->fm_disabled = 1;
980ff94bc40SHeiko Schocher #endif
981f399d4a2SKyungmin Park 	mutex_init(&ubi->buf_mutex);
982f399d4a2SKyungmin Park 	mutex_init(&ubi->ckvol_mutex);
983ff94bc40SHeiko Schocher 	mutex_init(&ubi->device_mutex);
984f399d4a2SKyungmin Park 	spin_lock_init(&ubi->volumes_lock);
9850195a7bbSHeiko Schocher 	init_rwsem(&ubi->fm_protect);
9860195a7bbSHeiko Schocher 	init_rwsem(&ubi->fm_eba_sem);
987f399d4a2SKyungmin Park 
9880195a7bbSHeiko Schocher 	ubi_msg(ubi, "attaching mtd%d", mtd->index);
989f399d4a2SKyungmin Park 
990ff94bc40SHeiko Schocher 	err = io_init(ubi, max_beb_per1024);
991f399d4a2SKyungmin Park 	if (err)
992f399d4a2SKyungmin Park 		goto out_free;
993f399d4a2SKyungmin Park 
99481732935SStefan Roese 	err = -ENOMEM;
995ff94bc40SHeiko Schocher 	ubi->peb_buf = vmalloc(ubi->peb_size);
996ff94bc40SHeiko Schocher 	if (!ubi->peb_buf)
997f399d4a2SKyungmin Park 		goto out_free;
998f399d4a2SKyungmin Park 
999ff94bc40SHeiko Schocher #ifdef CONFIG_MTD_UBI_FASTMAP
1000ff94bc40SHeiko Schocher 	ubi->fm_size = ubi_calc_fm_size(ubi);
1001ff94bc40SHeiko Schocher 	ubi->fm_buf = vzalloc(ubi->fm_size);
1002ff94bc40SHeiko Schocher 	if (!ubi->fm_buf)
1003f399d4a2SKyungmin Park 		goto out_free;
1004f399d4a2SKyungmin Park #endif
1005ff94bc40SHeiko Schocher 	err = ubi_attach(ubi, 0);
1006f399d4a2SKyungmin Park 	if (err) {
10070195a7bbSHeiko Schocher 		ubi_err(ubi, "failed to attach mtd%d, error %d",
10080195a7bbSHeiko Schocher 			mtd->index, err);
1009f399d4a2SKyungmin Park 		goto out_free;
1010f399d4a2SKyungmin Park 	}
1011f399d4a2SKyungmin Park 
1012f399d4a2SKyungmin Park 	if (ubi->autoresize_vol_id != -1) {
1013f399d4a2SKyungmin Park 		err = autoresize(ubi, ubi->autoresize_vol_id);
1014f399d4a2SKyungmin Park 		if (err)
1015f399d4a2SKyungmin Park 			goto out_detach;
1016f399d4a2SKyungmin Park 	}
1017f399d4a2SKyungmin Park 
1018ff94bc40SHeiko Schocher 	err = uif_init(ubi, &ref);
1019f399d4a2SKyungmin Park 	if (err)
1020f399d4a2SKyungmin Park 		goto out_detach;
1021f399d4a2SKyungmin Park 
1022ff94bc40SHeiko Schocher 	err = ubi_debugfs_init_dev(ubi);
1023ff94bc40SHeiko Schocher 	if (err)
1024ff94bc40SHeiko Schocher 		goto out_uif;
1025ff94bc40SHeiko Schocher 
1026ff94bc40SHeiko Schocher 	ubi->bgt_thread = kthread_create(ubi_thread, ubi, "%s", ubi->bgt_name);
1027f399d4a2SKyungmin Park 	if (IS_ERR(ubi->bgt_thread)) {
1028f399d4a2SKyungmin Park 		err = PTR_ERR(ubi->bgt_thread);
10290195a7bbSHeiko Schocher 		ubi_err(ubi, "cannot spawn \"%s\", error %d",
10300195a7bbSHeiko Schocher 			ubi->bgt_name, err);
1031ff94bc40SHeiko Schocher 		goto out_debugfs;
1032f399d4a2SKyungmin Park 	}
1033f399d4a2SKyungmin Park 
10340195a7bbSHeiko Schocher 	ubi_msg(ubi, "attached mtd%d (name \"%s\", size %llu MiB)",
10350195a7bbSHeiko Schocher 		mtd->index, mtd->name, ubi->flash_size >> 20);
10360195a7bbSHeiko Schocher 	ubi_msg(ubi, "PEB size: %d bytes (%d KiB), LEB size: %d bytes",
1037ff94bc40SHeiko Schocher 		ubi->peb_size, ubi->peb_size >> 10, ubi->leb_size);
10380195a7bbSHeiko Schocher 	ubi_msg(ubi, "min./max. I/O unit sizes: %d/%d, sub-page size %d",
1039ff94bc40SHeiko Schocher 		ubi->min_io_size, ubi->max_write_size, ubi->hdrs_min_io_size);
10400195a7bbSHeiko Schocher 	ubi_msg(ubi, "VID header offset: %d (aligned %d), data offset: %d",
1041ff94bc40SHeiko Schocher 		ubi->vid_hdr_offset, ubi->vid_hdr_aloffset, ubi->leb_start);
10420195a7bbSHeiko Schocher 	ubi_msg(ubi, "good PEBs: %d, bad PEBs: %d, corrupted PEBs: %d",
1043ff94bc40SHeiko Schocher 		ubi->good_peb_count, ubi->bad_peb_count, ubi->corr_peb_count);
10440195a7bbSHeiko Schocher 	ubi_msg(ubi, "user volume: %d, internal volumes: %d, max. volumes count: %d",
1045ff94bc40SHeiko Schocher 		ubi->vol_count - UBI_INT_VOL_COUNT, UBI_INT_VOL_COUNT,
1046ff94bc40SHeiko Schocher 		ubi->vtbl_slots);
10470195a7bbSHeiko Schocher 	ubi_msg(ubi, "max/mean erase counter: %d/%d, WL threshold: %d, image sequence number: %u",
1048ff94bc40SHeiko Schocher 		ubi->max_ec, ubi->mean_ec, CONFIG_MTD_UBI_WL_THRESHOLD,
1049ff94bc40SHeiko Schocher 		ubi->image_seq);
10500195a7bbSHeiko Schocher 	ubi_msg(ubi, "available PEBs: %d, total reserved PEBs: %d, PEBs reserved for bad PEB handling: %d",
1051ff94bc40SHeiko Schocher 		ubi->avail_pebs, ubi->rsvd_pebs, ubi->beb_rsvd_pebs);
1052f399d4a2SKyungmin Park 
1053ff94bc40SHeiko Schocher 	/*
1054ff94bc40SHeiko Schocher 	 * The below lock makes sure we do not race with 'ubi_thread()' which
1055ff94bc40SHeiko Schocher 	 * checks @ubi->thread_enabled. Otherwise we may fail to wake it up.
1056ff94bc40SHeiko Schocher 	 */
1057ff94bc40SHeiko Schocher 	spin_lock(&ubi->wl_lock);
1058f399d4a2SKyungmin Park 	ubi->thread_enabled = 1;
10590195a7bbSHeiko Schocher #ifndef __UBOOT__
1060f399d4a2SKyungmin Park 	wake_up_process(ubi->bgt_thread);
10610195a7bbSHeiko Schocher #else
1062f82290afSRichard Weinberger 	ubi_do_worker(ubi);
10630195a7bbSHeiko Schocher #endif
10640195a7bbSHeiko Schocher 
1065ff94bc40SHeiko Schocher 	spin_unlock(&ubi->wl_lock);
1066f399d4a2SKyungmin Park 
1067f399d4a2SKyungmin Park 	ubi_devices[ubi_num] = ubi;
1068ff94bc40SHeiko Schocher 	ubi_notify_all(ubi, UBI_VOLUME_ADDED, NULL);
1069f399d4a2SKyungmin Park 	return ubi_num;
1070f399d4a2SKyungmin Park 
1071ff94bc40SHeiko Schocher out_debugfs:
1072ff94bc40SHeiko Schocher 	ubi_debugfs_exit_dev(ubi);
1073f399d4a2SKyungmin Park out_uif:
1074ff94bc40SHeiko Schocher 	get_device(&ubi->dev);
1075ff94bc40SHeiko Schocher 	ubi_assert(ref);
1076f399d4a2SKyungmin Park 	uif_close(ubi);
1077f399d4a2SKyungmin Park out_detach:
1078f399d4a2SKyungmin Park 	ubi_wl_close(ubi);
1079ff94bc40SHeiko Schocher 	ubi_free_internal_volumes(ubi);
1080f399d4a2SKyungmin Park 	vfree(ubi->vtbl);
1081f399d4a2SKyungmin Park out_free:
1082ff94bc40SHeiko Schocher 	vfree(ubi->peb_buf);
1083ff94bc40SHeiko Schocher 	vfree(ubi->fm_buf);
1084ff94bc40SHeiko Schocher 	if (ref)
1085ff94bc40SHeiko Schocher 		put_device(&ubi->dev);
1086ff94bc40SHeiko Schocher 	else
1087f399d4a2SKyungmin Park 		kfree(ubi);
1088f399d4a2SKyungmin Park 	return err;
1089f399d4a2SKyungmin Park }
1090f399d4a2SKyungmin Park 
1091f399d4a2SKyungmin Park /**
1092f399d4a2SKyungmin Park  * ubi_detach_mtd_dev - detach an MTD device.
1093f399d4a2SKyungmin Park  * @ubi_num: UBI device number to detach from
1094f399d4a2SKyungmin Park  * @anyway: detach MTD even if device reference count is not zero
1095f399d4a2SKyungmin Park  *
1096f399d4a2SKyungmin Park  * This function destroys an UBI device number @ubi_num and detaches the
1097f399d4a2SKyungmin Park  * underlying MTD device. Returns zero in case of success and %-EBUSY if the
1098f399d4a2SKyungmin Park  * UBI device is busy and cannot be destroyed, and %-EINVAL if it does not
1099f399d4a2SKyungmin Park  * exist.
1100f399d4a2SKyungmin Park  *
1101f399d4a2SKyungmin Park  * Note, the invocations of this function has to be serialized by the
1102f399d4a2SKyungmin Park  * @ubi_devices_mutex.
1103f399d4a2SKyungmin Park  */
ubi_detach_mtd_dev(int ubi_num,int anyway)1104f399d4a2SKyungmin Park int ubi_detach_mtd_dev(int ubi_num, int anyway)
1105f399d4a2SKyungmin Park {
1106f399d4a2SKyungmin Park 	struct ubi_device *ubi;
1107f399d4a2SKyungmin Park 
1108f399d4a2SKyungmin Park 	if (ubi_num < 0 || ubi_num >= UBI_MAX_DEVICES)
1109f399d4a2SKyungmin Park 		return -EINVAL;
1110f399d4a2SKyungmin Park 
1111ff94bc40SHeiko Schocher 	ubi = ubi_get_device(ubi_num);
1112ff94bc40SHeiko Schocher 	if (!ubi)
1113f399d4a2SKyungmin Park 		return -EINVAL;
1114f399d4a2SKyungmin Park 
1115ff94bc40SHeiko Schocher 	spin_lock(&ubi_devices_lock);
1116ff94bc40SHeiko Schocher 	put_device(&ubi->dev);
1117ff94bc40SHeiko Schocher 	ubi->ref_count -= 1;
1118f399d4a2SKyungmin Park 	if (ubi->ref_count) {
1119f399d4a2SKyungmin Park 		if (!anyway) {
1120f399d4a2SKyungmin Park 			spin_unlock(&ubi_devices_lock);
1121f399d4a2SKyungmin Park 			return -EBUSY;
1122f399d4a2SKyungmin Park 		}
1123f399d4a2SKyungmin Park 		/* This may only happen if there is a bug */
11240195a7bbSHeiko Schocher 		ubi_err(ubi, "%s reference count %d, destroy anyway",
1125f399d4a2SKyungmin Park 			ubi->ubi_name, ubi->ref_count);
1126f399d4a2SKyungmin Park 	}
1127f399d4a2SKyungmin Park 	ubi_devices[ubi_num] = NULL;
1128f399d4a2SKyungmin Park 	spin_unlock(&ubi_devices_lock);
1129f399d4a2SKyungmin Park 
1130f399d4a2SKyungmin Park 	ubi_assert(ubi_num == ubi->ubi_num);
1131ff94bc40SHeiko Schocher 	ubi_notify_all(ubi, UBI_VOLUME_REMOVED, NULL);
11320195a7bbSHeiko Schocher 	ubi_msg(ubi, "detaching mtd%d", ubi->mtd->index);
1133ff94bc40SHeiko Schocher #ifdef CONFIG_MTD_UBI_FASTMAP
1134ff94bc40SHeiko Schocher 	/* If we don't write a new fastmap at detach time we lose all
11350195a7bbSHeiko Schocher 	 * EC updates that have been made since the last written fastmap.
11360195a7bbSHeiko Schocher 	 * In case of fastmap debugging we omit the update to simulate an
11370195a7bbSHeiko Schocher 	 * unclean shutdown. */
11380195a7bbSHeiko Schocher 	if (!ubi_dbg_chk_fastmap(ubi))
1139ff94bc40SHeiko Schocher 		ubi_update_fastmap(ubi);
1140ff94bc40SHeiko Schocher #endif
1141f399d4a2SKyungmin Park 	/*
1142f399d4a2SKyungmin Park 	 * Before freeing anything, we have to stop the background thread to
1143f399d4a2SKyungmin Park 	 * prevent it from doing anything on this device while we are freeing.
1144f399d4a2SKyungmin Park 	 */
1145f399d4a2SKyungmin Park 	if (ubi->bgt_thread)
1146f399d4a2SKyungmin Park 		kthread_stop(ubi->bgt_thread);
1147f399d4a2SKyungmin Park 
1148ff94bc40SHeiko Schocher 	/*
1149ff94bc40SHeiko Schocher 	 * Get a reference to the device in order to prevent 'dev_release()'
1150ff94bc40SHeiko Schocher 	 * from freeing the @ubi object.
1151ff94bc40SHeiko Schocher 	 */
1152ff94bc40SHeiko Schocher 	get_device(&ubi->dev);
1153ff94bc40SHeiko Schocher 
1154ff94bc40SHeiko Schocher 	ubi_debugfs_exit_dev(ubi);
1155f399d4a2SKyungmin Park 	uif_close(ubi);
1156ff94bc40SHeiko Schocher 
1157f399d4a2SKyungmin Park 	ubi_wl_close(ubi);
1158ff94bc40SHeiko Schocher 	ubi_free_internal_volumes(ubi);
1159f399d4a2SKyungmin Park 	vfree(ubi->vtbl);
1160f399d4a2SKyungmin Park 	put_mtd_device(ubi->mtd);
1161ff94bc40SHeiko Schocher 	vfree(ubi->peb_buf);
1162ff94bc40SHeiko Schocher 	vfree(ubi->fm_buf);
11630195a7bbSHeiko Schocher 	ubi_msg(ubi, "mtd%d is detached", ubi->mtd->index);
1164ff94bc40SHeiko Schocher 	put_device(&ubi->dev);
1165f399d4a2SKyungmin Park 	return 0;
1166f399d4a2SKyungmin Park }
1167f399d4a2SKyungmin Park 
1168ff94bc40SHeiko Schocher #ifndef __UBOOT__
1169f399d4a2SKyungmin Park /**
1170ff94bc40SHeiko Schocher  * open_mtd_by_chdev - open an MTD device by its character device node path.
1171ff94bc40SHeiko Schocher  * @mtd_dev: MTD character device node path
1172ff94bc40SHeiko Schocher  *
1173ff94bc40SHeiko Schocher  * This helper function opens an MTD device by its character node device path.
1174ff94bc40SHeiko Schocher  * Returns MTD device description object in case of success and a negative
1175ff94bc40SHeiko Schocher  * error code in case of failure.
1176ff94bc40SHeiko Schocher  */
open_mtd_by_chdev(const char * mtd_dev)1177ff94bc40SHeiko Schocher static struct mtd_info * __init open_mtd_by_chdev(const char *mtd_dev)
1178ff94bc40SHeiko Schocher {
1179ff94bc40SHeiko Schocher 	int err, major, minor, mode;
1180ff94bc40SHeiko Schocher 	struct path path;
1181ff94bc40SHeiko Schocher 
1182ff94bc40SHeiko Schocher 	/* Probably this is an MTD character device node path */
1183ff94bc40SHeiko Schocher 	err = kern_path(mtd_dev, LOOKUP_FOLLOW, &path);
1184ff94bc40SHeiko Schocher 	if (err)
1185ff94bc40SHeiko Schocher 		return ERR_PTR(err);
1186ff94bc40SHeiko Schocher 
1187ff94bc40SHeiko Schocher 	/* MTD device number is defined by the major / minor numbers */
11880195a7bbSHeiko Schocher 	major = imajor(d_backing_inode(path.dentry));
11890195a7bbSHeiko Schocher 	minor = iminor(d_backing_inode(path.dentry));
11900195a7bbSHeiko Schocher 	mode = d_backing_inode(path.dentry)->i_mode;
1191ff94bc40SHeiko Schocher 	path_put(&path);
1192ff94bc40SHeiko Schocher 	if (major != MTD_CHAR_MAJOR || !S_ISCHR(mode))
1193ff94bc40SHeiko Schocher 		return ERR_PTR(-EINVAL);
1194ff94bc40SHeiko Schocher 
1195ff94bc40SHeiko Schocher 	if (minor & 1)
1196ff94bc40SHeiko Schocher 		/*
1197ff94bc40SHeiko Schocher 		 * Just do not think the "/dev/mtdrX" devices support is need,
1198ff94bc40SHeiko Schocher 		 * so do not support them to avoid doing extra work.
1199ff94bc40SHeiko Schocher 		 */
1200ff94bc40SHeiko Schocher 		return ERR_PTR(-EINVAL);
1201ff94bc40SHeiko Schocher 
1202ff94bc40SHeiko Schocher 	return get_mtd_device(NULL, minor / 2);
1203ff94bc40SHeiko Schocher }
1204ff94bc40SHeiko Schocher #endif
1205ff94bc40SHeiko Schocher 
1206ff94bc40SHeiko Schocher /**
1207ff94bc40SHeiko Schocher  * open_mtd_device - open MTD device by name, character device path, or number.
1208ff94bc40SHeiko Schocher  * @mtd_dev: name, character device node path, or MTD device device number
1209f399d4a2SKyungmin Park  *
1210f399d4a2SKyungmin Park  * This function tries to open and MTD device described by @mtd_dev string,
1211ff94bc40SHeiko Schocher  * which is first treated as ASCII MTD device number, and if it is not true, it
1212ff94bc40SHeiko Schocher  * is treated as MTD device name, and if that is also not true, it is treated
1213ff94bc40SHeiko Schocher  * as MTD character device node path. Returns MTD device description object in
1214ff94bc40SHeiko Schocher  * case of success and a negative error code in case of failure.
1215f399d4a2SKyungmin Park  */
open_mtd_device(const char * mtd_dev)1216f399d4a2SKyungmin Park static struct mtd_info * __init open_mtd_device(const char *mtd_dev)
1217f399d4a2SKyungmin Park {
1218f399d4a2SKyungmin Park 	struct mtd_info *mtd;
1219f399d4a2SKyungmin Park 	int mtd_num;
1220f399d4a2SKyungmin Park 	char *endp;
1221f399d4a2SKyungmin Park 
1222f399d4a2SKyungmin Park 	mtd_num = simple_strtoul(mtd_dev, &endp, 0);
1223f399d4a2SKyungmin Park 	if (*endp != '\0' || mtd_dev == endp) {
1224f399d4a2SKyungmin Park 		/*
1225f399d4a2SKyungmin Park 		 * This does not look like an ASCII integer, probably this is
1226f399d4a2SKyungmin Park 		 * MTD device name.
1227f399d4a2SKyungmin Park 		 */
1228f399d4a2SKyungmin Park 		mtd = get_mtd_device_nm(mtd_dev);
1229ff94bc40SHeiko Schocher #ifndef __UBOOT__
1230ff94bc40SHeiko Schocher 		if (IS_ERR(mtd) && PTR_ERR(mtd) == -ENODEV)
1231ff94bc40SHeiko Schocher 			/* Probably this is an MTD character device node path */
1232ff94bc40SHeiko Schocher 			mtd = open_mtd_by_chdev(mtd_dev);
1233ff94bc40SHeiko Schocher #endif
1234f399d4a2SKyungmin Park 	} else
1235f399d4a2SKyungmin Park 		mtd = get_mtd_device(NULL, mtd_num);
1236f399d4a2SKyungmin Park 
1237f399d4a2SKyungmin Park 	return mtd;
1238f399d4a2SKyungmin Park }
1239f399d4a2SKyungmin Park 
1240ff94bc40SHeiko Schocher #ifndef __UBOOT__
ubi_init(void)1241ff94bc40SHeiko Schocher static int __init ubi_init(void)
1242ff94bc40SHeiko Schocher #else
1243ff94bc40SHeiko Schocher int ubi_init(void)
1244ff94bc40SHeiko Schocher #endif
1245f399d4a2SKyungmin Park {
1246f399d4a2SKyungmin Park 	int err, i, k;
1247f399d4a2SKyungmin Park 
1248f399d4a2SKyungmin Park 	/* Ensure that EC and VID headers have correct size */
1249f399d4a2SKyungmin Park 	BUILD_BUG_ON(sizeof(struct ubi_ec_hdr) != 64);
1250f399d4a2SKyungmin Park 	BUILD_BUG_ON(sizeof(struct ubi_vid_hdr) != 64);
1251f399d4a2SKyungmin Park 
1252f399d4a2SKyungmin Park 	if (mtd_devs > UBI_MAX_DEVICES) {
1253*78306cbaSStefan Roese 		pr_err("UBI error: too many MTD devices, maximum is %d\n",
12540195a7bbSHeiko Schocher 		       UBI_MAX_DEVICES);
1255f399d4a2SKyungmin Park 		return -EINVAL;
1256f399d4a2SKyungmin Park 	}
1257f399d4a2SKyungmin Park 
1258f399d4a2SKyungmin Park 	/* Create base sysfs directory and sysfs files */
12590195a7bbSHeiko Schocher 	err = class_register(&ubi_class);
12600195a7bbSHeiko Schocher 	if (err < 0)
12610195a7bbSHeiko Schocher 		return err;
1262f399d4a2SKyungmin Park 
1263f399d4a2SKyungmin Park 	err = misc_register(&ubi_ctrl_cdev);
1264f399d4a2SKyungmin Park 	if (err) {
1265*78306cbaSStefan Roese 		pr_err("UBI error: cannot register device\n");
12660195a7bbSHeiko Schocher 		goto out;
1267f399d4a2SKyungmin Park 	}
1268f399d4a2SKyungmin Park 
1269f399d4a2SKyungmin Park 	ubi_wl_entry_slab = kmem_cache_create("ubi_wl_entry_slab",
1270f399d4a2SKyungmin Park 					      sizeof(struct ubi_wl_entry),
1271f399d4a2SKyungmin Park 					      0, 0, NULL);
1272ff94bc40SHeiko Schocher 	if (!ubi_wl_entry_slab) {
1273ff94bc40SHeiko Schocher 		err = -ENOMEM;
1274f399d4a2SKyungmin Park 		goto out_dev_unreg;
1275ff94bc40SHeiko Schocher 	}
1276ff94bc40SHeiko Schocher 
1277ff94bc40SHeiko Schocher 	err = ubi_debugfs_init();
1278ff94bc40SHeiko Schocher 	if (err)
1279ff94bc40SHeiko Schocher 		goto out_slab;
1280ff94bc40SHeiko Schocher 
1281f399d4a2SKyungmin Park 
1282f399d4a2SKyungmin Park 	/* Attach MTD devices */
1283f399d4a2SKyungmin Park 	for (i = 0; i < mtd_devs; i++) {
1284f399d4a2SKyungmin Park 		struct mtd_dev_param *p = &mtd_dev_param[i];
1285f399d4a2SKyungmin Park 		struct mtd_info *mtd;
1286f399d4a2SKyungmin Park 
1287f399d4a2SKyungmin Park 		cond_resched();
1288f399d4a2SKyungmin Park 
1289f399d4a2SKyungmin Park 		mtd = open_mtd_device(p->name);
1290f399d4a2SKyungmin Park 		if (IS_ERR(mtd)) {
1291f399d4a2SKyungmin Park 			err = PTR_ERR(mtd);
1292*78306cbaSStefan Roese 			pr_err("UBI error: cannot open mtd %s, error %d\n",
12930195a7bbSHeiko Schocher 			       p->name, err);
1294ff94bc40SHeiko Schocher 			/* See comment below re-ubi_is_module(). */
1295ff94bc40SHeiko Schocher 			if (ubi_is_module())
1296f399d4a2SKyungmin Park 				goto out_detach;
1297ff94bc40SHeiko Schocher 			continue;
1298f399d4a2SKyungmin Park 		}
1299f399d4a2SKyungmin Park 
1300f399d4a2SKyungmin Park 		mutex_lock(&ubi_devices_mutex);
1301ff94bc40SHeiko Schocher 		err = ubi_attach_mtd_dev(mtd, p->ubi_num,
1302ff94bc40SHeiko Schocher 					 p->vid_hdr_offs, p->max_beb_per1024);
1303f399d4a2SKyungmin Park 		mutex_unlock(&ubi_devices_mutex);
1304f399d4a2SKyungmin Park 		if (err < 0) {
1305*78306cbaSStefan Roese 			pr_err("UBI error: cannot attach mtd%d\n",
13060195a7bbSHeiko Schocher 			       mtd->index);
1307ff94bc40SHeiko Schocher 			put_mtd_device(mtd);
1308ff94bc40SHeiko Schocher 
1309ff94bc40SHeiko Schocher 			/*
1310ff94bc40SHeiko Schocher 			 * Originally UBI stopped initializing on any error.
1311ff94bc40SHeiko Schocher 			 * However, later on it was found out that this
1312ff94bc40SHeiko Schocher 			 * behavior is not very good when UBI is compiled into
1313ff94bc40SHeiko Schocher 			 * the kernel and the MTD devices to attach are passed
1314ff94bc40SHeiko Schocher 			 * through the command line. Indeed, UBI failure
1315ff94bc40SHeiko Schocher 			 * stopped whole boot sequence.
1316ff94bc40SHeiko Schocher 			 *
1317ff94bc40SHeiko Schocher 			 * To fix this, we changed the behavior for the
1318ff94bc40SHeiko Schocher 			 * non-module case, but preserved the old behavior for
1319ff94bc40SHeiko Schocher 			 * the module case, just for compatibility. This is a
1320ff94bc40SHeiko Schocher 			 * little inconsistent, though.
1321ff94bc40SHeiko Schocher 			 */
1322ff94bc40SHeiko Schocher 			if (ubi_is_module())
1323f399d4a2SKyungmin Park 				goto out_detach;
1324f399d4a2SKyungmin Park 		}
1325f399d4a2SKyungmin Park 	}
1326f399d4a2SKyungmin Park 
13274e67c571SHeiko Schocher 	err = ubiblock_init();
13284e67c571SHeiko Schocher 	if (err) {
1329*78306cbaSStefan Roese 		pr_err("UBI error: block: cannot initialize, error %d\n", err);
13304e67c571SHeiko Schocher 
13314e67c571SHeiko Schocher 		/* See comment above re-ubi_is_module(). */
13324e67c571SHeiko Schocher 		if (ubi_is_module())
13334e67c571SHeiko Schocher 			goto out_detach;
13344e67c571SHeiko Schocher 	}
13354e67c571SHeiko Schocher 
1336f399d4a2SKyungmin Park 	return 0;
1337f399d4a2SKyungmin Park 
1338f399d4a2SKyungmin Park out_detach:
1339f399d4a2SKyungmin Park 	for (k = 0; k < i; k++)
1340f399d4a2SKyungmin Park 		if (ubi_devices[k]) {
1341f399d4a2SKyungmin Park 			mutex_lock(&ubi_devices_mutex);
1342f399d4a2SKyungmin Park 			ubi_detach_mtd_dev(ubi_devices[k]->ubi_num, 1);
1343f399d4a2SKyungmin Park 			mutex_unlock(&ubi_devices_mutex);
1344f399d4a2SKyungmin Park 		}
1345ff94bc40SHeiko Schocher 	ubi_debugfs_exit();
1346ff94bc40SHeiko Schocher out_slab:
1347f399d4a2SKyungmin Park 	kmem_cache_destroy(ubi_wl_entry_slab);
1348f399d4a2SKyungmin Park out_dev_unreg:
1349f399d4a2SKyungmin Park 	misc_deregister(&ubi_ctrl_cdev);
1350f399d4a2SKyungmin Park out:
135140da2a2aSHeiko Schocher #ifdef __UBOOT__
135240da2a2aSHeiko Schocher 	/* Reset any globals that the driver depends on being zeroed */
135340da2a2aSHeiko Schocher 	mtd_devs = 0;
135440da2a2aSHeiko Schocher #endif
13550195a7bbSHeiko Schocher 	class_unregister(&ubi_class);
1356*78306cbaSStefan Roese 	pr_err("UBI error: cannot initialize UBI, error %d\n", err);
1357f399d4a2SKyungmin Park 	return err;
1358f399d4a2SKyungmin Park }
1359ff94bc40SHeiko Schocher late_initcall(ubi_init);
1360f399d4a2SKyungmin Park 
1361ff94bc40SHeiko Schocher #ifndef __UBOOT__
ubi_exit(void)1362ff94bc40SHeiko Schocher static void __exit ubi_exit(void)
1363ff94bc40SHeiko Schocher #else
1364ff94bc40SHeiko Schocher void ubi_exit(void)
1365ff94bc40SHeiko Schocher #endif
1366f399d4a2SKyungmin Park {
1367f399d4a2SKyungmin Park 	int i;
1368f399d4a2SKyungmin Park 
13694e67c571SHeiko Schocher 	ubiblock_exit();
13704e67c571SHeiko Schocher 
1371f399d4a2SKyungmin Park 	for (i = 0; i < UBI_MAX_DEVICES; i++)
1372f399d4a2SKyungmin Park 		if (ubi_devices[i]) {
1373f399d4a2SKyungmin Park 			mutex_lock(&ubi_devices_mutex);
1374f399d4a2SKyungmin Park 			ubi_detach_mtd_dev(ubi_devices[i]->ubi_num, 1);
1375f399d4a2SKyungmin Park 			mutex_unlock(&ubi_devices_mutex);
1376f399d4a2SKyungmin Park 		}
1377ff94bc40SHeiko Schocher 	ubi_debugfs_exit();
1378f399d4a2SKyungmin Park 	kmem_cache_destroy(ubi_wl_entry_slab);
1379f399d4a2SKyungmin Park 	misc_deregister(&ubi_ctrl_cdev);
13800195a7bbSHeiko Schocher 	class_unregister(&ubi_class);
138140da2a2aSHeiko Schocher #ifdef __UBOOT__
138240da2a2aSHeiko Schocher 	/* Reset any globals that the driver depends on being zeroed */
138340da2a2aSHeiko Schocher 	mtd_devs = 0;
138440da2a2aSHeiko Schocher #endif
1385f399d4a2SKyungmin Park }
1386f399d4a2SKyungmin Park module_exit(ubi_exit);
1387f399d4a2SKyungmin Park 
1388f399d4a2SKyungmin Park /**
1389ff94bc40SHeiko Schocher  * bytes_str_to_int - convert a number of bytes string into an integer.
1390f399d4a2SKyungmin Park  * @str: the string to convert
1391f399d4a2SKyungmin Park  *
1392f399d4a2SKyungmin Park  * This function returns positive resulting integer in case of success and a
1393f399d4a2SKyungmin Park  * negative error code in case of failure.
1394f399d4a2SKyungmin Park  */
bytes_str_to_int(const char * str)1395f399d4a2SKyungmin Park static int __init bytes_str_to_int(const char *str)
1396f399d4a2SKyungmin Park {
1397f399d4a2SKyungmin Park 	char *endp;
1398f399d4a2SKyungmin Park 	unsigned long result;
1399f399d4a2SKyungmin Park 
1400f399d4a2SKyungmin Park 	result = simple_strtoul(str, &endp, 0);
1401ff94bc40SHeiko Schocher 	if (str == endp || result >= INT_MAX) {
14020195a7bbSHeiko Schocher 		pr_err("UBI error: incorrect bytes count: \"%s\"\n", str);
1403f399d4a2SKyungmin Park 		return -EINVAL;
1404f399d4a2SKyungmin Park 	}
1405f399d4a2SKyungmin Park 
1406f399d4a2SKyungmin Park 	switch (*endp) {
1407f399d4a2SKyungmin Park 	case 'G':
1408f399d4a2SKyungmin Park 		result *= 1024;
1409f399d4a2SKyungmin Park 	case 'M':
1410f399d4a2SKyungmin Park 		result *= 1024;
1411f399d4a2SKyungmin Park 	case 'K':
1412f399d4a2SKyungmin Park 		result *= 1024;
1413f399d4a2SKyungmin Park 		if (endp[1] == 'i' && endp[2] == 'B')
1414f399d4a2SKyungmin Park 			endp += 2;
1415f399d4a2SKyungmin Park 	case '\0':
1416f399d4a2SKyungmin Park 		break;
1417f399d4a2SKyungmin Park 	default:
14180195a7bbSHeiko Schocher 		pr_err("UBI error: incorrect bytes count: \"%s\"\n", str);
1419f399d4a2SKyungmin Park 		return -EINVAL;
1420f399d4a2SKyungmin Park 	}
1421f399d4a2SKyungmin Park 
1422f399d4a2SKyungmin Park 	return result;
1423f399d4a2SKyungmin Park }
1424f399d4a2SKyungmin Park 
kstrtoint(const char * s,unsigned int base,int * res)1425ff94bc40SHeiko Schocher int kstrtoint(const char *s, unsigned int base, int *res)
1426ff94bc40SHeiko Schocher {
1427ff94bc40SHeiko Schocher 	unsigned long long tmp;
1428ff94bc40SHeiko Schocher 
1429ff94bc40SHeiko Schocher 	tmp = simple_strtoull(s, NULL, base);
1430ff94bc40SHeiko Schocher 	if (tmp != (unsigned long long)(int)tmp)
1431ff94bc40SHeiko Schocher 		return -ERANGE;
1432ff94bc40SHeiko Schocher 
1433ff94bc40SHeiko Schocher 	return (int)tmp;
1434ff94bc40SHeiko Schocher }
1435ff94bc40SHeiko Schocher 
1436f399d4a2SKyungmin Park /**
1437f399d4a2SKyungmin Park  * ubi_mtd_param_parse - parse the 'mtd=' UBI parameter.
1438f399d4a2SKyungmin Park  * @val: the parameter value to parse
1439f399d4a2SKyungmin Park  * @kp: not used
1440f399d4a2SKyungmin Park  *
1441f399d4a2SKyungmin Park  * This function returns zero in case of success and a negative error code in
1442f399d4a2SKyungmin Park  * case of error.
1443f399d4a2SKyungmin Park  */
1444ff94bc40SHeiko Schocher #ifndef __UBOOT__
ubi_mtd_param_parse(const char * val,struct kernel_param * kp)1445ff94bc40SHeiko Schocher static int __init ubi_mtd_param_parse(const char *val, struct kernel_param *kp)
1446ff94bc40SHeiko Schocher #else
1447ff94bc40SHeiko Schocher int ubi_mtd_param_parse(const char *val, struct kernel_param *kp)
1448ff94bc40SHeiko Schocher #endif
1449f399d4a2SKyungmin Park {
1450f399d4a2SKyungmin Park 	int i, len;
1451f399d4a2SKyungmin Park 	struct mtd_dev_param *p;
1452f399d4a2SKyungmin Park 	char buf[MTD_PARAM_LEN_MAX];
1453f399d4a2SKyungmin Park 	char *pbuf = &buf[0];
1454ff94bc40SHeiko Schocher 	char *tokens[MTD_PARAM_MAX_COUNT], *token;
1455f399d4a2SKyungmin Park 
1456f399d4a2SKyungmin Park 	if (!val)
1457f399d4a2SKyungmin Park 		return -EINVAL;
1458f399d4a2SKyungmin Park 
1459f399d4a2SKyungmin Park 	if (mtd_devs == UBI_MAX_DEVICES) {
14600195a7bbSHeiko Schocher 		pr_err("UBI error: too many parameters, max. is %d\n",
1461f399d4a2SKyungmin Park 		       UBI_MAX_DEVICES);
1462f399d4a2SKyungmin Park 		return -EINVAL;
1463f399d4a2SKyungmin Park 	}
1464f399d4a2SKyungmin Park 
1465f399d4a2SKyungmin Park 	len = strnlen(val, MTD_PARAM_LEN_MAX);
1466f399d4a2SKyungmin Park 	if (len == MTD_PARAM_LEN_MAX) {
14670195a7bbSHeiko Schocher 		pr_err("UBI error: parameter \"%s\" is too long, max. is %d\n",
1468ff94bc40SHeiko Schocher 		       val, MTD_PARAM_LEN_MAX);
1469f399d4a2SKyungmin Park 		return -EINVAL;
1470f399d4a2SKyungmin Park 	}
1471f399d4a2SKyungmin Park 
1472f399d4a2SKyungmin Park 	if (len == 0) {
1473ff94bc40SHeiko Schocher 		pr_warn("UBI warning: empty 'mtd=' parameter - ignored\n");
1474f399d4a2SKyungmin Park 		return 0;
1475f399d4a2SKyungmin Park 	}
1476f399d4a2SKyungmin Park 
1477f399d4a2SKyungmin Park 	strcpy(buf, val);
1478f399d4a2SKyungmin Park 
1479f399d4a2SKyungmin Park 	/* Get rid of the final newline */
1480f399d4a2SKyungmin Park 	if (buf[len - 1] == '\n')
1481f399d4a2SKyungmin Park 		buf[len - 1] = '\0';
1482f399d4a2SKyungmin Park 
1483ff94bc40SHeiko Schocher 	for (i = 0; i < MTD_PARAM_MAX_COUNT; i++)
1484f399d4a2SKyungmin Park 		tokens[i] = strsep(&pbuf, ",");
1485f399d4a2SKyungmin Park 
1486f399d4a2SKyungmin Park 	if (pbuf) {
14870195a7bbSHeiko Schocher 		pr_err("UBI error: too many arguments at \"%s\"\n", val);
1488f399d4a2SKyungmin Park 		return -EINVAL;
1489f399d4a2SKyungmin Park 	}
1490f399d4a2SKyungmin Park 
1491f399d4a2SKyungmin Park 	p = &mtd_dev_param[mtd_devs];
1492f399d4a2SKyungmin Park 	strcpy(&p->name[0], tokens[0]);
1493f399d4a2SKyungmin Park 
1494ff94bc40SHeiko Schocher 	token = tokens[1];
1495ff94bc40SHeiko Schocher 	if (token) {
1496ff94bc40SHeiko Schocher 		p->vid_hdr_offs = bytes_str_to_int(token);
1497f399d4a2SKyungmin Park 
1498f399d4a2SKyungmin Park 		if (p->vid_hdr_offs < 0)
1499f399d4a2SKyungmin Park 			return p->vid_hdr_offs;
1500ff94bc40SHeiko Schocher 	}
1501ff94bc40SHeiko Schocher 
1502ff94bc40SHeiko Schocher 	token = tokens[2];
1503ff94bc40SHeiko Schocher 	if (token) {
1504ff94bc40SHeiko Schocher 		int err = kstrtoint(token, 10, &p->max_beb_per1024);
1505ff94bc40SHeiko Schocher 
1506ff94bc40SHeiko Schocher 		if (err) {
15070195a7bbSHeiko Schocher 			pr_err("UBI error: bad value for max_beb_per1024 parameter: %s",
1508ff94bc40SHeiko Schocher 			       token);
1509ff94bc40SHeiko Schocher 			return -EINVAL;
1510ff94bc40SHeiko Schocher 		}
1511ff94bc40SHeiko Schocher 	}
1512ff94bc40SHeiko Schocher 
1513ff94bc40SHeiko Schocher 	token = tokens[3];
1514ff94bc40SHeiko Schocher 	if (token) {
1515ff94bc40SHeiko Schocher 		int err = kstrtoint(token, 10, &p->ubi_num);
1516ff94bc40SHeiko Schocher 
1517ff94bc40SHeiko Schocher 		if (err) {
15180195a7bbSHeiko Schocher 			pr_err("UBI error: bad value for ubi_num parameter: %s",
15190195a7bbSHeiko Schocher 			       token);
1520ff94bc40SHeiko Schocher 			return -EINVAL;
1521ff94bc40SHeiko Schocher 		}
1522ff94bc40SHeiko Schocher 	} else
1523ff94bc40SHeiko Schocher 		p->ubi_num = UBI_DEV_NUM_AUTO;
1524f399d4a2SKyungmin Park 
1525f399d4a2SKyungmin Park 	mtd_devs += 1;
1526f399d4a2SKyungmin Park 	return 0;
1527f399d4a2SKyungmin Park }
1528f399d4a2SKyungmin Park 
1529f399d4a2SKyungmin Park module_param_call(mtd, ubi_mtd_param_parse, NULL, NULL, 000);
1530ff94bc40SHeiko Schocher MODULE_PARM_DESC(mtd, "MTD devices to attach. Parameter format: mtd=<name|num|path>[,<vid_hdr_offs>[,max_beb_per1024[,ubi_num]]].\n"
1531f399d4a2SKyungmin Park 		      "Multiple \"mtd\" parameters may be specified.\n"
1532ff94bc40SHeiko Schocher 		      "MTD devices may be specified by their number, name, or path to the MTD character device node.\n"
1533ff94bc40SHeiko Schocher 		      "Optional \"vid_hdr_offs\" parameter specifies UBI VID header position to be used by UBI. (default value if 0)\n"
1534ff94bc40SHeiko Schocher 		      "Optional \"max_beb_per1024\" parameter specifies the maximum expected bad eraseblock per 1024 eraseblocks. (default value ("
1535ff94bc40SHeiko Schocher 		      __stringify(CONFIG_MTD_UBI_BEB_LIMIT) ") if 0)\n"
1536ff94bc40SHeiko Schocher 		      "Optional \"ubi_num\" parameter specifies UBI device number which have to be assigned to the newly created UBI device (assigned automatically by default)\n"
1537ff94bc40SHeiko Schocher 		      "\n"
1538ff94bc40SHeiko Schocher 		      "Example 1: mtd=/dev/mtd0 - attach MTD device /dev/mtd0.\n"
1539ff94bc40SHeiko Schocher 		      "Example 2: mtd=content,1984 mtd=4 - attach MTD device with name \"content\" using VID header offset 1984, and MTD device number 4 with default VID header offset.\n"
1540ff94bc40SHeiko Schocher 		      "Example 3: mtd=/dev/mtd1,0,25 - attach MTD device /dev/mtd1 using default VID header offset and reserve 25*nand_size_in_blocks/1024 erase blocks for bad block handling.\n"
1541ff94bc40SHeiko Schocher 		      "Example 4: mtd=/dev/mtd1,0,0,5 - attach MTD device /dev/mtd1 to UBI 5 and using default values for the other fields.\n"
1542ff94bc40SHeiko Schocher 		      "\t(e.g. if the NAND *chipset* has 4096 PEB, 100 will be reserved for this UBI device).");
1543ff94bc40SHeiko Schocher #ifdef CONFIG_MTD_UBI_FASTMAP
1544ff94bc40SHeiko Schocher module_param(fm_autoconvert, bool, 0644);
1545ff94bc40SHeiko Schocher MODULE_PARM_DESC(fm_autoconvert, "Set this parameter to enable fastmap automatically on images without a fastmap.");
15460195a7bbSHeiko Schocher module_param(fm_debug, bool, 0);
15470195a7bbSHeiko Schocher MODULE_PARM_DESC(fm_debug, "Set this parameter to enable fastmap debugging by default. Warning, this will make fastmap slow!");
1548ff94bc40SHeiko Schocher #endif
1549f399d4a2SKyungmin Park MODULE_VERSION(__stringify(UBI_VERSION));
1550f399d4a2SKyungmin Park MODULE_DESCRIPTION("UBI - Unsorted Block Images");
1551f399d4a2SKyungmin Park MODULE_AUTHOR("Artem Bityutskiy");
1552f399d4a2SKyungmin Park MODULE_LICENSE("GPL");
1553