Commit f0fcdd2c authored by John Allen's avatar John Allen Committed by Borislav Petkov (AMD)
Browse files

ACPI: PRM: Add PRM handler direct call support



Platform Runtime Mechanism (PRM) handlers can be invoked from either the AML
interpreter or directly by an OS driver. Implement the latter.

  [ bp: Massage commit message. ]

Signed-off-by: default avatarJohn Allen <john.allen@amd.com>
Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: default avatarYazen Ghannam <yazen.ghannam@amd.com>
Reviewed-by: default avatarArd Biesheuvel <ardb@kernel.org>
Acked-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://lore.kernel.org/r/20240730151731.15363-2-john.allen@amd.com
parent 8400291e
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -214,6 +214,30 @@ static struct prm_handler_info *find_prm_handler(const guid_t *guid)
#define UPDATE_LOCK_ALREADY_HELD 	4
#define UPDATE_UNLOCK_WITHOUT_LOCK 	5

int acpi_call_prm_handler(guid_t handler_guid, void *param_buffer)
{
	struct prm_handler_info *handler = find_prm_handler(&handler_guid);
	struct prm_module_info *module = find_prm_module(&handler_guid);
	struct prm_context_buffer context;
	efi_status_t status;

	if (!module || !handler)
		return -ENODEV;

	memset(&context, 0, sizeof(context));
	ACPI_COPY_NAMESEG(context.signature, "PRMC");
	context.identifier         = handler->guid;
	context.static_data_buffer = handler->static_data_buffer_addr;
	context.mmio_ranges        = module->mmio_info;

	status = efi_call_acpi_prm_handler(handler->handler_addr,
					   (u64)param_buffer,
					   &context);

	return efi_status_to_err(status);
}
EXPORT_SYMBOL_GPL(acpi_call_prm_handler);

/*
 * This is the PlatformRtMechanism opregion space handler.
 * @function: indicates the read/write. In fact as the PlatformRtMechanism
+5 −0
Original line number Diff line number Diff line
@@ -2,6 +2,11 @@

#ifdef CONFIG_ACPI_PRMT
void init_prmt(void);
int acpi_call_prm_handler(guid_t handler_guid, void *param_buffer);
#else
static inline void init_prmt(void) { }
static inline int acpi_call_prm_handler(guid_t handler_guid, void *param_buffer)
{
	return -EOPNOTSUPP;
}
#endif