summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_rman.c
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2000-10-17 22:08:03 +0000
committerimp <imp@FreeBSD.org>2000-10-17 22:08:03 +0000
commitecefde96a3ee9cdedcd6cd4f2290cf120b066bdd (patch)
treed40fca688ce64d2a69dd337c2251632ca4d77764 /sys/kern/subr_rman.c
parentd549a1165677897bf761ddba2761ed64d3a2989f (diff)
downloadFreeBSD-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/subr_rman.c')
-rw-r--r--sys/kern/subr_rman.c24
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));
+ }
OpenPOWER on IntegriCloud