diff --git a/drivers/common/qat/dev/qat_dev_gen1.c b/drivers/common/qat/dev/qat_dev_gen1.c
index 4d60c2a051..3c7a558959 100644
--- a/drivers/common/qat/dev/qat_dev_gen1.c
+++ b/drivers/common/qat/dev/qat_dev_gen1.c
@@ -227,11 +227,18 @@ qat_dev_read_config_gen1(struct qat_pci_device *qat_dev __rte_unused)
 	return 0;
 }
 
+int
+qat_dev_get_extra_size_gen1(void)
+{
+	return 0;
+}
+
 static struct qat_dev_hw_spec_funcs qat_dev_hw_spec_gen1 = {
 	.qat_dev_reset_ring_pairs	= qat_reset_ring_pairs_gen1,
 	.qat_dev_get_transport_bar	= qat_dev_get_transport_bar_gen1,
 	.qat_dev_get_misc_bar		= qat_dev_get_misc_bar_gen1,
 	.qat_dev_read_config		= qat_dev_read_config_gen1,
+	.qat_dev_get_extra_size		= qat_dev_get_extra_size_gen1,
 };
 
 RTE_INIT(qat_dev_gen_gen1_init)
diff --git a/drivers/common/qat/dev/qat_dev_gen1.h b/drivers/common/qat/dev/qat_dev_gen1.h
index 9bf4fcf01b..ec0af94655 100644
--- a/drivers/common/qat/dev/qat_dev_gen1.h
+++ b/drivers/common/qat/dev/qat_dev_gen1.h
@@ -13,6 +13,9 @@
 extern const struct qat_qp_hw_data qat_gen1_qps[QAT_MAX_SERVICES]
 					 [ADF_MAX_QPS_ON_ANY_SERVICE];
 
+int
+qat_dev_get_extra_size_gen1(void);
+
 int
 qat_qp_rings_per_service_gen1(struct qat_pci_device *qat_dev,
 		enum qat_service_type service);
diff --git a/drivers/common/qat/dev/qat_dev_gen2.c b/drivers/common/qat/dev/qat_dev_gen2.c
index ad1b643e00..856463c06f 100644
--- a/drivers/common/qat/dev/qat_dev_gen2.c
+++ b/drivers/common/qat/dev/qat_dev_gen2.c
@@ -25,6 +25,7 @@ static struct qat_dev_hw_spec_funcs qat_dev_hw_spec_gen2 = {
 	.qat_dev_get_transport_bar	= qat_dev_get_transport_bar_gen1,
 	.qat_dev_get_misc_bar		= qat_dev_get_misc_bar_gen1,
 	.qat_dev_read_config		= qat_dev_read_config_gen1,
+	.qat_dev_get_extra_size		= qat_dev_get_extra_size_gen1,
 };
 
 RTE_INIT(qat_dev_gen_gen2_init)
diff --git a/drivers/common/qat/dev/qat_dev_gen3.c b/drivers/common/qat/dev/qat_dev_gen3.c
index 407d21576b..237712f1ef 100644
--- a/drivers/common/qat/dev/qat_dev_gen3.c
+++ b/drivers/common/qat/dev/qat_dev_gen3.c
@@ -63,6 +63,7 @@ static struct qat_dev_hw_spec_funcs qat_dev_hw_spec_gen3 = {
 	.qat_dev_get_transport_bar	= qat_dev_get_transport_bar_gen1,
 	.qat_dev_get_misc_bar		= qat_dev_get_misc_bar_gen1,
 	.qat_dev_read_config		= qat_dev_read_config_gen1,
+	.qat_dev_get_extra_size		= qat_dev_get_extra_size_gen1,
 };
 
 RTE_INIT(qat_dev_gen_gen3_init)
diff --git a/drivers/common/qat/dev/qat_dev_gen4.c b/drivers/common/qat/dev/qat_dev_gen4.c
index 6394e17dde..aecdedf375 100644
--- a/drivers/common/qat/dev/qat_dev_gen4.c
+++ b/drivers/common/qat/dev/qat_dev_gen4.c
@@ -10,9 +10,27 @@
 #include "adf_transport_access_macros_gen4vf.h"
 #include "adf_pf2vf_msg.h"
 #include "qat_pf2vf.h"
+#include "qat_dev_gen4.h"
 
 #include <stdint.h>
 
+struct qat_dev_gen4_extra {
+	struct qat_qp_hw_data qp_gen4_data[QAT_GEN4_BUNDLE_NUM]
+		[QAT_GEN4_QPS_PER_BUNDLE_NUM];
+};
+
+enum qat_service_type qat_dev4_get_qp_serv(
+		struct qat_dev_gen4_extra *dev_extra, int ring_pair)
+{
+	return dev_extra->qp_gen4_data[ring_pair][0].service_type;
+}
+
+const struct qat_qp_hw_data *qat_dev4_get_hw(
+		struct qat_dev_gen4_extra *dev_extra, int ring_pair)
+{
+	return &dev_extra->qp_gen4_data[ring_pair][0];
+}
+
 static struct qat_pf2vf_dev qat_pf2vf_gen4 = {
 	.pf2vf_offset = ADF_4XXXIOV_PF2VM_OFFSET,
 	.vf2pf_offset = ADF_4XXXIOV_VM2PF_OFFSET,
@@ -38,10 +56,11 @@ qat_qp_rings_per_service_gen4(struct qat_pci_device *qat_dev,
 		enum qat_service_type service)
 {
 	int i = 0, count = 0, max_ops_per_srv = 0;
+	struct qat_dev_gen4_extra *dev_extra = qat_dev->dev_private;
 
 	max_ops_per_srv = QAT_GEN4_BUNDLE_NUM;
 	for (i = 0, count = 0; i < max_ops_per_srv; i++)
-		if (qat_dev->qp_gen4_data[i][0].service_type == service)
+		if (dev_extra->qp_gen4_data[i][0].service_type == service)
 			count++;
 	return count;
 }
@@ -51,12 +70,13 @@ qat_dev_read_config_gen4(struct qat_pci_device *qat_dev)
 {
 	int i = 0;
 	uint16_t svc = 0;
+	struct qat_dev_gen4_extra *dev_extra = qat_dev->dev_private;
 
 	if (qat_query_svc(qat_dev, (uint8_t *)&svc))
 		return -EFAULT;
 	for (; i < QAT_GEN4_BUNDLE_NUM; i++) {
 		struct qat_qp_hw_data *hw_data =
-			&qat_dev->qp_gen4_data[i][0];
+			&dev_extra->qp_gen4_data[i][0];
 		uint8_t svc1 = (svc >> (3 * i)) & 0x7;
 		enum qat_service_type service_type = QAT_SERVICE_INVALID;
 
@@ -239,11 +259,18 @@ qat_dev_get_misc_bar_gen4(
 	return 0;
 }
 
+static int
+qat_dev_get_extra_size_gen4(void)
+{
+	return sizeof(struct qat_dev_gen4_extra);
+}
+
 static struct qat_dev_hw_spec_funcs qat_dev_hw_spec_gen4 = {
 	.qat_dev_reset_ring_pairs	= qat_reset_ring_pairs_gen4,
 	.qat_dev_get_transport_bar	= qat_dev_get_transport_bar_gen4,
 	.qat_dev_get_misc_bar		= qat_dev_get_misc_bar_gen4,
 	.qat_dev_read_config		= qat_dev_read_config_gen4,
+	.qat_dev_get_extra_size		= qat_dev_get_extra_size_gen4,
 };
 
 RTE_INIT(qat_dev_gen_4_init)
diff --git a/drivers/common/qat/dev/qat_dev_gen4.h b/drivers/common/qat/dev/qat_dev_gen4.h
new file mode 100644
index 0000000000..f588354603
--- /dev/null
+++ b/drivers/common/qat/dev/qat_dev_gen4.h
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2021 Intel Corporation
+ */
+
+#ifndef _QAT_DEV_GEN_H_
+#define _QAT_DEV_GEN_H_
+
+#include <stdint.h>
+
+struct qat_dev_gen4_extra;
+
+enum qat_service_type qat_dev4_get_qp_serv(
+		struct qat_dev_gen4_extra *dev_extra, int ring_pair);
+
+const struct qat_qp_hw_data *qat_dev4_get_hw(
+		struct qat_dev_gen4_extra *dev_extra, int ring_pair);
+
+#endif
diff --git a/drivers/common/qat/meson.build b/drivers/common/qat/meson.build
index de54004b4c..6c5db48944 100644
--- a/drivers/common/qat/meson.build
+++ b/drivers/common/qat/meson.build
@@ -9,6 +9,7 @@ endif
 
 qat_crypto = true
 qat_crypto_path = 'crypto/qat'
+qat_devs_path = 'dev'
 qat_crypto_relpath = '../../' + qat_crypto_path
 qat_compress = true
 qat_compress_path = 'compress/qat'
@@ -59,6 +60,7 @@ includes += include_directories(
         'qat_adf',
         qat_crypto_relpath,
         qat_compress_relpath,
+        qat_devs_path
 )
 
 if qat_compress
diff --git a/drivers/common/qat/qat_device.c b/drivers/common/qat/qat_device.c
index 030624b46d..4a33a62824 100644
--- a/drivers/common/qat/qat_device.c
+++ b/drivers/common/qat/qat_device.c
@@ -51,6 +51,16 @@ static const struct rte_pci_id pci_id_qat_map[] = {
 		{.device_id = 0},
 };
 
+static int
+qat_pci_get_extra_size(enum qat_device_gen qat_dev_gen)
+{
+	struct qat_dev_hw_spec_funcs *ops_hw =
+		qat_dev_hw_spec[qat_dev_gen];
+	RTE_FUNC_PTR_OR_ERR_RET(ops_hw->qat_dev_get_extra_size,
+		-ENOTSUP);
+	return ops_hw->qat_dev_get_extra_size();
+}
+
 static struct qat_pci_device *
 qat_pci_get_named_dev(const char *name)
 {
@@ -156,15 +166,38 @@ qat_pci_device_allocate(struct rte_pci_device *pci_dev,
 		struct qat_dev_cmd_param *qat_dev_cmd_param)
 {
 	struct qat_pci_device *qat_dev;
+	enum qat_device_gen qat_dev_gen;
 	uint8_t qat_dev_id = 0;
 	char name[QAT_DEV_NAME_MAX_LEN];
 	struct rte_devargs *devargs = pci_dev->device.devargs;
 	struct qat_dev_hw_spec_funcs *ops_hw = NULL;
 	struct rte_mem_resource *mem_resource;
+	int extra_size;
 
 	rte_pci_device_name(&pci_dev->addr, name, sizeof(name));
 	snprintf(name+strlen(name), QAT_DEV_NAME_MAX_LEN-strlen(name), "_qat");
 
+	switch (pci_dev->id.device_id) {
+	case 0x0443:
+		qat_dev_gen = QAT_GEN1;
+		break;
+	case 0x37c9:
+	case 0x19e3:
+	case 0x6f55:
+	case 0x18ef:
+		qat_dev_gen = QAT_GEN2;
+		break;
+	case 0x18a1:
+		qat_dev_gen = QAT_GEN3;
+		break;
+	case 0x4941:
+		qat_dev_gen = QAT_GEN4;
+		break;
+	default:
+		QAT_LOG(ERR, "Invalid dev_id, can't determine generation");
+		return NULL;
+	}
+
 	if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
 		const struct rte_memzone *mz = rte_memzone_lookup(name);
 
@@ -194,9 +227,15 @@ qat_pci_device_allocate(struct rte_pci_device *pci_dev,
 		QAT_LOG(ERR, "Reached maximum number of QAT devices");
 		return NULL;
 	}
-
+	extra_size = qat_pci_get_extra_size(qat_dev_gen);
+	if (extra_size < 0) {
+		QAT_LOG(ERR, "Error when acquiring extra size len QAT_%d",
+			qat_dev_id);
+		return NULL;
+	}
 	qat_pci_devs[qat_dev_id].mz = rte_memzone_reserve(name,
-		sizeof(struct qat_pci_device),
+		sizeof(struct qat_pci_device) +
+			extra_size,
 		rte_socket_id(), 0);
 
 	if (qat_pci_devs[qat_dev_id].mz == NULL) {
@@ -207,30 +246,11 @@ qat_pci_device_allocate(struct rte_pci_device *pci_dev,
 
 	qat_dev = qat_pci_devs[qat_dev_id].mz->addr;
 	memset(qat_dev, 0, sizeof(*qat_dev));
+	qat_dev->dev_private = qat_dev + 1;
 	strlcpy(qat_dev->name, name, QAT_DEV_NAME_MAX_LEN);
 	qat_dev->qat_dev_id = qat_dev_id;
 	qat_pci_devs[qat_dev_id].pci_dev = pci_dev;
-	switch (pci_dev->id.device_id) {
-	case 0x0443:
-		qat_dev->qat_dev_gen = QAT_GEN1;
-		break;
-	case 0x37c9:
-	case 0x19e3:
-	case 0x6f55:
-	case 0x18ef:
-		qat_dev->qat_dev_gen = QAT_GEN2;
-		break;
-	case 0x18a1:
-		qat_dev->qat_dev_gen = QAT_GEN3;
-		break;
-	case 0x4941:
-		qat_dev->qat_dev_gen = QAT_GEN4;
-		break;
-	default:
-		QAT_LOG(ERR, "Invalid dev_id, can't determine generation");
-		rte_memzone_free(qat_pci_devs[qat_dev->qat_dev_id].mz);
-		return NULL;
-	}
+	qat_dev->qat_dev_gen = qat_dev_gen;
 
 	ops_hw = qat_dev_hw_spec[qat_dev->qat_dev_gen];
 	RTE_FUNC_PTR_OR_ERR_RET(ops_hw->qat_dev_get_misc_bar, NULL);
diff --git a/drivers/common/qat/qat_device.h b/drivers/common/qat/qat_device.h
index 531aa663ca..c9923cdc54 100644
--- a/drivers/common/qat/qat_device.h
+++ b/drivers/common/qat/qat_device.h
@@ -29,12 +29,14 @@ typedef int (*qat_dev_get_misc_bar_t)
 		(struct rte_mem_resource **, struct rte_pci_device *);
 typedef int (*qat_dev_read_config_t)
 		(struct qat_pci_device *);
+typedef int (*qat_dev_get_extra_size_t)(void);
 
 struct qat_dev_hw_spec_funcs {
 	qat_dev_reset_ring_pairs_t	qat_dev_reset_ring_pairs;
 	qat_dev_get_transport_bar_t	qat_dev_get_transport_bar;
 	qat_dev_get_misc_bar_t		qat_dev_get_misc_bar;
 	qat_dev_read_config_t		qat_dev_read_config;
+	qat_dev_get_extra_size_t	qat_dev_get_extra_size;
 };
 
 extern struct qat_dev_hw_spec_funcs *qat_dev_hw_spec[];
@@ -75,9 +77,6 @@ struct qat_device_info {
 	 */
 };
 
-extern const struct qat_qp_hw_data qat_gen1_qps[][ADF_MAX_QPS_ON_ANY_SERVICE];
-extern const struct qat_qp_hw_data qat_gen3_qps[][ADF_MAX_QPS_ON_ANY_SERVICE];
-
 extern struct qat_device_info qat_pci_devs[];
 
 struct qat_sym_dev_private;
@@ -126,11 +125,10 @@ struct qat_pci_device {
 	/* Data relating to compression service */
 	struct qat_comp_dev_private *comp_dev;
 	/**< link back to compressdev private data */
-	struct qat_qp_hw_data qp_gen4_data[QAT_GEN4_BUNDLE_NUM]
-		[QAT_GEN4_QPS_PER_BUNDLE_NUM];
-	/**< Data of ring configuration on gen4 */
 	void *misc_bar_io_addr;
 	/**< Address of misc bar */
+	void *dev_private;
+	/**< Address per generation */
 };
 
 struct qat_gen_hw_data {
diff --git a/drivers/common/qat/qat_qp.h b/drivers/common/qat/qat_qp.h
index ffba3a3615..4be54de2d9 100644
--- a/drivers/common/qat/qat_qp.h
+++ b/drivers/common/qat/qat_qp.h
@@ -38,15 +38,6 @@ struct qat_qp_hw_data {
 	uint16_t rx_msg_size;
 };
 
-/**
- * Structure with data needed for creation of queue pair on gen4.
- */
-struct qat_qp_gen4_data {
-	struct qat_qp_hw_data qat_qp_hw_data;
-	uint8_t reserved;
-	uint8_t valid;
-};
-
 /**
  * Structure with data needed for creation of queue pair.
  */
diff --git a/drivers/crypto/qat/dev/qat_sym_pmd_gen4.c b/drivers/crypto/qat/dev/qat_sym_pmd_gen4.c
index 834ae88d38..f8f795301c 100644
--- a/drivers/crypto/qat/dev/qat_sym_pmd_gen4.c
+++ b/drivers/crypto/qat/dev/qat_sym_pmd_gen4.c
@@ -7,6 +7,7 @@
 #include "qat_sym_pmd.h"
 #include "qat_sym_session.h"
 #include "qat_sym.h"
+#include "qat_dev_gen4.h"
 
 static struct rte_cryptodev_capabilities qat_gen4_sym_capabilities[] = {
 	QAT_BASE_GEN4_SYM_CAPABILITIES,
@@ -18,9 +19,10 @@ qat_select_valid_queue(struct qat_pci_device *qat_dev, int qp_id,
 			enum qat_service_type service_type)
 {
 	int i = 0, valid_qps = 0;
+	struct qat_dev_gen4_extra *dev_extra = qat_dev->dev_private;
 
 	for (; i < QAT_GEN4_BUNDLE_NUM; i++) {
-		if (qat_dev->qp_gen4_data[i][0].service_type ==
+		if (qat_dev4_get_qp_serv(dev_extra, i) ==
 			service_type) {
 			if (valid_qps == qp_id)
 				return i;
@@ -39,6 +41,7 @@ static int qat_sym_qp_setup_gen4(struct rte_cryptodev *dev, uint16_t qp_id,
 	struct qat_qp_config qat_qp_conf = { };
 	struct qat_sym_dev_private *qat_sym_private = dev->data->dev_private;
 	struct qat_pci_device *qat_dev = qat_sym_private->qat_dev;
+	struct qat_dev_gen4_extra *dev_extra = qat_dev->dev_private;
 
 	ring_pair =
 		qat_select_valid_queue(qat_sym_private->qat_dev, qp_id,
@@ -50,7 +53,7 @@ static int qat_sym_qp_setup_gen4(struct rte_cryptodev *dev, uint16_t qp_id,
 		return -EINVAL;
 	}
 	qat_qp_conf.hw =
-		&qat_dev->qp_gen4_data[ring_pair][0];
+		qat_dev4_get_hw(dev_extra, ring_pair);
 
 	ret = qat_sym_qp_setup(dev, qp_id, qp_conf, qat_qp_conf, socket_id);
 
