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
36MODULE_AUTHOR("David A. Hinds, Dominik Brodowski");
37MODULE_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
44INT_MODULE_PARM(probe_mem,	1);		/* memory probe? */
45#ifdef CONFIG_PCMCIA_PROBE
46INT_MODULE_PARM(probe_io,	1);		/* IO port probe? */
47INT_MODULE_PARM(mem_limit,	0x10000);
48#endif
49
50/* for io_db and mem_db */
51struct resource_map {
52	u_long			base, num;
53	struct resource_map	*next;
54};
55
56struct 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
75static struct resource *
76claim_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
97static 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
111static 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
135static 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
185static 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 */
268static 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 */
299static 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 */
349static 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 */
405static 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 */
459static 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 */
485static 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 */
541static 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 */
568static 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
588struct pcmcia_align_data {
589	unsigned long	mask;
590	unsigned long	offset;
591	struct resource_map	*map;
592};
593
594static 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
607static resource_size_t
608pcmcia_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 */
653static 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
687static 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
718static 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						      resource_size(res) + num);
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						      resource_size(res) + num);
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
807static 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
862static 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
888static 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
933static 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
1011static inline int nonstatic_autoadd_resources(struct pcmcia_socket *s)
1012{
1013	return -ENODEV;
1014}
1015
1016#endif
1017
1018
1019static 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
1038static 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
1058struct 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};
1065EXPORT_SYMBOL(pccard_nonstatic_ops);
1066
1067
1068/* sysfs interface to the resource database */
1069
1070static 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
1094static 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}
1124static DEVICE_ATTR(available_resources_io, 0600, show_io_db, store_io_db);
1125
1126static 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
1160static 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}
1190static DEVICE_ATTR(available_resources_mem, 0600, show_mem_db, store_mem_db);
1191
1192static struct attribute *pccard_rsrc_attributes[] = {
1193	&dev_attr_available_resources_io.attr,
1194	&dev_attr_available_resources_mem.attr,
1195	NULL,
1196};
1197
1198static const struct attribute_group rsrc_attributes = {
1199	.attrs = pccard_rsrc_attributes,
1200};
1201
1202static 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
1212static 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
1222static 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
1228static int __init nonstatic_sysfs_init(void)
1229{
1230	return class_interface_register(&pccard_rsrc_interface);
1231}
1232
1233static void __exit nonstatic_sysfs_exit(void)
1234{
1235	class_interface_unregister(&pccard_rsrc_interface);
1236}
1237
1238module_init(nonstatic_sysfs_init);
1239module_exit(nonstatic_sysfs_exit);
1240