diff --git a/arch/riscv/configs/defconfig b/arch/riscv/configs/defconfig
index d222d353d86d..2c445d64b150 100644
--- a/arch/riscv/configs/defconfig
+++ b/arch/riscv/configs/defconfig
@@ -1,133 +1,3002 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Linux/riscv 5.9.14 Kernel Configuration
+#
+CONFIG_CC_VERSION_TEXT="riscv64-buildroot-linux-gnu-gcc.br_real (Buildroot -g1278ddf) 10.2.0"
+CONFIG_CC_IS_GCC=y
+CONFIG_GCC_VERSION=100200
+CONFIG_LD_VERSION=234000000
+CONFIG_CLANG_VERSION=0
+CONFIG_CC_CAN_LINK=y
+CONFIG_CC_CAN_LINK_STATIC=y
+CONFIG_CC_HAS_ASM_GOTO=y
+CONFIG_CC_HAS_ASM_INLINE=y
+CONFIG_IRQ_WORK=y
+CONFIG_THREAD_INFO_IN_TASK=y
+
+#
+# General setup
+#
+CONFIG_INIT_ENV_ARG_LIMIT=32
+# CONFIG_COMPILE_TEST is not set
+CONFIG_LOCALVERSION="-sifive-1"
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_BUILD_SALT=""
+CONFIG_DEFAULT_INIT=""
+CONFIG_DEFAULT_HOSTNAME="riscv"
+CONFIG_SWAP=y
CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
CONFIG_POSIX_MQUEUE=y
-CONFIG_NO_HZ_IDLE=y
-CONFIG_HIGH_RES_TIMERS=y
+CONFIG_POSIX_MQUEUE_SYSCTL=y
+# CONFIG_WATCH_QUEUE is not set
+CONFIG_CROSS_MEMORY_ATTACH=y
+# CONFIG_USELIB is not set
+# CONFIG_AUDIT is not set
+CONFIG_HAVE_ARCH_AUDITSYSCALL=y
+
+#
+# IRQ subsystem
+#
+CONFIG_GENERIC_IRQ_SHOW=y
+CONFIG_IRQ_DOMAIN=y
+CONFIG_IRQ_DOMAIN_HIERARCHY=y
+CONFIG_GENERIC_MSI_IRQ=y
+CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
+CONFIG_HANDLE_DOMAIN_IRQ=y
+CONFIG_SPARSE_IRQ=y
+# CONFIG_GENERIC_IRQ_DEBUGFS is not set
+# end of IRQ subsystem
+
+CONFIG_GENERIC_IRQ_MULTI_HANDLER=y
+CONFIG_ARCH_CLOCKSOURCE_INIT=y
+CONFIG_GENERIC_TIME_VSYSCALL=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+
+#
+# Timers subsystem
+#
+CONFIG_HZ_PERIODIC=y
+# CONFIG_NO_HZ_IDLE is not set
+# CONFIG_NO_HZ_FULL is not set
+# CONFIG_NO_HZ is not set
+# CONFIG_HIGH_RES_TIMERS is not set
+# end of Timers subsystem
+
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+CONFIG_PREEMPT_COUNT=y
+
+#
+# CPU/Task time and stats accounting
+#
+CONFIG_TICK_CPU_ACCOUNTING=y
+# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_PSI is not set
+# end of CPU/Task time and stats accounting
+
+CONFIG_CPU_ISOLATION=y
+
+#
+# RCU Subsystem
+#
+CONFIG_TREE_RCU=y
+# CONFIG_RCU_EXPERT is not set
+CONFIG_SRCU=y
+CONFIG_TREE_SRCU=y
+CONFIG_RCU_STALL_COMMON=y
+CONFIG_RCU_NEED_SEGCBLIST=y
+# end of RCU Subsystem
+
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
+# CONFIG_IKHEADERS is not set
+CONFIG_LOG_BUF_SHIFT=17
+CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
+CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13
+CONFIG_GENERIC_SCHED_CLOCK=y
+
+#
+# Scheduler features
+#
+# end of Scheduler features
+
+CONFIG_CC_HAS_INT128=y
+CONFIG_ARCH_SUPPORTS_INT128=y
CONFIG_CGROUPS=y
+# CONFIG_MEMCG is not set
+# CONFIG_BLK_CGROUP is not set
CONFIG_CGROUP_SCHED=y
+CONFIG_FAIR_GROUP_SCHED=y
CONFIG_CFS_BANDWIDTH=y
+# CONFIG_RT_GROUP_SCHED is not set
+# CONFIG_CGROUP_PIDS is not set
+# CONFIG_CGROUP_RDMA is not set
+# CONFIG_CGROUP_FREEZER is not set
+# CONFIG_CGROUP_HUGETLB is not set
+# CONFIG_CPUSETS is not set
+# CONFIG_CGROUP_DEVICE is not set
+# CONFIG_CGROUP_CPUACCT is not set
CONFIG_CGROUP_BPF=y
+# CONFIG_CGROUP_DEBUG is not set
+CONFIG_SOCK_CGROUP_DATA=y
CONFIG_NAMESPACES=y
+CONFIG_UTS_NS=y
+CONFIG_IPC_NS=y
CONFIG_USER_NS=y
+CONFIG_PID_NS=y
+CONFIG_NET_NS=y
CONFIG_CHECKPOINT_RESTORE=y
+# CONFIG_SCHED_AUTOGROUP is not set
+# CONFIG_SYSFS_DEPRECATED is not set
+# CONFIG_RELAY is not set
CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE="/work/freedom-u-sdk_up/work/buildroot_initramfs_sysroot"
+# CONFIG_INITRAMFS_FORCE is not set
+CONFIG_INITRAMFS_ROOT_UID=0
+CONFIG_INITRAMFS_ROOT_GID=0
+CONFIG_RD_GZIP=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_XZ=y
+CONFIG_RD_LZO=y
+CONFIG_RD_LZ4=y
+CONFIG_RD_ZSTD=y
+CONFIG_INITRAMFS_COMPRESSION_GZIP=y
+# CONFIG_INITRAMFS_COMPRESSION_BZIP2 is not set
+# CONFIG_INITRAMFS_COMPRESSION_LZMA is not set
+# CONFIG_INITRAMFS_COMPRESSION_XZ is not set
+# CONFIG_INITRAMFS_COMPRESSION_LZO is not set
+# CONFIG_INITRAMFS_COMPRESSION_LZ4 is not set
+# CONFIG_INITRAMFS_COMPRESSION_ZSTD is not set
+# CONFIG_INITRAMFS_COMPRESSION_NONE is not set
+# CONFIG_BOOT_CONFIG is not set
+CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_SYSCTL_EXCEPTION_TRACE=y
+CONFIG_BPF=y
CONFIG_EXPERT=y
+CONFIG_MULTIUSER=y
+# CONFIG_SGETMASK_SYSCALL is not set
+CONFIG_SYSFS_SYSCALL=y
+CONFIG_FHANDLE=y
+CONFIG_POSIX_TIMERS=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_FUTEX_PI=y
+CONFIG_HAVE_FUTEX_CMPXCHG=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+CONFIG_IO_URING=y
+CONFIG_ADVISE_SYSCALLS=y
+CONFIG_MEMBARRIER=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+CONFIG_KALLSYMS_BASE_RELATIVE=y
CONFIG_BPF_SYSCALL=y
+# CONFIG_USERFAULTFD is not set
+CONFIG_EMBEDDED=y
+CONFIG_HAVE_PERF_EVENTS=y
+# CONFIG_PC104 is not set
+
+#
+# Kernel Performance Events And Counters
+#
+# CONFIG_PERF_EVENTS is not set
+# end of Kernel Performance Events And Counters
+
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLUB_DEBUG=y
+CONFIG_COMPAT_BRK=y
+# CONFIG_SLAB is not set
+CONFIG_SLUB=y
+# CONFIG_SLOB is not set
+CONFIG_SLAB_MERGE_DEFAULT=y
+# CONFIG_SLAB_FREELIST_RANDOM is not set
+# CONFIG_SLAB_FREELIST_HARDENED is not set
+# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set
+CONFIG_SLUB_CPU_PARTIAL=y
+# CONFIG_PROFILING is not set
+# end of General setup
+
+CONFIG_64BIT=y
+CONFIG_RISCV=y
+CONFIG_ARCH_MMAP_RND_BITS_MIN=18
+CONFIG_ARCH_MMAP_RND_BITS_MAX=24
+CONFIG_RISCV_SBI=y
+CONFIG_MMU=y
+CONFIG_ZONE_DMA32=y
+CONFIG_VA_BITS=39
+CONFIG_PA_BITS=56
+CONFIG_PAGE_OFFSET=0xffffffe000000000
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
+CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
+CONFIG_SYS_SUPPORTS_HUGETLBFS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_CSUM=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_FIX_EARLYCON_MEM=y
+CONFIG_PGTABLE_LEVELS=3
+CONFIG_LOCKDEP_SUPPORT=y
+
+#
+# SoC selection
+#
CONFIG_SOC_SIFIVE=y
-CONFIG_SOC_VIRT=y
+CONFIG_SOC_STARFIVE_VIC7100=y
+
+#
+# StarFive VIC7100 SoC Debug Option
+#
+# CONFIG_FPGA_GMAC_SPEED10 is not set
+# CONFIG_FPGA_GMAC_SPEED100 is not set
+CONFIG_FPGA_GMAC_SPEED_AUTO=y
+CONFIG_FPGA_GMAC_FLUSH_DDR=y
+# end of StarFive VIC7100 SoC Debug Option
+
+# CONFIG_SOC_VIRT is not set
+# end of SoC selection
+
+#
+# Platform type
+#
+# CONFIG_ARCH_RV32I is not set
+CONFIG_ARCH_RV64I=y
+# CONFIG_CMODEL_MEDLOW is not set
+CONFIG_CMODEL_MEDANY=y
+CONFIG_MODULE_SECTIONS=y
+# CONFIG_MAXPHYSMEM_2GB is not set
+CONFIG_MAXPHYSMEM_128GB=y
CONFIG_SMP=y
-CONFIG_JUMP_LABEL=y
+CONFIG_NR_CPUS=8
+# CONFIG_HOTPLUG_CPU is not set
+CONFIG_TUNE_GENERIC=y
+CONFIG_RISCV_ISA_C=y
+CONFIG_FPU=y
+# end of Platform type
+
+#
+# Kernel features
+#
+CONFIG_HZ_100=y
+# CONFIG_HZ_250 is not set
+# CONFIG_HZ_300 is not set
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=100
+# CONFIG_SECCOMP is not set
+CONFIG_RISCV_SBI_V01=y
+# end of Kernel features
+
+#
+# Boot options
+#
+CONFIG_CMDLINE="earlyprintk console=ttyS0,115200 debug rootwait stmmaceth=chain_mode:1"
+# CONFIG_CMDLINE_FALLBACK is not set
+# CONFIG_CMDLINE_EXTEND is not set
+CONFIG_CMDLINE_FORCE=y
+# end of Boot options
+
+#
+# Power management options
+#
+# CONFIG_PM is not set
+# end of Power management options
+
+#
+# General architecture-dependent options
+#
+# CONFIG_JUMP_LABEL is not set
+CONFIG_HAVE_ARCH_TRACEHOOK=y
+CONFIG_HAVE_DMA_CONTIGUOUS=y
+CONFIG_GENERIC_SMP_IDLE_THREAD=y
+CONFIG_ARCH_HAS_SET_MEMORY=y
+CONFIG_ARCH_HAS_SET_DIRECT_MAP=y
+CONFIG_HAVE_ASM_MODVERSIONS=y
+CONFIG_HAVE_PERF_REGS=y
+CONFIG_HAVE_PERF_USER_STACK_DUMP=y
+CONFIG_HAVE_ARCH_JUMP_LABEL=y
+CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y
+CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
+CONFIG_HAVE_STACKPROTECTOR=y
+CONFIG_STACKPROTECTOR=y
+CONFIG_STACKPROTECTOR_STRONG=y
+CONFIG_HAVE_CONTEXT_TRACKING=y
+CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
+CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
+CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
+CONFIG_MODULES_USE_ELF_RELA=y
+CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
+CONFIG_HAVE_ARCH_MMAP_RND_BITS=y
+CONFIG_ARCH_MMAP_RND_BITS=18
+CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y
+CONFIG_CLONE_BACKWARDS=y
+# CONFIG_COMPAT_32BIT_TIME is not set
+CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y
+CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y
+CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
+CONFIG_STRICT_KERNEL_RWX=y
+# CONFIG_LOCK_EVENT_COUNTS is not set
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_GCOV_KERNEL is not set
+CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
+# end of GCOV-based kernel profiling
+
+CONFIG_HAVE_GCC_PLUGINS=y
+CONFIG_GCC_PLUGINS=y
+# CONFIG_GCC_PLUGIN_CYC_COMPLEXITY is not set
+# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set
+# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set
+# end of General architecture-dependent options
+
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+# CONFIG_MODULE_SIG is not set
+# CONFIG_MODULE_COMPRESS is not set
+# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_TRIM_UNUSED_KSYMS is not set
+CONFIG_BLOCK=y
+CONFIG_BLK_SCSI_REQUEST=y
+CONFIG_BLK_DEV_BSG=y
+# CONFIG_BLK_DEV_BSGLIB is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
+CONFIG_BLK_DEV_ZONED=y
+# CONFIG_BLK_CMDLINE_PARSER is not set
+# CONFIG_BLK_WBT is not set
+CONFIG_BLK_DEBUG_FS=y
+CONFIG_BLK_DEBUG_FS_ZONED=y
+# CONFIG_BLK_SED_OPAL is not set
+# CONFIG_BLK_INLINE_ENCRYPTION is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_AIX_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_KARMA_PARTITION is not set
+CONFIG_EFI_PARTITION=y
+# CONFIG_SYSV68_PARTITION is not set
+# CONFIG_CMDLINE_PARTITION is not set
+# end of Partition Types
+
+CONFIG_BLK_MQ_PCI=y
+CONFIG_BLK_MQ_VIRTIO=y
+
+#
+# IO Schedulers
+#
+CONFIG_MQ_IOSCHED_DEADLINE=y
+CONFIG_MQ_IOSCHED_KYBER=y
+# CONFIG_IOSCHED_BFQ is not set
+# end of IO Schedulers
+
+CONFIG_ASN1=m
+CONFIG_UNINLINE_SPIN_UNLOCK=y
+CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
+CONFIG_MUTEX_SPIN_ON_OWNER=y
+CONFIG_RWSEM_SPIN_ON_OWNER=y
+CONFIG_LOCK_SPIN_ON_OWNER=y
+CONFIG_ARCH_HAS_MMIOWB=y
+CONFIG_MMIOWB=y
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_ELFCORE=y
+CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
+CONFIG_BINFMT_SCRIPT=y
+CONFIG_ARCH_HAS_BINFMT_FLAT=y
+# CONFIG_BINFMT_FLAT is not set
+# CONFIG_BINFMT_MISC is not set
+CONFIG_COREDUMP=y
+# end of Executable file formats
+
+#
+# Memory Management options
+#
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
+CONFIG_MEMORY_ISOLATION=y
+CONFIG_SPLIT_PTLOCK_CPUS=4
+CONFIG_COMPACTION=y
+# CONFIG_PAGE_REPORTING is not set
+CONFIG_MIGRATION=y
+CONFIG_CONTIG_ALLOC=y
+CONFIG_PHYS_ADDR_T_64BIT=y
+# CONFIG_KSM is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+# CONFIG_CLEANCACHE is not set
+# CONFIG_FRONTSWAP is not set
+CONFIG_CMA=y
+# CONFIG_CMA_DEBUG is not set
+CONFIG_CMA_DEBUGFS=y
+CONFIG_CMA_AREAS=7
+# CONFIG_ZPOOL is not set
+# CONFIG_ZBUD is not set
+# CONFIG_ZSMALLOC is not set
+# CONFIG_IDLE_PAGE_TRACKING is not set
+# CONFIG_PERCPU_STATS is not set
+# CONFIG_GUP_BENCHMARK is not set
+CONFIG_ARCH_HAS_PTE_SPECIAL=y
+# end of Memory Management options
+
CONFIG_NET=y
+
+#
+# Networking options
+#
CONFIG_PACKET=y
+# CONFIG_PACKET_DIAG is not set
CONFIG_UNIX=y
+CONFIG_UNIX_SCM=y
+# CONFIG_UNIX_DIAG is not set
+# CONFIG_TLS is not set
+# CONFIG_XFRM_USER is not set
+# CONFIG_NET_KEY is not set
+# CONFIG_XDP_SOCKETS is not set
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_ADVANCED_ROUTER=y
+# CONFIG_IP_FIB_TRIE_STATS is not set
+# CONFIG_IP_MULTIPLE_TABLES is not set
+# CONFIG_IP_ROUTE_MULTIPATH is not set
+# CONFIG_IP_ROUTE_VERBOSE is not set
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
CONFIG_IP_PNP_RARP=y
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE_DEMUX is not set
+CONFIG_NET_IP_TUNNEL=y
+# CONFIG_IP_MROUTE is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_NET_IPVTI is not set
+# CONFIG_NET_FOU is not set
+# CONFIG_NET_FOU_IP_TUNNELS is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+CONFIG_INET_TUNNEL=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_INET_UDP_DIAG is not set
+# CONFIG_INET_RAW_DIAG is not set
+# CONFIG_INET_DIAG_DESTROY is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+CONFIG_IPV6=y
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_IPV6_VTI is not set
+CONFIG_IPV6_SIT=y
+# CONFIG_IPV6_SIT_6RD is not set
+CONFIG_IPV6_NDISC_NODETYPE=y
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_IPV6_MROUTE is not set
+# CONFIG_IPV6_SEG6_LWTUNNEL is not set
+# CONFIG_IPV6_SEG6_HMAC is not set
+# CONFIG_IPV6_RPL_LWTUNNEL is not set
+# CONFIG_MPTCP is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_BPFILTER is not set
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_RDS is not set
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_L2TP is not set
+# CONFIG_BRIDGE is not set
+CONFIG_HAVE_NET_DSA=y
+# CONFIG_NET_DSA is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_PHONET is not set
+# CONFIG_6LOWPAN is not set
+# CONFIG_IEEE802154 is not set
+# CONFIG_NET_SCHED is not set
+# CONFIG_DCB is not set
+CONFIG_DNS_RESOLVER=y
+# CONFIG_BATMAN_ADV is not set
+# CONFIG_OPENVSWITCH is not set
+# CONFIG_VSOCKETS is not set
CONFIG_NETLINK_DIAG=y
-CONFIG_NET_9P=y
-CONFIG_NET_9P_VIRTIO=y
+# CONFIG_MPLS is not set
+# CONFIG_NET_NSH is not set
+# CONFIG_HSR is not set
+# CONFIG_NET_SWITCHDEV is not set
+# CONFIG_NET_L3_MASTER_DEV is not set
+# CONFIG_QRTR is not set
+# CONFIG_NET_NCSI is not set
+CONFIG_RPS=y
+CONFIG_RFS_ACCEL=y
+CONFIG_XPS=y
+# CONFIG_CGROUP_NET_PRIO is not set
+# CONFIG_CGROUP_NET_CLASSID is not set
+CONFIG_NET_RX_BUSY_POLL=y
+CONFIG_BQL=y
+# CONFIG_BPF_JIT is not set
+# CONFIG_BPF_STREAM_PARSER is not set
+CONFIG_NET_FLOW_LIMIT=y
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# end of Network testing
+# end of Networking options
+
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+# CONFIG_AF_KCM is not set
+CONFIG_WIRELESS=y
+# CONFIG_CFG80211 is not set
+
+#
+# CFG80211 needs to be enabled for MAC80211
+#
+CONFIG_MAC80211_STA_HASH_MAX_SIZE=0
+# CONFIG_WIMAX is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+# CONFIG_CAIF is not set
+# CONFIG_CEPH_LIB is not set
+# CONFIG_NFC is not set
+# CONFIG_PSAMPLE is not set
+# CONFIG_NET_IFE is not set
+# CONFIG_LWTUNNEL is not set
+CONFIG_DST_CACHE=y
+CONFIG_GRO_CELLS=y
+CONFIG_PAGE_POOL=y
+CONFIG_FAILOVER=y
+CONFIG_ETHTOOL_NETLINK=y
+CONFIG_HAVE_EBPF_JIT=y
+
+#
+# Device Drivers
+#
+CONFIG_HAVE_PCI=y
CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_PCI_DOMAINS_GENERIC=y
CONFIG_PCIEPORTBUS=y
-CONFIG_PCI_HOST_GENERIC=y
+CONFIG_HOTPLUG_PCI_PCIE=y
+# CONFIG_PCIEAER is not set
+CONFIG_PCIEASPM=y
+CONFIG_PCIEASPM_DEFAULT=y
+# CONFIG_PCIEASPM_POWERSAVE is not set
+# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set
+# CONFIG_PCIEASPM_PERFORMANCE is not set
+CONFIG_PCIE_PTM=y
+# CONFIG_PCIE_BW is not set
+CONFIG_PCI_MSI=y
+CONFIG_PCI_MSI_IRQ_DOMAIN=y
+CONFIG_PCI_QUIRKS=y
+CONFIG_PCI_DEBUG=y
+CONFIG_PCI_REALLOC_ENABLE_AUTO=y
+# CONFIG_PCI_STUB is not set
+# CONFIG_PCI_PF_STUB is not set
+CONFIG_PCI_ATS=y
+CONFIG_PCI_IOV=y
+CONFIG_PCI_PRI=y
+CONFIG_PCI_PASID=y
+CONFIG_HOTPLUG_PCI=y
+CONFIG_HOTPLUG_PCI_CPCI=y
+CONFIG_HOTPLUG_PCI_SHPC=y
+
+#
+# PCI controller drivers
+#
+# CONFIG_PCI_FTPCI100 is not set
+# CONFIG_PCI_HOST_GENERIC is not set
CONFIG_PCIE_XILINX=y
+
+#
+# DesignWare PCI Core Support
+#
+# CONFIG_PCIE_DW_PLAT_HOST is not set
+# CONFIG_PCI_MESON is not set
+# end of DesignWare PCI Core Support
+
+#
+# Mobiveil PCIe Core Support
+#
+# end of Mobiveil PCIe Core Support
+
+#
+# Cadence PCIe controllers support
+#
+# CONFIG_PCIE_CADENCE_PLAT_HOST is not set
+# CONFIG_PCI_J721E_HOST is not set
+# end of Cadence PCIe controllers support
+# end of PCI controller drivers
+
+#
+# PCI Endpoint
+#
+# CONFIG_PCI_ENDPOINT is not set
+# end of PCI Endpoint
+
+#
+# PCI switch controller drivers
+#
+# CONFIG_PCI_SW_SWITCHTEC is not set
+# end of PCI switch controller drivers
+
+# CONFIG_PCCARD is not set
+# CONFIG_RAPIDIO is not set
+
+#
+# Generic Driver Options
+#
+# CONFIG_UEVENT_HELPER is not set
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+
+#
+# Firmware loader
+#
+CONFIG_FW_LOADER=y
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_FW_LOADER_USER_HELPER is not set
+# CONFIG_FW_LOADER_COMPRESS is not set
+# end of Firmware loader
+
+CONFIG_ALLOW_DEV_COREDUMP=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set
+# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set
+CONFIG_REGMAP=y
+CONFIG_REGMAP_I2C=y
+CONFIG_REGMAP_MMIO=y
+CONFIG_DMA_SHARED_BUFFER=y
+# CONFIG_DMA_FENCE_TRACE is not set
+CONFIG_GENERIC_ARCH_TOPOLOGY=y
+# end of Generic Driver Options
+
+#
+# Bus devices
+#
+# CONFIG_MOXTET is not set
+# CONFIG_MHI_BUS is not set
+# end of Bus devices
+
+# CONFIG_CONNECTOR is not set
+# CONFIG_GNSS is not set
+CONFIG_MTD=y
+# CONFIG_MTD_TESTS is not set
+
+#
+# Partition parsers
+#
+# CONFIG_MTD_AR7_PARTS is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+CONFIG_MTD_OF_PARTS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# end of Partition parsers
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_BLKDEVS=y
+# CONFIG_MTD_BLOCK is not set
+CONFIG_MTD_BLOCK_RO=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+# CONFIG_SM_FTL is not set
+# CONFIG_MTD_OOPS is not set
+# CONFIG_MTD_SWAP is not set
+# CONFIG_MTD_PARTITIONED_MASTER is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+# CONFIG_MTD_CFI is not set
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# end of RAM/ROM/Flash chip drivers
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_INTEL_VR_NOR is not set
+# CONFIG_MTD_PLATRAM is not set
+# end of Mapping drivers for chip access
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_DATAFLASH is not set
+# CONFIG_MTD_MCHP23K256 is not set
+# CONFIG_MTD_SST25L is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOCG3 is not set
+# end of Self-contained MTD device drivers
+
+#
+# NAND
+#
+# CONFIG_MTD_ONENAND is not set
+# CONFIG_MTD_RAW_NAND is not set
+# CONFIG_MTD_SPI_NAND is not set
+# end of NAND
+
+#
+# LPDDR & LPDDR2 PCM memory drivers
+#
+# CONFIG_MTD_LPDDR is not set
+# end of LPDDR & LPDDR2 PCM memory drivers
+
+CONFIG_MTD_SPI_NOR=y
+CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
+# CONFIG_MTD_UBI is not set
+# CONFIG_MTD_HYPERBUS is not set
+CONFIG_DTC=y
+CONFIG_OF=y
+# CONFIG_OF_UNITTEST is not set
+CONFIG_OF_FLATTREE=y
+CONFIG_OF_EARLY_FLATTREE=y
+CONFIG_OF_KOBJ=y
+CONFIG_OF_ADDRESS=y
+CONFIG_OF_IRQ=y
+CONFIG_OF_NET=y
+CONFIG_OF_MDIO=y
+CONFIG_OF_RESERVED_MEM=y
+# CONFIG_OF_OVERLAY is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_NULL_BLK is not set
+CONFIG_CDROM=y
+# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
+# CONFIG_BLK_DEV_UMEM is not set
CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_DRBD is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_SKD is not set
+# CONFIG_BLK_DEV_SX8 is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
CONFIG_VIRTIO_BLK=y
+# CONFIG_BLK_DEV_RBD is not set
+# CONFIG_BLK_DEV_RSXX is not set
+
+#
+# NVME Support
+#
+CONFIG_NVME_CORE=y
+CONFIG_BLK_DEV_NVME=y
+# CONFIG_NVME_MULTIPATH is not set
+CONFIG_NVME_FABRICS=y
+CONFIG_NVME_FC=y
+# CONFIG_NVME_TCP is not set
+# end of NVME Support
+
+#
+# Misc devices
+#
+# CONFIG_AD525X_DPOT is not set
+# CONFIG_DUMMY_IRQ is not set
+# CONFIG_PHANTOM is not set
+# CONFIG_TIFM_CORE is not set
+# CONFIG_ICS932S401 is not set
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_HP_ILO is not set
+# CONFIG_APDS9802ALS is not set
+# CONFIG_ISL29003 is not set
+# CONFIG_ISL29020 is not set
+# CONFIG_SENSORS_TSL2550 is not set
+# CONFIG_SENSORS_BH1770 is not set
+# CONFIG_SENSORS_APDS990X is not set
+# CONFIG_HMC6352 is not set
+# CONFIG_DS1682 is not set
+# CONFIG_LATTICE_ECP3_CONFIG is not set
+# CONFIG_SRAM is not set
+# CONFIG_PCI_ENDPOINT_TEST is not set
+# CONFIG_XILINX_SDFEC is not set
+# CONFIG_PVPANIC is not set
+# CONFIG_C2PORT is not set
+
+#
+# EEPROM support
+#
+CONFIG_EEPROM_AT24=y
+# CONFIG_EEPROM_AT25 is not set
+# CONFIG_EEPROM_LEGACY is not set
+# CONFIG_EEPROM_MAX6875 is not set
+# CONFIG_EEPROM_93CX6 is not set
+# CONFIG_EEPROM_93XX46 is not set
+# CONFIG_EEPROM_IDT_89HPESX is not set
+# CONFIG_EEPROM_EE1004 is not set
+# end of EEPROM support
+
+# CONFIG_CB710_CORE is not set
+
+#
+# Texas Instruments shared transport line discipline
+#
+# CONFIG_TI_ST is not set
+# end of Texas Instruments shared transport line discipline
+
+# CONFIG_SENSORS_LIS3_SPI is not set
+# CONFIG_SENSORS_LIS3_I2C is not set
+# CONFIG_ALTERA_STAPL is not set
+
+#
+# Intel MIC & related support
+#
+# CONFIG_VOP_BUS is not set
+# end of Intel MIC & related support
+
+# CONFIG_GENWQE is not set
+# CONFIG_ECHO is not set
+# CONFIG_MISC_ALCOR_PCI is not set
+# CONFIG_MISC_RTSX_PCI is not set
+# CONFIG_HABANA_AI is not set
+# end of Misc devices
+
+#
+# SCSI device support
+#
+CONFIG_SCSI_MOD=y
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=y
+CONFIG_SCSI_DMA=y
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
CONFIG_BLK_DEV_SR=y
+# CONFIG_CHR_DEV_SG is not set
+# CONFIG_CHR_DEV_SCH is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+# CONFIG_SCSI_SRP_ATTRS is not set
+# end of SCSI Transports
+
+CONFIG_SCSI_LOWLEVEL=y
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_ISCSI_BOOT_SYSFS is not set
+# CONFIG_SCSI_CXGB3_ISCSI is not set
+# CONFIG_SCSI_CXGB4_ISCSI is not set
+# CONFIG_SCSI_BNX2_ISCSI is not set
+# CONFIG_BE2ISCSI is not set
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_HPSA is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_3W_SAS is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_AIC94XX is not set
+# CONFIG_SCSI_MVSAS is not set
+# CONFIG_SCSI_MVUMI is not set
+# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_ARCMSR is not set
+# CONFIG_SCSI_ESAS2R is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+# CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
+# CONFIG_SCSI_MPT3SAS is not set
+# CONFIG_SCSI_MPT2SAS is not set
+# CONFIG_SCSI_SMARTPQI is not set
+# CONFIG_SCSI_UFSHCD is not set
+# CONFIG_SCSI_HPTIOP is not set
+# CONFIG_SCSI_MYRB is not set
+# CONFIG_SCSI_MYRS is not set
+# CONFIG_SCSI_SNIC is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_FDOMAIN_PCI is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_STEX is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_IPR is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_QLA_ISCSI is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_AM53C974 is not set
+# CONFIG_SCSI_WD719X is not set
+# CONFIG_SCSI_DEBUG is not set
+# CONFIG_SCSI_PMCRAID is not set
+# CONFIG_SCSI_PM8001 is not set
CONFIG_SCSI_VIRTIO=y
+# CONFIG_SCSI_DH is not set
+# end of SCSI device support
+
CONFIG_ATA=y
+CONFIG_SATA_HOST=y
+CONFIG_ATA_VERBOSE_ERROR=y
+CONFIG_ATA_FORCE=y
+CONFIG_SATA_PMP=y
+
+#
+# Controllers with non-SFF native interface
+#
CONFIG_SATA_AHCI=y
+CONFIG_SATA_MOBILE_LPM_POLICY=0
CONFIG_SATA_AHCI_PLATFORM=y
+# CONFIG_AHCI_CEVA is not set
+# CONFIG_AHCI_QORIQ is not set
+# CONFIG_SATA_INIC162X is not set
+# CONFIG_SATA_ACARD_AHCI is not set
+CONFIG_SATA_SIL24=y
+CONFIG_ATA_SFF=y
+
+#
+# SFF controllers with custom DMA interface
+#
+# CONFIG_PDC_ADMA is not set
+# CONFIG_SATA_QSTOR is not set
+# CONFIG_SATA_SX4 is not set
+CONFIG_ATA_BMDMA=y
+
+#
+# SATA SFF controllers with BMDMA
+#
+# CONFIG_ATA_PIIX is not set
+# CONFIG_SATA_DWC is not set
+# CONFIG_SATA_MV is not set
+# CONFIG_SATA_NV is not set
+# CONFIG_SATA_PROMISE is not set
+# CONFIG_SATA_SIL is not set
+# CONFIG_SATA_SIS is not set
+# CONFIG_SATA_SVW is not set
+# CONFIG_SATA_ULI is not set
+# CONFIG_SATA_VIA is not set
+# CONFIG_SATA_VITESSE is not set
+
+#
+# PATA SFF controllers with BMDMA
+#
+# CONFIG_PATA_ALI is not set
+# CONFIG_PATA_AMD is not set
+# CONFIG_PATA_ARTOP is not set
+# CONFIG_PATA_ATIIXP is not set
+# CONFIG_PATA_ATP867X is not set
+# CONFIG_PATA_CMD64X is not set
+# CONFIG_PATA_CYPRESS is not set
+# CONFIG_PATA_EFAR is not set
+# CONFIG_PATA_HPT366 is not set
+# CONFIG_PATA_HPT37X is not set
+# CONFIG_PATA_HPT3X2N is not set
+# CONFIG_PATA_HPT3X3 is not set
+# CONFIG_PATA_IT8213 is not set
+# CONFIG_PATA_IT821X is not set
+# CONFIG_PATA_JMICRON is not set
+# CONFIG_PATA_MARVELL is not set
+# CONFIG_PATA_NETCELL is not set
+# CONFIG_PATA_NINJA32 is not set
+# CONFIG_PATA_NS87415 is not set
+# CONFIG_PATA_OLDPIIX is not set
+# CONFIG_PATA_OPTIDMA is not set
+# CONFIG_PATA_PDC2027X is not set
+# CONFIG_PATA_PDC_OLD is not set
+# CONFIG_PATA_RADISYS is not set
+# CONFIG_PATA_RDC is not set
+# CONFIG_PATA_SCH is not set
+# CONFIG_PATA_SERVERWORKS is not set
+# CONFIG_PATA_SIL680 is not set
+# CONFIG_PATA_SIS is not set
+# CONFIG_PATA_TOSHIBA is not set
+# CONFIG_PATA_TRIFLEX is not set
+# CONFIG_PATA_VIA is not set
+# CONFIG_PATA_WINBOND is not set
+
+#
+# PIO-only SFF controllers
+#
+# CONFIG_PATA_CMD640_PCI is not set
+# CONFIG_PATA_MPIIX is not set
+# CONFIG_PATA_NS87410 is not set
+# CONFIG_PATA_OPTI is not set
+# CONFIG_PATA_PLATFORM is not set
+# CONFIG_PATA_RZ1000 is not set
+
+#
+# Generic fallback / legacy drivers
+#
+# CONFIG_ATA_GENERIC is not set
+# CONFIG_PATA_LEGACY is not set
+# CONFIG_MD is not set
+# CONFIG_TARGET_CORE is not set
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_FIREWIRE is not set
+# CONFIG_FIREWIRE_NOSY is not set
+# end of IEEE 1394 (FireWire) support
+
CONFIG_NETDEVICES=y
+CONFIG_MII=y
+CONFIG_NET_CORE=y
+# CONFIG_BONDING is not set
+# CONFIG_DUMMY is not set
+# CONFIG_WIREGUARD is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_NET_FC is not set
+# CONFIG_NET_TEAM is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_IPVLAN is not set
+# CONFIG_VXLAN is not set
+# CONFIG_GENEVE is not set
+# CONFIG_BAREUDP is not set
+# CONFIG_GTP is not set
+# CONFIG_MACSEC is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_TUN is not set
+# CONFIG_TUN_VNET_CROSS_LE is not set
+# CONFIG_VETH is not set
CONFIG_VIRTIO_NET=y
-CONFIG_MACB=y
-CONFIG_E1000E=y
+# CONFIG_NLMON is not set
+# CONFIG_ARCNET is not set
+
+#
+# Distributed Switch Architecture drivers
+#
+# end of Distributed Switch Architecture drivers
+
+CONFIG_ETHERNET=y
+CONFIG_NET_VENDOR_3COM=y
+# CONFIG_VORTEX is not set
+# CONFIG_TYPHOON is not set
+CONFIG_NET_VENDOR_ADAPTEC=y
+# CONFIG_ADAPTEC_STARFIRE is not set
+CONFIG_NET_VENDOR_AGERE=y
+# CONFIG_ET131X is not set
+# CONFIG_NET_VENDOR_ALACRITECH is not set
+CONFIG_NET_VENDOR_ALTEON=y
+# CONFIG_ACENIC is not set
+# CONFIG_ALTERA_TSE is not set
+# CONFIG_NET_VENDOR_AMAZON is not set
+CONFIG_NET_VENDOR_AMD=y
+# CONFIG_AMD8111_ETH is not set
+# CONFIG_PCNET32 is not set
+# CONFIG_NET_VENDOR_AQUANTIA is not set
+# CONFIG_NET_VENDOR_ARC is not set
+CONFIG_NET_VENDOR_ATHEROS=y
+# CONFIG_ATL2 is not set
+# CONFIG_ATL1 is not set
+# CONFIG_ATL1E is not set
+# CONFIG_ATL1C is not set
+# CONFIG_ALX is not set
+# CONFIG_NET_VENDOR_AURORA is not set
+# CONFIG_NET_VENDOR_BROADCOM is not set
+CONFIG_NET_VENDOR_BROCADE=y
+# CONFIG_BNA is not set
+# CONFIG_NET_VENDOR_CADENCE is not set
+# CONFIG_NET_VENDOR_CAVIUM is not set
+CONFIG_NET_VENDOR_CHELSIO=y
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_CHELSIO_T3 is not set
+# CONFIG_CHELSIO_T4 is not set
+# CONFIG_CHELSIO_T4VF is not set
+CONFIG_NET_VENDOR_CISCO=y
+# CONFIG_ENIC is not set
+# CONFIG_NET_VENDOR_CORTINA is not set
+# CONFIG_DNET is not set
+CONFIG_NET_VENDOR_DEC=y
+# CONFIG_NET_TULIP is not set
+CONFIG_NET_VENDOR_DLINK=y
+# CONFIG_DL2K is not set
+# CONFIG_SUNDANCE is not set
+CONFIG_NET_VENDOR_EMULEX=y
+# CONFIG_BE2NET is not set
+# CONFIG_NET_VENDOR_EZCHIP is not set
+# CONFIG_NET_VENDOR_GOOGLE is not set
+# CONFIG_NET_VENDOR_HUAWEI is not set
+# CONFIG_NET_VENDOR_INTEL is not set
+# CONFIG_JME is not set
+# CONFIG_NET_VENDOR_MARVELL is not set
+# CONFIG_NET_VENDOR_MELLANOX is not set
+# CONFIG_NET_VENDOR_MICREL is not set
+# CONFIG_NET_VENDOR_MICROCHIP is not set
+# CONFIG_NET_VENDOR_MICROSEMI is not set
+CONFIG_NET_VENDOR_MYRI=y
+# CONFIG_MYRI10GE is not set
+# CONFIG_FEALNX is not set
+# CONFIG_NET_VENDOR_NATSEMI is not set
+CONFIG_NET_VENDOR_NETERION=y
+# CONFIG_S2IO is not set
+# CONFIG_VXGE is not set
+# CONFIG_NET_VENDOR_NETRONOME is not set
+# CONFIG_NET_VENDOR_NI is not set
+CONFIG_NET_VENDOR_NVIDIA=y
+# CONFIG_FORCEDETH is not set
+CONFIG_NET_VENDOR_OKI=y
+# CONFIG_ETHOC is not set
+CONFIG_NET_VENDOR_PACKET_ENGINES=y
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_NET_VENDOR_PENSANDO is not set
+CONFIG_NET_VENDOR_QLOGIC=y
+# CONFIG_QLA3XXX is not set
+# CONFIG_QLCNIC is not set
+# CONFIG_NETXEN_NIC is not set
+# CONFIG_QED is not set
+# CONFIG_NET_VENDOR_QUALCOMM is not set
+CONFIG_NET_VENDOR_RDC=y
+# CONFIG_R6040 is not set
+CONFIG_NET_VENDOR_REALTEK=y
+# CONFIG_8139CP is not set
+# CONFIG_8139TOO is not set
CONFIG_R8169=y
-CONFIG_MICROSEMI_PHY=y
-CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_NET_VENDOR_RENESAS is not set
+# CONFIG_NET_VENDOR_ROCKER is not set
+# CONFIG_NET_VENDOR_SAMSUNG is not set
+# CONFIG_NET_VENDOR_SEEQ is not set
+# CONFIG_NET_VENDOR_SOLARFLARE is not set
+CONFIG_NET_VENDOR_SILAN=y
+# CONFIG_SC92031 is not set
+CONFIG_NET_VENDOR_SIS=y
+# CONFIG_SIS900 is not set
+# CONFIG_SIS190 is not set
+CONFIG_NET_VENDOR_SMSC=y
+# CONFIG_EPIC100 is not set
+# CONFIG_SMSC911X is not set
+# CONFIG_SMSC9420 is not set
+# CONFIG_NET_VENDOR_SOCIONEXT is not set
+CONFIG_NET_VENDOR_STMICRO=y
+CONFIG_STMMAC_ETH=y
+# CONFIG_STMMAC_SELFTESTS is not set
+CONFIG_STMMAC_PLATFORM=y
+# CONFIG_DWMAC_DWC_QOS_ETH is not set
+CONFIG_DWMAC_GENERIC=y
+# CONFIG_STMMAC_PCI is not set
+CONFIG_NET_VENDOR_SUN=y
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
+# CONFIG_NIU is not set
+# CONFIG_NET_VENDOR_SYNOPSYS is not set
+CONFIG_NET_VENDOR_TEHUTI=y
+# CONFIG_TEHUTI is not set
+CONFIG_NET_VENDOR_TI=y
+# CONFIG_TI_CPSW_PHY_SEL is not set
+# CONFIG_TLAN is not set
+# CONFIG_NET_VENDOR_VIA is not set
+# CONFIG_NET_VENDOR_WIZNET is not set
+# CONFIG_NET_VENDOR_XILINX is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_MDIO_DEVICE=y
+CONFIG_MDIO_BUS=y
+CONFIG_MDIO_DEVRES=y
+# CONFIG_MDIO_BCM_UNIMAC is not set
+# CONFIG_MDIO_BITBANG is not set
+# CONFIG_MDIO_BUS_MUX_GPIO is not set
+# CONFIG_MDIO_BUS_MUX_MMIOREG is not set
+# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set
+# CONFIG_MDIO_HISI_FEMAC is not set
+# CONFIG_MDIO_IPQ4019 is not set
+# CONFIG_MDIO_IPQ8064 is not set
+# CONFIG_MDIO_MSCC_MIIM is not set
+# CONFIG_MDIO_OCTEON is not set
+# CONFIG_MDIO_THUNDER is not set
+CONFIG_MDIO_XPCS=y
+CONFIG_PHYLINK=y
+CONFIG_PHYLIB=y
+CONFIG_SWPHY=y
+
+#
+# MII PHY device drivers
+#
+# CONFIG_SFP is not set
+# CONFIG_ADIN_PHY is not set
+# CONFIG_AMD_PHY is not set
+# CONFIG_AQUANTIA_PHY is not set
+# CONFIG_AX88796B_PHY is not set
+# CONFIG_BCM7XXX_PHY is not set
+# CONFIG_BCM87XX_PHY is not set
+# CONFIG_BROADCOM_PHY is not set
+# CONFIG_BCM54140_PHY is not set
+# CONFIG_BCM84881_PHY is not set
+# CONFIG_CICADA_PHY is not set
+# CONFIG_CORTINA_PHY is not set
+# CONFIG_DAVICOM_PHY is not set
+# CONFIG_DP83822_PHY is not set
+# CONFIG_DP83TC811_PHY is not set
+# CONFIG_DP83848_PHY is not set
+# CONFIG_DP83867_PHY is not set
+# CONFIG_DP83869_PHY is not set
+CONFIG_FIXED_PHY=y
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_INTEL_XWAY_PHY is not set
+# CONFIG_LSI_ET1011C_PHY is not set
+# CONFIG_LXT_PHY is not set
+CONFIG_MARVELL_PHY=y
+# CONFIG_MARVELL_10G_PHY is not set
+# CONFIG_MICREL_PHY is not set
+# CONFIG_MICROCHIP_PHY is not set
+# CONFIG_MICROCHIP_T1_PHY is not set
+# CONFIG_MICROSEMI_PHY is not set
+# CONFIG_NATIONAL_PHY is not set
+# CONFIG_QSEMI_PHY is not set
+CONFIG_REALTEK_PHY=y
+# CONFIG_RENESAS_PHY is not set
+# CONFIG_ROCKCHIP_PHY is not set
+# CONFIG_SMSC_PHY is not set
+# CONFIG_STE10XP is not set
+# CONFIG_TERANETICS_PHY is not set
+# CONFIG_VITESSE_PHY is not set
+# CONFIG_XILINX_GMII2RGMII is not set
+# CONFIG_MICREL_KS8995MA is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+
+#
+# Host-side USB support is needed for USB Network Adapter support
+#
+# CONFIG_WLAN is not set
+
+#
+# Enable WiMAX (Networking options) to see the WiMAX drivers
+#
+# CONFIG_WAN is not set
+# CONFIG_VMXNET3 is not set
+# CONFIG_NETDEVSIM is not set
+CONFIG_NET_FAILOVER=y
+# CONFIG_ISDN is not set
+# CONFIG_NVM is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+# CONFIG_INPUT_POLLDEV is not set
+# CONFIG_INPUT_SPARSEKMAP is not set
+# CONFIG_INPUT_MATRIXKMAP is not set
+
+#
+# Userland interfaces
+#
+# CONFIG_INPUT_MOUSEDEV is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+# CONFIG_RMI4_CORE is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_PCIPS2 is not set
+# CONFIG_SERIO_LIBPS2 is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_SERIO_ALTERA_PS2 is not set
+# CONFIG_SERIO_PS2MULT is not set
+# CONFIG_SERIO_ARC_PS2 is not set
+# CONFIG_SERIO_APBPS2 is not set
+# CONFIG_SERIO_GPIO_PS2 is not set
+# CONFIG_USERIO is not set
+# CONFIG_GAMEPORT is not set
+# end of Hardware I/O ports
+# end of Input device support
+
+#
+# Character devices
+#
+CONFIG_TTY=y
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+CONFIG_VT_HW_CONSOLE_BINDING=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+CONFIG_LDISC_AUTOLOAD=y
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_EARLYCON=y
CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y
+CONFIG_SERIAL_8250_16550A_VARIANTS=y
+# CONFIG_SERIAL_8250_FINTEK is not set
CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_DMA=y
+CONFIG_SERIAL_8250_PCI=y
+CONFIG_SERIAL_8250_EXAR=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+# CONFIG_SERIAL_8250_ASPEED_VUART is not set
+CONFIG_SERIAL_8250_DWLIB=y
+CONFIG_SERIAL_8250_DW=y
+# CONFIG_SERIAL_8250_RT288X is not set
CONFIG_SERIAL_OF_PLATFORM=y
-CONFIG_SERIAL_EARLYCON_RISCV_SBI=y
-CONFIG_HVC_RISCV_SBI=y
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_EARLYCON_RISCV_SBI is not set
+# CONFIG_SERIAL_MAX3100 is not set
+# CONFIG_SERIAL_MAX310X is not set
+# CONFIG_SERIAL_UARTLITE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_JSM is not set
+CONFIG_SERIAL_SIFIVE=y
+CONFIG_SERIAL_SIFIVE_CONSOLE=y
+# CONFIG_SERIAL_SCCNXP is not set
+# CONFIG_SERIAL_SC16IS7XX is not set
+# CONFIG_SERIAL_ALTERA_JTAGUART is not set
+# CONFIG_SERIAL_ALTERA_UART is not set
+# CONFIG_SERIAL_IFX6X60 is not set
+# CONFIG_SERIAL_XILINX_PS_UART is not set
+# CONFIG_SERIAL_ARC is not set
+# CONFIG_SERIAL_RP2 is not set
+# CONFIG_SERIAL_FSL_LPUART is not set
+# CONFIG_SERIAL_FSL_LINFLEXUART is not set
+# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set
+# CONFIG_SERIAL_SPRD is not set
+# end of Serial drivers
+
+CONFIG_SERIAL_MCTRL_GPIO=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_N_GSM is not set
+# CONFIG_NOZOMI is not set
+# CONFIG_NULL_TTY is not set
+# CONFIG_TRACE_SINK is not set
+CONFIG_HVC_DRIVER=y
+# CONFIG_HVC_RISCV_SBI is not set
+# CONFIG_SERIAL_DEV_BUS is not set
+# CONFIG_TTY_PRINTK is not set
CONFIG_VIRTIO_CONSOLE=y
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_IPMB_DEVICE_INTERFACE is not set
CONFIG_HW_RANDOM=y
+# CONFIG_HW_RANDOM_TIMERIOMEM is not set
+# CONFIG_HW_RANDOM_BA431 is not set
CONFIG_HW_RANDOM_VIRTIO=y
+CONFIG_HW_RANDOM_STARFIVE_VIC=y
+# CONFIG_HW_RANDOM_CCTRNG is not set
+# CONFIG_APPLICOM is not set
+CONFIG_DEVMEM=y
+# CONFIG_DEVKMEM is not set
+# CONFIG_RAW_DRIVER is not set
+CONFIG_DEVPORT=y
+# CONFIG_TCG_TPM is not set
+# CONFIG_XILLYBUS is not set
+# end of Character devices
+
+# CONFIG_RANDOM_TRUST_BOOTLOADER is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_COMPAT=y
+# CONFIG_I2C_CHARDEV is not set
+# CONFIG_I2C_MUX is not set
+CONFIG_I2C_HELPER_AUTO=y
+
+#
+# I2C Hardware Bus support
+#
+
+#
+# PC SMBus host controller drivers
+#
+# CONFIG_I2C_ALI1535 is not set
+# CONFIG_I2C_ALI1563 is not set
+# CONFIG_I2C_ALI15X3 is not set
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_I801 is not set
+# CONFIG_I2C_ISCH is not set
+# CONFIG_I2C_PIIX4 is not set
+# CONFIG_I2C_NFORCE2 is not set
+# CONFIG_I2C_NVIDIA_GPU is not set
+# CONFIG_I2C_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+# CONFIG_I2C_SIS96X is not set
+# CONFIG_I2C_VIA is not set
+# CONFIG_I2C_VIAPRO is not set
+
+#
+# I2C system bus drivers (mostly embedded / system-on-chip)
+#
+# CONFIG_I2C_CBUS_GPIO is not set
+CONFIG_I2C_DESIGNWARE_CORE=y
+CONFIG_I2C_DESIGNWARE_SLAVE=y
+CONFIG_I2C_DESIGNWARE_PLATFORM=y
+# CONFIG_I2C_DESIGNWARE_PCI is not set
+# CONFIG_I2C_EMEV2 is not set
+# CONFIG_I2C_GPIO is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PCA_PLATFORM is not set
+# CONFIG_I2C_RK3X is not set
+# CONFIG_I2C_SIMTEC is not set
+# CONFIG_I2C_XILINX is not set
+
+#
+# External I2C/SMBus adapter drivers
+#
+# CONFIG_I2C_TAOS_EVM is not set
+
+#
+# Other I2C/SMBus bus drivers
+#
+# end of I2C Hardware Bus support
+
+# CONFIG_I2C_STUB is not set
+CONFIG_I2C_SLAVE=y
+# CONFIG_I2C_SLAVE_EEPROM is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+# end of I2C support
+
+# CONFIG_I3C is not set
CONFIG_SPI=y
+# CONFIG_SPI_DEBUG is not set
+CONFIG_SPI_MASTER=y
+CONFIG_SPI_MEM=y
+
+#
+# SPI Master Controller Drivers
+#
+# CONFIG_SPI_ALTERA is not set
+# CONFIG_SPI_AXI_SPI_ENGINE is not set
+# CONFIG_SPI_BITBANG is not set
+# CONFIG_SPI_CADENCE is not set
+CONFIG_SPI_DESIGNWARE=y
+# CONFIG_SPI_DW_DMA is not set
+# CONFIG_SPI_DW_PCI is not set
+CONFIG_SPI_DW_MMIO=y
+# CONFIG_SPI_NXP_FLEXSPI is not set
+# CONFIG_SPI_GPIO is not set
+# CONFIG_SPI_FSL_SPI is not set
+# CONFIG_SPI_OC_TINY is not set
+# CONFIG_SPI_PXA2XX is not set
+# CONFIG_SPI_ROCKCHIP is not set
+# CONFIG_SPI_SC18IS602 is not set
CONFIG_SPI_SIFIVE=y
+# CONFIG_SPI_MXIC is not set
+# CONFIG_SPI_XCOMM is not set
+# CONFIG_SPI_XILINX is not set
+# CONFIG_SPI_ZYNQMP_GQSPI is not set
+# CONFIG_SPI_AMD is not set
+
+#
+# SPI Multiplexer support
+#
+# CONFIG_SPI_MUX is not set
+
+#
+# SPI Protocol Masters
+#
+CONFIG_SPI_SPIDEV=y
+CONFIG_SPI_LOOPBACK_TEST=m
+# CONFIG_SPI_TLE62X0 is not set
+# CONFIG_SPI_SLAVE is not set
+# CONFIG_SPMI is not set
+# CONFIG_HSI is not set
+# CONFIG_PPS is not set
+
+#
+# PTP clock support
+#
# CONFIG_PTP_1588_CLOCK is not set
-CONFIG_POWER_RESET=y
-CONFIG_DRM=y
-CONFIG_DRM_RADEON=y
-CONFIG_DRM_VIRTIO_GPU=y
+
+#
+# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
+#
+# end of PTP clock support
+
+# CONFIG_PINCTRL is not set
+CONFIG_GPIOLIB=y
+CONFIG_GPIOLIB_FASTPATH_LIMIT=512
+CONFIG_OF_GPIO=y
+CONFIG_GPIOLIB_IRQCHIP=y
+# CONFIG_DEBUG_GPIO is not set
+# CONFIG_GPIO_SYSFS is not set
+
+#
+# Memory mapped GPIO drivers
+#
+# CONFIG_GPIO_74XX_MMIO is not set
+# CONFIG_GPIO_ALTERA is not set
+# CONFIG_GPIO_CADENCE is not set
+# CONFIG_GPIO_DWAPB is not set
+# CONFIG_GPIO_EXAR is not set
+# CONFIG_GPIO_FTGPIO010 is not set
+# CONFIG_GPIO_GENERIC_PLATFORM is not set
+# CONFIG_GPIO_GRGPIO is not set
+# CONFIG_GPIO_HLWD is not set
+# CONFIG_GPIO_LOGICVC is not set
+# CONFIG_GPIO_MB86S7X is not set
+# CONFIG_GPIO_SAMA5D2_PIOBU is not set
+# CONFIG_GPIO_SIFIVE is not set
+CONFIG_GPIO_STARFIVE_VIC=y
+# CONFIG_GPIO_SYSCON is not set
+# CONFIG_GPIO_XILINX is not set
+# CONFIG_GPIO_AMD_FCH is not set
+# end of Memory mapped GPIO drivers
+
+#
+# I2C GPIO expanders
+#
+# CONFIG_GPIO_ADP5588 is not set
+# CONFIG_GPIO_ADNP is not set
+# CONFIG_GPIO_GW_PLD is not set
+# CONFIG_GPIO_MAX7300 is not set
+# CONFIG_GPIO_MAX732X is not set
+# CONFIG_GPIO_PCA953X is not set
+# CONFIG_GPIO_PCA9570 is not set
+# CONFIG_GPIO_PCF857X is not set
+# CONFIG_GPIO_TPIC2810 is not set
+# end of I2C GPIO expanders
+
+#
+# MFD GPIO expanders
+#
+# end of MFD GPIO expanders
+
+#
+# PCI GPIO expanders
+#
+# CONFIG_GPIO_BT8XX is not set
+# CONFIG_GPIO_PCI_IDIO_16 is not set
+# CONFIG_GPIO_PCIE_IDIO_24 is not set
+# CONFIG_GPIO_RDC321X is not set
+# end of PCI GPIO expanders
+
+#
+# SPI GPIO expanders
+#
+# CONFIG_GPIO_74X164 is not set
+# CONFIG_GPIO_MAX3191X is not set
+# CONFIG_GPIO_MAX7301 is not set
+# CONFIG_GPIO_MC33880 is not set
+# CONFIG_GPIO_PISOSR is not set
+# CONFIG_GPIO_XRA1403 is not set
+# end of SPI GPIO expanders
+
+# CONFIG_GPIO_AGGREGATOR is not set
+# CONFIG_GPIO_MOCKUP is not set
+# CONFIG_W1 is not set
+# CONFIG_POWER_AVS is not set
+# CONFIG_POWER_RESET is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+# CONFIG_SSB is not set
+CONFIG_BCMA_POSSIBLE=y
+# CONFIG_BCMA is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_ACT8945A is not set
+# CONFIG_MFD_AS3711 is not set
+# CONFIG_MFD_AS3722 is not set
+# CONFIG_PMIC_ADP5520 is not set
+# CONFIG_MFD_AAT2870_CORE is not set
+# CONFIG_MFD_ATMEL_FLEXCOM is not set
+# CONFIG_MFD_ATMEL_HLCDC is not set
+# CONFIG_MFD_BCM590XX is not set
+# CONFIG_MFD_BD9571MWV is not set
+# CONFIG_MFD_AXP20X_I2C is not set
+# CONFIG_MFD_MADERA is not set
+# CONFIG_PMIC_DA903X is not set
+# CONFIG_MFD_DA9052_SPI is not set
+# CONFIG_MFD_DA9052_I2C is not set
+# CONFIG_MFD_DA9055 is not set
+# CONFIG_MFD_DA9062 is not set
+# CONFIG_MFD_DA9063 is not set
+# CONFIG_MFD_DA9150 is not set
+# CONFIG_MFD_GATEWORKS_GSC is not set
+# CONFIG_MFD_MC13XXX_SPI is not set
+# CONFIG_MFD_MC13XXX_I2C is not set
+# CONFIG_MFD_MP2629 is not set
+# CONFIG_MFD_HI6421_PMIC is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_I2CPLD is not set
+# CONFIG_LPC_ICH is not set
+# CONFIG_LPC_SCH is not set
+# CONFIG_MFD_IQS62X is not set
+# CONFIG_MFD_JANZ_CMODIO is not set
+# CONFIG_MFD_KEMPLD is not set
+# CONFIG_MFD_88PM800 is not set
+# CONFIG_MFD_88PM805 is not set
+# CONFIG_MFD_88PM860X is not set
+# CONFIG_MFD_MAX14577 is not set
+# CONFIG_MFD_MAX77620 is not set
+# CONFIG_MFD_MAX77650 is not set
+# CONFIG_MFD_MAX77686 is not set
+# CONFIG_MFD_MAX77693 is not set
+# CONFIG_MFD_MAX77843 is not set
+# CONFIG_MFD_MAX8907 is not set
+# CONFIG_MFD_MAX8925 is not set
+# CONFIG_MFD_MAX8997 is not set
+# CONFIG_MFD_MAX8998 is not set
+# CONFIG_MFD_MT6360 is not set
+# CONFIG_MFD_MT6397 is not set
+# CONFIG_MFD_MENF21BMC is not set
+# CONFIG_EZX_PCAP is not set
+# CONFIG_MFD_CPCAP is not set
+# CONFIG_MFD_RETU is not set
+# CONFIG_MFD_PCF50633 is not set
+# CONFIG_MFD_RDC321X is not set
+# CONFIG_MFD_RT5033 is not set
+# CONFIG_MFD_RC5T583 is not set
+# CONFIG_MFD_RK808 is not set
+# CONFIG_MFD_RN5T618 is not set
+# CONFIG_MFD_SEC_CORE is not set
+# CONFIG_MFD_SI476X_CORE is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_MFD_SKY81452 is not set
+# CONFIG_ABX500_CORE is not set
+# CONFIG_MFD_STMPE is not set
+CONFIG_MFD_SYSCON=y
+# CONFIG_MFD_TI_AM335X_TSCADC is not set
+# CONFIG_MFD_LP3943 is not set
+# CONFIG_MFD_LP8788 is not set
+# CONFIG_MFD_TI_LMU is not set
+# CONFIG_MFD_PALMAS is not set
+# CONFIG_TPS6105X is not set
+# CONFIG_TPS65010 is not set
+# CONFIG_TPS6507X is not set
+# CONFIG_MFD_TPS65086 is not set
+# CONFIG_MFD_TPS65090 is not set
+# CONFIG_MFD_TPS65217 is not set
+# CONFIG_MFD_TI_LP873X is not set
+# CONFIG_MFD_TI_LP87565 is not set
+# CONFIG_MFD_TPS65218 is not set
+# CONFIG_MFD_TPS6586X is not set
+# CONFIG_MFD_TPS65910 is not set
+# CONFIG_MFD_TPS65912_I2C is not set
+# CONFIG_MFD_TPS65912_SPI is not set
+# CONFIG_MFD_TPS80031 is not set
+# CONFIG_TWL4030_CORE is not set
+# CONFIG_TWL6040_CORE is not set
+# CONFIG_MFD_WL1273_CORE is not set
+# CONFIG_MFD_LM3533 is not set
+# CONFIG_MFD_TC3589X is not set
+# CONFIG_MFD_TQMX86 is not set
+# CONFIG_MFD_VX855 is not set
+# CONFIG_MFD_LOCHNAGAR is not set
+# CONFIG_MFD_ARIZONA_I2C is not set
+# CONFIG_MFD_ARIZONA_SPI is not set
+# CONFIG_MFD_WM8400 is not set
+# CONFIG_MFD_WM831X_I2C is not set
+# CONFIG_MFD_WM831X_SPI is not set
+# CONFIG_MFD_WM8350_I2C is not set
+# CONFIG_MFD_WM8994 is not set
+# CONFIG_MFD_ROHM_BD718XX is not set
+# CONFIG_MFD_ROHM_BD70528 is not set
+# CONFIG_MFD_ROHM_BD71828 is not set
+# CONFIG_MFD_STPMIC1 is not set
+# CONFIG_MFD_STMFX is not set
+# end of Multifunction device drivers
+
+# CONFIG_REGULATOR is not set
+# CONFIG_RC_CORE is not set
+# CONFIG_MEDIA_CEC_SUPPORT is not set
+# CONFIG_MEDIA_SUPPORT is not set
+
+#
+# Graphics support
+#
+CONFIG_VGA_ARB=y
+CONFIG_VGA_ARB_MAX_GPUS=16
+# CONFIG_DRM is not set
+
+#
+# ARM devices
+#
+# end of ARM devices
+
+#
+# Frame buffer Devices
+#
+CONFIG_FB_CMDLINE=y
+CONFIG_FB_NOTIFY=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_FOREIGN_ENDIAN is not set
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_IMSTT is not set
+# CONFIG_FB_OPENCORES is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_NVIDIA is not set
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_I740 is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_S3 is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_VT8623 is not set
+# CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_ARK is not set
+# CONFIG_FB_PM3 is not set
+# CONFIG_FB_CARMINE is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_METRONOME is not set
+# CONFIG_FB_MB862XX is not set
+# CONFIG_FB_SIMPLE is not set
+# CONFIG_FB_SSD1307 is not set
+# CONFIG_FB_SM712 is not set
+# end of Frame buffer Devices
+
+#
+# Backlight & LCD device support
+#
+# CONFIG_LCD_CLASS_DEVICE is not set
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+# CONFIG_BACKLIGHT_PWM is not set
+# CONFIG_BACKLIGHT_QCOM_WLED is not set
+# CONFIG_BACKLIGHT_ADP8860 is not set
+# CONFIG_BACKLIGHT_ADP8870 is not set
+# CONFIG_BACKLIGHT_LM3630A is not set
+# CONFIG_BACKLIGHT_LM3639 is not set
+# CONFIG_BACKLIGHT_LP855X is not set
+# CONFIG_BACKLIGHT_GPIO is not set
+# CONFIG_BACKLIGHT_LV5207LP is not set
+# CONFIG_BACKLIGHT_BD6107 is not set
+# CONFIG_BACKLIGHT_ARCXCNN is not set
+# end of Backlight & LCD device support
+
+#
+# Console display driver support
+#
+CONFIG_VGA_CONSOLE=y
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_DUMMY_CONSOLE_COLUMNS=80
+CONFIG_DUMMY_CONSOLE_ROWS=25
CONFIG_FRAMEBUFFER_CONSOLE=y
-CONFIG_USB=y
-CONFIG_USB_XHCI_HCD=y
-CONFIG_USB_XHCI_PLATFORM=y
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_EHCI_HCD_PLATFORM=y
-CONFIG_USB_OHCI_HCD=y
-CONFIG_USB_OHCI_HCD_PLATFORM=y
-CONFIG_USB_STORAGE=y
-CONFIG_USB_UAS=y
-CONFIG_MMC=y
-CONFIG_MMC_SPI=y
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set
+# end of Console display driver support
+
+# CONFIG_LOGO is not set
+# end of Graphics support
+
+# CONFIG_SOUND is not set
+
+#
+# HID support
+#
+CONFIG_HID=y
+# CONFIG_HID_BATTERY_STRENGTH is not set
+# CONFIG_HIDRAW is not set
+# CONFIG_UHID is not set
+CONFIG_HID_GENERIC=y
+
+#
+# Special HID drivers
+#
+# CONFIG_HID_A4TECH is not set
+# CONFIG_HID_ACRUX is not set
+# CONFIG_HID_APPLE is not set
+# CONFIG_HID_AUREAL is not set
+# CONFIG_HID_BELKIN is not set
+# CONFIG_HID_CHERRY is not set
+# CONFIG_HID_CHICONY is not set
+# CONFIG_HID_COUGAR is not set
+# CONFIG_HID_MACALLY is not set
+# CONFIG_HID_CMEDIA is not set
+# CONFIG_HID_CYPRESS is not set
+# CONFIG_HID_DRAGONRISE is not set
+# CONFIG_HID_EMS_FF is not set
+# CONFIG_HID_ELECOM is not set
+# CONFIG_HID_EZKEY is not set
+# CONFIG_HID_GEMBIRD is not set
+# CONFIG_HID_GFRM is not set
+# CONFIG_HID_GLORIOUS is not set
+# CONFIG_HID_KEYTOUCH is not set
+# CONFIG_HID_KYE is not set
+# CONFIG_HID_WALTOP is not set
+# CONFIG_HID_VIEWSONIC is not set
+# CONFIG_HID_GYRATION is not set
+# CONFIG_HID_ICADE is not set
+# CONFIG_HID_ITE is not set
+# CONFIG_HID_JABRA is not set
+# CONFIG_HID_TWINHAN is not set
+# CONFIG_HID_KENSINGTON is not set
+# CONFIG_HID_LCPOWER is not set
+# CONFIG_HID_LENOVO is not set
+# CONFIG_HID_MAGICMOUSE is not set
+# CONFIG_HID_MALTRON is not set
+# CONFIG_HID_MAYFLASH is not set
+# CONFIG_HID_REDRAGON is not set
+# CONFIG_HID_MICROSOFT is not set
+# CONFIG_HID_MONTEREY is not set
+# CONFIG_HID_MULTITOUCH is not set
+# CONFIG_HID_NTI is not set
+# CONFIG_HID_ORTEK is not set
+# CONFIG_HID_PANTHERLORD is not set
+# CONFIG_HID_PETALYNX is not set
+# CONFIG_HID_PICOLCD is not set
+# CONFIG_HID_PLANTRONICS is not set
+# CONFIG_HID_PRIMAX is not set
+# CONFIG_HID_SAITEK is not set
+# CONFIG_HID_SAMSUNG is not set
+# CONFIG_HID_SPEEDLINK is not set
+# CONFIG_HID_STEAM is not set
+# CONFIG_HID_STEELSERIES is not set
+# CONFIG_HID_SUNPLUS is not set
+# CONFIG_HID_RMI is not set
+# CONFIG_HID_GREENASIA is not set
+# CONFIG_HID_SMARTJOYPLUS is not set
+# CONFIG_HID_TIVO is not set
+# CONFIG_HID_TOPSEED is not set
+# CONFIG_HID_THRUSTMASTER is not set
+# CONFIG_HID_UDRAW_PS3 is not set
+# CONFIG_HID_XINMO is not set
+# CONFIG_HID_ZEROPLUS is not set
+# CONFIG_HID_ZYDACRON is not set
+# CONFIG_HID_SENSOR_HUB is not set
+# CONFIG_HID_ALPS is not set
+# end of Special HID drivers
+
+#
+# I2C HID support
+#
+# CONFIG_I2C_HID is not set
+# end of I2C HID support
+# end of HID support
+
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+# CONFIG_USB_SUPPORT is not set
+# CONFIG_MMC is not set
+# CONFIG_MEMSTICK is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_ACCESSIBILITY is not set
+# CONFIG_INFINIBAND is not set
+CONFIG_EDAC_SUPPORT=y
+CONFIG_RTC_LIB=y
CONFIG_RTC_CLASS=y
-CONFIG_VIRTIO_PCI=y
-CONFIG_VIRTIO_BALLOON=y
-CONFIG_VIRTIO_INPUT=y
-CONFIG_VIRTIO_MMIO=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_SYSTOHC=y
+CONFIG_RTC_SYSTOHC_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+CONFIG_RTC_NVMEM=y
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+# CONFIG_RTC_DRV_TEST is not set
+
+#
+# I2C RTC drivers
+#
+# CONFIG_RTC_DRV_ABB5ZES3 is not set
+# CONFIG_RTC_DRV_ABEOZ9 is not set
+# CONFIG_RTC_DRV_ABX80X is not set
+# CONFIG_RTC_DRV_DS1307 is not set
+# CONFIG_RTC_DRV_DS1374 is not set
+# CONFIG_RTC_DRV_DS1672 is not set
+# CONFIG_RTC_DRV_HYM8563 is not set
+# CONFIG_RTC_DRV_MAX6900 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+# CONFIG_RTC_DRV_ISL1208 is not set
+# CONFIG_RTC_DRV_ISL12022 is not set
+# CONFIG_RTC_DRV_ISL12026 is not set
+# CONFIG_RTC_DRV_X1205 is not set
+# CONFIG_RTC_DRV_PCF8523 is not set
+# CONFIG_RTC_DRV_PCF85063 is not set
+# CONFIG_RTC_DRV_PCF85363 is not set
+# CONFIG_RTC_DRV_PCF8563 is not set
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_M41T80 is not set
+# CONFIG_RTC_DRV_BQ32K is not set
+# CONFIG_RTC_DRV_S35390A is not set
+# CONFIG_RTC_DRV_FM3130 is not set
+# CONFIG_RTC_DRV_RX8010 is not set
+# CONFIG_RTC_DRV_RX8581 is not set
+# CONFIG_RTC_DRV_RX8025 is not set
+# CONFIG_RTC_DRV_EM3027 is not set
+# CONFIG_RTC_DRV_RV3028 is not set
+# CONFIG_RTC_DRV_RV8803 is not set
+# CONFIG_RTC_DRV_SD3078 is not set
+
+#
+# SPI RTC drivers
+#
+# CONFIG_RTC_DRV_M41T93 is not set
+# CONFIG_RTC_DRV_M41T94 is not set
+# CONFIG_RTC_DRV_DS1302 is not set
+# CONFIG_RTC_DRV_DS1305 is not set
+# CONFIG_RTC_DRV_DS1343 is not set
+# CONFIG_RTC_DRV_DS1347 is not set
+# CONFIG_RTC_DRV_DS1390 is not set
+# CONFIG_RTC_DRV_MAX6916 is not set
+# CONFIG_RTC_DRV_R9701 is not set
+# CONFIG_RTC_DRV_RX4581 is not set
+# CONFIG_RTC_DRV_RX6110 is not set
+# CONFIG_RTC_DRV_RS5C348 is not set
+# CONFIG_RTC_DRV_MAX6902 is not set
+# CONFIG_RTC_DRV_PCF2123 is not set
+# CONFIG_RTC_DRV_MCP795 is not set
+CONFIG_RTC_I2C_AND_SPI=y
+
+#
+# SPI and I2C RTC drivers
+#
+# CONFIG_RTC_DRV_DS3232 is not set
+# CONFIG_RTC_DRV_PCF2127 is not set
+# CONFIG_RTC_DRV_RV3029C2 is not set
+
+#
+# Platform RTC drivers
+#
+# CONFIG_RTC_DRV_DS1286 is not set
+# CONFIG_RTC_DRV_DS1511 is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1685_FAMILY is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_DS2404 is not set
+# CONFIG_RTC_DRV_STK17TA8 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_M48T35 is not set
+# CONFIG_RTC_DRV_M48T59 is not set
+# CONFIG_RTC_DRV_MSM6242 is not set
+# CONFIG_RTC_DRV_BQ4802 is not set
+# CONFIG_RTC_DRV_RP5C01 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+# CONFIG_RTC_DRV_ZYNQMP is not set
+
+#
+# on-CPU RTC drivers
+#
+# CONFIG_RTC_DRV_CADENCE is not set
+# CONFIG_RTC_DRV_FTRTC010 is not set
+# CONFIG_RTC_DRV_R7301 is not set
+
+#
+# HID Sensor RTC drivers
+#
+CONFIG_DMADEVICES=y
+# CONFIG_DMADEVICES_DEBUG is not set
+
+#
+# DMA Devices
+#
+CONFIG_DMA_ENGINE=y
+CONFIG_DMA_VIRTUAL_CHANNELS=y
+CONFIG_DMA_OF=y
+# CONFIG_ALTERA_MSGDMA is not set
+CONFIG_DW_AXI_DMAC=y
+CONFIG_DW_AXI_DMAC_STARFIVE=y
+# CONFIG_FSL_EDMA is not set
+# CONFIG_INTEL_IDMA64 is not set
+# CONFIG_PLX_DMA is not set
+# CONFIG_XILINX_ZYNQMP_DPDMA is not set
+# CONFIG_QCOM_HIDMA_MGMT is not set
+# CONFIG_QCOM_HIDMA is not set
+# CONFIG_DW_DMAC is not set
+# CONFIG_DW_DMAC_PCI is not set
+# CONFIG_DW_EDMA is not set
+# CONFIG_DW_EDMA_PCIE is not set
+# CONFIG_SF_PDMA is not set
+
+#
+# DMA Clients
+#
+# CONFIG_ASYNC_TX_DMA is not set
+# CONFIG_DMATEST is not set
+
+#
+# DMABUF options
+#
+CONFIG_SYNC_FILE=y
+# CONFIG_SW_SYNC is not set
+# CONFIG_UDMABUF is not set
+# CONFIG_DMABUF_MOVE_NOTIFY is not set
+# CONFIG_DMABUF_SELFTESTS is not set
+# CONFIG_DMABUF_HEAPS is not set
+# end of DMABUF options
+
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_UIO is not set
+# CONFIG_VIRT_DRIVERS is not set
+CONFIG_VIRTIO=y
+# CONFIG_VIRTIO_MENU is not set
+# CONFIG_VDPA is not set
+# CONFIG_VHOST_MENU is not set
+
+#
+# Microsoft Hyper-V guest support
+#
+# end of Microsoft Hyper-V guest support
+
+# CONFIG_GREYBUS is not set
+# CONFIG_STAGING is not set
+# CONFIG_GOLDFISH is not set
+CONFIG_HAVE_CLK=y
+CONFIG_CLKDEV_LOOKUP=y
+CONFIG_HAVE_CLK_PREPARE=y
+CONFIG_COMMON_CLK=y
+# CONFIG_CLK_HSDK is not set
+# CONFIG_COMMON_CLK_MAX9485 is not set
+# CONFIG_COMMON_CLK_SI5341 is not set
+# CONFIG_COMMON_CLK_SI5351 is not set
+# CONFIG_COMMON_CLK_SI514 is not set
+# CONFIG_COMMON_CLK_SI544 is not set
+# CONFIG_COMMON_CLK_SI570 is not set
+# CONFIG_COMMON_CLK_CDCE706 is not set
+# CONFIG_COMMON_CLK_CDCE925 is not set
+# CONFIG_COMMON_CLK_CS2000_CP is not set
+# CONFIG_COMMON_CLK_PWM is not set
+# CONFIG_COMMON_CLK_VC5 is not set
+# CONFIG_COMMON_CLK_FIXED_MMIO is not set
+CONFIG_CLK_ANALOGBITS_WRPLL_CLN28HPC=y
+CONFIG_CLK_SIFIVE=y
+CONFIG_CLK_SIFIVE_FU540_PRCI=y
+# CONFIG_HWSPINLOCK is not set
+
+#
+# Clock Source drivers
+#
+CONFIG_TIMER_OF=y
+CONFIG_TIMER_PROBE=y
+CONFIG_RISCV_TIMER=y
+# CONFIG_MICROCHIP_PIT64B is not set
+# end of Clock Source drivers
+
+# CONFIG_MAILBOX is not set
+# CONFIG_IOMMU_SUPPORT is not set
+
+#
+# Remoteproc drivers
+#
+# CONFIG_REMOTEPROC is not set
+# end of Remoteproc drivers
+
+#
+# Rpmsg drivers
+#
+CONFIG_RPMSG=y
CONFIG_RPMSG_CHAR=y
CONFIG_RPMSG_VIRTIO=y
+# end of Rpmsg drivers
+
+# CONFIG_SOUNDWIRE is not set
+
+#
+# SOC (System On Chip) specific Drivers
+#
+
+#
+# Amlogic SoC drivers
+#
+# end of Amlogic SoC drivers
+
+#
+# Aspeed SoC drivers
+#
+# end of Aspeed SoC drivers
+
+#
+# Broadcom SoC drivers
+#
+# end of Broadcom SoC drivers
+
+#
+# NXP/Freescale QorIQ SoC drivers
+#
+# end of NXP/Freescale QorIQ SoC drivers
+
+#
+# i.MX SoC drivers
+#
+# end of i.MX SoC drivers
+
+#
+# Qualcomm SoC drivers
+#
+# end of Qualcomm SoC drivers
+
+CONFIG_SIFIVE_L2=y
+CONFIG_SIFIVE_L2_FLUSH=y
+CONFIG_SIFIVE_L2_FLUSH_START=0x80000000
+CONFIG_SIFIVE_L2_FLUSH_SIZE=0x800000000
+# CONFIG_SOC_TI is not set
+
+#
+# Xilinx SoC drivers
+#
+# CONFIG_XILINX_VCU is not set
+# end of Xilinx SoC drivers
+# end of SOC (System On Chip) specific Drivers
+
+# CONFIG_PM_DEVFREQ is not set
+# CONFIG_EXTCON is not set
+# CONFIG_MEMORY is not set
+# CONFIG_IIO is not set
+# CONFIG_NTB is not set
+# CONFIG_VME_BUS is not set
+CONFIG_PWM=y
+CONFIG_PWM_SYSFS=y
+# CONFIG_PWM_DEBUG is not set
+# CONFIG_PWM_FSL_FTM is not set
+# CONFIG_PWM_PCA9685 is not set
+CONFIG_PWM_SIFIVE=y
+CONFIG_PWM_SIFIVE_PTC=y
+
+#
+# IRQ chip support
+#
+CONFIG_IRQCHIP=y
+# CONFIG_AL_FIC is not set
+CONFIG_RISCV_INTC=y
+CONFIG_SIFIVE_PLIC=y
+# end of IRQ chip support
+
+# CONFIG_IPACK_BUS is not set
+CONFIG_RESET_CONTROLLER=y
+# CONFIG_RESET_BRCMSTB_RESCAL is not set
+# CONFIG_RESET_INTEL_GW is not set
+# CONFIG_RESET_TI_SYSCON is not set
+
+#
+# PHY Subsystem
+#
+CONFIG_GENERIC_PHY=y
+# CONFIG_BCM_KONA_USB2_PHY is not set
+# CONFIG_PHY_CADENCE_TORRENT is not set
+# CONFIG_PHY_CADENCE_DPHY is not set
+# CONFIG_PHY_CADENCE_SIERRA is not set
+# CONFIG_PHY_CADENCE_SALVO is not set
+# CONFIG_PHY_FSL_IMX8MQ_USB is not set
+# CONFIG_PHY_MIXEL_MIPI_DPHY is not set
+# CONFIG_PHY_PXA_28NM_HSIC is not set
+# CONFIG_PHY_PXA_28NM_USB2 is not set
+# CONFIG_PHY_OCELOT_SERDES is not set
+# end of PHY Subsystem
+
+# CONFIG_POWERCAP is not set
+# CONFIG_MCB is not set
+# CONFIG_RAS is not set
+# CONFIG_USB4 is not set
+
+#
+# Android
+#
+# CONFIG_ANDROID is not set
+# end of Android
+
+# CONFIG_LIBNVDIMM is not set
+# CONFIG_DAX is not set
+CONFIG_NVMEM=y
+CONFIG_NVMEM_SYSFS=y
+
+#
+# HW tracing support
+#
+# CONFIG_STM is not set
+# CONFIG_INTEL_TH is not set
+# end of HW tracing support
+
+# CONFIG_FPGA is not set
+# CONFIG_FSI is not set
+# CONFIG_SIOX is not set
+# CONFIG_SLIMBUS is not set
+# CONFIG_INTERCONNECT is not set
+# CONFIG_COUNTER is not set
+# CONFIG_XRP is not set
+# end of Device Drivers
+
+#
+# File systems
+#
+# CONFIG_VALIDATE_FS_PARSER is not set
+CONFIG_FS_IOMAP=y
+# CONFIG_EXT2_FS is not set
+# CONFIG_EXT3_FS is not set
CONFIG_EXT4_FS=y
+CONFIG_EXT4_USE_FOR_EXT2=y
CONFIG_EXT4_FS_POSIX_ACL=y
+# CONFIG_EXT4_FS_SECURITY is not set
+# CONFIG_EXT4_DEBUG is not set
+CONFIG_JBD2=y
+# CONFIG_JBD2_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+# CONFIG_NILFS2_FS is not set
+# CONFIG_F2FS_FS is not set
+# CONFIG_ZONEFS_FS is not set
+# CONFIG_FS_DAX is not set
+CONFIG_FS_POSIX_ACL=y
+CONFIG_EXPORTFS=y
+# CONFIG_EXPORTFS_BLOCK_OPS is not set
+CONFIG_FILE_LOCKING=y
+CONFIG_MANDATORY_FILE_LOCKING=y
+# CONFIG_FS_ENCRYPTION is not set
+# CONFIG_FS_VERITY is not set
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_FANOTIFY is not set
+# CONFIG_QUOTA is not set
CONFIG_AUTOFS4_FS=y
+CONFIG_AUTOFS_FS=y
+# CONFIG_FUSE_FS is not set
+# CONFIG_OVERLAY_FS is not set
+
+#
+# Caches
+#
+# CONFIG_FSCACHE is not set
+# end of Caches
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+# end of CD-ROM/DVD Filesystems
+
+#
+# DOS/FAT/EXFAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+CONFIG_FAT_DEFAULT_UTF8=y
+CONFIG_EXFAT_FS=y
+CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8"
+CONFIG_NTFS_FS=y
+# CONFIG_NTFS_DEBUG is not set
+CONFIG_NTFS_RW=y
+# end of DOS/FAT/EXFAT/NT Filesystems
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+# CONFIG_PROC_KCORE is not set
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_PROC_CHILDREN=y
+CONFIG_KERNFS=y
+CONFIG_SYSFS=y
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_TMPFS_XATTR=y
+# CONFIG_TMPFS_INODE64 is not set
+CONFIG_HUGETLBFS=y
+CONFIG_HUGETLB_PAGE=y
+CONFIG_MEMFD_CREATE=y
+CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
+# CONFIG_CONFIGFS_FS is not set
+# end of Pseudo filesystems
+
+CONFIG_MISC_FILESYSTEMS=y
+# CONFIG_ORANGEFS_FS is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_ECRYPT_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_JFFS2_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_OMFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX6FS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_PSTORE is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_EROFS_FS is not set
+CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=y
+CONFIG_NFS_V2=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
CONFIG_NFS_V4=y
+# CONFIG_NFS_SWAP is not set
CONFIG_NFS_V4_1=y
CONFIG_NFS_V4_2=y
+CONFIG_PNFS_FILE_LAYOUT=y
+CONFIG_PNFS_FLEXFILE_LAYOUT=m
+CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org"
+# CONFIG_NFS_V4_1_MIGRATION is not set
CONFIG_ROOT_NFS=y
-CONFIG_9P_FS=y
+# CONFIG_NFS_USE_LEGACY_DNS is not set
+CONFIG_NFS_USE_KERNEL_DNS=y
+CONFIG_NFS_DISABLE_UDP_SUPPORT=y
+# CONFIG_NFSD is not set
+CONFIG_GRACE_PERIOD=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_SUNRPC_BACKCHANNEL=y
+# CONFIG_SUNRPC_DEBUG is not set
+# CONFIG_CEPH_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_MAC_ROMAN is not set
+# CONFIG_NLS_MAC_CELTIC is not set
+# CONFIG_NLS_MAC_CENTEURO is not set
+# CONFIG_NLS_MAC_CROATIAN is not set
+# CONFIG_NLS_MAC_CYRILLIC is not set
+# CONFIG_NLS_MAC_GAELIC is not set
+# CONFIG_NLS_MAC_GREEK is not set
+# CONFIG_NLS_MAC_ICELAND is not set
+# CONFIG_NLS_MAC_INUIT is not set
+# CONFIG_NLS_MAC_ROMANIAN is not set
+# CONFIG_NLS_MAC_TURKISH is not set
+# CONFIG_NLS_UTF8 is not set
+# CONFIG_UNICODE is not set
+CONFIG_IO_WQ=y
+# end of File systems
+
+#
+# Security options
+#
+CONFIG_KEYS=y
+# CONFIG_KEYS_REQUEST_CACHE is not set
+# CONFIG_PERSISTENT_KEYRINGS is not set
+# CONFIG_ENCRYPTED_KEYS is not set
+# CONFIG_KEY_DH_OPERATIONS is not set
+# CONFIG_SECURITY_DMESG_RESTRICT is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y
+# CONFIG_HARDENED_USERCOPY is not set
+# CONFIG_STATIC_USERMODEHELPER is not set
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf"
+
+#
+# Kernel hardening options
+#
+
+#
+# Memory initialization
+#
+CONFIG_INIT_STACK_NONE=y
+# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set
+# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set
+# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set
+# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set
+# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set
+# end of Memory initialization
+# end of Kernel hardening options
+# end of Security options
+
+CONFIG_CRYPTO=y
+
+#
+# Crypto core or helper
+#
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_ALGAPI2=y
+CONFIG_CRYPTO_AEAD=y
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_SKCIPHER=y
+CONFIG_CRYPTO_SKCIPHER2=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_AKCIPHER2=y
+CONFIG_CRYPTO_AKCIPHER=m
+CONFIG_CRYPTO_KPP2=y
+CONFIG_CRYPTO_ACOMP2=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+CONFIG_CRYPTO_USER=y
+CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
+# CONFIG_CRYPTO_NULL is not set
+CONFIG_CRYPTO_NULL2=y
+# CONFIG_CRYPTO_PCRYPT is not set
+# CONFIG_CRYPTO_CRYPTD is not set
+# CONFIG_CRYPTO_AUTHENC is not set
+# CONFIG_CRYPTO_TEST is not set
+CONFIG_CRYPTO_ENGINE=y
+
+#
+# Public-key cryptography
+#
+CONFIG_CRYPTO_RSA=m
+# CONFIG_CRYPTO_DH is not set
+# CONFIG_CRYPTO_ECDH is not set
+# CONFIG_CRYPTO_ECRDSA is not set
+# CONFIG_CRYPTO_CURVE25519 is not set
+
+#
+# Authenticated Encryption with Associated Data
+#
+# CONFIG_CRYPTO_CCM is not set
+# CONFIG_CRYPTO_GCM is not set
+# CONFIG_CRYPTO_CHACHA20POLY1305 is not set
+# CONFIG_CRYPTO_AEGIS128 is not set
+# CONFIG_CRYPTO_SEQIV is not set
+# CONFIG_CRYPTO_ECHAINIV is not set
+
+#
+# Block modes
+#
+# CONFIG_CRYPTO_CBC is not set
+# CONFIG_CRYPTO_CFB is not set
+# CONFIG_CRYPTO_CTR is not set
+# CONFIG_CRYPTO_CTS is not set
+# CONFIG_CRYPTO_ECB is not set
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_OFB is not set
+# CONFIG_CRYPTO_PCBC is not set
+# CONFIG_CRYPTO_XTS is not set
+# CONFIG_CRYPTO_KEYWRAP is not set
+# CONFIG_CRYPTO_ADIANTUM is not set
+# CONFIG_CRYPTO_ESSIV is not set
+
+#
+# Hash modes
+#
+# CONFIG_CRYPTO_CMAC is not set
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_VMAC is not set
+
+#
+# Digest
+#
+CONFIG_CRYPTO_CRC32C=y
+# CONFIG_CRYPTO_CRC32 is not set
+# CONFIG_CRYPTO_XXHASH is not set
+# CONFIG_CRYPTO_BLAKE2B is not set
+# CONFIG_CRYPTO_BLAKE2S is not set
+# CONFIG_CRYPTO_CRCT10DIF is not set
+# CONFIG_CRYPTO_GHASH is not set
+# CONFIG_CRYPTO_POLY1305 is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_RMD128 is not set
+# CONFIG_CRYPTO_RMD160 is not set
+# CONFIG_CRYPTO_RMD256 is not set
+# CONFIG_CRYPTO_RMD320 is not set
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_SHA3 is not set
+# CONFIG_CRYPTO_SM3 is not set
+# CONFIG_CRYPTO_STREEBOG is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_WP512 is not set
+
+#
+# Ciphers
+#
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_AES_TI is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_SALSA20 is not set
+# CONFIG_CRYPTO_CHACHA20 is not set
+# CONFIG_CRYPTO_SEED is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_SM4 is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+
+#
+# Compression
+#
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_LZO is not set
+# CONFIG_CRYPTO_842 is not set
+# CONFIG_CRYPTO_LZ4 is not set
+# CONFIG_CRYPTO_LZ4HC is not set
+# CONFIG_CRYPTO_ZSTD is not set
+
+#
+# Random Number Generation
+#
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+# CONFIG_CRYPTO_DRBG_MENU is not set
+# CONFIG_CRYPTO_JITTERENTROPY is not set
+CONFIG_CRYPTO_USER_API=y
CONFIG_CRYPTO_USER_API_HASH=y
+# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
+# CONFIG_CRYPTO_USER_API_RNG is not set
+# CONFIG_CRYPTO_USER_API_AEAD is not set
+# CONFIG_CRYPTO_STATS is not set
+
+#
+# Crypto library routines
+#
+# CONFIG_CRYPTO_LIB_BLAKE2S is not set
+# CONFIG_CRYPTO_LIB_CHACHA is not set
+# CONFIG_CRYPTO_LIB_CURVE25519 is not set
+CONFIG_CRYPTO_LIB_POLY1305_RSIZE=1
+# CONFIG_CRYPTO_LIB_POLY1305 is not set
+# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set
+CONFIG_CRYPTO_HW=y
+# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set
+# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set
+# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set
CONFIG_CRYPTO_DEV_VIRTIO=y
+# CONFIG_CRYPTO_DEV_SAFEXCEL is not set
+# CONFIG_CRYPTO_DEV_CCREE is not set
+# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set
+# CONFIG_ASYMMETRIC_KEY_TYPE is not set
+
+#
+# Certificates for signature checking
+#
+# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set
+# end of Certificates for signature checking
+
+#
+# Library routines
+#
+# CONFIG_PACKING is not set
+CONFIG_BITREVERSE=y
+CONFIG_GENERIC_STRNCPY_FROM_USER=y
+CONFIG_GENERIC_STRNLEN_USER=y
+CONFIG_GENERIC_NET_UTILS=y
+# CONFIG_CORDIC is not set
+# CONFIG_PRIME_NUMBERS is not set
+CONFIG_RATIONAL=y
+CONFIG_GENERIC_PCI_IOMAP=y
+# CONFIG_CRC_CCITT is not set
+CONFIG_CRC16=y
+# CONFIG_CRC_T10DIF is not set
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+# CONFIG_CRC32_SELFTEST is not set
+CONFIG_CRC32_SLICEBY8=y
+# CONFIG_CRC32_SLICEBY4 is not set
+# CONFIG_CRC32_SARWATE is not set
+# CONFIG_CRC32_BIT is not set
+# CONFIG_CRC64 is not set
+# CONFIG_CRC4 is not set
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+# CONFIG_CRC8 is not set
+CONFIG_XXHASH=y
+# CONFIG_RANDOM32_SELFTEST is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_LZ4_DECOMPRESS=y
+CONFIG_ZSTD_DECOMPRESS=y
+CONFIG_XZ_DEC=y
+CONFIG_XZ_DEC_X86=y
+CONFIG_XZ_DEC_POWERPC=y
+CONFIG_XZ_DEC_IA64=y
+CONFIG_XZ_DEC_ARM=y
+CONFIG_XZ_DEC_ARMTHUMB=y
+CONFIG_XZ_DEC_SPARC=y
+CONFIG_XZ_DEC_BCJ=y
+# CONFIG_XZ_DEC_TEST is not set
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_DECOMPRESS_BZIP2=y
+CONFIG_DECOMPRESS_LZMA=y
+CONFIG_DECOMPRESS_XZ=y
+CONFIG_DECOMPRESS_LZO=y
+CONFIG_DECOMPRESS_LZ4=y
+CONFIG_DECOMPRESS_ZSTD=y
+CONFIG_ASSOCIATIVE_ARRAY=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT_MAP=y
+CONFIG_HAS_DMA=y
+CONFIG_NEED_DMA_MAP_STATE=y
+CONFIG_ARCH_DMA_ADDR_T_64BIT=y
+CONFIG_DMA_DECLARE_COHERENT=y
+CONFIG_SWIOTLB=y
+# CONFIG_DMA_CMA is not set
+# CONFIG_DMA_API_DEBUG is not set
+CONFIG_SGL_ALLOC=y
+CONFIG_CPU_RMAP=y
+CONFIG_DQL=y
+CONFIG_GLOB=y
+# CONFIG_GLOB_SELFTEST is not set
+CONFIG_NLATTR=y
+CONFIG_CLZ_TAB=y
+# CONFIG_IRQ_POLL is not set
+CONFIG_MPILIB=m
+CONFIG_LIBFDT=y
+CONFIG_OID_REGISTRY=y
+CONFIG_HAVE_GENERIC_VDSO=y
+CONFIG_GENERIC_GETTIMEOFDAY=y
+CONFIG_FONT_SUPPORT=y
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+CONFIG_SG_POOL=y
+CONFIG_SBITMAP=y
+# CONFIG_STRING_SELFTEST is not set
+# end of Library routines
+
+CONFIG_GENERIC_IOREMAP=y
+
+#
+# Kernel hacking
+#
+
+#
+# printk and dmesg options
+#
CONFIG_PRINTK_TIME=y
+# CONFIG_PRINTK_CALLER is not set
+CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7
+CONFIG_CONSOLE_LOGLEVEL_QUIET=4
+CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
+# CONFIG_BOOT_PRINTK_DELAY is not set
+# CONFIG_DYNAMIC_DEBUG is not set
+# CONFIG_DYNAMIC_DEBUG_CORE is not set
+CONFIG_SYMBOLIC_ERRNAME=y
+CONFIG_DEBUG_BUGVERBOSE=y
+# end of printk and dmesg options
+
+#
+# Compile-time checks and compiler options
+#
+# CONFIG_DEBUG_INFO is not set
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=2048
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_READABLE_ASM is not set
+# CONFIG_HEADERS_INSTALL is not set
+# CONFIG_DEBUG_SECTION_MISMATCH is not set
+CONFIG_SECTION_MISMATCH_WARN_ONLY=y
+# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set
+CONFIG_ARCH_WANT_FRAME_POINTERS=y
+CONFIG_FRAME_POINTER=y
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+# end of Compile-time checks and compiler options
+
+#
+# Generic Kernel Debugging Instruments
+#
+# CONFIG_MAGIC_SYSRQ is not set
CONFIG_DEBUG_FS=y
+CONFIG_DEBUG_FS_ALLOW_ALL=y
+# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set
+# CONFIG_DEBUG_FS_ALLOW_NONE is not set
+CONFIG_HAVE_ARCH_KGDB=y
+CONFIG_HAVE_ARCH_KGDB_QXFER_PKT=y
+# CONFIG_KGDB is not set
+# CONFIG_UBSAN is not set
+# end of Generic Kernel Debugging Instruments
+
+CONFIG_DEBUG_KERNEL=y
+CONFIG_DEBUG_MISC=y
+
+#
+# Memory Debugging
+#
+# CONFIG_PAGE_EXTENSION is not set
CONFIG_DEBUG_PAGEALLOC=y
+# CONFIG_DEBUG_PAGEALLOC_ENABLE_DEFAULT is not set
+# CONFIG_PAGE_OWNER is not set
+# CONFIG_PAGE_POISONING is not set
+# CONFIG_DEBUG_RODATA_TEST is not set
+CONFIG_ARCH_HAS_DEBUG_WX=y
+# CONFIG_DEBUG_WX is not set
+CONFIG_GENERIC_PTDUMP=y
+# CONFIG_PTDUMP_DEBUGFS is not set
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_SLUB_DEBUG_ON is not set
+# CONFIG_SLUB_STATS is not set
+CONFIG_HAVE_DEBUG_KMEMLEAK=y
+# CONFIG_DEBUG_KMEMLEAK is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
CONFIG_SCHED_STACK_END_CHECK=y
+CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y
CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_VM_VMACACHE is not set
+# CONFIG_DEBUG_VM_RB is not set
CONFIG_DEBUG_VM_PGFLAGS=y
+CONFIG_DEBUG_VM_PGTABLE=y
+CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y
+# CONFIG_DEBUG_VIRTUAL is not set
CONFIG_DEBUG_MEMORY_INIT=y
-CONFIG_DEBUG_PER_CPU_MAPS=y
+# CONFIG_DEBUG_PER_CPU_MAPS is not set
+CONFIG_HAVE_ARCH_KASAN=y
+CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y
+# end of Memory Debugging
+
+# CONFIG_DEBUG_SHIRQ is not set
+
+#
+# Debug Oops, Lockups and Hangs
+#
+# CONFIG_PANIC_ON_OOPS is not set
+CONFIG_PANIC_ON_OOPS_VALUE=0
+CONFIG_PANIC_TIMEOUT=0
+CONFIG_LOCKUP_DETECTOR=y
CONFIG_SOFTLOCKUP_DETECTOR=y
+# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+CONFIG_DETECT_HUNG_TASK=y
+CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
+# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
+CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
CONFIG_WQ_WATCHDOG=y
+# CONFIG_TEST_LOCKUP is not set
+# end of Debug Oops, Lockups and Hangs
+
+#
+# Scheduler Debugging
+#
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# end of Scheduler Debugging
+
CONFIG_DEBUG_TIMEKEEPING=y
+
+#
+# Lock Debugging (spinlocks, mutexes, etc...)
+#
+CONFIG_LOCK_DEBUGGING_SUPPORT=y
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT is not set
CONFIG_DEBUG_RT_MUTEXES=y
CONFIG_DEBUG_SPINLOCK=y
CONFIG_DEBUG_MUTEXES=y
+# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
CONFIG_DEBUG_RWSEMS=y
+# CONFIG_DEBUG_LOCK_ALLOC is not set
CONFIG_DEBUG_ATOMIC_SLEEP=y
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_LOCK_TORTURE_TEST is not set
+# CONFIG_WW_MUTEX_SELFTEST is not set
+# end of Lock Debugging (spinlocks, mutexes, etc...)
+
CONFIG_STACKTRACE=y
+# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set
+# CONFIG_DEBUG_KOBJECT is not set
+
+#
+# Debug kernel data structures
+#
CONFIG_DEBUG_LIST=y
CONFIG_DEBUG_PLIST=y
CONFIG_DEBUG_SG=y
+# CONFIG_DEBUG_NOTIFIERS is not set
+# CONFIG_BUG_ON_DATA_CORRUPTION is not set
+# end of Debug kernel data structures
+
+# CONFIG_DEBUG_CREDENTIALS is not set
+
+#
+# RCU Debugging
+#
+# CONFIG_RCU_PERF_TEST is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_RCU_REF_SCALE_TEST is not set
+CONFIG_RCU_CPU_STALL_TIMEOUT=21
# CONFIG_RCU_TRACE is not set
CONFIG_RCU_EQS_DEBUG=y
+# end of RCU Debugging
+
+# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set
CONFIG_DEBUG_BLOCK_EXT_DEVT=y
+# CONFIG_LATENCYTOP is not set
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
+CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
+CONFIG_TRACING_SUPPORT=y
# CONFIG_FTRACE is not set
+# CONFIG_SAMPLES is not set
+
+#
+# riscv Debugging
+#
+
+#
+# Kernel Testing and Coverage
+#
+# CONFIG_KUNIT is not set
+# CONFIG_NOTIFIER_ERROR_INJECTION is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_ARCH_HAS_KCOV=y
+CONFIG_CC_HAS_SANCOV_TRACE_PC=y
+# CONFIG_KCOV is not set
# CONFIG_RUNTIME_TESTING_MENU is not set
CONFIG_MEMTEST=y
-# CONFIG_SYSFS_SYSCALL is not set
-CONFIG_EFI=y
+# end of Kernel Testing and Coverage
+# end of Kernel hacking
diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig
index 9d6645b1f0ab..74080ca3c47a 100644
--- a/drivers/crypto/Kconfig
+++ b/drivers/crypto/Kconfig
@@ -21,7 +21,7 @@ config CRYPTO_DEV_PADLOCK
(so called VIA PadLock ACE, Advanced Cryptography Engine)
that provides instructions for very fast cryptographic
operations with supported algorithms.
-
+
The instructions are used only when the CPU supports them.
Otherwise software encryption is used.
@@ -733,6 +733,8 @@ config CRYPTO_DEV_VMX
source "drivers/crypto/vmx/Kconfig"
+source "drivers/crypto/sifive-vic/Kconfig"
+
config CRYPTO_DEV_IMGTEC_HASH
tristate "Imagination Technologies hardware hash accelerator"
depends on MIPS || COMPILE_TEST
diff --git a/drivers/crypto/Makefile b/drivers/crypto/Makefile
index 53fc115cf459..68ee795f3ea8 100644
--- a/drivers/crypto/Makefile
+++ b/drivers/crypto/Makefile
@@ -45,6 +45,7 @@ obj-$(CONFIG_CRYPTO_DEV_TALITOS) += talitos.o
obj-$(CONFIG_CRYPTO_DEV_UX500) += ux500/
obj-$(CONFIG_CRYPTO_DEV_VIRTIO) += virtio/
obj-$(CONFIG_CRYPTO_DEV_VMX) += vmx/
+obj-y += sifive-vic/
obj-$(CONFIG_CRYPTO_DEV_BCM_SPU) += bcm/
obj-$(CONFIG_CRYPTO_DEV_SAFEXCEL) += inside-secure/
obj-$(CONFIG_CRYPTO_DEV_ARTPEC6) += axis/
diff --git a/drivers/crypto/sifive-vic/Kconfig b/drivers/crypto/sifive-vic/Kconfig
new file mode 100644
index 000000000000..0f1e520555ba
--- /dev/null
+++ b/drivers/crypto/sifive-vic/Kconfig
@@ -0,0 +1,10 @@
+config CRYPTO_DEV_SIFIVE_VIC_ENCRYPT
+ tristate "Encryption acceleration support on sifive vic"
+ depends on RISCV
+ select CRYPTO_ENGINE
+ select CRYPTO_RSA
+ default m
+ help
+ Support for SIFIVE VIC cryptographic acceleration instructions on riscv64 CPU.
+ This module supports acceleration for AES and GHASH in hardware. If you
+ choose 'M' here, this module will be called vic-crypto.
diff --git a/drivers/crypto/sifive-vic/Makefile b/drivers/crypto/sifive-vic/Makefile
new file mode 100644
index 000000000000..27ac09e4fc58
--- /dev/null
+++ b/drivers/crypto/sifive-vic/Makefile
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: GPL-2.0
+obj-$(CONFIG_CRYPTO_DEV_SIFIVE_VIC_ENCRYPT) += vic-crypto.o
+vic-crypto-objs := vic-sec.o vic-aes.o vic-sha.o vic-pka.o vic-pka-tools.o
diff --git a/drivers/crypto/sifive-vic/vic-aes.c b/drivers/crypto/sifive-vic/vic-aes.c
new file mode 100644
index 000000000000..6a59a4d24033
--- /dev/null
+++ b/drivers/crypto/sifive-vic/vic-aes.c
@@ -0,0 +1,1636 @@
+/*
+ ******************************************************************************
+ * @file vic-aes.c
+ * @author StarFive Technology
+ * @version V1.0
+ * @date 08/13/2020
+ * @brief
+ ******************************************************************************
+ * @copy
+ *
+ * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, STARFIVE SHALL NOT BE HELD LIABLE FOR ANY
+ * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ *
© COPYRIGHT 2020 Shanghai StarFive Technology Co., Ltd.
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+#include "vic-sec.h"
+
+
+/* Mode mask = bits [3..0] */
+#define FLG_MODE_MASK GENMASK(3, 0)
+
+/* Bit [4] encrypt / decrypt */
+#define FLG_ENCRYPT BIT(4)
+
+/* Bit [31..16] status */
+#define FLG_CCM_PADDED_WA BIT(5)
+
+#define CR_KEY128 BIT(9)
+#define CR_KEY192 BIT(10)
+#define CR_KEY256 BIT(11)
+
+/* Registers */
+#define CRYP_CR 0x00000000
+#define CRYP_SR 0x00000004
+#define CRYP_DIN 0x00000008
+#define CRYP_DOUT 0x0000000C
+#define CRYP_DMACR 0x00000010
+#define CRYP_IMSCR 0x00000014
+#define CRYP_RISR 0x00000018
+#define CRYP_MISR 0x0000001C
+#define CRYP_K0LR 0x00000020
+#define CRYP_K0RR 0x00000024
+#define CRYP_K1LR 0x00000028
+#define CRYP_K1RR 0x0000002C
+#define CRYP_K2LR 0x00000030
+#define CRYP_K2RR 0x00000034
+#define CRYP_K3LR 0x00000038
+#define CRYP_K3RR 0x0000003C
+#define CRYP_IV0LR 0x00000040
+#define CRYP_IV0RR 0x00000044
+#define CRYP_IV1LR 0x00000048
+#define CRYP_IV1RR 0x0000004C
+#define CRYP_CSGCMCCM0R 0x00000050
+#define CRYP_CSGCM0R 0x00000070
+
+#define SR_BUSY 0x00000010
+#define SR_OFNE 0x00000004
+
+#define IMSCR_IN BIT(0)
+#define IMSCR_OUT BIT(1)
+
+#define MISR_IN BIT(0)
+#define MISR_OUT BIT(1)
+
+/* Misc */
+#define AES_BLOCK_32 (AES_BLOCK_SIZE / sizeof(u32))
+#define GCM_CTR_INIT 1
+#define _walked_in (cryp->in_walk.offset - cryp->in_sg->offset)
+#define _walked_out (cryp->out_walk.offset - cryp->out_sg->offset)
+#define CRYP_AUTOSUSPEND_DELAY 50
+
+static inline int vic_aes_wait_busy(struct vic_sec_dev *sdev)
+{
+ int ret = -1;
+
+ mutex_lock(&sdev->doing);
+ if(sdev->status.sec_done&& (!sdev->status.aes_busy))
+ ret = 0;
+ mutex_unlock(&sdev->doing);
+ return ret;
+}
+
+static inline int is_ecb(struct vic_sec_dev *cryp)
+{
+ return (cryp->flags & FLG_MODE_MASK) == VIC_AES_MODE_ECB;
+}
+
+static inline int is_cbc(struct vic_sec_dev *cryp)
+{
+ return (cryp->flags & FLG_MODE_MASK) == VIC_AES_MODE_CBC;
+}
+
+static inline int is_cmac(struct vic_sec_dev *cryp)
+{
+ return (cryp->flags & FLG_MODE_MASK) == VIC_AES_MODE_CMAC;
+}
+
+static inline int is_ofb(struct vic_sec_dev *cryp)
+{
+ return (cryp->flags & FLG_MODE_MASK) == VIC_AES_MODE_OFB;
+}
+
+static inline int is_cfb(struct vic_sec_dev *cryp)
+{
+ return (cryp->flags & FLG_MODE_MASK) == VIC_AES_MODE_CFB;
+}
+
+static inline int is_ctr(struct vic_sec_dev *cryp)
+{
+ return (cryp->flags & FLG_MODE_MASK) == VIC_AES_MODE_CTR;
+}
+
+static inline int is_gcm(struct vic_sec_dev *cryp)
+{
+ return (cryp->flags & FLG_MODE_MASK) == VIC_AES_MODE_GCM;
+}
+
+static inline int is_ccm(struct vic_sec_dev *cryp)
+{
+ return (cryp->flags & FLG_MODE_MASK) == VIC_AES_MODE_CCM;
+}
+
+static inline int get_aes_mode(struct vic_sec_dev *cryp)
+{
+ return cryp->flags & FLG_MODE_MASK;
+}
+
+static inline int is_encrypt(struct vic_sec_dev *cryp)
+{
+ return !!(cryp->flags & FLG_ENCRYPT);
+}
+
+static inline int is_decrypt(struct vic_sec_dev *cryp)
+{
+ return !is_encrypt(cryp);
+}
+
+static int vic_cryp_read_auth_tag(struct vic_sec_dev *sdev);
+
+static void vic_cryp_hw_write_iv(struct vic_sec_dev *sdev, u32 *iv)
+{
+ if (!iv)
+ return;
+ if(sdev->ctx->begin_new){
+ vic_write_n(sdev->io_base + VIC_AES_CTX_RAM_OFFSET + VIC_AES_CTX_IV_OFS, (u8 *)iv,
+ VIC_AES_IV_LEN);
+ }
+}
+
+static void vic_cryp_hw_write_ctr(struct vic_sec_dev *sdev, u32 *ctr)
+{
+ if(sdev->ctx->begin_new){
+ vic_write_n(sdev->io_base + VIC_AES_CTX_RAM_OFFSET + VIC_AES_CTX_CTR_OFS, (u8 *)ctr,
+ VIC_AES_IV_LEN);
+ }
+}
+
+static void vic_cryp_hw_write_key(struct vic_sec_dev *sdev)
+{
+ if(sdev->ctx->begin_new){
+ vic_write_n(sdev->io_base + VIC_AES_CTX_RAM_OFFSET + VIC_AES_CTX_KEYS_OFS, sdev->ctx->key,
+ sdev->ctx->keylen);
+ }
+}
+
+static unsigned int vic_cryp_get_input_text_len(struct vic_sec_dev *cryp)
+{
+ return is_encrypt(cryp) ? cryp->areq->cryptlen :
+ cryp->areq->cryptlen - cryp->authsize;
+}
+
+static int vic_cryp_gcm_init(struct vic_sec_dev *sdev, u32 cfg)
+{
+ /* Phase 1 : init */
+ memcpy(sdev->last_ctr, sdev->areq->iv, 12);
+ sdev->last_ctr[3] = cpu_to_be32(GCM_CTR_INIT);
+
+ vic_cryp_hw_write_ctr(sdev,(u32 *)sdev->last_ctr);
+ return 0;
+}
+
+static int vic_cryp_write_cryp_out(struct vic_sec_dev *sdev);
+
+static int vic_cryp_ccm_init(struct vic_sec_dev *sdev, u32 cfg)
+{
+ u8 iv[AES_BLOCK_SIZE], *b0;
+ unsigned int textlen;
+
+ /* Phase 1 : init. Firstly set the CTR value to 1 (not 0) */
+ memcpy(iv, sdev->areq->iv, AES_BLOCK_SIZE);
+ memset(iv + AES_BLOCK_SIZE - 1 - iv[0], 0, iv[0] + 1);
+ //iv[AES_BLOCK_SIZE - 1] = 1;
+
+ vic_cryp_hw_write_ctr(sdev,(u32 *)iv);
+
+ /* Build B0 */
+
+ b0 = (u8 *)sdev->data;
+ memcpy(b0, iv, AES_BLOCK_SIZE);
+
+ b0[0] |= (8 * ((sdev->authsize - 2) / 2));
+
+ if (sdev->areq->assoclen)
+ b0[0] |= 0x40;
+
+ textlen = vic_cryp_get_input_text_len(sdev);
+
+ b0[AES_BLOCK_SIZE - 2] = textlen >> 8;
+ b0[AES_BLOCK_SIZE - 1] = textlen & 0xFF;
+
+ memcpy((void *)sdev->last_ctr,sdev->data,AES_BLOCK_SIZE);
+ vic_cryp_hw_write_iv(sdev,(u32 *)b0);
+
+ return 0;
+}
+
+static int vic_cryp_hw_init(struct vic_sec_dev *cryp)
+{
+ int ret;
+ u32 cfg = cryp->rctx->mode, hw_mode;
+
+ /* Set key */
+ vic_cryp_hw_write_key(cryp);
+
+ switch (cryp->ctx->keylen) {
+ case AES_KEYSIZE_128:
+ cfg |= CR_KEY128;
+ break;
+
+ case AES_KEYSIZE_192:
+ cfg |= CR_KEY192;
+ break;
+
+ default:
+ case AES_KEYSIZE_256:
+ cfg |= CR_KEY256;
+ break;
+ }
+
+ hw_mode = get_aes_mode(cryp);
+
+ cfg |= hw_mode;
+
+ memset((void *)cryp->last_ctr, 0, sizeof(cryp->last_ctr));
+
+ switch (hw_mode) {
+ case VIC_AES_MODE_GCM:
+ case VIC_AES_MODE_CCM:
+ /* Phase 1 : init */
+ if (hw_mode == VIC_AES_MODE_CCM)
+ ret = vic_cryp_ccm_init(cryp, cfg);
+ else
+ ret = vic_cryp_gcm_init(cryp, cfg);
+
+ if (ret)
+ return ret;
+ break;
+
+ case VIC_AES_MODE_CBC:
+ case VIC_AES_MODE_CFB:
+ case VIC_AES_MODE_OFB:
+ vic_cryp_hw_write_iv(cryp, (u32 *)cryp->sreq->iv);
+ break;
+ case VIC_AES_MODE_CTR:
+ vic_cryp_hw_write_ctr(cryp, (u32 *)cryp->sreq->iv);
+ memcpy((void *)cryp->last_ctr,(void *)cryp->sreq->iv,16);
+ break;
+
+ default:
+ break;
+ }
+
+ cryp->flags |= cfg;
+
+ return 0;
+}
+
+int vic_cryp_get_from_sg(struct vic_sec_request_ctx *rctx, size_t offset,
+ size_t count,size_t data_offset)
+{
+ size_t of, ct, index;
+ struct scatterlist *sg = rctx->sg;
+
+ of = offset;
+ ct = count;
+
+ while (sg->length <= of){
+ of -= sg->length;
+
+ if (!sg_is_last(sg)){
+ sg = sg_next(sg);
+ continue;
+ } else {
+ return -EBADE;
+ }
+ }
+
+ index = data_offset;
+ while (ct > 0) {
+ if(sg->length - of >= ct) {
+ scatterwalk_map_and_copy(rctx->sdev->data + index, sg,
+ of, ct, 0);
+ index = index + ct;
+ return index - data_offset;
+ } else {
+ scatterwalk_map_and_copy(rctx->sdev->data + index, sg,
+ of, sg->length - of, 0);
+ index += sg->length - of;
+ ct = ct - (sg->length - of);
+
+ of = 0;
+ }
+ if (!sg_is_last(sg))
+ sg = sg_next(sg);
+ else
+ return -EBADE;
+ }
+ return index - data_offset;
+}
+
+static int vic_cryp_read_auth_tag(struct vic_sec_dev *sdev)
+{
+ struct vic_sec_request_ctx *rctx = sdev->rctx;
+ u32 idigest[SHA512_DIGEST_SIZE / sizeof(u32)];
+ int err = 0;
+
+ if(sdev->status.sha_busy || sdev->status.aes_busy) {
+ return -EBUSY;
+ }
+
+ vic_read_n(sdev->io_base + VIC_AES_CTX_RAM_OFFSET + VIC_AES_CTX_MAC_OFS,
+ sdev->rctx->digest,sdev->authsize);
+
+
+ if(is_cmac(sdev)) {
+ if(rctx->op & HASH_OP_FINAL) {
+ memcpy(sdev->req->result, sdev->rctx->digest, sdev->authsize);
+ } else {
+ rctx->is_load = 1;
+ }
+ } else {
+ if(is_encrypt(sdev)) {
+ sg_copy_buffer(rctx->out_sg,sg_nents(rctx->out_sg), rctx->digest,
+ sdev->authsize, rctx->offset, 0);
+ } else {
+ scatterwalk_map_and_copy(idigest,sdev->areq->src, sdev->total_in - sdev->authsize,
+ sdev->authsize, 0);
+ if (crypto_memneq(idigest, rctx->digest, sdev->authsize)) {
+ err = -EBADMSG;
+ }
+ }
+ }
+
+ return err;
+}
+
+static int vic_cryp_read_data(struct vic_sec_dev *sdev)
+{
+ struct vic_sec_request_ctx *rctx = sdev->rctx;
+ int count;
+
+ if(sdev->status.sha_busy || sdev->status.aes_busy) {
+ return -EBUSY;
+ }
+ if(rctx->bufcnt >= sdev->total_out) {
+ count = sdev->total_out;
+ } else {
+ count = rctx->bufcnt;
+ }
+
+ vic_read_n(sdev->io_base + VIC_AES_MSG_RAM_OFFSET,sdev->data,
+ count);
+
+ sg_copy_buffer(sdev->rctx->out_sg,sg_nents(sdev->rctx->out_sg), sdev->data,
+ count, rctx->offset, 0);
+
+ // sdev->total_out = sdev->total_out - count;
+
+ return 0;
+}
+
+
+static int vic_gcm_zero_message_data(struct vic_sec_dev *sdev);
+
+static int vic_cryp_finish_req(struct vic_sec_dev *sdev, int err)
+{
+ if (!err && (is_gcm(sdev) || is_ccm(sdev))) {
+ /* Phase 4 : output tag */
+ err = vic_cryp_read_auth_tag(sdev);
+ }
+
+ if (is_gcm(sdev) || is_ccm(sdev)) {
+ crypto_finalize_aead_request(sdev->engine, sdev->areq, err);
+ sdev->areq = NULL;
+ } else {
+ crypto_finalize_skcipher_request(sdev->engine, sdev->sreq,
+ err);
+ sdev->sreq = NULL;
+ }
+
+ memset(sdev->ctx->key, 0, sdev->ctx->keylen);
+
+ return err;
+}
+
+static int vic_aes_start(struct vic_sec_request_ctx *rctx)
+{
+ struct vic_sec_dev *sdev = rctx->sdev;
+ int loop, int_len = sizeof(unsigned int);
+
+ if(sdev->status.sha_busy || sdev->status.aes_busy) {
+ return -EBUSY;
+ }
+
+ for(loop = 0; loop < CFG_REGS_LEN / int_len; loop++) {
+ writel(*(rctx->aes_cfg.vs + loop), sdev->io_base + VIC_AES_CFG_REGS + loop * int_len);
+ }
+ sdev->ie.sec_done_ie = 1;
+ sdev->ie.mac_valid_ie = 1;
+
+ mutex_lock(&sdev->doing);
+ writel(sdev->ie.v, sdev->io_base + SEC_IE_REG);
+ sdev->status.aes_mac_valid = 0;
+ sdev->status.aes_busy = 1;
+ sdev->status.sec_done = 0;
+
+ rctx->aes_ctrl.aes_start = 1;
+
+ writel(rctx->aes_ctrl.v, sdev->io_base + VIC_AES_CTRL_REG);
+
+ return 0;
+}
+
+static int vic_cryp_write_assoc_out(struct vic_sec_dev *sdev)
+{
+ int ret = 0;
+ struct vic_sec_request_ctx *rctx = sdev->rctx;
+ unsigned int align_len = rctx->bufcnt % AES_BLOCK_SIZE;
+ int ap;
+
+ align_len = AES_BLOCK_SIZE - align_len;
+
+ if(is_ccm(sdev) && align_len) {
+ memset(sdev->data + rctx->bufcnt, 0, align_len);
+ rctx->bufcnt += align_len;
+ sdev->data_offset += align_len;
+ }
+
+ memset((void *)&(rctx->aes_cfg), 0, sizeof(rctx->aes_cfg));
+ memset((void *)&(rctx->aes_ctrl), 0, sizeof(rctx->aes_ctrl));
+
+ rctx->aes_cfg.authsize = sdev->authsize;
+ rctx->aes_cfg.aes_ctx_idx = 0;
+ rctx->aes_cfg.aes_blk_idx = 0;
+
+ rctx->aes_ctrl.aes_mode = get_aes_mode(sdev);
+ rctx->aes_ctrl.aes_encrypt = is_encrypt(sdev);
+ rctx->aes_ctrl.aes_key_sz = (sdev->ctx->keylen >> 3) - 2;
+ rctx->aes_ctrl.aes_str_ctx = 1;
+ rctx->aes_ctrl.aes_ret_ctx = 1;
+
+ rctx->aes_cfg.aes_assoclen = rctx->bufcnt;
+ rctx->aes_cfg.aes_n_bytes = rctx->bufcnt;
+ if (rctx->offset == 0)
+ rctx->aes_ctrl.aes_msg_begin = 1;
+ else
+ rctx->aes_ctrl.aes_msg_begin = 0;
+ ap = 0;
+ if(!is_encrypt(sdev))
+ ap = sdev->authsize;
+
+ if ((sdev->total_in - ap - rctx->assoclen == 0) &&
+ (rctx->offset + rctx->bufcnt == rctx->assoclen + sdev->data_offset)) {
+ rctx->aes_ctrl.aes_msg_end = 1;
+ rctx->aes_cfg.aes_assoclen_tot = rctx->assoclen + sdev->data_offset;
+ }
+
+ vic_write_n(sdev->io_base + VIC_AES_MSG_RAM_OFFSET, sdev->data,
+ rctx->bufcnt);
+
+ ret = vic_aes_start(rctx);
+ if (ret)
+ return ret;
+
+ if(vic_aes_wait_busy(sdev))
+ ret = -ETIMEDOUT;
+
+ return ret;
+}
+
+static int vic_cryp_write_cryp_out(struct vic_sec_dev *sdev)
+{
+ struct vic_sec_request_ctx *rctx = sdev->rctx;
+ int ret = 0;
+ int ap;
+
+ memset((void *)&(rctx->aes_cfg), 0, sizeof(rctx->aes_cfg));
+ memset((void *)&(rctx->aes_ctrl), 0, sizeof(rctx->aes_ctrl));
+
+
+ rctx->aes_cfg.authsize = sdev->authsize;
+ //if(sdev->authsize == 16)
+ // rctx->aes_cfg.authsize = 0xff;
+ rctx->aes_cfg.aes_assoclen_tot = rctx->assoclen + sdev->data_offset;
+ rctx->aes_ctrl.aes_msg_begin = rctx->assoclen ? 0 : 1;
+
+ rctx->aes_cfg.aes_ctx_idx = 0;
+ rctx->aes_cfg.aes_blk_idx = 0;
+
+ rctx->aes_cfg.aes_n_bytes = rctx->bufcnt;
+
+ rctx->aes_ctrl.aes_mode = get_aes_mode(sdev);
+ rctx->aes_ctrl.aes_encrypt = is_encrypt(sdev);
+ rctx->aes_ctrl.aes_key_sz = (sdev->ctx->keylen >> 3) - 2;
+
+ rctx->aes_ctrl.aes_str_ctx = 1;
+ rctx->aes_ctrl.aes_ret_ctx = 1;
+
+ rctx->aes_cfg.aes_tot_n_bytes = sdev->total_in - rctx->assoclen;
+
+ ap = 0;
+ if(!is_encrypt(sdev)) {
+ rctx->aes_cfg.aes_tot_n_bytes -= sdev->authsize;
+ ap = sdev->authsize;
+ }
+
+ if (rctx->offset + rctx->bufcnt + ap == sdev->total_in) {
+ rctx->aes_ctrl.aes_msg_end = 1;
+ } else {
+ rctx->aes_ctrl.aes_msg_end = 0;
+ }
+ if(is_cmac(sdev)) {
+ if(rctx->is_load) {
+ rctx->aes_ctrl.aes_msg_begin = 0;
+ vic_write_n(sdev->io_base + VIC_AES_CTX_RAM_OFFSET + VIC_AES_CTX_MAC_OFS,
+ rctx->digest,sdev->authsize);
+ rctx->is_load = 0;
+ }
+ }
+ if(rctx->aes_ctrl.aes_msg_begin){
+ if(rctx->sdev->ctx->begin_new){
+ rctx->sdev->ctx->begin_new = 0;
+ }
+ }
+ vic_write_n(sdev->io_base + VIC_AES_MSG_RAM_OFFSET, sdev->data,
+ rctx->bufcnt);
+ // vic_write_n(sdev->io_base + VIC_AES_MSG_RAM_OFFSET, sdev->data,
+ // rctx->bufcnt + AES_BLOCK_SIZE);
+
+ ret = vic_aes_start(rctx);
+ if (ret)
+ return ret;
+
+ if(vic_aes_wait_busy(sdev))
+ ret = -ETIMEDOUT;
+
+ if(!is_cmac(sdev))
+ ret = vic_cryp_read_data(sdev);
+
+ return ret;
+}
+
+static bool vic_check_counter_overflow(struct vic_sec_dev *sdev, size_t count)
+{
+ struct vic_sec_request_ctx *rctx = sdev->rctx;
+ bool ret = false;
+ u32 start, end, ctr, blocks;
+
+ if(count) {
+ blocks = DIV_ROUND_UP(count, AES_BLOCK_SIZE);
+ sdev->last_ctr[3] = cpu_to_be32(be32_to_cpu(sdev->last_ctr[3]) + blocks);
+
+ if(sdev->last_ctr[3] == 0){
+ sdev->last_ctr[2] = cpu_to_be32(be32_to_cpu(sdev->last_ctr[2]) + 1);
+ if (sdev->last_ctr[2] == 0){
+ sdev->last_ctr[1] = cpu_to_be32(be32_to_cpu(sdev->last_ctr[1]) + 1);
+ if (sdev->last_ctr[1] == 0){
+ sdev->last_ctr[0] = cpu_to_be32(be32_to_cpu(sdev->last_ctr[0]) + 1);
+ if (sdev->last_ctr[1] == 0) {
+ vic_cryp_hw_write_ctr(sdev, (u32 *)sdev->last_ctr);
+ }
+ }
+ }
+ }
+ }
+
+ /* ctr counter overflow. */
+ ctr = sdev->total_in - rctx->assoclen - sdev->authsize;
+ blocks = DIV_ROUND_UP(ctr, AES_BLOCK_SIZE);
+ start = be32_to_cpu(sdev->last_ctr[3]);
+
+ end = start + blocks - 1;
+ if (end < start) {
+ sdev->ctr_over_count = AES_BLOCK_SIZE * -start;
+ ret = true;
+ }
+
+ return ret;
+}
+
+static int vic_cryp_write_data(struct vic_sec_dev *sdev)
+{
+ struct vic_sec_request_ctx *rctx = sdev->rctx;
+ size_t data_len, total, count, data_buf_len;
+ int ret;
+ bool fragmented = false;
+ u32 data_offset;
+
+ if (unlikely(!sdev->total_in)) {
+ dev_warn(sdev->dev, "No more data to process\n");
+ return -EINVAL;
+ }
+
+ /* ctr counter overflow. */
+ fragmented = vic_check_counter_overflow(sdev, 0);
+
+ total = 0;
+ rctx->offset = 0;
+ sdev->data_offset = 0;
+
+ if(is_ccm(sdev)){
+ int index = AES_BLOCK_SIZE;
+ if(rctx->assoclen <= 65280) {
+
+ ((u8 *)sdev->data)[index] = (rctx->assoclen >> 8) & 0xff;
+ ((u8 *)sdev->data)[index + 1] = rctx->assoclen & 0xff;
+ sdev->data_offset = index + 2;
+ } else {
+ ((u8 *)sdev->data)[index] = 0xff;
+ ((u8 *)sdev->data)[index + 1] = 0xfe;
+ ((u8 *)sdev->data)[index + 2] = rctx->assoclen & 0xFF000000;
+ ((u8 *)sdev->data)[index + 3] = rctx->assoclen & 0x00FF0000;
+ ((u8 *)sdev->data)[index + 4] = rctx->assoclen & 0x0000FF00;
+ ((u8 *)sdev->data)[index + 5] = rctx->assoclen & 0x000000FF;
+ sdev->data_offset = index + 6;
+ }
+ }
+ data_offset = sdev->data_offset;
+ while(total < rctx->assoclen) {
+ data_buf_len = sdev->data_buf_len - (sdev->data_buf_len % sdev->ctx->keylen) - data_offset;
+ count = min (rctx->assoclen - rctx->offset, data_buf_len);
+ count = min (count, rctx->assoclen - total);
+ data_len = vic_cryp_get_from_sg(rctx, rctx->offset, count, data_offset);
+ if(data_len < 0)
+ return data_len;
+ if(data_len != count) {
+ return -EINVAL;
+ }
+
+ rctx->bufcnt = data_len + data_offset;
+
+ total += data_len;
+ ret = vic_cryp_write_assoc_out(sdev);
+ if(ret)
+ return ret;
+ data_offset = 0;
+ rctx->offset += data_len;
+ }
+
+ total = 0;
+
+ while(total < sdev->total_in - rctx->assoclen) {
+ data_buf_len = sdev->data_buf_len - (sdev->data_buf_len % sdev->ctx->keylen) - data_offset;
+ count = min (sdev->total_in - rctx->offset, data_buf_len);
+ count = min (count, sdev->total_in - rctx->assoclen - total);
+
+ /* ctr counter overflow. */
+ if(fragmented && sdev->ctr_over_count != 0) {
+ if (count >= sdev->ctr_over_count) {
+ count = sdev->ctr_over_count;
+ }
+ }
+
+ data_len = vic_cryp_get_from_sg(rctx, rctx->offset, count,data_offset);
+ if(data_len < 0)
+ return data_len;
+ if(data_len != count) {
+ return -EINVAL;
+ }
+
+ rctx->bufcnt = data_len;
+ total += data_len;
+
+ if(!is_encrypt(sdev) && (total + rctx->assoclen >= sdev->total_in))
+ rctx->bufcnt = rctx->bufcnt - sdev->authsize;
+
+ if(rctx->bufcnt) {
+ ret = vic_cryp_write_cryp_out(sdev);
+ if(ret)
+ return ret;
+ }
+ rctx->offset += data_len;
+
+ fragmented = vic_check_counter_overflow(sdev, data_len);
+ }
+
+ return 0;
+}
+
+static int vic_cmac_write_data(struct vic_sec_dev *sdev)
+{
+ struct vic_sec_request_ctx *rctx = sdev->rctx;
+ size_t data_len, count, data_buf_len;
+
+ int ret;
+
+ if(!sdev->total_in) {
+ sdev->rctx->bufcnt = 0;
+ sdev->rctx->offset = 0;
+ ret = vic_cryp_write_cryp_out(sdev);
+ if(ret)
+ return ret;
+ }
+
+ while(rctx->total < sdev->total_in) {
+ data_buf_len = sdev->data_buf_len - (sdev->data_buf_len % sdev->ctx->keylen) - sdev->data_offset;
+ count = min (sdev->total_in - rctx->offset, data_buf_len);
+ count = min (count, sdev->total_in - rctx->total);
+
+ if(rctx->op == HASH_OP_UPDATE) {
+ if((count > sdev->ctx->keylen) && (count % sdev->ctx->keylen)) {
+ count = count - count % sdev->ctx->keylen;
+ }
+ }
+
+ data_len = vic_cryp_get_from_sg(rctx, rctx->offset, count, sdev->data_offset);
+ if(data_len < 0)
+ return data_len;
+ if(data_len != count) {
+ return -EINVAL;
+ }
+
+ rctx->bufcnt = data_len + sdev->data_offset;
+ rctx->total += data_len;
+
+ if((rctx->op == HASH_OP_UPDATE) &&
+ (data_len < sdev->ctx->keylen)) {
+ sdev->data_offset = data_len;
+ } else {
+ ret = vic_cryp_write_cryp_out(sdev);
+ if(ret)
+ return ret;
+ rctx->offset += data_len;
+ }
+ }
+
+ if(sdev->data_offset && (rctx->op & HASH_OP_FINAL)) {
+ ret = vic_cryp_write_cryp_out(sdev);
+ if(ret)
+ return ret;
+ rctx->offset += sdev->data_offset;
+ }
+
+ return 0;
+}
+
+static int vic_gcm_zero_message_data(struct vic_sec_dev *sdev)
+{
+ int ret;
+
+ sdev->rctx->bufcnt = 0;
+ sdev->rctx->offset = 0;
+ ret = vic_cryp_write_cryp_out(sdev);
+
+ if(ret)
+ return ret;
+
+ return 0;
+}
+
+static int vic_cryp_cpu_start(struct vic_sec_dev *sdev, struct vic_sec_request_ctx *rctx)
+{
+ int ret;
+
+ ret = vic_cryp_write_data(sdev);
+ if(ret)
+ return ret;
+
+ ret = vic_cryp_finish_req(sdev,ret);
+
+ return ret;
+}
+
+static int vic_cryp_cipher_one_req(struct crypto_engine *engine, void *areq);
+static int vic_cryp_prepare_cipher_req(struct crypto_engine *engine,
+ void *areq);
+
+static int vic_cryp_cra_init(struct crypto_skcipher *tfm)
+{
+ struct vic_sec_ctx *ctx = crypto_skcipher_ctx(tfm);
+
+ ctx->sdev = vic_sec_find_dev(ctx);
+ if (!ctx->sdev)
+ return -ENODEV;
+
+ mutex_lock(&ctx->sdev->lock);
+ vic_clk_enable(ctx->sdev,AES_CLK);
+
+ crypto_skcipher_set_reqsize(tfm, sizeof(struct vic_sec_request_ctx));
+
+ ctx->begin_new = 1;
+ ctx->enginectx.op.do_one_request = vic_cryp_cipher_one_req;
+ ctx->enginectx.op.prepare_request = vic_cryp_prepare_cipher_req;
+ ctx->enginectx.op.unprepare_request = NULL;
+ return 0;
+}
+
+static void vic_cryp_cra_exit(struct crypto_skcipher *tfm)
+{
+ struct vic_sec_ctx *ctx = crypto_skcipher_ctx(tfm);
+
+ ctx->begin_new = 0;
+ ctx->enginectx.op.do_one_request = NULL;
+ ctx->enginectx.op.prepare_request = NULL;
+ ctx->enginectx.op.unprepare_request = NULL;
+
+ vic_clk_disable(ctx->sdev,AES_CLK);
+ mutex_unlock(&ctx->sdev->lock);
+}
+
+static int vic_cryp_aead_one_req(struct crypto_engine *engine, void *areq);
+static int vic_cryp_prepare_aead_req(struct crypto_engine *engine,
+ void *areq);
+
+static int vic_cryp_aes_aead_init(struct crypto_aead *tfm)
+{
+ struct vic_sec_ctx *ctx = crypto_aead_ctx(tfm);
+
+ ctx->sdev = vic_sec_find_dev(ctx);
+
+ if (!ctx->sdev)
+ return -ENODEV;
+
+ mutex_lock(&ctx->sdev->lock);
+ vic_clk_enable(ctx->sdev,AES_CLK);
+
+ tfm->reqsize = sizeof(struct vic_sec_request_ctx);
+
+ ctx->begin_new = 1;
+ ctx->enginectx.op.do_one_request = vic_cryp_aead_one_req;
+ ctx->enginectx.op.prepare_request = vic_cryp_prepare_aead_req;
+ ctx->enginectx.op.unprepare_request = NULL;
+
+ return 0;
+}
+
+static void vic_cryp_aes_aead_exit(struct crypto_aead *tfm)
+{
+ struct vic_sec_ctx *ctx = crypto_aead_ctx(tfm);
+
+ ctx->begin_new = 0;
+ ctx->enginectx.op.do_one_request = NULL;
+ ctx->enginectx.op.prepare_request = NULL;
+ ctx->enginectx.op.unprepare_request = NULL;
+
+ vic_clk_disable(ctx->sdev,AES_CLK);
+ mutex_unlock(&ctx->sdev->lock);
+}
+
+static int vic_cryp_crypt(struct skcipher_request *req, unsigned long mode)
+{
+ struct vic_sec_ctx *ctx = crypto_skcipher_ctx(
+ crypto_skcipher_reqtfm(req));
+ struct vic_sec_request_ctx *rctx = skcipher_request_ctx(req);
+ struct vic_sec_dev *sdev = ctx->sdev;
+
+ if (!sdev)
+ return -ENODEV;
+
+ rctx->mode = mode;
+ rctx->req_type = AES_ABLK;
+
+ return crypto_transfer_skcipher_request_to_engine(sdev->engine, req);
+}
+
+static int vic_cryp_aead_crypt(struct aead_request *req, unsigned long mode)
+{
+ struct vic_sec_ctx *ctx = crypto_aead_ctx(crypto_aead_reqtfm(req));
+ struct vic_sec_request_ctx *rctx = aead_request_ctx(req);
+ struct vic_sec_dev *cryp = ctx->sdev;
+
+ if (!cryp)
+ return -ENODEV;
+
+ rctx->mode = mode;
+ rctx->req_type = AES_AEAD;
+
+ return crypto_transfer_aead_request_to_engine(cryp->engine, req);
+}
+
+static int vic_cryp_setkey(struct crypto_skcipher *tfm, const u8 *key,
+ unsigned int keylen)
+{
+ struct vic_sec_ctx *ctx = crypto_skcipher_ctx(tfm);
+
+ memcpy(ctx->key, key, keylen);
+ ctx->keylen = keylen;
+
+ return 0;
+}
+
+static int vic_cryp_aes_setkey(struct crypto_skcipher *tfm, const u8 *key,
+ unsigned int keylen)
+{
+ if (keylen != AES_KEYSIZE_128 && keylen != AES_KEYSIZE_192 &&
+ keylen != AES_KEYSIZE_256)
+ return -EINVAL;
+ else
+ return vic_cryp_setkey(tfm, key, keylen);
+}
+
+static int vic_cryp_aes_aead_setkey(struct crypto_aead *tfm, const u8 *key,
+ unsigned int keylen)
+{
+ struct vic_sec_ctx *ctx = crypto_aead_ctx(tfm);
+
+ if (keylen != AES_KEYSIZE_128 && keylen != AES_KEYSIZE_192 &&
+ keylen != AES_KEYSIZE_256) {
+ return -EINVAL;
+ }
+
+ memcpy(ctx->key, key, keylen);
+ ctx->keylen = keylen;
+
+ return 0;
+}
+
+static int vic_cryp_aes_gcm_setauthsize(struct crypto_aead *tfm,
+ unsigned int authsize)
+{
+ return authsize == AES_BLOCK_SIZE ? 0 : -EINVAL;
+}
+
+static int vic_cryp_aes_ccm_setauthsize(struct crypto_aead *tfm,
+ unsigned int authsize)
+{
+ switch (authsize) {
+ case 4:
+ case 6:
+ case 8:
+ case 10:
+ case 12:
+ case 14:
+ case 16:
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int vic_cryp_aes_ecb_encrypt(struct skcipher_request *req)
+{
+ return vic_cryp_crypt(req, VIC_AES_MODE_ECB | FLG_ENCRYPT);
+}
+
+static int vic_cryp_aes_ecb_decrypt(struct skcipher_request *req)
+{
+ return vic_cryp_crypt(req, VIC_AES_MODE_ECB);
+}
+
+static int vic_cryp_aes_cbc_encrypt(struct skcipher_request *req)
+{
+ return vic_cryp_crypt(req, VIC_AES_MODE_CBC | FLG_ENCRYPT);
+}
+
+static int vic_cryp_aes_cbc_decrypt(struct skcipher_request *req)
+{
+ return vic_cryp_crypt(req, VIC_AES_MODE_CBC);
+}
+
+static int vic_cryp_aes_cfb_encrypt(struct skcipher_request *req)
+{
+ return vic_cryp_crypt(req, VIC_AES_MODE_CFB | FLG_ENCRYPT);
+}
+
+static int vic_cryp_aes_cfb_decrypt(struct skcipher_request *req)
+{
+ return vic_cryp_crypt(req, VIC_AES_MODE_CFB);
+}
+
+static int vic_cryp_aes_ofb_encrypt(struct skcipher_request *req)
+{
+ return vic_cryp_crypt(req, VIC_AES_MODE_OFB | FLG_ENCRYPT);
+}
+
+static int vic_cryp_aes_ofb_decrypt(struct skcipher_request *req)
+{
+ return vic_cryp_crypt(req, VIC_AES_MODE_OFB);
+}
+
+static int vic_cryp_aes_ctr_encrypt(struct skcipher_request *req)
+{
+ return vic_cryp_crypt(req, VIC_AES_MODE_CTR | FLG_ENCRYPT);
+}
+
+static int vic_cryp_aes_ctr_decrypt(struct skcipher_request *req)
+{
+ return vic_cryp_crypt(req, VIC_AES_MODE_CTR);
+}
+
+static int vic_cryp_aes_gcm_encrypt(struct aead_request *req)
+{
+ return vic_cryp_aead_crypt(req, VIC_AES_MODE_GCM | FLG_ENCRYPT);
+}
+
+static int vic_cryp_aes_gcm_decrypt(struct aead_request *req)
+{
+ return vic_cryp_aead_crypt(req, VIC_AES_MODE_GCM);
+}
+
+static int vic_cryp_aes_ccm_encrypt(struct aead_request *req)
+{
+ return vic_cryp_aead_crypt(req, VIC_AES_MODE_CCM | FLG_ENCRYPT);
+}
+
+static int vic_cryp_aes_ccm_decrypt(struct aead_request *req)
+{
+ return vic_cryp_aead_crypt(req, VIC_AES_MODE_CCM);
+}
+
+static int vic_cryp_prepare_req(struct skcipher_request *req,
+ struct aead_request *areq)
+{
+ struct vic_sec_ctx *ctx;
+ struct vic_sec_dev *sdev;
+ struct vic_sec_request_ctx *rctx;
+ int ret;
+
+ if (!req && !areq)
+ return -EINVAL;
+
+ ctx = req ? crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)) :
+ crypto_aead_ctx(crypto_aead_reqtfm(areq));
+
+ sdev = ctx->sdev;
+
+ if (!sdev)
+ return -ENODEV;
+ if(is_ccm(sdev)){
+ if(!areq->assoclen) {
+ dev_info(sdev->dev, "AES CCM input assoclen can not be 0\n");
+ return -EINVAL;
+ }
+ }
+
+ rctx = req ? skcipher_request_ctx(req) : aead_request_ctx(areq);
+
+ rctx->sdev = sdev;
+ ctx->sdev = sdev;
+
+ sdev->flags = rctx->mode;
+ sdev->ctx = ctx;
+ sdev->rctx = rctx;
+
+ if (req) {
+ sdev->sreq = req;
+ sdev->areq = NULL;
+ sdev->total_in = req->cryptlen;
+ sdev->total_out = sdev->total_in;
+ sdev->authsize = 0;
+ rctx->assoclen = 0;
+ } else {
+ /*
+ * Length of input and output data:
+ * Encryption case:
+ * INPUT = AssocData || PlainText
+ * <- assoclen -> <- cryptlen ->
+ * <------- total_in ----------->
+ *
+ * OUTPUT = AssocData || CipherText || AuthTag
+ * <- assoclen -> <- cryptlen -> <- authsize ->
+ * <---------------- total_out ----------------->
+ *
+ * Decryption case:
+ * INPUT = AssocData || CipherText || AuthTag
+ * <- assoclen -> <--------- cryptlen --------->
+ * <- authsize ->
+ * <---------------- total_in ------------------>
+ *
+ * OUTPUT = AssocData || PlainText
+ * <- assoclen -> <- crypten - authsize ->
+ * <---------- total_out ----------------->
+ */
+ sdev->sreq = NULL;
+ sdev->areq = areq;
+ sdev->authsize = crypto_aead_authsize(crypto_aead_reqtfm(areq));
+ sdev->total_in = areq->assoclen + areq->cryptlen;
+ rctx->assoclen = areq->assoclen;
+ if (is_encrypt(sdev))
+ /* Append auth tag to output */
+ sdev->total_out = sdev->total_in + sdev->authsize;
+ else
+ /* No auth tag in output */
+ sdev->total_out = sdev->total_in - sdev->authsize;
+ }
+
+ rctx->sg = req ? req->src : areq->src;
+ rctx->out_sg = req ? req->dst : areq->dst;
+
+ sdev->in_sg_len = sg_nents_for_len(rctx->sg, sdev->total_in);
+ if (sdev->in_sg_len < 0) {
+ dev_err(sdev->dev, "Cannot get in_sg_len\n");
+ ret = sdev->in_sg_len;
+ goto out;
+ }
+
+ sdev->out_sg_len = sg_nents_for_len(rctx->out_sg, sdev->total_out);
+ if (sdev->out_sg_len < 0) {
+ dev_err(sdev->dev, "Cannot get out_sg_len\n");
+ ret = sdev->out_sg_len;
+ goto out;
+ }
+#if 0
+ if (is_gcm(sdev) || is_ccm(sdev)) {
+ /* In output, jump after assoc data */
+ sdev->total_out -= sdev->areq->assoclen;
+ }
+#endif
+ ret = vic_cryp_hw_init(sdev);
+
+out:
+
+ return ret;
+}
+
+static int vic_cryp_prepare_cipher_req(struct crypto_engine *engine,
+ void *areq)
+{
+ struct skcipher_request *req = container_of(areq,
+ struct skcipher_request,
+ base);
+
+ return vic_cryp_prepare_req(req, NULL);
+}
+
+static int vic_cryp_cipher_one_req(struct crypto_engine *engine, void *areq)
+{
+ struct skcipher_request *req = container_of(areq,
+ struct skcipher_request,
+ base);
+ struct vic_sec_request_ctx *rctx = skcipher_request_ctx(req);
+ struct vic_sec_ctx *ctx = crypto_skcipher_ctx(
+ crypto_skcipher_reqtfm(req));
+ struct vic_sec_dev *cryp = ctx->sdev;
+
+ if (!cryp)
+ return -ENODEV;
+
+ return vic_cryp_cpu_start(cryp,rctx);
+}
+
+static int vic_cryp_prepare_aead_req(struct crypto_engine *engine, void *areq)
+{
+ struct aead_request *req = container_of(areq, struct aead_request,
+ base);
+
+ return vic_cryp_prepare_req(NULL, req);
+}
+
+static int vic_cryp_aead_one_req(struct crypto_engine *engine, void *areq)
+{
+ struct aead_request *req = container_of(areq, struct aead_request,
+ base);
+ struct vic_sec_request_ctx *rctx = aead_request_ctx(req);
+ struct vic_sec_ctx *ctx = crypto_aead_ctx(crypto_aead_reqtfm(req));
+ struct vic_sec_dev *sdev = ctx->sdev;
+
+ if (!sdev)
+ return -ENODEV;
+
+ if (unlikely(!sdev->areq->assoclen &&
+ !vic_cryp_get_input_text_len(sdev))) {
+ /* No input data to process: get tag and finish */
+ vic_gcm_zero_message_data(sdev);
+ vic_cryp_finish_req(sdev, 0);
+ return 0;
+ }
+
+ return vic_cryp_cpu_start(sdev, rctx);
+}
+
+static int vic_cryp_prepare_cmac_req(struct crypto_engine *engine,
+ void *areq)
+{
+ struct ahash_request *req = container_of(areq, struct ahash_request,
+ base);
+ struct vic_sec_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
+ struct vic_sec_dev *sdev;
+ struct vic_sec_request_ctx *rctx;
+ int ret;
+
+ sdev = ctx->sdev;
+
+ if (!sdev)
+ return -ENODEV;
+
+ rctx = ahash_request_ctx(req);
+
+ rctx->sdev = sdev;
+ ctx->sdev = sdev;
+
+ sdev->flags = rctx->mode;
+ sdev->ctx = ctx;
+ sdev->rctx = rctx;
+
+ sdev->req = req;
+ sdev->total_in = req->nbytes;
+ sdev->authsize = AES_BLOCK_SIZE;
+ rctx->assoclen = 0;
+
+ //rctx->sg = req->src;
+
+ ret = vic_cryp_hw_init(sdev);
+
+ return ret;
+}
+
+static int vic_cryp_cmac_one_req(struct crypto_engine *engine, void *areq)
+{
+ struct ahash_request *req = container_of(areq, struct ahash_request,
+ base);
+ struct vic_sec_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
+ struct vic_sec_dev *sdev = ctx->sdev;
+ int ret;
+
+ if (!sdev)
+ return -ENODEV;
+
+ ret = vic_cmac_write_data(sdev);
+
+ if(ret)
+ return ret;
+
+ ret = vic_cryp_read_auth_tag(sdev);
+
+ crypto_finalize_hash_request(sdev->engine, sdev->req, ret);
+ sdev->req = NULL;
+
+
+ return ret;
+}
+
+static int vic_cryp_aes_cmac_init(struct crypto_tfm *tfm)
+{
+ struct vic_sec_ctx *ctx = crypto_tfm_ctx(tfm);
+
+ ctx->sdev = vic_sec_find_dev(ctx);
+
+ if (!ctx->sdev)
+ return -ENODEV;
+
+ mutex_lock(&ctx->sdev->lock);
+ vic_clk_enable(ctx->sdev,AES_CLK);
+
+ crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
+ sizeof(struct vic_sec_request_ctx));
+
+ ctx->begin_new = 1;
+ ctx->enginectx.op.do_one_request = vic_cryp_cmac_one_req;
+ ctx->enginectx.op.prepare_request = vic_cryp_prepare_cmac_req;
+ ctx->enginectx.op.unprepare_request = NULL;
+
+ return 0;
+}
+
+static void vic_cryp_aes_cmac_exit(struct crypto_tfm *tfm)
+{
+ struct vic_sec_ctx *ctx = crypto_tfm_ctx(tfm);
+
+ ctx->begin_new = 0;
+ ctx->enginectx.op.do_one_request = NULL;
+ ctx->enginectx.op.prepare_request = NULL;
+ ctx->enginectx.op.unprepare_request = NULL;
+
+ vic_clk_disable(ctx->sdev,AES_CLK);
+ mutex_unlock(&ctx->sdev->lock);
+}
+
+static int vic_aes_cmac_init(struct ahash_request *req)
+{
+ struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
+ struct vic_sec_ctx *ctx = crypto_ahash_ctx(tfm);
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+ struct vic_sec_dev *sdev = ctx->sdev;
+
+ if (!sdev)
+ return -ENODEV;
+
+ rctx->sdev = sdev;
+ rctx->mode = VIC_AES_MODE_CMAC | FLG_ENCRYPT;
+ rctx->req_type = AES_ABLK;
+ rctx->op = 0;
+ rctx->is_load = 0;
+ rctx->bufcnt = 0;
+ rctx->offset = 0;
+ sdev->data_offset = 0;
+
+ return 0;
+}
+static int vic_aes_cmac_update(struct ahash_request *req)
+{
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+ struct vic_sec_dev *sdev = rctx->sdev;
+
+ if (!req->nbytes)
+ return 0;
+
+ rctx->total = 0;
+ rctx->sg = req->src;
+ rctx->offset = 0;
+
+ rctx->op |= HASH_OP_UPDATE;
+
+ return crypto_transfer_hash_request_to_engine(sdev->engine, req);
+}
+
+static int vic_aes_cmac_final(struct ahash_request *req)
+{
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+ struct vic_sec_dev *sdev = rctx->sdev;
+
+ rctx->op |= HASH_OP_FINAL;
+
+ return crypto_transfer_hash_request_to_engine(sdev->engine, req);
+}
+
+static int vic_aes_cmac_finup(struct ahash_request *req)
+{
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+ int err1, err2;
+
+ rctx->op |= HASH_OP_FINAL | HASH_OP_UPDATE;
+
+ err1 = vic_aes_cmac_update(req);
+
+ if (err1 == -EINPROGRESS || err1 == -EBUSY)
+ return err1;
+
+ /*
+ * final() has to be always called to cleanup resources
+ * even if update() failed, except EINPROGRESS
+ */
+ err2 = vic_aes_cmac_final(req);
+
+ return err1 ?: err2;
+}
+
+static int vic_aes_cmac_digest(struct ahash_request *req)
+{
+ return vic_aes_cmac_init(req) ?: vic_aes_cmac_finup(req);
+}
+
+static int vic_aes_cmac_setkey(struct crypto_ahash *tfm,
+ const u8 *key, unsigned int keylen)
+{
+ struct vic_sec_ctx *ctx = crypto_ahash_ctx(tfm);
+
+
+ if (keylen != AES_KEYSIZE_128 && keylen != AES_KEYSIZE_192 &&
+ keylen != AES_KEYSIZE_256)
+ return -EINVAL;
+
+ memcpy(ctx->key, key, keylen);
+ ctx->keylen = keylen;
+
+ return 0;
+}
+
+static int vic_aes_cmac_export(struct ahash_request *req, void *out)
+{
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+ struct vic_sec_dev *sdev = rctx->sdev;
+
+ rctx->digcnt = sdev->authsize;
+
+ vic_read_n(sdev->io_base + VIC_AES_CTX_RAM_OFFSET + VIC_AES_CTX_MAC_OFS,
+ sdev->rctx->digest,rctx->digcnt);
+
+ memcpy(out, rctx, sizeof(*rctx));
+
+ return 0;
+}
+
+static int vic_aes_cmac_import(struct ahash_request *req, const void *in)
+{
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+ struct vic_sec_dev *sdev = rctx->sdev;
+
+ memcpy(rctx, in, sizeof(*rctx));
+ vic_write_n(sdev->io_base + VIC_AES_CTX_RAM_OFFSET + VIC_AES_CTX_MAC_OFS,
+ sdev->rctx->digest,rctx->digcnt);
+ sdev->authsize = rctx->digcnt;
+
+ return 0;
+}
+
+static struct ahash_alg algs_aes_cmac[] = {
+ {
+ .init = vic_aes_cmac_init,
+ .update = vic_aes_cmac_update,
+ .final = vic_aes_cmac_final,
+ .finup = vic_aes_cmac_finup,
+ .digest = vic_aes_cmac_digest,
+ .setkey = vic_aes_cmac_setkey,
+ .export = vic_aes_cmac_export,
+ .import = vic_aes_cmac_import,
+ .halg = {
+ .digestsize = AES_BLOCK_SIZE,
+ .statesize = sizeof(struct vic_sec_request_ctx),
+ .base = {
+ .cra_name = "cmac(aes)",
+ .cra_driver_name = "vic-cmac-aes",
+ .cra_priority = 200,
+ .cra_flags = CRYPTO_ALG_ASYNC |
+ CRYPTO_ALG_TYPE_AHASH,
+ .cra_blocksize = AES_BLOCK_SIZE,
+ .cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .cra_alignmask = 3,
+ .cra_init = vic_cryp_aes_cmac_init,
+ .cra_exit = vic_cryp_aes_cmac_exit,
+ .cra_module = THIS_MODULE,
+ }
+ }
+ },
+};
+
+static struct skcipher_alg crypto_algs[] = {
+{
+ .base.cra_name = "ecb(aes)",
+ .base.cra_driver_name = "vic-ecb-aes",
+ .base.cra_priority = 200,
+ .base.cra_flags = CRYPTO_ALG_ASYNC,
+ .base.cra_blocksize = AES_BLOCK_SIZE,
+ .base.cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .base.cra_alignmask = 0xf,
+ .base.cra_module = THIS_MODULE,
+ .init = vic_cryp_cra_init,
+ .exit = vic_cryp_cra_exit,
+ .min_keysize = AES_MIN_KEY_SIZE,
+ .max_keysize = AES_MAX_KEY_SIZE,
+ .setkey = vic_cryp_aes_setkey,
+ .encrypt = vic_cryp_aes_ecb_encrypt,
+ .decrypt = vic_cryp_aes_ecb_decrypt,
+},
+{
+ .base.cra_name = "cbc(aes)",
+ .base.cra_driver_name = "vic-cbc-aes",
+ .base.cra_priority = 200,
+ .base.cra_flags = CRYPTO_ALG_ASYNC,
+ .base.cra_blocksize = AES_BLOCK_SIZE,
+ .base.cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .base.cra_alignmask = 0xf,
+ .base.cra_module = THIS_MODULE,
+ .init = vic_cryp_cra_init,
+ .exit = vic_cryp_cra_exit,
+ .min_keysize = AES_MIN_KEY_SIZE,
+ .max_keysize = AES_MAX_KEY_SIZE,
+ .ivsize = AES_BLOCK_SIZE,
+ .setkey = vic_cryp_aes_setkey,
+ .encrypt = vic_cryp_aes_cbc_encrypt,
+ .decrypt = vic_cryp_aes_cbc_decrypt,
+},
+{
+ .base.cra_name = "ctr(aes)",
+ .base.cra_driver_name = "vic-ctr-aes",
+ .base.cra_priority = 200,
+ .base.cra_flags = CRYPTO_ALG_ASYNC,
+ .base.cra_blocksize = 1,
+ .base.cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .base.cra_alignmask = 0xf,
+ .base.cra_module = THIS_MODULE,
+ .init = vic_cryp_cra_init,
+ .exit = vic_cryp_cra_exit,
+ .min_keysize = AES_MIN_KEY_SIZE,
+ .max_keysize = AES_MAX_KEY_SIZE,
+ .ivsize = AES_BLOCK_SIZE,
+ .setkey = vic_cryp_aes_setkey,
+ .encrypt = vic_cryp_aes_ctr_encrypt,
+ .decrypt = vic_cryp_aes_ctr_decrypt,
+},
+{
+ .base.cra_name = "cfb(aes)",
+ .base.cra_driver_name = "vic-cfb-aes",
+ .base.cra_priority = 200,
+ .base.cra_flags = CRYPTO_ALG_ASYNC,
+ .base.cra_blocksize = AES_BLOCK_SIZE,
+ .base.cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .base.cra_alignmask = 0xf,
+ .base.cra_module = THIS_MODULE,
+ .init = vic_cryp_cra_init,
+ .exit = vic_cryp_cra_exit,
+ .min_keysize = AES_MIN_KEY_SIZE,
+ .max_keysize = AES_MAX_KEY_SIZE,
+ .ivsize = AES_BLOCK_SIZE,
+ .setkey = vic_cryp_aes_setkey,
+ .encrypt = vic_cryp_aes_cfb_encrypt,
+ .decrypt = vic_cryp_aes_cfb_decrypt,
+},
+{
+ .base.cra_name = "ofb(aes)",
+ .base.cra_driver_name = "vic-ofb-aes",
+ .base.cra_priority = 200,
+ .base.cra_flags = CRYPTO_ALG_ASYNC,
+ .base.cra_blocksize = AES_BLOCK_SIZE,
+ .base.cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .base.cra_alignmask = 0xf,
+ .base.cra_module = THIS_MODULE,
+ .init = vic_cryp_cra_init,
+ .exit = vic_cryp_cra_exit,
+ .min_keysize = AES_MIN_KEY_SIZE,
+ .max_keysize = AES_MAX_KEY_SIZE,
+ .ivsize = AES_BLOCK_SIZE,
+ .setkey = vic_cryp_aes_setkey,
+ .encrypt = vic_cryp_aes_ofb_encrypt,
+ .decrypt = vic_cryp_aes_ofb_decrypt,
+},
+};
+
+static struct aead_alg aead_algs[] = {
+#if 1
+{
+ .setkey = vic_cryp_aes_aead_setkey,
+ .setauthsize = vic_cryp_aes_gcm_setauthsize,
+ .encrypt = vic_cryp_aes_gcm_encrypt,
+ .decrypt = vic_cryp_aes_gcm_decrypt,
+ .init = vic_cryp_aes_aead_init,
+ .exit = vic_cryp_aes_aead_exit,
+ .ivsize = 12,
+ .maxauthsize = AES_BLOCK_SIZE,
+
+ .base = {
+ .cra_name = "gcm(aes)",
+ .cra_driver_name = "vic-gcm-aes",
+ .cra_priority = 200,
+ .cra_flags = CRYPTO_ALG_ASYNC,
+ .cra_blocksize = 1,
+ .cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .cra_alignmask = 0xf,
+ .cra_module = THIS_MODULE,
+ },
+},
+#endif
+{
+ .setkey = vic_cryp_aes_aead_setkey,
+ .setauthsize = vic_cryp_aes_ccm_setauthsize,
+ .encrypt = vic_cryp_aes_ccm_encrypt,
+ .decrypt = vic_cryp_aes_ccm_decrypt,
+ .init = vic_cryp_aes_aead_init,
+ .exit = vic_cryp_aes_aead_exit,
+ .ivsize = AES_BLOCK_SIZE,
+ .maxauthsize = AES_BLOCK_SIZE,
+
+ .base = {
+ .cra_name = "ccm(aes)",
+ .cra_driver_name = "vic-ccm-aes",
+ .cra_priority = 200,
+ .cra_flags = CRYPTO_ALG_ASYNC,
+ .cra_blocksize = 1,
+ .cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .cra_alignmask = 0xf,
+ .cra_module = THIS_MODULE,
+ },
+},
+};
+#if 0
+int vic_aes_register_algs(void)
+{return 0;}
+
+int vic_aes_unregister_algs(void)
+{return 0;}
+#else
+int vic_aes_register_algs(void)
+{
+ int ret;
+#if 1
+ ret = crypto_register_ahashes(algs_aes_cmac, ARRAY_SIZE(algs_aes_cmac));
+ if (ret) {
+ printk("Could not register algs_aes_cmac\n");
+ goto err_hash;
+ }
+
+ ret = crypto_register_skciphers(crypto_algs, ARRAY_SIZE(crypto_algs));
+ if (ret) {
+ printk("Could not register algs\n");
+ goto err_algs;
+ }
+#endif
+ ret = crypto_register_aeads(aead_algs, ARRAY_SIZE(aead_algs));
+ if (ret)
+ goto err_aead_algs;
+
+ return 0;
+
+err_aead_algs:
+ crypto_unregister_skciphers(crypto_algs, ARRAY_SIZE(crypto_algs));
+err_algs:
+ crypto_unregister_ahashes(algs_aes_cmac, ARRAY_SIZE(algs_aes_cmac));
+err_hash:
+ return ret;
+}
+
+int vic_aes_unregister_algs(void)
+{
+
+ crypto_unregister_aeads(aead_algs, ARRAY_SIZE(aead_algs));
+#if 1
+ crypto_unregister_skciphers(crypto_algs, ARRAY_SIZE(crypto_algs));
+
+ crypto_unregister_ahashes(algs_aes_cmac, ARRAY_SIZE(algs_aes_cmac));
+#endif
+ return 0;
+}
+#endif
diff --git a/drivers/crypto/sifive-vic/vic-pka-hw.h b/drivers/crypto/sifive-vic/vic-pka-hw.h
new file mode 100644
index 000000000000..b6b420bf0e44
--- /dev/null
+++ b/drivers/crypto/sifive-vic/vic-pka-hw.h
@@ -0,0 +1,1671 @@
+// ------------------------------------------------------------------------
+//
+// (C) COPYRIGHT 2011 - 2015 SYNOPSYS, INC.
+// ALL RIGHTS RESERVED
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// version 2 as published by the Free Software Foundation.
+//
+// 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, see .
+//
+// ------------------------------------------------------------------------
+
+#ifndef __VIC_PKA_HW_H__
+#define __VIC_PKA_HW_H__
+
+/* Control/status registers */
+enum {
+ PKA_CTRL = 0,
+ PKA_ENTRY,
+ PKA_RC,
+ PKA_BUILD_CONF,
+ PKA_F_STACK,
+ PKA_INST_SINCE_GO,
+ PKA_P_STACK,
+ PKA_CONF,
+ PKA_STATUS,
+ PKA_FLAGS,
+ PKA_WATCHDOG,
+ PKA_CYCLES_SINCE_GO,
+ PKA_INDEX_I,
+ PKA_INDEX_J,
+ PKA_INDEX_K,
+ PKA_INDEX_L,
+ PKA_IRQ_EN,
+ PKA_DTA_JUMP,
+ PKA_LFSR_SEED,
+
+ PKA_BANK_SWITCH_A = 20,
+ PKA_BANK_SWITCH_B,
+ PKA_BANK_SWITCH_C,
+ PKA_BANK_SWITCH_D,
+
+ PKA_OPERAND_A_BASE = 0x100,
+ PKA_OPERAND_B_BASE = 0x200,
+ PKA_OPERAND_C_BASE = 0x300,
+ PKA_OPERAND_D_BASE = 0x400,
+
+ /* F/W base for old cores */
+ PKA_FIRMWARE_BASE = 0x800,
+
+ /* F/W base for new ("type 2") cores, with fixed RAM/ROM split offset */
+ PKA_FIRMWARE_T2_BASE = 0x1000,
+ PKA_FIRMWARE_T2_SPLIT = 0x1800
+};
+
+#define PKA_MAX_OPERAND_SIZE 512 /* 4096 bits */
+#define PKA_ECC521_OPERAND_SIZE 66 /* 528 bits */
+#define PKA_OPERAND_BANK_SIZE 0x400
+
+#define PKA_CTRL_GO 31
+#define PKA_CTRL_STOP_RQST 27
+#define PKA_CTRL_M521_MODE 16
+#define PKA_CTRL_M521_MODE_BITS 5
+#define PKA_CTRL_BASE_RADIX 8
+#define PKA_CTRL_BASE_RADIX_BITS 3
+#define PKA_CTRL_PARTIAL_RADIX 0
+#define PKA_CTRL_PARTIAL_RADIX_BITS 8
+
+#define PKA_CTRL_M521_ECC521 9
+
+#define PKA_RC_BUSY 31
+#define PKA_RC_IRQ 30
+#define PKA_RC_WR_PENDING 29
+#define PKA_RC_ZERO 28
+#define PKA_RC_REASON 16
+#define PKA_RC_REASON_BITS 8
+
+#define PKA_BC_FORMAT_TYPE 30
+#define PKA_BC_FORMAT_TYPE_BITS 2
+
+/*
+ * Bit fields for BUILD_CONF format type 1 (H/W version >= 1.13)
+ * Note that format type 2 (H/W version >= 1.17) has the same layout.
+ */
+#define PKA_BC1_ALU_SZ 19
+#define PKA_BC1_ALU_SZ_BITS 2
+#define PKA_BC1_RSA_SZ 16
+#define PKA_BC1_RSA_SZ_BITS 3
+#define PKA_BC1_ECC_SZ 14
+#define PKA_BC1_ECC_SZ_BITS 2
+#define PKA_BC1_FW_ROM_SZ 11
+#define PKA_BC1_FW_ROM_SZ_BITS 3
+#define PKA_BC1_FW_RAM_SZ 8
+#define PKA_BC1_FW_RAM_SZ_BITS 3
+#define PKA_BC1_BANK_SW_D 6
+#define PKA_BC1_BANK_SW_D_BITS 2
+#define PKA_BC1_BANK_SW_C 4
+#define PKA_BC1_BANK_SW_C_BITS 2
+#define PKA_BC1_BANK_SW_B 2
+#define PKA_BC1_BANK_SW_B_BITS 2
+#define PKA_BC1_BANK_SW_A 0
+#define PKA_BC1_BANK_SW_A_BITS 2
+
+/* Enumerations for the FW_RAM and FW_ROM fields in format type 1. */
+enum {
+ PKA_BC1_FW_SZ_0,
+ PKA_BC1_FW_SZ_256,
+ PKA_BC1_FW_SZ_512,
+ PKA_BC1_FW_SZ_1024,
+ PKA_BC1_FW_SZ_2048,
+};
+
+/* Bit fields for BUILD_CONF format type 0 (H/W version <= 1.12) */
+#define PKA_BC_ALU_SZ 19
+#define PKA_BC_ALU_SZ_BITS 2
+#define PKA_BC_RSA_SZ 16
+#define PKA_BC_RSA_SZ_BITS 3
+#define PKA_BC_ECC_SZ 14
+#define PKA_BC_ECC_SZ_BITS 2
+#define PKA_BC_FW_HAS_ROM 13
+#define PKA_BC_FW_HAS_RAM 12
+#define PKA_BC_FW_ROM_SZ 10
+#define PKA_BC_FW_ROM_SZ_BITS 2
+#define PKA_BC_FW_RAM_SZ 8
+#define PKA_BC_FW_RAM_SZ_BITS 2
+#define PKA_BC_BANK_SW_D 6
+#define PKA_BC_BANK_SW_D_SZ 2
+#define PKA_BC_BANK_SW_C 4
+#define PKA_BC_BANK_SW_C_SZ 2
+#define PKA_BC_BANK_SW_B 2
+#define PKA_BC_BANK_SW_B_SZ 2
+#define PKA_BC_BANK_SW_A 0
+#define PKA_BC_BANK_SW_A_SZ 2
+
+/* Enumerations for the FW_RAM and FW_ROM fields in format type 0. */
+enum {
+ PKA_FW_SZ_256,
+ PKA_FW_SZ_512,
+ PKA_FW_SZ_1024,
+ PKA_FW_SZ_2048,
+};
+
+#define PKA_STAT_IRQ 30
+
+#define PKA_IRQ_EN_STAT 30
+
+#define PKA_FLAG_ZERO 0
+#define PKA_FLAG_MEMBIT 1
+#define PKA_FLAG_BORROW 2
+#define PKA_FLAG_CARRY 3
+#define PKA_FLAG_F0 4
+#define PKA_FLAG_F1 5
+#define PKA_FLAG_F2 6
+#define PKA_FLAG_F3 7
+
+#define PKA_CONF_BYTESWAP 26
+
+#define PKA_DTA_JUMP_PROBABILITY 0
+#define PKA_DTA_JUMP_PROBABILITY_BITS 13
+
+// from clp300_ram_fw.hex
+static const u32 PKA_FW[] = {
+ 0xf8000009,
+ 0xf8eb4d8a,
+ 0xf8f93bc3,
+ 0xf869f0f1,
+ 0xf8a38aaa,
+ 0xf8fe215f,
+ 0xf80828f0,
+ 0xf80000fc,
+ 0xf80005d1,
+ 0x000000ff,
+ 0x2000002b,
+ 0x2000002d,
+ 0x2000002f,
+ 0x20000031,
+ 0x20000033,
+ 0x20000035,
+ 0x20000037,
+ 0x20000039,
+ 0x2000003b,
+ 0x2000003d,
+ 0x20000110,
+ 0x20000112,
+ 0x20000114,
+ 0x20000116,
+ 0x20000118,
+ 0x200001bd,
+ 0x200001bf,
+ 0x200001c1,
+ 0x200001c3,
+ 0x200001c5,
+ 0x200001c7,
+ 0x200001c9,
+ 0x200001cb,
+ 0x200001cd,
+ 0x200001cf,
+ 0x20000392,
+ 0x200003f7,
+ 0x200003f9,
+ 0x200003fb,
+ 0x200003fd,
+ 0x200003ff,
+ 0x20000401,
+ 0x20000578,
+ 0x220000a4,
+ 0x00000000,
+ 0x22000090,
+ 0x00000000,
+ 0x22000099,
+ 0x00000000,
+ 0x2200003f,
+ 0x00000000,
+ 0x22000041,
+ 0x00000000,
+ 0x220000c1,
+ 0x00000000,
+ 0x220000ee,
+ 0x00000000,
+ 0x220000e9,
+ 0x00000000,
+ 0x220000e1,
+ 0x00000000,
+ 0xc8004400,
+ 0x00000000,
+ 0x48200000,
+ 0x20000043,
+ 0x48200000,
+ 0x44000400,
+ 0x40008200,
+ 0x220000da,
+ 0x40004400,
+ 0x08c00000,
+ 0x43000680,
+ 0x4000c200,
+ 0x23c00050,
+ 0xd9004000,
+ 0x33000087,
+ 0x6b000000,
+ 0x33600058,
+ 0x41000440,
+ 0x40008800,
+ 0x6b008000,
+ 0x33600055,
+ 0x41008040,
+ 0x40000c00,
+ 0x2000004a,
+ 0xd010c040,
+ 0x41000c00,
+ 0x2000004a,
+ 0x6b004000,
+ 0x33600065,
+ 0x41004440,
+ 0x40008a00,
+ 0x6b00d000,
+ 0x33600061,
+ 0x4100d440,
+ 0x40008e80,
+ 0x2000004a,
+ 0x4000d440,
+ 0xd011c040,
+ 0x41000e80,
+ 0x2000004a,
+ 0xd8004440,
+ 0x33400076,
+ 0x41008800,
+ 0xd810d040,
+ 0x40000c00,
+ 0x3140006d,
+ 0xd010c040,
+ 0x40000c00,
+ 0x6b008000,
+ 0x33600073,
+ 0x48200000,
+ 0x41008040,
+ 0x40000c00,
+ 0x2000004a,
+ 0xd010c040,
+ 0x41000c00,
+ 0x2000004a,
+ 0xd8080440,
+ 0x41008a00,
+ 0xd81a8040,
+ 0x40000e80,
+ 0x3140007d,
+ 0xd001c440,
+ 0x40008e80,
+ 0x6b00d000,
+ 0x33600083,
+ 0x48200000,
+ 0x4100d440,
+ 0x40008e80,
+ 0x2000004a,
+ 0x4000d440,
+ 0xd011c040,
+ 0x41000e80,
+ 0x2000004a,
+ 0x24000000,
+ 0x3340008c,
+ 0xd010c240,
+ 0x40008000,
+ 0x2000008f,
+ 0xd010c000,
+ 0x40008240,
+ 0x2000008f,
+ 0x24000000,
+ 0x48400000,
+ 0x48200000,
+ 0x220000da,
+ 0xd0004400,
+ 0x220000c2,
+ 0xd800c400,
+ 0x31400094,
+ 0x20000098,
+ 0x24000000,
+ 0x48200000,
+ 0x220000da,
+ 0x220000d1,
+ 0x334000a0,
+ 0xd8188040,
+ 0x40008000,
+ 0x200000a3,
+ 0xd8188000,
+ 0x40008040,
+ 0x200000a3,
+ 0x24000000,
+ 0x40004680,
+ 0x220000ae,
+ 0x40000400,
+ 0x4000d000,
+ 0x40008680,
+ 0x220000ae,
+ 0x4000d200,
+ 0x220000b2,
+ 0x220000b1,
+ 0x24000000,
+ 0x40000200,
+ 0x4000d800,
+ 0x200000b2,
+ 0x44000200,
+ 0xc8004400,
+ 0xc910ca00,
+ 0xc808c000,
+ 0xd0008200,
+ 0xd4018a00,
+ 0x40004400,
+ 0x200000c2,
+ 0x40000200,
+ 0xca004400,
+ 0xc910ca00,
+ 0xc808c000,
+ 0xd0008200,
+ 0xd4018a00,
+ 0x40004400,
+ 0x200000c2,
+ 0x48200000,
+ 0x332000c6,
+ 0xd810c040,
+ 0x40008040,
+ 0x200000c9,
+ 0xd810c040,
+ 0x40000c00,
+ 0x200000c9,
+ 0x40008000,
+ 0xd800c400,
+ 0x334000ce,
+ 0x40008000,
+ 0x200000d0,
+ 0x40000400,
+ 0x200000d0,
+ 0x24000000,
+ 0xd8004400,
+ 0x334000d6,
+ 0xd9004000,
+ 0x48400000,
+ 0x200000d9,
+ 0xd8080400,
+ 0x49400000,
+ 0x200000d9,
+ 0x24000000,
+ 0x40000680,
+ 0x40004400,
+ 0x220000c2,
+ 0x40000200,
+ 0x48200000,
+ 0x4000d400,
+ 0x200000c2,
+ 0x08c00000,
+ 0x40008240,
+ 0x43000200,
+ 0xd808c400,
+ 0x40004800,
+ 0x22000047,
+ 0x400086c0,
+ 0x24000000,
+ 0x08c00001,
+ 0x45000000,
+ 0x44000400,
+ 0x22000047,
+ 0x24000000,
+ 0x40008680,
+ 0x43000200,
+ 0x43000640,
+ 0x43000040,
+ 0x44000000,
+ 0x4100c240,
+ 0x5180c000,
+ 0x6a804000,
+ 0x08c00000,
+ 0xd0004400,
+ 0xd4014c40,
+ 0xd91a8800,
+ 0x334000ff,
+ 0x3300010b,
+ 0x40008000,
+ 0x40008840,
+ 0x6a80c800,
+ 0x08c00001,
+ 0x6b004800,
+ 0x33600103,
+ 0x08c00000,
+ 0x41004400,
+ 0x41004c40,
+ 0x40008200,
+ 0x40008a40,
+ 0x21c00109,
+ 0x6d204000,
+ 0x11800000,
+ 0x200000f7,
+ 0x51c08000,
+ 0x310000ff,
+ 0x6a80c800,
+ 0x4000d400,
+ 0x24000000,
+ 0x2200011a,
+ 0x00000000,
+ 0x22000139,
+ 0x00000000,
+ 0x2200018f,
+ 0x00000000,
+ 0x2200014b,
+ 0x00000000,
+ 0x2200017d,
+ 0x00000000,
+ 0x220000ae,
+ 0x4000da00,
+ 0x400006c0,
+ 0x44000000,
+ 0x220000b2,
+ 0x31800123,
+ 0x09800000,
+ 0x11800000,
+ 0x20000127,
+ 0x5180d000,
+ 0x31000127,
+ 0x44000000,
+ 0x20000138,
+ 0x220000b9,
+ 0x6880d000,
+ 0x31600130,
+ 0x2000012b,
+ 0x4000da00,
+ 0x40000240,
+ 0x220000b2,
+ 0x40004840,
+ 0x20000136,
+ 0x26200136,
+ 0x4000da00,
+ 0x40000240,
+ 0x220000b2,
+ 0x40004800,
+ 0x20000136,
+ 0x28800127,
+ 0x220000b1,
+ 0x24000000,
+ 0x44000400,
+ 0x40004800,
+ 0x08c00000,
+ 0x22000047,
+ 0x400080c0,
+ 0x44000400,
+ 0xd8188040,
+ 0x40000e00,
+ 0x4000ca00,
+ 0x40004680,
+ 0x4000cc00,
+ 0x4000dc40,
+ 0x2200014b,
+ 0x44000040,
+ 0xd8090e00,
+ 0x40008240,
+ 0x4000d400,
+ 0x4000dc40,
+ 0x51808800,
+ 0x3100014f,
+ 0xd910c000,
+ 0x3340017c,
+ 0x51c08800,
+ 0x31000153,
+ 0x51a08000,
+ 0x20000155,
+ 0x09e00000,
+ 0x14bb8000,
+ 0x5180c000,
+ 0x15d60000,
+ 0x09800000,
+ 0x15930000,
+ 0x3300015b,
+ 0x31400163,
+ 0x09800000,
+ 0x159a0000,
+ 0x43000200,
+ 0x6a804000,
+ 0xc808c000,
+ 0x40000640,
+ 0x43000600,
+ 0x20000169,
+ 0x43000200,
+ 0x6ac04000,
+ 0xc808c000,
+ 0x40000600,
+ 0x40000e40,
+ 0x20000169,
+ 0x10c00000,
+ 0xd810c000,
+ 0xda11c840,
+ 0x33400170,
+ 0x40000400,
+ 0x40000c40,
+ 0x2000016a,
+ 0x48200000,
+ 0x48c00000,
+ 0x6b00c800,
+ 0x31600175,
+ 0x49c00000,
+ 0x4100c840,
+ 0x31c00178,
+ 0x49200000,
+ 0x4100c000,
+ 0x40000e40,
+ 0x40000600,
+ 0x25c0016a,
+ 0x24000000,
+ 0xd9188000,
+ 0x3140018e,
+ 0x51a08000,
+ 0x5180c000,
+ 0x15d60000,
+ 0x43000200,
+ 0x6ac04000,
+ 0xc808c000,
+ 0x40000600,
+ 0x10c00000,
+ 0xd810c000,
+ 0x3340018b,
+ 0x40000400,
+ 0x20000187,
+ 0x4100c000,
+ 0x40000600,
+ 0x25c00187,
+ 0x24000000,
+ 0x40001400,
+ 0x40001c40,
+ 0x40005600,
+ 0x2200014b,
+ 0x400087c0,
+ 0x40001400,
+ 0x40001c40,
+ 0x40005e00,
+ 0x2200014b,
+ 0x40008000,
+ 0x40005e00,
+ 0x4000f040,
+ 0x40000e40,
+ 0x2200011a,
+ 0x40000780,
+ 0x40000400,
+ 0x40005600,
+ 0x220000c2,
+ 0x40000240,
+ 0x40004880,
+ 0x40005600,
+ 0x4000e000,
+ 0x40000640,
+ 0x40009e80,
+ 0x4000e800,
+ 0x400006c0,
+ 0x4000f800,
+ 0x2200011a,
+ 0x40001200,
+ 0xd8004400,
+ 0x22000088,
+ 0x40000400,
+ 0x2200017d,
+ 0x40009200,
+ 0xc8088000,
+ 0x40000400,
+ 0x40000c40,
+ 0x40005600,
+ 0x2200014b,
+ 0xc8105800,
+ 0x430007c0,
+ 0xd01e0400,
+ 0xd41f0c40,
+ 0x40008000,
+ 0x40008840,
+ 0x24000000,
+ 0x220001ed,
+ 0x00000000,
+ 0x220001d8,
+ 0x00000000,
+ 0x220002fd,
+ 0x00000000,
+ 0x220001e1,
+ 0x00000000,
+ 0x220001d5,
+ 0x00000000,
+ 0x22000226,
+ 0x00000000,
+ 0x220001d1,
+ 0x00000000,
+ 0x22000371,
+ 0x00000000,
+ 0x22000377,
+ 0x00000000,
+ 0x22000366,
+ 0x00000000,
+ 0x22000262,
+ 0x2200037e,
+ 0x22000267,
+ 0x24000000,
+ 0x48800000,
+ 0x2200028e,
+ 0x24000000,
+ 0x440004c0,
+ 0x22000280,
+ 0x220002fd,
+ 0x22000254,
+ 0x22000262,
+ 0x2200037e,
+ 0x22000267,
+ 0x22000248,
+ 0x24000000,
+ 0x44000480,
+ 0x440004c0,
+ 0x22000272,
+ 0x22000280,
+ 0x2200028e,
+ 0x33c0038f,
+ 0x22000254,
+ 0x22000262,
+ 0x2200037e,
+ 0x22000267,
+ 0x22000248,
+ 0x24000000,
+ 0x2200038c,
+ 0x318001f3,
+ 0x40003c80,
+ 0x22000272,
+ 0x2200035a,
+ 0x200001f5,
+ 0x44000480,
+ 0x22000272,
+ 0x48800000,
+ 0x50a0f800,
+ 0x11a00000,
+ 0x2200024d,
+ 0x23e001fb,
+ 0x2000020f,
+ 0x15fe8000,
+ 0x21e0020f,
+ 0x20000200,
+ 0x22000254,
+ 0x20000200,
+ 0x220002fd,
+ 0x22000254,
+ 0x68e0f800,
+ 0x20000204,
+ 0x26200207,
+ 0x2200028e,
+ 0x20000207,
+ 0x20000208,
+ 0x28e001fe,
+ 0x2200024d,
+ 0x2000020f,
+ 0x22000254,
+ 0x2000020f,
+ 0x2200025b,
+ 0x2000020f,
+ 0x220002fd,
+ 0x22000254,
+ 0x68a0f800,
+ 0x3160021a,
+ 0x20000214,
+ 0x2200028e,
+ 0x33c0038f,
+ 0x20000217,
+ 0x28a0020b,
+ 0x22000254,
+ 0x20000221,
+ 0x2620021e,
+ 0x2200028e,
+ 0x2000021d,
+ 0x2000021e,
+ 0x28a0020d,
+ 0x2200025b,
+ 0x20000221,
+ 0x22000262,
+ 0x2200037e,
+ 0x22000267,
+ 0x22000248,
+ 0x24000000,
+ 0xd902c000,
+ 0x31400245,
+ 0xd90ac000,
+ 0x31400245,
+ 0x44000480,
+ 0x4000dc00,
+ 0x22000272,
+ 0x40005000,
+ 0x220000b9,
+ 0x40000380,
+ 0x40001200,
+ 0x40004000,
+ 0x220000b9,
+ 0x40001200,
+ 0x220000b2,
+ 0x40000340,
+ 0x40003200,
+ 0x4000d800,
+ 0x220000b2,
+ 0x40001200,
+ 0x220000b2,
+ 0x400002c0,
+ 0x40003a00,
+ 0x4000d800,
+ 0x220000b2,
+ 0xd0005c00,
+ 0x220000c2,
+ 0xd0006c00,
+ 0x220000c2,
+ 0xd9007000,
+ 0x20000247,
+ 0x48000000,
+ 0x20000247,
+ 0x24000000,
+ 0x40001c00,
+ 0x40008080,
+ 0x40005c00,
+ 0x40008280,
+ 0x24000000,
+ 0x40001200,
+ 0x400040c0,
+ 0x40005000,
+ 0x400002c0,
+ 0x40009000,
+ 0x400004c0,
+ 0x24000000,
+ 0x40002200,
+ 0x400040c0,
+ 0x40006000,
+ 0x400002c0,
+ 0x4000a000,
+ 0x400004c0,
+ 0x24000000,
+ 0x40002200,
+ 0x40004140,
+ 0x40006000,
+ 0x40000340,
+ 0x4000a000,
+ 0x40000540,
+ 0x24000000,
+ 0x40009800,
+ 0x44000200,
+ 0x220000b2,
+ 0x400004c0,
+ 0x24000000,
+ 0x40001a00,
+ 0x40004000,
+ 0x40009a00,
+ 0x220000b2,
+ 0x40000200,
+ 0x400040c0,
+ 0x40005800,
+ 0x40009a00,
+ 0x220000b2,
+ 0x400002c0,
+ 0x24000000,
+ 0x40001200,
+ 0x4000d800,
+ 0x220000b2,
+ 0x40000200,
+ 0x40004080,
+ 0x40005000,
+ 0x4000da00,
+ 0x220000b2,
+ 0x40000280,
+ 0x40009000,
+ 0x4000da00,
+ 0x220000b2,
+ 0x40000480,
+ 0x24000000,
+ 0x40001a00,
+ 0x4000d800,
+ 0x220000b2,
+ 0x40000200,
+ 0x400040c0,
+ 0x40005800,
+ 0x4000da00,
+ 0x220000b2,
+ 0x400002c0,
+ 0x40009800,
+ 0x4000da00,
+ 0x220000b2,
+ 0x400004c0,
+ 0x24000000,
+ 0x40001200,
+ 0x40009800,
+ 0x220000b2,
+ 0x40000700,
+ 0x40001a00,
+ 0x40009000,
+ 0x220000b2,
+ 0x40000300,
+ 0xd80ce400,
+ 0x3100029a,
+ 0x49c00000,
+ 0x2000029b,
+ 0x48c00000,
+ 0x2000029c,
+ 0x22000088,
+ 0x40000500,
+ 0xd00ce400,
+ 0x220000c2,
+ 0x40000540,
+ 0x4000a000,
+ 0x220000b9,
+ 0x40000740,
+ 0x4000a200,
+ 0x220000b2,
+ 0x40000780,
+ 0x4000e800,
+ 0x4000aa00,
+ 0x220000b2,
+ 0x40000340,
+ 0x40005000,
+ 0x40009a00,
+ 0x220000b2,
+ 0x40000580,
+ 0x40005800,
+ 0x40009200,
+ 0x220000b2,
+ 0x40000700,
+ 0xd81cb380,
+ 0x40007400,
+ 0x22000088,
+ 0x40000380,
+ 0xd01cb000,
+ 0x40000400,
+ 0x220000c2,
+ 0x400003c0,
+ 0x40007000,
+ 0x220000b9,
+ 0x400005c0,
+ 0x40009000,
+ 0x40009a00,
+ 0x220000b2,
+ 0x40000700,
+ 0x4000ba00,
+ 0x220000b2,
+ 0x40000740,
+ 0xd8006c00,
+ 0x22000088,
+ 0x4000a200,
+ 0x220000b2,
+ 0x40000200,
+ 0x40004100,
+ 0x42006800,
+ 0x40000400,
+ 0x220000c2,
+ 0xd00d0400,
+ 0x220000c2,
+ 0x40000500,
+ 0x4200ec00,
+ 0x220000c2,
+ 0x40000200,
+ 0xd8144000,
+ 0x40000400,
+ 0x22000088,
+ 0x40000200,
+ 0x40007000,
+ 0x220000b2,
+ 0x40000500,
+ 0x40007800,
+ 0x4000f200,
+ 0x220000b2,
+ 0xd8140740,
+ 0x4000ec00,
+ 0x22000088,
+ 0x40000740,
+ 0x6b00e800,
+ 0x338002ef,
+ 0x336002ea,
+ 0x4000c200,
+ 0xd008e840,
+ 0x40000680,
+ 0x48200000,
+ 0x200002f5,
+ 0x4000c200,
+ 0xd008e800,
+ 0x40000740,
+ 0x48000000,
+ 0x200002f5,
+ 0x336002f2,
+ 0x48200000,
+ 0x200002f5,
+ 0x4000c200,
+ 0xd008e800,
+ 0x40000740,
+ 0x4100eb00,
+ 0x4000e000,
+ 0x200002f9,
+ 0x40009800,
+ 0x4000f200,
+ 0x220000b2,
+ 0x40000500,
+ 0x24000000,
+ 0x40009a00,
+ 0x40005800,
+ 0x220000b2,
+ 0x42000400,
+ 0x220000c2,
+ 0x40000500,
+ 0x33e0031b,
+ 0x40001a00,
+ 0x40004000,
+ 0x220000b9,
+ 0x40000780,
+ 0x42000200,
+ 0x40004400,
+ 0x220000c2,
+ 0xd000f400,
+ 0x220000c2,
+ 0x40000580,
+ 0x40009800,
+ 0x220000b9,
+ 0x400004c0,
+ 0x40003200,
+ 0x4000d800,
+ 0x220000b2,
+ 0x40009a00,
+ 0x220000b2,
+ 0xd0160200,
+ 0x40004400,
+ 0x220000c2,
+ 0x40000580,
+ 0x2000032a,
+ 0xd8039a00,
+ 0x40004400,
+ 0x22000088,
+ 0x40000200,
+ 0xd0039a40,
+ 0x40004c00,
+ 0x220000c2,
+ 0x220000b2,
+ 0x40000440,
+ 0x40000200,
+ 0x42000400,
+ 0x220000c2,
+ 0xd0004400,
+ 0x220000c2,
+ 0x40000580,
+ 0x40001a00,
+ 0x40005800,
+ 0x220000b2,
+ 0x400005c0,
+ 0x4000b000,
+ 0x220000b9,
+ 0x40000380,
+ 0x4000a000,
+ 0x4000ba00,
+ 0x220000b2,
+ 0x400003c0,
+ 0x4000a000,
+ 0x220000b9,
+ 0x40000700,
+ 0x42007c00,
+ 0x220000c2,
+ 0x40000740,
+ 0x42000400,
+ 0x220000c2,
+ 0x400003c0,
+ 0x40007000,
+ 0xd8007c00,
+ 0x22000088,
+ 0x4000a200,
+ 0x220000b2,
+ 0x40000400,
+ 0x40008100,
+ 0xd00fec00,
+ 0x220000c2,
+ 0xd8007400,
+ 0x22000088,
+ 0x4000b200,
+ 0x220000b2,
+ 0x400003c0,
+ 0x40005800,
+ 0x220000b9,
+ 0x4000e200,
+ 0x220000b2,
+ 0x42000400,
+ 0x220000c2,
+ 0xd80f0400,
+ 0x22000088,
+ 0x40000300,
+ 0x4000a000,
+ 0x4000e200,
+ 0x220000b2,
+ 0x40000500,
+ 0x24000000,
+ 0x40001200,
+ 0x40004000,
+ 0x22000363,
+ 0x40000200,
+ 0x40004080,
+ 0x40005000,
+ 0x22000363,
+ 0x40000280,
+ 0x24000000,
+ 0x40009200,
+ 0x220000b2,
+ 0x24000000,
+ 0x44000000,
+ 0x08800001,
+ 0x6a800000,
+ 0x43000200,
+ 0xd8080400,
+ 0x22000088,
+ 0x40000200,
+ 0xd9083000,
+ 0x31000370,
+ 0x49e00000,
+ 0x24000000,
+ 0x40001dc0,
+ 0xd902b800,
+ 0x31000376,
+ 0x400055c0,
+ 0xd90bb800,
+ 0x24000000,
+ 0x40001dc0,
+ 0xd902b800,
+ 0x3100037d,
+ 0x40005800,
+ 0xd00a0400,
+ 0x220000c1,
+ 0x24000000,
+ 0x40009800,
+ 0x44000400,
+ 0x08c00000,
+ 0x22000047,
+ 0x40008000,
+ 0x400004c0,
+ 0x24000000,
+ 0x44000000,
+ 0xd91f0000,
+ 0x3300038b,
+ 0x43000000,
+ 0xd91f0000,
+ 0x3300038b,
+ 0x24000000,
+ 0x22000385,
+ 0x33000390,
+ 0x24000000,
+ 0x00000043,
+ 0x00000042,
+ 0x00000041,
+ 0x22000394,
+ 0x00000000,
+ 0x220003f1,
+ 0x49800000,
+ 0x22000371,
+ 0x3300038f,
+ 0x22000377,
+ 0x3300038f,
+ 0x44000480,
+ 0x440004c0,
+ 0x43000100,
+ 0x43000300,
+ 0x43000500,
+ 0x22000272,
+ 0x22000280,
+ 0xe007fbc0,
+ 0x330003a5,
+ 0x2200028e,
+ 0x33c0038f,
+ 0x40001700,
+ 0x40001f40,
+ 0x40002680,
+ 0x18000000,
+ 0x4000e000,
+ 0x40005040,
+ 0x40009080,
+ 0x4000e8c0,
+ 0x40005900,
+ 0x40009940,
+ 0x40006180,
+ 0x4000a1c0,
+ 0x19000000,
+ 0x50c03800,
+ 0x50e0f800,
+ 0x159b8000,
+ 0x334003bf,
+ 0x330003c7,
+ 0x40001700,
+ 0x4000e100,
+ 0x40005700,
+ 0x4000e300,
+ 0x40009700,
+ 0x4000e500,
+ 0x16980000,
+ 0x200003c8,
+ 0x40001f00,
+ 0x4000e100,
+ 0x40005f00,
+ 0x4000e300,
+ 0x40009f00,
+ 0x4000e500,
+ 0x169c0000,
+ 0x200003c8,
+ 0x16980000,
+ 0x11800000,
+ 0x22000254,
+ 0x220002fd,
+ 0x22000254,
+ 0x68803800,
+ 0x336003d1,
+ 0x6880f800,
+ 0x336003da,
+ 0x200003e7,
+ 0x6880f800,
+ 0x336003e1,
+ 0x18000000,
+ 0x40000700,
+ 0x40000a80,
+ 0x40001480,
+ 0x19000000,
+ 0x4000e080,
+ 0x200003e8,
+ 0x18000000,
+ 0x40001f00,
+ 0x40002280,
+ 0x40002c80,
+ 0x19000000,
+ 0x4000e080,
+ 0x200003e8,
+ 0x4000d080,
+ 0x18000000,
+ 0x40003280,
+ 0x40003c80,
+ 0x19000000,
+ 0x200003e8,
+ 0x200003ea,
+ 0x2200028e,
+ 0x33c0038f,
+ 0x288003c9,
+ 0x22000254,
+ 0x22000262,
+ 0x2200037e,
+ 0x22000267,
+ 0x22000248,
+ 0x24000000,
+ 0x2200038c,
+ 0x4000fa00,
+ 0x40003fc0,
+ 0x2200038c,
+ 0x400047c0,
+ 0x24000000,
+ 0x22000403,
+ 0x00000000,
+ 0x2200043e,
+ 0x00000000,
+ 0x2200044d,
+ 0x00000000,
+ 0x2200045e,
+ 0x00000000,
+ 0x2200055b,
+ 0x00000000,
+ 0x22000531,
+ 0x00000000,
+ 0x2200038c,
+ 0x31800408,
+ 0x40003c80,
+ 0x2200054f,
+ 0x20000409,
+ 0x44000480,
+ 0x48800000,
+ 0x50a0f800,
+ 0x11a00000,
+ 0x2200024d,
+ 0x23e0040f,
+ 0x20000423,
+ 0x15fe8000,
+ 0x21e00423,
+ 0x20000414,
+ 0x22000254,
+ 0x20000414,
+ 0x220004e6,
+ 0x22000254,
+ 0x68e0f800,
+ 0x20000418,
+ 0x2620041b,
+ 0x22000479,
+ 0x2000041b,
+ 0x2000041c,
+ 0x28e00412,
+ 0x2200024d,
+ 0x20000423,
+ 0x22000254,
+ 0x20000423,
+ 0x2200025b,
+ 0x20000423,
+ 0x220004e6,
+ 0x22000254,
+ 0x68a0f800,
+ 0x3160042e,
+ 0x20000428,
+ 0x22000479,
+ 0x33c0038f,
+ 0x2000042b,
+ 0x28a0041f,
+ 0x22000254,
+ 0x20000435,
+ 0x26200432,
+ 0x22000479,
+ 0x20000431,
+ 0x20000432,
+ 0x28a00421,
+ 0x2200025b,
+ 0x20000435,
+ 0x44000400,
+ 0x40009800,
+ 0x08c00000,
+ 0x22000047,
+ 0x40008000,
+ 0x400004c0,
+ 0x22000545,
+ 0x22000248,
+ 0x24000000,
+ 0x440004c0,
+ 0x08c00000,
+ 0x220004e6,
+ 0x44000400,
+ 0x4000a000,
+ 0x22000047,
+ 0x40008000,
+ 0x400004c0,
+ 0x40002500,
+ 0x4000a0c0,
+ 0x40006500,
+ 0x4000a2c0,
+ 0x22000545,
+ 0x22000248,
+ 0x24000000,
+ 0x44000480,
+ 0x440004c0,
+ 0x08c00000,
+ 0x22000479,
+ 0x33c0038f,
+ 0x44000400,
+ 0x4000a000,
+ 0x22000047,
+ 0x40008000,
+ 0x400004c0,
+ 0x40002500,
+ 0x4000a0c0,
+ 0x40006500,
+ 0x4000a2c0,
+ 0x22000545,
+ 0x22000248,
+ 0x24000000,
+ 0xd902c000,
+ 0x31400476,
+ 0xd90ac000,
+ 0x31400476,
+ 0x40005000,
+ 0x2200052d,
+ 0x40000380,
+ 0x40001200,
+ 0x40004000,
+ 0x2200052d,
+ 0x40001200,
+ 0x22000531,
+ 0x40000340,
+ 0x40001200,
+ 0x40004000,
+ 0x40003200,
+ 0x22000531,
+ 0x40000300,
+ 0xd0076c00,
+ 0x220000c2,
+ 0xd0006400,
+ 0x220000c2,
+ 0xd9007000,
+ 0x20000478,
+ 0x48000000,
+ 0x20000478,
+ 0x24000000,
+ 0x40001200,
+ 0x40009800,
+ 0x22000531,
+ 0x40000700,
+ 0x40001a00,
+ 0x40009000,
+ 0x22000531,
+ 0x40000300,
+ 0xd80ce400,
+ 0x31000485,
+ 0x49c00000,
+ 0x20000486,
+ 0x48c00000,
+ 0x20000487,
+ 0x22000088,
+ 0x40000500,
+ 0xd00ce400,
+ 0x220000c2,
+ 0x40000580,
+ 0x4000a000,
+ 0x2200052d,
+ 0x40000740,
+ 0x4000a200,
+ 0x22000531,
+ 0x40000780,
+ 0x4000e800,
+ 0x4000b200,
+ 0x22000531,
+ 0x400006c0,
+ 0x40005000,
+ 0x40009a00,
+ 0x22000531,
+ 0x40000580,
+ 0x40005800,
+ 0x40009200,
+ 0x22000531,
+ 0x40000700,
+ 0xd81cb380,
+ 0x40007400,
+ 0x22000088,
+ 0x40000380,
+ 0xd01cb000,
+ 0x40000400,
+ 0x220000c2,
+ 0x400003c0,
+ 0x40007000,
+ 0x2200052d,
+ 0x400005c0,
+ 0x40009000,
+ 0x40009a00,
+ 0x22000531,
+ 0x40000700,
+ 0x4000ba00,
+ 0x22000531,
+ 0x40000740,
+ 0xd800dc00,
+ 0x22000088,
+ 0x4000a200,
+ 0x22000531,
+ 0x40000200,
+ 0x40004100,
+ 0x4200d800,
+ 0x40000400,
+ 0x220000c2,
+ 0xd01b0400,
+ 0x220000c2,
+ 0x40000500,
+ 0x4200ec00,
+ 0x220000c2,
+ 0x40000200,
+ 0xd8144000,
+ 0x40000400,
+ 0x22000088,
+ 0x40000200,
+ 0x40007000,
+ 0x22000531,
+ 0x40000500,
+ 0x40007800,
+ 0x4000f200,
+ 0x22000531,
+ 0xd8140740,
+ 0x4000ec00,
+ 0x22000088,
+ 0x40000740,
+ 0x6b00e800,
+ 0x338004da,
+ 0x336004d5,
+ 0x4000c200,
+ 0xd008e840,
+ 0x40000680,
+ 0x48200000,
+ 0x200004e0,
+ 0x4000c200,
+ 0xd008e800,
+ 0x40000740,
+ 0x48000000,
+ 0x200004e0,
+ 0x336004dd,
+ 0x48200000,
+ 0x200004e0,
+ 0x4000c200,
+ 0xd008e800,
+ 0x40000740,
+ 0x4100eb00,
+ 0x4000e000,
+ 0x4000f200,
+ 0x22000531,
+ 0x40000500,
+ 0x24000000,
+ 0x40009a00,
+ 0x40005800,
+ 0x22000531,
+ 0x42000400,
+ 0x220000c2,
+ 0x40000500,
+ 0x40001a00,
+ 0x40004000,
+ 0x2200052d,
+ 0x40000780,
+ 0x42000400,
+ 0x220000c2,
+ 0xd000f400,
+ 0x220000c2,
+ 0x40000580,
+ 0x40009800,
+ 0x2200052d,
+ 0x40003200,
+ 0x22000531,
+ 0xd0160200,
+ 0x40004400,
+ 0x220000c2,
+ 0x40000580,
+ 0x40001a00,
+ 0x40005800,
+ 0x22000531,
+ 0x400005c0,
+ 0x4000b000,
+ 0x2200052d,
+ 0x40000380,
+ 0x4000a000,
+ 0x4000ba00,
+ 0x22000531,
+ 0x400003c0,
+ 0x4000a000,
+ 0x2200052d,
+ 0x40000700,
+ 0x42007c00,
+ 0x220000c2,
+ 0x40000740,
+ 0x42000400,
+ 0x220000c2,
+ 0x400003c0,
+ 0x40007000,
+ 0xd8007c00,
+ 0x22000088,
+ 0x4000a200,
+ 0x22000531,
+ 0x40000400,
+ 0x40008100,
+ 0xd00fec00,
+ 0x220000c2,
+ 0xd8007400,
+ 0x22000088,
+ 0x4000b200,
+ 0x22000531,
+ 0x400003c0,
+ 0x40005800,
+ 0x2200052d,
+ 0x4000e200,
+ 0x22000531,
+ 0x42000400,
+ 0x220000c2,
+ 0xd80f0400,
+ 0x22000088,
+ 0x40000300,
+ 0x4000a000,
+ 0x4000e200,
+ 0x22000531,
+ 0x40000500,
+ 0x24000000,
+ 0x40000200,
+ 0xca004400,
+ 0x22000532,
+ 0x24000000,
+ 0xc8004400,
+ 0x46008200,
+ 0xd0088000,
+ 0x43000400,
+ 0x40000200,
+ 0xd4088000,
+ 0x24000000,
+ 0x220004e6,
+ 0x44000400,
+ 0x4000a000,
+ 0x22000047,
+ 0x40008000,
+ 0x400004c0,
+ 0x40002500,
+ 0x4000a0c0,
+ 0x40006500,
+ 0x4000a2c0,
+ 0x22000545,
+ 0x22000248,
+ 0x24000000,
+ 0x40001a00,
+ 0x40009800,
+ 0x22000531,
+ 0x40000400,
+ 0x400080c0,
+ 0x40005800,
+ 0x40009a00,
+ 0x22000531,
+ 0x400002c0,
+ 0x24000000,
+ 0x40001200,
+ 0x40004000,
+ 0x22000558,
+ 0x40000200,
+ 0x40004080,
+ 0x40005000,
+ 0x22000558,
+ 0x40000280,
+ 0x24000000,
+ 0x40009200,
+ 0x22000531,
+ 0x24000000,
+ 0x40004680,
+ 0x40000200,
+ 0x4000d800,
+ 0x22000568,
+ 0x40000400,
+ 0x4000d000,
+ 0x40008680,
+ 0x40000200,
+ 0x4000d800,
+ 0x22000568,
+ 0x4000d200,
+ 0x22000568,
+ 0x44000200,
+ 0xc8004400,
+ 0x46008780,
+ 0x4000f440,
+ 0xc910ca00,
+ 0x46004780,
+ 0xc808c000,
+ 0x46000780,
+ 0x4000f040,
+ 0xd0008200,
+ 0xd4018a00,
+ 0x40004400,
+ 0x200000c2,
+ 0xc8004400,
+ 0x46008200,
+ 0x40004440,
+ 0x24000000,
+ 0x2200057a,
+ 0x00000000,
+ 0x220003f1,
+ 0x49800000,
+ 0x22000371,
+ 0x3300038f,
+ 0x22000377,
+ 0x3300038f,
+ 0x44000480,
+ 0x440004c0,
+ 0x43000100,
+ 0x43000300,
+ 0x43000500,
+ 0xe007fbc0,
+ 0x33000589,
+ 0x22000479,
+ 0x33c0038f,
+ 0x40001700,
+ 0x40001f40,
+ 0x40002680,
+ 0x18000000,
+ 0x4000e000,
+ 0x40005040,
+ 0x40009080,
+ 0x4000e8c0,
+ 0x40005900,
+ 0x40009940,
+ 0x40006180,
+ 0x4000a1c0,
+ 0x19000000,
+ 0x51c03800,
+ 0x51e0f800,
+ 0x159b8000,
+ 0x334005a3,
+ 0x330005ab,
+ 0x40001700,
+ 0x4000e100,
+ 0x40005700,
+ 0x4000e300,
+ 0x40009700,
+ 0x4000e500,
+ 0x16980000,
+ 0x200005ac,
+ 0x40001f00,
+ 0x4000e100,
+ 0x40005f00,
+ 0x4000e300,
+ 0x40009f00,
+ 0x4000e500,
+ 0x169c0000,
+ 0x200005ac,
+ 0x16980000,
+ 0x11800000,
+ 0x16f00000,
+ 0x22000254,
+ 0x220004e6,
+ 0x22000254,
+ 0x68e03800,
+ 0x336005b6,
+ 0x68e0f800,
+ 0x336005bf,
+ 0x200005cc,
+ 0x68e0f800,
+ 0x336005c6,
+ 0x18000000,
+ 0x40000700,
+ 0x40000a80,
+ 0x40001480,
+ 0x19000000,
+ 0x4000e080,
+ 0x200005cd,
+ 0x18000000,
+ 0x40001f00,
+ 0x40002280,
+ 0x40002c80,
+ 0x19000000,
+ 0x4000e080,
+ 0x200005cd,
+ 0x4000d080,
+ 0x18000000,
+ 0x40003280,
+ 0x40003c80,
+ 0x19000000,
+ 0x200005cd,
+ 0x200005cf,
+ 0x22000479,
+ 0x33c0038f,
+ 0x28e005ae,
+ 0x22000254,
+ 0x44000400,
+ 0x40009800,
+ 0x08c00000,
+ 0x22000047,
+ 0x40008000,
+ 0x400004c0,
+ 0x22000545,
+ 0x22000248,
+ 0x24000000,
+};
+
+
+#endif
diff --git a/drivers/crypto/sifive-vic/vic-pka-tools.c b/drivers/crypto/sifive-vic/vic-pka-tools.c
new file mode 100644
index 000000000000..c190c43676d5
--- /dev/null
+++ b/drivers/crypto/sifive-vic/vic-pka-tools.c
@@ -0,0 +1,366 @@
+/*
+ ******************************************************************************
+ * @file vic-sec.c
+ * @author StarFive Technology
+ * @version V1.0
+ * @date 08/13/2020
+ * @brief
+ ******************************************************************************
+ * @copy
+ *
+ * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, STARFIVE SHALL NOT BE HELD LIABLE FOR ANY
+ * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ * © COPYRIGHT 2020 Shanghai StarFive Technology Co., Ltd.
+ */
+
+#include
+
+#include "vic-sec.h"
+#include "vic-pka.h"
+#include "vic-pka-hw.h"
+
+#define MAX(a, b) (((a)>(b)) ? (a) : (b))
+
+/*
+ * Determine the base radix for the given operand size,
+ * ceiling(lg(size/8))
+ * where size > 16 bytes.
+ * Returns 0 if the size is invalid.
+ */
+static unsigned elppka_base_radix(unsigned size)
+{
+ if (size <= 16) return 0; /* Error */
+ if (size <= 32) return 2;
+ if (size <= 64) return 3;
+ if (size <= 128) return 4;
+ if (size <= 256) return 5;
+ if (size <= 512) return 6;
+
+ return 0;
+}
+
+/*
+ * Helper to compute the operand page size, which depends only on the base
+ * radix.
+ */
+static unsigned elppka_page_size(unsigned size)
+{
+ unsigned ret;
+
+ ret = elppka_base_radix(size);
+ if (!ret)
+ return ret;
+ return 8 << ret;
+}
+
+/*
+ * Check that the given PKA operand index is valid for a particular bank and
+ * operand size. The bank and size values themselves are not validated.
+ */
+static int index_is_valid(const struct pka_config *cfg, unsigned bank,
+ unsigned index, unsigned size)
+{
+ unsigned ecc_max_bytes, rsa_max_bytes, abc_storage, d_storage;
+
+ ecc_max_bytes = cfg->ecc_size >> 3;
+ rsa_max_bytes = cfg->rsa_size >> 3;
+
+ if (size > ecc_max_bytes && size > rsa_max_bytes)
+ return 0;
+ if (index > 7)
+ return 0;
+
+ abc_storage = MAX(ecc_max_bytes*8, rsa_max_bytes*2);
+ d_storage = MAX(ecc_max_bytes*8, rsa_max_bytes*4);
+
+ if (bank == PKA_OPERAND_D) {
+ return index < d_storage / size;
+ } else {
+ return index < abc_storage / size;
+ }
+}
+
+/*
+ * Determine the offset (in 32-bit words) of a particular operand in the PKA
+ * memory map.
+ * Returns the (non-negative) offset on success, or -errno on failure.
+ */
+static int operand_base_offset(const struct pka_config *cfg, unsigned bank,
+ unsigned index, unsigned size)
+{
+ unsigned pagesize;
+ int ret;
+
+ pagesize = elppka_page_size(size);
+ if (!pagesize)
+ return CRYPTO_INVALID_SIZE;
+
+ if (!index_is_valid(cfg, bank, index, pagesize))
+ return CRYPTO_NOT_FOUND;
+
+ switch (bank) {
+ case PKA_OPERAND_A:
+ ret = PKA_OPERAND_A_BASE;
+ break;
+ case PKA_OPERAND_B:
+ ret = PKA_OPERAND_B_BASE;
+ break;
+ case PKA_OPERAND_C:
+ ret = PKA_OPERAND_C_BASE;
+ break;
+ case PKA_OPERAND_D:
+ ret = PKA_OPERAND_D_BASE;
+ break;
+ default:
+ return CRYPTO_INVALID_ARGUMENT;
+ }
+
+ return ret + index * (pagesize>>2);
+}
+
+/* Parse out the fields from a type-0 BUILD_CONF register in bc. */
+static void elppka_get_config_type0(uint32_t bc, struct pka_config *out)
+{
+ struct pka_config cfg = {0};
+
+ if (bc & (1ul << PKA_BC_FW_HAS_RAM)) {
+ cfg.fw_ram_size = 256u << ((bc >> PKA_BC_FW_RAM_SZ)
+ & ((1ul << PKA_BC_FW_RAM_SZ_BITS)-1));
+ }
+ if (bc & (1ul << PKA_BC_FW_HAS_ROM)) {
+ cfg.fw_rom_size = 256u << ((bc >> PKA_BC_FW_ROM_SZ)
+ & ((1ul << PKA_BC_FW_ROM_SZ_BITS)-1));
+ }
+
+ cfg.alu_size = 32u << ((bc >> PKA_BC_ALU_SZ)
+ & ((1ul << PKA_BC_ALU_SZ_BITS)-1));
+ cfg.rsa_size = 512u << ((bc >> PKA_BC_RSA_SZ)
+ & ((1ul << PKA_BC_RSA_SZ_BITS)-1));
+ cfg.ecc_size = 256u << ((bc >> PKA_BC_ECC_SZ)
+ & ((1ul << PKA_BC_ECC_SZ_BITS)-1));
+
+ *out = cfg;
+}
+
+/* Parse out the fields from a type-1 BUILD_CONF register in bc. */
+static void elppka_get_config_type1(uint32_t bc, struct pka_config *out)
+{
+ struct pka_config cfg = {0};
+ uint32_t tmp;
+
+ tmp = (bc >> PKA_BC1_FW_RAM_SZ) & ((1ul << PKA_BC1_FW_RAM_SZ_BITS)-1);
+ if (tmp)
+ cfg.fw_ram_size = 256u << (tmp-1);
+
+ tmp = (bc >> PKA_BC1_FW_ROM_SZ) & ((1ul << PKA_BC1_FW_ROM_SZ_BITS)-1);
+ if (tmp)
+ cfg.fw_rom_size = 256u << (tmp-1);
+
+ tmp = (bc >> PKA_BC1_RSA_SZ) & ((1ul << PKA_BC1_RSA_SZ_BITS)-1);
+ if (tmp)
+ cfg.rsa_size = 512u << (tmp-1);
+
+ tmp = (bc >> PKA_BC1_ECC_SZ) & ((1ul << PKA_BC1_ECC_SZ_BITS)-1);
+ if (tmp)
+ cfg.ecc_size = 256u << (tmp-1);
+
+ tmp = (bc >> PKA_BC1_ALU_SZ) & ((1ul << PKA_BC1_ALU_SZ_BITS)-1);
+ cfg.alu_size = 32u << tmp;
+
+ *out = cfg;
+}
+
+/* Read out PKA H/W configuration into config structure. */
+static int elppka_get_config(uint32_t *regs, struct pka_config *out)
+{
+ uint32_t bc = vic_pka_io_read32(®s[PKA_BUILD_CONF]);
+
+ unsigned type = bc >> PKA_BC_FORMAT_TYPE;
+ type &= (1ul << PKA_BC_FORMAT_TYPE_BITS) - 1;
+
+ switch (type) {
+ case 0:
+ elppka_get_config_type0(bc, out);
+ break;
+ case 1:
+ case 2: /* Type 2 has same format as type 1 */
+ elppka_get_config_type1(bc, out);
+ break;
+ }
+
+ /* RAM/ROM base addresses depend on core version */
+ if (type < 2) {
+ out->ram_offset = PKA_FIRMWARE_BASE;
+ out->rom_offset = PKA_FIRMWARE_BASE + out->fw_ram_size;
+ } else {
+ out->ram_offset = out->rom_offset = PKA_FIRMWARE_T2_BASE;
+ if (out->fw_ram_size)
+ out->rom_offset = PKA_FIRMWARE_T2_SPLIT;
+ }
+
+ return 0;
+}
+
+int elppka_start(struct pka_state *pka, uint32_t entry, uint32_t flags,
+ unsigned size)
+{
+ uint32_t ctrl, base;
+
+ base = elppka_base_radix(size);
+ if (!base)
+ return CRYPTO_INVALID_SIZE;
+
+ ctrl = base << PKA_CTRL_BASE_RADIX;
+
+ /* Handle ECC-521 oddities as a special case. */
+ if (size == PKA_ECC521_OPERAND_SIZE) {
+ flags |= 1ul << PKA_FLAG_F1;
+ ctrl |= PKA_CTRL_M521_ECC521 << PKA_CTRL_M521_MODE;
+
+ /* Round up partial radix to multiple of ALU size. */
+ size = (512 + pka->cfg.alu_size)/8;
+ }
+
+ ctrl |= (size & (size-1) ? (size+3)/4 : 0) << PKA_CTRL_PARTIAL_RADIX;
+ ctrl |= 1ul << PKA_CTRL_GO;
+
+ vic_pka_io_write32(&pka->regbase[PKA_INDEX_I], 0);
+ vic_pka_io_write32(&pka->regbase[PKA_INDEX_J], 0);
+ vic_pka_io_write32(&pka->regbase[PKA_INDEX_K], 0);
+ vic_pka_io_write32(&pka->regbase[PKA_INDEX_L], 0);
+
+ vic_pka_io_write32(&pka->regbase[PKA_F_STACK], 0);
+ vic_pka_io_write32(&pka->regbase[PKA_FLAGS], flags);
+ vic_pka_io_write32(&pka->regbase[PKA_ENTRY], entry);
+ vic_pka_io_write32(&pka->regbase[PKA_CTRL], ctrl);
+
+ vic_pka_io_write32(&pka->regbase[PKA_IRQ_EN], 1 << PKA_IRQ_EN_STAT);
+ pka->pka_done = 0;
+ pka->pka_err = 0;
+
+ return 0;
+}
+
+void elppka_abort(struct pka_state *pka)
+{
+ vic_pka_io_write32(&pka->regbase[PKA_CTRL], 1 << PKA_CTRL_STOP_RQST);
+}
+
+int elppka_get_status(struct pka_state *pka, unsigned *code)
+{
+ uint32_t status = vic_pka_io_read32(&pka->regbase[PKA_RC]);
+
+ if (status & (1 << PKA_RC_BUSY)) {
+ return CRYPTO_INPROGRESS;
+ }
+
+ if (code) {
+ *code = (status >> PKA_RC_REASON) & ((1 << PKA_RC_REASON_BITS)-1);
+ }
+
+ return 0;
+}
+
+int elppka_load_operand(struct pka_state *pka, unsigned bank, unsigned index,
+ unsigned size, const uint8_t *data)
+{
+ uint32_t *opbase, tmp;
+ unsigned i, n;
+ int rc;
+
+ rc = operand_base_offset(&pka->cfg, bank, index, size);
+ if (rc < 0)
+ return rc;
+
+ opbase = pka->regbase + rc;
+ n = size >> 2;
+
+ for (i = 0; i < n; i++) {
+ /*
+ * For lengths that are not a multiple of 4, the incomplete word is
+ * at the _start_ of the data buffer, so we must add the remainder.
+ */
+ memcpy(&tmp, data+((n-i-1)<<2)+(size&3), 4);
+ vic_pka_io_write32(&opbase[i], tmp);
+ }
+
+ /* Write the incomplete word, if any. */
+ if (size & 3) {
+ tmp = 0;
+ memcpy((char *)&tmp + sizeof tmp - (size&3), data, size & 3);
+ vic_pka_io_write32(&opbase[i++], tmp);
+ }
+
+ /* Zero the remainder of the operand. */
+ for (n = elppka_page_size(size) >> 2; i < n; i++) {
+ vic_pka_io_write32(&opbase[i], 0);
+ }
+
+ return 0;
+}
+
+int elppka_unload_operand(struct pka_state *pka, unsigned bank, unsigned index,
+ unsigned size, uint8_t *data)
+{
+ uint32_t *opbase, tmp;
+ unsigned i, n;
+ int rc;
+
+ rc = operand_base_offset(&pka->cfg, bank, index, size);
+ if (rc < 0)
+ return rc;
+
+ opbase = pka->regbase + rc;
+ n = size >> 2;
+
+ for (i = 0; i < n; i++) {
+ tmp = vic_pka_io_read32(&opbase[i]);
+ memcpy(data+((n-i-1)<<2)+(size&3), &tmp, 4);
+ }
+
+ if (size & 3) {
+ tmp = vic_pka_io_read32(&opbase[i]);
+ memcpy(data, (char *)&tmp + sizeof tmp - (size&3), size & 3);
+ }
+
+ return 0;
+}
+
+void elppka_set_byteswap(struct pka_state *pka, int swap)
+{
+ uint32_t val = vic_pka_io_read32(&pka->regbase[PKA_CONF]);
+
+ if (swap) {
+ val |= 1 << PKA_CONF_BYTESWAP;
+ } else {
+ val &= ~(1 << PKA_CONF_BYTESWAP);
+ }
+
+ vic_pka_io_write32(&pka->regbase[PKA_CONF], val);
+}
+
+int elppka_setup(struct pka_state *pka)
+{
+ const unsigned char big[4] = { 0x00, 0x11, 0x22, 0x33 };
+ const unsigned char little[4] = { 0x33, 0x22, 0x11, 0x00 };
+ uint32_t testval = 0x00112233;
+ int rc;
+
+ rc = elppka_get_config(pka->regbase, &pka->cfg);
+ if (rc < 0)
+ return rc;
+
+ /* Try to automatically determine byteswap setting */
+ if (!memcmp(&testval, big, sizeof testval)) {
+ elppka_set_byteswap(pka, 0);
+ } else if (!memcmp(&testval, little, sizeof testval)) {
+ elppka_set_byteswap(pka, 1);
+ }
+
+ return 0;
+}
diff --git a/drivers/crypto/sifive-vic/vic-pka.c b/drivers/crypto/sifive-vic/vic-pka.c
new file mode 100644
index 000000000000..268b4cd5d0dc
--- /dev/null
+++ b/drivers/crypto/sifive-vic/vic-pka.c
@@ -0,0 +1,1316 @@
+/*
+ ******************************************************************************
+ * @file vic-pka.c
+ * @author StarFive Technology
+ * @version V1.0
+ * @date 08/13/2020
+ * @brief
+ ******************************************************************************
+ * @copy
+ *
+ * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, STARFIVE SHALL NOT BE HELD LIABLE FOR ANY
+ * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ * © COPYRIGHT 2020 Shanghai StarFive Technology Co., Ltd.
+ */
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+#include "vic-sec.h"
+#include "vic-pka-hw.h"
+
+#define ERROR(fmt, ...) printk("ERROR %s() ln %d:" fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__)
+
+static int pka_wait(struct vic_sec_dev *sdev)
+{
+ struct pka_state *pka = &sdev->pka;
+ int ret = -1;
+ mutex_lock(&sdev->doing);
+ if(pka->pka_done || pka->pka_err)
+ ret = 0;
+ mutex_unlock(&sdev->doing);
+ return ret;
+ //return wait_cond_timeout(pka->pka_done || pka->pka_err, 10, 40000000);
+}
+
+#define PKA_LOAD(pka, bank, index, size, para) \
+ if (para) { \
+ rc = elppka_load_operand(pka, bank, index, size, para); \
+ if (rc) { \
+ ERROR("failed to load a param\r\n"); \
+ return -EIO; \
+ } \
+ }
+
+#define PKA_UNLOAD(pka, bank, index, size, para) \
+ if (para) { \
+ rc = elppka_unload_operand(pka, bank, index, size, para); \
+ if (rc) { \
+ ERROR("failed to unload a param\r\n"); \
+ return -EIO; \
+ } \
+ }
+
+#define PKA_RUN(sdev, pka, func, flags, size) \
+ do { \
+ mutex_lock(&sdev->doing); \
+ elppka_start(pka, func, flags, size); \
+ rc = pka_wait(sdev); \
+ if (rc) { \
+ ERROR("failed\r\n"); \
+ return rc; \
+ } \
+ } while (0)
+
+
+
+/**
+ Base Modular Arithmetic Library Functions
+
+ The Base Modular Arithmetic library suite provides a set of modular arithmetic operations commonly used by
+ cryptographic applications. These include Montgomery precomputation operations and other generic modular
+ operations.
+**/
+
+static int vic_rsa_calc_rinv(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *m,
+ u8 *rinv) // C0
+{
+ struct vic_sec_dev *sdev = ctx->sdev;
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, m);
+ PKA_RUN(sdev, pka, PKA_CALC_R_INV, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_C, 0, size, rinv);
+ return rc;
+}
+
+static int vic_rsa_calc_mp(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *rinv, // C0
+ const u8 *m, // D0
+ u8 *mp) // D1
+{
+ struct vic_sec_dev *sdev = ctx->sdev;
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_D, 2, size, rinv);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, m);
+ PKA_RUN(sdev, pka, PKA_CALC_MP, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_D, 1, size, mp);
+ return rc;
+}
+
+static int vic_rsa_calc_rsqr(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *rinv, // C0
+ const u8 *m, // D0
+ const u8 *mp, // D1
+ u8 *rsqr) // D3
+{
+ struct vic_sec_dev *sdev = ctx->sdev;
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_C, 0, size, rinv);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, m);
+ PKA_LOAD(pka, PKA_OPERAND_D, 1, size, mp);
+ PKA_RUN(sdev, pka, PKA_CALC_R_SQR, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_D, 3, size, rsqr);
+ return rc;
+}
+
+
+static int vic_rsa_calc_modexp(struct vic_sec_ctx *ctx, const u8 *src, // A0
+ u32 full_width, // F0
+ u8 *dst,
+ int enc) // A0
+{
+ struct vic_sec_dev *sdev = ctx->sdev;
+ struct pka_state *pka = &ctx->sdev->pka;
+ struct vic_rsa_key *rsa_key = &ctx->rsa_key;
+ size_t size = rsa_key->key_sz;
+ int rc;
+
+ PKA_LOAD(pka, PKA_OPERAND_A, 0, size, src);
+ if(enc) {
+ PKA_LOAD(pka, PKA_OPERAND_D, 2, size, rsa_key->e);
+ } else {
+ PKA_LOAD(pka, PKA_OPERAND_D, 2, size, rsa_key->d);
+ }
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, rsa_key->n);
+ PKA_LOAD(pka, PKA_OPERAND_D, 1, size, rsa_key->mp);
+ PKA_LOAD(pka, PKA_OPERAND_D, 3, size, rsa_key->rsqr);
+ PKA_RUN(sdev, pka, PKA_MODEXP, (full_width&0x1)<sdev;
+ struct pka_state *pka = &ctx->sdev->pka;
+ struct vic_rsa_key *rsa_key = &ctx->rsa_key;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_A, 2, size, msg_lo);
+ PKA_LOAD(pka, PKA_OPERAND_A, 3, size, msg_hi);
+ PKA_LOAD(pka, PKA_OPERAND_B, 2, size, rsa_key->p);
+ PKA_LOAD(pka, PKA_OPERAND_B, 3, size, rsa_key->q);
+ PKA_LOAD(pka, PKA_OPERAND_C, 2, size, rsa_key->qinv);
+ PKA_LOAD(pka, PKA_OPERAND_C, 3, size, rsa_key->dp);
+ PKA_LOAD(pka, PKA_OPERAND_D, 2, size, rsa_key->dq);
+ PKA_LOAD(pka, PKA_OPERAND_D, 5, size, rsa_key->rsqr_p);
+ PKA_LOAD(pka, PKA_OPERAND_D, 4, size, rsa_key->pmp);
+ PKA_LOAD(pka, PKA_OPERAND_D, 3, size, rsa_key->rsqr_q);
+ PKA_LOAD(pka, PKA_OPERAND_D, 6, size, rsa_key->qmp);
+ PKA_RUN(sdev, pka, PKA_CRT, (full_width&0x1)<sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_A, 0, size, x);
+ PKA_LOAD(pka, PKA_OPERAND_B, 0, size, y);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, m);
+ PKA_LOAD(pka, PKA_OPERAND_D, 1, size, mp);
+ PKA_LOAD(pka, PKA_OPERAND_D, 3, size, r_sqr);
+ PKA_RUN(pka, PKA_MODMULT, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_A, 0, size, c);
+ return rc;
+}
+
+static int pka_modadd(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *x, // A0
+ const u8 *y, // B0
+ const u8 *m, // D0
+ u8 *c) // A0
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_A, 0, size, x);
+ PKA_LOAD(pka, PKA_OPERAND_B, 0, size, y);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, m);
+ PKA_RUN(pka, PKA_MODADD, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_A, 0, size, c);
+ return rc;
+}
+
+static int pka_modsub(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *x, // A0
+ const u8 *y, // B0
+ const u8 *m, // D0
+ u8 *c) // A0
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_A, 0, size, x);
+ PKA_LOAD(pka, PKA_OPERAND_B, 0, size, y);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, m);
+ PKA_RUN(pka, PKA_MODSUB, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_A, 0, size, c);
+ return rc;
+}
+
+static int pka_reduce(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *x, // C0
+ const u8 *m, // D0
+ u8 *c) // A0
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_C, 0, size, x);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, m);
+ PKA_RUN(pka, PKA_REDUCE, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_A, 0, size, c);
+ return rc;
+}
+
+static int pka_moddiv(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *y, // C0
+ const u8 *x, // A0
+ const u8 *m, // D0
+ u8 *c) // C0
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_C, 0, size, y);
+ PKA_LOAD(pka, PKA_OPERAND_A, 0, size, x);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, m);
+ PKA_RUN(pka, PKA_MODDIV, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_C, 0, size, c);
+ return rc;
+}
+
+static int pka_modinv(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *x, // A0
+ const u8 *m, // D0
+ u8 *c) // C0
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_A, 0, size, x);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, m);
+ PKA_RUN(pka, PKA_MODINV, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_C, 0, size, c);
+ return rc;
+}
+
+static int pka_mult(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *a, // A0
+ const u8 *b, // B0
+ u8 *c_lo, // C0
+ u8 *c_hi) // C1
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_A, 0, size, a);
+ PKA_LOAD(pka, PKA_OPERAND_B, 0, size, b);
+ PKA_RUN(pka, PKA_MULT, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_C, 0, size, c_lo);
+ PKA_UNLOAD(pka, PKA_OPERAND_C, 1, size, c_hi);
+ return rc;
+}
+
+static int vic_rsa_crt_key_setup(struct vic_sec_ctx *ctx) // A3
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ struct vic_rsa_key *rsa_key = &ctx->rsa_key;
+ size_t size = rsa_key->key_sz >> 1;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, rsa_key->p);
+ PKA_LOAD(pka, PKA_OPERAND_B, 1, size, rsa_key->q);
+ PKA_LOAD(pka, PKA_OPERAND_D, 1, size, rsa_key->d + size);
+ PKA_LOAD(pka, PKA_OPERAND_D, 3, size, rsa_key->d);
+ PKA_RUN(pka, PKA_CRT_KEY_SETUP, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_B, 1, size, rsa_key->dp);
+ PKA_UNLOAD(pka, PKA_OPERAND_C, 0, size, rsa_key->dq);
+ PKA_UNLOAD(pka, PKA_OPERAND_A, 3, size, rsa_key->qinv);
+ return rc;
+}
+
+static int pka_rsa_bit_serial_mod(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *x, // C0
+ const u8 *m, // D0
+ u8 *c) // C0
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_C, 0, size, x);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, m);
+ PKA_RUN(pka, PKA_BIT_SERIAL_MOD, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_C, 0, size, c);
+ return rc;
+}
+
+static int pka_rsa_bit_serial_mod_dp(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *x_lo, // C0
+ const u8 *x_hi, // C1
+ const u8 *m, // D0
+ u8 *c) // C0
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_C, 0, size, x_lo);
+ PKA_LOAD(pka, PKA_OPERAND_C, 1, size, x_hi);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, m);
+ PKA_RUN(pka, PKA_BIT_SERIAL_MOD_DP, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_C, 0, size, c);
+ return rc;
+}
+
+
+static int pka_ecc_pmult(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *px, // A2
+ const u8 *py, // B2
+ const u8 *a, // A6
+ const u8 *k, // D7
+ const u8 *w, // A7
+ const u8 *p, // D0
+ const u8 *pp, // D1
+ const u8 *r_sqr_p, // D3
+ u32 blinding, // F0
+ u32 is_a_m3, // F3
+ u8 *qx, // A2
+ u8 *qy) // B2
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ u32 flags;
+
+ PKA_LOAD(pka, PKA_OPERAND_A, 2, size, px);
+ PKA_LOAD(pka, PKA_OPERAND_B, 2, size, py);
+ PKA_LOAD(pka, PKA_OPERAND_A, 6, size, a);
+ PKA_LOAD(pka, PKA_OPERAND_D, 7, size, k);
+ PKA_LOAD(pka, PKA_OPERAND_A, 7, size, w);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, p);
+ PKA_LOAD(pka, PKA_OPERAND_D, 1, size, pp);
+ PKA_LOAD(pka, PKA_OPERAND_D, 3, size, r_sqr_p);
+ flags = ((blinding&0x1)<sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_A, 2, size, px);
+ PKA_LOAD(pka, PKA_OPERAND_B, 2, size, py);
+ PKA_LOAD(pka, PKA_OPERAND_A, 3, size, qx);
+ PKA_LOAD(pka, PKA_OPERAND_B, 3, size, qy);
+ PKA_LOAD(pka, PKA_OPERAND_A, 6, size, a);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, p);
+ PKA_LOAD(pka, PKA_OPERAND_D, 1, size, pp);
+ PKA_LOAD(pka, PKA_OPERAND_D, 3, size, r_sqr_p);
+ PKA_RUN(pka, PKA_PADD, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_A, 2, size, rx);
+ PKA_UNLOAD(pka, PKA_OPERAND_B, 2, size, ry);
+ return rc;
+}
+
+static int pka_ecc_pdbl(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *px, // A3
+ const u8 *py, // B3
+ const u8 *a, // A6
+ const u8 *p, // D0
+ const u8 *pp, // D1
+ const u8 *r_sqr_p, // D3
+ u8 *qx, // A2
+ u8 *qy) // B2
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_A, 3, size, px);
+ PKA_LOAD(pka, PKA_OPERAND_B, 3, size, py);
+ PKA_LOAD(pka, PKA_OPERAND_A, 6, size, a);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, p);
+ PKA_LOAD(pka, PKA_OPERAND_D, 1, size, pp);
+ PKA_LOAD(pka, PKA_OPERAND_D, 3, size, r_sqr_p);
+ PKA_RUN(pka, PKA_PDBL, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_A, 2, size, qx);
+ PKA_UNLOAD(pka, PKA_OPERAND_B, 2, size, qy);
+ return rc;
+}
+
+static int pka_ecc_pver(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *px, // A2
+ const u8 *py, // B2
+ const u8 *a, // A6
+ const u8 *b, // A7
+ const u8 *p, // D0
+ const u8 *pp, // D1
+ const u8 *r_sqr_p, // D3
+ u32 *ok) // Z
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_A, 2, size, px);
+ PKA_LOAD(pka, PKA_OPERAND_B, 2, size, py);
+ PKA_LOAD(pka, PKA_OPERAND_A, 6, size, a);
+ PKA_LOAD(pka, PKA_OPERAND_A, 7, size, b);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, p);
+ PKA_LOAD(pka, PKA_OPERAND_D, 1, size, pp);
+ PKA_LOAD(pka, PKA_OPERAND_D, 3, size, r_sqr_p);
+ PKA_RUN(pka, PKA_PVER, 0, size);
+ if (ok) {
+ u32 flags = vic_pka_io_read32((void *)&pka->regbase[PKA_FLAGS]);
+ *ok = (flags>>PKA_FLAG_ZERO)&0x1;
+ }
+ return rc;
+}
+
+static int pka_ecc_shamir(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *px, // A2
+ const u8 *py, // B2
+ const u8 *qx, // A3
+ const u8 *qy, // B3
+ const u8 *a, // A6
+ const u8 *k, // A7
+ const u8 *l, // D7
+ const u8 *p, // D0
+ const u8 *pp, // D1
+ const u8 *r_sqr_p, // D3
+ u32 is_a_m3, // F3
+ u8 *rx, // A2
+ u8 *ry) // B2
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_A, 2, size, px);
+ PKA_LOAD(pka, PKA_OPERAND_B, 2, size, py);
+ PKA_LOAD(pka, PKA_OPERAND_A, 3, size, qx);
+ PKA_LOAD(pka, PKA_OPERAND_B, 3, size, qy);
+ PKA_LOAD(pka, PKA_OPERAND_A, 6, size, a);
+ PKA_LOAD(pka, PKA_OPERAND_A, 7, size, k);
+ PKA_LOAD(pka, PKA_OPERAND_D, 7, size, l);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, p);
+ PKA_LOAD(pka, PKA_OPERAND_D, 1, size, pp);
+ PKA_LOAD(pka, PKA_OPERAND_D, 3, size, r_sqr_p);
+ PKA_RUN(pka, PKA_SHAMIR, (is_a_m3&0x1)<sdev->pka;
+ int rc;
+
+ PKA_LOAD(pka, PKA_OPERAND_A, 2, size, px);
+ PKA_LOAD(pka, PKA_OPERAND_B, 2, size, py);
+ PKA_LOAD(pka, PKA_OPERAND_A, 6, size, a);
+ PKA_LOAD(pka, PKA_OPERAND_D, 7, size, k);
+ PKA_LOAD(pka, PKA_OPERAND_A, 7, size, w);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, p);
+ PKA_RUN(pka, PKA_PMULT_521, (blinding&0x1)<sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_A, 2, size, px);
+ PKA_LOAD(pka, PKA_OPERAND_B, 2, size, py);
+ PKA_LOAD(pka, PKA_OPERAND_A, 3, size, qx);
+ PKA_LOAD(pka, PKA_OPERAND_B, 3, size, qy);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, p);
+ PKA_RUN(pka, PKA_PADD_521, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_A, 2, size, rx);
+ PKA_UNLOAD(pka, PKA_OPERAND_B, 2, size, ry);
+ return rc;
+}
+
+static int pka_ecc_pdbl_521(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *px, // A3
+ const u8 *py, // B3
+ const u8 *a, // A6
+ const u8 *p, // D0
+ const u8 *pp, // D1
+ const u8 *r_sqr_p, // D3
+ u8 *qx, // A2
+ u8 *qy) // B2
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_A, 3, size, px);
+ PKA_LOAD(pka, PKA_OPERAND_B, 3, size, py);
+ PKA_LOAD(pka, PKA_OPERAND_A, 6, size, a);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, p);
+ PKA_LOAD(pka, PKA_OPERAND_D, 1, size, pp);
+ PKA_LOAD(pka, PKA_OPERAND_D, 3, size, r_sqr_p);
+ PKA_RUN(pka, PKA_PDBL_521, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_A, 2, size, qx);
+ PKA_UNLOAD(pka, PKA_OPERAND_B, 2, size, qy);
+ return rc;
+}
+
+static int pka_ecc_pver_521(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *px, // A2
+ const u8 *py, // B2
+ const u8 *a, // A6
+ const u8 *b, // A7
+ const u8 *p, // D0
+ u32 *ok) // Z
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_A, 2, size, px);
+ PKA_LOAD(pka, PKA_OPERAND_B, 2, size, py);
+ PKA_LOAD(pka, PKA_OPERAND_A, 6, size, a);
+ PKA_LOAD(pka, PKA_OPERAND_A, 7, size, b);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, p);
+ PKA_RUN(pka, PKA_PVER_521, 0, size);
+ if (ok) {
+ u32 flags = vic_pka_io_read32((void *)&pka->regbase[PKA_FLAGS]);
+ *ok = (flags>>PKA_FLAG_ZERO)&0x1;
+ }
+ return rc;
+}
+
+static int pka_ecc_modmult_521(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *x, // A0
+ const u8 *y, // B0
+ const u8 *m, // D0
+ u8 *c) // A0
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_A, 0, size, x);
+ PKA_LOAD(pka, PKA_OPERAND_B, 0, size, y);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, m);
+ PKA_RUN(pka, PKA_MODMULT_521, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_A, 0, size, c);
+ return rc;
+}
+
+static int pka_ecc_m_521_montmult(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *x, // A0
+ const u8 *y, // B0
+ const u8 *m, // D0
+ const u8 *mp, // D1
+ const u8 *r_sqr, // D3
+ u8 *c) // A0
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_A, 0, size, x);
+ PKA_LOAD(pka, PKA_OPERAND_B, 0, size, y);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, m);
+ PKA_LOAD(pka, PKA_OPERAND_D, 1, size, mp);
+ PKA_LOAD(pka, PKA_OPERAND_D, 3, size, r_sqr);
+ PKA_RUN(pka, PKA_M_521_MONTMULT, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_A, 0, size, c);
+ return rc;
+}
+
+static int pka_ecc_shamir_521(struct vic_sec_ctx *ctx, u32 size,
+ const u8 *px, // A2
+ const u8 *py, // B2
+ const u8 *qx, // A3
+ const u8 *qy, // B3
+ const u8 *a, // A6
+ const u8 *k, // A7
+ const u8 *l, // D7
+ const u8 *p, // D0
+ u8 *rx, // A2
+ u8 *ry) // B2
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ int rc;
+ PKA_LOAD(pka, PKA_OPERAND_A, 2, size, px);
+ PKA_LOAD(pka, PKA_OPERAND_B, 2, size, py);
+ PKA_LOAD(pka, PKA_OPERAND_A, 3, size, qx);
+ PKA_LOAD(pka, PKA_OPERAND_B, 3, size, qy);
+ PKA_LOAD(pka, PKA_OPERAND_A, 6, size, a);
+ PKA_LOAD(pka, PKA_OPERAND_A, 7, size, k);
+ PKA_LOAD(pka, PKA_OPERAND_D, 7, size, l);
+ PKA_LOAD(pka, PKA_OPERAND_D, 0, size, p);
+ PKA_RUN(pka, PKA_SHAMIR_521, 0, size);
+ PKA_UNLOAD(pka, PKA_OPERAND_A, 2, size, rx);
+ PKA_UNLOAD(pka, PKA_OPERAND_B, 2, size, ry);
+ return rc;
+}
+
+static void pka_clear_state(struct vic_sec_ctx *ctx)
+{
+ struct pka_state *pka = &ctx->sdev->pka;
+ pka->pka_done = 0;
+ pka->pka_err = 0;
+}
+#endif
+static void vic_rsa_free_key(struct vic_rsa_key *key)
+{
+ if(key->d)
+ kfree_sensitive(key->d);
+ if(key->p)
+ kfree_sensitive(key->p);
+ if(key->q)
+ kfree_sensitive(key->q);
+ if(key->dp)
+ kfree_sensitive(key->dp);
+ if(key->dq)
+ kfree_sensitive(key->dq);
+ if(key->qinv)
+ kfree_sensitive(key->qinv);
+ if(key->rinv)
+ kfree_sensitive(key->rinv);
+ if(key->rinv_p)
+ kfree_sensitive(key->rinv_p);
+ if(key->rinv_q)
+ kfree_sensitive(key->rinv_q);
+ if(key->mp)
+ kfree_sensitive(key->mp);
+ if(key->rsqr)
+ kfree_sensitive(key->rsqr);
+ if(key->rsqr_p)
+ kfree_sensitive(key->rsqr_p);
+ if(key->rsqr_q)
+ kfree_sensitive(key->rsqr_q);
+ if(key->pmp)
+ kfree_sensitive(key->pmp);
+ if(key->qmp)
+ kfree_sensitive(key->qmp);
+ if(key->e)
+ kfree(key->e);
+ if(key->n)
+ kfree(key->n);
+ memset(key, 0, sizeof(*key));
+}
+
+static int vic_rsa_pre_cal(struct vic_sec_ctx *ctx)
+{
+ struct vic_rsa_key *rsa_key = &ctx->rsa_key;
+ size_t size = rsa_key->key_sz;
+ int ret = -ENOMEM;
+
+ rsa_key->rinv = kzalloc(size, GFP_KERNEL);
+ if(!rsa_key->rinv)
+ goto err;
+
+ rsa_key->mp = kzalloc(size, GFP_KERNEL);
+ if(!rsa_key->mp)
+ goto err;
+
+ rsa_key->rsqr = kzalloc(size, GFP_KERNEL);
+ if(!rsa_key->rsqr)
+ goto err;
+
+ ret = vic_rsa_calc_rinv(ctx, size, rsa_key->n, rsa_key->rinv);
+ if(ret)
+ return ret;
+ ret = vic_rsa_calc_mp(ctx, size, rsa_key->rinv,rsa_key->n,rsa_key->mp);
+ if(ret)
+ return ret;
+
+ ret = vic_rsa_calc_rsqr(ctx, size, rsa_key->rinv, rsa_key->n, rsa_key->mp,
+ rsa_key->rsqr);
+
+ err:
+ return ret;
+}
+
+static int vic_rsa_pre_cal_crt(struct vic_sec_ctx *ctx)
+{
+ struct vic_rsa_key *rsa_key = &ctx->rsa_key;
+ int ret = -ENOMEM;
+ size_t size = rsa_key->key_sz >> 1;
+
+ rsa_key->rinv_p = kzalloc(size, GFP_KERNEL);
+ if(!rsa_key->rinv_p)
+ goto err;
+
+ rsa_key->rinv_q = kzalloc(size, GFP_KERNEL);
+ if(!rsa_key->rinv_q)
+ goto err;
+
+ rsa_key->pmp = kzalloc(size, GFP_KERNEL);
+ if(!rsa_key->pmp)
+ goto err;
+
+ rsa_key->qmp = kzalloc(size, GFP_KERNEL);
+ if(!rsa_key->qmp)
+ goto err;
+
+ rsa_key->rsqr_p = kzalloc(size, GFP_KERNEL);
+ if(!rsa_key->rsqr_p)
+ goto err;
+
+ rsa_key->rsqr_q = kzalloc(size, GFP_KERNEL);
+ if(!rsa_key->rsqr_q)
+ goto err;
+
+ ret = vic_rsa_calc_rinv(ctx, size, rsa_key->p, rsa_key->rinv_p);
+ if(ret)
+ return ret;
+
+ ret = vic_rsa_calc_mp(ctx, size, rsa_key->rinv_p, rsa_key->p, rsa_key->pmp);
+ if(ret)
+ return ret;
+
+ ret = vic_rsa_calc_rsqr(ctx, size, rsa_key->rinv_p, rsa_key->p, rsa_key->pmp,
+ rsa_key->rsqr_p);
+ if(ret)
+ return ret;
+
+
+ ret = vic_rsa_calc_rinv(ctx, size, rsa_key->q, rsa_key->rinv_q);
+ if(ret)
+ return ret;
+
+ ret = vic_rsa_calc_mp(ctx, size, rsa_key->rinv_q, rsa_key->q, rsa_key->qmp);
+ if(ret)
+ return ret;
+
+ ret = vic_rsa_calc_rsqr(ctx, size, rsa_key->rinv_q, rsa_key->q, rsa_key->qmp,
+ rsa_key->rsqr_q);
+
+ err:
+ return ret;
+}
+
+static int vic_rsa_enc_core(struct vic_sec_ctx *ctx, int enc)
+{
+ struct vic_sec_dev *sdev = ctx->sdev;
+ struct vic_sec_request_ctx *rctx = sdev->rctx;
+ struct vic_rsa_key *key = &ctx->rsa_key;
+ size_t data_len, total, count, data_offset;
+ int ret = 0;
+
+ rctx->offset = 0;
+ total = 0;
+
+
+ while(total < sdev->total_in) {
+ count = min (sdev->data_buf_len, sdev->total_in);
+ count = min (count, key->key_sz);
+ memset(sdev->data, 0, key->key_sz);
+ data_offset = key->key_sz - count;
+ data_len = vic_cryp_get_from_sg(rctx, rctx->offset, count, data_offset);
+ if(data_len < 0)
+ return data_len;
+ if(data_len != count) {
+ return -EINVAL;
+ }
+ if(!enc && key->crt_mode) {
+ size_t size = key->key_sz >> 1;
+ ret = vic_rsa_crt(ctx, size, sdev->data + size, sdev->data,
+ 0,sdev->data + key->key_sz + size, sdev->data + key->key_sz);
+ } else {
+ ret = vic_rsa_calc_modexp(ctx, sdev->data, 0, sdev->data + key->key_sz, enc);
+ }
+ if(ret) {
+ return ret;
+ }
+
+ sg_copy_buffer(rctx->out_sg,sg_nents(rctx->out_sg), sdev->data + key->key_sz,
+ key->key_sz, rctx->offset, 0);
+
+ rctx->offset += data_len;
+ total += data_len;
+ }
+
+ return ret;
+}
+
+static int vic_rsa_enc(struct akcipher_request *req)
+{
+ struct crypto_akcipher *tfm = crypto_akcipher_reqtfm(req);
+ struct vic_sec_ctx *ctx = akcipher_tfm_ctx(tfm);
+ struct vic_rsa_key *key = &ctx->rsa_key;
+ struct vic_sec_request_ctx *rctx = akcipher_request_ctx(req);
+ int ret = 0;
+
+ if (unlikely(!key->n || !key->e))
+ return -EINVAL;
+
+
+ if (req->dst_len < key->key_sz) {
+ req->dst_len = key->key_sz;
+ dev_err(ctx->sdev->dev, "Output buffer length less than parameter n\n");
+ return -EOVERFLOW;
+ }
+
+ rctx->sg = req->src;
+ rctx->out_sg = req->dst;
+ rctx->sdev = ctx->sdev;
+ ctx->sdev->rctx = rctx;
+ ctx->sdev->total_in = req->src_len;
+ ctx->sdev->total_out = req->dst_len;
+
+ ret = vic_rsa_pre_cal(ctx);
+ if(ret) {
+ return ret;
+ }
+
+ ret = vic_rsa_enc_core(ctx, 1);
+
+ return ret;
+}
+
+static int vic_rsa_dec(struct akcipher_request *req)
+{
+ struct crypto_akcipher *tfm = crypto_akcipher_reqtfm(req);
+ struct vic_sec_ctx *ctx = akcipher_tfm_ctx(tfm);
+ struct vic_rsa_key *key = &ctx->rsa_key;
+ struct vic_sec_request_ctx *rctx = akcipher_request_ctx(req);
+ int ret = 0;
+
+ if (unlikely(!key->n || !key->d))
+ return -EINVAL;
+
+ if (req->dst_len < key->key_sz) {
+ req->dst_len = key->key_sz;
+ dev_err(ctx->sdev->dev, "Output buffer length less than parameter n\n");
+ return -EOVERFLOW;
+ }
+
+ rctx->sg = req->src;
+ rctx->out_sg = req->dst;
+ rctx->sdev = ctx->sdev;
+ ctx->sdev->rctx = rctx;
+ ctx->sdev->total_in = req->src_len;
+ ctx->sdev->total_out = req->dst_len;
+
+ if(key->crt_mode) {
+ ret = vic_rsa_pre_cal_crt(ctx);
+ } else {
+ ret = vic_rsa_pre_cal(ctx);
+ }
+
+ if(ret) {
+ return ret;
+ }
+
+ ret = vic_rsa_enc_core(ctx, 0);
+ return ret;
+}
+
+static unsigned long vic_rsa_enc_fn_id(unsigned int len)
+{
+ unsigned int bitslen = len << 3;
+
+ switch (bitslen) {
+ //case 256:
+ case 512:
+ case 768:
+ case 1024:
+ case 1536:
+ case 2048:
+ case 3072:
+ case 4096:
+ return 0;
+ default:
+ return -EINVAL;
+ };
+}
+
+static int vic_rsa_set_n(struct vic_rsa_key *rsa_key, const char *value,
+ size_t vlen)
+{
+ const char *ptr = value;
+ int ret;
+
+ while (!*ptr && vlen) {
+ ptr++;
+ vlen--;
+ }
+
+ rsa_key->key_sz = vlen;
+ ret = -EINVAL;
+ /* invalid key size provided */
+ if (vic_rsa_enc_fn_id(rsa_key->key_sz))
+ goto err;
+
+ ret = -ENOMEM;
+ rsa_key->n = kmemdup(ptr, rsa_key->key_sz, GFP_KERNEL);
+ if (!rsa_key->n)
+ goto err;
+
+ return 0;
+ err:
+ rsa_key->key_sz = 0;
+ rsa_key->n = NULL;
+ return ret;
+}
+
+static int vic_rsa_set_e(struct vic_rsa_key *rsa_key, const char *value,
+ size_t vlen)
+{
+ const char *ptr = value;
+
+ while (!*ptr && vlen) {
+ ptr++;
+ vlen--;
+ }
+
+ if (!rsa_key->key_sz || !vlen || vlen > rsa_key->key_sz) {
+ rsa_key->e = NULL;
+ return -EINVAL;
+ }
+
+ rsa_key->e = kzalloc(rsa_key->key_sz, GFP_KERNEL);
+ if (!rsa_key->e)
+ return -ENOMEM;
+
+ memcpy(rsa_key->e + (rsa_key->key_sz - vlen), ptr, vlen);
+ return 0;
+}
+
+static int vic_rsa_set_d(struct vic_rsa_key *rsa_key, const char *value,
+ size_t vlen)
+{
+ const char *ptr = value;
+ int ret;
+
+ while (!*ptr && vlen) {
+ ptr++;
+ vlen--;
+ }
+
+ ret = -EINVAL;
+ if (!rsa_key->key_sz || !vlen || vlen > rsa_key->key_sz)
+ goto err;
+
+ ret = -ENOMEM;
+ rsa_key->d = kzalloc(rsa_key->key_sz, GFP_KERNEL);
+ if (!rsa_key->d)
+ goto err;
+
+ memcpy(rsa_key->d + (rsa_key->key_sz - vlen), ptr, vlen);
+ return 0;
+ err:
+ rsa_key->d = NULL;
+ return ret;
+}
+
+static void vic_rsa_drop_leading_zeros(const char **ptr, unsigned int *len)
+{
+ while (!**ptr && *len) {
+ (*ptr)++;
+ (*len)--;
+ }
+}
+
+static void vic_rsa_setkey_crt(struct vic_rsa_key *rsa_key, struct rsa_key *raw_key)
+{
+ const char *ptr;
+ unsigned int len;
+ unsigned int half_key_sz = rsa_key->key_sz / 2;
+
+ /* p */
+ ptr = raw_key->p;
+ len = raw_key->p_sz;
+ vic_rsa_drop_leading_zeros(&ptr, &len);
+ if (!len) {
+ goto err;
+ }
+ rsa_key->p = kzalloc(half_key_sz, GFP_KERNEL);
+ if (!rsa_key->p) {
+ goto err;
+ }
+ memcpy(rsa_key->p + (half_key_sz - len), ptr, len);
+
+ /* q */
+ ptr = raw_key->q;
+ len = raw_key->q_sz;
+ vic_rsa_drop_leading_zeros(&ptr, &len);
+ if (!len) {
+ goto free_p;
+ }
+ rsa_key->q = kzalloc(half_key_sz, GFP_KERNEL);
+ if (!rsa_key->q) {
+ goto free_p;
+ }
+ memcpy(rsa_key->q + (half_key_sz - len), ptr, len);
+
+ /* dp */
+ ptr = raw_key->dp;
+ len = raw_key->dp_sz;
+ vic_rsa_drop_leading_zeros(&ptr, &len);
+ if (!len) {
+ goto free_q;
+ }
+ rsa_key->dp = kzalloc(half_key_sz, GFP_KERNEL);
+ if (!rsa_key->dp) {
+ goto free_q;
+ }
+ memcpy(rsa_key->dp + (half_key_sz - len), ptr, len);
+
+ /* dq */
+ ptr = raw_key->dq;
+ len = raw_key->dq_sz;
+ vic_rsa_drop_leading_zeros(&ptr, &len);
+ if (!len) {
+ goto free_dp;
+ }
+ rsa_key->dq = kzalloc(half_key_sz, GFP_KERNEL);
+ if (!rsa_key->dq) {
+ goto free_dp;
+ }
+ memcpy(rsa_key->dq + (half_key_sz - len), ptr, len);
+
+ /* qinv */
+ ptr = raw_key->qinv;
+ len = raw_key->qinv_sz;
+ vic_rsa_drop_leading_zeros(&ptr, &len);
+ if (!len) {
+ goto free_dq;
+ }
+ rsa_key->qinv = kzalloc(half_key_sz, GFP_KERNEL);
+ if (!rsa_key->qinv) {
+ goto free_dq;
+ }
+ memcpy(rsa_key->qinv + (half_key_sz - len), ptr, len);
+
+ rsa_key->crt_mode = true;
+ return;
+
+ free_dq:
+ memset(rsa_key->dq, '\0', half_key_sz);
+ kfree_sensitive(rsa_key->dq);
+ rsa_key->dq = NULL;
+ free_dp:
+ memset(rsa_key->dp, '\0', half_key_sz);
+ kfree_sensitive(rsa_key->dp);
+ rsa_key->dp = NULL;
+ free_q:
+ memset(rsa_key->q, '\0', half_key_sz);
+ kfree_sensitive(rsa_key->q);
+ rsa_key->q = NULL;
+ free_p:
+ memset(rsa_key->p, '\0', half_key_sz);
+ kfree_sensitive(rsa_key->p);
+ rsa_key->p = NULL;
+ err:
+ rsa_key->crt_mode = false;
+}
+
+static int vic_rsa_setkey(struct crypto_akcipher *tfm, const void *key,
+ unsigned int keylen, bool private)
+{
+ struct vic_sec_ctx *ctx = akcipher_tfm_ctx(tfm);
+ struct rsa_key raw_key = {NULL};
+ struct vic_rsa_key *rsa_key = &ctx->rsa_key;
+ int ret;
+
+ vic_rsa_free_key(rsa_key);
+
+ if (private)
+ ret = rsa_parse_priv_key(&raw_key, key, keylen);
+ else
+ ret = rsa_parse_pub_key(&raw_key, key, keylen);
+ if (ret < 0)
+ goto free;
+
+ ret = vic_rsa_set_n(rsa_key, raw_key.n, raw_key.n_sz);
+ if (ret < 0)
+ goto free;
+ ret = vic_rsa_set_e(rsa_key, raw_key.e, raw_key.e_sz);
+ if (ret < 0)
+ goto free;
+ if (private) {
+ ret = vic_rsa_set_d(rsa_key, raw_key.d, raw_key.d_sz);
+ if (ret < 0)
+ goto free;
+ vic_rsa_setkey_crt(rsa_key, &raw_key);
+ }
+
+ if (!rsa_key->n || !rsa_key->e) {
+ /* invalid key provided */
+ ret = -EINVAL;
+ goto free;
+ }
+ if (private && !rsa_key->d) {
+ /* invalid private key provided */
+ ret = -EINVAL;
+ goto free;
+ }
+
+ return 0;
+ free:
+ vic_rsa_free_key(rsa_key);
+ return ret;
+}
+
+static int vic_rsa_set_pub_key(struct crypto_akcipher *tfm, const void *key,
+ unsigned int keylen)
+{
+ return vic_rsa_setkey(tfm, key, keylen, false);
+}
+
+static int vic_rsa_set_priv_key(struct crypto_akcipher *tfm, const void *key,
+ unsigned int keylen)
+{
+ return vic_rsa_setkey(tfm, key, keylen, true);
+}
+
+static unsigned int vic_rsa_max_size(struct crypto_akcipher *tfm)
+{
+ struct vic_sec_ctx *ctx = akcipher_tfm_ctx(tfm);
+
+ return ctx->rsa_key.key_sz;
+}
+
+static int vic_pka_reload_firmware(struct pka_state *pka)
+{
+ u32 fw_words, i, *fw;
+ int ret = 0;
+
+ fw_words = sizeof(PKA_FW)/sizeof(u32);
+ if (fw_words > pka->cfg.fw_ram_size) {
+ ERROR("large firmware\r\n");
+ return -EINVAL;
+ }
+
+ fw = (u32 *)(pka->regbase + pka->cfg.ram_offset);
+ for (i = 0; i < fw_words; fw++, i++) {
+ vic_pka_io_write32(fw, PKA_FW[i]);
+ }
+
+ return ret;
+}
+
+/* Per session pkc's driver context creation function */
+static int vic_rsa_init_tfm(struct crypto_akcipher *tfm)
+{
+ struct vic_sec_ctx *ctx = akcipher_tfm_ctx(tfm);
+
+ //akcipher_set_reqsize(tfm, sizeof(struct vic_sec_request_ctx));
+ ctx->sdev = vic_sec_find_dev(ctx);
+
+ if (!ctx->sdev)
+ return -ENODEV;
+ mutex_lock(&ctx->sdev->lock);
+ vic_clk_enable(ctx->sdev,PKA_CLK);
+ vic_pka_reload_firmware(&ctx->sdev->pka);
+
+ return 0;
+}
+
+/* Per session pkc's driver context cleanup function */
+static void vic_rsa_exit_tfm(struct crypto_akcipher *tfm)
+{
+ struct vic_sec_ctx *ctx = akcipher_tfm_ctx(tfm);
+ struct vic_rsa_key *key = (struct vic_rsa_key *)&ctx->rsa_key;
+
+ vic_rsa_free_key(key);
+ vic_clk_disable(ctx->sdev,PKA_CLK);
+ mutex_unlock(&ctx->sdev->lock);
+ //vic_jr_free(ctx->dev);
+}
+
+irqreturn_t vic_pka_irq_done(struct vic_sec_dev *sdev)
+{
+ struct pka_state *pka = &sdev->pka;
+ u32 status;
+
+ status = vic_pka_io_read32((void *)&sdev->pka.regbase[PKA_F_STACK]);
+ if (status & 0xF) {
+ pka->pka_err |= BIT(PKA_F_STACK);
+ }
+
+ status = vic_pka_io_read32((void *)&sdev->pka.regbase[PKA_STATUS]);
+ if (!(status & BIT(PKA_STAT_IRQ))) {
+ pka->pka_err |= BIT(PKA_STAT_IRQ);
+ }
+
+ status = vic_pka_io_read32((void *)&sdev->pka.regbase[PKA_RC]);
+ if (status & 0x00FF0000) {
+ pka->pka_err |= BIT(PKA_RC);
+ }
+
+ vic_pka_io_write32(&sdev->pka.regbase[PKA_STATUS], BIT(PKA_STAT_IRQ));
+
+ status = vic_pka_io_read32((void *)&sdev->pka.regbase[PKA_STATUS]);
+ if (status & BIT(PKA_STAT_IRQ)) {
+ pka->pka_err |= BIT(PKA_STAT_IRQ);
+ }
+
+ pka->pka_done = 1;
+ status = vic_pka_io_read32((void *)&sdev->pka.regbase[PKA_IRQ_EN]);
+
+ //up(&sdev->core_running);
+ return IRQ_WAKE_THREAD;
+}
+
+static struct akcipher_alg vic_rsa = {
+ .encrypt = vic_rsa_enc,
+ .decrypt = vic_rsa_dec,
+ .sign = vic_rsa_dec,
+ .verify = vic_rsa_enc,
+ .set_pub_key = vic_rsa_set_pub_key,
+ .set_priv_key = vic_rsa_set_priv_key,
+ .max_size = vic_rsa_max_size,
+ .init = vic_rsa_init_tfm,
+ .exit = vic_rsa_exit_tfm,
+ .reqsize = sizeof(struct vic_sec_request_ctx),
+ .base = {
+ .cra_name = "rsa",
+ .cra_driver_name = "rsa-vic",
+ .cra_flags = CRYPTO_ALG_TYPE_AKCIPHER |
+ CRYPTO_ALG_ASYNC,
+ .cra_priority = 3000,
+ .cra_module = THIS_MODULE,
+ .cra_ctxsize = sizeof(struct vic_sec_ctx),
+ },
+};
+
+int vic_pka_init(struct pka_state *pka)
+{
+ u32 fw_words, i, *fw;
+ int ret = 0;
+
+ ret = elppka_setup(pka);
+ if(ret)
+ return ret;
+
+ fw_words = sizeof(PKA_FW)/sizeof(u32);
+ if (fw_words > pka->cfg.fw_ram_size) {
+ ERROR("large firmware\r\n");
+ return -EINVAL;
+ }
+
+ fw = (u32 *)(pka->regbase + pka->cfg.ram_offset);
+ for (i = 0; i < fw_words; fw++, i++) {
+ vic_pka_io_write32(fw, PKA_FW[i]);
+ }
+
+ vic_pka_io_write32(&pka->regbase[PKA_IRQ_EN], 1 << PKA_IRQ_EN_STAT);
+
+ vic_pka_io_write32(&pka->regbase[PKA_WATCHDOG], 100000000);
+
+ return ret;
+}
+
+int vic_pka_register_algs(void)
+{
+ int ret;
+
+ ret = crypto_register_akcipher(&vic_rsa);
+ if (ret)
+ printk("VIC RSA registration failed\n");
+
+ return ret;
+}
+
+int vic_pka_unregister_algs(void)
+{
+ crypto_unregister_akcipher(&vic_rsa);
+ return 0;
+}
diff --git a/drivers/crypto/sifive-vic/vic-pka.h b/drivers/crypto/sifive-vic/vic-pka.h
new file mode 100644
index 000000000000..429815793a48
--- /dev/null
+++ b/drivers/crypto/sifive-vic/vic-pka.h
@@ -0,0 +1,173 @@
+#ifndef __VIC_PKA_H__
+#define __VIC_PKA_H__
+#include
+#include
+
+#define CRYPTO_OK ( 0)
+#define CRYPTO_FAILED ( -1)
+#define CRYPTO_INPROGRESS ( -2)
+#define CRYPTO_INVALID_HANDLE ( -3)
+#define CRYPTO_INVALID_CONTEXT ( -4)
+#define CRYPTO_INVALID_SIZE ( -5)
+#define CRYPTO_NOT_INITIALIZED ( -6)
+#define CRYPTO_NO_MEM ( -7)
+#define CRYPTO_INVALID_ALG ( -8)
+#define CRYPTO_INVALID_KEY_SIZE ( -9)
+#define CRYPTO_INVALID_ARGUMENT ( -10)
+#define CRYPTO_MODULE_DISABLED ( -11)
+#define CRYPTO_NOT_IMPLEMENTED ( -12)
+#define CRYPTO_INVALID_BLOCK_ALIGNMENT ( -13)
+#define CRYPTO_INVALID_MODE ( -14)
+#define CRYPTO_INVALID_KEY ( -15)
+#define CRYPTO_AUTHENTICATION_FAILED ( -16)
+#define CRYPTO_INVALID_IV_SIZE ( -17)
+#define CRYPTO_MEMORY_ERROR ( -18)
+#define CRYPTO_LAST_ERROR ( -19)
+#define CRYPTO_HALTED ( -20)
+#define CRYPTO_TIMEOUT ( -21)
+#define CRYPTO_SRM_FAILED ( -22)
+#define CRYPTO_COMMON_ERROR_MAX (-100)
+#define CRYPTO_INVALID_ICV_KEY_SIZE (-100)
+#define CRYPTO_INVALID_PARAMETER_SIZE (-101)
+#define CRYPTO_SEQUENCE_OVERFLOW (-102)
+#define CRYPTO_DISABLED (-103)
+#define CRYPTO_INVALID_VERSION (-104)
+#define CRYPTO_FATAL (-105)
+#define CRYPTO_INVALID_PAD (-106)
+#define CRYPTO_FIFO_FULL (-107)
+#define CRYPTO_INVALID_SEQUENCE (-108)
+#define CRYPTO_INVALID_FIRMWARE (-109)
+#define CRYPTO_NOT_FOUND (-110)
+#define CRYPTO_CMD_FIFO_INACTIVE (-111)
+
+enum PKA_ENTRY_E {
+ PKA_MODMULT = 10, //0x0a
+ PKA_MODADD = 11, //0x0b
+ PKA_MODSUB = 12, //0x0c
+ PKA_MODDIV = 13, //0x0d
+ PKA_MODINV = 14, //0x0e
+ PKA_REDUCE = 15, //0x0f
+ PKA_CALC_MP = 16, //0x10
+ PKA_CALC_R_INV = 17, //0x11
+ PKA_CALC_R_SQR = 18, //0x12
+ PKA_MULT = 19, //0x13
+ PKA_MODEXP = 20, //0x14
+ PKA_CRT_KEY_SETUP = 21, //0x15
+ PKA_CRT = 22, //0x16
+ PKA_BIT_SERIAL_MOD_DP = 23, //0x17
+ PKA_BIT_SERIAL_MOD = 24, //0x18
+ PKA_PMULT = 25, //0x19
+ PKA_PDBL = 26, //0x1a
+ PKA_PDBL_STD_PRJ = 27, //0x1b
+ PKA_PADD = 28, //0x1c
+ PKA_PADD_STD_PRJ = 29, //0x1d
+ PKA_PVER = 30, //0x1e
+ PKA_STD_PRJ_TO_AFFINE = 31, //0x1f
+ PKA_IS_P_EQUAL_Q = 32, //0x20
+ PKA_IS_P_REFLECT_Q = 33, //0x21
+ PKA_IS_A_M3 = 34, //0x22
+ PKA_SHAMIR = 35, //0x23
+ PKA_PMULT_521 = 36, //0x24
+ PKA_PDBL_521 = 37, //0x25
+ PKA_PADD_521 = 38, //0x26
+ PKA_PVER_521 = 39, //0x27
+ PKA_M_521_MONTMULT = 40, //0x28
+ PKA_MODMULT_521 = 41, //0x29
+ PKA_SHAMIR_521 = 42, //0x2a
+};
+
+struct pka_state {
+ u32 *regbase;
+
+ struct pka_config {
+ unsigned alu_size, rsa_size, ecc_size;
+ unsigned fw_ram_size, fw_rom_size;
+ unsigned ram_offset, rom_offset;
+ } cfg;
+ uint32_t pka_done;
+ uint32_t pka_err;
+};
+
+struct pka_fw {
+ unsigned long ram_size, rom_size;
+ const char *errmsg;
+
+ struct pka_fw_tag {
+ unsigned long origin, tag_length, timestamp, md5_coverage;
+ unsigned char md5[16];
+ } ram_tag, rom_tag;
+
+ /* For internal use */
+ struct elppka_fw_priv *priv;
+};
+
+struct vic_rsa_key {
+ u8 *n;
+ u8 *e;
+ u8 *d;
+ u8 *p;
+ u8 *q;
+ u8 *dp;
+ u8 *dq;
+ u8 *qinv;
+ u8 *rinv;
+ u8 *rinv_p;
+ u8 *rinv_q;
+ u8 *mp;
+ u8 *rsqr;
+ u8 *rsqr_p;
+ u8 *rsqr_q;
+ u8 *pmp;
+ u8 *qmp;
+ size_t key_sz;
+ bool crt_mode;
+};
+
+enum {
+ PKA_OPERAND_A,
+ PKA_OPERAND_B,
+ PKA_OPERAND_C,
+ PKA_OPERAND_D,
+ PKA_OPERAND_MAX
+};
+
+static inline void vic_pka_io_write32(void *addr, unsigned long val)
+{
+ writel(val,addr);
+}
+
+static inline unsigned int vic_pka_io_read32(void *addr)
+{
+ return readl(addr);
+}
+
+int elppka_setup(struct pka_state *pka);
+
+int elppka_start(struct pka_state *pka, uint32_t entry, uint32_t flags,
+ unsigned size);
+void elppka_abort(struct pka_state *pka);
+int elppka_get_status(struct pka_state *pka, unsigned *code);
+
+int elppka_load_operand(struct pka_state *pka, unsigned bank, unsigned index,
+ unsigned size, const uint8_t *data);
+int elppka_unload_operand(struct pka_state *pka, unsigned bank, unsigned index,
+ unsigned size, uint8_t *data);
+
+void elppka_set_byteswap(struct pka_state *pka, int swap);
+
+/* Firmware image handling */
+int elppka_fw_parse(struct pka_fw *fw, const unsigned char *data,
+ unsigned long len);
+void elppka_fw_free(struct pka_fw *fw);
+
+int elppka_fw_lookup_entry(struct pka_fw *fw, const char *entry);
+
+int elppka_fw_load(struct pka_state *pka, struct pka_fw *fw);
+
+/* The firmware timestamp epoch (2009-11-11 11:00:00Z) as a UNIX timestamp. */
+#define PKA_FW_TS_EPOCH 1257937200ull
+
+/* Resolution of the timestamp, in seconds. */
+#define PKA_FW_TS_RESOLUTION 20
+
+#endif
diff --git a/drivers/crypto/sifive-vic/vic-sec.c b/drivers/crypto/sifive-vic/vic-sec.c
new file mode 100644
index 000000000000..7d75f033d03e
--- /dev/null
+++ b/drivers/crypto/sifive-vic/vic-sec.c
@@ -0,0 +1,308 @@
+/*
+ ******************************************************************************
+ * @file vic-sec.c
+ * @author StarFive Technology
+ * @version V1.0
+ * @date 08/13/2020
+ * @brief
+ ******************************************************************************
+ * @copy
+ *
+ * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, STARFIVE SHALL NOT BE HELD LIABLE FOR ANY
+ * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ * © COPYRIGHT 2020 Shanghai StarFive Technology Co., Ltd.
+ */
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+#include "vic-sec.h"
+
+#define DRIVER_NAME "vic-sec"
+
+#define CRYP_AUTOSUSPEND_DELAY 50
+
+struct vic_dev_list {
+ struct list_head dev_list;
+ spinlock_t lock; /* protect dev_list */
+};
+
+static struct vic_dev_list dev_list = {
+ .dev_list = LIST_HEAD_INIT(dev_list.dev_list),
+ .lock = __SPIN_LOCK_UNLOCKED(dev_list.lock),
+};
+
+struct vic_sec_dev *vic_sec_find_dev(struct vic_sec_ctx *ctx)
+{
+ struct vic_sec_dev *sdev = NULL, *tmp;
+
+ spin_lock_bh(&dev_list.lock);
+ if (!ctx->sdev) {
+ list_for_each_entry(tmp, &dev_list.dev_list, list) {
+ sdev = tmp;
+ break;
+ }
+ ctx->sdev = sdev;
+ } else {
+ sdev = ctx->sdev;
+ }
+
+ spin_unlock_bh(&dev_list.lock);
+
+ return sdev;
+}
+
+static irqreturn_t vic_cryp_irq_thread(int irq, void *arg)
+{
+ struct vic_sec_dev *sdev = (struct vic_sec_dev *) arg;
+
+ mutex_unlock(&sdev->doing);
+
+ return IRQ_HANDLED;
+}
+
+static irqreturn_t vic_cryp_irq(int irq, void *arg)
+{
+ struct vic_sec_dev *sdev = (struct vic_sec_dev *) arg;
+ irqreturn_t ret = IRQ_WAKE_THREAD;
+
+ if(sdev->status.aes_busy || sdev->status.sha_busy) {
+ sdev->status.v = readl(sdev->io_base + SEC_STATUS_REG);
+ writel(sdev->status.v, sdev->io_base + SEC_STATUS_REG);
+ } else {
+ ret = vic_pka_irq_done(sdev);
+ }
+
+ return ret;
+}
+static const struct of_device_id vic_dt_ids[] = {
+ { .compatible = "starfive,vic-sec", .data = NULL},
+ {},
+};
+MODULE_DEVICE_TABLE(of, vic_dt_ids);
+
+extern void vic_hash_test(struct vic_sec_dev *sdev);
+
+static int vic_cryp_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct vic_sec_dev *sdev;
+ struct resource *res;
+ int irq, ret;
+ int pages = 0;
+
+ sdev = devm_kzalloc(dev, sizeof(*sdev), GFP_KERNEL);
+ if (!sdev)
+ return -ENOMEM;
+
+ sdev->dev = dev;
+
+ mutex_init(&sdev->lock);
+ mutex_init(&sdev->doing);
+
+ sdev->io_base = devm_platform_ioremap_resource_byname(pdev, "secmem");
+ if (IS_ERR(sdev->io_base))
+ return PTR_ERR(sdev->io_base);
+
+ sdev->clk_base = devm_platform_ioremap_resource_byname(pdev, "secclk");
+ if (IS_ERR(sdev->clk_base))
+ return PTR_ERR(sdev->clk_base);
+
+ sdev->pka.regbase = sdev->io_base + PKA_IO_BASE_OFFSET;
+
+ /* pka irq handle check */
+ sdev->status.v = 0;
+
+ irq = platform_get_irq(pdev, 0);
+ if (irq < 0) {
+ dev_err(dev, "Cannot get IRQ resource\n");
+ return irq;
+ }
+
+ ret = devm_request_threaded_irq(dev, irq, vic_cryp_irq,
+ vic_cryp_irq_thread, IRQF_ONESHOT,
+ dev_name(dev), sdev);
+ if (ret) {
+ dev_err(&pdev->dev, "Can't get interrupt working.\n");
+ return ret;
+ }
+
+ sdev->clk = devm_clk_get(dev, NULL);
+ if (IS_ERR(sdev->clk)) {
+ dev_err(dev, "Could not get clock\n");
+ return PTR_ERR(sdev->clk);
+ }
+
+ ret = clk_prepare_enable(sdev->clk);
+ if (ret) {
+ dev_err(sdev->dev, "Failed to enable clock\n");
+ return ret;
+ }
+
+ platform_set_drvdata(pdev, sdev);
+
+ spin_lock(&dev_list.lock);
+ list_add(&sdev->list, &dev_list.dev_list);
+ spin_unlock(&dev_list.lock);
+
+ pages = get_order(VIC_AES_MSG_RAM_SIZE);
+
+ sdev->data = (void *)__get_free_pages(GFP_KERNEL, pages);
+ if (!sdev->data) {
+ dev_err(sdev->dev, "Can't allocate pages when unaligned\n");
+ return -EFAULT;
+ }
+ sdev->data_buf_len = VIC_AES_BUF_RAM_SIZE;
+ sdev->pages_count = pages;
+
+ /* Initialize crypto engine */
+ sdev->engine = crypto_engine_alloc_init(dev, 1);
+ if (!sdev->engine) {
+ ret = -ENOMEM;
+ goto err_engine;
+ }
+
+ ret = crypto_engine_start(sdev->engine);
+ if (ret)
+ goto err_engine_start;
+
+ ret = vic_hash_register_algs();
+ if (ret) {
+ goto err_algs_sha;
+ }
+
+ vic_clk_enable(sdev,AES_CLK);
+ ret = vic_aes_register_algs();
+ if (ret) {
+ vic_clk_disable(sdev,AES_CLK);
+ dev_err(dev, "Could not register algs\n");
+ goto err_algs_aes;
+ }
+ vic_clk_disable(sdev,AES_CLK);
+
+ vic_clk_enable(sdev,PKA_CLK);
+ ret = vic_pka_init(&sdev->pka);
+ if (ret) {
+ vic_clk_disable(sdev,PKA_CLK);
+ dev_err(dev, "pka init error\n");
+ goto err_pka_init;
+ }
+
+ ret = vic_pka_register_algs();
+ if (ret) {
+ vic_clk_disable(sdev,PKA_CLK);
+ dev_err(dev, "Could not register algs\n");
+ goto err_algs_pka;
+ }
+ vic_clk_disable(sdev,PKA_CLK);
+ dev_info(dev, "Initialized\n");
+
+ return 0;
+
+err_algs_pka:
+err_pka_init:
+ vic_aes_unregister_algs();
+err_algs_aes:
+ vic_hash_unregister_algs();
+err_engine_start:
+ crypto_engine_exit(sdev->engine);
+err_engine:
+err_algs_sha:
+ free_pages((unsigned long)sdev->data, pages);
+ spin_lock(&dev_list.lock);
+ list_del(&sdev->list);
+ spin_unlock(&dev_list.lock);
+
+ clk_disable_unprepare(sdev->clk);
+
+ return ret;
+}
+
+static int vic_cryp_remove(struct platform_device *pdev)
+{
+ struct vic_sec_dev *sdev = platform_get_drvdata(pdev);
+
+ if (!sdev)
+ return -ENODEV;
+
+
+ vic_pka_unregister_algs();
+ vic_aes_unregister_algs();
+ vic_hash_unregister_algs();
+
+ crypto_engine_exit(sdev->engine);
+
+ free_pages((unsigned long)sdev->data, sdev->pages_count);
+
+ spin_lock(&dev_list.lock);
+ list_del(&sdev->list);
+ spin_unlock(&dev_list.lock);
+
+ clk_disable_unprepare(sdev->clk);
+
+ return 0;
+}
+
+#ifdef CONFIG_PM
+static int vic_cryp_runtime_suspend(struct device *dev)
+{
+ struct vic_sec_dev *cryp = dev_get_drvdata(dev);
+
+ clk_disable_unprepare(cryp->clk);
+
+ return 0;
+}
+
+static int vic_cryp_runtime_resume(struct device *dev)
+{
+ struct vic_sec_dev *cryp = dev_get_drvdata(dev);
+ int ret;
+
+ ret = clk_prepare_enable(cryp->clk);
+ if (ret) {
+ dev_err(cryp->dev, "Failed to prepare_enable clock\n");
+ return ret;
+ }
+
+ return 0;
+}
+#endif
+
+static const struct dev_pm_ops vic_cryp_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
+ pm_runtime_force_resume)
+ SET_RUNTIME_PM_OPS(vic_cryp_runtime_suspend,
+ vic_cryp_runtime_resume, NULL)
+};
+
+static struct platform_driver vic_cryp_driver = {
+ .probe = vic_cryp_probe,
+ .remove = vic_cryp_remove,
+ .driver = {
+ .name = DRIVER_NAME,
+ .pm = &vic_cryp_pm_ops,
+ .of_match_table = vic_dt_ids,
+ },
+};
+
+module_platform_driver(vic_cryp_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Huan Feng ");
+MODULE_DESCRIPTION("Starfive VIC CRYP SHA and AES driver");
diff --git a/drivers/crypto/sifive-vic/vic-sec.h b/drivers/crypto/sifive-vic/vic-sec.h
new file mode 100644
index 000000000000..0967127cad0a
--- /dev/null
+++ b/drivers/crypto/sifive-vic/vic-sec.h
@@ -0,0 +1,446 @@
+#ifndef __VIC_SEC_H__
+#define __VIC_SEC_H__
+
+#include
+#include
+#include
+#include
+
+#include "vic-pka.h"
+
+#define SEC_IE_REG 0x00
+#define SEC_STATUS_REG 0x04
+
+#define MAX_KEY_SIZE SHA512_BLOCK_SIZE
+
+#define AES_ABLK 1
+#define AES_AEAD 2
+
+#define SHA_CLK 1
+#define AES_CLK 2
+#define PKA_CLK 3
+
+#define AES_CLK_OFFSET 0x0
+#define SHA_CLK_OFFSET 0x4
+#define PKA_CLK_OFFSET 0x8
+
+#define HASH_OP_UPDATE 1
+#define HASH_OP_FINAL 2
+
+#define CFG_REGS_LEN 32
+
+#define PKA_IO_BASE_OFFSET (32*1024)
+
+union vic_sec_ie {
+ u32 v;
+ struct {
+ u32 sec_done_ie :1 ;
+ u32 mac_valid_ie :1 ;
+ u32 rsvd_0 :30;
+ };
+};
+
+union vic_sec_status {
+ u32 v;
+ struct {
+ u32 sec_done :1 ;
+ u32 aes_mac_valid :1 ;
+ u32 aes_busy :1 ;
+ u32 sha_busy :1 ;
+ u32 rsvd_1 :28;
+ };
+};
+
+#define swap32(val) ( \
+ (((u32)(val) << 24) & (u32)0xFF000000) | \
+ (((u32)(val) << 8) & (u32)0x00FF0000) | \
+ (((u32)(val) >> 8) & (u32)0x0000FF00) | \
+ (((u32)(val) >> 24) & (u32)0x000000FF))
+
+static inline void vic_write_n (void *addr, const u8 *value, unsigned int count)
+{
+ unsigned int *data = (unsigned int *) value;
+ int loop = count >> 2;
+
+ for (; loop--; data++, addr += sizeof(unsigned int))
+ writel_relaxed(swap32(*data), addr);
+
+ if(unlikely(count & 0x3)) {
+ int ext = count & 0x3;
+ value = (u8 *)data;
+ for(; ext; ext--){
+ writeb_relaxed(*(value + ext - 1), addr + 4 - ext);
+ }
+ }
+}
+
+static inline void vic_read_n (void *addr, unsigned char *out, unsigned int count)
+{
+ unsigned int *data = (unsigned int *) out;
+ int loop = count >> 2;
+
+ for (; loop--; data++, addr += sizeof(unsigned int))
+ *data = swap32(readl_relaxed(addr));
+
+ if(unlikely(count & 0x3)) {
+ int ext = count & 0x3;
+ out = (u8 *)data;
+ for(; ext; ext-- )
+ *(out + ext - 1) = readb_relaxed(addr + 4 - ext);
+ }
+}
+
+struct vic_sec_ctx {
+ struct crypto_engine_ctx enginectx;
+ struct vic_sec_dev *sdev;
+ struct crypto_aead *sw_cipher;
+ unsigned long flags;
+
+ u8 key[MAX_KEY_SIZE];
+ int keylen;
+ int begin_new;
+ struct vic_rsa_key rsa_key;
+};
+
+struct vic_sec_dev {
+ struct list_head list;
+ struct device *dev;
+ struct clk *clk;
+ void __iomem *io_base;
+ void __iomem *clk_base;
+ void *data;
+ //void *data_out;
+ int pages_count;
+ struct vic_sec_ctx *ctx;
+ struct vic_sec_request_ctx *rctx;
+
+ struct ahash_request *req;
+ struct crypto_engine *engine;
+
+ unsigned long flags;
+
+ union vic_sec_ie ie;
+ union vic_sec_status status;
+ struct mutex doing;
+
+ struct mutex lock; /* protects req / areq */
+ struct skcipher_request *sreq;
+ struct aead_request *areq;
+
+ size_t data_buf_len;
+ size_t data_offset;
+ size_t authsize;
+
+ size_t total_in;
+ size_t total_out;
+
+ bool sgs_copied;
+
+ int in_sg_len;
+ int out_sg_len;
+
+ struct scatter_walk in_walk;
+ struct scatter_walk out_walk;
+
+ u32 last_ctr[4];
+ u32 ctr_over_count;
+ u32 gcm_ctr;
+
+ struct pka_state pka;
+ char fw_name[32];
+
+ /*
+ * If you hold a reference to the firmware (obtained by pka_get_firmware),
+ * then the fw pointer is guaranteed to remain valid until the reference is
+ * dropped; otherwise, one must only access the fw pointer while holding
+ * the fw_mutex.
+ */
+ struct pka_fw_priv *fw;
+ struct mutex fw_mutex;
+
+ /*
+ * Rather than access PKA flags register directly, store flags to be used
+ * for the next operation in work_flags, and cache flags from the previous
+ * operation in saved_flags.
+ */
+ u32 work_flags, saved_flags;
+};
+
+// aes
+
+#define VIC_AES_QUEUE_SIZE 512
+#define VIC_AES_BUF_ORDER 2
+
+#define VIC_AES_CTRL_REG 0x40
+#define VIC_AES_CFG_REGS 0x44
+
+#define VIC_AES_MSG_RAM_OFFSET (16*1024)
+#define VIC_AES_MSG_RAM_SIZE (8*1024)
+// 8160 is mod(32) and mod(24)
+#define VIC_AES_BUF_RAM_SIZE 8160
+
+#define VIC_AES_CTX_RAM_OFFSET (VIC_AES_MSG_RAM_OFFSET + VIC_AES_MSG_RAM_SIZE)
+#define VIC_AES_CTX_RAM_SIZE (4*1024)
+
+#define VIC_AES_CTX_KEYS_OFS 0x00
+#define VIC_AES_CTX_KEYS_SIZE 0x20
+#define VIC_AES_CTX_CTR_OFS 0x30
+#define VIC_AES_CTX_CTR_SIZE 0x20
+#define VIC_AES_CTX_IV_OFS 0x40
+#define VIC_AES_CTX_IV_SIZE 0x10
+#define VIC_AES_CTX_MAC_OFS 0x50
+#define VIC_AES_CTX_MAC_SIZE 0x10
+
+#define VIC_AES_IV_LEN AES_BLOCK_SIZE
+#define VIC_AES_CTR_LEN AES_BLOCK_SIZE
+
+union vic_aes_ctrl {
+ unsigned int v;
+ struct {
+ unsigned int aes_mode :4 ;
+#define VIC_AES_MODE_ECB 0
+#define VIC_AES_MODE_CBC 1
+#define VIC_AES_MODE_CTR 2
+#define VIC_AES_MODE_CCM 3
+#define VIC_AES_MODE_CMAC 4
+#define VIC_AES_MODE_GCM 5
+#define VIC_AES_MODE_OFB 7
+#define VIC_AES_MODE_CFB 8
+ unsigned int aes_encrypt :1 ;
+#define VIC_AES_DECRYPT 0
+#define VIC_AES_ENCRYPT 1
+ unsigned int aes_msg_begin :1 ;
+ unsigned int aes_msg_end :1 ;
+ unsigned int aes_str_ctx :1 ; // Stores intermediate context data back into context memory.
+ unsigned int aes_ret_ctx :1 ; // Retrieves intermediate context data from context memory.
+ unsigned int aes_inv_key :1 ;
+ unsigned int aes_str_inv_key :1 ;
+ unsigned int rsvd_0 :1 ;
+ unsigned int aes_key_sz :2 ;
+#define VIC_AES_KEY_SZ_128 0
+#define VIC_AES_KEY_SZ_192 1
+#define VIC_AES_KEY_SZ_256 2
+ unsigned int rsvd_1 :17; // [30:14]
+ unsigned int aes_start :1 ;
+ };
+};
+
+union vic_aes_cfg {
+ unsigned int vs[1];
+ struct {
+ // 0x44
+ unsigned int aes_tag_msg_addr :13;
+ unsigned int rsvd_0 :18; // [30:13]
+ unsigned int aes_str_tag2msg :1 ;
+
+ // 0x48
+ unsigned int authsize :4; //unsigned int aes_mac_len :4 ;
+ unsigned int rsvd_1 :28; // [31:4]
+
+ // 0x4C
+ unsigned int aes_blk_idx :9 ;
+#define VIC_AES_BLK_SIZE 0x10
+#define VIC_AES_BLKS_NUM 512 //8k/0x10
+ unsigned int rsvd_2 :23; // [31:9]
+
+ // 0x50
+ unsigned int aes_ctx_idx :5 ;
+#define VIC_AES_CTX_SIZE 0x60
+#define VIC_AES_CTXS_NUM 32 //4k/0x60
+ unsigned int rsvd_3 :27; // [31:5]
+
+ // 0x54
+ unsigned int aes_assoclen :14; //aes_aad_len :14;
+ unsigned int rsvd_4 :18; // [31:14]
+
+ // 0x58
+ unsigned int aes_n_bytes :14; // Number of bytes of message to cipher in current operation.
+ unsigned int rsvd_5 :18; // [31:14]
+
+ // 0x5C
+ unsigned int aes_tot_n_bytes :28; // Total length of message data (across all segments), not including AD, to process. Required in CCM and GCM modes.
+ unsigned int rsvd_6 :4 ; // [31:28]
+
+ // 0x60
+ unsigned int aes_assoclen_tot :28; //aes_aad_len_tot :28;
+ unsigned int rsvd_7 :4 ; // [31:28]
+ };
+};
+
+#define KEY_SET_FLAG 1
+#define IV_SET_FLAG (1 << 1)
+#define CTR_SET_FLAG (1 << 2)
+#define AD_SET_FLAG (1 << 3)
+#define MAC_SET_FLAG (1 << 4)
+
+
+extern void vic_aes_irq_complete(int irq, void *arg);
+
+// sha
+#define HASH_BUFLEN 256
+
+#define HASH_AUTOSUSPEND_DELAY 50
+#define CTX_BLOCK_SIZE 64
+#define VIC_MAX_ALIGN_SIZE 128
+
+union vic_sha_ctrl {
+ u32 v;
+ struct {
+ // 0x80
+ u32 sha_mode :4 ;
+#define SHA_MODE_224 0
+#define SHA_MODE_256 1
+#define SHA_MODE_384 2
+#define SHA_MODE_512 3
+#define SHA_MODE_1 4
+#define SHA_MODE_MD5 5
+#define SHA_MODE_512_DIV_224 7
+#define SHA_MODE_512_DIV_256 8
+ u32 sha_hmac :1 ;
+ u32 sha_sslmac :1 ;
+ u32 sha_msg_begin :1 ;
+ u32 sha_msg_end :1 ;
+ u32 sha_store_ctx :1 ;
+ u32 sha_retrieve_ctx :1 ;
+ u32 rsvd_0 :21; // [30:10]
+ u32 sha_start :1 ;
+ };
+};
+
+union vic_sha_cfg {
+ u32 vs[1];
+ struct {
+ // 0x84
+#define SHA_CTX_MSG_ADDR 0x100
+#define SHA_CTX_MSG_ADDR_ROUNDS 0x100
+ u32 sha_ctx_msg_addr :13;
+ u32 rsvd_0 :18; // [30:13]
+ u32 sha_store_ctx_2msg :1 ;
+
+ // 0x88
+ u32 sha_secret_bytes :8 ;
+ u32 sha_secret_addr :11;
+ u32 rsvd_1 :13; // [31:19]
+
+ // 0x8C
+ u32 sha_num_bytes :14;
+ u32 rsvd_2 :18; // [31:14]
+
+ // 0x90
+ u32 sha_icv_len :6 ;
+ u32 rsvd_3 :26; // [31:6]
+
+ // 0x94
+ u32 sha_ctx_idx :6 ;
+ u32 rsvd_4 :26; // [31:6]
+
+ // 0x98
+ u32 sha_blk_idx :7 ;
+ u32 rsvd_5 :25; // [31:7]
+
+ // 0x9C
+ u32 sha_tot_bytes :26;
+ u32 rsvd_6 :6 ; // [31:26]
+
+ // 0xA0
+ u32 sha_seqn0 ;
+ };
+};
+
+struct vic_sec_request_ctx {
+ struct vic_sec_dev *sdev;
+ unsigned long mode;
+ unsigned long flags;
+ unsigned long op;
+
+ u8 digest[CTX_BLOCK_SIZE] __aligned(sizeof(u32));
+ size_t digcnt;
+ size_t bufcnt;
+ size_t buflen;
+ size_t cmac_up_len;
+
+ size_t assoclen;
+ unsigned int is_load;
+ unsigned int req_type;
+
+
+ struct scatterlist *sg;
+ struct scatterlist *out_sg;
+ unsigned int offset;
+ unsigned int total;
+ unsigned long msg_tot;
+
+ union vic_aes_cfg aes_cfg;
+ union vic_aes_ctrl aes_ctrl;
+ union vic_sha_cfg sha_cfg;
+ union vic_sha_ctrl sha_ctrl;
+ unsigned int last_block_idx;
+
+ u8 buffer[HASH_BUFLEN] __aligned(sizeof(u32));
+};
+
+static inline void vic_clk_enable(struct vic_sec_dev *sdev, int type)
+{
+ u32 val;
+
+ switch(type) {
+ case AES_CLK:
+ val = readl(sdev->clk_base + AES_CLK_OFFSET);
+ val &= ~(0x1 << 31);
+ val |= 0x1 << 31;
+ writel(val, sdev->clk_base + AES_CLK_OFFSET);
+ break;
+ case PKA_CLK:
+ val = readl(sdev->clk_base + PKA_CLK_OFFSET);
+ val &= ~(0x1 << 31);
+ val |= 0x1 << 31;
+ writel(val, sdev->clk_base + PKA_CLK_OFFSET);
+ break;
+ }
+}
+
+static inline void vic_clk_disable(struct vic_sec_dev *sdev, int type)
+{
+ u32 val;
+
+ switch(type) {
+ case AES_CLK:
+ val = readl(sdev->clk_base + AES_CLK_OFFSET);
+ val &= ~(0x1 << 31);
+ val |= 0x0 << 31;
+ writel(val, sdev->clk_base + AES_CLK_OFFSET);
+ break;
+ case PKA_CLK:
+ val = readl(sdev->clk_base + PKA_CLK_OFFSET);
+ val &= ~(0x1 << 31);
+ val |= 0x0 << 31;
+ writel(val, sdev->clk_base + PKA_CLK_OFFSET);
+ break;
+ }
+}
+
+#if 0
+struct vic_hash_algs_info {
+ struct ahash_alg *algs_list;
+ size_t size;
+};
+
+struct vic_hash_pdata {
+ struct vic_hash_algs_info *algs_info;
+ size_t algs_info_size;
+};
+#endif
+extern int vic_aes_register_algs(void);
+extern int vic_aes_unregister_algs(void);
+extern struct vic_sec_dev *vic_sec_find_dev(struct vic_sec_ctx *ctx);
+extern int vic_cryp_get_from_sg(struct vic_sec_request_ctx *rctx, size_t offset,
+ size_t count,size_t data_offset);
+
+extern int vic_hash_register_algs(void);
+extern int vic_hash_unregister_algs(void);
+
+extern int vic_pka_register_algs(void);
+extern int vic_pka_unregister_algs(void);
+extern irqreturn_t vic_pka_irq_done(struct vic_sec_dev *sdev);
+extern int vic_pka_init(struct pka_state *pka);
+#endif
diff --git a/drivers/crypto/sifive-vic/vic-sha.c b/drivers/crypto/sifive-vic/vic-sha.c
new file mode 100644
index 000000000000..efdc9a2bbd01
--- /dev/null
+++ b/drivers/crypto/sifive-vic/vic-sha.c
@@ -0,0 +1,1101 @@
+/*
+ ******************************************************************************
+ * @file vic-sha.c
+ * @author StarFive Technology
+ * @version V1.0
+ * @date 08/13/2020
+ * @brief
+ ******************************************************************************
+ * @copy
+ *
+ * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, STARFIVE SHALL NOT BE HELD LIABLE FOR ANY
+ * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ * © COPYRIGHT 2020 Shanghai StarFive Technology Co., Ltd.
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+
+#include "vic-sec.h"
+
+#define HASH_IE 0x00
+#define HASH_STATUS 0x04
+#define HASH_CTRL 0x80
+#define HASH_CFG 0x84
+
+#define SHA_MSG_RAM_OFFSET (16*1024)
+#define SHA_MSG_RAM_SIZE (8*1024)
+#define SHA_CTX_RAM_OFFSET (SHA_MSG_RAM_OFFSET + SHA_MSG_RAM_SIZE)
+#define SHA_CTX_RAM_SIZE (4*1024)
+#define SHA_SEC_RAM_OFFSET (SHA_CTX_RAM_OFFSET + SHA_CTX_RAM_SIZE)
+#define SHA_SEC_RAM_SIZE (2*1024)
+
+
+#define HASH_FLAGS_INIT BIT(0)
+#define HASH_FLAGS_FINAL BIT(3)
+#define HASH_FLAGS_FINUP BIT(4)
+
+#define HASH_FLAGS_ALGO_MASK GENMASK(8, 13)
+#define HASH_FLAGS_MD5 BIT(8)
+#define HASH_FLAGS_SHA1 BIT(9)
+#define HASH_FLAGS_SHA224 BIT(10)
+#define HASH_FLAGS_SHA256 BIT(11)
+#define HASH_FLAGS_SHA384 BIT(12)
+#define HASH_FLAGS_SHA512 BIT(13)
+#define HASH_FLAGS_ERRORS BIT(14)
+#define HASH_FLAGS_HMAC BIT(15)
+
+static inline int vic_hash_wait_busy(struct vic_sec_dev *hdev)
+{
+ int ret = -1;
+
+ mutex_lock(&hdev->doing);
+ if(hdev->status.sec_done && (!hdev->status.sha_busy))
+ ret = 0;
+ mutex_unlock(&hdev->doing);
+ return ret;
+ //return wait_cond_timeout(hdev->status.sec_done && (!hdev->status.sha_busy), 10, 10000);
+}
+
+static int vic_hash_write_key(struct vic_sec_dev *hdev)
+{
+ struct crypto_ahash *tfm = crypto_ahash_reqtfm(hdev->req);
+ struct vic_sec_ctx *ctx = crypto_ahash_ctx(tfm);
+ int keylen = ctx->keylen;
+ void *key = ctx->key;
+
+ if (keylen) {
+ vic_write_n(hdev->io_base + SHA_SEC_RAM_OFFSET, key, keylen);
+ }
+
+ return 0;
+}
+
+static void vic_hash_append_sg(struct vic_sec_request_ctx *rctx)
+{
+ size_t count;
+
+ while ((rctx->bufcnt < rctx->buflen) && rctx->total) {
+ count = min(rctx->sg->length - rctx->offset, rctx->total);
+ count = min(count, rctx->buflen - rctx->bufcnt);
+
+ if (count <= 0) {
+ if ((rctx->sg->length == 0) && !sg_is_last(rctx->sg)) {
+ rctx->sg = sg_next(rctx->sg);
+ continue;
+ } else {
+ break;
+ }
+ }
+
+ scatterwalk_map_and_copy(rctx->buffer + rctx->bufcnt, rctx->sg,
+ rctx->offset, count, 0);
+
+ rctx->bufcnt += count;
+ rctx->offset += count;
+ rctx->total -= count;
+
+ if (rctx->offset == rctx->sg->length) {
+ rctx->sg = sg_next(rctx->sg);
+ if (rctx->sg)
+ rctx->offset = 0;
+ else
+ rctx->total = 0;
+ }
+ }
+}
+
+static int vic_sha_start(struct vic_sec_request_ctx *rctx)
+{
+ struct vic_sec_dev *sdev = rctx->sdev;
+ int loop, int_len = sizeof(unsigned int);
+
+ if(sdev->status.sha_busy) {
+ return -EBUSY;
+ }
+
+ for(loop = 0; loop < CFG_REGS_LEN / int_len; loop++) {
+ writel(*(rctx->sha_cfg.vs + loop), sdev->io_base + HASH_CFG + loop * int_len);
+ }
+ sdev->ie.sec_done_ie = 1;
+ mutex_lock(&sdev->doing);
+
+ writel(sdev->ie.v, sdev->io_base + HASH_IE);
+ sdev->status.sha_busy = 1;
+ sdev->status.sec_done = 0;
+ rctx->sha_ctrl.sha_start = 1;
+ writel(rctx->sha_ctrl.v, sdev->io_base + HASH_CTRL);
+
+ return 0;
+}
+
+static int vic_hash_xmit_cpu(struct vic_sec_dev *sdev,
+ struct vic_sec_request_ctx *rctx, int final)
+{
+ struct crypto_ahash *tfm = crypto_ahash_reqtfm(sdev->req);
+ struct vic_sec_ctx *ctx = crypto_ahash_ctx(tfm);
+ int length = rctx->bufcnt;
+ int ret = -EINPROGRESS;
+
+ memset(&rctx->sha_cfg,0,sizeof(rctx->sha_cfg));
+ memset(&rctx->sha_ctrl,0,sizeof(rctx->sha_ctrl));
+
+ if (final) {
+ if(rctx->msg_tot){
+ rctx->sha_cfg.sha_num_bytes = length;
+ rctx->sha_cfg.sha_tot_bytes = rctx->msg_tot + length;
+ rctx->sha_cfg.sha_store_ctx_2msg = 1;
+ rctx->sha_cfg.sha_ctx_msg_addr = SHA_CTX_MSG_ADDR;
+ rctx->sha_cfg.sha_ctx_idx = 0;
+ rctx->sha_ctrl.sha_mode = rctx->mode;
+ rctx->sha_ctrl.sha_msg_end = 1;
+ rctx->sha_ctrl.sha_retrieve_ctx = 1;
+ } else {
+ rctx->sha_cfg.sha_num_bytes = length;
+ rctx->sha_cfg.sha_tot_bytes = length;
+ rctx->sha_cfg.sha_store_ctx_2msg = 1;
+ rctx->sha_cfg.sha_ctx_msg_addr = SHA_CTX_MSG_ADDR;
+ rctx->sha_cfg.sha_ctx_idx = 0;
+
+ rctx->sha_ctrl.sha_mode = rctx->mode;
+ rctx->sha_ctrl.sha_msg_begin = 1;
+ rctx->sha_ctrl.sha_msg_end = 1;
+ rctx->sha_ctrl.sha_store_ctx = 1;
+ }
+ sdev->flags |= HASH_FLAGS_FINAL;
+ ret = 0;
+ } else {
+ rctx->msg_tot += length;
+
+ rctx->sha_cfg.sha_num_bytes = length;
+ rctx->sha_cfg.sha_ctx_idx = 0;
+
+ rctx->sha_ctrl.sha_store_ctx = 1;
+ rctx->sha_ctrl.sha_mode = rctx->mode;
+ if(rctx->last_block_idx == 0){
+ rctx->sha_ctrl.sha_msg_begin = 1;
+ } else {
+ rctx->sha_ctrl.sha_retrieve_ctx = 1;
+ }
+
+ rctx->last_block_idx = 1;
+ }
+
+ if (rctx->flags & HASH_FLAGS_HMAC) {
+ rctx->sha_cfg.sha_secret_bytes = ctx->keylen;
+ rctx->sha_ctrl.sha_hmac = 1;
+ }
+
+ // put_msg
+ vic_write_n(sdev->io_base + SHA_MSG_RAM_OFFSET, rctx->buffer, rctx->bufcnt);
+
+ //set key
+ vic_hash_write_key(sdev);
+
+ //start
+ vic_sha_start(rctx);
+
+ //wait();
+ if(vic_hash_wait_busy(sdev))
+ ret = -ETIMEDOUT;
+
+ return ret;
+}
+
+static int vic_hash_update_cpu(struct vic_sec_dev *hdev)
+{
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(hdev->req);
+ int err = 0, final;
+
+ dev_dbg(hdev->dev, "%s flags %lx\n", __func__, rctx->flags);
+
+ final = (rctx->flags & HASH_FLAGS_FINUP);
+
+ while ((rctx->total >= rctx->buflen) ||
+ (rctx->bufcnt + rctx->total >= rctx->buflen)) {
+ vic_hash_append_sg(rctx);
+
+ err = vic_hash_xmit_cpu(hdev, rctx, 0);
+ rctx->bufcnt = 0;
+ }
+
+ vic_hash_append_sg(rctx);
+
+ if (final) {
+ err = vic_hash_xmit_cpu(hdev, rctx,
+ (rctx->flags & HASH_FLAGS_FINUP));
+ rctx->bufcnt = 0;
+ } else {
+ err = vic_hash_xmit_cpu(hdev, rctx,
+ 0);
+ rctx->bufcnt = 0;
+ }
+
+ return err;
+}
+
+static int vic_hash_init(struct ahash_request *req)
+{
+ struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
+ struct vic_sec_ctx *ctx = crypto_ahash_ctx(tfm);
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+ struct vic_sec_dev *hdev = ctx->sdev;
+
+ memset(rctx,0,sizeof(struct vic_sec_request_ctx));
+
+ rctx->sdev = hdev;
+
+ rctx->sdev->req = req;
+
+ rctx->digcnt = crypto_ahash_digestsize(tfm);
+ switch (rctx->digcnt) {
+ case MD5_DIGEST_SIZE:
+ rctx->mode = SHA_MODE_MD5;
+ break;
+ case SHA1_DIGEST_SIZE:
+ rctx->mode = SHA_MODE_1;
+ break;
+ case SHA224_DIGEST_SIZE:
+ rctx->mode = SHA_MODE_224;
+ break;
+ case SHA256_DIGEST_SIZE:
+ rctx->mode = SHA_MODE_256;
+ break;
+ case SHA384_DIGEST_SIZE:
+ rctx->mode = SHA_MODE_384;
+ break;
+ case SHA512_DIGEST_SIZE:
+ rctx->mode = SHA_MODE_512;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ rctx->bufcnt = 0;
+ rctx->buflen = HASH_BUFLEN;
+ rctx->total = 0;
+ rctx->msg_tot = 0;
+ rctx->offset = 0;
+ rctx->is_load = 0;
+ rctx->last_block_idx = 0;
+
+ memset(rctx->buffer, 0, HASH_BUFLEN);
+
+ if (ctx->flags & HASH_FLAGS_HMAC)
+ rctx->flags |= HASH_FLAGS_HMAC;
+
+ dev_dbg(hdev->dev, "%s Flags %lx\n", __func__, rctx->flags);
+
+ return 0;
+}
+
+static int vic_hash_update_req(struct vic_sec_dev *hdev)
+{
+ return vic_hash_update_cpu(hdev);
+}
+
+static int vic_hash_final_req(struct vic_sec_dev *hdev)
+{
+ struct ahash_request *req = hdev->req;
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+ int err;
+
+ err = vic_hash_xmit_cpu(hdev, rctx, 1);
+
+ rctx->bufcnt = 0;
+
+
+ return err;
+}
+
+static void vic_hash_set_ctx(struct ahash_request *req)
+{
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+
+ vic_write_n(rctx->sdev->io_base + SHA_CTX_RAM_OFFSET,
+ rctx->digest, CTX_BLOCK_SIZE);
+}
+
+static void vic_hash_copy_hash(struct ahash_request *req)
+{
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+ unsigned int hashsize;
+
+ switch (rctx->mode) {
+ case SHA_MODE_MD5:
+ hashsize = MD5_DIGEST_SIZE;
+ break;
+ case SHA_MODE_1:
+ hashsize = SHA1_DIGEST_SIZE;
+ break;
+ case SHA_MODE_224:
+ hashsize = SHA224_DIGEST_SIZE;
+ break;
+ case SHA_MODE_256:
+ hashsize = SHA256_DIGEST_SIZE;
+ break;
+ case SHA_MODE_384:
+ hashsize = SHA384_DIGEST_SIZE;
+ break;
+ case SHA_MODE_512:
+ hashsize = SHA512_DIGEST_SIZE;
+ break;
+ default:
+ return;
+ }
+
+ vic_read_n(rctx->sdev->io_base + SHA_MSG_RAM_OFFSET + rctx->sha_cfg.sha_ctx_msg_addr,
+ rctx->digest, hashsize);
+}
+
+static int vic_hash_finish(struct ahash_request *req)
+{
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+
+ if (!req->result)
+ return -EINVAL;
+
+ memcpy(req->result, rctx->digest, rctx->digcnt);
+
+ return 0;
+}
+
+static void vic_hash_finish_req(struct ahash_request *req, int err)
+{
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+ struct vic_sec_dev *hdev = rctx->sdev;
+
+ if (!err && (HASH_FLAGS_FINAL & hdev->flags)) {
+ vic_hash_copy_hash(req);
+ err = vic_hash_finish(req);
+ hdev->flags &= ~(HASH_FLAGS_FINAL |
+ HASH_FLAGS_INIT | HASH_FLAGS_HMAC);
+ } else {
+ rctx->flags |= HASH_FLAGS_ERRORS;
+ }
+
+ crypto_finalize_hash_request(hdev->engine, req, err);
+}
+
+static int vic_hash_one_request(struct crypto_engine *engine, void *areq);
+static int vic_hash_prepare_req(struct crypto_engine *engine, void *areq);
+
+static int vic_hash_handle_queue(struct vic_sec_dev *hdev,
+ struct ahash_request *req)
+{
+ return crypto_transfer_hash_request_to_engine(hdev->engine, req);
+}
+
+static int vic_hash_prepare_req(struct crypto_engine *engine, void *areq)
+{
+ struct ahash_request *req = container_of(areq, struct ahash_request,
+ base);
+ struct vic_sec_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
+ struct vic_sec_dev *hdev = ctx->sdev;
+ struct vic_sec_request_ctx *rctx;
+
+ if (!hdev) {
+ return -ENODEV;
+ }
+
+ rctx = ahash_request_ctx(req);
+
+ dev_dbg(hdev->dev, "processing new req, op: %lu, nbytes %d\n",
+ rctx->op, req->nbytes);
+
+ return 0;
+}
+
+static int vic_hash_one_request(struct crypto_engine *engine, void *areq)
+{
+ struct ahash_request *req = container_of(areq, struct ahash_request,
+ base);
+ struct vic_sec_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
+ struct vic_sec_dev *hdev = ctx->sdev;
+ struct vic_sec_request_ctx *rctx;
+ int err = 0;
+
+ if (!hdev) {
+ return -ENODEV;
+ }
+
+ rctx = ahash_request_ctx(req);
+
+ if(rctx->is_load) {
+ vic_hash_set_ctx(req);
+ rctx->is_load = 0;
+ }
+
+ if (rctx->op == HASH_OP_UPDATE){
+ err = vic_hash_update_req(hdev);
+ } else if (rctx->op == HASH_OP_FINAL) {
+ err = vic_hash_final_req(hdev);
+ }
+
+ if (err != -EINPROGRESS)
+ /* done task will not finish it, so do it here */
+ vic_hash_finish_req(req, err);
+
+ return 0;
+}
+
+static int vic_hash_enqueue(struct ahash_request *req, unsigned int op)
+{
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+ struct vic_sec_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
+ struct vic_sec_dev *hdev = ctx->sdev;
+
+ rctx->op = op;
+
+ return vic_hash_handle_queue(hdev, req);
+}
+
+static int vic_hash_update(struct ahash_request *req)
+{
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+
+ if (!req->nbytes)
+ return 0;
+
+ rctx->total = req->nbytes;
+ rctx->sg = req->src;
+ rctx->offset = 0;
+
+ if ((rctx->total >= rctx->buflen) ||
+ (rctx->bufcnt + rctx->total >= rctx->buflen)) {
+ if(rctx->is_load) {
+ vic_hash_set_ctx(req);
+ rctx->is_load = 0;
+ }
+ while ((rctx->total >= rctx->buflen) ||
+ (rctx->bufcnt + rctx->total >= rctx->buflen)) {
+ vic_hash_append_sg(rctx);
+
+ vic_hash_xmit_cpu(rctx->sdev, rctx, 0);
+ rctx->bufcnt = 0;
+ }
+ rctx->is_load = 1;
+ vic_read_n(rctx->sdev->io_base + SHA_CTX_RAM_OFFSET,
+ rctx->digest, CTX_BLOCK_SIZE);
+ }
+
+ if ((rctx->bufcnt + rctx->total < rctx->buflen)) {
+ vic_hash_append_sg(rctx);
+ return 0;
+ }
+
+
+ return vic_hash_enqueue(req, HASH_OP_UPDATE);
+}
+
+static int vic_hash_final(struct ahash_request *req)
+{
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+
+ rctx->flags |= HASH_FLAGS_FINUP;
+
+ return vic_hash_enqueue(req, HASH_OP_FINAL);
+}
+
+static int vic_hash_finup(struct ahash_request *req)
+{
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+ int err1, err2;
+
+ rctx->flags |= HASH_FLAGS_FINUP;
+
+ err1 = vic_hash_update(req);
+
+ if (err1 == -EINPROGRESS || err1 == -EBUSY) {
+ return err1;
+ }
+
+ /*
+ * final() has to be always called to cleanup resources
+ * even if update() failed, except EINPROGRESS
+ */
+ err2 = vic_hash_final(req);
+
+ return err1 ?: err2;
+}
+
+static int vic_hash_digest(struct ahash_request *req)
+{
+ return vic_hash_init(req) ?: vic_hash_finup(req);
+}
+
+static int vic_hash_export(struct ahash_request *req, void *out)
+{
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+
+ memcpy(out, rctx, sizeof(*rctx));
+
+ return 0;
+}
+
+static int vic_hash_import(struct ahash_request *req, const void *in)
+{
+ struct vic_sec_request_ctx *rctx = ahash_request_ctx(req);
+
+ memcpy(rctx, in, sizeof(*rctx));
+
+ return 0;
+}
+#if 0
+static int vic_hash224_setkey(struct crypto_ahash *tfm,
+ const u8 *key, unsigned int keylen)
+{
+ struct vic_sec_ctx *ctx = crypto_ahash_ctx(tfm);
+
+ if (keylen <= SHA224_BLOCK_SIZE) {
+ memcpy(ctx->key, key, keylen);
+ ctx->keylen = keylen;
+ } else {
+ return -ENOMEM;
+ }
+
+ return 0;
+}
+#endif
+#if 0
+static int vic_hash256_setkey(struct crypto_ahash *tfm,
+ const u8 *key, unsigned int keylen)
+{
+ struct vic_sec_ctx *ctx = crypto_ahash_ctx(tfm);
+
+ if (keylen <= SHA256_BLOCK_SIZE) {
+ memcpy(ctx->key, key, keylen);
+ ctx->keylen = keylen;
+ } else {
+ return -ENOMEM;
+ }
+
+ return 0;
+}
+
+static int vic_hash384_setkey(struct crypto_ahash *tfm,
+ const u8 *key, unsigned int keylen)
+{
+ struct vic_sec_ctx *ctx = crypto_ahash_ctx(tfm);
+
+ if (keylen <= SHA384_BLOCK_SIZE) {
+ memcpy(ctx->key, key, keylen);
+ ctx->keylen = keylen;
+ } else {
+ return -ENOMEM;
+ }
+
+ return 0;
+}
+#else
+static int vic_hmac_setkey(struct crypto_ahash *tfm,
+ const u8 *key, unsigned int keylen)
+{
+ unsigned int digestsize = crypto_ahash_digestsize(tfm);
+ struct vic_sec_ctx *ctx = crypto_ahash_ctx(tfm);
+ struct crypto_wait wait;
+ struct ahash_request *req;
+ struct scatterlist sg;
+ unsigned int blocksize;
+ struct crypto_ahash *ahash_tfm;
+ u8 *buf;
+ int ret;
+ const char *alg_name;
+
+ blocksize = crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
+
+ if (keylen <= blocksize) {
+ memcpy(ctx->key, key, keylen);
+ ctx->keylen = keylen;
+ return 0;
+ }
+
+ if (digestsize == SHA256_DIGEST_SIZE)
+ alg_name = "vic-sha256";
+ else if (digestsize == SHA384_DIGEST_SIZE)
+ alg_name = "vic-sha384";
+ else
+ return -EINVAL;
+
+ ctx->keylen = digestsize;
+ ahash_tfm = crypto_alloc_ahash(alg_name, 0, 0);
+ if (IS_ERR(ahash_tfm))
+ return PTR_ERR(ahash_tfm);
+
+ req = ahash_request_alloc(ahash_tfm, GFP_KERNEL);
+ if (!req) {
+ ret = -ENOMEM;
+ goto err_free_ahash;
+ }
+
+ crypto_init_wait(&wait);
+ ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
+ crypto_req_done, &wait);
+ crypto_ahash_clear_flags(ahash_tfm, ~0);
+
+ buf = kzalloc(keylen + VIC_MAX_ALIGN_SIZE, GFP_KERNEL);
+ if (!buf) {
+ ret = -ENOMEM;
+ goto err_free_req;
+ }
+
+ memcpy(buf, key, keylen);
+ sg_init_one(&sg, buf, keylen);
+ ahash_request_set_crypt(req, &sg, ctx->key, keylen);
+
+ ret = crypto_wait_req(crypto_ahash_digest(req), &wait);
+
+err_free_req:
+ ahash_request_free(req);
+err_free_ahash:
+ crypto_free_ahash(ahash_tfm);
+ return ret;
+}
+#endif
+
+#if 0
+static int vic_hash512_setkey(struct crypto_ahash *tfm,
+ const u8 *key, unsigned int keylen)
+{
+ struct vic_sec_ctx *ctx = crypto_ahash_ctx(tfm);
+
+ if (keylen <= SHA512_BLOCK_SIZE) {
+ memcpy(ctx->key, key, keylen);
+ ctx->keylen = keylen;
+ } else {
+ return -ENOMEM;
+ }
+
+ return 0;
+}
+#endif
+static int vic_hash_cra_init_algs(struct crypto_tfm *tfm,
+ const char *algs_hmac_name)
+{
+ struct vic_sec_ctx *ctx = crypto_tfm_ctx(tfm);
+
+ ctx->sdev = vic_sec_find_dev(ctx);
+
+ if (!ctx->sdev)
+ return -ENODEV;
+
+ mutex_lock(&ctx->sdev->lock);
+
+ crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
+ sizeof(struct vic_sec_request_ctx));
+
+ ctx->keylen = 0;
+
+ if (algs_hmac_name)
+ ctx->flags |= HASH_FLAGS_HMAC;
+
+ ctx->enginectx.op.do_one_request = vic_hash_one_request;
+ ctx->enginectx.op.prepare_request = vic_hash_prepare_req;
+ ctx->enginectx.op.unprepare_request = NULL;
+ return 0;
+}
+
+static int vic_hash_cra_init(struct crypto_tfm *tfm)
+{
+ return vic_hash_cra_init_algs(tfm, NULL);
+}
+
+static void vic_hash_cra_exit(struct crypto_tfm *tfm)
+{
+ struct vic_sec_ctx *ctx = crypto_tfm_ctx(tfm);
+
+ mutex_unlock(&ctx->sdev->lock);
+}
+#if 0
+static int vic_hash_cra_md5_init(struct crypto_tfm *tfm)
+{
+ return vic_hash_cra_init_algs(tfm, "md5");
+}
+
+static int vic_hash_cra_sha1_init(struct crypto_tfm *tfm)
+{
+ return vic_hash_cra_init_algs(tfm, "sha1");
+}
+
+static int vic_hash_cra_sha224_init(struct crypto_tfm *tfm)
+{
+ return vic_hash_cra_init_algs(tfm, "sha224");
+}
+#endif
+static int vic_hash_cra_sha256_init(struct crypto_tfm *tfm)
+{
+ return vic_hash_cra_init_algs(tfm, "sha256");
+}
+
+static int vic_hash_cra_sha384_init(struct crypto_tfm *tfm)
+{
+ return vic_hash_cra_init_algs(tfm, "sha384");
+}
+#if 0
+static int vic_hash_cra_sha512_init(struct crypto_tfm *tfm)
+{
+ return vic_hash_cra_init_algs(tfm, "sha512");
+}
+#endif
+static struct ahash_alg algs_md5_sha512[] = {
+#if 0
+ {
+ .init = vic_hash_init,
+ .update = vic_hash_update,
+ .final = vic_hash_final,
+ .finup = vic_hash_finup,
+ .digest = vic_hash_digest,
+ .export = vic_hash_export,
+ .import = vic_hash_import,
+ .halg = {
+ .digestsize = MD5_DIGEST_SIZE,
+ .statesize = sizeof(struct vic_sec_request_ctx),
+ .base = {
+ .cra_name = "md5",
+ .cra_driver_name = "vic-md5",
+ .cra_priority = 200,
+ .cra_flags = CRYPTO_ALG_ASYNC |
+ CRYPTO_ALG_TYPE_AHASH,
+ .cra_blocksize = MD5_HMAC_BLOCK_SIZE,
+ .cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .cra_alignmask = 3,
+ .cra_init = vic_hash_cra_init,
+ .cra_exit = vic_hash_cra_exit,
+ .cra_module = THIS_MODULE,
+ }
+ }
+ },
+ {
+ .init = vic_hash_init,
+ .update = vic_hash_update,
+ .final = vic_hash_final,
+ .finup = vic_hash_finup,
+ .digest = vic_hash_digest,
+ .export = vic_hash_export,
+ .import = vic_hash_import,
+ .setkey = vic_hash_setkey,
+ .halg = {
+ .digestsize = MD5_DIGEST_SIZE,
+ .statesize = sizeof(struct vic_sec_request_ctx),
+ .base = {
+ .cra_name = "hmac(md5)",
+ .cra_driver_name = "vic-hmac-md5",
+ .cra_priority = 200,
+ .cra_flags = CRYPTO_ALG_ASYNC |
+ CRYPTO_ALG_TYPE_AHASH,
+ .cra_blocksize = MD5_HMAC_BLOCK_SIZE,
+ .cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .cra_alignmask = 3,
+ .cra_init = vic_hash_cra_md5_init,
+ .cra_exit = vic_hash_cra_exit,
+ .cra_module = THIS_MODULE,
+ }
+ }
+ },
+ {
+ .init = vic_hash_init,
+ .update = vic_hash_update,
+ .final = vic_hash_final,
+ .finup = vic_hash_finup,
+ .digest = vic_hash_digest,
+ .export = vic_hash_export,
+ .import = vic_hash_import,
+ .halg = {
+ .digestsize = SHA1_DIGEST_SIZE,
+ .statesize = sizeof(struct vic_sec_request_ctx),
+ .base = {
+ .cra_name = "sha1",
+ .cra_driver_name = "vic-sha1",
+ .cra_priority = 200,
+ .cra_flags = CRYPTO_ALG_ASYNC |
+ CRYPTO_ALG_TYPE_AHASH,
+ .cra_blocksize = SHA1_BLOCK_SIZE,
+ .cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .cra_alignmask = 3,
+ .cra_init = vic_hash_cra_init,
+ .cra_exit = vic_hash_cra_exit,
+ .cra_module = THIS_MODULE,
+ }
+ }
+ },
+ {
+ .init = vic_hash_init,
+ .update = vic_hash_update,
+ .final = vic_hash_final,
+ .finup = vic_hash_finup,
+ .digest = vic_hash_digest,
+ .export = vic_hash_export,
+ .import = vic_hash_import,
+ .setkey = vic_hash_setkey,
+ .halg = {
+ .digestsize = SHA1_DIGEST_SIZE,
+ .statesize = sizeof(struct vic_sec_request_ctx),
+ .base = {
+ .cra_name = "hmac(sha1)",
+ .cra_driver_name = "vic-hmac-sha1",
+ .cra_priority = 200,
+ .cra_flags = CRYPTO_ALG_ASYNC |
+ CRYPTO_ALG_TYPE_AHASH,
+ .cra_blocksize = SHA1_BLOCK_SIZE,
+ .cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .cra_alignmask = 3,
+ .cra_init = vic_hash_cra_sha1_init,
+ .cra_exit = vic_hash_cra_exit,
+ .cra_module = THIS_MODULE,
+ }
+ }
+ },
+
+ {
+ .init = vic_hash_init,
+ .update = vic_hash_update,
+ .final = vic_hash_final,
+ .finup = vic_hash_finup,
+ .digest = vic_hash_digest,
+ .export = vic_hash_export,
+ .import = vic_hash_import,
+ .halg = {
+ .digestsize = SHA224_DIGEST_SIZE,
+ .statesize = sizeof(struct vic_sec_request_ctx),
+ .base = {
+ .cra_name = "sha224",
+ .cra_driver_name = "vic-sha224",
+ .cra_priority = 200,
+ .cra_flags = CRYPTO_ALG_ASYNC |
+ CRYPTO_ALG_TYPE_AHASH,
+ .cra_blocksize = SHA224_BLOCK_SIZE,
+ .cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .cra_alignmask = 3,
+ .cra_init = vic_hash_cra_init,
+ .cra_exit = vic_hash_cra_exit,
+ .cra_module = THIS_MODULE,
+ }
+ }
+ },
+ {
+ .init = vic_hash_init,
+ .update = vic_hash_update,
+ .final = vic_hash_final,
+ .finup = vic_hash_finup,
+ .digest = vic_hash_digest,
+ .export = vic_hash_export,
+ .import = vic_hash_import,
+ .setkey = vic_hash224_setkey,
+ .halg = {
+ .digestsize = SHA224_DIGEST_SIZE,
+ .statesize = sizeof(struct vic_sec_request_ctx),
+ .base = {
+ .cra_name = "hmac(sha224)",
+ .cra_driver_name = "vic-hmac-sha224",
+ .cra_priority = 200,
+ .cra_flags = CRYPTO_ALG_ASYNC |
+ CRYPTO_ALG_TYPE_AHASH,
+ .cra_blocksize = SHA224_BLOCK_SIZE,
+ .cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .cra_alignmask = 3,
+ .cra_init = vic_hash_cra_sha224_init,
+ .cra_exit = vic_hash_cra_exit,
+ .cra_module = THIS_MODULE,
+ }
+ }
+ },
+#endif
+ {
+ .init = vic_hash_init,
+ .update = vic_hash_update,
+ .final = vic_hash_final,
+ .finup = vic_hash_finup,
+ .digest = vic_hash_digest,
+ .export = vic_hash_export,
+ .import = vic_hash_import,
+ .halg = {
+ .digestsize = SHA256_DIGEST_SIZE,
+ .statesize = sizeof(struct vic_sec_request_ctx),
+ .base = {
+ .cra_name = "sha256",
+ .cra_driver_name = "vic-sha256",
+ .cra_priority = 200,
+ .cra_flags = CRYPTO_ALG_ASYNC |
+ CRYPTO_ALG_TYPE_AHASH,
+ .cra_blocksize = SHA256_BLOCK_SIZE,
+ .cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .cra_alignmask = 3,
+ .cra_init = vic_hash_cra_init,
+ .cra_exit = vic_hash_cra_exit,
+ .cra_module = THIS_MODULE,
+ }
+ }
+ },
+ {
+ .init = vic_hash_init,
+ .update = vic_hash_update,
+ .final = vic_hash_final,
+ .finup = vic_hash_finup,
+ .digest = vic_hash_digest,
+ .export = vic_hash_export,
+ .import = vic_hash_import,
+ .setkey = vic_hmac_setkey,
+ .halg = {
+ .digestsize = SHA256_DIGEST_SIZE,
+ .statesize = sizeof(struct vic_sec_request_ctx),
+ .base = {
+ .cra_name = "hmac(sha256)",
+ .cra_driver_name = "vic-hmac-sha256",
+ .cra_priority = 200,
+ .cra_flags = CRYPTO_ALG_ASYNC |
+ CRYPTO_ALG_TYPE_AHASH,
+ .cra_blocksize = SHA256_BLOCK_SIZE,
+ .cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .cra_alignmask = 3,
+ .cra_init = vic_hash_cra_sha256_init,
+ .cra_exit = vic_hash_cra_exit,
+ .cra_module = THIS_MODULE,
+ }
+ }
+ },
+ {
+ .init = vic_hash_init,
+ .update = vic_hash_update,
+ .final = vic_hash_final,
+ .finup = vic_hash_finup,
+ .digest = vic_hash_digest,
+ .export = vic_hash_export,
+ .import = vic_hash_import,
+ .halg = {
+ .digestsize = SHA384_DIGEST_SIZE,
+ .statesize = sizeof(struct vic_sec_request_ctx),
+ .base = {
+ .cra_name = "sha384",
+ .cra_driver_name = "vic-sha384",
+ .cra_priority = 200,
+ .cra_flags = CRYPTO_ALG_ASYNC |
+ CRYPTO_ALG_TYPE_AHASH,
+ .cra_blocksize = SHA384_BLOCK_SIZE,
+ .cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .cra_alignmask = 3,
+ .cra_init = vic_hash_cra_init,
+ .cra_exit = vic_hash_cra_exit,
+ .cra_module = THIS_MODULE,
+ }
+ }
+ },
+ {
+ .init = vic_hash_init,
+ .update = vic_hash_update,
+ .final = vic_hash_final,
+ .finup = vic_hash_finup,
+ .digest = vic_hash_digest,
+ .setkey = vic_hmac_setkey,
+ .export = vic_hash_export,
+ .import = vic_hash_import,
+ .halg = {
+ .digestsize = SHA384_DIGEST_SIZE,
+ .statesize = sizeof(struct vic_sec_request_ctx),
+ .base = {
+ .cra_name = "hmac(sha384)",
+ .cra_driver_name = "vic-hmac-sha384",
+ .cra_priority = 200,
+ .cra_flags = CRYPTO_ALG_ASYNC |
+ CRYPTO_ALG_TYPE_AHASH,
+ .cra_blocksize = SHA384_BLOCK_SIZE,
+ .cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .cra_alignmask = 3,
+ .cra_init = vic_hash_cra_sha384_init,
+ .cra_exit = vic_hash_cra_exit,
+ .cra_module = THIS_MODULE,
+ }
+ }
+ },
+#if 0
+ {
+ .init = vic_hash_init,
+ .update = vic_hash_update,
+ .final = vic_hash_final,
+ .finup = vic_hash_finup,
+ .digest = vic_hash_digest,
+ .export = vic_hash_export,
+ .import = vic_hash_import,
+ .halg = {
+ .digestsize = SHA512_DIGEST_SIZE,
+ .statesize = sizeof(struct vic_sec_request_ctx),
+ .base = {
+ .cra_name = "sha512",
+ .cra_driver_name = "vic-sha512",
+ .cra_priority = 200,
+ .cra_flags = CRYPTO_ALG_ASYNC |
+ CRYPTO_ALG_TYPE_AHASH,
+ .cra_blocksize = SHA512_BLOCK_SIZE,
+ .cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .cra_alignmask = 3,
+ .cra_init = vic_hash_cra_init,
+ .cra_exit = vic_hash_cra_exit,
+ .cra_module = THIS_MODULE,
+ }
+ }
+ },
+ {
+ .init = vic_hash_init,
+ .update = vic_hash_update,
+ .final = vic_hash_final,
+ .finup = vic_hash_finup,
+ .digest = vic_hash_digest,
+ .setkey = vic_hash512_setkey,
+ .export = vic_hash_export,
+ .import = vic_hash_import,
+ .halg = {
+ .digestsize = SHA512_DIGEST_SIZE,
+ .statesize = sizeof(struct vic_sec_request_ctx),
+ .base = {
+ .cra_name = "hmac(sha512)",
+ .cra_driver_name = "vic-hmac-sha512",
+ .cra_priority = 200,
+ .cra_flags = CRYPTO_ALG_ASYNC |
+ CRYPTO_ALG_TYPE_AHASH,
+ .cra_blocksize = SHA512_BLOCK_SIZE,
+ .cra_ctxsize = sizeof(struct vic_sec_ctx),
+ .cra_alignmask = 3,
+ .cra_init = vic_hash_cra_sha512_init,
+ .cra_exit = vic_hash_cra_exit,
+ .cra_module = THIS_MODULE,
+ }
+ }
+ },
+#endif
+};
+
+int vic_hash_register_algs()
+{
+ int ret = 0;
+
+ ret = crypto_register_ahashes(algs_md5_sha512, ARRAY_SIZE(algs_md5_sha512));
+
+ return ret;
+}
+
+int vic_hash_unregister_algs()
+{
+ crypto_unregister_ahashes(algs_md5_sha512, ARRAY_SIZE(algs_md5_sha512));
+ return 0;
+}
diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h
index eb5ef4d0f463..1e92d57ccd2f 100644
--- a/drivers/i2c/busses/i2c-designware-core.h
+++ b/drivers/i2c/busses/i2c-designware-core.h
@@ -284,6 +284,8 @@ struct dw_i2c_dev {
int (*init)(struct dw_i2c_dev *dev);
int (*set_sda_hold_time)(struct dw_i2c_dev *dev);
int mode;
+ int scl_gpio;
+ int sda_gpio;
struct i2c_bus_recovery_info rinfo;
bool suspended;
};
diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c
index d6425ad6e6a3..f023df4dabcc 100644
--- a/drivers/i2c/busses/i2c-designware-master.c
+++ b/drivers/i2c/busses/i2c-designware-master.c
@@ -20,6 +20,7 @@
#include
#include
#include
+#include
#include "i2c-designware-core.h"
@@ -171,6 +172,58 @@ static int i2c_dw_set_timings_master(struct dw_i2c_dev *dev)
return ret;
}
+static void i2c_dw_configure_gpio(struct dw_i2c_dev *dev)
+{
+ if((dev->scl_gpio > 0) && (dev->sda_gpio > 0)) {
+ switch(dev->adapter.nr) {
+ case 0:
+ SET_GPIO_dout_LOW(dev->scl_gpio);
+ SET_GPIO_dout_LOW(dev->sda_gpio);
+ SET_GPIO_doen_reverse_(dev->scl_gpio,1);
+ SET_GPIO_doen_reverse_(dev->sda_gpio,1);
+ SET_GPIO_doen_i2c0_pad_sck_oe(dev->scl_gpio);
+ SET_GPIO_doen_i2c0_pad_sda_oe(dev->sda_gpio);
+ SET_GPIO_i2c0_pad_sck_in(dev->scl_gpio);
+ SET_GPIO_i2c0_pad_sda_in(dev->sda_gpio);
+ break;
+ case 1:
+ SET_GPIO_dout_LOW(dev->scl_gpio);
+ SET_GPIO_dout_LOW(dev->sda_gpio);
+ SET_GPIO_doen_reverse_(dev->scl_gpio,1);
+ SET_GPIO_doen_reverse_(dev->sda_gpio,1);
+ SET_GPIO_doen_i2c1_pad_sck_oe(dev->scl_gpio);
+ SET_GPIO_doen_i2c1_pad_sda_oe(dev->sda_gpio);
+ SET_GPIO_i2c1_pad_sck_in(dev->scl_gpio);
+ SET_GPIO_i2c1_pad_sda_in(dev->sda_gpio);
+ break;
+ case 2:
+ SET_GPIO_dout_LOW(dev->scl_gpio);
+ SET_GPIO_dout_LOW(dev->sda_gpio);
+ SET_GPIO_doen_reverse_(dev->scl_gpio,1);
+ SET_GPIO_doen_reverse_(dev->sda_gpio,1);
+ SET_GPIO_doen_i2c2_pad_sck_oe(dev->scl_gpio);
+ SET_GPIO_doen_i2c2_pad_sda_oe(dev->sda_gpio);
+ SET_GPIO_i2c2_pad_sck_in(dev->scl_gpio);
+ SET_GPIO_i2c2_pad_sda_in(dev->sda_gpio);
+ break;
+ case 3:
+ SET_GPIO_dout_LOW(dev->scl_gpio);
+ SET_GPIO_dout_LOW(dev->sda_gpio);
+ SET_GPIO_doen_reverse_(dev->scl_gpio,1);
+ SET_GPIO_doen_reverse_(dev->sda_gpio,1);
+ SET_GPIO_doen_i2c3_pad_sck_oe(dev->scl_gpio);
+ SET_GPIO_doen_i2c3_pad_sda_oe(dev->sda_gpio);
+ SET_GPIO_i2c3_pad_sck_in(dev->scl_gpio);
+ SET_GPIO_i2c3_pad_sda_in(dev->sda_gpio);
+ break;
+ default:
+ dev_warn(dev->dev, "NOTE: i2c adapter number is invalid\n");
+ }
+ }
+ else
+ dev_warn(dev->dev, "NOTE: scl/sda gpio number is invalid !\n");
+}
+
/**
* i2c_dw_init() - Initialize the designware I2C master hardware
* @dev: device private data
@@ -805,6 +858,8 @@ int i2c_dw_probe_master(struct dw_i2c_dev *dev)
dev_err(dev->dev, "failure adding adapter: %d\n", ret);
pm_runtime_put_noidle(dev->dev);
+ i2c_dw_configure_gpio(dev);
+
return ret;
}
EXPORT_SYMBOL_GPL(i2c_dw_probe_master);
diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
index 63eeacc0baec..d6d760e393d8 100644
--- a/drivers/i2c/busses/i2c-designware-platdrv.c
+++ b/drivers/i2c/busses/i2c-designware-platdrv.c
@@ -22,6 +22,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -32,6 +33,7 @@
#include
#include
#include
+#include
#include "i2c-designware-core.h"
@@ -45,12 +47,12 @@ static u32 starfive_i2c_dw_get_clk_rate_khz(struct dw_i2c_dev *dev)
{
u32 val;
- if(!device_property_read_u32(dev->dev, "clock-frequency", &val)) {
- dev_info(dev->dev, "Using 'clock-frequency' : %u / 1000", val);
+ if(!device_property_read_u32(dev->dev, "clocks", &val)) {
+ dev_info(dev->dev, "Using 'clocks' : %u / 1000", val);
return (val / 1000);
} else {
- dev_info(dev->dev, "Using the static setting value: 1000");
- return 1000;
+ dev_info(dev->dev, "Using the static setting value: 49500");
+ return 49500;
}
}
#endif
@@ -222,6 +224,7 @@ static const struct dmi_system_id dw_i2c_hwmon_class_dmi[] = {
static int dw_i2c_plat_probe(struct platform_device *pdev)
{
struct dw_i2c_platform_data *pdata = dev_get_platdata(&pdev->dev);
+ struct device_node *np = pdev->dev.of_node;
struct i2c_adapter *adap;
struct dw_i2c_dev *dev;
struct i2c_timings *t;
@@ -238,6 +241,8 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
dev->flags = (uintptr_t)device_get_match_data(&pdev->dev);
dev->dev = &pdev->dev;
dev->irq = irq;
+ dev->scl_gpio = of_get_named_gpio(np, "scl-gpio", 0);
+ dev->sda_gpio = of_get_named_gpio(np, "sda-gpio", 0);
platform_set_drvdata(pdev, dev);
ret = dw_i2c_plat_request_regs(dev);
diff --git a/drivers/net/wireless/broadcom/bcmdhd/Makefile b/drivers/net/wireless/broadcom/bcmdhd/Makefile
index e98908ee79ae..59349992519c 100644
--- a/drivers/net/wireless/broadcom/bcmdhd/Makefile
+++ b/drivers/net/wireless/broadcom/bcmdhd/Makefile
@@ -26,7 +26,7 @@ DHDCFLAGS = -Wall -Wstrict-prototypes -Dlinux -DBCMDRIVER \
-DPOWERUP_MAX_RETRY=0 -DIFACE_HANG_FORCE_DEV_CLOSE -DWAIT_DEQUEUE \
-DWL_EXT_IAPSTA -DWL_ESCAN -DCCODE_LIST \
-DENABLE_INSMOD_NO_FW_LOAD \
- -Idrivers/net/wireless/broadcom/bcmdhd -Idrivers/net/wireless/broadcom/bcmdhd/include
+ -I $(srctree)/$(src) -I $(srctree)/$(src)/include
DHDOFILES = aiutils.o siutils.o sbutils.o bcmutils.o bcmwifi_channels.o \
dhd_linux.o dhd_linux_platdev.o dhd_linux_sched.o dhd_pno.o \
diff --git a/usr/gen_initramfs_list.sh b/usr/gen_initramfs_list.sh
new file mode 100755
index 000000000000..0aad760fcd8c
--- /dev/null
+++ b/usr/gen_initramfs_list.sh
@@ -0,0 +1,328 @@
+#!/bin/sh
+# Copyright (C) Martin Schlemmer
+# Copyright (C) 2006 Sam Ravnborg
+#
+# Released under the terms of the GNU GPL
+#
+# Generate a cpio packed initramfs. It uses gen_init_cpio to generate
+# the cpio archive, and then compresses it.
+# The script may also be used to generate the inputfile used for gen_init_cpio
+# This script assumes that gen_init_cpio is located in usr/ directory
+
+# error out on errors
+set -e
+
+usage() {
+cat << EOF
+Usage:
+$0 [-o ] [-u ] [-g ] {-d | } ...
+ -o Create compressed initramfs file named using
+ gen_init_cpio and compressor depending on the extension
+ -u User ID to map to user ID 0 (root).
+ is only meaningful if is a
+ directory. "squash" forces all files to uid 0.
+ -g Group ID to map to group ID 0 (root).
+ is only meaningful if is a
+ directory. "squash" forces all files to gid 0.
+ File list or directory for cpio archive.
+ If is a .cpio file it will be used
+ as direct input to initramfs.
+ -d Output the default cpio list.
+
+All options except -o and -l may be repeated and are interpreted
+sequentially and immediately. -u and -g states are preserved across
+ options so an explicit "-u 0 -g 0" is required
+to reset the root/group mapping.
+EOF
+}
+
+# awk style field access
+# $1 - field number; rest is argument string
+field() {
+ shift $1 ; echo $1
+}
+
+list_default_initramfs() {
+ # echo usr/kinit/kinit
+ :
+}
+
+default_initramfs() {
+ cat <<-EOF >> ${output}
+ # This is a very simple, default initramfs
+
+ dir /dev 0755 0 0
+ nod /dev/console 0600 0 0 c 5 1
+ dir /root 0700 0 0
+ # file /kinit usr/kinit/kinit 0755 0 0
+ # slink /init kinit 0755 0 0
+ EOF
+}
+
+filetype() {
+ local argv1="$1"
+
+ # symlink test must come before file test
+ if [ -L "${argv1}" ]; then
+ echo "slink"
+ elif [ -f "${argv1}" ]; then
+ echo "file"
+ elif [ -d "${argv1}" ]; then
+ echo "dir"
+ elif [ -b "${argv1}" -o -c "${argv1}" ]; then
+ echo "nod"
+ elif [ -p "${argv1}" ]; then
+ echo "pipe"
+ elif [ -S "${argv1}" ]; then
+ echo "sock"
+ else
+ echo "invalid"
+ fi
+ return 0
+}
+
+list_print_mtime() {
+ :
+}
+
+print_mtime() {
+ local my_mtime="0"
+
+ if [ -e "$1" ]; then
+ my_mtime=$(find "$1" -printf "%T@\n" | sort -r | head -n 1)
+ fi
+
+ echo "# Last modified: ${my_mtime}" >> ${output}
+ echo "" >> ${output}
+}
+
+list_parse() {
+ if [ -L "$1" ]; then
+ return
+ fi
+ echo "$1" | sed 's/:/\\:/g; s/$/ \\/'
+}
+
+# for each file print a line in following format
+#
+# for links, devices etc the format differs. See gen_init_cpio for details
+parse() {
+ local location="$1"
+ local name="/${location#${srcdir}}"
+ # change '//' into '/'
+ name=$(echo "$name" | sed -e 's://*:/:g')
+ local mode="$2"
+ local uid="$3"
+ local gid="$4"
+ local ftype=$(filetype "${location}")
+ # remap uid/gid to 0 if necessary
+ [ "$root_uid" = "squash" ] && uid=0 || [ "$uid" -eq "$root_uid" ] && uid=0
+ [ "$root_gid" = "squash" ] && gid=0 || [ "$gid" -eq "$root_gid" ] && gid=0
+ local str="${mode} ${uid} ${gid}"
+
+ [ "${ftype}" = "invalid" ] && return 0
+ [ "${location}" = "${srcdir}" ] && return 0
+
+ case "${ftype}" in
+ "file")
+ str="${ftype} ${name} ${location} ${str}"
+ ;;
+ "nod")
+ local dev=`LC_ALL=C ls -l "${location}"`
+ local maj=`field 5 ${dev}`
+ local min=`field 6 ${dev}`
+ maj=${maj%,}
+
+ [ -b "${location}" ] && dev="b" || dev="c"
+
+ str="${ftype} ${name} ${str} ${dev} ${maj} ${min}"
+ ;;
+ "slink")
+ local target=`readlink "${location}"`
+ str="${ftype} ${name} ${target} ${str}"
+ ;;
+ *)
+ str="${ftype} ${name} ${str}"
+ ;;
+ esac
+
+ echo "${str}" >> ${output}
+
+ return 0
+}
+
+unknown_option() {
+ printf "ERROR: unknown option \"$arg\"\n" >&2
+ printf "If the filename validly begins with '-', " >&2
+ printf "then it must be prefixed\n" >&2
+ printf "by './' so that it won't be interpreted as an option." >&2
+ printf "\n" >&2
+ usage >&2
+ exit 1
+}
+
+list_header() {
+ :
+}
+
+header() {
+ printf "\n#####################\n# $1\n" >> ${output}
+}
+
+# process one directory (incl sub-directories)
+dir_filelist() {
+ ${dep_list}header "$1"
+
+ srcdir=$(echo "$1" | sed -e 's://*:/:g')
+ dirlist=$(find "${srcdir}" -printf "%p %m %U %G\n" | LANG=C sort)
+
+ # If $dirlist is only one line, then the directory is empty
+ if [ "$(echo "${dirlist}" | wc -l)" -gt 1 ]; then
+ ${dep_list}print_mtime "$1"
+
+ echo "${dirlist}" | \
+ while read x; do
+ ${dep_list}parse ${x}
+ done
+ fi
+}
+
+# if only one file is specified and it is .cpio file then use it direct as fs
+# if a directory is specified then add all files in given direcotry to fs
+# if a regular file is specified assume it is in gen_initramfs format
+input_file() {
+ source="$1"
+ if [ -f "$1" ]; then
+ ${dep_list}header "$1"
+ is_cpio="$(echo "$1" | sed 's/^.*\.cpio\(\..*\)\{0,1\}/cpio/')"
+ if [ $2 -eq 0 -a ${is_cpio} = "cpio" ]; then
+ cpio_file=$1
+ echo "$1" | grep -q '^.*\.cpio\..*' && is_cpio_compressed="compressed"
+ [ ! -z ${dep_list} ] && echo "$1"
+ return 0
+ fi
+ if [ -z ${dep_list} ]; then
+ print_mtime "$1" >> ${output}
+ cat "$1" >> ${output}
+ else
+ echo "$1 \\"
+ cat "$1" | while read type dir file perm ; do
+ if [ "$type" = "file" ]; then
+ echo "$file \\";
+ fi
+ done
+ fi
+ elif [ -d "$1" ]; then
+ dir_filelist "$1"
+ else
+ echo " ${prog}: Cannot open '$1'" >&2
+ exit 1
+ fi
+}
+
+prog=$0
+root_uid=0
+root_gid=0
+dep_list=
+cpio_file=
+cpio_list=
+output="/dev/stdout"
+output_file=""
+is_cpio_compressed=
+compr="gzip -n -9 -f"
+
+arg="$1"
+case "$arg" in
+ "-l") # files included in initramfs - used by kbuild
+ dep_list="list_"
+ echo "deps_initramfs := $0 \\"
+ shift
+ ;;
+ "-o") # generate compressed cpio image named $1
+ shift
+ output_file="$1"
+ cpio_list="$(mktemp ${TMPDIR:-/tmp}/cpiolist.XXXXXX)"
+ output=${cpio_list}
+ echo "$output_file" | grep -q "\.gz$" \
+ && [ -x "`which gzip 2> /dev/null`" ] \
+ && compr="gzip -n -9 -f"
+ echo "$output_file" | grep -q "\.bz2$" \
+ && [ -x "`which bzip2 2> /dev/null`" ] \
+ && compr="bzip2 -9 -f"
+ echo "$output_file" | grep -q "\.lzma$" \
+ && [ -x "`which lzma 2> /dev/null`" ] \
+ && compr="lzma -9 -f"
+ echo "$output_file" | grep -q "\.xz$" \
+ && [ -x "`which xz 2> /dev/null`" ] \
+ && compr="xz --check=crc32 --lzma2=dict=1MiB"
+ echo "$output_file" | grep -q "\.lzo$" \
+ && [ -x "`which lzop 2> /dev/null`" ] \
+ && compr="lzop -9 -f"
+ echo "$output_file" | grep -q "\.lz4$" \
+ && [ -x "`which lz4 2> /dev/null`" ] \
+ && compr="lz4 -l -9 -f"
+ echo "$output_file" | grep -q "\.cpio$" && compr="cat"
+ shift
+ ;;
+esac
+while [ $# -gt 0 ]; do
+ arg="$1"
+ shift
+ case "$arg" in
+ "-u") # map $1 to uid=0 (root)
+ root_uid="$1"
+ [ "$root_uid" = "-1" ] && root_uid=$(id -u || echo 0)
+ shift
+ ;;
+ "-g") # map $1 to gid=0 (root)
+ root_gid="$1"
+ [ "$root_gid" = "-1" ] && root_gid=$(id -g || echo 0)
+ shift
+ ;;
+ "-d") # display default initramfs list
+ default_list="$arg"
+ ${dep_list}default_initramfs
+ ;;
+ "-h")
+ usage
+ exit 0
+ ;;
+ *)
+ case "$arg" in
+ "-"*)
+ unknown_option
+ ;;
+ *) # input file/dir - process it
+ input_file "$arg" "$#"
+ ;;
+ esac
+ ;;
+ esac
+done
+
+# If output_file is set we will generate cpio archive and compress it
+# we are careful to delete tmp files
+if [ ! -z ${output_file} ]; then
+ if [ -z ${cpio_file} ]; then
+ timestamp=
+ if test -n "$KBUILD_BUILD_TIMESTAMP"; then
+ timestamp="$(date -d"$KBUILD_BUILD_TIMESTAMP" +%s || :)"
+ if test -n "$timestamp"; then
+ timestamp="-t $timestamp"
+ fi
+ fi
+ cpio_tfile="$(mktemp ${TMPDIR:-/tmp}/cpiofile.XXXXXX)"
+ usr/gen_init_cpio $timestamp ${cpio_list} > ${cpio_tfile}
+ else
+ cpio_tfile=${cpio_file}
+ fi
+ rm ${cpio_list}
+ if [ "${is_cpio_compressed}" = "compressed" ]; then
+ cat ${cpio_tfile} > ${output_file}
+ else
+ (cat ${cpio_tfile} | ${compr} - > ${output_file}) \
+ || (rm -f ${output_file} ; false)
+ fi
+ [ -z ${cpio_file} ] && rm ${cpio_tfile}
+fi
+exit 0