1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * AMD Platform Security Processor (PSP) interface driver 4 * 5 * Copyright (C) 2017-2019 Advanced Micro Devices, Inc. 6 * 7 * Author: Brijesh Singh <brijesh.singh@amd.com> 8 */ 9 10 #ifndef __PSP_DEV_H__ 11 #define __PSP_DEV_H__ 12 13 #include <linux/device.h> 14 #include <linux/list.h> 15 #include <linux/bits.h> 16 #include <linux/interrupt.h> 17 #include <linux/mutex.h> 18 #include <linux/psp.h> 19 #include <linux/psp-platform-access.h> 20 21 #include "sp-dev.h" 22 23 #define MAX_PSP_NAME_LEN 16 24 25 extern struct psp_device *psp_master; 26 27 typedef void (*psp_irq_handler_t)(int, void *, unsigned int); 28 29 union psp_cap_register { 30 unsigned int raw; 31 struct { 32 unsigned int sev :1, 33 tee :1, 34 dbc_thru_ext :1, 35 sfs :1, 36 rsvd1 :3, 37 security_reporting :1, 38 fused_part :1, 39 rsvd2 :1, 40 debug_lock_on :1, 41 rsvd3 :2, 42 tsme_status :1, 43 rsvd4 :1, 44 anti_rollback_status :1, 45 rpmc_production_enabled :1, 46 rpmc_spirom_available :1, 47 hsp_tpm_available :1, 48 rom_armor_enforced :1, 49 rsvd5 :12; 50 }; 51 }; 52 53 struct psp_device { 54 struct list_head entry; 55 56 struct psp_vdata *vdata; 57 char name[MAX_PSP_NAME_LEN]; 58 59 struct device *dev; 60 struct sp_device *sp; 61 62 void __iomem *io_regs; 63 struct mutex mailbox_mutex; 64 65 psp_irq_handler_t sev_irq_handler; 66 void *sev_irq_data; 67 68 void *sev_data; 69 void *tee_data; 70 void *platform_access_data; 71 void *dbc_data; 72 void *sfs_data; 73 74 union psp_cap_register capability; 75 }; 76 77 void psp_set_sev_irq_handler(struct psp_device *psp, psp_irq_handler_t handler, 78 void *data); 79 void psp_clear_sev_irq_handler(struct psp_device *psp); 80 81 struct psp_device *psp_get_master_device(void); 82 83 /** 84 * enum psp_cmd - PSP mailbox commands 85 * @PSP_CMD_TEE_RING_INIT: Initialize TEE ring buffer 86 * @PSP_CMD_TEE_RING_DESTROY: Destroy TEE ring buffer 87 * @PSP_CMD_TEE_EXTENDED_CMD: Extended command 88 * @PSP_CMD_MAX: Maximum command id 89 */ 90 enum psp_cmd { 91 PSP_CMD_TEE_RING_INIT = 1, 92 PSP_CMD_TEE_RING_DESTROY = 2, 93 PSP_CMD_TEE_EXTENDED_CMD = 14, 94 PSP_CMD_MAX = 15, 95 }; 96 97 int psp_mailbox_command(struct psp_device *psp, enum psp_cmd cmd, void *cmdbuff, 98 unsigned int timeout_msecs, unsigned int *cmdresp); 99 100 /** 101 * struct psp_ext_req_buffer_hdr - Structure of the extended command header 102 * @payload_size: total payload size 103 * @sub_cmd_id: extended command ID 104 * @status: status of command execution (out) 105 */ 106 struct psp_ext_req_buffer_hdr { 107 u32 payload_size; 108 u32 sub_cmd_id; 109 u32 status; 110 } __packed; 111 112 struct psp_ext_request { 113 struct psp_ext_req_buffer_hdr header; 114 void *buf; 115 } __packed; 116 117 /** 118 * enum psp_sub_cmd - PSP mailbox sub commands 119 * @PSP_SUB_CMD_DBC_GET_NONCE: Get nonce from DBC 120 * @PSP_SUB_CMD_DBC_SET_UID: Set UID for DBC 121 * @PSP_SUB_CMD_DBC_GET_PARAMETER: Get parameter from DBC 122 * @PSP_SUB_CMD_DBC_SET_PARAMETER: Set parameter for DBC 123 * @PSP_SUB_CMD_SFS_GET_FW_VERS: Get firmware versions for ASP and other MP 124 * @PSP_SUB_CMD_SFS_UPDATE: Command to load, verify and execute SFS package 125 */ 126 enum psp_sub_cmd { 127 PSP_SUB_CMD_DBC_GET_NONCE = PSP_DYNAMIC_BOOST_GET_NONCE, 128 PSP_SUB_CMD_DBC_SET_UID = PSP_DYNAMIC_BOOST_SET_UID, 129 PSP_SUB_CMD_DBC_GET_PARAMETER = PSP_DYNAMIC_BOOST_GET_PARAMETER, 130 PSP_SUB_CMD_DBC_SET_PARAMETER = PSP_DYNAMIC_BOOST_SET_PARAMETER, 131 PSP_SUB_CMD_SFS_GET_FW_VERS = PSP_SFS_GET_FW_VERSIONS, 132 PSP_SUB_CMD_SFS_UPDATE = PSP_SFS_UPDATE, 133 }; 134 135 int psp_extended_mailbox_cmd(struct psp_device *psp, unsigned int timeout_msecs, 136 struct psp_ext_request *req); 137 #endif /* __PSP_DEV_H */ 138