Patchwork [4/8] pci: weak function returns alignment

login
register
mail settings
Submitter Gavin Shan
Date July 25, 2012, 1:49 a.m.
Message ID <1343180997-9483-5-git-send-email-shangw@linux.vnet.ibm.com>
Download mbox | patch
Permalink /patch/173094/
State Superseded
Headers show

Comments

Gavin Shan - July 25, 2012, 1:49 a.m.
The patch implements the weak function to return the default I/O
or memory alignment for P2P bridge. Currently, I/O window has 4KiB
alignment and memory window is 4MiB aligned by default. On the other
hand, those platforms (e.g. powernv) that have special requirements
on the alignment could override the function by themselves.

Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com>
---
 drivers/pci/setup-bus.c |   21 +++++++++++++++++++++
 include/linux/pci.h     |    2 ++
 2 files changed, 23 insertions(+), 0 deletions(-)
Wei Yang - Aug. 17, 2012, 3 a.m.
2012/7/25 Gavin Shan <shangw@linux.vnet.ibm.com>:
> The patch implements the weak function to return the default I/O
> or memory alignment for P2P bridge. Currently, I/O window has 4KiB
> alignment and memory window is 4MiB aligned by default. On the other
> hand, those platforms (e.g. powernv) that have special requirements
> on the alignment could override the function by themselves.
>
> Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com>
> ---
>  drivers/pci/setup-bus.c |   21 +++++++++++++++++++++
>  include/linux/pci.h     |    2 ++
>  2 files changed, 23 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
> index 8fa2d4b..c0fb9da 100644
> --- a/drivers/pci/setup-bus.c
> +++ b/drivers/pci/setup-bus.c
> @@ -690,6 +690,27 @@ static resource_size_t calculate_memsize(resource_size_t size,
>         return size;
>  }
>
> +resource_size_t __weak pcibios_window_alignment(struct pci_bus *bus,
> +                                               unsigned long type)
> +{
> +       return 1;
> +}
> +
> +static resource_size_t window_alignment(struct pci_bus *bus,
> +                                       unsigned long type)
> +{
> +       resource_size_t align = 1, arch_align;
> +
> +       if (type & IORESOURCE_MEM)
> +               align = 1024*1024;      /* 1MiB */
> +       else if (type & IORESOURCE_IO)
> +               align = 4*1024;         /* 4KiB */
> +

If this is a constant, could we use define a macro?
So we don't use to calculate the value every time.
Maybe some compile will be smart enough to optimize this,
still think it is better to give a result.

> +       arch_align = pcibios_window_alignment(bus, type);
> +
> +       return max(align, arch_align);
> +}
> +
>  /**
>   * pbus_size_io() - size the io window of a given bus
>   *
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 9acea4b..34ff2bb 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -988,6 +988,8 @@ int pci_cfg_space_size_ext(struct pci_dev *dev);
>  int pci_cfg_space_size(struct pci_dev *dev);
>  unsigned char pci_bus_max_busnr(struct pci_bus *bus);
>  void pci_setup_bridge(struct pci_bus *bus);
> +resource_size_t pcibios_window_alignment(struct pci_bus *bus,
> +                                        unsigned long type);
>
>  #define PCI_VGA_STATE_CHANGE_BRIDGE (1 << 0)
>  #define PCI_VGA_STATE_CHANGE_DECODES (1 << 1)
> --
> 1.7.5.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 8fa2d4b..c0fb9da 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -690,6 +690,27 @@  static resource_size_t calculate_memsize(resource_size_t size,
 	return size;
 }
 
+resource_size_t __weak pcibios_window_alignment(struct pci_bus *bus,
+						unsigned long type)
+{
+	return 1;
+}
+
+static resource_size_t window_alignment(struct pci_bus *bus,
+					unsigned long type)
+{
+	resource_size_t align = 1, arch_align;
+
+	if (type & IORESOURCE_MEM)
+		align = 1024*1024;	/* 1MiB */
+	else if (type & IORESOURCE_IO)
+		align = 4*1024;		/* 4KiB */
+
+	arch_align = pcibios_window_alignment(bus, type);
+
+	return max(align, arch_align);
+}
+
 /**
  * pbus_size_io() - size the io window of a given bus
  *
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 9acea4b..34ff2bb 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -988,6 +988,8 @@  int pci_cfg_space_size_ext(struct pci_dev *dev);
 int pci_cfg_space_size(struct pci_dev *dev);
 unsigned char pci_bus_max_busnr(struct pci_bus *bus);
 void pci_setup_bridge(struct pci_bus *bus);
+resource_size_t pcibios_window_alignment(struct pci_bus *bus,
+					 unsigned long type);
 
 #define PCI_VGA_STATE_CHANGE_BRIDGE (1 << 0)
 #define PCI_VGA_STATE_CHANGE_DECODES (1 << 1)