All of lore.kernel.org
 help / color / mirror / Atom feed
From: Simon Horman <horms@verge.net.au>
To: Marek Vasut <marek.vasut@gmail.com>
Cc: linux-pci@vger.kernel.org,
	Kazufumi Ikeda <kaz-ikeda@xc.jp.nec.com>,
	Gaku Inami <gaku.inami.xw@bp.renesas.com>,
	Marek Vasut <marek.vasut+renesas@gmail.com>,
	Geert Uytterhoeven <geert+renesas@glider.be>,
	Wolfram Sang <wsa@the-dreams.de>,
	linux-renesas-soc@vger.kernel.org
Subject: Re: [PATCH 3/3] PCI: rcar: Add the suspend/resume for pcie-rcar driver
Date: Mon, 13 Nov 2017 08:00:34 +0100	[thread overview]
Message-ID: <20171113070034.f546eqqbxzab2s2d@verge.net.au> (raw)
In-Reply-To: <22cec1d9-dc11-e210-d527-0f39f7b2bccd@gmail.com>

On Fri, Nov 10, 2017 at 10:53:07PM +0100, Marek Vasut wrote:
> On 11/10/2017 10:09 AM, Simon Horman wrote:
> > On Wed, Nov 08, 2017 at 10:28:06AM +0100, Marek Vasut wrote:
> >> From: Kazufumi Ikeda <kaz-ikeda@xc.jp.nec.com>
> >>
> >> This adds the suspend/resume supports for pcie-rcar. The resume handler
> >> reprogram the hardware based on the software state kept in specific
> >> device structures. Also it doesn't need to save any registers.
> >>
> >> Signed-off-by: Kazufumi Ikeda <kaz-ikeda@xc.jp.nec.com>
> >> Signed-off-by: Gaku Inami <gaku.inami.xw@bp.renesas.com>
> >> Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
> >> Cc: Geert Uytterhoeven <geert+renesas@glider.be>
> >> Cc: Simon Horman <horms+renesas@verge.net.au>
> >> Cc: Wolfram Sang <wsa@the-dreams.de>
> >> Cc: linux-renesas-soc@vger.kernel.org
> >> ---
> >>  drivers/pci/host/pcie-rcar.c | 86 +++++++++++++++++++++++++++++++++++++++-----
> >>  1 file changed, 78 insertions(+), 8 deletions(-)
> >>
> >> diff --git a/drivers/pci/host/pcie-rcar.c b/drivers/pci/host/pcie-rcar.c
> >> index 2b28292de93a..7a9e30185c79 100644
> >> --- a/drivers/pci/host/pcie-rcar.c
> >> +++ b/drivers/pci/host/pcie-rcar.c
> >> @@ -471,6 +471,36 @@ static void rcar_pcie_force_speedup(struct rcar_pcie *pcie)
> >>  		 (macsr & LINK_SPEED) == LINK_SPEED_5_0GTS ? "5" : "2.5");
> >>  }
> >>  
> >> +static int rcar_pcie_hw_enable(struct rcar_pcie *pcie)
> > 
> > This function always returns 0 and the value is not checked by the caller.
> > Can we change the return type to void?
> 
> Yes, done
> 
> >> +{
> >> +	struct resource_entry *win;
> >> +	LIST_HEAD(res);
> >> +	int i = 0;
> >> +
> >> +	/* Try setting 5 GT/s link speed */
> > 
> > What if it fails?
> 
> If it fails, we're back at 2.5 GT/s . The rcar_pcie_force_speedup()
> first checks if the PCIe IP can do 5 GT/s at all. Only if so, tries to
> initiate transition to 5 GT/s operation , checks whether that succeeded
> and if it failed, falls back to 2.5 GT/s .

Thanks, got it.

> >> +	rcar_pcie_force_speedup(pcie);
> >> +
> >> +	/* Setup PCI resources */
> >> +	resource_list_for_each_entry(win, &pcie->resources) {
> >> +		struct resource *res = win->res;
> >> +
> >> +		if (!res->flags)
> >> +			continue;
> >> +
> >> +		switch (resource_type(res)) {
> >> +		case IORESOURCE_IO:
> >> +		case IORESOURCE_MEM:
> >> +			rcar_pcie_setup_window(i, pcie, res);
> >> +			i++;
> >> +			break;
> >> +		default:
> >> +			continue;
> > 
> > Can the default case be omitted?
> 
> Sure
> 
> >> +		}
> >> +	}
> >> +
> >> +	return 0;
> >> +}
> >> +
> >>  static int rcar_pcie_enable(struct rcar_pcie *pcie)
> >>  {
> >>  	struct device *dev = pcie->dev;
> >> @@ -872,11 +902,25 @@ static const struct irq_domain_ops msi_domain_ops = {
> >>  	.map = rcar_msi_map,
> >>  };
> >>  
> >> +static void rcar_pcie_hw_enable_msi(struct rcar_pcie *pcie)
> >> +{
> >> +	struct rcar_msi *msi = &pcie->msi;
> >> +	unsigned long base;
> >> +
> >> +	/* setup MSI data target */
> >> +	base = virt_to_phys((void *)msi->pages);
> > 
> > Why do you need to cast to void *?
> > I expect such casting can be done implicitly.
> 
> Because __get_free_pages() returns unsigned long and that's what's used
> to assign msi->pages . And virt_to_phys() expects void * instead, thus
> the cast.

Right, but I don't think one should ever need to explicitly cast
to or from void *. What mean is, can you just remove "(void *)" without
changing any behaviour?

> 
> >> +
> >> +	rcar_pci_write_reg(pcie, base | MSIFE, PCIEMSIALR);
> >> +	rcar_pci_write_reg(pcie, 0, PCIEMSIAUR);
> >> +
> >> +	/* enable all MSI interrupts */
> >> +	rcar_pci_write_reg(pcie, 0xffffffff, PCIEMSIIER);
> >> +}
> >> +
> >>  static int rcar_pcie_enable_msi(struct rcar_pcie *pcie)
> >>  {
> >>  	struct device *dev = pcie->dev;
> >>  	struct rcar_msi *msi = &pcie->msi;
> >> -	unsigned long base;
> >>  	int err, i;
> >>  
> >>  	mutex_init(&msi->lock);
> >> @@ -915,13 +959,7 @@ static int rcar_pcie_enable_msi(struct rcar_pcie *pcie)
> >>  
> >>  	/* setup MSI data target */
> >>  	msi->pages = __get_free_pages(GFP_KERNEL, 0);
> >> -	base = virt_to_phys((void *)msi->pages);
> >> -
> >> -	rcar_pci_write_reg(pcie, base | MSIFE, PCIEMSIALR);
> >> -	rcar_pci_write_reg(pcie, 0, PCIEMSIAUR);
> >> -
> >> -	/* enable all MSI interrupts */
> >> -	rcar_pci_write_reg(pcie, 0xffffffff, PCIEMSIIER);
> >> +	rcar_pcie_hw_enable_msi(pcie);
> >>  
> >>  	return 0;
> >>  
> >> @@ -1202,6 +1240,37 @@ static int rcar_pcie_probe(struct platform_device *pdev)
> >>  	return err;
> >>  }
> >>  
> >> +static int rcar_pcie_resume(struct device *dev)
> >> +{
> >> +	struct rcar_pcie *pcie = dev_get_drvdata(dev);
> >> +	unsigned int data;
> >> +	int err;
> >> +	int (*hw_init_fn)(struct rcar_pcie *);
> > 
> > Please sort local variables in reverse xmas tree order.
> 
> OK
> 
> >> +
> >> +	err = rcar_pcie_parse_map_dma_ranges(pcie, dev->of_node);
> >> +	if (err)
> >> +		return 0;
> >> +
> >> +	/* Failure to get a link might just be that no cards are inserted */
> >> +	hw_init_fn = of_device_get_match_data(dev);
> >> +	err = hw_init_fn(pcie);
> >> +	if (err) {
> >> +		dev_info(dev, "PCIe link down\n");
> >> +		return 0;
> >> +	}
> >> +
> >> +	data = rcar_pci_read_reg(pcie, MACSR);
> >> +	dev_info(dev, "PCIe x%d: link up\n", (data >> 20) & 0x3f);
> >> +
> >> +	/* Enable MSI */
> >> +	if (IS_ENABLED(CONFIG_PCI_MSI))
> >> +		rcar_pcie_hw_enable_msi(pcie);
> >> +
> >> +	rcar_pcie_hw_enable(pcie);
> >> +
> >> +	return 0;
> >> +}
> >> +
> >>  static int rcar_pcie_resume_noirq(struct device *dev)
> >>  {
> >>  	struct rcar_pcie *pcie = dev_get_drvdata(dev);
> >> @@ -1218,6 +1287,7 @@ static int rcar_pcie_resume_noirq(struct device *dev)
> >>  }
> >>  
> >>  static const struct dev_pm_ops rcar_pcie_pm_ops = {
> >> +	SET_SYSTEM_SLEEP_PM_OPS(NULL, rcar_pcie_resume)
> >>  	.resume_noirq = rcar_pcie_resume_noirq,
> >>  };
> >>  
> >> -- 
> >> 2.11.0
> >>
> 
> 
> -- 
> Best regards,
> Marek Vasut
> 

  reply	other threads:[~2017-11-13  7:00 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-08  9:28 [PATCH 1/3] PCI: rcar: Add the initialization of PCIe link in resume_noirq Marek Vasut
2017-11-08  9:28 ` [PATCH 2/3] PCI: rcar: Support runtime PM, link state L1 handling Marek Vasut
2017-11-10  9:03   ` Simon Horman
2017-11-10 21:22     ` Marek Vasut
2017-11-08  9:28 ` [PATCH 3/3] PCI: rcar: Add the suspend/resume for pcie-rcar driver Marek Vasut
2017-11-10  9:09   ` Simon Horman
2017-11-10 21:53     ` Marek Vasut
2017-11-13  7:00       ` Simon Horman [this message]
2017-11-13  8:05         ` Geert Uytterhoeven
2017-11-08 11:00 ` [PATCH 1/3] PCI: rcar: Add the initialization of PCIe link in resume_noirq Sergei Shtylyov
2017-11-10 21:01   ` Marek Vasut
2017-11-10  8:59 ` Simon Horman
2017-11-10 21:14   ` Marek Vasut
2017-11-13  6:58     ` Simon Horman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171113070034.f546eqqbxzab2s2d@verge.net.au \
    --to=horms@verge.net.au \
    --cc=gaku.inami.xw@bp.renesas.com \
    --cc=geert+renesas@glider.be \
    --cc=kaz-ikeda@xc.jp.nec.com \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    --cc=marek.vasut+renesas@gmail.com \
    --cc=marek.vasut@gmail.com \
    --cc=wsa@the-dreams.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.