Warner Losh schrieb:
> 
> In message <[EMAIL PROTECTED]> Daniel Rock writes:
> : I already filed a PR for this problem but my first solution was a real
> : hack (kern/21461).
> :
> : [another solution would be to introduce another flag for
> : rman_reserve_resource() not to search for alternate regions.
> 
> Would the alignment stuff I added for cardbus help any?

I think, my patch basically uses now the same alignment options from
the resource manager like cardbus does now.

I have cleaned up the code a little bit: Now the code uses the
rman_get_XXX() macros and also checks if the region returned is below the
end mark.

Daniel
Index: sys/isa/isa_common.c
===================================================================
RCS file: /data/cvs/src/sys/isa/isa_common.c,v
retrieving revision 1.18
diff -u -r1.18 isa_common.c
--- sys/isa/isa_common.c        2000/07/12 00:42:08     1.18
+++ sys/isa/isa_common.c        2000/11/14 21:27:34
@@ -133,31 +133,30 @@
        result->ic_nmem = config->ic_nmem;
        for (i = 0; i < config->ic_nmem; i++) {
                u_int32_t start, end, size, align;
-               for (start = config->ic_mem[i].ir_start,
-                            end = config->ic_mem[i].ir_end,
-                            size = config->ic_mem[i].ir_size,
-                            align = config->ic_mem[i].ir_align;
-                    start + size - 1 <= end;
-                    start += align) {
-                       bus_set_resource(child, SYS_RES_MEMORY, i,
-                                        start, size);
-                       res[i] = bus_alloc_resource(child,
-                                                   SYS_RES_MEMORY, &i,
-                                                   0, ~0, 1, 0 /* !RF_ACTIVE */);
-                       if (res[i]) {
-                               result->ic_mem[i].ir_start = start;
-                               result->ic_mem[i].ir_end = start + size - 1;
-                               result->ic_mem[i].ir_size = size;
-                               result->ic_mem[i].ir_align = align;
+
+               start = config->ic_mem[i].ir_start;
+               end = config->ic_mem[i].ir_end;
+               size = config->ic_mem[i].ir_size;
+               align = config->ic_mem[i].ir_align;
+               if(!align)
+                       align = 1;
+               bus_set_resource(child, SYS_RES_MEMORY, i,
+                                start, size);
+               res[i] = bus_alloc_resource(child,
+                                           SYS_RES_MEMORY, &i,
+                                           0, ~0, 1,
+                                           rman_make_alignment_flags(align));
+               if (res[i]) {
+                       if(rman_get_start(res[i]) > end) {
+                               success = 0;
                                break;
                        }
+                       result->ic_mem[i].ir_start = rman_get_start(res[i]);
+                       result->ic_mem[i].ir_end = rman_get_end(res[i]);
+                       result->ic_mem[i].ir_size = rman_get_size(res[i]);
+                       result->ic_mem[i].ir_align = align;
                }
-
-               /*
-                * If we didn't find a place for memory range i, then 
-                * give up now.
-                */
-               if (!res[i]) {
+               else {
                        success = 0;
                        break;
                }
@@ -197,31 +196,31 @@
        result->ic_nport = config->ic_nport;
        for (i = 0; i < config->ic_nport; i++) {
                u_int32_t start, end, size, align;
-               for (start = config->ic_port[i].ir_start,
-                            end = config->ic_port[i].ir_end,
-                            size = config->ic_port[i].ir_size,
-                            align = config->ic_port[i].ir_align;
-                    start + size - 1 <= end;
-                    start += align) {
-                       bus_set_resource(child, SYS_RES_IOPORT, i,
-                                        start, size);
-                       res[i] = bus_alloc_resource(child,
-                                                   SYS_RES_IOPORT, &i,
-                                                   0, ~0, 1, 0 /* !RF_ACTIVE */);
-                       if (res[i]) {
-                               result->ic_port[i].ir_start = start;
-                               result->ic_port[i].ir_end = start + size - 1;
-                               result->ic_port[i].ir_size = size;
-                               result->ic_port[i].ir_align = align;
+
+               start = config->ic_port[i].ir_start;
+               end = config->ic_port[i].ir_end;
+               size = config->ic_port[i].ir_size;
+               align = config->ic_port[i].ir_align;
+               if(!align)
+                       align = 1;
+
+               bus_set_resource(child, SYS_RES_IOPORT, i,
+                                start, size);
+               res[i] = bus_alloc_resource(child,
+                                           SYS_RES_IOPORT, &i,
+                                           0, ~0, 1,
+                                           rman_make_alignment_flags(align));
+               if (res[i]) {
+                       if(rman_get_start(res[i]) > end) {
+                               success = 0;
                                break;
                        }
+                       result->ic_port[i].ir_start = rman_get_start(res[i]);
+                       result->ic_port[i].ir_end = rman_get_end(res[i]);
+                       result->ic_port[i].ir_size = rman_get_size(res[i]);
+                       result->ic_port[i].ir_align = align;
                }
-
-               /*
-                * If we didn't find a place for port range i, then 
-                * give up now.
-                */
-               if (!res[i]) {
+               else {
                        success = 0;
                        break;
                }

Reply via email to