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