Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Nov 2000 19:06:17 +0100
From:      Daniel Rock <D.Rock@t-online.de>
To:        Mike Smith <msmith@freebsd.org>
Cc:        current@freebsd.org
Subject:   Re: ISA PnP resource allocation
Message-ID:  <3A0C3919.D3C56FF5@t-online.de>
References:  <200011101212.eAACCO906389@mass.osd.bsdi.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Dies ist eine mehrteilige Nachricht im MIME-Format.
--------------7CE6D723BBB09DDB5BC341F4
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

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
--------------7CE6D723BBB09DDB5BC341F4
Content-Type: text/plain; charset=us-ascii;
 name="sys.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="sys.diff"

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

--------------7CE6D723BBB09DDB5BC341F4--



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3A0C3919.D3C56FF5>