1/**
2 * \file
3 * \brief Implementation of ata_rw28.if interface (to enable working vfs_fat)
4 */
5/*
6 * Copyright (c) 2013, ETH Zurich.
7 * All rights reserved.
8 *
9 * This file is distributed under the terms in the attached LICENSE file.
10 * If you do not find this file, copies can be found by writing to:
11 * ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group.
12 */
13
14#include <stdlib.h>
15#include <stdio.h>
16#include <string.h>
17#include <assert.h>
18
19#include <barrelfish/barrelfish.h>
20#include <barrelfish/nameservice_client.h>
21#include <if/omap_sdma_defs.h>
22
23#include "sdma.h"
24
25static errval_t mem_copy_handler(struct omap_sdma_binding *sv, struct capref dst, struct capref src, errval_t* err) {
26    struct sdma_driver_state* ds = sv->st;
27    *err = mem_copy(ds, dst, src);
28    return SYS_ERR_OK;
29}
30
31static errval_t mem_fill_handler(struct omap_sdma_binding *sv, struct capref dst, uint8_t color, errval_t* err) {
32    struct sdma_driver_state* ds = sv->st;
33    *err = mem_fill(ds, dst, color);
34    return SYS_ERR_OK;
35}
36
37static errval_t mem_copy_2d_handler(struct omap_sdma_binding *sv,
38                             omap_sdma_addr_2d_t dst, omap_sdma_addr_2d_t src, omap_sdma_count_2d_t count,
39                             bool transparent, uint32_t color, errval_t* err) {
40    struct sdma_driver_state* ds = sv->st;
41    *err = mem_copy_2d(ds, dst, src, count, transparent, color);
42    return SYS_ERR_OK;
43}
44
45static errval_t mem_fill_2d_handler(struct omap_sdma_binding *sv,
46                             omap_sdma_addr_2d_t dst, uint32_t color, omap_sdma_count_2d_t count,
47                             errval_t* err) {
48    struct sdma_driver_state* ds = sv->st;
49    *err = mem_fill_2d(ds, dst, count, color);
50    return SYS_ERR_OK;
51}
52
53static struct export_state {
54    struct omap_sdma_binding* b;
55    bool is_done;
56    errval_t err;
57    iref_t iref;
58} service_export;
59
60static void export_cb(void *st, errval_t err, iref_t iref)
61{
62    service_export.is_done = true;
63    service_export.err = err;
64    service_export.iref = iref;
65
66    if (err_is_ok(err)) {
67        SDMA_DEBUG("Exported ddomain service with iref: %"PRIu32"\n", iref);
68        err = nameservice_register("sdma", iref);
69        assert(err_is_ok(err));
70    }
71}
72
73static const struct omap_sdma_rpc_rx_vtbl rx_vtbl = {
74    .mem_copy_call = mem_copy_handler,
75    .mem_fill_call = mem_fill_handler,
76    .mem_copy_2d_call = mem_copy_2d_handler,
77    .mem_fill_2d_call = mem_fill_2d_handler,
78};
79
80static errval_t client_connect(void *st, struct omap_sdma_binding *b)
81{
82    service_export.b = b;
83    b->rpc_rx_vtbl = rx_vtbl;
84    b->st = st;
85    return SYS_ERR_OK;
86}
87
88void sdma_init_service(struct sdma_driver_state* st, iref_t* iref)
89{
90    errval_t err;
91    SDMA_DEBUG("%s:%d: Starting server\n", __FUNCTION__, __LINE__);
92    err = omap_sdma_export(st, export_cb, client_connect, get_default_waitset(), IDC_EXPORT_FLAGS_DEFAULT);
93    if (err_is_fail(err)) {
94        USER_PANIC_ERR(err, "call failed.");
95    }
96
97    while(!service_export.is_done) {
98        messages_wait_and_handle_next();
99    }
100    *iref = service_export.iref;
101    SDMA_DEBUG("Service sdma exported.\n");
102}
103