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

Commit 0c81e26e authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

Merge branches 'acpi-x86', 'acpi-apei' and 'acpi-ec'

* acpi-x86:
  ACPI / x86: boot: Propagate error code in acpi_gsi_to_irq()
  ACPI / x86: boot: Don't setup SCI on HW-reduced platforms
  ACPI / x86: boot: Use INVALID_ACPI_IRQ instead of 0 for acpi_sci_override_gsi
  ACPI / x86: boot: Get rid of ACPI_INVALID_GSI
  ACPI / x86: boot: Swap variables in condition in acpi_register_gsi_ioapic()

* acpi-apei:
  ACPI / APEI: remove redundant variables len and node_len
  ACPI: APEI: call into AER handling regardless of severity
  ACPI: APEI: handle PCIe AER errors in separate function

* acpi-ec:
  ACPI: EC: Fix debugfs_create_*() usage
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -49,7 +49,7 @@ extern int acpi_fix_pin2_polarity;
extern int acpi_disable_cmcff;
extern int acpi_disable_cmcff;


extern u8 acpi_sci_flags;
extern u8 acpi_sci_flags;
extern int acpi_sci_override_gsi;
extern u32 acpi_sci_override_gsi;
void acpi_pic_sci_set_trigger(unsigned int, u16);
void acpi_pic_sci_set_trigger(unsigned int, u16);


struct device;
struct device;
+17 −18
Original line number Original line Diff line number Diff line
@@ -68,8 +68,9 @@ int acpi_ioapic;
int acpi_strict;
int acpi_strict;
int acpi_disable_cmcff;
int acpi_disable_cmcff;


/* ACPI SCI override configuration */
u8 acpi_sci_flags __initdata;
u8 acpi_sci_flags __initdata;
int acpi_sci_override_gsi __initdata;
u32 acpi_sci_override_gsi __initdata = INVALID_ACPI_IRQ;
int acpi_skip_timer_override __initdata;
int acpi_skip_timer_override __initdata;
int acpi_use_timer_override __initdata;
int acpi_use_timer_override __initdata;
int acpi_fix_pin2_polarity __initdata;
int acpi_fix_pin2_polarity __initdata;
@@ -112,8 +113,6 @@ static u32 isa_irq_to_gsi[NR_IRQS_LEGACY] __read_mostly = {
	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
};
};


#define	ACPI_INVALID_GSI		INT_MIN

/*
/*
 * This is just a simple wrapper around early_memremap(),
 * This is just a simple wrapper around early_memremap(),
 * with sanity checks for phys == 0 and size == 0.
 * with sanity checks for phys == 0 and size == 0.
@@ -372,7 +371,7 @@ static void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger,
	 * and acpi_isa_irq_to_gsi() may give wrong result.
	 * and acpi_isa_irq_to_gsi() may give wrong result.
	 */
	 */
	if (gsi < nr_legacy_irqs() && isa_irq_to_gsi[gsi] == gsi)
	if (gsi < nr_legacy_irqs() && isa_irq_to_gsi[gsi] == gsi)
		isa_irq_to_gsi[gsi] = ACPI_INVALID_GSI;
		isa_irq_to_gsi[gsi] = INVALID_ACPI_IRQ;
	isa_irq_to_gsi[bus_irq] = gsi;
	isa_irq_to_gsi[bus_irq] = gsi;
}
}


@@ -620,24 +619,24 @@ int acpi_gsi_to_irq(u32 gsi, unsigned int *irqp)
	}
	}


	rc = acpi_get_override_irq(gsi, &trigger, &polarity);
	rc = acpi_get_override_irq(gsi, &trigger, &polarity);
	if (rc == 0) {
	if (rc)
		return rc;

	trigger = trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE;
	trigger = trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE;
	polarity = polarity ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH;
	polarity = polarity ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH;
	irq = acpi_register_gsi(NULL, gsi, trigger, polarity);
	irq = acpi_register_gsi(NULL, gsi, trigger, polarity);
		if (irq >= 0) {
	if (irq < 0)
		return irq;

	*irqp = irq;
	*irqp = irq;
	return 0;
	return 0;
}
}
	}

	return -1;
}
EXPORT_SYMBOL_GPL(acpi_gsi_to_irq);
EXPORT_SYMBOL_GPL(acpi_gsi_to_irq);


int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi)
int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi)
{
{
	if (isa_irq < nr_legacy_irqs() &&
	if (isa_irq < nr_legacy_irqs() &&
	    isa_irq_to_gsi[isa_irq] != ACPI_INVALID_GSI) {
	    isa_irq_to_gsi[isa_irq] != INVALID_ACPI_IRQ) {
		*gsi = isa_irq_to_gsi[isa_irq];
		*gsi = isa_irq_to_gsi[isa_irq];
		return 0;
		return 0;
	}
	}
@@ -676,8 +675,7 @@ static int acpi_register_gsi_ioapic(struct device *dev, u32 gsi,
	mutex_lock(&acpi_ioapic_lock);
	mutex_lock(&acpi_ioapic_lock);
	irq = mp_map_gsi_to_irq(gsi, IOAPIC_MAP_ALLOC, &info);
	irq = mp_map_gsi_to_irq(gsi, IOAPIC_MAP_ALLOC, &info);
	/* Don't set up the ACPI SCI because it's already set up */
	/* Don't set up the ACPI SCI because it's already set up */
	if (irq >= 0 && enable_update_mptable &&
	if (irq >= 0 && enable_update_mptable && gsi != acpi_gbl_FADT.sci_interrupt)
	    acpi_gbl_FADT.sci_interrupt != gsi)
		mp_config_acpi_gsi(dev, gsi, trigger, polarity);
		mp_config_acpi_gsi(dev, gsi, trigger, polarity);
	mutex_unlock(&acpi_ioapic_lock);
	mutex_unlock(&acpi_ioapic_lock);
#endif
#endif
@@ -1211,8 +1209,9 @@ static int __init acpi_parse_madt_ioapic_entries(void)
	/*
	/*
	 * If BIOS did not supply an INT_SRC_OVR for the SCI
	 * If BIOS did not supply an INT_SRC_OVR for the SCI
	 * pretend we got one so we can set the SCI flags.
	 * pretend we got one so we can set the SCI flags.
	 * But ignore setting up SCI on hardware reduced platforms.
	 */
	 */
	if (!acpi_sci_override_gsi)
	if (acpi_sci_override_gsi == INVALID_ACPI_IRQ && !acpi_gbl_reduced_hardware)
		acpi_sci_ioapic_setup(acpi_gbl_FADT.sci_interrupt, 0, 0,
		acpi_sci_ioapic_setup(acpi_gbl_FADT.sci_interrupt, 0, 0,
				      acpi_gbl_FADT.sci_interrupt);
				      acpi_gbl_FADT.sci_interrupt);


+46 −33
Original line number Original line Diff line number Diff line
@@ -414,6 +414,51 @@ static void ghes_handle_memory_failure(struct acpi_hest_generic_data *gdata, int
#endif
#endif
}
}


/*
 * PCIe AER errors need to be sent to the AER driver for reporting and
 * recovery. The GHES severities map to the following AER severities and
 * require the following handling:
 *
 * GHES_SEV_CORRECTABLE -> AER_CORRECTABLE
 *     These need to be reported by the AER driver but no recovery is
 *     necessary.
 * GHES_SEV_RECOVERABLE -> AER_NONFATAL
 * GHES_SEV_RECOVERABLE && CPER_SEC_RESET -> AER_FATAL
 *     These both need to be reported and recovered from by the AER driver.
 * GHES_SEV_PANIC does not make it to this handling since the kernel must
 *     panic.
 */
static void ghes_handle_aer(struct acpi_hest_generic_data *gdata)
{
#ifdef CONFIG_ACPI_APEI_PCIEAER
	struct cper_sec_pcie *pcie_err = acpi_hest_get_payload(gdata);

	if (pcie_err->validation_bits & CPER_PCIE_VALID_DEVICE_ID &&
	    pcie_err->validation_bits & CPER_PCIE_VALID_AER_INFO) {
		unsigned int devfn;
		int aer_severity;

		devfn = PCI_DEVFN(pcie_err->device_id.device,
				  pcie_err->device_id.function);
		aer_severity = cper_severity_to_aer(gdata->error_severity);

		/*
		 * If firmware reset the component to contain
		 * the error, we must reinitialize it before
		 * use, so treat it as a fatal AER error.
		 */
		if (gdata->flags & CPER_SEC_RESET)
			aer_severity = AER_FATAL;

		aer_recover_queue(pcie_err->device_id.segment,
				  pcie_err->device_id.bus,
				  devfn, aer_severity,
				  (struct aer_capability_regs *)
				  pcie_err->aer_info);
	}
#endif
}

static void ghes_do_proc(struct ghes *ghes,
static void ghes_do_proc(struct ghes *ghes,
			 const struct acpi_hest_generic_status *estatus)
			 const struct acpi_hest_generic_status *estatus)
{
{
@@ -441,38 +486,9 @@ static void ghes_do_proc(struct ghes *ghes,
			arch_apei_report_mem_error(sev, mem_err);
			arch_apei_report_mem_error(sev, mem_err);
			ghes_handle_memory_failure(gdata, sev);
			ghes_handle_memory_failure(gdata, sev);
		}
		}
#ifdef CONFIG_ACPI_APEI_PCIEAER
		else if (guid_equal(sec_type, &CPER_SEC_PCIE)) {
		else if (guid_equal(sec_type, &CPER_SEC_PCIE)) {
			struct cper_sec_pcie *pcie_err = acpi_hest_get_payload(gdata);
			ghes_handle_aer(gdata);

			if (sev == GHES_SEV_RECOVERABLE &&
			    sec_sev == GHES_SEV_RECOVERABLE &&
			    pcie_err->validation_bits & CPER_PCIE_VALID_DEVICE_ID &&
			    pcie_err->validation_bits & CPER_PCIE_VALID_AER_INFO) {
				unsigned int devfn;
				int aer_severity;

				devfn = PCI_DEVFN(pcie_err->device_id.device,
						  pcie_err->device_id.function);
				aer_severity = cper_severity_to_aer(gdata->error_severity);

				/*
				 * If firmware reset the component to contain
				 * the error, we must reinitialize it before
				 * use, so treat it as a fatal AER error.
				 */
				if (gdata->flags & CPER_SEC_RESET)
					aer_severity = AER_FATAL;

				aer_recover_queue(pcie_err->device_id.segment,
						  pcie_err->device_id.bus,
						  devfn, aer_severity,
						  (struct aer_capability_regs *)
						  pcie_err->aer_info);
			}

		}
		}
#endif
		else if (guid_equal(sec_type, &CPER_SEC_PROC_ARM)) {
		else if (guid_equal(sec_type, &CPER_SEC_PROC_ARM)) {
			struct cper_sec_proc_arm *err = acpi_hest_get_payload(gdata);
			struct cper_sec_proc_arm *err = acpi_hest_get_payload(gdata);


@@ -870,7 +886,6 @@ static void ghes_print_queued_estatus(void)
	struct ghes_estatus_node *estatus_node;
	struct ghes_estatus_node *estatus_node;
	struct acpi_hest_generic *generic;
	struct acpi_hest_generic *generic;
	struct acpi_hest_generic_status *estatus;
	struct acpi_hest_generic_status *estatus;
	u32 len, node_len;


	llnode = llist_del_all(&ghes_estatus_llist);
	llnode = llist_del_all(&ghes_estatus_llist);
	/*
	/*
@@ -882,8 +897,6 @@ static void ghes_print_queued_estatus(void)
		estatus_node = llist_entry(llnode, struct ghes_estatus_node,
		estatus_node = llist_entry(llnode, struct ghes_estatus_node,
					   llnode);
					   llnode);
		estatus = GHES_ESTATUS_FROM_NODE(estatus_node);
		estatus = GHES_ESTATUS_FROM_NODE(estatus_node);
		len = cper_estatus_len(estatus);
		node_len = GHES_ESTATUS_NODE_LEN(len);
		generic = estatus_node->generic;
		generic = estatus_node->generic;
		ghes_print_estatus(NULL, generic, estatus);
		ghes_print_estatus(NULL, generic, estatus);
		llnode = llnode->next;
		llnode = llnode->next;
+1 −1
Original line number Original line Diff line number Diff line
@@ -1516,7 +1516,7 @@ static int acpi_ec_setup(struct acpi_ec *ec, bool handle_events)
	}
	}


	acpi_handle_info(ec->handle,
	acpi_handle_info(ec->handle,
			 "GPE=0x%lx, EC_CMD/EC_SC=0x%lx, EC_DATA=0x%lx\n",
			 "GPE=0x%x, EC_CMD/EC_SC=0x%lx, EC_DATA=0x%lx\n",
			 ec->gpe, ec->command_addr, ec->data_addr);
			 ec->gpe, ec->command_addr, ec->data_addr);
	return ret;
	return ret;
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -128,7 +128,7 @@ static int acpi_ec_add_debugfs(struct acpi_ec *ec, unsigned int ec_device_count)
		return -ENOMEM;
		return -ENOMEM;
	}
	}


	if (!debugfs_create_x32("gpe", 0444, dev_dir, (u32 *)&first_ec->gpe))
	if (!debugfs_create_x32("gpe", 0444, dev_dir, &first_ec->gpe))
		goto error;
		goto error;
	if (!debugfs_create_bool("use_global_lock", 0444, dev_dir,
	if (!debugfs_create_bool("use_global_lock", 0444, dev_dir,
				 &first_ec->global_lock))
				 &first_ec->global_lock))
Loading