diff --git a/arch/arm/lib/cache-cp15.c b/arch/arm/lib/cache-cp15.c index f0c1b03728..ce37d95378 100644 --- a/arch/arm/lib/cache-cp15.c +++ b/arch/arm/lib/cache-cp15.c @@ -110,7 +110,12 @@ static inline void mmu_setup(void) int i; u32 reg; +#ifndef CONFIG_SPL_BUILD + /* bootrom and ddr didn't initial dcache, + * skip this to save boot time. + */ arm_init_before_mmu(); +#endif /* Set up an identity-mapping for all 4GB, rw for everyone */ for (i = 0; i < ((4096ULL * 1024 * 1024) >> MMU_SECTION_SHIFT); i++) set_section_dcache(i, DCACHE_OFF); diff --git a/common/spl/spl_rkfw.c b/common/spl/spl_rkfw.c index a683497c72..04fc2c2605 100644 --- a/common/spl/spl_rkfw.c +++ b/common/spl/spl_rkfw.c @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index 4892f9bba2..5ecc1032c9 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -5,7 +5,7 @@ # SPDX-License-Identifier: GPL-2.0+ # -obj-$(CONFIG_$(SPL_TPL_)MISC) += misc-uclass.o +obj-$(CONFIG_$(SPL_TPL_)MISC) += misc-uclass.o misc_decompress.o misc_otp.o obj-$(CONFIG_ALI152X) += ali512x.o obj-$(CONFIG_ALTERA_SYSID) += altera_sysid.o obj-$(CONFIG_ATSHA204A) += atsha204a-i2c.o @@ -56,4 +56,3 @@ obj-$(CONFIG_ROCKCHIP_OTP) += rockchip-otp.o obj-$(CONFIG_$(SPL_TPL_)ROCKCHIP_SECURE_OTP) += rockchip-secure-otp.o obj-$(CONFIG_$(SPL_TPL_)ROCKCHIP_SECURE_OTP_V2) += rockchip-secure-otp-v2.o obj-$(CONFIG_$(SPL_TPL_)ROCKCHIP_HW_DECOMPRESS) += rockchip_decompress.o -obj-$(CONFIG_$(SPL_TPL_)MISC) += misc_decompress.o misc_otp.o diff --git a/drivers/misc/misc-uclass.c b/drivers/misc/misc-uclass.c index d9eea3dac5..2163830878 100644 --- a/drivers/misc/misc-uclass.c +++ b/drivers/misc/misc-uclass.c @@ -56,6 +56,33 @@ int misc_call(struct udevice *dev, int msgid, void *tx_msg, int tx_size, return ops->call(dev, msgid, tx_msg, tx_size, rx_msg, rx_size); } +struct udevice *misc_get_device_by_capability(u32 capability) +{ + const struct misc_ops *ops; + struct udevice *dev; + struct uclass *uc; + int ret; + u32 cap; + + ret = uclass_get(UCLASS_MISC, &uc); + if (ret) + return NULL; + + for (uclass_first_device(UCLASS_MISC, &dev); + dev; + uclass_next_device(&dev)) { + ops = device_get_ops(dev); + if (!ops || !ops->ioctl) + continue; + + ret = ops->ioctl(dev, IOCTL_REQ_CAPABILITY, &cap); + if (!ret && ((cap & capability) == capability)) + return dev; + } + + return NULL; +} + UCLASS_DRIVER(misc) = { .id = UCLASS_MISC, .name = "misc", diff --git a/drivers/misc/misc_decompress.c b/drivers/misc/misc_decompress.c index a45cb5c9ad..1fbc8d3e1f 100644 --- a/drivers/misc/misc_decompress.c +++ b/drivers/misc/misc_decompress.c @@ -6,7 +6,6 @@ #include #include #include -#include #define HEAD_CRC 2 #define EXTRA_FIELD 4 @@ -45,29 +44,7 @@ static int misc_gzip_parse_header(const unsigned char *src, unsigned long len) struct udevice *misc_decompress_get_device(u32 capability) { - const struct misc_ops *ops; - struct udevice *dev; - struct uclass *uc; - int ret; - u32 cap; - - ret = uclass_get(UCLASS_MISC, &uc); - if (ret) - return NULL; - - for (uclass_first_device(UCLASS_MISC, &dev); - dev; - uclass_next_device(&dev)) { - ops = device_get_ops(dev); - if (!ops || !ops->ioctl) - continue; - - cap = ops->ioctl(dev, IOCTL_REQ_CAPABILITY, NULL); - if ((cap & capability) == capability) - return dev; - } - - return NULL; + return misc_get_device_by_capability(capability); } int misc_decompress_start(struct udevice *dev, unsigned long src, diff --git a/drivers/misc/misc_otp.c b/drivers/misc/misc_otp.c index c880f1aa93..7b03fdb649 100644 --- a/drivers/misc/misc_otp.c +++ b/drivers/misc/misc_otp.c @@ -10,29 +10,7 @@ struct udevice *misc_otp_get_device(u32 capability) { - const struct misc_ops *ops; - struct udevice *dev; - struct uclass *uc; - int ret; - u32 cap; - - ret = uclass_get(UCLASS_MISC, &uc); - if (ret) - return NULL; - - for (uclass_first_device(UCLASS_MISC, &dev); - dev; - uclass_next_device(&dev)) { - ops = device_get_ops(dev); - if (!ops || !ops->ioctl) - continue; - - cap = ops->ioctl(dev, IOCTL_REQ_CAPABILITY, NULL); - if ((cap & capability) == capability) - return dev; - } - - return NULL; + return misc_get_device_by_capability(capability); } int misc_otp_read(struct udevice *dev, int offset, void *buf, int size) diff --git a/drivers/misc/rockchip-efuse.c b/drivers/misc/rockchip-efuse.c index a6dff3d5fd..325d48401a 100644 --- a/drivers/misc/rockchip-efuse.c +++ b/drivers/misc/rockchip-efuse.c @@ -378,8 +378,31 @@ static int rockchip_efuse_read(struct udevice *dev, int offset, return (*efuse_read)(dev, offset, buf, size); } +static int rockchip_efuse_capatiblity(struct udevice *dev, u32 *buf) +{ + *buf = device_is_compatible(dev, "rockchip,rk3288-secure-efuse") ? + OTP_S : OTP_NS; + + return 0; +} + +static int rockchip_efuse_ioctl(struct udevice *dev, unsigned long request, + void *buf) +{ + int ret = -EINVAL; + + switch (request) { + case IOCTL_REQ_CAPABILITY: + ret = rockchip_efuse_capatiblity(dev, buf); + break; + } + + return ret; +} + static const struct misc_ops rockchip_efuse_ops = { .read = rockchip_efuse_read, + .ioctl = rockchip_efuse_ioctl, }; static int rockchip_efuse_ofdata_to_platdata(struct udevice *dev) diff --git a/drivers/misc/rockchip_decompress.c b/drivers/misc/rockchip_decompress.c index 90553a4260..81be53e1a1 100644 --- a/drivers/misc/rockchip_decompress.c +++ b/drivers/misc/rockchip_decompress.c @@ -7,7 +7,6 @@ #include #include #include -#include #include DECLARE_GLOBAL_DATA_PTR; @@ -144,9 +143,11 @@ static int rockchip_decom_done_poll(struct udevice *dev) return -EINVAL; } -static int rockchip_decom_ability(void) +static int rockchip_decom_capability(u32 *buf) { - return DECOM_GZIP; + *buf = DECOM_GZIP; + + return 0; } /* Caller must fill in param @buf which represent struct decom_param */ @@ -166,7 +167,7 @@ static int rockchip_decom_ioctl(struct udevice *dev, unsigned long request, ret = rockchip_decom_stop(dev); break; case IOCTL_REQ_CAPABILITY: - ret = rockchip_decom_ability(); + ret = rockchip_decom_capability(buf); } return ret; diff --git a/include/misc.h b/include/misc.h index b817f61e24..04c960ddb3 100644 --- a/include/misc.h +++ b/include/misc.h @@ -76,6 +76,17 @@ int misc_ioctl(struct udevice *dev, unsigned long request, void *buf); int misc_call(struct udevice *dev, int msgid, void *tx_msg, int tx_size, void *rx_msg, int rx_size); +/* + * Get a misc device by capability + * + * The caller can get a misc device according to capability request, the driver + * must implement the IOCTL_REQ_CAPABILITY callback. + * + * @capability: the value of enum misc_mode. + * @return the require device if OK, NULL on error + */ +struct udevice *misc_get_device_by_capability(u32 capability); + /* * struct misc_ops - Driver model Misc operations * @@ -129,4 +140,23 @@ struct misc_ops { void *rx_msg, int rx_size); }; +/* generic layer for otp */ +struct udevice *misc_otp_get_device(u32 capability); +int misc_otp_read(struct udevice *dev, int offset, void *buf, int size); +int misc_otp_write(struct udevice *dev, int offset, const void *buf, int size); + +/* generic layer for decompress */ +struct decom_param { + unsigned long addr_src; + unsigned long addr_dst; + unsigned long size; + enum misc_mode mode; +}; + +struct udevice *misc_decompress_get_device(u32 capability); +int misc_decompress_start(struct udevice *dev, unsigned long src, + unsigned long dst, unsigned long size); +int misc_decompress_stop(struct udevice *dev); +int misc_decompress_is_complete(struct udevice *dev); + #endif /* _MISC_H_ */ diff --git a/include/misc_decompress.h b/include/misc_decompress.h deleted file mode 100644 index 121af0ae9a..0000000000 --- a/include/misc_decompress.h +++ /dev/null @@ -1,22 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0+ */ -/* - * (C) Copyright 2020 Rockchip Electronics Co., Ltd - */ - -#ifndef _MISC_DECOMPRESS_H_ -#define _MISC_DECOMPRESS_H_ - -struct decom_param { - unsigned long addr_src; - unsigned long addr_dst; - unsigned long size; - enum misc_mode mode; -}; - -struct udevice *misc_decompress_get_device(u32 capability); -int misc_decompress_start(struct udevice *dev, unsigned long src, - unsigned long dst, unsigned long size); -int misc_decompress_stop(struct udevice *dev); -int misc_decompress_is_complete(struct udevice *dev); - -#endif diff --git a/include/misc_otp.h b/include/misc_otp.h deleted file mode 100644 index 7d9b2288a6..0000000000 --- a/include/misc_otp.h +++ /dev/null @@ -1,13 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0+ */ -/* - * (C) Copyright 2020 Rockchip Electronics Co., Ltd - */ - -#ifndef __MISC_OTP_H__ -#define __MISC_OTP_H__ - -struct udevice *misc_otp_get_device(u32 capability); -int misc_otp_read(struct udevice *dev, int offset, void *buf, int size); -int misc_otp_write(struct udevice *dev, int offset, const void *buf, int size); - -#endif