18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2013 - 2017 Linaro Ltd <ard.biesheuvel@linaro.org>
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include <linux/linkage.h>
78c2ecf20Sopenharmony_ci#include <asm/assembler.h>
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci	.arch		armv8-a+crypto
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ciSYM_FUNC_START(__aes_ce_encrypt)
128c2ecf20Sopenharmony_ci	sub		w3, w3, #2
138c2ecf20Sopenharmony_ci	ld1		{v0.16b}, [x2]
148c2ecf20Sopenharmony_ci	ld1		{v1.4s}, [x0], #16
158c2ecf20Sopenharmony_ci	cmp		w3, #10
168c2ecf20Sopenharmony_ci	bmi		0f
178c2ecf20Sopenharmony_ci	bne		3f
188c2ecf20Sopenharmony_ci	mov		v3.16b, v1.16b
198c2ecf20Sopenharmony_ci	b		2f
208c2ecf20Sopenharmony_ci0:	mov		v2.16b, v1.16b
218c2ecf20Sopenharmony_ci	ld1		{v3.4s}, [x0], #16
228c2ecf20Sopenharmony_ci1:	aese		v0.16b, v2.16b
238c2ecf20Sopenharmony_ci	aesmc		v0.16b, v0.16b
248c2ecf20Sopenharmony_ci2:	ld1		{v1.4s}, [x0], #16
258c2ecf20Sopenharmony_ci	aese		v0.16b, v3.16b
268c2ecf20Sopenharmony_ci	aesmc		v0.16b, v0.16b
278c2ecf20Sopenharmony_ci3:	ld1		{v2.4s}, [x0], #16
288c2ecf20Sopenharmony_ci	subs		w3, w3, #3
298c2ecf20Sopenharmony_ci	aese		v0.16b, v1.16b
308c2ecf20Sopenharmony_ci	aesmc		v0.16b, v0.16b
318c2ecf20Sopenharmony_ci	ld1		{v3.4s}, [x0], #16
328c2ecf20Sopenharmony_ci	bpl		1b
338c2ecf20Sopenharmony_ci	aese		v0.16b, v2.16b
348c2ecf20Sopenharmony_ci	eor		v0.16b, v0.16b, v3.16b
358c2ecf20Sopenharmony_ci	st1		{v0.16b}, [x1]
368c2ecf20Sopenharmony_ci	ret
378c2ecf20Sopenharmony_ciSYM_FUNC_END(__aes_ce_encrypt)
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ciSYM_FUNC_START(__aes_ce_decrypt)
408c2ecf20Sopenharmony_ci	sub		w3, w3, #2
418c2ecf20Sopenharmony_ci	ld1		{v0.16b}, [x2]
428c2ecf20Sopenharmony_ci	ld1		{v1.4s}, [x0], #16
438c2ecf20Sopenharmony_ci	cmp		w3, #10
448c2ecf20Sopenharmony_ci	bmi		0f
458c2ecf20Sopenharmony_ci	bne		3f
468c2ecf20Sopenharmony_ci	mov		v3.16b, v1.16b
478c2ecf20Sopenharmony_ci	b		2f
488c2ecf20Sopenharmony_ci0:	mov		v2.16b, v1.16b
498c2ecf20Sopenharmony_ci	ld1		{v3.4s}, [x0], #16
508c2ecf20Sopenharmony_ci1:	aesd		v0.16b, v2.16b
518c2ecf20Sopenharmony_ci	aesimc		v0.16b, v0.16b
528c2ecf20Sopenharmony_ci2:	ld1		{v1.4s}, [x0], #16
538c2ecf20Sopenharmony_ci	aesd		v0.16b, v3.16b
548c2ecf20Sopenharmony_ci	aesimc		v0.16b, v0.16b
558c2ecf20Sopenharmony_ci3:	ld1		{v2.4s}, [x0], #16
568c2ecf20Sopenharmony_ci	subs		w3, w3, #3
578c2ecf20Sopenharmony_ci	aesd		v0.16b, v1.16b
588c2ecf20Sopenharmony_ci	aesimc		v0.16b, v0.16b
598c2ecf20Sopenharmony_ci	ld1		{v3.4s}, [x0], #16
608c2ecf20Sopenharmony_ci	bpl		1b
618c2ecf20Sopenharmony_ci	aesd		v0.16b, v2.16b
628c2ecf20Sopenharmony_ci	eor		v0.16b, v0.16b, v3.16b
638c2ecf20Sopenharmony_ci	st1		{v0.16b}, [x1]
648c2ecf20Sopenharmony_ci	ret
658c2ecf20Sopenharmony_ciSYM_FUNC_END(__aes_ce_decrypt)
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci/*
688c2ecf20Sopenharmony_ci * __aes_ce_sub() - use the aese instruction to perform the AES sbox
698c2ecf20Sopenharmony_ci *                  substitution on each byte in 'input'
708c2ecf20Sopenharmony_ci */
718c2ecf20Sopenharmony_ciSYM_FUNC_START(__aes_ce_sub)
728c2ecf20Sopenharmony_ci	dup		v1.4s, w0
738c2ecf20Sopenharmony_ci	movi		v0.16b, #0
748c2ecf20Sopenharmony_ci	aese		v0.16b, v1.16b
758c2ecf20Sopenharmony_ci	umov		w0, v0.s[0]
768c2ecf20Sopenharmony_ci	ret
778c2ecf20Sopenharmony_ciSYM_FUNC_END(__aes_ce_sub)
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ciSYM_FUNC_START(__aes_ce_invert)
808c2ecf20Sopenharmony_ci	ld1		{v0.4s}, [x1]
818c2ecf20Sopenharmony_ci	aesimc		v1.16b, v0.16b
828c2ecf20Sopenharmony_ci	st1		{v1.4s}, [x0]
838c2ecf20Sopenharmony_ci	ret
848c2ecf20Sopenharmony_ciSYM_FUNC_END(__aes_ce_invert)
85