[PATCH 01/17] pc386: Eliminate pcibios.h and begin removal obsolete PCI BIOS API uses

Joel Sherrill joel at rtems.org
Wed Mar 9 22:24:46 UTC 2016


This first step eliminates the following as public APIs for the pc386
BSP:

  + pcib_conf_read8
  + pcib_conf_read16
  + pcib_conf_read32
  + pcib_conf_write8
  + pcib_conf_write16
  + pcib_conf_write32

The if_fxp.c driver uses these enough where I provided local macros
to allow the code to be mostly unmodified. On other architectures
these names have been used privately. It will take multiple patches
to completely eliminate these symbols from the RTEMS source tree.

The focus of the first effort is just to eliminate these as a public
pc386 API so support can be added for systems without legacy PCI BIOS.
---
 c/src/lib/libbsp/i386/Makefile.am          |  1 -
 c/src/lib/libbsp/i386/pc386/Makefile.am    |  4 +-
 c/src/lib/libbsp/i386/pc386/preinstall.am  |  4 --
 c/src/lib/libbsp/i386/shared/pci/pcibios.c | 41 ++++++++++++--------
 c/src/lib/libbsp/i386/shared/pci/pcibios.h | 62 ------------------------------
 c/src/libchip/network/if_fxp.c             | 43 ++++++++++++++++++++-
 6 files changed, 67 insertions(+), 88 deletions(-)
 delete mode 100644 c/src/lib/libbsp/i386/shared/pci/pcibios.h

diff --git a/c/src/lib/libbsp/i386/Makefile.am b/c/src/lib/libbsp/i386/Makefile.am
index 397e8e6..f10b764 100644
--- a/c/src/lib/libbsp/i386/Makefile.am
+++ b/c/src/lib/libbsp/i386/Makefile.am
@@ -21,7 +21,6 @@ EXTRA_DIST += shared/irq/idt.c
 EXTRA_DIST += shared/irq/irq_init.c
 
 # shared/pci
-EXTRA_DIST += shared/pci/pcibios.h
 EXTRA_DIST += shared/pci/pcibios.c
 
 include $(top_srcdir)/../../../automake/subdirs.am
diff --git a/c/src/lib/libbsp/i386/pc386/Makefile.am b/c/src/lib/libbsp/i386/pc386/Makefile.am
index 1d52cf4..a9c645b 100644
--- a/c/src/lib/libbsp/i386/pc386/Makefile.am
+++ b/c/src/lib/libbsp/i386/pc386/Makefile.am
@@ -139,10 +139,8 @@ libbsp_a_SOURCES += ../../i386/shared/comm/gdb_glue.c
 # gnat
 libbsp_a_SOURCES += ../../shared/gnatinstallhandler.c
 
-include_HEADERS += ../../i386/shared/pci/pcibios.h
 # pci
-libbsp_a_SOURCES += ../../i386/shared/pci/pcibios.c \
-    ../../i386/shared/pci/pcibios.h
+libbsp_a_SOURCES += ../../i386/shared/pci/pcibios.c
 
 include_HEADERS += ../../i386/shared/comm/uart.h
 # startup
diff --git a/c/src/lib/libbsp/i386/pc386/preinstall.am b/c/src/lib/libbsp/i386/pc386/preinstall.am
index 1b9f862..46b6467 100644
--- a/c/src/lib/libbsp/i386/pc386/preinstall.am
+++ b/c/src/lib/libbsp/i386/pc386/preinstall.am
@@ -166,10 +166,6 @@ $(PROJECT_INCLUDE)/rtems/console_private.h: ../../shared/console_private.h $(PRO
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/console_private.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/console_private.h
 
-$(PROJECT_INCLUDE)/pcibios.h: ../../i386/shared/pci/pcibios.h $(PROJECT_INCLUDE)/$(dirstamp)
-	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/pcibios.h
-PREINSTALL_FILES += $(PROJECT_INCLUDE)/pcibios.h
-
 $(PROJECT_INCLUDE)/uart.h: ../../i386/shared/comm/uart.h $(PROJECT_INCLUDE)/$(dirstamp)
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/uart.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/uart.h
diff --git a/c/src/lib/libbsp/i386/shared/pci/pcibios.c b/c/src/lib/libbsp/i386/shared/pci/pcibios.c
index 870721f..ec19bb3 100644
--- a/c/src/lib/libbsp/i386/shared/pci/pcibios.c
+++ b/c/src/lib/libbsp/i386/shared/pci/pcibios.c
@@ -7,7 +7,7 @@
 
 #include <rtems.h>
 #include <bsp.h>
-#include <pcibios.h>
+#include <rtems/pci.h>
 
 #include <string.h>  /* memcpy */
 
@@ -15,8 +15,6 @@
  * This is simpliest possible PCI BIOS, it assumes that addressing
  * is flat and that stack is big enough
  */
-
-
 static int pcibInitialized = 0;
 static unsigned int pcibEntry;
 
@@ -30,6 +28,18 @@ static volatile unsigned int pcibExchg[5];
 
 static int pcib_convert_err(int err);
 
+/** @brief
+ * Make device signature from bus number, device numebr and function
+ * number
+ */
+#define PCIB_DEVSIG_MAKE(b,d,f) ((b<<8)|(d<<3)|(f))
+
+/** @brief
+ * Extract valrous part from device signature
+ */
+#define PCIB_DEVSIG_BUS(x) (((x)>>8) &0xff)
+#define PCIB_DEVSIG_DEV(x) (((x)>>3) & 0x1f)
+#define PCIB_DEVSIG_FUNC(x) ((x) & 0x7)
 /*
  * Detects presense of PCI BIOS, returns
  * error code
@@ -232,33 +242,30 @@ pci_bus_count(void)
     unsigned char nfn;
     unsigned char hd = 0;
     uint32_t d = 0;
-    int sig;
 
     ucBusCount = 0;
 
     for (bus=0; bus< 0xff; bus++) {
       for (dev=0; dev<PCI_MAX_DEVICES; dev++) {
-        sig = PCIB_DEVSIG_MAKE(bus,dev,0);
-        pcib_conf_read32(sig, PCI_VENDOR_ID, &d);
+        pci_read_config_dword(bus, dev, fun, PCI_VENDOR_ID, &d);
 
         if ( -1 == d ) {
           continue;
         }
 
-        pcib_conf_read8(sig, PCI_HEADER_TYPE, &hd);
+        pci_read_config_byte(bus, dev, fun, PCI_HEADER_TYPE, &hd);
         nfn = (hd & 0x80) ? PCI_MAX_FUNCTIONS : 1;
 
         for ( fun=0; fun<nfn; fun++ ) {
 
-          sig = PCIB_DEVSIG_MAKE(bus,dev,fun);
-          pcib_conf_read32(sig, PCI_VENDOR_ID, &d);
+          pci_read_config_dword(bus, dev, fun, PCI_VENDOR_ID, &d);
           if ( -1 == d )
             continue;
 
-          pcib_conf_read32(sig, PCI_CLASS_REVISION, &d);
+          pci_read_config_dword(bus, dev, fun, PCI_CLASS_REVISION, &d);
 
           if ( (d >> 16) == PCI_CLASS_BRIDGE_PCI ) {
-            pcib_conf_read8(sig, PCI_SUBORDINATE_BUS, &hd);
+            pci_read_config_byte(bus, dev, fun, PCI_SUBORDINATE_BUS, &hd);
 
             if ( hd > ucBusCount )
               ucBusCount = hd;
@@ -313,7 +320,7 @@ pcib_special_cycle(int busNo, int data)
 /*
  * Read byte from config space
  */
-int
+static int
 pcib_conf_read8(int sig, int off, uint8_t *data)
 {
   if (!pcibInitialized) {
@@ -349,7 +356,7 @@ pcib_conf_read8(int sig, int off, uint8_t *data)
 /*
  * Read word from config space
  */
-int
+static int
 pcib_conf_read16(int sig, int off, uint16_t *data)
 {
   if (!pcibInitialized) {
@@ -385,7 +392,7 @@ pcib_conf_read16(int sig, int off, uint16_t *data)
 /*
  * Read dword from config space
  */
-int
+static int
 pcib_conf_read32(int sig, int off, uint32_t *data)
 {
   if (!pcibInitialized) {
@@ -421,7 +428,7 @@ pcib_conf_read32(int sig, int off, uint32_t *data)
 /*
  * Write byte into  config space
  */
-int
+static int
 pcib_conf_write8(int sig, int off, uint8_t data)
 {
   if (!pcibInitialized) {
@@ -451,7 +458,7 @@ pcib_conf_write8(int sig, int off, uint8_t data)
 /*
  * Write word into config space
  */
-int
+static int
 pcib_conf_write16(int sig, int off, uint16_t data)
 {
   if (!pcibInitialized) {
@@ -483,7 +490,7 @@ pcib_conf_write16(int sig, int off, uint16_t data)
 /*
  * Write dword into config space
  */
-int
+static int
 pcib_conf_write32(int sig, int off, uint32_t data)
 {
   if (!pcibInitialized){
diff --git a/c/src/lib/libbsp/i386/shared/pci/pcibios.h b/c/src/lib/libbsp/i386/shared/pci/pcibios.h
deleted file mode 100644
index 0bd693a..0000000
--- a/c/src/lib/libbsp/i386/shared/pci/pcibios.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * @file
- * @ingroup i386_pcibios
- * @brief
- */
-
-/*
- * This software is Copyright (C) 1998 by T.sqware - all rights limited
- * It is provided in to the public domain "as is", can be freely modified
- * as far as this copyight notice is kept unchanged, but does not imply
- * an endorsement by T.sqware of the product in which it is included.
- */
-
-/**
- * @defgroup i386_pcibios
- * @ingroup i386_pci
- * @brief
- * @{
- */
-
-#ifndef _PCIB_H
-#define _PCIB_H
-
-#include <rtems/pci.h>
-
-/** @brief
- * Make device signature from bus number, device numebr and function
- * number
- */
-#define PCIB_DEVSIG_MAKE(b,d,f) ((b<<8)|(d<<3)|(f))
-
-/** @brief
- * Extract valrous part from device signature
- */
-#define PCIB_DEVSIG_BUS(x) (((x)>>8) &0xff)
-#define PCIB_DEVSIG_DEV(x) (((x)>>3) & 0x1f)
-#define PCIB_DEVSIG_FUNC(x) ((x) & 0x7)
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int pcib_find_by_class(int classCode, int idx, int *sig);
-int pcib_special_cycle(int busNo, int data);
-int pcib_conf_read8(int sig, int off, uint8_t *data);
-int pcib_conf_read16(int sig, int off, uint16_t *data);
-int pcib_conf_read32(int sig, int off, uint32_t *data);
-int pcib_conf_write8(int sig, int off, uint8_t data);
-int pcib_conf_write16(int sig, int off, uint16_t data);
-int pcib_conf_write32(int sig, int off, uint32_t data);
-
-int
-pci_find_device( unsigned short vendorid, unsigned short deviceid,
-                   int instance, int *pbus, int *pdev, int *pfun );
-
-/** @} */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _PCIB_H */
diff --git a/c/src/libchip/network/if_fxp.c b/c/src/libchip/network/if_fxp.c
index 9d223bb..ce59db1 100644
--- a/c/src/libchip/network/if_fxp.c
+++ b/c/src/libchip/network/if_fxp.c
@@ -75,7 +75,6 @@
 #include <sys/malloc.h>
 #include <sys/systm.h>
 #include <bsp.h>
-#include <pcibios.h>
 #include <bsp/irq.h>
 #include <rtems/pci.h>
 
@@ -352,6 +351,48 @@ fxp_dma_wait(volatile u_int16_t *status, struct fxp_softc *sc)
 		device_printf(sc->dev, "DMA timeout\n");
 }
 
+/*
+ * These macros and instantiations define PCI Configuration Space accessors
+ * which use the legacy API based on the PCI BIOS only used by pc386.
+ * This was the only device driver using these.
+ *
+ * TBD: It may be worth it to fix this driver to use the current PCI API rather
+ *      than this legacy PC386 API.
+ */
+#define PCIB_DEVSIG_BUS(x) (((x)>>8) &0xff)
+#define PCIB_DEVSIG_DEV(x) (((x)>>3) & 0x1f)
+#define PCIB_DEVSIG_FUNC(x) ((x) & 0x7)
+#define PCIB_DEVSIG_MAKE(b,d,f) ((b<<8)|(d<<3)|(f))
+
+#define PCI_CONF_ACCESSOR(_confop, _baseop, _type) \
+  /* prototype before body */ \
+  static inline int _confop ( \
+    int signature, \
+    int offset, \
+    _type data ); \
+  \
+  static inline int _confop ( \
+    int signature, \
+    int offset, \
+    _type data ) \
+  { \
+    _baseop( \
+        PCIB_DEVSIG_BUS(signature), \
+        PCIB_DEVSIG_DEV(signature), \
+        PCIB_DEVSIG_FUNC(signature), \
+        offset, \
+        data \
+    ); \
+   return PCIB_ERR_SUCCESS; \
+  }
+
+PCI_CONF_ACCESSOR( pcib_conf_read8,   pci_read_config_byte,   uint8_t * );
+PCI_CONF_ACCESSOR( pcib_conf_read16,  pci_read_config_word,   uint16_t * );
+PCI_CONF_ACCESSOR( pcib_conf_read32,  pci_read_config_dword,  uint32_t * );
+PCI_CONF_ACCESSOR( pcib_conf_write8,  pci_write_config_byte,  uint8_t );
+PCI_CONF_ACCESSOR( pcib_conf_write16, pci_write_config_word,  uint16_t );
+PCI_CONF_ACCESSOR( pcib_conf_write32, pci_write_config_dword, uint32_t );
+
 static __inline unsigned int pci_get_vendor(struct fxp_softc *sc) {
   u_int16_t vendor;
   pcib_conf_read16(sc->pci_signature,0,&vendor);
-- 
1.8.3.1




More information about the devel mailing list