forked from mirrors/linux
		
	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
					
				
					 1 changed files with 10 additions and 0 deletions
				
			
		|  | @ -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 a new issue
	
	 Zhang Rui
						Zhang Rui