diff mbox

[U-Boot,14/33] pci: Add functions to read and write a BAR address

Message ID 1415751501-23407-15-git-send-email-sjg@chromium.org
State Superseded
Delegated to: Simon Glass
Headers show

Commit Message

Simon Glass Nov. 12, 2014, 12:18 a.m. UTC
Some PCI functions cannot be auto-configured. Add a function to set up a
fixed BAR which can be used in these situations. Also add a function to read
the current address of a BAR.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/pci/pci.c | 24 +++++++++++++++++++++---
 include/pci.h     | 23 +++++++++++++++++++++++
 2 files changed, 44 insertions(+), 3 deletions(-)

Comments

Bin Meng Nov. 12, 2014, 7:11 a.m. UTC | #1
Hi Simon,

On Wed, Nov 12, 2014 at 8:18 AM, Simon Glass <sjg@chromium.org> wrote:
> Some PCI functions cannot be auto-configured. Add a function to set up a
> fixed BAR which can be used in these situations. Also add a function to read
> the current address of a BAR.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
>  drivers/pci/pci.c | 24 +++++++++++++++++++++---
>  include/pci.h     | 23 +++++++++++++++++++++++
>  2 files changed, 44 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
> index 60c333e..e879d1e 100644
> --- a/drivers/pci/pci.c
> +++ b/drivers/pci/pci.c
> @@ -363,9 +363,27 @@ phys_addr_t pci_hose_bus_to_phys(struct pci_controller* hose,
>         return phys_addr;
>  }
>
> -/*
> - *
> - */
> +void pci_config_fixed(struct pci_controller *hose, pci_dev_t dev, int barnum,
> +                     u32 addr)
> +{
> +       int bar;
> +
> +       bar = PCI_BASE_ADDRESS_0 + barnum * 4;
> +       pci_hose_write_config_dword(hose, dev, bar, addr);
> +}
> +

Maybe better renane it to pci_write_bar() to match the pci_read_bar()
below? And considering it only covers the 32-bit bar, maybe
pci_write_bar32() is even better.

> +u32 pci_read_bar(struct pci_controller *hose, pci_dev_t dev, int barnum)
> +{
> +       u32 addr;
> +       int bar;
> +
> +       bar = PCI_BASE_ADDRESS_0 + barnum * 4;
> +       pci_hose_read_config_dword(hose, dev, bar, &addr);
> +       if (addr & PCI_BASE_ADDRESS_SPACE_IO)
> +               return addr & PCI_BASE_ADDRESS_IO_MASK;
> +       else
> +               return addr & PCI_BASE_ADDRESS_MEM_MASK;
> +}
>

pci_read_bar32()?

>  int pci_hose_config_device(struct pci_controller *hose,
>                            pci_dev_t dev,
> diff --git a/include/pci.h b/include/pci.h
> index 2ff7365..05c67bc 100644
> --- a/include/pci.h
> +++ b/include/pci.h
> @@ -677,5 +677,28 @@ extern void pci_mpc824x_init (struct pci_controller *hose);
>  extern void pci_mpc85xx_init (struct pci_controller *hose);
>  #endif
>
> +/**
> + * pci_config_fixed() - Write the address of a BAR including control bits
> + *
> + * This writes a raw address (with control bits) to a bar
> + *
> + * @hose:      PCI hose to use
> + * @dev:       PCI device to update
> + * @barnum:    BAR number (0-5)
> + * @addr:      BAR address with controll bits
> + */
> +void pci_config_fixed(struct pci_controller *hose, pci_dev_t dev, int barnum,
> +                     u32 addr);
> +
> +/**
> + * pci_read_bar() - read the address of a bar
> + *
> + * @hose:      PCI hose to use
> + * @dev:       PCI device to inspect
> + * @barnum:    BAR number (0-5)
> + * @return address of the bar, masking out any control bits
> + * */
> +u32 pci_read_bar(struct pci_controller *hose, pci_dev_t dev, int barnum);
> +
>  #endif /* __ASSEMBLY__ */
>  #endif /* _PCI_H */
> --

Regards,
Bin
diff mbox

Patch

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 60c333e..e879d1e 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -363,9 +363,27 @@  phys_addr_t pci_hose_bus_to_phys(struct pci_controller* hose,
 	return phys_addr;
 }
 
-/*
- *
- */
+void pci_config_fixed(struct pci_controller *hose, pci_dev_t dev, int barnum,
+		      u32 addr)
+{
+	int bar;
+
+	bar = PCI_BASE_ADDRESS_0 + barnum * 4;
+	pci_hose_write_config_dword(hose, dev, bar, addr);
+}
+
+u32 pci_read_bar(struct pci_controller *hose, pci_dev_t dev, int barnum)
+{
+	u32 addr;
+	int bar;
+
+	bar = PCI_BASE_ADDRESS_0 + barnum * 4;
+	pci_hose_read_config_dword(hose, dev, bar, &addr);
+	if (addr & PCI_BASE_ADDRESS_SPACE_IO)
+		return addr & PCI_BASE_ADDRESS_IO_MASK;
+	else
+		return addr & PCI_BASE_ADDRESS_MEM_MASK;
+}
 
 int pci_hose_config_device(struct pci_controller *hose,
 			   pci_dev_t dev,
diff --git a/include/pci.h b/include/pci.h
index 2ff7365..05c67bc 100644
--- a/include/pci.h
+++ b/include/pci.h
@@ -677,5 +677,28 @@  extern void pci_mpc824x_init (struct pci_controller *hose);
 extern void pci_mpc85xx_init (struct pci_controller *hose);
 #endif
 
+/**
+ * pci_config_fixed() - Write the address of a BAR including control bits
+ *
+ * This writes a raw address (with control bits) to a bar
+ *
+ * @hose:	PCI hose to use
+ * @dev:	PCI device to update
+ * @barnum:	BAR number (0-5)
+ * @addr:	BAR address with controll bits
+ */
+void pci_config_fixed(struct pci_controller *hose, pci_dev_t dev, int barnum,
+		      u32 addr);
+
+/**
+ * pci_read_bar() - read the address of a bar
+ *
+ * @hose:	PCI hose to use
+ * @dev:	PCI device to inspect
+ * @barnum:	BAR number (0-5)
+ * @return address of the bar, masking out any control bits
+ * */
+u32 pci_read_bar(struct pci_controller *hose, pci_dev_t dev, int barnum);
+
 #endif /* __ASSEMBLY__ */
 #endif /* _PCI_H */