* [PATCH 0/2] Add VPU support for new Ingenic SoCs.
@ 2021-07-24 9:11 周琰杰 (Zhou Yanjie)
2021-07-24 9:11 ` [PATCH 1/2] dt-bindings: remoteproc: Add bindings " 周琰杰 (Zhou Yanjie)
2021-07-24 9:11 ` [PATCH 2/2] remoteproc: Ingenic: Add support " 周琰杰 (Zhou Yanjie)
0 siblings, 2 replies; 9+ messages in thread
From: 周琰杰 (Zhou Yanjie) @ 2021-07-24 9:11 UTC (permalink / raw)
To: ohad, bjorn.andersson, mathieu.poirier, robh+dt, paul
Cc: devicetree, linux-remoteproc, linux-mips, linux-kernel,
dongsheng.qiu, aric.pzqi, rick.tyliu, sihui.liu, jun.jiang,
sernia.zhou
1.Add the remoteproc bindings for the JZ4760 SoC, the JZ4760B SoC,
the JZ4775 SoC, and the JZ4780 SoC from Ingenic.
2.Add support for probing the ingenic_rproc driver on the JZ4760 SoC,
the JZ4760B SoC, the JZ4775 SoC, and the JZ4780 SoC from Ingenic.
It should be noted that the VPU of JZ4775 and JZ4780 has only one TCSM.
周琰杰 (Zhou Yanjie) (2):
dt-bindings: remoteproc: Add bindings for new Ingenic SoCs.
remoteproc: Ingenic: Add support for new Ingenic SoCs.
.../bindings/remoteproc/ingenic,vpu.yaml | 74 +++++++++----
drivers/remoteproc/ingenic_rproc.c | 115 ++++++++++++++++-----
2 files changed, 147 insertions(+), 42 deletions(-)
--
2.7.4
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/2] dt-bindings: remoteproc: Add bindings for new Ingenic SoCs.
2021-07-24 9:11 [PATCH 0/2] Add VPU support for new Ingenic SoCs 周琰杰 (Zhou Yanjie)
@ 2021-07-24 9:11 ` 周琰杰 (Zhou Yanjie)
2021-07-24 11:02 ` Paul Cercueil
2021-07-24 9:11 ` [PATCH 2/2] remoteproc: Ingenic: Add support " 周琰杰 (Zhou Yanjie)
1 sibling, 1 reply; 9+ messages in thread
From: 周琰杰 (Zhou Yanjie) @ 2021-07-24 9:11 UTC (permalink / raw)
To: ohad, bjorn.andersson, mathieu.poirier, robh+dt, paul
Cc: devicetree, linux-remoteproc, linux-mips, linux-kernel,
dongsheng.qiu, aric.pzqi, rick.tyliu, sihui.liu, jun.jiang,
sernia.zhou
Add the remoteproc bindings for the JZ4760 SoC, the JZ4760B SoC,
the JZ4775 SoC, and the JZ4780 SoC from Ingenic.
Signed-off-by: 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com>
---
.../bindings/remoteproc/ingenic,vpu.yaml | 74 ++++++++++++++++------
1 file changed, 56 insertions(+), 18 deletions(-)
diff --git a/Documentation/devicetree/bindings/remoteproc/ingenic,vpu.yaml b/Documentation/devicetree/bindings/remoteproc/ingenic,vpu.yaml
index d0aa91b..6154596 100644
--- a/Documentation/devicetree/bindings/remoteproc/ingenic,vpu.yaml
+++ b/Documentation/devicetree/bindings/remoteproc/ingenic,vpu.yaml
@@ -17,31 +17,52 @@ maintainers:
properties:
compatible:
- const: ingenic,jz4770-vpu-rproc
+ enum:
+ - ingenic,jz4760-vpu-rproc
+ - ingenic,jz4760b-vpu-rproc
+ - ingenic,jz4770-vpu-rproc
+ - ingenic,jz4775-vpu-rproc
+ - ingenic,jz4780-vpu-rproc
reg:
- items:
- - description: aux registers
- - description: tcsm0 registers
- - description: tcsm1 registers
- - description: sram registers
+ oneOf:
+ - items:
+ - description: aux registers
+ - description: tcsm0 registers
+ - description: tcsm1 registers
+ - description: sram registers
+ - items:
+ - description: aux registers
+ - description: tcsm registers
+ - description: sram registers
reg-names:
- items:
- - const: aux
- - const: tcsm0
- - const: tcsm1
- - const: sram
+ oneOf:
+ - items:
+ - const: aux
+ - const: tcsm0
+ - const: tcsm1
+ - const: sram
+ - items:
+ - const: aux
+ - const: tcsm
+ - const: sram
clocks:
- items:
- - description: aux clock
- - description: vpu clock
+ oneOf:
+ - items:
+ - description: aux clock
+ - description: vpu clock
+ - items:
+ - description: vpu clock
clock-names:
- items:
- - const: aux
- - const: vpu
+ oneOf:
+ - items:
+ - const: aux
+ - const: vpu
+ - items:
+ - const: vpu
interrupts:
maxItems: 1
@@ -60,7 +81,7 @@ examples:
- |
#include <dt-bindings/clock/jz4770-cgu.h>
- vpu: video-decoder@132a0000 {
+ video-decoder@132a0000 {
compatible = "ingenic,jz4770-vpu-rproc";
reg = <0x132a0000 0x20>, /* AUX */
@@ -75,3 +96,20 @@ examples:
interrupt-parent = <&cpuintc>;
interrupts = <3>;
};
+ - |
+ #include <dt-bindings/clock/jz4780-cgu.h>
+
+ video-decoder@132a0000 {
+ compatible = "ingenic,jz4780-vpu-rproc";
+
+ reg = <0x132a0000 0x20>, /* AUX */
+ <0x132c0000 0x8000>, /* TCSM */
+ <0x132f0000 0x4000>; /* SRAM */
+ reg-names = "aux", "tcsm", "sram";
+
+ clocks = <&cgu JZ4780_CLK_VPU>;
+ clock-names = "vpu";
+
+ interrupt-parent = <&intc>;
+ interrupts = <62>;
+ };
--
2.7.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/2] remoteproc: Ingenic: Add support for new Ingenic SoCs.
2021-07-24 9:11 [PATCH 0/2] Add VPU support for new Ingenic SoCs 周琰杰 (Zhou Yanjie)
2021-07-24 9:11 ` [PATCH 1/2] dt-bindings: remoteproc: Add bindings " 周琰杰 (Zhou Yanjie)
@ 2021-07-24 9:11 ` 周琰杰 (Zhou Yanjie)
2021-07-24 11:15 ` Paul Cercueil
` (2 more replies)
1 sibling, 3 replies; 9+ messages in thread
From: 周琰杰 (Zhou Yanjie) @ 2021-07-24 9:11 UTC (permalink / raw)
To: ohad, bjorn.andersson, mathieu.poirier, robh+dt, paul
Cc: devicetree, linux-remoteproc, linux-mips, linux-kernel,
dongsheng.qiu, aric.pzqi, rick.tyliu, sihui.liu, jun.jiang,
sernia.zhou
Add support for probing the ingenic_rproc driver on the JZ4760 SoC,
the JZ4760B SoC, the JZ4775 SoC, and the JZ4780 SoC from Ingenic.
Signed-off-by: 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com>
---
drivers/remoteproc/ingenic_rproc.c | 115 +++++++++++++++++++++++++++++--------
1 file changed, 91 insertions(+), 24 deletions(-)
diff --git a/drivers/remoteproc/ingenic_rproc.c b/drivers/remoteproc/ingenic_rproc.c
index a356738..6a2e864 100644
--- a/drivers/remoteproc/ingenic_rproc.c
+++ b/drivers/remoteproc/ingenic_rproc.c
@@ -2,6 +2,7 @@
/*
* Ingenic JZ47xx remoteproc driver
* Copyright 2019, Paul Cercueil <paul@crapouillou.net>
+ * Copyright 2021, 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com>
*/
#include <linux/bitops.h>
@@ -17,7 +18,7 @@
#define REG_AUX_CTRL 0x0
#define REG_AUX_MSG_ACK 0x10
-#define REG_AUX_MSG 0x14
+#define REG_AUX_MSG 0x14
#define REG_CORE_MSG_ACK 0x18
#define REG_CORE_MSG 0x1C
@@ -32,6 +33,20 @@ module_param(auto_boot, bool, 0400);
MODULE_PARM_DESC(auto_boot,
"Auto-boot the remote processor [default=false]");
+enum ingenic_vpu_version {
+ ID_JZ4760,
+ ID_JZ4770,
+ ID_JZ4775,
+};
+
+struct ingenic_soc_info {
+ enum ingenic_vpu_version version;
+ const struct vpu_mem_map *mem_map;
+
+ unsigned int num_clks;
+ unsigned int num_mems;
+};
+
struct vpu_mem_map {
const char *name;
unsigned int da;
@@ -43,26 +58,21 @@ struct vpu_mem_info {
void __iomem *base;
};
-static const struct vpu_mem_map vpu_mem_map[] = {
- { "tcsm0", 0x132b0000 },
- { "tcsm1", 0xf4000000 },
- { "sram", 0x132f0000 },
-};
-
/**
* struct vpu - Ingenic VPU remoteproc private structure
* @irq: interrupt number
* @clks: pointers to the VPU and AUX clocks
* @aux_base: raw pointer to the AUX interface registers
- * @mem_info: array of struct vpu_mem_info, which contain the mapping info of
+ * @mem_info: pointers to the struct vpu_mem_info, which contain the mapping info of
* each of the external memories
* @dev: private pointer to the device
*/
struct vpu {
int irq;
- struct clk_bulk_data clks[2];
void __iomem *aux_base;
- struct vpu_mem_info mem_info[ARRAY_SIZE(vpu_mem_map)];
+ const struct ingenic_soc_info *soc_info;
+ struct clk_bulk_data *clks;
+ struct vpu_mem_info *mem_info;
struct device *dev;
};
@@ -72,7 +82,7 @@ static int ingenic_rproc_prepare(struct rproc *rproc)
int ret;
/* The clocks must be enabled for the firmware to be loaded in TCSM */
- ret = clk_bulk_prepare_enable(ARRAY_SIZE(vpu->clks), vpu->clks);
+ ret = clk_bulk_prepare_enable(vpu->soc_info->num_clks, vpu->clks);
if (ret)
dev_err(vpu->dev, "Unable to start clocks: %d\n", ret);
@@ -83,7 +93,7 @@ static int ingenic_rproc_unprepare(struct rproc *rproc)
{
struct vpu *vpu = rproc->priv;
- clk_bulk_disable_unprepare(ARRAY_SIZE(vpu->clks), vpu->clks);
+ clk_bulk_disable_unprepare(vpu->soc_info->num_clks, vpu->clks);
return 0;
}
@@ -127,7 +137,7 @@ static void *ingenic_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len, boo
void __iomem *va = NULL;
unsigned int i;
- for (i = 0; i < ARRAY_SIZE(vpu_mem_map); i++) {
+ for (i = 0; i < vpu->soc_info->num_mems; i++) {
const struct vpu_mem_info *info = &vpu->mem_info[i];
const struct vpu_mem_map *map = info->map;
@@ -163,8 +173,60 @@ static irqreturn_t vpu_interrupt(int irq, void *data)
return rproc_vq_interrupt(rproc, vring);
}
+static const struct vpu_mem_map jz4760_vpu_mem_map[] = {
+ { "tcsm0", 0x132b0000 },
+ { "tcsm1", 0xf4000000 },
+ { "sram", 0x132d0000 },
+};
+
+static const struct vpu_mem_map jz4770_vpu_mem_map[] = {
+ { "tcsm0", 0x132b0000 },
+ { "tcsm1", 0xf4000000 },
+ { "sram", 0x132f0000 },
+};
+
+static const struct vpu_mem_map jz4775_vpu_mem_map[] = {
+ { "tcsm", 0xf4000000 },
+ { "sram", 0x132f0000 },
+};
+
+static const struct ingenic_soc_info jz4760_soc_info = {
+ .version = ID_JZ4760,
+ .mem_map = jz4760_vpu_mem_map,
+
+ .num_clks = 2,
+ .num_mems = 3,
+};
+
+static const struct ingenic_soc_info jz4770_soc_info = {
+ .version = ID_JZ4770,
+ .mem_map = jz4770_vpu_mem_map,
+
+ .num_clks = 2,
+ .num_mems = 3,
+};
+
+static const struct ingenic_soc_info jz4775_soc_info = {
+ .version = ID_JZ4775,
+ .mem_map = jz4775_vpu_mem_map,
+
+ .num_clks = 1,
+ .num_mems = 2,
+};
+
+static const struct of_device_id ingenic_rproc_of_matches[] = {
+ { .compatible = "ingenic,jz4760-vpu-rproc", .data = &jz4760_soc_info },
+ { .compatible = "ingenic,jz4760b-vpu-rproc", .data = &jz4760_soc_info },
+ { .compatible = "ingenic,jz4770-vpu-rproc", .data = &jz4770_soc_info },
+ { .compatible = "ingenic,jz4775-vpu-rproc", .data = &jz4775_soc_info },
+ { .compatible = "ingenic,jz4780-vpu-rproc", .data = &jz4775_soc_info },
+ {}
+};
+MODULE_DEVICE_TABLE(of, ingenic_rproc_of_matches);
+
static int ingenic_rproc_probe(struct platform_device *pdev)
{
+ const struct of_device_id *id = of_match_node(ingenic_rproc_of_matches, pdev->dev.of_node);
struct device *dev = &pdev->dev;
struct resource *mem;
struct rproc *rproc;
@@ -181,6 +243,7 @@ static int ingenic_rproc_probe(struct platform_device *pdev)
vpu = rproc->priv;
vpu->dev = &pdev->dev;
+ vpu->soc_info = id->data;
platform_set_drvdata(pdev, vpu);
mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "aux");
@@ -190,9 +253,13 @@ static int ingenic_rproc_probe(struct platform_device *pdev)
return PTR_ERR(vpu->aux_base);
}
- for (i = 0; i < ARRAY_SIZE(vpu_mem_map); i++) {
+ vpu->mem_info = kzalloc(sizeof(struct vpu_mem_info) * vpu->soc_info->num_mems, GFP_KERNEL);
+ if (!vpu->mem_info)
+ return -ENOMEM;
+
+ for (i = 0; i < vpu->soc_info->num_mems; i++) {
mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
- vpu_mem_map[i].name);
+ vpu->soc_info->mem_map[i].name);
vpu->mem_info[i].base = devm_ioremap_resource(dev, mem);
if (IS_ERR(vpu->mem_info[i].base)) {
@@ -202,13 +269,19 @@ static int ingenic_rproc_probe(struct platform_device *pdev)
}
vpu->mem_info[i].len = resource_size(mem);
- vpu->mem_info[i].map = &vpu_mem_map[i];
+ vpu->mem_info[i].map = &vpu->soc_info->mem_map[i];
}
+ vpu->clks = kzalloc(sizeof(struct clk_bulk_data) * vpu->soc_info->num_clks, GFP_KERNEL);
+ if (!vpu->clks)
+ return -ENOMEM;
+
vpu->clks[0].id = "vpu";
- vpu->clks[1].id = "aux";
- ret = devm_clk_bulk_get(dev, ARRAY_SIZE(vpu->clks), vpu->clks);
+ if (vpu->soc_info->version == ID_JZ4770)
+ vpu->clks[1].id = "aux";
+
+ ret = devm_clk_bulk_get(dev, vpu->soc_info->num_clks, vpu->clks);
if (ret) {
dev_err(dev, "Failed to get clocks\n");
return ret;
@@ -235,12 +308,6 @@ static int ingenic_rproc_probe(struct platform_device *pdev)
return 0;
}
-static const struct of_device_id ingenic_rproc_of_matches[] = {
- { .compatible = "ingenic,jz4770-vpu-rproc", },
- {}
-};
-MODULE_DEVICE_TABLE(of, ingenic_rproc_of_matches);
-
static struct platform_driver ingenic_rproc_driver = {
.probe = ingenic_rproc_probe,
.driver = {
--
2.7.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] dt-bindings: remoteproc: Add bindings for new Ingenic SoCs.
2021-07-24 9:11 ` [PATCH 1/2] dt-bindings: remoteproc: Add bindings " 周琰杰 (Zhou Yanjie)
@ 2021-07-24 11:02 ` Paul Cercueil
2021-07-24 13:06 ` Zhou Yanjie
0 siblings, 1 reply; 9+ messages in thread
From: Paul Cercueil @ 2021-07-24 11:02 UTC (permalink / raw)
To: 周琰杰
Cc: ohad, bjorn.andersson, mathieu.poirier, robh+dt, devicetree,
linux-remoteproc, linux-mips, linux-kernel, dongsheng.qiu,
aric.pzqi, rick.tyliu, sihui.liu, jun.jiang, sernia.zhou
Hi Zhou,
Le sam., juil. 24 2021 at 17:11:37 +0800, 周琰杰 (Zhou Yanjie)
<zhouyanjie@wanyeetech.com> a écrit :
> Add the remoteproc bindings for the JZ4760 SoC, the JZ4760B SoC,
> the JZ4775 SoC, and the JZ4780 SoC from Ingenic.
>
> Signed-off-by: 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com>
> ---
> .../bindings/remoteproc/ingenic,vpu.yaml | 74
> ++++++++++++++++------
> 1 file changed, 56 insertions(+), 18 deletions(-)
>
> diff --git
> a/Documentation/devicetree/bindings/remoteproc/ingenic,vpu.yaml
> b/Documentation/devicetree/bindings/remoteproc/ingenic,vpu.yaml
> index d0aa91b..6154596 100644
> --- a/Documentation/devicetree/bindings/remoteproc/ingenic,vpu.yaml
> +++ b/Documentation/devicetree/bindings/remoteproc/ingenic,vpu.yaml
> @@ -17,31 +17,52 @@ maintainers:
>
> properties:
> compatible:
> - const: ingenic,jz4770-vpu-rproc
> + enum:
> + - ingenic,jz4760-vpu-rproc
> + - ingenic,jz4760b-vpu-rproc
> + - ingenic,jz4770-vpu-rproc
> + - ingenic,jz4775-vpu-rproc
> + - ingenic,jz4780-vpu-rproc
>
> reg:
> - items:
> - - description: aux registers
> - - description: tcsm0 registers
> - - description: tcsm1 registers
> - - description: sram registers
> + oneOf:
> + - items:
> + - description: aux registers
> + - description: tcsm0 registers
> + - description: tcsm1 registers
> + - description: sram registers
> + - items:
> + - description: aux registers
> + - description: tcsm registers
> + - description: sram registers
Since we have "reg-names" already, we don't really need any
description, so you could just have:
reg:
minItems: 3
maxItems: 4
>
> reg-names:
> - items:
> - - const: aux
> - - const: tcsm0
> - - const: tcsm1
> - - const: sram
> + oneOf:
> + - items:
> + - const: aux
> + - const: tcsm0
> + - const: tcsm1
> + - const: sram
> + - items:
> + - const: aux
> + - const: tcsm
> + - const: sram
You could just add "tcsm" to the items list, and add:
minItems: 3
maxItems: 4
>
> clocks:
> - items:
> - - description: aux clock
> - - description: vpu clock
> + oneOf:
> + - items:
> + - description: aux clock
> + - description: vpu clock
> + - items:
> + - description: vpu clock
Same as above, since we already have clock-names, the descriptions
don't bring much.
You can replace with:
clocks:
minItems: 1
maxItems: 2
>
> clock-names:
> - items:
> - - const: aux
> - - const: vpu
> + oneOf:
> + - items:
> + - const: aux
> + - const: vpu
> + - items:
> + - const: vpu
I think you could just add:
minItems: 1
Cheers,
-Paul
>
> interrupts:
> maxItems: 1
> @@ -60,7 +81,7 @@ examples:
> - |
> #include <dt-bindings/clock/jz4770-cgu.h>
>
> - vpu: video-decoder@132a0000 {
> + video-decoder@132a0000 {
> compatible = "ingenic,jz4770-vpu-rproc";
>
> reg = <0x132a0000 0x20>, /* AUX */
> @@ -75,3 +96,20 @@ examples:
> interrupt-parent = <&cpuintc>;
> interrupts = <3>;
> };
> + - |
> + #include <dt-bindings/clock/jz4780-cgu.h>
> +
> + video-decoder@132a0000 {
> + compatible = "ingenic,jz4780-vpu-rproc";
> +
> + reg = <0x132a0000 0x20>, /* AUX */
> + <0x132c0000 0x8000>, /* TCSM */
> + <0x132f0000 0x4000>; /* SRAM */
> + reg-names = "aux", "tcsm", "sram";
> +
> + clocks = <&cgu JZ4780_CLK_VPU>;
> + clock-names = "vpu";
> +
> + interrupt-parent = <&intc>;
> + interrupts = <62>;
> + };
> --
> 2.7.4
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] remoteproc: Ingenic: Add support for new Ingenic SoCs.
2021-07-24 9:11 ` [PATCH 2/2] remoteproc: Ingenic: Add support " 周琰杰 (Zhou Yanjie)
@ 2021-07-24 11:15 ` Paul Cercueil
2021-07-24 13:32 ` Zhou Yanjie
2021-07-24 19:30 ` kernel test robot
2021-07-25 1:26 ` kernel test robot
2 siblings, 1 reply; 9+ messages in thread
From: Paul Cercueil @ 2021-07-24 11:15 UTC (permalink / raw)
To: 周琰杰
Cc: ohad, bjorn.andersson, mathieu.poirier, robh+dt, devicetree,
linux-remoteproc, linux-mips, linux-kernel, dongsheng.qiu,
aric.pzqi, rick.tyliu, sihui.liu, jun.jiang, sernia.zhou
Hi Zhou,
Le sam., juil. 24 2021 at 17:11:38 +0800, 周琰杰 (Zhou Yanjie)
<zhouyanjie@wanyeetech.com> a écrit :
> Add support for probing the ingenic_rproc driver on the JZ4760 SoC,
> the JZ4760B SoC, the JZ4775 SoC, and the JZ4780 SoC from Ingenic.
>
> Signed-off-by: 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com>
> ---
> drivers/remoteproc/ingenic_rproc.c | 115
> +++++++++++++++++++++++++++++--------
> 1 file changed, 91 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/remoteproc/ingenic_rproc.c
> b/drivers/remoteproc/ingenic_rproc.c
> index a356738..6a2e864 100644
> --- a/drivers/remoteproc/ingenic_rproc.c
> +++ b/drivers/remoteproc/ingenic_rproc.c
> @@ -2,6 +2,7 @@
> /*
> * Ingenic JZ47xx remoteproc driver
> * Copyright 2019, Paul Cercueil <paul@crapouillou.net>
> + * Copyright 2021, 周琰杰 (Zhou Yanjie)
> <zhouyanjie@wanyeetech.com>
> */
>
> #include <linux/bitops.h>
> @@ -17,7 +18,7 @@
>
> #define REG_AUX_CTRL 0x0
> #define REG_AUX_MSG_ACK 0x10
> -#define REG_AUX_MSG 0x14
> +#define REG_AUX_MSG 0x14
> #define REG_CORE_MSG_ACK 0x18
> #define REG_CORE_MSG 0x1C
>
> @@ -32,6 +33,20 @@ module_param(auto_boot, bool, 0400);
> MODULE_PARM_DESC(auto_boot,
> "Auto-boot the remote processor [default=false]");
>
> +enum ingenic_vpu_version {
> + ID_JZ4760,
> + ID_JZ4770,
> + ID_JZ4775,
> +};
The "version" field of ingenic_so_cinfo is not used anywhere, so you
can drop this enum completely.
> +
> +struct ingenic_soc_info {
> + enum ingenic_vpu_version version;
> + const struct vpu_mem_map *mem_map;
> +
> + unsigned int num_clks;
> + unsigned int num_mems;
> +};
> +
> struct vpu_mem_map {
> const char *name;
> unsigned int da;
> @@ -43,26 +58,21 @@ struct vpu_mem_info {
> void __iomem *base;
> };
>
> -static const struct vpu_mem_map vpu_mem_map[] = {
> - { "tcsm0", 0x132b0000 },
> - { "tcsm1", 0xf4000000 },
> - { "sram", 0x132f0000 },
> -};
> -
> /**
> * struct vpu - Ingenic VPU remoteproc private structure
> * @irq: interrupt number
> * @clks: pointers to the VPU and AUX clocks
> * @aux_base: raw pointer to the AUX interface registers
> - * @mem_info: array of struct vpu_mem_info, which contain the
> mapping info of
> + * @mem_info: pointers to the struct vpu_mem_info, which contain the
> mapping info of
> * each of the external memories
> * @dev: private pointer to the device
> */
> struct vpu {
> int irq;
> - struct clk_bulk_data clks[2];
> void __iomem *aux_base;
> - struct vpu_mem_info mem_info[ARRAY_SIZE(vpu_mem_map)];
> + const struct ingenic_soc_info *soc_info;
> + struct clk_bulk_data *clks;
> + struct vpu_mem_info *mem_info;
> struct device *dev;
> };
>
> @@ -72,7 +82,7 @@ static int ingenic_rproc_prepare(struct rproc
> *rproc)
> int ret;
>
> /* The clocks must be enabled for the firmware to be loaded in TCSM
> */
> - ret = clk_bulk_prepare_enable(ARRAY_SIZE(vpu->clks), vpu->clks);
> + ret = clk_bulk_prepare_enable(vpu->soc_info->num_clks, vpu->clks);
> if (ret)
> dev_err(vpu->dev, "Unable to start clocks: %d\n", ret);
>
> @@ -83,7 +93,7 @@ static int ingenic_rproc_unprepare(struct rproc
> *rproc)
> {
> struct vpu *vpu = rproc->priv;
>
> - clk_bulk_disable_unprepare(ARRAY_SIZE(vpu->clks), vpu->clks);
> + clk_bulk_disable_unprepare(vpu->soc_info->num_clks, vpu->clks);
>
> return 0;
> }
> @@ -127,7 +137,7 @@ static void *ingenic_rproc_da_to_va(struct rproc
> *rproc, u64 da, size_t len, boo
> void __iomem *va = NULL;
> unsigned int i;
>
> - for (i = 0; i < ARRAY_SIZE(vpu_mem_map); i++) {
> + for (i = 0; i < vpu->soc_info->num_mems; i++) {
> const struct vpu_mem_info *info = &vpu->mem_info[i];
> const struct vpu_mem_map *map = info->map;
>
> @@ -163,8 +173,60 @@ static irqreturn_t vpu_interrupt(int irq, void
> *data)
> return rproc_vq_interrupt(rproc, vring);
> }
>
> +static const struct vpu_mem_map jz4760_vpu_mem_map[] = {
> + { "tcsm0", 0x132b0000 },
> + { "tcsm1", 0xf4000000 },
> + { "sram", 0x132d0000 },
> +};
> +
> +static const struct vpu_mem_map jz4770_vpu_mem_map[] = {
> + { "tcsm0", 0x132b0000 },
> + { "tcsm1", 0xf4000000 },
> + { "sram", 0x132f0000 },
> +};
> +
> +static const struct vpu_mem_map jz4775_vpu_mem_map[] = {
> + { "tcsm", 0xf4000000 },
> + { "sram", 0x132f0000 },
> +};
> +
> +static const struct ingenic_soc_info jz4760_soc_info = {
> + .version = ID_JZ4760,
> + .mem_map = jz4760_vpu_mem_map,
> +
> + .num_clks = 2,
> + .num_mems = 3,
.num_mems = ARRAY_SIZE(jz4760_vpu_mem_map),
And the same for the other ingenic_soc_info below.
> +};
> +
> +static const struct ingenic_soc_info jz4770_soc_info = {
> + .version = ID_JZ4770,
> + .mem_map = jz4770_vpu_mem_map,
> +
> + .num_clks = 2,
> + .num_mems = 3,
> +};
> +
> +static const struct ingenic_soc_info jz4775_soc_info = {
> + .version = ID_JZ4775,
> + .mem_map = jz4775_vpu_mem_map,
> +
> + .num_clks = 1,
> + .num_mems = 2,
> +};
> +
> +static const struct of_device_id ingenic_rproc_of_matches[] = {
> + { .compatible = "ingenic,jz4760-vpu-rproc", .data =
> &jz4760_soc_info },
> + { .compatible = "ingenic,jz4760b-vpu-rproc", .data =
> &jz4760_soc_info },
> + { .compatible = "ingenic,jz4770-vpu-rproc", .data =
> &jz4770_soc_info },
> + { .compatible = "ingenic,jz4775-vpu-rproc", .data =
> &jz4775_soc_info },
> + { .compatible = "ingenic,jz4780-vpu-rproc", .data =
> &jz4775_soc_info },
> + {}
> +};
> +MODULE_DEVICE_TABLE(of, ingenic_rproc_of_matches);
> +
> static int ingenic_rproc_probe(struct platform_device *pdev)
> {
> + const struct of_device_id *id =
> of_match_node(ingenic_rproc_of_matches, pdev->dev.of_node);
> struct device *dev = &pdev->dev;
> struct resource *mem;
> struct rproc *rproc;
> @@ -181,6 +243,7 @@ static int ingenic_rproc_probe(struct
> platform_device *pdev)
>
> vpu = rproc->priv;
> vpu->dev = &pdev->dev;
> + vpu->soc_info = id->data;
Use of_device_get_match_data(dev).
Then you can get rid of the "id" variable, and you won't have to move
the "ingenic_rproc_of_matches" array.
> platform_set_drvdata(pdev, vpu);
>
> mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "aux");
> @@ -190,9 +253,13 @@ static int ingenic_rproc_probe(struct
> platform_device *pdev)
> return PTR_ERR(vpu->aux_base);
> }
>
> - for (i = 0; i < ARRAY_SIZE(vpu_mem_map); i++) {
> + vpu->mem_info = kzalloc(sizeof(struct vpu_mem_info) *
> vpu->soc_info->num_mems, GFP_KERNEL);
You are leaking memory here.
Also, why not just fix the current mem_info array size to 3? That
sounds way simpler.
> + if (!vpu->mem_info)
> + return -ENOMEM;
> +
> + for (i = 0; i < vpu->soc_info->num_mems; i++) {
> mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
> - vpu_mem_map[i].name);
> + vpu->soc_info->mem_map[i].name);
>
> vpu->mem_info[i].base = devm_ioremap_resource(dev, mem);
> if (IS_ERR(vpu->mem_info[i].base)) {
> @@ -202,13 +269,19 @@ static int ingenic_rproc_probe(struct
> platform_device *pdev)
> }
>
> vpu->mem_info[i].len = resource_size(mem);
> - vpu->mem_info[i].map = &vpu_mem_map[i];
> + vpu->mem_info[i].map = &vpu->soc_info->mem_map[i];
> }
>
> + vpu->clks = kzalloc(sizeof(struct clk_bulk_data) *
> vpu->soc_info->num_clks, GFP_KERNEL);
Same here, the "clks" array is already size 2, so it won't be a problem
if you have only one clock. No need to alloc "clks" dynamically.
> + if (!vpu->clks)
> + return -ENOMEM;
> +
> vpu->clks[0].id = "vpu";
> - vpu->clks[1].id = "aux";
>
> - ret = devm_clk_bulk_get(dev, ARRAY_SIZE(vpu->clks), vpu->clks);
> + if (vpu->soc_info->version == ID_JZ4770)
> + vpu->clks[1].id = "aux";
> +
> + ret = devm_clk_bulk_get(dev, vpu->soc_info->num_clks, vpu->clks);
> if (ret) {
> dev_err(dev, "Failed to get clocks\n");
> return ret;
> @@ -235,12 +308,6 @@ static int ingenic_rproc_probe(struct
> platform_device *pdev)
> return 0;
> }
>
> -static const struct of_device_id ingenic_rproc_of_matches[] = {
> - { .compatible = "ingenic,jz4770-vpu-rproc", },
> - {}
> -};
> -MODULE_DEVICE_TABLE(of, ingenic_rproc_of_matches);
As I wrote above - you don't need to move this.
Cheers,
-Paul
> -
> static struct platform_driver ingenic_rproc_driver = {
> .probe = ingenic_rproc_probe,
> .driver = {
> --
> 2.7.4
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] dt-bindings: remoteproc: Add bindings for new Ingenic SoCs.
2021-07-24 11:02 ` Paul Cercueil
@ 2021-07-24 13:06 ` Zhou Yanjie
0 siblings, 0 replies; 9+ messages in thread
From: Zhou Yanjie @ 2021-07-24 13:06 UTC (permalink / raw)
To: Paul Cercueil
Cc: ohad, bjorn.andersson, mathieu.poirier, robh+dt, devicetree,
linux-remoteproc, linux-mips, linux-kernel, dongsheng.qiu,
aric.pzqi, rick.tyliu, sihui.liu, jun.jiang, sernia.zhou
Hi Paul,
On 2021/7/24 下午7:02, Paul Cercueil wrote:
> Hi Zhou,
>
> Le sam., juil. 24 2021 at 17:11:37 +0800, 周琰杰 (Zhou Yanjie)
> <zhouyanjie@wanyeetech.com> a écrit :
>> Add the remoteproc bindings for the JZ4760 SoC, the JZ4760B SoC,
>> the JZ4775 SoC, and the JZ4780 SoC from Ingenic.
>>
>> Signed-off-by: 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com>
>> ---
>> .../bindings/remoteproc/ingenic,vpu.yaml | 74
>> ++++++++++++++++------
>> 1 file changed, 56 insertions(+), 18 deletions(-)
>>
>> diff --git
>> a/Documentation/devicetree/bindings/remoteproc/ingenic,vpu.yaml
>> b/Documentation/devicetree/bindings/remoteproc/ingenic,vpu.yaml
>> index d0aa91b..6154596 100644
>> --- a/Documentation/devicetree/bindings/remoteproc/ingenic,vpu.yaml
>> +++ b/Documentation/devicetree/bindings/remoteproc/ingenic,vpu.yaml
>> @@ -17,31 +17,52 @@ maintainers:
>>
>> properties:
>> compatible:
>> - const: ingenic,jz4770-vpu-rproc
>> + enum:
>> + - ingenic,jz4760-vpu-rproc
>> + - ingenic,jz4760b-vpu-rproc
>> + - ingenic,jz4770-vpu-rproc
>> + - ingenic,jz4775-vpu-rproc
>> + - ingenic,jz4780-vpu-rproc
>>
>> reg:
>> - items:
>> - - description: aux registers
>> - - description: tcsm0 registers
>> - - description: tcsm1 registers
>> - - description: sram registers
>> + oneOf:
>> + - items:
>> + - description: aux registers
>> + - description: tcsm0 registers
>> + - description: tcsm1 registers
>> + - description: sram registers
>> + - items:
>> + - description: aux registers
>> + - description: tcsm registers
>> + - description: sram registers
>
> Since we have "reg-names" already, we don't really need any
> description, so you could just have:
>
> reg:
> minItems: 3
> maxItems: 4
Sure, I will do it in the next version.
>
>>
>> reg-names:
>> - items:
>> - - const: aux
>> - - const: tcsm0
>> - - const: tcsm1
>> - - const: sram
>> + oneOf:
>> + - items:
>> + - const: aux
>> + - const: tcsm0
>> + - const: tcsm1
>> + - const: sram
>> + - items:
>> + - const: aux
>> + - const: tcsm
>> + - const: sram
>
> You could just add "tcsm" to the items list, and add:
> minItems: 3
> maxItems: 4
Sure.
>
>>
>> clocks:
>> - items:
>> - - description: aux clock
>> - - description: vpu clock
>> + oneOf:
>> + - items:
>> + - description: aux clock
>> + - description: vpu clock
>> + - items:
>> + - description: vpu clock
>
> Same as above, since we already have clock-names, the descriptions
> don't bring much.
>
> You can replace with:
>
> clocks:
> minItems: 1
> maxItems: 2
Sure.
>
>>
>> clock-names:
>> - items:
>> - - const: aux
>> - - const: vpu
>> + oneOf:
>> + - items:
>> + - const: aux
>> + - const: vpu
>> + - items:
>> + - const: vpu
>
> I think you could just add:
> minItems: 1
Sure.
Thanks and best regards!
>
> Cheers,
> -Paul
>
>>
>> interrupts:
>> maxItems: 1
>> @@ -60,7 +81,7 @@ examples:
>> - |
>> #include <dt-bindings/clock/jz4770-cgu.h>
>>
>> - vpu: video-decoder@132a0000 {
>> + video-decoder@132a0000 {
>> compatible = "ingenic,jz4770-vpu-rproc";
>>
>> reg = <0x132a0000 0x20>, /* AUX */
>> @@ -75,3 +96,20 @@ examples:
>> interrupt-parent = <&cpuintc>;
>> interrupts = <3>;
>> };
>> + - |
>> + #include <dt-bindings/clock/jz4780-cgu.h>
>> +
>> + video-decoder@132a0000 {
>> + compatible = "ingenic,jz4780-vpu-rproc";
>> +
>> + reg = <0x132a0000 0x20>, /* AUX */
>> + <0x132c0000 0x8000>, /* TCSM */
>> + <0x132f0000 0x4000>; /* SRAM */
>> + reg-names = "aux", "tcsm", "sram";
>> +
>> + clocks = <&cgu JZ4780_CLK_VPU>;
>> + clock-names = "vpu";
>> +
>> + interrupt-parent = <&intc>;
>> + interrupts = <62>;
>> + };
>> --
>> 2.7.4
>>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] remoteproc: Ingenic: Add support for new Ingenic SoCs.
2021-07-24 11:15 ` Paul Cercueil
@ 2021-07-24 13:32 ` Zhou Yanjie
0 siblings, 0 replies; 9+ messages in thread
From: Zhou Yanjie @ 2021-07-24 13:32 UTC (permalink / raw)
To: Paul Cercueil
Cc: ohad, bjorn.andersson, mathieu.poirier, robh+dt, devicetree,
linux-remoteproc, linux-mips, linux-kernel, dongsheng.qiu,
aric.pzqi, rick.tyliu, sihui.liu, jun.jiang, sernia.zhou
Hi Paul,
On 2021/7/24 下午7:15, Paul Cercueil wrote:
> Hi Zhou,
>
> Le sam., juil. 24 2021 at 17:11:38 +0800, 周琰杰 (Zhou Yanjie)
> <zhouyanjie@wanyeetech.com> a écrit :
>> Add support for probing the ingenic_rproc driver on the JZ4760 SoC,
>> the JZ4760B SoC, the JZ4775 SoC, and the JZ4780 SoC from Ingenic.
>>
>> Signed-off-by: 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com>
>> ---
>> drivers/remoteproc/ingenic_rproc.c | 115
>> +++++++++++++++++++++++++++++--------
>> 1 file changed, 91 insertions(+), 24 deletions(-)
>>
>> diff --git a/drivers/remoteproc/ingenic_rproc.c
>> b/drivers/remoteproc/ingenic_rproc.c
>> index a356738..6a2e864 100644
>> --- a/drivers/remoteproc/ingenic_rproc.c
>> +++ b/drivers/remoteproc/ingenic_rproc.c
>> @@ -2,6 +2,7 @@
>> /*
>> * Ingenic JZ47xx remoteproc driver
>> * Copyright 2019, Paul Cercueil <paul@crapouillou.net>
>> + * Copyright 2021, 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com>
>> */
>>
>> #include <linux/bitops.h>
>> @@ -17,7 +18,7 @@
>>
>> #define REG_AUX_CTRL 0x0
>> #define REG_AUX_MSG_ACK 0x10
>> -#define REG_AUX_MSG 0x14
>> +#define REG_AUX_MSG 0x14
>> #define REG_CORE_MSG_ACK 0x18
>> #define REG_CORE_MSG 0x1C
>>
>> @@ -32,6 +33,20 @@ module_param(auto_boot, bool, 0400);
>> MODULE_PARM_DESC(auto_boot,
>> "Auto-boot the remote processor [default=false]");
>>
>> +enum ingenic_vpu_version {
>> + ID_JZ4760,
>> + ID_JZ4770,
>> + ID_JZ4775,
>> +};
>
> The "version" field of ingenic_so_cinfo is not used anywhere, so you
> can drop this enum completely.
Sure, I will remove it.
>
>> +
>> +struct ingenic_soc_info {
>> + enum ingenic_vpu_version version;
>> + const struct vpu_mem_map *mem_map;
>> +
>> + unsigned int num_clks;
>> + unsigned int num_mems;
>> +};
>> +
>> struct vpu_mem_map {
>> const char *name;
>> unsigned int da;
>> @@ -43,26 +58,21 @@ struct vpu_mem_info {
>> void __iomem *base;
>> };
>>
>> -static const struct vpu_mem_map vpu_mem_map[] = {
>> - { "tcsm0", 0x132b0000 },
>> - { "tcsm1", 0xf4000000 },
>> - { "sram", 0x132f0000 },
>> -};
>> -
>> /**
>> * struct vpu - Ingenic VPU remoteproc private structure
>> * @irq: interrupt number
>> * @clks: pointers to the VPU and AUX clocks
>> * @aux_base: raw pointer to the AUX interface registers
>> - * @mem_info: array of struct vpu_mem_info, which contain the
>> mapping info of
>> + * @mem_info: pointers to the struct vpu_mem_info, which contain the
>> mapping info of
>> * each of the external memories
>> * @dev: private pointer to the device
>> */
>> struct vpu {
>> int irq;
>> - struct clk_bulk_data clks[2];
>> void __iomem *aux_base;
>> - struct vpu_mem_info mem_info[ARRAY_SIZE(vpu_mem_map)];
>> + const struct ingenic_soc_info *soc_info;
>> + struct clk_bulk_data *clks;
>> + struct vpu_mem_info *mem_info;
>> struct device *dev;
>> };
>>
>> @@ -72,7 +82,7 @@ static int ingenic_rproc_prepare(struct rproc *rproc)
>> int ret;
>>
>> /* The clocks must be enabled for the firmware to be loaded in
>> TCSM */
>> - ret = clk_bulk_prepare_enable(ARRAY_SIZE(vpu->clks), vpu->clks);
>> + ret = clk_bulk_prepare_enable(vpu->soc_info->num_clks, vpu->clks);
>> if (ret)
>> dev_err(vpu->dev, "Unable to start clocks: %d\n", ret);
>>
>> @@ -83,7 +93,7 @@ static int ingenic_rproc_unprepare(struct rproc
>> *rproc)
>> {
>> struct vpu *vpu = rproc->priv;
>>
>> - clk_bulk_disable_unprepare(ARRAY_SIZE(vpu->clks), vpu->clks);
>> + clk_bulk_disable_unprepare(vpu->soc_info->num_clks, vpu->clks);
>>
>> return 0;
>> }
>> @@ -127,7 +137,7 @@ static void *ingenic_rproc_da_to_va(struct rproc
>> *rproc, u64 da, size_t len, boo
>> void __iomem *va = NULL;
>> unsigned int i;
>>
>> - for (i = 0; i < ARRAY_SIZE(vpu_mem_map); i++) {
>> + for (i = 0; i < vpu->soc_info->num_mems; i++) {
>> const struct vpu_mem_info *info = &vpu->mem_info[i];
>> const struct vpu_mem_map *map = info->map;
>>
>> @@ -163,8 +173,60 @@ static irqreturn_t vpu_interrupt(int irq, void
>> *data)
>> return rproc_vq_interrupt(rproc, vring);
>> }
>>
>> +static const struct vpu_mem_map jz4760_vpu_mem_map[] = {
>> + { "tcsm0", 0x132b0000 },
>> + { "tcsm1", 0xf4000000 },
>> + { "sram", 0x132d0000 },
>> +};
>> +
>> +static const struct vpu_mem_map jz4770_vpu_mem_map[] = {
>> + { "tcsm0", 0x132b0000 },
>> + { "tcsm1", 0xf4000000 },
>> + { "sram", 0x132f0000 },
>> +};
>> +
>> +static const struct vpu_mem_map jz4775_vpu_mem_map[] = {
>> + { "tcsm", 0xf4000000 },
>> + { "sram", 0x132f0000 },
>> +};
>> +
>> +static const struct ingenic_soc_info jz4760_soc_info = {
>> + .version = ID_JZ4760,
>> + .mem_map = jz4760_vpu_mem_map,
>> +
>> + .num_clks = 2,
>> + .num_mems = 3,
>
> .num_mems = ARRAY_SIZE(jz4760_vpu_mem_map),
>
> And the same for the other ingenic_soc_info below.
Sure.
>
>> +};
>> +
>> +static const struct ingenic_soc_info jz4770_soc_info = {
>> + .version = ID_JZ4770,
>> + .mem_map = jz4770_vpu_mem_map,
>> +
>> + .num_clks = 2,
>> + .num_mems = 3,
>> +};
>> +
>> +static const struct ingenic_soc_info jz4775_soc_info = {
>> + .version = ID_JZ4775,
>> + .mem_map = jz4775_vpu_mem_map,
>> +
>> + .num_clks = 1,
>> + .num_mems = 2,
>> +};
>> +
>> +static const struct of_device_id ingenic_rproc_of_matches[] = {
>> + { .compatible = "ingenic,jz4760-vpu-rproc", .data =
>> &jz4760_soc_info },
>> + { .compatible = "ingenic,jz4760b-vpu-rproc", .data =
>> &jz4760_soc_info },
>> + { .compatible = "ingenic,jz4770-vpu-rproc", .data =
>> &jz4770_soc_info },
>> + { .compatible = "ingenic,jz4775-vpu-rproc", .data =
>> &jz4775_soc_info },
>> + { .compatible = "ingenic,jz4780-vpu-rproc", .data =
>> &jz4775_soc_info },
>> + {}
>> +};
>> +MODULE_DEVICE_TABLE(of, ingenic_rproc_of_matches);
>> +
>> static int ingenic_rproc_probe(struct platform_device *pdev)
>> {
>> + const struct of_device_id *id =
>> of_match_node(ingenic_rproc_of_matches, pdev->dev.of_node);
>> struct device *dev = &pdev->dev;
>> struct resource *mem;
>> struct rproc *rproc;
>> @@ -181,6 +243,7 @@ static int ingenic_rproc_probe(struct
>> platform_device *pdev)
>>
>> vpu = rproc->priv;
>> vpu->dev = &pdev->dev;
>> + vpu->soc_info = id->data;
>
> Use of_device_get_match_data(dev).
>
> Then you can get rid of the "id" variable, and you won't have to move
> the "ingenic_rproc_of_matches" array.
Sure, I will try.
>
>> platform_set_drvdata(pdev, vpu);
>>
>> mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "aux");
>> @@ -190,9 +253,13 @@ static int ingenic_rproc_probe(struct
>> platform_device *pdev)
>> return PTR_ERR(vpu->aux_base);
>> }
>>
>> - for (i = 0; i < ARRAY_SIZE(vpu_mem_map); i++) {
>> + vpu->mem_info = kzalloc(sizeof(struct vpu_mem_info) *
>> vpu->soc_info->num_mems, GFP_KERNEL);
>
> You are leaking memory here.
>
> Also, why not just fix the current mem_info array size to 3? That
> sounds way simpler.
Sure.
>
>> + if (!vpu->mem_info)
>> + return -ENOMEM;
>> +
>> + for (i = 0; i < vpu->soc_info->num_mems; i++) {
>> mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
>> - vpu_mem_map[i].name);
>> + vpu->soc_info->mem_map[i].name);
>>
>> vpu->mem_info[i].base = devm_ioremap_resource(dev, mem);
>> if (IS_ERR(vpu->mem_info[i].base)) {
>> @@ -202,13 +269,19 @@ static int ingenic_rproc_probe(struct
>> platform_device *pdev)
>> }
>>
>> vpu->mem_info[i].len = resource_size(mem);
>> - vpu->mem_info[i].map = &vpu_mem_map[i];
>> + vpu->mem_info[i].map = &vpu->soc_info->mem_map[i];
>> }
>>
>> + vpu->clks = kzalloc(sizeof(struct clk_bulk_data) *
>> vpu->soc_info->num_clks, GFP_KERNEL);
>
> Same here, the "clks" array is already size 2, so it won't be a
> problem if you have only one clock. No need to alloc "clks" dynamically.
Sure.
>
>> + if (!vpu->clks)
>> + return -ENOMEM;
>> +
>> vpu->clks[0].id = "vpu";
>> - vpu->clks[1].id = "aux";
>>
>> - ret = devm_clk_bulk_get(dev, ARRAY_SIZE(vpu->clks), vpu->clks);
>> + if (vpu->soc_info->version == ID_JZ4770)
>> + vpu->clks[1].id = "aux";
>> +
>> + ret = devm_clk_bulk_get(dev, vpu->soc_info->num_clks, vpu->clks);
>> if (ret) {
>> dev_err(dev, "Failed to get clocks\n");
>> return ret;
>> @@ -235,12 +308,6 @@ static int ingenic_rproc_probe(struct
>> platform_device *pdev)
>> return 0;
>> }
>>
>> -static const struct of_device_id ingenic_rproc_of_matches[] = {
>> - { .compatible = "ingenic,jz4770-vpu-rproc", },
>> - {}
>> -};
>> -MODULE_DEVICE_TABLE(of, ingenic_rproc_of_matches);
>
> As I wrote above - you don't need to move this.
Sure.
Thanks and best regards!
>
> Cheers,
> -Paul
>
>> -
>> static struct platform_driver ingenic_rproc_driver = {
>> .probe = ingenic_rproc_probe,
>> .driver = {
>> --
>> 2.7.4
>>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] remoteproc: Ingenic: Add support for new Ingenic SoCs.
2021-07-24 9:11 ` [PATCH 2/2] remoteproc: Ingenic: Add support " 周琰杰 (Zhou Yanjie)
2021-07-24 11:15 ` Paul Cercueil
@ 2021-07-24 19:30 ` kernel test robot
2021-07-25 1:26 ` kernel test robot
2 siblings, 0 replies; 9+ messages in thread
From: kernel test robot @ 2021-07-24 19:30 UTC (permalink / raw)
To: 周琰杰 (Zhou Yanjie),
ohad, bjorn.andersson, mathieu.poirier, robh+dt, paul
Cc: kbuild-all, devicetree, linux-remoteproc, linux-mips,
linux-kernel, dongsheng.qiu
[-- Attachment #1: Type: text/plain, Size: 5389 bytes --]
Hi "周琰杰,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on robh/for-next]
[also build test WARNING on v5.14-rc2 next-20210723]
[cannot apply to remoteproc/for-next rpmsg/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Zhou-Yanjie/Add-VPU-support-for-new-Ingenic-SoCs/20210724-171238
base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
config: sparc-allyesconfig (attached as .config)
compiler: sparc64-linux-gcc (GCC) 10.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/288ce023c75dca6dd232f6166be5a07d5532aad7
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Zhou-Yanjie/Add-VPU-support-for-new-Ingenic-SoCs/20210724-171238
git checkout 288ce023c75dca6dd232f6166be5a07d5532aad7
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-10.3.0 make.cross ARCH=sparc
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
drivers/remoteproc/ingenic_rproc.c: In function 'ingenic_rproc_probe':
drivers/remoteproc/ingenic_rproc.c:256:18: error: implicit declaration of function 'kzalloc'; did you mean 'kvzalloc'? [-Werror=implicit-function-declaration]
256 | vpu->mem_info = kzalloc(sizeof(struct vpu_mem_info) * vpu->soc_info->num_mems, GFP_KERNEL);
| ^~~~~~~
| kvzalloc
>> drivers/remoteproc/ingenic_rproc.c:256:16: warning: assignment to 'struct vpu_mem_info *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
256 | vpu->mem_info = kzalloc(sizeof(struct vpu_mem_info) * vpu->soc_info->num_mems, GFP_KERNEL);
| ^
>> drivers/remoteproc/ingenic_rproc.c:275:12: warning: assignment to 'struct clk_bulk_data *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
275 | vpu->clks = kzalloc(sizeof(struct clk_bulk_data) * vpu->soc_info->num_clks, GFP_KERNEL);
| ^
cc1: some warnings being treated as errors
vim +256 drivers/remoteproc/ingenic_rproc.c
226
227 static int ingenic_rproc_probe(struct platform_device *pdev)
228 {
229 const struct of_device_id *id = of_match_node(ingenic_rproc_of_matches, pdev->dev.of_node);
230 struct device *dev = &pdev->dev;
231 struct resource *mem;
232 struct rproc *rproc;
233 struct vpu *vpu;
234 unsigned int i;
235 int ret;
236
237 rproc = devm_rproc_alloc(dev, "ingenic-vpu",
238 &ingenic_rproc_ops, NULL, sizeof(*vpu));
239 if (!rproc)
240 return -ENOMEM;
241
242 rproc->auto_boot = auto_boot;
243
244 vpu = rproc->priv;
245 vpu->dev = &pdev->dev;
246 vpu->soc_info = id->data;
247 platform_set_drvdata(pdev, vpu);
248
249 mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "aux");
250 vpu->aux_base = devm_ioremap_resource(dev, mem);
251 if (IS_ERR(vpu->aux_base)) {
252 dev_err(dev, "Failed to ioremap\n");
253 return PTR_ERR(vpu->aux_base);
254 }
255
> 256 vpu->mem_info = kzalloc(sizeof(struct vpu_mem_info) * vpu->soc_info->num_mems, GFP_KERNEL);
257 if (!vpu->mem_info)
258 return -ENOMEM;
259
260 for (i = 0; i < vpu->soc_info->num_mems; i++) {
261 mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
262 vpu->soc_info->mem_map[i].name);
263
264 vpu->mem_info[i].base = devm_ioremap_resource(dev, mem);
265 if (IS_ERR(vpu->mem_info[i].base)) {
266 ret = PTR_ERR(vpu->mem_info[i].base);
267 dev_err(dev, "Failed to ioremap\n");
268 return ret;
269 }
270
271 vpu->mem_info[i].len = resource_size(mem);
272 vpu->mem_info[i].map = &vpu->soc_info->mem_map[i];
273 }
274
> 275 vpu->clks = kzalloc(sizeof(struct clk_bulk_data) * vpu->soc_info->num_clks, GFP_KERNEL);
276 if (!vpu->clks)
277 return -ENOMEM;
278
279 vpu->clks[0].id = "vpu";
280
281 if (vpu->soc_info->version == ID_JZ4770)
282 vpu->clks[1].id = "aux";
283
284 ret = devm_clk_bulk_get(dev, vpu->soc_info->num_clks, vpu->clks);
285 if (ret) {
286 dev_err(dev, "Failed to get clocks\n");
287 return ret;
288 }
289
290 vpu->irq = platform_get_irq(pdev, 0);
291 if (vpu->irq < 0)
292 return vpu->irq;
293
294 ret = devm_request_irq(dev, vpu->irq, vpu_interrupt, 0, "VPU", rproc);
295 if (ret < 0) {
296 dev_err(dev, "Failed to request IRQ\n");
297 return ret;
298 }
299
300 disable_irq(vpu->irq);
301
302 ret = devm_rproc_add(dev, rproc);
303 if (ret) {
304 dev_err(dev, "Failed to register remote processor\n");
305 return ret;
306 }
307
308 return 0;
309 }
310
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 69609 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] remoteproc: Ingenic: Add support for new Ingenic SoCs.
2021-07-24 9:11 ` [PATCH 2/2] remoteproc: Ingenic: Add support " 周琰杰 (Zhou Yanjie)
2021-07-24 11:15 ` Paul Cercueil
2021-07-24 19:30 ` kernel test robot
@ 2021-07-25 1:26 ` kernel test robot
2 siblings, 0 replies; 9+ messages in thread
From: kernel test robot @ 2021-07-25 1:26 UTC (permalink / raw)
To: 周琰杰 (Zhou Yanjie),
ohad, bjorn.andersson, mathieu.poirier, robh+dt, paul
Cc: kbuild-all, devicetree, linux-remoteproc, linux-mips,
linux-kernel, dongsheng.qiu
[-- Attachment #1: Type: text/plain, Size: 5379 bytes --]
Hi "周琰杰,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on robh/for-next]
[also build test ERROR on v5.14-rc2 next-20210723]
[cannot apply to remoteproc/for-next rpmsg/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Zhou-Yanjie/Add-VPU-support-for-new-Ingenic-SoCs/20210724-171238
base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
config: sparc-allyesconfig (attached as .config)
compiler: sparc64-linux-gcc (GCC) 10.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/288ce023c75dca6dd232f6166be5a07d5532aad7
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Zhou-Yanjie/Add-VPU-support-for-new-Ingenic-SoCs/20210724-171238
git checkout 288ce023c75dca6dd232f6166be5a07d5532aad7
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-10.3.0 make.cross ARCH=sparc
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
drivers/remoteproc/ingenic_rproc.c: In function 'ingenic_rproc_probe':
>> drivers/remoteproc/ingenic_rproc.c:256:18: error: implicit declaration of function 'kzalloc'; did you mean 'kvzalloc'? [-Werror=implicit-function-declaration]
256 | vpu->mem_info = kzalloc(sizeof(struct vpu_mem_info) * vpu->soc_info->num_mems, GFP_KERNEL);
| ^~~~~~~
| kvzalloc
drivers/remoteproc/ingenic_rproc.c:256:16: warning: assignment to 'struct vpu_mem_info *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
256 | vpu->mem_info = kzalloc(sizeof(struct vpu_mem_info) * vpu->soc_info->num_mems, GFP_KERNEL);
| ^
drivers/remoteproc/ingenic_rproc.c:275:12: warning: assignment to 'struct clk_bulk_data *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
275 | vpu->clks = kzalloc(sizeof(struct clk_bulk_data) * vpu->soc_info->num_clks, GFP_KERNEL);
| ^
cc1: some warnings being treated as errors
vim +256 drivers/remoteproc/ingenic_rproc.c
226
227 static int ingenic_rproc_probe(struct platform_device *pdev)
228 {
229 const struct of_device_id *id = of_match_node(ingenic_rproc_of_matches, pdev->dev.of_node);
230 struct device *dev = &pdev->dev;
231 struct resource *mem;
232 struct rproc *rproc;
233 struct vpu *vpu;
234 unsigned int i;
235 int ret;
236
237 rproc = devm_rproc_alloc(dev, "ingenic-vpu",
238 &ingenic_rproc_ops, NULL, sizeof(*vpu));
239 if (!rproc)
240 return -ENOMEM;
241
242 rproc->auto_boot = auto_boot;
243
244 vpu = rproc->priv;
245 vpu->dev = &pdev->dev;
246 vpu->soc_info = id->data;
247 platform_set_drvdata(pdev, vpu);
248
249 mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "aux");
250 vpu->aux_base = devm_ioremap_resource(dev, mem);
251 if (IS_ERR(vpu->aux_base)) {
252 dev_err(dev, "Failed to ioremap\n");
253 return PTR_ERR(vpu->aux_base);
254 }
255
> 256 vpu->mem_info = kzalloc(sizeof(struct vpu_mem_info) * vpu->soc_info->num_mems, GFP_KERNEL);
257 if (!vpu->mem_info)
258 return -ENOMEM;
259
260 for (i = 0; i < vpu->soc_info->num_mems; i++) {
261 mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
262 vpu->soc_info->mem_map[i].name);
263
264 vpu->mem_info[i].base = devm_ioremap_resource(dev, mem);
265 if (IS_ERR(vpu->mem_info[i].base)) {
266 ret = PTR_ERR(vpu->mem_info[i].base);
267 dev_err(dev, "Failed to ioremap\n");
268 return ret;
269 }
270
271 vpu->mem_info[i].len = resource_size(mem);
272 vpu->mem_info[i].map = &vpu->soc_info->mem_map[i];
273 }
274
275 vpu->clks = kzalloc(sizeof(struct clk_bulk_data) * vpu->soc_info->num_clks, GFP_KERNEL);
276 if (!vpu->clks)
277 return -ENOMEM;
278
279 vpu->clks[0].id = "vpu";
280
281 if (vpu->soc_info->version == ID_JZ4770)
282 vpu->clks[1].id = "aux";
283
284 ret = devm_clk_bulk_get(dev, vpu->soc_info->num_clks, vpu->clks);
285 if (ret) {
286 dev_err(dev, "Failed to get clocks\n");
287 return ret;
288 }
289
290 vpu->irq = platform_get_irq(pdev, 0);
291 if (vpu->irq < 0)
292 return vpu->irq;
293
294 ret = devm_request_irq(dev, vpu->irq, vpu_interrupt, 0, "VPU", rproc);
295 if (ret < 0) {
296 dev_err(dev, "Failed to request IRQ\n");
297 return ret;
298 }
299
300 disable_irq(vpu->irq);
301
302 ret = devm_rproc_add(dev, rproc);
303 if (ret) {
304 dev_err(dev, "Failed to register remote processor\n");
305 return ret;
306 }
307
308 return 0;
309 }
310
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 69609 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2021-07-25 1:27 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-24 9:11 [PATCH 0/2] Add VPU support for new Ingenic SoCs 周琰杰 (Zhou Yanjie)
2021-07-24 9:11 ` [PATCH 1/2] dt-bindings: remoteproc: Add bindings " 周琰杰 (Zhou Yanjie)
2021-07-24 11:02 ` Paul Cercueil
2021-07-24 13:06 ` Zhou Yanjie
2021-07-24 9:11 ` [PATCH 2/2] remoteproc: Ingenic: Add support " 周琰杰 (Zhou Yanjie)
2021-07-24 11:15 ` Paul Cercueil
2021-07-24 13:32 ` Zhou Yanjie
2021-07-24 19:30 ` kernel test robot
2021-07-25 1:26 ` kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).