From 2313fca7b44df96d262c0b38af3c57690b65a4e6 Mon Sep 17 00:00:00 2001 From: Serge Semin Date: Tue, 26 May 2020 15:59:25 +0300 Subject: dt-bindings: memory: Add Baikal-T1 L2-cache Control Block binding There is a single register provided by the SoC system controller, which can be used to tune the L2-cache RAM up. It only provides a way to change the L2-RAM access latencies. So aside from "be,bt1-l2-ctl" compatible string the device node can be optionally equipped with the properties of Tag/Data/WS latencies. Link: https://lore.kernel.org/r/20200526125928.17096-4-Sergey.Semin@baikalelectronics.ru Signed-off-by: Serge Semin Cc: Alexey Malahov Cc: Paul Burton Cc: Olof Johansson Cc: linux-mips@vger.kernel.org Cc: soc@kernel.org Reviewed-by: Rob Herring Signed-off-by: Arnd Bergmann --- .../memory-controllers/baikal,bt1-l2-ctl.yaml | 63 ++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 Documentation/devicetree/bindings/memory-controllers/baikal,bt1-l2-ctl.yaml diff --git a/Documentation/devicetree/bindings/memory-controllers/baikal,bt1-l2-ctl.yaml b/Documentation/devicetree/bindings/memory-controllers/baikal,bt1-l2-ctl.yaml new file mode 100644 index 000000000000..1fca282f64a2 --- /dev/null +++ b/Documentation/devicetree/bindings/memory-controllers/baikal,bt1-l2-ctl.yaml @@ -0,0 +1,63 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +# Copyright (C) 2020 BAIKAL ELECTRONICS, JSC +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/memory-controllers/baikal,bt1-l2-ctl.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Baikal-T1 L2-cache Control Block + +maintainers: + - Serge Semin + +description: | + By means of the System Controller Baikal-T1 SoC exposes a few settings to + tune the MIPS P5600 CM2 L2 cache performance up. In particular it's possible + to change the Tag, Data and Way-select RAM access latencies. Baikal-T1 + L2-cache controller block is responsible for the tuning. Its DT node is + supposed to be a child of the system controller. + +properties: + compatible: + const: baikal,bt1-l2-ctl + + reg: + maxItems: 1 + + baikal,l2-ws-latency: + $ref: /schemas/types.yaml#/definitions/uint32 + description: Cycles of latency for Way-select RAM accesses + default: 0 + minimum: 0 + maximum: 3 + + baikal,l2-tag-latency: + $ref: /schemas/types.yaml#/definitions/uint32 + description: Cycles of latency for Tag RAM accesses + default: 0 + minimum: 0 + maximum: 3 + + baikal,l2-data-latency: + $ref: /schemas/types.yaml#/definitions/uint32 + description: Cycles of latency for Data RAM accesses + default: 1 + minimum: 0 + maximum: 3 + +additionalProperties: false + +required: + - compatible + +examples: + - | + l2@1f04d028 { + compatible = "baikal,bt1-l2-ctl"; + reg = <0x1f04d028 0x004>; + + baikal,l2-ws-latency = <1>; + baikal,l2-tag-latency = <1>; + baikal,l2-data-latency = <2>; + }; +... -- cgit v1.2.3 From 1c8ceb16bcb924c8bceb638b2d6cde4c104a8114 Mon Sep 17 00:00:00 2001 From: Serge Semin Date: Thu, 28 May 2020 17:50:45 +0300 Subject: bus: bt1-apb: Include linux/io.h It must be included since we are using readl() method here. Link: https://lore.kernel.org/r/20200528145050.5203-1-Sergey.Semin@baikalelectronics.ru Signed-off-by: Serge Semin Cc: Alexey Malahov Cc: Olof Johansson Cc: Andy Shevchenko Cc: soc@kernel.org Signed-off-by: Arnd Bergmann --- drivers/bus/bt1-apb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/bus/bt1-apb.c b/drivers/bus/bt1-apb.c index abccd1dfc544..839f1add2236 100644 --- a/drivers/bus/bt1-apb.c +++ b/drivers/bus/bt1-apb.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include -- cgit v1.2.3 From b19dc1b79993a7e6a2c0aa1725f679bb9ae8ad89 Mon Sep 17 00:00:00 2001 From: Serge Semin Date: Thu, 28 May 2020 17:50:46 +0300 Subject: bus: bt1-apb: Fix show/store callback identations After fixing the sysfs calback return value the functions argumnets identations have been left as before the fix. That made the argments declarations being unaligned with respect to the space surrounded by the parentheses. Link: https://lore.kernel.org/r/20200528145050.5203-2-Sergey.Semin@baikalelectronics.ru Signed-off-by: Serge Semin Cc: Alexey Malahov Cc: Olof Johansson Cc: Andy Shevchenko Cc: soc@kernel.org Signed-off-by: Arnd Bergmann --- drivers/bus/bt1-apb.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/bus/bt1-apb.c b/drivers/bus/bt1-apb.c index 839f1add2236..59ec5e7077e8 100644 --- a/drivers/bus/bt1-apb.c +++ b/drivers/bus/bt1-apb.c @@ -311,15 +311,15 @@ static ssize_t timeout_store(struct device *dev, } static DEVICE_ATTR_RW(timeout); -static ssize_t inject_error_show(struct device *dev, struct device_attribute *attr, - char *buf) +static ssize_t inject_error_show(struct device *dev, + struct device_attribute *attr, char *buf) { return scnprintf(buf, PAGE_SIZE, "Error injection: nodev irq\n"); } static ssize_t inject_error_store(struct device *dev, - struct device_attribute *attr, - const char *data, size_t count) + struct device_attribute *attr, + const char *data, size_t count) { struct bt1_apb *apb = dev_get_drvdata(dev); -- cgit v1.2.3 From 75341b3d358d27f7c22e48bcd92926c49f79e9be Mon Sep 17 00:00:00 2001 From: Serge Semin Date: Thu, 28 May 2020 17:50:47 +0300 Subject: bus: bt1-apb: Use PTR_ERR_OR_ZERO to return from request-regs method Indeed it's more optimal to use the PTR_ERR_OR_ZERO() macro there instead of having two return points. Link: https://lore.kernel.org/r/20200528145050.5203-3-Sergey.Semin@baikalelectronics.ru Signed-off-by: Serge Semin Cc: Alexey Malahov Cc: Olof Johansson Cc: Andy Shevchenko Cc: soc@kernel.org Signed-off-by: Arnd Bergmann --- drivers/bus/bt1-apb.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/bus/bt1-apb.c b/drivers/bus/bt1-apb.c index 59ec5e7077e8..7e57fc2af745 100644 --- a/drivers/bus/bt1-apb.c +++ b/drivers/bus/bt1-apb.c @@ -164,12 +164,10 @@ static int bt1_apb_request_regs(struct bt1_apb *apb) } apb->res = devm_platform_ioremap_resource_byname(pdev, "nodev"); - if (IS_ERR(apb->res)) { + if (IS_ERR(apb->res)) dev_err(apb->dev, "Couldn't map reserved region\n"); - return PTR_ERR(apb->res); - } - return 0; + return PTR_ERR_OR_ZERO(apb->res); } static int bt1_apb_request_rst(struct bt1_apb *apb) -- cgit v1.2.3 From b7cb430d5f11b24c1c5809ab46a098ff299b975f Mon Sep 17 00:00:00 2001 From: Serge Semin Date: Thu, 28 May 2020 17:50:48 +0300 Subject: bus: bt1-apb: Use sysfs_streq instead of strncmp There is a ready-to-use method to compare a retrieved from a sysfs node string with another string. It treats both NUL and newline-then-NUL as equivalent string terminations. So use it instead of manually truncating the line length in the strncmp() method. Link: https://lore.kernel.org/r/20200528145050.5203-4-Sergey.Semin@baikalelectronics.ru Signed-off-by: Serge Semin Cc: Alexey Malahov Cc: Olof Johansson Cc: Andy Shevchenko Cc: soc@kernel.org Signed-off-by: Arnd Bergmann --- drivers/bus/bt1-apb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/bus/bt1-apb.c b/drivers/bus/bt1-apb.c index 7e57fc2af745..b25ff941e7c7 100644 --- a/drivers/bus/bt1-apb.c +++ b/drivers/bus/bt1-apb.c @@ -325,9 +325,9 @@ static ssize_t inject_error_store(struct device *dev, * Either dummy read from the unmapped address in the APB IO area * or manually set the IRQ status. */ - if (!strncmp(data, "nodev", 5)) + if (sysfs_streq(data, "nodev")) readl(apb->res); - else if (!strncmp(data, "irq", 3)) + else if (sysfs_streq(data, "irq")) regmap_update_bits(apb->regs, APB_EHB_ISR, APB_EHB_ISR_PENDING, APB_EHB_ISR_PENDING); else -- cgit v1.2.3 From 7f57416f2aebe6f8b6ad105b4ca58b347fb2dd2c Mon Sep 17 00:00:00 2001 From: Serge Semin Date: Thu, 28 May 2020 17:50:49 +0300 Subject: bus: bt1-axi: Optimize the return points in the driver It's better to have a single return statement where it's applicable instead of returning from a conditional statement if-clause. Let's do this in the request registers, clock and IRQ methods. Link: https://lore.kernel.org/r/20200528145050.5203-5-Sergey.Semin@baikalelectronics.ru Signed-off-by: Serge Semin Cc: Alexey Malahov Cc: Olof Johansson Cc: Andy Shevchenko Cc: soc@kernel.org Signed-off-by: Arnd Bergmann --- drivers/bus/bt1-axi.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/drivers/bus/bt1-axi.c b/drivers/bus/bt1-axi.c index 2005f9174118..c194d9a2bbeb 100644 --- a/drivers/bus/bt1-axi.c +++ b/drivers/bus/bt1-axi.c @@ -124,12 +124,10 @@ static int bt1_axi_request_regs(struct bt1_axi *axi) } axi->qos_regs = devm_platform_ioremap_resource_byname(pdev, "qos"); - if (IS_ERR(axi->qos_regs)) { + if (IS_ERR(axi->qos_regs)) dev_err(dev, "Couldn't map AXI-bus QoS registers\n"); - return PTR_ERR(axi->qos_regs); - } - return 0; + return PTR_ERR_OR_ZERO(axi->qos_regs); } static int bt1_axi_request_rst(struct bt1_axi *axi) @@ -173,12 +171,10 @@ static int bt1_axi_request_clk(struct bt1_axi *axi) } ret = devm_add_action_or_reset(axi->dev, bt1_axi_disable_clk, axi); - if (ret) { + if (ret) dev_err(axi->dev, "Can't add AXI clock disable action\n"); - return ret; - } - return 0; + return ret; } static int bt1_axi_request_irq(struct bt1_axi *axi) @@ -192,12 +188,10 @@ static int bt1_axi_request_irq(struct bt1_axi *axi) ret = devm_request_irq(axi->dev, axi->irq, bt1_axi_isr, IRQF_SHARED, "bt1-axi", axi); - if (ret) { + if (ret) dev_err(axi->dev, "Couldn't request AXI EHB IRQ\n"); - return ret; - } - return 0; + return ret; } static ssize_t count_show(struct device *dev, -- cgit v1.2.3 From 91920088536fa1cf01ceedbfb96219699d088756 Mon Sep 17 00:00:00 2001 From: Serge Semin Date: Thu, 28 May 2020 17:50:50 +0300 Subject: bus: bt1-axi: Use sysfs_streq instead of strncmp There is a ready-to-use method to compare a retrieved from a sysfs node string with another string. It treats both NUL and newline-then-NUL as equivalent string terminations. So use it instead of manually truncating the line length in the strncmp() method. Link: https://lore.kernel.org/r/20200528145050.5203-6-Sergey.Semin@baikalelectronics.ru Signed-off-by: Serge Semin Cc: Alexey Malahov Cc: Olof Johansson Cc: Andy Shevchenko Cc: soc@kernel.org Signed-off-by: Arnd Bergmann --- drivers/bus/bt1-axi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/bus/bt1-axi.c b/drivers/bus/bt1-axi.c index c194d9a2bbeb..e7a6744acc7b 100644 --- a/drivers/bus/bt1-axi.c +++ b/drivers/bus/bt1-axi.c @@ -220,9 +220,9 @@ static ssize_t inject_error_store(struct device *dev, * error while unaligned writing - the AXI bus write error handled * by this driver. */ - if (!strncmp(data, "bus", 3)) + if (sysfs_streq(data, "bus")) readb(axi->qos_regs); - else if (!strncmp(data, "unaligned", 9)) + else if (sysfs_streq(data, "unaligned")) writeb(0, axi->qos_regs); else return -EINVAL; -- cgit v1.2.3 From dc20e93b935e43e9315128626f20962039fda7d9 Mon Sep 17 00:00:00 2001 From: Serge Semin Date: Thu, 28 May 2020 22:31:12 +0300 Subject: bus: bt1-apb: Build the driver into the kernel Seeing trigger_all_cpu_backtrace() isn't exported from the kernel and since calling it is a very important part of driver, which may provide a better description of a possible cause of the error, let's disable the ability to build the driver as a loadable kernel module. Link: https://lore.kernel.org/r/20200528193113.17372-1-Sergey.Semin@baikalelectronics.ru Signed-off-by: Serge Semin Cc: Alexey Malahov Cc: Olof Johansson Cc: soc@kernel.org Signed-off-by: Arnd Bergmann --- drivers/bus/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/bus/Kconfig b/drivers/bus/Kconfig index 030f0e59f193..18858f560d1f 100644 --- a/drivers/bus/Kconfig +++ b/drivers/bus/Kconfig @@ -30,7 +30,7 @@ config BRCMSTB_GISB_ARB and internal bus master decoding. config BT1_APB - tristate "Baikal-T1 APB-bus driver" + bool "Baikal-T1 APB-bus driver" depends on MIPS_BAIKAL_T1 || COMPILE_TEST select REGMAP_MMIO help -- cgit v1.2.3 From 22e795b470aebef4c01346e3b43e0af49c7638be Mon Sep 17 00:00:00 2001 From: Serge Semin Date: Thu, 28 May 2020 22:31:13 +0300 Subject: bus: bt1-axi: Build the driver into the kernel Alas the method trigger_all_cpu_backtrace() isn't exported by the kernel, but we need to have it called in case of the bus errors detected to get a better description of a possible cause of the error. Let's disable the ability to build the driver as a loadable kernel module then. Note In future the driver will support the AXI-bus interconnect capability, so we'd have to make it built into the kernel anyway. Link: https://lore.kernel.org/r/20200528193113.17372-2-Sergey.Semin@baikalelectronics.ru Signed-off-by: Serge Semin Cc: Alexey Malahov Cc: Olof Johansson Cc: soc@kernel.org Signed-off-by: Arnd Bergmann --- drivers/bus/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/bus/Kconfig b/drivers/bus/Kconfig index 18858f560d1f..4be793c5ab4d 100644 --- a/drivers/bus/Kconfig +++ b/drivers/bus/Kconfig @@ -45,7 +45,7 @@ config BT1_APB accessed via corresponding sysfs nodes. config BT1_AXI - tristate "Baikal-T1 AXI-bus driver" + bool "Baikal-T1 AXI-bus driver" depends on MIPS_BAIKAL_T1 || COMPILE_TEST select MFD_SYSCON help -- cgit v1.2.3