From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <Ravi1.Kumar@amd.com>
Received: from NAM01-SN1-obe.outbound.protection.outlook.com
 (mail-sn1nam01on0082.outbound.protection.outlook.com [104.47.32.82])
 by dpdk.org (Postfix) with ESMTP id 996031B172
 for <dev@dpdk.org>; Fri,  5 Jan 2018 10:40:44 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=amdcloud.onmicrosoft.com; s=selector1-amd-com;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version;
 bh=K6gEHGyiXzCKK0qiM0DtD89Efl3yW29hNp+Iqta+z44=;
 b=xEfSH5kuZ0pZu2UMyDZ5ZsWhCyYJoIHXxVqUEoEPPVSpP92ujfPnpziXCjyCurN76G7AV1ZJWINSxT6cVbOIvxCECWBrbll7Fqjbhlgh3cTR9GrmbQROwTAENzQOxMtepnUggK3Lyp7WOe+nn6JATl9/bMkC7KU0pt9KVc2h180=
Authentication-Results: spf=none (sender IP is )
 smtp.mailfrom=Ravi1.Kumar@amd.com; 
Received: from wallaby-smavila.amd.com (202.56.249.162) by
 BN6PR12MB1508.namprd12.prod.outlook.com (10.172.24.149) with Microsoft SMTP
 Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id
 15.20.386.5; Fri, 5 Jan 2018 09:40:42 +0000
From: Ravi Kumar <Ravi1.kumar@amd.com>
To: dev@dpdk.org
Cc: pablo.de.lara.guarch@intel.com
Date: Fri,  5 Jan 2018 04:39:51 -0500
Message-Id: <1515145198-97367-13-git-send-email-Ravi1.kumar@amd.com>
X-Mailer: git-send-email 2.7.4
In-Reply-To: <1515145198-97367-1-git-send-email-Ravi1.kumar@amd.com>
References: <1512047553-118101-1-git-send-email-Ravi1.kumar@amd.com>
 <1515145198-97367-1-git-send-email-Ravi1.kumar@amd.com>
MIME-Version: 1.0
Content-Type: text/plain
X-Originating-IP: [202.56.249.162]
X-ClientProxiedBy: PN1PR01CA0084.INDPRD01.PROD.OUTLOOK.COM (10.174.144.152) To
 BN6PR12MB1508.namprd12.prod.outlook.com (10.172.24.149)
X-MS-PublicTrafficType: Email
X-MS-Office365-Filtering-HT: Tenant
X-MS-Office365-Filtering-Correlation-Id: eaa35c76-cb19-41f4-76d2-08d5542063af
X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0;
 RULEID:(48565401081)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060);
 SRVR:BN6PR12MB1508; 
X-Microsoft-Exchange-Diagnostics: 1; BN6PR12MB1508;
 3:Rjau+8pNm+uwpU4P4Clk0U7h4jpTnPPNJ5txlTZPaqvCkbRwwPTndnUF27BVZaQre9lcHj2Qe+tALTY8YeAhfQXLc2Z1bZA4oBP2HM479A5vX86PKmBi9LpTkqJHti+co+vU0bN97oBsYn99/opo+smAi+EseYBSQeZ3ImWI8HYHVtQBT5cgQVJ2iZLkSTADvn6b+zhD/D/eDvvwnp5OfbjtO3t8LXzhcOl/DCC32dXWY3b69ggQ9CoW72WfeCcS;
 25:QtOIrVF/SMc7XyCua+uIKt8xuQKqcG4Gdm8r2gBiJWyQQEAnqsdn7WhIWAiUAEV9S7J2K7A99DFW/l96FCz+bF+2D+rpOI7Y4Tl9h0twAx64lWhXDeI63/zZ9WXkgRBN3oVlXseeQTAXxOm8WPb1aSwAa+izi48bHNNELFiLMjVazTie5B2TdxzfUMFY/RoO0x78ojWROv1p7F4cPMMl/+x/n2chmTsiUH64/mMiyMC/D6Pl1jqtZyp+dqBTfvSaikr+6k0LOxvQTJTITHbB2cY/Gkec7xQiqTEPKByHu4n09yJy+er30SdqZRBpD7vUsvf3eSbB4skMu/vMyD+mJw==;
 31:LzXAisT1yGO7IVO8jMGk2kejF9BvvKXGs9cEadEVySEnkyFxHvKPxnCucYGRpzPz0Mgh66nGVr36/Uk2kscdb3M3b0DB5d/IMLdJnlPQG0978y9vh6FdxeNLVdERJ3J6Y7JiEazkq9ml+KfRX8RTkabiNNkHcQpA9M7dIimEwPlOROfk2E0g/b11GgiANbJywbJMc1T5uywn+2sgYAKW2ugn4jyzSB3kIMiNZX3RZGk=
X-MS-TrafficTypeDiagnostic: BN6PR12MB1508:
X-Microsoft-Exchange-Diagnostics: 1; BN6PR12MB1508;
 20:eAFwmS8+IsNiNt5uZh7q8xfTfxFdWZ++Wy59aApEubL+DnWtvfppWRP8WHoOLbgBzYaIa/JfUFNXkaVK22UEOGbIsewK4eX3cClUt4DVPTMJokqiTAjx34DwjpTmCY4uypAaISmw0TWnIzOWRWESbGegX2Qj1jpZKezUix5/BB2DMKlslMlwQRV/0JtkT6goqodFPtVLyo/cvRQi2W3GXhZKwz+nRxZYpEOcqbTfntoQpGxRPq+u6WqWt05lRZDyymbWfhPBW+JCtcZRtTfF6kuar0ZJA+TL1ufrta+SdUlxQzqFzdMdX62c4G9VYD2wdt++tIWd0kpXZX+DrDff3ecSN4wfwwc2MM82TjbHF+YKO9Dbdm2Ds+rxjsM1uEVbn4Ywsf2f9tmtO6z1+DxWAk1+fPCbAo+vddTypqsfqT+JF/RTuK+2l0gChS/4xj6iXOpBYTringNsbSfxynHTDmHWvStv/scCd2aDSvljBEQNhXhA+UAx4P7EcaxsJiae;
 4:7v1VCynExApJDomCPbMvZCUeVUTqsujleCXFgpaAvy+F2b5K4GMTW8aRaylmmIEDtqDEUepL7mBDX7xI1Q+tvnjS7r0CuEQwQzQ2qtFidm+DshpXRze/8vkFgSaaE1DAmfou/OhIYhbACs0L7pL1GgtW+LudxOD+Lolwl9cUNCGcoTDA79UCwa+XP0BAyIcq2cWbdY6DzIFF7l5lF6MVtn8nyrO7ByOfAUAjoDi0T/kjzwifMCQRUOFXg1menGSTWhYoFcvwoXPf/Ljn4v61JRMM/uHsDYUhLspZPfKc6lykJxjZ8rLTJureZr1WCVjt
X-Microsoft-Antispam-PRVS: <BN6PR12MB1508EAD058E6689913A46C06AE1C0@BN6PR12MB1508.namprd12.prod.outlook.com>
X-Exchange-Antispam-Report-Test: UriScan:(767451399110);
X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0;
 RULEID:(6040470)(2401047)(5005006)(8121501046)(93006095)(93001095)(10201501046)(3002001)(3231023)(944501075)(6055026)(6041268)(20161123558120)(20161123564045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(6072148)(201708071742011);
 SRVR:BN6PR12MB1508; BCL:0; PCL:0; RULEID:(100000803101)(100110400095);
 SRVR:BN6PR12MB1508; 
X-Forefront-PRVS: 05437568AA
X-Forefront-Antispam-Report: SFV:NSPM;
 SFS:(10009020)(396003)(39860400002)(366004)(346002)(39380400002)(376002)(199004)(189003)(6486002)(2361001)(6116002)(106356001)(386003)(105586002)(3846002)(6916009)(2950100002)(16586007)(6666003)(16526018)(36756003)(4326008)(2906002)(316002)(97736004)(25786009)(478600001)(86362001)(68736007)(8676002)(48376002)(51416003)(81166006)(2351001)(81156014)(52116002)(8936002)(53936002)(305945005)(50226002)(76176011)(72206003)(50466002)(53416004)(7696005)(47776003)(66066001)(59450400001)(5660300001)(7736002);
 DIR:OUT; SFP:1101; SCL:1; SRVR:BN6PR12MB1508; H:wallaby-smavila.amd.com; FPR:;
 SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; 
Received-SPF: None (protection.outlook.com: amd.com does not designate
 permitted sender hosts)
X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN6PR12MB1508;
 23:f/clEUOwcJPCf88TNcGJBKlzaK74xvJZxhbsjDkHJ?=
 =?us-ascii?Q?1pX2kbvz48JrmCZQ2ESKxHzPXqQJftht+wy6AWQkT9rli02L1aaXqHZ+2qNd?=
 =?us-ascii?Q?S63pHAaZm8iYOFIBivSutVL8d6MrIrOKWexnIc4KxgDFxn7T3K/Y0Yz65E6o?=
 =?us-ascii?Q?/mXQm1utAPnN/ax+sWeB+XprNN7zMvNVyr6TJ6d3ZbjhrwFnppUCNoja+fsP?=
 =?us-ascii?Q?RmurtW3thrIrZKKWY6SShjBkGjOMBOVPOi7+NA8hVMj3FAFu2sLSVZq5IRWv?=
 =?us-ascii?Q?zj1WTBJxJrqUfa4e1V4Zw8Jsq9JorSW//NEnysY8zpXS5dTkeuwaIqm7sWZ8?=
 =?us-ascii?Q?jpQ+EvkCjgLPHGQcNSyBGChgKIIBtEYpUzqn/8Q/4c7ahSE7A5gGqYJPo7jh?=
 =?us-ascii?Q?aAFUPRW6YY4+I4iut9dQZ5iIaV6doLAnRTdrZx/OG1O7EELemT5yhrVhikKt?=
 =?us-ascii?Q?aVPfuJ5Wp6AKudQsF9pN6W6JR1urE/rsR1kA1wgGpkl7lNEACOPJBXYyFf3l?=
 =?us-ascii?Q?4WaIFX/gGf36KK8AmOukPVpQY9mem7cuNwu4gx5lH+Sk3+BGAXVAMlDpTQIB?=
 =?us-ascii?Q?jc9iAX3KD+gy064snqRCmAM4e9o26mFUOs/ulCfQKQ2DDMRVthEePG2Sr7zu?=
 =?us-ascii?Q?9GQYKvrgv6XMpvZmR0AkTHxhw0Rfo0X7+pbPnjp3qlQ0TTLyEozpJlzMHVrv?=
 =?us-ascii?Q?9KHoHz6CO+Vq5tgGqb3mqzYcwA8TJtYM7olGKTnnQ/QORdNSOpyDODdPN+5C?=
 =?us-ascii?Q?QhOtYScAUKsaTRYXXoEt5GWSQi/EbVA/RmPJGOkEET3pvc+stHHLttzZZcgs?=
 =?us-ascii?Q?7zNoYPzkR+0w1MnT+c101v71hyuHjKSUdhj/7rjZXu6S6/dGPnol6xZrZ+4U?=
 =?us-ascii?Q?A+rQZEgGMSASLqHabBQzywhBY9eNLDzxVKQPLsLCbN3qwyCTvV6LtLZ7EqYD?=
 =?us-ascii?Q?0tmJdjIXDrlEg0Lf3iulqQ3RLKoPbReyTfgWfGPghM/W7Ovn393/G6cMuW9f?=
 =?us-ascii?Q?uQADYupUwR6rCDwqXz9kPcFF7HZu4/RC6hIDWZXdaQmyIKnO8WgInvR0NOSd?=
 =?us-ascii?Q?nTxeDlC43kj18zYffpF+apnR4tCODrDeJ+NrMNZp9ymJz+DH0H7VpT7sye/I?=
 =?us-ascii?Q?RM+YNbZ5fMFGBhB1Dmho2dWA6mkV6GWSHGvNOygVhvqtmwbDRm1sw=3D=3D?=
X-Microsoft-Exchange-Diagnostics: 1; BN6PR12MB1508;
 6:3OcJsCc5CkkqRzKocFpMH+Um7p3WUP2c+Whv+9f6B7Yfn1BXttDQu/llPXBAE+Ti3gBH/E7NS/HKrw1YhYr16Hh3JpL7kH/N+YoC9vBnQcfMXMAuDrfZbZwxs6A5wSLOkGaMU9SKnlr6AbMR2yc4CxOJpggcdjlbeueVh2BH8Vq/fZEa0KvGsY1KPWp7rxvbdFXRWfSOGd4Qms7yqjNBo3c3z7PkCdyljMy3S9rszj+4DiKJRKELGAsxJ31z4hnRTk7bKP5HO2dUOjIaCTyq4uTLEnlPEG8y1LllridDS6++MdwNBegWsM0txjQHfpPhndojIHNcfSrS6VGxtws8pXTuJy1fJkO+uC2mRK3hhjM=;
 5:gJQE+WsDggNujFCTZcbhedPtqDwdrEYEFK10dbsFQesnpSJB3vjZQ9iVH9071TpWRFXu3DhSVBBk99Vn0S1516/mAqYA3CzS2BTfRQAav7/qoIiHGfVNKJjwzxphO+FS4gneGHsJrElvOdy4YsJehc+SVuQ/7XHSZ7b6SXmmPlM=;
 24:NPBizPBR4MSnVGndqFrbY3S1fnRIGsdDLMALUM+zVE5ANL+PDtS+PqugEGToekPATpmQCIBX2G8s6cTcKoSmtp5/TZ3NOfVaOJT3xcxQIgU=;
 7:l6Y6/vEAwXuKoy3jtnAA1/MEvSyvfP1q2xtXBuKcvaXpDp2YAAzIOpjQ+sp6dT+SxTMu3jXtBsCnArJATPnerhDGxj2XHXYHRuV9vDWdXuWs8C6ndw4u36muHdbCuvk/6i3lTvfxV1sRcsobgYCPsb58T6IskYn1NTdDGzm7zVNCKFHv967pAwuAfOl/ZaSnJoV3E4vdlu8VeDhbnTipjfxiH9MgcjaQ0kLZu+MJCDJ63SH3zsTBbmU/crndpeF4
SpamDiagnosticOutput: 1:99
SpamDiagnosticMetadata: NSPM
X-Microsoft-Exchange-Diagnostics: 1; BN6PR12MB1508;
 20:Mjv1iSKocrCdWgF40Y6kFhpmo1S6lbwlfDCcXYiOhlmDC/VytqbxKh0ZNeLTS91/0FbVvNS7fzB0tysLn5SSLgrFvvEmPwF79NhItNmQjNYzexPb/umiqpCqlXeLCYTFqT6LC1r4rzD8gkBLFCKhCd2YFmtz8syeKqnxq4bf+pom2QW2Cvbd+QIxZ9JHHmKJVV5ROVirbEYgFF8OpwqJ4HxeRjBaySKQeA8I5qdtXlN2PG9vSazzC6DKKpyvJJ/O
X-OriginatorOrg: amd.com
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Jan 2018 09:40:42.1703 (UTC)
X-MS-Exchange-CrossTenant-Network-Message-Id: eaa35c76-cb19-41f4-76d2-08d5542063af
X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted
X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d
X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR12MB1508
Subject: [dpdk-dev] [PATCH v2 13/20] crypto/ccp: add aes-gcm aead algo
	support
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://dpdk.org/ml/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://dpdk.org/ml/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://dpdk.org/ml/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Fri, 05 Jan 2018 09:40:46 -0000

Signed-off-by: Ravi Kumar <Ravi1.kumar@amd.com>
---
 drivers/crypto/ccp/ccp_crypto.c  | 240 ++++++++++++++++++++++++++++++++++++++-
 drivers/crypto/ccp/ccp_pmd_ops.c |  30 +++++
 2 files changed, 266 insertions(+), 4 deletions(-)

diff --git a/drivers/crypto/ccp/ccp_crypto.c b/drivers/crypto/ccp/ccp_crypto.c
index 6e593d8..4ced193 100644
--- a/drivers/crypto/ccp/ccp_crypto.c
+++ b/drivers/crypto/ccp/ccp_crypto.c
@@ -299,6 +299,7 @@ ccp_configure_session_aead(struct ccp_session *sess,
 			   const struct rte_crypto_sym_xform *xform)
 {
 	const struct rte_crypto_aead_xform *aead_xform = NULL;
+	size_t i;
 
 	aead_xform = &xform->aead;
 
@@ -313,6 +314,7 @@ ccp_configure_session_aead(struct ccp_session *sess,
 		sess->cipher.dir = CCP_CIPHER_DIR_DECRYPT;
 		sess->auth.op = CCP_AUTH_OP_VERIFY;
 	}
+	sess->aead_algo = aead_xform->algo;
 	sess->auth.aad_length = aead_xform->aad_length;
 	sess->auth.digest_length = aead_xform->digest_length;
 
@@ -321,10 +323,37 @@ ccp_configure_session_aead(struct ccp_session *sess,
 	sess->iv.length = aead_xform->iv.length;
 
 	switch (aead_xform->algo) {
+	case RTE_CRYPTO_AEAD_AES_GCM:
+		sess->cipher.algo = CCP_CIPHER_ALGO_AES_GCM;
+		sess->cipher.um.aes_mode = CCP_AES_MODE_GCTR;
+		sess->cipher.engine = CCP_ENGINE_AES;
+		if (sess->cipher.key_length == 16)
+			sess->cipher.ut.aes_type = CCP_AES_TYPE_128;
+		else if (sess->cipher.key_length == 24)
+			sess->cipher.ut.aes_type = CCP_AES_TYPE_192;
+		else if (sess->cipher.key_length == 32)
+			sess->cipher.ut.aes_type = CCP_AES_TYPE_256;
+		else {
+			CCP_LOG_ERR("Invalid aead key length");
+			return -1;
+		}
+		for (i = 0; i < sess->cipher.key_length; i++)
+			sess->cipher.key_ccp[sess->cipher.key_length - i - 1] =
+				sess->cipher.key[i];
+		sess->auth.algo = CCP_AUTH_ALGO_AES_GCM;
+		sess->auth.engine = CCP_ENGINE_AES;
+		sess->auth.um.aes_mode = CCP_AES_MODE_GHASH;
+		sess->auth.ctx_len = CCP_SB_BYTES;
+		sess->auth.offset = 0;
+		sess->auth.block_size = AES_BLOCK_SIZE;
+		sess->cmd_id = CCP_CMD_COMBINED;
+		break;
 	default:
 		CCP_LOG_ERR("Unsupported aead algo");
 		return -ENOTSUP;
 	}
+	sess->cipher.nonce_phys = rte_mem_virt2phy(sess->cipher.nonce);
+	sess->cipher.key_phys = rte_mem_virt2phy(sess->cipher.key_ccp);
 	return 0;
 }
 
@@ -447,10 +476,27 @@ ccp_aead_slot(struct ccp_session *session)
 	int count = 0;
 
 	switch (session->aead_algo) {
+	case RTE_CRYPTO_AEAD_AES_GCM:
+		break;
 	default:
 		CCP_LOG_ERR("Unsupported aead algo %d",
 			    session->aead_algo);
 	}
+	switch (session->auth.algo) {
+	case CCP_AUTH_ALGO_AES_GCM:
+		count = 5;
+		/**
+		 * 1. Passthru iv
+		 * 2. Hash AAD
+		 * 3. GCTR
+		 * 4. Reload passthru
+		 * 5. Hash Final tag
+		 */
+		break;
+	default:
+		CCP_LOG_ERR("Unsupported combined auth ALGO %d",
+			    session->auth.algo);
+	}
 	return count;
 }
 
@@ -873,6 +919,184 @@ ccp_perform_3des(struct rte_crypto_op *op,
 	return 0;
 }
 
+static int
+ccp_perform_aes_gcm(struct rte_crypto_op *op, struct ccp_queue *cmd_q)
+{
+	struct ccp_session *session;
+	union ccp_function function;
+	uint8_t *lsb_buf, *append_ptr, *iv;
+	struct ccp_passthru pst;
+	struct ccp_desc *desc;
+	uint32_t tail;
+	uint64_t *temp;
+	phys_addr_t src_addr, dest_addr, key_addr, aad_addr;
+	phys_addr_t digest_dest_addr;
+	int length, non_align_len, i;
+
+	session = (struct ccp_session *)get_session_private_data(
+					 op->sym->session,
+					 ccp_cryptodev_driver_id);
+	iv = rte_crypto_op_ctod_offset(op, uint8_t *, session->iv.offset);
+	key_addr = rte_mem_virt2phy(session->cipher.key_ccp);
+
+	src_addr = rte_pktmbuf_mtophys_offset(op->sym->m_src,
+					      op->sym->cipher.data.offset);
+	if (unlikely(op->sym->m_dst != NULL))
+		dest_addr = rte_pktmbuf_mtophys_offset(op->sym->m_dst,
+						op->sym->cipher.data.offset);
+	else
+		dest_addr = src_addr;
+	append_ptr = (uint8_t *)rte_pktmbuf_append(op->sym->m_src,
+						   session->auth.ctx_len);
+	digest_dest_addr = (phys_addr_t)rte_mem_virt2phy((void *)append_ptr);
+	append_ptr += AES_BLOCK_SIZE;
+	temp = (uint64_t *)append_ptr;
+	*temp++ =  rte_bswap64(session->auth.aad_length << 3);
+	*temp =  rte_bswap64(op->sym->cipher.data.length << 3);
+
+	non_align_len = op->sym->cipher.data.length % AES_BLOCK_SIZE;
+	length = CCP_ALIGN(op->sym->cipher.data.length, AES_BLOCK_SIZE);
+
+	aad_addr = rte_mem_virt2phy((void *)op->sym->aead.aad.data);
+
+	/* CMD1 IV Passthru */
+	for (i = 0;  i < CTR_IV_SIZE; i++)
+		session->cipher.nonce[CTR_NONCE_SIZE + CTR_IV_SIZE - 1 - i] =
+			iv[i];
+	lsb_buf = session->cipher.nonce;
+
+	pst.src_addr = (phys_addr_t)rte_mem_virt2phy((void *) lsb_buf);
+	pst.dest_addr = (phys_addr_t)(cmd_q->sb_iv * CCP_SB_BYTES);
+	pst.len = CCP_SB_BYTES;
+	pst.dir = 1;
+	pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
+	pst.byte_swap = CCP_PASSTHRU_BYTESWAP_NOOP;
+	ccp_perform_passthru(&pst, cmd_q);
+
+	/* CMD2 GHASH-AAD */
+	function.raw = 0;
+	CCP_AES_ENCRYPT(&function) = CCP_AES_MODE_GHASH_AAD;
+	CCP_AES_MODE(&function) = CCP_AES_MODE_GHASH;
+	CCP_AES_TYPE(&function) = session->cipher.ut.aes_type;
+
+	desc = &cmd_q->qbase_desc[cmd_q->qidx];
+	memset(desc, 0, Q_DESC_SIZE);
+
+	CCP_CMD_ENGINE(desc) = CCP_ENGINE_AES;
+	CCP_CMD_INIT(desc) = 1;
+	CCP_CMD_FUNCTION(desc) = function.raw;
+
+	CCP_CMD_LEN(desc) = session->auth.aad_length;
+
+	CCP_CMD_SRC_LO(desc) = ((uint32_t)aad_addr);
+	CCP_CMD_SRC_HI(desc) = high32_value(aad_addr);
+	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
+
+	CCP_CMD_KEY_LO(desc) = ((uint32_t)key_addr);
+	CCP_CMD_KEY_HI(desc) = high32_value(key_addr);
+	CCP_CMD_KEY_MEM(desc) = CCP_MEMTYPE_SYSTEM;
+
+	CCP_CMD_LSB_ID(desc) = cmd_q->sb_iv;
+
+	cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
+	rte_wmb();
+
+	tail = (uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx * Q_DESC_SIZE);
+	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_TAIL_LO_BASE, tail);
+	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_CONTROL_BASE,
+		      cmd_q->qcontrol | CMD_Q_RUN);
+
+	/* CMD3 : GCTR Plain text */
+	function.raw = 0;
+	CCP_AES_ENCRYPT(&function) = session->cipher.dir;
+	CCP_AES_MODE(&function) = CCP_AES_MODE_GCTR;
+	CCP_AES_TYPE(&function) = session->cipher.ut.aes_type;
+	if (non_align_len == 0)
+		CCP_AES_SIZE(&function) = (AES_BLOCK_SIZE << 3) - 1;
+	else
+		CCP_AES_SIZE(&function) = (non_align_len << 3) - 1;
+
+
+	desc = &cmd_q->qbase_desc[cmd_q->qidx];
+	memset(desc, 0, Q_DESC_SIZE);
+
+	CCP_CMD_ENGINE(desc) = CCP_ENGINE_AES;
+	CCP_CMD_EOM(desc) = 1;
+	CCP_CMD_FUNCTION(desc) = function.raw;
+
+	CCP_CMD_LEN(desc) = length;
+
+	CCP_CMD_SRC_LO(desc) = ((uint32_t)src_addr);
+	CCP_CMD_SRC_HI(desc) = high32_value(src_addr);
+	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
+
+	CCP_CMD_DST_LO(desc) = ((uint32_t)dest_addr);
+	CCP_CMD_DST_HI(desc) = high32_value(dest_addr);
+	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
+
+	CCP_CMD_KEY_LO(desc) = ((uint32_t)key_addr);
+	CCP_CMD_KEY_HI(desc) = high32_value(key_addr);
+	CCP_CMD_KEY_MEM(desc) = CCP_MEMTYPE_SYSTEM;
+
+	CCP_CMD_LSB_ID(desc) = cmd_q->sb_iv;
+
+	cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
+	rte_wmb();
+
+	tail = (uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx * Q_DESC_SIZE);
+	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_TAIL_LO_BASE, tail);
+	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_CONTROL_BASE,
+		      cmd_q->qcontrol | CMD_Q_RUN);
+
+	/* CMD4 : PT to copy IV */
+	pst.src_addr = (phys_addr_t)rte_mem_virt2phy((void *) lsb_buf);
+	pst.dest_addr = (phys_addr_t)(cmd_q->sb_iv * CCP_SB_BYTES);
+	pst.len = AES_BLOCK_SIZE;
+	pst.dir = 1;
+	pst.bit_mod = CCP_PASSTHRU_BITWISE_NOOP;
+	pst.byte_swap = CCP_PASSTHRU_BYTESWAP_NOOP;
+	ccp_perform_passthru(&pst, cmd_q);
+
+	/* CMD5 : GHASH-Final */
+	function.raw = 0;
+	CCP_AES_ENCRYPT(&function) = CCP_AES_MODE_GHASH_FINAL;
+	CCP_AES_MODE(&function) = CCP_AES_MODE_GHASH;
+	CCP_AES_TYPE(&function) = session->cipher.ut.aes_type;
+
+	desc = &cmd_q->qbase_desc[cmd_q->qidx];
+	memset(desc, 0, Q_DESC_SIZE);
+
+	CCP_CMD_ENGINE(desc) = CCP_ENGINE_AES;
+	CCP_CMD_FUNCTION(desc) = function.raw;
+	/* Last block (AAD_len || PT_len)*/
+	CCP_CMD_LEN(desc) = AES_BLOCK_SIZE;
+
+	CCP_CMD_SRC_LO(desc) = ((uint32_t)digest_dest_addr + AES_BLOCK_SIZE);
+	CCP_CMD_SRC_HI(desc) = high32_value(digest_dest_addr + AES_BLOCK_SIZE);
+	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
+
+	CCP_CMD_DST_LO(desc) = ((uint32_t)digest_dest_addr);
+	CCP_CMD_DST_HI(desc) = high32_value(digest_dest_addr);
+	CCP_CMD_SRC_MEM(desc) = CCP_MEMTYPE_SYSTEM;
+
+	CCP_CMD_KEY_LO(desc) = ((uint32_t)key_addr);
+	CCP_CMD_KEY_HI(desc) = high32_value(key_addr);
+	CCP_CMD_KEY_MEM(desc) = CCP_MEMTYPE_SYSTEM;
+
+	CCP_CMD_LSB_ID(desc) = cmd_q->sb_iv;
+
+	cmd_q->qidx = (cmd_q->qidx + 1) % COMMANDS_PER_QUEUE;
+	rte_wmb();
+
+	tail = (uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx * Q_DESC_SIZE);
+	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_TAIL_LO_BASE, tail);
+	CCP_WRITE_REG(cmd_q->reg_base, CMD_Q_CONTROL_BASE,
+		      cmd_q->qcontrol | CMD_Q_RUN);
+
+	op->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
+	return 0;
+}
+
 static inline int
 ccp_crypto_cipher(struct rte_crypto_op *op,
 		  struct ccp_queue *cmd_q,
@@ -939,17 +1163,25 @@ ccp_crypto_auth(struct rte_crypto_op *op,
 
 static inline int
 ccp_crypto_aead(struct rte_crypto_op *op,
-		struct ccp_queue *cmd_q __rte_unused,
-		struct ccp_batch_info *b_info __rte_unused)
+		struct ccp_queue *cmd_q,
+		struct ccp_batch_info *b_info)
 {
 	int result = 0;
 	struct ccp_session *session;
 
 	session = (struct ccp_session *)get_session_private_data(
-					 op->sym->session,
+					op->sym->session,
 					ccp_cryptodev_driver_id);
 
-	switch (session->aead_algo) {
+	switch (session->auth.algo) {
+	case CCP_AUTH_ALGO_AES_GCM:
+		if (session->cipher.algo != CCP_CIPHER_ALGO_AES_GCM) {
+			CCP_LOG_ERR("Incorrect chain order");
+			return -1;
+		}
+		result = ccp_perform_aes_gcm(op, cmd_q);
+		b_info->desccnt += 5;
+		break;
 	default:
 		CCP_LOG_ERR("Unsupported aead algo %d",
 			    session->aead_algo);
diff --git a/drivers/crypto/ccp/ccp_pmd_ops.c b/drivers/crypto/ccp/ccp_pmd_ops.c
index 59e7285..2309e9f 100644
--- a/drivers/crypto/ccp/ccp_pmd_ops.c
+++ b/drivers/crypto/ccp/ccp_pmd_ops.c
@@ -140,6 +140,36 @@ static const struct rte_cryptodev_capabilities ccp_pmd_capabilities[] = {
 			}, }
 		}, }
 	},
+	{       /* AES GCM */
+		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
+		{.sym = {
+			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
+			{.aead = {
+				 .algo = RTE_CRYPTO_AEAD_AES_GCM,
+				 .block_size = 16,
+				 .key_size = {
+					 .min = 16,
+					 .max = 32,
+					 .increment = 8
+				 },
+				 .digest_size = {
+					 .min = 16,
+					 .max = 16,
+					 .increment = 0
+				 },
+				 .aad_size = {
+					 .min = 0,
+					 .max = 65535,
+					 .increment = 1
+				 },
+				 .iv_size = {
+					 .min = 12,
+					 .max = 16,
+					 .increment = 4
+				 },
+			}, }
+		}, }
+	},
 	RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
 };
 
-- 
2.7.4