| // 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 <john.allen@amd.com> |
| */ |
| |
| #include "internal.h" |
| |
| #include <linux/prmt.h> |
| |
| /* |
| * 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; |
| } |