Main Page | Modules | Class List | File List | Class Members | File Members | Related Pages

res.c

Go to the documentation of this file.
00001 /* $Id: res.c,v 1.12 2004/02/18 22:34:12 reuther Exp $ */
00002 /*****************************************************************************/
00011 /* (c) 2003 Technische Universitaet Dresden
00012  * This file is part of DROPS, which is distributed under the terms of the
00013  * GNU General Public License 2. Please see the COPYING file for details.
00014  */
00015 
00038 /* L4 */
00039 #include <l4/generic_io/libio.h>
00040 
00041 #include <l4/dde_linux/dde.h>
00042 #include <l4/env/errno.h>
00043 
00044 /* Linux */
00045 #include <linux/ioport.h>
00046 
00047 #include <l4/log/l4log.h>
00048 
00049 /* local */
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   /* keep region info */
00113   dde_add_region(&regions, 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   /* keep region info */
00156   dde_remove_region(&regions, 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   /* look in I/O region table/list */
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 /* LATER, whatever this means */
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 /* LATER */
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 }

Linux DDE, written by Christian Helmuth  © 2003 Technische Universitaet Dresden