xref: /openbmc/linux/kernel/resource.c (revision 110e6f26)
1 /*
2  *	linux/kernel/resource.c
3  *
4  * Copyright (C) 1999	Linus Torvalds
5  * Copyright (C) 1999	Martin Mares <mj@ucw.cz>
6  *
7  * Arbitrary resource management.
8  */
9 
10 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
11 
12 #include <linux/export.h>
13 #include <linux/errno.h>
14 #include <linux/ioport.h>
15 #include <linux/init.h>
16 #include <linux/slab.h>
17 #include <linux/spinlock.h>
18 #include <linux/fs.h>
19 #include <linux/proc_fs.h>
20 #include <linux/sched.h>
21 #include <linux/seq_file.h>
22 #include <linux/device.h>
23 #include <linux/pfn.h>
24 #include <linux/mm.h>
25 #include <linux/resource_ext.h>
26 #include <asm/io.h>
27 
28 
29 struct resource ioport_resource = {
30 	.name	= "PCI IO",
31 	.start	= 0,
32 	.end	= IO_SPACE_LIMIT,
33 	.flags	= IORESOURCE_IO,
34 };
35 EXPORT_SYMBOL(ioport_resource);
36 
37 struct resource iomem_resource = {
38 	.name	= "PCI mem",
39 	.start	= 0,
40 	.end	= -1,
41 	.flags	= IORESOURCE_MEM,
42 };
43 EXPORT_SYMBOL(iomem_resource);
44 
45 /* constraints to be met while allocating resources */
46 struct resource_constraint {
47 	resource_size_t min, max, align;
48 	resource_size_t (*alignf)(void *, const struct resource *,
49 			resource_size_t, resource_size_t);
50 	void *alignf_data;
51 };
52 
53 static DEFINE_RWLOCK(resource_lock);
54 
55 /*
56  * For memory hotplug, there is no way to free resource entries allocated
57  * by boot mem after the system is up. So for reusing the resource entry
58  * we need to remember the resource.
59  */
60 static struct resource *bootmem_resource_free;
61 static DEFINE_SPINLOCK(bootmem_resource_lock);
62 
63 static struct resource *next_resource(struct resource *p, bool sibling_only)
64 {
65 	/* Caller wants to traverse through siblings only */
66 	if (sibling_only)
67 		return p->sibling;
68 
69 	if (p->child)
70 		return p->child;
71 	while (!p->sibling && p->parent)
72 		p = p->parent;
73 	return p->sibling;
74 }
75 
76 static void *r_next(struct seq_file *m, void *v, loff_t *pos)
77 {
78 	struct resource *p = v;
79 	(*pos)++;
80 	return (void *)next_resource(p, false);
81 }
82 
83 #ifdef CONFIG_PROC_FS
84 
85 enum { MAX_IORES_LEVEL = 5 };
86 
87 static void *r_start(struct seq_file *m, loff_t *pos)
88 	__acquires(resource_lock)
89 {
90 	struct resource *p = m->private;
91 	loff_t l = 0;
92 	read_lock(&resource_lock);
93 	for (p = p->child; p && l < *pos; p = r_next(m, p, &l))
94 		;
95 	return p;
96 }
97 
98 static void r_stop(struct seq_file *m, void *v)
99 	__releases(resource_lock)
100 {
101 	read_unlock(&resource_lock);
102 }
103 
104 static int r_show(struct seq_file *m, void *v)
105 {
106 	struct resource *root = m->private;
107 	struct resource *r = v, *p;
108 	int width = root->end < 0x10000 ? 4 : 8;
109 	int depth;
110 
111 	for (depth = 0, p = r; depth < MAX_IORES_LEVEL; depth++, p = p->parent)
112 		if (p->parent == root)
113 			break;
114 	seq_printf(m, "%*s%0*llx-%0*llx : %s\n",
115 			depth * 2, "",
116 			width, (unsigned long long) r->start,
117 			width, (unsigned long long) r->end,
118 			r->name ? r->name : "<BAD>");
119 	return 0;
120 }
121 
122 static const struct seq_operations resource_op = {
123 	.start	= r_start,
124 	.next	= r_next,
125 	.stop	= r_stop,
126 	.show	= r_show,
127 };
128 
129 static int ioports_open(struct inode *inode, struct file *file)
130 {
131 	int res = seq_open(file, &resource_op);
132 	if (!res) {
133 		struct seq_file *m = file->private_data;
134 		m->private = &ioport_resource;
135 	}
136 	return res;
137 }
138 
139 static int iomem_open(struct inode *inode, struct file *file)
140 {
141 	int res = seq_open(file, &resource_op);
142 	if (!res) {
143 		struct seq_file *m = file->private_data;
144 		m->private = &iomem_resource;
145 	}
146 	return res;
147 }
148 
149 static const struct file_operations proc_ioports_operations = {
150 	.open		= ioports_open,
151 	.read		= seq_read,
152 	.llseek		= seq_lseek,
153 	.release	= seq_release,
154 };
155 
156 static const struct file_operations proc_iomem_operations = {
157 	.open		= iomem_open,
158 	.read		= seq_read,
159 	.llseek		= seq_lseek,
160 	.release	= seq_release,
161 };
162 
163 static int __init ioresources_init(void)
164 {
165 	proc_create("ioports", 0, NULL, &proc_ioports_operations);
166 	proc_create("iomem", 0, NULL, &proc_iomem_operations);
167 	return 0;
168 }
169 __initcall(ioresources_init);
170 
171 #endif /* CONFIG_PROC_FS */
172 
173 static void free_resource(struct resource *res)
174 {
175 	if (!res)
176 		return;
177 
178 	if (!PageSlab(virt_to_head_page(res))) {
179 		spin_lock(&bootmem_resource_lock);
180 		res->sibling = bootmem_resource_free;
181 		bootmem_resource_free = res;
182 		spin_unlock(&bootmem_resource_lock);
183 	} else {
184 		kfree(res);
185 	}
186 }
187 
188 static struct resource *alloc_resource(gfp_t flags)
189 {
190 	struct resource *res = NULL;
191 
192 	spin_lock(&bootmem_resource_lock);
193 	if (bootmem_resource_free) {
194 		res = bootmem_resource_free;
195 		bootmem_resource_free = res->sibling;
196 	}
197 	spin_unlock(&bootmem_resource_lock);
198 
199 	if (res)
200 		memset(res, 0, sizeof(struct resource));
201 	else
202 		res = kzalloc(sizeof(struct resource), flags);
203 
204 	return res;
205 }
206 
207 /* Return the conflict entry if you can't request it */
208 static struct resource * __request_resource(struct resource *root, struct resource *new)
209 {
210 	resource_size_t start = new->start;
211 	resource_size_t end = new->end;
212 	struct resource *tmp, **p;
213 
214 	if (end < start)
215 		return root;
216 	if (start < root->start)
217 		return root;
218 	if (end > root->end)
219 		return root;
220 	p = &root->child;
221 	for (;;) {
222 		tmp = *p;
223 		if (!tmp || tmp->start > end) {
224 			new->sibling = tmp;
225 			*p = new;
226 			new->parent = root;
227 			return NULL;
228 		}
229 		p = &tmp->sibling;
230 		if (tmp->end < start)
231 			continue;
232 		return tmp;
233 	}
234 }
235 
236 static int __release_resource(struct resource *old, bool release_child)
237 {
238 	struct resource *tmp, **p, *chd;
239 
240 	p = &old->parent->child;
241 	for (;;) {
242 		tmp = *p;
243 		if (!tmp)
244 			break;
245 		if (tmp == old) {
246 			if (release_child || !(tmp->child)) {
247 				*p = tmp->sibling;
248 			} else {
249 				for (chd = tmp->child;; chd = chd->sibling) {
250 					chd->parent = tmp->parent;
251 					if (!(chd->sibling))
252 						break;
253 				}
254 				*p = tmp->child;
255 				chd->sibling = tmp->sibling;
256 			}
257 			old->parent = NULL;
258 			return 0;
259 		}
260 		p = &tmp->sibling;
261 	}
262 	return -EINVAL;
263 }
264 
265 static void __release_child_resources(struct resource *r)
266 {
267 	struct resource *tmp, *p;
268 	resource_size_t size;
269 
270 	p = r->child;
271 	r->child = NULL;
272 	while (p) {
273 		tmp = p;
274 		p = p->sibling;
275 
276 		tmp->parent = NULL;
277 		tmp->sibling = NULL;
278 		__release_child_resources(tmp);
279 
280 		printk(KERN_DEBUG "release child resource %pR\n", tmp);
281 		/* need to restore size, and keep flags */
282 		size = resource_size(tmp);
283 		tmp->start = 0;
284 		tmp->end = size - 1;
285 	}
286 }
287 
288 void release_child_resources(struct resource *r)
289 {
290 	write_lock(&resource_lock);
291 	__release_child_resources(r);
292 	write_unlock(&resource_lock);
293 }
294 
295 /**
296  * request_resource_conflict - request and reserve an I/O or memory resource
297  * @root: root resource descriptor
298  * @new: resource descriptor desired by caller
299  *
300  * Returns 0 for success, conflict resource on error.
301  */
302 struct resource *request_resource_conflict(struct resource *root, struct resource *new)
303 {
304 	struct resource *conflict;
305 
306 	write_lock(&resource_lock);
307 	conflict = __request_resource(root, new);
308 	write_unlock(&resource_lock);
309 	return conflict;
310 }
311 
312 /**
313  * request_resource - request and reserve an I/O or memory resource
314  * @root: root resource descriptor
315  * @new: resource descriptor desired by caller
316  *
317  * Returns 0 for success, negative error code on error.
318  */
319 int request_resource(struct resource *root, struct resource *new)
320 {
321 	struct resource *conflict;
322 
323 	conflict = request_resource_conflict(root, new);
324 	return conflict ? -EBUSY : 0;
325 }
326 
327 EXPORT_SYMBOL(request_resource);
328 
329 /**
330  * release_resource - release a previously reserved resource
331  * @old: resource pointer
332  */
333 int release_resource(struct resource *old)
334 {
335 	int retval;
336 
337 	write_lock(&resource_lock);
338 	retval = __release_resource(old, true);
339 	write_unlock(&resource_lock);
340 	return retval;
341 }
342 
343 EXPORT_SYMBOL(release_resource);
344 
345 /*
346  * Finds the lowest iomem resource existing within [res->start.res->end).
347  * The caller must specify res->start, res->end, res->flags, and optionally
348  * desc.  If found, returns 0, res is overwritten, if not found, returns -1.
349  * This function walks the whole tree and not just first level children until
350  * and unless first_level_children_only is true.
351  */
352 static int find_next_iomem_res(struct resource *res, unsigned long desc,
353 			       bool first_level_children_only)
354 {
355 	resource_size_t start, end;
356 	struct resource *p;
357 	bool sibling_only = false;
358 
359 	BUG_ON(!res);
360 
361 	start = res->start;
362 	end = res->end;
363 	BUG_ON(start >= end);
364 
365 	if (first_level_children_only)
366 		sibling_only = true;
367 
368 	read_lock(&resource_lock);
369 
370 	for (p = iomem_resource.child; p; p = next_resource(p, sibling_only)) {
371 		if ((p->flags & res->flags) != res->flags)
372 			continue;
373 		if ((desc != IORES_DESC_NONE) && (desc != p->desc))
374 			continue;
375 		if (p->start > end) {
376 			p = NULL;
377 			break;
378 		}
379 		if ((p->end >= start) && (p->start < end))
380 			break;
381 	}
382 
383 	read_unlock(&resource_lock);
384 	if (!p)
385 		return -1;
386 	/* copy data */
387 	if (res->start < p->start)
388 		res->start = p->start;
389 	if (res->end > p->end)
390 		res->end = p->end;
391 	return 0;
392 }
393 
394 /*
395  * Walks through iomem resources and calls func() with matching resource
396  * ranges. This walks through whole tree and not just first level children.
397  * All the memory ranges which overlap start,end and also match flags and
398  * desc are valid candidates.
399  *
400  * @desc: I/O resource descriptor. Use IORES_DESC_NONE to skip @desc check.
401  * @flags: I/O resource flags
402  * @start: start addr
403  * @end: end addr
404  *
405  * NOTE: For a new descriptor search, define a new IORES_DESC in
406  * <linux/ioport.h> and set it in 'desc' of a target resource entry.
407  */
408 int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start,
409 		u64 end, void *arg, int (*func)(u64, u64, void *))
410 {
411 	struct resource res;
412 	u64 orig_end;
413 	int ret = -1;
414 
415 	res.start = start;
416 	res.end = end;
417 	res.flags = flags;
418 	orig_end = res.end;
419 
420 	while ((res.start < res.end) &&
421 		(!find_next_iomem_res(&res, desc, false))) {
422 
423 		ret = (*func)(res.start, res.end, arg);
424 		if (ret)
425 			break;
426 
427 		res.start = res.end + 1;
428 		res.end = orig_end;
429 	}
430 
431 	return ret;
432 }
433 
434 /*
435  * This function calls the @func callback against all memory ranges of type
436  * System RAM which are marked as IORESOURCE_SYSTEM_RAM and IORESOUCE_BUSY.
437  * Now, this function is only for System RAM, it deals with full ranges and
438  * not PFNs. If resources are not PFN-aligned, dealing with PFNs can truncate
439  * ranges.
440  */
441 int walk_system_ram_res(u64 start, u64 end, void *arg,
442 				int (*func)(u64, u64, void *))
443 {
444 	struct resource res;
445 	u64 orig_end;
446 	int ret = -1;
447 
448 	res.start = start;
449 	res.end = end;
450 	res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
451 	orig_end = res.end;
452 	while ((res.start < res.end) &&
453 		(!find_next_iomem_res(&res, IORES_DESC_NONE, true))) {
454 		ret = (*func)(res.start, res.end, arg);
455 		if (ret)
456 			break;
457 		res.start = res.end + 1;
458 		res.end = orig_end;
459 	}
460 	return ret;
461 }
462 
463 #if !defined(CONFIG_ARCH_HAS_WALK_MEMORY)
464 
465 /*
466  * This function calls the @func callback against all memory ranges of type
467  * System RAM which are marked as IORESOURCE_SYSTEM_RAM and IORESOUCE_BUSY.
468  * It is to be used only for System RAM.
469  */
470 int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
471 		void *arg, int (*func)(unsigned long, unsigned long, void *))
472 {
473 	struct resource res;
474 	unsigned long pfn, end_pfn;
475 	u64 orig_end;
476 	int ret = -1;
477 
478 	res.start = (u64) start_pfn << PAGE_SHIFT;
479 	res.end = ((u64)(start_pfn + nr_pages) << PAGE_SHIFT) - 1;
480 	res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
481 	orig_end = res.end;
482 	while ((res.start < res.end) &&
483 		(find_next_iomem_res(&res, IORES_DESC_NONE, true) >= 0)) {
484 		pfn = (res.start + PAGE_SIZE - 1) >> PAGE_SHIFT;
485 		end_pfn = (res.end + 1) >> PAGE_SHIFT;
486 		if (end_pfn > pfn)
487 			ret = (*func)(pfn, end_pfn - pfn, arg);
488 		if (ret)
489 			break;
490 		res.start = res.end + 1;
491 		res.end = orig_end;
492 	}
493 	return ret;
494 }
495 
496 #endif
497 
498 static int __is_ram(unsigned long pfn, unsigned long nr_pages, void *arg)
499 {
500 	return 1;
501 }
502 /*
503  * This generic page_is_ram() returns true if specified address is
504  * registered as System RAM in iomem_resource list.
505  */
506 int __weak page_is_ram(unsigned long pfn)
507 {
508 	return walk_system_ram_range(pfn, 1, NULL, __is_ram) == 1;
509 }
510 EXPORT_SYMBOL_GPL(page_is_ram);
511 
512 /**
513  * region_intersects() - determine intersection of region with known resources
514  * @start: region start address
515  * @size: size of region
516  * @flags: flags of resource (in iomem_resource)
517  * @desc: descriptor of resource (in iomem_resource) or IORES_DESC_NONE
518  *
519  * Check if the specified region partially overlaps or fully eclipses a
520  * resource identified by @flags and @desc (optional with IORES_DESC_NONE).
521  * Return REGION_DISJOINT if the region does not overlap @flags/@desc,
522  * return REGION_MIXED if the region overlaps @flags/@desc and another
523  * resource, and return REGION_INTERSECTS if the region overlaps @flags/@desc
524  * and no other defined resource. Note that REGION_INTERSECTS is also
525  * returned in the case when the specified region overlaps RAM and undefined
526  * memory holes.
527  *
528  * region_intersect() is used by memory remapping functions to ensure
529  * the user is not remapping RAM and is a vast speed up over walking
530  * through the resource table page by page.
531  */
532 int region_intersects(resource_size_t start, size_t size, unsigned long flags,
533 		      unsigned long desc)
534 {
535 	resource_size_t end = start + size - 1;
536 	int type = 0; int other = 0;
537 	struct resource *p;
538 
539 	read_lock(&resource_lock);
540 	for (p = iomem_resource.child; p ; p = p->sibling) {
541 		bool is_type = (((p->flags & flags) == flags) &&
542 				((desc == IORES_DESC_NONE) ||
543 				 (desc == p->desc)));
544 
545 		if (start >= p->start && start <= p->end)
546 			is_type ? type++ : other++;
547 		if (end >= p->start && end <= p->end)
548 			is_type ? type++ : other++;
549 		if (p->start >= start && p->end <= end)
550 			is_type ? type++ : other++;
551 	}
552 	read_unlock(&resource_lock);
553 
554 	if (other == 0)
555 		return type ? REGION_INTERSECTS : REGION_DISJOINT;
556 
557 	if (type)
558 		return REGION_MIXED;
559 
560 	return REGION_DISJOINT;
561 }
562 EXPORT_SYMBOL_GPL(region_intersects);
563 
564 void __weak arch_remove_reservations(struct resource *avail)
565 {
566 }
567 
568 static resource_size_t simple_align_resource(void *data,
569 					     const struct resource *avail,
570 					     resource_size_t size,
571 					     resource_size_t align)
572 {
573 	return avail->start;
574 }
575 
576 static void resource_clip(struct resource *res, resource_size_t min,
577 			  resource_size_t max)
578 {
579 	if (res->start < min)
580 		res->start = min;
581 	if (res->end > max)
582 		res->end = max;
583 }
584 
585 /*
586  * Find empty slot in the resource tree with the given range and
587  * alignment constraints
588  */
589 static int __find_resource(struct resource *root, struct resource *old,
590 			 struct resource *new,
591 			 resource_size_t  size,
592 			 struct resource_constraint *constraint)
593 {
594 	struct resource *this = root->child;
595 	struct resource tmp = *new, avail, alloc;
596 
597 	tmp.start = root->start;
598 	/*
599 	 * Skip past an allocated resource that starts at 0, since the assignment
600 	 * of this->start - 1 to tmp->end below would cause an underflow.
601 	 */
602 	if (this && this->start == root->start) {
603 		tmp.start = (this == old) ? old->start : this->end + 1;
604 		this = this->sibling;
605 	}
606 	for(;;) {
607 		if (this)
608 			tmp.end = (this == old) ?  this->end : this->start - 1;
609 		else
610 			tmp.end = root->end;
611 
612 		if (tmp.end < tmp.start)
613 			goto next;
614 
615 		resource_clip(&tmp, constraint->min, constraint->max);
616 		arch_remove_reservations(&tmp);
617 
618 		/* Check for overflow after ALIGN() */
619 		avail.start = ALIGN(tmp.start, constraint->align);
620 		avail.end = tmp.end;
621 		avail.flags = new->flags & ~IORESOURCE_UNSET;
622 		if (avail.start >= tmp.start) {
623 			alloc.flags = avail.flags;
624 			alloc.start = constraint->alignf(constraint->alignf_data, &avail,
625 					size, constraint->align);
626 			alloc.end = alloc.start + size - 1;
627 			if (resource_contains(&avail, &alloc)) {
628 				new->start = alloc.start;
629 				new->end = alloc.end;
630 				return 0;
631 			}
632 		}
633 
634 next:		if (!this || this->end == root->end)
635 			break;
636 
637 		if (this != old)
638 			tmp.start = this->end + 1;
639 		this = this->sibling;
640 	}
641 	return -EBUSY;
642 }
643 
644 /*
645  * Find empty slot in the resource tree given range and alignment.
646  */
647 static int find_resource(struct resource *root, struct resource *new,
648 			resource_size_t size,
649 			struct resource_constraint  *constraint)
650 {
651 	return  __find_resource(root, NULL, new, size, constraint);
652 }
653 
654 /**
655  * reallocate_resource - allocate a slot in the resource tree given range & alignment.
656  *	The resource will be relocated if the new size cannot be reallocated in the
657  *	current location.
658  *
659  * @root: root resource descriptor
660  * @old:  resource descriptor desired by caller
661  * @newsize: new size of the resource descriptor
662  * @constraint: the size and alignment constraints to be met.
663  */
664 static int reallocate_resource(struct resource *root, struct resource *old,
665 			resource_size_t newsize,
666 			struct resource_constraint  *constraint)
667 {
668 	int err=0;
669 	struct resource new = *old;
670 	struct resource *conflict;
671 
672 	write_lock(&resource_lock);
673 
674 	if ((err = __find_resource(root, old, &new, newsize, constraint)))
675 		goto out;
676 
677 	if (resource_contains(&new, old)) {
678 		old->start = new.start;
679 		old->end = new.end;
680 		goto out;
681 	}
682 
683 	if (old->child) {
684 		err = -EBUSY;
685 		goto out;
686 	}
687 
688 	if (resource_contains(old, &new)) {
689 		old->start = new.start;
690 		old->end = new.end;
691 	} else {
692 		__release_resource(old, true);
693 		*old = new;
694 		conflict = __request_resource(root, old);
695 		BUG_ON(conflict);
696 	}
697 out:
698 	write_unlock(&resource_lock);
699 	return err;
700 }
701 
702 
703 /**
704  * allocate_resource - allocate empty slot in the resource tree given range & alignment.
705  * 	The resource will be reallocated with a new size if it was already allocated
706  * @root: root resource descriptor
707  * @new: resource descriptor desired by caller
708  * @size: requested resource region size
709  * @min: minimum boundary to allocate
710  * @max: maximum boundary to allocate
711  * @align: alignment requested, in bytes
712  * @alignf: alignment function, optional, called if not NULL
713  * @alignf_data: arbitrary data to pass to the @alignf function
714  */
715 int allocate_resource(struct resource *root, struct resource *new,
716 		      resource_size_t size, resource_size_t min,
717 		      resource_size_t max, resource_size_t align,
718 		      resource_size_t (*alignf)(void *,
719 						const struct resource *,
720 						resource_size_t,
721 						resource_size_t),
722 		      void *alignf_data)
723 {
724 	int err;
725 	struct resource_constraint constraint;
726 
727 	if (!alignf)
728 		alignf = simple_align_resource;
729 
730 	constraint.min = min;
731 	constraint.max = max;
732 	constraint.align = align;
733 	constraint.alignf = alignf;
734 	constraint.alignf_data = alignf_data;
735 
736 	if ( new->parent ) {
737 		/* resource is already allocated, try reallocating with
738 		   the new constraints */
739 		return reallocate_resource(root, new, size, &constraint);
740 	}
741 
742 	write_lock(&resource_lock);
743 	err = find_resource(root, new, size, &constraint);
744 	if (err >= 0 && __request_resource(root, new))
745 		err = -EBUSY;
746 	write_unlock(&resource_lock);
747 	return err;
748 }
749 
750 EXPORT_SYMBOL(allocate_resource);
751 
752 /**
753  * lookup_resource - find an existing resource by a resource start address
754  * @root: root resource descriptor
755  * @start: resource start address
756  *
757  * Returns a pointer to the resource if found, NULL otherwise
758  */
759 struct resource *lookup_resource(struct resource *root, resource_size_t start)
760 {
761 	struct resource *res;
762 
763 	read_lock(&resource_lock);
764 	for (res = root->child; res; res = res->sibling) {
765 		if (res->start == start)
766 			break;
767 	}
768 	read_unlock(&resource_lock);
769 
770 	return res;
771 }
772 
773 /*
774  * Insert a resource into the resource tree. If successful, return NULL,
775  * otherwise return the conflicting resource (compare to __request_resource())
776  */
777 static struct resource * __insert_resource(struct resource *parent, struct resource *new)
778 {
779 	struct resource *first, *next;
780 
781 	for (;; parent = first) {
782 		first = __request_resource(parent, new);
783 		if (!first)
784 			return first;
785 
786 		if (first == parent)
787 			return first;
788 		if (WARN_ON(first == new))	/* duplicated insertion */
789 			return first;
790 
791 		if ((first->start > new->start) || (first->end < new->end))
792 			break;
793 		if ((first->start == new->start) && (first->end == new->end))
794 			break;
795 	}
796 
797 	for (next = first; ; next = next->sibling) {
798 		/* Partial overlap? Bad, and unfixable */
799 		if (next->start < new->start || next->end > new->end)
800 			return next;
801 		if (!next->sibling)
802 			break;
803 		if (next->sibling->start > new->end)
804 			break;
805 	}
806 
807 	new->parent = parent;
808 	new->sibling = next->sibling;
809 	new->child = first;
810 
811 	next->sibling = NULL;
812 	for (next = first; next; next = next->sibling)
813 		next->parent = new;
814 
815 	if (parent->child == first) {
816 		parent->child = new;
817 	} else {
818 		next = parent->child;
819 		while (next->sibling != first)
820 			next = next->sibling;
821 		next->sibling = new;
822 	}
823 	return NULL;
824 }
825 
826 /**
827  * insert_resource_conflict - Inserts resource in the resource tree
828  * @parent: parent of the new resource
829  * @new: new resource to insert
830  *
831  * Returns 0 on success, conflict resource if the resource can't be inserted.
832  *
833  * This function is equivalent to request_resource_conflict when no conflict
834  * happens. If a conflict happens, and the conflicting resources
835  * entirely fit within the range of the new resource, then the new
836  * resource is inserted and the conflicting resources become children of
837  * the new resource.
838  *
839  * This function is intended for producers of resources, such as FW modules
840  * and bus drivers.
841  */
842 struct resource *insert_resource_conflict(struct resource *parent, struct resource *new)
843 {
844 	struct resource *conflict;
845 
846 	write_lock(&resource_lock);
847 	conflict = __insert_resource(parent, new);
848 	write_unlock(&resource_lock);
849 	return conflict;
850 }
851 
852 /**
853  * insert_resource - Inserts a resource in the resource tree
854  * @parent: parent of the new resource
855  * @new: new resource to insert
856  *
857  * Returns 0 on success, -EBUSY if the resource can't be inserted.
858  *
859  * This function is intended for producers of resources, such as FW modules
860  * and bus drivers.
861  */
862 int insert_resource(struct resource *parent, struct resource *new)
863 {
864 	struct resource *conflict;
865 
866 	conflict = insert_resource_conflict(parent, new);
867 	return conflict ? -EBUSY : 0;
868 }
869 EXPORT_SYMBOL_GPL(insert_resource);
870 
871 /**
872  * insert_resource_expand_to_fit - Insert a resource into the resource tree
873  * @root: root resource descriptor
874  * @new: new resource to insert
875  *
876  * Insert a resource into the resource tree, possibly expanding it in order
877  * to make it encompass any conflicting resources.
878  */
879 void insert_resource_expand_to_fit(struct resource *root, struct resource *new)
880 {
881 	if (new->parent)
882 		return;
883 
884 	write_lock(&resource_lock);
885 	for (;;) {
886 		struct resource *conflict;
887 
888 		conflict = __insert_resource(root, new);
889 		if (!conflict)
890 			break;
891 		if (conflict == root)
892 			break;
893 
894 		/* Ok, expand resource to cover the conflict, then try again .. */
895 		if (conflict->start < new->start)
896 			new->start = conflict->start;
897 		if (conflict->end > new->end)
898 			new->end = conflict->end;
899 
900 		printk("Expanded resource %s due to conflict with %s\n", new->name, conflict->name);
901 	}
902 	write_unlock(&resource_lock);
903 }
904 
905 /**
906  * remove_resource - Remove a resource in the resource tree
907  * @old: resource to remove
908  *
909  * Returns 0 on success, -EINVAL if the resource is not valid.
910  *
911  * This function removes a resource previously inserted by insert_resource()
912  * or insert_resource_conflict(), and moves the children (if any) up to
913  * where they were before.  insert_resource() and insert_resource_conflict()
914  * insert a new resource, and move any conflicting resources down to the
915  * children of the new resource.
916  *
917  * insert_resource(), insert_resource_conflict() and remove_resource() are
918  * intended for producers of resources, such as FW modules and bus drivers.
919  */
920 int remove_resource(struct resource *old)
921 {
922 	int retval;
923 
924 	write_lock(&resource_lock);
925 	retval = __release_resource(old, false);
926 	write_unlock(&resource_lock);
927 	return retval;
928 }
929 EXPORT_SYMBOL_GPL(remove_resource);
930 
931 static int __adjust_resource(struct resource *res, resource_size_t start,
932 				resource_size_t size)
933 {
934 	struct resource *tmp, *parent = res->parent;
935 	resource_size_t end = start + size - 1;
936 	int result = -EBUSY;
937 
938 	if (!parent)
939 		goto skip;
940 
941 	if ((start < parent->start) || (end > parent->end))
942 		goto out;
943 
944 	if (res->sibling && (res->sibling->start <= end))
945 		goto out;
946 
947 	tmp = parent->child;
948 	if (tmp != res) {
949 		while (tmp->sibling != res)
950 			tmp = tmp->sibling;
951 		if (start <= tmp->end)
952 			goto out;
953 	}
954 
955 skip:
956 	for (tmp = res->child; tmp; tmp = tmp->sibling)
957 		if ((tmp->start < start) || (tmp->end > end))
958 			goto out;
959 
960 	res->start = start;
961 	res->end = end;
962 	result = 0;
963 
964  out:
965 	return result;
966 }
967 
968 /**
969  * adjust_resource - modify a resource's start and size
970  * @res: resource to modify
971  * @start: new start value
972  * @size: new size
973  *
974  * Given an existing resource, change its start and size to match the
975  * arguments.  Returns 0 on success, -EBUSY if it can't fit.
976  * Existing children of the resource are assumed to be immutable.
977  */
978 int adjust_resource(struct resource *res, resource_size_t start,
979 			resource_size_t size)
980 {
981 	int result;
982 
983 	write_lock(&resource_lock);
984 	result = __adjust_resource(res, start, size);
985 	write_unlock(&resource_lock);
986 	return result;
987 }
988 EXPORT_SYMBOL(adjust_resource);
989 
990 static void __init __reserve_region_with_split(struct resource *root,
991 		resource_size_t start, resource_size_t end,
992 		const char *name)
993 {
994 	struct resource *parent = root;
995 	struct resource *conflict;
996 	struct resource *res = alloc_resource(GFP_ATOMIC);
997 	struct resource *next_res = NULL;
998 
999 	if (!res)
1000 		return;
1001 
1002 	res->name = name;
1003 	res->start = start;
1004 	res->end = end;
1005 	res->flags = IORESOURCE_BUSY;
1006 	res->desc = IORES_DESC_NONE;
1007 
1008 	while (1) {
1009 
1010 		conflict = __request_resource(parent, res);
1011 		if (!conflict) {
1012 			if (!next_res)
1013 				break;
1014 			res = next_res;
1015 			next_res = NULL;
1016 			continue;
1017 		}
1018 
1019 		/* conflict covered whole area */
1020 		if (conflict->start <= res->start &&
1021 				conflict->end >= res->end) {
1022 			free_resource(res);
1023 			WARN_ON(next_res);
1024 			break;
1025 		}
1026 
1027 		/* failed, split and try again */
1028 		if (conflict->start > res->start) {
1029 			end = res->end;
1030 			res->end = conflict->start - 1;
1031 			if (conflict->end < end) {
1032 				next_res = alloc_resource(GFP_ATOMIC);
1033 				if (!next_res) {
1034 					free_resource(res);
1035 					break;
1036 				}
1037 				next_res->name = name;
1038 				next_res->start = conflict->end + 1;
1039 				next_res->end = end;
1040 				next_res->flags = IORESOURCE_BUSY;
1041 				next_res->desc = IORES_DESC_NONE;
1042 			}
1043 		} else {
1044 			res->start = conflict->end + 1;
1045 		}
1046 	}
1047 
1048 }
1049 
1050 void __init reserve_region_with_split(struct resource *root,
1051 		resource_size_t start, resource_size_t end,
1052 		const char *name)
1053 {
1054 	int abort = 0;
1055 
1056 	write_lock(&resource_lock);
1057 	if (root->start > start || root->end < end) {
1058 		pr_err("requested range [0x%llx-0x%llx] not in root %pr\n",
1059 		       (unsigned long long)start, (unsigned long long)end,
1060 		       root);
1061 		if (start > root->end || end < root->start)
1062 			abort = 1;
1063 		else {
1064 			if (end > root->end)
1065 				end = root->end;
1066 			if (start < root->start)
1067 				start = root->start;
1068 			pr_err("fixing request to [0x%llx-0x%llx]\n",
1069 			       (unsigned long long)start,
1070 			       (unsigned long long)end);
1071 		}
1072 		dump_stack();
1073 	}
1074 	if (!abort)
1075 		__reserve_region_with_split(root, start, end, name);
1076 	write_unlock(&resource_lock);
1077 }
1078 
1079 /**
1080  * resource_alignment - calculate resource's alignment
1081  * @res: resource pointer
1082  *
1083  * Returns alignment on success, 0 (invalid alignment) on failure.
1084  */
1085 resource_size_t resource_alignment(struct resource *res)
1086 {
1087 	switch (res->flags & (IORESOURCE_SIZEALIGN | IORESOURCE_STARTALIGN)) {
1088 	case IORESOURCE_SIZEALIGN:
1089 		return resource_size(res);
1090 	case IORESOURCE_STARTALIGN:
1091 		return res->start;
1092 	default:
1093 		return 0;
1094 	}
1095 }
1096 
1097 /*
1098  * This is compatibility stuff for IO resources.
1099  *
1100  * Note how this, unlike the above, knows about
1101  * the IO flag meanings (busy etc).
1102  *
1103  * request_region creates a new busy region.
1104  *
1105  * release_region releases a matching busy region.
1106  */
1107 
1108 static DECLARE_WAIT_QUEUE_HEAD(muxed_resource_wait);
1109 
1110 /**
1111  * __request_region - create a new busy resource region
1112  * @parent: parent resource descriptor
1113  * @start: resource start address
1114  * @n: resource region size
1115  * @name: reserving caller's ID string
1116  * @flags: IO resource flags
1117  */
1118 struct resource * __request_region(struct resource *parent,
1119 				   resource_size_t start, resource_size_t n,
1120 				   const char *name, int flags)
1121 {
1122 	DECLARE_WAITQUEUE(wait, current);
1123 	struct resource *res = alloc_resource(GFP_KERNEL);
1124 
1125 	if (!res)
1126 		return NULL;
1127 
1128 	res->name = name;
1129 	res->start = start;
1130 	res->end = start + n - 1;
1131 
1132 	write_lock(&resource_lock);
1133 
1134 	for (;;) {
1135 		struct resource *conflict;
1136 
1137 		res->flags = resource_type(parent) | resource_ext_type(parent);
1138 		res->flags |= IORESOURCE_BUSY | flags;
1139 		res->desc = parent->desc;
1140 
1141 		conflict = __request_resource(parent, res);
1142 		if (!conflict)
1143 			break;
1144 		if (conflict != parent) {
1145 			if (!(conflict->flags & IORESOURCE_BUSY)) {
1146 				parent = conflict;
1147 				continue;
1148 			}
1149 		}
1150 		if (conflict->flags & flags & IORESOURCE_MUXED) {
1151 			add_wait_queue(&muxed_resource_wait, &wait);
1152 			write_unlock(&resource_lock);
1153 			set_current_state(TASK_UNINTERRUPTIBLE);
1154 			schedule();
1155 			remove_wait_queue(&muxed_resource_wait, &wait);
1156 			write_lock(&resource_lock);
1157 			continue;
1158 		}
1159 		/* Uhhuh, that didn't work out.. */
1160 		free_resource(res);
1161 		res = NULL;
1162 		break;
1163 	}
1164 	write_unlock(&resource_lock);
1165 	return res;
1166 }
1167 EXPORT_SYMBOL(__request_region);
1168 
1169 /**
1170  * __release_region - release a previously reserved resource region
1171  * @parent: parent resource descriptor
1172  * @start: resource start address
1173  * @n: resource region size
1174  *
1175  * The described resource region must match a currently busy region.
1176  */
1177 void __release_region(struct resource *parent, resource_size_t start,
1178 			resource_size_t n)
1179 {
1180 	struct resource **p;
1181 	resource_size_t end;
1182 
1183 	p = &parent->child;
1184 	end = start + n - 1;
1185 
1186 	write_lock(&resource_lock);
1187 
1188 	for (;;) {
1189 		struct resource *res = *p;
1190 
1191 		if (!res)
1192 			break;
1193 		if (res->start <= start && res->end >= end) {
1194 			if (!(res->flags & IORESOURCE_BUSY)) {
1195 				p = &res->child;
1196 				continue;
1197 			}
1198 			if (res->start != start || res->end != end)
1199 				break;
1200 			*p = res->sibling;
1201 			write_unlock(&resource_lock);
1202 			if (res->flags & IORESOURCE_MUXED)
1203 				wake_up(&muxed_resource_wait);
1204 			free_resource(res);
1205 			return;
1206 		}
1207 		p = &res->sibling;
1208 	}
1209 
1210 	write_unlock(&resource_lock);
1211 
1212 	printk(KERN_WARNING "Trying to free nonexistent resource "
1213 		"<%016llx-%016llx>\n", (unsigned long long)start,
1214 		(unsigned long long)end);
1215 }
1216 EXPORT_SYMBOL(__release_region);
1217 
1218 #ifdef CONFIG_MEMORY_HOTREMOVE
1219 /**
1220  * release_mem_region_adjustable - release a previously reserved memory region
1221  * @parent: parent resource descriptor
1222  * @start: resource start address
1223  * @size: resource region size
1224  *
1225  * This interface is intended for memory hot-delete.  The requested region
1226  * is released from a currently busy memory resource.  The requested region
1227  * must either match exactly or fit into a single busy resource entry.  In
1228  * the latter case, the remaining resource is adjusted accordingly.
1229  * Existing children of the busy memory resource must be immutable in the
1230  * request.
1231  *
1232  * Note:
1233  * - Additional release conditions, such as overlapping region, can be
1234  *   supported after they are confirmed as valid cases.
1235  * - When a busy memory resource gets split into two entries, the code
1236  *   assumes that all children remain in the lower address entry for
1237  *   simplicity.  Enhance this logic when necessary.
1238  */
1239 int release_mem_region_adjustable(struct resource *parent,
1240 			resource_size_t start, resource_size_t size)
1241 {
1242 	struct resource **p;
1243 	struct resource *res;
1244 	struct resource *new_res;
1245 	resource_size_t end;
1246 	int ret = -EINVAL;
1247 
1248 	end = start + size - 1;
1249 	if ((start < parent->start) || (end > parent->end))
1250 		return ret;
1251 
1252 	/* The alloc_resource() result gets checked later */
1253 	new_res = alloc_resource(GFP_KERNEL);
1254 
1255 	p = &parent->child;
1256 	write_lock(&resource_lock);
1257 
1258 	while ((res = *p)) {
1259 		if (res->start >= end)
1260 			break;
1261 
1262 		/* look for the next resource if it does not fit into */
1263 		if (res->start > start || res->end < end) {
1264 			p = &res->sibling;
1265 			continue;
1266 		}
1267 
1268 		if (!(res->flags & IORESOURCE_MEM))
1269 			break;
1270 
1271 		if (!(res->flags & IORESOURCE_BUSY)) {
1272 			p = &res->child;
1273 			continue;
1274 		}
1275 
1276 		/* found the target resource; let's adjust accordingly */
1277 		if (res->start == start && res->end == end) {
1278 			/* free the whole entry */
1279 			*p = res->sibling;
1280 			free_resource(res);
1281 			ret = 0;
1282 		} else if (res->start == start && res->end != end) {
1283 			/* adjust the start */
1284 			ret = __adjust_resource(res, end + 1,
1285 						res->end - end);
1286 		} else if (res->start != start && res->end == end) {
1287 			/* adjust the end */
1288 			ret = __adjust_resource(res, res->start,
1289 						start - res->start);
1290 		} else {
1291 			/* split into two entries */
1292 			if (!new_res) {
1293 				ret = -ENOMEM;
1294 				break;
1295 			}
1296 			new_res->name = res->name;
1297 			new_res->start = end + 1;
1298 			new_res->end = res->end;
1299 			new_res->flags = res->flags;
1300 			new_res->desc = res->desc;
1301 			new_res->parent = res->parent;
1302 			new_res->sibling = res->sibling;
1303 			new_res->child = NULL;
1304 
1305 			ret = __adjust_resource(res, res->start,
1306 						start - res->start);
1307 			if (ret)
1308 				break;
1309 			res->sibling = new_res;
1310 			new_res = NULL;
1311 		}
1312 
1313 		break;
1314 	}
1315 
1316 	write_unlock(&resource_lock);
1317 	free_resource(new_res);
1318 	return ret;
1319 }
1320 #endif	/* CONFIG_MEMORY_HOTREMOVE */
1321 
1322 /*
1323  * Managed region resource
1324  */
1325 static void devm_resource_release(struct device *dev, void *ptr)
1326 {
1327 	struct resource **r = ptr;
1328 
1329 	release_resource(*r);
1330 }
1331 
1332 /**
1333  * devm_request_resource() - request and reserve an I/O or memory resource
1334  * @dev: device for which to request the resource
1335  * @root: root of the resource tree from which to request the resource
1336  * @new: descriptor of the resource to request
1337  *
1338  * This is a device-managed version of request_resource(). There is usually
1339  * no need to release resources requested by this function explicitly since
1340  * that will be taken care of when the device is unbound from its driver.
1341  * If for some reason the resource needs to be released explicitly, because
1342  * of ordering issues for example, drivers must call devm_release_resource()
1343  * rather than the regular release_resource().
1344  *
1345  * When a conflict is detected between any existing resources and the newly
1346  * requested resource, an error message will be printed.
1347  *
1348  * Returns 0 on success or a negative error code on failure.
1349  */
1350 int devm_request_resource(struct device *dev, struct resource *root,
1351 			  struct resource *new)
1352 {
1353 	struct resource *conflict, **ptr;
1354 
1355 	ptr = devres_alloc(devm_resource_release, sizeof(*ptr), GFP_KERNEL);
1356 	if (!ptr)
1357 		return -ENOMEM;
1358 
1359 	*ptr = new;
1360 
1361 	conflict = request_resource_conflict(root, new);
1362 	if (conflict) {
1363 		dev_err(dev, "resource collision: %pR conflicts with %s %pR\n",
1364 			new, conflict->name, conflict);
1365 		devres_free(ptr);
1366 		return -EBUSY;
1367 	}
1368 
1369 	devres_add(dev, ptr);
1370 	return 0;
1371 }
1372 EXPORT_SYMBOL(devm_request_resource);
1373 
1374 static int devm_resource_match(struct device *dev, void *res, void *data)
1375 {
1376 	struct resource **ptr = res;
1377 
1378 	return *ptr == data;
1379 }
1380 
1381 /**
1382  * devm_release_resource() - release a previously requested resource
1383  * @dev: device for which to release the resource
1384  * @new: descriptor of the resource to release
1385  *
1386  * Releases a resource previously requested using devm_request_resource().
1387  */
1388 void devm_release_resource(struct device *dev, struct resource *new)
1389 {
1390 	WARN_ON(devres_release(dev, devm_resource_release, devm_resource_match,
1391 			       new));
1392 }
1393 EXPORT_SYMBOL(devm_release_resource);
1394 
1395 struct region_devres {
1396 	struct resource *parent;
1397 	resource_size_t start;
1398 	resource_size_t n;
1399 };
1400 
1401 static void devm_region_release(struct device *dev, void *res)
1402 {
1403 	struct region_devres *this = res;
1404 
1405 	__release_region(this->parent, this->start, this->n);
1406 }
1407 
1408 static int devm_region_match(struct device *dev, void *res, void *match_data)
1409 {
1410 	struct region_devres *this = res, *match = match_data;
1411 
1412 	return this->parent == match->parent &&
1413 		this->start == match->start && this->n == match->n;
1414 }
1415 
1416 struct resource * __devm_request_region(struct device *dev,
1417 				struct resource *parent, resource_size_t start,
1418 				resource_size_t n, const char *name)
1419 {
1420 	struct region_devres *dr = NULL;
1421 	struct resource *res;
1422 
1423 	dr = devres_alloc(devm_region_release, sizeof(struct region_devres),
1424 			  GFP_KERNEL);
1425 	if (!dr)
1426 		return NULL;
1427 
1428 	dr->parent = parent;
1429 	dr->start = start;
1430 	dr->n = n;
1431 
1432 	res = __request_region(parent, start, n, name, 0);
1433 	if (res)
1434 		devres_add(dev, dr);
1435 	else
1436 		devres_free(dr);
1437 
1438 	return res;
1439 }
1440 EXPORT_SYMBOL(__devm_request_region);
1441 
1442 void __devm_release_region(struct device *dev, struct resource *parent,
1443 			   resource_size_t start, resource_size_t n)
1444 {
1445 	struct region_devres match_data = { parent, start, n };
1446 
1447 	__release_region(parent, start, n);
1448 	WARN_ON(devres_destroy(dev, devm_region_release, devm_region_match,
1449 			       &match_data));
1450 }
1451 EXPORT_SYMBOL(__devm_release_region);
1452 
1453 /*
1454  * Called from init/main.c to reserve IO ports.
1455  */
1456 #define MAXRESERVE 4
1457 static int __init reserve_setup(char *str)
1458 {
1459 	static int reserved;
1460 	static struct resource reserve[MAXRESERVE];
1461 
1462 	for (;;) {
1463 		unsigned int io_start, io_num;
1464 		int x = reserved;
1465 
1466 		if (get_option (&str, &io_start) != 2)
1467 			break;
1468 		if (get_option (&str, &io_num)   == 0)
1469 			break;
1470 		if (x < MAXRESERVE) {
1471 			struct resource *res = reserve + x;
1472 			res->name = "reserved";
1473 			res->start = io_start;
1474 			res->end = io_start + io_num - 1;
1475 			res->flags = IORESOURCE_BUSY;
1476 			res->desc = IORES_DESC_NONE;
1477 			res->child = NULL;
1478 			if (request_resource(res->start >= 0x10000 ? &iomem_resource : &ioport_resource, res) == 0)
1479 				reserved = x+1;
1480 		}
1481 	}
1482 	return 1;
1483 }
1484 
1485 __setup("reserve=", reserve_setup);
1486 
1487 /*
1488  * Check if the requested addr and size spans more than any slot in the
1489  * iomem resource tree.
1490  */
1491 int iomem_map_sanity_check(resource_size_t addr, unsigned long size)
1492 {
1493 	struct resource *p = &iomem_resource;
1494 	int err = 0;
1495 	loff_t l;
1496 
1497 	read_lock(&resource_lock);
1498 	for (p = p->child; p ; p = r_next(NULL, p, &l)) {
1499 		/*
1500 		 * We can probably skip the resources without
1501 		 * IORESOURCE_IO attribute?
1502 		 */
1503 		if (p->start >= addr + size)
1504 			continue;
1505 		if (p->end < addr)
1506 			continue;
1507 		if (PFN_DOWN(p->start) <= PFN_DOWN(addr) &&
1508 		    PFN_DOWN(p->end) >= PFN_DOWN(addr + size - 1))
1509 			continue;
1510 		/*
1511 		 * if a resource is "BUSY", it's not a hardware resource
1512 		 * but a driver mapping of such a resource; we don't want
1513 		 * to warn for those; some drivers legitimately map only
1514 		 * partial hardware resources. (example: vesafb)
1515 		 */
1516 		if (p->flags & IORESOURCE_BUSY)
1517 			continue;
1518 
1519 		printk(KERN_WARNING "resource sanity check: requesting [mem %#010llx-%#010llx], which spans more than %s %pR\n",
1520 		       (unsigned long long)addr,
1521 		       (unsigned long long)(addr + size - 1),
1522 		       p->name, p);
1523 		err = -1;
1524 		break;
1525 	}
1526 	read_unlock(&resource_lock);
1527 
1528 	return err;
1529 }
1530 
1531 #ifdef CONFIG_STRICT_DEVMEM
1532 static int strict_iomem_checks = 1;
1533 #else
1534 static int strict_iomem_checks;
1535 #endif
1536 
1537 /*
1538  * check if an address is reserved in the iomem resource tree
1539  * returns 1 if reserved, 0 if not reserved.
1540  */
1541 int iomem_is_exclusive(u64 addr)
1542 {
1543 	struct resource *p = &iomem_resource;
1544 	int err = 0;
1545 	loff_t l;
1546 	int size = PAGE_SIZE;
1547 
1548 	if (!strict_iomem_checks)
1549 		return 0;
1550 
1551 	addr = addr & PAGE_MASK;
1552 
1553 	read_lock(&resource_lock);
1554 	for (p = p->child; p ; p = r_next(NULL, p, &l)) {
1555 		/*
1556 		 * We can probably skip the resources without
1557 		 * IORESOURCE_IO attribute?
1558 		 */
1559 		if (p->start >= addr + size)
1560 			break;
1561 		if (p->end < addr)
1562 			continue;
1563 		/*
1564 		 * A resource is exclusive if IORESOURCE_EXCLUSIVE is set
1565 		 * or CONFIG_IO_STRICT_DEVMEM is enabled and the
1566 		 * resource is busy.
1567 		 */
1568 		if ((p->flags & IORESOURCE_BUSY) == 0)
1569 			continue;
1570 		if (IS_ENABLED(CONFIG_IO_STRICT_DEVMEM)
1571 				|| p->flags & IORESOURCE_EXCLUSIVE) {
1572 			err = 1;
1573 			break;
1574 		}
1575 	}
1576 	read_unlock(&resource_lock);
1577 
1578 	return err;
1579 }
1580 
1581 struct resource_entry *resource_list_create_entry(struct resource *res,
1582 						  size_t extra_size)
1583 {
1584 	struct resource_entry *entry;
1585 
1586 	entry = kzalloc(sizeof(*entry) + extra_size, GFP_KERNEL);
1587 	if (entry) {
1588 		INIT_LIST_HEAD(&entry->node);
1589 		entry->res = res ? res : &entry->__res;
1590 	}
1591 
1592 	return entry;
1593 }
1594 EXPORT_SYMBOL(resource_list_create_entry);
1595 
1596 void resource_list_free(struct list_head *head)
1597 {
1598 	struct resource_entry *entry, *tmp;
1599 
1600 	list_for_each_entry_safe(entry, tmp, head, node)
1601 		resource_list_destroy_entry(entry);
1602 }
1603 EXPORT_SYMBOL(resource_list_free);
1604 
1605 static int __init strict_iomem(char *str)
1606 {
1607 	if (strstr(str, "relaxed"))
1608 		strict_iomem_checks = 0;
1609 	if (strstr(str, "strict"))
1610 		strict_iomem_checks = 1;
1611 	return 1;
1612 }
1613 
1614 __setup("iomem=", strict_iomem);
1615