Commit SDMA driver changes.
[barrelfish] / usr / drivers / omap44xx / sdma / sdma_domain.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <assert.h>
5
6 #include <barrelfish/barrelfish.h>
7 #include <driverkit/driverkit.h>
8 #include <barrelfish/nameservice_client.h>
9
10 #include <arch/arm/omap44xx/device_registers.h>
11 #include <maps/omap44xx_map.h>
12
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)
15 {
16     errval_t err;
17     struct cnoderef argcn_cnref = {
18         .croot = CPTR_ROOTCN,
19         .cnode = ROOTCN_SLOT_ADDR(ROOTCN_SLOT_ARGCN),
20         .level = CNODE_TYPE_OTHER,
21     };
22
23     struct capref device_cap_iter = {
24         .cnode = argcn_cnref,
25         .slot = 0
26     };
27
28     for (; device_cap_iter.slot < L2_CNODE_SLOTS; device_cap_iter.slot++) {
29         // Get cap data
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) {
36             continue;
37         }
38
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");
43             return err;
44         }
45         assert(err_is_ok(err));
46
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;
53             return SYS_ERR_OK;
54         }
55     }
56
57     return DRIVERKIT_ERR_NO_CAP_FOUND;
58 }
59
60
61 int main(int argc, char** argv)
62 {
63     size_t drivers = 0;
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);
68         cur += 1;
69     }
70
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.");
75     }
76
77     iref_t dev, ctrl;
78     driverkit_create_driver("sdma", "sdma_inst", caps, 1, NULL, 0, 0, &dev, &ctrl);
79
80     messages_handler_loop();
81     return 0;
82 }