From owner-freebsd-current Fri Nov 10 4: 6:50 2000 Delivered-To: freebsd-current@freebsd.org Received: from mass.osd.bsdi.com (adsl-63-206-90-77.dsl.snfc21.pacbell.net [63.206.90.77]) by hub.freebsd.org (Postfix) with ESMTP id 2CB5D37B479 for ; Fri, 10 Nov 2000 04:06:47 -0800 (PST) Received: from mass.osd.bsdi.com (localhost [127.0.0.1]) by mass.osd.bsdi.com (8.11.0/8.11.1) with ESMTP id eAACCO906389; Fri, 10 Nov 2000 04:12:25 -0800 (PST) (envelope-from msmith@mass.osd.bsdi.com) Message-Id: <200011101212.eAACCO906389@mass.osd.bsdi.com> X-Mailer: exmh version 2.1.1 10/15/1999 To: Daniel Rock Cc: current@freebsd.org Subject: Re: ISA PnP resource allocation In-reply-to: Your message of "Thu, 09 Nov 2000 21:21:33 +0100." <3A0B074D.4413FDB1@t-online.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Date: Fri, 10 Nov 2000 04:12:24 -0800 From: Mike Smith Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG > 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? > Background: > I do have an old system with several PnP devices. Two of the request the > following IO ports: > first device: port range 0x100-0x3ff size=1 align=1 > second device: port range 0x100-0x3f0 size=8 align=8 > > The first device gets port 0x100-0x100 allocated. Then the code > in isa_common.c tries to allocate the ports for the second device. > 0x100 is already used, so it gets the next free range: 0x101-0x108, > ignoring the alignment constraints. > > The general problem in the code /sys/isa_common.c > isa_find_port(), isa_find_memory(), etc. > > The loops in these routines try to honor the alignment constraints but > the real work is done in /sys/subr_rman.c. Regardless of resource usage > the for(...)-look in above functions is only run once. > > 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. > > > 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/09 20:11:31 > @@ -207,10 +207,10 @@ > start, size); > res[i] = bus_alloc_resource(child, > SYS_RES_IOPORT, &i, > - 0, ~0, 1, 0 /* !RF_ACTIVE */); > + 0, ~0, 1, rman_make_alignment_flags(align)/* !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_start = res[i]->r_start; > + result->ic_port[i].ir_end = res[i]->r_start + size - 1; > result->ic_port[i].ir_size = size; > result->ic_port[i].ir_align = align; > break; > -- ... every activity meets with opposition, everyone who acts has his rivals and unfortunately opponents also. But not because people want to be opponents, rather because the tasks and relationships force people to take different points of view. [Dr. Fritz Todt] V I C T O R Y N O T V E N G E A N C E To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message