diff options
| author | Alexey Starikovskiy <alexey.y.starikovskiy@intel.com> | 2007-02-02 19:48:22 +0300 | 
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2007-02-02 21:14:28 -0500 | 
| commit | ceb6c46839021d5c7c338d48deac616944660124 (patch) | |
| tree | 191485a16c3a19bccde887f1c8938a7a26020401 /drivers/acpi/tables.c | |
| parent | a7a22fa9c368ba22f13b87585052b8cdbbc18f7a (diff) | |
| download | olio-linux-3.10-ceb6c46839021d5c7c338d48deac616944660124.tar.xz olio-linux-3.10-ceb6c46839021d5c7c338d48deac616944660124.zip  | |
ACPICA: Remove duplicate table manager
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/tables.c')
| -rw-r--r-- | drivers/acpi/tables.c | 396 | 
1 files changed, 16 insertions, 380 deletions
diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c index 5bb14315116..962ff29fbf0 100644 --- a/drivers/acpi/tables.c +++ b/drivers/acpi/tables.c @@ -38,71 +38,11 @@  #define ACPI_MAX_TABLES		128 -static char *acpi_table_signatures[ACPI_TABLE_COUNT] = { -	[ACPI_TABLE_UNKNOWN] = "????", -	[ACPI_APIC] = "APIC", -	[ACPI_BOOT] = "BOOT", -	[ACPI_DBGP] = "DBGP", -	[ACPI_DSDT] = "DSDT", -	[ACPI_ECDT] = "ECDT", -	[ACPI_ETDT] = "ETDT", -	[ACPI_FADT] = "FACP", -	[ACPI_FACS] = "FACS", -	[ACPI_OEMX] = "OEM", -	[ACPI_PSDT] = "PSDT", -	[ACPI_SBST] = "SBST", -	[ACPI_SLIT] = "SLIT", -	[ACPI_SPCR] = "SPCR", -	[ACPI_SRAT] = "SRAT", -	[ACPI_SSDT] = "SSDT", -	[ACPI_SPMI] = "SPMI", -	[ACPI_HPET] = "HPET", -	[ACPI_MCFG] = "MCFG", -}; -  static char *mps_inti_flags_polarity[] = { "dfl", "high", "res", "low" };  static char *mps_inti_flags_trigger[] = { "dfl", "edge", "res", "level" }; -/* System Description Table (RSDT/XSDT) */ -struct acpi_table_sdt { -	unsigned long pa; -	enum acpi_table_id id; -	unsigned long size; -} __attribute__ ((packed)); - -static unsigned long sdt_pa;	/* Physical Address */ -static unsigned long sdt_count;	/* Table count */ - -static struct acpi_table_sdt sdt_entry[ACPI_MAX_TABLES] __initdata;  static struct acpi_table_desc initial_tables[ACPI_MAX_TABLES] __initdata; -void acpi_table_print(struct acpi_table_header *header, unsigned long phys_addr) -{ -	char *name = NULL; - -	if (!header) -		return; - -	/* Some table signatures aren't good table names */ - -	if (!strncmp((char *)&header->signature, -		     acpi_table_signatures[ACPI_APIC], -		     sizeof(header->signature))) { -		name = "MADT"; -	} else if (!strncmp((char *)&header->signature, -			    acpi_table_signatures[ACPI_FADT], -			    sizeof(header->signature))) { -		name = "FADT"; -	} else -		name = header->signature; - -	printk(KERN_DEBUG PREFIX -	       "%.4s (v%3.3d %6.6s %8.8s 0x%08x %.4s 0x%08x) @ 0x%p\n", name, -	       header->revision, header->oem_id, header->oem_table_id, -	       header->oem_revision, header->asl_compiler_id, -	       header->asl_compiler_revision, (void *)phys_addr); -} -  void acpi_table_print_madt_entry(acpi_table_entry_header * header)  {  	if (!header) @@ -226,123 +166,32 @@ void acpi_table_print_madt_entry(acpi_table_entry_header * header)  	}  } -static int -acpi_table_compute_checksum(void *table_pointer, unsigned long length) -{ -	u8 *p = table_pointer; -	unsigned long remains = length; -	unsigned long sum = 0; - -	if (!p || !length) -		return -EINVAL; -	while (remains--) -		sum += *p++; - -	return (sum & 0xFF); -} - -/* - * acpi_get_table_header_early() - * for acpi_blacklisted(), acpi_table_get_sdt() - */  int __init -acpi_get_table_header_early(enum acpi_table_id id, -			    struct acpi_table_header **header) -{ -	unsigned int i; -	enum acpi_table_id temp_id; - -	/* DSDT is different from the rest */ -	if (id == ACPI_DSDT) -		temp_id = ACPI_FADT; -	else -		temp_id = id; - -	/* Locate the table. */ - -	for (i = 0; i < sdt_count; i++) { -		if (sdt_entry[i].id != temp_id) -			continue; -		*header = (void *) -		    __acpi_map_table(sdt_entry[i].pa, sdt_entry[i].size); -		if (!*header) { -			printk(KERN_WARNING PREFIX "Unable to map %s\n", -			       acpi_table_signatures[temp_id]); -			return -ENODEV; -		} -		break; -	} - -	if (!*header) { -		printk(KERN_WARNING PREFIX "%s not present\n", -		       acpi_table_signatures[id]); -		return -ENODEV; -	} - -	/* Map the DSDT header via the pointer in the FADT */ -	if (id == ACPI_DSDT) { -		struct fadt_descriptor *fadt = -		    (struct fadt_descriptor *)*header; - -		if (fadt->header.revision == 3 && fadt->Xdsdt) { -			*header = (void *)__acpi_map_table(fadt->Xdsdt, -							   sizeof(struct -								  acpi_table_header)); -		} else if (fadt->dsdt) { -			*header = (void *)__acpi_map_table(fadt->dsdt, -							   sizeof(struct -								  acpi_table_header)); -		} else -			*header = NULL; - -		if (!*header) { -			printk(KERN_WARNING PREFIX "Unable to map DSDT\n"); -			return -ENODEV; -		} -	} - -	return 0; -} - -int __init -acpi_table_parse_madt_family(enum acpi_table_id id, +acpi_table_parse_madt_family(char *id,  			     unsigned long madt_size,  			     int entry_id,  			     acpi_madt_entry_handler handler,  			     unsigned int max_entries)  { -	void *madt = NULL; +	struct acpi_table_header *madt = NULL;  	acpi_table_entry_header *entry;  	unsigned int count = 0;  	unsigned long madt_end; -	unsigned int i;  	if (!handler)  		return -EINVAL;  	/* Locate the MADT (if exists). There should only be one. */ -	for (i = 0; i < sdt_count; i++) { -		if (sdt_entry[i].id != id) -			continue; -		madt = (void *) -		    __acpi_map_table(sdt_entry[i].pa, sdt_entry[i].size); -		if (!madt) { -			printk(KERN_WARNING PREFIX "Unable to map %s\n", -			       acpi_table_signatures[id]); -			return -ENODEV; -		} -		break; -	} +	acpi_get_table(id, 0, &madt);  	if (!madt) { -		printk(KERN_WARNING PREFIX "%s not present\n", -		       acpi_table_signatures[id]); +		printk(KERN_WARNING PREFIX "%4.4s not present\n", id);  		return -ENODEV;  	} -	madt_end = (unsigned long)madt + sdt_entry[i].size; +	madt_end = (unsigned long)madt + madt->length;  	/* Parse all entries looking for a match. */ @@ -360,9 +209,8 @@ acpi_table_parse_madt_family(enum acpi_table_id id,  		    ((unsigned long)entry + entry->length);  	}  	if (max_entries && count > max_entries) { -		printk(KERN_WARNING PREFIX "[%s:0x%02x] ignored %i entries of " -		       "%i found\n", acpi_table_signatures[id], entry_id, -		       count - max_entries, count); +		printk(KERN_WARNING PREFIX "[%4.4s:0x%02x] ignored %i entries of " +		       "%i found\n", id, entry_id, count - max_entries, count);  	}  	return count; @@ -372,195 +220,24 @@ int __init  acpi_table_parse_madt(enum acpi_madt_entry_id id,  		      acpi_madt_entry_handler handler, unsigned int max_entries)  { -	return acpi_table_parse_madt_family(ACPI_APIC, +	return acpi_table_parse_madt_family("APIC",  					    sizeof(struct acpi_table_madt), id,  					    handler, max_entries);  } -int __init acpi_table_parse(enum acpi_table_id id, acpi_table_handler handler) +int __init acpi_table_parse(char *id, acpi_table_handler handler)  { -	int count = 0; -	unsigned int i = 0; +	struct acpi_table_header *table = NULL;  	if (!handler)  		return -EINVAL; -	for (i = 0; i < sdt_count; i++) { -		if (sdt_entry[i].id != id) -			continue; -		count++; -		if (count == 1) -			handler(sdt_entry[i].pa, sdt_entry[i].size); - -		else -			printk(KERN_WARNING PREFIX -			       "%d duplicate %s table ignored.\n", count, -			       acpi_table_signatures[id]); -	} - -	return count; -} - -static int __init acpi_table_get_sdt(struct acpi_table_rsdp *rsdp) -{ -	struct acpi_table_header *header = NULL; -	unsigned int i, id = 0; - -	if (!rsdp) -		return -EINVAL; - -	/* First check XSDT (but only on ACPI 2.0-compatible systems) */ - -	if ((rsdp->revision >= 2) && rsdp->xsdt_physical_address) { - -		struct acpi_table_xsdt *mapped_xsdt = NULL; - -		sdt_pa = rsdp->xsdt_physical_address; - -		/* map in just the header */ -		header = (struct acpi_table_header *) -		    __acpi_map_table(sdt_pa, sizeof(struct acpi_table_header)); - -		if (!header) { -			printk(KERN_WARNING PREFIX -			       "Unable to map XSDT header\n"); -			return -ENODEV; -		} - -		/* remap in the entire table before processing */ -		mapped_xsdt = (struct acpi_table_xsdt *) -		    __acpi_map_table(sdt_pa, header->length); -		if (!mapped_xsdt) { -			printk(KERN_WARNING PREFIX "Unable to map XSDT\n"); -			return -ENODEV; -		} -		header = &mapped_xsdt->header; - -		if (strncmp(header->signature, "XSDT", 4)) { -			printk(KERN_WARNING PREFIX -			       "XSDT signature incorrect\n"); -			return -ENODEV; -		} - -		if (acpi_table_compute_checksum(header, header->length)) { -			printk(KERN_WARNING PREFIX "Invalid XSDT checksum\n"); -			return -ENODEV; -		} - -		sdt_count = -		    (header->length - sizeof(struct acpi_table_header)) >> 3; -		if (sdt_count > ACPI_MAX_TABLES) { -			printk(KERN_WARNING PREFIX -			       "Truncated %lu XSDT entries\n", -			       (sdt_count - ACPI_MAX_TABLES)); -			sdt_count = ACPI_MAX_TABLES; -		} - -		for (i = 0; i < sdt_count; i++) -			sdt_entry[i].pa = (unsigned long)mapped_xsdt->table_offset_entry[i]; -	} - -	/* Then check RSDT */ - -	else if (rsdp->rsdt_physical_address) { - -		struct acpi_table_rsdt *mapped_rsdt = NULL; - -		sdt_pa = rsdp->rsdt_physical_address; - -		/* map in just the header */ -		header = (struct acpi_table_header *) -		    __acpi_map_table(sdt_pa, sizeof(struct acpi_table_header)); -		if (!header) { -			printk(KERN_WARNING PREFIX -			       "Unable to map RSDT header\n"); -			return -ENODEV; -		} - -		/* remap in the entire table before processing */ -		mapped_rsdt = (struct acpi_table_rsdt *) -		    __acpi_map_table(sdt_pa, header->length); -		if (!mapped_rsdt) { -			printk(KERN_WARNING PREFIX "Unable to map RSDT\n"); -			return -ENODEV; -		} -		header = &mapped_rsdt->header; - -		if (strncmp(header->signature, "RSDT", 4)) { -			printk(KERN_WARNING PREFIX -			       "RSDT signature incorrect\n"); -			return -ENODEV; -		} - -		if (acpi_table_compute_checksum(header, header->length)) { -			printk(KERN_WARNING PREFIX "Invalid RSDT checksum\n"); -			return -ENODEV; -		} - -		sdt_count = -		    (header->length - sizeof(struct acpi_table_header)) >> 2; -		if (sdt_count > ACPI_MAX_TABLES) { -			printk(KERN_WARNING PREFIX -			       "Truncated %lu RSDT entries\n", -			       (sdt_count - ACPI_MAX_TABLES)); -			sdt_count = ACPI_MAX_TABLES; -		} - -		for (i = 0; i < sdt_count; i++) -			sdt_entry[i].pa = (unsigned long)mapped_rsdt->table_offset_entry[i]; -	} - -	else { -		printk(KERN_WARNING PREFIX -		       "No System Description Table (RSDT/XSDT) specified in RSDP\n"); -		return -ENODEV; -	} - -	acpi_table_print(header, sdt_pa); - -	for (i = 0; i < sdt_count; i++) { - -		/* map in just the header */ -		header = (struct acpi_table_header *) -		    __acpi_map_table(sdt_entry[i].pa, -				     sizeof(struct acpi_table_header)); -		if (!header) -			continue; - -		/* remap in the entire table before processing */ -		header = (struct acpi_table_header *) -		    __acpi_map_table(sdt_entry[i].pa, header->length); -		if (!header) -			continue; - -		acpi_table_print(header, sdt_entry[i].pa); - -		if (acpi_table_compute_checksum(header, header->length)) { -			printk(KERN_WARNING "  >>> ERROR: Invalid checksum\n"); -			continue; -		} - -		sdt_entry[i].size = header->length; - -		for (id = 0; id < ACPI_TABLE_COUNT; id++) { -			if (!strncmp((char *)&header->signature, -				     acpi_table_signatures[id], -				     sizeof(header->signature))) { -				sdt_entry[i].id = id; -			} -		} -	} - -	/*  -	 * The DSDT is *not* in the RSDT (why not? no idea.) but we want -	 * to print its info, because this is what people usually blacklist -	 * against. Unfortunately, we don't know the phys_addr, so just -	 * print 0. Maybe no one will notice. -	 */ -	if (!acpi_get_table_header_early(ACPI_DSDT, &header)) -		acpi_table_print(header, 0); - -	return 0; +	acpi_get_table(id, 0, &table); +	if (table) { +		handler(table); +		return 1; +	} else +		return 0;  }  /* @@ -574,47 +251,6 @@ static int __init acpi_table_get_sdt(struct acpi_table_rsdp *rsdp)  int __init acpi_table_init(void)  { -	struct acpi_table_rsdp *rsdp = NULL; -	unsigned long rsdp_phys = 0; -	int result = 0; - -	/* Locate and map the Root System Description Table (RSDP) */ - -	rsdp_phys = acpi_find_rsdp(); -	if (!rsdp_phys) { -		printk(KERN_ERR PREFIX "Unable to locate RSDP\n"); -		return -ENODEV; -	} - -	rsdp = (struct acpi_table_rsdp *)__acpi_map_table(rsdp_phys, -		sizeof(struct acpi_table_rsdp)); -	if (!rsdp) { -		printk(KERN_WARNING PREFIX "Unable to map RSDP\n"); -		return -ENODEV; -	} - -	printk(KERN_DEBUG PREFIX -	       "RSDP (v%3.3d %6.6s                                ) @ 0x%p\n", -	       rsdp->revision, rsdp->oem_id, (void *)rsdp_phys); - -	if (rsdp->revision < 2) -		result = -		    acpi_table_compute_checksum(rsdp, ACPI_RSDP_REV0_SIZE); -	else -		result = -		    acpi_table_compute_checksum(rsdp, rsdp->length); - -	if (result) { -		printk(KERN_WARNING "  >>> ERROR: Invalid checksum\n"); -		return -ENODEV; -	} - -	/* Locate and map the System Description table (RSDT/XSDT) */ - -	if (acpi_table_get_sdt(rsdp)) -		return -ENODEV; -  	acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0); -  	return 0;  }  |