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

of_device_64.c (16296B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include <linux/string.h>
      3#include <linux/kernel.h>
      4#include <linux/of.h>
      5#include <linux/dma-mapping.h>
      6#include <linux/init.h>
      7#include <linux/export.h>
      8#include <linux/mod_devicetable.h>
      9#include <linux/slab.h>
     10#include <linux/errno.h>
     11#include <linux/irq.h>
     12#include <linux/of_device.h>
     13#include <linux/of_platform.h>
     14#include <asm/spitfire.h>
     15
     16#include "of_device_common.h"
     17
     18void __iomem *of_ioremap(struct resource *res, unsigned long offset, unsigned long size, char *name)
     19{
     20	unsigned long ret = res->start + offset;
     21	struct resource *r;
     22
     23	if (res->flags & IORESOURCE_MEM)
     24		r = request_mem_region(ret, size, name);
     25	else
     26		r = request_region(ret, size, name);
     27	if (!r)
     28		ret = 0;
     29
     30	return (void __iomem *) ret;
     31}
     32EXPORT_SYMBOL(of_ioremap);
     33
     34void of_iounmap(struct resource *res, void __iomem *base, unsigned long size)
     35{
     36	if (res->flags & IORESOURCE_MEM)
     37		release_mem_region((unsigned long) base, size);
     38	else
     39		release_region((unsigned long) base, size);
     40}
     41EXPORT_SYMBOL(of_iounmap);
     42
     43/*
     44 * PCI bus specific translator
     45 */
     46
     47static int of_bus_pci_match(struct device_node *np)
     48{
     49	if (of_node_name_eq(np, "pci")) {
     50		const char *model = of_get_property(np, "model", NULL);
     51
     52		if (model && !strcmp(model, "SUNW,simba"))
     53			return 0;
     54
     55		/* Do not do PCI specific frobbing if the
     56		 * PCI bridge lacks a ranges property.  We
     57		 * want to pass it through up to the next
     58		 * parent as-is, not with the PCI translate
     59		 * method which chops off the top address cell.
     60		 */
     61		if (!of_find_property(np, "ranges", NULL))
     62			return 0;
     63
     64		return 1;
     65	}
     66
     67	return 0;
     68}
     69
     70static int of_bus_simba_match(struct device_node *np)
     71{
     72	const char *model = of_get_property(np, "model", NULL);
     73
     74	if (model && !strcmp(model, "SUNW,simba"))
     75		return 1;
     76
     77	/* Treat PCI busses lacking ranges property just like
     78	 * simba.
     79	 */
     80	if (of_node_name_eq(np, "pci")) {
     81		if (!of_find_property(np, "ranges", NULL))
     82			return 1;
     83	}
     84
     85	return 0;
     86}
     87
     88static int of_bus_simba_map(u32 *addr, const u32 *range,
     89			    int na, int ns, int pna)
     90{
     91	return 0;
     92}
     93
     94static void of_bus_pci_count_cells(struct device_node *np,
     95				   int *addrc, int *sizec)
     96{
     97	if (addrc)
     98		*addrc = 3;
     99	if (sizec)
    100		*sizec = 2;
    101}
    102
    103static int of_bus_pci_map(u32 *addr, const u32 *range,
    104			  int na, int ns, int pna)
    105{
    106	u32 result[OF_MAX_ADDR_CELLS];
    107	int i;
    108
    109	/* Check address type match */
    110	if (!((addr[0] ^ range[0]) & 0x03000000))
    111		goto type_match;
    112
    113	/* Special exception, we can map a 64-bit address into
    114	 * a 32-bit range.
    115	 */
    116	if ((addr[0] & 0x03000000) == 0x03000000 &&
    117	    (range[0] & 0x03000000) == 0x02000000)
    118		goto type_match;
    119
    120	return -EINVAL;
    121
    122type_match:
    123	if (of_out_of_range(addr + 1, range + 1, range + na + pna,
    124			    na - 1, ns))
    125		return -EINVAL;
    126
    127	/* Start with the parent range base.  */
    128	memcpy(result, range + na, pna * 4);
    129
    130	/* Add in the child address offset, skipping high cell.  */
    131	for (i = 0; i < na - 1; i++)
    132		result[pna - 1 - i] +=
    133			(addr[na - 1 - i] -
    134			 range[na - 1 - i]);
    135
    136	memcpy(addr, result, pna * 4);
    137
    138	return 0;
    139}
    140
    141static unsigned long of_bus_pci_get_flags(const u32 *addr, unsigned long flags)
    142{
    143	u32 w = addr[0];
    144
    145	/* For PCI, we override whatever child busses may have used.  */
    146	flags = 0;
    147	switch((w >> 24) & 0x03) {
    148	case 0x01:
    149		flags |= IORESOURCE_IO;
    150		break;
    151
    152	case 0x02: /* 32 bits */
    153	case 0x03: /* 64 bits */
    154		flags |= IORESOURCE_MEM;
    155		break;
    156	}
    157	if (w & 0x40000000)
    158		flags |= IORESOURCE_PREFETCH;
    159	return flags;
    160}
    161
    162/*
    163 * FHC/Central bus specific translator.
    164 *
    165 * This is just needed to hard-code the address and size cell
    166 * counts.  'fhc' and 'central' nodes lack the #address-cells and
    167 * #size-cells properties, and if you walk to the root on such
    168 * Enterprise boxes all you'll get is a #size-cells of 2 which is
    169 * not what we want to use.
    170 */
    171static int of_bus_fhc_match(struct device_node *np)
    172{
    173	return of_node_name_eq(np, "fhc") ||
    174		of_node_name_eq(np, "central");
    175}
    176
    177#define of_bus_fhc_count_cells of_bus_sbus_count_cells
    178
    179/*
    180 * Array of bus specific translators
    181 */
    182
    183static struct of_bus of_busses[] = {
    184	/* PCI */
    185	{
    186		.name = "pci",
    187		.addr_prop_name = "assigned-addresses",
    188		.match = of_bus_pci_match,
    189		.count_cells = of_bus_pci_count_cells,
    190		.map = of_bus_pci_map,
    191		.get_flags = of_bus_pci_get_flags,
    192	},
    193	/* SIMBA */
    194	{
    195		.name = "simba",
    196		.addr_prop_name = "assigned-addresses",
    197		.match = of_bus_simba_match,
    198		.count_cells = of_bus_pci_count_cells,
    199		.map = of_bus_simba_map,
    200		.get_flags = of_bus_pci_get_flags,
    201	},
    202	/* SBUS */
    203	{
    204		.name = "sbus",
    205		.addr_prop_name = "reg",
    206		.match = of_bus_sbus_match,
    207		.count_cells = of_bus_sbus_count_cells,
    208		.map = of_bus_default_map,
    209		.get_flags = of_bus_default_get_flags,
    210	},
    211	/* FHC */
    212	{
    213		.name = "fhc",
    214		.addr_prop_name = "reg",
    215		.match = of_bus_fhc_match,
    216		.count_cells = of_bus_fhc_count_cells,
    217		.map = of_bus_default_map,
    218		.get_flags = of_bus_default_get_flags,
    219	},
    220	/* Default */
    221	{
    222		.name = "default",
    223		.addr_prop_name = "reg",
    224		.match = NULL,
    225		.count_cells = of_bus_default_count_cells,
    226		.map = of_bus_default_map,
    227		.get_flags = of_bus_default_get_flags,
    228	},
    229};
    230
    231static struct of_bus *of_match_bus(struct device_node *np)
    232{
    233	int i;
    234
    235	for (i = 0; i < ARRAY_SIZE(of_busses); i ++)
    236		if (!of_busses[i].match || of_busses[i].match(np))
    237			return &of_busses[i];
    238	BUG();
    239	return NULL;
    240}
    241
    242static int __init build_one_resource(struct device_node *parent,
    243				     struct of_bus *bus,
    244				     struct of_bus *pbus,
    245				     u32 *addr,
    246				     int na, int ns, int pna)
    247{
    248	const u32 *ranges;
    249	int rone, rlen;
    250
    251	ranges = of_get_property(parent, "ranges", &rlen);
    252	if (ranges == NULL || rlen == 0) {
    253		u32 result[OF_MAX_ADDR_CELLS];
    254		int i;
    255
    256		memset(result, 0, pna * 4);
    257		for (i = 0; i < na; i++)
    258			result[pna - 1 - i] =
    259				addr[na - 1 - i];
    260
    261		memcpy(addr, result, pna * 4);
    262		return 0;
    263	}
    264
    265	/* Now walk through the ranges */
    266	rlen /= 4;
    267	rone = na + pna + ns;
    268	for (; rlen >= rone; rlen -= rone, ranges += rone) {
    269		if (!bus->map(addr, ranges, na, ns, pna))
    270			return 0;
    271	}
    272
    273	/* When we miss an I/O space match on PCI, just pass it up
    274	 * to the next PCI bridge and/or controller.
    275	 */
    276	if (!strcmp(bus->name, "pci") &&
    277	    (addr[0] & 0x03000000) == 0x01000000)
    278		return 0;
    279
    280	return 1;
    281}
    282
    283static int __init use_1to1_mapping(struct device_node *pp)
    284{
    285	/* If we have a ranges property in the parent, use it.  */
    286	if (of_find_property(pp, "ranges", NULL) != NULL)
    287		return 0;
    288
    289	/* If the parent is the dma node of an ISA bus, pass
    290	 * the translation up to the root.
    291	 *
    292	 * Some SBUS devices use intermediate nodes to express
    293	 * hierarchy within the device itself.  These aren't
    294	 * real bus nodes, and don't have a 'ranges' property.
    295	 * But, we should still pass the translation work up
    296	 * to the SBUS itself.
    297	 */
    298	if (of_node_name_eq(pp, "dma") ||
    299	    of_node_name_eq(pp, "espdma") ||
    300	    of_node_name_eq(pp, "ledma") ||
    301	    of_node_name_eq(pp, "lebuffer"))
    302		return 0;
    303
    304	/* Similarly for all PCI bridges, if we get this far
    305	 * it lacks a ranges property, and this will include
    306	 * cases like Simba.
    307	 */
    308	if (of_node_name_eq(pp, "pci"))
    309		return 0;
    310
    311	return 1;
    312}
    313
    314static int of_resource_verbose;
    315
    316static void __init build_device_resources(struct platform_device *op,
    317					  struct device *parent)
    318{
    319	struct platform_device *p_op;
    320	struct of_bus *bus;
    321	int na, ns;
    322	int index, num_reg;
    323	const void *preg;
    324
    325	if (!parent)
    326		return;
    327
    328	p_op = to_platform_device(parent);
    329	bus = of_match_bus(p_op->dev.of_node);
    330	bus->count_cells(op->dev.of_node, &na, &ns);
    331
    332	preg = of_get_property(op->dev.of_node, bus->addr_prop_name, &num_reg);
    333	if (!preg || num_reg == 0)
    334		return;
    335
    336	/* Convert to num-cells.  */
    337	num_reg /= 4;
    338
    339	/* Convert to num-entries.  */
    340	num_reg /= na + ns;
    341
    342	/* Prevent overrunning the op->resources[] array.  */
    343	if (num_reg > PROMREG_MAX) {
    344		printk(KERN_WARNING "%pOF: Too many regs (%d), "
    345		       "limiting to %d.\n",
    346		       op->dev.of_node, num_reg, PROMREG_MAX);
    347		num_reg = PROMREG_MAX;
    348	}
    349
    350	op->resource = op->archdata.resource;
    351	op->num_resources = num_reg;
    352	for (index = 0; index < num_reg; index++) {
    353		struct resource *r = &op->resource[index];
    354		u32 addr[OF_MAX_ADDR_CELLS];
    355		const u32 *reg = (preg + (index * ((na + ns) * 4)));
    356		struct device_node *dp = op->dev.of_node;
    357		struct device_node *pp = p_op->dev.of_node;
    358		struct of_bus *pbus, *dbus;
    359		u64 size, result = OF_BAD_ADDR;
    360		unsigned long flags;
    361		int dna, dns;
    362		int pna, pns;
    363
    364		size = of_read_addr(reg + na, ns);
    365		memcpy(addr, reg, na * 4);
    366
    367		flags = bus->get_flags(addr, 0);
    368
    369		if (use_1to1_mapping(pp)) {
    370			result = of_read_addr(addr, na);
    371			goto build_res;
    372		}
    373
    374		dna = na;
    375		dns = ns;
    376		dbus = bus;
    377
    378		while (1) {
    379			dp = pp;
    380			pp = dp->parent;
    381			if (!pp) {
    382				result = of_read_addr(addr, dna);
    383				break;
    384			}
    385
    386			pbus = of_match_bus(pp);
    387			pbus->count_cells(dp, &pna, &pns);
    388
    389			if (build_one_resource(dp, dbus, pbus, addr,
    390					       dna, dns, pna))
    391				break;
    392
    393			flags = pbus->get_flags(addr, flags);
    394
    395			dna = pna;
    396			dns = pns;
    397			dbus = pbus;
    398		}
    399
    400	build_res:
    401		memset(r, 0, sizeof(*r));
    402
    403		if (of_resource_verbose)
    404			printk("%pOF reg[%d] -> %llx\n",
    405			       op->dev.of_node, index,
    406			       result);
    407
    408		if (result != OF_BAD_ADDR) {
    409			if (tlb_type == hypervisor)
    410				result &= 0x0fffffffffffffffUL;
    411
    412			r->start = result;
    413			r->end = result + size - 1;
    414			r->flags = flags;
    415		}
    416		r->name = op->dev.of_node->full_name;
    417	}
    418}
    419
    420static struct device_node * __init
    421apply_interrupt_map(struct device_node *dp, struct device_node *pp,
    422		    const u32 *imap, int imlen, const u32 *imask,
    423		    unsigned int *irq_p)
    424{
    425	struct device_node *cp;
    426	unsigned int irq = *irq_p;
    427	struct of_bus *bus;
    428	phandle handle;
    429	const u32 *reg;
    430	int na, num_reg, i;
    431
    432	bus = of_match_bus(pp);
    433	bus->count_cells(dp, &na, NULL);
    434
    435	reg = of_get_property(dp, "reg", &num_reg);
    436	if (!reg || !num_reg)
    437		return NULL;
    438
    439	imlen /= ((na + 3) * 4);
    440	handle = 0;
    441	for (i = 0; i < imlen; i++) {
    442		int j;
    443
    444		for (j = 0; j < na; j++) {
    445			if ((reg[j] & imask[j]) != imap[j])
    446				goto next;
    447		}
    448		if (imap[na] == irq) {
    449			handle = imap[na + 1];
    450			irq = imap[na + 2];
    451			break;
    452		}
    453
    454	next:
    455		imap += (na + 3);
    456	}
    457	if (i == imlen) {
    458		/* Psycho and Sabre PCI controllers can have 'interrupt-map'
    459		 * properties that do not include the on-board device
    460		 * interrupts.  Instead, the device's 'interrupts' property
    461		 * is already a fully specified INO value.
    462		 *
    463		 * Handle this by deciding that, if we didn't get a
    464		 * match in the parent's 'interrupt-map', and the
    465		 * parent is an IRQ translator, then use the parent as
    466		 * our IRQ controller.
    467		 */
    468		if (pp->irq_trans)
    469			return pp;
    470
    471		return NULL;
    472	}
    473
    474	*irq_p = irq;
    475	cp = of_find_node_by_phandle(handle);
    476
    477	return cp;
    478}
    479
    480static unsigned int __init pci_irq_swizzle(struct device_node *dp,
    481					   struct device_node *pp,
    482					   unsigned int irq)
    483{
    484	const struct linux_prom_pci_registers *regs;
    485	unsigned int bus, devfn, slot, ret;
    486
    487	if (irq < 1 || irq > 4)
    488		return irq;
    489
    490	regs = of_get_property(dp, "reg", NULL);
    491	if (!regs)
    492		return irq;
    493
    494	bus = (regs->phys_hi >> 16) & 0xff;
    495	devfn = (regs->phys_hi >> 8) & 0xff;
    496	slot = (devfn >> 3) & 0x1f;
    497
    498	if (pp->irq_trans) {
    499		/* Derived from Table 8-3, U2P User's Manual.  This branch
    500		 * is handling a PCI controller that lacks a proper set of
    501		 * interrupt-map and interrupt-map-mask properties.  The
    502		 * Ultra-E450 is one example.
    503		 *
    504		 * The bit layout is BSSLL, where:
    505		 * B: 0 on bus A, 1 on bus B
    506		 * D: 2-bit slot number, derived from PCI device number as
    507		 *    (dev - 1) for bus A, or (dev - 2) for bus B
    508		 * L: 2-bit line number
    509		 */
    510		if (bus & 0x80) {
    511			/* PBM-A */
    512			bus  = 0x00;
    513			slot = (slot - 1) << 2;
    514		} else {
    515			/* PBM-B */
    516			bus  = 0x10;
    517			slot = (slot - 2) << 2;
    518		}
    519		irq -= 1;
    520
    521		ret = (bus | slot | irq);
    522	} else {
    523		/* Going through a PCI-PCI bridge that lacks a set of
    524		 * interrupt-map and interrupt-map-mask properties.
    525		 */
    526		ret = ((irq - 1 + (slot & 3)) & 3) + 1;
    527	}
    528
    529	return ret;
    530}
    531
    532static int of_irq_verbose;
    533
    534static unsigned int __init build_one_device_irq(struct platform_device *op,
    535						struct device *parent,
    536						unsigned int irq)
    537{
    538	struct device_node *dp = op->dev.of_node;
    539	struct device_node *pp, *ip;
    540	unsigned int orig_irq = irq;
    541	int nid;
    542
    543	if (irq == 0xffffffff)
    544		return irq;
    545
    546	if (dp->irq_trans) {
    547		irq = dp->irq_trans->irq_build(dp, irq,
    548					       dp->irq_trans->data);
    549
    550		if (of_irq_verbose)
    551			printk("%pOF: direct translate %x --> %x\n",
    552			       dp, orig_irq, irq);
    553
    554		goto out;
    555	}
    556
    557	/* Something more complicated.  Walk up to the root, applying
    558	 * interrupt-map or bus specific translations, until we hit
    559	 * an IRQ translator.
    560	 *
    561	 * If we hit a bus type or situation we cannot handle, we
    562	 * stop and assume that the original IRQ number was in a
    563	 * format which has special meaning to it's immediate parent.
    564	 */
    565	pp = dp->parent;
    566	ip = NULL;
    567	while (pp) {
    568		const void *imap, *imsk;
    569		int imlen;
    570
    571		imap = of_get_property(pp, "interrupt-map", &imlen);
    572		imsk = of_get_property(pp, "interrupt-map-mask", NULL);
    573		if (imap && imsk) {
    574			struct device_node *iret;
    575			int this_orig_irq = irq;
    576
    577			iret = apply_interrupt_map(dp, pp,
    578						   imap, imlen, imsk,
    579						   &irq);
    580
    581			if (of_irq_verbose)
    582				printk("%pOF: Apply [%pOF:%x] imap --> [%pOF:%x]\n",
    583				       op->dev.of_node,
    584				       pp, this_orig_irq, iret, irq);
    585
    586			if (!iret)
    587				break;
    588
    589			if (iret->irq_trans) {
    590				ip = iret;
    591				break;
    592			}
    593		} else {
    594			if (of_node_name_eq(pp, "pci")) {
    595				unsigned int this_orig_irq = irq;
    596
    597				irq = pci_irq_swizzle(dp, pp, irq);
    598				if (of_irq_verbose)
    599					printk("%pOF: PCI swizzle [%pOF] "
    600					       "%x --> %x\n",
    601					       op->dev.of_node,
    602					       pp, this_orig_irq,
    603					       irq);
    604
    605			}
    606
    607			if (pp->irq_trans) {
    608				ip = pp;
    609				break;
    610			}
    611		}
    612		dp = pp;
    613		pp = pp->parent;
    614	}
    615	if (!ip)
    616		return orig_irq;
    617
    618	irq = ip->irq_trans->irq_build(op->dev.of_node, irq,
    619				       ip->irq_trans->data);
    620	if (of_irq_verbose)
    621		printk("%pOF: Apply IRQ trans [%pOF] %x --> %x\n",
    622		      op->dev.of_node, ip, orig_irq, irq);
    623
    624out:
    625	nid = of_node_to_nid(dp);
    626	if (nid != -1) {
    627		cpumask_t numa_mask;
    628
    629		cpumask_copy(&numa_mask, cpumask_of_node(nid));
    630		irq_set_affinity(irq, &numa_mask);
    631	}
    632
    633	return irq;
    634}
    635
    636static struct platform_device * __init scan_one_device(struct device_node *dp,
    637						 struct device *parent)
    638{
    639	struct platform_device *op = kzalloc(sizeof(*op), GFP_KERNEL);
    640	const unsigned int *irq;
    641	struct dev_archdata *sd;
    642	int len, i;
    643
    644	if (!op)
    645		return NULL;
    646
    647	sd = &op->dev.archdata;
    648	sd->op = op;
    649
    650	op->dev.of_node = dp;
    651
    652	irq = of_get_property(dp, "interrupts", &len);
    653	if (irq) {
    654		op->archdata.num_irqs = len / 4;
    655
    656		/* Prevent overrunning the op->irqs[] array.  */
    657		if (op->archdata.num_irqs > PROMINTR_MAX) {
    658			printk(KERN_WARNING "%pOF: Too many irqs (%d), "
    659			       "limiting to %d.\n",
    660			       dp, op->archdata.num_irqs, PROMINTR_MAX);
    661			op->archdata.num_irqs = PROMINTR_MAX;
    662		}
    663		memcpy(op->archdata.irqs, irq, op->archdata.num_irqs * 4);
    664	} else {
    665		op->archdata.num_irqs = 0;
    666	}
    667
    668	build_device_resources(op, parent);
    669	for (i = 0; i < op->archdata.num_irqs; i++)
    670		op->archdata.irqs[i] = build_one_device_irq(op, parent, op->archdata.irqs[i]);
    671
    672	op->dev.parent = parent;
    673	op->dev.bus = &platform_bus_type;
    674	if (!parent)
    675		dev_set_name(&op->dev, "root");
    676	else
    677		dev_set_name(&op->dev, "%08x", dp->phandle);
    678	op->dev.coherent_dma_mask = DMA_BIT_MASK(32);
    679	op->dev.dma_mask = &op->dev.coherent_dma_mask;
    680
    681	if (of_device_register(op)) {
    682		printk("%pOF: Could not register of device.\n", dp);
    683		kfree(op);
    684		op = NULL;
    685	}
    686
    687	return op;
    688}
    689
    690static void __init scan_tree(struct device_node *dp, struct device *parent)
    691{
    692	while (dp) {
    693		struct platform_device *op = scan_one_device(dp, parent);
    694
    695		if (op)
    696			scan_tree(dp->child, &op->dev);
    697
    698		dp = dp->sibling;
    699	}
    700}
    701
    702static int __init scan_of_devices(void)
    703{
    704	struct device_node *root = of_find_node_by_path("/");
    705	struct platform_device *parent;
    706
    707	parent = scan_one_device(root, NULL);
    708	if (!parent)
    709		return 0;
    710
    711	scan_tree(root->child, &parent->dev);
    712	return 0;
    713}
    714postcore_initcall(scan_of_devices);
    715
    716static int __init of_debug(char *str)
    717{
    718	int val = 0;
    719
    720	get_option(&str, &val);
    721	if (val & 1)
    722		of_resource_verbose = 1;
    723	if (val & 2)
    724		of_irq_verbose = 1;
    725	return 1;
    726}
    727
    728__setup("of_debug=", of_debug);