hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/crypto/ccp/sp-pci.c
....@@ -1,14 +1,11 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * AMD Secure Processor device driver
34 *
4
- * Copyright (C) 2013,2016 Advanced Micro Devices, Inc.
5
+ * Copyright (C) 2013,2019 Advanced Micro Devices, Inc.
56 *
67 * Author: Tom Lendacky <thomas.lendacky@amd.com>
78 * Author: Gary R Hook <gary.hook@amd.com>
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License version 2 as
11
- * published by the Free Software Foundation.
129 */
1310
1411 #include <linux/module.h>
....@@ -149,6 +146,14 @@
149146 return sp_dev_master;
150147 }
151148
149
+static void psp_clear_master(struct sp_device *sp)
150
+{
151
+ if (sp == sp_dev_master) {
152
+ sp_dev_master = NULL;
153
+ dev_dbg(sp->dev, "Cleared sp_dev_master\n");
154
+ }
155
+}
156
+
152157 static int sp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
153158 {
154159 struct sp_device *sp;
....@@ -209,6 +214,7 @@
209214 pci_set_master(pdev);
210215 sp->set_psp_master_device = psp_set_master;
211216 sp->get_psp_master_device = psp_get_master;
217
+ sp->clear_psp_master_device = psp_clear_master;
212218
213219 ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(48));
214220 if (ret) {
....@@ -226,8 +232,6 @@
226232 if (ret)
227233 goto free_irqs;
228234
229
- dev_notice(dev, "enabled\n");
230
-
231235 return 0;
232236
233237 free_irqs:
....@@ -235,6 +239,17 @@
235239 e_err:
236240 dev_notice(dev, "initialization failed\n");
237241 return ret;
242
+}
243
+
244
+static void sp_pci_shutdown(struct pci_dev *pdev)
245
+{
246
+ struct device *dev = &pdev->dev;
247
+ struct sp_device *sp = dev_get_drvdata(dev);
248
+
249
+ if (!sp)
250
+ return;
251
+
252
+ sp_destroy(sp);
238253 }
239254
240255 static void sp_pci_remove(struct pci_dev *pdev)
....@@ -248,42 +263,59 @@
248263 sp_destroy(sp);
249264
250265 sp_free_irqs(sp);
251
-
252
- dev_notice(dev, "disabled\n");
253266 }
254267
255
-#ifdef CONFIG_PM
256
-static int sp_pci_suspend(struct pci_dev *pdev, pm_message_t state)
268
+static int __maybe_unused sp_pci_suspend(struct device *dev)
257269 {
258
- struct device *dev = &pdev->dev;
259270 struct sp_device *sp = dev_get_drvdata(dev);
260271
261
- return sp_suspend(sp, state);
272
+ return sp_suspend(sp);
262273 }
263274
264
-static int sp_pci_resume(struct pci_dev *pdev)
275
+static int __maybe_unused sp_pci_resume(struct device *dev)
265276 {
266
- struct device *dev = &pdev->dev;
267277 struct sp_device *sp = dev_get_drvdata(dev);
268278
269279 return sp_resume(sp);
270280 }
271
-#endif
272281
273282 #ifdef CONFIG_CRYPTO_DEV_SP_PSP
274
-static const struct psp_vdata pspv1 = {
283
+static const struct sev_vdata sevv1 = {
275284 .cmdresp_reg = 0x10580,
276285 .cmdbuff_addr_lo_reg = 0x105e0,
277286 .cmdbuff_addr_hi_reg = 0x105e4,
287
+};
288
+
289
+static const struct sev_vdata sevv2 = {
290
+ .cmdresp_reg = 0x10980,
291
+ .cmdbuff_addr_lo_reg = 0x109e0,
292
+ .cmdbuff_addr_hi_reg = 0x109e4,
293
+};
294
+
295
+static const struct tee_vdata teev1 = {
296
+ .cmdresp_reg = 0x10544,
297
+ .cmdbuff_addr_lo_reg = 0x10548,
298
+ .cmdbuff_addr_hi_reg = 0x1054c,
299
+ .ring_wptr_reg = 0x10550,
300
+ .ring_rptr_reg = 0x10554,
301
+};
302
+
303
+static const struct psp_vdata pspv1 = {
304
+ .sev = &sevv1,
278305 .feature_reg = 0x105fc,
279306 .inten_reg = 0x10610,
280307 .intsts_reg = 0x10614,
281308 };
282309
283310 static const struct psp_vdata pspv2 = {
284
- .cmdresp_reg = 0x10980,
285
- .cmdbuff_addr_lo_reg = 0x109e0,
286
- .cmdbuff_addr_hi_reg = 0x109e4,
311
+ .sev = &sevv2,
312
+ .feature_reg = 0x109fc,
313
+ .inten_reg = 0x10690,
314
+ .intsts_reg = 0x10694,
315
+};
316
+
317
+static const struct psp_vdata pspv3 = {
318
+ .tee = &teev1,
287319 .feature_reg = 0x109fc,
288320 .inten_reg = 0x10690,
289321 .intsts_reg = 0x10694,
....@@ -321,26 +353,36 @@
321353 .psp_vdata = &pspv2,
322354 #endif
323355 },
356
+ { /* 4 */
357
+ .bar = 2,
358
+#ifdef CONFIG_CRYPTO_DEV_SP_CCP
359
+ .ccp_vdata = &ccpv5a,
360
+#endif
361
+#ifdef CONFIG_CRYPTO_DEV_SP_PSP
362
+ .psp_vdata = &pspv3,
363
+#endif
364
+ },
324365 };
325366 static const struct pci_device_id sp_pci_table[] = {
326367 { PCI_VDEVICE(AMD, 0x1537), (kernel_ulong_t)&dev_vdata[0] },
327368 { PCI_VDEVICE(AMD, 0x1456), (kernel_ulong_t)&dev_vdata[1] },
328369 { PCI_VDEVICE(AMD, 0x1468), (kernel_ulong_t)&dev_vdata[2] },
329370 { PCI_VDEVICE(AMD, 0x1486), (kernel_ulong_t)&dev_vdata[3] },
371
+ { PCI_VDEVICE(AMD, 0x15DF), (kernel_ulong_t)&dev_vdata[4] },
330372 /* Last entry must be zero */
331373 { 0, }
332374 };
333375 MODULE_DEVICE_TABLE(pci, sp_pci_table);
376
+
377
+static SIMPLE_DEV_PM_OPS(sp_pci_pm_ops, sp_pci_suspend, sp_pci_resume);
334378
335379 static struct pci_driver sp_pci_driver = {
336380 .name = "ccp",
337381 .id_table = sp_pci_table,
338382 .probe = sp_pci_probe,
339383 .remove = sp_pci_remove,
340
-#ifdef CONFIG_PM
341
- .suspend = sp_pci_suspend,
342
- .resume = sp_pci_resume,
343
-#endif
384
+ .shutdown = sp_pci_shutdown,
385
+ .driver.pm = &sp_pci_pm_ops,
344386 };
345387
346388 int sp_pci_init(void)