00001
00002
00011
00012
00013
00014
00015
00016
00017 #include <l4/sys/types.h>
00018 #include <l4/env/errno.h>
00019 #include <l4/l4rm/l4rm.h>
00020
00021
00022 #include <l4/generic_io/libio.h>
00023
00024
00025 #include "internal.h"
00026 #include "__macros.h"
00027
00028
00038
00039 l4_addr_t l4io_request_mem_region(l4_addr_t start, l4_size_t len, int flags)
00040 {
00041 int err;
00042 l4_addr_t vaddr;
00043 l4_uint32_t area;
00044 l4_size_t area_len;
00045 l4_snd_fpage_t region;
00046 CORBA_Environment _env = dice_default_environment;
00047 unsigned long area_offs;
00048
00049
00050 area_len = generic_io_trunc_page(len) ? nLOG2(len) : GENERIC_IO_MIN_PAGEORDER;
00051
00052
00053 if ((start & ((1UL << area_len) - 1)) + len > (1UL << area_len))
00054 area_len++;
00055
00056 err = l4rm_area_reserve(1UL << area_len,
00057 L4RM_LOG2_ALIGNED | L4RM_LOG2_ALLOC, &vaddr, &area);
00058 if (err)
00059 {
00060 LOG_Error("area reservation failed (%d)", err);
00061 return 0;
00062 }
00063
00064 area_offs = start & ((1UL << area_len) - 1);
00065
00066
00067 _env.rcv_fpage = l4_fpage(vaddr, area_len, L4_FPAGE_RW, 0);
00068 err = l4_io_request_mem_region_call(&io_l4id, start, len, flags, ®ion, &_env);
00069 if (DICE_ERR(err, &_env))
00070 {
00071 l4rm_area_release(area);
00072 return 0;
00073 }
00074
00075 vaddr += area_offs;
00076
00077
00078 return vaddr;
00079 }
00080
00081
00091
00092 int l4io_search_mem_region(l4_addr_t addr,
00093 l4_addr_t *start, l4_size_t *len)
00094 {
00095 int err;
00096
00097 CORBA_Environment _env = dice_default_environment;
00098
00099
00100 err = l4_io_search_mem_region_call(&io_l4id, addr, start, len, &_env);
00101
00102
00103 return DICE_ERR(err, &_env);
00104
00105 }
00106
00107
00116
00117 int l4io_request_region(l4_uint16_t start, l4_uint16_t length)
00118 {
00119 int err;
00120
00121 CORBA_Environment _env = dice_default_environment;
00122
00123 static l4_snd_fpage_t fpages[l4_io_max_fpages];
00124 l4_size_t num;
00125
00126
00127 _env.rcv_fpage = l4_iofpage(0, L4_WHOLE_IOADDRESS_SPACE, 0);
00128 err = l4_io_request_region_call(&io_l4id, start, length, &num, fpages, &_env);
00129
00130
00131 return DICE_ERR(err, &_env);
00132 }
00133
00134
00146
00147 int l4io_release_mem_region(l4_addr_t start, l4_size_t len)
00148 {
00149 int err;
00150
00151 CORBA_Environment _env = dice_default_environment;
00152
00153
00154 err = l4_io_release_mem_region_call(&io_l4id, start, len, &_env);
00155
00156
00157 return DICE_ERR(err, &_env);
00158 }
00159
00160
00169
00170 int l4io_release_region(l4_uint16_t start, l4_uint16_t len)
00171 {
00172 int err;
00173
00174 CORBA_Environment _env = dice_default_environment;
00175
00176
00177 err = l4_io_release_region_call(&io_l4id, start, len, &_env);
00178
00179
00180 return DICE_ERR(err, &_env);
00181 }
00182
00183
00193
00194 int l4io_request_dma(unsigned int channel)
00195 {
00196 return -L4_ESKIPPED;
00197 }
00198
00199
00209
00210 int l4io_release_dma(unsigned int channel)
00211 {
00212 return -L4_ESKIPPED;
00213 }