From 8be0a59e7780e1fc30d405702f3c071944cd7db9 Mon Sep 17 00:00:00 2001 From: PulkoMandy Date: Sat, 29 Apr 2023 18:36:38 +0200 Subject: [PATCH] ECAM ACPI PCI controller: handle missing address_length On my machine, the address_length somehow is 0, but can be computed from the minimum and maximum values. Change-Id: I2262263915319e0d97a2cd9b9fde3f6af1f79a84 Reviewed-on: https://review.haiku-os.org/c/haiku/+/5759 Tested-by: Commit checker robot Reviewed-by: waddlesplash --- .../busses/pci/ecam/ECAMPCIControllerACPI.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/add-ons/kernel/busses/pci/ecam/ECAMPCIControllerACPI.cpp b/src/add-ons/kernel/busses/pci/ecam/ECAMPCIControllerACPI.cpp index 8f68bbb88b..44050d06a2 100644 --- a/src/add-ons/kernel/busses/pci/ecam/ECAMPCIControllerACPI.cpp +++ b/src/add-ons/kernel/busses/pci/ecam/ECAMPCIControllerACPI.cpp @@ -102,13 +102,23 @@ ECAMPCIControllerACPI::AcpiCrsScanCallbackInt(acpi_resource *res) switch (res->type) { case ACPI_RESOURCE_TYPE_ADDRESS16: { const auto &address = res->data.address16.address; + // If address_length isn't set, compute it from minimum and maximum + auto address_length = address.address_length; + if (address_length == 0) + address_length = address.maximum - address.minimum + 1; + ASSERT(address.minimum + address_length - 1 == address.maximum); range.host_addr = address.minimum + address.translation_offset; range.pci_addr = address.minimum; - range.size = address.address_length; + range.size = address_length; break; } case ACPI_RESOURCE_TYPE_ADDRESS32: { const auto &address = res->data.address32.address; + // If address_length isn't set, compute it from minimum and maximum + auto address_length = address.address_length; + if (address_length == 0) + address_length = address.maximum - address.minimum + 1; + ASSERT(address.minimum + address_length - 1 == address.maximum); range.host_addr = address.minimum + address.translation_offset; range.pci_addr = address.minimum; range.size = address.address_length; @@ -116,6 +126,11 @@ ECAMPCIControllerACPI::AcpiCrsScanCallbackInt(acpi_resource *res) } case ACPI_RESOURCE_TYPE_ADDRESS64: { const auto &address = res->data.address64.address; + // If address_length isn't set, compute it from minimum and maximum + auto address_length = address.address_length; + if (address_length == 0) + address_length = address.maximum - address.minimum + 1; + ASSERT(address.minimum + address_length - 1 == address.maximum); range.host_addr = address.minimum + address.translation_offset; range.pci_addr = address.minimum; range.size = address.address_length;