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; }