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(handler_guid: norm_to_sys_guid, param_buffer: &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 | } |
58 |