| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- // 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;
- }
|