12392c8c8SSukadev Bhattiprolu /* 22392c8c8SSukadev Bhattiprolu * Copyright 2016-17 IBM Corp. 32392c8c8SSukadev Bhattiprolu * 42392c8c8SSukadev Bhattiprolu * This program is free software; you can redistribute it and/or 52392c8c8SSukadev Bhattiprolu * modify it under the terms of the GNU General Public License 62392c8c8SSukadev Bhattiprolu * as published by the Free Software Foundation; either version 72392c8c8SSukadev Bhattiprolu * 2 of the License, or (at your option) any later version. 82392c8c8SSukadev Bhattiprolu */ 92392c8c8SSukadev Bhattiprolu #include <asm/ppc-opcode.h> 102392c8c8SSukadev Bhattiprolu 112392c8c8SSukadev Bhattiprolu #define CR0_SHIFT 28 122392c8c8SSukadev Bhattiprolu #define CR0_MASK 0xF 132392c8c8SSukadev Bhattiprolu /* 142392c8c8SSukadev Bhattiprolu * Copy/paste instructions: 152392c8c8SSukadev Bhattiprolu * 162392c8c8SSukadev Bhattiprolu * copy RA,RB 172392c8c8SSukadev Bhattiprolu * Copy contents of address (RA) + effective_address(RB) 182392c8c8SSukadev Bhattiprolu * to internal copy-buffer. 192392c8c8SSukadev Bhattiprolu * 202392c8c8SSukadev Bhattiprolu * paste RA,RB 212392c8c8SSukadev Bhattiprolu * Paste contents of internal copy-buffer to the address 222392c8c8SSukadev Bhattiprolu * (RA) + effective_address(RB) 232392c8c8SSukadev Bhattiprolu */ 242392c8c8SSukadev Bhattiprolu static inline int vas_copy(void *crb, int offset) 252392c8c8SSukadev Bhattiprolu { 262392c8c8SSukadev Bhattiprolu asm volatile(PPC_COPY(%0, %1)";" 272392c8c8SSukadev Bhattiprolu : 282392c8c8SSukadev Bhattiprolu : "b" (offset), "b" (crb) 292392c8c8SSukadev Bhattiprolu : "memory"); 302392c8c8SSukadev Bhattiprolu 312392c8c8SSukadev Bhattiprolu return 0; 322392c8c8SSukadev Bhattiprolu } 332392c8c8SSukadev Bhattiprolu 342392c8c8SSukadev Bhattiprolu static inline int vas_paste(void *paste_address, int offset) 352392c8c8SSukadev Bhattiprolu { 362392c8c8SSukadev Bhattiprolu u32 cr; 372392c8c8SSukadev Bhattiprolu 382392c8c8SSukadev Bhattiprolu cr = 0; 392392c8c8SSukadev Bhattiprolu asm volatile(PPC_PASTE(%1, %2)";" 402392c8c8SSukadev Bhattiprolu "mfocrf %0, 0x80;" 412392c8c8SSukadev Bhattiprolu : "=r" (cr) 422392c8c8SSukadev Bhattiprolu : "b" (offset), "b" (paste_address) 432392c8c8SSukadev Bhattiprolu : "memory", "cr0"); 442392c8c8SSukadev Bhattiprolu 452392c8c8SSukadev Bhattiprolu return (cr >> CR0_SHIFT) & CR0_MASK; 462392c8c8SSukadev Bhattiprolu } 47