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