psp-dev.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993
  1. /*
  2. * AMD Platform Security Processor (PSP) interface
  3. *
  4. * Copyright (C) 2016-2017 Advanced Micro Devices, Inc.
  5. *
  6. * Author: Brijesh Singh <brijesh.singh@amd.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #include <linux/module.h>
  13. #include <linux/kernel.h>
  14. #include <linux/kthread.h>
  15. #include <linux/sched.h>
  16. #include <linux/interrupt.h>
  17. #include <linux/spinlock.h>
  18. #include <linux/spinlock_types.h>
  19. #include <linux/types.h>
  20. #include <linux/mutex.h>
  21. #include <linux/delay.h>
  22. #include <linux/hw_random.h>
  23. #include <linux/ccp.h>
  24. #include <linux/firmware.h>
  25. #include "sp-dev.h"
  26. #include "psp-dev.h"
  27. #define SEV_VERSION_GREATER_OR_EQUAL(_maj, _min) \
  28. ((psp_master->api_major) >= _maj && \
  29. (psp_master->api_minor) >= _min)
  30. #define DEVICE_NAME "sev"
  31. #define SEV_FW_FILE "amd/sev.fw"
  32. #define SEV_FW_NAME_SIZE 64
  33. static DEFINE_MUTEX(sev_cmd_mutex);
  34. static struct sev_misc_dev *misc_dev;
  35. static struct psp_device *psp_master;
  36. static int psp_cmd_timeout = 100;
  37. module_param(psp_cmd_timeout, int, 0644);
  38. MODULE_PARM_DESC(psp_cmd_timeout, " default timeout value, in seconds, for PSP commands");
  39. static int psp_probe_timeout = 5;
  40. module_param(psp_probe_timeout, int, 0644);
  41. MODULE_PARM_DESC(psp_probe_timeout, " default timeout value, in seconds, during PSP device probe");
  42. static bool psp_dead;
  43. static int psp_timeout;
  44. static struct psp_device *psp_alloc_struct(struct sp_device *sp)
  45. {
  46. struct device *dev = sp->dev;
  47. struct psp_device *psp;
  48. psp = devm_kzalloc(dev, sizeof(*psp), GFP_KERNEL);
  49. if (!psp)
  50. return NULL;
  51. psp->dev = dev;
  52. psp->sp = sp;
  53. snprintf(psp->name, sizeof(psp->name), "psp-%u", sp->ord);
  54. return psp;
  55. }
  56. static irqreturn_t psp_irq_handler(int irq, void *data)
  57. {
  58. struct psp_device *psp = data;
  59. unsigned int status;
  60. int reg;
  61. /* Read the interrupt status: */
  62. status = ioread32(psp->io_regs + psp->vdata->intsts_reg);
  63. /* Check if it is command completion: */
  64. if (!(status & PSP_CMD_COMPLETE))
  65. goto done;
  66. /* Check if it is SEV command completion: */
  67. reg = ioread32(psp->io_regs + psp->vdata->cmdresp_reg);
  68. if (reg & PSP_CMDRESP_RESP) {
  69. psp->sev_int_rcvd = 1;
  70. wake_up(&psp->sev_int_queue);
  71. }
  72. done:
  73. /* Clear the interrupt status by writing the same value we read. */
  74. iowrite32(status, psp->io_regs + psp->vdata->intsts_reg);
  75. return IRQ_HANDLED;
  76. }
  77. static int sev_wait_cmd_ioc(struct psp_device *psp,
  78. unsigned int *reg, unsigned int timeout)
  79. {
  80. int ret;
  81. ret = wait_event_timeout(psp->sev_int_queue,
  82. psp->sev_int_rcvd, timeout * HZ);
  83. if (!ret)
  84. return -ETIMEDOUT;
  85. *reg = ioread32(psp->io_regs + psp->vdata->cmdresp_reg);
  86. return 0;
  87. }
  88. static int sev_cmd_buffer_len(int cmd)
  89. {
  90. switch (cmd) {
  91. case SEV_CMD_INIT: return sizeof(struct sev_data_init);
  92. case SEV_CMD_PLATFORM_STATUS: return sizeof(struct sev_user_data_status);
  93. case SEV_CMD_PEK_CSR: return sizeof(struct sev_data_pek_csr);
  94. case SEV_CMD_PEK_CERT_IMPORT: return sizeof(struct sev_data_pek_cert_import);
  95. case SEV_CMD_PDH_CERT_EXPORT: return sizeof(struct sev_data_pdh_cert_export);
  96. case SEV_CMD_LAUNCH_START: return sizeof(struct sev_data_launch_start);
  97. case SEV_CMD_LAUNCH_UPDATE_DATA: return sizeof(struct sev_data_launch_update_data);
  98. case SEV_CMD_LAUNCH_UPDATE_VMSA: return sizeof(struct sev_data_launch_update_vmsa);
  99. case SEV_CMD_LAUNCH_FINISH: return sizeof(struct sev_data_launch_finish);
  100. case SEV_CMD_LAUNCH_MEASURE: return sizeof(struct sev_data_launch_measure);
  101. case SEV_CMD_ACTIVATE: return sizeof(struct sev_data_activate);
  102. case SEV_CMD_DEACTIVATE: return sizeof(struct sev_data_deactivate);
  103. case SEV_CMD_DECOMMISSION: return sizeof(struct sev_data_decommission);
  104. case SEV_CMD_GUEST_STATUS: return sizeof(struct sev_data_guest_status);
  105. case SEV_CMD_DBG_DECRYPT: return sizeof(struct sev_data_dbg);
  106. case SEV_CMD_DBG_ENCRYPT: return sizeof(struct sev_data_dbg);
  107. case SEV_CMD_SEND_START: return sizeof(struct sev_data_send_start);
  108. case SEV_CMD_SEND_UPDATE_DATA: return sizeof(struct sev_data_send_update_data);
  109. case SEV_CMD_SEND_UPDATE_VMSA: return sizeof(struct sev_data_send_update_vmsa);
  110. case SEV_CMD_SEND_FINISH: return sizeof(struct sev_data_send_finish);
  111. case SEV_CMD_RECEIVE_START: return sizeof(struct sev_data_receive_start);
  112. case SEV_CMD_RECEIVE_FINISH: return sizeof(struct sev_data_receive_finish);
  113. case SEV_CMD_RECEIVE_UPDATE_DATA: return sizeof(struct sev_data_receive_update_data);
  114. case SEV_CMD_RECEIVE_UPDATE_VMSA: return sizeof(struct sev_data_receive_update_vmsa);
  115. case SEV_CMD_LAUNCH_UPDATE_SECRET: return sizeof(struct sev_data_launch_secret);
  116. case SEV_CMD_DOWNLOAD_FIRMWARE: return sizeof(struct sev_data_download_firmware);
  117. case SEV_CMD_GET_ID: return sizeof(struct sev_data_get_id);
  118. default: return 0;
  119. }
  120. return 0;
  121. }
  122. static int __sev_do_cmd_locked(int cmd, void *data, int *psp_ret)
  123. {
  124. struct psp_device *psp = psp_master;
  125. unsigned int phys_lsb, phys_msb;
  126. unsigned int reg, ret = 0;
  127. if (!psp)
  128. return -ENODEV;
  129. if (psp_dead)
  130. return -EBUSY;
  131. /* Get the physical address of the command buffer */
  132. phys_lsb = data ? lower_32_bits(__psp_pa(data)) : 0;
  133. phys_msb = data ? upper_32_bits(__psp_pa(data)) : 0;
  134. dev_dbg(psp->dev, "sev command id %#x buffer 0x%08x%08x timeout %us\n",
  135. cmd, phys_msb, phys_lsb, psp_timeout);
  136. print_hex_dump_debug("(in): ", DUMP_PREFIX_OFFSET, 16, 2, data,
  137. sev_cmd_buffer_len(cmd), false);
  138. iowrite32(phys_lsb, psp->io_regs + psp->vdata->cmdbuff_addr_lo_reg);
  139. iowrite32(phys_msb, psp->io_regs + psp->vdata->cmdbuff_addr_hi_reg);
  140. psp->sev_int_rcvd = 0;
  141. reg = cmd;
  142. reg <<= PSP_CMDRESP_CMD_SHIFT;
  143. reg |= PSP_CMDRESP_IOC;
  144. iowrite32(reg, psp->io_regs + psp->vdata->cmdresp_reg);
  145. /* wait for command completion */
  146. ret = sev_wait_cmd_ioc(psp, &reg, psp_timeout);
  147. if (ret) {
  148. if (psp_ret)
  149. *psp_ret = 0;
  150. dev_err(psp->dev, "sev command %#x timed out, disabling PSP \n", cmd);
  151. psp_dead = true;
  152. return ret;
  153. }
  154. psp_timeout = psp_cmd_timeout;
  155. if (psp_ret)
  156. *psp_ret = reg & PSP_CMDRESP_ERR_MASK;
  157. if (reg & PSP_CMDRESP_ERR_MASK) {
  158. dev_dbg(psp->dev, "sev command %#x failed (%#010x)\n",
  159. cmd, reg & PSP_CMDRESP_ERR_MASK);
  160. ret = -EIO;
  161. }
  162. print_hex_dump_debug("(out): ", DUMP_PREFIX_OFFSET, 16, 2, data,
  163. sev_cmd_buffer_len(cmd), false);
  164. return ret;
  165. }
  166. static int sev_do_cmd(int cmd, void *data, int *psp_ret)
  167. {
  168. int rc;
  169. mutex_lock(&sev_cmd_mutex);
  170. rc = __sev_do_cmd_locked(cmd, data, psp_ret);
  171. mutex_unlock(&sev_cmd_mutex);
  172. return rc;
  173. }
  174. static int __sev_platform_init_locked(int *error)
  175. {
  176. struct psp_device *psp = psp_master;
  177. int rc = 0;
  178. if (!psp)
  179. return -ENODEV;
  180. if (psp->sev_state == SEV_STATE_INIT)
  181. return 0;
  182. rc = __sev_do_cmd_locked(SEV_CMD_INIT, &psp->init_cmd_buf, error);
  183. if (rc)
  184. return rc;
  185. psp->sev_state = SEV_STATE_INIT;
  186. dev_dbg(psp->dev, "SEV firmware initialized\n");
  187. return rc;
  188. }
  189. int sev_platform_init(int *error)
  190. {
  191. int rc;
  192. mutex_lock(&sev_cmd_mutex);
  193. rc = __sev_platform_init_locked(error);
  194. mutex_unlock(&sev_cmd_mutex);
  195. return rc;
  196. }
  197. EXPORT_SYMBOL_GPL(sev_platform_init);
  198. static int __sev_platform_shutdown_locked(int *error)
  199. {
  200. int ret;
  201. ret = __sev_do_cmd_locked(SEV_CMD_SHUTDOWN, NULL, error);
  202. if (ret)
  203. return ret;
  204. psp_master->sev_state = SEV_STATE_UNINIT;
  205. dev_dbg(psp_master->dev, "SEV firmware shutdown\n");
  206. return ret;
  207. }
  208. static int sev_platform_shutdown(int *error)
  209. {
  210. int rc;
  211. mutex_lock(&sev_cmd_mutex);
  212. rc = __sev_platform_shutdown_locked(NULL);
  213. mutex_unlock(&sev_cmd_mutex);
  214. return rc;
  215. }
  216. static int sev_get_platform_state(int *state, int *error)
  217. {
  218. int rc;
  219. rc = __sev_do_cmd_locked(SEV_CMD_PLATFORM_STATUS,
  220. &psp_master->status_cmd_buf, error);
  221. if (rc)
  222. return rc;
  223. *state = psp_master->status_cmd_buf.state;
  224. return rc;
  225. }
  226. static int sev_ioctl_do_reset(struct sev_issue_cmd *argp)
  227. {
  228. int state, rc;
  229. /*
  230. * The SEV spec requires that FACTORY_RESET must be issued in
  231. * UNINIT state. Before we go further lets check if any guest is
  232. * active.
  233. *
  234. * If FW is in WORKING state then deny the request otherwise issue
  235. * SHUTDOWN command do INIT -> UNINIT before issuing the FACTORY_RESET.
  236. *
  237. */
  238. rc = sev_get_platform_state(&state, &argp->error);
  239. if (rc)
  240. return rc;
  241. if (state == SEV_STATE_WORKING)
  242. return -EBUSY;
  243. if (state == SEV_STATE_INIT) {
  244. rc = __sev_platform_shutdown_locked(&argp->error);
  245. if (rc)
  246. return rc;
  247. }
  248. return __sev_do_cmd_locked(SEV_CMD_FACTORY_RESET, NULL, &argp->error);
  249. }
  250. static int sev_ioctl_do_platform_status(struct sev_issue_cmd *argp)
  251. {
  252. struct sev_user_data_status *data = &psp_master->status_cmd_buf;
  253. int ret;
  254. ret = __sev_do_cmd_locked(SEV_CMD_PLATFORM_STATUS, data, &argp->error);
  255. if (ret)
  256. return ret;
  257. if (copy_to_user((void __user *)argp->data, data, sizeof(*data)))
  258. ret = -EFAULT;
  259. return ret;
  260. }
  261. static int sev_ioctl_do_pek_pdh_gen(int cmd, struct sev_issue_cmd *argp)
  262. {
  263. int rc;
  264. if (psp_master->sev_state == SEV_STATE_UNINIT) {
  265. rc = __sev_platform_init_locked(&argp->error);
  266. if (rc)
  267. return rc;
  268. }
  269. return __sev_do_cmd_locked(cmd, NULL, &argp->error);
  270. }
  271. static int sev_ioctl_do_pek_csr(struct sev_issue_cmd *argp)
  272. {
  273. struct sev_user_data_pek_csr input;
  274. struct sev_data_pek_csr *data;
  275. void *blob = NULL;
  276. int ret;
  277. if (copy_from_user(&input, (void __user *)argp->data, sizeof(input)))
  278. return -EFAULT;
  279. data = kzalloc(sizeof(*data), GFP_KERNEL);
  280. if (!data)
  281. return -ENOMEM;
  282. /* userspace wants to query CSR length */
  283. if (!input.address || !input.length)
  284. goto cmd;
  285. /* allocate a physically contiguous buffer to store the CSR blob */
  286. if (!access_ok(VERIFY_WRITE, input.address, input.length) ||
  287. input.length > SEV_FW_BLOB_MAX_SIZE) {
  288. ret = -EFAULT;
  289. goto e_free;
  290. }
  291. blob = kmalloc(input.length, GFP_KERNEL);
  292. if (!blob) {
  293. ret = -ENOMEM;
  294. goto e_free;
  295. }
  296. data->address = __psp_pa(blob);
  297. data->len = input.length;
  298. cmd:
  299. if (psp_master->sev_state == SEV_STATE_UNINIT) {
  300. ret = __sev_platform_init_locked(&argp->error);
  301. if (ret)
  302. goto e_free_blob;
  303. }
  304. ret = __sev_do_cmd_locked(SEV_CMD_PEK_CSR, data, &argp->error);
  305. /* If we query the CSR length, FW responded with expected data. */
  306. input.length = data->len;
  307. if (copy_to_user((void __user *)argp->data, &input, sizeof(input))) {
  308. ret = -EFAULT;
  309. goto e_free_blob;
  310. }
  311. if (blob) {
  312. if (copy_to_user((void __user *)input.address, blob, input.length))
  313. ret = -EFAULT;
  314. }
  315. e_free_blob:
  316. kfree(blob);
  317. e_free:
  318. kfree(data);
  319. return ret;
  320. }
  321. void *psp_copy_user_blob(u64 __user uaddr, u32 len)
  322. {
  323. if (!uaddr || !len)
  324. return ERR_PTR(-EINVAL);
  325. /* verify that blob length does not exceed our limit */
  326. if (len > SEV_FW_BLOB_MAX_SIZE)
  327. return ERR_PTR(-EINVAL);
  328. return memdup_user((void __user *)(uintptr_t)uaddr, len);
  329. }
  330. EXPORT_SYMBOL_GPL(psp_copy_user_blob);
  331. static int sev_get_api_version(void)
  332. {
  333. struct sev_user_data_status *status;
  334. int error = 0, ret;
  335. status = &psp_master->status_cmd_buf;
  336. ret = sev_platform_status(status, &error);
  337. if (ret) {
  338. dev_err(psp_master->dev,
  339. "SEV: failed to get status. Error: %#x\n", error);
  340. return 1;
  341. }
  342. psp_master->api_major = status->api_major;
  343. psp_master->api_minor = status->api_minor;
  344. psp_master->build = status->build;
  345. return 0;
  346. }
  347. static int sev_get_firmware(struct device *dev,
  348. const struct firmware **firmware)
  349. {
  350. char fw_name_specific[SEV_FW_NAME_SIZE];
  351. char fw_name_subset[SEV_FW_NAME_SIZE];
  352. snprintf(fw_name_specific, sizeof(fw_name_specific),
  353. "amd/amd_sev_fam%.2xh_model%.2xh.sbin",
  354. boot_cpu_data.x86, boot_cpu_data.x86_model);
  355. snprintf(fw_name_subset, sizeof(fw_name_subset),
  356. "amd/amd_sev_fam%.2xh_model%.1xxh.sbin",
  357. boot_cpu_data.x86, (boot_cpu_data.x86_model & 0xf0) >> 4);
  358. /* Check for SEV FW for a particular model.
  359. * Ex. amd_sev_fam17h_model00h.sbin for Family 17h Model 00h
  360. *
  361. * or
  362. *
  363. * Check for SEV FW common to a subset of models.
  364. * Ex. amd_sev_fam17h_model0xh.sbin for
  365. * Family 17h Model 00h -- Family 17h Model 0Fh
  366. *
  367. * or
  368. *
  369. * Fall-back to using generic name: sev.fw
  370. */
  371. if ((firmware_request_nowarn(firmware, fw_name_specific, dev) >= 0) ||
  372. (firmware_request_nowarn(firmware, fw_name_subset, dev) >= 0) ||
  373. (firmware_request_nowarn(firmware, SEV_FW_FILE, dev) >= 0))
  374. return 0;
  375. return -ENOENT;
  376. }
  377. /* Don't fail if SEV FW couldn't be updated. Continue with existing SEV FW */
  378. static int sev_update_firmware(struct device *dev)
  379. {
  380. struct sev_data_download_firmware *data;
  381. const struct firmware *firmware;
  382. int ret, error, order;
  383. struct page *p;
  384. u64 data_size;
  385. if (sev_get_firmware(dev, &firmware) == -ENOENT) {
  386. dev_dbg(dev, "No SEV firmware file present\n");
  387. return -1;
  388. }
  389. /*
  390. * SEV FW expects the physical address given to it to be 32
  391. * byte aligned. Memory allocated has structure placed at the
  392. * beginning followed by the firmware being passed to the SEV
  393. * FW. Allocate enough memory for data structure + alignment
  394. * padding + SEV FW.
  395. */
  396. data_size = ALIGN(sizeof(struct sev_data_download_firmware), 32);
  397. order = get_order(firmware->size + data_size);
  398. p = alloc_pages(GFP_KERNEL, order);
  399. if (!p) {
  400. ret = -1;
  401. goto fw_err;
  402. }
  403. /*
  404. * Copy firmware data to a kernel allocated contiguous
  405. * memory region.
  406. */
  407. data = page_address(p);
  408. memcpy(page_address(p) + data_size, firmware->data, firmware->size);
  409. data->address = __psp_pa(page_address(p) + data_size);
  410. data->len = firmware->size;
  411. ret = sev_do_cmd(SEV_CMD_DOWNLOAD_FIRMWARE, data, &error);
  412. if (ret)
  413. dev_dbg(dev, "Failed to update SEV firmware: %#x\n", error);
  414. else
  415. dev_info(dev, "SEV firmware update successful\n");
  416. __free_pages(p, order);
  417. fw_err:
  418. release_firmware(firmware);
  419. return ret;
  420. }
  421. static int sev_ioctl_do_pek_import(struct sev_issue_cmd *argp)
  422. {
  423. struct sev_user_data_pek_cert_import input;
  424. struct sev_data_pek_cert_import *data;
  425. void *pek_blob, *oca_blob;
  426. int ret;
  427. if (copy_from_user(&input, (void __user *)argp->data, sizeof(input)))
  428. return -EFAULT;
  429. data = kzalloc(sizeof(*data), GFP_KERNEL);
  430. if (!data)
  431. return -ENOMEM;
  432. /* copy PEK certificate blobs from userspace */
  433. pek_blob = psp_copy_user_blob(input.pek_cert_address, input.pek_cert_len);
  434. if (IS_ERR(pek_blob)) {
  435. ret = PTR_ERR(pek_blob);
  436. goto e_free;
  437. }
  438. data->pek_cert_address = __psp_pa(pek_blob);
  439. data->pek_cert_len = input.pek_cert_len;
  440. /* copy PEK certificate blobs from userspace */
  441. oca_blob = psp_copy_user_blob(input.oca_cert_address, input.oca_cert_len);
  442. if (IS_ERR(oca_blob)) {
  443. ret = PTR_ERR(oca_blob);
  444. goto e_free_pek;
  445. }
  446. data->oca_cert_address = __psp_pa(oca_blob);
  447. data->oca_cert_len = input.oca_cert_len;
  448. /* If platform is not in INIT state then transition it to INIT */
  449. if (psp_master->sev_state != SEV_STATE_INIT) {
  450. ret = __sev_platform_init_locked(&argp->error);
  451. if (ret)
  452. goto e_free_oca;
  453. }
  454. ret = __sev_do_cmd_locked(SEV_CMD_PEK_CERT_IMPORT, data, &argp->error);
  455. e_free_oca:
  456. kfree(oca_blob);
  457. e_free_pek:
  458. kfree(pek_blob);
  459. e_free:
  460. kfree(data);
  461. return ret;
  462. }
  463. static int sev_ioctl_do_get_id(struct sev_issue_cmd *argp)
  464. {
  465. struct sev_data_get_id *data;
  466. u64 data_size, user_size;
  467. void *id_blob, *mem;
  468. int ret;
  469. /* SEV GET_ID available from SEV API v0.16 and up */
  470. if (!SEV_VERSION_GREATER_OR_EQUAL(0, 16))
  471. return -ENOTSUPP;
  472. /* SEV FW expects the buffer it fills with the ID to be
  473. * 8-byte aligned. Memory allocated should be enough to
  474. * hold data structure + alignment padding + memory
  475. * where SEV FW writes the ID.
  476. */
  477. data_size = ALIGN(sizeof(struct sev_data_get_id), 8);
  478. user_size = sizeof(struct sev_user_data_get_id);
  479. mem = kzalloc(data_size + user_size, GFP_KERNEL);
  480. if (!mem)
  481. return -ENOMEM;
  482. data = mem;
  483. id_blob = mem + data_size;
  484. data->address = __psp_pa(id_blob);
  485. data->len = user_size;
  486. ret = __sev_do_cmd_locked(SEV_CMD_GET_ID, data, &argp->error);
  487. if (!ret) {
  488. if (copy_to_user((void __user *)argp->data, id_blob, data->len))
  489. ret = -EFAULT;
  490. }
  491. kfree(mem);
  492. return ret;
  493. }
  494. static int sev_ioctl_do_pdh_export(struct sev_issue_cmd *argp)
  495. {
  496. struct sev_user_data_pdh_cert_export input;
  497. void *pdh_blob = NULL, *cert_blob = NULL;
  498. struct sev_data_pdh_cert_export *data;
  499. int ret;
  500. if (copy_from_user(&input, (void __user *)argp->data, sizeof(input)))
  501. return -EFAULT;
  502. data = kzalloc(sizeof(*data), GFP_KERNEL);
  503. if (!data)
  504. return -ENOMEM;
  505. /* Userspace wants to query the certificate length. */
  506. if (!input.pdh_cert_address ||
  507. !input.pdh_cert_len ||
  508. !input.cert_chain_address)
  509. goto cmd;
  510. /* Allocate a physically contiguous buffer to store the PDH blob. */
  511. if ((input.pdh_cert_len > SEV_FW_BLOB_MAX_SIZE) ||
  512. !access_ok(VERIFY_WRITE, input.pdh_cert_address, input.pdh_cert_len)) {
  513. ret = -EFAULT;
  514. goto e_free;
  515. }
  516. /* Allocate a physically contiguous buffer to store the cert chain blob. */
  517. if ((input.cert_chain_len > SEV_FW_BLOB_MAX_SIZE) ||
  518. !access_ok(VERIFY_WRITE, input.cert_chain_address, input.cert_chain_len)) {
  519. ret = -EFAULT;
  520. goto e_free;
  521. }
  522. pdh_blob = kmalloc(input.pdh_cert_len, GFP_KERNEL);
  523. if (!pdh_blob) {
  524. ret = -ENOMEM;
  525. goto e_free;
  526. }
  527. data->pdh_cert_address = __psp_pa(pdh_blob);
  528. data->pdh_cert_len = input.pdh_cert_len;
  529. cert_blob = kmalloc(input.cert_chain_len, GFP_KERNEL);
  530. if (!cert_blob) {
  531. ret = -ENOMEM;
  532. goto e_free_pdh;
  533. }
  534. data->cert_chain_address = __psp_pa(cert_blob);
  535. data->cert_chain_len = input.cert_chain_len;
  536. cmd:
  537. /* If platform is not in INIT state then transition it to INIT. */
  538. if (psp_master->sev_state != SEV_STATE_INIT) {
  539. ret = __sev_platform_init_locked(&argp->error);
  540. if (ret)
  541. goto e_free_cert;
  542. }
  543. ret = __sev_do_cmd_locked(SEV_CMD_PDH_CERT_EXPORT, data, &argp->error);
  544. /* If we query the length, FW responded with expected data. */
  545. input.cert_chain_len = data->cert_chain_len;
  546. input.pdh_cert_len = data->pdh_cert_len;
  547. if (copy_to_user((void __user *)argp->data, &input, sizeof(input))) {
  548. ret = -EFAULT;
  549. goto e_free_cert;
  550. }
  551. if (pdh_blob) {
  552. if (copy_to_user((void __user *)input.pdh_cert_address,
  553. pdh_blob, input.pdh_cert_len)) {
  554. ret = -EFAULT;
  555. goto e_free_cert;
  556. }
  557. }
  558. if (cert_blob) {
  559. if (copy_to_user((void __user *)input.cert_chain_address,
  560. cert_blob, input.cert_chain_len))
  561. ret = -EFAULT;
  562. }
  563. e_free_cert:
  564. kfree(cert_blob);
  565. e_free_pdh:
  566. kfree(pdh_blob);
  567. e_free:
  568. kfree(data);
  569. return ret;
  570. }
  571. static long sev_ioctl(struct file *file, unsigned int ioctl, unsigned long arg)
  572. {
  573. void __user *argp = (void __user *)arg;
  574. struct sev_issue_cmd input;
  575. int ret = -EFAULT;
  576. if (!psp_master)
  577. return -ENODEV;
  578. if (ioctl != SEV_ISSUE_CMD)
  579. return -EINVAL;
  580. if (copy_from_user(&input, argp, sizeof(struct sev_issue_cmd)))
  581. return -EFAULT;
  582. if (input.cmd > SEV_MAX)
  583. return -EINVAL;
  584. mutex_lock(&sev_cmd_mutex);
  585. switch (input.cmd) {
  586. case SEV_FACTORY_RESET:
  587. ret = sev_ioctl_do_reset(&input);
  588. break;
  589. case SEV_PLATFORM_STATUS:
  590. ret = sev_ioctl_do_platform_status(&input);
  591. break;
  592. case SEV_PEK_GEN:
  593. ret = sev_ioctl_do_pek_pdh_gen(SEV_CMD_PEK_GEN, &input);
  594. break;
  595. case SEV_PDH_GEN:
  596. ret = sev_ioctl_do_pek_pdh_gen(SEV_CMD_PDH_GEN, &input);
  597. break;
  598. case SEV_PEK_CSR:
  599. ret = sev_ioctl_do_pek_csr(&input);
  600. break;
  601. case SEV_PEK_CERT_IMPORT:
  602. ret = sev_ioctl_do_pek_import(&input);
  603. break;
  604. case SEV_PDH_CERT_EXPORT:
  605. ret = sev_ioctl_do_pdh_export(&input);
  606. break;
  607. case SEV_GET_ID:
  608. ret = sev_ioctl_do_get_id(&input);
  609. break;
  610. default:
  611. ret = -EINVAL;
  612. goto out;
  613. }
  614. if (copy_to_user(argp, &input, sizeof(struct sev_issue_cmd)))
  615. ret = -EFAULT;
  616. out:
  617. mutex_unlock(&sev_cmd_mutex);
  618. return ret;
  619. }
  620. static const struct file_operations sev_fops = {
  621. .owner = THIS_MODULE,
  622. .unlocked_ioctl = sev_ioctl,
  623. };
  624. int sev_platform_status(struct sev_user_data_status *data, int *error)
  625. {
  626. return sev_do_cmd(SEV_CMD_PLATFORM_STATUS, data, error);
  627. }
  628. EXPORT_SYMBOL_GPL(sev_platform_status);
  629. int sev_guest_deactivate(struct sev_data_deactivate *data, int *error)
  630. {
  631. return sev_do_cmd(SEV_CMD_DEACTIVATE, data, error);
  632. }
  633. EXPORT_SYMBOL_GPL(sev_guest_deactivate);
  634. int sev_guest_activate(struct sev_data_activate *data, int *error)
  635. {
  636. return sev_do_cmd(SEV_CMD_ACTIVATE, data, error);
  637. }
  638. EXPORT_SYMBOL_GPL(sev_guest_activate);
  639. int sev_guest_decommission(struct sev_data_decommission *data, int *error)
  640. {
  641. return sev_do_cmd(SEV_CMD_DECOMMISSION, data, error);
  642. }
  643. EXPORT_SYMBOL_GPL(sev_guest_decommission);
  644. int sev_guest_df_flush(int *error)
  645. {
  646. return sev_do_cmd(SEV_CMD_DF_FLUSH, NULL, error);
  647. }
  648. EXPORT_SYMBOL_GPL(sev_guest_df_flush);
  649. static void sev_exit(struct kref *ref)
  650. {
  651. struct sev_misc_dev *misc_dev = container_of(ref, struct sev_misc_dev, refcount);
  652. misc_deregister(&misc_dev->misc);
  653. }
  654. static int sev_misc_init(struct psp_device *psp)
  655. {
  656. struct device *dev = psp->dev;
  657. int ret;
  658. /*
  659. * SEV feature support can be detected on multiple devices but the SEV
  660. * FW commands must be issued on the master. During probe, we do not
  661. * know the master hence we create /dev/sev on the first device probe.
  662. * sev_do_cmd() finds the right master device to which to issue the
  663. * command to the firmware.
  664. */
  665. if (!misc_dev) {
  666. struct miscdevice *misc;
  667. misc_dev = devm_kzalloc(dev, sizeof(*misc_dev), GFP_KERNEL);
  668. if (!misc_dev)
  669. return -ENOMEM;
  670. misc = &misc_dev->misc;
  671. misc->minor = MISC_DYNAMIC_MINOR;
  672. misc->name = DEVICE_NAME;
  673. misc->fops = &sev_fops;
  674. ret = misc_register(misc);
  675. if (ret)
  676. return ret;
  677. kref_init(&misc_dev->refcount);
  678. } else {
  679. kref_get(&misc_dev->refcount);
  680. }
  681. init_waitqueue_head(&psp->sev_int_queue);
  682. psp->sev_misc = misc_dev;
  683. dev_dbg(dev, "registered SEV device\n");
  684. return 0;
  685. }
  686. static int sev_init(struct psp_device *psp)
  687. {
  688. /* Check if device supports SEV feature */
  689. if (!(ioread32(psp->io_regs + psp->vdata->feature_reg) & 1)) {
  690. dev_dbg(psp->dev, "device does not support SEV\n");
  691. return 1;
  692. }
  693. return sev_misc_init(psp);
  694. }
  695. int psp_dev_init(struct sp_device *sp)
  696. {
  697. struct device *dev = sp->dev;
  698. struct psp_device *psp;
  699. int ret;
  700. ret = -ENOMEM;
  701. psp = psp_alloc_struct(sp);
  702. if (!psp)
  703. goto e_err;
  704. sp->psp_data = psp;
  705. psp->vdata = (struct psp_vdata *)sp->dev_vdata->psp_vdata;
  706. if (!psp->vdata) {
  707. ret = -ENODEV;
  708. dev_err(dev, "missing driver data\n");
  709. goto e_err;
  710. }
  711. psp->io_regs = sp->io_map;
  712. /* Disable and clear interrupts until ready */
  713. iowrite32(0, psp->io_regs + psp->vdata->inten_reg);
  714. iowrite32(-1, psp->io_regs + psp->vdata->intsts_reg);
  715. /* Request an irq */
  716. ret = sp_request_psp_irq(psp->sp, psp_irq_handler, psp->name, psp);
  717. if (ret) {
  718. dev_err(dev, "psp: unable to allocate an IRQ\n");
  719. goto e_err;
  720. }
  721. ret = sev_init(psp);
  722. if (ret)
  723. goto e_irq;
  724. if (sp->set_psp_master_device)
  725. sp->set_psp_master_device(sp);
  726. /* Enable interrupt */
  727. iowrite32(-1, psp->io_regs + psp->vdata->inten_reg);
  728. dev_notice(dev, "psp enabled\n");
  729. return 0;
  730. e_irq:
  731. sp_free_psp_irq(psp->sp, psp);
  732. e_err:
  733. sp->psp_data = NULL;
  734. dev_notice(dev, "psp initialization failed\n");
  735. return ret;
  736. }
  737. void psp_dev_destroy(struct sp_device *sp)
  738. {
  739. struct psp_device *psp = sp->psp_data;
  740. if (!psp)
  741. return;
  742. if (psp->sev_misc)
  743. kref_put(&misc_dev->refcount, sev_exit);
  744. sp_free_psp_irq(sp, psp);
  745. }
  746. int sev_issue_cmd_external_user(struct file *filep, unsigned int cmd,
  747. void *data, int *error)
  748. {
  749. if (!filep || filep->f_op != &sev_fops)
  750. return -EBADF;
  751. return sev_do_cmd(cmd, data, error);
  752. }
  753. EXPORT_SYMBOL_GPL(sev_issue_cmd_external_user);
  754. void psp_pci_init(void)
  755. {
  756. struct sp_device *sp;
  757. int error, rc;
  758. sp = sp_get_psp_master_device();
  759. if (!sp)
  760. return;
  761. psp_master = sp->psp_data;
  762. psp_timeout = psp_probe_timeout;
  763. if (sev_get_api_version())
  764. goto err;
  765. if (SEV_VERSION_GREATER_OR_EQUAL(0, 15) &&
  766. sev_update_firmware(psp_master->dev) == 0)
  767. sev_get_api_version();
  768. /* Initialize the platform */
  769. rc = sev_platform_init(&error);
  770. if (rc) {
  771. dev_err(sp->dev, "SEV: failed to INIT error %#x\n", error);
  772. goto err;
  773. }
  774. dev_info(sp->dev, "SEV API:%d.%d build:%d\n", psp_master->api_major,
  775. psp_master->api_minor, psp_master->build);
  776. return;
  777. err:
  778. psp_master = NULL;
  779. }
  780. void psp_pci_exit(void)
  781. {
  782. if (!psp_master)
  783. return;
  784. sev_platform_shutdown(NULL);
  785. }