linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Brian Norris <briannorris@chromium.org>
To: Shawn Lin <shawn.lin@rock-chips.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>,
	linux-pci@vger.kernel.org, linux-rockchip@lists.infradead.org,
	Wenrui Li <wenrui.li@rock-chips.com>,
	Jeffy Chen <jeffy.chen@rock-chips.com>
Subject: Re: [PATCH 1/3] PCI: rockchip: split out rockchip_cfg_atu
Date: Tue, 22 Nov 2016 17:59:15 -0800	[thread overview]
Message-ID: <20161123015914.GA119441@google.com> (raw)
In-Reply-To: <1479863953-123874-1-git-send-email-shawn.lin@rock-chips.com>

On Wed, Nov 23, 2016 at 09:19:11AM +0800, Shawn Lin wrote:
> We split out a new function, rockchip_cfg_atu, in order to
> re-configure the atu when missing these information after
> wakeup from S3.
> 
> Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
> ---
> 
>  drivers/pci/host/pcie-rockchip.c | 119 ++++++++++++++++++++++-----------------
>  1 file changed, 68 insertions(+), 51 deletions(-)
> 
> diff --git a/drivers/pci/host/pcie-rockchip.c b/drivers/pci/host/pcie-rockchip.c
> index b55037a..19399fc 100644
> --- a/drivers/pci/host/pcie-rockchip.c
> +++ b/drivers/pci/host/pcie-rockchip.c
> @@ -169,6 +169,7 @@
>  #define IB_ROOT_PORT_REG_SIZE_SHIFT		3
>  #define AXI_WRAPPER_IO_WRITE			0x6
>  #define AXI_WRAPPER_MEM_WRITE			0x2
> +#define AXI_WRAPPER_NOR_MSG			0xc

You're also adding this 'normal message' support in a refactoring patch.
This should be in another patch -- preferably patch 3 I think.

>  
>  #define MAX_AXI_IB_ROOTPORT_REGION_NUM		3
>  #define MIN_AXI_ADDR_BITS_PASSED		8
> @@ -210,6 +211,13 @@ struct rockchip_pcie {
>  	int	link_gen;
>  	struct	device *dev;
>  	struct	irq_domain *irq_domain;
> +	u32     io_size;
> +	int     offset;
> +	phys_addr_t io_bus_addr;
> +	int     msg_region_nr;
> +	void	__iomem *msg_region;
> +	u32     mem_size;
> +	phys_addr_t mem_bus_addr;
>  };
>  
>  static u32 rockchip_pcie_read(struct rockchip_pcie *rockchip, u32 reg)
> @@ -1149,6 +1157,57 @@ static int rockchip_pcie_prog_ib_atu(struct rockchip_pcie *rockchip,
>  	return 0;
>  }
>  
> +static int rockchip_cfg_atu(struct rockchip_pcie *rockchip)
> +{
> +	int offset;
> +	int err;
> +	int reg_no;
> +
> +	for (reg_no = 0; reg_no < (rockchip->mem_size >> 20); reg_no++) {
> +		err = rockchip_pcie_prog_ob_atu(rockchip, reg_no + 1,
> +						AXI_WRAPPER_MEM_WRITE,
> +						20 - 1,
> +						rockchip->mem_bus_addr +
> +						(reg_no << 20),
> +						0);
> +		if (err) {
> +			dev_err(rockchip->dev,
> +					"program RC mem outbound ATU failed\n");
> +			return err;
> +		}
> +	}
> +
> +	err = rockchip_pcie_prog_ib_atu(rockchip, 2, 32 - 1, 0x0, 0);
> +	if (err) {
> +		dev_err(rockchip->dev, "program RC mem inbound ATU failed\n");
> +		return err;
> +	}
> +
> +	offset = rockchip->mem_size >> 20;
> +	for (reg_no = 0; reg_no < (rockchip->io_size >> 20); reg_no++) {
> +		err = rockchip_pcie_prog_ob_atu(rockchip,
> +						reg_no + 1 + offset,
> +						AXI_WRAPPER_IO_WRITE,
> +						20 - 1,
> +						rockchip->io_bus_addr +
> +						(reg_no << 20),
> +						0);
> +		if (err) {
> +			dev_err(rockchip->dev,
> +					"program RC io outbound ATU failed\n");
> +			return err;
> +		}
> +	}
> +
> +	/* assign message regions */
> +	rockchip->msg_region_nr = reg_no + 1 + offset;
> +	rockchip_pcie_prog_ob_atu(rockchip, reg_no + 1 + offset,
> +				  AXI_WRAPPER_NOR_MSG,
> +				  20 - 1, 0, 0);

Same here.

> +	rockchip->msg_region = ioremap(rockchip->mem_bus_addr +
> +				       ((reg_no - 1) << 20), SZ_1M);

(And here.)

ioremap() can fail; check for NULL.

Also, when you start reusing rockchip_cfg_atu() in patch 3, you'll be
leaking virtual address space, as you'll keep remapping this every time.
You should straighten that out. Either some kind of check for
'if (!rockchip->msg_region)', or just do the map/unmap where it's
actually used (in patch 3).

Brian

> +	return err;
> +}
>  static int rockchip_pcie_probe(struct platform_device *pdev)
>  {
>  	struct rockchip_pcie *rockchip;
> @@ -1158,13 +1217,7 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
>  	resource_size_t io_base;
>  	struct resource	*mem;
>  	struct resource	*io;
> -	phys_addr_t io_bus_addr = 0;
> -	u32 io_size;
> -	phys_addr_t mem_bus_addr = 0;
> -	u32 mem_size = 0;
> -	int reg_no;
>  	int err;
> -	int offset;
>  
>  	LIST_HEAD(res);
>  
> @@ -1231,14 +1284,13 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
>  		goto err_vpcie;
>  
>  	/* Get the I/O and memory ranges from DT */
> -	io_size = 0;
>  	resource_list_for_each_entry(win, &res) {
>  		switch (resource_type(win->res)) {
>  		case IORESOURCE_IO:
>  			io = win->res;
>  			io->name = "I/O";
> -			io_size = resource_size(io);
> -			io_bus_addr = io->start - win->offset;
> +			rockchip->io_size = resource_size(io);
> +			rockchip->io_bus_addr = io->start - win->offset;
>  			err = pci_remap_iospace(io, io_base);
>  			if (err) {
>  				dev_warn(dev, "error %d: failed to map resource %pR\n",
> @@ -1249,8 +1301,8 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
>  		case IORESOURCE_MEM:
>  			mem = win->res;
>  			mem->name = "MEM";
> -			mem_size = resource_size(mem);
> -			mem_bus_addr = mem->start - win->offset;
> +			rockchip->mem_size = resource_size(mem);
> +			rockchip->mem_bus_addr = mem->start - win->offset;
>  			break;
>  		case IORESOURCE_BUS:
>  			rockchip->root_bus_nr = win->res->start;
> @@ -1260,49 +1312,13 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
>  		}
>  	}
>  
> -	if (mem_size) {
> -		for (reg_no = 0; reg_no < (mem_size >> 20); reg_no++) {
> -			err = rockchip_pcie_prog_ob_atu(rockchip, reg_no + 1,
> -							AXI_WRAPPER_MEM_WRITE,
> -							20 - 1,
> -							mem_bus_addr +
> -							(reg_no << 20),
> -							0);
> -			if (err) {
> -				dev_err(dev, "program RC mem outbound ATU failed\n");
> -				goto err_vpcie;
> -			}
> -		}
> -	}
> -
> -	err = rockchip_pcie_prog_ib_atu(rockchip, 2, 32 - 1, 0x0, 0);
> -	if (err) {
> -		dev_err(dev, "program RC mem inbound ATU failed\n");
> +	err = rockchip_cfg_atu(rockchip);
> +	if (err)
>  		goto err_vpcie;
> -	}
> -
> -	offset = mem_size >> 20;
> -
> -	if (io_size) {
> -		for (reg_no = 0; reg_no < (io_size >> 20); reg_no++) {
> -			err = rockchip_pcie_prog_ob_atu(rockchip,
> -							reg_no + 1 + offset,
> -							AXI_WRAPPER_IO_WRITE,
> -							20 - 1,
> -							io_bus_addr +
> -							(reg_no << 20),
> -							0);
> -			if (err) {
> -				dev_err(dev, "program RC io outbound ATU failed\n");
> -				goto err_vpcie;
> -			}
> -		}
> -	}
> -
>  	bus = pci_scan_root_bus(&pdev->dev, 0, &rockchip_pcie_ops, rockchip, &res);
>  	if (!bus) {
>  		err = -ENOMEM;
> -		goto err_vpcie;
> +		goto err_scan;
>  	}
>  
>  	pci_bus_size_bridges(bus);
> @@ -1315,7 +1331,8 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
>  	dev_warn(dev, "only 32-bit config accesses supported; smaller writes may corrupt adjacent RW1C fields\n");
>  
>  	return err;
> -
> +err_scan:
> +	iounmap(rockchip->msg_region);
>  err_vpcie:
>  	if (!IS_ERR(rockchip->vpcie3v3))
>  		regulator_disable(rockchip->vpcie3v3);
> -- 
> 1.9.1
> 
> 

  parent reply	other threads:[~2016-11-23  1:59 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-23  1:19 [PATCH 1/3] PCI: rockchip: split out rockchip_cfg_atu Shawn Lin
2016-11-23  1:19 ` [PATCH 2/3] PCI: rockchip: move the deassert of pm/aclk/pclk after phy_init Shawn Lin
2016-11-23  1:19 ` [PATCH 3/3] PCI: rockchip: Add system PM support Shawn Lin
2016-11-23  2:08   ` Brian Norris
2016-11-23  2:39     ` Shawn Lin
2016-11-23  2:45       ` Brian Norris
2016-11-23  2:51         ` Shawn Lin
2016-11-23  4:56           ` Brian Norris
2016-11-23  1:59 ` Brian Norris [this message]
2016-11-23  2:15   ` [PATCH 1/3] PCI: rockchip: split out rockchip_cfg_atu Shawn Lin
2016-11-23  2:29     ` Brian Norris
2016-11-23  2:33       ` Shawn Lin

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=20161123015914.GA119441@google.com \
    --to=briannorris@chromium.org \
    --cc=bhelgaas@google.com \
    --cc=jeffy.chen@rock-chips.com \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux-rockchip@lists.infradead.org \
    --cc=shawn.lin@rock-chips.com \
    --cc=wenrui.li@rock-chips.com \
    /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 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).