make run: Use -vga std
[snowy-minesweeper.git] / include / cdi.h
blob851bb6a20a24f2335a377e5e3119ce1e55a4cdcd
1 /*
2 * Copyright (c) 2007 Kevin Wolf
4 * This program is free software. It comes without any warranty, to
5 * the extent permitted by applicable law. You can redistribute it
6 * and/or modify it under the terms of the Do What The Fuck You Want
7 * To Public License, Version 2, as published by Sam Hocevar. See
8 * http://sam.zoy.org/projects/COPYING.WTFPL for more details.
9 */
11 /**
12 * \german
13 * Core ist das Basismodul von CDI. Es stellt die grundlegenden Datenstrukturen
14 * und Funktionen bereit, auf die andere Module aufbauen.
16 * \section Datenstrukturen
17 * CDI basiert auf drei grundlegenden Datenstrukturen. Die einzelnen Module
18 * erweitern diese Strukturen in einer kompatiblen Weise: cdi_net_driver ist
19 * beispielsweise eine Struktur, die cdi_driver als erstes Element enthält, so
20 * dass sie auf cdi_driver gecastet werden kann. Bei den Strukturen handelt es
21 * sich um:
23 * - cdi_device beschreibt ein allgemeines Gerät. Es hat insbesondere einen
24 * zugehörigen Treiber und eine Adresse, die es in seinem Bus eindeutig
25 * beschreibt.
26 * - cdi_driver beschreibt einen allgemeinen Treiber. Jeder Treiber hat einen
27 * Typ, der beschreibt, zu welchem Modul er gehört und damit auch, in
28 * welchen Datentyp sowohl der Treiber als auch seine Geräte gecastet werden
29 * können. Jeder Treiber hat außerdem eine Reihe von Funktionspointern, die
30 * es der CDI-Bibliothek erlauben, Funktionen im Treiber aufzurufen (z.B. ein
31 * Netzwerkpaket zu versenden)
32 * - cdi_bus_data enthält busspezifische Informationen zu einem Gerät wie die
33 * Adresse des Geräts auf dem Bus (z.B. bus.dev.func für PCI-Geräte) oder
34 * andere busbezogene Felder enthalten (z.B. Vendor/Device ID). Diese
35 * Struktur wird zur Initialisierung von Geräten benutzt, d.h. wenn das
36 * Gerät noch nicht existiert.
38 * \section core_init Initialisierung
40 * Die Initialisierung der Treiber läuft in folgenden Schritten ab:
42 * -# Initialisierung der Treiber: Es wird der init-Callback jedes Treibers
43 * aufgerufen. Anschließend wird der Treiber bei CDI und dem Betriebssystem
44 * registriert, so dass er vor und während der Ausführung von init keine
45 * Anfragen entgegennehmen muss, aber direkt anschließend dafür bereit
46 * sein muss.
47 * -# Suche und Initialisierung der Geräte: Für jedes verfügbare Gerät wird
48 * init_device nacheinander für alle Treiber aufgerufen, bis ein Treiber
49 * das Gerät akzeptiert (oder alle Treiber erfolglos versucht wurden).
50 * \n
51 * @todo Für jedes Gerät scan_bus aufrufen und die dabei gefundenen
52 * Geräte wiederum initialisieren.
53 *\endgerman
55 * \english
56 * The Core module contains the fundamental CDI data structures and functions
57 * on which the other modules are based.
59 * \section Data structures
60 * CDI is based on three basic structures. The other modules extend these
61 * structures in a compatible way: For example, cdi_net_driver is a structure
62 * that contains a cdi_driver as its first element so that it can be cast to
63 * cdi_device. The structures are:
65 * - cdi_device describes a device. Amongst others, it contains fields that
66 * reference the corresponding driver and an address that identifies the
67 * device uniquely on its bus.
68 * - cdi_driver describes a driver. It has a type which determines to which
69 * CDI module the driver belongs (and thus which type the struct may be cast
70 * to). Moreover, each driver has some function points which can be used by
71 * the CDI library to call driver functions (e.g. for sending a network
72 * packet)
73 * - cdi_bus_data contains bus specific information on a device, like the
74 * address of the device on the bus (e.g. bus.dev.func for PCI) or other
75 * bus related information (e.g. device/vendor ID). This structure is used
76 * for initialisation of devices, i.e. when the device itself doesn't exist
77 * yet.
79 * \section core_init Initialisation
81 * Drivers are initialised in the following steps:
83 * -# Initialisation of drivers: The init() callback of each driver is called.
84 * After the driver has returned from there, it is registered with CDI and
85 * the operating system. The driver needs not to be able to handle requests
86 * before it has completed its init() call, but it must be prepared for them
87 * immediately afterwards.
88 * -# Search for and initialisation of devices: For each device init_device is
89 * called in the available drivers until a driver accepts the device (or all
90 * of the drivers reject it).
91 * \n
92 * @todo Call scan_bus for each device and initialise possible child devices
93 * \endenglish
96 * \defgroup core
98 /*\@{*/
100 #ifndef _CDI_H_
101 #define _CDI_H_
103 #include <stdint.h>
105 #include <cdi-osdep.h>
106 #include <cdi/lists.h>
108 typedef enum {
109 CDI_UNKNOWN = 0,
110 CDI_NETWORK = 1,
111 CDI_STORAGE = 2,
112 CDI_SCSI = 3,
113 CDI_VIDEO = 4,
114 CDI_AUDIO = 5,
115 CDI_AUDIO_MIXER = 6,
116 CDI_USB_HCD = 7,
117 CDI_USB = 8,
118 CDI_FILESYSTEM = 9,
119 CDI_PCI = 10,
120 } cdi_device_type_t;
122 struct cdi_driver;
125 * \german
126 * Beschreibt ein Gerät in Bezug auf den Bus, an dem es hängt. Diese
127 * Informationen enthalten in der Regel eine Busadresse und zusätzliche Daten
128 * wie Device/Vendor ID
129 * \endgerman
131 * \english
132 * Describes a device in relation to its bus. This information usually contains
133 * a bus address and some additional data like device/vendor ID.
134 * \endenglish
137 struct cdi_bus_data {
138 cdi_device_type_t bus_type;
142 * \german
143 * Beschreibt ein Gerät
144 * \endgerman
145 * \english
146 * Describes a device
147 * \endenglish
149 struct cdi_device {
151 * \german
152 * Name des Geräts (eindeutig unter den Geräten desselben Treibers)
153 * \endgerman
154 * \english
155 * Name of the device (must be unique among the devices of the same driver)
156 * \endenglish
158 const char* name;
161 * \german
162 * Treiber, der für das Gerät benutzt wird
163 * \endgerman
164 * \english
165 * Driver used for the device
166 * \endenglish
168 struct cdi_driver* driver;
171 * \german
172 * Busspezifische Daten zum Gerät
173 * \endgerman
174 * \english
175 * Bus specific data for the device
176 * \endenglish
178 struct cdi_bus_data* bus_data;
180 // tyndur-spezifisch
181 void* backdev;
185 * \german
186 * Beschreibt einen CDI-Treiber
187 * \endgerman
188 * \english
189 * Describes a CDI driver
190 * \endenglish
192 struct cdi_driver {
193 cdi_device_type_t type;
194 cdi_device_type_t bus;
195 const char* name;
198 * \german
199 * Enthält alle Geräte (cdi_device), die den Treiber benutzen
200 * \endgerman
201 * \english
202 * Contains all devices (cdi_device) which use this driver
203 * \endenglish
205 cdi_list_t devices;
208 * \german
209 * Versucht ein Gerät zu initialisieren. Die Funktion darf von der
210 * CDI-Bibliothek nur aufgerufen werden, wenn bus_data->type dem Typ des
211 * Treibers entspricht
213 * @return Ein per malloc() erzeugtes neues cdi_device, wenn der Treiber
214 * das Gerät akzeptiert. Wenn er das Gerät nicht unterstützt, gibt er
215 * NULL zurück.
216 * \endgerman
218 * \english
219 * Tries to initialise a device. The function may only be called by the CDI
220 * library if bus_data->type matches the type of the driver.
222 * @return A new cdi_device created by malloc() if the driver accepts the
223 * device. NULL if the device is not supported by this driver.
224 * \endenglish
226 struct cdi_device* (*init_device)(struct cdi_bus_data* bus_data);
227 void (*remove_device)(struct cdi_device* device);
229 int (*init)(void);
230 int (*destroy)(void);
234 * \german
235 * Treiber, die ihre eigene main-Funktion implemenieren, müssen diese Funktoin
236 * vor dem ersten Aufruf einer anderen CDI-Funktion aufrufen.
237 * Initialisiert interne Datenstruktur der Implementierung fuer das jeweilige
238 * Betriebssystem und startet anschliessend alle Treiber.
240 * Ein wiederholter Aufruf bleibt ohne Effekt. Es bleibt der Implementierung
241 * der CDI-Bibliothek überlassen, ob diese Funktion zurückkehrt.
242 * \endgerman
244 * \english
245 * Drivers which implement their own main() function must call this function
246 * before they call any other CDI function. It initialises internal data
247 * structures of the CDI implementation and starts all drivers.
249 * This function should only be called once, additional calls will have no
250 * effect. Depending on the implementation, this function may or may not
251 * return.
252 * \endenglish
254 void cdi_init(void);
257 * \german
258 * Initialisiert die Datenstrukturen für einen Treiber
259 * (erzeugt die devices-Liste)
260 * \endgerman
262 * \english
263 * Initialises the data structures for a driver
264 * \endenglish
266 void cdi_driver_init(struct cdi_driver* driver);
269 * \german
270 * Deinitialisiert die Datenstrukturen für einen Treiber
271 * (gibt die devices-Liste frei)
272 * \endgerman
274 * \english
275 * Deinitialises the data structures for a driver
276 * \endenglish
278 void cdi_driver_destroy(struct cdi_driver* driver);
281 * \german
282 * Registriert den Treiber fuer ein neues Geraet
284 * @param driver Zu registierender Treiber
285 * \endgerman
287 * \english
288 * Registers a new driver with CDI
289 * \endenglish
291 void cdi_driver_register(struct cdi_driver* driver);
294 * \german
295 * Informiert dass Betriebssystem, dass ein neues Geraet angeschlossen wurde.
297 * Der Zweck dieser Funktion ist es, Bustreibern zu ermöglichen, die Geräte
298 * auf ihrem Bus anderen Treibern zur Verfügung zu stellen, die über den
299 * PCI-Bus nicht erreichbar sind (z.B. einen USB-Massenspeicher). Sie erlaubt
300 * es Geräten auch, dem OS die Verfügbarkeit anderer Geräte auch außerhalb
301 * einer Controller-Schnittstelle mitzuteilen.
303 * Das Betriebssystem kann daraufhin den passenden Treiber laden (oder einen
304 * geladenen Treiber informieren), den es anhand der Informationen in @a device
305 * finden kann. CDI definiert nicht, welche Aktionen das OS auszuführen hat
306 * oder auf welche Weise mögliche Aktionen (wie das Laden eines Treibers)
307 * umgesetzt werden.
309 * CDI-Implementierungen können diese Funktion auch intern benutzen, um
310 * während der Initialisierung die Geräte auf dem PCI-Bus bereitzustellen.
312 * @return 0 bei Erfolg, -1 im Fehlerfall
313 * \endgerman
314 * \english
315 * Allows a driver to inform the operating system that a new device has become
316 * available.
318 * The rationale behind cdi_provide_device is to allow controller interfaces
319 * to provide devices on their bus which may not be available through the
320 * conventional PCI bus (for example, a USB mass storage device). This also
321 * allows devices to inform the OS of the presence of other devices outside
322 * of the context of a controller interface, where necessary.
324 * The operating system should determine which driver to load (or inform of
325 * the new device) based on the cdi_bus_data struct passed. How the operating
326 * system decides which driver to load/inform is not defined by CDI. An example
327 * would be a simple list generated from a script which parses each driver in
328 * the source tree, finds relevant cdi_bus_data structs, and adds them to a
329 * list which maps the structs to a string. The OS can then use that string to
330 * load a driver somehow.
332 * Whilst CDI could provide a pre-defined list of mappings for operating
333 * systems to use when implementing cdi_provide_device, it was decided that
334 * this would make the interface too rigid. Whilst this method requires a
335 * little more effort from the CDI implementor, it also allows operating
336 * systems to load non-CDI drivers (eg, from a native driver interface) as
337 * defined by the OS-specific mapping list. This would be impossible if CDI
338 * rigidly enforced a specific method.
340 * Operating systems may also choose to implement cdi_provide_device and then
341 * use it when iterating over the PCI bus in order to load drivers dynamically
342 * (effectively treating coldplug devices as hotplugged before boot).
344 * @return 0 on success or -1 if an error was encountered.
345 * \endenglish
347 int cdi_provide_device(struct cdi_bus_data* device);
349 #endif
351 /*\@}*/