162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2013 - 2017 Linaro Ltd <ard.biesheuvel@linaro.org>
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/linkage.h>
762306a36Sopenharmony_ci#include <asm/assembler.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci	.arch		armv8-a+crypto
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ciSYM_FUNC_START(__aes_ce_encrypt)
1262306a36Sopenharmony_ci	sub		w3, w3, #2
1362306a36Sopenharmony_ci	ld1		{v0.16b}, [x2]
1462306a36Sopenharmony_ci	ld1		{v1.4s}, [x0], #16
1562306a36Sopenharmony_ci	cmp		w3, #10
1662306a36Sopenharmony_ci	bmi		0f
1762306a36Sopenharmony_ci	bne		3f
1862306a36Sopenharmony_ci	mov		v3.16b, v1.16b
1962306a36Sopenharmony_ci	b		2f
2062306a36Sopenharmony_ci0:	mov		v2.16b, v1.16b
2162306a36Sopenharmony_ci	ld1		{v3.4s}, [x0], #16
2262306a36Sopenharmony_ci1:	aese		v0.16b, v2.16b
2362306a36Sopenharmony_ci	aesmc		v0.16b, v0.16b
2462306a36Sopenharmony_ci2:	ld1		{v1.4s}, [x0], #16
2562306a36Sopenharmony_ci	aese		v0.16b, v3.16b
2662306a36Sopenharmony_ci	aesmc		v0.16b, v0.16b
2762306a36Sopenharmony_ci3:	ld1		{v2.4s}, [x0], #16
2862306a36Sopenharmony_ci	subs		w3, w3, #3
2962306a36Sopenharmony_ci	aese		v0.16b, v1.16b
3062306a36Sopenharmony_ci	aesmc		v0.16b, v0.16b
3162306a36Sopenharmony_ci	ld1		{v3.4s}, [x0], #16
3262306a36Sopenharmony_ci	bpl		1b
3362306a36Sopenharmony_ci	aese		v0.16b, v2.16b
3462306a36Sopenharmony_ci	eor		v0.16b, v0.16b, v3.16b
3562306a36Sopenharmony_ci	st1		{v0.16b}, [x1]
3662306a36Sopenharmony_ci	ret
3762306a36Sopenharmony_ciSYM_FUNC_END(__aes_ce_encrypt)
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ciSYM_FUNC_START(__aes_ce_decrypt)
4062306a36Sopenharmony_ci	sub		w3, w3, #2
4162306a36Sopenharmony_ci	ld1		{v0.16b}, [x2]
4262306a36Sopenharmony_ci	ld1		{v1.4s}, [x0], #16
4362306a36Sopenharmony_ci	cmp		w3, #10
4462306a36Sopenharmony_ci	bmi		0f
4562306a36Sopenharmony_ci	bne		3f
4662306a36Sopenharmony_ci	mov		v3.16b, v1.16b
4762306a36Sopenharmony_ci	b		2f
4862306a36Sopenharmony_ci0:	mov		v2.16b, v1.16b
4962306a36Sopenharmony_ci	ld1		{v3.4s}, [x0], #16
5062306a36Sopenharmony_ci1:	aesd		v0.16b, v2.16b
5162306a36Sopenharmony_ci	aesimc		v0.16b, v0.16b
5262306a36Sopenharmony_ci2:	ld1		{v1.4s}, [x0], #16
5362306a36Sopenharmony_ci	aesd		v0.16b, v3.16b
5462306a36Sopenharmony_ci	aesimc		v0.16b, v0.16b
5562306a36Sopenharmony_ci3:	ld1		{v2.4s}, [x0], #16
5662306a36Sopenharmony_ci	subs		w3, w3, #3
5762306a36Sopenharmony_ci	aesd		v0.16b, v1.16b
5862306a36Sopenharmony_ci	aesimc		v0.16b, v0.16b
5962306a36Sopenharmony_ci	ld1		{v3.4s}, [x0], #16
6062306a36Sopenharmony_ci	bpl		1b
6162306a36Sopenharmony_ci	aesd		v0.16b, v2.16b
6262306a36Sopenharmony_ci	eor		v0.16b, v0.16b, v3.16b
6362306a36Sopenharmony_ci	st1		{v0.16b}, [x1]
6462306a36Sopenharmony_ci	ret
6562306a36Sopenharmony_ciSYM_FUNC_END(__aes_ce_decrypt)
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci/*
6862306a36Sopenharmony_ci * __aes_ce_sub() - use the aese instruction to perform the AES sbox
6962306a36Sopenharmony_ci *                  substitution on each byte in 'input'
7062306a36Sopenharmony_ci */
7162306a36Sopenharmony_ciSYM_FUNC_START(__aes_ce_sub)
7262306a36Sopenharmony_ci	dup		v1.4s, w0
7362306a36Sopenharmony_ci	movi		v0.16b, #0
7462306a36Sopenharmony_ci	aese		v0.16b, v1.16b
7562306a36Sopenharmony_ci	umov		w0, v0.s[0]
7662306a36Sopenharmony_ci	ret
7762306a36Sopenharmony_ciSYM_FUNC_END(__aes_ce_sub)
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ciSYM_FUNC_START(__aes_ce_invert)
8062306a36Sopenharmony_ci	ld1		{v0.4s}, [x1]
8162306a36Sopenharmony_ci	aesimc		v1.16b, v0.16b
8262306a36Sopenharmony_ci	st1		{v1.4s}, [x0]
8362306a36Sopenharmony_ci	ret
8462306a36Sopenharmony_ciSYM_FUNC_END(__aes_ce_invert)
85