diff options
author | imp <imp@FreeBSD.org> | 2000-10-17 22:08:03 +0000 |
---|---|---|
committer | imp <imp@FreeBSD.org> | 2000-10-17 22:08:03 +0000 |
commit | ecefde96a3ee9cdedcd6cd4f2290cf120b066bdd (patch) | |
tree | d40fca688ce64d2a69dd337c2251632ca4d77764 /sys/kern | |
parent | d549a1165677897bf761ddba2761ed64d3a2989f (diff) | |
download | FreeBSD-src-ecefde96a3ee9cdedcd6cd4f2290cf120b066bdd.zip FreeBSD-src-ecefde96a3ee9cdedcd6cd4f2290cf120b066bdd.tar.gz |
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.
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/subr_rman.c | 24 |
1 files changed, 23 insertions, 1 deletions
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)); + } |