|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
| 2 | +/* |
| 3 | + * AMD Address Translation Library |
| 4 | + * |
| 5 | + * prm.c : Plumbing code for ACPI Platform Runtime Mechanism (PRM) |
| 6 | + * |
| 7 | + * Information on AMD PRM modules and handlers including the GUIDs and buffer |
| 8 | + * structures used here are defined in the AMD ACPI Porting Guide in the |
| 9 | + * chapter "Platform Runtime Mechanism Table (PRMT)" |
| 10 | + * |
| 11 | + * Copyright (c) 2024, Advanced Micro Devices, Inc. |
| 12 | + * All Rights Reserved. |
| 13 | + * |
| 14 | + * Author: John Allen <john.allen@amd.com> |
| 15 | + */ |
| 16 | + |
| 17 | +#include "internal.h" |
| 18 | + |
| 19 | +#include <linux/prmt.h> |
| 20 | + |
| 21 | +/* |
| 22 | + * PRM parameter buffer - normalized to system physical address, as described |
| 23 | + * in the "PRM Parameter Buffer" section of the AMD ACPI Porting Guide. |
| 24 | + */ |
| 25 | +struct norm_to_sys_param_buf { |
| 26 | + u64 norm_addr; |
| 27 | + u8 socket; |
| 28 | + u64 bank_id; |
| 29 | + void *out_buf; |
| 30 | +} __packed; |
| 31 | + |
| 32 | +static const guid_t norm_to_sys_guid = GUID_INIT(0xE7180659, 0xA65D, 0x451D, |
| 33 | + 0x92, 0xCD, 0x2B, 0x56, 0xF1, |
| 34 | + 0x2B, 0xEB, 0xA6); |
| 35 | + |
| 36 | +unsigned long prm_umc_norm_to_sys_addr(u8 socket_id, u64 bank_id, unsigned long addr) |
| 37 | +{ |
| 38 | + struct norm_to_sys_param_buf p_buf; |
| 39 | + unsigned long ret_addr; |
| 40 | + int ret; |
| 41 | + |
| 42 | + p_buf.norm_addr = addr; |
| 43 | + p_buf.socket = socket_id; |
| 44 | + p_buf.bank_id = bank_id; |
| 45 | + p_buf.out_buf = &ret_addr; |
| 46 | + |
| 47 | + ret = acpi_call_prm_handler(norm_to_sys_guid, &p_buf); |
| 48 | + if (!ret) |
| 49 | + return ret_addr; |
| 50 | + |
| 51 | + if (ret == -ENODEV) |
| 52 | + pr_debug("PRM module/handler not available\n"); |
| 53 | + else |
| 54 | + pr_notice_once("PRM address translation failed\n"); |
| 55 | + |
| 56 | + return ret; |
| 57 | +} |
0 commit comments