pci_64.c 17.6 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*
 * Port for PPC64 David Engebretsen, IBM Corp.
 * Contains common pci routines for ppc64 platform, pSeries and iSeries brands.
 * 
 * Copyright (C) 2003 Anton Blanchard <anton@au.ibm.com>, IBM
 *   Rework, based on alpha PCI code.
 *
 *      This program is free software; you can redistribute it and/or
 *      modify it under the terms of the GNU General Public License
 *      as published by the Free Software Foundation; either version
 *      2 of the License, or (at your option) any later version.
 */

#undef DEBUG

#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/string.h>
#include <linux/init.h>
#include <linux/bootmem.h>
#include <linux/mm.h>
#include <linux/list.h>
23
#include <linux/syscalls.h>
24
#include <linux/irq.h>
25
#include <linux/vmalloc.h>
L
Linus Torvalds 已提交
26 27 28 29 30 31 32

#include <asm/processor.h>
#include <asm/io.h>
#include <asm/prom.h>
#include <asm/pci-bridge.h>
#include <asm/byteorder.h>
#include <asm/machdep.h>
33
#include <asm/ppc-pci.h>
L
Linus Torvalds 已提交
34 35

#ifdef DEBUG
36
#include <asm/udbg.h>
37
#define DBG(fmt...) printk(fmt)
L
Linus Torvalds 已提交
38 39 40 41 42 43 44 45 46
#else
#define DBG(fmt...)
#endif

unsigned long pci_probe_only = 1;

/* pci_io_base -- the base address from which io bars are offsets.
 * This is the lowest I/O base address (so bar values are always positive),
 * and it *must* be the start of ISA space if an ISA bus exists because
47 48
 * ISA drivers use hard coded offsets.  If no ISA bus exists nothing
 * is mapped on the first 64K of IO space
L
Linus Torvalds 已提交
49
 */
50
unsigned long pci_io_base = ISA_IO_BASE;
L
Linus Torvalds 已提交
51 52 53 54
EXPORT_SYMBOL(pci_io_base);

LIST_HEAD(hose_list);

55
static struct dma_mapping_ops *pci_dma_ops;
L
Linus Torvalds 已提交
56

57 58 59 60 61
void set_pci_dma_ops(struct dma_mapping_ops *dma_ops)
{
	pci_dma_ops = dma_ops;
}

62 63 64 65 66 67
struct dma_mapping_ops *get_pci_dma_ops(void)
{
	return pci_dma_ops;
}
EXPORT_SYMBOL(get_pci_dma_ops);

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83

int pci_set_dma_mask(struct pci_dev *dev, u64 mask)
{
	return dma_set_mask(&dev->dev, mask);
}

int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
{
	int rc;

	rc = dma_set_mask(&dev->dev, mask);
	dev->dev.coherent_dma_mask = dev->dma_mask;

	return rc;
}

L
Linus Torvalds 已提交
84 85 86 87 88 89 90 91 92 93
static void fixup_broken_pcnet32(struct pci_dev* dev)
{
	if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
		dev->vendor = PCI_VENDOR_ID_AMD;
		pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD);
	}
}
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32);


94 95
static u32 get_int_prop(struct device_node *np, const char *name, u32 def)
{
96
	const u32 *prop;
97 98
	int len;

99
	prop = of_get_property(np, name, &len);
100 101 102 103 104 105 106 107 108 109
	if (prop && len >= 4)
		return *prop;
	return def;
}

static unsigned int pci_parse_of_flags(u32 addr0)
{
	unsigned int flags = 0;

	if (addr0 & 0x02000000) {
110 111 112
		flags = IORESOURCE_MEM | PCI_BASE_ADDRESS_SPACE_MEMORY;
		flags |= (addr0 >> 22) & PCI_BASE_ADDRESS_MEM_TYPE_64;
		flags |= (addr0 >> 28) & PCI_BASE_ADDRESS_MEM_TYPE_1M;
113
		if (addr0 & 0x40000000)
114 115
			flags |= IORESOURCE_PREFETCH
				 | PCI_BASE_ADDRESS_MEM_PREFETCH;
116
	} else if (addr0 & 0x01000000)
117
		flags = IORESOURCE_IO | PCI_BASE_ADDRESS_SPACE_IO;
118 119 120 121 122 123 124 125 126
	return flags;
}


static void pci_parse_of_addrs(struct device_node *node, struct pci_dev *dev)
{
	u64 base, size;
	unsigned int flags;
	struct resource *res;
127 128
	const u32 *addrs;
	u32 i;
129 130
	int proplen;

131
	addrs = of_get_property(node, "assigned-addresses", &proplen);
132 133
	if (!addrs)
		return;
134
	DBG("    parse addresses (%d bytes) @ %p\n", proplen, addrs);
135 136 137 138
	for (; proplen >= 20; proplen -= 20, addrs += 5) {
		flags = pci_parse_of_flags(addrs[0]);
		if (!flags)
			continue;
139 140
		base = of_read_number(&addrs[1], 2);
		size = of_read_number(&addrs[3], 2);
141 142 143
		if (!size)
			continue;
		i = addrs[0] & 0xff;
144 145 146
		DBG("  base: %llx, size: %llx, i: %x\n",
		    (unsigned long long)base, (unsigned long long)size, i);

147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
		if (PCI_BASE_ADDRESS_0 <= i && i <= PCI_BASE_ADDRESS_5) {
			res = &dev->resource[(i - PCI_BASE_ADDRESS_0) >> 2];
		} else if (i == dev->rom_base_reg) {
			res = &dev->resource[PCI_ROM_RESOURCE];
			flags |= IORESOURCE_READONLY | IORESOURCE_CACHEABLE;
		} else {
			printk(KERN_ERR "PCI: bad cfg reg num 0x%x\n", i);
			continue;
		}
		res->start = base;
		res->end = base + size - 1;
		res->flags = flags;
		res->name = pci_name(dev);
	}
}

J
John Rose 已提交
163 164
struct pci_dev *of_create_pci_dev(struct device_node *node,
				 struct pci_bus *bus, int devfn)
165 166 167 168
{
	struct pci_dev *dev;
	const char *type;

169
	dev = alloc_pci_dev();
170 171
	if (!dev)
		return NULL;
172
	type = of_get_property(node, "device_type", NULL);
173 174 175
	if (type == NULL)
		type = "";

176 177
	DBG("    create device, devfn: %x, type: %s\n", devfn, type);

178 179 180 181 182 183 184 185 186 187 188 189
	dev->bus = bus;
	dev->sysdata = node;
	dev->dev.parent = bus->bridge;
	dev->dev.bus = &pci_bus_type;
	dev->devfn = devfn;
	dev->multifunction = 0;		/* maybe a lie? */

	dev->vendor = get_int_prop(node, "vendor-id", 0xffff);
	dev->device = get_int_prop(node, "device-id", 0xffff);
	dev->subsystem_vendor = get_int_prop(node, "subsystem-vendor-id", 0);
	dev->subsystem_device = get_int_prop(node, "subsystem-id", 0);

190
	dev->cfg_size = pci_cfg_space_size(dev);
191 192 193 194

	sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(bus),
		dev->bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn));
	dev->class = get_int_prop(node, "class-code", 0);
A
Auke Kok 已提交
195
	dev->revision = get_int_prop(node, "revision-id", 0);
196

197
	DBG("    class: 0x%x\n", dev->class);
A
Auke Kok 已提交
198
	DBG("    revision: 0x%x\n", dev->revision);
199

200
	dev->current_state = 4;		/* unknown power state */
201
	dev->error_state = pci_channel_io_normal;
202
	dev->dma_mask = 0xffffffff;
203

204
	if (!strcmp(type, "pci") || !strcmp(type, "pciex")) {
205 206 207 208 209 210 211 212
		/* a PCI-PCI bridge */
		dev->hdr_type = PCI_HEADER_TYPE_BRIDGE;
		dev->rom_base_reg = PCI_ROM_ADDRESS1;
	} else if (!strcmp(type, "cardbus")) {
		dev->hdr_type = PCI_HEADER_TYPE_CARDBUS;
	} else {
		dev->hdr_type = PCI_HEADER_TYPE_NORMAL;
		dev->rom_base_reg = PCI_ROM_ADDRESS;
213
		/* Maybe do a default OF mapping here */
214 215 216 217 218
		dev->irq = NO_IRQ;
	}

	pci_parse_of_addrs(node, dev);

219 220
	DBG("    adding to system ...\n");

221 222 223 224
	pci_device_add(dev, bus);

	return dev;
}
J
John Rose 已提交
225
EXPORT_SYMBOL(of_create_pci_dev);
226

J
John Rose 已提交
227
void __devinit of_scan_bus(struct device_node *node,
228
			   struct pci_bus *bus)
229 230
{
	struct device_node *child = NULL;
231
	const u32 *reg;
232 233 234
	int reglen, devfn;
	struct pci_dev *dev;

235 236
	DBG("of_scan_bus(%s) bus no %d... \n", node->full_name, bus->number);

237
	/* Scan direct children */
238
	while ((child = of_get_next_child(node, child)) != NULL) {
239
		DBG("  * %s\n", child->full_name);
240
		reg = of_get_property(child, "reg", &reglen);
241 242 243
		if (reg == NULL || reglen < 20)
			continue;
		devfn = (reg[0] >> 8) & 0xff;
244

245 246 247 248
		/* create a new pci_dev for this device */
		dev = of_create_pci_dev(child, bus, devfn);
		if (!dev)
			continue;
249 250 251 252 253
		DBG("    dev header type: %x\n", dev->hdr_type);
	}

	/* Ally all fixups */
	pcibios_fixup_of_probed_bus(bus);
254

255 256
	/* Now scan child busses */
	list_for_each_entry(dev, &bus->devices, bus_list) {
257
		if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
258 259 260 261 262
		    dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) {
			struct device_node *child = pci_device_to_OF_node(dev);
			if (dev)
				of_scan_pci_bridge(child, dev);
		}
263 264
	}
}
J
John Rose 已提交
265
EXPORT_SYMBOL(of_scan_bus);
266

J
John Rose 已提交
267
void __devinit of_scan_pci_bridge(struct device_node *node,
268
				  struct pci_dev *dev)
269 270
{
	struct pci_bus *bus;
271
	const u32 *busrange, *ranges;
272 273 274 275 276
	int len, i, mode;
	struct resource *res;
	unsigned int flags;
	u64 size;

277 278
	DBG("of_scan_pci_bridge(%s)\n", node->full_name);

279
	/* parse bus-range property */
280
	busrange = of_get_property(node, "bus-range", &len);
281
	if (busrange == NULL || len != 8) {
282
		printk(KERN_DEBUG "Can't get bus-range for PCI-PCI bridge %s\n",
283 284 285
		       node->full_name);
		return;
	}
286
	ranges = of_get_property(node, "ranges", &len);
287
	if (ranges == NULL) {
288
		printk(KERN_DEBUG "Can't get ranges for PCI-PCI bridge %s\n",
289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
		       node->full_name);
		return;
	}

	bus = pci_add_new_bus(dev->bus, dev, busrange[0]);
	if (!bus) {
		printk(KERN_ERR "Failed to create pci bus for %s\n",
		       node->full_name);
		return;
	}

	bus->primary = dev->bus->number;
	bus->subordinate = busrange[1];
	bus->bridge_ctl = 0;
	bus->sysdata = node;

	/* parse ranges property */
	/* PCI #address-cells == 3 and #size-cells == 2 always */
	res = &dev->resource[PCI_BRIDGE_RESOURCES];
	for (i = 0; i < PCI_NUM_RESOURCES - PCI_BRIDGE_RESOURCES; ++i) {
		res->flags = 0;
		bus->resource[i] = res;
		++res;
	}
	i = 1;
	for (; len >= 32; len -= 32, ranges += 8) {
		flags = pci_parse_of_flags(ranges[0]);
316
		size = of_read_number(&ranges[6], 2);
317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334
		if (flags == 0 || size == 0)
			continue;
		if (flags & IORESOURCE_IO) {
			res = bus->resource[0];
			if (res->flags) {
				printk(KERN_ERR "PCI: ignoring extra I/O range"
				       " for bridge %s\n", node->full_name);
				continue;
			}
		} else {
			if (i >= PCI_NUM_RESOURCES - PCI_BRIDGE_RESOURCES) {
				printk(KERN_ERR "PCI: too many memory ranges"
				       " for bridge %s\n", node->full_name);
				continue;
			}
			res = bus->resource[i];
			++i;
		}
335
		res->start = of_read_number(&ranges[1], 2);
336 337 338 339 340
		res->end = res->start + size - 1;
		res->flags = flags;
	}
	sprintf(bus->name, "PCI Bus %04x:%02x", pci_domain_nr(bus),
		bus->number);
341
	DBG("    bus name: %s\n", bus->name);
342 343 344 345

	mode = PCI_PROBE_NORMAL;
	if (ppc_md.pci_probe_mode)
		mode = ppc_md.pci_probe_mode(bus);
346 347
	DBG("    probe mode: %d\n", mode);

348 349 350 351 352
	if (mode == PCI_PROBE_DEVTREE)
		of_scan_bus(node, bus);
	else if (mode == PCI_PROBE_NORMAL)
		pci_scan_child_bus(bus);
}
J
John Rose 已提交
353
EXPORT_SYMBOL(of_scan_pci_bridge);
354

J
John Rose 已提交
355
void __devinit scan_phb(struct pci_controller *hose)
356 357
{
	struct pci_bus *bus;
358
	struct device_node *node = hose->dn;
359 360 361
	int i, mode;
	struct resource *res;

362 363
	DBG("Scanning PHB %s\n", node ? node->full_name : "<NO NAME>");

364
	/* Create an empty bus for the toplevel */
365
	bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, node);
366 367 368 369 370 371 372 373
	if (bus == NULL) {
		printk(KERN_ERR "Failed to create bus for PCI domain %04x\n",
		       hose->global_number);
		return;
	}
	bus->secondary = hose->first_busno;
	hose->bus = bus;

374
	/* Get some IO space for the new PHB */
375
	pcibios_map_io_space(bus);
376

377
	/* Wire up PHB bus resources */
378
	bus->resource[0] = res = &hose->io_resource;
379 380
	for (i = 0; i < 3; ++i)
		bus->resource[i+1] = &hose->mem_resources[i];
381

382
	/* Get probe mode and perform scan */
383
	mode = PCI_PROBE_NORMAL;
384
	if (node && ppc_md.pci_probe_mode)
385
		mode = ppc_md.pci_probe_mode(bus);
386
	DBG("    probe mode: %d\n", mode);
387 388 389 390
	if (mode == PCI_PROBE_DEVTREE) {
		bus->subordinate = hose->last_busno;
		of_scan_bus(node, bus);
	}
391

392 393 394 395
	if (mode == PCI_PROBE_NORMAL)
		hose->last_busno = bus->subordinate = pci_scan_child_bus(bus);
}

L
Linus Torvalds 已提交
396 397 398 399
static int __init pcibios_init(void)
{
	struct pci_controller *hose, *tmp;

400 401
	printk(KERN_INFO "PCI: Probing PCI hardware\n");

L
Linus Torvalds 已提交
402 403 404 405 406
	/* For now, override phys_mem_access_prot. If we need it,
	 * later, we may move that initialization to each ppc_md
	 */
	ppc_md.phys_mem_access_prot = pci_phys_mem_access_prot;

407 408
	if (pci_probe_only)
		ppc_pci_flags |= PPC_PCI_PROBE_ONLY;
L
Linus Torvalds 已提交
409 410

	/* Scan all of the recorded PCI controllers.  */
411
	list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
412
		scan_phb(hose);
413 414
		pci_bus_add_devices(hose->bus);
	}
L
Linus Torvalds 已提交
415

416 417
	/* Call common code to handle resource allocation */
	pcibios_resource_survey();
L
Linus Torvalds 已提交
418

419
	printk(KERN_DEBUG "PCI: Probing PCI hardware done\n");
L
Linus Torvalds 已提交
420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455

	return 0;
}

subsys_initcall(pcibios_init);

int pcibios_enable_device(struct pci_dev *dev, int mask)
{
	u16 cmd, oldcmd;
	int i;

	pci_read_config_word(dev, PCI_COMMAND, &cmd);
	oldcmd = cmd;

	for (i = 0; i < PCI_NUM_RESOURCES; i++) {
		struct resource *res = &dev->resource[i];

		/* Only set up the requested stuff */
		if (!(mask & (1<<i)))
			continue;

		if (res->flags & IORESOURCE_IO)
			cmd |= PCI_COMMAND_IO;
		if (res->flags & IORESOURCE_MEM)
			cmd |= PCI_COMMAND_MEMORY;
	}

	if (cmd != oldcmd) {
		printk(KERN_DEBUG "PCI: Enabling device: (%s), cmd %x\n",
		       pci_name(dev), cmd);
                /* Enable the appropriate bits in the PCI command register.  */
		pci_write_config_word(dev, PCI_COMMAND, cmd);
	}
	return 0;
}

456 457 458
#ifdef CONFIG_HOTPLUG

int pcibios_unmap_io_space(struct pci_bus *bus)
L
Linus Torvalds 已提交
459
{
460
	struct pci_controller *hose;
L
Linus Torvalds 已提交
461

462
	WARN_ON(bus == NULL);
463

464 465 466 467 468 469 470 471 472
	/* If this is not a PHB, we only flush the hash table over
	 * the area mapped by this bridge. We don't play with the PTE
	 * mappings since we might have to deal with sub-page alignemnts
	 * so flushing the hash table is the only sane way to make sure
	 * that no hash entries are covering that removed bridge area
	 * while still allowing other busses overlapping those pages
	 */
	if (bus->self) {
		struct resource *res = bus->resource[0];
L
Linus Torvalds 已提交
473

474 475
		DBG("IO unmapping for PCI-PCI bridge %s\n",
		    pci_name(bus->self));
476

477 478 479 480
		__flush_hash_table_range(&init_mm, res->start + _IO_BASE,
					 res->end - res->start + 1);
		return 0;
	}
L
Linus Torvalds 已提交
481

482 483
	/* Get the host bridge */
	hose = pci_bus_to_host(bus);
L
Linus Torvalds 已提交
484

485 486 487
	/* Check if we have IOs allocated */
	if (hose->io_base_alloc == 0)
		return 0;
488

489
	DBG("IO unmapping for PHB %s\n", hose->dn->full_name);
490
	DBG("  alloc=0x%p\n", hose->io_base_alloc);
L
Linus Torvalds 已提交
491

492 493
	/* This is a PHB, we fully unmap the IO area */
	vunmap(hose->io_base_alloc);
L
Linus Torvalds 已提交
494

495
	return 0;
L
Linus Torvalds 已提交
496
}
497
EXPORT_SYMBOL_GPL(pcibios_unmap_io_space);
L
Linus Torvalds 已提交
498

499
#endif /* CONFIG_HOTPLUG */
L
Linus Torvalds 已提交
500

501
int __devinit pcibios_map_io_space(struct pci_bus *bus)
L
Linus Torvalds 已提交
502
{
503 504 505 506 507
	struct vm_struct *area;
	unsigned long phys_page;
	unsigned long size_page;
	unsigned long io_virt_offset;
	struct pci_controller *hose;
508

509
	WARN_ON(bus == NULL);
510

511 512 513 514 515 516 517 518 519 520
	/* If this not a PHB, nothing to do, page tables still exist and
	 * thus HPTEs will be faulted in when needed
	 */
	if (bus->self) {
		DBG("IO mapping for PCI-PCI bridge %s\n",
		    pci_name(bus->self));
		DBG("  virt=0x%016lx...0x%016lx\n",
		    bus->resource[0]->start + _IO_BASE,
		    bus->resource[0]->end + _IO_BASE);
		return 0;
L
Linus Torvalds 已提交
521 522
	}

523 524 525 526
	/* Get the host bridge */
	hose = pci_bus_to_host(bus);
	phys_page = _ALIGN_DOWN(hose->io_base_phys, PAGE_SIZE);
	size_page = _ALIGN_UP(hose->pci_io_size, PAGE_SIZE);
L
Linus Torvalds 已提交
527

528 529
	/* Make sure IO area address is clear */
	hose->io_base_alloc = NULL;
L
Linus Torvalds 已提交
530

531 532 533
	/* If there's no IO to map on that bus, get away too */
	if (hose->pci_io_size == 0 || hose->io_base_phys == 0)
		return 0;
L
Linus Torvalds 已提交
534

535 536 537 538 539 540 541 542 543 544 545 546 547
	/* Let's allocate some IO space for that guy. We don't pass
	 * VM_IOREMAP because we don't care about alignment tricks that
	 * the core does in that case. Maybe we should due to stupid card
	 * with incomplete address decoding but I'd rather not deal with
	 * those outside of the reserved 64K legacy region.
	 */
	area = __get_vm_area(size_page, 0, PHB_IO_BASE, PHB_IO_END);
	if (area == NULL)
		return -ENOMEM;
	hose->io_base_alloc = area->addr;
	hose->io_base_virt = (void __iomem *)(area->addr +
					      hose->io_base_phys - phys_page);

548
	DBG("IO mapping for PHB %s\n", hose->dn->full_name);
549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
	DBG("  phys=0x%016lx, virt=0x%p (alloc=0x%p)\n",
	    hose->io_base_phys, hose->io_base_virt, hose->io_base_alloc);
	DBG("  size=0x%016lx (alloc=0x%016lx)\n",
	    hose->pci_io_size, size_page);

	/* Establish the mapping */
	if (__ioremap_at(phys_page, area->addr, size_page,
			 _PAGE_NO_CACHE | _PAGE_GUARDED) == NULL)
		return -ENOMEM;

	/* Fixup hose IO resource */
	io_virt_offset = (unsigned long)hose->io_base_virt - _IO_BASE;
	hose->io_resource.start += io_virt_offset;
	hose->io_resource.end += io_virt_offset;

	DBG("  hose->io_resource=0x%016lx...0x%016lx\n",
	    hose->io_resource.start, hose->io_resource.end);
L
Linus Torvalds 已提交
566 567 568

	return 0;
}
569
EXPORT_SYMBOL_GPL(pcibios_map_io_space);
L
Linus Torvalds 已提交
570

571 572 573 574 575 576
void __devinit pcibios_setup_new_device(struct pci_dev *dev)
{
	struct dev_archdata *sd = &dev->dev.archdata;

	sd->of_node = pci_device_to_OF_node(dev);

577
	DBG("PCI: device %s OF node: %s\n", pci_name(dev),
578 579 580 581 582 583 584 585 586 587 588 589
	    sd->of_node ? sd->of_node->full_name : "<none>");

	sd->dma_ops = pci_dma_ops;
#ifdef CONFIG_NUMA
	sd->numa_node = pcibus_to_node(dev->bus);
#else
	sd->numa_node = -1;
#endif
	if (ppc_md.pci_dma_dev_setup)
		ppc_md.pci_dma_dev_setup(dev);
}
EXPORT_SYMBOL(pcibios_setup_new_device);
590

591
void __devinit pcibios_do_bus_setup(struct pci_bus *bus)
L
Linus Torvalds 已提交
592
{
593
	struct pci_dev *dev;
L
Linus Torvalds 已提交
594

595 596
	if (ppc_md.pci_dma_bus_setup)
		ppc_md.pci_dma_bus_setup(bus);
L
Linus Torvalds 已提交
597

598
	list_for_each_entry(dev, &bus->devices, bus_list)
599
		pcibios_setup_new_device(dev);
L
Linus Torvalds 已提交
600 601
}

602
unsigned long pci_address_to_pio(phys_addr_t address)
603 604 605 606 607
{
	struct pci_controller *hose, *tmp;

	list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
		if (address >= hose->io_base_phys &&
608 609
		    address < (hose->io_base_phys + hose->pci_io_size)) {
			unsigned long base =
610
				(unsigned long)hose->io_base_virt - _IO_BASE;
611 612
			return base + (address - hose->io_base_phys);
		}
613 614 615 616 617
	}
	return (unsigned int)-1;
}
EXPORT_SYMBOL_GPL(pci_address_to_pio);

618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637

#define IOBASE_BRIDGE_NUMBER	0
#define IOBASE_MEMORY		1
#define IOBASE_IO		2
#define IOBASE_ISA_IO		3
#define IOBASE_ISA_MEM		4

long sys_pciconfig_iobase(long which, unsigned long in_bus,
			  unsigned long in_devfn)
{
	struct pci_controller* hose;
	struct list_head *ln;
	struct pci_bus *bus = NULL;
	struct device_node *hose_node;

	/* Argh ! Please forgive me for that hack, but that's the
	 * simplest way to get existing XFree to not lockup on some
	 * G5 machines... So when something asks for bus 0 io base
	 * (bus 0 is HT root), we return the AGP one instead.
	 */
638
	if (machine_is_compatible("MacRISC4"))
639 640 641 642 643 644 645 646 647
		if (in_bus == 0)
			in_bus = 0xf0;

	/* That syscall isn't quite compatible with PCI domains, but it's
	 * used on pre-domains setup. We return the first match
	 */

	for (ln = pci_root_buses.next; ln != &pci_root_buses; ln = ln->next) {
		bus = pci_bus_b(ln);
648
		if (in_bus >= bus->number && in_bus <= bus->subordinate)
649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672
			break;
		bus = NULL;
	}
	if (bus == NULL || bus->sysdata == NULL)
		return -ENODEV;

	hose_node = (struct device_node *)bus->sysdata;
	hose = PCI_DN(hose_node)->phb;

	switch (which) {
	case IOBASE_BRIDGE_NUMBER:
		return (long)hose->first_busno;
	case IOBASE_MEMORY:
		return (long)hose->pci_mem_offset;
	case IOBASE_IO:
		return (long)hose->io_base_phys;
	case IOBASE_ISA_IO:
		return (long)isa_io_base;
	case IOBASE_ISA_MEM:
		return -EINVAL;
	}

	return -EOPNOTSUPP;
}
A
Anton Blanchard 已提交
673 674 675 676 677 678 679 680 681

#ifdef CONFIG_NUMA
int pcibus_to_node(struct pci_bus *bus)
{
	struct pci_controller *phb = pci_bus_to_host(bus);
	return phb->node;
}
EXPORT_SYMBOL(pcibus_to_node);
#endif