Skip site navigation (1)Skip section navigation (2)
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>