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 <no-reply+buildbot@haiku-os.org>
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
This commit is contained in:
PulkoMandy 2023-04-29 18:36:38 +02:00 committed by Adrien Destugues
parent 4dbd474753
commit 8be0a59e77

View File

@ -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;