Re: [PATCH v1 4/5] crypto: ccp: Support register differences between PSP devices

2018-07-05 Thread Brijesh Singh




On 07/03/2018 12:12 PM, Tom Lendacky wrote:

In preparation for adding a new PSP device ID that uses different register
offsets, add support to the PSP version data for register offset values.
And then update the code to use these new register offset values.

Signed-off-by: Tom Lendacky 
---
  drivers/crypto/ccp/psp-dev.c |   24 
  drivers/crypto/ccp/psp-dev.h |9 -
  drivers/crypto/ccp/sp-dev.h  |7 ++-
  drivers/crypto/ccp/sp-pci.c  |7 ++-
  4 files changed, 24 insertions(+), 23 deletions(-)



Reviewed-by: Brijesh Singh 



diff --git a/drivers/crypto/ccp/psp-dev.c b/drivers/crypto/ccp/psp-dev.c
index 875756d..9b59638 100644
--- a/drivers/crypto/ccp/psp-dev.c
+++ b/drivers/crypto/ccp/psp-dev.c
@@ -62,14 +62,14 @@ static irqreturn_t psp_irq_handler(int irq, void *data)
int reg;
  
  	/* Read the interrupt status: */

-   status = ioread32(psp->io_regs + PSP_P2CMSG_INTSTS);
+   status = ioread32(psp->io_regs + psp->vdata->intsts_reg);
  
  	/* Check if it is command completion: */

if (!(status & PSP_CMD_COMPLETE))
goto done;
  
  	/* Check if it is SEV command completion: */

-   reg = ioread32(psp->io_regs + PSP_CMDRESP);
+   reg = ioread32(psp->io_regs + psp->vdata->cmdresp_reg);
if (reg & PSP_CMDRESP_RESP) {
psp->sev_int_rcvd = 1;
wake_up(>sev_int_queue);
@@ -77,7 +77,7 @@ static irqreturn_t psp_irq_handler(int irq, void *data)
  
  done:

/* Clear the interrupt status by writing the same value we read. */
-   iowrite32(status, psp->io_regs + PSP_P2CMSG_INTSTS);
+   iowrite32(status, psp->io_regs + psp->vdata->intsts_reg);
  
  	return IRQ_HANDLED;

  }
@@ -85,7 +85,7 @@ static irqreturn_t psp_irq_handler(int irq, void *data)
  static void sev_wait_cmd_ioc(struct psp_device *psp, unsigned int *reg)
  {
wait_event(psp->sev_int_queue, psp->sev_int_rcvd);
-   *reg = ioread32(psp->io_regs + PSP_CMDRESP);
+   *reg = ioread32(psp->io_regs + psp->vdata->cmdresp_reg);
  }
  
  static int sev_cmd_buffer_len(int cmd)

@@ -143,15 +143,15 @@ static int __sev_do_cmd_locked(int cmd, void *data, int 
*psp_ret)
print_hex_dump_debug("(in):  ", DUMP_PREFIX_OFFSET, 16, 2, data,
 sev_cmd_buffer_len(cmd), false);
  
-	iowrite32(phys_lsb, psp->io_regs + PSP_CMDBUFF_ADDR_LO);

-   iowrite32(phys_msb, psp->io_regs + PSP_CMDBUFF_ADDR_HI);
+   iowrite32(phys_lsb, psp->io_regs + psp->vdata->cmdbuff_addr_lo_reg);
+   iowrite32(phys_msb, psp->io_regs + psp->vdata->cmdbuff_addr_hi_reg);
  
  	psp->sev_int_rcvd = 0;
  
  	reg = cmd;

reg <<= PSP_CMDRESP_CMD_SHIFT;
reg |= PSP_CMDRESP_IOC;
-   iowrite32(reg, psp->io_regs + PSP_CMDRESP);
+   iowrite32(reg, psp->io_regs + psp->vdata->cmdresp_reg);
  
  	/* wait for command completion */

sev_wait_cmd_ioc(psp, );
@@ -789,7 +789,7 @@ static int sev_misc_init(struct psp_device *psp)
  static int sev_init(struct psp_device *psp)
  {
/* Check if device supports SEV feature */
-   if (!(ioread32(psp->io_regs + PSP_FEATURE_REG) & 1)) {
+   if (!(ioread32(psp->io_regs + psp->vdata->feature_reg) & 1)) {
dev_dbg(psp->dev, "device does not support SEV\n");
return 1;
}
@@ -817,11 +817,11 @@ int psp_dev_init(struct sp_device *sp)
goto e_err;
}
  
-	psp->io_regs = sp->io_map + psp->vdata->offset;

+   psp->io_regs = sp->io_map;
  
  	/* Disable and clear interrupts until ready */

-   iowrite32(0, psp->io_regs + PSP_P2CMSG_INTEN);
-   iowrite32(-1, psp->io_regs + PSP_P2CMSG_INTSTS);
+   iowrite32(0, psp->io_regs + psp->vdata->inten_reg);
+   iowrite32(-1, psp->io_regs + psp->vdata->intsts_reg);
  
  	/* Request an irq */

ret = sp_request_psp_irq(psp->sp, psp_irq_handler, psp->name, psp);
@@ -838,7 +838,7 @@ int psp_dev_init(struct sp_device *sp)
sp->set_psp_master_device(sp);
  
  	/* Enable interrupt */

-   iowrite32(-1, psp->io_regs + PSP_P2CMSG_INTEN);
+   iowrite32(-1, psp->io_regs + psp->vdata->inten_reg);
  
  	dev_notice(dev, "psp enabled\n");
  
diff --git a/drivers/crypto/ccp/psp-dev.h b/drivers/crypto/ccp/psp-dev.h

index 5d46a2b..8b53a96 100644
--- a/drivers/crypto/ccp/psp-dev.h
+++ b/drivers/crypto/ccp/psp-dev.h
@@ -30,17 +30,8 @@
  
  #include "sp-dev.h"
  
-#define PSP_C2PMSG(_num)		((_num) << 2)

-#define PSP_CMDRESPPSP_C2PMSG(32)
-#define PSP_CMDBUFF_ADDR_LOPSP_C2PMSG(56)
-#define PSP_CMDBUFF_ADDR_HI PSP_C2PMSG(57)
-#define PSP_FEATURE_REGPSP_C2PMSG(63)
-
  #define PSP_CMD_COMPLETE  BIT(1)
  
-#define PSP_P2CMSG_INTEN		0x0110

-#define PSP_P2CMSG_INTSTS  0x0114
-
  #define PSP_CMDRESP_CMD_SHIFT 16
  #define PSP_CMDRESP_IOC   BIT(0)
  #define PSP_CMDRESP_RESP  BIT(31)
diff 

Re: [PATCH v1 3/5] crypto: ccp: Remove unused #defines

2018-07-05 Thread Brijesh Singh




On 07/03/2018 12:11 PM, Tom Lendacky wrote:

Remove some unused #defines for register offsets that are not used. This
will lessen the changes required when register offsets change between
versions of the device.

Signed-off-by: Tom Lendacky 
---
  drivers/crypto/ccp/psp-dev.c |2 +-
  drivers/crypto/ccp/psp-dev.h |   10 +-
  2 files changed, 2 insertions(+), 10 deletions(-)



Reviewed-by: Brijesh Singh 



diff --git a/drivers/crypto/ccp/psp-dev.c b/drivers/crypto/ccp/psp-dev.c
index 91ef6ed..875756d 100644
--- a/drivers/crypto/ccp/psp-dev.c
+++ b/drivers/crypto/ccp/psp-dev.c
@@ -65,7 +65,7 @@ static irqreturn_t psp_irq_handler(int irq, void *data)
status = ioread32(psp->io_regs + PSP_P2CMSG_INTSTS);
  
  	/* Check if it is command completion: */

-   if (!(status & BIT(PSP_CMD_COMPLETE_REG)))
+   if (!(status & PSP_CMD_COMPLETE))
goto done;
  
  	/* Check if it is SEV command completion: */

diff --git a/drivers/crypto/ccp/psp-dev.h b/drivers/crypto/ccp/psp-dev.h
index c7e9098a..5d46a2b 100644
--- a/drivers/crypto/ccp/psp-dev.h
+++ b/drivers/crypto/ccp/psp-dev.h
@@ -36,19 +36,11 @@
  #define PSP_CMDBUFF_ADDR_HI PSP_C2PMSG(57)
  #define PSP_FEATURE_REG   PSP_C2PMSG(63)
  
-#define PSP_P2CMSG(_num)		((_num) << 2)

-#define PSP_CMD_COMPLETE_REG   1
-#define PSP_CMD_COMPLETE   PSP_P2CMSG(PSP_CMD_COMPLETE_REG)
+#define PSP_CMD_COMPLETE   BIT(1)
  
  #define PSP_P2CMSG_INTEN		0x0110

  #define PSP_P2CMSG_INTSTS 0x0114
  
-#define PSP_C2PMSG_ATTR_0		0x0118

-#define PSP_C2PMSG_ATTR_1  0x011c
-#define PSP_C2PMSG_ATTR_2  0x0120
-#define PSP_C2PMSG_ATTR_3  0x0124
-#define PSP_P2CMSG_ATTR_0  0x0128
-
  #define PSP_CMDRESP_CMD_SHIFT 16
  #define PSP_CMDRESP_IOC   BIT(0)
  #define PSP_CMDRESP_RESP  BIT(31)



Re: [PATCH v1 5/5] crypto: ccp: Add support for new CCP/PSP device ID

2018-07-05 Thread Gary R Hook

On 07/03/2018 12:12 PM, Tom Lendacky wrote:

Add a new CCP/PSP PCI device ID and new PSP register offsets.

Signed-off-by: Tom Lendacky 


Acked-by: Gary R Hook 


---
  drivers/crypto/ccp/sp-pci.c |   29 -
  1 file changed, 24 insertions(+), 5 deletions(-)

diff --git a/drivers/crypto/ccp/sp-pci.c b/drivers/crypto/ccp/sp-pci.c
index 78c1e9d..7da93e9 100644
--- a/drivers/crypto/ccp/sp-pci.c
+++ b/drivers/crypto/ccp/sp-pci.c
@@ -269,7 +269,7 @@ static int sp_pci_resume(struct pci_dev *pdev)
  #endif
  
  #ifdef CONFIG_CRYPTO_DEV_SP_PSP

-static const struct psp_vdata psp_entry = {
+static const struct psp_vdata pspv1 = {
.cmdresp_reg= 0x10580,
.cmdbuff_addr_lo_reg= 0x105e0,
.cmdbuff_addr_hi_reg= 0x105e4,
@@ -277,35 +277,54 @@ static int sp_pci_resume(struct pci_dev *pdev)
.inten_reg  = 0x10610,
.intsts_reg = 0x10614,
  };
+
+static const struct psp_vdata pspv2 = {
+   .cmdresp_reg= 0x10980,
+   .cmdbuff_addr_lo_reg= 0x109e0,
+   .cmdbuff_addr_hi_reg= 0x109e4,
+   .feature_reg= 0x109fc,
+   .inten_reg  = 0x10690,
+   .intsts_reg = 0x10694,
+};
  #endif
  
  static const struct sp_dev_vdata dev_vdata[] = {

-   {
+   {   /* 0 */
.bar = 2,
  #ifdef CONFIG_CRYPTO_DEV_SP_CCP
.ccp_vdata = ,
  #endif
},
-   {
+   {   /* 1 */
.bar = 2,
  #ifdef CONFIG_CRYPTO_DEV_SP_CCP
.ccp_vdata = ,
  #endif
  #ifdef CONFIG_CRYPTO_DEV_SP_PSP
-   .psp_vdata = _entry
+   .psp_vdata = ,
  #endif
},
-   {
+   {   /* 2 */
.bar = 2,
  #ifdef CONFIG_CRYPTO_DEV_SP_CCP
.ccp_vdata = ,
  #endif
},
+   {   /* 3 */
+   .bar = 2,
+#ifdef CONFIG_CRYPTO_DEV_SP_CCP
+   .ccp_vdata = ,
+#endif
+#ifdef CONFIG_CRYPTO_DEV_SP_PSP
+   .psp_vdata = ,
+#endif
+   },
  };
  static const struct pci_device_id sp_pci_table[] = {
{ PCI_VDEVICE(AMD, 0x1537), (kernel_ulong_t)_vdata[0] },
{ PCI_VDEVICE(AMD, 0x1456), (kernel_ulong_t)_vdata[1] },
{ PCI_VDEVICE(AMD, 0x1468), (kernel_ulong_t)_vdata[2] },
+   { PCI_VDEVICE(AMD, 0x1486), (kernel_ulong_t)_vdata[3] },
/* Last entry must be zero */
{ 0, }
  };





Re: [PATCH v1 1/5] crypto: ccp: Fix command completion detection race

2018-07-05 Thread Gary R Hook

On 07/05/2018 10:43 AM, Brijesh Singh wrote:



On 07/03/2018 12:11 PM, Tom Lendacky wrote:

The wait_event() function is used to detect command completion.  The
interrupt handler will set the wait condition variable when the interrupt
is triggered.  However, the variable used for wait_event() is initialized
after the command has been submitted, which can create a race condition
with the interrupt handler and result in the wait_event() never 
returning.

Move the initialization of the wait condition variable to just before
command submission.

Fixes: 200664d5237f ("crypto: ccp: Add Secure Encrypted Virtualization 
(SEV) command support")

Cc:  # 4.16.x-
Signed-off-by: Tom Lendacky 
---


Reviewed-by: Brijesh Singh 


Acked-by: Gary R Hook 





  drivers/crypto/ccp/psp-dev.c |    4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/crypto/ccp/psp-dev.c b/drivers/crypto/ccp/psp-dev.c
index ff478d8..973d683 100644
--- a/drivers/crypto/ccp/psp-dev.c
+++ b/drivers/crypto/ccp/psp-dev.c
@@ -84,8 +84,6 @@ static irqreturn_t psp_irq_handler(int irq, void *data)
  static void sev_wait_cmd_ioc(struct psp_device *psp, unsigned int *reg)
  {
-    psp->sev_int_rcvd = 0;
-
  wait_event(psp->sev_int_queue, psp->sev_int_rcvd);
  *reg = ioread32(psp->io_regs + PSP_CMDRESP);
  }
@@ -148,6 +146,8 @@ static int __sev_do_cmd_locked(int cmd, void 
*data, int *psp_ret)

  iowrite32(phys_lsb, psp->io_regs + PSP_CMDBUFF_ADDR_LO);
  iowrite32(phys_msb, psp->io_regs + PSP_CMDBUFF_ADDR_HI);
+    psp->sev_int_rcvd = 0;
+
  reg = cmd;
  reg <<= PSP_CMDRESP_CMD_SHIFT;
  reg |= PSP_CMDRESP_IOC;





Re: [PATCH v1 4/5] crypto: ccp: Support register differences between PSP devices

2018-07-05 Thread Gary R Hook

On 07/03/2018 12:12 PM, Tom Lendacky wrote:

In preparation for adding a new PSP device ID that uses different register
offsets, add support to the PSP version data for register offset values.
And then update the code to use these new register offset values.

Signed-off-by: Tom Lendacky 


Acked-by: Gary R Hook 


---
  drivers/crypto/ccp/psp-dev.c |   24 
  drivers/crypto/ccp/psp-dev.h |9 -
  drivers/crypto/ccp/sp-dev.h  |7 ++-
  drivers/crypto/ccp/sp-pci.c  |7 ++-
  4 files changed, 24 insertions(+), 23 deletions(-)

diff --git a/drivers/crypto/ccp/psp-dev.c b/drivers/crypto/ccp/psp-dev.c
index 875756d..9b59638 100644
--- a/drivers/crypto/ccp/psp-dev.c
+++ b/drivers/crypto/ccp/psp-dev.c
@@ -62,14 +62,14 @@ static irqreturn_t psp_irq_handler(int irq, void *data)
int reg;
  
  	/* Read the interrupt status: */

-   status = ioread32(psp->io_regs + PSP_P2CMSG_INTSTS);
+   status = ioread32(psp->io_regs + psp->vdata->intsts_reg);
  
  	/* Check if it is command completion: */

if (!(status & PSP_CMD_COMPLETE))
goto done;
  
  	/* Check if it is SEV command completion: */

-   reg = ioread32(psp->io_regs + PSP_CMDRESP);
+   reg = ioread32(psp->io_regs + psp->vdata->cmdresp_reg);
if (reg & PSP_CMDRESP_RESP) {
psp->sev_int_rcvd = 1;
wake_up(>sev_int_queue);
@@ -77,7 +77,7 @@ static irqreturn_t psp_irq_handler(int irq, void *data)
  
  done:

/* Clear the interrupt status by writing the same value we read. */
-   iowrite32(status, psp->io_regs + PSP_P2CMSG_INTSTS);
+   iowrite32(status, psp->io_regs + psp->vdata->intsts_reg);
  
  	return IRQ_HANDLED;

  }
@@ -85,7 +85,7 @@ static irqreturn_t psp_irq_handler(int irq, void *data)
  static void sev_wait_cmd_ioc(struct psp_device *psp, unsigned int *reg)
  {
wait_event(psp->sev_int_queue, psp->sev_int_rcvd);
-   *reg = ioread32(psp->io_regs + PSP_CMDRESP);
+   *reg = ioread32(psp->io_regs + psp->vdata->cmdresp_reg);
  }
  
  static int sev_cmd_buffer_len(int cmd)

@@ -143,15 +143,15 @@ static int __sev_do_cmd_locked(int cmd, void *data, int 
*psp_ret)
print_hex_dump_debug("(in):  ", DUMP_PREFIX_OFFSET, 16, 2, data,
 sev_cmd_buffer_len(cmd), false);
  
-	iowrite32(phys_lsb, psp->io_regs + PSP_CMDBUFF_ADDR_LO);

-   iowrite32(phys_msb, psp->io_regs + PSP_CMDBUFF_ADDR_HI);
+   iowrite32(phys_lsb, psp->io_regs + psp->vdata->cmdbuff_addr_lo_reg);
+   iowrite32(phys_msb, psp->io_regs + psp->vdata->cmdbuff_addr_hi_reg);
  
  	psp->sev_int_rcvd = 0;
  
  	reg = cmd;

reg <<= PSP_CMDRESP_CMD_SHIFT;
reg |= PSP_CMDRESP_IOC;
-   iowrite32(reg, psp->io_regs + PSP_CMDRESP);
+   iowrite32(reg, psp->io_regs + psp->vdata->cmdresp_reg);
  
  	/* wait for command completion */

sev_wait_cmd_ioc(psp, );
@@ -789,7 +789,7 @@ static int sev_misc_init(struct psp_device *psp)
  static int sev_init(struct psp_device *psp)
  {
/* Check if device supports SEV feature */
-   if (!(ioread32(psp->io_regs + PSP_FEATURE_REG) & 1)) {
+   if (!(ioread32(psp->io_regs + psp->vdata->feature_reg) & 1)) {
dev_dbg(psp->dev, "device does not support SEV\n");
return 1;
}
@@ -817,11 +817,11 @@ int psp_dev_init(struct sp_device *sp)
goto e_err;
}
  
-	psp->io_regs = sp->io_map + psp->vdata->offset;

+   psp->io_regs = sp->io_map;
  
  	/* Disable and clear interrupts until ready */

-   iowrite32(0, psp->io_regs + PSP_P2CMSG_INTEN);
-   iowrite32(-1, psp->io_regs + PSP_P2CMSG_INTSTS);
+   iowrite32(0, psp->io_regs + psp->vdata->inten_reg);
+   iowrite32(-1, psp->io_regs + psp->vdata->intsts_reg);
  
  	/* Request an irq */

ret = sp_request_psp_irq(psp->sp, psp_irq_handler, psp->name, psp);
@@ -838,7 +838,7 @@ int psp_dev_init(struct sp_device *sp)
sp->set_psp_master_device(sp);
  
  	/* Enable interrupt */

-   iowrite32(-1, psp->io_regs + PSP_P2CMSG_INTEN);
+   iowrite32(-1, psp->io_regs + psp->vdata->inten_reg);
  
  	dev_notice(dev, "psp enabled\n");
  
diff --git a/drivers/crypto/ccp/psp-dev.h b/drivers/crypto/ccp/psp-dev.h

index 5d46a2b..8b53a96 100644
--- a/drivers/crypto/ccp/psp-dev.h
+++ b/drivers/crypto/ccp/psp-dev.h
@@ -30,17 +30,8 @@
  
  #include "sp-dev.h"
  
-#define PSP_C2PMSG(_num)		((_num) << 2)

-#define PSP_CMDRESPPSP_C2PMSG(32)
-#define PSP_CMDBUFF_ADDR_LOPSP_C2PMSG(56)
-#define PSP_CMDBUFF_ADDR_HI PSP_C2PMSG(57)
-#define PSP_FEATURE_REGPSP_C2PMSG(63)
-
  #define PSP_CMD_COMPLETE  BIT(1)
  
-#define PSP_P2CMSG_INTEN		0x0110

-#define PSP_P2CMSG_INTSTS  0x0114
-
  #define PSP_CMDRESP_CMD_SHIFT 16
  #define PSP_CMDRESP_IOC   BIT(0)
  #define PSP_CMDRESP_RESP  BIT(31)
diff --git 

Re: [PATCH v1 3/5] crypto: ccp: Remove unused #defines

2018-07-05 Thread Gary R Hook

On 07/03/2018 12:11 PM, Tom Lendacky wrote:

Remove some unused #defines for register offsets that are not used. This
will lessen the changes required when register offsets change between
versions of the device.

Signed-off-by: Tom Lendacky 


Acked-by: Gary R Hook 


---
  drivers/crypto/ccp/psp-dev.c |2 +-
  drivers/crypto/ccp/psp-dev.h |   10 +-
  2 files changed, 2 insertions(+), 10 deletions(-)

diff --git a/drivers/crypto/ccp/psp-dev.c b/drivers/crypto/ccp/psp-dev.c
index 91ef6ed..875756d 100644
--- a/drivers/crypto/ccp/psp-dev.c
+++ b/drivers/crypto/ccp/psp-dev.c
@@ -65,7 +65,7 @@ static irqreturn_t psp_irq_handler(int irq, void *data)
status = ioread32(psp->io_regs + PSP_P2CMSG_INTSTS);
  
  	/* Check if it is command completion: */

-   if (!(status & BIT(PSP_CMD_COMPLETE_REG)))
+   if (!(status & PSP_CMD_COMPLETE))
goto done;
  
  	/* Check if it is SEV command completion: */

diff --git a/drivers/crypto/ccp/psp-dev.h b/drivers/crypto/ccp/psp-dev.h
index c7e9098a..5d46a2b 100644
--- a/drivers/crypto/ccp/psp-dev.h
+++ b/drivers/crypto/ccp/psp-dev.h
@@ -36,19 +36,11 @@
  #define PSP_CMDBUFF_ADDR_HI PSP_C2PMSG(57)
  #define PSP_FEATURE_REG   PSP_C2PMSG(63)
  
-#define PSP_P2CMSG(_num)		((_num) << 2)

-#define PSP_CMD_COMPLETE_REG   1
-#define PSP_CMD_COMPLETE   PSP_P2CMSG(PSP_CMD_COMPLETE_REG)
+#define PSP_CMD_COMPLETE   BIT(1)
  
  #define PSP_P2CMSG_INTEN		0x0110

  #define PSP_P2CMSG_INTSTS 0x0114
  
-#define PSP_C2PMSG_ATTR_0		0x0118

-#define PSP_C2PMSG_ATTR_1  0x011c
-#define PSP_C2PMSG_ATTR_2  0x0120
-#define PSP_C2PMSG_ATTR_3  0x0124
-#define PSP_P2CMSG_ATTR_0  0x0128
-
  #define PSP_CMDRESP_CMD_SHIFT 16
  #define PSP_CMDRESP_IOC   BIT(0)
  #define PSP_CMDRESP_RESP  BIT(31)





Re: [PATCH v1 2/5] crypto: ccp: Add psp enabled message when initialization succeeds

2018-07-05 Thread Gary R Hook

On 07/03/2018 12:11 PM, Tom Lendacky wrote:

Add a dev_notice() message to the PSP initialization to report when the
PSP initialization has succeeded and the PSP is enabled.

Signed-off-by: Tom Lendacky 


Acked-by: Gary R Hook 


---
  drivers/crypto/ccp/psp-dev.c |2 ++
  1 file changed, 2 insertions(+)

diff --git a/drivers/crypto/ccp/psp-dev.c b/drivers/crypto/ccp/psp-dev.c
index 973d683..91ef6ed 100644
--- a/drivers/crypto/ccp/psp-dev.c
+++ b/drivers/crypto/ccp/psp-dev.c
@@ -840,6 +840,8 @@ int psp_dev_init(struct sp_device *sp)
/* Enable interrupt */
iowrite32(-1, psp->io_regs + PSP_P2CMSG_INTEN);
  
+	dev_notice(dev, "psp enabled\n");

+
return 0;
  
  e_irq:






Re: [PATCH v1 1/5] crypto: ccp: Fix command completion detection race

2018-07-05 Thread Gary R Hook

On 07/03/2018 12:11 PM, Tom Lendacky wrote:

The wait_event() function is used to detect command completion.  The
interrupt handler will set the wait condition variable when the interrupt
is triggered.  However, the variable used for wait_event() is initialized
after the command has been submitted, which can create a race condition
with the interrupt handler and result in the wait_event() never returning.
Move the initialization of the wait condition variable to just before
command submission.

Fixes: 200664d5237f ("crypto: ccp: Add Secure Encrypted Virtualization (SEV) command 
support")
Cc:  # 4.16.x-
Signed-off-by: Tom Lendacky 


Acked-by: Gary R Hook 


---
  drivers/crypto/ccp/psp-dev.c |4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/crypto/ccp/psp-dev.c b/drivers/crypto/ccp/psp-dev.c
index ff478d8..973d683 100644
--- a/drivers/crypto/ccp/psp-dev.c
+++ b/drivers/crypto/ccp/psp-dev.c
@@ -84,8 +84,6 @@ static irqreturn_t psp_irq_handler(int irq, void *data)
  
  static void sev_wait_cmd_ioc(struct psp_device *psp, unsigned int *reg)

  {
-   psp->sev_int_rcvd = 0;
-
wait_event(psp->sev_int_queue, psp->sev_int_rcvd);
*reg = ioread32(psp->io_regs + PSP_CMDRESP);
  }
@@ -148,6 +146,8 @@ static int __sev_do_cmd_locked(int cmd, void *data, int 
*psp_ret)
iowrite32(phys_lsb, psp->io_regs + PSP_CMDBUFF_ADDR_LO);
iowrite32(phys_msb, psp->io_regs + PSP_CMDBUFF_ADDR_HI);
  
+	psp->sev_int_rcvd = 0;

+
reg = cmd;
reg <<= PSP_CMDRESP_CMD_SHIFT;
reg |= PSP_CMDRESP_IOC;





Re: [PATCH v1 1/5] crypto: ccp: Fix command completion detection race

2018-07-05 Thread Brijesh Singh




On 07/03/2018 12:11 PM, Tom Lendacky wrote:

The wait_event() function is used to detect command completion.  The
interrupt handler will set the wait condition variable when the interrupt
is triggered.  However, the variable used for wait_event() is initialized
after the command has been submitted, which can create a race condition
with the interrupt handler and result in the wait_event() never returning.
Move the initialization of the wait condition variable to just before
command submission.

Fixes: 200664d5237f ("crypto: ccp: Add Secure Encrypted Virtualization (SEV) command 
support")
Cc:  # 4.16.x-
Signed-off-by: Tom Lendacky 
---


Reviewed-by: Brijesh Singh 



  drivers/crypto/ccp/psp-dev.c |4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/crypto/ccp/psp-dev.c b/drivers/crypto/ccp/psp-dev.c
index ff478d8..973d683 100644
--- a/drivers/crypto/ccp/psp-dev.c
+++ b/drivers/crypto/ccp/psp-dev.c
@@ -84,8 +84,6 @@ static irqreturn_t psp_irq_handler(int irq, void *data)
  
  static void sev_wait_cmd_ioc(struct psp_device *psp, unsigned int *reg)

  {
-   psp->sev_int_rcvd = 0;
-
wait_event(psp->sev_int_queue, psp->sev_int_rcvd);
*reg = ioread32(psp->io_regs + PSP_CMDRESP);
  }
@@ -148,6 +146,8 @@ static int __sev_do_cmd_locked(int cmd, void *data, int 
*psp_ret)
iowrite32(phys_lsb, psp->io_regs + PSP_CMDBUFF_ADDR_LO);
iowrite32(phys_msb, psp->io_regs + PSP_CMDBUFF_ADDR_HI);
  
+	psp->sev_int_rcvd = 0;

+
reg = cmd;
reg <<= PSP_CMDRESP_CMD_SHIFT;
reg |= PSP_CMDRESP_IOC;