root/arch/mips/cavium-octeon/crypto/octeon-crypto.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. octeon_crypto_enable
  2. octeon_crypto_disable

   1 /*
   2  * This file is subject to the terms and conditions of the GNU General Public
   3  * License. See the file "COPYING" in the main directory of this archive
   4  * for more details.
   5  *
   6  * Copyright (C) 2004-2012 Cavium Networks
   7  */
   8 
   9 #include <asm/cop2.h>
  10 #include <linux/export.h>
  11 #include <linux/interrupt.h>
  12 #include <linux/sched/task_stack.h>
  13 
  14 #include "octeon-crypto.h"
  15 
  16 /**
  17  * Enable access to Octeon's COP2 crypto hardware for kernel use. Wrap any
  18  * crypto operations in calls to octeon_crypto_enable/disable in order to make
  19  * sure the state of COP2 isn't corrupted if userspace is also performing
  20  * hardware crypto operations. Allocate the state parameter on the stack.
  21  * Returns with preemption disabled.
  22  *
  23  * @state: Pointer to state structure to store current COP2 state in.
  24  *
  25  * Returns: Flags to be passed to octeon_crypto_disable()
  26  */
  27 unsigned long octeon_crypto_enable(struct octeon_cop2_state *state)
  28 {
  29         int status;
  30         unsigned long flags;
  31 
  32         preempt_disable();
  33         local_irq_save(flags);
  34         status = read_c0_status();
  35         write_c0_status(status | ST0_CU2);
  36         if (KSTK_STATUS(current) & ST0_CU2) {
  37                 octeon_cop2_save(&(current->thread.cp2));
  38                 KSTK_STATUS(current) &= ~ST0_CU2;
  39                 status &= ~ST0_CU2;
  40         } else if (status & ST0_CU2) {
  41                 octeon_cop2_save(state);
  42         }
  43         local_irq_restore(flags);
  44         return status & ST0_CU2;
  45 }
  46 EXPORT_SYMBOL_GPL(octeon_crypto_enable);
  47 
  48 /**
  49  * Disable access to Octeon's COP2 crypto hardware in the kernel. This must be
  50  * called after an octeon_crypto_enable() before any context switch or return to
  51  * userspace.
  52  *
  53  * @state:      Pointer to COP2 state to restore
  54  * @flags:      Return value from octeon_crypto_enable()
  55  */
  56 void octeon_crypto_disable(struct octeon_cop2_state *state,
  57                            unsigned long crypto_flags)
  58 {
  59         unsigned long flags;
  60 
  61         local_irq_save(flags);
  62         if (crypto_flags & ST0_CU2)
  63                 octeon_cop2_restore(state);
  64         else
  65                 write_c0_status(read_c0_status() & ~ST0_CU2);
  66         local_irq_restore(flags);
  67         preempt_enable();
  68 }
  69 EXPORT_SYMBOL_GPL(octeon_crypto_disable);

/* [<][>][^][v][top][bottom][index][help] */