device: Add fixed_mem_range_flags() and helpers

Unlike fixed_mem_resource_kb() the arguments are not in KiB.
This allows coccinelle script to assign the base and size
without applying the KiB division or 10 bit right-shift.

Unlike with fixed_mem_resource_kb() the IORESOURCE_STORED flag is
passed in the flags parameter until some inconsistencies in the tree
get resolved.

Change-Id: I2cc9ef94b60d62aaf4374f400b7e05b86e4664d2
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/55436
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Nico Huber <nico.h@gmx.de>
diff --git a/src/device/device_util.c b/src/device/device_util.c
index c377b85..9e2c3d5 100644
--- a/src/device/device_util.c
+++ b/src/device/device_util.c
@@ -822,22 +822,23 @@
 	}
 }
 
-void fixed_mem_resource_kb(struct device *dev, unsigned long index,
-			unsigned long basek, unsigned long sizek,
-			unsigned long type)
+const struct resource *fixed_resource_range_idx(struct device *dev, unsigned long index,
+				uint64_t base, uint64_t size, unsigned long flags)
 {
 	struct resource *resource;
-
-	if (!sizek)
-		return;
+	if (!size)
+		return NULL;
 
 	resource = new_resource(dev, index);
-	resource->base = ((resource_t)basek) << 10;
-	resource->size = ((resource_t)sizek) << 10;
-	resource->flags = IORESOURCE_MEM | IORESOURCE_FIXED |
-		 IORESOURCE_STORED | IORESOURCE_ASSIGNED;
+	resource->base = base;
+	resource->size = size;
+	resource->flags = IORESOURCE_FIXED | IORESOURCE_ASSIGNED;
+	resource->flags |= flags;
 
-	resource->flags |= type;
+	printk(BIOS_SPEW, "dev: %s, index: 0x%lx, base: 0x%llx, size: 0x%llx\n",
+	       dev_path(dev), resource->index, resource->base, resource->size);
+
+	return resource;
 }
 
 void fixed_io_resource(struct device *dev, unsigned long index,
diff --git a/src/include/device/device.h b/src/include/device/device.h
index 7bcff80..c018306 100644
--- a/src/include/device/device.h
+++ b/src/include/device/device.h
@@ -310,11 +310,42 @@
 void fixed_io_resource(struct device *dev, unsigned long index,
 		unsigned long base, unsigned long size);
 
-void fixed_mem_resource_kb(struct device *dev, unsigned long index,
-		  unsigned long basek, unsigned long sizek, unsigned long type);
-
 void mmconf_resource(struct device *dev, unsigned long index);
 
+/* These are temporary resource constructors to get us through the
+   migration away from open-coding all the IORESOURCE_FLAGS. */
+
+const struct resource *fixed_resource_range_idx(struct device *dev, unsigned long index,
+					    uint64_t base, uint64_t size,
+					    unsigned long flags);
+
+static inline
+const struct resource *fixed_mem_range_flags(struct device *dev, unsigned long index,
+					    uint64_t base, uint64_t size,
+					    unsigned long flags)
+{
+	return fixed_resource_range_idx(dev, index, base, size, IORESOURCE_MEM | flags);
+}
+
+static inline
+const struct resource *fixed_mem_from_to_flags(struct device *dev, unsigned long index,
+					uint64_t base, uint64_t end, unsigned long flags)
+{
+	if (end <= base)
+		return NULL;
+	return fixed_mem_range_flags(dev, index, base, end - base, flags);
+}
+
+/* Compatibility code */
+
+static inline void fixed_mem_resource_kb(struct device *dev, unsigned long index,
+			unsigned long basek, unsigned long sizek,
+			unsigned long flags)
+{
+	fixed_mem_range_flags(dev, index, ((uint64_t)basek) << 10,
+		((uint64_t)sizek) << 10, IORESOURCE_STORED | flags);
+}
+
 /* It is the caller's responsibility to adjust regions such that ram_resource_kb()
  * and mmio_resource_kb() do not overlap.
  */