58 lines
1.4 KiB
C
58 lines
1.4 KiB
C
|
// 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;
|
||
|
}
|