[U-Boot] [PATCH resend] misc/crypto: Add support for C3
Vipin Kumar
vipin.kumar at st.com
Fri Dec 7 10:11:03 CET 2012
On 12/6/2012 5:26 PM, Stefan Roese wrote:
> On 12/06/2012 10:15 AM, Vipin Kumar wrote:
>> C3 is a cryptographic controller which is used by the SPL when DDR ECC support
>> is enabled.
>>
>> Basically, the DDR ECC feature requires the initialization of ECC values before
>> the DDR can actually be used. To accomplish this, the complete on board DDR is
>> initialized with zeroes. This initialization can be done using
>> * CPU
>> * CPU (with Dcache enabled)
>> * C3
>>
>> The current SPL code uses C3 because the initialization using the CPU is slow
>> and we do not have enough memory in SPL to initialize page tables required to
>> enable MMU and Dcache
>>
>> Signed-off-by: Vipin Kumar<vipin.kumar at st.com>
>> Reviewed-by: Shiraz Hashim<shiraz.hashim at st.com>
>> ---
>> drivers/misc/Makefile | 1 +
>> drivers/misc/c3.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++
>> include/c3.h | 63 ++++++++++++++++++++++++++
>
> I'm not so sure about the name of this "driver" and its location in
> drivers/misc. Is "C3" a generic crypto IP name? On which devices/SoC's
> is it currently implemented? Perhaps the name should be a little less
It is an ST peripheral and is used in spear SoCs and could be used in
other ST SoCs
> generic, e.g. "spear-c3" or "st-crypto-c3"...?
>
hmm, ok. I can rename it to st-crypto-c3
> And if this "driver" only supports this memory fill operation for some
> ST SoC (SPEAr?), then its perhaps better located in arch/arm/ right now.
> Not sure.
>
You mean arch/arm/cpu/armv7/spear13xx/ ?
Is the drivers/misc a special place. Why not here ?
> Still some review comments below.
>
>> 3 files changed, 186 insertions(+)
>> create mode 100644 drivers/misc/c3.c
>> create mode 100644 include/c3.h
>>
>> diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
>> index 9fac190..3ef8177 100644
>> --- a/drivers/misc/Makefile
>> +++ b/drivers/misc/Makefile
>> @@ -26,6 +26,7 @@ include $(TOPDIR)/config.mk
>> LIB := $(obj)libmisc.o
>>
>> COBJS-$(CONFIG_ALI152X) += ali512x.o
>> +COBJS-$(CONFIG_C3) += c3.o
>> COBJS-$(CONFIG_DS4510) += ds4510.o
>> COBJS-$(CONFIG_FSL_LAW) += fsl_law.o
>> COBJS-$(CONFIG_GPIO_LED) += gpio_led.o
>> diff --git a/drivers/misc/c3.c b/drivers/misc/c3.c
>> new file mode 100644
>> index 0000000..5f1eaee
>> --- /dev/null
>> +++ b/drivers/misc/c3.c
>> @@ -0,0 +1,122 @@
>> +/*
>> + * (C) Copyright 2012
>> + * ST Micoelectronics Pvt. Ltd.
>> + *
>> + * See file CREDITS for list of people who contributed to this
>> + * project.
>> + *
>> + * This program is free software; you can redistribute it and/or
>> + * modify it under the terms of the GNU General Public License as
>> + * published by the Free Software Foundation; either version 2 of
>> + * the License, or (at your option) any later version.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with this program; if not, write to the Free Software
>> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
>> + * MA 02111-1307 USA
>> + */
>> +
>> +#include<common.h>
>> +#include<c3.h>
>> +#include<errno.h>
>> +#include<asm/io.h>
>> +#include<asm/arch/hardware.h>
>> +
>> +static unsigned long c3_mem_xlate(void *addr)
>> +{
>> +
>
> Remove empty line.
>
>> + if (((ulong)addr< C3_INT_MEM_BASE_ADDR) || \
>
> The "\" is not necessary, or?
>
>> + ((ulong)addr>= (C3_INT_MEM_BASE_ADDR + C3_INT_MEM_SIZE)))
>> + return (ulong)addr;
>> +
>> + return (unsigned long)addr - C3_INT_MEM_BASE_ADDR +
>> + C3_LOCAL_MEM_ADDR;
>> +}
>> +
>> +int c3_init(void)
>> +{
>> + if (readl(C3_ID0_SCR) != C3_ID0_DEF_RDY_VAL)
>> + writel(C3_ID0_SCR_RST, C3_ID0_SCR);
>
> Please use structs to access the SoC registers, see below (.h).
>
>> +
>> + if (readl(C3_MOVE_CHANNEL_ID) == C3_MOVE_CHANNEL_ID_VAL)
>> + return -EINVAL;
>> +
>> + writel(C3_HIF_MCR_ENB_INT_MEM, C3_HIF_MCR);
>> + writel(C3_LOCAL_MEM_ADDR, C3_HIF_MBAR);
>> +
>> + return 0;
>> +}
>> +
>> +static int c3_run(void *prog_start)
>> +{
>> + writel(c3_mem_xlate(prog_start), C3_ID0_IP);
>> +
>> + while ((readl(C3_ID0_SCR)& C3_ID0_STATE_MASK) == C3_ID0_STATE_RUN)
>> + ;
>> +
>> + if ((readl(C3_ID0_SCR)& C3_ID0_STATE_MASK) != C3_ID0_STATE_IDLE) {
>> + /* If not back to idle an error occured */
>> + writel(C3_ID0_SCR_RST, C3_ID0_SCR);
>> +
>> + /* Set internal access to run c3 programs */
>> + writel(C3_HIF_MCR_ENB_INT_MEM, C3_HIF_MCR);
>> +
>> + return -EIO;
>> + }
>> +
>> + return 0;
>> +}
>> +
>> +static int c3_move(void *dest, void *src, int cnt, int optype, int opdata)
>> +{
>> + unsigned long *c3_prog;
>> + int ret = 0;
>> +
>> + /* 3.b Prepare program */
>> + c3_prog = (unsigned long *)C3_INT_MEM_BASE_ADDR;
>> +
>> + /* 3.b.i. Mov init */
>> + c3_prog[0] = C3_CMD_MOVE_INIT;
>> + c3_prog[1] = opdata;
>> +
>> + /* 3.b.ii. Mov data */
>> + c3_prog[2] = C3_CMD_MOVE_DATA + cnt + optype;
>> + c3_prog[3] = c3_mem_xlate(src);
>> + c3_prog[4] = c3_mem_xlate(dest);
>> +
>> + /* 3.b.iii. Stop */
>> + c3_prog[5] = C3_CMD_STOP;
>> +
>> + /* 4. Execute and wait */
>> + ret = c3_run(c3_prog);
>> +
>> + return ret;
>> +}
>> +
>> +void *c3_memset(void *s, int c, size_t count)
>> +{
>> +#define DATA_SIZE (1024*4)
>
> Move this define up or into the header please. And space before and
> after "*".
>
>> + u32 data = C3_INT_MEM_BASE_ADDR + 0x100;
>> + u32 size;
>> + size_t cur = 0;
>> +
>> + writel(0x100, C3_HIF_MAAR);
>> + writel(c, C3_HIF_MADR);
>> +
>> + for (size = 4; size< DATA_SIZE; size<<= 1)
>> + c3_move((void *)(data + size), (void *)data, size,
>> + C3_MOVE_AND, 0xffffffff);
>> +
>> + while (cur< count) {
>> + c3_move(s + cur, (void *)data, DATA_SIZE,
>> + C3_MOVE_AND, 0xffffffff);
>> + cur += DATA_SIZE;
>> + }
>> +
>> + return s;
>> +}
>> diff --git a/include/c3.h b/include/c3.h
>> new file mode 100644
>> index 0000000..541d702
>> --- /dev/null
>> +++ b/include/c3.h
>> @@ -0,0 +1,63 @@
>> +/*
>> + * (C) Copyright 2012
>> + * ST Micoelectronics Pvt. Ltd.
>> + *
>> + * See file CREDITS for list of people who contributed to this
>> + * project.
>> + *
>> + * This program is free software; you can redistribute it and/or
>> + * modify it under the terms of the GNU General Public License as
>> + * published by the Free Software Foundation; either version 2 of
>> + * the License, or (at your option) any later version.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with this program; if not, write to the Free Software
>> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
>> + * MA 02111-1307 USA
>> + */
>> +
>> +#ifndef _MISC_C3_
>> +#define _MISC_C3_
>> +
>> +#include<asm/arch/hardware.h>
>> +
>> +#define C3_HIF_OFF 0x400 /* master interface registers */
>> +
>> +#define C3_INT_MEM_BASE_ADDR (CONFIG_SYS_C3_BASE + 0x400)
>> +#define C3_HIF_MBAR (C3_INT_MEM_BASE_ADDR + 0x304)
>> + #define C3_LOCAL_MEM_ADDR 0xF0000000
>> +#define C3_HIF_MCR (C3_INT_MEM_BASE_ADDR + 0x308)
>> + #define C3_HIF_MCR_ENB_INT_MEM 0x01
>> +#define C3_HIF_MAAR (C3_INT_MEM_BASE_ADDR + 0x310)
>> +#define C3_HIF_MADR (C3_INT_MEM_BASE_ADDR + 0x314)
>
> These seem to be registers. Better to define a struct for them and
> access via struct.
>
All other review comments accepted. I can float a v2 once we finalize
the location where we are going to place it
Thanks
Vipin
> Thanks,
> Stefan
>
> .
>
More information about the U-Boot
mailing list