[coreboot-gerrit] Change in coreboot[master]: device/pnp: simplify pnp_get_ioresource

Samuel Holland (Code Review) gerrit at coreboot.org
Wed Jun 7 20:58:20 CEST 2017


Samuel Holland has uploaded this change for review. ( https://review.coreboot.org/20095


Change subject: device/pnp: simplify pnp_get_ioresource
......................................................................

device/pnp: simplify pnp_get_ioresource

This also fixes the limit for single I/O ports:
-    PNP: 002e.5 resource base 60 size 1 align 0 gran 0 limit ffffffff flags c0000100 index 60
+    PNP: 002e.5 resource base 60 size 1 align 0 gran 0 limit fff flags c0000100 index 60
-    PNP: 002e.5 resource base 64 size 1 align 0 gran 0 limit ffffffff flags c0000100 index 62
+    PNP: 002e.5 resource base 64 size 1 align 0 gran 0 limit fff flags c0000100 index 62

Change-Id: Ia99b785dcd9cf56fb236ad7ade54656851f88a5e
Signed-off-by: Samuel Holland <samuel at sholland.org>
---
M src/device/pnp_device.c
1 file changed, 14 insertions(+), 28 deletions(-)



  git pull ssh://review.coreboot.org:29418/coreboot refs/changes/95/20095/1

diff --git a/src/device/pnp_device.c b/src/device/pnp_device.c
index e7839de..5f69a76 100644
--- a/src/device/pnp_device.c
+++ b/src/device/pnp_device.c
@@ -194,7 +194,7 @@
 static void pnp_get_ioresource(device_t dev, u8 index, u16 mask)
 {
 	struct resource *resource;
-	unsigned moving, gran, step;
+	u16 gran, limit;
 
 	if (!mask) {
 		printk(BIOS_ERR, "ERROR: device %s index %d has no mask.\n",
@@ -205,40 +205,26 @@
 	resource = new_resource(dev, index);
 
 	/* Initilize the resource. */
-	resource->limit = 0xffff;
 	resource->flags |= IORESOURCE_IO;
 
-	/* Get the resource size... */
+	/* Get the resource limit (all writiable bits set to one). */
+	limit = mask;
+	limit |= limit >> 1;
+	limit |= limit >> 2;
+	limit |= limit >> 4;
+	limit |= limit >> 8;
 
-	moving = mask;
-	gran = 15;
-	step = 1 << gran;
-
-	/* Find the first bit that moves. */
-	while ((moving & step) == 0) {
-		gran--;
-		step >>= 1;
-	}
-
-	/* Now find the first bit that does not move. */
-	while ((moving & step) != 0) {
-		gran--;
-		step >>= 1;
-	}
-
-	/*
-	 * Of the moving bits the last bit in the first group,
-	 * tells us the size of this resource.
-	 */
-	if ((moving & step) == 0) {
-		gran++;
-		step <<= 1;
+	/* Get the resource granularity (unwritable bits at the low end). */
+	gran = 0;
+	while ((mask & 1) == 0) {
+		gran += 1;
+		mask >>= 1;
 	}
 
 	/* Set the resource size and alignment. */
-	resource->gran  = gran;
 	resource->align = gran;
-	resource->limit = mask | (step - 1);
+	resource->gran  = gran;
+	resource->limit = limit;
 	resource->size  = 1 << gran;
 }
 

-- 
To view, visit https://review.coreboot.org/20095
To unsubscribe, visit https://review.coreboot.org/settings

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia99b785dcd9cf56fb236ad7ade54656851f88a5e
Gerrit-Change-Number: 20095
Gerrit-PatchSet: 1
Gerrit-Owner: Samuel Holland <samuel at sholland.org>



More information about the coreboot-gerrit mailing list