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:
parent
4dbd474753
commit
8be0a59e77
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user