Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b25e8442 authored by Len Brown's avatar Len Brown
Browse files

Pull bugzilla-7465 into release branch

parents f5ea908c 09fe5835
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -138,6 +138,12 @@ and is between 256 and 4096 characters. It is defined in the file

			See also Documentation/pm.txt, pci=noacpi

	acpi_apic_instance=	[ACPI, IOAPIC]
			Format: <int>
			2: use 2nd APIC table, if available
			1,0: use 1st APIC table
			default: 2

	acpi_sleep=	[HW,ACPI] Sleep options
			Format: { s3_bios, s3_mode }
			See Documentation/power/video.txt
+52 −5
Original line number Diff line number Diff line
@@ -42,6 +42,8 @@ static char *mps_inti_flags_trigger[] = { "dfl", "edge", "res", "level" };

static struct acpi_table_desc initial_tables[ACPI_MAX_TABLES] __initdata;

static int acpi_apic_instance __initdata = 2;

void acpi_table_print_madt_entry(struct acpi_subtable_header *header)
{
	if (!header)
@@ -183,7 +185,9 @@ acpi_table_parse_entries(char *id,
	if (!handler)
		return -EINVAL;

	/* Locate the table (if exists). There should only be one. */
	if (strncmp(id, ACPI_SIG_MADT, 4) == 0)
		acpi_get_table(id, acpi_apic_instance, &table_header);
	else
		acpi_get_table(id, 0, &table_header);

	if (!table_header) {
@@ -237,10 +241,15 @@ acpi_table_parse_madt(enum acpi_madt_type id,
int __init acpi_table_parse(char *id, acpi_table_handler handler)
{
	struct acpi_table_header *table = NULL;

	if (!handler)
		return -EINVAL;

	if (strncmp(id, ACPI_SIG_MADT, 4) == 0)
		acpi_get_table(id, acpi_apic_instance, &table);
	else
		acpi_get_table(id, 0, &table);

	if (table) {
		handler(table);
		return 0;
@@ -248,6 +257,31 @@ int __init acpi_table_parse(char *id, acpi_table_handler handler)
		return 1;
}

/* 
 * The BIOS is supposed to supply a single APIC/MADT,
 * but some report two.  Provide a knob to use either.
 * (don't you wish instance 0 and 1 were not the same?)
 */
static void __init check_multiple_madt(void)
{
	struct acpi_table_header *table = NULL;

	acpi_get_table(ACPI_SIG_MADT, 2, &table);
	if (table) {
		printk(KERN_WARNING PREFIX
		       "BIOS bug: multiple APIC/MADT found,"
		       " using %d\n", acpi_apic_instance);
		printk(KERN_WARNING PREFIX
		       "If \"acpi_apic_instance=%d\" works better, "
		       "notify linux-acpi@vger.kernel.org\n",
		       acpi_apic_instance ? 0 : 2);

	} else
		acpi_apic_instance = 0;

	return;
}

/*
 * acpi_table_init()
 *
@@ -257,9 +291,22 @@ int __init acpi_table_parse(char *id, acpi_table_handler handler)
 * result: sdt_entry[] is initialized
 */


int __init acpi_table_init(void)
{
	acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
	check_multiple_madt();
	return 0;
}

static int __init acpi_parse_apic_instance(char *str)
{

	acpi_apic_instance = simple_strtoul(str, NULL, 0);

	printk(KERN_NOTICE PREFIX "Shall use APIC/MADT table %d\n",
	       acpi_apic_instance);

	return 0;
}

early_param("acpi_apic_instance", acpi_parse_apic_instance);