1/******************************************************************************
2**
3** FILE NAME    : ifxmips_deu_vr9.c
4** PROJECT      : IFX UEIP
5** MODULES      : DEU Module for VR9
6**
7** DATE         : September 8, 2009
8** AUTHOR       : Mohammad Firdaus
9** DESCRIPTION  : Data Encryption Unit Driver
10** COPYRIGHT    :       Copyright (c) 2009
11**                      Infineon Technologies AG
12**                      Am Campeon 1-12, 85579 Neubiberg, Germany
13**
14**    This program is free software; you can redistribute it and/or modify
15**    it under the terms of the GNU General Public License as published by
16**    the Free Software Foundation; either version 2 of the License, or
17**    (at your option) any later version.
18**
19** HISTORY
20** $Date        $Author             $Comment
21** 08,Sept 2009 Mohammad Firdaus    Initial UEIP release
22*******************************************************************************/
23
24/*!
25  \defgroup  IFX_DEU IFX_DEU_DRIVERS
26  \ingroup  API
27  \brief deu driver module
28*/
29
30/*!
31  \file		ifxmips_deu_vr9.c
32  \ingroup 	IFX_DEU
33  \brief 	board specific deu driver file for vr9
34*/
35
36/*!
37  \defgroup   BOARD_SPECIFIC_FUNCTIONS IFX_BOARD_SPECIFIC_FUNCTIONS
38  \ingroup IFX_DEU
39  \brief board specific deu driver functions
40*/
41
42/* Project header files */
43#include <linux/module.h>
44#include <linux/init.h>
45#include <linux/types.h>
46#include <linux/errno.h>
47#include <asm/io.h> //dma_cache_inv
48
49#include "ifxmips_deu_dma.h"
50#include "ifxmips_deu_vr9.h"
51
52/* Function decleration */
53void aes_chip_init (void);
54void des_chip_init (void);
55int deu_dma_init (void);
56void deu_dma_priv_init(void);
57u32 endian_swap(u32 input);
58u32* memory_alignment(const u8 *arg, u32 *buff_alloc, int in_out, int nbytes);
59void aes_dma_memory_copy(u32 *outcopy, u32 *out_dma, u8 *out_arg, int nbytes);
60void des_dma_memory_copy(u32 *outcopy, u32 *out_dma, u8 *out_arg, int nbytes);
61void __exit ifxdeu_fini_dma(void);
62
63#define DES_3DES_START  IFX_DES_CON
64#define AES_START       IFX_AES_CON
65
66/* Variables */
67
68u8 *g_dma_page_ptr = NULL;
69u8 *g_dma_block = NULL;
70u8 *g_dma_block2 = NULL;
71
72deu_drv_priv_t deu_dma_priv;
73
74
75/*! \fn u32 endian_swap(u32 input)
76 *  \ingroup BOARD_SPECIFIC_FUNCTIONS
77 *  \brief Swap data given to the function
78 *  \param input Data input to be swapped
79 *  \return either the swapped data or the input data depending on whether it is in DMA mode or FPI mode
80*/
81
82
83u32 endian_swap(u32 input)
84{
85    return input;
86}
87
88/*! \fn u32 input_swap(u32 input)
89 *  \ingroup BOARD_SPECIFIC_FUNCTIONS
90 *  \brief Not used
91 *  \return input
92*/
93
94u32 input_swap(u32 input)
95{
96    return input;
97}
98
99/*! \fn void aes_chip_init (void)
100 *  \ingroup BOARD_SPECIFIC_FUNCTIONS
101 *  \brief initialize AES hardware
102*/
103
104void aes_chip_init (void)
105{
106    volatile struct aes_t *aes = (struct aes_t *) AES_START;
107
108    // start crypto engine with write to ILR
109    aes->controlr.SM = 1;
110    aes->controlr.NDC = 0;
111    asm("sync");
112    aes->controlr.ENDI = 1;
113    asm("sync");
114    aes->controlr.ARS = 0;
115
116}
117
118/*! \fn void des_chip_init (void)
119 *  \ingroup IFX_AES_FUNCTIONS
120 *  \brief initialize DES hardware
121*/
122
123void des_chip_init (void)
124{
125    volatile struct des_t *des = (struct des_t *) DES_3DES_START;
126
127    // start crypto engine with write to ILR
128    des->controlr.SM = 1;
129    des->controlr.NDC = 1;
130    asm("sync");
131    des->controlr.ENDI = 1;
132    asm("sync");
133    des->controlr.ARS = 0;
134
135}
136/*! \fn void chip_version(void)
137 *  \ingroup IFX_DES_FUNCTIONS
138 *  \brief function not used in VR9
139*/
140void chip_version(void)
141{
142    return;
143}
144
145