// SPDX-License-Identifier: GPL-2.0-or-later /* * AMD Address Translation Library * * prm.c : Plumbing code for ACPI Platform Runtime Mechanism (PRM) * * Information on AMD PRM modules and handlers including the GUIDs and buffer * structures used here are defined in the AMD ACPI Porting Guide in the * chapter "Platform Runtime Mechanism Table (PRMT)" * * Copyright (c) 2024, Advanced Micro Devices, Inc. * All Rights Reserved. * * Author: John Allen */ #include "internal.h" #include /* * PRM parameter buffer - normalized to system physical address, as described * in the "PRM Parameter Buffer" section of the AMD ACPI Porting Guide. */ struct norm_to_sys_param_buf { u64 norm_addr; u8 socket; u64 bank_id; void *out_buf; } __packed; static const guid_t norm_to_sys_guid = GUID_INIT(0xE7180659, 0xA65D, 0x451D, 0x92, 0xCD, 0x2B, 0x56, 0xF1, 0x2B, 0xEB, 0xA6); unsigned long prm_umc_norm_to_sys_addr(u8 socket_id, u64 bank_id, unsigned long addr) { struct norm_to_sys_param_buf p_buf; unsigned long ret_addr; int ret; p_buf.norm_addr = addr; p_buf.socket = socket_id; p_buf.bank_id = bank_id; p_buf.out_buf = &ret_addr; ret = acpi_call_prm_handler(norm_to_sys_guid, &p_buf); if (!ret) return ret_addr; if (ret == -ENODEV) pr_debug("PRM module/handler not available\n"); else pr_notice_once("PRM address translation failed\n"); return ret; }