All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/4] Add module parameters to control CCP activation
@ 2019-07-09 15:07 Hook, Gary
  2019-07-09 15:07 ` [PATCH v2 1/4] crypto: ccp - Make CCP debugfs support optional Hook, Gary
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Hook, Gary @ 2019-07-09 15:07 UTC (permalink / raw)
  To: linux-crypto; +Cc: Lendacky, Thomas, herbert, davem

Firstly, add a switch to allow/disallow debugfs code to be built into
the CCP driver.

This rest of the patch series implements a set of module parameters
that allows control over which CCPs on a system are enabled by the
driver, and how many queues on each device are activated.

A switch to enable/disable DMA engine registration is implemented.

Details:
nqueues - configure N queues per CCP (default: 0 - all queues enabled)
max_devs - maximum number of devices to enable (default: 0 - all
           devices activated)
dmaengine - Register services with the DMA subsystem (default: true)

Only activated devices will have their DMA services registered,
comprehensively controlled by the dmaengine parameter.

Changes since v1:
 - Remove debugfs patches that duplicates sysfs function
 - Remove patches for filtering by pcibus and pci device ID
 - Utilize underscores for consistency in variable names
 - Correct commit message for nqueues regarding default value
 - Alter verbage of parameter description (dmaengine)
 - Help text in Kconfig: remove reference to parameters in debugfs

---

Gary R Hook (4):
      crypto: ccp - Make CCP debugfs support optional
      crypto: ccp - Add a module parameter to specify a queue count
      crypto: ccp - module parameter to limit the number of enabled CCPs
      crypto: ccp - Add a module parameter to control registration for DMA


 drivers/crypto/ccp/Kconfig         |    8 ++++++++
 drivers/crypto/ccp/Makefile        |    4 ++--
 drivers/crypto/ccp/ccp-dev-v3.c    |    2 +-
 drivers/crypto/ccp/ccp-dev-v5.c    |   11 ++++++-----
 drivers/crypto/ccp/ccp-dev.c       |   29 ++++++++++++++++++++++++++++-
 drivers/crypto/ccp/ccp-dev.h       |    1 +
 drivers/crypto/ccp/ccp-dmaengine.c |   12 +++++++++++-
 7 files changed, 57 insertions(+), 10 deletions(-)

--
Signature

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2 1/4] crypto: ccp - Make CCP debugfs support optional
  2019-07-09 15:07 [PATCH v2 0/4] Add module parameters to control CCP activation Hook, Gary
@ 2019-07-09 15:07 ` Hook, Gary
  2019-07-09 15:07 ` [PATCH v2 2/4] crypto: ccp - Add a module parameter to specify a queue count Hook, Gary
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Hook, Gary @ 2019-07-09 15:07 UTC (permalink / raw)
  To: linux-crypto; +Cc: Lendacky, Thomas, herbert, davem

Add a config option to exclude DebugFS support in the CCP driver.

Signed-off-by: Gary R Hook <gary.hook@amd.com>
---
 drivers/crypto/ccp/Kconfig      |    8 ++++++++
 drivers/crypto/ccp/Makefile     |    4 ++--
 drivers/crypto/ccp/ccp-dev-v5.c |    4 ++++
 3 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/drivers/crypto/ccp/Kconfig b/drivers/crypto/ccp/Kconfig
index b9dfae47aefd..51e46b57ad8e 100644
--- a/drivers/crypto/ccp/Kconfig
+++ b/drivers/crypto/ccp/Kconfig
@@ -44,3 +44,11 @@ config CRYPTO_DEV_SP_PSP
 	 management commands in Secure Encrypted Virtualization (SEV) mode,
 	 along with software-based Trusted Execution Environment (TEE) to
 	 enable third-party trusted applications.
+
+config CRYPTO_DEV_CCP_DEBUGFS
+	bool "Enable CCP Internals in DebugFS"
+	default n
+	depends on CRYPTO_DEV_SP_CCP
+	help
+	  Expose CCP device information such as operation statistics, feature
+	  information, and descriptor queue contents.
diff --git a/drivers/crypto/ccp/Makefile b/drivers/crypto/ccp/Makefile
index 51d1c0cf66c7..6b86f1e6d634 100644
--- a/drivers/crypto/ccp/Makefile
+++ b/drivers/crypto/ccp/Makefile
@@ -5,8 +5,8 @@ ccp-$(CONFIG_CRYPTO_DEV_SP_CCP) += ccp-dev.o \
 	    ccp-ops.o \
 	    ccp-dev-v3.o \
 	    ccp-dev-v5.o \
-	    ccp-dmaengine.o \
-	    ccp-debugfs.o
+	    ccp-dmaengine.o
+ccp-$(CONFIG_CRYPTO_DEV_CCP_DEBUGFS) += ccp-debugfs.o
 ccp-$(CONFIG_PCI) += sp-pci.o
 ccp-$(CONFIG_CRYPTO_DEV_SP_PSP) += psp-dev.o
 
diff --git a/drivers/crypto/ccp/ccp-dev-v5.c b/drivers/crypto/ccp/ccp-dev-v5.c
index c76a9fa115b8..340d0984f8d7 100644
--- a/drivers/crypto/ccp/ccp-dev-v5.c
+++ b/drivers/crypto/ccp/ccp-dev-v5.c
@@ -970,8 +970,10 @@ static int ccp5_init(struct ccp_device *ccp)
 	if (ret)
 		goto e_hwrng;
 
+#ifdef CONFIG_CRYPTO_DEV_CCP_DEBUGFS
 	/* Set up debugfs entries */
 	ccp5_debugfs_setup(ccp);
+#endif
 
 	return 0;
 
@@ -1009,11 +1011,13 @@ static void ccp5_destroy(struct ccp_device *ccp)
 	/* Remove this device from the list of available units first */
 	ccp_del_device(ccp);
 
+#ifdef CONFIG_CRYPTO_DEV_CCP_DEBUGFS
 	/* We're in the process of tearing down the entire driver;
 	 * when all the devices are gone clean up debugfs
 	 */
 	if (ccp_present())
 		ccp5_debugfs_destroy();
+#endif
 
 	/* Disable and clear interrupts */
 	ccp5_disable_queue_interrupts(ccp);


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 2/4] crypto: ccp - Add a module parameter to specify a queue count
  2019-07-09 15:07 [PATCH v2 0/4] Add module parameters to control CCP activation Hook, Gary
  2019-07-09 15:07 ` [PATCH v2 1/4] crypto: ccp - Make CCP debugfs support optional Hook, Gary
@ 2019-07-09 15:07 ` Hook, Gary
  2019-07-09 15:07 ` [PATCH v2 3/4] crypto: ccp - module parameter to limit the number of enabled CCPs Hook, Gary
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Hook, Gary @ 2019-07-09 15:07 UTC (permalink / raw)
  To: linux-crypto; +Cc: Lendacky, Thomas, herbert, davem

Add a module parameter to limit the number of queues per CCP. The default
value (nqueues=0) is to set up every available queue on each device.

The count of queues starts from the first one found on the device (which
varies based on the device ID).

Signed-off-by: Gary R Hook <gary.hook@amd.com>
---
 drivers/crypto/ccp/ccp-dev-v3.c |    2 +-
 drivers/crypto/ccp/ccp-dev-v5.c |    7 ++-----
 drivers/crypto/ccp/ccp-dev.c    |   11 +++++++++++
 drivers/crypto/ccp/ccp-dev.h    |    1 +
 4 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/drivers/crypto/ccp/ccp-dev-v3.c b/drivers/crypto/ccp/ccp-dev-v3.c
index 2339a8101a52..16bc45717198 100644
--- a/drivers/crypto/ccp/ccp-dev-v3.c
+++ b/drivers/crypto/ccp/ccp-dev-v3.c
@@ -379,7 +379,7 @@ static int ccp_init(struct ccp_device *ccp)
 	/* Find available queues */
 	ccp->qim = 0;
 	qmr = ioread32(ccp->io_regs + Q_MASK_REG);
-	for (i = 0; i < MAX_HW_QUEUES; i++) {
+	for (i = 0; (i < MAX_HW_QUEUES) && (ccp->cmd_q_count < ccp->max_q_count); i++) {
 		if (!(qmr & (1 << i)))
 			continue;
 
diff --git a/drivers/crypto/ccp/ccp-dev-v5.c b/drivers/crypto/ccp/ccp-dev-v5.c
index 340d0984f8d7..cd4c6b1b5c9c 100644
--- a/drivers/crypto/ccp/ccp-dev-v5.c
+++ b/drivers/crypto/ccp/ccp-dev-v5.c
@@ -2,16 +2,14 @@
 /*
  * AMD Cryptographic Coprocessor (CCP) driver
  *
- * Copyright (C) 2016,2017 Advanced Micro Devices, Inc.
+ * Copyright (C) 2016,2019 Advanced Micro Devices, Inc.
  *
  * Author: Gary R Hook <gary.hook@amd.com>
  */
 
-#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/pci.h>
 #include <linux/kthread.h>
-#include <linux/debugfs.h>
 #include <linux/dma-mapping.h>
 #include <linux/interrupt.h>
 #include <linux/compiler.h>
@@ -792,8 +790,7 @@ static int ccp5_init(struct ccp_device *ccp)
 
 	/* Find available queues */
 	qmr = ioread32(ccp->io_regs + Q_MASK_REG);
-	for (i = 0; i < MAX_HW_QUEUES; i++) {
-
+	for (i = 0; (i < MAX_HW_QUEUES) && (ccp->cmd_q_count < ccp->max_q_count); i++) {
 		if (!(qmr & (1 << i)))
 			continue;
 
diff --git a/drivers/crypto/ccp/ccp-dev.c b/drivers/crypto/ccp/ccp-dev.c
index f3ff36f93207..23cef87c0950 100644
--- a/drivers/crypto/ccp/ccp-dev.c
+++ b/drivers/crypto/ccp/ccp-dev.c
@@ -8,6 +8,7 @@
  * Author: Gary R Hook <gary.hook@amd.com>
  */
 
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/kthread.h>
 #include <linux/sched.h>
@@ -26,6 +27,11 @@
 
 #include "ccp-dev.h"
 
+/* Limit CCP use to a specifed number of queues per device */
+static unsigned int nqueues = 0;
+module_param(nqueues, uint, 0444);
+MODULE_PARM_DESC(nqueues, "Number of queues per CCP (minimum 1; default: all available)");
+
 struct ccp_tasklet_data {
 	struct completion completion;
 	struct ccp_cmd *cmd;
@@ -592,6 +598,11 @@ int ccp_dev_init(struct sp_device *sp)
 		goto e_err;
 	sp->ccp_data = ccp;
 
+	if (!nqueues || (nqueues > MAX_HW_QUEUES))
+		ccp->max_q_count = MAX_HW_QUEUES;
+	else
+		ccp->max_q_count = nqueues;
+
 	ccp->vdata = (struct ccp_vdata *)sp->dev_vdata->ccp_vdata;
 	if (!ccp->vdata || !ccp->vdata->version) {
 		ret = -ENODEV;
diff --git a/drivers/crypto/ccp/ccp-dev.h b/drivers/crypto/ccp/ccp-dev.h
index 4a54e731f836..5c96d348ec09 100644
--- a/drivers/crypto/ccp/ccp-dev.h
+++ b/drivers/crypto/ccp/ccp-dev.h
@@ -379,6 +379,7 @@ struct ccp_device {
 	 */
 	struct ccp_cmd_queue cmd_q[MAX_HW_QUEUES];
 	unsigned int cmd_q_count;
+	unsigned int max_q_count;
 
 	/* Support for the CCP True RNG
 	 */


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 3/4] crypto: ccp - module parameter to limit the number of enabled CCPs
  2019-07-09 15:07 [PATCH v2 0/4] Add module parameters to control CCP activation Hook, Gary
  2019-07-09 15:07 ` [PATCH v2 1/4] crypto: ccp - Make CCP debugfs support optional Hook, Gary
  2019-07-09 15:07 ` [PATCH v2 2/4] crypto: ccp - Add a module parameter to specify a queue count Hook, Gary
@ 2019-07-09 15:07 ` Hook, Gary
  2019-07-09 15:07 ` [PATCH v2 4/4] crypto: ccp - Add a module parameter to control registration for DMA Hook, Gary
  2019-07-26 12:33 ` [PATCH v2 0/4] Add module parameters to control CCP activation Herbert Xu
  4 siblings, 0 replies; 6+ messages in thread
From: Hook, Gary @ 2019-07-09 15:07 UTC (permalink / raw)
  To: linux-crypto; +Cc: Lendacky, Thomas, herbert, davem

Provide the ability to constrain the total number of enabled devices in
the system. Once max_devs devices have been configured, subsequently
probed devices are ignored.

The max_devs parameter may be zero, in which case all CCPs are disabled.
PSPs are always enabled and active.

Disabling the CCPs also disables DMA and RNG registration.

Signed-off-by: Gary R Hook <gary.hook@amd.com>
---
 drivers/crypto/ccp/ccp-dev.c |   18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/drivers/crypto/ccp/ccp-dev.c b/drivers/crypto/ccp/ccp-dev.c
index 23cef87c0950..cba96169ee36 100644
--- a/drivers/crypto/ccp/ccp-dev.c
+++ b/drivers/crypto/ccp/ccp-dev.c
@@ -2,7 +2,7 @@
 /*
  * AMD Cryptographic Coprocessor (CCP) driver
  *
- * Copyright (C) 2013,2017 Advanced Micro Devices, Inc.
+ * Copyright (C) 2013,2019 Advanced Micro Devices, Inc.
  *
  * Author: Tom Lendacky <thomas.lendacky@amd.com>
  * Author: Gary R Hook <gary.hook@amd.com>
@@ -20,6 +20,7 @@
 #include <linux/delay.h>
 #include <linux/hw_random.h>
 #include <linux/cpu.h>
+#include <linux/atomic.h>
 #ifdef CONFIG_X86
 #include <asm/cpu_device_id.h>
 #endif
@@ -27,11 +28,19 @@
 
 #include "ccp-dev.h"
 
+#define MAX_CCPS 32
+
 /* Limit CCP use to a specifed number of queues per device */
 static unsigned int nqueues = 0;
 module_param(nqueues, uint, 0444);
 MODULE_PARM_DESC(nqueues, "Number of queues per CCP (minimum 1; default: all available)");
 
+/* Limit the maximum number of configured CCPs */
+static atomic_t dev_count = ATOMIC_INIT(0);
+static unsigned int max_devs = MAX_CCPS;
+module_param(max_devs, uint, 0444);
+MODULE_PARM_DESC(max_devs, "Maximum number of CCPs to enable (default: all; 0 disables all CCPs)");
+
 struct ccp_tasklet_data {
 	struct completion completion;
 	struct ccp_cmd *cmd;
@@ -592,6 +601,13 @@ int ccp_dev_init(struct sp_device *sp)
 	struct ccp_device *ccp;
 	int ret;
 
+	/*
+	 * Check how many we have so far, and stop after reaching
+	 * that number
+	 */
+	if (atomic_inc_return(&dev_count) > max_devs)
+		return 0; /* don't fail the load */
+
 	ret = -ENOMEM;
 	ccp = ccp_alloc_struct(sp);
 	if (!ccp)


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 4/4] crypto: ccp - Add a module parameter to control registration for DMA
  2019-07-09 15:07 [PATCH v2 0/4] Add module parameters to control CCP activation Hook, Gary
                   ` (2 preceding siblings ...)
  2019-07-09 15:07 ` [PATCH v2 3/4] crypto: ccp - module parameter to limit the number of enabled CCPs Hook, Gary
@ 2019-07-09 15:07 ` Hook, Gary
  2019-07-26 12:33 ` [PATCH v2 0/4] Add module parameters to control CCP activation Herbert Xu
  4 siblings, 0 replies; 6+ messages in thread
From: Hook, Gary @ 2019-07-09 15:07 UTC (permalink / raw)
  To: linux-crypto; +Cc: Lendacky, Thomas, herbert, davem

The CCP driver is able to act as a DMA engine. Add a module parameter that
allows this feature to be enabled/disabled.

Signed-off-by: Gary R Hook <gary.hook@amd.com>
---
 drivers/crypto/ccp/ccp-dmaengine.c |   12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/drivers/crypto/ccp/ccp-dmaengine.c b/drivers/crypto/ccp/ccp-dmaengine.c
index 9aee619db6e4..3f90ce35bee5 100644
--- a/drivers/crypto/ccp/ccp-dmaengine.c
+++ b/drivers/crypto/ccp/ccp-dmaengine.c
@@ -2,7 +2,7 @@
 /*
  * AMD Cryptographic Coprocessor (CCP) driver
  *
- * Copyright (C) 2016,2017 Advanced Micro Devices, Inc.
+ * Copyright (C) 2016,2019 Advanced Micro Devices, Inc.
  *
  * Author: Gary R Hook <gary.hook@amd.com>
  */
@@ -35,6 +35,10 @@ static unsigned int dma_chan_attr = CCP_DMA_DFLT;
 module_param(dma_chan_attr, uint, 0444);
 MODULE_PARM_DESC(dma_chan_attr, "Set DMA channel visibility: 0 (default) = device defaults, 1 = make private, 2 = make public");
 
+static unsigned int dmaengine = 1;
+module_param(dmaengine, uint, 0444);
+MODULE_PARM_DESC(dmaengine, "Register services with the DMA subsystem (any non-zero value, default: 1)");
+
 static unsigned int ccp_get_dma_chan_attr(struct ccp_device *ccp)
 {
 	switch (dma_chan_attr) {
@@ -637,6 +641,9 @@ int ccp_dmaengine_register(struct ccp_device *ccp)
 	unsigned int i;
 	int ret;
 
+	if (!dmaengine)
+		return 0;
+
 	ccp->ccp_dma_chan = devm_kcalloc(ccp->dev, ccp->cmd_q_count,
 					 sizeof(*(ccp->ccp_dma_chan)),
 					 GFP_KERNEL);
@@ -740,6 +747,9 @@ void ccp_dmaengine_unregister(struct ccp_device *ccp)
 {
 	struct dma_device *dma_dev = &ccp->dma_dev;
 
+	if (!dmaengine)
+		return;
+
 	dma_async_device_unregister(dma_dev);
 
 	kmem_cache_destroy(ccp->dma_desc_cache);


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 0/4] Add module parameters to control CCP activation
  2019-07-09 15:07 [PATCH v2 0/4] Add module parameters to control CCP activation Hook, Gary
                   ` (3 preceding siblings ...)
  2019-07-09 15:07 ` [PATCH v2 4/4] crypto: ccp - Add a module parameter to control registration for DMA Hook, Gary
@ 2019-07-26 12:33 ` Herbert Xu
  4 siblings, 0 replies; 6+ messages in thread
From: Herbert Xu @ 2019-07-26 12:33 UTC (permalink / raw)
  To: Hook, Gary; +Cc: linux-crypto, Thomas.Lendacky, davem

Hook, Gary <Gary.Hook@amd.com> wrote:
> Firstly, add a switch to allow/disallow debugfs code to be built into
> the CCP driver.
> 
> This rest of the patch series implements a set of module parameters
> that allows control over which CCPs on a system are enabled by the
> driver, and how many queues on each device are activated.^M
> 
> A switch to enable/disable DMA engine registration is implemented.
> 
> Details:
> nqueues - configure N queues per CCP (default: 0 - all queues enabled)
> max_devs - maximum number of devices to enable (default: 0 - all
>           devices activated)
> dmaengine - Register services with the DMA subsystem (default: true)
> 
> Only activated devices will have their DMA services registered,
> comprehensively controlled by the dmaengine parameter.
> 
> Changes since v1:
> - Remove debugfs patches that duplicates sysfs function
> - Remove patches for filtering by pcibus and pci device ID
> - Utilize underscores for consistency in variable names
> - Correct commit message for nqueues regarding default value
> - Alter verbage of parameter description (dmaengine)
> - Help text in Kconfig: remove reference to parameters in debugfs
> 
> ---
> 
> Gary R Hook (4):^M
>      crypto: ccp - Make CCP debugfs support optional
>      crypto: ccp - Add a module parameter to specify a queue count
>      crypto: ccp - module parameter to limit the number of enabled CCPs
>      crypto: ccp - Add a module parameter to control registration for DMA
> 
> 
> drivers/crypto/ccp/Kconfig         |    8 ++++++++
> drivers/crypto/ccp/Makefile        |    4 ++--
> drivers/crypto/ccp/ccp-dev-v3.c    |    2 +-
> drivers/crypto/ccp/ccp-dev-v5.c    |   11 ++++++-----
> drivers/crypto/ccp/ccp-dev.c       |   29 ++++++++++++++++++++++++++++-
> drivers/crypto/ccp/ccp-dev.h       |    1 +
> drivers/crypto/ccp/ccp-dmaengine.c |   12 +++++++++++-
> 7 files changed, 57 insertions(+), 10 deletions(-)

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] 6+ messages in thread

end of thread, other threads:[~2019-07-26 12:33 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-09 15:07 [PATCH v2 0/4] Add module parameters to control CCP activation Hook, Gary
2019-07-09 15:07 ` [PATCH v2 1/4] crypto: ccp - Make CCP debugfs support optional Hook, Gary
2019-07-09 15:07 ` [PATCH v2 2/4] crypto: ccp - Add a module parameter to specify a queue count Hook, Gary
2019-07-09 15:07 ` [PATCH v2 3/4] crypto: ccp - module parameter to limit the number of enabled CCPs Hook, Gary
2019-07-09 15:07 ` [PATCH v2 4/4] crypto: ccp - Add a module parameter to control registration for DMA Hook, Gary
2019-07-26 12:33 ` [PATCH v2 0/4] Add module parameters to control CCP activation Herbert Xu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.