2017-06-06 09:45:46

by Neil Armstrong

[permalink] [raw]
Subject: [PATCH v2 0/3] soc: amlogic: Add Amlogic SoC Information driver

Amlogic SoCs have a SoC information register for SoC type, package type and
revision information.
This patchset adds support for this register decoding and exposing with the
SoC bus infrastructure, with dt-bindings and DT node.

Changes since v1 at [1] :
- Switch DT representation to use regmap ans sub-node of a simple-mfd node
- Updated DT, bindings and driver accordingly

Neil Armstrong (3):
dt-bindings: arm: amlogic: Add SoC information bindings
ARM64: dts: meson-gx: Add SoC info register
soc: Add Amlogic SoC Information driver

Documentation/devicetree/bindings/arm/amlogic.txt | 32 ++++
arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 9 ++
drivers/soc/Kconfig | 1 +
drivers/soc/Makefile | 1 +
drivers/soc/amlogic/Kconfig | 12 ++
drivers/soc/amlogic/Makefile | 1 +
drivers/soc/amlogic/meson-gx-socinfo.c | 169 ++++++++++++++++++++++
7 files changed, 225 insertions(+)
create mode 100644 drivers/soc/amlogic/Kconfig
create mode 100644 drivers/soc/amlogic/Makefile
create mode 100644 drivers/soc/amlogic/meson-gx-socinfo.c

--
1.9.1


2017-06-06 09:45:51

by Neil Armstrong

[permalink] [raw]
Subject: [PATCH v2 3/3] soc: Add Amlogic SoC Information driver

Amlogic SoCs have a SoC information register for SoC type, package type and
revision information.
This patchs adds support for this register decoding and exposing with the
SoC bus infrastructure.

Signed-off-by: Neil Armstrong <[email protected]>
---
drivers/soc/Kconfig | 1 +
drivers/soc/Makefile | 1 +
drivers/soc/amlogic/Kconfig | 12 +++
drivers/soc/amlogic/Makefile | 1 +
drivers/soc/amlogic/meson-gx-socinfo.c | 169 +++++++++++++++++++++++++++++++++
5 files changed, 184 insertions(+)
create mode 100644 drivers/soc/amlogic/Kconfig
create mode 100644 drivers/soc/amlogic/Makefile
create mode 100644 drivers/soc/amlogic/meson-gx-socinfo.c

diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig
index 309643f..95416a4 100644
--- a/drivers/soc/Kconfig
+++ b/drivers/soc/Kconfig
@@ -1,5 +1,6 @@
menu "SOC (System On Chip) specific Drivers"

+source "drivers/soc/amlogic/Kconfig"
source "drivers/soc/atmel/Kconfig"
source "drivers/soc/bcm/Kconfig"
source "drivers/soc/fsl/Kconfig"
diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile
index 824b442..4fc957e 100644
--- a/drivers/soc/Makefile
+++ b/drivers/soc/Makefile
@@ -9,6 +9,7 @@ obj-$(CONFIG_MACH_DOVE) += dove/
obj-y += fsl/
obj-$(CONFIG_ARCH_MXC) += imx/
obj-$(CONFIG_ARCH_MEDIATEK) += mediatek/
+obj-$(CONFIG_ARCH_MESON) += amlogic/
obj-$(CONFIG_ARCH_QCOM) += qcom/
obj-$(CONFIG_ARCH_RENESAS) += renesas/
obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip/
diff --git a/drivers/soc/amlogic/Kconfig b/drivers/soc/amlogic/Kconfig
new file mode 100644
index 0000000..22acf06
--- /dev/null
+++ b/drivers/soc/amlogic/Kconfig
@@ -0,0 +1,12 @@
+menu "Amlogic SoC drivers"
+
+config MESON_GX_SOCINFO
+ bool "Amlogic Meson GX SoC Information driver"
+ depends on ARCH_MESON || COMPILE_TEST
+ default ARCH_MESON
+ select SOC_BUS
+ help
+ Say yes to support decoding of Amlogic Meson GX SoC family
+ information about the type, package and version.
+
+endmenu
diff --git a/drivers/soc/amlogic/Makefile b/drivers/soc/amlogic/Makefile
new file mode 100644
index 0000000..3e85fc4
--- /dev/null
+++ b/drivers/soc/amlogic/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_MESON_GX_SOCINFO) += meson-gx-socinfo.o
diff --git a/drivers/soc/amlogic/meson-gx-socinfo.c b/drivers/soc/amlogic/meson-gx-socinfo.c
new file mode 100644
index 0000000..9963370
--- /dev/null
+++ b/drivers/soc/amlogic/meson-gx-socinfo.c
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 2017 BayLibre, SAS
+ * Author: Neil Armstrong <[email protected]>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/sys_soc.h>
+#include <linux/bitfield.h>
+#include <linux/regmap.h>
+#include <linux/mfd/syscon.h>
+
+#define AO_SEC_SD_CFG8 0xe0
+#define AO_SEC_SOCINFO_OFFSET AO_SEC_SD_CFG8
+
+#define SOCINFO_MAJOR GENMASK(31, 24)
+#define SOCINFO_MINOR GENMASK(23, 16)
+#define SOCINFO_PACK GENMASK(15, 8)
+#define SOCINFO_MISC GENMASK(7, 0)
+
+static const struct meson_gx_soc_id {
+ const char *name;
+ unsigned int id;
+} soc_ids[] = {
+ { "GXBB", 0x1f },
+ { "GXTVBB", 0x20 },
+ { "GXL", 0x21 },
+ { "GXM", 0x22 },
+ { "TXL", 0x23 },
+};
+
+static const struct meson_gx_package_id {
+ const char *name;
+ unsigned int major_id;
+ unsigned int pack_id;
+} soc_packages[] = {
+ { "S905", 0x1f, 0 },
+ { "S905M", 0x1f, 0x20 },
+ { "S905D", 0x21, 0 },
+ { "S905X", 0x21, 0x80 },
+ { "S905L", 0x21, 0xc0 },
+ { "S905M2", 0x21, 0xe0 },
+ { "S912", 0x22, 0 },
+};
+
+static inline unsigned int socinfo_to_major(u32 socinfo)
+{
+ return FIELD_GET(SOCINFO_MAJOR, socinfo);
+}
+
+static inline unsigned int socinfo_to_minor(u32 socinfo)
+{
+ return FIELD_GET(SOCINFO_MINOR, socinfo);
+}
+
+static inline unsigned int socinfo_to_pack(u32 socinfo)
+{
+ return FIELD_GET(SOCINFO_PACK, socinfo);
+}
+
+static inline unsigned int socinfo_to_misc(u32 socinfo)
+{
+ return FIELD_GET(SOCINFO_MISC, socinfo);
+}
+
+static const char *socinfo_to_package_id(u32 socinfo)
+{
+ unsigned int pack = socinfo_to_pack(socinfo) & 0xf0;
+ unsigned int major = socinfo_to_major(socinfo);
+ int i;
+
+ for (i = 0 ; i < ARRAY_SIZE(soc_packages) ; ++i) {
+ if (soc_packages[i].major_id == major &&
+ soc_packages[i].pack_id == pack)
+ return soc_packages[i].name;
+ }
+
+ return "Unknown";
+}
+
+static const char *socinfo_to_soc_id(u32 socinfo)
+{
+ unsigned int id = socinfo_to_major(socinfo);
+ int i;
+
+ for (i = 0 ; i < ARRAY_SIZE(soc_ids) ; ++i) {
+ if (soc_ids[i].id == id)
+ return soc_ids[i].name;
+ }
+
+ return "Unknown";
+}
+
+int __init meson_gx_socinfo_init(void)
+{
+ struct soc_device_attribute *soc_dev_attr;
+ struct soc_device *soc_dev;
+ struct device_node *np;
+ struct regmap *regmap;
+ unsigned int socinfo;
+ struct device *dev;
+ int ret;
+
+ /* look up for chipid node */
+ np = of_find_compatible_node(NULL, NULL, "amlogic,meson-gx-chipid");
+ if (!np)
+ return -ENODEV;
+
+ /* parent node should be a syscon */
+ regmap = syscon_node_to_regmap(of_get_parent(np));
+ of_node_put(np);
+ if (IS_ERR(regmap)) {
+ pr_err("%s: failed to get regmap\n", __func__);
+ return -ENODEV;
+ }
+
+ ret = regmap_read(regmap, AO_SEC_SOCINFO_OFFSET, &socinfo);
+ if (ret < 0)
+ return ret;
+
+ if (!socinfo) {
+ pr_err("%s: invalid chipid value\n", __func__);
+ return -EINVAL;
+ }
+
+ soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
+ if (!soc_dev_attr)
+ return -ENODEV;
+
+ soc_dev_attr->family = "Amlogic Meson";
+
+ np = of_find_node_by_path("/");
+ of_property_read_string(np, "model", &soc_dev_attr->machine);
+ of_node_put(np);
+
+ soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%x:%x - %x:%x",
+ socinfo_to_major(socinfo),
+ socinfo_to_minor(socinfo),
+ socinfo_to_pack(socinfo),
+ socinfo_to_misc(socinfo));
+ soc_dev_attr->soc_id = kasprintf(GFP_KERNEL, "%s (%s)",
+ socinfo_to_soc_id(socinfo),
+ socinfo_to_package_id(socinfo));
+
+ soc_dev = soc_device_register(soc_dev_attr);
+ if (IS_ERR(soc_dev)) {
+ kfree(soc_dev_attr->revision);
+ kfree_const(soc_dev_attr->soc_id);
+ kfree(soc_dev_attr);
+ return PTR_ERR(soc_dev);
+ }
+ dev = soc_device_to_device(soc_dev);
+
+ dev_info(dev, "Amlogic Meson %s Revision %x:%x (%x:%x) Detected\n",
+ soc_dev_attr->soc_id,
+ socinfo_to_major(socinfo),
+ socinfo_to_minor(socinfo),
+ socinfo_to_pack(socinfo),
+ socinfo_to_misc(socinfo));
+
+ return 0;
+}
+device_initcall(meson_gx_socinfo_init);
--
1.9.1

2017-06-06 09:46:03

by Neil Armstrong

[permalink] [raw]
Subject: [PATCH v2 2/3] ARM64: dts: meson-gx: Add SoC info register

Add node for the Amlogic Meson GX SoC information register.

Signed-off-by: Neil Armstrong <[email protected]>
---
arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 9 +++++++++
1 file changed, 9 insertions(+)

diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
index 436b875..50d001a 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
+++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
@@ -365,6 +365,15 @@
#reset-cells = <1>;
};

+ sec_AO: ao-secure@140 {
+ compatible = "amlogic,meson-gx-ao-secure", "syscon", "simple-mfd";
+ reg = <0x0 0x140 0x0 0x140>;
+
+ chipid {
+ compatible = "amlogic,meson-gx-chipid";
+ };
+ };
+
uart_AO: serial@4c0 {
compatible = "amlogic,meson-uart";
reg = <0x0 0x004c0 0x0 0x14>;
--
1.9.1

2017-06-06 09:46:22

by Neil Armstrong

[permalink] [raw]
Subject: [PATCH v2 1/3] dt-bindings: arm: amlogic: Add SoC information bindings

Add bindings for the SoC information register of the Amlogic SoCs.

Signed-off-by: Neil Armstrong <[email protected]>
---
Documentation/devicetree/bindings/arm/amlogic.txt | 32 +++++++++++++++++++++++
1 file changed, 32 insertions(+)

diff --git a/Documentation/devicetree/bindings/arm/amlogic.txt b/Documentation/devicetree/bindings/arm/amlogic.txt
index 5c01e65..ae3e8ed 100644
--- a/Documentation/devicetree/bindings/arm/amlogic.txt
+++ b/Documentation/devicetree/bindings/arm/amlogic.txt
@@ -60,3 +60,35 @@ Board compatible values (alphabetically, grouped by SoC):
- "amlogic,q201" (Meson gxm s912)
- "kingnovel,r-box-pro" (Meson gxm S912)
- "nexbox,a1" (Meson gxm s912)
+
+Amlogic Meson Firmware registers Interface
+------------------------------------------
+
+The Meson SoCs have a register bank with status and data shared with the
+secure firmware.
+
+Required properties:
+ - compatible: For Meson GX SoCs, must be "amlogic,meson-gx-ao-secure", "syscon", "simple-mfd"
+
+Sub-nodes should indentify components of this register interface :
+
+Meson GX SoC Information
+------------------------
+A firmware register encodes the SoC type, package and revision information on
+the Meson GX SoCs.
+If present, a device node for this register should be added.
+
+Required properties:
+ - compatible: For Meson GX SoCs, must be "amlogic,meson-gx-chipid".
+
+Example
+-------
+
+ao-secure@140 {
+ compatible = "amlogic,meson-gx-ao-secure", "syscon", "simple-mfd";
+ reg = <0x0 0x140 0x0 0x140>;
+
+ chipid {
+ compatible = "amlogic,meson-gx-chipid";
+ };
+};
--
1.9.1

2017-06-09 13:37:21

by Rob Herring (Arm)

[permalink] [raw]
Subject: Re: [PATCH v2 1/3] dt-bindings: arm: amlogic: Add SoC information bindings

On Tue, Jun 06, 2017 at 11:45:38AM +0200, Neil Armstrong wrote:
> Add bindings for the SoC information register of the Amlogic SoCs.
>
> Signed-off-by: Neil Armstrong <[email protected]>
> ---
> Documentation/devicetree/bindings/arm/amlogic.txt | 32 +++++++++++++++++++++++
> 1 file changed, 32 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/arm/amlogic.txt b/Documentation/devicetree/bindings/arm/amlogic.txt
> index 5c01e65..ae3e8ed 100644
> --- a/Documentation/devicetree/bindings/arm/amlogic.txt
> +++ b/Documentation/devicetree/bindings/arm/amlogic.txt
> @@ -60,3 +60,35 @@ Board compatible values (alphabetically, grouped by SoC):
> - "amlogic,q201" (Meson gxm s912)
> - "kingnovel,r-box-pro" (Meson gxm S912)
> - "nexbox,a1" (Meson gxm s912)
> +
> +Amlogic Meson Firmware registers Interface
> +------------------------------------------
> +
> +The Meson SoCs have a register bank with status and data shared with the
> +secure firmware.
> +
> +Required properties:
> + - compatible: For Meson GX SoCs, must be "amlogic,meson-gx-ao-secure", "syscon", "simple-mfd"
> +
> +Sub-nodes should indentify components of this register interface :
> +
> +Meson GX SoC Information
> +------------------------
> +A firmware register encodes the SoC type, package and revision information on
> +the Meson GX SoCs.
> +If present, a device node for this register should be added.
> +
> +Required properties:
> + - compatible: For Meson GX SoCs, must be "amlogic,meson-gx-chipid".
> +
> +Example
> +-------
> +
> +ao-secure@140 {
> + compatible = "amlogic,meson-gx-ao-secure", "syscon", "simple-mfd";
> + reg = <0x0 0x140 0x0 0x140>;
> +
> + chipid {
> + compatible = "amlogic,meson-gx-chipid";

No registers for this block? If not, this node is pointless.
"amlogic,meson-gx-ao-secure" should be specific enough to determine if
you have this block or not and the driver for it can create a device if
the OS needs it.

Rob

2017-06-09 13:58:41

by Neil Armstrong

[permalink] [raw]
Subject: Re: [PATCH v2 1/3] dt-bindings: arm: amlogic: Add SoC information bindings

On 06/09/2017 03:37 PM, Rob Herring wrote:
> On Tue, Jun 06, 2017 at 11:45:38AM +0200, Neil Armstrong wrote:
>> Add bindings for the SoC information register of the Amlogic SoCs.
>>
>> Signed-off-by: Neil Armstrong <[email protected]>
>> ---
>> Documentation/devicetree/bindings/arm/amlogic.txt | 32 +++++++++++++++++++++++
>> 1 file changed, 32 insertions(+)
>>
>> diff --git a/Documentation/devicetree/bindings/arm/amlogic.txt b/Documentation/devicetree/bindings/arm/amlogic.txt
>> index 5c01e65..ae3e8ed 100644
>> --- a/Documentation/devicetree/bindings/arm/amlogic.txt
>> +++ b/Documentation/devicetree/bindings/arm/amlogic.txt
>> @@ -60,3 +60,35 @@ Board compatible values (alphabetically, grouped by SoC):
>> - "amlogic,q201" (Meson gxm s912)
>> - "kingnovel,r-box-pro" (Meson gxm S912)
>> - "nexbox,a1" (Meson gxm s912)
>> +
>> +Amlogic Meson Firmware registers Interface
>> +------------------------------------------
>> +
>> +The Meson SoCs have a register bank with status and data shared with the
>> +secure firmware.
>> +
>> +Required properties:
>> + - compatible: For Meson GX SoCs, must be "amlogic,meson-gx-ao-secure", "syscon", "simple-mfd"
>> +
>> +Sub-nodes should indentify components of this register interface :
>> +
>> +Meson GX SoC Information
>> +------------------------
>> +A firmware register encodes the SoC type, package and revision information on
>> +the Meson GX SoCs.
>> +If present, a device node for this register should be added.
>> +
>> +Required properties:
>> + - compatible: For Meson GX SoCs, must be "amlogic,meson-gx-chipid".
>> +
>> +Example
>> +-------
>> +
>> +ao-secure@140 {
>> + compatible = "amlogic,meson-gx-ao-secure", "syscon", "simple-mfd";
>> + reg = <0x0 0x140 0x0 0x140>;
>> +
>> + chipid {
>> + compatible = "amlogic,meson-gx-chipid";
>
> No registers for this block? If not, this node is pointless.
> "amlogic,meson-gx-ao-secure" should be specific enough to determine if
> you have this block or not and the driver for it can create a device if
> the OS needs it.
>
> Rob
>

Well OK, but since it's a firmware interface, it can be handy to list the
possible capabilities, not especially tied to a driver.

Neil

2017-06-09 15:47:01

by Rob Herring (Arm)

[permalink] [raw]
Subject: Re: [PATCH v2 1/3] dt-bindings: arm: amlogic: Add SoC information bindings

On Fri, Jun 9, 2017 at 8:58 AM, Neil Armstrong <[email protected]> wrote:
> On 06/09/2017 03:37 PM, Rob Herring wrote:
>> On Tue, Jun 06, 2017 at 11:45:38AM +0200, Neil Armstrong wrote:
>>> Add bindings for the SoC information register of the Amlogic SoCs.
>>>
>>> Signed-off-by: Neil Armstrong <[email protected]>
>>> ---
>>> Documentation/devicetree/bindings/arm/amlogic.txt | 32 +++++++++++++++++++++++
>>> 1 file changed, 32 insertions(+)
>>>
>>> diff --git a/Documentation/devicetree/bindings/arm/amlogic.txt b/Documentation/devicetree/bindings/arm/amlogic.txt
>>> index 5c01e65..ae3e8ed 100644
>>> --- a/Documentation/devicetree/bindings/arm/amlogic.txt
>>> +++ b/Documentation/devicetree/bindings/arm/amlogic.txt
>>> @@ -60,3 +60,35 @@ Board compatible values (alphabetically, grouped by SoC):
>>> - "amlogic,q201" (Meson gxm s912)
>>> - "kingnovel,r-box-pro" (Meson gxm S912)
>>> - "nexbox,a1" (Meson gxm s912)
>>> +
>>> +Amlogic Meson Firmware registers Interface
>>> +------------------------------------------
>>> +
>>> +The Meson SoCs have a register bank with status and data shared with the
>>> +secure firmware.
>>> +
>>> +Required properties:
>>> + - compatible: For Meson GX SoCs, must be "amlogic,meson-gx-ao-secure", "syscon", "simple-mfd"
>>> +
>>> +Sub-nodes should indentify components of this register interface :
>>> +
>>> +Meson GX SoC Information
>>> +------------------------
>>> +A firmware register encodes the SoC type, package and revision information on
>>> +the Meson GX SoCs.
>>> +If present, a device node for this register should be added.
>>> +
>>> +Required properties:
>>> + - compatible: For Meson GX SoCs, must be "amlogic,meson-gx-chipid".
>>> +
>>> +Example
>>> +-------
>>> +
>>> +ao-secure@140 {
>>> + compatible = "amlogic,meson-gx-ao-secure", "syscon", "simple-mfd";
>>> + reg = <0x0 0x140 0x0 0x140>;
>>> +
>>> + chipid {
>>> + compatible = "amlogic,meson-gx-chipid";
>>
>> No registers for this block? If not, this node is pointless.
>> "amlogic,meson-gx-ao-secure" should be specific enough to determine if
>> you have this block or not and the driver for it can create a device if
>> the OS needs it.
>>
>> Rob
>>
>
> Well OK, but since it's a firmware interface, it can be handy to list the
> possible capabilities, not especially tied to a driver.

A "has-chip-id;" property would do that.

It would be better to just be very explicit about what version of
firmware you have and that can imply anything and everything you need
to know about the firmware without needing to up date the dtb every
time you need to provide a new (to Linux) firmware capability.

Rob