Date: Fri, 10 Nov 2000 04:12:24 -0800 From: Mike Smith <msmith@freebsd.org> To: Daniel Rock <D.Rock@t-online.de> Cc: current@freebsd.org Subject: Re: ISA PnP resource allocation Message-ID: <200011101212.eAACCO906389@mass.osd.bsdi.com> In-Reply-To: Your message of "Thu, 09 Nov 2000 21:21:33 %2B0100." <3A0B074D.4413FDB1@t-online.de>
next in thread | previous in thread | raw e-mail | index | archive | help
> 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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200011101212.eAACCO906389>