From 62f788e24469c0e12dbf427594cc8150ffa4336f Mon Sep 17 00:00:00 2001 From: Arthur Heymans Date: Tue, 21 Nov 2023 18:49:33 +0100 Subject: [PATCH] acpigen.c: Add resource consumer functions for mmio Signed-off-by: Arthur Heymans Change-Id: Id9e4adcd976e1f56ef7f502d9df16dbefce95c3e Reviewed-on: https://review.coreboot.org/c/coreboot/+/79217 Reviewed-by: Nico Huber Reviewed-by: Tim Wawrzynczak Tested-by: build bot (Jenkins) --- src/acpi/acpigen.c | 64 ++++++++++++++++++++++---------------- src/include/acpi/acpigen.h | 1 + 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/src/acpi/acpigen.c b/src/acpi/acpigen.c index fe36113fd7..ac95026562 100644 --- a/src/acpi/acpigen.c +++ b/src/acpi/acpigen.c @@ -2296,42 +2296,54 @@ void acpigen_resource_producer_io(u16 io_base, u16 io_limit) io_limit - io_base + 1); /* length */ } -static void acpigen_resource_producer_mmio32(u32 mmio_base, u32 mmio_limit, u16 type_flags) +static void acpigen_resource_mmio32(u32 mmio_base, u32 mmio_limit, u16 gen_flags, + u16 type_flags) { acpigen_resource_dword(RSRC_TYPE_MEM, /* res_type */ - ADDR_SPACE_GENERAL_FLAG_MAX_FIXED - | ADDR_SPACE_GENERAL_FLAG_MIN_FIXED - | ADDR_SPACE_GENERAL_FLAG_DEC_POS - | ADDR_SPACE_GENERAL_FLAG_PRODUCER, /* gen_flags */ - type_flags, /* type_flags */ - 0, /* gran */ - mmio_base, /* range_min */ - mmio_limit, /* range_max */ - 0x0, /* translation */ - mmio_limit - mmio_base + 1); /* length */ + gen_flags, /* gen_flags */ + type_flags, /* type_flags */ + 0, /* gran */ + mmio_base, /* range_min */ + mmio_limit, /* range_max */ + 0x0, /* translation */ + mmio_limit - mmio_base + 1); /* length */ } -static void acpigen_resource_producer_mmio64(u64 mmio_base, u64 mmio_limit, u16 type_flags) +static void acpigen_resource_mmio64(u64 mmio_base, u64 mmio_limit, u16 gen_flags, + u16 type_flags) { acpigen_resource_qword(RSRC_TYPE_MEM, /* res_type */ - ADDR_SPACE_GENERAL_FLAG_MAX_FIXED - | ADDR_SPACE_GENERAL_FLAG_MIN_FIXED - | ADDR_SPACE_GENERAL_FLAG_DEC_POS - | ADDR_SPACE_GENERAL_FLAG_PRODUCER, /* gen_flags */ - type_flags, /* type_flags */ - 0, /* gran */ - mmio_base, /* range_min */ - mmio_limit, /* range_max */ - 0x0, /* translation */ - mmio_limit - mmio_base + 1); /* length */ + gen_flags, /* gen_flags */ + type_flags, /* type_flags */ + 0, /* gran */ + mmio_base, /* range_min */ + mmio_limit, /* range_max */ + 0x0, /* translation */ + mmio_limit - mmio_base + 1); /* length */ +} + +static void acpigen_resource_mmio(u64 mmio_base, u64 mmio_limit, bool is_producer, u16 type_flags) +{ + const u16 gen_flags = ADDR_SPACE_GENERAL_FLAG_MAX_FIXED + | ADDR_SPACE_GENERAL_FLAG_MIN_FIXED + | ADDR_SPACE_GENERAL_FLAG_DEC_POS + | (is_producer ? ADDR_SPACE_GENERAL_FLAG_PRODUCER + : ADDR_SPACE_GENERAL_FLAG_CONSUMER); + + if (mmio_base < 4ULL * GiB && mmio_limit < 4ULL * GiB) + acpigen_resource_mmio32(mmio_base, mmio_limit, gen_flags, type_flags); + else + acpigen_resource_mmio64(mmio_base, mmio_limit, gen_flags, type_flags); } void acpigen_resource_producer_mmio(u64 mmio_base, u64 mmio_limit, u16 type_flags) { - if (mmio_base < 4ULL * GiB && mmio_limit < 4ULL * GiB) - acpigen_resource_producer_mmio32(mmio_base, mmio_limit, type_flags); - else - acpigen_resource_producer_mmio64(mmio_base, mmio_limit, type_flags); + acpigen_resource_mmio(mmio_base, mmio_limit, true, type_flags); +} + +void acpigen_resource_consumer_mmio(u64 mmio_base, u64 mmio_limit, u16 type_flags) +{ + acpigen_resource_mmio(mmio_base, mmio_limit, false, type_flags); } void acpigen_write_ADR(uint64_t adr) diff --git a/src/include/acpi/acpigen.h b/src/include/acpi/acpigen.h index 346ae73408..7a5be515cc 100644 --- a/src/include/acpi/acpigen.h +++ b/src/include/acpi/acpigen.h @@ -691,6 +691,7 @@ void acpigen_resource_qword(u16 res_type, u16 gen_flags, u16 type_flags, void acpigen_resource_producer_bus_number(u16 bus_base, u16 bus_limit); void acpigen_resource_producer_io(u16 io_base, u16 io_limit); void acpigen_resource_producer_mmio(u64 mmio_base, u64 mmio_limit, u16 type_flags); +void acpigen_resource_consumer_mmio(u64 mmio_base, u64 mmio_limit, u16 type_flags); /* Emits Notify(namestr, value) */ void acpigen_notify(const char *namestr, int value);