summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/acpi/acpigen.c62
-rw-r--r--src/include/acpi/acpigen.h1
2 files changed, 38 insertions, 25 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 */
}
-void acpigen_resource_producer_mmio(u64 mmio_base, u64 mmio_limit, u16 type_flags)
+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_producer_mmio32(mmio_base, mmio_limit, type_flags);
+ acpigen_resource_mmio32(mmio_base, mmio_limit, gen_flags, type_flags);
else
- acpigen_resource_producer_mmio64(mmio_base, mmio_limit, type_flags);
+ 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)
+{
+ 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);