forked from mirrors/linux
		
	ACPI / processor: Make it possible to get APIC ID via GIC
Introduce a new function map_gic_id() to allow APIC IDs to be obtained from the GIC Structure introduced by ACPI 5. Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org> [rjw: Subject and changelog] Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
		
							parent
							
								
									2c4fa0033a
								
							
						
					
					
						commit
						df86f5df79
					
				
					 1 changed files with 27 additions and 0 deletions
				
			
		|  | @ -71,6 +71,28 @@ static int map_lsapic_id(struct acpi_subtable_header *entry, | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int map_gic_id(struct acpi_subtable_header *entry, | ||||
| 		int device_declaration, u32 acpi_id, int *apic_id) | ||||
| { | ||||
| 	struct acpi_madt_generic_interrupt *gic = | ||||
| 		(struct acpi_madt_generic_interrupt *)entry; | ||||
| 
 | ||||
| 	if (!(gic->flags & ACPI_MADT_ENABLED)) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * In the GIC interrupt model, logical processors are | ||||
| 	 * required to have a Processor Device object in the DSDT, | ||||
| 	 * so we should check device_declaration here | ||||
| 	 */ | ||||
| 	if (device_declaration && (gic->uid == acpi_id)) { | ||||
| 		*apic_id = gic->gic_id; | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	return -EINVAL; | ||||
| } | ||||
| 
 | ||||
| static int map_madt_entry(int type, u32 acpi_id) | ||||
| { | ||||
| 	unsigned long madt_end, entry; | ||||
|  | @ -106,6 +128,9 @@ static int map_madt_entry(int type, u32 acpi_id) | |||
| 		} else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) { | ||||
| 			if (!map_lsapic_id(header, type, acpi_id, &apic_id)) | ||||
| 				break; | ||||
| 		} else if (header->type == ACPI_MADT_TYPE_GENERIC_INTERRUPT) { | ||||
| 			if (!map_gic_id(header, type, acpi_id, &apic_id)) | ||||
| 				break; | ||||
| 		} | ||||
| 		entry += header->length; | ||||
| 	} | ||||
|  | @ -136,6 +161,8 @@ static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id) | |||
| 		map_lapic_id(header, acpi_id, &apic_id); | ||||
| 	} else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) { | ||||
| 		map_lsapic_id(header, type, acpi_id, &apic_id); | ||||
| 	} else if (header->type == ACPI_MADT_TYPE_GENERIC_INTERRUPT) { | ||||
| 		map_gic_id(header, type, acpi_id, &apic_id); | ||||
| 	} | ||||
| 
 | ||||
| exit: | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Hanjun Guo
						Hanjun Guo