Mike Smith schrieb:
> 
> > Now that someone has implementented resource alignment in the resource
> > allocator, someone could review and integrate the attached patch.
> 
> This looks fine to me.  I assume you'd want the same changes applied to
> aligning memory regions?
I didn't run in this problem, but maybe some other person will, so: yes!

I don't know the code in /sys/kern/subr_rman.c well. Does it only find
nearby regions or also other as well. If it does find any region with the
alignment constraints, the for(...) loop in /sys/isa/isa_common.c is
completely meaningless and should be eliminated. The code then should look
like this below (works at least for me).

Daniel
Index: 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
--- isa/isa_common.c    2000/07/12 00:42:08     1.18
+++ isa/isa_common.c    2000/11/10 18:05:42
@@ -133,31 +133,26 @@
        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;
-                               break;
-                       }
-               }
 
-               /*
-                * If we didn't find a place for memory range i, then 
-                * give up now.
-                */
-               if (!res[i]) {
+               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]) {
+                       result->ic_mem[i].ir_start = res[i]->r_start;
+                       result->ic_mem[i].ir_end = res[i]->r_end;
+                       result->ic_mem[i].ir_size = res[i]->r_end - res[i]->r_start + 
+1;
+                       result->ic_mem[i].ir_align = align;
+               }
+               else {
                        success = 0;
                        break;
                }
@@ -197,31 +192,27 @@
        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;
-                               break;
-                       }
-               }
 
-               /*
-                * If we didn't find a place for port range i, then 
-                * give up now.
-                */
-               if (!res[i]) {
+               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]) {
+                       result->ic_port[i].ir_start = res[i]->r_start;
+                       result->ic_port[i].ir_end = res[i]->r_end;
+                       result->ic_port[i].ir_size = res[i]->r_end - res[i]->r_start + 
+1;
+                       result->ic_port[i].ir_align = align;
+               }
+               else {
                        success = 0;
                        break;
                }

Reply via email to