Linux Audio

Check our new training course

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