From fc117238507e565b87cd6faa25eba1379321ea5d Mon Sep 17 00:00:00 2001 From: Zhongfu Luo Date: Tue, 20 Nov 2018 10:58:48 +0800 Subject: [PATCH] efuse: tl1: add efuse burning support [1/1] PD#172587 Problem: efuse: tl1: need to add efuse burning support Solution: efuse: tl1: add efuse burning support Verify: TL1 skt board verify pass Change-Id: Id65f182c71fc6f3f2b2536bbb6b859ad2f558360 Signed-off-by: Zhongfu Luo --- arch/arm/boot/dts/amlogic/mesonsm1.dtsi | 41 +++++++++++++++++++- arch/arm/boot/dts/amlogic/tl1_pxp.dts | 8 ++++ arch/arm/boot/dts/amlogic/tl1_t962x2_skt.dts | 4 ++ drivers/amlogic/efuse/Makefile | 6 ++- drivers/amlogic/efuse/efuse.h | 14 +++---- drivers/amlogic/efuse/efuse64.c | 2 +- drivers/amlogic/efuse/efuse_hw64.c | 16 ++++---- include/linux/amlogic/efuse.h | 2 +- 8 files changed, 73 insertions(+), 20 deletions(-) diff --git a/arch/arm/boot/dts/amlogic/mesonsm1.dtsi b/arch/arm/boot/dts/amlogic/mesonsm1.dtsi index 14baca75332c..251ec2f814f2 100644 --- a/arch/arm/boot/dts/amlogic/mesonsm1.dtsi +++ b/arch/arm/boot/dts/amlogic/mesonsm1.dtsi @@ -1663,7 +1663,46 @@ cpu_ver_name { compatible = "amlogic, cpu-major-id-sm1"; }; -};/* end of / */ + + efuse: efuse{ + compatible = "amlogic, efuse"; + read_cmd = <0x82000030>; + write_cmd = <0x82000031>; + get_max_cmd = <0x82000033>; + key = <&efusekey>; + clocks = <&clkc CLKID_EFUSE>; + clock-names = "efuse_clk"; + status = "disabled"; + }; + + efusekey:efusekey{ + keynum = <4>; + key0 = <&key_0>; + key1 = <&key_1>; + key2 = <&key_2>; + key3 = <&key_3>; + key_0:key_0{ + keyname = "mac"; + offset = <0>; + size = <6>; + }; + key_1:key_1{ + keyname = "mac_bt"; + offset = <6>; + size = <6>; + }; + key_2:key_2{ + keyname = "mac_wifi"; + offset = <12>; + size = <6>; + }; + key_3:key_3{ + keyname = "usid"; + offset = <18>; + size = <16>; + }; + }; +}; /* end of / */ &pinctrl_aobus { sd_to_ao_uart_clr_pins:sd_to_ao_uart_clr_pins { diff --git a/arch/arm/boot/dts/amlogic/tl1_pxp.dts b/arch/arm/boot/dts/amlogic/tl1_pxp.dts index 109f36a8b80b..45f03ce44fe6 100644 --- a/arch/arm/boot/dts/amlogic/tl1_pxp.dts +++ b/arch/arm/boot/dts/amlogic/tl1_pxp.dts @@ -887,3 +887,11 @@ mem_alloc = <1>; pxp_mode = <1>; /** 0:normal mode 1:pxp mode */ }; + +&pwm_AO_cd { + status = "okay"; +}; + +&efuse { + status = "okay"; +}; diff --git a/arch/arm/boot/dts/amlogic/tl1_t962x2_skt.dts b/arch/arm/boot/dts/amlogic/tl1_t962x2_skt.dts index b73540e3b408..df062a3f0039 100644 --- a/arch/arm/boot/dts/amlogic/tl1_t962x2_skt.dts +++ b/arch/arm/boot/dts/amlogic/tl1_t962x2_skt.dts @@ -1514,3 +1514,7 @@ &efuse { status = "okay"; }; + +&efuse { + status = "okay"; +}; diff --git a/drivers/amlogic/efuse/Makefile b/drivers/amlogic/efuse/Makefile index 05b5b7baa755..dc54b67dae61 100644 --- a/drivers/amlogic/efuse/Makefile +++ b/drivers/amlogic/efuse/Makefile @@ -3,7 +3,11 @@ # ifneq ($(CONFIG_ARM64),y) -obj-$(CONFIG_AMLOGIC_EFUSE) += efuse_version.o efuse_hw.o efuse.o + ifneq ($(CONFIG_ARM64_A32),y) + obj-$(CONFIG_AMLOGIC_EFUSE) += efuse_version.o efuse_hw.o efuse.o + else + obj-$(CONFIG_AMLOGIC_EFUSE) += efuse_hw64.o efuse64.o + endif else obj-$(CONFIG_AMLOGIC_EFUSE) += efuse_hw64.o efuse64.o endif \ No newline at end of file diff --git a/drivers/amlogic/efuse/efuse.h b/drivers/amlogic/efuse/efuse.h index 596a592b0e9a..62c2d475bea1 100644 --- a/drivers/amlogic/efuse/efuse.h +++ b/drivers/amlogic/efuse/efuse.h @@ -103,20 +103,18 @@ struct efuse_hal_api_arg { }; extern struct efuseinfo_t efuseinfo[]; -#ifndef CONFIG_ARM64 +#if defined(CONFIG_ARM64) || defined(CONFIG_ARM64_A32) +ssize_t efuse_get_max(void); +ssize_t efuse_read_usr(char *buf, size_t count, loff_t *ppos); +ssize_t efuse_write_usr(char *buf, size_t count, loff_t *ppos); +unsigned long efuse_amlogic_set(char *buf, size_t count); +#else int efuse_getinfo_byTitle(unsigned char *name, struct efuseinfo_item_t *info); int check_if_efused(loff_t pos, size_t count); int efuse_read_item(char *buf, size_t count, loff_t *ppos); int efuse_write_item(char *buf, size_t count, loff_t *ppos); extern int efuse_active_version; extern struct clk *efuse_clk; -#else - -ssize_t efuse_get_max(void); -ssize_t efuse_read_usr(char *buf, size_t count, loff_t *ppos); -ssize_t efuse_write_usr(char *buf, size_t count, loff_t *ppos); -unsigned long efuse_amlogic_set(char *buf, size_t count); - #endif #endif diff --git a/drivers/amlogic/efuse/efuse64.c b/drivers/amlogic/efuse/efuse64.c index 1e6208bc4507..ec6837d95e1c 100644 --- a/drivers/amlogic/efuse/efuse64.c +++ b/drivers/amlogic/efuse/efuse64.c @@ -30,7 +30,7 @@ #include #include "efuse.h" -#ifdef CONFIG_ARM64 +#if defined(CONFIG_ARM64) || defined(CONFIG_ARM64_A32) #include #endif diff --git a/drivers/amlogic/efuse/efuse_hw64.c b/drivers/amlogic/efuse/efuse_hw64.c index 6da11f489755..c5953c9bc543 100644 --- a/drivers/amlogic/efuse/efuse_hw64.c +++ b/drivers/amlogic/efuse/efuse_hw64.c @@ -33,7 +33,7 @@ #include #include -static long meson_efuse_fn_smc(struct efuse_hal_api_arg *arg) +static long meson64_efuse_fn_smc(struct efuse_hal_api_arg *arg) { long ret; unsigned int cmd, offset, size; @@ -71,7 +71,7 @@ static long meson_efuse_fn_smc(struct efuse_hal_api_arg *arg) return 0; } -int meson_trustzone_efuse(struct efuse_hal_api_arg *arg) +int meson64_trustzone_efuse(struct efuse_hal_api_arg *arg) { int ret; @@ -79,7 +79,7 @@ int meson_trustzone_efuse(struct efuse_hal_api_arg *arg) return -1; set_cpus_allowed_ptr(current, cpumask_of(0)); - ret = meson_efuse_fn_smc(arg); + ret = meson64_efuse_fn_smc(arg); set_cpus_allowed_ptr(current, cpu_all_mask); return ret; } @@ -101,7 +101,7 @@ unsigned long efuse_aml_sec_boot_check(unsigned long nType, memcpy((void *)sharemem_input_base, (const void *)pBuffer, nLength); - __flush_dcache_area(sharemem_input_base, nLength); + //__flush_dcache_area(sharemem_input_base, nLength); asm __volatile__("" : : : "memory"); @@ -133,7 +133,7 @@ unsigned long efuse_amlogic_set(char *buf, size_t count) return ret; } -ssize_t meson_trustzone_efuse_get_max(struct efuse_hal_api_arg *arg) +ssize_t meson64_trustzone_efuse_get_max(struct efuse_hal_api_arg *arg) { ssize_t ret; unsigned int cmd; @@ -164,7 +164,7 @@ ssize_t efuse_get_max(void) arg.cmd = EFUSE_HAL_API_USER_MAX; set_cpus_allowed_ptr(current, cpumask_of(0)); - ret = meson_trustzone_efuse_get_max(&arg); + ret = meson64_trustzone_efuse_get_max(&arg); set_cpus_allowed_ptr(current, cpu_all_mask); if (ret == 0) { @@ -187,7 +187,7 @@ ssize_t _efuse_read(char *buf, size_t count, loff_t *ppos) arg.size = count; arg.buffer = (unsigned long)buf; arg.retcnt = (unsigned long)&retcnt; - ret = meson_trustzone_efuse(&arg); + ret = meson64_trustzone_efuse(&arg); if (ret == 0) { *ppos += retcnt; return retcnt; @@ -211,7 +211,7 @@ ssize_t _efuse_write(const char *buf, size_t count, loff_t *ppos) arg.buffer = (unsigned long)buf; arg.retcnt = (unsigned long)&retcnt; - ret = meson_trustzone_efuse(&arg); + ret = meson64_trustzone_efuse(&arg); if (ret == 0) { *ppos = retcnt; return retcnt; diff --git a/include/linux/amlogic/efuse.h b/include/linux/amlogic/efuse.h index 5fa2252e0b7d..9d4e4ef554c1 100644 --- a/include/linux/amlogic/efuse.h +++ b/include/linux/amlogic/efuse.h @@ -18,7 +18,7 @@ #ifndef __EFUSE_AMLOGIC_H #define __EFUSE_AMLOGIC_H -#ifdef CONFIG_ARM64 +#if defined(CONFIG_ARM64) || defined(CONFIG_ARM64_A32) struct efusekey_info { char keyname[32]; unsigned int offset;