1 // SPDX-License-Identifier: GPL-2.0-only
3 * AMD Platform Security Processor (PSP) interface
5 * Copyright (C) 2016,2019 Advanced Micro Devices, Inc.
7 * Author: Brijesh Singh <brijesh.singh@amd.com>
10 #include <linux/kernel.h>
11 #include <linux/irqreturn.h>
18 struct psp_device
*psp_master
;
20 static struct psp_device
*psp_alloc_struct(struct sp_device
*sp
)
22 struct device
*dev
= sp
->dev
;
23 struct psp_device
*psp
;
25 psp
= devm_kzalloc(dev
, sizeof(*psp
), GFP_KERNEL
);
32 snprintf(psp
->name
, sizeof(psp
->name
), "psp-%u", sp
->ord
);
37 static irqreturn_t
psp_irq_handler(int irq
, void *data
)
39 struct psp_device
*psp
= data
;
42 /* Read the interrupt status: */
43 status
= ioread32(psp
->io_regs
+ psp
->vdata
->intsts_reg
);
45 /* invoke subdevice interrupt handlers */
47 if (psp
->sev_irq_handler
)
48 psp
->sev_irq_handler(irq
, psp
->sev_irq_data
, status
);
50 if (psp
->tee_irq_handler
)
51 psp
->tee_irq_handler(irq
, psp
->tee_irq_data
, status
);
54 /* Clear the interrupt status by writing the same value we read. */
55 iowrite32(status
, psp
->io_regs
+ psp
->vdata
->intsts_reg
);
60 static unsigned int psp_get_capability(struct psp_device
*psp
)
62 unsigned int val
= ioread32(psp
->io_regs
+ psp
->vdata
->feature_reg
);
65 * Check for a access to the registers. If this read returns
66 * 0xffffffff, it's likely that the system is running a broken
67 * BIOS which disallows access to the device. Stop here and
68 * fail the PSP initialization (but not the load, as the CCP
69 * could get properly initialized).
71 if (val
== 0xffffffff) {
72 dev_notice(psp
->dev
, "psp: unable to access the device: you might be running a broken BIOS.\n");
79 static int psp_check_sev_support(struct psp_device
*psp
,
80 unsigned int capability
)
82 /* Check if device supports SEV feature */
83 if (!(capability
& 1)) {
84 dev_dbg(psp
->dev
, "psp does not support SEV\n");
91 static int psp_check_tee_support(struct psp_device
*psp
,
92 unsigned int capability
)
94 /* Check if device supports TEE feature */
95 if (!(capability
& 2)) {
96 dev_dbg(psp
->dev
, "psp does not support TEE\n");
103 static int psp_check_support(struct psp_device
*psp
,
104 unsigned int capability
)
106 int sev_support
= psp_check_sev_support(psp
, capability
);
107 int tee_support
= psp_check_tee_support(psp
, capability
);
109 /* Return error if device neither supports SEV nor TEE */
110 if (sev_support
&& tee_support
)
116 static int psp_init(struct psp_device
*psp
, unsigned int capability
)
120 if (!psp_check_sev_support(psp
, capability
)) {
121 ret
= sev_dev_init(psp
);
126 if (!psp_check_tee_support(psp
, capability
)) {
127 ret
= tee_dev_init(psp
);
135 int psp_dev_init(struct sp_device
*sp
)
137 struct device
*dev
= sp
->dev
;
138 struct psp_device
*psp
;
139 unsigned int capability
;
143 psp
= psp_alloc_struct(sp
);
149 psp
->vdata
= (struct psp_vdata
*)sp
->dev_vdata
->psp_vdata
;
152 dev_err(dev
, "missing driver data\n");
156 psp
->io_regs
= sp
->io_map
;
158 capability
= psp_get_capability(psp
);
162 ret
= psp_check_support(psp
, capability
);
166 /* Disable and clear interrupts until ready */
167 iowrite32(0, psp
->io_regs
+ psp
->vdata
->inten_reg
);
168 iowrite32(-1, psp
->io_regs
+ psp
->vdata
->intsts_reg
);
171 ret
= sp_request_psp_irq(psp
->sp
, psp_irq_handler
, psp
->name
, psp
);
173 dev_err(dev
, "psp: unable to allocate an IRQ\n");
177 ret
= psp_init(psp
, capability
);
181 if (sp
->set_psp_master_device
)
182 sp
->set_psp_master_device(sp
);
184 /* Enable interrupt */
185 iowrite32(-1, psp
->io_regs
+ psp
->vdata
->inten_reg
);
187 dev_notice(dev
, "psp enabled\n");
192 sp_free_psp_irq(psp
->sp
, psp
);
196 dev_notice(dev
, "psp initialization failed\n");
206 void psp_dev_destroy(struct sp_device
*sp
)
208 struct psp_device
*psp
= sp
->psp_data
;
213 sev_dev_destroy(psp
);
215 tee_dev_destroy(psp
);
217 sp_free_psp_irq(sp
, psp
);
220 void psp_set_sev_irq_handler(struct psp_device
*psp
, psp_irq_handler_t handler
,
223 psp
->sev_irq_data
= data
;
224 psp
->sev_irq_handler
= handler
;
227 void psp_clear_sev_irq_handler(struct psp_device
*psp
)
229 psp_set_sev_irq_handler(psp
, NULL
, NULL
);
232 void psp_set_tee_irq_handler(struct psp_device
*psp
, psp_irq_handler_t handler
,
235 psp
->tee_irq_data
= data
;
236 psp
->tee_irq_handler
= handler
;
239 void psp_clear_tee_irq_handler(struct psp_device
*psp
)
241 psp_set_tee_irq_handler(psp
, NULL
, NULL
);
244 struct psp_device
*psp_get_master_device(void)
246 struct sp_device
*sp
= sp_get_psp_master_device();
248 return sp
? sp
->psp_data
: NULL
;
251 void psp_pci_init(void)
253 psp_master
= psp_get_master_device();
261 void psp_pci_exit(void)