1 /*
2  * Copyright (C) 2015-2021 Alibaba Group Holding Limited
3  */
4 
5 #ifndef _U_LD_H_
6 #define _U_LD_H_
7 
8 /**
9  * hardware registers' information
10  * @addr - register's base address of hw module
11  * @length - register region's length counted from base address of the hw module
12  */
13 typedef struct hw_reg_info {
14     unsigned long addr;
15     int length;
16 } hw_reg_info_t;
17 
18 /**
19  * hardware's register information array
20  * @size - array size of hw
21  * @hw  - pointer to hw_reg_info_t
22  */
23 typedef struct hw_reg_array_info {
24     int size;
25     hw_reg_info_t *hw[];
26 } hw_reg_array_info_t;
27 
28 /**
29  * all driver entry declared with marcos in this file should be define with this prototype
30  */
31 typedef int (*OS_DRIVER_ENTRY)(void);
32 
33 /**
34  * function prototype used to get hardware module's register information
35  */
36 typedef hw_reg_array_info_t* (*DEVICE_HW_REG_INFO)(void);
37 
38 /**
39  * this is the only driver entry API, when a driver is selected, must call this API in proper place
40  *
41  * @string process identification
42  *
43  * @return 0 for success; negative error number for failure
44  */
45 extern int u_driver_entry(char *string);
46 
47 /**
48  * all driver entry declared with XXXX_DRIVER_ENTRY or XXXX_DRIVER_FULL_ENTRY will be called with specified
49  * sequence
50  *
51  * @return 0 for success; negative error no. for failure
52  */
53 extern int _os_driver_entry(void);
54 
55 /**
56  * unified driver initialization entry
57  * do register map prior to call driver's init entry in user space
58  *
59  * @param drv_name - driver's name
60  * @param drv_init_entry - pointer to driver's init entry
61  * @param get_hw_info - pointer to the function to get driver's register info
62  * @return 0 for success; negative for failure
63  *
64  */
65 extern int _unify_driver_init(const char *drv_name, OS_DRIVER_ENTRY drv_init_entry, DEVICE_HW_REG_INFO get_hw_info);
66 
67 #define TRACE_DRV_ENTRY() //printf("%s\r\n", __func__)
68 
69 /* ld sections declaration */
70 #if defined (__CC_ARM) || defined (__GNUC__)
71 #define OS_CORE_DRIVER_ATT    __attribute__((used, section(".core_driver_entry")))
72 #define OS_BUS_DRIVER_ATT     __attribute__((used, section(".bus_driver_entry")))
73 #define OS_EARLY_DRIVER_ATT   __attribute__((used, section(".early_driver_entry")))
74 #define OS_VFS_DRIVER_ATT     __attribute__((used, section(".vfs_driver_entry")))
75 #define OS_LEVEL0_DRIVER_ATT  __attribute__((used, section(".level0_driver_entry")))
76 #define OS_LEVEL1_DRIVER_ATT  __attribute__((used, section(".level1_driver_entry")))
77 #define OS_LEVEL2_DRIVER_ATT  __attribute__((used, section(".level2_driver_entry")))
78 #define OS_LEVEL3_DRIVER_ATT  __attribute__((used, section(".level3_driver_entry")))
79 #define OS_POST_DRIVER_ATT    __attribute__((used, section(".post_driver_entry")))
80 #elif defined (__ICCARM__)
81 #pragma OS_CORE_DRIVER_ATT   = ".core_driver_entry"
82 #pragma OS_BUS_DRIVER_ATT    = ".bus_driver_entry"
83 #pragma OS_EARLY_DRIVER_ATT  = ".early_driver_entry"
84 #pragma OS_VFS_DRIVER_ATT    = ".vfs_driver_entry"
85 #pragma OS_LEVEL0_DRIVER_ATT = ".level0_driver_entry"
86 #pragma OS_LEVEL1_DRIVER_ATT = ".level1_driver_entry"
87 #pragma OS_LEVEL2_DRIVER_ATT = ".level2_driver_entry"
88 #pragma OS_LEVEL3_DRIVER_ATT = ".level3_driver_entry"
89 #pragma OS_POST_DRIVER_ATT   = ".post_driver_entry"
90 #endif
91 
92 /**
93  * Usage: if vendor or developer want to define a new device driver
94  *  you don't need to care how to call your driver initialization,
95  *  just select proper marcos here and declara your driver init function
96  *  by XXXX_DRIVER_ENTRY(YOUR_DRIVER_INIT_FUNCTION) or XXXX_DRIVER_FULL_ENTRY(YOUR_DRIVER_INIT_FUNCTION)
97  *
98  * basic concept of the following marcos is as follows:
99  * 1. define a new function named xxxx_##your_driver_init_function,
100  *  and put this new API's entry into image's section named .xxxx_entry
101  * 2. when _os_driver_entry is called, it will read the functions pointers
102  *  from .xxxx_entry image section and call them one by one
103  *
104  * */
105 #define CORE_DRIVER_ENTRY(x) int core_drv_##x(void) { \
106     TRACE_DRV_ENTRY(); \
107     return x(); \
108 } \
109 OS_CORE_DRIVER_ATT OS_DRIVER_ENTRY core_##x = core_drv_##x;
110 
111 #define BUS_DRIVER_FULL_ENTRY(init, get_hw_info) int bus_drv_##init(void) { \
112     return _unify_driver_init(__func__, init, get_hw_info); \
113 } \
114 OS_BUS_DRIVER_ATT OS_DRIVER_ENTRY bus_##init = bus_drv_##init;
115 
116 #define BUS_DRIVER_ENTRY(init) BUS_DRIVER_FULL_ENTRY(init, NULL)
117 
118 
119 #define VFS_DRIVER_FULL_ENTRY(init, get_hw_info) int vfs_drv_##init(void) { \
120     return _unify_driver_init(__func__, init, get_hw_info); \
121 } \
122 OS_VFS_DRIVER_ATT OS_DRIVER_ENTRY vfs_##init = vfs_drv_##init;
123 
124 #define VFS_DRIVER_ENTRY(init) VFS_DRIVER_FULL_ENTRY(init, NULL)
125 
126 #define EARLY_DRIVER_FULL_ENTRY(init, get_hw_info) int early_drv_##init(void) { \
127     return _unify_driver_init(__func__, init, get_hw_info); \
128 } \
129 OS_EARLY_DRIVER_ATT OS_DRIVER_ENTRY early_##init = early_drv_##init;
130 
131 #define EARLY_DRIVER_ENTRY(init) EARLY_DRIVER_FULL_ENTRY(init, NULL)
132 
133 #define LEVEL0_DRIVER_FULL_ENTRY(init, get_hw_info) int level0_drv_##init(void) { \
134     return _unify_driver_init(__func__, init, get_hw_info); \
135 } \
136 OS_LEVEL0_DRIVER_ATT OS_DRIVER_ENTRY level0_##init = level0_drv_##init;
137 
138 #define LEVEL0_DRIVER_ENTRY(init) LEVEL0_DRIVER_FULL_ENTRY(init, NULL)
139 
140 #define LEVEL1_DRIVER_FULL_ENTRY(init, get_hw_info) int level1_drv_##init(void) { \
141     return _unify_driver_init(__func__, init, get_hw_info); \
142 } \
143 OS_LEVEL1_DRIVER_ATT OS_DRIVER_ENTRY level1_##init = level1_drv_##init;
144 
145 #define LEVEL1_DRIVER_ENTRY(init) LEVEL1_DRIVER_FULL_ENTRY(init, NULL)
146 
147 
148 #define LEVEL2_DRIVER_FULL_ENTRY(init, get_hw_info) int level2_drv_##init(void) { \
149     return _unify_driver_init(__func__, init, get_hw_info); \
150 } \
151 OS_LEVEL2_DRIVER_ATT OS_DRIVER_ENTRY level2_##init = level2_drv_##init;
152 
153 #define LEVEL2_DRIVER_ENTRY(init) LEVEL2_DRIVER_FULL_ENTRY(init, NULL)
154 
155 #define LEVEL3_DRIVER_FULL_ENTRY(init, get_hw_info) int level3_drv_##init(void) { \
156     return _unify_driver_init(__func__, init, get_hw_info); \
157 } \
158 OS_LEVEL3_DRIVER_ATT OS_DRIVER_ENTRY level3_##init = level3_drv_##init;
159 
160 #define LEVEL3_DRIVER_ENTRY(init) LEVEL3_DRIVER_FULL_ENTRY(init, NULL)
161 
162 #define POST_DRIVER_FULL_ENTRY(init, get_hw_info) int post_drv_##init(void) { \
163     return _unify_driver_init(__func__, init, get_hw_info); \
164 } \
165 OS_POST_DRIVER_ATT OS_DRIVER_ENTRY post_##init = post_drv_##init;
166 
167 #define POST_DRIVER_ENTRY(init) POST_DRIVER_FULL_ENTRY(init, NULL)
168 
169 #endif //_U_LD_H_
170