linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] Some minor updates and fixes for the BRCMSTB DPFE driver
@ 2019-02-12  1:24 Markus Mayer
  2019-02-12  1:24 ` [PATCH 1/3] soc: brcmstb: dpfe: use msleep() over udelay() Markus Mayer
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Markus Mayer @ 2019-02-12  1:24 UTC (permalink / raw)
  To: Brian Norris, Florian Fainelli, Gregory Fong
  Cc: Markus Mayer, Broadcom Kernel List, ARM Kernel List,
	Linux Kernel Mailing List

From: Markus Mayer <mmayer@broadcom.com>

This series contains three unrelated improvements or fixes for the
BRCMSTB DPFE driver:

* use msleep() over udelay() to be more scheduler friendly
* optimize generic_show()
* work around a firmware issue by reading byte 3 instead of byte 0

Markus Mayer (3):
  soc: brcmstb: dpfe: use msleep() over udelay()
  soc: brcmstb: dpfe: optimize generic_show()
  soc: brcmstb: dpfe: use byte 3 of registers MR4-MR8

 drivers/memory/brcmstb_dpfe.c | 46 ++++++++++++++++++++---------------
 1 file changed, 26 insertions(+), 20 deletions(-)

-- 
2.17.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/3] soc: brcmstb: dpfe: use msleep() over udelay()
  2019-02-12  1:24 [PATCH 0/3] Some minor updates and fixes for the BRCMSTB DPFE driver Markus Mayer
@ 2019-02-12  1:24 ` Markus Mayer
  2019-03-09 22:03   ` Florian Fainelli
  2019-02-12  1:24 ` [PATCH 2/3] soc: brcmstb: dpfe: optimize generic_show() Markus Mayer
  2019-02-12  1:24 ` [PATCH 3/3] soc: brcmstb: dpfe: use byte 3 of registers MR4-MR8 Markus Mayer
  2 siblings, 1 reply; 7+ messages in thread
From: Markus Mayer @ 2019-02-12  1:24 UTC (permalink / raw)
  To: Brian Norris, Florian Fainelli, Gregory Fong
  Cc: Markus Mayer, Broadcom Kernel List, ARM Kernel List,
	Linux Kernel Mailing List

From: Markus Mayer <mmayer@broadcom.com>

To be more "scheduler friendly", we use msleep() rather than udelay()
while we wait for the DCPU to respond.

Signed-off-by: Markus Mayer <mmayer@broadcom.com>
---
 drivers/memory/brcmstb_dpfe.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/memory/brcmstb_dpfe.c b/drivers/memory/brcmstb_dpfe.c
index 04599eccd604..8e1ccdb0e59d 100644
--- a/drivers/memory/brcmstb_dpfe.c
+++ b/drivers/memory/brcmstb_dpfe.c
@@ -111,7 +111,7 @@
 #define DPFE_MSG_TYPE_COMMAND	1
 #define DPFE_MSG_TYPE_RESPONSE	2
 
-#define DELAY_LOOP_MAX		200000
+#define DELAY_LOOP_MAX		1000
 
 enum dpfe_msg_fields {
 	MSG_HEADER,
@@ -323,7 +323,7 @@ static int __send_command(struct private_data *priv, unsigned int cmd,
 		resp = readl_relaxed(regs + REG_TO_HOST_MBOX);
 		if (resp > 0)
 			break;
-		udelay(5);
+		msleep(1);
 	}
 
 	if (i == DELAY_LOOP_MAX) {
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/3] soc: brcmstb: dpfe: optimize generic_show()
  2019-02-12  1:24 [PATCH 0/3] Some minor updates and fixes for the BRCMSTB DPFE driver Markus Mayer
  2019-02-12  1:24 ` [PATCH 1/3] soc: brcmstb: dpfe: use msleep() over udelay() Markus Mayer
@ 2019-02-12  1:24 ` Markus Mayer
  2019-03-09 22:03   ` Florian Fainelli
  2019-02-12  1:24 ` [PATCH 3/3] soc: brcmstb: dpfe: use byte 3 of registers MR4-MR8 Markus Mayer
  2 siblings, 1 reply; 7+ messages in thread
From: Markus Mayer @ 2019-02-12  1:24 UTC (permalink / raw)
  To: Brian Norris, Florian Fainelli, Gregory Fong
  Cc: Markus Mayer, Broadcom Kernel List, ARM Kernel List,
	Linux Kernel Mailing List

From: Markus Mayer <mmayer@broadcom.com>

We can pass a (struct priv_data *) to generic_show() rather than a
(struct device *). For two of the three callers of this function, the
change means one less call to dev_get_drvdata(). For the third caller,
it makes no difference.

Signed-off-by: Markus Mayer <mmayer@broadcom.com>
---
 drivers/memory/brcmstb_dpfe.c | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)

diff --git a/drivers/memory/brcmstb_dpfe.c b/drivers/memory/brcmstb_dpfe.c
index 8e1ccdb0e59d..1095c1d95df4 100644
--- a/drivers/memory/brcmstb_dpfe.c
+++ b/drivers/memory/brcmstb_dpfe.c
@@ -527,12 +527,10 @@ static int brcmstb_dpfe_download_firmware(struct platform_device *pdev,
 }
 
 static ssize_t generic_show(unsigned int command, u32 response[],
-			    struct device *dev, char *buf)
+			    struct private_data *priv, char *buf)
 {
-	struct private_data *priv;
 	int ret;
 
-	priv = dev_get_drvdata(dev);
 	if (!priv)
 		return sprintf(buf, "ERROR: driver private data not set\n");
 
@@ -547,10 +545,12 @@ static ssize_t show_info(struct device *dev, struct device_attribute *devattr,
 			 char *buf)
 {
 	u32 response[MSG_FIELD_MAX];
+	struct private_data *priv;
 	unsigned int info;
 	ssize_t ret;
 
-	ret = generic_show(DPFE_CMD_GET_INFO, response, dev, buf);
+	priv = dev_get_drvdata(dev);
+	ret = generic_show(DPFE_CMD_GET_INFO, response, priv, buf);
 	if (ret)
 		return ret;
 
@@ -573,12 +573,11 @@ static ssize_t show_refresh(struct device *dev,
 	u32 mr4;
 	ssize_t ret;
 
-	ret = generic_show(DPFE_CMD_GET_REFRESH, response, dev, buf);
+	priv = dev_get_drvdata(dev);
+	ret = generic_show(DPFE_CMD_GET_REFRESH, response, priv, buf);
 	if (ret)
 		return ret;
 
-	priv = dev_get_drvdata(dev);
-
 	info = get_msg_ptr(priv, response[MSG_ARG0], buf, &ret);
 	if (!info)
 		return ret;
@@ -632,12 +631,11 @@ static ssize_t show_vendor(struct device *dev, struct device_attribute *devattr,
 	void __iomem *info;
 	ssize_t ret;
 
-	ret = generic_show(DPFE_CMD_GET_VENDOR, response, dev, buf);
+	priv = dev_get_drvdata(dev);
+	ret = generic_show(DPFE_CMD_GET_VENDOR, response, priv, buf);
 	if (ret)
 		return ret;
 
-	priv = dev_get_drvdata(dev);
-
 	info = get_msg_ptr(priv, response[MSG_ARG0], buf, &ret);
 	if (!info)
 		return ret;
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/3] soc: brcmstb: dpfe: use byte 3 of registers MR4-MR8
  2019-02-12  1:24 [PATCH 0/3] Some minor updates and fixes for the BRCMSTB DPFE driver Markus Mayer
  2019-02-12  1:24 ` [PATCH 1/3] soc: brcmstb: dpfe: use msleep() over udelay() Markus Mayer
  2019-02-12  1:24 ` [PATCH 2/3] soc: brcmstb: dpfe: optimize generic_show() Markus Mayer
@ 2019-02-12  1:24 ` Markus Mayer
  2019-03-09 22:03   ` Florian Fainelli
  2 siblings, 1 reply; 7+ messages in thread
From: Markus Mayer @ 2019-02-12  1:24 UTC (permalink / raw)
  To: Brian Norris, Florian Fainelli, Gregory Fong
  Cc: Markus Mayer, Broadcom Kernel List, ARM Kernel List,
	Linux Kernel Mailing List

From: Markus Mayer <mmayer@broadcom.com>

For dual-rank LPDDR4, result data for any command is placed in byte 0
and byte 3 of the corresponding MR register by the firmware.
Single-rank RAM was supposed to work the same way. However, due to a
firmware bug, result values are only placed in byte 3 of the
corresponding MR register.

Since byte 3 works for single-rank and dual-rank setups, we change the
Linux driver to always use byte 3, thus returning the correct value in
either case.

Signed-off-by: Markus Mayer <mmayer@broadcom.com>
---
 drivers/memory/brcmstb_dpfe.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/drivers/memory/brcmstb_dpfe.c b/drivers/memory/brcmstb_dpfe.c
index 1095c1d95df4..fae3ac3d65c6 100644
--- a/drivers/memory/brcmstb_dpfe.c
+++ b/drivers/memory/brcmstb_dpfe.c
@@ -61,6 +61,7 @@
 #define DRAM_INFO_MR4		0x4
 #define DRAM_INFO_ERROR		0x8
 #define DRAM_INFO_MR4_MASK	0xff
+#define DRAM_INFO_MR4_SHIFT	24	/* We need to look at byte 3 */
 
 /* DRAM MR4 Offsets & Masks */
 #define DRAM_MR4_REFRESH	0x0	/* Refresh rate */
@@ -82,6 +83,7 @@
 #define DRAM_VENDOR_MR8		0xc
 #define DRAM_VENDOR_ERROR	0x10
 #define DRAM_VENDOR_MASK	0xff
+#define DRAM_VENDOR_SHIFT	24	/* We need to look at byte 3 */
 
 /* Reset register bits & masks */
 #define DCPU_RESET_SHIFT	0x0
@@ -582,7 +584,8 @@ static ssize_t show_refresh(struct device *dev,
 	if (!info)
 		return ret;
 
-	mr4 = readl_relaxed(info + DRAM_INFO_MR4) & DRAM_INFO_MR4_MASK;
+	mr4 = (readl_relaxed(info + DRAM_INFO_MR4) >> DRAM_INFO_MR4_SHIFT) &
+	      DRAM_INFO_MR4_MASK;
 
 	refresh = (mr4 >> DRAM_MR4_REFRESH) & DRAM_MR4_REFRESH_MASK;
 	sr_abort = (mr4 >> DRAM_MR4_SR_ABORT) & DRAM_MR4_SR_ABORT_MASK;
@@ -630,6 +633,7 @@ static ssize_t show_vendor(struct device *dev, struct device_attribute *devattr,
 	struct private_data *priv;
 	void __iomem *info;
 	ssize_t ret;
+	u32 mr5, mr6, mr7, mr8, err;
 
 	priv = dev_get_drvdata(dev);
 	ret = generic_show(DPFE_CMD_GET_VENDOR, response, priv, buf);
@@ -640,13 +644,17 @@ static ssize_t show_vendor(struct device *dev, struct device_attribute *devattr,
 	if (!info)
 		return ret;
 
-	return sprintf(buf, "%#x %#x %#x %#x %#x\n",
-		       readl_relaxed(info + DRAM_VENDOR_MR5) & DRAM_VENDOR_MASK,
-		       readl_relaxed(info + DRAM_VENDOR_MR6) & DRAM_VENDOR_MASK,
-		       readl_relaxed(info + DRAM_VENDOR_MR7) & DRAM_VENDOR_MASK,
-		       readl_relaxed(info + DRAM_VENDOR_MR8) & DRAM_VENDOR_MASK,
-		       readl_relaxed(info + DRAM_VENDOR_ERROR) &
-				     DRAM_VENDOR_MASK);
+	mr5 = (readl_relaxed(info + DRAM_VENDOR_MR5) >> DRAM_VENDOR_SHIFT) &
+		DRAM_VENDOR_MASK;
+	mr6 = (readl_relaxed(info + DRAM_VENDOR_MR6) >> DRAM_VENDOR_SHIFT) &
+		DRAM_VENDOR_MASK;
+	mr7 = (readl_relaxed(info + DRAM_VENDOR_MR7) >> DRAM_VENDOR_SHIFT) &
+		DRAM_VENDOR_MASK;
+	mr8 = (readl_relaxed(info + DRAM_VENDOR_MR8) >> DRAM_VENDOR_SHIFT) &
+		DRAM_VENDOR_MASK;
+	err = readl_relaxed(info + DRAM_VENDOR_ERROR) & DRAM_VENDOR_MASK;
+
+	return sprintf(buf, "%#x %#x %#x %#x %#x\n", mr5, mr6, mr7, mr8, err);
 }
 
 static int brcmstb_dpfe_resume(struct platform_device *pdev)
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/3] soc: brcmstb: dpfe: use msleep() over udelay()
  2019-02-12  1:24 ` [PATCH 1/3] soc: brcmstb: dpfe: use msleep() over udelay() Markus Mayer
@ 2019-03-09 22:03   ` Florian Fainelli
  0 siblings, 0 replies; 7+ messages in thread
From: Florian Fainelli @ 2019-03-09 22:03 UTC (permalink / raw)
  To: bcm-kernel-feedback-list, Markus Mayer, Brian Norris, Gregory Fong
  Cc: Markus Mayer, ARM Kernel List, Linux Kernel Mailing List

On Mon, 11 Feb 2019 17:24:41 -0800, Markus Mayer <code@mmayer.net> wrote:
> From: Markus Mayer <mmayer@broadcom.com>
> 
> To be more "scheduler friendly", we use msleep() rather than udelay()
> while we wait for the DCPU to respond.
> 
> Signed-off-by: Markus Mayer <mmayer@broadcom.com>
> ---

Applied to drivers/next, thanks!
--
Florian

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/3] soc: brcmstb: dpfe: optimize generic_show()
  2019-02-12  1:24 ` [PATCH 2/3] soc: brcmstb: dpfe: optimize generic_show() Markus Mayer
@ 2019-03-09 22:03   ` Florian Fainelli
  0 siblings, 0 replies; 7+ messages in thread
From: Florian Fainelli @ 2019-03-09 22:03 UTC (permalink / raw)
  To: bcm-kernel-feedback-list, Markus Mayer, Brian Norris, Gregory Fong
  Cc: Markus Mayer, ARM Kernel List, Linux Kernel Mailing List

On Mon, 11 Feb 2019 17:24:42 -0800, Markus Mayer <code@mmayer.net> wrote:
> From: Markus Mayer <mmayer@broadcom.com>
> 
> We can pass a (struct priv_data *) to generic_show() rather than a
> (struct device *). For two of the three callers of this function, the
> change means one less call to dev_get_drvdata(). For the third caller,
> it makes no difference.
> 
> Signed-off-by: Markus Mayer <mmayer@broadcom.com>
> ---

Applied to drivers/next, thanks!
--
Florian

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 3/3] soc: brcmstb: dpfe: use byte 3 of registers MR4-MR8
  2019-02-12  1:24 ` [PATCH 3/3] soc: brcmstb: dpfe: use byte 3 of registers MR4-MR8 Markus Mayer
@ 2019-03-09 22:03   ` Florian Fainelli
  0 siblings, 0 replies; 7+ messages in thread
From: Florian Fainelli @ 2019-03-09 22:03 UTC (permalink / raw)
  To: bcm-kernel-feedback-list, Markus Mayer, Brian Norris, Gregory Fong
  Cc: Markus Mayer, ARM Kernel List, Linux Kernel Mailing List

On Mon, 11 Feb 2019 17:24:43 -0800, Markus Mayer <code@mmayer.net> wrote:
> From: Markus Mayer <mmayer@broadcom.com>
> 
> For dual-rank LPDDR4, result data for any command is placed in byte 0
> and byte 3 of the corresponding MR register by the firmware.
> Single-rank RAM was supposed to work the same way. However, due to a
> firmware bug, result values are only placed in byte 3 of the
> corresponding MR register.
> 
> Since byte 3 works for single-rank and dual-rank setups, we change the
> Linux driver to always use byte 3, thus returning the correct value in
> either case.
> 
> Signed-off-by: Markus Mayer <mmayer@broadcom.com>
> ---

Applied to drivers/next, thanks!
--
Florian

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2019-03-09 22:04 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-12  1:24 [PATCH 0/3] Some minor updates and fixes for the BRCMSTB DPFE driver Markus Mayer
2019-02-12  1:24 ` [PATCH 1/3] soc: brcmstb: dpfe: use msleep() over udelay() Markus Mayer
2019-03-09 22:03   ` Florian Fainelli
2019-02-12  1:24 ` [PATCH 2/3] soc: brcmstb: dpfe: optimize generic_show() Markus Mayer
2019-03-09 22:03   ` Florian Fainelli
2019-02-12  1:24 ` [PATCH 3/3] soc: brcmstb: dpfe: use byte 3 of registers MR4-MR8 Markus Mayer
2019-03-09 22:03   ` Florian Fainelli

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).