Skip to content

Commit

Permalink
crypto/ycc: Add ycc ring configuration
Browse files Browse the repository at this point in the history
There're 2 types of functional rings, kernel ring and user ring.
All kernel rings must be initialized in kernel driver while user rings
are not supported now.

Signed-off-by: Zelin Deng <zelin.deng@linux.alibaba.com>
  • Loading branch information
Zelin Deng authored and intel-lab-lkp committed Oct 25, 2022
1 parent 5ae904f commit 5ca4b99
Show file tree
Hide file tree
Showing 6 changed files with 745 additions and 2 deletions.
2 changes: 1 addition & 1 deletion drivers/crypto/ycc/Makefile
@@ -1,3 +1,3 @@
# SPDX-License-Identifier: GPL-2.0
obj-$(CONFIG_CRYPTO_DEV_YCC) += ycc.o
ycc-objs := ycc_drv.o ycc_isr.o
ycc-objs := ycc_drv.o ycc_isr.o ycc_ring.o
6 changes: 6 additions & 0 deletions drivers/crypto/ycc/ycc_dev.h
Expand Up @@ -104,10 +104,16 @@ struct ycc_dev {
struct ycc_bar ycc_bars[4];
struct ycc_dev *assoc_dev;

int max_desc;
int user_rings;
bool is_polling;
unsigned long status;
struct workqueue_struct *dev_err_q;
char err_irq_name[32];

struct ycc_ring *rings;
unsigned long ring_bitmap;

struct work_struct work;
char *msi_name[48];
struct dentry *debug_dir;
Expand Down
59 changes: 58 additions & 1 deletion drivers/crypto/ycc/ycc_drv.c
Expand Up @@ -24,11 +24,16 @@
#include <linux/debugfs.h>

#include "ycc_isr.h"
#include "ycc_ring.h"

static const char ycc_name[] = "ycc";

static int max_desc = 256;
static int user_rings;
static bool is_polling = true;
module_param(max_desc, int, 0644);
module_param(is_polling, bool, 0644);
module_param(user_rings, int, 0644);

LIST_HEAD(ycc_table);
DEFINE_MUTEX(ycc_mutex);
Expand All @@ -41,6 +46,35 @@ DEFINE_MUTEX(ycc_mutex);
#define YCC_MAX_DEVICES (98 * 4) /* Assume 4 sockets */
static DEFINE_IDR(ycc_idr);

static int ycc_dev_debugfs_statistics_show(struct seq_file *s, void *p)
{
struct ycc_dev *ydev = (struct ycc_dev *)s->private;
struct ycc_ring *ring;
int i;

seq_printf(s, "name, type, nr_binds, nr_cmds, nr_resps\n");
for (i = 0; i < YCC_RINGPAIR_NUM; i++) {
ring = ydev->rings + i;
seq_printf(s, "Ring%02d, %d, %llu, %llu, %llu\n", ring->ring_id,
ring->type, ring->nr_binds, ring->nr_cmds, ring->nr_resps);
}

return 0;
}

static int ycc_dev_debugfs_statistics_open(struct inode *inode, struct file *filp)
{
return single_open(filp, ycc_dev_debugfs_statistics_show, inode->i_private);
}

static const struct file_operations ycc_dev_statistics_fops = {
.open = ycc_dev_debugfs_statistics_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
.owner = THIS_MODULE,
};

static int ycc_device_flr(struct pci_dev *pdev, struct pci_dev *rcec_pdev)
{
int ret;
Expand Down Expand Up @@ -136,11 +170,21 @@ static int ycc_resource_setup(struct ycc_dev *ydev)
goto iounmap_queue_bar;
}

/* User ring is not supported temporarily */
ydev->user_rings = 0;
user_rings = 0;

ret = ycc_dev_rings_init(ydev, max_desc, user_rings);
if (ret) {
pr_err("Failed to init ycc rings\n");
goto iounmap_queue_bar;
}

ret = ycc_enable_msix(ydev);
if (ret <= 0) {
pr_err("Failed to enable msix, ret: %d\n", ret);
ret = (ret == 0) ? -EINVAL : ret;
goto iounmap_queue_bar;
goto release_rings;
}

ret = ycc_init_global_err(ydev);
Expand All @@ -163,12 +207,15 @@ static int ycc_resource_setup(struct ycc_dev *ydev)
ycc_deinit_global_err(ydev);
disable_msix:
ycc_disable_msix(ydev);
release_rings:
ycc_dev_rings_release(ydev, user_rings);
iounmap_queue_bar:
iounmap(abar->vaddr);
iounmap_cfg_bar:
iounmap(cfg_bar->vaddr);
release_mem_regions:
pci_release_regions(pdev);

return ret;
}

Expand All @@ -177,6 +224,7 @@ static void ycc_resource_free(struct ycc_dev *ydev)
ycc_deinit_global_err(ydev);
ycc_free_irqs(ydev);
ycc_disable_msix(ydev);
ycc_dev_rings_release(ydev, ydev->user_rings);
iounmap(ydev->ycc_bars[YCC_SEC_CFG_BAR].vaddr);
iounmap(ydev->ycc_bars[YCC_NSEC_Q_BAR].vaddr);
pci_release_regions(ydev->pdev);
Expand Down Expand Up @@ -301,12 +349,15 @@ static void ycc_dev_del(struct ycc_dev *ydev)
static inline int ycc_rciep_init(struct ycc_dev *ydev)
{
struct pci_dev *pdev = ydev->pdev;
struct dentry *debugfs;
char name[YCC_MAX_DEBUGFS_NAME + 1];
int idr;

ydev->sec = false;
ydev->dev_name = ycc_name;
ydev->is_polling = is_polling;
ydev->user_rings = user_rings;
ydev->max_desc = max_desc;

idr = idr_alloc(&ycc_idr, ydev, 0, YCC_MAX_DEVICES, GFP_KERNEL);
if (idr < 0) {
Expand All @@ -323,6 +374,11 @@ static inline int ycc_rciep_init(struct ycc_dev *ydev)
if (IS_ERR_OR_NULL(ydev->debug_dir)) {
pr_warn("Failed to create debugfs for RCIEP device\n");
ydev->debug_dir = NULL;
} else {
debugfs = debugfs_create_file("statistics", 0400, ydev->debug_dir,
(void *)ydev, &ycc_dev_statistics_fops);
if (IS_ERR_OR_NULL(debugfs))
pr_warn("Failed to create statistics entry for RCIEP device\n");
}

return 0;
Expand Down Expand Up @@ -351,6 +407,7 @@ static int ycc_drv_probe(struct pci_dev *pdev, const struct pci_device_id *id)
ydev->is_vf = false;
ydev->enable_vf = false;
ydev->node = node;
ydev->ring_bitmap = 0;
if (id->device == PCI_DEVICE_ID_RCIEP) {
ydev->type = YCC_RCIEP;
ret = ycc_rciep_init(ydev);
Expand Down
7 changes: 7 additions & 0 deletions drivers/crypto/ycc/ycc_isr.c
Expand Up @@ -38,6 +38,13 @@ static irqreturn_t ycc_g_err_isr(int irq, void *data)
return IRQ_HANDLED;
}

/*
* TODO: will implement when ycc ring actually work.
*/
void ycc_resp_process(uintptr_t ring_addr)
{
}

int ycc_enable_msix(struct ycc_dev *ydev)
{
struct pci_dev *rcec_pdev = ydev->assoc_dev->pdev;
Expand Down

0 comments on commit 5ca4b99

Please sign in to comment.