From ecefde96a3ee9cdedcd6cd4f2290cf120b066bdd Mon Sep 17 00:00:00 2001 From: imp Date: Tue, 17 Oct 2000 22:08:03 +0000 Subject: Implement resource alignment as discussed in arch@ a long time ago. This was implemented by Shigeru YAMAMOTO-san and Jonathan Chen. I've cleaned them up somewhat and they seem to work well enough to boot current (but given current's state it can be hard to tell). Doug Rabson also reviewed the design and signed off on it. --- sys/kern/subr_rman.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'sys/kern/subr_rman.c') diff --git a/sys/kern/subr_rman.c b/sys/kern/subr_rman.c index 2746acf..91a7bcd 100644 --- a/sys/kern/subr_rman.c +++ b/sys/kern/subr_rman.c @@ -223,7 +223,9 @@ rman_reserve_resource(struct rman *rm, u_long start, u_long end, u_long count, continue; } rstart = max(s->r_start, start); - rend = min(s->r_end, max(start + count, end)); + rstart = (rstart + ((1ul << RF_ALIGNMENT(flags))) - 1) & + ~((1ul << RF_ALIGNMENT(flags)) - 1); + rend = min(s->r_end, max(rstart + count, end)); DPRINTF(("truncated region: [%#lx, %#lx]; size %#lx (requested %#lx)\n", rstart, rend, (rend - rstart + 1), count)); @@ -591,3 +593,23 @@ rman_release_resource(struct resource *r) simple_unlock(rm->rm_slock); return (rv); } + +uint32_t +rman_make_alignment_flags(uint32_t size) +{ + int i; + int count; + + for (i = 0, count = 0; i < 32 && size > 0x01; i++) { + count += size & 1; + size >>= 1; + } + + if (count > 0) + i ++; + + if (i > 31) + i = 0; + + return(RF_ALIGNMENT_LOG2(i)); + } -- cgit v1.1