linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] media: staging: imgu: make imgu work on low frequency for low input
@ 2019-08-16 10:20 bingbu.cao
  2019-08-19  5:37 ` Tomasz Figa
  0 siblings, 1 reply; 2+ messages in thread
From: bingbu.cao @ 2019-08-16 10:20 UTC (permalink / raw)
  To: linux-media; +Cc: sakari.ailus, tfiga, andy.yeh, bingbu.cao

From: Bingbu Cao <bingbu.cao@intel.com>

Currently, imgu is working on 450MHz for all cases, however
in some cases (input frame less than 2048x1152), the imgu
did not need work in high frequency.
This patch make imgu work on 200MHz if the imgu input
frame is less than 2048x1152 to save power.

Signed-off-by: Bingbu Cao <bingbu.cao@intel.com>
---
 drivers/staging/media/ipu3/ipu3-css.c |  6 +++---
 drivers/staging/media/ipu3/ipu3-css.h |  3 ++-
 drivers/staging/media/ipu3/ipu3.c     | 16 ++++++++++++++--
 3 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/drivers/staging/media/ipu3/ipu3-css.c b/drivers/staging/media/ipu3/ipu3-css.c
index fd1ed84c400c..a0002ccadbfc 100644
--- a/drivers/staging/media/ipu3/ipu3-css.c
+++ b/drivers/staging/media/ipu3/ipu3-css.c
@@ -210,12 +210,12 @@ static int imgu_hw_wait(void __iomem *base, int reg, u32 mask, u32 cmp)
 
 /* Initialize the IPU3 CSS hardware and associated h/w blocks */
 
-int imgu_css_set_powerup(struct device *dev, void __iomem *base)
+int imgu_css_set_powerup(struct device *dev, void __iomem *base,
+			 unsigned int freq)
 {
-	static const unsigned int freq = 450;
 	u32 pm_ctrl, state, val;
 
-	dev_dbg(dev, "%s\n", __func__);
+	dev_dbg(dev, "%s with freq %u\n", __func__, freq);
 	/* Clear the CSS busy signal */
 	readl(base + IMGU_REG_GP_BUSY);
 	writel(0, base + IMGU_REG_GP_BUSY);
diff --git a/drivers/staging/media/ipu3/ipu3-css.h b/drivers/staging/media/ipu3/ipu3-css.h
index 6b8bab27ab1f..6108a068b228 100644
--- a/drivers/staging/media/ipu3/ipu3-css.h
+++ b/drivers/staging/media/ipu3/ipu3-css.h
@@ -187,7 +187,8 @@ bool imgu_css_is_streaming(struct imgu_css *css);
 bool imgu_css_pipe_queue_empty(struct imgu_css *css, unsigned int pipe);
 
 /******************* css hw *******************/
-int imgu_css_set_powerup(struct device *dev, void __iomem *base);
+int imgu_css_set_powerup(struct device *dev, void __iomem *base,
+			 unsigned int freq);
 void imgu_css_set_powerdown(struct device *dev, void __iomem *base);
 int imgu_css_irq_ack(struct imgu_css *css);
 
diff --git a/drivers/staging/media/ipu3/ipu3.c b/drivers/staging/media/ipu3/ipu3.c
index 06a61f31ca50..4d53aad31483 100644
--- a/drivers/staging/media/ipu3/ipu3.c
+++ b/drivers/staging/media/ipu3/ipu3.c
@@ -345,8 +345,20 @@ int imgu_queue_buffers(struct imgu_device *imgu, bool initial, unsigned int pipe
 static int imgu_powerup(struct imgu_device *imgu)
 {
 	int r;
+	unsigned int pipe;
+	unsigned int freq = 200;
+	struct v4l2_mbus_framefmt *fmt;
+
+	/* input larger than 2048*1152, ask imgu to work on high freq */
+	for_each_set_bit(pipe, imgu->css.enabled_pipes, IMGU_MAX_PIPE_NUM) {
+		fmt = &imgu->imgu_pipe[pipe].nodes[IMGU_NODE_IN].pad_fmt;
+		dev_dbg(&imgu->pci_dev->dev, "pipe %u input format = %ux%u",
+			pipe, fmt->width, fmt->height);
+		if ((fmt->width * fmt->height) >= (2048 * 1152))
+			freq = 450;
+	}
 
-	r = imgu_css_set_powerup(&imgu->pci_dev->dev, imgu->base);
+	r = imgu_css_set_powerup(&imgu->pci_dev->dev, imgu->base, freq);
 	if (r)
 		return r;
 
@@ -666,7 +678,7 @@ static int imgu_pci_probe(struct pci_dev *pci_dev,
 	atomic_set(&imgu->qbuf_barrier, 0);
 	init_waitqueue_head(&imgu->buf_drain_wq);
 
-	r = imgu_css_set_powerup(&pci_dev->dev, imgu->base);
+	r = imgu_css_set_powerup(&pci_dev->dev, imgu->base, 200);
 	if (r) {
 		dev_err(&pci_dev->dev,
 			"failed to power up CSS (%d)\n", r);
-- 
2.7.4


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

* Re: [PATCH v2] media: staging: imgu: make imgu work on low frequency for low input
  2019-08-16 10:20 [PATCH v2] media: staging: imgu: make imgu work on low frequency for low input bingbu.cao
@ 2019-08-19  5:37 ` Tomasz Figa
  0 siblings, 0 replies; 2+ messages in thread
From: Tomasz Figa @ 2019-08-19  5:37 UTC (permalink / raw)
  To: Cao Bing Bu; +Cc: Linux Media Mailing List, Sakari Ailus, Yeh, Andy, Bingbu Cao

Hi Bingbu,

On Fri, Aug 16, 2019 at 7:12 PM <bingbu.cao@intel.com> wrote:
>
> From: Bingbu Cao <bingbu.cao@intel.com>
>
> Currently, imgu is working on 450MHz for all cases, however
> in some cases (input frame less than 2048x1152), the imgu
> did not need work in high frequency.
> This patch make imgu work on 200MHz if the imgu input
> frame is less than 2048x1152 to save power.
>
> Signed-off-by: Bingbu Cao <bingbu.cao@intel.com>
> ---
>  drivers/staging/media/ipu3/ipu3-css.c |  6 +++---
>  drivers/staging/media/ipu3/ipu3-css.h |  3 ++-
>  drivers/staging/media/ipu3/ipu3.c     | 16 ++++++++++++++--
>  3 files changed, 19 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/staging/media/ipu3/ipu3-css.c b/drivers/staging/media/ipu3/ipu3-css.c
> index fd1ed84c400c..a0002ccadbfc 100644
> --- a/drivers/staging/media/ipu3/ipu3-css.c
> +++ b/drivers/staging/media/ipu3/ipu3-css.c
> @@ -210,12 +210,12 @@ static int imgu_hw_wait(void __iomem *base, int reg, u32 mask, u32 cmp)
>
>  /* Initialize the IPU3 CSS hardware and associated h/w blocks */
>
> -int imgu_css_set_powerup(struct device *dev, void __iomem *base)
> +int imgu_css_set_powerup(struct device *dev, void __iomem *base,
> +                        unsigned int freq)
>  {
> -       static const unsigned int freq = 450;
>         u32 pm_ctrl, state, val;
>
> -       dev_dbg(dev, "%s\n", __func__);
> +       dev_dbg(dev, "%s with freq %u\n", __func__, freq);
>         /* Clear the CSS busy signal */
>         readl(base + IMGU_REG_GP_BUSY);
>         writel(0, base + IMGU_REG_GP_BUSY);
> diff --git a/drivers/staging/media/ipu3/ipu3-css.h b/drivers/staging/media/ipu3/ipu3-css.h
> index 6b8bab27ab1f..6108a068b228 100644
> --- a/drivers/staging/media/ipu3/ipu3-css.h
> +++ b/drivers/staging/media/ipu3/ipu3-css.h
> @@ -187,7 +187,8 @@ bool imgu_css_is_streaming(struct imgu_css *css);
>  bool imgu_css_pipe_queue_empty(struct imgu_css *css, unsigned int pipe);
>
>  /******************* css hw *******************/
> -int imgu_css_set_powerup(struct device *dev, void __iomem *base);
> +int imgu_css_set_powerup(struct device *dev, void __iomem *base,
> +                        unsigned int freq);
>  void imgu_css_set_powerdown(struct device *dev, void __iomem *base);
>  int imgu_css_irq_ack(struct imgu_css *css);
>
> diff --git a/drivers/staging/media/ipu3/ipu3.c b/drivers/staging/media/ipu3/ipu3.c
> index 06a61f31ca50..4d53aad31483 100644
> --- a/drivers/staging/media/ipu3/ipu3.c
> +++ b/drivers/staging/media/ipu3/ipu3.c
> @@ -345,8 +345,20 @@ int imgu_queue_buffers(struct imgu_device *imgu, bool initial, unsigned int pipe
>  static int imgu_powerup(struct imgu_device *imgu)
>  {
>         int r;
> +       unsigned int pipe;
> +       unsigned int freq = 200;
> +       struct v4l2_mbus_framefmt *fmt;
> +
> +       /* input larger than 2048*1152, ask imgu to work on high freq */
> +       for_each_set_bit(pipe, imgu->css.enabled_pipes, IMGU_MAX_PIPE_NUM) {
> +               fmt = &imgu->imgu_pipe[pipe].nodes[IMGU_NODE_IN].pad_fmt;
> +               dev_dbg(&imgu->pci_dev->dev, "pipe %u input format = %ux%u",
> +                       pipe, fmt->width, fmt->height);
> +               if ((fmt->width * fmt->height) >= (2048 * 1152))
> +                       freq = 450;
> +       }
>
> -       r = imgu_css_set_powerup(&imgu->pci_dev->dev, imgu->base);
> +       r = imgu_css_set_powerup(&imgu->pci_dev->dev, imgu->base, freq);
>         if (r)
>                 return r;
>
> @@ -666,7 +678,7 @@ static int imgu_pci_probe(struct pci_dev *pci_dev,
>         atomic_set(&imgu->qbuf_barrier, 0);
>         init_waitqueue_head(&imgu->buf_drain_wq);
>
> -       r = imgu_css_set_powerup(&pci_dev->dev, imgu->base);
> +       r = imgu_css_set_powerup(&pci_dev->dev, imgu->base, 200);
>         if (r) {
>                 dev_err(&pci_dev->dev,
>                         "failed to power up CSS (%d)\n", r);
> --
> 2.7.4
>

Thanks for addressing my comments.

Reviewed-by: Tomasz Figa <tfiga@chromium.org>

Best regards,
Tomasz

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

end of thread, other threads:[~2019-08-19  5:37 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-16 10:20 [PATCH v2] media: staging: imgu: make imgu work on low frequency for low input bingbu.cao
2019-08-19  5:37 ` Tomasz Figa

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