Commit cc10eee9 authored by Vishal Verma's avatar Vishal Verma Committed by Dan Williams
Browse files

PCI/ACPI: add a helper for retrieving _OSC Control DWORDs



During _OSC negotiation, when the 'Control' DWORD is needed from the
result buffer after running _OSC, a couple of places performed manual
pointer arithmetic to offset into the right spot in the raw buffer.
Add a acpi_osc_ctx_get_pci_control() helper to use the #define'd
DWORD offsets to fetch the DWORDs needed from @acpi_osc_context, and
replace the above instances of the open-coded arithmetic.

Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Suggested-by: default avatarDavidlohr Bueso <dave@stgolabs.net>
Acked-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: default avatarDavidlohr Bueso <dave@stgolabs.net>
Reviewed by: Adam Manzanares <a.manzanares@samsung.com>
Signed-off-by: default avatarVishal Verma <vishal.l.verma@intel.com>
Link: https://lore.kernel.org/r/20220413073618.291335-2-vishal.l.verma@intel.com


Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 35e01667
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -425,7 +425,7 @@ static void acpi_bus_osc_negotiate_usb_control(void)
	}

	osc_sb_native_usb4_control =
		control & ((u32 *)context.ret.pointer)[OSC_CONTROL_DWORD];
		control &  acpi_osc_ctx_get_pci_control(&context);

	acpi_bus_decode_usb_osc("USB4 _OSC: OS supports", control);
	acpi_bus_decode_usb_osc("USB4 _OSC: OS controls",
+1 −1
Original line number Diff line number Diff line
@@ -183,7 +183,7 @@ static acpi_status acpi_pci_run_osc(acpi_handle handle,

	status = acpi_run_osc(handle, &context);
	if (ACPI_SUCCESS(status)) {
		*retval = *((u32 *)(context.ret.pointer + 8));
		*retval = acpi_osc_ctx_get_pci_control(&context);
		kfree(context.ret.pointer);
	}
	return status;
+13 −0
Original line number Diff line number Diff line
@@ -608,6 +608,13 @@ extern u32 osc_sb_native_usb4_control;
#define OSC_PCI_EXPRESS_LTR_CONTROL		0x00000020
#define OSC_PCI_EXPRESS_DPC_CONTROL		0x00000080

static inline u32 acpi_osc_ctx_get_pci_control(struct acpi_osc_context *context)
{
	u32 *ret = context->ret.pointer;

	return ret[OSC_CONTROL_DWORD];
}

#define ACPI_GSB_ACCESS_ATTRIB_QUICK		0x00000002
#define ACPI_GSB_ACCESS_ATTRIB_SEND_RCV         0x00000004
#define ACPI_GSB_ACCESS_ATTRIB_BYTE		0x00000006
@@ -1004,6 +1011,12 @@ static inline int acpi_register_wakeup_handler(int wake_irq,
static inline void acpi_unregister_wakeup_handler(
	bool (*wakeup)(void *context), void *context) { }

struct acpi_osc_context;
static inline u32 acpi_osc_ctx_get_pci_control(struct acpi_osc_context *context)
{
	return 0;
}

#endif	/* !CONFIG_ACPI */

#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC