Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: ccp - move SEV vdata to a dedicated data structure

PSP can support both SEV and TEE interface. Therefore, move
SEV specific registers to a dedicated data structure.
TEE interface specific registers will be added in a later
patch.

Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Jens Wiklander <jens.wiklander@linaro.org>
Co-developed-by: Devaraj Rangasamy <Devaraj.Rangasamy@amd.com>
Signed-off-by: Devaraj Rangasamy <Devaraj.Rangasamy@amd.com>
Signed-off-by: Rijo Thomas <Rijo-john.Thomas@amd.com>
Acked-by: Gary R Hook <gary.hook@amd.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Rijo Thomas and committed by
Herbert Xu
6eb0cc72 b93566f1

+31 -10
+12 -5
drivers/crypto/ccp/sev-dev.c
··· 67 67 return; 68 68 69 69 /* Check if it is SEV command completion: */ 70 - reg = ioread32(sev->io_regs + sev->psp->vdata->cmdresp_reg); 70 + reg = ioread32(sev->io_regs + sev->vdata->cmdresp_reg); 71 71 if (reg & PSP_CMDRESP_RESP) { 72 72 sev->int_rcvd = 1; 73 73 wake_up(&sev->int_queue); ··· 84 84 if (!ret) 85 85 return -ETIMEDOUT; 86 86 87 - *reg = ioread32(sev->io_regs + sev->psp->vdata->cmdresp_reg); 87 + *reg = ioread32(sev->io_regs + sev->vdata->cmdresp_reg); 88 88 89 89 return 0; 90 90 } ··· 150 150 print_hex_dump_debug("(in): ", DUMP_PREFIX_OFFSET, 16, 2, data, 151 151 sev_cmd_buffer_len(cmd), false); 152 152 153 - iowrite32(phys_lsb, sev->io_regs + psp->vdata->cmdbuff_addr_lo_reg); 154 - iowrite32(phys_msb, sev->io_regs + psp->vdata->cmdbuff_addr_hi_reg); 153 + iowrite32(phys_lsb, sev->io_regs + sev->vdata->cmdbuff_addr_lo_reg); 154 + iowrite32(phys_msb, sev->io_regs + sev->vdata->cmdbuff_addr_hi_reg); 155 155 156 156 sev->int_rcvd = 0; 157 157 158 158 reg = cmd; 159 159 reg <<= SEV_CMDRESP_CMD_SHIFT; 160 160 reg |= SEV_CMDRESP_IOC; 161 - iowrite32(reg, sev->io_regs + psp->vdata->cmdresp_reg); 161 + iowrite32(reg, sev->io_regs + sev->vdata->cmdresp_reg); 162 162 163 163 /* wait for command completion */ 164 164 ret = sev_wait_cmd_ioc(sev, &reg, psp_timeout); ··· 957 957 sev->psp = psp; 958 958 959 959 sev->io_regs = psp->io_regs; 960 + 961 + sev->vdata = (struct sev_vdata *)psp->vdata->sev; 962 + if (!sev->vdata) { 963 + ret = -ENODEV; 964 + dev_err(dev, "sev: missing driver data\n"); 965 + goto e_err; 966 + } 960 967 961 968 psp_set_sev_irq_handler(psp, sev_irq_handler, sev); 962 969
+2
drivers/crypto/ccp/sev-dev.h
··· 40 40 41 41 void __iomem *io_regs; 42 42 43 + struct sev_vdata *vdata; 44 + 43 45 int state; 44 46 unsigned int int_rcvd; 45 47 wait_queue_head_t int_queue;
+5 -1
drivers/crypto/ccp/sp-dev.h
··· 39 39 const unsigned int rsamax; 40 40 }; 41 41 42 - struct psp_vdata { 42 + struct sev_vdata { 43 43 const unsigned int cmdresp_reg; 44 44 const unsigned int cmdbuff_addr_lo_reg; 45 45 const unsigned int cmdbuff_addr_hi_reg; 46 + }; 47 + 48 + struct psp_vdata { 49 + const struct sev_vdata *sev; 46 50 const unsigned int feature_reg; 47 51 const unsigned int inten_reg; 48 52 const unsigned int intsts_reg;
+12 -4
drivers/crypto/ccp/sp-pci.c
··· 262 262 #endif 263 263 264 264 #ifdef CONFIG_CRYPTO_DEV_SP_PSP 265 - static const struct psp_vdata pspv1 = { 265 + static const struct sev_vdata sevv1 = { 266 266 .cmdresp_reg = 0x10580, 267 267 .cmdbuff_addr_lo_reg = 0x105e0, 268 268 .cmdbuff_addr_hi_reg = 0x105e4, 269 + }; 270 + 271 + static const struct sev_vdata sevv2 = { 272 + .cmdresp_reg = 0x10980, 273 + .cmdbuff_addr_lo_reg = 0x109e0, 274 + .cmdbuff_addr_hi_reg = 0x109e4, 275 + }; 276 + 277 + static const struct psp_vdata pspv1 = { 278 + .sev = &sevv1, 269 279 .feature_reg = 0x105fc, 270 280 .inten_reg = 0x10610, 271 281 .intsts_reg = 0x10614, 272 282 }; 273 283 274 284 static const struct psp_vdata pspv2 = { 275 - .cmdresp_reg = 0x10980, 276 - .cmdbuff_addr_lo_reg = 0x109e0, 277 - .cmdbuff_addr_hi_reg = 0x109e4, 285 + .sev = &sevv2, 278 286 .feature_reg = 0x109fc, 279 287 .inten_reg = 0x10690, 280 288 .intsts_reg = 0x10694,