From 6bf44a581b35aba967034bc3e0348a4d1f36a048 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 26 Jan 2016 09:28:11 +0100 Subject: Use linker set for driver manager initialization Update #2408. --- cpukit/libdrvmgr/drvmgr.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) (limited to 'cpukit/libdrvmgr') 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 #include +#include + #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 */ -- cgit v1.2.3