* [PATCH 0/8] crypto: qat - add rate limiting (RL) support for GEN6 devices
@ 2025-07-10 13:33 Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 1/8] crypto: qat - validate service in rate limiting sysfs api Suman Kumar Chakraborty
` (8 more replies)
0 siblings, 9 replies; 10+ messages in thread
From: Suman Kumar Chakraborty @ 2025-07-10 13:33 UTC (permalink / raw)
To: herbert; +Cc: linux-crypto, qat-linux
This patch set introduces and extends the rate limiting (RL) infrastructure
in the Intel QAT (QuickAssist Technology) driver, with a focus on enabling
RL support for QAT GEN6 devices and enhancing support for decompression
service.
The series begins by enforcing service validation in the RL sysfs API to
prevent misconfiguration. It then adds decompression (DECOMP) service,
including its enumeration and visibility via sysfs. Subsequently, service
enums are refactored and consolidated to remove duplication and clearly
differentiate between base and extended services.
Further patches improve modularity by relocating is_service_enabled() into
the appropriate C file, introduce a flexible mechanism using
adf_rl_get_num_svc_aes() and get_svc_slice_cnt() APIs, and implement these
for both GEN4 and GEN6 platforms. Additionally, the compression slice count
(cpr_cnt) is now cached for use within the RL infrastructure.
Finally, the series enables full RL support for GEN6 by initializing the
rl_data and implementing platform-specific logic to query acceleration
engines and slice counts for QAT GEN6 hardware.
Summary of Changes:
Patch #1 Validates service in RL sysfs API.
Patch #2 Adds decompression (DECOMP) service to RL to enable SLA support for
DECOMP where supported (e.g., GEN6).
Patch #3 Consolidated the service enums.
Patch #4 Relocates the is_service_enabled() function to improve modularity and
aligns code structure.
Patch #5 Adds adf_rl_get_num_svc_aes() to enable querying number of engines per
service.
Patch #6 Adds get_svc_slice_cnt() to device data to generalizes AE count lookup.
Patch #7 Adds compression slice count tracking.
Patch #8 Enables RL for GEN6.
Suman Kumar Chakraborty (8):
crypto: qat - validate service in rate limiting sysfs api
crypto: qat - add decompression service for rate limiting
crypto: qat - consolidate service enums
crypto: qat - relocate service related functions
crypto: qat - add adf_rl_get_num_svc_aes() in rate limiting
crypto: qat - add get_svc_slice_cnt() in device data structure
crypto: qat - add compression slice count for rate limiting
crypto: qat - enable rate limiting feature for GEN6 devices
Documentation/ABI/testing/sysfs-driver-qat_rl | 14 +--
.../intel/qat/qat_420xx/adf_420xx_hw_data.c | 9 +-
.../intel/qat/qat_4xxx/adf_4xxx_hw_data.c | 9 +-
.../intel/qat/qat_6xxx/adf_6xxx_hw_data.c | 77 ++++++++++++++++-
.../intel/qat/qat_6xxx/adf_6xxx_hw_data.h | 20 +++++
.../intel/qat/qat_common/adf_accel_devices.h | 2 +
.../intel/qat/qat_common/adf_cfg_services.c | 40 ++++++++-
.../intel/qat/qat_common/adf_cfg_services.h | 12 ++-
.../intel/qat/qat_common/adf_gen4_hw_data.c | 42 ++++++++-
.../intel/qat/qat_common/adf_gen4_hw_data.h | 3 +
drivers/crypto/intel/qat/qat_common/adf_rl.c | 86 ++++++-------------
drivers/crypto/intel/qat/qat_common/adf_rl.h | 11 +--
.../intel/qat/qat_common/adf_rl_admin.c | 1 +
.../intel/qat/qat_common/adf_sysfs_rl.c | 21 +++--
14 files changed, 251 insertions(+), 96 deletions(-)
base-commit: db689623436f9f8b87c434285a4bdbf54b0f86d2
--
2.40.1
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/8] crypto: qat - validate service in rate limiting sysfs api
2025-07-10 13:33 [PATCH 0/8] crypto: qat - add rate limiting (RL) support for GEN6 devices Suman Kumar Chakraborty
@ 2025-07-10 13:33 ` Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 2/8] crypto: qat - add decompression service for rate limiting Suman Kumar Chakraborty
` (7 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Suman Kumar Chakraborty @ 2025-07-10 13:33 UTC (permalink / raw)
To: herbert; +Cc: linux-crypto, qat-linux
The sysfs interface 'qat_rl/srv' currently allows all valid services,
even if a service is not configured for the device. This leads to a failure
when attempting to add the SLA using 'qat_rl/sla_op'.
Add a check using is_service_enabled() to ensure the requested service is
enabled. If not, return -EINVAL to prevent invalid configurations.
Signed-off-by: Suman Kumar Chakraborty <suman.kumar.chakraborty@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
---
drivers/crypto/intel/qat/qat_common/adf_rl.c | 3 +--
drivers/crypto/intel/qat/qat_common/adf_rl.h | 1 +
drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c | 8 ++++++++
3 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/drivers/crypto/intel/qat/qat_common/adf_rl.c b/drivers/crypto/intel/qat/qat_common/adf_rl.c
index e782c23fc1bf..d320bfcb9919 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_rl.c
+++ b/drivers/crypto/intel/qat/qat_common/adf_rl.c
@@ -209,8 +209,7 @@ u32 adf_rl_get_sla_arr_of_type(struct adf_rl *rl_data, enum rl_node_type type,
}
}
-static bool is_service_enabled(struct adf_accel_dev *accel_dev,
- enum adf_base_services rl_srv)
+bool is_service_enabled(struct adf_accel_dev *accel_dev, enum adf_base_services rl_srv)
{
enum adf_cfg_service_type arb_srv = srv_to_cfg_svc_type(rl_srv);
struct adf_hw_device_data *hw_data = GET_HW_DATA(accel_dev);
diff --git a/drivers/crypto/intel/qat/qat_common/adf_rl.h b/drivers/crypto/intel/qat/qat_common/adf_rl.h
index bfe750ea0e83..9b4678cee1fd 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_rl.h
+++ b/drivers/crypto/intel/qat/qat_common/adf_rl.h
@@ -175,5 +175,6 @@ u32 adf_rl_calculate_ae_cycles(struct adf_accel_dev *accel_dev, u32 sla_val,
enum adf_base_services svc_type);
u32 adf_rl_calculate_slice_tokens(struct adf_accel_dev *accel_dev, u32 sla_val,
enum adf_base_services svc_type);
+bool is_service_enabled(struct adf_accel_dev *accel_dev, enum adf_base_services rl_srv);
#endif /* ADF_RL_H_ */
diff --git a/drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c b/drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c
index bedb514d4e30..a8c3be24b3b4 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c
+++ b/drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c
@@ -291,14 +291,22 @@ static ssize_t srv_show(struct device *dev, struct device_attribute *attr,
static ssize_t srv_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{
+ struct adf_accel_dev *accel_dev;
unsigned int val;
int ret;
+ accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
+ if (!accel_dev)
+ return -EINVAL;
+
ret = sysfs_match_string(rl_services, buf);
if (ret < 0)
return ret;
val = ret;
+ if (!is_service_enabled(accel_dev, val))
+ return -EINVAL;
+
ret = set_param_u(dev, SRV, val);
if (ret)
return ret;
--
2.40.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/8] crypto: qat - add decompression service for rate limiting
2025-07-10 13:33 [PATCH 0/8] crypto: qat - add rate limiting (RL) support for GEN6 devices Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 1/8] crypto: qat - validate service in rate limiting sysfs api Suman Kumar Chakraborty
@ 2025-07-10 13:33 ` Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 3/8] crypto: qat - consolidate service enums Suman Kumar Chakraborty
` (6 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Suman Kumar Chakraborty @ 2025-07-10 13:33 UTC (permalink / raw)
To: herbert; +Cc: linux-crypto, qat-linux
Add a new base service type ADF_SVC_DECOMP to the QAT rate limiting (RL)
infrastructure. This enables RL support for the decompression (DECOMP)
service type, allowing service-level agreements (SLAs) to be enforced
when decompression is configured.
The new service is exposed in the sysfs RL service list for visibility.
Note that this support is applicable only to devices that provide the
decompression service, such as QAT GEN6 devices.
Signed-off-by: Suman Kumar Chakraborty <suman.kumar.chakraborty@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
---
drivers/crypto/intel/qat/qat_common/adf_rl.c | 2 ++
drivers/crypto/intel/qat/qat_common/adf_rl.h | 1 +
drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c | 1 +
3 files changed, 4 insertions(+)
diff --git a/drivers/crypto/intel/qat/qat_common/adf_rl.c b/drivers/crypto/intel/qat/qat_common/adf_rl.c
index d320bfcb9919..03c394d8c066 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_rl.c
+++ b/drivers/crypto/intel/qat/qat_common/adf_rl.c
@@ -177,6 +177,8 @@ static enum adf_cfg_service_type srv_to_cfg_svc_type(enum adf_base_services rl_s
return SYM;
case ADF_SVC_DC:
return COMP;
+ case ADF_SVC_DECOMP:
+ return DECOMP;
default:
return UNUSED;
}
diff --git a/drivers/crypto/intel/qat/qat_common/adf_rl.h b/drivers/crypto/intel/qat/qat_common/adf_rl.h
index 9b4678cee1fd..62cc47d1218a 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_rl.h
+++ b/drivers/crypto/intel/qat/qat_common/adf_rl.h
@@ -28,6 +28,7 @@ enum adf_base_services {
ADF_SVC_ASYM = 0,
ADF_SVC_SYM,
ADF_SVC_DC,
+ ADF_SVC_DECOMP,
ADF_SVC_NONE,
};
diff --git a/drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c b/drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c
index a8c3be24b3b4..43df32df0dc5 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c
+++ b/drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c
@@ -35,6 +35,7 @@ static const char *const rl_services[] = {
[ADF_SVC_ASYM] = "asym",
[ADF_SVC_SYM] = "sym",
[ADF_SVC_DC] = "dc",
+ [ADF_SVC_DECOMP] = "decomp",
};
static const char *const rl_operations[] = {
--
2.40.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/8] crypto: qat - consolidate service enums
2025-07-10 13:33 [PATCH 0/8] crypto: qat - add rate limiting (RL) support for GEN6 devices Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 1/8] crypto: qat - validate service in rate limiting sysfs api Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 2/8] crypto: qat - add decompression service for rate limiting Suman Kumar Chakraborty
@ 2025-07-10 13:33 ` Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 4/8] crypto: qat - relocate service related functions Suman Kumar Chakraborty
` (5 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Suman Kumar Chakraborty @ 2025-07-10 13:33 UTC (permalink / raw)
To: herbert; +Cc: linux-crypto, qat-linux
The enums `adf_base_services` (used in rate limiting) and `adf_services`
define the same values, resulting in code duplication.
To improve consistency across the QAT driver: (1) rename `adf_services`
to `adf_base_services` in adf_cfg_services.c to better reflect its role
in defining core services (those with dedicated accelerators),
(2) introduce a new `adf_extended_services` enum starting from
`SVC_BASE_COUNT`, and move `SVC_DCC` into it, as it represents an
extended service (DC with chaining), and (3) remove the redundant
`adf_base_services` enum from the rate limiting implementation.
This does not introduce any functional change.
Signed-off-by: Suman Kumar Chakraborty <suman.kumar.chakraborty@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
---
.../intel/qat/qat_420xx/adf_420xx_hw_data.c | 6 ++--
.../intel/qat/qat_4xxx/adf_4xxx_hw_data.c | 6 ++--
.../intel/qat/qat_6xxx/adf_6xxx_hw_data.c | 6 ++--
.../intel/qat/qat_common/adf_cfg_services.c | 8 ++---
.../intel/qat/qat_common/adf_cfg_services.h | 10 ++++--
.../intel/qat/qat_common/adf_gen4_hw_data.c | 2 +-
drivers/crypto/intel/qat/qat_common/adf_rl.c | 35 +++++++++----------
drivers/crypto/intel/qat/qat_common/adf_rl.h | 10 ++----
.../intel/qat/qat_common/adf_sysfs_rl.c | 14 ++++----
9 files changed, 47 insertions(+), 50 deletions(-)
diff --git a/drivers/crypto/intel/qat/qat_420xx/adf_420xx_hw_data.c b/drivers/crypto/intel/qat/qat_420xx/adf_420xx_hw_data.c
index 8340b5e8a947..32bb9e1826d2 100644
--- a/drivers/crypto/intel/qat/qat_420xx/adf_420xx_hw_data.c
+++ b/drivers/crypto/intel/qat/qat_420xx/adf_420xx_hw_data.c
@@ -296,9 +296,9 @@ static void adf_init_rl_data(struct adf_rl_hw_data *rl_data)
rl_data->pcie_scale_div = ADF_420XX_RL_PCIE_SCALE_FACTOR_DIV;
rl_data->pcie_scale_mul = ADF_420XX_RL_PCIE_SCALE_FACTOR_MUL;
rl_data->dcpr_correction = ADF_420XX_RL_DCPR_CORRECTION;
- rl_data->max_tp[ADF_SVC_ASYM] = ADF_420XX_RL_MAX_TP_ASYM;
- rl_data->max_tp[ADF_SVC_SYM] = ADF_420XX_RL_MAX_TP_SYM;
- rl_data->max_tp[ADF_SVC_DC] = ADF_420XX_RL_MAX_TP_DC;
+ rl_data->max_tp[SVC_ASYM] = ADF_420XX_RL_MAX_TP_ASYM;
+ rl_data->max_tp[SVC_SYM] = ADF_420XX_RL_MAX_TP_SYM;
+ rl_data->max_tp[SVC_DC] = ADF_420XX_RL_MAX_TP_DC;
rl_data->scan_interval = ADF_420XX_RL_SCANS_PER_SEC;
rl_data->scale_ref = ADF_420XX_RL_SLICE_REF;
}
diff --git a/drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c b/drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c
index 4d4889533558..f917cc9db09d 100644
--- a/drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c
+++ b/drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c
@@ -222,9 +222,9 @@ static void adf_init_rl_data(struct adf_rl_hw_data *rl_data)
rl_data->pcie_scale_div = ADF_4XXX_RL_PCIE_SCALE_FACTOR_DIV;
rl_data->pcie_scale_mul = ADF_4XXX_RL_PCIE_SCALE_FACTOR_MUL;
rl_data->dcpr_correction = ADF_4XXX_RL_DCPR_CORRECTION;
- rl_data->max_tp[ADF_SVC_ASYM] = ADF_4XXX_RL_MAX_TP_ASYM;
- rl_data->max_tp[ADF_SVC_SYM] = ADF_4XXX_RL_MAX_TP_SYM;
- rl_data->max_tp[ADF_SVC_DC] = ADF_4XXX_RL_MAX_TP_DC;
+ rl_data->max_tp[SVC_ASYM] = ADF_4XXX_RL_MAX_TP_ASYM;
+ rl_data->max_tp[SVC_SYM] = ADF_4XXX_RL_MAX_TP_SYM;
+ rl_data->max_tp[SVC_DC] = ADF_4XXX_RL_MAX_TP_DC;
rl_data->scan_interval = ADF_4XXX_RL_SCANS_PER_SEC;
rl_data->scale_ref = ADF_4XXX_RL_SLICE_REF;
}
diff --git a/drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.c b/drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.c
index d3f1034f33fb..28b7a7649bb6 100644
--- a/drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.c
+++ b/drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.c
@@ -103,7 +103,7 @@ static bool services_supported(unsigned long mask)
{
int num_svc;
- if (mask >= BIT(SVC_BASE_COUNT))
+ if (mask >= BIT(SVC_COUNT))
return false;
num_svc = hweight_long(mask);
@@ -138,7 +138,7 @@ static int get_service(unsigned long *mask)
return -EINVAL;
}
-static enum adf_cfg_service_type get_ring_type(enum adf_services service)
+static enum adf_cfg_service_type get_ring_type(unsigned int service)
{
switch (service) {
case SVC_SYM:
@@ -155,7 +155,7 @@ static enum adf_cfg_service_type get_ring_type(enum adf_services service)
}
}
-static const unsigned long *get_thrd_mask(enum adf_services service)
+static const unsigned long *get_thrd_mask(unsigned int service)
{
switch (service) {
case SVC_SYM:
diff --git a/drivers/crypto/intel/qat/qat_common/adf_cfg_services.c b/drivers/crypto/intel/qat/qat_common/adf_cfg_services.c
index f49227b10064..ab3cbce32dc4 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_cfg_services.c
+++ b/drivers/crypto/intel/qat/qat_common/adf_cfg_services.c
@@ -20,9 +20,9 @@ static const char *const adf_cfg_services[] = {
/*
* Ensure that the size of the array matches the number of services,
- * SVC_BASE_COUNT, that is used to size the bitmap.
+ * SVC_COUNT, that is used to size the bitmap.
*/
-static_assert(ARRAY_SIZE(adf_cfg_services) == SVC_BASE_COUNT);
+static_assert(ARRAY_SIZE(adf_cfg_services) == SVC_COUNT);
/*
* Ensure that the maximum number of concurrent services that can be
@@ -35,7 +35,7 @@ static_assert(ARRAY_SIZE(adf_cfg_services) >= MAX_NUM_CONCURR_SVC);
* Ensure that the number of services fit a single unsigned long, as each
* service is represented by a bit in the mask.
*/
-static_assert(BITS_PER_LONG >= SVC_BASE_COUNT);
+static_assert(BITS_PER_LONG >= SVC_COUNT);
/*
* Ensure that size of the concatenation of all service strings is smaller
@@ -90,7 +90,7 @@ static int adf_service_mask_to_string(unsigned long mask, char *buf, size_t len)
if (len < ADF_CFG_MAX_VAL_LEN_IN_BYTES)
return -ENOSPC;
- for_each_set_bit(bit, &mask, SVC_BASE_COUNT) {
+ for_each_set_bit(bit, &mask, SVC_COUNT) {
if (offset)
offset += scnprintf(buf + offset, len - offset,
ADF_SERVICES_DELIMITER);
diff --git a/drivers/crypto/intel/qat/qat_common/adf_cfg_services.h b/drivers/crypto/intel/qat/qat_common/adf_cfg_services.h
index 8709b7a52907..b2dd62eabf26 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_cfg_services.h
+++ b/drivers/crypto/intel/qat/qat_common/adf_cfg_services.h
@@ -7,17 +7,21 @@
struct adf_accel_dev;
-enum adf_services {
+enum adf_base_services {
SVC_ASYM = 0,
SVC_SYM,
SVC_DC,
SVC_DECOMP,
- SVC_DCC,
SVC_BASE_COUNT
};
+enum adf_extended_services {
+ SVC_DCC = SVC_BASE_COUNT,
+ SVC_COUNT
+};
+
enum adf_composed_services {
- SVC_SYM_ASYM = SVC_BASE_COUNT,
+ SVC_SYM_ASYM = SVC_COUNT,
SVC_SYM_DC,
SVC_ASYM_DC,
};
diff --git a/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.c b/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.c
index 0dbf9cc2a858..3103755e416e 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.c
+++ b/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.c
@@ -262,7 +262,7 @@ bool adf_gen4_services_supported(unsigned long mask)
{
unsigned long num_svc = hweight_long(mask);
- if (mask >= BIT(SVC_BASE_COUNT))
+ if (mask >= BIT(SVC_COUNT))
return false;
if (test_bit(SVC_DECOMP, &mask))
diff --git a/drivers/crypto/intel/qat/qat_common/adf_rl.c b/drivers/crypto/intel/qat/qat_common/adf_rl.c
index 03c394d8c066..0d5f59bfa6a2 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_rl.c
+++ b/drivers/crypto/intel/qat/qat_common/adf_rl.c
@@ -13,6 +13,7 @@
#include <linux/units.h>
#include "adf_accel_devices.h"
+#include "adf_cfg_services.h"
#include "adf_common_drv.h"
#include "adf_rl_admin.h"
#include "adf_rl.h"
@@ -55,7 +56,7 @@ static int validate_user_input(struct adf_accel_dev *accel_dev,
}
}
- if (sla_in->srv >= ADF_SVC_NONE) {
+ if (sla_in->srv >= SVC_BASE_COUNT) {
dev_notice(&GET_DEV(accel_dev),
"Wrong service type\n");
return -EINVAL;
@@ -171,13 +172,13 @@ static struct rl_sla *find_parent(struct adf_rl *rl_data,
static enum adf_cfg_service_type srv_to_cfg_svc_type(enum adf_base_services rl_srv)
{
switch (rl_srv) {
- case ADF_SVC_ASYM:
+ case SVC_ASYM:
return ASYM;
- case ADF_SVC_SYM:
+ case SVC_SYM:
return SYM;
- case ADF_SVC_DC:
+ case SVC_DC:
return COMP;
- case ADF_SVC_DECOMP:
+ case SVC_DECOMP:
return DECOMP;
default:
return UNUSED;
@@ -562,13 +563,13 @@ u32 adf_rl_calculate_slice_tokens(struct adf_accel_dev *accel_dev, u32 sla_val,
avail_slice_cycles = hw_data->clock_frequency;
switch (svc_type) {
- case ADF_SVC_ASYM:
+ case SVC_ASYM:
avail_slice_cycles *= device_data->slices.pke_cnt;
break;
- case ADF_SVC_SYM:
+ case SVC_SYM:
avail_slice_cycles *= device_data->slices.cph_cnt;
break;
- case ADF_SVC_DC:
+ case SVC_DC:
avail_slice_cycles *= device_data->slices.dcpr_cnt;
break;
default:
@@ -618,9 +619,8 @@ u32 adf_rl_calculate_pci_bw(struct adf_accel_dev *accel_dev, u32 sla_val,
sla_to_bytes *= device_data->max_tp[svc_type];
do_div(sla_to_bytes, device_data->scale_ref);
- sla_to_bytes *= (svc_type == ADF_SVC_ASYM) ? RL_TOKEN_ASYM_SIZE :
- BYTES_PER_MBIT;
- if (svc_type == ADF_SVC_DC && is_bw_out)
+ sla_to_bytes *= (svc_type == SVC_ASYM) ? RL_TOKEN_ASYM_SIZE : BYTES_PER_MBIT;
+ if (svc_type == SVC_DC && is_bw_out)
sla_to_bytes *= device_data->slices.dcpr_cnt -
device_data->dcpr_correction;
@@ -731,7 +731,7 @@ static int initialize_default_nodes(struct adf_accel_dev *accel_dev)
sla_in.type = RL_ROOT;
sla_in.parent_id = RL_PARENT_DEFAULT_ID;
- for (i = 0; i < ADF_SVC_NONE; i++) {
+ for (i = 0; i < SVC_BASE_COUNT; i++) {
if (!is_service_enabled(accel_dev, i))
continue;
@@ -746,10 +746,9 @@ static int initialize_default_nodes(struct adf_accel_dev *accel_dev)
/* Init default cluster for each root */
sla_in.type = RL_CLUSTER;
- for (i = 0; i < ADF_SVC_NONE; i++) {
+ for (i = 0; i < SVC_BASE_COUNT; i++) {
if (!rl_data->root[i])
continue;
-
sla_in.cir = rl_data->root[i]->cir;
sla_in.pir = sla_in.cir;
sla_in.srv = rl_data->root[i]->srv;
@@ -988,7 +987,7 @@ int adf_rl_get_capability_remaining(struct adf_accel_dev *accel_dev,
struct rl_sla *sla = NULL;
int i;
- if (srv >= ADF_SVC_NONE)
+ if (srv >= SVC_BASE_COUNT)
return -EINVAL;
if (sla_id > RL_SLA_EMPTY_ID && !validate_sla_id(accel_dev, sla_id)) {
@@ -1087,9 +1086,9 @@ int adf_rl_init(struct adf_accel_dev *accel_dev)
int ret = 0;
/* Validate device parameters */
- if (RL_VALIDATE_NON_ZERO(rl_hw_data->max_tp[ADF_SVC_ASYM]) ||
- RL_VALIDATE_NON_ZERO(rl_hw_data->max_tp[ADF_SVC_SYM]) ||
- RL_VALIDATE_NON_ZERO(rl_hw_data->max_tp[ADF_SVC_DC]) ||
+ if (RL_VALIDATE_NON_ZERO(rl_hw_data->max_tp[SVC_ASYM]) ||
+ RL_VALIDATE_NON_ZERO(rl_hw_data->max_tp[SVC_SYM]) ||
+ RL_VALIDATE_NON_ZERO(rl_hw_data->max_tp[SVC_DC]) ||
RL_VALIDATE_NON_ZERO(rl_hw_data->scan_interval) ||
RL_VALIDATE_NON_ZERO(rl_hw_data->pcie_scale_div) ||
RL_VALIDATE_NON_ZERO(rl_hw_data->pcie_scale_mul) ||
diff --git a/drivers/crypto/intel/qat/qat_common/adf_rl.h b/drivers/crypto/intel/qat/qat_common/adf_rl.h
index 62cc47d1218a..f2393bdb8ccc 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_rl.h
+++ b/drivers/crypto/intel/qat/qat_common/adf_rl.h
@@ -7,6 +7,8 @@
#include <linux/mutex.h>
#include <linux/types.h>
+#include "adf_cfg_services.h"
+
struct adf_accel_dev;
#define RL_ROOT_MAX 4
@@ -24,14 +26,6 @@ enum rl_node_type {
RL_LEAF,
};
-enum adf_base_services {
- ADF_SVC_ASYM = 0,
- ADF_SVC_SYM,
- ADF_SVC_DC,
- ADF_SVC_DECOMP,
- ADF_SVC_NONE,
-};
-
/**
* struct adf_rl_sla_input_data - ratelimiting user input data structure
* @rp_mask: 64 bit bitmask of ring pair IDs which will be assigned to SLA.
diff --git a/drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c b/drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c
index 43df32df0dc5..9d439df6d9ad 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c
+++ b/drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c
@@ -32,10 +32,10 @@ enum rl_params {
};
static const char *const rl_services[] = {
- [ADF_SVC_ASYM] = "asym",
- [ADF_SVC_SYM] = "sym",
- [ADF_SVC_DC] = "dc",
- [ADF_SVC_DECOMP] = "decomp",
+ [SVC_ASYM] = "asym",
+ [SVC_SYM] = "sym",
+ [SVC_DC] = "dc",
+ [SVC_DECOMP] = "decomp",
};
static const char *const rl_operations[] = {
@@ -283,7 +283,7 @@ static ssize_t srv_show(struct device *dev, struct device_attribute *attr,
if (ret)
return ret;
- if (get == ADF_SVC_NONE)
+ if (get == SVC_BASE_COUNT)
return -EINVAL;
return sysfs_emit(buf, "%s\n", rl_services[get]);
@@ -448,8 +448,8 @@ int adf_sysfs_rl_add(struct adf_accel_dev *accel_dev)
dev_err(&GET_DEV(accel_dev),
"Failed to create qat_rl attribute group\n");
- data->cap_rem_srv = ADF_SVC_NONE;
- data->input.srv = ADF_SVC_NONE;
+ data->cap_rem_srv = SVC_BASE_COUNT;
+ data->input.srv = SVC_BASE_COUNT;
data->sysfs_added = true;
return ret;
--
2.40.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 4/8] crypto: qat - relocate service related functions
2025-07-10 13:33 [PATCH 0/8] crypto: qat - add rate limiting (RL) support for GEN6 devices Suman Kumar Chakraborty
` (2 preceding siblings ...)
2025-07-10 13:33 ` [PATCH 3/8] crypto: qat - consolidate service enums Suman Kumar Chakraborty
@ 2025-07-10 13:33 ` Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 5/8] crypto: qat - add adf_rl_get_num_svc_aes() in rate limiting Suman Kumar Chakraborty
` (4 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Suman Kumar Chakraborty @ 2025-07-10 13:33 UTC (permalink / raw)
To: herbert; +Cc: linux-crypto, qat-linux
Rename (1) is_service_enabled() to adf_is_service_enabled(), and
(2) srv_to_cfg_svc_type() to adf_srv_to_cfg_svc_type(), and move them to
adf_cfg_services.c which is the appropriate place for configuration-related
service logic. This improves code organization and modularity by grouping
related service configuration logic in a single location.
Signed-off-by: Suman Kumar Chakraborty <suman.kumar.chakraborty@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
---
.../intel/qat/qat_common/adf_cfg_services.c | 32 ++++++++++++++++
.../intel/qat/qat_common/adf_cfg_services.h | 2 +
drivers/crypto/intel/qat/qat_common/adf_rl.c | 37 ++-----------------
drivers/crypto/intel/qat/qat_common/adf_rl.h | 1 -
.../intel/qat/qat_common/adf_sysfs_rl.c | 2 +-
5 files changed, 38 insertions(+), 36 deletions(-)
diff --git a/drivers/crypto/intel/qat/qat_common/adf_cfg_services.c b/drivers/crypto/intel/qat/qat_common/adf_cfg_services.c
index ab3cbce32dc4..7d00bcb41ce7 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_cfg_services.c
+++ b/drivers/crypto/intel/qat/qat_common/adf_cfg_services.c
@@ -7,6 +7,7 @@
#include <linux/pci.h>
#include <linux/string.h>
#include "adf_cfg.h"
+#include "adf_cfg_common.h"
#include "adf_cfg_services.h"
#include "adf_cfg_strings.h"
@@ -178,3 +179,34 @@ int adf_get_service_enabled(struct adf_accel_dev *accel_dev)
return -EINVAL;
}
EXPORT_SYMBOL_GPL(adf_get_service_enabled);
+
+enum adf_cfg_service_type adf_srv_to_cfg_svc_type(enum adf_base_services svc)
+{
+ switch (svc) {
+ case SVC_ASYM:
+ return ASYM;
+ case SVC_SYM:
+ return SYM;
+ case SVC_DC:
+ return COMP;
+ case SVC_DECOMP:
+ return DECOMP;
+ default:
+ return UNUSED;
+ }
+}
+
+bool adf_is_service_enabled(struct adf_accel_dev *accel_dev, enum adf_base_services svc)
+{
+ enum adf_cfg_service_type arb_srv = adf_srv_to_cfg_svc_type(svc);
+ struct adf_hw_device_data *hw_data = GET_HW_DATA(accel_dev);
+ u8 rps_per_bundle = hw_data->num_banks_per_vf;
+ int i;
+
+ for (i = 0; i < rps_per_bundle; i++) {
+ if (GET_SRV_TYPE(accel_dev, i) == arb_srv)
+ return true;
+ }
+
+ return false;
+}
diff --git a/drivers/crypto/intel/qat/qat_common/adf_cfg_services.h b/drivers/crypto/intel/qat/qat_common/adf_cfg_services.h
index b2dd62eabf26..913d717280af 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_cfg_services.h
+++ b/drivers/crypto/intel/qat/qat_common/adf_cfg_services.h
@@ -38,5 +38,7 @@ int adf_parse_service_string(struct adf_accel_dev *accel_dev, const char *in,
size_t in_len, char *out, size_t out_len);
int adf_get_service_enabled(struct adf_accel_dev *accel_dev);
int adf_get_service_mask(struct adf_accel_dev *accel_dev, unsigned long *mask);
+enum adf_cfg_service_type adf_srv_to_cfg_svc_type(enum adf_base_services svc);
+bool adf_is_service_enabled(struct adf_accel_dev *accel_dev, enum adf_base_services svc);
#endif
diff --git a/drivers/crypto/intel/qat/qat_common/adf_rl.c b/drivers/crypto/intel/qat/qat_common/adf_rl.c
index 0d5f59bfa6a2..926975539740 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_rl.c
+++ b/drivers/crypto/intel/qat/qat_common/adf_rl.c
@@ -169,22 +169,6 @@ static struct rl_sla *find_parent(struct adf_rl *rl_data,
return NULL;
}
-static enum adf_cfg_service_type srv_to_cfg_svc_type(enum adf_base_services rl_srv)
-{
- switch (rl_srv) {
- case SVC_ASYM:
- return ASYM;
- case SVC_SYM:
- return SYM;
- case SVC_DC:
- return COMP;
- case SVC_DECOMP:
- return DECOMP;
- default:
- return UNUSED;
- }
-}
-
/**
* adf_rl_get_sla_arr_of_type() - Returns a pointer to SLA type specific array
* @rl_data: pointer to ratelimiting data
@@ -212,21 +196,6 @@ u32 adf_rl_get_sla_arr_of_type(struct adf_rl *rl_data, enum rl_node_type type,
}
}
-bool is_service_enabled(struct adf_accel_dev *accel_dev, enum adf_base_services rl_srv)
-{
- enum adf_cfg_service_type arb_srv = srv_to_cfg_svc_type(rl_srv);
- struct adf_hw_device_data *hw_data = GET_HW_DATA(accel_dev);
- u8 rps_per_bundle = hw_data->num_banks_per_vf;
- int i;
-
- for (i = 0; i < rps_per_bundle; i++) {
- if (GET_SRV_TYPE(accel_dev, i) == arb_srv)
- return true;
- }
-
- return false;
-}
-
/**
* prepare_rp_ids() - Creates an array of ring pair IDs from bitmask
* @accel_dev: pointer to acceleration device structure
@@ -245,7 +214,7 @@ bool is_service_enabled(struct adf_accel_dev *accel_dev, enum adf_base_services
static int prepare_rp_ids(struct adf_accel_dev *accel_dev, struct rl_sla *sla,
const unsigned long rp_mask)
{
- enum adf_cfg_service_type arb_srv = srv_to_cfg_svc_type(sla->srv);
+ enum adf_cfg_service_type arb_srv = adf_srv_to_cfg_svc_type(sla->srv);
u16 rps_per_bundle = GET_HW_DATA(accel_dev)->num_banks_per_vf;
bool *rp_in_use = accel_dev->rate_limiting->rp_in_use;
size_t rp_cnt_max = ARRAY_SIZE(sla->ring_pairs_ids);
@@ -661,7 +630,7 @@ static int add_new_sla_entry(struct adf_accel_dev *accel_dev,
}
*sla_out = sla;
- if (!is_service_enabled(accel_dev, sla_in->srv)) {
+ if (!adf_is_service_enabled(accel_dev, sla_in->srv)) {
dev_notice(&GET_DEV(accel_dev),
"Provided service is not enabled\n");
ret = -EINVAL;
@@ -732,7 +701,7 @@ static int initialize_default_nodes(struct adf_accel_dev *accel_dev)
sla_in.parent_id = RL_PARENT_DEFAULT_ID;
for (i = 0; i < SVC_BASE_COUNT; i++) {
- if (!is_service_enabled(accel_dev, i))
+ if (!adf_is_service_enabled(accel_dev, i))
continue;
sla_in.cir = device_data->scale_ref;
diff --git a/drivers/crypto/intel/qat/qat_common/adf_rl.h b/drivers/crypto/intel/qat/qat_common/adf_rl.h
index f2393bdb8ccc..dee7f0c81906 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_rl.h
+++ b/drivers/crypto/intel/qat/qat_common/adf_rl.h
@@ -170,6 +170,5 @@ u32 adf_rl_calculate_ae_cycles(struct adf_accel_dev *accel_dev, u32 sla_val,
enum adf_base_services svc_type);
u32 adf_rl_calculate_slice_tokens(struct adf_accel_dev *accel_dev, u32 sla_val,
enum adf_base_services svc_type);
-bool is_service_enabled(struct adf_accel_dev *accel_dev, enum adf_base_services rl_srv);
#endif /* ADF_RL_H_ */
diff --git a/drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c b/drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c
index 9d439df6d9ad..f31556beed8b 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c
+++ b/drivers/crypto/intel/qat/qat_common/adf_sysfs_rl.c
@@ -305,7 +305,7 @@ static ssize_t srv_store(struct device *dev, struct device_attribute *attr,
return ret;
val = ret;
- if (!is_service_enabled(accel_dev, val))
+ if (!adf_is_service_enabled(accel_dev, val))
return -EINVAL;
ret = set_param_u(dev, SRV, val);
--
2.40.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 5/8] crypto: qat - add adf_rl_get_num_svc_aes() in rate limiting
2025-07-10 13:33 [PATCH 0/8] crypto: qat - add rate limiting (RL) support for GEN6 devices Suman Kumar Chakraborty
` (3 preceding siblings ...)
2025-07-10 13:33 ` [PATCH 4/8] crypto: qat - relocate service related functions Suman Kumar Chakraborty
@ 2025-07-10 13:33 ` Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 6/8] crypto: qat - add get_svc_slice_cnt() in device data structure Suman Kumar Chakraborty
` (3 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Suman Kumar Chakraborty @ 2025-07-10 13:33 UTC (permalink / raw)
To: herbert; +Cc: linux-crypto, qat-linux
Enhance the rate limiting (RL) infrastructure by adding
adf_rl_get_num_svc_aes() which can be used to fetch the number of engines
associated with the service type. Expand the structure adf_rl_hw_data
with an array that contains the number of AEs per service.
Implement adf_gen4_init_num_svc_aes() for QAT GEN4 devices to calculate
the total number of acceleration engines dedicated to a specific service.
Signed-off-by: Suman Kumar Chakraborty <suman.kumar.chakraborty@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
---
.../intel/qat/qat_420xx/adf_420xx_hw_data.c | 2 ++
.../intel/qat/qat_4xxx/adf_4xxx_hw_data.c | 2 ++
.../intel/qat/qat_common/adf_gen4_hw_data.c | 22 +++++++++++++++++++
.../intel/qat/qat_common/adf_gen4_hw_data.h | 1 +
drivers/crypto/intel/qat/qat_common/adf_rl.c | 13 ++++++++++-
drivers/crypto/intel/qat/qat_common/adf_rl.h | 1 +
6 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/drivers/crypto/intel/qat/qat_420xx/adf_420xx_hw_data.c b/drivers/crypto/intel/qat/qat_420xx/adf_420xx_hw_data.c
index 32bb9e1826d2..67a1c1d8e23e 100644
--- a/drivers/crypto/intel/qat/qat_420xx/adf_420xx_hw_data.c
+++ b/drivers/crypto/intel/qat/qat_420xx/adf_420xx_hw_data.c
@@ -301,6 +301,8 @@ static void adf_init_rl_data(struct adf_rl_hw_data *rl_data)
rl_data->max_tp[SVC_DC] = ADF_420XX_RL_MAX_TP_DC;
rl_data->scan_interval = ADF_420XX_RL_SCANS_PER_SEC;
rl_data->scale_ref = ADF_420XX_RL_SLICE_REF;
+
+ adf_gen4_init_num_svc_aes(rl_data);
}
static int get_rp_group(struct adf_accel_dev *accel_dev, u32 ae_mask)
diff --git a/drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c b/drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c
index f917cc9db09d..9b728dba048b 100644
--- a/drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c
+++ b/drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c
@@ -227,6 +227,8 @@ static void adf_init_rl_data(struct adf_rl_hw_data *rl_data)
rl_data->max_tp[SVC_DC] = ADF_4XXX_RL_MAX_TP_DC;
rl_data->scan_interval = ADF_4XXX_RL_SCANS_PER_SEC;
rl_data->scale_ref = ADF_4XXX_RL_SLICE_REF;
+
+ adf_gen4_init_num_svc_aes(rl_data);
}
static u32 uof_get_num_objs(struct adf_accel_dev *accel_dev)
diff --git a/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.c b/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.c
index 3103755e416e..5e4b45c3fabe 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.c
+++ b/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.c
@@ -558,3 +558,25 @@ void adf_gen4_init_dc_ops(struct adf_dc_ops *dc_ops)
dc_ops->build_decomp_block = adf_gen4_build_decomp_block;
}
EXPORT_SYMBOL_GPL(adf_gen4_init_dc_ops);
+
+void adf_gen4_init_num_svc_aes(struct adf_rl_hw_data *device_data)
+{
+ struct adf_hw_device_data *hw_data;
+ unsigned int i;
+ u32 ae_cnt;
+
+ hw_data = container_of(device_data, struct adf_hw_device_data, rl_data);
+ ae_cnt = hweight32(hw_data->get_ae_mask(hw_data));
+ if (!ae_cnt)
+ return;
+
+ for (i = 0; i < SVC_BASE_COUNT; i++)
+ device_data->svc_ae_mask[i] = ae_cnt - 1;
+
+ /*
+ * The decompression service is not supported on QAT GEN4 devices.
+ * Therefore, set svc_ae_mask to 0.
+ */
+ device_data->svc_ae_mask[SVC_DECOMP] = 0;
+}
+EXPORT_SYMBOL_GPL(adf_gen4_init_num_svc_aes);
diff --git a/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.h b/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.h
index 7f2b9cb0fe60..7fa203071c01 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.h
+++ b/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.h
@@ -175,5 +175,6 @@ void adf_gen4_bank_drain_finish(struct adf_accel_dev *accel_dev,
u32 bank_number);
bool adf_gen4_services_supported(unsigned long service_mask);
void adf_gen4_init_dc_ops(struct adf_dc_ops *dc_ops);
+void adf_gen4_init_num_svc_aes(struct adf_rl_hw_data *device_data);
#endif
diff --git a/drivers/crypto/intel/qat/qat_common/adf_rl.c b/drivers/crypto/intel/qat/qat_common/adf_rl.c
index 926975539740..77465ab6702c 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_rl.c
+++ b/drivers/crypto/intel/qat/qat_common/adf_rl.c
@@ -552,6 +552,17 @@ u32 adf_rl_calculate_slice_tokens(struct adf_accel_dev *accel_dev, u32 sla_val,
return allocated_tokens;
}
+static u32 adf_rl_get_num_svc_aes(struct adf_accel_dev *accel_dev,
+ enum adf_base_services svc)
+{
+ struct adf_rl_hw_data *device_data = &accel_dev->hw_device->rl_data;
+
+ if (svc >= SVC_BASE_COUNT)
+ return 0;
+
+ return device_data->svc_ae_mask[svc];
+}
+
u32 adf_rl_calculate_ae_cycles(struct adf_accel_dev *accel_dev, u32 sla_val,
enum adf_base_services svc_type)
{
@@ -563,7 +574,7 @@ u32 adf_rl_calculate_ae_cycles(struct adf_accel_dev *accel_dev, u32 sla_val,
return 0;
avail_ae_cycles = hw_data->clock_frequency;
- avail_ae_cycles *= hw_data->get_num_aes(hw_data) - 1;
+ avail_ae_cycles *= adf_rl_get_num_svc_aes(accel_dev, svc_type);
do_div(avail_ae_cycles, device_data->scan_interval);
sla_val *= device_data->max_tp[svc_type];
diff --git a/drivers/crypto/intel/qat/qat_common/adf_rl.h b/drivers/crypto/intel/qat/qat_common/adf_rl.h
index dee7f0c81906..59f885916157 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_rl.h
+++ b/drivers/crypto/intel/qat/qat_common/adf_rl.h
@@ -89,6 +89,7 @@ struct adf_rl_hw_data {
u32 pcie_scale_div;
u32 dcpr_correction;
u32 max_tp[RL_ROOT_MAX];
+ u32 svc_ae_mask[SVC_BASE_COUNT];
struct rl_slice_cnt slices;
};
--
2.40.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 6/8] crypto: qat - add get_svc_slice_cnt() in device data structure
2025-07-10 13:33 [PATCH 0/8] crypto: qat - add rate limiting (RL) support for GEN6 devices Suman Kumar Chakraborty
` (4 preceding siblings ...)
2025-07-10 13:33 ` [PATCH 5/8] crypto: qat - add adf_rl_get_num_svc_aes() in rate limiting Suman Kumar Chakraborty
@ 2025-07-10 13:33 ` Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 7/8] crypto: qat - add compression slice count for rate limiting Suman Kumar Chakraborty
` (2 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Suman Kumar Chakraborty @ 2025-07-10 13:33 UTC (permalink / raw)
To: herbert; +Cc: linux-crypto, qat-linux
Enhance the adf_hw_device_data structure by introducing a new callback
function get_svc_slice_cnt(), which provides a mechanism to query the
total number of accelerator available on the device for a specific
service.
Implement adf_gen4_get_svc_slice_cnt() for QAT GEN4 devices to support this
new interface. This function returns the total accelerator count for a
specific service.
Co-developed-by: George Abraham P <george.abraham.p@intel.com>
Signed-off-by: George Abraham P <george.abraham.p@intel.com>
Signed-off-by: Suman Kumar Chakraborty <suman.kumar.chakraborty@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
---
.../intel/qat/qat_420xx/adf_420xx_hw_data.c | 1 +
.../intel/qat/qat_4xxx/adf_4xxx_hw_data.c | 1 +
.../intel/qat/qat_common/adf_accel_devices.h | 2 ++
.../intel/qat/qat_common/adf_gen4_hw_data.c | 18 ++++++++++++++++++
.../intel/qat/qat_common/adf_gen4_hw_data.h | 2 ++
drivers/crypto/intel/qat/qat_common/adf_rl.c | 16 ++--------------
6 files changed, 26 insertions(+), 14 deletions(-)
diff --git a/drivers/crypto/intel/qat/qat_420xx/adf_420xx_hw_data.c b/drivers/crypto/intel/qat/qat_420xx/adf_420xx_hw_data.c
index 67a1c1d8e23e..53fa91d577ed 100644
--- a/drivers/crypto/intel/qat/qat_420xx/adf_420xx_hw_data.c
+++ b/drivers/crypto/intel/qat/qat_420xx/adf_420xx_hw_data.c
@@ -468,6 +468,7 @@ void adf_init_hw_data_420xx(struct adf_hw_device_data *hw_data, u32 dev_id)
hw_data->num_hb_ctrs = ADF_NUM_HB_CNT_PER_AE;
hw_data->clock_frequency = ADF_420XX_AE_FREQ;
hw_data->services_supported = adf_gen4_services_supported;
+ hw_data->get_svc_slice_cnt = adf_gen4_get_svc_slice_cnt;
adf_gen4_set_err_mask(&hw_data->dev_err_mask);
adf_gen4_init_hw_csr_ops(&hw_data->csr_ops);
diff --git a/drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c b/drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c
index 9b728dba048b..740f68a36ac5 100644
--- a/drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c
+++ b/drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c
@@ -462,6 +462,7 @@ void adf_init_hw_data_4xxx(struct adf_hw_device_data *hw_data, u32 dev_id)
hw_data->num_hb_ctrs = ADF_NUM_HB_CNT_PER_AE;
hw_data->clock_frequency = ADF_4XXX_AE_FREQ;
hw_data->services_supported = adf_gen4_services_supported;
+ hw_data->get_svc_slice_cnt = adf_gen4_get_svc_slice_cnt;
adf_gen4_set_err_mask(&hw_data->dev_err_mask);
adf_gen4_init_hw_csr_ops(&hw_data->csr_ops);
diff --git a/drivers/crypto/intel/qat/qat_common/adf_accel_devices.h b/drivers/crypto/intel/qat/qat_common/adf_accel_devices.h
index f76e0f6c66ae..9fe3239f0114 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_accel_devices.h
+++ b/drivers/crypto/intel/qat/qat_common/adf_accel_devices.h
@@ -319,6 +319,8 @@ struct adf_hw_device_data {
u32 (*get_ena_thd_mask)(struct adf_accel_dev *accel_dev, u32 obj_num);
int (*dev_config)(struct adf_accel_dev *accel_dev);
bool (*services_supported)(unsigned long mask);
+ u32 (*get_svc_slice_cnt)(struct adf_accel_dev *accel_dev,
+ enum adf_base_services svc);
struct adf_pfvf_ops pfvf_ops;
struct adf_hw_csr_ops csr_ops;
struct adf_dc_ops dc_ops;
diff --git a/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.c b/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.c
index 5e4b45c3fabe..349fdb323763 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.c
+++ b/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.c
@@ -580,3 +580,21 @@ void adf_gen4_init_num_svc_aes(struct adf_rl_hw_data *device_data)
device_data->svc_ae_mask[SVC_DECOMP] = 0;
}
EXPORT_SYMBOL_GPL(adf_gen4_init_num_svc_aes);
+
+u32 adf_gen4_get_svc_slice_cnt(struct adf_accel_dev *accel_dev,
+ enum adf_base_services svc)
+{
+ struct adf_rl_hw_data *device_data = &accel_dev->hw_device->rl_data;
+
+ switch (svc) {
+ case SVC_SYM:
+ return device_data->slices.cph_cnt;
+ case SVC_ASYM:
+ return device_data->slices.pke_cnt;
+ case SVC_DC:
+ return device_data->slices.dcpr_cnt;
+ default:
+ return 0;
+ }
+}
+EXPORT_SYMBOL_GPL(adf_gen4_get_svc_slice_cnt);
diff --git a/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.h b/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.h
index 7fa203071c01..cd26b6724c43 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.h
+++ b/drivers/crypto/intel/qat/qat_common/adf_gen4_hw_data.h
@@ -176,5 +176,7 @@ void adf_gen4_bank_drain_finish(struct adf_accel_dev *accel_dev,
bool adf_gen4_services_supported(unsigned long service_mask);
void adf_gen4_init_dc_ops(struct adf_dc_ops *dc_ops);
void adf_gen4_init_num_svc_aes(struct adf_rl_hw_data *device_data);
+u32 adf_gen4_get_svc_slice_cnt(struct adf_accel_dev *accel_dev,
+ enum adf_base_services svc);
#endif
diff --git a/drivers/crypto/intel/qat/qat_common/adf_rl.c b/drivers/crypto/intel/qat/qat_common/adf_rl.c
index 77465ab6702c..c6a54e465931 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_rl.c
+++ b/drivers/crypto/intel/qat/qat_common/adf_rl.c
@@ -529,21 +529,9 @@ u32 adf_rl_calculate_slice_tokens(struct adf_accel_dev *accel_dev, u32 sla_val,
if (!sla_val)
return 0;
+ /* Handle generation specific slice count adjustment */
avail_slice_cycles = hw_data->clock_frequency;
-
- switch (svc_type) {
- case SVC_ASYM:
- avail_slice_cycles *= device_data->slices.pke_cnt;
- break;
- case SVC_SYM:
- avail_slice_cycles *= device_data->slices.cph_cnt;
- break;
- case SVC_DC:
- avail_slice_cycles *= device_data->slices.dcpr_cnt;
- break;
- default:
- break;
- }
+ avail_slice_cycles *= hw_data->get_svc_slice_cnt(accel_dev, svc_type);
do_div(avail_slice_cycles, device_data->scan_interval);
allocated_tokens = avail_slice_cycles * sla_val;
--
2.40.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 7/8] crypto: qat - add compression slice count for rate limiting
2025-07-10 13:33 [PATCH 0/8] crypto: qat - add rate limiting (RL) support for GEN6 devices Suman Kumar Chakraborty
` (5 preceding siblings ...)
2025-07-10 13:33 ` [PATCH 6/8] crypto: qat - add get_svc_slice_cnt() in device data structure Suman Kumar Chakraborty
@ 2025-07-10 13:33 ` Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 8/8] crypto: qat - enable rate limiting feature for GEN6 devices Suman Kumar Chakraborty
2025-07-18 11:12 ` [PATCH 0/8] crypto: qat - add rate limiting (RL) support " Herbert Xu
8 siblings, 0 replies; 10+ messages in thread
From: Suman Kumar Chakraborty @ 2025-07-10 13:33 UTC (permalink / raw)
To: herbert; +Cc: linux-crypto, qat-linux
In QAT GEN4 devices, the compression slice count was tracked using the
dcpr_cnt field.
Introduce a new cpr_cnt field in the rate limiting (RL) infrastructure to
track the compression (CPR) slice count independently. The cpr_cnt value is
populated via the RL_INIT admin message.
The existing dcpr_cnt field will now be used exclusively to cache the
decompression slice count, ensuring a clear separation between compression
and decompression tracking.
Signed-off-by: Suman Kumar Chakraborty <suman.kumar.chakraborty@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
---
drivers/crypto/intel/qat/qat_common/adf_rl.h | 1 +
drivers/crypto/intel/qat/qat_common/adf_rl_admin.c | 1 +
2 files changed, 2 insertions(+)
diff --git a/drivers/crypto/intel/qat/qat_common/adf_rl.h b/drivers/crypto/intel/qat/qat_common/adf_rl.h
index 59f885916157..c1f3f9a51195 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_rl.h
+++ b/drivers/crypto/intel/qat/qat_common/adf_rl.h
@@ -68,6 +68,7 @@ struct rl_slice_cnt {
u8 dcpr_cnt;
u8 pke_cnt;
u8 cph_cnt;
+ u8 cpr_cnt;
};
struct adf_rl_interface_data {
diff --git a/drivers/crypto/intel/qat/qat_common/adf_rl_admin.c b/drivers/crypto/intel/qat/qat_common/adf_rl_admin.c
index 698a14f4ce66..4a3e0591fdba 100644
--- a/drivers/crypto/intel/qat/qat_common/adf_rl_admin.c
+++ b/drivers/crypto/intel/qat/qat_common/adf_rl_admin.c
@@ -63,6 +63,7 @@ int adf_rl_send_admin_init_msg(struct adf_accel_dev *accel_dev,
slices_int->pke_cnt = slices_resp.pke_cnt;
/* For symmetric crypto, slice tokens are relative to the UCS slice */
slices_int->cph_cnt = slices_resp.ucs_cnt;
+ slices_int->cpr_cnt = slices_resp.cpr_cnt;
return 0;
}
--
2.40.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 8/8] crypto: qat - enable rate limiting feature for GEN6 devices
2025-07-10 13:33 [PATCH 0/8] crypto: qat - add rate limiting (RL) support for GEN6 devices Suman Kumar Chakraborty
` (6 preceding siblings ...)
2025-07-10 13:33 ` [PATCH 7/8] crypto: qat - add compression slice count for rate limiting Suman Kumar Chakraborty
@ 2025-07-10 13:33 ` Suman Kumar Chakraborty
2025-07-18 11:12 ` [PATCH 0/8] crypto: qat - add rate limiting (RL) support " Herbert Xu
8 siblings, 0 replies; 10+ messages in thread
From: Suman Kumar Chakraborty @ 2025-07-10 13:33 UTC (permalink / raw)
To: herbert; +Cc: linux-crypto, qat-linux
Add support for enabling rate limiting(RL) feature for QAT GEN6 by
initializing the rl_data member in adf_hw_device_data structure.
Implement init_num_svc_aes() for GEN6 which will populate the number of
AEs associated with the RL service type.
Implement adf_gen6_get_svc_slice_cnt() for GEN6 which will return
the slice count that can support the RL service type.
Co-developed-by: George Abraham P <george.abraham.p@intel.com>
Signed-off-by: George Abraham P <george.abraham.p@intel.com>
Signed-off-by: Suman Kumar Chakraborty <suman.kumar.chakraborty@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
---
Documentation/ABI/testing/sysfs-driver-qat_rl | 14 ++--
.../intel/qat/qat_6xxx/adf_6xxx_hw_data.c | 71 +++++++++++++++++++
.../intel/qat/qat_6xxx/adf_6xxx_hw_data.h | 20 ++++++
3 files changed, 98 insertions(+), 7 deletions(-)
diff --git a/Documentation/ABI/testing/sysfs-driver-qat_rl b/Documentation/ABI/testing/sysfs-driver-qat_rl
index 8c282ae3155d..d534f89b4971 100644
--- a/Documentation/ABI/testing/sysfs-driver-qat_rl
+++ b/Documentation/ABI/testing/sysfs-driver-qat_rl
@@ -31,7 +31,7 @@ Description:
* rm_all: Removes all the configured SLAs.
* Inputs: None
- This attribute is only available for qat_4xxx devices.
+ This attribute is only available for qat_4xxx and qat_6xxx devices.
What: /sys/bus/pci/devices/<BDF>/qat_rl/rp
Date: January 2024
@@ -68,7 +68,7 @@ Description:
## Write
# echo 0x5 > /sys/bus/pci/devices/<BDF>/qat_rl/rp
- This attribute is only available for qat_4xxx devices.
+ This attribute is only available for qat_4xxx and qat_6xxx devices.
What: /sys/bus/pci/devices/<BDF>/qat_rl/id
Date: January 2024
@@ -101,7 +101,7 @@ Description:
# cat /sys/bus/pci/devices/<BDF>/qat_rl/rp
0x5 ## ring pair ID 0 and ring pair ID 2
- This attribute is only available for qat_4xxx devices.
+ This attribute is only available for qat_4xxx and qat_6xxx devices.
What: /sys/bus/pci/devices/<BDF>/qat_rl/cir
Date: January 2024
@@ -135,7 +135,7 @@ Description:
# cat /sys/bus/pci/devices/<BDF>/qat_rl/cir
500
- This attribute is only available for qat_4xxx devices.
+ This attribute is only available for qat_4xxx and qat_6xxx devices.
What: /sys/bus/pci/devices/<BDF>/qat_rl/pir
Date: January 2024
@@ -169,7 +169,7 @@ Description:
# cat /sys/bus/pci/devices/<BDF>/qat_rl/pir
750
- This attribute is only available for qat_4xxx devices.
+ This attribute is only available for qat_4xxx and qat_6xxx devices.
What: /sys/bus/pci/devices/<BDF>/qat_rl/srv
Date: January 2024
@@ -202,7 +202,7 @@ Description:
# cat /sys/bus/pci/devices/<BDF>/qat_rl/srv
dc
- This attribute is only available for qat_4xxx devices.
+ This attribute is only available for qat_4xxx and qat_6xxx devices.
What: /sys/bus/pci/devices/<BDF>/qat_rl/cap_rem
Date: January 2024
@@ -223,4 +223,4 @@ Description:
# cat /sys/bus/pci/devices/<BDF>/qat_rl/cap_rem
0
- This attribute is only available for qat_4xxx devices.
+ This attribute is only available for qat_4xxx and qat_6xxx devices.
diff --git a/drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.c b/drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.c
index 28b7a7649bb6..bed88d3ce8ca 100644
--- a/drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.c
+++ b/drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.c
@@ -524,6 +524,55 @@ static int adf_gen6_init_thd2arb_map(struct adf_accel_dev *accel_dev)
return 0;
}
+static void init_num_svc_aes(struct adf_rl_hw_data *device_data)
+{
+ enum adf_fw_objs obj_type, obj_iter;
+ unsigned int svc, i, num_grp;
+ u32 ae_mask;
+
+ for (svc = 0; svc < SVC_BASE_COUNT; svc++) {
+ switch (svc) {
+ case SVC_SYM:
+ case SVC_ASYM:
+ obj_type = ADF_FW_CY_OBJ;
+ break;
+ case SVC_DC:
+ case SVC_DECOMP:
+ obj_type = ADF_FW_DC_OBJ;
+ break;
+ }
+
+ num_grp = ARRAY_SIZE(adf_default_fw_config);
+ for (i = 0; i < num_grp; i++) {
+ obj_iter = adf_default_fw_config[i].obj;
+ if (obj_iter == obj_type) {
+ ae_mask = adf_default_fw_config[i].ae_mask;
+ device_data->svc_ae_mask[svc] = hweight32(ae_mask);
+ break;
+ }
+ }
+ }
+}
+
+static u32 adf_gen6_get_svc_slice_cnt(struct adf_accel_dev *accel_dev,
+ enum adf_base_services svc)
+{
+ struct adf_rl_hw_data *device_data = &accel_dev->hw_device->rl_data;
+
+ switch (svc) {
+ case SVC_SYM:
+ return device_data->slices.cph_cnt;
+ case SVC_ASYM:
+ return device_data->slices.pke_cnt;
+ case SVC_DC:
+ return device_data->slices.cpr_cnt + device_data->slices.dcpr_cnt;
+ case SVC_DECOMP:
+ return device_data->slices.dcpr_cnt;
+ default:
+ return 0;
+ }
+}
+
static void set_vc_csr_for_bank(void __iomem *csr, u32 bank_number)
{
u32 value;
@@ -805,6 +854,25 @@ static int dev_config(struct adf_accel_dev *accel_dev)
return ret;
}
+static void adf_gen6_init_rl_data(struct adf_rl_hw_data *rl_data)
+{
+ rl_data->pciout_tb_offset = ADF_GEN6_RL_TOKEN_PCIEOUT_BUCKET_OFFSET;
+ rl_data->pciin_tb_offset = ADF_GEN6_RL_TOKEN_PCIEIN_BUCKET_OFFSET;
+ rl_data->r2l_offset = ADF_GEN6_RL_R2L_OFFSET;
+ rl_data->l2c_offset = ADF_GEN6_RL_L2C_OFFSET;
+ rl_data->c2s_offset = ADF_GEN6_RL_C2S_OFFSET;
+ rl_data->pcie_scale_div = ADF_6XXX_RL_PCIE_SCALE_FACTOR_DIV;
+ rl_data->pcie_scale_mul = ADF_6XXX_RL_PCIE_SCALE_FACTOR_MUL;
+ rl_data->max_tp[SVC_ASYM] = ADF_6XXX_RL_MAX_TP_ASYM;
+ rl_data->max_tp[SVC_SYM] = ADF_6XXX_RL_MAX_TP_SYM;
+ rl_data->max_tp[SVC_DC] = ADF_6XXX_RL_MAX_TP_DC;
+ rl_data->max_tp[SVC_DECOMP] = ADF_6XXX_RL_MAX_TP_DECOMP;
+ rl_data->scan_interval = ADF_6XXX_RL_SCANS_PER_SEC;
+ rl_data->scale_ref = ADF_6XXX_RL_SLICE_REF;
+
+ init_num_svc_aes(rl_data);
+}
+
void adf_init_hw_data_6xxx(struct adf_hw_device_data *hw_data)
{
hw_data->dev_class = &adf_6xxx_class;
@@ -863,6 +931,8 @@ void adf_init_hw_data_6xxx(struct adf_hw_device_data *hw_data)
hw_data->enable_pm = enable_pm;
hw_data->services_supported = services_supported;
hw_data->num_rps = ADF_GEN6_ETR_MAX_BANKS;
+ hw_data->clock_frequency = ADF_6XXX_AE_FREQ;
+ hw_data->get_svc_slice_cnt = adf_gen6_get_svc_slice_cnt;
adf_gen6_init_hw_csr_ops(&hw_data->csr_ops);
adf_gen6_init_pf_pfvf_ops(&hw_data->pfvf_ops);
@@ -870,6 +940,7 @@ void adf_init_hw_data_6xxx(struct adf_hw_device_data *hw_data)
adf_gen6_init_vf_mig_ops(&hw_data->vfmig_ops);
adf_gen6_init_ras_ops(&hw_data->ras_ops);
adf_gen6_init_tl_data(&hw_data->tl_data);
+ adf_gen6_init_rl_data(&hw_data->rl_data);
}
void adf_clean_hw_data_6xxx(struct adf_hw_device_data *hw_data)
diff --git a/drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.h b/drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.h
index 8824958527c4..d822911fe68c 100644
--- a/drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.h
+++ b/drivers/crypto/intel/qat/qat_6xxx/adf_6xxx_hw_data.h
@@ -122,6 +122,13 @@
/* Number of heartbeat counter pairs */
#define ADF_NUM_HB_CNT_PER_AE ADF_NUM_THREADS_PER_AE
+/* Rate Limiting */
+#define ADF_GEN6_RL_R2L_OFFSET 0x508000
+#define ADF_GEN6_RL_L2C_OFFSET 0x509000
+#define ADF_GEN6_RL_C2S_OFFSET 0x508818
+#define ADF_GEN6_RL_TOKEN_PCIEIN_BUCKET_OFFSET 0x508800
+#define ADF_GEN6_RL_TOKEN_PCIEOUT_BUCKET_OFFSET 0x508804
+
/* Physical function fuses */
#define ADF_6XXX_ACCELENGINES_MASK GENMASK(8, 0)
#define ADF_6XXX_ADMIN_AE_MASK GENMASK(8, 8)
@@ -133,6 +140,19 @@
#define ADF_6XXX_DC_OBJ "qat_6xxx_dc.bin"
#define ADF_6XXX_ADMIN_OBJ "qat_6xxx_admin.bin"
+/* RL constants */
+#define ADF_6XXX_RL_PCIE_SCALE_FACTOR_DIV 100
+#define ADF_6XXX_RL_PCIE_SCALE_FACTOR_MUL 102
+#define ADF_6XXX_RL_SCANS_PER_SEC 954
+#define ADF_6XXX_RL_MAX_TP_ASYM 173750UL
+#define ADF_6XXX_RL_MAX_TP_SYM 95000UL
+#define ADF_6XXX_RL_MAX_TP_DC 40000UL
+#define ADF_6XXX_RL_MAX_TP_DECOMP 40000UL
+#define ADF_6XXX_RL_SLICE_REF 1000UL
+
+/* Clock frequency */
+#define ADF_6XXX_AE_FREQ (1000 * HZ_PER_MHZ)
+
enum icp_qat_gen6_slice_mask {
ICP_ACCEL_GEN6_MASK_UCS_SLICE = BIT(0),
ICP_ACCEL_GEN6_MASK_AUTH_SLICE = BIT(1),
--
2.40.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 0/8] crypto: qat - add rate limiting (RL) support for GEN6 devices
2025-07-10 13:33 [PATCH 0/8] crypto: qat - add rate limiting (RL) support for GEN6 devices Suman Kumar Chakraborty
` (7 preceding siblings ...)
2025-07-10 13:33 ` [PATCH 8/8] crypto: qat - enable rate limiting feature for GEN6 devices Suman Kumar Chakraborty
@ 2025-07-18 11:12 ` Herbert Xu
8 siblings, 0 replies; 10+ messages in thread
From: Herbert Xu @ 2025-07-18 11:12 UTC (permalink / raw)
To: Suman Kumar Chakraborty; +Cc: linux-crypto, qat-linux
On Thu, Jul 10, 2025 at 02:33:39PM +0100, Suman Kumar Chakraborty wrote:
> This patch set introduces and extends the rate limiting (RL) infrastructure
> in the Intel QAT (QuickAssist Technology) driver, with a focus on enabling
> RL support for QAT GEN6 devices and enhancing support for decompression
> service.
>
> The series begins by enforcing service validation in the RL sysfs API to
> prevent misconfiguration. It then adds decompression (DECOMP) service,
> including its enumeration and visibility via sysfs. Subsequently, service
> enums are refactored and consolidated to remove duplication and clearly
> differentiate between base and extended services.
>
> Further patches improve modularity by relocating is_service_enabled() into
> the appropriate C file, introduce a flexible mechanism using
> adf_rl_get_num_svc_aes() and get_svc_slice_cnt() APIs, and implement these
> for both GEN4 and GEN6 platforms. Additionally, the compression slice count
> (cpr_cnt) is now cached for use within the RL infrastructure.
>
> Finally, the series enables full RL support for GEN6 by initializing the
> rl_data and implementing platform-specific logic to query acceleration
> engines and slice counts for QAT GEN6 hardware.
>
> Summary of Changes:
>
> Patch #1 Validates service in RL sysfs API.
> Patch #2 Adds decompression (DECOMP) service to RL to enable SLA support for
> DECOMP where supported (e.g., GEN6).
> Patch #3 Consolidated the service enums.
> Patch #4 Relocates the is_service_enabled() function to improve modularity and
> aligns code structure.
> Patch #5 Adds adf_rl_get_num_svc_aes() to enable querying number of engines per
> service.
> Patch #6 Adds get_svc_slice_cnt() to device data to generalizes AE count lookup.
> Patch #7 Adds compression slice count tracking.
> Patch #8 Enables RL for GEN6.
>
> Suman Kumar Chakraborty (8):
> crypto: qat - validate service in rate limiting sysfs api
> crypto: qat - add decompression service for rate limiting
> crypto: qat - consolidate service enums
> crypto: qat - relocate service related functions
> crypto: qat - add adf_rl_get_num_svc_aes() in rate limiting
> crypto: qat - add get_svc_slice_cnt() in device data structure
> crypto: qat - add compression slice count for rate limiting
> crypto: qat - enable rate limiting feature for GEN6 devices
>
> Documentation/ABI/testing/sysfs-driver-qat_rl | 14 +--
> .../intel/qat/qat_420xx/adf_420xx_hw_data.c | 9 +-
> .../intel/qat/qat_4xxx/adf_4xxx_hw_data.c | 9 +-
> .../intel/qat/qat_6xxx/adf_6xxx_hw_data.c | 77 ++++++++++++++++-
> .../intel/qat/qat_6xxx/adf_6xxx_hw_data.h | 20 +++++
> .../intel/qat/qat_common/adf_accel_devices.h | 2 +
> .../intel/qat/qat_common/adf_cfg_services.c | 40 ++++++++-
> .../intel/qat/qat_common/adf_cfg_services.h | 12 ++-
> .../intel/qat/qat_common/adf_gen4_hw_data.c | 42 ++++++++-
> .../intel/qat/qat_common/adf_gen4_hw_data.h | 3 +
> drivers/crypto/intel/qat/qat_common/adf_rl.c | 86 ++++++-------------
> drivers/crypto/intel/qat/qat_common/adf_rl.h | 11 +--
> .../intel/qat/qat_common/adf_rl_admin.c | 1 +
> .../intel/qat/qat_common/adf_sysfs_rl.c | 21 +++--
> 14 files changed, 251 insertions(+), 96 deletions(-)
>
>
> base-commit: db689623436f9f8b87c434285a4bdbf54b0f86d2
> --
> 2.40.1
All applied. Thanks.
--
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2025-07-18 11:12 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-10 13:33 [PATCH 0/8] crypto: qat - add rate limiting (RL) support for GEN6 devices Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 1/8] crypto: qat - validate service in rate limiting sysfs api Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 2/8] crypto: qat - add decompression service for rate limiting Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 3/8] crypto: qat - consolidate service enums Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 4/8] crypto: qat - relocate service related functions Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 5/8] crypto: qat - add adf_rl_get_num_svc_aes() in rate limiting Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 6/8] crypto: qat - add get_svc_slice_cnt() in device data structure Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 7/8] crypto: qat - add compression slice count for rate limiting Suman Kumar Chakraborty
2025-07-10 13:33 ` [PATCH 8/8] crypto: qat - enable rate limiting feature for GEN6 devices Suman Kumar Chakraborty
2025-07-18 11:12 ` [PATCH 0/8] crypto: qat - add rate limiting (RL) support " Herbert Xu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).