blob: 8abe9ea7e76f759d975ba1cb9770f3e9b0ec7b97 [file] [log] [blame]
Thomas Gleixnerd2912cb2019-06-04 10:11:33 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Brijesh Singh720419f2017-07-06 09:59:14 -05002/*
3 * AMD Secure Processor driver
4 *
Hook, Garyfa5cd1c2018-12-18 15:48:29 +00005 * Copyright (C) 2017-2018 Advanced Micro Devices, Inc.
Brijesh Singh720419f2017-07-06 09:59:14 -05006 *
7 * Author: Tom Lendacky <thomas.lendacky@amd.com>
8 * Author: Gary R Hook <gary.hook@amd.com>
9 * Author: Brijesh Singh <brijesh.singh@amd.com>
Brijesh Singh720419f2017-07-06 09:59:14 -050010 */
11
12#ifndef __SP_DEV_H__
13#define __SP_DEV_H__
14
15#include <linux/device.h>
16#include <linux/pci.h>
17#include <linux/spinlock.h>
18#include <linux/mutex.h>
19#include <linux/list.h>
20#include <linux/wait.h>
21#include <linux/dmapool.h>
22#include <linux/hw_random.h>
23#include <linux/bitops.h>
24#include <linux/interrupt.h>
25#include <linux/irqreturn.h>
26
27#define SP_MAX_NAME_LEN 32
28
29#define CACHE_NONE 0x00
30#define CACHE_WB_NO_ALLOC 0xb7
31
32/* Structure to hold CCP device data */
33struct ccp_device;
34struct ccp_vdata {
35 const unsigned int version;
36 const unsigned int dma_chan_attr;
37 void (*setup)(struct ccp_device *);
38 const struct ccp_actions *perform;
39 const unsigned int offset;
Gary R Hooke28c1902017-07-17 15:16:42 -050040 const unsigned int rsamax;
Brijesh Singh720419f2017-07-06 09:59:14 -050041};
Brijesh Singh2a6170d2017-12-04 10:57:28 -060042
43struct psp_vdata {
Tom Lendackyad01a982018-07-03 12:12:03 -050044 const unsigned int cmdresp_reg;
45 const unsigned int cmdbuff_addr_lo_reg;
46 const unsigned int cmdbuff_addr_hi_reg;
47 const unsigned int feature_reg;
48 const unsigned int inten_reg;
49 const unsigned int intsts_reg;
Brijesh Singh2a6170d2017-12-04 10:57:28 -060050};
51
Brijesh Singh720419f2017-07-06 09:59:14 -050052/* Structure to hold SP device data */
53struct sp_dev_vdata {
54 const unsigned int bar;
55
56 const struct ccp_vdata *ccp_vdata;
Brijesh Singh2a6170d2017-12-04 10:57:28 -060057 const struct psp_vdata *psp_vdata;
Brijesh Singh720419f2017-07-06 09:59:14 -050058};
59
60struct sp_device {
61 struct list_head entry;
62
63 struct device *dev;
64
65 struct sp_dev_vdata *dev_vdata;
66 unsigned int ord;
67 char name[SP_MAX_NAME_LEN];
68
69 /* Bus specific device information */
70 void *dev_specific;
71
72 /* I/O area used for device communication. */
73 void __iomem *io_map;
74
75 /* DMA caching attribute support */
76 unsigned int axcache;
77
Brijesh Singh2a6170d2017-12-04 10:57:28 -060078 /* get and set master device */
79 struct sp_device*(*get_psp_master_device)(void);
80 void (*set_psp_master_device)(struct sp_device *);
81
Brijesh Singh720419f2017-07-06 09:59:14 -050082 bool irq_registered;
Brijesh Singhf4d18d62017-07-06 09:59:15 -050083 bool use_tasklet;
Brijesh Singh720419f2017-07-06 09:59:14 -050084
Brijesh Singhf4d18d62017-07-06 09:59:15 -050085 unsigned int ccp_irq;
86 irq_handler_t ccp_irq_handler;
87 void *ccp_irq_data;
88
89 unsigned int psp_irq;
90 irq_handler_t psp_irq_handler;
91 void *psp_irq_data;
Brijesh Singh720419f2017-07-06 09:59:14 -050092
93 void *ccp_data;
94 void *psp_data;
95};
96
97int sp_pci_init(void);
98void sp_pci_exit(void);
99
100int sp_platform_init(void);
101void sp_platform_exit(void);
102
103struct sp_device *sp_alloc_struct(struct device *dev);
104
105int sp_init(struct sp_device *sp);
106void sp_destroy(struct sp_device *sp);
107struct sp_device *sp_get_master(void);
108
109int sp_suspend(struct sp_device *sp, pm_message_t state);
110int sp_resume(struct sp_device *sp);
Brijesh Singhf4d18d62017-07-06 09:59:15 -0500111int sp_request_ccp_irq(struct sp_device *sp, irq_handler_t handler,
112 const char *name, void *data);
113void sp_free_ccp_irq(struct sp_device *sp, void *data);
114int sp_request_psp_irq(struct sp_device *sp, irq_handler_t handler,
115 const char *name, void *data);
116void sp_free_psp_irq(struct sp_device *sp, void *data);
Brijesh Singh2a6170d2017-12-04 10:57:28 -0600117struct sp_device *sp_get_psp_master_device(void);
Brijesh Singh720419f2017-07-06 09:59:14 -0500118
119#ifdef CONFIG_CRYPTO_DEV_SP_CCP
120
121int ccp_dev_init(struct sp_device *sp);
122void ccp_dev_destroy(struct sp_device *sp);
123
124int ccp_dev_suspend(struct sp_device *sp, pm_message_t state);
125int ccp_dev_resume(struct sp_device *sp);
126
127#else /* !CONFIG_CRYPTO_DEV_SP_CCP */
128
129static inline int ccp_dev_init(struct sp_device *sp)
130{
131 return 0;
132}
133static inline void ccp_dev_destroy(struct sp_device *sp) { }
134
135static inline int ccp_dev_suspend(struct sp_device *sp, pm_message_t state)
136{
137 return 0;
138}
139static inline int ccp_dev_resume(struct sp_device *sp)
140{
141 return 0;
142}
143#endif /* CONFIG_CRYPTO_DEV_SP_CCP */
144
Brijesh Singh2a6170d2017-12-04 10:57:28 -0600145#ifdef CONFIG_CRYPTO_DEV_SP_PSP
146
147int psp_dev_init(struct sp_device *sp);
Brijesh Singh200664d2017-12-04 10:57:28 -0600148void psp_pci_init(void);
Brijesh Singh2a6170d2017-12-04 10:57:28 -0600149void psp_dev_destroy(struct sp_device *sp);
Brijesh Singh200664d2017-12-04 10:57:28 -0600150void psp_pci_exit(void);
Brijesh Singh2a6170d2017-12-04 10:57:28 -0600151
152#else /* !CONFIG_CRYPTO_DEV_SP_PSP */
153
154static inline int psp_dev_init(struct sp_device *sp) { return 0; }
Brijesh Singh200664d2017-12-04 10:57:28 -0600155static inline void psp_pci_init(void) { }
Brijesh Singh2a6170d2017-12-04 10:57:28 -0600156static inline void psp_dev_destroy(struct sp_device *sp) { }
Brijesh Singh200664d2017-12-04 10:57:28 -0600157static inline void psp_pci_exit(void) { }
Brijesh Singh2a6170d2017-12-04 10:57:28 -0600158
159#endif /* CONFIG_CRYPTO_DEV_SP_PSP */
160
Brijesh Singh720419f2017-07-06 09:59:14 -0500161#endif