Message ID | 1565950848-10076-1-git-send-email-bingbu.cao@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] media: staging: imgu: make imgu work on low frequency for low input | expand |
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
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);