6 #include <barrelfish/barrelfish.h>
7 #include <driverkit/driverkit.h>
8 #include <barrelfish/nameservice_client.h>
10 #include <arch/arm/omap44xx/device_registers.h>
11 #include <maps/omap44xx_map.h>
13 /// XXX: TODO not needed once kaluga <-> driver domain communicate over dcontrol iface
14 static errval_t find_cap_for(lpaddr_t address, size_t size, struct capref* out)
17 struct cnoderef argcn_cnref = {
19 .cnode = ROOTCN_SLOT_ADDR(ROOTCN_SLOT_ARGCN),
20 .level = CNODE_TYPE_OTHER,
23 struct capref device_cap_iter = {
28 for (; device_cap_iter.slot < L2_CNODE_SLOTS; device_cap_iter.slot++) {
30 struct capability cap;
31 err = debug_cap_identify(device_cap_iter, &cap);
32 // If cap type was Null, kernel returns error
33 if (err_no(err) == SYS_ERR_IDENTIFY_LOOKUP ||
34 err_no(err) == SYS_ERR_CAP_NOT_FOUND ||
35 err_no(err) == SYS_ERR_LMP_CAPTRANSFER_SRC_LOOKUP) {
39 struct frame_identity fid;
40 err = frame_identify(device_cap_iter, &fid);
41 if (err_is_fail(err)) {
42 DEBUG_ERR(err, "Failure in frame_identify");
45 assert(err_is_ok(err));
47 lpaddr_t address_base = address & ~(BASE_PAGE_SIZE-1);
48 // XXX: should be address+size <= ...
49 // Need to add proper register size
50 if (address_base >= fid.base &&
51 (address_base + size) <= (fid.base + fid.bytes)) {
52 *out = device_cap_iter;
57 return DRIVERKIT_ERR_NO_CAP_FOUND;
61 int main(int argc, char** argv)
64 struct bfdriver* cur = NULL;
65 driverkit_list(&cur, &drivers);
66 for (size_t i=0; i<drivers; i++) {
67 printf("%s:%s:%d: Found device driver class = %s\n", __FILE__, __FUNCTION__, __LINE__, cur->name);
71 struct capref* caps = calloc(1, sizeof(struct capref));
72 errval_t err = find_cap_for(OMAP44XX_MAP_L4_CFG_SDMA, OMAP44XX_MAP_L4_CFG_SDMA_SIZE, &caps[0]);
73 if (err_is_fail(err)) {
74 USER_PANIC_ERR(err, "finding cap failed.");
78 driverkit_create_driver("sdma", "sdma_inst", caps, 1, NULL, 0, 0, &dev, &ctrl);
80 messages_handler_loop();