Re: [PATCH v6 02/11] powerpc/powernv: Autoload IMC device driver module
From: Stewart Smith <hidden>
Date: 2017-04-06 07:05:13
Also in:
lkml
Madhavan Srinivasan [off-list ref] writes:
quoted hunk ↗ jump to hunk
From: Hemant Kumar <redacted> This patch does three things : - Enables "opal.c" to create a platform device for the IMC interface according to the appropriate compatibility string. - Find the reserved-memory region details from the system device tree and get the base address of HOMER (Reserved memory) region address for each chip. - We also get the Nest PMU counter data offsets (in the HOMER region) and their sizes. The offsets for the counters' data are fixed and won't change from chip to chip. The device tree parsing logic is separated from the PMU creation functions (which is done in subsequent patches). Signed-off-by: Anju T Sudhakar <redacted> Signed-off-by: Hemant Kumar <redacted> Signed-off-by: Madhavan Srinivasan <redacted> --- arch/powerpc/platforms/powernv/Makefile | 2 +- arch/powerpc/platforms/powernv/opal-imc.c | 126 ++++++++++++++++++++++++++++++ arch/powerpc/platforms/powernv/opal.c | 14 ++++ 3 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/platforms/powernv/opal-imc.cdiff --git a/arch/powerpc/platforms/powernv/Makefile b/arch/powerpc/platforms/powernv/Makefile index b5d98cb3f482..44909fec1121 100644 --- a/arch/powerpc/platforms/powernv/Makefile +++ b/arch/powerpc/platforms/powernv/Makefile@@ -2,7 +2,7 @@ obj-y += setup.o opal-wrappers.o opal.o opal-async.o idle.o obj-y += opal-rtc.o opal-nvram.o opal-lpc.o opal-flash.o obj-y += rng.o opal-elog.o opal-dump.o opal-sysparam.o opal-sensor.o obj-y += opal-msglog.o opal-hmi.o opal-power.o opal-irqchip.o -obj-y += opal-kmsg.o +obj-y += opal-kmsg.o opal-imc.o obj-$(CONFIG_SMP) += smp.o subcore.o subcore-asm.o obj-$(CONFIG_PCI) += pci.o pci-ioda.o npu-dma.odiff --git a/arch/powerpc/platforms/powernv/opal-imc.c b/arch/powerpc/platforms/powernv/opal-imc.c new file mode 100644 index 000000000000..c476d596c6a8 --- /dev/null +++ b/arch/powerpc/platforms/powernv/opal-imc.c@@ -0,0 +1,126 @@ +/* + * OPAL IMC interface detection driver + * Supported on POWERNV platform + * + * Copyright (C) 2016 Madhavan Srinivasan, IBM Corporation. + * (C) 2016 Hemant K Shaw, IBM Corporation. + * + * 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. + */ +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/miscdevice.h> +#include <linux/fs.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_platform.h> +#include <linux/poll.h> +#include <linux/mm.h> +#include <linux/slab.h> +#include <linux/crash_dump.h> +#include <asm/opal.h> +#include <asm/io.h> +#include <asm/uaccess.h> +#include <asm/cputable.h> +#include <asm/imc-pmu.h> + +struct perchip_nest_info nest_perchip_info[IMC_MAX_CHIPS]; + +static int opal_imc_counters_probe(struct platform_device *pdev) +{ + struct device_node *child, *imc_dev, *rm_node = NULL; + struct perchip_nest_info *pcni; + u32 pages, nest_offset, nest_size, idx; + int i = 0; + const char *node_name; + const __be32 *addrp; + u64 reg_addr, reg_size; + + if (!pdev || !pdev->dev.of_node) + return -ENODEV; + + /* + * Check whether this kdump kernel. If yes, just return. + */ + if (is_kdump_kernel()) + return -ENODEV; + + imc_dev = pdev->dev.of_node; + + /* + * nest_offset : where the nest-counters' data start. + * size : size of the entire nest-counters region + */ + if (of_property_read_u32(imc_dev, "imc-nest-offset", &nest_offset)) + goto err; + + if (of_property_read_u32(imc_dev, "imc-nest-size", &nest_size)) + goto err; + + /* Find the "homer region" for each chip */ + rm_node = of_find_node_by_path("/reserved-memory"); + if (!rm_node) + goto err; + + for_each_child_of_node(rm_node, child) { + if (of_property_read_string_index(child, "name", 0, + &node_name)) + continue; + if (strncmp("ibm,homer-image", node_name, + strlen("ibm,homer-image"))) + continue;
A better way to do this would be to reference the memory region, like what's shown in Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt just reference the phandle of the memory region. seeing as these are per chip, why not just have something linking together chip-id and the IMC layout node? -- Stewart Smith OPAL Architect, IBM.