ACPI / resources: ignore invalid ACPI device resources
ACPI table may export resource entry with 0 length. But the current code interprets this kind of resource in a wrong way. It will create a resource structure with res->end = acpi_resource->start + acpi_resource->len - 1; This patch fixes a problem on my machine that a platform device fails to be created because one of its ACPI IO resource entry (start = 0, end = 0, length = 0) is translated into a generic resource with start = 0, end = 0xffffffff. Signed-off-by: Zhang Rui <rui.zhang@intel.com> Cc: All applicable <stable@vger.kernel.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
6c09ea49ce
commit
b355cee88e
@ -77,18 +77,24 @@ bool acpi_dev_resource_memory(struct acpi_resource *ares, struct resource *res)
|
|||||||
switch (ares->type) {
|
switch (ares->type) {
|
||||||
case ACPI_RESOURCE_TYPE_MEMORY24:
|
case ACPI_RESOURCE_TYPE_MEMORY24:
|
||||||
memory24 = &ares->data.memory24;
|
memory24 = &ares->data.memory24;
|
||||||
|
if (!memory24->address_length)
|
||||||
|
return false;
|
||||||
acpi_dev_get_memresource(res, memory24->minimum,
|
acpi_dev_get_memresource(res, memory24->minimum,
|
||||||
memory24->address_length,
|
memory24->address_length,
|
||||||
memory24->write_protect);
|
memory24->write_protect);
|
||||||
break;
|
break;
|
||||||
case ACPI_RESOURCE_TYPE_MEMORY32:
|
case ACPI_RESOURCE_TYPE_MEMORY32:
|
||||||
memory32 = &ares->data.memory32;
|
memory32 = &ares->data.memory32;
|
||||||
|
if (!memory32->address_length)
|
||||||
|
return false;
|
||||||
acpi_dev_get_memresource(res, memory32->minimum,
|
acpi_dev_get_memresource(res, memory32->minimum,
|
||||||
memory32->address_length,
|
memory32->address_length,
|
||||||
memory32->write_protect);
|
memory32->write_protect);
|
||||||
break;
|
break;
|
||||||
case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
|
case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
|
||||||
fixed_memory32 = &ares->data.fixed_memory32;
|
fixed_memory32 = &ares->data.fixed_memory32;
|
||||||
|
if (!fixed_memory32->address_length)
|
||||||
|
return false;
|
||||||
acpi_dev_get_memresource(res, fixed_memory32->address,
|
acpi_dev_get_memresource(res, fixed_memory32->address,
|
||||||
fixed_memory32->address_length,
|
fixed_memory32->address_length,
|
||||||
fixed_memory32->write_protect);
|
fixed_memory32->write_protect);
|
||||||
@ -144,12 +150,16 @@ bool acpi_dev_resource_io(struct acpi_resource *ares, struct resource *res)
|
|||||||
switch (ares->type) {
|
switch (ares->type) {
|
||||||
case ACPI_RESOURCE_TYPE_IO:
|
case ACPI_RESOURCE_TYPE_IO:
|
||||||
io = &ares->data.io;
|
io = &ares->data.io;
|
||||||
|
if (!io->address_length)
|
||||||
|
return false;
|
||||||
acpi_dev_get_ioresource(res, io->minimum,
|
acpi_dev_get_ioresource(res, io->minimum,
|
||||||
io->address_length,
|
io->address_length,
|
||||||
io->io_decode);
|
io->io_decode);
|
||||||
break;
|
break;
|
||||||
case ACPI_RESOURCE_TYPE_FIXED_IO:
|
case ACPI_RESOURCE_TYPE_FIXED_IO:
|
||||||
fixed_io = &ares->data.fixed_io;
|
fixed_io = &ares->data.fixed_io;
|
||||||
|
if (!fixed_io->address_length)
|
||||||
|
return false;
|
||||||
acpi_dev_get_ioresource(res, fixed_io->address,
|
acpi_dev_get_ioresource(res, fixed_io->address,
|
||||||
fixed_io->address_length,
|
fixed_io->address_length,
|
||||||
ACPI_DECODE_10);
|
ACPI_DECODE_10);
|
||||||
|
Loading…
Reference in New Issue
Block a user