summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-01-26 09:28:11 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-02-03 10:00:57 +0100
commit6bf44a581b35aba967034bc3e0348a4d1f36a048 (patch)
treeae2aeeadbcb930f1e998c9b8c8013c9d08f9c64c
parentUse linker set for libio initialization (diff)
downloadrtems-6bf44a581b35aba967034bc3e0348a4d1f36a048.tar.bz2
Use linker set for driver manager initialization
Update #2408.
-rw-r--r--cpukit/libdrvmgr/drvmgr.c90
-rw-r--r--cpukit/sapi/src/exinit.c58
-rw-r--r--cpukit/score/include/rtems/sysinit.h9
3 files changed, 97 insertions, 60 deletions
diff --git a/cpukit/libdrvmgr/drvmgr.c b/cpukit/libdrvmgr/drvmgr.c
index 7c37afd808..03af3900c3 100644
--- a/cpukit/libdrvmgr/drvmgr.c
+++ b/cpukit/libdrvmgr/drvmgr.c
@@ -14,6 +14,8 @@
#include <drvmgr/drvmgr.h>
#include <drvmgr/drvmgr_confdefs.h>
+#include <rtems/sysinit.h>
+
#include "drvmgr_internal.h"
/* Enable debugging */
@@ -642,3 +644,91 @@ void drvmgr_bus_res_add(struct drvmgr_bus *bus,
bres->next = bus->reslist;
bus->reslist = bres;
}
+
+#ifdef RTEMS_DRVMGR_STARTUP
+
+RTEMS_SYSINIT_ITEM(
+ _DRV_Manager_initialization,
+ RTEMS_SYSINIT_DRVMGR,
+ RTEMS_SYSINIT_ORDER_MIDDLE
+);
+
+/* BSPs has already registered their "root bus" driver in the
+ * bsp_predriver hook or so.
+ *
+ * Init Drivers to Level 1, constraints:
+ * - Interrupts and system clock timer does not work.
+ * - malloc() work, however other memory services may not
+ * have been initialized yet.
+ * - initializes most basic stuff
+ *
+ * Typical setup in Level 1:
+ * - Find most devices in system, do PCI scan and configuration.
+ * - Reset hardware if needed.
+ * - Install IRQ driver
+ * - Install Timer driver
+ * - Install console driver and debug printk()
+ * - Install extra memory.
+ */
+static void _DRV_Manager_init_level_1(void)
+{
+ _DRV_Manager_init_level(1);
+}
+
+RTEMS_SYSINIT_ITEM(
+ _DRV_Manager_init_level_1,
+ RTEMS_SYSINIT_DRVMGR_LEVEL_1,
+ RTEMS_SYSINIT_ORDER_MIDDLE
+);
+
+/* Init Drivers to Level 2, constraints:
+ * - Interrupts can be registered and enabled.
+ * - System Clock is running
+ * - Console may be used.
+ *
+ * This is typically where drivers are initialized
+ * for the first time.
+ */
+static void _DRV_Manager_init_level_2(void)
+{
+ _DRV_Manager_init_level(2);
+}
+
+RTEMS_SYSINIT_ITEM(
+ _DRV_Manager_init_level_2,
+ RTEMS_SYSINIT_DRVMGR_LEVEL_2,
+ RTEMS_SYSINIT_ORDER_MIDDLE
+);
+
+/* Init Drivers to Level 3
+ *
+ * This is typically where normal drivers are initialized
+ * for the second time, they may depend on other drivers
+ * API inited in level 2
+ */
+static void _DRV_Manager_init_level_3(void)
+{
+ _DRV_Manager_init_level(3);
+}
+
+RTEMS_SYSINIT_ITEM(
+ _DRV_Manager_init_level_3,
+ RTEMS_SYSINIT_DRVMGR_LEVEL_3,
+ RTEMS_SYSINIT_ORDER_MIDDLE
+);
+
+/* Init Drivers to Level 4,
+ * Init drivers that depend on services initialized in Level 3
+ */
+static void _DRV_Manager_init_level_4(void)
+{
+ _DRV_Manager_init_level(4);
+}
+
+RTEMS_SYSINIT_ITEM(
+ _DRV_Manager_init_level_4,
+ RTEMS_SYSINIT_DRVMGR_LEVEL_4,
+ RTEMS_SYSINIT_ORDER_MIDDLE
+);
+
+#endif /* RTEMS_DRVMGR_STARTUP */
diff --git a/cpukit/sapi/src/exinit.c b/cpukit/sapi/src/exinit.c
index 148268971c..dca42d65bf 100644
--- a/cpukit/sapi/src/exinit.c
+++ b/cpukit/sapi/src/exinit.c
@@ -51,10 +51,6 @@
#include <rtems/sptables.h>
-#ifdef RTEMS_DRVMGR_STARTUP
- #include <drvmgr/drvmgr.h>
-#endif
-
static Objects_Information *
_Internal_Objects[ OBJECTS_INTERNAL_CLASSES_LAST + 1 ];
@@ -129,10 +125,6 @@ static void rtems_initialize_data_structures(void)
static void rtems_initialize_before_drivers(void)
{
- #ifdef RTEMS_DRVMGR_STARTUP
- _DRV_Manager_initialization();
- #endif
-
#if defined(RTEMS_MULTIPROCESSING)
_MPCI_Create_server();
#endif
@@ -146,28 +138,6 @@ static void rtems_initialize_device_drivers(void)
* NOTE: The MPCI may be build upon a device driver.
*/
- #ifdef RTEMS_DRVMGR_STARTUP
- /* BSPs has already registered their "root bus" driver in the
- * bsp_predriver hook or so.
- *
- * Init Drivers to Level 1, constraints:
- * - Interrupts and system clock timer does not work.
- * - malloc() work, however other memory services may not
- * have been initialized yet.
- * - initializes most basic stuff
- *
- * Typical setup in Level 1:
- * - Find most devices in system, do PCI scan and configuration.
- * - Reset hardware if needed.
- * - Install IRQ driver
- * - Install Timer driver
- * - Install console driver and debug printk()
- * - Install extra memory.
- */
- _DRV_Manager_init_level(1);
- bsp_driver_level_hook(1);
- #endif
-
/* Initialize I/O drivers.
*
* Driver Manager note:
@@ -176,34 +146,6 @@ static void rtems_initialize_device_drivers(void)
*/
_IO_Initialize_all_drivers();
- #ifdef RTEMS_DRVMGR_STARTUP
- /* Init Drivers to Level 2, constraints:
- * - Interrupts can be registered and enabled.
- * - System Clock is running
- * - Console may be used.
- *
- * This is typically where drivers are initialized
- * for the first time.
- */
- _DRV_Manager_init_level(2);
- bsp_driver_level_hook(2);
-
- /* Init Drivers to Level 3
- *
- * This is typically where normal drivers are initialized
- * for the second time, they may depend on other drivers
- * API inited in level 2
- */
- _DRV_Manager_init_level(3);
- bsp_driver_level_hook(3);
-
- /* Init Drivers to Level 4,
- * Init drivers that depend on services initialized in Level 3
- */
- _DRV_Manager_init_level(4);
- bsp_driver_level_hook(4);
- #endif
-
#if defined(RTEMS_MULTIPROCESSING)
if ( _System_state_Is_multiprocessing ) {
_MPCI_Initialization();
diff --git a/cpukit/score/include/rtems/sysinit.h b/cpukit/score/include/rtems/sysinit.h
index 178afd8ca3..925593da1a 100644
--- a/cpukit/score/include/rtems/sysinit.h
+++ b/cpukit/score/include/rtems/sysinit.h
@@ -58,9 +58,14 @@ extern "C" {
#define RTEMS_SYSINIT_IDLE_THREADS 000380
#define RTEMS_SYSINIT_LIBIO 000400
#define RTEMS_SYSINIT_ROOT_FILESYSTEM 000401
-#define RTEMS_SYSINIT_BEFORE_DRIVERS 000500
+#define RTEMS_SYSINIT_DRVMGR 000500
+#define RTEMS_SYSINIT_BEFORE_DRIVERS 000501
#define RTEMS_SYSINIT_BSP_PRE_DRIVERS 000600
-#define RTEMS_SYSINIT_DEVICE_DRIVERS 000700
+#define RTEMS_SYSINIT_DRVMGR_LEVEL_1 000700
+#define RTEMS_SYSINIT_DEVICE_DRIVERS 000701
+#define RTEMS_SYSINIT_DRVMGR_LEVEL_2 000702
+#define RTEMS_SYSINIT_DRVMGR_LEVEL_3 000703
+#define RTEMS_SYSINIT_DRVMGR_LEVEL_4 000704
#define RTEMS_SYSINIT_STD_FILE_DESCRIPTORS 000800
/*