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