Skip to content

Commit

Permalink
crypto: hisilicon/zip - add zip comp high perf mode configuration
Browse files Browse the repository at this point in the history
[ Upstream commit a9864ba ]

To meet specific application scenarios, the function of switching between
the high performance mode and the high compression mode is added.

Use the perf_mode=0/1 configuration to set the compression high perf mode,
0(default, high compression mode), 1(high performance mode). These two
modes only apply to the compression direction and are compatible with
software algorithm in both directions.

Signed-off-by: Chenghai Huang <huangchenghai2@huawei.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Stable-dep-of: cf8b515 ("crypto: hisilicon/hpre - save capability registers in probe process")
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
Chenghai Huang authored and gregkh committed Jan 25, 2024
1 parent 2736b06 commit 615245a
Showing 1 changed file with 65 additions and 0 deletions.
65 changes: 65 additions & 0 deletions drivers/crypto/hisilicon/zip/zip_main.c
Expand Up @@ -107,6 +107,14 @@
#define HZIP_CLOCK_GATED_EN (HZIP_CORE_GATED_EN | \
HZIP_CORE_GATED_OOO_EN)

/* zip comp high performance */
#define HZIP_HIGH_PERF_OFFSET 0x301208

enum {
HZIP_HIGH_COMP_RATE,
HZIP_HIGH_COMP_PERF,
};

static const char hisi_zip_name[] = "hisi_zip";
static struct dentry *hzip_debugfs_root;

Expand Down Expand Up @@ -352,6 +360,37 @@ static int hzip_diff_regs_show(struct seq_file *s, void *unused)
return 0;
}
DEFINE_SHOW_ATTRIBUTE(hzip_diff_regs);

static int perf_mode_set(const char *val, const struct kernel_param *kp)
{
int ret;
u32 n;

if (!val)
return -EINVAL;

ret = kstrtou32(val, 10, &n);
if (ret != 0 || (n != HZIP_HIGH_COMP_PERF &&
n != HZIP_HIGH_COMP_RATE))
return -EINVAL;

return param_set_int(val, kp);
}

static const struct kernel_param_ops zip_com_perf_ops = {
.set = perf_mode_set,
.get = param_get_int,
};

/*
* perf_mode = 0 means enable high compression rate mode,
* perf_mode = 1 means enable high compression performance mode.
* These two modes only apply to the compression direction.
*/
static u32 perf_mode = HZIP_HIGH_COMP_RATE;
module_param_cb(perf_mode, &zip_com_perf_ops, &perf_mode, 0444);
MODULE_PARM_DESC(perf_mode, "ZIP high perf mode 0(default), 1(enable)");

static const struct kernel_param_ops zip_uacce_mode_ops = {
.set = uacce_mode_set,
.get = param_get_int,
Expand Down Expand Up @@ -417,6 +456,28 @@ bool hisi_zip_alg_support(struct hisi_qm *qm, u32 alg)
return false;
}

static int hisi_zip_set_high_perf(struct hisi_qm *qm)
{
u32 val;
int ret;

val = readl_relaxed(qm->io_base + HZIP_HIGH_PERF_OFFSET);
if (perf_mode == HZIP_HIGH_COMP_PERF)
val |= HZIP_HIGH_COMP_PERF;
else
val &= ~HZIP_HIGH_COMP_PERF;

/* Set perf mode */
writel(val, qm->io_base + HZIP_HIGH_PERF_OFFSET);
ret = readl_relaxed_poll_timeout(qm->io_base + HZIP_HIGH_PERF_OFFSET,
val, val == perf_mode, HZIP_DELAY_1_US,
HZIP_POLL_TIMEOUT_US);
if (ret)
pci_err(qm->pdev, "failed to set perf mode\n");

return ret;
}

static int hisi_zip_set_qm_algs(struct hisi_qm *qm)
{
struct device *dev = &qm->pdev->dev;
Expand Down Expand Up @@ -1115,6 +1176,10 @@ static int hisi_zip_pf_probe_init(struct hisi_zip *hisi_zip)
if (ret)
return ret;

ret = hisi_zip_set_high_perf(qm);
if (ret)
return ret;

hisi_zip_open_sva_prefetch(qm);
hisi_qm_dev_err_init(qm);
hisi_zip_debug_regs_clear(qm);
Expand Down

0 comments on commit 615245a

Please sign in to comment.