00001
00002
00011
00012
00013
00014
00015
00038
00039 #include <l4/generic_io/libio.h>
00040
00041 #include <l4/dde_linux/dde.h>
00042 #include <l4/env/errno.h>
00043
00044
00045 #include <linux/ioport.h>
00046
00047 #include <l4/log/l4log.h>
00048
00049
00050 #include "__config.h"
00051 #include "internal.h"
00052
00057 static struct dde_region *regions = NULL;
00058
00070 struct resource *request_region(unsigned long start, unsigned long n,
00071 const char *name)
00072 {
00073 int err;
00074
00075 LOGdL(DEBUG_RES_TRACE, "io_addr=%p, size=%ld, name=\"%s\"", (void*)start, n, name);
00076 err = l4io_request_region((l4_addr_t) start, (l4_size_t) n);
00077
00078 if (err)
00079 {
00080 LOGdL(DEBUG_ERRORS, "Error: in l4io_request_region(0x%04lx, %ld) (%d)", start, n, err);
00081 return 0;
00082 }
00083
00084 return (struct resource *) 1;
00085 }
00086
00097 struct resource *request_mem_region(unsigned long start, unsigned long n,
00098 const char *name)
00099 {
00100 l4_addr_t vaddr;
00101 l4_addr_t offset;
00102
00103 LOGdL(DEBUG_RES_TRACE, "phys_addr=%p, size=%ld, name=\"%s\"", (void*)start, n, name);
00104 vaddr = l4io_request_mem_region((l4_addr_t) start, (l4_size_t) n, &offset);
00105
00106 if (!vaddr)
00107 {
00108 LOGdL(DEBUG_ERRORS, "Error: in l4io_request_mem_region(%p, %ld)",
00109 (void*)start, n);
00110 return 0;
00111 }
00112
00113 dde_add_region(®ions, vaddr+offset, start, n);
00114
00115 return (struct resource *) 1;
00116 }
00117
00124 void release_region(unsigned long start, unsigned long n)
00125 {
00126 int err;
00127
00128 LOGdL(DEBUG_RES_TRACE, "io_addr=%p, size=%ld", (void*)start, n);
00129 err = l4io_release_region((l4_addr_t) start, (l4_size_t) n);
00130
00131 if (err)
00132 LOG_Error("release_region(0x%04lx, %ld) failed (%d)", start, n, err);
00133 }
00134
00141 void release_mem_region(unsigned long start, unsigned long n)
00142 {
00143 int err;
00144
00145 LOGdL(DEBUG_RES_TRACE, "phys_addr=%p, size=%ld", (void*)start, n);
00146 err = l4io_release_mem_region((l4_addr_t) start, (l4_size_t) n);
00147
00148 if(err)
00149 {
00150 LOGdL(DEBUG_ERRORS, "Error: release_mem_region(%p, %ld) failed (%d)",
00151 (void*)start, n, err);
00152 return;
00153 }
00154
00155
00156 dde_remove_region(®ions, 0, start, n);
00157 }
00158
00166 int release_resource(struct resource *res)
00167 {
00168 LOG_Error("%s not implemented", __FUNCTION__);
00169
00170 return -L4_EINVAL;
00171 }
00172
00183 int check_region(unsigned long start, unsigned long n)
00184 {
00185 return 0;
00186 }
00187
00198 int check_mem_region(unsigned long start, unsigned long n)
00199 {
00200 return 0;
00201 }
00202
00213 void *ioremap(unsigned long phys_addr, unsigned long size)
00214 {
00215 struct dde_region *p;
00216 void *pp;
00217
00218 LOGdL(DEBUG_RES_TRACE, "phys_addr=%p, size=%ld", (void*)phys_addr, size);
00219
00220 #if !LATER
00221 #warning it is not later
00222
00223 p = regions;
00224 while (p)
00225 {
00226 if ((p->pa <= phys_addr) &&
00227 (p->pa + p->size >= phys_addr + size))
00228 {
00229 pp = (void *) (p->va + (phys_addr - p->pa));
00230 LOGd(DEBUG_RES, "ioremap: %p => %p", (void*)phys_addr, pp);
00231 return pp;
00232 }
00233 p = p->next;
00234 }
00235 #else
00236 if ((pp=(void*)__va(phys_addr)) && __va(phys_addr+size))
00237 {
00238 LOGd(DEBUG_RES, "ioremap: <%p-%p> => <%p-%p>",
00239 phys_addr, phys_addr+size, pp, pp+size);
00240 return pp;
00241 }
00242 #endif
00243
00244 LOG_Error("no ioremap address found for %p", (void*)phys_addr);
00245 return (void *) 0;
00246 }
00247
00259 void *ioremap_nocache(unsigned long phys_addr, unsigned long size)
00260 {
00261 LOGdL(DEBUG_RES_TRACE, "phys_addr=%p, size=%ld\n", (void*)phys_addr, size);
00262
00263 return ioremap(phys_addr, size);
00264 }
00265
00273 void iounmap(void *addr)
00274 {
00275 LOGdL(DEBUG_RES_TRACE, "addr=%p", addr);
00276 }