aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGary R Hook <gary.hook@amd.com>2016-07-26 20:10:13 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2016-08-09 06:47:10 -0400
commitbb4e89b34d1bf46156b7e880a0f34205fb7ce2a5 (patch)
tree1fed02203f6f76373e9e88bad677295de5c26745
parent8256e683113e659d9bf6bffdd227eeb1881ae9a7 (diff)
crypto: ccp - Refactor code to enable checks for queue space.
Available queue space is used to decide (by counting free slots) if we have to put a command on hold or if it can be sent to the engine immediately. Signed-off-by: Gary R Hook <gary.hook@amd.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--drivers/crypto/ccp/ccp-dev-v3.c8
-rw-r--r--drivers/crypto/ccp/ccp-dev.h1
-rw-r--r--drivers/crypto/ccp/ccp-ops.c2
3 files changed, 9 insertions, 2 deletions
diff --git a/drivers/crypto/ccp/ccp-dev-v3.c b/drivers/crypto/ccp/ccp-dev-v3.c
index 373ac4fa4a47..02c8c95fdc2d 100644
--- a/drivers/crypto/ccp/ccp-dev-v3.c
+++ b/drivers/crypto/ccp/ccp-dev-v3.c
@@ -70,6 +70,11 @@ static void ccp_free_ksb(struct ccp_cmd_queue *cmd_q, unsigned int start,
70 wake_up_interruptible_all(&ccp->sb_queue); 70 wake_up_interruptible_all(&ccp->sb_queue);
71} 71}
72 72
73static unsigned int ccp_get_free_slots(struct ccp_cmd_queue *cmd_q)
74{
75 return CMD_Q_DEPTH(ioread32(cmd_q->reg_status));
76}
77
73static int ccp_do_cmd(struct ccp_op *op, u32 *cr, unsigned int cr_count) 78static int ccp_do_cmd(struct ccp_op *op, u32 *cr, unsigned int cr_count)
74{ 79{
75 struct ccp_cmd_queue *cmd_q = op->cmd_q; 80 struct ccp_cmd_queue *cmd_q = op->cmd_q;
@@ -357,7 +362,7 @@ static int ccp_init(struct ccp_device *ccp)
357 cmd_q->int_ok = 1 << (i * 2); 362 cmd_q->int_ok = 1 << (i * 2);
358 cmd_q->int_err = 1 << ((i * 2) + 1); 363 cmd_q->int_err = 1 << ((i * 2) + 1);
359 364
360 cmd_q->free_slots = CMD_Q_DEPTH(ioread32(cmd_q->reg_status)); 365 cmd_q->free_slots = ccp_get_free_slots(cmd_q);
361 366
362 init_waitqueue_head(&cmd_q->int_queue); 367 init_waitqueue_head(&cmd_q->int_queue);
363 368
@@ -559,6 +564,7 @@ static const struct ccp_actions ccp3_actions = {
559 .sbfree = ccp_free_ksb, 564 .sbfree = ccp_free_ksb,
560 .init = ccp_init, 565 .init = ccp_init,
561 .destroy = ccp_destroy, 566 .destroy = ccp_destroy,
567 .get_free_slots = ccp_get_free_slots,
562 .irqhandler = ccp_irq_handler, 568 .irqhandler = ccp_irq_handler,
563}; 569};
564 570
diff --git a/drivers/crypto/ccp/ccp-dev.h b/drivers/crypto/ccp/ccp-dev.h
index 0c44c5e049f5..de907029c6ee 100644
--- a/drivers/crypto/ccp/ccp-dev.h
+++ b/drivers/crypto/ccp/ccp-dev.h
@@ -458,6 +458,7 @@ struct ccp_actions {
458 u32 (*sballoc)(struct ccp_cmd_queue *, unsigned int); 458 u32 (*sballoc)(struct ccp_cmd_queue *, unsigned int);
459 void (*sbfree)(struct ccp_cmd_queue *, unsigned int, 459 void (*sbfree)(struct ccp_cmd_queue *, unsigned int,
460 unsigned int); 460 unsigned int);
461 unsigned int (*get_free_slots)(struct ccp_cmd_queue *);
461 int (*init)(struct ccp_device *); 462 int (*init)(struct ccp_device *);
462 void (*destroy)(struct ccp_device *); 463 void (*destroy)(struct ccp_device *);
463 irqreturn_t (*irqhandler)(int, void *); 464 irqreturn_t (*irqhandler)(int, void *);
diff --git a/drivers/crypto/ccp/ccp-ops.c b/drivers/crypto/ccp/ccp-ops.c
index bd9eb1d4512a..fdab0ae4f7c9 100644
--- a/drivers/crypto/ccp/ccp-ops.c
+++ b/drivers/crypto/ccp/ccp-ops.c
@@ -1765,7 +1765,7 @@ int ccp_run_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
1765 cmd->engine_error = 0; 1765 cmd->engine_error = 0;
1766 cmd_q->cmd_error = 0; 1766 cmd_q->cmd_error = 0;
1767 cmd_q->int_rcvd = 0; 1767 cmd_q->int_rcvd = 0;
1768 cmd_q->free_slots = CMD_Q_DEPTH(ioread32(cmd_q->reg_status)); 1768 cmd_q->free_slots = cmd_q->ccp->vdata->perform->get_free_slots(cmd_q);
1769 1769
1770 switch (cmd->engine) { 1770 switch (cmd->engine) {
1771 case CCP_ENGINE_AES: 1771 case CCP_ENGINE_AES: