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