xref: /linux/drivers/pcmcia/rsrc_nonstatic.c (revision e9f0878c4b2004ac19581274c1ae4c61ae3ca70e)
1 /*
2  * rsrc_nonstatic.c -- Resource management routines for !SS_CAP_STATIC_MAP sockets
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * The initial developer of the original code is David A. Hinds
9  * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
10  * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
11  *
12  * (C) 1999		David A. Hinds
13  */
14 
15 #include <linux/module.h>
16 #include <linux/moduleparam.h>
17 #include <linux/init.h>
18 #include <linux/interrupt.h>
19 #include <linux/kernel.h>
20 #include <linux/errno.h>
21 #include <linux/types.h>
22 #include <linux/slab.h>
23 #include <linux/ioport.h>
24 #include <linux/timer.h>
25 #include <linux/pci.h>
26 #include <linux/device.h>
27 #include <linux/io.h>
28 
29 #include <asm/irq.h>
30 
31 #include <pcmcia/ss.h>
32 #include <pcmcia/cistpl.h>
33 #include "cs_internal.h"
34 
35 /* moved to rsrc_mgr.c
36 MODULE_AUTHOR("David A. Hinds, Dominik Brodowski");
37 MODULE_LICENSE("GPL");
38 */
39 
40 /* Parameters that can be set with 'insmod' */
41 
42 #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0444)
43 
44 INT_MODULE_PARM(probe_mem,	1);		/* memory probe? */
45 #ifdef CONFIG_PCMCIA_PROBE
46 INT_MODULE_PARM(probe_io,	1);		/* IO port probe? */
47 INT_MODULE_PARM(mem_limit,	0x10000);
48 #endif
49 
50 /* for io_db and mem_db */
51 struct resource_map {
52 	u_long			base, num;
53 	struct resource_map	*next;
54 };
55 
56 struct socket_data {
57 	struct resource_map		mem_db;
58 	struct resource_map		mem_db_valid;
59 	struct resource_map		io_db;
60 };
61 
62 #define MEM_PROBE_LOW	(1 << 0)
63 #define MEM_PROBE_HIGH	(1 << 1)
64 
65 /* Action field */
66 #define REMOVE_MANAGED_RESOURCE		1
67 #define ADD_MANAGED_RESOURCE		2
68 
69 /*======================================================================
70 
71     Linux resource management extensions
72 
73 ======================================================================*/
74 
75 static struct resource *
76 claim_region(struct pcmcia_socket *s, resource_size_t base,
77 		resource_size_t size, int type, char *name)
78 {
79 	struct resource *res, *parent;
80 
81 	parent = type & IORESOURCE_MEM ? &iomem_resource : &ioport_resource;
82 	res = pcmcia_make_resource(base, size, type | IORESOURCE_BUSY, name);
83 
84 	if (res) {
85 #ifdef CONFIG_PCI
86 		if (s && s->cb_dev)
87 			parent = pci_find_parent_resource(s->cb_dev, res);
88 #endif
89 		if (!parent || request_resource(parent, res)) {
90 			kfree(res);
91 			res = NULL;
92 		}
93 	}
94 	return res;
95 }
96 
97 static void free_region(struct resource *res)
98 {
99 	if (res) {
100 		release_resource(res);
101 		kfree(res);
102 	}
103 }
104 
105 /*======================================================================
106 
107     These manage the internal databases of available resources.
108 
109 ======================================================================*/
110 
111 static int add_interval(struct resource_map *map, u_long base, u_long num)
112 {
113 	struct resource_map *p, *q;
114 
115 	for (p = map; ; p = p->next) {
116 		if ((p != map) && (p->base+p->num >= base)) {
117 			p->num = max(num + base - p->base, p->num);
118 			return 0;
119 		}
120 		if ((p->next == map) || (p->next->base > base+num-1))
121 			break;
122 	}
123 	q = kmalloc(sizeof(struct resource_map), GFP_KERNEL);
124 	if (!q) {
125 		printk(KERN_WARNING "out of memory to update resources\n");
126 		return -ENOMEM;
127 	}
128 	q->base = base; q->num = num;
129 	q->next = p->next; p->next = q;
130 	return 0;
131 }
132 
133 /*====================================================================*/
134 
135 static int sub_interval(struct resource_map *map, u_long base, u_long num)
136 {
137 	struct resource_map *p, *q;
138 
139 	for (p = map; ; p = q) {
140 		q = p->next;
141 		if (q == map)
142 			break;
143 		if ((q->base+q->num > base) && (base+num > q->base)) {
144 			if (q->base >= base) {
145 				if (q->base+q->num <= base+num) {
146 					/* Delete whole block */
147 					p->next = q->next;
148 					kfree(q);
149 					/* don't advance the pointer yet */
150 					q = p;
151 				} else {
152 					/* Cut off bit from the front */
153 					q->num = q->base + q->num - base - num;
154 					q->base = base + num;
155 				}
156 			} else if (q->base+q->num <= base+num) {
157 				/* Cut off bit from the end */
158 				q->num = base - q->base;
159 			} else {
160 				/* Split the block into two pieces */
161 				p = kmalloc(sizeof(struct resource_map),
162 					GFP_KERNEL);
163 				if (!p) {
164 					printk(KERN_WARNING "out of memory to update resources\n");
165 					return -ENOMEM;
166 				}
167 				p->base = base+num;
168 				p->num = q->base+q->num - p->base;
169 				q->num = base - q->base;
170 				p->next = q->next ; q->next = p;
171 			}
172 		}
173 	}
174 	return 0;
175 }
176 
177 /*======================================================================
178 
179     These routines examine a region of IO or memory addresses to
180     determine what ranges might be genuinely available.
181 
182 ======================================================================*/
183 
184 #ifdef CONFIG_PCMCIA_PROBE
185 static void do_io_probe(struct pcmcia_socket *s, unsigned int base,
186 			unsigned int num)
187 {
188 	struct resource *res;
189 	struct socket_data *s_data = s->resource_data;
190 	unsigned int i, j, bad;
191 	int any;
192 	u_char *b, hole, most;
193 
194 	dev_info(&s->dev, "cs: IO port probe %#x-%#x:", base, base+num-1);
195 
196 	/* First, what does a floating port look like? */
197 	b = kzalloc(256, GFP_KERNEL);
198 	if (!b) {
199 		pr_cont("\n");
200 		dev_err(&s->dev, "do_io_probe: unable to kmalloc 256 bytes\n");
201 		return;
202 	}
203 	for (i = base, most = 0; i < base+num; i += 8) {
204 		res = claim_region(s, i, 8, IORESOURCE_IO, "PCMCIA ioprobe");
205 		if (!res)
206 			continue;
207 		hole = inb(i);
208 		for (j = 1; j < 8; j++)
209 			if (inb(i+j) != hole)
210 				break;
211 		free_region(res);
212 		if ((j == 8) && (++b[hole] > b[most]))
213 			most = hole;
214 		if (b[most] == 127)
215 			break;
216 	}
217 	kfree(b);
218 
219 	bad = any = 0;
220 	for (i = base; i < base+num; i += 8) {
221 		res = claim_region(s, i, 8, IORESOURCE_IO, "PCMCIA ioprobe");
222 		if (!res) {
223 			if (!any)
224 				pr_cont(" excluding");
225 			if (!bad)
226 				bad = any = i;
227 			continue;
228 		}
229 		for (j = 0; j < 8; j++)
230 			if (inb(i+j) != most)
231 				break;
232 		free_region(res);
233 		if (j < 8) {
234 			if (!any)
235 				pr_cont(" excluding");
236 			if (!bad)
237 				bad = any = i;
238 		} else {
239 			if (bad) {
240 				sub_interval(&s_data->io_db, bad, i-bad);
241 				pr_cont(" %#x-%#x", bad, i-1);
242 				bad = 0;
243 			}
244 		}
245 	}
246 	if (bad) {
247 		if ((num > 16) && (bad == base) && (i == base+num)) {
248 			sub_interval(&s_data->io_db, bad, i-bad);
249 			pr_cont(" nothing: probe failed.\n");
250 			return;
251 		} else {
252 			sub_interval(&s_data->io_db, bad, i-bad);
253 			pr_cont(" %#x-%#x", bad, i-1);
254 		}
255 	}
256 
257 	pr_cont("%s\n", !any ? " clean" : "");
258 }
259 #endif
260 
261 /*======================================================================*/
262 
263 /**
264  * readable() - iomem validation function for cards with a valid CIS
265  */
266 static int readable(struct pcmcia_socket *s, struct resource *res,
267 		    unsigned int *count)
268 {
269 	int ret = -EINVAL;
270 
271 	if (s->fake_cis) {
272 		dev_dbg(&s->dev, "fake CIS is being used: can't validate mem\n");
273 		return 0;
274 	}
275 
276 	s->cis_mem.res = res;
277 	s->cis_virt = ioremap(res->start, s->map_size);
278 	if (s->cis_virt) {
279 		mutex_unlock(&s->ops_mutex);
280 		/* as we're only called from pcmcia.c, we're safe */
281 		if (s->callback->validate)
282 			ret = s->callback->validate(s, count);
283 		/* invalidate mapping */
284 		mutex_lock(&s->ops_mutex);
285 		iounmap(s->cis_virt);
286 		s->cis_virt = NULL;
287 	}
288 	s->cis_mem.res = NULL;
289 	if ((ret) || (*count == 0))
290 		return -EINVAL;
291 	return 0;
292 }
293 
294 /**
295  * checksum() - iomem validation function for simple memory cards
296  */
297 static int checksum(struct pcmcia_socket *s, struct resource *res,
298 		    unsigned int *value)
299 {
300 	pccard_mem_map map;
301 	int i, a = 0, b = -1, d;
302 	void __iomem *virt;
303 
304 	virt = ioremap(res->start, s->map_size);
305 	if (virt) {
306 		map.map = 0;
307 		map.flags = MAP_ACTIVE;
308 		map.speed = 0;
309 		map.res = res;
310 		map.card_start = 0;
311 		s->ops->set_mem_map(s, &map);
312 
313 		/* Don't bother checking every word... */
314 		for (i = 0; i < s->map_size; i += 44) {
315 			d = readl(virt+i);
316 			a += d;
317 			b &= d;
318 		}
319 
320 		map.flags = 0;
321 		s->ops->set_mem_map(s, &map);
322 
323 		iounmap(virt);
324 	}
325 
326 	if (b == -1)
327 		return -EINVAL;
328 
329 	*value = a;
330 
331 	return 0;
332 }
333 
334 /**
335  * do_validate_mem() - low level validate a memory region for PCMCIA use
336  * @s:		PCMCIA socket to validate
337  * @base:	start address of resource to check
338  * @size:	size of resource to check
339  * @validate:	validation function to use
340  *
341  * do_validate_mem() splits up the memory region which is to be checked
342  * into two parts. Both are passed to the @validate() function. If
343  * @validate() returns non-zero, or the value parameter to @validate()
344  * is zero, or the value parameter is different between both calls,
345  * the check fails, and -EINVAL is returned. Else, 0 is returned.
346  */
347 static int do_validate_mem(struct pcmcia_socket *s,
348 			   unsigned long base, unsigned long size,
349 			   int validate (struct pcmcia_socket *s,
350 					 struct resource *res,
351 					 unsigned int *value))
352 {
353 	struct socket_data *s_data = s->resource_data;
354 	struct resource *res1, *res2;
355 	unsigned int info1 = 1, info2 = 1;
356 	int ret = -EINVAL;
357 
358 	res1 = claim_region(s, base, size/2, IORESOURCE_MEM, "PCMCIA memprobe");
359 	res2 = claim_region(s, base + size/2, size/2, IORESOURCE_MEM,
360 			"PCMCIA memprobe");
361 
362 	if (res1 && res2) {
363 		ret = 0;
364 		if (validate) {
365 			ret = validate(s, res1, &info1);
366 			ret += validate(s, res2, &info2);
367 		}
368 	}
369 
370 	dev_dbg(&s->dev, "cs: memory probe 0x%06lx-0x%06lx: %pr %pr %u %u %u",
371 		base, base+size-1, res1, res2, ret, info1, info2);
372 
373 	free_region(res2);
374 	free_region(res1);
375 
376 	if ((ret) || (info1 != info2) || (info1 == 0))
377 		return -EINVAL;
378 
379 	if (validate && !s->fake_cis) {
380 		/* move it to the validated data set */
381 		add_interval(&s_data->mem_db_valid, base, size);
382 		sub_interval(&s_data->mem_db, base, size);
383 	}
384 
385 	return 0;
386 }
387 
388 
389 /**
390  * do_mem_probe() - validate a memory region for PCMCIA use
391  * @s:		PCMCIA socket to validate
392  * @base:	start address of resource to check
393  * @num:	size of resource to check
394  * @validate:	validation function to use
395  * @fallback:	validation function to use if validate fails
396  *
397  * do_mem_probe() checks a memory region for use by the PCMCIA subsystem.
398  * To do so, the area is split up into sensible parts, and then passed
399  * into the @validate() function. Only if @validate() and @fallback() fail,
400  * the area is marked as unavaibale for use by the PCMCIA subsystem. The
401  * function returns the size of the usable memory area.
402  */
403 static int do_mem_probe(struct pcmcia_socket *s, u_long base, u_long num,
404 			int validate (struct pcmcia_socket *s,
405 				      struct resource *res,
406 				      unsigned int *value),
407 			int fallback (struct pcmcia_socket *s,
408 				      struct resource *res,
409 				      unsigned int *value))
410 {
411 	struct socket_data *s_data = s->resource_data;
412 	u_long i, j, bad, fail, step;
413 
414 	dev_info(&s->dev, "cs: memory probe 0x%06lx-0x%06lx:",
415 		 base, base+num-1);
416 	bad = fail = 0;
417 	step = (num < 0x20000) ? 0x2000 : ((num>>4) & ~0x1fff);
418 	/* don't allow too large steps */
419 	if (step > 0x800000)
420 		step = 0x800000;
421 	/* cis_readable wants to map 2x map_size */
422 	if (step < 2 * s->map_size)
423 		step = 2 * s->map_size;
424 	for (i = j = base; i < base+num; i = j + step) {
425 		if (!fail) {
426 			for (j = i; j < base+num; j += step) {
427 				if (!do_validate_mem(s, j, step, validate))
428 					break;
429 			}
430 			fail = ((i == base) && (j == base+num));
431 		}
432 		if ((fail) && (fallback)) {
433 			for (j = i; j < base+num; j += step)
434 				if (!do_validate_mem(s, j, step, fallback))
435 					break;
436 		}
437 		if (i != j) {
438 			if (!bad)
439 				pr_cont(" excluding");
440 			pr_cont(" %#05lx-%#05lx", i, j-1);
441 			sub_interval(&s_data->mem_db, i, j-i);
442 			bad += j-i;
443 		}
444 	}
445 	pr_cont("%s\n", !bad ? " clean" : "");
446 	return num - bad;
447 }
448 
449 
450 #ifdef CONFIG_PCMCIA_PROBE
451 
452 /**
453  * inv_probe() - top-to-bottom search for one usuable high memory area
454  * @s:		PCMCIA socket to validate
455  * @m:		resource_map to check
456  */
457 static u_long inv_probe(struct resource_map *m, struct pcmcia_socket *s)
458 {
459 	struct socket_data *s_data = s->resource_data;
460 	u_long ok;
461 	if (m == &s_data->mem_db)
462 		return 0;
463 	ok = inv_probe(m->next, s);
464 	if (ok) {
465 		if (m->base >= 0x100000)
466 			sub_interval(&s_data->mem_db, m->base, m->num);
467 		return ok;
468 	}
469 	if (m->base < 0x100000)
470 		return 0;
471 	return do_mem_probe(s, m->base, m->num, readable, checksum);
472 }
473 
474 /**
475  * validate_mem() - memory probe function
476  * @s:		PCMCIA socket to validate
477  * @probe_mask: MEM_PROBE_LOW | MEM_PROBE_HIGH
478  *
479  * The memory probe.  If the memory list includes a 64K-aligned block
480  * below 1MB, we probe in 64K chunks, and as soon as we accumulate at
481  * least mem_limit free space, we quit. Returns 0 on usuable ports.
482  */
483 static int validate_mem(struct pcmcia_socket *s, unsigned int probe_mask)
484 {
485 	struct resource_map *m, mm;
486 	static unsigned char order[] = { 0xd0, 0xe0, 0xc0, 0xf0 };
487 	unsigned long b, i, ok = 0;
488 	struct socket_data *s_data = s->resource_data;
489 
490 	/* We do up to four passes through the list */
491 	if (probe_mask & MEM_PROBE_HIGH) {
492 		if (inv_probe(s_data->mem_db.next, s) > 0)
493 			return 0;
494 		if (s_data->mem_db_valid.next != &s_data->mem_db_valid)
495 			return 0;
496 		dev_notice(&s->dev,
497 			   "cs: warning: no high memory space available!\n");
498 		return -ENODEV;
499 	}
500 
501 	for (m = s_data->mem_db.next; m != &s_data->mem_db; m = mm.next) {
502 		mm = *m;
503 		/* Only probe < 1 MB */
504 		if (mm.base >= 0x100000)
505 			continue;
506 		if ((mm.base | mm.num) & 0xffff) {
507 			ok += do_mem_probe(s, mm.base, mm.num, readable,
508 					   checksum);
509 			continue;
510 		}
511 		/* Special probe for 64K-aligned block */
512 		for (i = 0; i < 4; i++) {
513 			b = order[i] << 12;
514 			if ((b >= mm.base) && (b+0x10000 <= mm.base+mm.num)) {
515 				if (ok >= mem_limit)
516 					sub_interval(&s_data->mem_db, b, 0x10000);
517 				else
518 					ok += do_mem_probe(s, b, 0x10000,
519 							   readable, checksum);
520 			}
521 		}
522 	}
523 
524 	if (ok > 0)
525 		return 0;
526 
527 	return -ENODEV;
528 }
529 
530 #else /* CONFIG_PCMCIA_PROBE */
531 
532 /**
533  * validate_mem() - memory probe function
534  * @s:		PCMCIA socket to validate
535  * @probe_mask: ignored
536  *
537  * Returns 0 on usuable ports.
538  */
539 static int validate_mem(struct pcmcia_socket *s, unsigned int probe_mask)
540 {
541 	struct resource_map *m, mm;
542 	struct socket_data *s_data = s->resource_data;
543 	unsigned long ok = 0;
544 
545 	for (m = s_data->mem_db.next; m != &s_data->mem_db; m = mm.next) {
546 		mm = *m;
547 		ok += do_mem_probe(s, mm.base, mm.num, readable, checksum);
548 	}
549 	if (ok > 0)
550 		return 0;
551 	return -ENODEV;
552 }
553 
554 #endif /* CONFIG_PCMCIA_PROBE */
555 
556 
557 /**
558  * pcmcia_nonstatic_validate_mem() - try to validate iomem for PCMCIA use
559  * @s:		PCMCIA socket to validate
560  *
561  * This is tricky... when we set up CIS memory, we try to validate
562  * the memory window space allocations.
563  *
564  * Locking note: Must be called with skt_mutex held!
565  */
566 static int pcmcia_nonstatic_validate_mem(struct pcmcia_socket *s)
567 {
568 	struct socket_data *s_data = s->resource_data;
569 	unsigned int probe_mask = MEM_PROBE_LOW;
570 	int ret;
571 
572 	if (!probe_mem || !(s->state & SOCKET_PRESENT))
573 		return 0;
574 
575 	if (s->features & SS_CAP_PAGE_REGS)
576 		probe_mask = MEM_PROBE_HIGH;
577 
578 	ret = validate_mem(s, probe_mask);
579 
580 	if (s_data->mem_db_valid.next != &s_data->mem_db_valid)
581 		return 0;
582 
583 	return ret;
584 }
585 
586 struct pcmcia_align_data {
587 	unsigned long	mask;
588 	unsigned long	offset;
589 	struct resource_map	*map;
590 };
591 
592 static resource_size_t pcmcia_common_align(struct pcmcia_align_data *align_data,
593 					resource_size_t start)
594 {
595 	resource_size_t ret;
596 	/*
597 	 * Ensure that we have the correct start address
598 	 */
599 	ret = (start & ~align_data->mask) + align_data->offset;
600 	if (ret < start)
601 		ret += align_data->mask + 1;
602 	return ret;
603 }
604 
605 static resource_size_t
606 pcmcia_align(void *align_data, const struct resource *res,
607 	resource_size_t size, resource_size_t align)
608 {
609 	struct pcmcia_align_data *data = align_data;
610 	struct resource_map *m;
611 	resource_size_t start;
612 
613 	start = pcmcia_common_align(data, res->start);
614 
615 	for (m = data->map->next; m != data->map; m = m->next) {
616 		unsigned long map_start = m->base;
617 		unsigned long map_end = m->base + m->num - 1;
618 
619 		/*
620 		 * If the lower resources are not available, try aligning
621 		 * to this entry of the resource database to see if it'll
622 		 * fit here.
623 		 */
624 		if (start < map_start)
625 			start = pcmcia_common_align(data, map_start);
626 
627 		/*
628 		 * If we're above the area which was passed in, there's
629 		 * no point proceeding.
630 		 */
631 		if (start >= res->end)
632 			break;
633 
634 		if ((start + size - 1) <= map_end)
635 			break;
636 	}
637 
638 	/*
639 	 * If we failed to find something suitable, ensure we fail.
640 	 */
641 	if (m == data->map)
642 		start = res->end;
643 
644 	return start;
645 }
646 
647 /*
648  * Adjust an existing IO region allocation, but making sure that we don't
649  * encroach outside the resources which the user supplied.
650  */
651 static int __nonstatic_adjust_io_region(struct pcmcia_socket *s,
652 					unsigned long r_start,
653 					unsigned long r_end)
654 {
655 	struct resource_map *m;
656 	struct socket_data *s_data = s->resource_data;
657 	int ret = -ENOMEM;
658 
659 	for (m = s_data->io_db.next; m != &s_data->io_db; m = m->next) {
660 		unsigned long start = m->base;
661 		unsigned long end = m->base + m->num - 1;
662 
663 		if (start > r_start || r_end > end)
664 			continue;
665 
666 		ret = 0;
667 	}
668 
669 	return ret;
670 }
671 
672 /*======================================================================
673 
674     These find ranges of I/O ports or memory addresses that are not
675     currently allocated by other devices.
676 
677     The 'align' field should reflect the number of bits of address
678     that need to be preserved from the initial value of *base.  It
679     should be a power of two, greater than or equal to 'num'.  A value
680     of 0 means that all bits of *base are significant.  *base should
681     also be strictly less than 'align'.
682 
683 ======================================================================*/
684 
685 static struct resource *__nonstatic_find_io_region(struct pcmcia_socket *s,
686 						unsigned long base, int num,
687 						unsigned long align)
688 {
689 	struct resource *res = pcmcia_make_resource(0, num, IORESOURCE_IO,
690 						dev_name(&s->dev));
691 	struct socket_data *s_data = s->resource_data;
692 	struct pcmcia_align_data data;
693 	unsigned long min = base;
694 	int ret;
695 
696 	data.mask = align - 1;
697 	data.offset = base & data.mask;
698 	data.map = &s_data->io_db;
699 
700 #ifdef CONFIG_PCI
701 	if (s->cb_dev) {
702 		ret = pci_bus_alloc_resource(s->cb_dev->bus, res, num, 1,
703 					     min, 0, pcmcia_align, &data);
704 	} else
705 #endif
706 		ret = allocate_resource(&ioport_resource, res, num, min, ~0UL,
707 					1, pcmcia_align, &data);
708 
709 	if (ret != 0) {
710 		kfree(res);
711 		res = NULL;
712 	}
713 	return res;
714 }
715 
716 static int nonstatic_find_io(struct pcmcia_socket *s, unsigned int attr,
717 			unsigned int *base, unsigned int num,
718 			unsigned int align, struct resource **parent)
719 {
720 	int i, ret = 0;
721 
722 	/* Check for an already-allocated window that must conflict with
723 	 * what was asked for.  It is a hack because it does not catch all
724 	 * potential conflicts, just the most obvious ones.
725 	 */
726 	for (i = 0; i < MAX_IO_WIN; i++) {
727 		if (!s->io[i].res)
728 			continue;
729 
730 		if (!*base)
731 			continue;
732 
733 		if ((s->io[i].res->start & (align-1)) == *base)
734 			return -EBUSY;
735 	}
736 
737 	for (i = 0; i < MAX_IO_WIN; i++) {
738 		struct resource *res = s->io[i].res;
739 		unsigned int try;
740 
741 		if (res && (res->flags & IORESOURCE_BITS) !=
742 			(attr & IORESOURCE_BITS))
743 			continue;
744 
745 		if (!res) {
746 			if (align == 0)
747 				align = 0x10000;
748 
749 			res = s->io[i].res = __nonstatic_find_io_region(s,
750 								*base, num,
751 								align);
752 			if (!res)
753 				return -EINVAL;
754 
755 			*base = res->start;
756 			s->io[i].res->flags =
757 				((res->flags & ~IORESOURCE_BITS) |
758 					(attr & IORESOURCE_BITS));
759 			s->io[i].InUse = num;
760 			*parent = res;
761 			return 0;
762 		}
763 
764 		/* Try to extend top of window */
765 		try = res->end + 1;
766 		if ((*base == 0) || (*base == try)) {
767 			ret =  __nonstatic_adjust_io_region(s, res->start,
768 							res->end + num);
769 			if (!ret) {
770 				ret = adjust_resource(s->io[i].res, res->start,
771 						      resource_size(res) + num);
772 				if (ret)
773 					continue;
774 				*base = try;
775 				s->io[i].InUse += num;
776 				*parent = res;
777 				return 0;
778 			}
779 		}
780 
781 		/* Try to extend bottom of window */
782 		try = res->start - num;
783 		if ((*base == 0) || (*base == try)) {
784 			ret =  __nonstatic_adjust_io_region(s,
785 							res->start - num,
786 							res->end);
787 			if (!ret) {
788 				ret = adjust_resource(s->io[i].res,
789 						      res->start - num,
790 						      resource_size(res) + num);
791 				if (ret)
792 					continue;
793 				*base = try;
794 				s->io[i].InUse += num;
795 				*parent = res;
796 				return 0;
797 			}
798 		}
799 	}
800 
801 	return -EINVAL;
802 }
803 
804 
805 static struct resource *nonstatic_find_mem_region(u_long base, u_long num,
806 		u_long align, int low, struct pcmcia_socket *s)
807 {
808 	struct resource *res = pcmcia_make_resource(0, num, IORESOURCE_MEM,
809 						dev_name(&s->dev));
810 	struct socket_data *s_data = s->resource_data;
811 	struct pcmcia_align_data data;
812 	unsigned long min, max;
813 	int ret, i, j;
814 
815 	low = low || !(s->features & SS_CAP_PAGE_REGS);
816 
817 	data.mask = align - 1;
818 	data.offset = base & data.mask;
819 
820 	for (i = 0; i < 2; i++) {
821 		data.map = &s_data->mem_db_valid;
822 		if (low) {
823 			max = 0x100000UL;
824 			min = base < max ? base : 0;
825 		} else {
826 			max = ~0UL;
827 			min = 0x100000UL + base;
828 		}
829 
830 		for (j = 0; j < 2; j++) {
831 #ifdef CONFIG_PCI
832 			if (s->cb_dev) {
833 				ret = pci_bus_alloc_resource(s->cb_dev->bus,
834 							res, num, 1, min, 0,
835 							pcmcia_align, &data);
836 			} else
837 #endif
838 			{
839 				ret = allocate_resource(&iomem_resource,
840 							res, num, min, max, 1,
841 							pcmcia_align, &data);
842 			}
843 			if (ret == 0)
844 				break;
845 			data.map = &s_data->mem_db;
846 		}
847 		if (ret == 0 || low)
848 			break;
849 		low = 1;
850 	}
851 
852 	if (ret != 0) {
853 		kfree(res);
854 		res = NULL;
855 	}
856 	return res;
857 }
858 
859 
860 static int adjust_memory(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end)
861 {
862 	struct socket_data *data = s->resource_data;
863 	unsigned long size = end - start + 1;
864 	int ret = 0;
865 
866 	if (end < start)
867 		return -EINVAL;
868 
869 	switch (action) {
870 	case ADD_MANAGED_RESOURCE:
871 		ret = add_interval(&data->mem_db, start, size);
872 		if (!ret)
873 			do_mem_probe(s, start, size, NULL, NULL);
874 		break;
875 	case REMOVE_MANAGED_RESOURCE:
876 		ret = sub_interval(&data->mem_db, start, size);
877 		break;
878 	default:
879 		ret = -EINVAL;
880 	}
881 
882 	return ret;
883 }
884 
885 
886 static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end)
887 {
888 	struct socket_data *data = s->resource_data;
889 	unsigned long size;
890 	int ret = 0;
891 
892 #if defined(CONFIG_X86)
893 	/* on x86, avoid anything < 0x100 for it is often used for
894 	 * legacy platform devices */
895 	if (start < 0x100)
896 		start = 0x100;
897 #endif
898 
899 	size = end - start + 1;
900 
901 	if (end < start)
902 		return -EINVAL;
903 
904 	if (end > IO_SPACE_LIMIT)
905 		return -EINVAL;
906 
907 	switch (action) {
908 	case ADD_MANAGED_RESOURCE:
909 		if (add_interval(&data->io_db, start, size) != 0) {
910 			ret = -EBUSY;
911 			break;
912 		}
913 #ifdef CONFIG_PCMCIA_PROBE
914 		if (probe_io)
915 			do_io_probe(s, start, size);
916 #endif
917 		break;
918 	case REMOVE_MANAGED_RESOURCE:
919 		sub_interval(&data->io_db, start, size);
920 		break;
921 	default:
922 		ret = -EINVAL;
923 		break;
924 	}
925 
926 	return ret;
927 }
928 
929 
930 #ifdef CONFIG_PCI
931 static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
932 {
933 	struct resource *res;
934 	int i, done = 0;
935 
936 	if (!s->cb_dev || !s->cb_dev->bus)
937 		return -ENODEV;
938 
939 #if defined(CONFIG_X86)
940 	/* If this is the root bus, the risk of hitting some strange
941 	 * system devices is too high: If a driver isn't loaded, the
942 	 * resources are not claimed; even if a driver is loaded, it
943 	 * may not request all resources or even the wrong one. We
944 	 * can neither trust the rest of the kernel nor ACPI/PNP and
945 	 * CRS parsing to get it right. Therefore, use several
946 	 * safeguards:
947 	 *
948 	 * - Do not auto-add resources if the CardBus bridge is on
949 	 *   the PCI root bus
950 	 *
951 	 * - Avoid any I/O ports < 0x100.
952 	 *
953 	 * - On PCI-PCI bridges, only use resources which are set up
954 	 *   exclusively for the secondary PCI bus: the risk of hitting
955 	 *   system devices is quite low, as they usually aren't
956 	 *   connected to the secondary PCI bus.
957 	 */
958 	if (s->cb_dev->bus->number == 0)
959 		return -EINVAL;
960 
961 	for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) {
962 		res = s->cb_dev->bus->resource[i];
963 #else
964 	pci_bus_for_each_resource(s->cb_dev->bus, res, i) {
965 #endif
966 		if (!res)
967 			continue;
968 
969 		if (res->flags & IORESOURCE_IO) {
970 			/* safeguard against the root resource, where the
971 			 * risk of hitting any other device would be too
972 			 * high */
973 			if (res == &ioport_resource)
974 				continue;
975 
976 			dev_info(&s->cb_dev->dev,
977 				 "pcmcia: parent PCI bridge window: %pR\n",
978 				 res);
979 			if (!adjust_io(s, ADD_MANAGED_RESOURCE, res->start, res->end))
980 				done |= IORESOURCE_IO;
981 
982 		}
983 
984 		if (res->flags & IORESOURCE_MEM) {
985 			/* safeguard against the root resource, where the
986 			 * risk of hitting any other device would be too
987 			 * high */
988 			if (res == &iomem_resource)
989 				continue;
990 
991 			dev_info(&s->cb_dev->dev,
992 				 "pcmcia: parent PCI bridge window: %pR\n",
993 				 res);
994 			if (!adjust_memory(s, ADD_MANAGED_RESOURCE, res->start, res->end))
995 				done |= IORESOURCE_MEM;
996 		}
997 	}
998 
999 	/* if we got at least one of IO, and one of MEM, we can be glad and
1000 	 * activate the PCMCIA subsystem */
1001 	if (done == (IORESOURCE_MEM | IORESOURCE_IO))
1002 		s->resource_setup_done = 1;
1003 
1004 	return 0;
1005 }
1006 
1007 #else
1008 
1009 static inline int nonstatic_autoadd_resources(struct pcmcia_socket *s)
1010 {
1011 	return -ENODEV;
1012 }
1013 
1014 #endif
1015 
1016 
1017 static int nonstatic_init(struct pcmcia_socket *s)
1018 {
1019 	struct socket_data *data;
1020 
1021 	data = kzalloc(sizeof(struct socket_data), GFP_KERNEL);
1022 	if (!data)
1023 		return -ENOMEM;
1024 
1025 	data->mem_db.next = &data->mem_db;
1026 	data->mem_db_valid.next = &data->mem_db_valid;
1027 	data->io_db.next = &data->io_db;
1028 
1029 	s->resource_data = (void *) data;
1030 
1031 	nonstatic_autoadd_resources(s);
1032 
1033 	return 0;
1034 }
1035 
1036 static void nonstatic_release_resource_db(struct pcmcia_socket *s)
1037 {
1038 	struct socket_data *data = s->resource_data;
1039 	struct resource_map *p, *q;
1040 
1041 	for (p = data->mem_db_valid.next; p != &data->mem_db_valid; p = q) {
1042 		q = p->next;
1043 		kfree(p);
1044 	}
1045 	for (p = data->mem_db.next; p != &data->mem_db; p = q) {
1046 		q = p->next;
1047 		kfree(p);
1048 	}
1049 	for (p = data->io_db.next; p != &data->io_db; p = q) {
1050 		q = p->next;
1051 		kfree(p);
1052 	}
1053 }
1054 
1055 
1056 struct pccard_resource_ops pccard_nonstatic_ops = {
1057 	.validate_mem = pcmcia_nonstatic_validate_mem,
1058 	.find_io = nonstatic_find_io,
1059 	.find_mem = nonstatic_find_mem_region,
1060 	.init = nonstatic_init,
1061 	.exit = nonstatic_release_resource_db,
1062 };
1063 EXPORT_SYMBOL(pccard_nonstatic_ops);
1064 
1065 
1066 /* sysfs interface to the resource database */
1067 
1068 static ssize_t show_io_db(struct device *dev,
1069 			  struct device_attribute *attr, char *buf)
1070 {
1071 	struct pcmcia_socket *s = dev_get_drvdata(dev);
1072 	struct socket_data *data;
1073 	struct resource_map *p;
1074 	ssize_t ret = 0;
1075 
1076 	mutex_lock(&s->ops_mutex);
1077 	data = s->resource_data;
1078 
1079 	for (p = data->io_db.next; p != &data->io_db; p = p->next) {
1080 		if (ret > (PAGE_SIZE - 10))
1081 			continue;
1082 		ret += snprintf(&buf[ret], (PAGE_SIZE - ret - 1),
1083 				"0x%08lx - 0x%08lx\n",
1084 				((unsigned long) p->base),
1085 				((unsigned long) p->base + p->num - 1));
1086 	}
1087 
1088 	mutex_unlock(&s->ops_mutex);
1089 	return ret;
1090 }
1091 
1092 static ssize_t store_io_db(struct device *dev,
1093 			   struct device_attribute *attr,
1094 			   const char *buf, size_t count)
1095 {
1096 	struct pcmcia_socket *s = dev_get_drvdata(dev);
1097 	unsigned long start_addr, end_addr;
1098 	unsigned int add = ADD_MANAGED_RESOURCE;
1099 	ssize_t ret = 0;
1100 
1101 	ret = sscanf(buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
1102 	if (ret != 2) {
1103 		ret = sscanf(buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
1104 		add = REMOVE_MANAGED_RESOURCE;
1105 		if (ret != 2) {
1106 			ret = sscanf(buf, "0x%lx - 0x%lx", &start_addr,
1107 				&end_addr);
1108 			add = ADD_MANAGED_RESOURCE;
1109 			if (ret != 2)
1110 				return -EINVAL;
1111 		}
1112 	}
1113 	if (end_addr < start_addr)
1114 		return -EINVAL;
1115 
1116 	mutex_lock(&s->ops_mutex);
1117 	ret = adjust_io(s, add, start_addr, end_addr);
1118 	mutex_unlock(&s->ops_mutex);
1119 
1120 	return ret ? ret : count;
1121 }
1122 static DEVICE_ATTR(available_resources_io, 0600, show_io_db, store_io_db);
1123 
1124 static ssize_t show_mem_db(struct device *dev,
1125 			   struct device_attribute *attr, char *buf)
1126 {
1127 	struct pcmcia_socket *s = dev_get_drvdata(dev);
1128 	struct socket_data *data;
1129 	struct resource_map *p;
1130 	ssize_t ret = 0;
1131 
1132 	mutex_lock(&s->ops_mutex);
1133 	data = s->resource_data;
1134 
1135 	for (p = data->mem_db_valid.next; p != &data->mem_db_valid;
1136 	     p = p->next) {
1137 		if (ret > (PAGE_SIZE - 10))
1138 			continue;
1139 		ret += snprintf(&buf[ret], (PAGE_SIZE - ret - 1),
1140 				"0x%08lx - 0x%08lx\n",
1141 				((unsigned long) p->base),
1142 				((unsigned long) p->base + p->num - 1));
1143 	}
1144 
1145 	for (p = data->mem_db.next; p != &data->mem_db; p = p->next) {
1146 		if (ret > (PAGE_SIZE - 10))
1147 			continue;
1148 		ret += snprintf(&buf[ret], (PAGE_SIZE - ret - 1),
1149 				"0x%08lx - 0x%08lx\n",
1150 				((unsigned long) p->base),
1151 				((unsigned long) p->base + p->num - 1));
1152 	}
1153 
1154 	mutex_unlock(&s->ops_mutex);
1155 	return ret;
1156 }
1157 
1158 static ssize_t store_mem_db(struct device *dev,
1159 			    struct device_attribute *attr,
1160 			    const char *buf, size_t count)
1161 {
1162 	struct pcmcia_socket *s = dev_get_drvdata(dev);
1163 	unsigned long start_addr, end_addr;
1164 	unsigned int add = ADD_MANAGED_RESOURCE;
1165 	ssize_t ret = 0;
1166 
1167 	ret = sscanf(buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
1168 	if (ret != 2) {
1169 		ret = sscanf(buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
1170 		add = REMOVE_MANAGED_RESOURCE;
1171 		if (ret != 2) {
1172 			ret = sscanf(buf, "0x%lx - 0x%lx", &start_addr,
1173 				&end_addr);
1174 			add = ADD_MANAGED_RESOURCE;
1175 			if (ret != 2)
1176 				return -EINVAL;
1177 		}
1178 	}
1179 	if (end_addr < start_addr)
1180 		return -EINVAL;
1181 
1182 	mutex_lock(&s->ops_mutex);
1183 	ret = adjust_memory(s, add, start_addr, end_addr);
1184 	mutex_unlock(&s->ops_mutex);
1185 
1186 	return ret ? ret : count;
1187 }
1188 static DEVICE_ATTR(available_resources_mem, 0600, show_mem_db, store_mem_db);
1189 
1190 static struct attribute *pccard_rsrc_attributes[] = {
1191 	&dev_attr_available_resources_io.attr,
1192 	&dev_attr_available_resources_mem.attr,
1193 	NULL,
1194 };
1195 
1196 static const struct attribute_group rsrc_attributes = {
1197 	.attrs = pccard_rsrc_attributes,
1198 };
1199 
1200 static int pccard_sysfs_add_rsrc(struct device *dev,
1201 					   struct class_interface *class_intf)
1202 {
1203 	struct pcmcia_socket *s = dev_get_drvdata(dev);
1204 
1205 	if (s->resource_ops != &pccard_nonstatic_ops)
1206 		return 0;
1207 	return sysfs_create_group(&dev->kobj, &rsrc_attributes);
1208 }
1209 
1210 static void pccard_sysfs_remove_rsrc(struct device *dev,
1211 					       struct class_interface *class_intf)
1212 {
1213 	struct pcmcia_socket *s = dev_get_drvdata(dev);
1214 
1215 	if (s->resource_ops != &pccard_nonstatic_ops)
1216 		return;
1217 	sysfs_remove_group(&dev->kobj, &rsrc_attributes);
1218 }
1219 
1220 static struct class_interface pccard_rsrc_interface __refdata = {
1221 	.class = &pcmcia_socket_class,
1222 	.add_dev = &pccard_sysfs_add_rsrc,
1223 	.remove_dev = &pccard_sysfs_remove_rsrc,
1224 };
1225 
1226 static int __init nonstatic_sysfs_init(void)
1227 {
1228 	return class_interface_register(&pccard_rsrc_interface);
1229 }
1230 
1231 static void __exit nonstatic_sysfs_exit(void)
1232 {
1233 	class_interface_unregister(&pccard_rsrc_interface);
1234 }
1235 
1236 module_init(nonstatic_sysfs_init);
1237 module_exit(nonstatic_sysfs_exit);
1238