of_device_32.c 13.0 KB
Newer Older
1 2
#include <linux/string.h>
#include <linux/kernel.h>
3
#include <linux/of.h>
4 5 6 7
#include <linux/init.h>
#include <linux/module.h>
#include <linux/mod_devicetable.h>
#include <linux/slab.h>
S
Stephen Rothwell 已提交
8 9 10
#include <linux/errno.h>
#include <linux/of_device.h>
#include <linux/of_platform.h>
11

12 13 14 15 16 17 18 19 20 21
static int node_match(struct device *dev, void *data)
{
	struct of_device *op = to_of_device(dev);
	struct device_node *dp = data;

	return (op->node == dp);
}

struct of_device *of_find_device_by_node(struct device_node *dp)
{
22
	struct device *dev = bus_find_device(&of_platform_bus_type, NULL,
23 24 25 26 27 28 29 30 31
					     dp, node_match);

	if (dev)
		return to_of_device(dev);

	return NULL;
}
EXPORT_SYMBOL(of_find_device_by_node);

32
unsigned int irq_of_parse_and_map(struct device_node *node, int index)
33 34 35 36
{
	struct of_device *op = of_find_device_by_node(node);

	if (!op || index >= op->num_irqs)
37
		return 0;
38 39 40 41 42

	return op->irqs[index];
}
EXPORT_SYMBOL(irq_of_parse_and_map);

43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
/* Take the archdata values for IOMMU, STC, and HOSTDATA found in
 * BUS and propagate to all child of_device objects.
 */
void of_propagate_archdata(struct of_device *bus)
{
	struct dev_archdata *bus_sd = &bus->dev.archdata;
	struct device_node *bus_dp = bus->node;
	struct device_node *dp;

	for (dp = bus_dp->child; dp; dp = dp->sibling) {
		struct of_device *op = of_find_device_by_node(dp);

		op->dev.archdata.iommu = bus_sd->iommu;
		op->dev.archdata.stc = bus_sd->stc;
		op->dev.archdata.host_controller = bus_sd->host_controller;
		op->dev.archdata.numa_node = bus_sd->numa_node;

		if (dp->child)
			of_propagate_archdata(op);
	}
}

S
Stephen Rothwell 已提交
65
struct bus_type of_platform_bus_type;
66
EXPORT_SYMBOL(of_platform_bus_type);
67

68
static inline u64 of_read_addr(const u32 *cell, int size)
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
{
	u64 r = 0;
	while (size--)
		r = (r << 32) | *(cell++);
	return r;
}

static void __init get_cells(struct device_node *dp,
			     int *addrc, int *sizec)
{
	if (addrc)
		*addrc = of_n_addr_cells(dp);
	if (sizec)
		*sizec = of_n_size_cells(dp);
}

/* Max address size we deal with */
#define OF_MAX_ADDR_CELLS	4

struct of_bus {
	const char	*name;
	const char	*addr_prop_name;
	int		(*match)(struct device_node *parent);
	void		(*count_cells)(struct device_node *child,
				       int *addrc, int *sizec);
94 95
	int		(*map)(u32 *addr, const u32 *range,
			       int na, int ns, int pna);
96
	unsigned long	(*get_flags)(const u32 *addr, unsigned long);
97 98 99 100 101 102 103 104 105 106 107 108
};

/*
 * Default translator (generic bus)
 */

static void of_bus_default_count_cells(struct device_node *dev,
				       int *addrc, int *sizec)
{
	get_cells(dev, addrc, sizec);
}

109 110 111 112 113
/* Make sure the least significant 64-bits are in-range.  Even
 * for 3 or 4 cell values it is a good enough approximation.
 */
static int of_out_of_range(const u32 *addr, const u32 *base,
			   const u32 *size, int na, int ns)
114
{
115 116 117 118 119
	u64 a = of_read_addr(addr, na);
	u64 b = of_read_addr(base, na);

	if (a < b)
		return 1;
120

121 122 123
	b += of_read_addr(size, ns);
	if (a >= b)
		return 1;
124

125
	return 0;
126 127
}

128 129
static int of_bus_default_map(u32 *addr, const u32 *range,
			      int na, int ns, int pna)
130
{
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
	u32 result[OF_MAX_ADDR_CELLS];
	int i;

	if (ns > 2) {
		printk("of_device: Cannot handle size cells (%d) > 2.", ns);
		return -EINVAL;
	}

	if (of_out_of_range(addr, range, range + na + pna, na, ns))
		return -EINVAL;

	/* Start with the parent range base.  */
	memcpy(result, range + na, pna * 4);

	/* Add in the child address offset.  */
	for (i = 0; i < na; i++)
		result[pna - 1 - i] +=
			(addr[na - 1 - i] -
			 range[na - 1 - i]);

	memcpy(addr, result, pna * 4);
152 153 154 155

	return 0;
}

156
static unsigned long of_bus_default_get_flags(const u32 *addr, unsigned long flags)
157
{
158 159
	if (flags)
		return flags;
160 161 162 163 164 165 166 167 168
	return IORESOURCE_MEM;
}

/*
 * PCI bus specific translator
 */

static int of_bus_pci_match(struct device_node *np)
{
169 170 171 172 173 174 175 176 177 178 179 180 181 182
	if (!strcmp(np->type, "pci") || !strcmp(np->type, "pciex")) {
		/* Do not do PCI specific frobbing if the
		 * PCI bridge lacks a ranges property.  We
		 * want to pass it through up to the next
		 * parent as-is, not with the PCI translate
		 * method which chops off the top address cell.
		 */
		if (!of_find_property(np, "ranges", NULL))
			return 0;

		return 1;
	}

	return 0;
183 184 185 186 187 188 189 190 191 192 193
}

static void of_bus_pci_count_cells(struct device_node *np,
				   int *addrc, int *sizec)
{
	if (addrc)
		*addrc = 3;
	if (sizec)
		*sizec = 2;
}

194 195
static int of_bus_pci_map(u32 *addr, const u32 *range,
			  int na, int ns, int pna)
196
{
197 198
	u32 result[OF_MAX_ADDR_CELLS];
	int i;
199 200 201

	/* Check address type match */
	if ((addr[0] ^ range[0]) & 0x03000000)
202
		return -EINVAL;
203

204 205 206
	if (of_out_of_range(addr + 1, range + 1, range + na + pna,
			    na - 1, ns))
		return -EINVAL;
207

208 209
	/* Start with the parent range base.  */
	memcpy(result, range + na, pna * 4);
210

211 212 213 214 215 216 217 218 219
	/* Add in the child address offset, skipping high cell.  */
	for (i = 0; i < na - 1; i++)
		result[pna - 1 - i] +=
			(addr[na - 1 - i] -
			 range[na - 1 - i]);

	memcpy(addr, result, pna * 4);

	return 0;
220 221
}

222
static unsigned long of_bus_pci_get_flags(const u32 *addr, unsigned long flags)
223 224 225
{
	u32 w = addr[0];

226 227
	/* For PCI, we override whatever child busses may have used.  */
	flags = 0;
228 229 230
	switch((w >> 24) & 0x03) {
	case 0x01:
		flags |= IORESOURCE_IO;
231 232
		break;

233 234 235
	case 0x02: /* 32 bits */
	case 0x03: /* 64 bits */
		flags |= IORESOURCE_MEM;
236
		break;
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
	}
	if (w & 0x40000000)
		flags |= IORESOURCE_PREFETCH;
	return flags;
}

/*
 * SBUS bus specific translator
 */

static int of_bus_sbus_match(struct device_node *np)
{
	return !strcmp(np->name, "sbus") ||
		!strcmp(np->name, "sbi");
}

static void of_bus_sbus_count_cells(struct device_node *child,
				   int *addrc, int *sizec)
{
	if (addrc)
		*addrc = 2;
	if (sizec)
		*sizec = 1;
}

262
static int of_bus_sbus_map(u32 *addr, const u32 *range, int na, int ns, int pna)
263 264 265 266
{
	return of_bus_default_map(addr, range, na, ns, pna);
}

267
static unsigned long of_bus_sbus_get_flags(const u32 *addr, unsigned long flags)
268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 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 316 317 318 319 320 321 322 323
{
	return IORESOURCE_MEM;
}


/*
 * Array of bus specific translators
 */

static struct of_bus of_busses[] = {
	/* PCI */
	{
		.name = "pci",
		.addr_prop_name = "assigned-addresses",
		.match = of_bus_pci_match,
		.count_cells = of_bus_pci_count_cells,
		.map = of_bus_pci_map,
		.get_flags = of_bus_pci_get_flags,
	},
	/* SBUS */
	{
		.name = "sbus",
		.addr_prop_name = "reg",
		.match = of_bus_sbus_match,
		.count_cells = of_bus_sbus_count_cells,
		.map = of_bus_sbus_map,
		.get_flags = of_bus_sbus_get_flags,
	},
	/* Default */
	{
		.name = "default",
		.addr_prop_name = "reg",
		.match = NULL,
		.count_cells = of_bus_default_count_cells,
		.map = of_bus_default_map,
		.get_flags = of_bus_default_get_flags,
	},
};

static struct of_bus *of_match_bus(struct device_node *np)
{
	int i;

	for (i = 0; i < ARRAY_SIZE(of_busses); i ++)
		if (!of_busses[i].match || of_busses[i].match(np))
			return &of_busses[i];
	BUG();
	return NULL;
}

static int __init build_one_resource(struct device_node *parent,
				     struct of_bus *bus,
				     struct of_bus *pbus,
				     u32 *addr,
				     int na, int ns, int pna)
{
324
	const u32 *ranges;
325 326 327 328 329
	unsigned int rlen;
	int rone;

	ranges = of_get_property(parent, "ranges", &rlen);
	if (ranges == NULL || rlen == 0) {
330 331 332 333 334 335 336 337 338 339
		u32 result[OF_MAX_ADDR_CELLS];
		int i;

		memset(result, 0, pna * 4);
		for (i = 0; i < na; i++)
			result[pna - 1 - i] =
				addr[na - 1 - i];

		memcpy(addr, result, pna * 4);
		return 0;
340 341 342 343 344 345
	}

	/* Now walk through the ranges */
	rlen /= 4;
	rone = na + pna + ns;
	for (; rlen >= rone; rlen -= rone, ranges += rone) {
346 347
		if (!bus->map(addr, ranges, na, ns, pna))
			return 0;
348 349
	}

350
	return 1;
351 352
}

353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373
static int __init use_1to1_mapping(struct device_node *pp)
{
	/* If we have a ranges property in the parent, use it.  */
	if (of_find_property(pp, "ranges", NULL) != NULL)
		return 0;

	/* Some SBUS devices use intermediate nodes to express
	 * hierarchy within the device itself.  These aren't
	 * real bus nodes, and don't have a 'ranges' property.
	 * But, we should still pass the translation work up
	 * to the SBUS itself.
	 */
	if (!strcmp(pp->name, "dma") ||
	    !strcmp(pp->name, "espdma") ||
	    !strcmp(pp->name, "ledma") ||
	    !strcmp(pp->name, "lebuffer"))
		return 0;

	return 1;
}

374 375
static int of_resource_verbose;

376 377 378 379 380 381 382
static void __init build_device_resources(struct of_device *op,
					  struct device *parent)
{
	struct of_device *p_op;
	struct of_bus *bus;
	int na, ns;
	int index, num_reg;
383
	const void *preg;
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404

	if (!parent)
		return;

	p_op = to_of_device(parent);
	bus = of_match_bus(p_op->node);
	bus->count_cells(op->node, &na, &ns);

	preg = of_get_property(op->node, bus->addr_prop_name, &num_reg);
	if (!preg || num_reg == 0)
		return;

	/* Convert to num-cells.  */
	num_reg /= 4;

	/* Conver to num-entries.  */
	num_reg /= na + ns;

	for (index = 0; index < num_reg; index++) {
		struct resource *r = &op->resource[index];
		u32 addr[OF_MAX_ADDR_CELLS];
405
		const u32 *reg = (preg + (index * ((na + ns) * 4)));
406 407
		struct device_node *dp = op->node;
		struct device_node *pp = p_op->node;
408
		struct of_bus *pbus, *dbus;
409 410 411 412 413 414 415 416 417
		u64 size, result = OF_BAD_ADDR;
		unsigned long flags;
		int dna, dns;
		int pna, pns;

		size = of_read_addr(reg + na, ns);

		memcpy(addr, reg, na * 4);

418 419
		flags = bus->get_flags(reg, 0);

420
		if (use_1to1_mapping(pp)) {
421 422 423 424 425 426
			result = of_read_addr(addr, na);
			goto build_res;
		}

		dna = na;
		dns = ns;
427
		dbus = bus;
428 429 430 431 432 433 434 435 436 437 438 439

		while (1) {
			dp = pp;
			pp = dp->parent;
			if (!pp) {
				result = of_read_addr(addr, dna);
				break;
			}

			pbus = of_match_bus(pp);
			pbus->count_cells(dp, &pna, &pns);

440
			if (build_one_resource(dp, dbus, pbus, addr,
441
					       dna, dns, pna))
442 443
				break;

444 445
			flags = pbus->get_flags(addr, flags);

446 447
			dna = pna;
			dns = pns;
448
			dbus = pbus;
449 450 451 452
		}

	build_res:
		memset(r, 0, sizeof(*r));
453 454 455 456 457 458

		if (of_resource_verbose)
			printk("%s reg[%d] -> %llx\n",
			       op->node->full_name, index,
			       result);

459
		if (result != OF_BAD_ADDR) {
460
			r->start = result & 0xffffffff;
461
			r->end = result + size - 1;
462
			r->flags = flags | ((result >> 32ULL) & 0xffUL);
463 464 465 466 467 468 469 470 471
		}
		r->name = op->node->name;
	}
}

static struct of_device * __init scan_one_device(struct device_node *dp,
						 struct device *parent)
{
	struct of_device *op = kzalloc(sizeof(*op), GFP_KERNEL);
472
	const struct linux_prom_irqs *intr;
473
	struct dev_archdata *sd;
474
	int len, i;
475 476 477 478

	if (!op)
		return NULL;

479 480 481 482
	sd = &op->dev.archdata;
	sd->prom_node = dp;
	sd->op = op;

483 484 485 486 487 488 489 490
	op->node = dp;

	op->clock_freq = of_getintprop_default(dp, "clock-frequency",
					       (25*1000*1000));
	op->portid = of_getintprop_default(dp, "upa-portid", -1);
	if (op->portid == -1)
		op->portid = of_getintprop_default(dp, "portid", -1);

491 492 493 494 495 496
	intr = of_get_property(dp, "intr", &len);
	if (intr) {
		op->num_irqs = len / sizeof(struct linux_prom_irqs);
		for (i = 0; i < op->num_irqs; i++)
			op->irqs[i] = intr[i].pri;
	} else {
497 498
		const unsigned int *irq =
			of_get_property(dp, "interrupts", &len);
499 500 501 502 503 504 505 506 507 508 509 510 511

		if (irq) {
			op->num_irqs = len / sizeof(unsigned int);
			for (i = 0; i < op->num_irqs; i++)
				op->irqs[i] = irq[i];
		} else {
			op->num_irqs = 0;
		}
	}
	if (sparc_cpu_model == sun4d) {
		static int pil_to_sbus[] = {
			0, 0, 1, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 0,
		};
512
		struct device_node *io_unit, *sbi = dp->parent;
513
		const struct linux_prom_registers *regs;
514 515 516 517 518 519 520 521 522 523
		int board, slot;

		while (sbi) {
			if (!strcmp(sbi->name, "sbi"))
				break;

			sbi = sbi->parent;
		}
		if (!sbi)
			goto build_resources;
524 525

		regs = of_get_property(dp, "reg", NULL);
526 527 528
		if (!regs)
			goto build_resources;

529 530
		slot = regs->which_io;

531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546
		/* If SBI's parent is not io-unit or the io-unit lacks
		 * a "board#" property, something is very wrong.
		 */
		if (!sbi->parent || strcmp(sbi->parent->name, "io-unit")) {
			printk("%s: Error, parent is not io-unit.\n",
			       sbi->full_name);
			goto build_resources;
		}
		io_unit = sbi->parent;
		board = of_getintprop_default(io_unit, "board#", -1);
		if (board == -1) {
			printk("%s: Error, lacks board# property.\n",
			       io_unit->full_name);
			goto build_resources;
		}

547 548 549 550 551 552 553 554 555 556 557 558
		for (i = 0; i < op->num_irqs; i++) {
			int this_irq = op->irqs[i];
			int sbusl = pil_to_sbus[this_irq];

			if (sbusl)
				this_irq = (((board + 1) << 5) +
					    (sbusl << 2) +
					    slot);

			op->irqs[i] = this_irq;
		}
	}
559

560
build_resources:
561 562 563
	build_device_resources(op, parent);

	op->dev.parent = parent;
564
	op->dev.bus = &of_platform_bus_type;
565
	if (!parent)
566
		dev_set_name(&op->dev, "root");
567
	else
568
		dev_set_name(&op->dev, "%08x", dp->node);
569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603

	if (of_device_register(op)) {
		printk("%s: Could not register of device.\n",
		       dp->full_name);
		kfree(op);
		op = NULL;
	}

	return op;
}

static void __init scan_tree(struct device_node *dp, struct device *parent)
{
	while (dp) {
		struct of_device *op = scan_one_device(dp, parent);

		if (op)
			scan_tree(dp->child, &op->dev);

		dp = dp->sibling;
	}
}

static void __init scan_of_devices(void)
{
	struct device_node *root = of_find_node_by_path("/");
	struct of_device *parent;

	parent = scan_one_device(root, NULL);
	if (!parent)
		return;

	scan_tree(root->child, &parent->dev);
}

604 605
static int __init of_bus_driver_init(void)
{
606
	int err;
607

S
Stephen Rothwell 已提交
608
	err = of_bus_type_init(&of_platform_bus_type, "of");
609 610 611 612
	if (!err)
		scan_of_devices();

	return err;
613 614 615 616
}

postcore_initcall(of_bus_driver_init);

617 618 619 620 621 622 623 624 625 626 627
static int __init of_debug(char *str)
{
	int val = 0;

	get_option(&str, &val);
	if (val & 1)
		of_resource_verbose = 1;
	return 1;
}

__setup("of_debug=", of_debug);