This is an automated email from the ASF dual-hosted git repository. raiden00 pushed a commit to branch pci in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 25002adf9f81d3e2543c38b3dae9b63f48458420 Author: raiden00pl <[email protected]> AuthorDate: Sat Jan 20 13:40:26 2024 +0100 drivers/pcie: cosmetics --- drivers/pcie/pcie_root.c | 124 +++++++++++++++++++++++++++--------------- include/nuttx/pcie/pcie.h | 135 ++++++++++++++++++++++++++++++++++------------ 2 files changed, 184 insertions(+), 75 deletions(-) diff --git a/drivers/pcie/pcie_root.c b/drivers/pcie/pcie_root.c index b85c5862fa..8ee6da1a49 100644 --- a/drivers/pcie/pcie_root.c +++ b/drivers/pcie/pcie_root.c @@ -39,7 +39,7 @@ * Public Data ****************************************************************************/ -struct pcie_dev_type_s *pci_device_types[] = +FAR struct pcie_dev_type_s *g_pci_device_types[] = { #ifdef CONFIG_VIRT_QEMU_PCI_TEST &pcie_type_qemu_pci_test, @@ -47,6 +47,19 @@ struct pcie_dev_type_s *pci_device_types[] = NULL, }; +/**************************************************************************** + * Private Types + ****************************************************************************/ + +static struct pcie_dev_type_s g_tmp_type = +{ + PCI_ID_ANY, /* vendor */ + PCI_ID_ANY, /* device */ + PCI_ID_ANY, /* class_rev */ + "Unknown", /* name */ + NULL, /* probe */ +}; + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -70,29 +83,27 @@ struct pcie_dev_type_s *pci_device_types[] = int pci_enumerate(FAR struct pcie_bus_s *bus, FAR struct pcie_dev_type_s **types) { - unsigned int bdf; - uint16_t vid; - uint16_t id; - uint16_t rev; struct pcie_dev_s tmp_dev; - struct pcie_dev_type_s tmp_type = - { - .name = "Unknown", - .vendor = PCI_ID_ANY, - .device = PCI_ID_ANY, - .class_rev = PCI_ID_ANY, - .probe = NULL, - }; + unsigned int bdf; + uint16_t vid; + uint16_t id; + uint16_t rev; + int i; if (!bus) + { return -EINVAL; + } + if (!types) + { return -EINVAL; + } for (bdf = 0; bdf < CONFIG_PCIE_MAX_BDF; bdf++) { tmp_dev.bus = bus; - tmp_dev.type = &tmp_type; + tmp_dev.type = &g_tmp_type; tmp_dev.bdf = bdf; bus->ops->pci_cfg_read(&tmp_dev, PCI_CFG_VENDOR_ID, &vid, 2); @@ -100,13 +111,15 @@ int pci_enumerate(FAR struct pcie_bus_s *bus, bus->ops->pci_cfg_read(&tmp_dev, PCI_CFG_REVERSION, &rev, 2); if (vid == PCI_ID_ANY) - continue; + { + continue; + } pciinfo("[%02x:%02x.%x] Found %04x:%04x, class/reversion %08x\n", bdf >> 8, (bdf >> 3) & 0x1f, bdf & 0x3, vid, id, rev); - for (int i = 0; types[i] != NULL; i++) + for (i = 0; types[i] != NULL; i++) { if (types[i]->vendor == PCI_ID_ANY || types[i]->vendor == vid) @@ -130,6 +143,7 @@ int pci_enumerate(FAR struct pcie_bus_s *bus, device probe function\n", bdf >> 8, (bdf >> 3) & 0x1f, bdf & 0x3); } + break; } } @@ -160,7 +174,7 @@ int pci_enumerate(FAR struct pcie_bus_s *bus, int pcie_initialize(FAR struct pcie_bus_s *bus) { - return pci_enumerate(bus, pci_device_types); + return pci_enumerate(bus, g_pci_device_types); } /**************************************************************************** @@ -214,25 +228,31 @@ int pci_enable_device(FAR struct pcie_dev_s *dev) int pci_find_cap(FAR struct pcie_dev_s *dev, uint16_t cap) { - uint8_t pos = PCI_CFG_CAP_PTR - 1; + uint8_t pos = PCI_CFG_CAP_PTR - 1; uint16_t status; - uint8_t rcap; + uint8_t rcap; dev->bus->ops->pci_cfg_read(dev, PCI_CFG_STATUS, &status, 2); if (!(status & PCI_STS_CAPS)) + { return -EINVAL; + } while (1) { dev->bus->ops->pci_cfg_read(dev, pos + 1, &pos, 1); if (pos == 0) + { return -EINVAL; + } dev->bus->ops->pci_cfg_read(dev, pos, &rcap, 1); if (rcap == cap) + { return pos; + } } } @@ -252,11 +272,12 @@ int pci_find_cap(FAR struct pcie_dev_s *dev, uint16_t cap) * ****************************************************************************/ -int pci_get_bar(FAR struct pcie_dev_s *dev, uint32_t bar, - uint32_t *ret) +int pci_get_bar(FAR struct pcie_dev_s *dev, uint32_t bar, FAR uint32_t *ret) { if (bar > 5) + { return -EINVAL; + } dev->bus->ops->pci_cfg_read(dev, PCI_CFG_BAR + bar * 4, ret, 4); @@ -279,15 +300,16 @@ int pci_get_bar(FAR struct pcie_dev_s *dev, uint32_t bar, * ****************************************************************************/ -int pci_get_bar64(FAR struct pcie_dev_s *dev, uint32_t bar, - uint64_t *ret) +int pci_get_bar64(FAR struct pcie_dev_s *dev, uint32_t bar, FAR uint64_t *ret) { - if (bar > 4 || ((bar % 2) != 0)) - return -EINVAL; - uint32_t barmem1; uint32_t barmem2; + if (bar > 4 || ((bar % 2) != 0)) + { + return -EINVAL; + } + dev->bus->ops->pci_cfg_read(dev, PCI_CFG_BAR + bar * 4, &barmem1, 4); dev->bus->ops->pci_cfg_read(dev, PCI_CFG_BAR + bar * 4 + 4, &barmem2, 4); @@ -312,11 +334,12 @@ int pci_get_bar64(FAR struct pcie_dev_s *dev, uint32_t bar, * ****************************************************************************/ -int pci_set_bar(FAR struct pcie_dev_s *dev, uint32_t bar, - uint32_t val) +int pci_set_bar(FAR struct pcie_dev_s *dev, uint32_t bar, uint32_t val) { if (bar > 5) + { return -EINVAL; + } dev->bus->ops->pci_cfg_write(dev, PCI_CFG_BAR + bar * 4, &val, 4); @@ -339,15 +362,16 @@ int pci_set_bar(FAR struct pcie_dev_s *dev, uint32_t bar, * ****************************************************************************/ -int pci_set_bar64(FAR struct pcie_dev_s *dev, uint32_t bar, - uint64_t val) +int pci_set_bar64(FAR struct pcie_dev_s *dev, uint32_t bar, uint64_t val) { - if (bar > 4 || ((bar % 2) != 0)) - return -EINVAL; - uint32_t barmem1 = (uint32_t)val; uint32_t barmem2 = (uint32_t)(val >> 32); + if (bar > 4 || ((bar % 2) != 0)) + { + return -EINVAL; + } + dev->bus->ops->pci_cfg_write(dev, PCI_CFG_BAR + bar * 4, &barmem1, 4); dev->bus->ops->pci_cfg_write(dev, PCI_CFG_BAR + bar * 4 + 4, &barmem2, 4); @@ -372,27 +396,35 @@ int pci_set_bar64(FAR struct pcie_dev_s *dev, uint32_t bar, ****************************************************************************/ int pci_map_bar(FAR struct pcie_dev_s *dev, uint32_t bar, - unsigned long length, uint32_t *ret) + unsigned long length, FAR uint32_t *ret) { + uint32_t barmem; + if (bar > 5) + { return -EINVAL; - - uint32_t barmem; + } dev->bus->ops->pci_cfg_read(dev, PCI_CFG_BAR + bar * 4, &barmem, 4); if (((bar % 2) == 0 && (barmem & PCI_BAR_64BIT) == PCI_BAR_64BIT) || (barmem & PCI_BAR_IO) == PCI_BAR_IO) + { return -EINVAL; + } if (!dev->bus->ops->pci_map_bar) + { return -EINVAL; + } dev->bus->ops->pci_map_bar(dev, barmem, length); if (ret) - *ret = barmem; + { + *ret = barmem; + } return OK; } @@ -415,32 +447,40 @@ int pci_map_bar(FAR struct pcie_dev_s *dev, uint32_t bar, ****************************************************************************/ int pci_map_bar64(FAR struct pcie_dev_s *dev, uint32_t bar, - unsigned long length, uint64_t *ret) + unsigned long length, FAR uint64_t *ret) { - if (bar > 4 || ((bar % 2) != 0)) - return -EINVAL; - uint32_t barmem1; uint32_t barmem2; uint64_t barmem; + if (bar > 4 || ((bar % 2) != 0)) + { + return -EINVAL; + } + dev->bus->ops->pci_cfg_read(dev, PCI_CFG_BAR + bar * 4, &barmem1, 4); if ((barmem1 & PCI_BAR_64BIT) != PCI_BAR_64BIT || (barmem1 & PCI_BAR_IO) == PCI_BAR_IO) + { return -EINVAL; + } dev->bus->ops->pci_cfg_read(dev, PCI_CFG_BAR + bar * 4 + 4, &barmem2, 4); barmem = ((uint64_t)barmem2 << 32) | barmem1; if (!dev->bus->ops->pci_map_bar64) + { return -EINVAL; + } dev->bus->ops->pci_map_bar64(dev, barmem, length); if (ret) - *ret = barmem; + { + *ret = barmem; + } return OK; } diff --git a/include/nuttx/pcie/pcie.h b/include/nuttx/pcie/pcie.h index fffc791a2d..066c3b7e16 100644 --- a/include/nuttx/pcie/pcie.h +++ b/include/nuttx/pcie/pcie.h @@ -107,26 +107,99 @@ struct pcie_dev_s; struct pcie_bus_ops_s { - CODE int (*pcie_enumerate)(FAR struct pcie_bus_s *bus, - FAR struct pcie_dev_type_s **types); - - CODE int (*pci_cfg_write)(FAR struct pcie_dev_s *dev, uintptr_t addr, - FAR const void *buffer, unsigned int size); - - CODE int (*pci_cfg_read)(FAR struct pcie_dev_s *dev, uintptr_t addr, - FAR void *buffer, unsigned int size); - - CODE int (*pci_map_bar)(FAR struct pcie_dev_s *dev, uint32_t addr, + /* Write 8, 16, 32, 64 bits data to PCI-E configuration space of device + * specified by dev. + * + * Input Parameters: + * bdf - Device private data + * buffer - A pointer to the read-only buffer of data to be written + * size - The number of bytes to send from the buffer + * + * Returned Value: + * 0: success, <0: A negated errno + * + */ + + CODE int (*pci_cfg_write)(FAR struct pcie_dev_s *dev, uintptr_t addr, + FAR const void *buffer, unsigned int size); + + /* Read 8, 16, 32, 64 bits data to PCI-E configuration space of device + * specified by dev. + * + * Input Parameters: + * dev - Device private data + * buffer - A pointer to a buffer to receive the data from the device + * size - The requested number of bytes to be read + * + * Returned Value: + * 0: success, <0: A negated errno + * + */ + + CODE int (*pci_cfg_read)(FAR struct pcie_dev_s *dev, uintptr_t addr, + FAR void *buffer, unsigned int size); + + /* Map address in a 32 bits bar in the memory address space + * + * Input Parameters: + * dev - Device private data + * bar - Bar number + * length - Map length, multiple of PAGE_SIZE + * ret - Bar Content + * + * Returned Value: + * 0: success, <0: A negated errno + * + */ + + CODE int (*pci_map_bar)(FAR struct pcie_dev_s *dev, uint32_t addr, + unsigned long length); + + /* Map address in a 64 bits bar in the memory address space + * + * Input Parameters: + * dev - Device private data + * bar - Bar number + * length - Map length, multiple of PAGE_SIZE + * ret - Bar Content + * + * Returned Value: + * 0: success, <0: A negated errno + * + */ + + CODE int (*pci_map_bar64)(FAR struct pcie_dev_s *dev, uint64_t addr, unsigned long length); - CODE int (*pci_map_bar64)(FAR struct pcie_dev_s *dev, uint64_t addr, - unsigned long length); - - CODE int (*pci_msi_register)(FAR struct pcie_dev_s *dev, - uint16_t vector); - - CODE int (*pci_msix_register)(FAR struct pcie_dev_s *dev, - uint32_t vector, uint32_t index); + /* Map device MSI vectors to a platform IRQ vector + * + * Input Parameters: + * dev - Device + * vector - IRQ number of the platform + * + * Returned Value: + * <0: Mapping failed + * 0: Mapping succeed + * + */ + + CODE int (*pci_msi_register)(FAR struct pcie_dev_s *dev, uint16_t vector); + + /* Map a device MSI-X vector to a platform IRQ vector + * + * Input Parameters: + * dev - Device + * vector - IRQ number of the platform + * index - Device MSI-X vector number + * + * Returned Value: + * <0: Mapping failed + * 0: Mapping succeed + * + */ + + CODE int (*pci_msix_register)(FAR struct pcie_dev_s *dev, + uint32_t vector, uint32_t index); }; /* PCIE bus private data. */ @@ -140,10 +213,10 @@ struct pcie_bus_s struct pcie_dev_type_s { - uint16_t vendor; /* Device vendor ID */ - uint16_t device; /* Device ID */ - uint32_t class_rev; /* Device reversion */ - const char *name; /* Human readable name */ + uint16_t vendor; /* Device vendor ID */ + uint16_t device; /* Device ID */ + uint32_t class_rev; /* Device reversion */ + FAR const char *name; /* Human readable name */ /* Call back function when a device is probed */ @@ -157,7 +230,7 @@ struct pcie_dev_s { FAR struct pcie_bus_s *bus; FAR struct pcie_dev_type_s *type; - uint16_t bdf; + uint16_t bdf; }; /**************************************************************************** @@ -246,7 +319,7 @@ int pci_find_cap(FAR struct pcie_dev_s *dev, uint16_t cap); ****************************************************************************/ int pci_map_bar(FAR struct pcie_dev_s *dev, uint32_t bar, - unsigned long length, uint32_t *ret); + unsigned long length, FAR uint32_t *ret); /**************************************************************************** * Name: pci_map_bar64 @@ -266,7 +339,7 @@ int pci_map_bar(FAR struct pcie_dev_s *dev, uint32_t bar, ****************************************************************************/ int pci_map_bar64(FAR struct pcie_dev_s *dev, uint32_t bar, - unsigned long length, uint64_t *ret); + unsigned long length, FAR uint64_t *ret); /**************************************************************************** * Name: pci_get_bar @@ -284,8 +357,7 @@ int pci_map_bar64(FAR struct pcie_dev_s *dev, uint32_t bar, * ****************************************************************************/ -int pci_get_bar(FAR struct pcie_dev_s *dev, uint32_t bar, - uint32_t *ret); +int pci_get_bar(FAR struct pcie_dev_s *dev, uint32_t bar, FAR uint32_t *ret); /**************************************************************************** * Name: pci_get_bar64 @@ -303,8 +375,7 @@ int pci_get_bar(FAR struct pcie_dev_s *dev, uint32_t bar, * ****************************************************************************/ -int pci_get_bar64(FAR struct pcie_dev_s *dev, uint32_t bar, - uint64_t *ret); +int pci_get_bar64(FAR struct pcie_dev_s *dev, uint32_t bar, uint64_t *ret); /**************************************************************************** * Name: pci_set_bar @@ -322,8 +393,7 @@ int pci_get_bar64(FAR struct pcie_dev_s *dev, uint32_t bar, * ****************************************************************************/ -int pci_set_bar(FAR struct pcie_dev_s *dev, uint32_t bar, - uint32_t val); +int pci_set_bar(FAR struct pcie_dev_s *dev, uint32_t bar, FAR uint32_t val); /**************************************************************************** * Name: pci_set_bar64 @@ -341,8 +411,7 @@ int pci_set_bar(FAR struct pcie_dev_s *dev, uint32_t bar, * ****************************************************************************/ -int pci_set_bar64(FAR struct pcie_dev_s *dev, uint32_t bar, - uint64_t val); +int pci_set_bar64(FAR struct pcie_dev_s *dev, uint32_t bar, uint64_t val); #undef EXTERN #if defined(__cplusplus)
