Date: Tue, 14 Nov 2000 22:54:44 +0100 From: Daniel Rock <D.Rock@t-online.de> To: Warner Losh <imp@village.org> Cc: current@FreeBSD.ORG, msmith@FreeBSD.ORG Subject: Re: ISA PnP resource allocation Message-ID: <3A11B4A4.6503FB73@t-online.de> References: <3A0B074D.4413FDB1@t-online.de> <200011122030.NAA00596@harmony.village.org>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Warner Losh schrieb:
>
> In message <3A0B074D.4413FDB1@t-online.de> 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
[-- Attachment #2 --]
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;
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3A11B4A4.6503FB73>
