2018-01-16 19:05:00

by Srinivas Kandagatla

[permalink] [raw]
Subject: [PATCH 0/4] dmaengine: qcom: bam_dma: fixes for remotely controlled bam

From: Srinivas Kandagatla <[email protected]>

Hi Andy,

I did hit few issues while trying out SLIMBus BAM on DB820c, this BAM instance
is remotely controlled and powered up after ADSP is booted using QMI commands.

Firstly some of the master registers are written even when the BAM is remotely
controlled, and secondly reading registers when bam is not ready yet.

These 4 patches address these issues, there are few more issues like doing PM
in simillar usecase, these will be addressed soon.

Thanks,
Srini

Srinivas Kandagatla (4):
dmaengine: qcom: bam_dma: make bam clk optional
dmaengine: qcom: bam_dma: add num-channels binding for remotely
controlled
dmaengine: qcom: bam_dma: do not write to global regs in remote mode
dmaengine: qcom: bam_dma: Add num-ees dt binding for remotely
controlled

.../devicetree/bindings/dma/qcom_bam_dma.txt | 4 ++
drivers/dma/qcom/bam_dma.c | 56 +++++++++++++++-------
2 files changed, 43 insertions(+), 17 deletions(-)

--
2.15.1


2018-01-16 19:07:05

by Srinivas Kandagatla

[permalink] [raw]
Subject: [PATCH 1/4] dmaengine: qcom: bam_dma: make bam clk optional

From: Srinivas Kandagatla <[email protected]>

When BAM is remotely controlled it does not sound correct to control
its clk on Linux side. Make it optional, so that its not madatory
for remote controlled BAM instances.

Signed-off-by: Srinivas Kandagatla <[email protected]>
---
drivers/dma/qcom/bam_dma.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/dma/qcom/bam_dma.c b/drivers/dma/qcom/bam_dma.c
index 03c4eb3fd314..78e488e8f96d 100644
--- a/drivers/dma/qcom/bam_dma.c
+++ b/drivers/dma/qcom/bam_dma.c
@@ -1180,13 +1180,14 @@ static int bam_dma_probe(struct platform_device *pdev)
"qcom,controlled-remotely");

bdev->bamclk = devm_clk_get(bdev->dev, "bam_clk");
- if (IS_ERR(bdev->bamclk))
- return PTR_ERR(bdev->bamclk);
-
- ret = clk_prepare_enable(bdev->bamclk);
- if (ret) {
- dev_err(bdev->dev, "failed to prepare/enable clock\n");
- return ret;
+ if (IS_ERR(bdev->bamclk)) {
+ bdev->bamclk = NULL;
+ } else {
+ ret = clk_prepare_enable(bdev->bamclk);
+ if (ret) {
+ dev_err(bdev->dev, "failed to prepare/enable clock\n");
+ return ret;
+ }
}

ret = bam_init(bdev);
--
2.15.1

2018-01-16 19:07:19

by Srinivas Kandagatla

[permalink] [raw]
Subject: [PATCH 4/4] dmaengine: qcom: bam_dma: Add num-ees dt binding for remotely controlled

From: Srinivas Kandagatla <[email protected]>

When Linux is master of BAM, it can directly read registers to know number
of supported execution enviroments, however when its remotely controlled
reading these registers would trigger a crash if the BAM is not yet
intialized/powered up on the remote side.

This patch adds new binding num-ees to specify supported number of
Execution Environments when BAM is remotely controlled.

Signed-off-by: Srinivas Kandagatla <[email protected]>
---
Documentation/devicetree/bindings/dma/qcom_bam_dma.txt | 2 ++
drivers/dma/qcom/bam_dma.c | 15 ++++++++++++---
2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt b/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
index aa6822cbb230..f0d10c2b393e 100644
--- a/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
+++ b/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
@@ -17,6 +17,8 @@ Required properties:
remote proccessor i.e. execution environment.
- num-channels : optional, indicates supported number of DMA channels in a
remotely controlled bam.
+- num-ees : optional, indicates supported number of Execution Environments in a
+ remotely controlled bam.

Example:

diff --git a/drivers/dma/qcom/bam_dma.c b/drivers/dma/qcom/bam_dma.c
index bbbb755d7549..7a8727271d60 100644
--- a/drivers/dma/qcom/bam_dma.c
+++ b/drivers/dma/qcom/bam_dma.c
@@ -387,6 +387,7 @@ struct bam_device {
struct device_dma_parameters dma_parms;
struct bam_chan *channels;
u32 num_channels;
+ u32 num_ees;

/* execution environment ID, from DT */
u32 ee;
@@ -1079,11 +1080,14 @@ static int bam_init(struct bam_device *bdev)
u32 val;

/* read revision and configuration information */
- val = readl_relaxed(bam_addr(bdev, 0, BAM_REVISION)) >> NUM_EES_SHIFT;
- val &= NUM_EES_MASK;
+ if (!bdev->num_ees) {
+ val = readl_relaxed(bam_addr(bdev, 0, BAM_REVISION)) >> NUM_EES_SHIFT;
+ val &= NUM_EES_MASK;
+ bdev->num_ees = val;
+ }

/* check that configured EE is within range */
- if (bdev->ee >= val)
+ if (bdev->ee >= bdev->num_ees)
return -EINVAL;

if (!bdev->num_channels) {
@@ -1189,6 +1193,11 @@ static int bam_dma_probe(struct platform_device *pdev)
&bdev->num_channels);
if (ret)
dev_err(bdev->dev, "num-channels unspecified in dt\n");
+
+ ret = of_property_read_u32(pdev->dev.of_node, "num-ees",
+ &bdev->num_ees);
+ if (ret)
+ dev_err(bdev->dev, "num-ees unspecified in dt\n");
}

bdev->bamclk = devm_clk_get(bdev->dev, "bam_clk");
--
2.15.1

2018-01-16 19:07:49

by Srinivas Kandagatla

[permalink] [raw]
Subject: [PATCH 3/4] dmaengine: qcom: bam_dma: do not write to global regs in remote mode

From: Srinivas Kandagatla <[email protected]>

BAM_DESC_CNT_TRSHLD register is global register, which can only be written
when BAM is in master mode, So check the mode of operation before writing it.

Without this check SOC's xPU would catch such access and crash the system.
First noticed on DB820c while testing SLIMBus BAM.

Signed-off-by: Srinivas Kandagatla <[email protected]>
---
drivers/dma/qcom/bam_dma.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/dma/qcom/bam_dma.c b/drivers/dma/qcom/bam_dma.c
index 523bd178047a..bbbb755d7549 100644
--- a/drivers/dma/qcom/bam_dma.c
+++ b/drivers/dma/qcom/bam_dma.c
@@ -905,12 +905,15 @@ static void bam_apply_new_config(struct bam_chan *bchan,
struct bam_device *bdev = bchan->bdev;
u32 maxburst;

- if (dir == DMA_DEV_TO_MEM)
- maxburst = bchan->slave.src_maxburst;
- else
- maxburst = bchan->slave.dst_maxburst;
-
- writel_relaxed(maxburst, bam_addr(bdev, 0, BAM_DESC_CNT_TRSHLD));
+ if (!bdev->controlled_remotely) {
+ if (dir == DMA_DEV_TO_MEM)
+ maxburst = bchan->slave.src_maxburst;
+ else
+ maxburst = bchan->slave.dst_maxburst;
+
+ writel_relaxed(maxburst,
+ bam_addr(bdev, 0, BAM_DESC_CNT_TRSHLD));
+ }

bchan->reconfigure = 0;
}
--
2.15.1

2018-01-16 19:08:06

by Srinivas Kandagatla

[permalink] [raw]
Subject: [PATCH 2/4] dmaengine: qcom: bam_dma: add num-channels binding for remotely controlled

From: Srinivas Kandagatla <[email protected]>

When Linux is master of BAM, it can directly read registers to know number
of supported channels, however when its remotely controlled reading these
registers would trigger a crash if the BAM is not yet intialized/powered up
on the remote side.

This patch adds num-channels binding to specify number of supported
dma channels on remotely controlled BAM.

Signed-off-by: Srinivas Kandagatla <[email protected]>
---
Documentation/devicetree/bindings/dma/qcom_bam_dma.txt | 2 ++
drivers/dma/qcom/bam_dma.c | 13 +++++++++++--
2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt b/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
index 9cbf5d9df8fd..aa6822cbb230 100644
--- a/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
+++ b/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
@@ -15,6 +15,8 @@ Required properties:
the secure world.
- qcom,controlled-remotely : optional, indicates that the bam is controlled by
remote proccessor i.e. execution environment.
+- num-channels : optional, indicates supported number of DMA channels in a
+ remotely controlled bam.

Example:

diff --git a/drivers/dma/qcom/bam_dma.c b/drivers/dma/qcom/bam_dma.c
index 78e488e8f96d..523bd178047a 100644
--- a/drivers/dma/qcom/bam_dma.c
+++ b/drivers/dma/qcom/bam_dma.c
@@ -1083,8 +1083,10 @@ static int bam_init(struct bam_device *bdev)
if (bdev->ee >= val)
return -EINVAL;

- val = readl_relaxed(bam_addr(bdev, 0, BAM_NUM_PIPES));
- bdev->num_channels = val & BAM_NUM_PIPES_MASK;
+ if (!bdev->num_channels) {
+ val = readl_relaxed(bam_addr(bdev, 0, BAM_NUM_PIPES));
+ bdev->num_channels = val & BAM_NUM_PIPES_MASK;
+ }

if (bdev->controlled_remotely)
return 0;
@@ -1179,6 +1181,13 @@ static int bam_dma_probe(struct platform_device *pdev)
bdev->controlled_remotely = of_property_read_bool(pdev->dev.of_node,
"qcom,controlled-remotely");

+ if (bdev->controlled_remotely) {
+ ret = of_property_read_u32(pdev->dev.of_node, "num-channels",
+ &bdev->num_channels);
+ if (ret)
+ dev_err(bdev->dev, "num-channels unspecified in dt\n");
+ }
+
bdev->bamclk = devm_clk_get(bdev->dev, "bam_clk");
if (IS_ERR(bdev->bamclk)) {
bdev->bamclk = NULL;
--
2.15.1

2018-01-16 19:38:56

by Sagar Dharia

[permalink] [raw]
Subject: Re: [PATCH 1/4] dmaengine: qcom: bam_dma: make bam clk optional


On 1/16/2018 12:02 PM, [email protected] wrote:
> From: Srinivas Kandagatla <[email protected]>
>
> When BAM is remotely controlled it does not sound correct to control
> its clk on Linux side. Make it optional, so that its not madatory
> for remote controlled BAM instances.
>
> Signed-off-by: Srinivas Kandagatla <[email protected]>
> ---
> drivers/dma/qcom/bam_dma.c | 15 ++++++++-------
> 1 file changed, 8 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/dma/qcom/bam_dma.c b/drivers/dma/qcom/bam_dma.c
> index 03c4eb3fd314..78e488e8f96d 100644
> --- a/drivers/dma/qcom/bam_dma.c
> +++ b/drivers/dma/qcom/bam_dma.c
> @@ -1180,13 +1180,14 @@ static int bam_dma_probe(struct platform_device *pdev)
> "qcom,controlled-remotely");
>
> bdev->bamclk = devm_clk_get(bdev->dev, "bam_clk");
> - if (IS_ERR(bdev->bamclk))
> - return PTR_ERR(bdev->bamclk);
> -
> - ret = clk_prepare_enable(bdev->bamclk);
> - if (ret) {
> - dev_err(bdev->dev, "failed to prepare/enable clock\n");
> - return ret;
> + if (IS_ERR(bdev->bamclk)) {
> + bdev->bamclk = NULL;
> + } else {
> + ret = clk_prepare_enable(bdev->bamclk);
> + if (ret) {
> + dev_err(bdev->dev, "failed to prepare/enable clock\n");
> + return ret;
> + }
I believe you can also keep pm_runtime disabled if BAM is remotely
controlled.

Thanks
Sagar
> }
>
> ret = bam_init(bdev);

2018-01-17 09:46:44

by Srinivas Kandagatla

[permalink] [raw]
Subject: Re: [PATCH 1/4] dmaengine: qcom: bam_dma: make bam clk optional



On 16/01/18 19:38, Sagar Dharia wrote:
>
> On 1/16/2018 12:02 PM, [email protected] wrote:
>> From: Srinivas Kandagatla <[email protected]>
>>
>> When BAM is remotely controlled it does not sound correct to control
>> its clk on Linux side. Make it optional, so that its not madatory
>> for remote controlled BAM instances.
>>
>> Signed-off-by: Srinivas Kandagatla <[email protected]>
>> ---
>> drivers/dma/qcom/bam_dma.c | 15 ++++++++-------
>> 1 file changed, 8 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/dma/qcom/bam_dma.c b/drivers/dma/qcom/bam_dma.c
>> index 03c4eb3fd314..78e488e8f96d 100644
>> --- a/drivers/dma/qcom/bam_dma.c
>> +++ b/drivers/dma/qcom/bam_dma.c
>> @@ -1180,13 +1180,14 @@ static int bam_dma_probe(struct
>> platform_device *pdev)
>> "qcom,controlled-remotely");
>> bdev->bamclk = devm_clk_get(bdev->dev, "bam_clk");
>> - if (IS_ERR(bdev->bamclk))
>> - return PTR_ERR(bdev->bamclk);
>> -
>> - ret = clk_prepare_enable(bdev->bamclk);
>> - if (ret) {
>> - dev_err(bdev->dev, "failed to prepare/enable clock\n");
>> - return ret;
>> + if (IS_ERR(bdev->bamclk)) {
>> + bdev->bamclk = NULL;
>> + } else {
>> + ret = clk_prepare_enable(bdev->bamclk);
>> + if (ret) {
>> + dev_err(bdev->dev, "failed to prepare/enable clock\n");
>> + return ret;
>> + }
> I believe you can also keep pm_runtime disabled if BAM is remotely
> controlled.

Yes, that's another topic which should be fixed too. I will add that
patch in next version.

thanks,
srini
>
> Thanks
> Sagar
>> }
>> ret = bam_init(bdev);
>

2018-01-17 10:14:20

by Vinod Koul

[permalink] [raw]
Subject: Re: [PATCH 0/4] dmaengine: qcom: bam_dma: fixes for remotely controlled bam

On Tue, Jan 16, 2018 at 07:02:32PM +0000, [email protected] wrote:
> From: Srinivas Kandagatla <[email protected]>
>
> Hi Andy,
>
> I did hit few issues while trying out SLIMBus BAM on DB820c, this BAM instance
> is remotely controlled and powered up after ADSP is booted using QMI commands.

What do you mean by "remotely controlled" in this series?

>
> Firstly some of the master registers are written even when the BAM is remotely
> controlled, and secondly reading registers when bam is not ready yet.
>
> These 4 patches address these issues, there are few more issues like doing PM
> in simillar usecase, these will be addressed soon.
>
> Thanks,
> Srini
>
> Srinivas Kandagatla (4):
> dmaengine: qcom: bam_dma: make bam clk optional
> dmaengine: qcom: bam_dma: add num-channels binding for remotely
> controlled
> dmaengine: qcom: bam_dma: do not write to global regs in remote mode
> dmaengine: qcom: bam_dma: Add num-ees dt binding for remotely
> controlled
>
> .../devicetree/bindings/dma/qcom_bam_dma.txt | 4 ++
> drivers/dma/qcom/bam_dma.c | 56 +++++++++++++++-------
> 2 files changed, 43 insertions(+), 17 deletions(-)
>
> --
> 2.15.1
>

--
~Vinod

2018-01-17 10:55:42

by Srinivas Kandagatla

[permalink] [raw]
Subject: Re: [PATCH 0/4] dmaengine: qcom: bam_dma: fixes for remotely controlled bam



On 17/01/18 10:18, Vinod Koul wrote:
> On Tue, Jan 16, 2018 at 07:02:32PM +0000, [email protected] wrote:
>> From: Srinivas Kandagatla <[email protected]>
>>
>> Hi Andy,
>>
>> I did hit few issues while trying out SLIMBus BAM on DB820c, this BAM instance
>> is remotely controlled and powered up after ADSP is booted using QMI commands.
>
> What do you mean by "remotely controlled" in this series?

DMA controller is controlled by the remote processor, which is a DSP in
this case.
Linux side is in remote mode in this setup, this can setup transfer
descriptors and start/stop a transfer. But all the
initialization/powerup part will be done in the remote processor.

--srini

>
>>
>> Firstly some of the master registers are written even when the BAM is remotely
>> controlled, and secondly reading registers when bam is not ready yet.
>>
>> These 4 patches address these issues, there are few more issues like doing PM
>> in simillar usecase, these will be addressed soon.
>>
>> Thanks,
>> Srini
>>
>> Srinivas Kandagatla (4):
>> dmaengine: qcom: bam_dma: make bam clk optional
>> dmaengine: qcom: bam_dma: add num-channels binding for remotely
>> controlled
>> dmaengine: qcom: bam_dma: do not write to global regs in remote mode
>> dmaengine: qcom: bam_dma: Add num-ees dt binding for remotely
>> controlled
>>
>> .../devicetree/bindings/dma/qcom_bam_dma.txt | 4 ++
>> drivers/dma/qcom/bam_dma.c | 56 +++++++++++++++-------
>> 2 files changed, 43 insertions(+), 17 deletions(-)
>>
>> --
>> 2.15.1
>>
>

2018-01-17 15:56:49

by Vinod Koul

[permalink] [raw]
Subject: Re: [PATCH 0/4] dmaengine: qcom: bam_dma: fixes for remotely controlled bam

On Wed, Jan 17, 2018 at 10:55:34AM +0000, Srinivas Kandagatla wrote:
>
>
> On 17/01/18 10:18, Vinod Koul wrote:
> >On Tue, Jan 16, 2018 at 07:02:32PM +0000, [email protected] wrote:
> >>From: Srinivas Kandagatla <[email protected]>
> >>
> >>Hi Andy,
> >>
> >>I did hit few issues while trying out SLIMBus BAM on DB820c, this BAM instance
> >>is remotely controlled and powered up after ADSP is booted using QMI commands.
> >
> >What do you mean by "remotely controlled" in this series?
>
> DMA controller is controlled by the remote processor, which is a DSP in this
> case.
> Linux side is in remote mode in this setup, this can setup transfer
> descriptors and start/stop a transfer. But all the initialization/powerup
> part will be done in the remote processor.

Yeah that was my guess too. So in this case does linux see these
controllers/channels, i would presume no...

--
~Vinod

2018-01-19 05:48:50

by Vinod Koul

[permalink] [raw]
Subject: Re: [PATCH 1/4] dmaengine: qcom: bam_dma: make bam clk optional

On Tue, Jan 16, 2018 at 07:02:33PM +0000, [email protected] wrote:
> From: Srinivas Kandagatla <[email protected]>
>
> When BAM is remotely controlled it does not sound correct to control
> its clk on Linux side. Make it optional, so that its not madatory

s/madatory/mandatory

> for remote controlled BAM instances.
>
> Signed-off-by: Srinivas Kandagatla <[email protected]>
> ---
> drivers/dma/qcom/bam_dma.c | 15 ++++++++-------
> 1 file changed, 8 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/dma/qcom/bam_dma.c b/drivers/dma/qcom/bam_dma.c
> index 03c4eb3fd314..78e488e8f96d 100644
> --- a/drivers/dma/qcom/bam_dma.c
> +++ b/drivers/dma/qcom/bam_dma.c
> @@ -1180,13 +1180,14 @@ static int bam_dma_probe(struct platform_device *pdev)
> "qcom,controlled-remotely");
>
> bdev->bamclk = devm_clk_get(bdev->dev, "bam_clk");

but you still do clk_get unconditionally?

> - if (IS_ERR(bdev->bamclk))
> - return PTR_ERR(bdev->bamclk);
> -
> - ret = clk_prepare_enable(bdev->bamclk);
> - if (ret) {
> - dev_err(bdev->dev, "failed to prepare/enable clock\n");
> - return ret;
> + if (IS_ERR(bdev->bamclk)) {
> + bdev->bamclk = NULL;
> + } else {
> + ret = clk_prepare_enable(bdev->bamclk);
> + if (ret) {
> + dev_err(bdev->dev, "failed to prepare/enable clock\n");
> + return ret;
> + }

wouldn't it be better to set that an instance is remote controlled and thus
not at all visible to Linux?

> }
>
> ret = bam_init(bdev);
> --
> 2.15.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe dmaengine" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html

--
~Vinod

2018-01-19 05:52:49

by Vinod Koul

[permalink] [raw]
Subject: Re: [PATCH 2/4] dmaengine: qcom: bam_dma: add num-channels binding for remotely controlled

On Tue, Jan 16, 2018 at 07:02:34PM +0000, [email protected] wrote:
> From: Srinivas Kandagatla <[email protected]>
>
> When Linux is master of BAM, it can directly read registers to know number
> of supported channels, however when its remotely controlled reading these
> registers would trigger a crash if the BAM is not yet intialized/powered up
> on the remote side.
>
> This patch adds num-channels binding to specify number of supported
> dma channels on remotely controlled BAM.
>
> Signed-off-by: Srinivas Kandagatla <[email protected]>
> ---
> Documentation/devicetree/bindings/dma/qcom_bam_dma.txt | 2 ++
> drivers/dma/qcom/bam_dma.c | 13 +++++++++++--
> 2 files changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt b/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
> index 9cbf5d9df8fd..aa6822cbb230 100644
> --- a/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
> +++ b/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
> @@ -15,6 +15,8 @@ Required properties:
> the secure world.
> - qcom,controlled-remotely : optional, indicates that the bam is controlled by
> remote proccessor i.e. execution environment.
> +- num-channels : optional, indicates supported number of DMA channels in a
> + remotely controlled bam.
>
> Example:
>
> diff --git a/drivers/dma/qcom/bam_dma.c b/drivers/dma/qcom/bam_dma.c
> index 78e488e8f96d..523bd178047a 100644
> --- a/drivers/dma/qcom/bam_dma.c
> +++ b/drivers/dma/qcom/bam_dma.c
> @@ -1083,8 +1083,10 @@ static int bam_init(struct bam_device *bdev)
> if (bdev->ee >= val)
> return -EINVAL;
>
> - val = readl_relaxed(bam_addr(bdev, 0, BAM_NUM_PIPES));
> - bdev->num_channels = val & BAM_NUM_PIPES_MASK;
> + if (!bdev->num_channels) {
> + val = readl_relaxed(bam_addr(bdev, 0, BAM_NUM_PIPES));
> + bdev->num_channels = val & BAM_NUM_PIPES_MASK;
> + }
>
> if (bdev->controlled_remotely)
> return 0;
> @@ -1179,6 +1181,13 @@ static int bam_dma_probe(struct platform_device *pdev)
> bdev->controlled_remotely = of_property_read_bool(pdev->dev.of_node,
> "qcom,controlled-remotely");
>
> + if (bdev->controlled_remotely) {

hmm so if we remove the remotely controlled instanced from DT and then Linux
won't see them and not do anything. Do we need to do configuration of these
instances too?

> + ret = of_property_read_u32(pdev->dev.of_node, "num-channels",
> + &bdev->num_channels);
> + if (ret)
> + dev_err(bdev->dev, "num-channels unspecified in dt\n");
> + }
> +
> bdev->bamclk = devm_clk_get(bdev->dev, "bam_clk");
> if (IS_ERR(bdev->bamclk)) {
> bdev->bamclk = NULL;
> --
> 2.15.1
>

--
~Vinod

2018-01-22 09:56:09

by Srinivas Kandagatla

[permalink] [raw]
Subject: Re: [PATCH 2/4] dmaengine: qcom: bam_dma: add num-channels binding for remotely controlled



On 19/01/18 05:55, Vinod Koul wrote:
> On Tue, Jan 16, 2018 at 07:02:34PM +0000, [email protected] wrote:
>> From: Srinivas Kandagatla <[email protected]>
>>
>> When Linux is master of BAM, it can directly read registers to know number
>> of supported channels, however when its remotely controlled reading these
>> registers would trigger a crash if the BAM is not yet intialized/powered up
>> on the remote side.
>>
>> This patch adds num-channels binding to specify number of supported
>> dma channels on remotely controlled BAM.
>>
>> Signed-off-by: Srinivas Kandagatla <[email protected]>
>> ---
>> Documentation/devicetree/bindings/dma/qcom_bam_dma.txt | 2 ++
>> drivers/dma/qcom/bam_dma.c | 13 +++++++++++--
>> 2 files changed, 13 insertions(+), 2 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt b/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
>> index 9cbf5d9df8fd..aa6822cbb230 100644
>> --- a/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
>> +++ b/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
>> @@ -15,6 +15,8 @@ Required properties:
>> the secure world.
>> - qcom,controlled-remotely : optional, indicates that the bam is controlled by
>> remote proccessor i.e. execution environment.
>> +- num-channels : optional, indicates supported number of DMA channels in a
>> + remotely controlled bam.
>>
>> Example:
>>
>> diff --git a/drivers/dma/qcom/bam_dma.c b/drivers/dma/qcom/bam_dma.c
>> index 78e488e8f96d..523bd178047a 100644
>> --- a/drivers/dma/qcom/bam_dma.c
>> +++ b/drivers/dma/qcom/bam_dma.c
>> @@ -1083,8 +1083,10 @@ static int bam_init(struct bam_device *bdev)
>> if (bdev->ee >= val)
>> return -EINVAL;
>>
>> - val = readl_relaxed(bam_addr(bdev, 0, BAM_NUM_PIPES));
>> - bdev->num_channels = val & BAM_NUM_PIPES_MASK;
>> + if (!bdev->num_channels) {
>> + val = readl_relaxed(bam_addr(bdev, 0, BAM_NUM_PIPES));
>> + bdev->num_channels = val & BAM_NUM_PIPES_MASK;
>> + }
>>
>> if (bdev->controlled_remotely)
>> return 0;
>> @@ -1179,6 +1181,13 @@ static int bam_dma_probe(struct platform_device *pdev)
>> bdev->controlled_remotely = of_property_read_bool(pdev->dev.of_node,
>> "qcom,controlled-remotely");
>>
>> + if (bdev->controlled_remotely) {
>
> hmm so if we remove the remotely controlled instanced from DT and then Linux
> won't see them and not do anything. Do we need to do configuration of these
> instances too?
No, bindings "num-channels" and "num-ees" are applicable to remote
controlled instances only, which is documented in the DT bindings.

Normally these values come from register reads, which are not possible
in case of remotely controlled instances as BAM driver would not know if
the remote is powered up or not.

thanks,
srini

>
>> + ret = of_property_read_u32(pdev->dev.of_node, "num-channels",
>> + &bdev->num_channels);
>> + if (ret)
>> + dev_err(bdev->dev, "num-channels unspecified in dt\n");
>> + }
>> +
>> bdev->bamclk = devm_clk_get(bdev->dev, "bam_clk");
>> if (IS_ERR(bdev->bamclk)) {
>> bdev->bamclk = NULL;
>> --
>> 2.15.1
>>
>

2018-01-22 09:56:54

by Srinivas Kandagatla

[permalink] [raw]
Subject: Re: [PATCH 1/4] dmaengine: qcom: bam_dma: make bam clk optional



On 19/01/18 05:52, Vinod Koul wrote:
> On Tue, Jan 16, 2018 at 07:02:33PM +0000, [email protected] wrote:
>> From: Srinivas Kandagatla <[email protected]>
>>
>> When BAM is remotely controlled it does not sound correct to control
>> its clk on Linux side. Make it optional, so that its not madatory
>
> s/madatory/mandatory
>
Yep,
>> for remote controlled BAM instances.
>>
>> Signed-off-by: Srinivas Kandagatla <[email protected]>
>> ---
>> drivers/dma/qcom/bam_dma.c | 15 ++++++++-------
>> 1 file changed, 8 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/dma/qcom/bam_dma.c b/drivers/dma/qcom/bam_dma.c
>> index 03c4eb3fd314..78e488e8f96d 100644
>> --- a/drivers/dma/qcom/bam_dma.c
>> +++ b/drivers/dma/qcom/bam_dma.c
>> @@ -1180,13 +1180,14 @@ static int bam_dma_probe(struct platform_device *pdev)
>> "qcom,controlled-remotely");
>>
>> bdev->bamclk = devm_clk_get(bdev->dev, "bam_clk");
>
> but you still do clk_get unconditionally?

Only reason to do this way is to not break existing users in the mainline.

remotely controlled BAM is already supported in upstream driver, there
are users of this who pass clk from device tree, If I make this
conditional then subsequent reads to the BAM registers for those
instances might crash the system.

This sounds wrong to control clk from linux for the dma controller which
is remotely controlled. These users should be transitioned to new
bindings once the new bindings endup in the mainline.

>
>> - if (IS_ERR(bdev->bamclk))
>> - return PTR_ERR(bdev->bamclk);
>> -
>> - ret = clk_prepare_enable(bdev->bamclk);
>> - if (ret) {
>> - dev_err(bdev->dev, "failed to prepare/enable clock\n");
>> - return ret;
>> + if (IS_ERR(bdev->bamclk)) {
>> + bdev->bamclk = NULL;
>> + } else {
>> + ret = clk_prepare_enable(bdev->bamclk);
>> + if (ret) {
>> + dev_err(bdev->dev, "failed to prepare/enable clock\n");
>> + return ret;
>> + }
>
> wouldn't it be better to set that an instance is remote controlled and thus
> not at all visible to Linux?

We already have a flag "controlled_remotely" for that in the driver.

thanks,
srini
>
>> }
>>
>> ret = bam_init(bdev);
>> --
>> 2.15.1
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe dmaengine" in
>> the body of a message to [email protected]
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>

2018-01-23 09:15:38

by Vinod Koul

[permalink] [raw]
Subject: Re: [PATCH 1/4] dmaengine: qcom: bam_dma: make bam clk optional

On Mon, Jan 22, 2018 at 09:55:01AM +0000, Srinivas Kandagatla wrote:

> >>@@ -1180,13 +1180,14 @@ static int bam_dma_probe(struct platform_device *pdev)
> >> "qcom,controlled-remotely");
> >> bdev->bamclk = devm_clk_get(bdev->dev, "bam_clk");
> >
> >but you still do clk_get unconditionally?
>
> Only reason to do this way is to not break existing users in the mainline.
>
> remotely controlled BAM is already supported in upstream driver, there are
> users of this who pass clk from device tree, If I make this conditional then
> subsequent reads to the BAM registers for those instances might crash the
> system.

But these instances are remote controlled, so if we stop representing them
in Linux, why would we read them?

--
~Vinod

2018-01-23 09:21:17

by Srinivas Kandagatla

[permalink] [raw]
Subject: Re: [PATCH 1/4] dmaengine: qcom: bam_dma: make bam clk optional



On 23/01/18 09:19, Vinod Koul wrote:
> On Mon, Jan 22, 2018 at 09:55:01AM +0000, Srinivas Kandagatla wrote:
>
>>>> @@ -1180,13 +1180,14 @@ static int bam_dma_probe(struct platform_device *pdev)
>>>> "qcom,controlled-remotely");
>>>> bdev->bamclk = devm_clk_get(bdev->dev, "bam_clk");
>>>
>>> but you still do clk_get unconditionally?
>>
>> Only reason to do this way is to not break existing users in the mainline.
>>
>> remotely controlled BAM is already supported in upstream driver, there are
>> users of this who pass clk from device tree, If I make this conditional then
>> subsequent reads to the BAM registers for those instances might crash the
>> system.
>
> But these instances are remote controlled, so if we stop representing them
> in Linux, why would we read them?

Plan is that we would transition those users once we get these
bindings/changes in. Currently I don't have access to any of those
devices so I made the changes safe, such that it does not break devices
on mainline.

--srini

>

2018-01-29 16:20:26

by Rob Herring

[permalink] [raw]
Subject: Re: [PATCH 2/4] dmaengine: qcom: bam_dma: add num-channels binding for remotely controlled

On Tue, Jan 16, 2018 at 07:02:34PM +0000, [email protected] wrote:
> From: Srinivas Kandagatla <[email protected]>
>
> When Linux is master of BAM, it can directly read registers to know number
> of supported channels, however when its remotely controlled reading these
> registers would trigger a crash if the BAM is not yet intialized/powered up
> on the remote side.
>
> This patch adds num-channels binding to specify number of supported
> dma channels on remotely controlled BAM.
>
> Signed-off-by: Srinivas Kandagatla <[email protected]>
> ---
> Documentation/devicetree/bindings/dma/qcom_bam_dma.txt | 2 ++

Reviewed-by: Rob Herring <[email protected]>

> drivers/dma/qcom/bam_dma.c | 13 +++++++++++--
> 2 files changed, 13 insertions(+), 2 deletions(-)

2018-01-29 16:23:24

by Rob Herring

[permalink] [raw]
Subject: Re: [PATCH 4/4] dmaengine: qcom: bam_dma: Add num-ees dt binding for remotely controlled

On Tue, Jan 16, 2018 at 07:02:36PM +0000, [email protected] wrote:
> From: Srinivas Kandagatla <[email protected]>
>
> When Linux is master of BAM, it can directly read registers to know number
> of supported execution enviroments, however when its remotely controlled
> reading these registers would trigger a crash if the BAM is not yet
> intialized/powered up on the remote side.
>
> This patch adds new binding num-ees to specify supported number of
> Execution Environments when BAM is remotely controlled.
>
> Signed-off-by: Srinivas Kandagatla <[email protected]>
> ---
> Documentation/devicetree/bindings/dma/qcom_bam_dma.txt | 2 ++
> drivers/dma/qcom/bam_dma.c | 15 ++++++++++++---
> 2 files changed, 14 insertions(+), 3 deletions(-)

The correct split is the binding changes in 1 patch. Driver changes
separate.

>
> diff --git a/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt b/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
> index aa6822cbb230..f0d10c2b393e 100644
> --- a/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
> +++ b/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
> @@ -17,6 +17,8 @@ Required properties:
> remote proccessor i.e. execution environment.
> - num-channels : optional, indicates supported number of DMA channels in a
> remotely controlled bam.
> +- num-ees : optional, indicates supported number of Execution Environments in a
> + remotely controlled bam.

This one needs a vendor prefix as it is not a common property.

>
> Example:
>

2018-01-30 09:19:42

by Srinivas Kandagatla

[permalink] [raw]
Subject: Re: [PATCH 4/4] dmaengine: qcom: bam_dma: Add num-ees dt binding for remotely controlled

Thanks for the review,

On 29/01/18 16:21, Rob Herring wrote:
> On Tue, Jan 16, 2018 at 07:02:36PM +0000, [email protected] wrote:
>> From: Srinivas Kandagatla <[email protected]>
>>
>> When Linux is master of BAM, it can directly read registers to know number
>> of supported execution enviroments, however when its remotely controlled
>> reading these registers would trigger a crash if the BAM is not yet
>> intialized/powered up on the remote side.
>>
>> This patch adds new binding num-ees to specify supported number of
>> Execution Environments when BAM is remotely controlled.
>>
>> Signed-off-by: Srinivas Kandagatla <[email protected]>
>> ---
>> Documentation/devicetree/bindings/dma/qcom_bam_dma.txt | 2 ++
>> drivers/dma/qcom/bam_dma.c | 15 ++++++++++++---
>> 2 files changed, 14 insertions(+), 3 deletions(-)
>
> The correct split is the binding changes in 1 patch. Driver changes
> separate.
>
Sure, Will Split it in next version.
>>
>> diff --git a/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt b/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
>> index aa6822cbb230..f0d10c2b393e 100644
>> --- a/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
>> +++ b/Documentation/devicetree/bindings/dma/qcom_bam_dma.txt
>> @@ -17,6 +17,8 @@ Required properties:
>> remote proccessor i.e. execution environment.
>> - num-channels : optional, indicates supported number of DMA channels in a
>> remotely controlled bam.
>> +- num-ees : optional, indicates supported number of Execution Environments in a
>> + remotely controlled bam.
>
> This one needs a vendor prefix as it is not a common property.
>
Make sense, I will change it in next version.

Thanks,
Srini
>>
>> Example:
>>