1/******************************************************************************
2**
3** FILE NAME    : ifxmips_deu_danube.c
4** PROJECT      : IFX UEIP
5** MODULES      : DEU Module for Danube
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  \defgroup IFX_DEU IFX_DEU_DRIVERS
25  \ingroup API
26  \brief deu driver module
27*/
28
29/*!
30  \file	ifxmips_deu_danube.c
31  \ingroup IFX_DEU
32  \brief board specific deu driver file for danube
33*/
34
35/*!
36  \defgroup BOARD_SPECIFIC_FUNCTIONS IFX_BOARD_SPECIFIC_FUNCTIONS
37  \ingroup IFX_DEU
38  \brief board specific deu functions
39*/
40
41/* Project header files */
42#include <linux/module.h>
43#include <linux/init.h>
44#include <linux/types.h>
45#include <linux/errno.h>
46#include <asm/io.h> //dma_cache_inv
47
48#include "ifxmips_deu_dma.h"
49#include "ifxmips_deu_danube.h"
50
51
52/* Function Declerations */
53int aes_memory_allocate(int value);
54int des_memory_allocate(int value);
55void memory_release(u32 *addr);
56int aes_chip_init (void);
57void des_chip_init (void);
58int deu_dma_init (void);
59u32 endian_swap(u32 input);
60u32* memory_alignment(const u8 *arg, u32 *buff_alloc, int in_out, int nbytes);
61void dma_memory_copy(u32 *outcopy, u32 *out_dma, u8 *out_arg, int nbytes);
62void chip_version(void);
63void deu_dma_priv_init(void);
64void __exit ifxdeu_fini_dma(void);
65
66#define DES_3DES_START  IFX_DES_CON
67#define AES_START       IFX_AES_CON
68#define CLC_START       IFX_DEU_CLK
69
70/* Variables definition */
71int ifx_danube_pre_1_4;
72u8 *g_dma_page_ptr = NULL;
73u8 *g_dma_block = NULL;
74u8 *g_dma_block2 = NULL;
75
76deu_drv_priv_t deu_dma_priv;
77
78
79/*! \fn u32 endian_swap(u32 input)
80 *  \ingroup BOARD_SPECIFIC_FUNCTIONS
81 *  \brief function is not used
82 *  \param input Data input to be swapped
83 *  \return input
84*/
85
86u32 endian_swap(u32 input)
87{
88    return input;
89}
90
91/*! \fn	u32 input_swap(u32 input)
92 *  \ingroup BOARD_SPECIFIC_FUNCTIONS
93 *  \brief Swap the input data if the current chip is Danube version
94 *         1.4 and do nothing to the data if the current chip is
95 *         Danube version 1.3
96 *  \param input data that needs to be swapped
97 *  \return input or swapped input
98*/
99
100u32 input_swap(u32 input)
101{
102    if (!ifx_danube_pre_1_4) {
103        u8 *ptr = (u8 *)&input;
104        return ((ptr[3] << 24) | (ptr[2] << 16) | (ptr[1] << 8) | ptr[0]);
105    }
106    else
107        return input;
108}
109
110
111
112/*! \fn void aes_chip_init (void)
113 *  \ingroup BOARD_SPECIFIC_FUNCTIONS
114 * \brief initialize AES hardware
115*/
116
117int aes_chip_init (void)
118{
119    volatile struct aes_t *aes = (struct aes_t *) AES_START;
120
121    //start crypto engine with write to ILR
122    aes->controlr.SM = 1;
123    aes->controlr.ARS = 1;
124    return 0;
125}
126
127/*! \fn void des_chip_init (void)
128 *  \ingroup BOARD_SPECIFIC_FUNCTIONS
129 *  \brief initialize DES hardware
130*/
131
132void des_chip_init (void)
133{
134        volatile struct des_t *des = (struct des_t *) DES_3DES_START;
135
136        // start crypto engine with write to ILR
137        des->controlr.SM = 1;
138        des->controlr.ARS = 1;
139}
140
141/*! \fn void chip_version (void)
142 *  \ingroup IFX_DES_FUNCTIONS
143 *  \brief To find the version of the chip by looking at the chip ID
144 *  \param ifx_danube_pre_1_4 (sets to 1 if Chip is Danube less than v1.4)
145*/
146#define IFX_MPS               (KSEG1 | 0x1F107000)
147#define IFX_MPS_CHIPID                          ((volatile u32*)(IFX_MPS + 0x0344))
148
149void chip_version(void)
150{
151
152    /* DANUBE PRE 1.4 SOFTWARE FIX */
153    int chip_id = 0;
154    chip_id = *IFX_MPS_CHIPID;
155    chip_id >>= 28;
156
157    if (chip_id >= 4) {
158        ifx_danube_pre_1_4 = 0;
159        printk("Danube Chip ver. 1.4 detected. \n");
160    }
161    else {
162        ifx_danube_pre_1_4 = 1;
163        printk("Danube Chip ver. 1.3 or below detected. \n");
164    }
165
166    return;
167}
168
169