blob: baa0224ee9a6b5222458419509f83b14a60702d9 [file] [log] [blame]
#include <asm/arch/cpu.h>
#include <asm/io.h>
#include "asr_bcm.h"
#include "asr_hash.h"
void bcm_enable(int enable)
{
uint32_t val;
/* it will no longer enable clk if the clk has been enabled */
static int enabled = 0;
if (enable) {
/* enable clock */
val = bcm_read32((AES_CLK_RES_CTRL));
if ((val & (1 << 4 | 1 << 5)) == (1 << 4 | 1 << 5)) {
enabled = 1;
return;
}
val |= (1 << 4 | 1 << 5);
bcm_write32(AES_CLK_RES_CTRL, val);
/* init */
bcm_write32(BIU_SP_CONTROL, 0x6);
bcm_write32(BIU_SP_INTERRUPT_MASK, 0xFFFFFFFF);
bcm_write32(BIU_HST_INTERRUPT_MASK, 0xFFFFFFFF);
bcm_write32(ADEC_INT_MSK, 0xFFFFFFFF);
} else {
/* disable clock */
if (enabled) {
return;
}
val = bcm_read32(AES_CLK_RES_CTRL);
val &= ~(1 << 4);
bcm_write32(AES_CLK_RES_CTRL, val);
}
}
int dma_input_config(int rid_ext, int rid)
{
uint32_t val;
val = bcm_read32(DMA_IN_CTRL);
val &= 0x0f0f0000;
val |= (0x7 << 28) | /* dis error check */
((rid_ext & 0xF) << 20) | /* rid ext */
(0x1 << 18) | /* dis out-of-order */
(0x1 << 17) | /* data 64 byte aligned */
(0x1 << 15) | /* FIFO bus size 64bit */
(0x1 << 13) | /* brust type: Inc */
(0x8 << 8) | /* brust len */
((rid & 0xF) << 4);
bcm_write32(DMA_IN_CTRL, val);
return 0;
}
int dma_input_address(uint32_t src_addr, uint32_t src_size, int chained)
{
if (chained) {
bcm_write32(DMA_IN_NX_LL_ADR, src_addr);
bcm_write32(DMA_IN_SRC_ADR, 0x0);
bcm_write32(DMA_IN_XFER_CNTR, 0x0);
} else {
bcm_write32(DMA_IN_NX_LL_ADR, 0x0);
bcm_write32(DMA_IN_SRC_ADR, src_addr);
bcm_write32(DMA_IN_XFER_CNTR, src_size);
}
return 0;
}
void dma_input_start(void)
{
uint32_t val;
val = bcm_read32(DMA_IN_INT);
bcm_write32(DMA_IN_INT, val);
val = bcm_read32(DMA_IN_CTRL);
val |= 0x1;
bcm_write32(DMA_IN_CTRL, val);
return;
}
void dma_input_stop(void)
{
uint32_t val;
val = bcm_read32(DMA_IN_CTRL);
val &= ~0x1;
bcm_write32(DMA_IN_CTRL, val);
return;
}
int dma_wait_input_finish(void)
{
uint32_t val, val_ori;
int loop;
int ret = 0;
loop = 10000;
while (loop > 0) {
val_ori = bcm_read32(DMA_IN_INT);
val = (val_ori & 0x1);
if (val !=0)
break;
loop--;
udelay(1);
}
if (loop == 0) {
ret = -1;
} else {
ret = 0;
}
dma_input_stop();
val = bcm_read32(DMA_IN_INT);
bcm_write32(DMA_IN_INT, val);
return ret;
}
int adec_engine_hw_reset(ADEC_ACC_ENG_T engine)
{
uint32_t val;
int tmp;
if (engine == ACC_ENG_ALL)
tmp = 0xffff;
else
tmp = 1 << engine;
val = bcm_read32(ADEC_CTRL);
val |= tmp;
bcm_write32(ADEC_CTRL, val);
val &= ~tmp;
bcm_write32(ADEC_CTRL, val);
return 0;
}
int abus_set_mode(ABUS_GRP_A_T grp_a_mode,
ABUS_GRP_B_T grp_b_mode,
ABUS_CROSS_BAR_T input_bar,
ABUS_CROSS_BAR_T output_bar)
{
uint32_t val;
val = bcm_read32(ABUS_BUS_CTRL);
val &= ~(0x77 << 0x4);
val |= (grp_a_mode << 0x4) | (grp_b_mode << 0x8);
if (input_bar == ABUS_STRAIGHT) {
val &= ~(0x1 << 0x0);
} else if (input_bar == ABUS_CROSS) {
val |= (0x1 << 0x0);
} else {
return -1;
}
if (output_bar == ABUS_STRAIGHT) {
val &= ~(0x1 << 0x2);
} else if (input_bar == ABUS_CROSS) {
val |= (0x1 << 0x2);
} else {
return -1;
}
bcm_write32(ABUS_BUS_CTRL, val);
return 0;
}
int dma_output_config(int wid_ext, int wid)
{
uint32_t val;
val = bcm_read32(DMA_OUT_CTRL);
val &= 0x0f0f0000;
val |= (0x7 << 28) | /* dis error check */
((wid_ext & 0xF) << 20) | /* rid ext */
(0x1 << 18) | /* dis out-of-order */
(0x1 << 17) | /* data 64 byte aligned */
(0x1 << 15) | /* FIFO bus size 64bit */
(0x1 << 13) | /* brust type: Inc */
(0x8 << 8) | /* brust len */
((wid & 0xF) << 4);
bcm_write32(DMA_OUT_CTRL, val);
return 0;
}
void dma_output_start(void)
{
uint32_t val;
val = bcm_read32(DMA_OUT_INT);
bcm_write32(DMA_OUT_INT, val);
val = bcm_read32(DMA_OUT_CTRL);
val |= 0x1;
bcm_write32(DMA_OUT_CTRL, val);
return;
}
void dma_output_stop(void)
{
uint32_t val;
val = bcm_read32(DMA_OUT_CTRL);
val &= ~0x1;
bcm_write32(DMA_OUT_CTRL, val);
return;
}
int dma_output_address(uint32_t dst_addr, uint32_t dst_size, int chained)
{
if (chained) {
bcm_write32(DMA_OUT_NX_LL_ADR, dst_addr);
bcm_write32(DMA_OUT_DEST_ADR, 0x0);
bcm_write32(DMA_OUT_XFER_CNTR, 0x0);
} else {
bcm_write32(DMA_OUT_NX_LL_ADR, 0x0);
bcm_write32(DMA_OUT_DEST_ADR, dst_addr);
bcm_write32(DMA_OUT_XFER_CNTR, dst_size);
}
return 0;
}
int dma_wait_output_finish(void)
{
uint32_t val, val_ori;
int loop;
int ret = 0;
loop = 10000;
while (loop > 0) {
val_ori = bcm_read32(DMA_OUT_INT);
val = (val_ori & 0x1);
if (val !=0)
break;
loop--;
udelay(1);
}
if (loop == 0) {
ret = -1;
} else {
ret = 0;
}
dma_output_stop();
val = bcm_read32(DMA_OUT_INT);
bcm_write32(DMA_OUT_INT, val);
return ret;
}