X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=kitten%2Finclude%2Flwk%2Fdriver.h;fp=kitten%2Finclude%2Flwk%2Fdriver.h;h=d5eebea7a91f1762da0a7ca001924646c2d62a47;hb=66a1a4c7a9edcd7d8bc207aca093d694a6e6b5b2;hp=0000000000000000000000000000000000000000;hpb=f7cf9c19ecb0a589dd45ae0d2c91814bd3c2acc2;p=palacios.git diff --git a/kitten/include/lwk/driver.h b/kitten/include/lwk/driver.h new file mode 100644 index 0000000..d5eebea --- /dev/null +++ b/kitten/include/lwk/driver.h @@ -0,0 +1,88 @@ +#ifndef _LWK_DRIVER_H +#define _LWK_DRIVER_H + +#include +#include + +/* + * Drivers may set DRIVER_NAME before including this header. + * Otherwise, the KBUILD name is used. + */ +#ifndef DRIVER_NAME +#define DRIVER_NAME KBUILD_MODNAME +#endif + +/* + * Driver parameter names have the form: + * + * driver_name.parameter_name + * + * Example: + * To set integer parameter foo in driver bar, add this + * to the kernel boot command line: + * + * bar.foo=1 + */ +#define __DRIVER_PARAM_PREFIX DRIVER_NAME "." + +/* + * For driver parameters. Parameters can be configured via the + * kernel boot command line or some other platform-dependent + * runtime mechanism. + */ +#include + +#define driver_param(name, type) \ + __param_named(__DRIVER_PARAM_PREFIX, name, name, type) + +#define driver_param_named(name, value, type) \ + __param_named(__DRIVER_PARAM_PREFIX, name, value, type) + +#define driver_param_string(name, string, len) \ + __param_string(__DRIVER_PARAM_PREFIX, name, string, len) + +#define driver_param_array(name, type, nump) \ + __param_array_named(__DRIVER_PARAM_PREFIX, name, name, type, nump) + +#define driver_param_array_named(name, array, type, nump) \ + __param_array_named(__DRIVER_PARAM_PREFIX, name, array, type, nump) + +/* + * Every driver defines one of these structures via the + * driver_init() macro. The structure gets placed in the + * __driver_table ELF section and the kernel walks this table + * to find/initialize all drivers in the system. + */ +struct driver_info { + const char * name; // name of the driver + void (*init)(void); // driver initialization function + int init_called; // set when .init() has been called, + // used to prevent double inits. +}; + +/* + * This adds a function to the __driver_table ELF section. + */ +#define driver_init(init_func) \ + static char __driver_name[] = DRIVER_NAME; \ + static struct driver_info const __driver_info \ + __attribute_used__ \ + __attribute__ ((unused,__section__ ("__driver_table"), \ + aligned(sizeof(void *)))) \ + = { __driver_name, init_func }; + +/* + * The __driver_table ELF section is surrounded by these symbols, + * which are defined in the platform's linker script. + */ +extern struct driver_info __start___driver_table[]; +extern struct driver_info __stop___driver_table[]; + +/* + * This is a placeholder. Currently drivers are never unloaded once loaded. + */ +#define driver_exit(exit_func) + +extern int driver_init_by_name(const char *name); + +#endif