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…
	
	Add table
		Add a link
		
	
		Reference in a new issue