2008-07-30 13:34:04 +08:00
|
|
|
/*
|
|
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
|
|
* for more details.
|
|
|
|
*
|
|
|
|
* Copyright (c) 2008 Silicon Graphics, Inc. All Rights Reserved.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Cross Partition (XP) uv-based functions.
|
|
|
|
*
|
|
|
|
* Architecture specific implementation of common functions.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2008-07-30 13:34:16 +08:00
|
|
|
#include <linux/device.h>
|
|
|
|
#include <asm/uv/uv_hub.h>
|
|
|
|
#include "../sgi-gru/grukservices.h"
|
2008-07-30 13:34:04 +08:00
|
|
|
#include "xp.h"
|
|
|
|
|
2008-07-30 13:34:16 +08:00
|
|
|
/*
|
|
|
|
* Convert a virtual memory address to a physical memory address.
|
|
|
|
*/
|
|
|
|
static unsigned long
|
|
|
|
xp_pa_uv(void *addr)
|
|
|
|
{
|
|
|
|
return uv_gpa(addr);
|
|
|
|
}
|
|
|
|
|
2008-07-30 13:34:05 +08:00
|
|
|
static enum xp_retval
|
2008-07-30 13:34:16 +08:00
|
|
|
xp_remote_memcpy_uv(unsigned long dst_gpa, const unsigned long src_gpa,
|
|
|
|
size_t len)
|
2008-07-30 13:34:05 +08:00
|
|
|
{
|
2008-07-30 13:34:16 +08:00
|
|
|
int ret;
|
|
|
|
|
|
|
|
ret = gru_copy_gpa(dst_gpa, src_gpa, len);
|
|
|
|
if (ret == 0)
|
|
|
|
return xpSuccess;
|
|
|
|
|
|
|
|
dev_err(xp, "gru_copy_gpa() failed, dst_gpa=0x%016lx src_gpa=0x%016lx "
|
|
|
|
"len=%ld\n", dst_gpa, src_gpa, len);
|
|
|
|
return xpGruCopyError;
|
2008-07-30 13:34:05 +08:00
|
|
|
}
|
|
|
|
|
2008-07-30 13:34:04 +08:00
|
|
|
enum xp_retval
|
|
|
|
xp_init_uv(void)
|
|
|
|
{
|
|
|
|
BUG_ON(!is_uv());
|
|
|
|
|
|
|
|
xp_max_npartitions = XP_MAX_NPARTITIONS_UV;
|
2008-07-30 13:34:05 +08:00
|
|
|
|
2008-07-30 13:34:16 +08:00
|
|
|
xp_pa = xp_pa_uv;
|
2008-07-30 13:34:05 +08:00
|
|
|
xp_remote_memcpy = xp_remote_memcpy_uv;
|
|
|
|
|
|
|
|
return xpSuccess;
|
2008-07-30 13:34:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
xp_exit_uv(void)
|
|
|
|
{
|
|
|
|
BUG_ON(!is_uv());
|
|
|
|
}
|