00001 #include "local.h"
00002
00003 #include <linux/ioport.h>
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 static struct resource *l4dde26_request_region(resource_size_t start,
00018 resource_size_t n,
00019 const char *name)
00020 {
00021 int err = ddekit_request_io(start, n);
00022
00023 if (err)
00024 return NULL;
00025
00026 return (struct resource *)1;
00027 }
00028
00029
00030
00031
00032
00033 static LIST_HEAD(dde_mem_regions);
00034
00035
00036 struct dde_mem_region {
00037 ddekit_addr_t pa;
00038 ddekit_addr_t va;
00039 unsigned int size;
00040 struct list_head list;
00041 };
00042
00043 void __iomem * ioremap(unsigned long phys_addr, unsigned long size);
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 static struct resource *l4dde26_request_mem_region(resource_size_t start,
00058 resource_size_t n,
00059 const char *name)
00060 {
00061 ddekit_addr_t va = 0;
00062 struct dde_mem_region *mreg;
00063
00064
00065 if (ioremap(start, n))
00066 return (struct resource *)1;
00067
00068 int i = ddekit_request_mem(start, n, &va);
00069
00070 if (i) {
00071 ddekit_printf("request_mem_region() failed (start %lx, size %x)", start, n);
00072 return NULL;
00073 }
00074
00075 mreg = kmalloc(sizeof(struct dde_mem_region), GFP_KERNEL);
00076 Assert(mreg);
00077
00078 mreg->pa = start;
00079 mreg->va = va;
00080 mreg->size = n;
00081 list_add(&mreg->list, &dde_mem_regions);
00082
00083 #if 0
00084 ddekit_pgtab_set_region_with_size((void *)va, start, n, PTE_TYPE_OTHER);
00085 #endif
00086
00087 return (struct resource *)1;
00088 }
00089
00090
00091 struct resource * __request_region(struct resource *parent,
00092 resource_size_t start,
00093 resource_size_t n,
00094 const char *name, int flags)
00095 {
00096 Assert(parent);
00097 Assert(parent->flags & IORESOURCE_IO || parent->flags & IORESOURCE_MEM);
00098
00099 switch (parent->flags)
00100 {
00101 case IORESOURCE_IO:
00102 return l4dde26_request_region(start, n, name);
00103 case IORESOURCE_MEM:
00104 return l4dde26_request_mem_region(start, n, name);
00105 }
00106
00107 return NULL;
00108 }
00109
00110
00111
00112
00113 static void l4dde26_release_region(resource_size_t start, resource_size_t n)
00114 {
00115
00116
00117
00118 ddekit_release_io(start, n);
00119 }
00120
00121
00122
00123
00124 static void l4dde26_release_mem_region(resource_size_t start, resource_size_t n)
00125 {
00126 ddekit_release_mem(start, n);
00127 ddekit_pgtab_clear_region((void *)start, PTE_TYPE_OTHER);
00128 }
00129
00130
00131 int __check_region(struct resource *root, resource_size_t s, resource_size_t n)
00132 {
00133 WARN_UNIMPL;
00134 return -1;
00135 }
00136
00137 void __release_region(struct resource *root, resource_size_t start,
00138 resource_size_t n)
00139 {
00140 switch (root->flags)
00141 {
00142 case IORESOURCE_IO:
00143 return l4dde26_release_region(start, n);
00144 case IORESOURCE_MEM:
00145 return l4dde26_release_mem_region(start, n);
00146 }
00147 }
00148
00149
00150
00151
00152
00153
00154
00155 void __iomem * ioremap(unsigned long phys_addr, unsigned long size)
00156 {
00157 struct list_head *pos, *head;
00158 head = &dde_mem_regions;
00159
00160 list_for_each(pos, head) {
00161 struct dde_mem_region *mreg = list_entry(pos, struct dde_mem_region,
00162 list);
00163 if (mreg->pa <= phys_addr && mreg->pa + mreg->size >= phys_addr + size)
00164 return (void *)(mreg->va + (phys_addr - mreg->pa));
00165 }
00166
00167 return NULL;
00168 }
00169
00170
00171 void __iomem * ioremap_nocache(unsigned long offset, unsigned long size)
00172 {
00173 return ioremap(offset, size);
00174 }
00175
00176
00177 void iounmap(volatile void __iomem *addr)
00178 {
00179 WARN_UNIMPL;
00180 }