00001
00010
00011
00012
00013
00014
00015 #include <string.h>
00016
00017 #include <l4/generic_io/libio.h>
00018 #include "internal.h"
00019
00020
00021
00022
00023 l4io_desc_device_t *l4io_desc_lookup_device(const char *name,
00024 l4io_info_t *iopage)
00025 {
00026 l4io_desc_device_t *dev = l4io_desc_first_device(iopage);
00027
00028 while (dev)
00029 {
00030 if (!strncmp(name, (const char *)dev->id, L4IO_DEVICE_NAME_LEN))
00031 return dev;
00032
00033 dev = l4io_desc_next_device(dev);
00034 }
00035
00036 return NULL;
00037 }
00038
00039
00040
00041
00042 int l4io_desc_lookup_resource(l4io_desc_device_t *d, unsigned long type, int i)
00043 {
00044 for (; i < d->num_resources; i++)
00045 {
00046 if (d->resources[i].type == type)
00047 return i;
00048 }
00049 return -1;
00050 }
00051
00052
00061
00062 l4_addr_t l4io_request_mem_region_name(const char *name, const int index)
00063 {
00064 l4io_desc_device_t *l4dev;
00065 int i;
00066
00067 if (!l4io_info_page())
00068 return 0;
00069
00070 if ((l4dev = l4io_desc_lookup_device(name, l4io_info_page())) == NULL)
00071 return 0;
00072
00073 if ((i = l4io_desc_lookup_resource(l4dev, L4IO_RESOURCE_MEM, 0)) == -1)
00074 return 0;
00075
00076 return l4io_request_mem_region(l4dev->resources[i].start,
00077 l4dev->resources[i].end
00078 - l4dev->resources[i].start + 1,
00079 L4IO_MEM_NONCACHED);
00080 }
00081
00082
00091
00092 int l4io_get_irq_name(const char *name, const int index)
00093 {
00094 l4io_desc_device_t *l4dev;
00095 int i;
00096
00097 if (!l4io_info_page())
00098 return -1;
00099
00100 if ((l4dev = l4io_desc_lookup_device(name, l4io_info_page())) == NULL)
00101 return -1;
00102
00103 if ((i = l4io_desc_lookup_resource(l4dev, L4IO_RESOURCE_IRQ, 0)) == -1)
00104 return -1;
00105
00106 return l4dev->resources[i].start;
00107 }