lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Wed, 9 Nov 2022 18:03:22 +0800
From:   Yinbo Zhu <zhuyinbo@...ngson.cn>
To:     Rob Herring <robh+dt@...nel.org>,
        Krzysztof Kozlowski <krzysztof.kozlowski+dt@...aro.org>,
        Arnd Bergmann <arnd@...db.de>,
        Hector Martin <marcan@...can.st>,
        Lubomir Rintel <lkundrak@...sk>,
        Conor Dooley <conor.dooley@...rochip.com>,
        Linus Walleij <linus.walleij@...aro.org>,
        Hitomi Hasegawa <hasegawa-hitomi@...itsu.com>,
        Heiko Stuebner <heiko@...ech.de>,
        Brian Norris <briannorris@...omium.org>,
        Sven Peter <sven@...npeter.dev>, loongarch@...ts.linux.dev,
        devicetree@...r.kernel.org, linux-kernel@...r.kernel.org,
        soc@...nel.org
Subject: Re: [PATCH v6 1/2] soc: loongson: add GUTS driver for loongson-2
 platforms

Hi maintainer,

This patch I had verified that base on mainline 6.1-rc3 tree, it is
okay, if no other issue, please you help me merge it to upstream.

Thanks,
Yinbo.

在 2022/11/4 上午10:48, Yinbo Zhu 写道:
> The global utilities block controls PCIE device enabling, alternate
> function selection for multiplexed signals, consistency of HDA, USB
> and PCIE, configuration of memory controller, rtc controller, lio
> controller, and clock control.
> 
> This patch adds a driver to manage and access global utilities block
> for loongarch architecture Loongson-2 SoCs. Initially only reading SVR
> and registering soc device are supported. Other guts accesses, such
> as reading PMON configuration by default, should eventually be added
> into this driver as well.
> 
> Signed-off-by: Yinbo Zhu <zhuyinbo@...ngson.cn>
> Reviewed-by: Arnd Bergmann <arnd@...db.de>
> ---
> Change in v6:
> 		1. Add full name spelling about GUTS in Kconfig.
> 		2. Add reviewed-by information.
> Change in v5:
> 		1. Add all history change log information.
> Change in v4:
> 		1. Remove menu information in Kconfig.
> Change in v3:
> 		1. Replace string loongson2/Loongson2 with Loongson-2/loongson-2
> 	           in commit message, Kconfig, Makefile file.
> 		2. Replace string LOONGSON2 with LOONGSON-2.
> Change in v2:
> 		1. Add architecture support commit log description.
> 		2. Add other guts accesses plan commit log description.
> 		3. Add "depends on LOONGARCH || COMPILE_TEST" for
> 		   LOONGSON2_GUTS in Kconfig.
> 		4. Move the scfg_guts to .c file from .h and delete .h.
> 		5. Remove __packed on scfg_guts.
> 
>   MAINTAINERS                           |   6 +
>   drivers/soc/Kconfig                   |   1 +
>   drivers/soc/Makefile                  |   1 +
>   drivers/soc/loongson/Kconfig          |  18 +++
>   drivers/soc/loongson/Makefile         |   6 +
>   drivers/soc/loongson/loongson2_guts.c | 189 ++++++++++++++++++++++++++
>   6 files changed, 221 insertions(+)
>   create mode 100644 drivers/soc/loongson/Kconfig
>   create mode 100644 drivers/soc/loongson/Makefile
>   create mode 100644 drivers/soc/loongson/loongson2_guts.c
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index c9dc5ddbd9fe..20ce056ae207 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -12041,6 +12041,12 @@ S:	Maintained
>   F:	Documentation/devicetree/bindings/pinctrl/loongson,ls2k-pinctrl.yaml
>   F:	drivers/pinctrl/pinctrl-loongson2.c
>   
> +LOONGSON-2 SOC SERIES GUTS DRIVER
> +M:	Yinbo Zhu <zhuyinbo@...ngson.cn>
> +L:	loongarch@...ts.linux.dev
> +S:	Maintained
> +F:	drivers/soc/loongson/loongson2_guts.c
> +
>   LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI)
>   M:	Sathya Prakash <sathya.prakash@...adcom.com>
>   M:	Sreekanth Reddy <sreekanth.reddy@...adcom.com>
> diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig
> index e461c071189b..5dbb09f843f7 100644
> --- a/drivers/soc/Kconfig
> +++ b/drivers/soc/Kconfig
> @@ -13,6 +13,7 @@ source "drivers/soc/fujitsu/Kconfig"
>   source "drivers/soc/imx/Kconfig"
>   source "drivers/soc/ixp4xx/Kconfig"
>   source "drivers/soc/litex/Kconfig"
> +source "drivers/soc/loongson/Kconfig"
>   source "drivers/soc/mediatek/Kconfig"
>   source "drivers/soc/microchip/Kconfig"
>   source "drivers/soc/pxa/Kconfig"
> diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile
> index 69ba6508cf2c..fff513bd522d 100644
> --- a/drivers/soc/Makefile
> +++ b/drivers/soc/Makefile
> @@ -18,6 +18,7 @@ obj-y				+= imx/
>   obj-y				+= ixp4xx/
>   obj-$(CONFIG_SOC_XWAY)		+= lantiq/
>   obj-$(CONFIG_LITEX_SOC_CONTROLLER) += litex/
> +obj-y				+= loongson/
>   obj-y				+= mediatek/
>   obj-y				+= microchip/
>   obj-y				+= pxa/
> diff --git a/drivers/soc/loongson/Kconfig b/drivers/soc/loongson/Kconfig
> new file mode 100644
> index 000000000000..df52599ae87b
> --- /dev/null
> +++ b/drivers/soc/loongson/Kconfig
> @@ -0,0 +1,18 @@
> +# SPDX-License-Identifier: GPL-2.0+
> +#
> +# Loongson-2 series SoC drivers
> +#
> +
> +config LOONGSON2_GUTS
> +	tristate "Loongson-2 SoC Global UtiliTieS (GUTS) register block"
> +	depends on LOONGARCH || COMPILE_TEST
> +	select SOC_BUS
> +	help
> +	  The global utilities block controls PCIE device enabling, alternate
> +	  function selection for multiplexed signals, consistency of HDA, USB
> +	  and PCIE, configuration of memory controller, rtc controller, lio
> +	  controller, and clock control. This patch adds a driver to manage
> +	  and access global utilities block for loongarch architecture Loongson-2
> +	  SoCs. Initially only reading SVR and registering soc device are
> +	  supported. Other guts accesses, such as reading PMON configuration by
> +	  default, should eventually be added into this driver as well.
> diff --git a/drivers/soc/loongson/Makefile b/drivers/soc/loongson/Makefile
> new file mode 100644
> index 000000000000..263c486df638
> --- /dev/null
> +++ b/drivers/soc/loongson/Makefile
> @@ -0,0 +1,6 @@
> +# SPDX-License-Identifier: GPL-2.0+
> +#
> +# Makefile for the Linux Kernel SoC Loongson-2 specific device drivers
> +#
> +
> +obj-$(CONFIG_LOONGSON2_GUTS)		+= loongson2_guts.o
> diff --git a/drivers/soc/loongson/loongson2_guts.c b/drivers/soc/loongson/loongson2_guts.c
> new file mode 100644
> index 000000000000..8f3d5465c7e8
> --- /dev/null
> +++ b/drivers/soc/loongson/loongson2_guts.c
> @@ -0,0 +1,189 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Author: Yinbo Zhu <zhuyinbo@...ngson.cn>
> + * Copyright (C) 2022-2023 Loongson Technology Corporation Limited
> + */
> +
> +#include <linux/io.h>
> +#include <linux/slab.h>
> +#include <linux/module.h>
> +#include <linux/of_fdt.h>
> +#include <linux/sys_soc.h>
> +#include <linux/of_address.h>
> +#include <linux/platform_device.h>
> +
> +static struct soc_device_attribute soc_dev_attr;
> +static struct soc_device *soc_dev;
> +
> +/*
> + * Global Utility Registers.
> + *
> + * Not all registers defined in this structure are available on all chips, so
> + * you are expected to know whether a given register actually exists on your
> + * chip before you access it.
> + *
> + * Also, some registers are similar on different chips but have slightly
> + * different names.  In these cases, one name is chosen to avoid extraneous
> + * #ifdefs.
> + */
> +struct scfg_guts {
> +	u32     svr;            /* Version Register */
> +	u8      res0[4];
> +	u16     feature;        /* Feature Register */
> +	u32     vendor;         /* Vendor Register */
> +	u8      res1[6];
> +	u32     id;
> +	u8      res2[0x3ff8 - 0x18];
> +	u32     chip;
> +};
> +
> +static struct guts {
> +	struct scfg_guts __iomem *regs;
> +	bool little_endian;
> +} *guts;
> +
> +struct loongson2_soc_die_attr {
> +	char	*die;
> +	u32	svr;
> +	u32	mask;
> +};
> +
> +/* SoC die attribute definition for Loongson-2 platform */
> +static const struct loongson2_soc_die_attr loongson2_soc_die[] = {
> +
> +	/*
> +	 * LA-based SoCs Loongson-2 Series
> +	 */
> +
> +	/* Die: 2k1000la, SoC: 2k1000la */
> +	{ .die		= "2K1000LA",
> +	  .svr		= 0x00000013,
> +	  .mask		= 0x000000ff,
> +	},
> +	{ },
> +};
> +
> +static const struct loongson2_soc_die_attr *loongson2_soc_die_match(
> +	u32 svr, const struct loongson2_soc_die_attr *matches)
> +{
> +	while (matches->svr) {
> +		if (matches->svr == (svr & matches->mask))
> +			return matches;
> +		matches++;
> +	};
> +
> +	return NULL;
> +}
> +
> +static u32 loongson2_guts_get_svr(void)
> +{
> +	u32 svr = 0;
> +
> +	if (!guts || !guts->regs)
> +		return svr;
> +
> +	if (guts->little_endian)
> +		svr = ioread32(&guts->regs->svr);
> +	else
> +		svr = ioread32be(&guts->regs->svr);
> +
> +	return svr;
> +}
> +
> +static int loongson2_guts_probe(struct platform_device *pdev)
> +{
> +	struct device_node *root, *np = pdev->dev.of_node;
> +	struct device *dev = &pdev->dev;
> +	struct resource *res;
> +	const struct loongson2_soc_die_attr *soc_die;
> +	const char *machine;
> +	u32 svr;
> +
> +	/* Initialize guts */
> +	guts = devm_kzalloc(dev, sizeof(*guts), GFP_KERNEL);
> +	if (!guts)
> +		return -ENOMEM;
> +
> +	guts->little_endian = of_property_read_bool(np, "little-endian");
> +
> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	guts->regs = ioremap(res->start, res->end - res->start + 1);
> +	if (IS_ERR(guts->regs))
> +		return PTR_ERR(guts->regs);
> +
> +	/* Register soc device */
> +	root = of_find_node_by_path("/");
> +	if (of_property_read_string(root, "model", &machine))
> +		of_property_read_string_index(root, "compatible", 0, &machine);
> +	of_node_put(root);
> +	if (machine)
> +		soc_dev_attr.machine = devm_kstrdup(dev, machine, GFP_KERNEL);
> +
> +	svr = loongson2_guts_get_svr();
> +	soc_die = loongson2_soc_die_match(svr, loongson2_soc_die);
> +	if (soc_die) {
> +		soc_dev_attr.family = devm_kasprintf(dev, GFP_KERNEL,
> +						     "Loongson %s", soc_die->die);
> +	} else {
> +		soc_dev_attr.family = devm_kasprintf(dev, GFP_KERNEL, "Loongson");
> +	}
> +	if (!soc_dev_attr.family)
> +		return -ENOMEM;
> +	soc_dev_attr.soc_id = devm_kasprintf(dev, GFP_KERNEL,
> +					     "svr:0x%08x", svr);
> +	if (!soc_dev_attr.soc_id)
> +		return -ENOMEM;
> +	soc_dev_attr.revision = devm_kasprintf(dev, GFP_KERNEL, "%d.%d",
> +					       (svr >>  4) & 0xf, svr & 0xf);
> +	if (!soc_dev_attr.revision)
> +		return -ENOMEM;
> +
> +	soc_dev = soc_device_register(&soc_dev_attr);
> +	if (IS_ERR(soc_dev))
> +		return PTR_ERR(soc_dev);
> +
> +	pr_info("Machine: %s\n", soc_dev_attr.machine);
> +	pr_info("SoC family: %s\n", soc_dev_attr.family);
> +	pr_info("SoC ID: %s, Revision: %s\n",
> +		soc_dev_attr.soc_id, soc_dev_attr.revision);
> +
> +	return 0;
> +}
> +
> +static int loongson2_guts_remove(struct platform_device *dev)
> +{
> +	soc_device_unregister(soc_dev);
> +
> +	return 0;
> +}
> +
> +/*
> + * Table for matching compatible strings, for device tree
> + * guts node, for Loongson-2 SoCs.
> + */
> +static const struct of_device_id loongson2_guts_of_match[] = {
> +	{ .compatible = "loongson,ls2k-chipid", },
> +	{}
> +};
> +MODULE_DEVICE_TABLE(of, loongson2_guts_of_match);
> +
> +static struct platform_driver loongson2_guts_driver = {
> +	.driver = {
> +		.name = "loongson2-guts",
> +		.of_match_table = loongson2_guts_of_match,
> +	},
> +	.probe = loongson2_guts_probe,
> +	.remove = loongson2_guts_remove,
> +};
> +
> +static int __init loongson2_guts_init(void)
> +{
> +	return platform_driver_register(&loongson2_guts_driver);
> +}
> +core_initcall(loongson2_guts_init);
> +
> +static void __exit loongson2_guts_exit(void)
> +{
> +	platform_driver_unregister(&loongson2_guts_driver);
> +}
> +module_exit(loongson2_guts_exit);
> 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ