
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