[PATCH v8 02/10] powerpc/powernv: Autoload IMC device driver module
Madhavan Srinivasan
maddy at linux.vnet.ibm.com
Fri May 12 14:36:26 AEST 2017
On Thursday 11 May 2017 01:19 PM, Stewart Smith wrote:
> Anju T Sudhakar <anju at linux.vnet.ibm.com> writes:
>> 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).
>>
>> Patch also adds a CONFIG_HV_PERF_IMC_CTRS for the IMC driver.
>>
>> Signed-off-by: Anju T Sudhakar <anju at linux.vnet.ibm.com>
>> Signed-off-by: Hemant Kumar <hemant at linux.vnet.ibm.com>
>> Signed-off-by: Madhavan Srinivasan <maddy at linux.vnet.ibm.com>
>> ---
>> arch/powerpc/platforms/powernv/Kconfig | 10 +++
>> arch/powerpc/platforms/powernv/Makefile | 1 +
>> arch/powerpc/platforms/powernv/opal-imc.c | 140 ++++++++++++++++++++++++++++++
>> arch/powerpc/platforms/powernv/opal.c | 18 ++++
>> 4 files changed, 169 insertions(+)
>> create mode 100644 arch/powerpc/platforms/powernv/opal-imc.c
>>
>> diff --git a/arch/powerpc/platforms/powernv/Kconfig b/arch/powerpc/platforms/powernv/Kconfig
>> index 3a07e4d..1b90a98 100644
>> --- a/arch/powerpc/platforms/powernv/Kconfig
>> +++ b/arch/powerpc/platforms/powernv/Kconfig
>> @@ -27,3 +27,13 @@ config OPAL_PRD
>> help
>> This enables the opal-prd driver, a facility to run processor
>> recovery diagnostics on OpenPower machines
>> +
>> +config HV_PERF_IMC_CTRS
>> + bool "Hypervisor supplied In Memory Collection PMU events (Nest & Core)"
>> + default y
>> + depends on PERF_EVENTS && PPC_POWERNV
>> + help
>> + Enable access to hypervisor supplied in-memory collection counters
>> + in perf. IMC counters are available from Power9 systems.
>> +
>> + If unsure, select Y.
>> diff --git a/arch/powerpc/platforms/powernv/Makefile b/arch/powerpc/platforms/powernv/Makefile
>> index b5d98cb..715e531 100644
>> --- a/arch/powerpc/platforms/powernv/Makefile
>> +++ b/arch/powerpc/platforms/powernv/Makefile
>> @@ -12,3 +12,4 @@ obj-$(CONFIG_PPC_SCOM) += opal-xscom.o
>> obj-$(CONFIG_MEMORY_FAILURE) += opal-memory-errors.o
>> obj-$(CONFIG_TRACEPOINTS) += opal-tracepoints.o
>> obj-$(CONFIG_OPAL_PRD) += opal-prd.o
>> +obj-$(CONFIG_HV_PERF_IMC_CTRS) += opal-imc.o
>> diff --git a/arch/powerpc/platforms/powernv/opal-imc.c b/arch/powerpc/platforms/powernv/opal-imc.c
>> new file mode 100644
>> index 0000000..3a87000
>> --- /dev/null
>> +++ b/arch/powerpc/platforms/powernv/opal-imc.c
>> @@ -0,0 +1,140 @@
>> +/*
>> + * OPAL IMC interface detection driver
>> + * Supported on POWERNV platform
>> + *
>> + * Copyright (C) 2017 Madhavan Srinivasan, IBM Corporation.
>> + * (C) 2017 Anju T Sudhakar, IBM Corporation.
>> + * (C) 2017 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];
>> +
>> +/*
>> + * imc_pmu_setup : Setup the IMC PMUs (children of "parent").
>> + */
>> +static void __init imc_pmu_setup(struct device_node *parent)
>> +{
>> + if (!parent)
>> + return;
>> +}
>> +
>> +static int opal_imc_counters_probe(struct platform_device *pdev)
>> +{
>> + struct device_node *imc_dev, *dn, *rm_node = NULL;
>> + struct perchip_nest_info *pcni;
>> + u32 pages, nest_offset, nest_size, chip_id;
>> + int i = 0;
>> + const __be32 *addrp;
>> + u64 reg_addr, reg_size;
>> +
>> + if (!pdev || !pdev->dev.of_node)
>> + return -ENODEV;
>> +
>> + /*
>> + * Check whether this is kdump kernel. If yes, just return.
>> + */
>> + if (is_kdump_kernel())
>> + return -ENODEV;
>> +
>> + imc_dev = pdev->dev.of_node;
>> +
>> + /*
>> + * Nest counter data are saved in a reserved memory called HOMER.
>> + * "imc-nest-offset" identifies the counter data location within HOMER.
>> + * 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;
>> +
>> + /* Sanity check */
>> + if ((nest_size/PAGE_SIZE) > IMC_NEST_MAX_PAGES)
>> + goto err;
>> +
>> + /* Find the "HOMER region" for each chip */
>> + rm_node = of_find_node_by_path("/reserved-memory");
>> + if (!rm_node)
>> + goto err;
>> +
>> + /*
>> + * We need to look for the "ibm,homer-image" node in the
>> + * "/reserved-memory" node.
>> + */
>> + for (dn = of_find_node_by_name(rm_node, "ibm,homer-image"); dn;
>> + dn = of_find_node_by_name(dn, "ibm,homer-image")) {
>> +
>> + /* Get the chip id to which the above homer region belongs to */
>> + if (of_property_read_u32(dn, "ibm,chip-id", &chip_id))
>> + goto err;
> So, I was thinking on this (and should probably comment on the firmware
> side as well).
>
> I'd prefer an OPAL interface where instead of looking up where
> ibm,homer-image is, we provide the kernel with a base address and then
> have offsets into it.
>
> That way, we don't tie the kernel code to counters that are only in the
> HOMER region.
Yes. This make sense. Adding something like this to IMC node
will be fine?
chip@<id> {
base_addr = < addr >;
ibm,chip-id = < id>;
};
Maddy
>
>
More information about the Linuxppc-dev
mailing list