From d0525d424876ce5c4345ab2c73983915be2efb32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ky=C3=B6sti=20M=C3=A4lkki?= Date: Sun, 13 Jun 2021 10:09:51 +0300 Subject: [PATCH] resource: Add helpers for memory resources MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These should help to make the reviews as platforms remove KiB scaling. Change-Id: I40644f873c0ea993353753c0ef40df4c83233355 Signed-off-by: Kyösti Mälkki Reviewed-on: https://review.coreboot.org/c/coreboot/+/55474 Tested-by: build bot (Jenkins) Reviewed-by: Nico Huber --- src/device/device_util.c | 15 ++++++++++ src/include/device/device.h | 56 +++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/src/device/device_util.c b/src/device/device_util.c index 383e17b0f6..7e31b43495 100644 --- a/src/device/device_util.c +++ b/src/device/device_util.c @@ -841,6 +841,21 @@ const struct resource *fixed_resource_range_idx(struct device *dev, unsigned lon return resource; } +const struct resource *lower_ram_end(struct device *dev, unsigned long index, uint64_t end) +{ + return ram_from_to(dev, index, 0, end); +} + +const struct resource *upper_ram_end(struct device *dev, unsigned long index, uint64_t end) +{ + if (end <= 4ull * GiB) + return NULL; + + printk(BIOS_INFO, "Available memory above 4GB: %lluM\n", (end - 4ull * GiB) / MiB); + + return ram_from_to(dev, index, 4ull * GiB, end); +} + void mmconf_resource(struct device *dev, unsigned long index) { struct resource *resource = new_resource(dev, index); diff --git a/src/include/device/device.h b/src/include/device/device.h index 8f5407dcfc..536b77730e 100644 --- a/src/include/device/device.h +++ b/src/include/device/device.h @@ -333,6 +333,62 @@ const struct resource *fixed_mem_from_to_flags(struct device *dev, unsigned long return fixed_mem_range_flags(dev, index, base, end - base, flags); } +static inline +const struct resource *ram_range(struct device *dev, unsigned long index, uint64_t base, + uint64_t size) +{ + return fixed_mem_range_flags(dev, index, base, size, IORESOURCE_CACHEABLE | IORESOURCE_STORED); +} + +static inline +const struct resource *ram_from_to(struct device *dev, unsigned long index, uint64_t base, + uint64_t end) +{ + if (end <= base) + return NULL; + return ram_range(dev, index, base, end - base); +} + +static inline +const struct resource *reserved_ram_range(struct device *dev, unsigned long index, + uint64_t base, uint64_t size) +{ + return fixed_mem_range_flags(dev, index, base, size, IORESOURCE_CACHEABLE | + IORESOURCE_RESERVE | IORESOURCE_STORED); +} + +static inline +const struct resource *reserved_ram_from_to(struct device *dev, unsigned long index, + uint64_t base, uint64_t end) +{ + if (end <= base) + return NULL; + return reserved_ram_range(dev, index, base, end - base); +} + +static inline +const struct resource *mmio_range(struct device *dev, unsigned long index, uint64_t base, + uint64_t size) +{ + return fixed_mem_range_flags(dev, index, base, size, IORESOURCE_RESERVE | IORESOURCE_STORED); +} + +static inline +const struct resource *mmio_from_to(struct device *dev, unsigned long index, uint64_t base, + uint64_t end) +{ + if (end <= base) + return NULL; + return mmio_range(dev, index, base, end - base); +} + +const struct resource *lower_ram_end(struct device *dev, unsigned long index, uint64_t end); +const struct resource *upper_ram_end(struct device *dev, unsigned long index, uint64_t end); + +#define bad_ram_range(...) reserved_ram_range(__VA_ARGS__) +#define uma_range(...) mmio_range(__VA_ARGS__) +#define uma_from_to(...) mmio_from_to(__VA_ARGS__) + static inline const struct resource *fixed_io_range_flags(struct device *dev, unsigned long index, uint16_t base, uint16_t size, unsigned long flags)