mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-19 16:36:52 +07:00
2392c8c8c0
Define interfaces (wrappers) to the 'copy' and 'paste' instructions (which are new in PowerISA 3.0). These are intended to be used to by NX driver(s) to submit Coprocessor Request Blocks (CRBs) to the NX hardware engines. Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
47 lines
1013 B
C
47 lines
1013 B
C
/*
|
|
* Copyright 2016-17 IBM Corp.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
#include <asm/ppc-opcode.h>
|
|
|
|
#define CR0_SHIFT 28
|
|
#define CR0_MASK 0xF
|
|
/*
|
|
* Copy/paste instructions:
|
|
*
|
|
* copy RA,RB
|
|
* Copy contents of address (RA) + effective_address(RB)
|
|
* to internal copy-buffer.
|
|
*
|
|
* paste RA,RB
|
|
* Paste contents of internal copy-buffer to the address
|
|
* (RA) + effective_address(RB)
|
|
*/
|
|
static inline int vas_copy(void *crb, int offset)
|
|
{
|
|
asm volatile(PPC_COPY(%0, %1)";"
|
|
:
|
|
: "b" (offset), "b" (crb)
|
|
: "memory");
|
|
|
|
return 0;
|
|
}
|
|
|
|
static inline int vas_paste(void *paste_address, int offset)
|
|
{
|
|
u32 cr;
|
|
|
|
cr = 0;
|
|
asm volatile(PPC_PASTE(%1, %2)";"
|
|
"mfocrf %0, 0x80;"
|
|
: "=r" (cr)
|
|
: "b" (offset), "b" (paste_address)
|
|
: "memory", "cr0");
|
|
|
|
return (cr >> CR0_SHIFT) & CR0_MASK;
|
|
}
|