138032Speter/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
2285229Sgshapiro/* Copyright (c) 2019 Mellanox Technologies. */
364562Sgshapiro
438032Speter#ifndef __MLX5E_KTLS_H__
538032Speter#define __MLX5E_KTLS_H__
638032Speter
738032Speter#include <linux/debugfs.h>
838032Speter#include <linux/tls.h>
938032Speter#include <net/tls.h>
1038032Speter#include "en.h"
1138032Speter
1238032Speter#ifdef CONFIG_MLX5_EN_TLS
1338032Speter#include "lib/crypto.h"
1464562Sgshapiro#include "lib/mlx5.h"
15147078Sgshapiro
1664562Sgshapirostruct mlx5_crypto_dek *mlx5_ktls_create_key(struct mlx5_crypto_dek_pool *dek_pool,
17266527Sgshapiro					     struct tls_crypto_info *crypto_info);
1838032Spetervoid mlx5_ktls_destroy_key(struct mlx5_crypto_dek_pool *dek_pool,
1990792Sgshapiro			   struct mlx5_crypto_dek *dek);
2038032Speter
2190792Sgshapirostatic inline bool mlx5e_is_ktls_device(struct mlx5_core_dev *mdev)
2290792Sgshapiro{
2390792Sgshapiro	if (is_kdump_kernel())
24120256Sgshapiro		return false;
2590792Sgshapiro
26125820Sgshapiro	if (!MLX5_CAP_GEN(mdev, tls_tx) && !MLX5_CAP_GEN(mdev, tls_rx))
27125820Sgshapiro		return false;
28125820Sgshapiro
29363466Sgshapiro	if (!MLX5_CAP_GEN(mdev, log_max_dek))
30125820Sgshapiro		return false;
31363466Sgshapiro
32120256Sgshapiro	return (MLX5_CAP_TLS(mdev, tls_1_2_aes_gcm_128) ||
33125820Sgshapiro		MLX5_CAP_TLS(mdev, tls_1_2_aes_gcm_256));
34125820Sgshapiro}
35363466Sgshapiro
36125820Sgshapirostatic inline bool mlx5e_ktls_type_check(struct mlx5_core_dev *mdev,
3790792Sgshapiro					 struct tls_crypto_info *crypto_info)
3890792Sgshapiro{
39120256Sgshapiro	switch (crypto_info->cipher_type) {
40120256Sgshapiro	case TLS_CIPHER_AES_GCM_128:
41132943Sgshapiro		if (crypto_info->version == TLS_1_2_VERSION)
42132943Sgshapiro			return MLX5_CAP_TLS(mdev,  tls_1_2_aes_gcm_128);
43132943Sgshapiro		break;
4490792Sgshapiro	case TLS_CIPHER_AES_GCM_256:
4590792Sgshapiro		if (crypto_info->version == TLS_1_2_VERSION)
46132943Sgshapiro			return MLX5_CAP_TLS(mdev,  tls_1_2_aes_gcm_256);
47132943Sgshapiro		break;
4890792Sgshapiro	}
4990792Sgshapiro
5064562Sgshapiro	return false;
5190792Sgshapiro}
5290792Sgshapiro
5338032Spetervoid mlx5e_ktls_build_netdev(struct mlx5e_priv *priv);
5438032Speterint mlx5e_ktls_init_tx(struct mlx5e_priv *priv);
5538032Spetervoid mlx5e_ktls_cleanup_tx(struct mlx5e_priv *priv);
5638032Speterint mlx5e_ktls_init_rx(struct mlx5e_priv *priv);
5738032Spetervoid mlx5e_ktls_cleanup_rx(struct mlx5e_priv *priv);
5838032Speterint mlx5e_ktls_set_feature_rx(struct net_device *netdev, bool enable);
5938032Speterstruct mlx5e_ktls_resync_resp *
6038032Spetermlx5e_ktls_rx_resync_create_resp_list(void);
6138032Spetervoid mlx5e_ktls_rx_resync_destroy_resp_list(struct mlx5e_ktls_resync_resp *resp_list);
6238032Speter
6338032Speterstatic inline bool mlx5e_is_ktls_tx(struct mlx5_core_dev *mdev)
6490792Sgshapiro{
6590792Sgshapiro	return !is_kdump_kernel() && MLX5_CAP_GEN(mdev, tls_tx) &&
6690792Sgshapiro		!mlx5_get_sd(mdev);
6790792Sgshapiro}
6838032Speter
6938032Speterbool mlx5e_is_ktls_rx(struct mlx5_core_dev *mdev);
7038032Speter
7138032Speterstruct mlx5e_tls_sw_stats {
7238032Speter	atomic64_t tx_tls_ctx;
7390792Sgshapiro	atomic64_t tx_tls_del;
7490792Sgshapiro	atomic64_t tx_tls_pool_alloc;
75120256Sgshapiro	atomic64_t tx_tls_pool_free;
7638032Speter	atomic64_t rx_tls_ctx;
77120256Sgshapiro	atomic64_t rx_tls_del;
78120256Sgshapiro};
79120256Sgshapiro
80120256Sgshapirostruct mlx5e_tls_debugfs {
81120256Sgshapiro	struct dentry *dfs;
82120256Sgshapiro	struct dentry *dfs_tx;
83120256Sgshapiro};
84120256Sgshapiro
85120256Sgshapirostruct mlx5e_tls {
86120256Sgshapiro	struct mlx5_core_dev *mdev;
87120256Sgshapiro	struct mlx5e_tls_sw_stats sw_stats;
88120256Sgshapiro	struct workqueue_struct *rx_wq;
89120256Sgshapiro	struct mlx5e_tls_tx_pool *tx_pool;
90120256Sgshapiro	struct mlx5_crypto_dek_pool *dek_pool;
9190792Sgshapiro	struct mlx5e_tls_debugfs debugfs;
9294334Sgshapiro};
9394334Sgshapiro
9490792Sgshapiroint mlx5e_ktls_init(struct mlx5e_priv *priv);
9590792Sgshapirovoid mlx5e_ktls_cleanup(struct mlx5e_priv *priv);
96111823Sgshapiro
9790792Sgshapiroint mlx5e_ktls_get_count(struct mlx5e_priv *priv);
9890792Sgshapiroint mlx5e_ktls_get_strings(struct mlx5e_priv *priv, uint8_t *data);
9990792Sgshapiroint mlx5e_ktls_get_stats(struct mlx5e_priv *priv, u64 *data);
10090792Sgshapiro
10190792Sgshapiro#else
10290792Sgshapirostatic inline void mlx5e_ktls_build_netdev(struct mlx5e_priv *priv)
10390792Sgshapiro{
10490792Sgshapiro}
10590792Sgshapiro
10690792Sgshapirostatic inline int mlx5e_ktls_init_tx(struct mlx5e_priv *priv)
10790792Sgshapiro{
10890792Sgshapiro	return 0;
10990792Sgshapiro}
11090792Sgshapiro
11190792Sgshapirostatic inline void mlx5e_ktls_cleanup_tx(struct mlx5e_priv *priv)
11290792Sgshapiro{
11390792Sgshapiro}
11490792Sgshapiro
11590792Sgshapirostatic inline int mlx5e_ktls_init_rx(struct mlx5e_priv *priv)
11690792Sgshapiro{
11790792Sgshapiro	return 0;
11890792Sgshapiro}
11990792Sgshapiro
12090792Sgshapirostatic inline void mlx5e_ktls_cleanup_rx(struct mlx5e_priv *priv)
12190792Sgshapiro{
12290792Sgshapiro}
12390792Sgshapiro
12490792Sgshapirostatic inline int mlx5e_ktls_set_feature_rx(struct net_device *netdev, bool enable)
12590792Sgshapiro{
126363466Sgshapiro	netdev_warn(netdev, "kTLS is not supported\n");
12790792Sgshapiro	return -EOPNOTSUPP;
12890792Sgshapiro}
12990792Sgshapiro
130203004Sgshapirostatic inline struct mlx5e_ktls_resync_resp *
13190792Sgshapiromlx5e_ktls_rx_resync_create_resp_list(void)
13290792Sgshapiro{
13390792Sgshapiro	return ERR_PTR(-EOPNOTSUPP);
13490792Sgshapiro}
13590792Sgshapiro
13694334Sgshapirostatic inline void
13764562Sgshapiromlx5e_ktls_rx_resync_destroy_resp_list(struct mlx5e_ktls_resync_resp *resp_list) {}
13890792Sgshapiro
13990792Sgshapirostatic inline bool mlx5e_is_ktls_rx(struct mlx5_core_dev *mdev)
14090792Sgshapiro{
14190792Sgshapiro	return false;
142363466Sgshapiro}
143168515Sgshapiro
144168515Sgshapirostatic inline int mlx5e_ktls_init(struct mlx5e_priv *priv) { return 0; }
145168515Sgshapirostatic inline void mlx5e_ktls_cleanup(struct mlx5e_priv *priv) { }
146168515Sgshapirostatic inline int mlx5e_ktls_get_count(struct mlx5e_priv *priv) { return 0; }
147168515Sgshapirostatic inline int mlx5e_ktls_get_strings(struct mlx5e_priv *priv, uint8_t *data)
148168515Sgshapiro{
149168515Sgshapiro	return 0;
15064562Sgshapiro}
15164562Sgshapiro
15264562Sgshapirostatic inline int mlx5e_ktls_get_stats(struct mlx5e_priv *priv, u64 *data)
15364562Sgshapiro{
15464562Sgshapiro	return 0;
155110560Sgshapiro}
15690792Sgshapiro#endif
15790792Sgshapiro
15890792Sgshapiro#endif /* __MLX5E_TLS_H__ */
15990792Sgshapiro