cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rsrc_nonstatic.c (30167B)


      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
   1058
   1059struct pccard_resource_ops pccard_nonstatic_ops = {
   1060	.validate_mem = pcmcia_nonstatic_validate_mem,
   1061	.find_io = nonstatic_find_io,
   1062	.find_mem = nonstatic_find_mem_region,
   1063	.init = nonstatic_init,
   1064	.exit = nonstatic_release_resource_db,
   1065};
   1066EXPORT_SYMBOL(pccard_nonstatic_ops);
   1067
   1068
   1069/* sysfs interface to the resource database */
   1070
   1071static ssize_t show_io_db(struct device *dev,
   1072			  struct device_attribute *attr, char *buf)
   1073{
   1074	struct pcmcia_socket *s = dev_get_drvdata(dev);
   1075	struct socket_data *data;
   1076	struct resource_map *p;
   1077	ssize_t ret = 0;
   1078
   1079	mutex_lock(&s->ops_mutex);
   1080	data = s->resource_data;
   1081
   1082	for (p = data->io_db.next; p != &data->io_db; p = p->next) {
   1083		if (ret > (PAGE_SIZE - 10))
   1084			continue;
   1085		ret += sysfs_emit_at(buf, ret,
   1086				"0x%08lx - 0x%08lx\n",
   1087				((unsigned long) p->base),
   1088				((unsigned long) p->base + p->num - 1));
   1089	}
   1090
   1091	mutex_unlock(&s->ops_mutex);
   1092	return ret;
   1093}
   1094
   1095static ssize_t store_io_db(struct device *dev,
   1096			   struct device_attribute *attr,
   1097			   const char *buf, size_t count)
   1098{
   1099	struct pcmcia_socket *s = dev_get_drvdata(dev);
   1100	unsigned long start_addr, end_addr;
   1101	unsigned int add = ADD_MANAGED_RESOURCE;
   1102	ssize_t ret = 0;
   1103
   1104	ret = sscanf(buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
   1105	if (ret != 2) {
   1106		ret = sscanf(buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
   1107		add = REMOVE_MANAGED_RESOURCE;
   1108		if (ret != 2) {
   1109			ret = sscanf(buf, "0x%lx - 0x%lx", &start_addr,
   1110				&end_addr);
   1111			add = ADD_MANAGED_RESOURCE;
   1112			if (ret != 2)
   1113				return -EINVAL;
   1114		}
   1115	}
   1116	if (end_addr < start_addr)
   1117		return -EINVAL;
   1118
   1119	mutex_lock(&s->ops_mutex);
   1120	ret = adjust_io(s, add, start_addr, end_addr);
   1121	mutex_unlock(&s->ops_mutex);
   1122
   1123	return ret ? ret : count;
   1124}
   1125static DEVICE_ATTR(available_resources_io, 0600, show_io_db, store_io_db);
   1126
   1127static ssize_t show_mem_db(struct device *dev,
   1128			   struct device_attribute *attr, char *buf)
   1129{
   1130	struct pcmcia_socket *s = dev_get_drvdata(dev);
   1131	struct socket_data *data;
   1132	struct resource_map *p;
   1133	ssize_t ret = 0;
   1134
   1135	mutex_lock(&s->ops_mutex);
   1136	data = s->resource_data;
   1137
   1138	for (p = data->mem_db_valid.next; p != &data->mem_db_valid;
   1139	     p = p->next) {
   1140		if (ret > (PAGE_SIZE - 10))
   1141			continue;
   1142		ret += sysfs_emit_at(buf, ret,
   1143				"0x%08lx - 0x%08lx\n",
   1144				((unsigned long) p->base),
   1145				((unsigned long) p->base + p->num - 1));
   1146	}
   1147
   1148	for (p = data->mem_db.next; p != &data->mem_db; p = p->next) {
   1149		if (ret > (PAGE_SIZE - 10))
   1150			continue;
   1151		ret += sysfs_emit_at(buf, ret,
   1152				"0x%08lx - 0x%08lx\n",
   1153				((unsigned long) p->base),
   1154				((unsigned long) p->base + p->num - 1));
   1155	}
   1156
   1157	mutex_unlock(&s->ops_mutex);
   1158	return ret;
   1159}
   1160
   1161static ssize_t store_mem_db(struct device *dev,
   1162			    struct device_attribute *attr,
   1163			    const char *buf, size_t count)
   1164{
   1165	struct pcmcia_socket *s = dev_get_drvdata(dev);
   1166	unsigned long start_addr, end_addr;
   1167	unsigned int add = ADD_MANAGED_RESOURCE;
   1168	ssize_t ret = 0;
   1169
   1170	ret = sscanf(buf, "+ 0x%lx - 0x%lx", &start_addr, &end_addr);
   1171	if (ret != 2) {
   1172		ret = sscanf(buf, "- 0x%lx - 0x%lx", &start_addr, &end_addr);
   1173		add = REMOVE_MANAGED_RESOURCE;
   1174		if (ret != 2) {
   1175			ret = sscanf(buf, "0x%lx - 0x%lx", &start_addr,
   1176				&end_addr);
   1177			add = ADD_MANAGED_RESOURCE;
   1178			if (ret != 2)
   1179				return -EINVAL;
   1180		}
   1181	}
   1182	if (end_addr < start_addr)
   1183		return -EINVAL;
   1184
   1185	mutex_lock(&s->ops_mutex);
   1186	ret = adjust_memory(s, add, start_addr, end_addr);
   1187	mutex_unlock(&s->ops_mutex);
   1188
   1189	return ret ? ret : count;
   1190}
   1191static DEVICE_ATTR(available_resources_mem, 0600, show_mem_db, store_mem_db);
   1192
   1193static struct attribute *pccard_rsrc_attributes[] = {
   1194	&dev_attr_available_resources_io.attr,
   1195	&dev_attr_available_resources_mem.attr,
   1196	NULL,
   1197};
   1198
   1199static const struct attribute_group rsrc_attributes = {
   1200	.attrs = pccard_rsrc_attributes,
   1201};
   1202
   1203static int pccard_sysfs_add_rsrc(struct device *dev,
   1204					   struct class_interface *class_intf)
   1205{
   1206	struct pcmcia_socket *s = dev_get_drvdata(dev);
   1207
   1208	if (s->resource_ops != &pccard_nonstatic_ops)
   1209		return 0;
   1210	return sysfs_create_group(&dev->kobj, &rsrc_attributes);
   1211}
   1212
   1213static void pccard_sysfs_remove_rsrc(struct device *dev,
   1214					       struct class_interface *class_intf)
   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);