diff options
Diffstat (limited to 'drivers/of')
-rw-r--r-- | drivers/of/Kconfig | 22 | ||||
-rw-r--r-- | drivers/of/Makefile | 2 | ||||
-rw-r--r-- | drivers/of/address.c | 11 | ||||
-rw-r--r-- | drivers/of/base.c | 32 | ||||
-rw-r--r-- | drivers/of/device.c | 1 | ||||
-rw-r--r-- | drivers/of/dynamic.c | 1 | ||||
-rw-r--r-- | drivers/of/fdt.c | 21 | ||||
-rw-r--r-- | drivers/of/fdt_address.c | 6 | ||||
-rw-r--r-- | drivers/of/irq.c | 9 | ||||
-rw-r--r-- | drivers/of/kobj.c | 2 | ||||
-rw-r--r-- | drivers/of/of_mdio.c | 5 | ||||
-rw-r--r-- | drivers/of/of_numa.c | 13 | ||||
-rw-r--r-- | drivers/of/of_pci.c | 384 | ||||
-rw-r--r-- | drivers/of/of_pci_irq.c | 131 | ||||
-rw-r--r-- | drivers/of/of_private.h | 6 | ||||
-rw-r--r-- | drivers/of/of_reserved_mem.c | 6 | ||||
-rw-r--r-- | drivers/of/overlay.c | 5 | ||||
-rw-r--r-- | drivers/of/pdt.c | 6 | ||||
-rw-r--r-- | drivers/of/platform.c | 13 | ||||
-rw-r--r-- | drivers/of/property.c | 14 | ||||
-rw-r--r-- | drivers/of/resolver.c | 5 | ||||
-rw-r--r-- | drivers/of/unittest-data/Makefile | 19 | ||||
-rw-r--r-- | drivers/of/unittest-data/overlay_bad_symbol.dts | 1 | ||||
-rw-r--r-- | drivers/of/unittest.c | 11 |
24 files changed, 88 insertions, 638 deletions
diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig index ad9a9578f9c4..783e0870bd22 100644 --- a/drivers/of/Kconfig +++ b/drivers/of/Kconfig @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0 config DTC bool @@ -13,7 +14,8 @@ if OF config OF_UNITTEST bool "Device Tree runtime unit tests" - depends on OF_IRQ + depends on !SPARC + select IRQ_DOMAIN select OF_EARLY_FLATTREE select OF_RESOLVE help @@ -61,11 +63,7 @@ config OF_DYNAMIC config OF_ADDRESS def_bool y - depends on !SPARC && HAS_IOMEM - select OF_ADDRESS_PCI if PCI - -config OF_ADDRESS_PCI - bool + depends on !SPARC && (HAS_IOMEM || UML) config OF_IRQ def_bool y @@ -82,18 +80,6 @@ config OF_MDIO help OpenFirmware MDIO bus (Ethernet PHY) accessors -config OF_PCI - def_tristate PCI - depends on PCI - help - OpenFirmware PCI bus accessors - -config OF_PCI_IRQ - def_tristate PCI - depends on OF_PCI && OF_IRQ - help - OpenFirmware PCI IRQ routing helpers - config OF_RESERVED_MEM depends on OF_EARLY_FLATTREE bool diff --git a/drivers/of/Makefile b/drivers/of/Makefile index 63a4be62ce19..663a4af0cccd 100644 --- a/drivers/of/Makefile +++ b/drivers/of/Makefile @@ -10,8 +10,6 @@ obj-$(CONFIG_OF_IRQ) += irq.o obj-$(CONFIG_OF_NET) += of_net.o obj-$(CONFIG_OF_UNITTEST) += unittest.o obj-$(CONFIG_OF_MDIO) += of_mdio.o -obj-$(CONFIG_OF_PCI) += of_pci.o -obj-$(CONFIG_OF_PCI_IRQ) += of_pci_irq.o obj-$(CONFIG_OF_RESERVED_MEM) += of_reserved_mem.o obj-$(CONFIG_OF_RESOLVE) += resolver.o obj-$(CONFIG_OF_OVERLAY) += overlay.o diff --git a/drivers/of/address.c b/drivers/of/address.c index fa6cabfc3cb9..ce4d3d8b85de 100644 --- a/drivers/of/address.c +++ b/drivers/of/address.c @@ -1,4 +1,4 @@ - +// SPDX-License-Identifier: GPL-2.0 #define pr_fmt(fmt) "OF: " fmt #include <linux/device.h> @@ -96,7 +96,7 @@ static unsigned int of_bus_default_get_flags(const __be32 *addr) return IORESOURCE_MEM; } -#ifdef CONFIG_OF_ADDRESS_PCI +#ifdef CONFIG_PCI /* * PCI bus specific translator */ @@ -171,9 +171,7 @@ static int of_bus_pci_translate(__be32 *addr, u64 offset, int na) { return of_bus_default_translate(addr + 1, offset, na - 1); } -#endif /* CONFIG_OF_ADDRESS_PCI */ -#ifdef CONFIG_PCI const __be32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size, unsigned int *flags) { @@ -361,6 +359,7 @@ invalid_range: res->end = (resource_size_t)OF_BAD_ADDR; return err; } +EXPORT_SYMBOL(of_pci_range_to_resource); #endif /* CONFIG_PCI */ /* @@ -426,7 +425,7 @@ static unsigned int of_bus_isa_get_flags(const __be32 *addr) */ static struct of_bus of_busses[] = { -#ifdef CONFIG_OF_ADDRESS_PCI +#ifdef CONFIG_PCI /* PCI */ { .name = "pci", @@ -437,7 +436,7 @@ static struct of_bus of_busses[] = { .translate = of_bus_pci_translate, .get_flags = of_bus_pci_get_flags, }, -#endif /* CONFIG_OF_ADDRESS_PCI */ +#endif /* CONFIG_PCI */ /* ISA */ { .name = "isa", diff --git a/drivers/of/base.c b/drivers/of/base.c index 26618ba8f92a..ad28de96e13f 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * Procedures for creating, accessing and interpreting the device tree. * @@ -11,11 +12,6 @@ * * Reconsolidated from arch/x/kernel/prom.c by Stephen Rothwell and * Grant Likely. - * - * 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. */ #define pr_fmt(fmt) "OF: " fmt @@ -316,6 +312,32 @@ struct device_node *of_get_cpu_node(int cpu, unsigned int *thread) EXPORT_SYMBOL(of_get_cpu_node); /** + * of_cpu_node_to_id: Get the logical CPU number for a given device_node + * + * @cpu_node: Pointer to the device_node for CPU. + * + * Returns the logical CPU number of the given CPU device_node. + * Returns -ENODEV if the CPU is not found. + */ +int of_cpu_node_to_id(struct device_node *cpu_node) +{ + int cpu; + bool found = false; + struct device_node *np; + + for_each_possible_cpu(cpu) { + np = of_cpu_device_node_get(cpu); + found = (cpu_node == np); + of_node_put(np); + if (found) + return cpu; + } + + return -ENODEV; +} +EXPORT_SYMBOL(of_cpu_node_to_id); + +/** * __of_device_is_compatible() - Check if the node matches given constraints * @device: pointer to node * @compat: required compatible string, NULL or "" for any match diff --git a/drivers/of/device.c b/drivers/of/device.c index 25bddf9c9fe1..064c818105bd 100644 --- a/drivers/of/device.c +++ b/drivers/of/device.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 #include <linux/string.h> #include <linux/kernel.h> #include <linux/of.h> diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c index ab988d88704d..7bb33d22b4e2 100644 --- a/drivers/of/dynamic.c +++ b/drivers/of/dynamic.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Support for dynamic device trees. * diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index 4675e5ac4d11..84aa9d676375 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -1,12 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Functions for working with the Flattened Device Tree data format * * Copyright 2009 Benjamin Herrenschmidt, IBM Corp * benh@kernel.crashing.org - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. */ #define pr_fmt(fmt) "OF: fdt: " fmt @@ -14,6 +11,7 @@ #include <linux/crc32.h> #include <linux/kernel.h> #include <linux/initrd.h> +#include <linux/bootmem.h> #include <linux/memblock.h> #include <linux/mutex.h> #include <linux/of.h> @@ -1183,14 +1181,6 @@ int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base, return memblock_reserve(base, size); } -/* - * called from unflatten_device_tree() to bootstrap devicetree itself - * Architectures can override this definition if memblock isn't used - */ -void * __init __weak early_init_dt_alloc_memory_arch(u64 size, u64 align) -{ - return __va(memblock_alloc(size, align)); -} #else void __init __weak early_init_dt_add_memory_arch(u64 base, u64 size) { @@ -1209,13 +1199,12 @@ int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base, &base, &size, nomap ? " (nomap)" : ""); return -ENOSYS; } +#endif -void * __init __weak early_init_dt_alloc_memory_arch(u64 size, u64 align) +static void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) { - WARN_ON(1); - return NULL; + return memblock_virt_alloc(size, align); } -#endif bool __init early_init_dt_verify(void *params) { diff --git a/drivers/of/fdt_address.c b/drivers/of/fdt_address.c index 843a542dac7d..1dc15ab78b10 100644 --- a/drivers/of/fdt_address.c +++ b/drivers/of/fdt_address.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * FDT Address translation based on u-boot fdt_support.c which in turn was * based on the kernel unflattened DT address translation code. @@ -6,11 +7,6 @@ * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com * * Copyright 2010-2011 Freescale Semiconductor, Inc. - * - * 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, or (at your option) - * any later version. */ #define pr_fmt(fmt) "OF: fdt: " fmt diff --git a/drivers/of/irq.c b/drivers/of/irq.c index ec00ae7384c2..02ad93a304a4 100644 --- a/drivers/of/irq.c +++ b/drivers/of/irq.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * Derived from arch/i386/kernel/irq.c * Copyright (C) 1992 Linus Torvalds @@ -8,11 +9,6 @@ * Adapted for Power Macintosh by Paul Mackerras * Copyright (C) 1996 Paul Mackerras (paulus@cs.anu.edu.au) * - * 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. - * * This file contains the code used to make IRQ descriptions in the * device tree to actual irq numbers on an interrupt controller * driver. @@ -83,9 +79,8 @@ EXPORT_SYMBOL_GPL(of_irq_find_parent); /** * of_irq_parse_raw - Low level interrupt tree parsing - * @parent: the device interrupt parent * @addr: address specifier (start of "reg" property of the device) in be32 format - * @out_irq: structure of_irq updated by this function + * @out_irq: structure of_phandle_args updated by this function * * Returns 0 on success and a negative number on error * diff --git a/drivers/of/kobj.c b/drivers/of/kobj.c index 250fc7bb550f..7a0a18980b98 100644 --- a/drivers/of/kobj.c +++ b/drivers/of/kobj.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 #include <linux/of.h> #include <linux/slab.h> @@ -161,4 +162,3 @@ void __of_detach_node_sysfs(struct device_node *np) /* finally remove the kobj_init ref */ of_node_put(np); } - diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c index a327be1d264b..8c0c92712fc9 100644 --- a/drivers/of/of_mdio.c +++ b/drivers/of/of_mdio.c @@ -77,6 +77,11 @@ static int of_mdiobus_register_phy(struct mii_bus *mdio, if (of_property_read_bool(child, "broken-turn-around")) mdio->phy_ignore_ta_mask |= 1 << addr; + of_property_read_u32(child, "reset-assert-us", + &phy->mdio.reset_assert_delay); + of_property_read_u32(child, "reset-deassert-us", + &phy->mdio.reset_deassert_delay); + /* Associate the OF node with the device structure so it * can be looked up later */ of_node_get(child); diff --git a/drivers/of/of_numa.c b/drivers/of/of_numa.c index 2db1f7a04baf..f9d5480a4ae5 100644 --- a/drivers/of/of_numa.c +++ b/drivers/of/of_numa.c @@ -1,19 +1,8 @@ +// SPDX-License-Identifier: GPL-2.0 /* * OF NUMA Parsing support. * * Copyright (C) 2015 - 2016 Cavium Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #define pr_fmt(fmt) "OF: NUMA: " fmt diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c deleted file mode 100644 index a7b1cb6c2f65..000000000000 --- a/drivers/of/of_pci.c +++ /dev/null @@ -1,384 +0,0 @@ -#define pr_fmt(fmt) "OF: PCI: " fmt - -#include <linux/kernel.h> -#include <linux/export.h> -#include <linux/of.h> -#include <linux/of_address.h> -#include <linux/of_device.h> -#include <linux/of_pci.h> -#include <linux/slab.h> - -static inline int __of_pci_pci_compare(struct device_node *node, - unsigned int data) -{ - int devfn; - - devfn = of_pci_get_devfn(node); - if (devfn < 0) - return 0; - - return devfn == data; -} - -struct device_node *of_pci_find_child_device(struct device_node *parent, - unsigned int devfn) -{ - struct device_node *node, *node2; - - for_each_child_of_node(parent, node) { - if (__of_pci_pci_compare(node, devfn)) - return node; - /* - * Some OFs create a parent node "multifunc-device" as - * a fake root for all functions of a multi-function - * device we go down them as well. - */ - if (!strcmp(node->name, "multifunc-device")) { - for_each_child_of_node(node, node2) { - if (__of_pci_pci_compare(node2, devfn)) { - of_node_put(node); - return node2; - } - } - } - } - return NULL; -} -EXPORT_SYMBOL_GPL(of_pci_find_child_device); - -/** - * of_pci_get_devfn() - Get device and function numbers for a device node - * @np: device node - * - * Parses a standard 5-cell PCI resource and returns an 8-bit value that can - * be passed to the PCI_SLOT() and PCI_FUNC() macros to extract the device - * and function numbers respectively. On error a negative error code is - * returned. - */ -int of_pci_get_devfn(struct device_node *np) -{ - u32 reg[5]; - int error; - - error = of_property_read_u32_array(np, "reg", reg, ARRAY_SIZE(reg)); - if (error) - return error; - - return (reg[0] >> 8) & 0xff; -} -EXPORT_SYMBOL_GPL(of_pci_get_devfn); - -/** - * of_pci_parse_bus_range() - parse the bus-range property of a PCI device - * @node: device node - * @res: address to a struct resource to return the bus-range - * - * Returns 0 on success or a negative error-code on failure. - */ -int of_pci_parse_bus_range(struct device_node *node, struct resource *res) -{ - u32 bus_range[2]; - int error; - - error = of_property_read_u32_array(node, "bus-range", bus_range, - ARRAY_SIZE(bus_range)); - if (error) - return error; - - res->name = node->name; - res->start = bus_range[0]; - res->end = bus_range[1]; - res->flags = IORESOURCE_BUS; - - return 0; -} -EXPORT_SYMBOL_GPL(of_pci_parse_bus_range); - -/** - * This function will try to obtain the host bridge domain number by - * finding a property called "linux,pci-domain" of the given device node. - * - * @node: device tree node with the domain information - * - * Returns the associated domain number from DT in the range [0-0xffff], or - * a negative value if the required property is not found. - */ -int of_get_pci_domain_nr(struct device_node *node) -{ - u32 domain; - int error; - - error = of_property_read_u32(node, "linux,pci-domain", &domain); - if (error) - return error; - - return (u16)domain; -} -EXPORT_SYMBOL_GPL(of_get_pci_domain_nr); - -/** - * This function will try to find the limitation of link speed by finding - * a property called "max-link-speed" of the given device node. - * - * @node: device tree node with the max link speed information - * - * Returns the associated max link speed from DT, or a negative value if the - * required property is not found or is invalid. - */ -int of_pci_get_max_link_speed(struct device_node *node) -{ - u32 max_link_speed; - - if (of_property_read_u32(node, "max-link-speed", &max_link_speed) || - max_link_speed > 4) - return -EINVAL; - - return max_link_speed; -} -EXPORT_SYMBOL_GPL(of_pci_get_max_link_speed); - -/** - * of_pci_check_probe_only - Setup probe only mode if linux,pci-probe-only - * is present and valid - */ -void of_pci_check_probe_only(void) -{ - u32 val; - int ret; - - ret = of_property_read_u32(of_chosen, "linux,pci-probe-only", &val); - if (ret) { - if (ret == -ENODATA || ret == -EOVERFLOW) - pr_warn("linux,pci-probe-only without valid value, ignoring\n"); - return; - } - - if (val) - pci_add_flags(PCI_PROBE_ONLY); - else - pci_clear_flags(PCI_PROBE_ONLY); - - pr_info("PROBE_ONLY %sabled\n", val ? "en" : "dis"); -} -EXPORT_SYMBOL_GPL(of_pci_check_probe_only); - -#if defined(CONFIG_OF_ADDRESS) -/** - * of_pci_get_host_bridge_resources - Parse PCI host bridge resources from DT - * @dev: device node of the host bridge having the range property - * @busno: bus number associated with the bridge root bus - * @bus_max: maximum number of buses for this bridge - * @resources: list where the range of resources will be added after DT parsing - * @io_base: pointer to a variable that will contain on return the physical - * address for the start of the I/O range. Can be NULL if the caller doesn't - * expect IO ranges to be present in the device tree. - * - * It is the caller's job to free the @resources list. - * - * This function will parse the "ranges" property of a PCI host bridge device - * node and setup the resource mapping based on its content. It is expected - * that the property conforms with the Power ePAPR document. - * - * It returns zero if the range parsing has been successful or a standard error - * value if it failed. - */ -int of_pci_get_host_bridge_resources(struct device_node *dev, - unsigned char busno, unsigned char bus_max, - struct list_head *resources, resource_size_t *io_base) -{ - struct resource_entry *window; - struct resource *res; - struct resource *bus_range; - struct of_pci_range range; - struct of_pci_range_parser parser; - char range_type[4]; - int err; - - if (io_base) - *io_base = (resource_size_t)OF_BAD_ADDR; - - bus_range = kzalloc(sizeof(*bus_range), GFP_KERNEL); - if (!bus_range) - return -ENOMEM; - - pr_info("host bridge %pOF ranges:\n", dev); - - err = of_pci_parse_bus_range(dev, bus_range); - if (err) { - bus_range->start = busno; - bus_range->end = bus_max; - bus_range->flags = IORESOURCE_BUS; - pr_info(" No bus range found for %pOF, using %pR\n", - dev, bus_range); - } else { - if (bus_range->end > bus_range->start + bus_max) - bus_range->end = bus_range->start + bus_max; - } - pci_add_resource(resources, bus_range); - - /* Check for ranges property */ - err = of_pci_range_parser_init(&parser, dev); - if (err) - goto parse_failed; - - pr_debug("Parsing ranges property...\n"); - for_each_of_pci_range(&parser, &range) { - /* Read next ranges element */ - if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_IO) - snprintf(range_type, 4, " IO"); - else if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_MEM) - snprintf(range_type, 4, "MEM"); - else - snprintf(range_type, 4, "err"); - pr_info(" %s %#010llx..%#010llx -> %#010llx\n", range_type, - range.cpu_addr, range.cpu_addr + range.size - 1, - range.pci_addr); - - /* - * If we failed translation or got a zero-sized region - * then skip this range - */ - if (range.cpu_addr == OF_BAD_ADDR || range.size == 0) - continue; - - res = kzalloc(sizeof(struct resource), GFP_KERNEL); - if (!res) { - err = -ENOMEM; - goto parse_failed; - } - - err = of_pci_range_to_resource(&range, dev, res); - if (err) { - kfree(res); - continue; - } - - if (resource_type(res) == IORESOURCE_IO) { - if (!io_base) { - pr_err("I/O range found for %pOF. Please provide an io_base pointer to save CPU base address\n", - dev); - err = -EINVAL; - goto conversion_failed; - } - if (*io_base != (resource_size_t)OF_BAD_ADDR) - pr_warn("More than one I/O resource converted for %pOF. CPU base address for old range lost!\n", - dev); - *io_base = range.cpu_addr; - } - - pci_add_resource_offset(resources, res, res->start - range.pci_addr); - } - - return 0; - -conversion_failed: - kfree(res); -parse_failed: - resource_list_for_each_entry(window, resources) - kfree(window->res); - pci_free_resource_list(resources); - return err; -} -EXPORT_SYMBOL_GPL(of_pci_get_host_bridge_resources); -#endif /* CONFIG_OF_ADDRESS */ - -/** - * of_pci_map_rid - Translate a requester ID through a downstream mapping. - * @np: root complex device node. - * @rid: PCI requester ID to map. - * @map_name: property name of the map to use. - * @map_mask_name: optional property name of the mask to use. - * @target: optional pointer to a target device node. - * @id_out: optional pointer to receive the translated ID. - * - * Given a PCI requester ID, look up the appropriate implementation-defined - * platform ID and/or the target device which receives transactions on that - * ID, as per the "iommu-map" and "msi-map" bindings. Either of @target or - * @id_out may be NULL if only the other is required. If @target points to - * a non-NULL device node pointer, only entries targeting that node will be - * matched; if it points to a NULL value, it will receive the device node of - * the first matching target phandle, with a reference held. - * - * Return: 0 on success or a standard error code on failure. - */ -int of_pci_map_rid(struct device_node *np, u32 rid, - const char *map_name, const char *map_mask_name, - struct device_node **target, u32 *id_out) -{ - u32 map_mask, masked_rid; - int map_len; - const __be32 *map = NULL; - - if (!np || !map_name || (!target && !id_out)) - return -EINVAL; - - map = of_get_property(np, map_name, &map_len); - if (!map) { - if (target) - return -ENODEV; - /* Otherwise, no map implies no translation */ - *id_out = rid; - return 0; - } - - if (!map_len || map_len % (4 * sizeof(*map))) { - pr_err("%pOF: Error: Bad %s length: %d\n", np, - map_name, map_len); - return -EINVAL; - } - - /* The default is to select all bits. */ - map_mask = 0xffffffff; - - /* - * Can be overridden by "{iommu,msi}-map-mask" property. - * If of_property_read_u32() fails, the default is used. - */ - if (map_mask_name) - of_property_read_u32(np, map_mask_name, &map_mask); - - masked_rid = map_mask & rid; - for ( ; map_len > 0; map_len -= 4 * sizeof(*map), map += 4) { - struct device_node *phandle_node; - u32 rid_base = be32_to_cpup(map + 0); - u32 phandle = be32_to_cpup(map + 1); - u32 out_base = be32_to_cpup(map + 2); - u32 rid_len = be32_to_cpup(map + 3); - - if (rid_base & ~map_mask) { - pr_err("%pOF: Invalid %s translation - %s-mask (0x%x) ignores rid-base (0x%x)\n", - np, map_name, map_name, - map_mask, rid_base); - return -EFAULT; - } - - if (masked_rid < rid_base || masked_rid >= rid_base + rid_len) - continue; - - phandle_node = of_find_node_by_phandle(phandle); - if (!phandle_node) - return -ENODEV; - - if (target) { - if (*target) - of_node_put(phandle_node); - else - *target = phandle_node; - - if (*target != phandle_node) - continue; - } - - if (id_out) - *id_out = masked_rid - rid_base + out_base; - - pr_debug("%pOF: %s, using mask %08x, rid-base: %08x, out-base: %08x, length: %08x, rid: %08x -> %08x\n", - np, map_name, map_mask, rid_base, out_base, - rid_len, rid, masked_rid - rid_base + out_base); - return 0; - } - - pr_err("%pOF: Invalid %s translation - no match for rid 0x%x on %pOF\n", - np, map_name, rid, target && *target ? *target : NULL); - return -EFAULT; -} diff --git a/drivers/of/of_pci_irq.c b/drivers/of/of_pci_irq.c deleted file mode 100644 index 3a05568f65df..000000000000 --- a/drivers/of/of_pci_irq.c +++ /dev/null @@ -1,131 +0,0 @@ -#include <linux/kernel.h> -#include <linux/of_pci.h> -#include <linux/of_irq.h> -#include <linux/export.h> - -/** - * of_irq_parse_pci - Resolve the interrupt for a PCI device - * @pdev: the device whose interrupt is to be resolved - * @out_irq: structure of_irq filled by this function - * - * This function resolves the PCI interrupt for a given PCI device. If a - * device-node exists for a given pci_dev, it will use normal OF tree - * walking. If not, it will implement standard swizzling and walk up the - * PCI tree until an device-node is found, at which point it will finish - * resolving using the OF tree walking. - */ -int of_irq_parse_pci(const struct pci_dev *pdev, struct of_phandle_args *out_irq) -{ - struct device_node *dn, *ppnode; - struct pci_dev *ppdev; - __be32 laddr[3]; - u8 pin; - int rc; - - /* Check if we have a device node, if yes, fallback to standard - * device tree parsing - */ - dn = pci_device_to_OF_node(pdev); - if (dn) { - rc = of_irq_parse_one(dn, 0, out_irq); - if (!rc) - return rc; - } - - /* Ok, we don't, time to have fun. Let's start by building up an - * interrupt spec. we assume #interrupt-cells is 1, which is standard - * for PCI. If you do different, then don't use that routine. - */ - rc = pci_read_config_byte(pdev, PCI_INTERRUPT_PIN, &pin); - if (rc != 0) - goto err; - /* No pin, exit with no error message. */ - if (pin == 0) - return -ENODEV; - - /* Now we walk up the PCI tree */ - for (;;) { - /* Get the pci_dev of our parent */ - ppdev = pdev->bus->self; - - /* Ouch, it's a host bridge... */ - if (ppdev == NULL) { - ppnode = pci_bus_to_OF_node(pdev->bus); - - /* No node for host bridge ? give up */ - if (ppnode == NULL) { - rc = -EINVAL; - goto err; - } - } else { - /* We found a P2P bridge, check if it has a node */ - ppnode = pci_device_to_OF_node(ppdev); - } - - /* Ok, we have found a parent with a device-node, hand over to - * the OF parsing code. - * We build a unit address from the linux device to be used for - * resolution. Note that we use the linux bus number which may - * not match your firmware bus numbering. - * Fortunately, in most cases, interrupt-map-mask doesn't - * include the bus number as part of the matching. - * You should still be careful about that though if you intend - * to rely on this function (you ship a firmware that doesn't - * create device nodes for all PCI devices). - */ - if (ppnode) - break; - - /* We can only get here if we hit a P2P bridge with no node, - * let's do standard swizzling and try again - */ - pin = pci_swizzle_interrupt_pin(pdev, pin); - pdev = ppdev; - } - - out_irq->np = ppnode; - out_irq->args_count = 1; - out_irq->args[0] = pin; - laddr[0] = cpu_to_be32((pdev->bus->number << 16) | (pdev->devfn << 8)); - laddr[1] = laddr[2] = cpu_to_be32(0); - rc = of_irq_parse_raw(laddr, out_irq); - if (rc) - goto err; - return 0; -err: - if (rc == -ENOENT) { - dev_warn(&pdev->dev, - "%s: no interrupt-map found, INTx interrupts not available\n", - __func__); - pr_warn_once("%s: possibly some PCI slots don't have level triggered interrupts capability\n", - __func__); - } else { - dev_err(&pdev->dev, "%s: failed with rc=%d\n", __func__, rc); - } - return rc; -} -EXPORT_SYMBOL_GPL(of_irq_parse_pci); - -/** - * of_irq_parse_and_map_pci() - Decode a PCI irq from the device tree and map to a virq - * @dev: The pci device needing an irq - * @slot: PCI slot number; passed when used as map_irq callback. Unused - * @pin: PCI irq pin number; passed when used as map_irq callback. Unused - * - * @slot and @pin are unused, but included in the function so that this - * function can be used directly as the map_irq callback to - * pci_assign_irq() and struct pci_host_bridge.map_irq pointer - */ -int of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin) -{ - struct of_phandle_args oirq; - int ret; - - ret = of_irq_parse_pci(dev, &oirq); - if (ret) - return 0; /* Proper return code 0 == NO_IRQ */ - - return irq_create_of_mapping(&oirq); -} -EXPORT_SYMBOL_GPL(of_irq_parse_and_map_pci); - diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h index 92a9a3687446..0c609e7d0334 100644 --- a/drivers/of/of_private.h +++ b/drivers/of/of_private.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ #ifndef _LINUX_OF_PRIVATE_H #define _LINUX_OF_PRIVATE_H /* @@ -5,11 +6,6 @@ * * Paul Mackerras August 1996. * Copyright (C) 1996-2005 Paul Mackerras. - * - * 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. */ /** diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 22b75c82e377..9a4f4246231d 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * Device tree based initialization code for reserved memory. * @@ -6,11 +7,6 @@ * http://www.samsung.com * Author: Marek Szyprowski <m.szyprowski@samsung.com> * Author: Josh Cartwright <joshc@codeaurora.org> - * - * 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 optional) any later version of the license. */ #define pr_fmt(fmt) "OF: reserved mem: " fmt diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c index 3981b7da4fa9..3397d7642958 100644 --- a/drivers/of/overlay.c +++ b/drivers/of/overlay.c @@ -1,12 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Functions for working with device tree overlays * * Copyright (C) 2012 Pantelis Antoniou <panto@antoniou-consulting.com> * Copyright (C) 2012 Texas Instruments Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. */ #define pr_fmt(fmt) "OF: overlay: " fmt diff --git a/drivers/of/pdt.c b/drivers/of/pdt.c index d2acae825af9..013e65de074a 100644 --- a/drivers/of/pdt.c +++ b/drivers/of/pdt.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0+ /* pdt.c: OF PROM device tree support code. * * Paul Mackerras August 1996. @@ -8,11 +9,6 @@ * * Adapted for sparc by David S. Miller davem@davemloft.net * Adapted for multiple architectures by Andres Salomon <dilinger@queued.net> - * - * 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. */ #include <linux/kernel.h> diff --git a/drivers/of/platform.c b/drivers/of/platform.c index b7cf84b29737..c00d81dfac0b 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -1,15 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp. * <benh@kernel.crashing.org> * and Arnd Bergmann, IBM Corp. * Merged from powerpc/kernel/of_platform.c and * sparc{,64}/kernel/of_device.c by Stephen Rothwell - * - * 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. - * */ #define pr_fmt(fmt) "OF: " fmt @@ -518,6 +513,12 @@ static int __init of_platform_default_populate_init(void) for_each_matching_node(node, reserved_mem_matches) of_platform_device_create(node, NULL, NULL); + node = of_find_node_by_path("/firmware"); + if (node) { + of_platform_populate(node, NULL, NULL, NULL); + of_node_put(node); + } + /* Populate everything else. */ of_platform_default_populate(NULL, NULL, NULL); diff --git a/drivers/of/property.c b/drivers/of/property.c index 8ad33a44a7b8..36ed84e26d9c 100644 --- a/drivers/of/property.c +++ b/drivers/of/property.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * drivers/of/property.c - Procedures for accessing and interpreting * Devicetree properties and graphs. @@ -16,11 +17,6 @@ * * Reconsolidated from arch/x/kernel/prom.c by Stephen Rothwell and * Grant Likely. - * - * 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. */ #define pr_fmt(fmt) "OF: " fmt @@ -981,10 +977,18 @@ static int of_fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode, return 0; } +static void * +of_fwnode_device_get_match_data(const struct fwnode_handle *fwnode, + const struct device *dev) +{ + return (void *)of_device_get_match_data(dev); +} + const struct fwnode_operations of_fwnode_ops = { .get = of_fwnode_get, .put = of_fwnode_put, .device_is_available = of_fwnode_device_is_available, + .device_get_match_data = of_fwnode_device_get_match_data, .property_present = of_fwnode_property_present, .property_read_int_array = of_fwnode_property_read_int_array, .property_read_string_array = of_fwnode_property_read_string_array, diff --git a/drivers/of/resolver.c b/drivers/of/resolver.c index cfaeef5f6cb1..740d19bde601 100644 --- a/drivers/of/resolver.c +++ b/drivers/of/resolver.c @@ -1,12 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Functions for dealing with DT resolution * * Copyright (C) 2012 Pantelis Antoniou <panto@antoniou-consulting.com> * Copyright (C) 2012 Texas Instruments Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. */ #define pr_fmt(fmt) "OF: resolver: " fmt diff --git a/drivers/of/unittest-data/Makefile b/drivers/of/unittest-data/Makefile index 32389acfa616..df697976740a 100644 --- a/drivers/of/unittest-data/Makefile +++ b/drivers/of/unittest-data/Makefile @@ -2,19 +2,12 @@ DTC_FLAGS_testcases := -Wno-interrupts_property obj-y += testcases.dtb.o -targets += testcases.dtb testcases.dtb.S +obj-$(CONFIG_OF_OVERLAY) += overlay.dtb.o \ + overlay_bad_phandle.dtb.o \ + overlay_bad_symbol.dtb.o \ + overlay_base.dtb.o -ifdef CONFIG_OF_OVERLAY - -obj-y += overlay.dtb.o -obj-y += overlay_bad_phandle.dtb.o -obj-y += overlay_bad_symbol.dtb.o -obj-y += overlay_base.dtb.o - -targets += overlay.dtb overlay.dtb.S -targets += overlay_bad_phandle.dtb overlay_bad_phandle.dtb.S -targets += overlay_bad_symbol.dtb overlay_bad_symbol.dtb.S -targets += overlay_base.dtb overlay_base.dtb.S +targets += $(foreach suffix, dtb dtb.S, $(patsubst %.dtb.o,%.$(suffix),$(obj-y))) # enable creation of __symbols__ node DTC_FLAGS_overlay := -@ @@ -22,8 +15,6 @@ DTC_FLAGS_overlay_bad_phandle := -@ DTC_FLAGS_overlay_bad_symbol := -@ DTC_FLAGS_overlay_base := -@ -endif - .PRECIOUS: \ $(obj)/%.dtb.S \ $(obj)/%.dtb diff --git a/drivers/of/unittest-data/overlay_bad_symbol.dts b/drivers/of/unittest-data/overlay_bad_symbol.dts index 09261cb9a67e..135052ee1517 100644 --- a/drivers/of/unittest-data/overlay_bad_symbol.dts +++ b/drivers/of/unittest-data/overlay_bad_symbol.dts @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /dts-v1/; /plugin/; diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c index 0f8052f1355c..7a9abaae874d 100644 --- a/drivers/of/unittest.c +++ b/drivers/of/unittest.c @@ -5,6 +5,7 @@ #define pr_fmt(fmt) "### dt-test ### " fmt +#include <linux/bootmem.h> #include <linux/clk.h> #include <linux/err.h> #include <linux/errno.h> @@ -2053,6 +2054,11 @@ static struct overlay_info overlays[] = { static struct device_node *overlay_base_root; +static void * __init dt_alloc_memory(u64 size, u64 align) +{ + return memblock_virt_alloc(size, align); +} + /* * Create base device tree for the overlay unittest. * @@ -2092,8 +2098,7 @@ void __init unittest_unflatten_overlay_base(void) return; } - info->data = early_init_dt_alloc_memory_arch(size, - roundup_pow_of_two(FDT_V17_SIZE)); + info->data = dt_alloc_memory(size, roundup_pow_of_two(FDT_V17_SIZE)); if (!info->data) { pr_err("alloc for dtb 'overlay_base' failed"); return; @@ -2102,7 +2107,7 @@ void __init unittest_unflatten_overlay_base(void) memcpy(info->data, info->dtb_begin, size); __unflatten_device_tree(info->data, NULL, &info->np_overlay, - early_init_dt_alloc_memory_arch, true); + dt_alloc_memory, true); overlay_base_root = info->np_overlay; } |