xref: /linux/drivers/pcmcia/rsrc_nonstatic.c (revision dfc349402de8e95f6a42e8341e9ea193b718eee3)
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 
28 #include <asm/irq.h>
29 #include <asm/io.h>
30 
31 #include <pcmcia/cs_types.h>
32 #include <pcmcia/ss.h>
33 #include <pcmcia/cs.h>
34 #include <pcmcia/cistpl.h>
35 #include "cs_internal.h"
36 
37 MODULE_AUTHOR("David A. Hinds, Dominik Brodowski");
38 MODULE_LICENSE("GPL");
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		io_db;
59 	unsigned int			rsrc_mem_probe;
60 };
61 
62 static DEFINE_MUTEX(rsrc_mutex);
63 #define MEM_PROBE_LOW	(1 << 0)
64 #define MEM_PROBE_HIGH	(1 << 1)
65 
66 
67 /*======================================================================
68 
69     Linux resource management extensions
70 
71 ======================================================================*/
72 
73 static struct resource *
74 make_resource(resource_size_t b, resource_size_t n, int flags, const char *name)
75 {
76 	struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL);
77 
78 	if (res) {
79 		res->name = name;
80 		res->start = b;
81 		res->end = b + n - 1;
82 		res->flags = flags;
83 	}
84 	return res;
85 }
86 
87 static struct resource *
88 claim_region(struct pcmcia_socket *s, resource_size_t base,
89 		resource_size_t size, int type, char *name)
90 {
91 	struct resource *res, *parent;
92 
93 	parent = type & IORESOURCE_MEM ? &iomem_resource : &ioport_resource;
94 	res = make_resource(base, size, type | IORESOURCE_BUSY, name);
95 
96 	if (res) {
97 #ifdef CONFIG_PCI
98 		if (s && s->cb_dev)
99 			parent = pci_find_parent_resource(s->cb_dev, res);
100 #endif
101 		if (!parent || request_resource(parent, res)) {
102 			kfree(res);
103 			res = NULL;
104 		}
105 	}
106 	return res;
107 }
108 
109 static void free_region(struct resource *res)
110 {
111 	if (res) {
112 		release_resource(res);
113 		kfree(res);
114 	}
115 }
116 
117 /*======================================================================
118 
119     These manage the internal databases of available resources.
120 
121 ======================================================================*/
122 
123 static int add_interval(struct resource_map *map, u_long base, u_long num)
124 {
125 	struct resource_map *p, *q;
126 
127 	for (p = map; ; p = p->next) {
128 		if ((p != map) && (p->base+p->num-1 >= base))
129 			return -1;
130 		if ((p->next == map) || (p->next->base > base+num-1))
131 			break;
132 	}
133 	q = kmalloc(sizeof(struct resource_map), GFP_KERNEL);
134 	if (!q) {
135 		printk(KERN_WARNING "out of memory to update resources\n");
136 		return -ENOMEM;
137 	}
138 	q->base = base; q->num = num;
139 	q->next = p->next; p->next = q;
140 	return 0;
141 }
142 
143 /*====================================================================*/
144 
145 static int sub_interval(struct resource_map *map, u_long base, u_long num)
146 {
147     struct resource_map *p, *q;
148 
149     for (p = map; ; p = q) {
150 	q = p->next;
151 	if (q == map)
152 	    break;
153 	if ((q->base+q->num > base) && (base+num > q->base)) {
154 	    if (q->base >= base) {
155 		if (q->base+q->num <= base+num) {
156 		    /* Delete whole block */
157 		    p->next = q->next;
158 		    kfree(q);
159 		    /* don't advance the pointer yet */
160 		    q = p;
161 		} else {
162 		    /* Cut off bit from the front */
163 		    q->num = q->base + q->num - base - num;
164 		    q->base = base + num;
165 		}
166 	    } else if (q->base+q->num <= base+num) {
167 		/* Cut off bit from the end */
168 		q->num = base - q->base;
169 	    } else {
170 		/* Split the block into two pieces */
171 		p = kmalloc(sizeof(struct resource_map), GFP_KERNEL);
172 		if (!p) {
173 		    printk(KERN_WARNING "out of memory to update resources\n");
174 		    return -ENOMEM;
175 		}
176 		p->base = base+num;
177 		p->num = q->base+q->num - p->base;
178 		q->num = base - q->base;
179 		p->next = q->next ; q->next = p;
180 	    }
181 	}
182     }
183     return 0;
184 }
185 
186 /*======================================================================
187 
188     These routines examine a region of IO or memory addresses to
189     determine what ranges might be genuinely available.
190 
191 ======================================================================*/
192 
193 #ifdef CONFIG_PCMCIA_PROBE
194 static void do_io_probe(struct pcmcia_socket *s, unsigned int base,
195 			unsigned int num)
196 {
197     struct resource *res;
198     struct socket_data *s_data = s->resource_data;
199     unsigned int i, j, bad;
200     int any;
201     u_char *b, hole, most;
202 
203     dev_printk(KERN_INFO, &s->dev, "cs: IO port probe %#x-%#x:",
204 	       base, base+num-1);
205 
206     /* First, what does a floating port look like? */
207     b = kzalloc(256, GFP_KERNEL);
208     if (!b) {
209 	    printk("\n");
210 	    dev_printk(KERN_ERR, &s->dev,
211 		   "do_io_probe: unable to kmalloc 256 bytes");
212             return;
213     }
214     for (i = base, most = 0; i < base+num; i += 8) {
215 	res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA IO probe");
216 	if (!res)
217 	    continue;
218 	hole = inb(i);
219 	for (j = 1; j < 8; j++)
220 	    if (inb(i+j) != hole) break;
221 	free_region(res);
222 	if ((j == 8) && (++b[hole] > b[most]))
223 	    most = hole;
224 	if (b[most] == 127) break;
225     }
226     kfree(b);
227 
228     bad = any = 0;
229     for (i = base; i < base+num; i += 8) {
230 	res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA IO probe");
231 	if (!res)
232 	    continue;
233 	for (j = 0; j < 8; j++)
234 	    if (inb(i+j) != most) 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 	    printk(" nothing: probe failed.\n");
252 	    return;
253 	} else {
254 	    sub_interval(&s_data->io_db, bad, i-bad);
255 	    printk(" %#x-%#x", bad, i-1);
256 	}
257     }
258 
259     printk(any ? "\n" : " clean.\n");
260 }
261 #endif
262 
263 /*======================================================================
264 
265     This is tricky... when we set up CIS memory, we try to validate
266     the memory window space allocations.
267 
268 ======================================================================*/
269 
270 /* Validation function for cards with a valid CIS */
271 static int readable(struct pcmcia_socket *s, struct resource *res,
272 		    unsigned int *count)
273 {
274 	int ret = -1;
275 
276 	s->cis_mem.res = res;
277 	s->cis_virt = ioremap(res->start, s->map_size);
278 	if (s->cis_virt) {
279 		ret = pccard_validate_cis(s, count);
280 		/* invalidate mapping and CIS cache */
281 		iounmap(s->cis_virt);
282 		s->cis_virt = NULL;
283 		destroy_cis_cache(s);
284 	}
285 	s->cis_mem.res = NULL;
286 	if ((ret != 0) || (*count == 0))
287 		return 0;
288 	return 1;
289 }
290 
291 /* Validation function for simple memory cards */
292 static int checksum(struct pcmcia_socket *s, struct resource *res)
293 {
294 	pccard_mem_map map;
295 	int i, a = 0, b = -1, d;
296 	void __iomem *virt;
297 
298 	virt = ioremap(res->start, s->map_size);
299 	if (virt) {
300 		map.map = 0;
301 		map.flags = MAP_ACTIVE;
302 		map.speed = 0;
303 		map.res = res;
304 		map.card_start = 0;
305 		s->ops->set_mem_map(s, &map);
306 
307 		/* Don't bother checking every word... */
308 		for (i = 0; i < s->map_size; i += 44) {
309 			d = readl(virt+i);
310 			a += d;
311 			b &= d;
312 		}
313 
314 		map.flags = 0;
315 		s->ops->set_mem_map(s, &map);
316 
317 		iounmap(virt);
318 	}
319 
320 	return (b == -1) ? -1 : (a>>1);
321 }
322 
323 static int
324 cis_readable(struct pcmcia_socket *s, unsigned long base, unsigned long size)
325 {
326 	struct resource *res1, *res2;
327 	unsigned int info1, info2;
328 	int ret = 0;
329 
330 	res1 = claim_region(s, base, size/2, IORESOURCE_MEM, "cs memory probe");
331 	res2 = claim_region(s, base + size/2, size/2, IORESOURCE_MEM, "cs memory probe");
332 
333 	if (res1 && res2) {
334 		ret = readable(s, res1, &info1);
335 		ret += readable(s, res2, &info2);
336 	}
337 
338 	free_region(res2);
339 	free_region(res1);
340 
341 	return (ret == 2) && (info1 == info2);
342 }
343 
344 static int
345 checksum_match(struct pcmcia_socket *s, unsigned long base, unsigned long size)
346 {
347 	struct resource *res1, *res2;
348 	int a = -1, b = -1;
349 
350 	res1 = claim_region(s, base, size/2, IORESOURCE_MEM, "cs memory probe");
351 	res2 = claim_region(s, base + size/2, size/2, IORESOURCE_MEM, "cs memory probe");
352 
353 	if (res1 && res2) {
354 		a = checksum(s, res1);
355 		b = checksum(s, res2);
356 	}
357 
358 	free_region(res2);
359 	free_region(res1);
360 
361 	return (a == b) && (a >= 0);
362 }
363 
364 /*======================================================================
365 
366     The memory probe.  If the memory list includes a 64K-aligned block
367     below 1MB, we probe in 64K chunks, and as soon as we accumulate at
368     least mem_limit free space, we quit.
369 
370 ======================================================================*/
371 
372 static int do_mem_probe(u_long base, u_long num, struct pcmcia_socket *s)
373 {
374     struct socket_data *s_data = s->resource_data;
375     u_long i, j, bad, fail, step;
376 
377     dev_printk(KERN_INFO, &s->dev, "cs: memory probe 0x%06lx-0x%06lx:",
378 	       base, base+num-1);
379     bad = fail = 0;
380     step = (num < 0x20000) ? 0x2000 : ((num>>4) & ~0x1fff);
381     /* don't allow too large steps */
382     if (step > 0x800000)
383 	step = 0x800000;
384     /* cis_readable wants to map 2x map_size */
385     if (step < 2 * s->map_size)
386 	step = 2 * s->map_size;
387     for (i = j = base; i < base+num; i = j + step) {
388 	if (!fail) {
389 	    for (j = i; j < base+num; j += step) {
390 		if (cis_readable(s, j, step))
391 		    break;
392 	    }
393 	    fail = ((i == base) && (j == base+num));
394 	}
395 	if (fail) {
396 	    for (j = i; j < base+num; j += 2*step)
397 		if (checksum_match(s, j, step) &&
398 		    checksum_match(s, j + step, step))
399 		    break;
400 	}
401 	if (i != j) {
402 	    if (!bad) printk(" excluding");
403 	    printk(" %#05lx-%#05lx", i, j-1);
404 	    sub_interval(&s_data->mem_db, i, j-i);
405 	    bad += j-i;
406 	}
407     }
408     printk(bad ? "\n" : " clean.\n");
409     return (num - bad);
410 }
411 
412 #ifdef CONFIG_PCMCIA_PROBE
413 
414 static u_long inv_probe(struct resource_map *m, struct pcmcia_socket *s)
415 {
416 	struct socket_data *s_data = s->resource_data;
417 	u_long ok;
418 	if (m == &s_data->mem_db)
419 		return 0;
420 	ok = inv_probe(m->next, s);
421 	if (ok) {
422 		if (m->base >= 0x100000)
423 			sub_interval(&s_data->mem_db, m->base, m->num);
424 		return ok;
425 	}
426 	if (m->base < 0x100000)
427 		return 0;
428 	return do_mem_probe(m->base, m->num, s);
429 }
430 
431 static int validate_mem(struct pcmcia_socket *s, unsigned int probe_mask)
432 {
433 	struct resource_map *m, mm;
434 	static unsigned char order[] = { 0xd0, 0xe0, 0xc0, 0xf0 };
435 	unsigned long b, i, ok = 0;
436 	struct socket_data *s_data = s->resource_data;
437 
438 	/* We do up to four passes through the list */
439 	if (probe_mask & MEM_PROBE_HIGH) {
440 		if (inv_probe(s_data->mem_db.next, s) > 0)
441 			return 0;
442 		dev_printk(KERN_NOTICE, &s->dev,
443 			   "cs: warning: no high memory space available!\n");
444 		return -ENODEV;
445 	}
446 
447 	for (m = s_data->mem_db.next; m != &s_data->mem_db; m = mm.next) {
448 		mm = *m;
449 		/* Only probe < 1 MB */
450 		if (mm.base >= 0x100000)
451 			continue;
452 		if ((mm.base | mm.num) & 0xffff) {
453 			ok += do_mem_probe(mm.base, mm.num, s);
454 			continue;
455 		}
456 		/* Special probe for 64K-aligned block */
457 		for (i = 0; i < 4; i++) {
458 			b = order[i] << 12;
459 			if ((b >= mm.base) && (b+0x10000 <= mm.base+mm.num)) {
460 				if (ok >= mem_limit)
461 					sub_interval(&s_data->mem_db, b, 0x10000);
462 				else
463 					ok += do_mem_probe(b, 0x10000, s);
464 			}
465 		}
466 	}
467 
468 	if (ok > 0)
469 		return 0;
470 
471 	return -ENODEV;
472 }
473 
474 #else /* CONFIG_PCMCIA_PROBE */
475 
476 static int validate_mem(struct pcmcia_socket *s, unsigned int probe_mask)
477 {
478 	struct resource_map *m, mm;
479 	struct socket_data *s_data = s->resource_data;
480 	unsigned long ok = 0;
481 
482 	for (m = s_data->mem_db.next; m != &s_data->mem_db; m = mm.next) {
483 		mm = *m;
484 		ok += do_mem_probe(mm.base, mm.num, s);
485 	}
486 	if (ok > 0)
487 		return 0;
488 	return -ENODEV;
489 }
490 
491 #endif /* CONFIG_PCMCIA_PROBE */
492 
493 
494 /*
495  * Locking note: Must be called with skt_mutex held!
496  */
497 static int pcmcia_nonstatic_validate_mem(struct pcmcia_socket *s)
498 {
499 	struct socket_data *s_data = s->resource_data;
500 	unsigned int probe_mask = MEM_PROBE_LOW;
501 	int ret = 0;
502 
503 	if (!probe_mem)
504 		return 0;
505 
506 	mutex_lock(&rsrc_mutex);
507 
508 	if (s->features & SS_CAP_PAGE_REGS)
509 		probe_mask = MEM_PROBE_HIGH;
510 
511 	if (probe_mask & ~s_data->rsrc_mem_probe) {
512 		if (s->state & SOCKET_PRESENT)
513 			ret = validate_mem(s, probe_mask);
514 		if (!ret)
515 			s_data->rsrc_mem_probe |= probe_mask;
516 	}
517 
518 	mutex_unlock(&rsrc_mutex);
519 
520 	return ret;
521 }
522 
523 struct pcmcia_align_data {
524 	unsigned long	mask;
525 	unsigned long	offset;
526 	struct resource_map	*map;
527 };
528 
529 static void
530 pcmcia_common_align(void *align_data, struct resource *res,
531 			resource_size_t size, resource_size_t align)
532 {
533 	struct pcmcia_align_data *data = align_data;
534 	resource_size_t start;
535 	/*
536 	 * Ensure that we have the correct start address
537 	 */
538 	start = (res->start & ~data->mask) + data->offset;
539 	if (start < res->start)
540 		start += data->mask + 1;
541 	res->start = start;
542 }
543 
544 static void
545 pcmcia_align(void *align_data, struct resource *res, resource_size_t size,
546 		resource_size_t align)
547 {
548 	struct pcmcia_align_data *data = align_data;
549 	struct resource_map *m;
550 
551 	pcmcia_common_align(data, res, size, align);
552 
553 	for (m = data->map->next; m != data->map; m = m->next) {
554 		unsigned long start = m->base;
555 		unsigned long end = m->base + m->num - 1;
556 
557 		/*
558 		 * If the lower resources are not available, try aligning
559 		 * to this entry of the resource database to see if it'll
560 		 * fit here.
561 		 */
562 		if (res->start < start) {
563 			res->start = start;
564 			pcmcia_common_align(data, res, size, align);
565 		}
566 
567 		/*
568 		 * If we're above the area which was passed in, there's
569 		 * no point proceeding.
570 		 */
571 		if (res->start >= res->end)
572 			break;
573 
574 		if ((res->start + size - 1) <= end)
575 			break;
576 	}
577 
578 	/*
579 	 * If we failed to find something suitable, ensure we fail.
580 	 */
581 	if (m == data->map)
582 		res->start = res->end;
583 }
584 
585 /*
586  * Adjust an existing IO region allocation, but making sure that we don't
587  * encroach outside the resources which the user supplied.
588  */
589 static int nonstatic_adjust_io_region(struct resource *res, unsigned long r_start,
590 				      unsigned long r_end, struct pcmcia_socket *s)
591 {
592 	struct resource_map *m;
593 	struct socket_data *s_data = s->resource_data;
594 	int ret = -ENOMEM;
595 
596 	mutex_lock(&rsrc_mutex);
597 	for (m = s_data->io_db.next; m != &s_data->io_db; m = m->next) {
598 		unsigned long start = m->base;
599 		unsigned long end = m->base + m->num - 1;
600 
601 		if (start > r_start || r_end > end)
602 			continue;
603 
604 		ret = adjust_resource(res, r_start, r_end - r_start + 1);
605 		break;
606 	}
607 	mutex_unlock(&rsrc_mutex);
608 
609 	return ret;
610 }
611 
612 /*======================================================================
613 
614     These find ranges of I/O ports or memory addresses that are not
615     currently allocated by other devices.
616 
617     The 'align' field should reflect the number of bits of address
618     that need to be preserved from the initial value of *base.  It
619     should be a power of two, greater than or equal to 'num'.  A value
620     of 0 means that all bits of *base are significant.  *base should
621     also be strictly less than 'align'.
622 
623 ======================================================================*/
624 
625 static struct resource *nonstatic_find_io_region(unsigned long base, int num,
626 		   unsigned long align, struct pcmcia_socket *s)
627 {
628 	struct resource *res = make_resource(0, num, IORESOURCE_IO, dev_name(&s->dev));
629 	struct socket_data *s_data = s->resource_data;
630 	struct pcmcia_align_data data;
631 	unsigned long min = base;
632 	int ret;
633 
634 	if (align == 0)
635 		align = 0x10000;
636 
637 	data.mask = align - 1;
638 	data.offset = base & data.mask;
639 	data.map = &s_data->io_db;
640 
641 	mutex_lock(&rsrc_mutex);
642 #ifdef CONFIG_PCI
643 	if (s->cb_dev) {
644 		ret = pci_bus_alloc_resource(s->cb_dev->bus, res, num, 1,
645 					     min, 0, pcmcia_align, &data);
646 	} else
647 #endif
648 		ret = allocate_resource(&ioport_resource, res, num, min, ~0UL,
649 					1, pcmcia_align, &data);
650 	mutex_unlock(&rsrc_mutex);
651 
652 	if (ret != 0) {
653 		kfree(res);
654 		res = NULL;
655 	}
656 	return res;
657 }
658 
659 static struct resource * nonstatic_find_mem_region(u_long base, u_long num,
660 		u_long align, int low, struct pcmcia_socket *s)
661 {
662 	struct resource *res = make_resource(0, num, IORESOURCE_MEM, dev_name(&s->dev));
663 	struct socket_data *s_data = s->resource_data;
664 	struct pcmcia_align_data data;
665 	unsigned long min, max;
666 	int ret, i;
667 
668 	low = low || !(s->features & SS_CAP_PAGE_REGS);
669 
670 	data.mask = align - 1;
671 	data.offset = base & data.mask;
672 	data.map = &s_data->mem_db;
673 
674 	for (i = 0; i < 2; i++) {
675 		if (low) {
676 			max = 0x100000UL;
677 			min = base < max ? base : 0;
678 		} else {
679 			max = ~0UL;
680 			min = 0x100000UL + base;
681 		}
682 
683 		mutex_lock(&rsrc_mutex);
684 #ifdef CONFIG_PCI
685 		if (s->cb_dev) {
686 			ret = pci_bus_alloc_resource(s->cb_dev->bus, res, num,
687 						     1, min, 0,
688 						     pcmcia_align, &data);
689 		} else
690 #endif
691 			ret = allocate_resource(&iomem_resource, res, num, min,
692 						max, 1, pcmcia_align, &data);
693 		mutex_unlock(&rsrc_mutex);
694 		if (ret == 0 || low)
695 			break;
696 		low = 1;
697 	}
698 
699 	if (ret != 0) {
700 		kfree(res);
701 		res = NULL;
702 	}
703 	return res;
704 }
705 
706 
707 static int adjust_memory(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end)
708 {
709 	struct socket_data *data = s->resource_data;
710 	unsigned long size = end - start + 1;
711 	int ret = 0;
712 
713 	if (end < start)
714 		return -EINVAL;
715 
716 	mutex_lock(&rsrc_mutex);
717 	switch (action) {
718 	case ADD_MANAGED_RESOURCE:
719 		ret = add_interval(&data->mem_db, start, size);
720 		break;
721 	case REMOVE_MANAGED_RESOURCE:
722 		ret = sub_interval(&data->mem_db, start, size);
723 		if (!ret) {
724 			struct pcmcia_socket *socket;
725 			down_read(&pcmcia_socket_list_rwsem);
726 			list_for_each_entry(socket, &pcmcia_socket_list, socket_list)
727 				release_cis_mem(socket);
728 			up_read(&pcmcia_socket_list_rwsem);
729 		}
730 		break;
731 	default:
732 		ret = -EINVAL;
733 	}
734 	mutex_unlock(&rsrc_mutex);
735 
736 	return ret;
737 }
738 
739 
740 static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long start, unsigned long end)
741 {
742 	struct socket_data *data = s->resource_data;
743 	unsigned long size = end - start + 1;
744 	int ret = 0;
745 
746 	if (end < start)
747 		return -EINVAL;
748 
749 	if (end > IO_SPACE_LIMIT)
750 		return -EINVAL;
751 
752 	mutex_lock(&rsrc_mutex);
753 	switch (action) {
754 	case ADD_MANAGED_RESOURCE:
755 		if (add_interval(&data->io_db, start, size) != 0) {
756 			ret = -EBUSY;
757 			break;
758 		}
759 #ifdef CONFIG_PCMCIA_PROBE
760 		if (probe_io)
761 			do_io_probe(s, start, size);
762 #endif
763 		break;
764 	case REMOVE_MANAGED_RESOURCE:
765 		sub_interval(&data->io_db, start, size);
766 		break;
767 	default:
768 		ret = -EINVAL;
769 		break;
770 	}
771 	mutex_unlock(&rsrc_mutex);
772 
773 	return ret;
774 }
775 
776 
777 #ifdef CONFIG_PCI
778 static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
779 {
780 	struct resource *res;
781 	int i, done = 0;
782 
783 	if (!s->cb_dev || !s->cb_dev->bus)
784 		return -ENODEV;
785 
786 #if defined(CONFIG_X86)
787 	/* If this is the root bus, the risk of hitting
788 	 * some strange system devices which aren't protected
789 	 * by either ACPI resource tables or properly requested
790 	 * resources is too big. Therefore, don't do auto-adding
791 	 * of resources at the moment.
792 	 */
793 	if (s->cb_dev->bus->number == 0)
794 		return -EINVAL;
795 #endif
796 
797 	for (i=0; i < PCI_BUS_NUM_RESOURCES; i++) {
798 		res = s->cb_dev->bus->resource[i];
799 		if (!res)
800 			continue;
801 
802 		if (res->flags & IORESOURCE_IO) {
803 			if (res == &ioport_resource)
804 				continue;
805 			dev_printk(KERN_INFO, &s->cb_dev->dev,
806 				   "pcmcia: parent PCI bridge I/O "
807 				   "window: 0x%llx - 0x%llx\n",
808 				   (unsigned long long)res->start,
809 				   (unsigned long long)res->end);
810 			if (!adjust_io(s, ADD_MANAGED_RESOURCE, res->start, res->end))
811 				done |= IORESOURCE_IO;
812 
813 		}
814 
815 		if (res->flags & IORESOURCE_MEM) {
816 			if (res == &iomem_resource)
817 				continue;
818 			dev_printk(KERN_INFO, &s->cb_dev->dev,
819 				   "pcmcia: parent PCI bridge Memory "
820 				   "window: 0x%llx - 0x%llx\n",
821 				   (unsigned long long)res->start,
822 				   (unsigned long long)res->end);
823 			if (!adjust_memory(s, ADD_MANAGED_RESOURCE, res->start, res->end))
824 				done |= IORESOURCE_MEM;
825 		}
826 	}
827 
828 	/* if we got at least one of IO, and one of MEM, we can be glad and
829 	 * activate the PCMCIA subsystem */
830 	if (done == (IORESOURCE_MEM | IORESOURCE_IO))
831 		s->resource_setup_done = 1;
832 
833 	return 0;
834 }
835 
836 #else
837 
838 static inline int nonstatic_autoadd_resources(struct pcmcia_socket *s)
839 {
840 	return -ENODEV;
841 }
842 
843 #endif
844 
845 
846 static int nonstatic_init(struct pcmcia_socket *s)
847 {
848 	struct socket_data *data;
849 
850 	data = kzalloc(sizeof(struct socket_data), GFP_KERNEL);
851 	if (!data)
852 		return -ENOMEM;
853 
854 	data->mem_db.next = &data->mem_db;
855 	data->io_db.next = &data->io_db;
856 
857 	s->resource_data = (void *) data;
858 
859 	nonstatic_autoadd_resources(s);
860 
861 	return 0;
862 }
863 
864 static void nonstatic_release_resource_db(struct pcmcia_socket *s)
865 {
866 	struct socket_data *data = s->resource_data;
867 	struct resource_map *p, *q;
868 
869 	mutex_lock(&rsrc_mutex);
870 	for (p = data->mem_db.next; p != &data->mem_db; p = q) {
871 		q = p->next;
872 		kfree(p);
873 	}
874 	for (p = data->io_db.next; p != &data->io_db; p = q) {
875 		q = p->next;
876 		kfree(p);
877 	}
878 	mutex_unlock(&rsrc_mutex);
879 }
880 
881 
882 struct pccard_resource_ops pccard_nonstatic_ops = {
883 	.validate_mem = pcmcia_nonstatic_validate_mem,
884 	.adjust_io_region = nonstatic_adjust_io_region,
885 	.find_io = nonstatic_find_io_region,
886 	.find_mem = nonstatic_find_mem_region,
887 	.add_io = adjust_io,
888 	.add_mem = adjust_memory,
889 	.init = nonstatic_init,
890 	.exit = nonstatic_release_resource_db,
891 };
892 EXPORT_SYMBOL(pccard_nonstatic_ops);
893 
894 
895 /* sysfs interface to the resource database */
896 
897 static ssize_t show_io_db(struct device *dev,
898 			  struct device_attribute *attr, char *buf)
899 {
900 	struct pcmcia_socket *s = dev_get_drvdata(dev);
901 	struct socket_data *data;
902 	struct resource_map *p;
903 	ssize_t ret = 0;
904 
905 	mutex_lock(&rsrc_mutex);
906 	data = s->resource_data;
907 
908 	for (p = data->io_db.next; p != &data->io_db; p = p->next) {
909 		if (ret > (PAGE_SIZE - 10))
910 			continue;
911 		ret += snprintf (&buf[ret], (PAGE_SIZE - ret - 1),
912 				 "0x%08lx - 0x%08lx\n",
913 				 ((unsigned long) p->base),
914 				 ((unsigned long) p->base + p->num - 1));
915 	}
916 
917 	mutex_unlock(&rsrc_mutex);
918 	return (ret);
919 }
920 
921 static ssize_t store_io_db(struct device *dev,
922 			   struct device_attribute *attr,
923 			   const char *buf, size_t count)
924 {
925 	struct pcmcia_socket *s = dev_get_drvdata(dev);
926 	unsigned long start_addr, end_addr;
927 	unsigned int add = ADD_MANAGED_RESOURCE;
928 	ssize_t ret = 0;
929 
930 	ret = sscanf (buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
931 	if (ret != 2) {
932 		ret = sscanf (buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
933 		add = REMOVE_MANAGED_RESOURCE;
934 		if (ret != 2) {
935 			ret = sscanf (buf, "0x%lx - 0x%lx", &start_addr, &end_addr);
936 			add = ADD_MANAGED_RESOURCE;
937 			if (ret != 2)
938 				return -EINVAL;
939 		}
940 	}
941 	if (end_addr < start_addr)
942 		return -EINVAL;
943 
944 	ret = adjust_io(s, add, start_addr, end_addr);
945 	if (!ret)
946 		s->resource_setup_new = 1;
947 
948 	return ret ? ret : count;
949 }
950 static DEVICE_ATTR(available_resources_io, 0600, show_io_db, store_io_db);
951 
952 static ssize_t show_mem_db(struct device *dev,
953 			   struct device_attribute *attr, char *buf)
954 {
955 	struct pcmcia_socket *s = dev_get_drvdata(dev);
956 	struct socket_data *data;
957 	struct resource_map *p;
958 	ssize_t ret = 0;
959 
960 	mutex_lock(&rsrc_mutex);
961 	data = s->resource_data;
962 
963 	for (p = data->mem_db.next; p != &data->mem_db; p = p->next) {
964 		if (ret > (PAGE_SIZE - 10))
965 			continue;
966 		ret += snprintf (&buf[ret], (PAGE_SIZE - ret - 1),
967 				 "0x%08lx - 0x%08lx\n",
968 				 ((unsigned long) p->base),
969 				 ((unsigned long) p->base + p->num - 1));
970 	}
971 
972 	mutex_unlock(&rsrc_mutex);
973 	return (ret);
974 }
975 
976 static ssize_t store_mem_db(struct device *dev,
977 			    struct device_attribute *attr,
978 			    const char *buf, size_t count)
979 {
980 	struct pcmcia_socket *s = dev_get_drvdata(dev);
981 	unsigned long start_addr, end_addr;
982 	unsigned int add = ADD_MANAGED_RESOURCE;
983 	ssize_t ret = 0;
984 
985 	ret = sscanf (buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
986 	if (ret != 2) {
987 		ret = sscanf (buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
988 		add = REMOVE_MANAGED_RESOURCE;
989 		if (ret != 2) {
990 			ret = sscanf (buf, "0x%lx - 0x%lx", &start_addr, &end_addr);
991 			add = ADD_MANAGED_RESOURCE;
992 			if (ret != 2)
993 				return -EINVAL;
994 		}
995 	}
996 	if (end_addr < start_addr)
997 		return -EINVAL;
998 
999 	ret = adjust_memory(s, add, start_addr, end_addr);
1000 	if (!ret)
1001 		s->resource_setup_new = 1;
1002 
1003 	return ret ? ret : count;
1004 }
1005 static DEVICE_ATTR(available_resources_mem, 0600, show_mem_db, store_mem_db);
1006 
1007 static struct attribute *pccard_rsrc_attributes[] = {
1008 	&dev_attr_available_resources_io.attr,
1009 	&dev_attr_available_resources_mem.attr,
1010 	NULL,
1011 };
1012 
1013 static const struct attribute_group rsrc_attributes = {
1014 	.attrs = pccard_rsrc_attributes,
1015 };
1016 
1017 static int __devinit pccard_sysfs_add_rsrc(struct device *dev,
1018 					   struct class_interface *class_intf)
1019 {
1020 	struct pcmcia_socket *s = dev_get_drvdata(dev);
1021 
1022 	if (s->resource_ops != &pccard_nonstatic_ops)
1023 		return 0;
1024 	return sysfs_create_group(&dev->kobj, &rsrc_attributes);
1025 }
1026 
1027 static void __devexit pccard_sysfs_remove_rsrc(struct device *dev,
1028 					       struct class_interface *class_intf)
1029 {
1030 	struct pcmcia_socket *s = dev_get_drvdata(dev);
1031 
1032 	if (s->resource_ops != &pccard_nonstatic_ops)
1033 		return;
1034 	sysfs_remove_group(&dev->kobj, &rsrc_attributes);
1035 }
1036 
1037 static struct class_interface pccard_rsrc_interface __refdata = {
1038 	.class = &pcmcia_socket_class,
1039 	.add_dev = &pccard_sysfs_add_rsrc,
1040 	.remove_dev = __devexit_p(&pccard_sysfs_remove_rsrc),
1041 };
1042 
1043 static int __init nonstatic_sysfs_init(void)
1044 {
1045 	return class_interface_register(&pccard_rsrc_interface);
1046 }
1047 
1048 static void __exit nonstatic_sysfs_exit(void)
1049 {
1050 	class_interface_unregister(&pccard_rsrc_interface);
1051 }
1052 
1053 module_init(nonstatic_sysfs_init);
1054 module_exit(nonstatic_sysfs_exit);
1055