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