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