You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ra...@apache.org on 2024/10/10 13:31:26 UTC
(nuttx) 12/16: pci/pci_ecam: add read_io/write_io for pci ecam
This is an automated email from the ASF dual-hosted git repository.
raiden00 pushed a commit to branch releases/12.7
in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit f2a4d5990049b6d356e43eb460cc11bfee165dc4
Author: Bowen Wang <wa...@xiaomi.com>
AuthorDate: Mon May 6 15:19:04 2024 +0800
pci/pci_ecam: add read_io/write_io for pci ecam
Signed-off-by: Bowen Wang <wa...@xiaomi.com>
---
drivers/pci/pci_ecam.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 104 insertions(+), 2 deletions(-)
diff --git a/drivers/pci/pci_ecam.c b/drivers/pci/pci_ecam.c
index 4cc974180b..f238bb4eee 100644
--- a/drivers/pci/pci_ecam.c
+++ b/drivers/pci/pci_ecam.c
@@ -55,6 +55,12 @@ static int pci_ecam_write_config(FAR struct pci_bus_s *bus,
unsigned int devfn, int where, int size,
uint32_t val);
+static int pci_ecam_read_io(FAR struct pci_bus_s *bus, uintptr_t addr,
+ int size, FAR uint32_t *val);
+
+static int pci_ecam_write_io(FAR struct pci_bus_s *bus, uintptr_t addr,
+ int size, uint32_t val);
+
/****************************************************************************
* Private Types
****************************************************************************/
@@ -71,8 +77,10 @@ struct pci_ecam_s
static const struct pci_ops_s g_pci_ecam_ops =
{
- .read = pci_ecam_read_config,
- .write = pci_ecam_write_config,
+ .read = pci_ecam_read_config,
+ .write = pci_ecam_write_config,
+ .read_io = pci_ecam_read_io,
+ .write_io = pci_ecam_write_io,
};
/****************************************************************************
@@ -266,6 +274,100 @@ static int pci_ecam_write_config(FAR struct pci_bus_s *bus,
return OK;
}
+/****************************************************************************
+ * Name: pci_ecam_read_io
+ *
+ * Description:
+ * Read data from the specific address.
+ *
+ * Input Parameters:
+ * bus - The bus on this to read reg data
+ * addr - Data address
+ * size - Data size
+ * val - Return value to this var
+ *
+ * Returned Value:
+ * Zero (OK) is returned on success. A negated errno value is returned
+ * on failure.
+ *
+ ****************************************************************************/
+
+static int pci_ecam_read_io(FAR struct pci_bus_s *bus, uintptr_t addr,
+ int size, FAR uint32_t *val)
+{
+ if (!IS_ALIGNED(addr, size))
+ {
+ *val = 0;
+ return -EINVAL;
+ }
+
+ if (size == 4)
+ {
+ *val = readl(addr);
+ }
+ else if (size == 2)
+ {
+ *val = readw(addr);
+ }
+ else if (size == 1)
+ {
+ *val = readb(addr);
+ }
+ else
+ {
+ *val = 0;
+ return -EINVAL;
+ }
+
+ return OK;
+}
+
+/****************************************************************************
+ * Name: pci_ecam_read_io
+ *
+ * Description:
+ * Write data to the specific address.
+ *
+ * Input Parameters:
+ * bus - The bus on this to read reg data
+ * addr - Data address
+ * size - Data size
+ * val - Write this value to specific address
+ *
+ * Returned Value:
+ * Zero (OK) is returned on success. A negated errno value is returned
+ * on failure.
+ *
+ ****************************************************************************/
+
+static int pci_ecam_write_io(FAR struct pci_bus_s *bus, uintptr_t addr,
+ int size, uint32_t val)
+{
+ if (!IS_ALIGNED(addr, size))
+ {
+ return -EINVAL;
+ }
+
+ if (size == 4)
+ {
+ writel(val, addr);
+ }
+ else if (size == 2)
+ {
+ writew(val, addr);
+ }
+ else if (size == 1)
+ {
+ writeb(val, addr);
+ }
+ else
+ {
+ return -EINVAL;
+ }
+
+ return OK;
+}
+
/****************************************************************************
* Public Functions
****************************************************************************/