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