spss_utils.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2016-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  4. */
  5. /*
  6. * Secure-Processor-SubSystem (SPSS) utilities.
  7. *
  8. * This driver provides utilities for the Secure Processor (SP).
  9. *
  10. * The SP daemon needs to load different SPSS images based on:
  11. *
  12. * 1. Test/Production key used to sign the SPSS image (read fuses).
  13. * 2. SPSS HW version (selected via Device Tree).
  14. *
  15. */
  16. #define pr_fmt(fmt) "spss_utils [%s]: " fmt, __func__
  17. #include <linux/kernel.h> /* min() */
  18. #include <linux/module.h> /* MODULE_LICENSE */
  19. #include <linux/device.h> /* class_create() */
  20. #include <linux/slab.h> /* kzalloc() */
  21. #include <linux/fs.h> /* file_operations */
  22. #include <linux/cdev.h> /* cdev_add() */
  23. #include <linux/errno.h> /* EINVAL, ETIMEDOUT */
  24. #include <linux/printk.h> /* pr_err() */
  25. #include <linux/bitops.h> /* BIT(x) */
  26. #include <linux/platform_device.h> /* platform_driver_register() */
  27. #include <linux/of.h> /* of_property_count_strings() */
  28. #include <linux/of_address.h> /* of_address_to_resource() */
  29. #include <linux/io.h> /* ioremap() */
  30. #include <linux/notifier.h>
  31. #include <linux/sizes.h> /* SZ_4K */
  32. #include <linux/uaccess.h> /* copy_from_user() */
  33. #include <linux/completion.h> /* wait_for_completion_timeout() */
  34. #include <linux/reboot.h> /* kernel_restart() */
  35. #include <linux/remoteproc.h>
  36. #include <linux/remoteproc/qcom_rproc.h>
  37. #include <linux/remoteproc/qcom_spss.h>
  38. #include <soc/qcom/secure_buffer.h> /* VMID_HLOS */
  39. #include <uapi/linux/ioctl.h> /* ioctl() */
  40. #include <linux/spss_utils.h> /* IOCTL to user space */
  41. /* driver name */
  42. #define DEVICE_NAME "spss_utils"
  43. enum spss_firmware_type {
  44. SPSS_FW_TYPE_DEV = 'd',
  45. SPSS_FW_TYPE_TEST = 't',
  46. SPSS_FW_TYPE_PROD = 'p',
  47. SPSS_FW_TYPE_NONE = 'z',
  48. };
  49. static enum spss_firmware_type firmware_type = SPSS_FW_TYPE_TEST;
  50. static const char *dev_firmware_name;
  51. static const char *test_firmware_name;
  52. static const char *prod_firmware_name;
  53. static const char *none_firmware_name = "nospss";
  54. static const char *firmware_name = "NA";
  55. static struct device *spss_dev;
  56. /* SP_SCSR_MBn_SP2CL_GPm(n,m) */
  57. static u32 spss_debug_reg_addr; /*SP_SCSR_MB0_SP2CL_GP0*/
  58. static u32 spss_debug_reg_addr1; /*SP_SCSR_MB1_SP2CL_GP0*/
  59. static u32 spss_debug_reg_addr3; /*SP_SCSR_MB3_SP2CL_GP0*/
  60. static u32 spss_emul_type_reg_addr; /* TCSR_SOC_EMULATION_TYPE */
  61. static void *iar_notif_handle;
  62. static struct notifier_block *iar_nb;
  63. static bool is_iar_active;
  64. static bool is_ssr_disabled;
  65. #define CMAC_SIZE_IN_BYTES (128/8) /* 128 bit = 16 bytes */
  66. #define CMAC_SIZE_IN_DWORDS (CMAC_SIZE_IN_BYTES/sizeof(u32)) /* 4 dwords */
  67. // MCP code size register holds size divided by a factor
  68. // To get the actual size, need to multiply by the same factor
  69. #define MCP_SIZE_MUL_FACTOR (4)
  70. static u32 pil_addr;
  71. static u32 pil_size;
  72. /*
  73. * The saved fw cmac is stored in file in IAR-DB.
  74. * It is provided via ioctl from user space spu service.
  75. */
  76. static u32 saved_fw_cmac[CMAC_SIZE_IN_DWORDS]; /* saved fw cmac */
  77. /*
  78. * The calculated fw cmac is calculated by SPU PBL.
  79. * It is read from shared memory and provided back to user space service
  80. * via device attribute.
  81. */
  82. static u32 calc_fw_cmac[CMAC_SIZE_IN_DWORDS]; /* calculated pbl fw cmac */
  83. /*
  84. * The saved apps cmac is stored in file in IAR-DB.
  85. * It is provided via ioctl from user space spu service.
  86. */
  87. static u32 saved_apps_cmac[MAX_SPU_UEFI_APPS][CMAC_SIZE_IN_DWORDS];
  88. /*
  89. * The calculated apps cmac is calculated by SPU firmware.
  90. * It is read from shared memory and provided back to user space service
  91. * via device attribute.
  92. */
  93. static u32 calc_apps_cmac[MAX_SPU_UEFI_APPS][CMAC_SIZE_IN_DWORDS];
  94. static void __iomem *cmac_mem;
  95. static phys_addr_t cmac_mem_addr;
  96. #define CMAC_MEM_SIZE SZ_4K /* XPU align to 4KB */
  97. #define SPSS_BASE_ADDR_MASK 0xFFFF0000
  98. #define SPSS_RMB_CODE_SIZE_REG_OFFSET 0x1008
  99. #define SPU_EMULATUION (BIT(0) | BIT(1))
  100. #define SPU_PRESENT_IN_EMULATION BIT(0)
  101. /* IOCTL max request size is 1KB */
  102. #define MAX_IOCTL_REQ_SIZE 1024
  103. /* Events notification */
  104. static struct completion spss_events[SPSS_NUM_EVENTS];
  105. static bool spss_events_signaled[SPSS_NUM_EVENTS];
  106. /* Protect from ioctl signal func called by multiple-proc at the same time */
  107. static struct mutex event_lock;
  108. /**
  109. * struct device state
  110. */
  111. struct spss_utils_device {
  112. /* char device info */
  113. struct cdev *cdev;
  114. dev_t device_no;
  115. struct class *driver_class;
  116. struct device *class_dev;
  117. struct platform_device *pdev;
  118. };
  119. /* Device State */
  120. static struct spss_utils_device *spss_utils_dev;
  121. /* static functions declaration */
  122. static int spss_set_saved_fw_cmac(u32 *cmac, size_t cmac_size);
  123. static int spss_set_saved_uefi_apps_cmac(void);
  124. static int spss_get_fw_calc_cmac(void);
  125. static int spss_get_apps_calc_cmac(void);
  126. /*==========================================================================*/
  127. /* Device Sysfs */
  128. /*==========================================================================*/
  129. static ssize_t firmware_name_show(struct device *dev,
  130. struct device_attribute *attr,
  131. char *buf)
  132. {
  133. int ret;
  134. if (!dev || !attr || !buf) {
  135. pr_err("invalid param.\n");
  136. return -EINVAL;
  137. }
  138. if (firmware_name == NULL)
  139. ret = scnprintf(buf, PAGE_SIZE, "%s\n", "unknown");
  140. else
  141. ret = scnprintf(buf, PAGE_SIZE, "%s\n", firmware_name);
  142. return ret;
  143. }
  144. static DEVICE_ATTR_RO(firmware_name);
  145. static ssize_t test_fuse_state_show(struct device *dev,
  146. struct device_attribute *attr,
  147. char *buf)
  148. {
  149. int ret;
  150. if (!dev || !attr || !buf) {
  151. pr_err("invalid param.\n");
  152. return -EINVAL;
  153. }
  154. switch (firmware_type) {
  155. case SPSS_FW_TYPE_DEV:
  156. ret = scnprintf(buf, PAGE_SIZE, "%s", "dev");
  157. break;
  158. case SPSS_FW_TYPE_TEST:
  159. ret = scnprintf(buf, PAGE_SIZE, "%s", "test");
  160. break;
  161. case SPSS_FW_TYPE_PROD:
  162. ret = scnprintf(buf, PAGE_SIZE, "%s", "prod");
  163. break;
  164. default:
  165. return -EINVAL;
  166. }
  167. return ret;
  168. }
  169. static DEVICE_ATTR_RO(test_fuse_state);
  170. static ssize_t spss_debug_reg_show(struct device *dev,
  171. struct device_attribute *attr,
  172. char *buf)
  173. {
  174. int ret = 0;
  175. void __iomem *spss_debug_reg = NULL;
  176. void __iomem *spss_debug_reg1 = NULL;
  177. void __iomem *spss_debug_reg3 = NULL;
  178. u32 val1, val2, val3, val4, val7, val8;
  179. if (!dev || !attr || !buf) {
  180. pr_err("invalid param.\n");
  181. return -EINVAL;
  182. }
  183. pr_debug("spss_debug_reg_addr [0x%x].\n", spss_debug_reg_addr);
  184. pr_debug("spss_debug_reg_addr1 [0x%x].\n", spss_debug_reg_addr1);
  185. pr_debug("spss_debug_reg_addr3 [0x%x].\n", spss_debug_reg_addr3);
  186. spss_debug_reg = ioremap(spss_debug_reg_addr, sizeof(u32)*2);
  187. spss_debug_reg1 = ioremap(spss_debug_reg_addr1, sizeof(u32)*2);
  188. spss_debug_reg3 = ioremap(spss_debug_reg_addr3, sizeof(u32)*2);
  189. if (!spss_debug_reg) {
  190. pr_err("can't map SPSS debug reg addr\n");
  191. goto unmap_reg;
  192. }
  193. if (!spss_debug_reg1) {
  194. pr_err("can't map SPSS debug reg addr1\n");
  195. goto unmap_reg1;
  196. }
  197. if (!spss_debug_reg3) {
  198. pr_err("can't map SPSS debug reg addr3\n");
  199. goto unmap_reg3;
  200. }
  201. val1 = readl_relaxed(spss_debug_reg);
  202. val2 = readl_relaxed(((char *) spss_debug_reg) + sizeof(u32));
  203. val3 = readl_relaxed(spss_debug_reg1);
  204. val4 = readl_relaxed(((char *) spss_debug_reg1) + sizeof(u32));
  205. val7 = readl_relaxed(spss_debug_reg3);
  206. val8 = readl_relaxed(((char *) spss_debug_reg3) + sizeof(u32));
  207. ret = scnprintf(buf, PAGE_SIZE,
  208. "MB0: val1[0x%x] val2[0x%x],\n MB1: val3[0x%x] val4[0x%x],\n MB3: val7[0x%x] val8[0x%x]\n",
  209. val1, val2, val3, val4, val7, val8);
  210. unmap_reg3:
  211. iounmap(spss_debug_reg3);
  212. unmap_reg1:
  213. iounmap(spss_debug_reg1);
  214. unmap_reg:
  215. iounmap(spss_debug_reg);
  216. return ret;
  217. }
  218. static DEVICE_ATTR_RO(spss_debug_reg);
  219. static ssize_t calc_fw_cmac_show(struct device *dev,
  220. struct device_attribute *attr,
  221. char *buf)
  222. {
  223. if (!dev || !attr || !buf) {
  224. pr_err("invalid param.\n");
  225. return -EINVAL;
  226. }
  227. /* first make sure the calc cmac is updated */
  228. spss_get_fw_calc_cmac();
  229. memcpy(buf, calc_fw_cmac, sizeof(calc_fw_cmac));
  230. return sizeof(calc_fw_cmac);
  231. }
  232. static DEVICE_ATTR_RO(calc_fw_cmac);
  233. static ssize_t calc_apps_cmac_show(struct device *dev,
  234. struct device_attribute *attr, char *buf)
  235. {
  236. if (!dev || !attr || !buf) {
  237. pr_err("invalid param.\n");
  238. return -EINVAL;
  239. }
  240. /* first make sure the calc cmac is updated */
  241. spss_get_apps_calc_cmac();
  242. memcpy(buf, calc_apps_cmac, sizeof(calc_apps_cmac));
  243. return sizeof(calc_apps_cmac);
  244. }
  245. static DEVICE_ATTR_RO(calc_apps_cmac);
  246. /*--------------------------------------------------------------------------*/
  247. static int spss_create_sysfs(struct device *dev)
  248. {
  249. int ret;
  250. ret = device_create_file(dev, &dev_attr_firmware_name);
  251. if (ret < 0) {
  252. pr_err("failed to create sysfs file for firmware_name.\n");
  253. return ret;
  254. }
  255. ret = device_create_file(dev, &dev_attr_test_fuse_state);
  256. if (ret < 0) {
  257. pr_err("failed to create sysfs file for test_fuse_state.\n");
  258. goto remove_firmware_name;
  259. }
  260. ret = device_create_file(dev, &dev_attr_spss_debug_reg);
  261. if (ret < 0) {
  262. pr_err("failed to create sysfs file for spss_debug_reg.\n");
  263. goto remove_test_fuse_state;
  264. }
  265. ret = device_create_file(dev, &dev_attr_calc_fw_cmac);
  266. if (ret < 0) {
  267. pr_err("failed to create sysfs file for calc_fw_cmac.\n");
  268. goto remove_spss_debug_reg;
  269. }
  270. ret = device_create_file(dev, &dev_attr_calc_apps_cmac);
  271. if (ret < 0) {
  272. pr_err("failed to create sysfs file for calc_apps_cmac.\n");
  273. goto remove_calc_fw_cmac;
  274. }
  275. return 0;
  276. remove_calc_fw_cmac:
  277. device_remove_file(dev, &dev_attr_calc_fw_cmac);
  278. remove_spss_debug_reg:
  279. device_remove_file(dev, &dev_attr_spss_debug_reg);
  280. remove_test_fuse_state:
  281. device_remove_file(dev, &dev_attr_test_fuse_state);
  282. remove_firmware_name:
  283. device_remove_file(dev, &dev_attr_firmware_name);
  284. return ret;
  285. }
  286. static void spss_destroy_sysfs(struct device *dev)
  287. {
  288. device_remove_file(dev, &dev_attr_calc_apps_cmac);
  289. device_remove_file(dev, &dev_attr_calc_fw_cmac);
  290. device_remove_file(dev, &dev_attr_spss_debug_reg);
  291. device_remove_file(dev, &dev_attr_test_fuse_state);
  292. device_remove_file(dev, &dev_attr_firmware_name);
  293. }
  294. /*==========================================================================*/
  295. /* IOCTL */
  296. /*==========================================================================*/
  297. static int spss_wait_for_event(struct spss_ioc_wait_for_event *req)
  298. {
  299. int ret;
  300. uint32_t event_id;
  301. uint32_t timeout_sec;
  302. long timeleft = 1;
  303. event_id = req->event_id;
  304. timeout_sec = req->timeout_sec;
  305. if (event_id >= SPSS_NUM_EVENTS) {
  306. pr_err("event_id [%d] invalid\n", event_id);
  307. return -EINVAL;
  308. }
  309. pr_debug("wait for event [%d], timeout_sec [%d]\n",
  310. event_id, timeout_sec);
  311. if (timeout_sec) {
  312. unsigned long jiffies = 0;
  313. jiffies = msecs_to_jiffies(timeout_sec*1000);
  314. timeleft = wait_for_completion_interruptible_timeout(
  315. &spss_events[event_id], jiffies);
  316. ret = timeleft;
  317. } else {
  318. ret = wait_for_completion_interruptible(
  319. &spss_events[event_id]);
  320. }
  321. if (timeleft == 0) {
  322. pr_err("wait for event [%d] timeout [%d] sec expired\n",
  323. event_id, timeout_sec);
  324. req->status = EVENT_STATUS_TIMEOUT;
  325. } else if (ret < 0) {
  326. pr_err("wait for event [%d] interrupted. ret [%d]\n",
  327. event_id, ret);
  328. req->status = EVENT_STATUS_ABORTED;
  329. if (ret == -ERESTARTSYS) /* handle LPM event */
  330. return ret;
  331. } else {
  332. pr_debug("wait for event [%d] completed.\n", event_id);
  333. req->status = EVENT_STATUS_SIGNALED;
  334. }
  335. return 0;
  336. }
  337. static int spss_signal_event(struct spss_ioc_signal_event *req)
  338. {
  339. uint32_t event_id;
  340. mutex_lock(&event_lock);
  341. event_id = req->event_id;
  342. if (event_id >= SPSS_NUM_EVENTS) {
  343. pr_err("event_id [%d] invalid\n", event_id);
  344. mutex_unlock(&event_lock);
  345. return -EINVAL;
  346. }
  347. if (spss_events_signaled[event_id]) {
  348. pr_err("event_id [%d] already signaled\n", event_id);
  349. mutex_unlock(&event_lock);
  350. return -EINVAL;
  351. }
  352. pr_debug("signal event [%d]\n", event_id);
  353. complete_all(&spss_events[event_id]);
  354. req->status = EVENT_STATUS_SIGNALED;
  355. spss_events_signaled[event_id] = true;
  356. mutex_unlock(&event_lock);
  357. return 0;
  358. }
  359. static int spss_is_event_signaled(struct spss_ioc_is_signaled *req)
  360. {
  361. uint32_t event_id;
  362. mutex_lock(&event_lock);
  363. event_id = req->event_id;
  364. if (event_id >= SPSS_NUM_EVENTS) {
  365. pr_err("event_id [%d] invalid\n", event_id);
  366. mutex_unlock(&event_lock);
  367. return -EINVAL;
  368. }
  369. if (spss_events_signaled[event_id])
  370. req->status = EVENT_STATUS_SIGNALED;
  371. else
  372. req->status = EVENT_STATUS_NOT_SIGNALED;
  373. mutex_unlock(&event_lock);
  374. return 0;
  375. }
  376. static int spss_handle_set_fw_and_apps_cmac(struct spss_ioc_set_fw_and_apps_cmac *req)
  377. {
  378. int ret = 0;
  379. u32 cmac_buf_size = req->cmac_buf_size;
  380. void __user *cmac_buf_ptr = u64_to_user_ptr(req->cmac_buf_ptr);
  381. u32 num_of_cmacs = req->num_of_cmacs;
  382. /* Saved cmacs of spu firmware and UEFI loaded spu apps */
  383. u32 fw_and_apps_cmacs[1+MAX_SPU_UEFI_APPS][CMAC_SIZE_IN_DWORDS];
  384. pr_debug("cmac_buf_size [0x%x].\n", (int) req->cmac_buf_size);
  385. pr_debug("cmac_buf_ptr [0x%x].\n", (int) req->cmac_buf_ptr);
  386. pr_debug("num_of_cmacs [0x%x].\n", (int) req->num_of_cmacs);
  387. if (cmac_buf_size != sizeof(fw_and_apps_cmacs)) {
  388. pr_err("cmac_buf_size [0x%x] invalid.\n", cmac_buf_size);
  389. return -EINVAL;
  390. }
  391. if (num_of_cmacs > (u32)(MAX_SPU_UEFI_APPS+1)) {
  392. pr_err("num_of_cmacs [0x%x] invalid.\n", num_of_cmacs);
  393. return -EINVAL;
  394. }
  395. /* copy the saved cmacs from user buffer to loacl variable */
  396. ret = copy_from_user(fw_and_apps_cmacs, cmac_buf_ptr, cmac_buf_size);
  397. if (ret < 0) {
  398. pr_err("copy_from_user() from cmac_buf_ptr failed.\n");
  399. return -EFAULT;
  400. }
  401. /* store the saved fw cmac */
  402. memcpy(saved_fw_cmac, fw_and_apps_cmacs[0],
  403. sizeof(saved_fw_cmac));
  404. pr_debug("saved fw cmac: 0x%08x,0x%08x,0x%08x,0x%08x\n",
  405. saved_fw_cmac[0], saved_fw_cmac[1],
  406. saved_fw_cmac[2], saved_fw_cmac[3]);
  407. /* store the saved apps cmac */
  408. memcpy(saved_apps_cmac, &fw_and_apps_cmacs[1][0],
  409. sizeof(saved_apps_cmac));
  410. /*
  411. * SPSS is loaded now by UEFI,
  412. * so PIL-IAR-callback is not being called on power-up by PIL.
  413. * therefore get the saved spu fw cmac and apps cmac from ioctl.
  414. * The PIL-IAR-callback shall be called on spss SSR.
  415. * The saved cmacs are used on QCOM_SSR_AFTER_POWERUP event !
  416. */
  417. spss_set_saved_fw_cmac(saved_fw_cmac, sizeof(saved_fw_cmac));
  418. spss_set_saved_uefi_apps_cmac();
  419. pr_debug("completed ok\n");
  420. return 0;
  421. }
  422. static long spss_utils_ioctl(struct file *file,
  423. unsigned int cmd, unsigned long arg)
  424. {
  425. int ret;
  426. void *buf = (void *) arg;
  427. uint8_t data[MAX_IOCTL_REQ_SIZE] = {0};
  428. size_t size = 0;
  429. void *req = (void *) data;
  430. if (buf == NULL) {
  431. pr_err("invalid ioctl arg\n");
  432. return -EINVAL;
  433. }
  434. size = _IOC_SIZE(cmd);
  435. if (size && (cmd & IOC_IN)) {
  436. if (size > sizeof(data)) {
  437. pr_err("cmd [0x%x] size [0x%x] too large\n",
  438. cmd, size);
  439. return -EINVAL;
  440. }
  441. if (copy_from_user(data, (void __user *)arg, size)) {
  442. pr_err("copy_from_user() failed, cmd [0x%x] size [0x%x]\n",
  443. cmd, size);
  444. return -EFAULT;
  445. }
  446. }
  447. switch (cmd) {
  448. case SPSS_IOC_SET_FW_AND_APPS_CMAC:
  449. pr_debug("ioctl [SPSS_IOC_SET_FW_AND_APPS_CMAC]\n");
  450. /* spdaemon uses this ioctl only when IAR is active */
  451. is_iar_active = true;
  452. if (cmac_mem == NULL) {
  453. cmac_mem = ioremap(cmac_mem_addr, CMAC_MEM_SIZE);
  454. if (!cmac_mem) {
  455. pr_err("can't map cmac_mem.\n");
  456. return -EFAULT;
  457. }
  458. }
  459. ret = spss_handle_set_fw_and_apps_cmac(req);
  460. if (ret < 0)
  461. return ret;
  462. break;
  463. case SPSS_IOC_WAIT_FOR_EVENT:
  464. /* check input params */
  465. if (size != sizeof(struct spss_ioc_wait_for_event)) {
  466. pr_err("cmd [0x%x] invalid size [0x%x]\n", cmd, size);
  467. return -EINVAL;
  468. }
  469. ret = spss_wait_for_event(req);
  470. if (ret < 0)
  471. return ret;
  472. ret = copy_to_user((void __user *)arg, data, size);
  473. if (ret) {
  474. pr_err("cmd [0x%x] copy_to_user failed - %d\n", cmd, ret);
  475. return ret;
  476. }
  477. break;
  478. case SPSS_IOC_SIGNAL_EVENT:
  479. /* check input params */
  480. if (size != sizeof(struct spss_ioc_signal_event)) {
  481. pr_err("cmd [0x%x] invalid size [0x%x]\n", cmd, size);
  482. return -EINVAL;
  483. }
  484. ret = spss_signal_event(req);
  485. if (ret < 0)
  486. return ret;
  487. ret = copy_to_user((void __user *)arg, data, size);
  488. if (ret) {
  489. pr_err("cmd [0x%x] copy_to_user failed - %d\n", cmd, ret);
  490. return ret;
  491. }
  492. break;
  493. case SPSS_IOC_IS_EVENT_SIGNALED:
  494. /* check input params */
  495. if (size != sizeof(struct spss_ioc_is_signaled)) {
  496. pr_err("cmd [0x%x] invalid size [0x%x]\n", cmd, size);
  497. return -EINVAL;
  498. }
  499. ret = spss_is_event_signaled(req);
  500. if (ret < 0)
  501. return ret;
  502. ret = copy_to_user((void __user *)arg, data, size);
  503. if (ret) {
  504. pr_err("cmd [0x%x] copy_to_user failed - %d\n", cmd, ret);
  505. return ret;
  506. }
  507. break;
  508. case SPSS_IOC_SET_SSR_STATE:
  509. /* check input params */
  510. if (size != sizeof(uint32_t)) {
  511. pr_err("cmd [0x%x] invalid size [0x%x]\n", cmd, size);
  512. return -EINVAL;
  513. }
  514. if (is_iar_active) {
  515. uint32_t tmp = 0;
  516. memcpy(&tmp, data, sizeof(tmp));
  517. is_ssr_disabled = (bool) tmp; /* u32 to bool */
  518. pr_info("SSR disabled state updated to: %d\n",
  519. is_ssr_disabled);
  520. }
  521. pr_info("is_iar_active [%d] is_ssr_disabled [%d].\n",
  522. is_iar_active, is_ssr_disabled);
  523. break;
  524. default:
  525. pr_err("invalid ioctl cmd [0x%x]\n", cmd);
  526. return -ENOIOCTLCMD;
  527. }
  528. return 0;
  529. }
  530. static const struct file_operations spss_utils_fops = {
  531. .owner = THIS_MODULE,
  532. .unlocked_ioctl = spss_utils_ioctl,
  533. .compat_ioctl = spss_utils_ioctl,
  534. };
  535. static int spss_utils_create_chardev(struct device *dev)
  536. {
  537. int ret;
  538. unsigned int baseminor = 0;
  539. unsigned int count = 1;
  540. void *priv = (void *) spss_utils_dev;
  541. spss_utils_dev->cdev =
  542. kzalloc(sizeof(*spss_utils_dev->cdev), GFP_KERNEL);
  543. if (!spss_utils_dev->cdev)
  544. return -ENOMEM;
  545. /* get device_no */
  546. ret = alloc_chrdev_region(&spss_utils_dev->device_no, baseminor, count,
  547. DEVICE_NAME);
  548. if (ret < 0) {
  549. pr_err("alloc_chrdev_region failed %d\n", ret);
  550. return ret;
  551. }
  552. spss_utils_dev->driver_class = class_create(THIS_MODULE, DEVICE_NAME);
  553. if (IS_ERR(spss_utils_dev->driver_class)) {
  554. ret = -ENOMEM;
  555. pr_err("class_create failed %d\n", ret);
  556. goto exit_unreg_chrdev_region;
  557. }
  558. spss_utils_dev->class_dev =
  559. device_create(spss_utils_dev->driver_class, NULL,
  560. spss_utils_dev->device_no, priv,
  561. DEVICE_NAME);
  562. if (IS_ERR(spss_utils_dev->class_dev)) {
  563. pr_err("class_device_create failed %d\n", ret);
  564. ret = -ENOMEM;
  565. goto exit_destroy_class;
  566. }
  567. cdev_init(spss_utils_dev->cdev, &spss_utils_fops);
  568. spss_utils_dev->cdev->owner = THIS_MODULE;
  569. ret = cdev_add(spss_utils_dev->cdev,
  570. MKDEV(MAJOR(spss_utils_dev->device_no), 0),
  571. 1);
  572. if (ret < 0) {
  573. pr_err("cdev_add failed %d\n", ret);
  574. goto exit_destroy_device;
  575. }
  576. pr_debug("char device created.\n");
  577. return 0;
  578. exit_destroy_device:
  579. device_destroy(spss_utils_dev->driver_class, spss_utils_dev->device_no);
  580. exit_destroy_class:
  581. class_destroy(spss_utils_dev->driver_class);
  582. exit_unreg_chrdev_region:
  583. unregister_chrdev_region(spss_utils_dev->device_no, 1);
  584. return ret;
  585. }
  586. static void spss_utils_destroy_chardev(void)
  587. {
  588. device_destroy(spss_utils_dev->driver_class, spss_utils_dev->device_no);
  589. class_destroy(spss_utils_dev->driver_class);
  590. unregister_chrdev_region(spss_utils_dev->device_no, 1);
  591. }
  592. /*==========================================================================*/
  593. /* Device Tree */
  594. /*==========================================================================*/
  595. /* get the ACTUAL spss PIL firmware size from spu reg */
  596. static int get_pil_size(phys_addr_t base_addr)
  597. {
  598. u32 spss_code_size_addr = 0;
  599. void __iomem *spss_code_size_reg = NULL;
  600. u32 pil_size = 0;
  601. spss_code_size_addr = base_addr + SPSS_RMB_CODE_SIZE_REG_OFFSET;
  602. spss_code_size_reg = ioremap(spss_code_size_addr, sizeof(u32));
  603. if (!spss_code_size_reg) {
  604. pr_err("can't map spss_code_size_addr\n");
  605. return -EINVAL;
  606. }
  607. pil_size = readl_relaxed(spss_code_size_reg);
  608. iounmap(spss_code_size_reg);
  609. // Multiply the value read from code size register by factor
  610. // to get the actual size (see MCP_SIZE_MUL_FACTOR documentation)
  611. pil_size *= MCP_SIZE_MUL_FACTOR;
  612. if (pil_size % SZ_4K) {
  613. pr_err("pil_size [0x%08x] is not 4K aligned.\n", pil_size);
  614. return -EFAULT;
  615. }
  616. return pil_size;
  617. }
  618. /**
  619. * spss_parse_dt() - Parse Device Tree info.
  620. */
  621. static int spss_parse_dt(struct device_node *node)
  622. {
  623. int ret;
  624. u32 spss_fuse1_addr = 0;
  625. u32 spss_fuse1_bit = 0;
  626. u32 spss_fuse1_mask = 0;
  627. void __iomem *spss_fuse1_reg = NULL;
  628. u32 spss_fuse2_addr = 0;
  629. u32 spss_fuse2_bit = 0;
  630. u32 spss_fuse2_mask = 0;
  631. void __iomem *spss_fuse2_reg = NULL;
  632. struct device_node *np;
  633. struct resource r;
  634. u32 val1 = 0;
  635. u32 val2 = 0;
  636. void __iomem *spss_emul_type_reg = NULL;
  637. u32 spss_emul_type_val = 0;
  638. phys_addr_t spss_regs_base_addr = 0;
  639. ret = of_property_read_string(node, "qcom,spss-dev-firmware-name",
  640. &dev_firmware_name);
  641. if (ret < 0) {
  642. pr_err("can't get dev fw name\n");
  643. return -EINVAL;
  644. }
  645. ret = of_property_read_string(node, "qcom,spss-test-firmware-name",
  646. &test_firmware_name);
  647. if (ret < 0) {
  648. pr_err("can't get test fw name\n");
  649. return -EINVAL;
  650. }
  651. ret = of_property_read_string(node, "qcom,spss-prod-firmware-name",
  652. &prod_firmware_name);
  653. if (ret < 0) {
  654. pr_err("can't get prod fw name\n");
  655. return -EINVAL;
  656. }
  657. ret = of_property_read_u32(node, "qcom,spss-fuse1-addr",
  658. &spss_fuse1_addr);
  659. if (ret < 0) {
  660. pr_err("can't get fuse1 addr\n");
  661. return -EINVAL;
  662. }
  663. ret = of_property_read_u32(node, "qcom,spss-fuse2-addr",
  664. &spss_fuse2_addr);
  665. if (ret < 0) {
  666. pr_err("can't get fuse2 addr\n");
  667. return -EINVAL;
  668. }
  669. ret = of_property_read_u32(node, "qcom,spss-fuse1-bit",
  670. &spss_fuse1_bit);
  671. if (ret < 0) {
  672. pr_err("can't get fuse1 bit\n");
  673. return -EINVAL;
  674. }
  675. ret = of_property_read_u32(node, "qcom,spss-fuse2-bit",
  676. &spss_fuse2_bit);
  677. if (ret < 0) {
  678. pr_err("can't get fuse2 bit\n");
  679. return -EINVAL;
  680. }
  681. spss_fuse1_mask = BIT(spss_fuse1_bit);
  682. spss_fuse2_mask = BIT(spss_fuse2_bit);
  683. pr_debug("spss fuse1 addr [0x%x] bit [%d]\n",
  684. (int) spss_fuse1_addr, (int) spss_fuse1_bit);
  685. pr_debug("spss fuse2 addr [0x%x] bit [%d]\n",
  686. (int) spss_fuse2_addr, (int) spss_fuse2_bit);
  687. spss_fuse1_reg = ioremap(spss_fuse1_addr, sizeof(u32));
  688. if (!spss_fuse1_reg) {
  689. pr_err("can't map fuse1 addr\n");
  690. return -EINVAL;
  691. }
  692. spss_fuse2_reg = ioremap(spss_fuse2_addr, sizeof(u32));
  693. if (!spss_fuse2_reg) {
  694. iounmap(spss_fuse1_reg);
  695. pr_err("can't map fuse2 addr\n");
  696. return -EINVAL;
  697. }
  698. val1 = readl_relaxed(spss_fuse1_reg);
  699. val2 = readl_relaxed(spss_fuse2_reg);
  700. pr_debug("spss fuse1 value [0x%08x]\n", (int) val1);
  701. pr_debug("spss fuse2 value [0x%08x]\n", (int) val2);
  702. pr_debug("spss fuse1 mask [0x%08x]\n", (int) spss_fuse1_mask);
  703. pr_debug("spss fuse2 mask [0x%08x]\n", (int) spss_fuse2_mask);
  704. /**
  705. * Set firmware_type based on fuses:
  706. * SPSS_CONFIG_MODE 11: prod, changed from DEV to PROD due to
  707. PTE configuration error in Waipio 2.1 CONFIG_MODE 11 will be used
  708. for production signed MCP as workaround.
  709. * SPSS_CONFIG_MODE 01 or 10: test
  710. * SPSS_CONFIG_MODE 00: prod
  711. */
  712. if ((val1 & spss_fuse1_mask) && (val2 & spss_fuse2_mask))
  713. firmware_type = SPSS_FW_TYPE_PROD;
  714. else if ((val1 & spss_fuse1_mask) || (val2 & spss_fuse2_mask))
  715. firmware_type = SPSS_FW_TYPE_TEST;
  716. else
  717. firmware_type = SPSS_FW_TYPE_PROD;
  718. iounmap(spss_fuse1_reg);
  719. iounmap(spss_fuse2_reg);
  720. pr_debug("firmware_type value [%c]\n", firmware_type);
  721. ret = of_property_read_u32(node, "qcom,spss-debug-reg-addr",
  722. &spss_debug_reg_addr);
  723. if (ret < 0) {
  724. pr_err("can't get debug regs addr\n");
  725. return ret;
  726. }
  727. ret = of_property_read_u32(node, "qcom,spss-debug-reg-addr1",
  728. &spss_debug_reg_addr1);
  729. if (ret < 0) {
  730. pr_err("can't get debug regs addr1\n");
  731. return ret;
  732. }
  733. ret = of_property_read_u32(node, "qcom,spss-debug-reg-addr3",
  734. &spss_debug_reg_addr3);
  735. if (ret < 0) {
  736. pr_err("can't get debug regs addr3\n");
  737. return ret;
  738. }
  739. ret = of_property_read_u32(node, "qcom,spss-emul-type-reg-addr",
  740. &spss_emul_type_reg_addr);
  741. if (ret < 0) {
  742. pr_err("can't get spss-emulation-type-reg addr\n");
  743. return -EINVAL;
  744. }
  745. spss_emul_type_reg = ioremap(spss_emul_type_reg_addr,
  746. sizeof(u32));
  747. if (!spss_emul_type_reg) {
  748. pr_err("can't map soc-emulation-type reg addr\n");
  749. return -EINVAL;
  750. }
  751. spss_emul_type_val = readl_relaxed(spss_emul_type_reg);
  752. pr_debug("spss_emul_type value [0x%08x]\n", (int)spss_emul_type_val);
  753. if (spss_emul_type_val & SPU_EMULATUION) {
  754. if (spss_emul_type_val & SPU_PRESENT_IN_EMULATION) {
  755. firmware_type = SPSS_FW_TYPE_TEST;
  756. } else {
  757. /* for some emulation platforms SPSS is not present */
  758. firmware_type = SPSS_FW_TYPE_NONE;
  759. }
  760. pr_debug("remap firmware_type value [%c]\n", firmware_type);
  761. }
  762. iounmap(spss_emul_type_reg);
  763. /* PIL-SPSS area */
  764. np = of_parse_phandle(node, "pil-mem", 0);
  765. if (!np) {
  766. pr_err("no pil-mem entry, check pil-addr\n");
  767. ret = of_property_read_u32(node, "qcom,pil-addr",
  768. &pil_addr);
  769. if (ret < 0) {
  770. pr_err("can't get pil_addr\n");
  771. return -EFAULT;
  772. }
  773. } else {
  774. ret = of_address_to_resource(np, 0, &r);
  775. of_node_put(np);
  776. if (ret)
  777. return ret;
  778. pil_addr = (u32)r.start;
  779. }
  780. spss_regs_base_addr =
  781. (spss_debug_reg_addr & SPSS_BASE_ADDR_MASK);
  782. ret = get_pil_size(spss_regs_base_addr);
  783. if (ret < 0) {
  784. pr_err("failed to get pil_size.\n");
  785. return -EFAULT;
  786. }
  787. pil_size = (u32) ret;
  788. pr_debug("pil_addr [0x%08x].\n", pil_addr);
  789. pr_debug("pil_size [0x%08x].\n", pil_size);
  790. /* cmac buffer after spss firmware end */
  791. cmac_mem_addr = pil_addr + pil_size;
  792. pr_info("iar_buf_addr [0x%08x].\n", cmac_mem_addr);
  793. memset(saved_fw_cmac, 0xA5, sizeof(saved_fw_cmac));
  794. memset(saved_apps_cmac, 0xA5, sizeof(saved_apps_cmac));
  795. return 0;
  796. }
  797. static int spss_set_saved_fw_cmac(u32 *cmac, size_t cmac_size)
  798. {
  799. u8 __iomem *reg = NULL;
  800. int i;
  801. if (cmac_mem == NULL) {
  802. pr_err("invalid cmac_mem.\n");
  803. return -EFAULT;
  804. }
  805. reg = cmac_mem;
  806. for (i = 0; i < cmac_size/sizeof(u32); i++)
  807. writel_relaxed(cmac[i], reg + i*sizeof(u32));
  808. pr_debug("saved fw cmac: 0x%08x,0x%08x,0x%08x,0x%08x\n",
  809. cmac[0], cmac[1], cmac[2], cmac[3]);
  810. return 0;
  811. }
  812. static int spss_get_fw_calc_cmac(void)
  813. {
  814. u8 __iomem *reg = NULL;
  815. int i;
  816. u32 val;
  817. u32 cmac[CMAC_SIZE_IN_DWORDS] = {0};
  818. if (cmac_mem == NULL) {
  819. pr_err("invalid cmac_mem.\n");
  820. return -EFAULT;
  821. }
  822. reg = cmac_mem; /* IAR buffer base */
  823. reg += CMAC_SIZE_IN_BYTES; /* skip the saved cmac */
  824. memset(calc_fw_cmac, 0, sizeof(calc_fw_cmac));
  825. /* get pbl fw cmac from ddr */
  826. for (i = 0; i < CMAC_SIZE_IN_DWORDS; i++) {
  827. val = readl_relaxed(reg);
  828. calc_fw_cmac[i] = val;
  829. reg += sizeof(u32);
  830. }
  831. /* check for any pattern to mark invalid cmac */
  832. if (cmac[0] == cmac[1])
  833. return -EINVAL; /* not valid cmac */
  834. memcpy(calc_fw_cmac, cmac, sizeof(calc_fw_cmac));
  835. pr_debug("calc_fw_cmac : 0x%08x,0x%08x,0x%08x,0x%08x\n",
  836. calc_fw_cmac[0], calc_fw_cmac[1],
  837. calc_fw_cmac[2], calc_fw_cmac[3]);
  838. return 0;
  839. }
  840. static int spss_get_apps_calc_cmac(void)
  841. {
  842. u8 __iomem *reg = NULL;
  843. int i, j;
  844. u32 val;
  845. if (cmac_mem == NULL) {
  846. pr_err("invalid cmac_mem.\n");
  847. return -EFAULT;
  848. }
  849. reg = cmac_mem; /* IAR buffer base */
  850. reg += CMAC_SIZE_IN_BYTES; /* skip the saved fw cmac */
  851. reg += CMAC_SIZE_IN_BYTES; /* skip the calc fw cmac */
  852. reg += CMAC_SIZE_IN_BYTES; /* skip the saved 1st app cmac */
  853. memset(calc_apps_cmac, 0, sizeof(calc_apps_cmac));
  854. /* get apps cmac from ddr */
  855. for (j = 0; j < ARRAY_SIZE(calc_apps_cmac); j++) {
  856. u32 cmac[CMAC_SIZE_IN_DWORDS] = {0};
  857. memset(cmac, 0, sizeof(cmac));
  858. for (i = 0; i < ARRAY_SIZE(cmac); i++) {
  859. val = readl_relaxed(reg);
  860. cmac[i] = val;
  861. reg += sizeof(u32);
  862. }
  863. reg += CMAC_SIZE_IN_BYTES; /* skip the saved cmac */
  864. /* check for any pattern to mark end of cmacs */
  865. if (cmac[0] == cmac[1])
  866. break; /* no more valid cmacs */
  867. memcpy(calc_apps_cmac[j], cmac, sizeof(calc_apps_cmac[j]));
  868. pr_debug("app [%d] cmac : 0x%08x,0x%08x,0x%08x,0x%08x\n", j,
  869. calc_apps_cmac[j][0], calc_apps_cmac[j][1],
  870. calc_apps_cmac[j][2], calc_apps_cmac[j][3]);
  871. }
  872. return 0;
  873. }
  874. static int spss_set_saved_uefi_apps_cmac(void)
  875. {
  876. u8 __iomem *reg = NULL;
  877. int i, j;
  878. u32 val;
  879. if (cmac_mem == NULL) {
  880. pr_err("invalid cmac_mem.\n");
  881. return -EFAULT;
  882. }
  883. reg = cmac_mem; /* IAR buffer base */
  884. reg += (2*CMAC_SIZE_IN_BYTES); /* skip the saved and calc fw cmac */
  885. /* get saved apps cmac from ddr - were written by UEFI spss driver */
  886. for (j = 0; j < MAX_SPU_UEFI_APPS; j++) {
  887. if (saved_apps_cmac[j][0] == saved_apps_cmac[j][1])
  888. break; /* no more cmacs */
  889. for (i = 0; i < CMAC_SIZE_IN_DWORDS; i++) {
  890. val = saved_apps_cmac[j][i];
  891. writel_relaxed(val, reg);
  892. reg += sizeof(u32);
  893. }
  894. reg += CMAC_SIZE_IN_BYTES; /* skip the calc app cmac */
  895. pr_debug("app[%d] saved cmac: 0x%08x,0x%08x,0x%08x,0x%08x\n",
  896. j,
  897. saved_apps_cmac[j][0], saved_apps_cmac[j][1],
  898. saved_apps_cmac[j][2], saved_apps_cmac[j][3]);
  899. }
  900. return 0;
  901. }
  902. static int spss_utils_rproc_callback(struct notifier_block *nb,
  903. unsigned long code,
  904. void *data)
  905. {
  906. int i, event_id;
  907. switch (code) {
  908. case QCOM_SSR_BEFORE_SHUTDOWN:
  909. pr_debug("[QCOM_SSR_BEFORE_SHUTDOWN] event.\n");
  910. mutex_lock(&event_lock);
  911. /* Reset NVM-ready and SPU-ready events */
  912. for (i = SPSS_EVENT_ID_NVM_READY;
  913. i <= SPSS_EVENT_ID_SPU_READY; i++) {
  914. reinit_completion(&spss_events[i]);
  915. spss_events_signaled[i] = false;
  916. }
  917. mutex_unlock(&event_lock);
  918. pr_debug("reset spss events.\n");
  919. break;
  920. case QCOM_SSR_AFTER_SHUTDOWN:
  921. pr_debug("[QCOM_SSR_AFTER_SHUTDOWN] event.\n");
  922. mutex_lock(&event_lock);
  923. event_id = SPSS_EVENT_ID_SPU_POWER_DOWN;
  924. complete_all(&spss_events[event_id]);
  925. spss_events_signaled[event_id] = true;
  926. event_id = SPSS_EVENT_ID_SPU_POWER_UP;
  927. reinit_completion(&spss_events[event_id]);
  928. spss_events_signaled[event_id] = false;
  929. mutex_unlock(&event_lock);
  930. break;
  931. case QCOM_SSR_BEFORE_POWERUP:
  932. pr_debug("[QCOM_SSR_BEFORE_POWERUP] event.\n");
  933. if (is_iar_active) {
  934. if (is_ssr_disabled) {
  935. pr_warn("SPSS SSR disabled, requesting reboot\n");
  936. kernel_restart("SPSS SSR disabled, requesting reboot");
  937. } else {
  938. /* Called on SSR as spss firmware is loaded by UEFI */
  939. spss_set_saved_fw_cmac(saved_fw_cmac, sizeof(saved_fw_cmac));
  940. spss_set_saved_uefi_apps_cmac();
  941. }
  942. }
  943. break;
  944. case QCOM_SSR_AFTER_POWERUP:
  945. pr_info("QCOM_SSR_AFTER_POWERUP] event.\n");
  946. mutex_lock(&event_lock);
  947. event_id = SPSS_EVENT_ID_SPU_POWER_UP;
  948. complete_all(&spss_events[event_id]);
  949. spss_events_signaled[event_id] = true;
  950. event_id = SPSS_EVENT_ID_SPU_POWER_DOWN;
  951. reinit_completion(&spss_events[event_id]);
  952. spss_events_signaled[event_id] = false;
  953. mutex_unlock(&event_lock);
  954. /*
  955. * For IAR-DB-Recovery, read cmac regadless of is_iar_active.
  956. * please notice that HYP unmap this area, it is a race.
  957. */
  958. if (cmac_mem == NULL) {
  959. cmac_mem = ioremap(cmac_mem_addr, CMAC_MEM_SIZE);
  960. if (!cmac_mem) {
  961. pr_err("can't map cmac_mem.\n");
  962. return -EFAULT;
  963. }
  964. }
  965. spss_get_fw_calc_cmac();
  966. spss_get_apps_calc_cmac();
  967. break;
  968. default:
  969. pr_err("unknown code [0x%x] .\n", (int) code);
  970. break;
  971. }
  972. return NOTIFY_OK;
  973. }
  974. /**
  975. * spss_probe() - initialization sequence
  976. */
  977. static int spss_probe(struct platform_device *pdev)
  978. {
  979. int ret = 0;
  980. int i;
  981. struct device_node *np = NULL;
  982. struct device *dev = &pdev->dev;
  983. struct property *prop = NULL;
  984. struct rproc *rproc = NULL;
  985. np = pdev->dev.of_node;
  986. spss_dev = dev;
  987. platform_set_drvdata(pdev, dev);
  988. ret = spss_parse_dt(np);
  989. if (ret < 0)
  990. return ret;
  991. switch (firmware_type) {
  992. case SPSS_FW_TYPE_DEV:
  993. firmware_name = dev_firmware_name;
  994. break;
  995. case SPSS_FW_TYPE_TEST:
  996. firmware_name = test_firmware_name;
  997. break;
  998. case SPSS_FW_TYPE_PROD:
  999. firmware_name = prod_firmware_name;
  1000. break;
  1001. case SPSS_FW_TYPE_NONE:
  1002. firmware_name = none_firmware_name;
  1003. break;
  1004. default:
  1005. pr_err("invalid firmware type %d, sysfs entry not created\n",
  1006. firmware_type);
  1007. return -EINVAL;
  1008. }
  1009. prop = of_find_property(np, "qcom,rproc-handle", NULL);
  1010. if (!prop)
  1011. return -EINVAL;
  1012. rproc = rproc_get_by_phandle(be32_to_cpup(prop->value));
  1013. if (!rproc)
  1014. return -EPROBE_DEFER;
  1015. ret = qcom_spss_set_fw_name(rproc, firmware_name);
  1016. if (ret < 0) {
  1017. if (ret != -EINVAL)
  1018. pr_err("fail to set firmware name for remoteproc (%d)\n", ret);
  1019. return -EPROBE_DEFER;
  1020. }
  1021. rproc_put(rproc);
  1022. spss_utils_dev = kzalloc(sizeof(*spss_utils_dev), GFP_KERNEL);
  1023. if (spss_utils_dev == NULL)
  1024. return -ENOMEM;
  1025. ret = spss_utils_create_chardev(dev);
  1026. if (ret < 0)
  1027. return ret;
  1028. ret = spss_create_sysfs(dev);
  1029. if (ret < 0)
  1030. return ret;
  1031. iar_nb = kzalloc(sizeof(*iar_nb), GFP_KERNEL);
  1032. if (!iar_nb)
  1033. return -ENOMEM;
  1034. iar_nb->notifier_call = spss_utils_rproc_callback;
  1035. iar_notif_handle = qcom_register_ssr_notifier("spss", iar_nb);
  1036. if (IS_ERR_OR_NULL(iar_notif_handle)) {
  1037. pr_err("register fail for IAR notifier\n");
  1038. kfree(iar_nb);
  1039. iar_notif_handle = NULL;
  1040. iar_nb = NULL;
  1041. }
  1042. for (i = 0 ; i < SPSS_NUM_EVENTS; i++) {
  1043. init_completion(&spss_events[i]);
  1044. spss_events_signaled[i] = false;
  1045. }
  1046. mutex_init(&event_lock);
  1047. is_iar_active = false;
  1048. is_ssr_disabled = false;
  1049. pr_info("Probe completed successfully, [%s].\n", firmware_name);
  1050. return 0;
  1051. }
  1052. static int spss_remove(struct platform_device *pdev)
  1053. {
  1054. spss_utils_destroy_chardev();
  1055. spss_destroy_sysfs(spss_dev);
  1056. if (!iar_notif_handle && !iar_nb)
  1057. qcom_unregister_ssr_notifier(iar_notif_handle, iar_nb);
  1058. kfree(iar_nb);
  1059. iar_nb = 0;
  1060. kfree(spss_utils_dev);
  1061. spss_utils_dev = 0;
  1062. if (cmac_mem != NULL) {
  1063. iounmap(cmac_mem);
  1064. cmac_mem = NULL;
  1065. }
  1066. return 0;
  1067. }
  1068. static const struct of_device_id spss_match_table[] = {
  1069. { .compatible = "qcom,spss-utils", },
  1070. { },
  1071. };
  1072. static struct platform_driver spss_driver = {
  1073. .probe = spss_probe,
  1074. .remove = spss_remove,
  1075. .driver = {
  1076. .name = DEVICE_NAME,
  1077. .of_match_table = of_match_ptr(spss_match_table),
  1078. },
  1079. };
  1080. /*==========================================================================*/
  1081. /* Driver Init/Exit */
  1082. /*==========================================================================*/
  1083. static int __init spss_init(void)
  1084. {
  1085. int ret = 0;
  1086. ret = platform_driver_register(&spss_driver);
  1087. if (ret)
  1088. pr_err("register platform driver failed, ret [%d]\n", ret);
  1089. return ret;
  1090. }
  1091. late_initcall(spss_init); /* start after PIL driver */
  1092. static void __exit spss_exit(void)
  1093. {
  1094. platform_driver_unregister(&spss_driver);
  1095. }
  1096. module_exit(spss_exit)
  1097. MODULE_SOFTDEP("pre: qcom_spss");
  1098. MODULE_LICENSE("GPL v2");
  1099. MODULE_DESCRIPTION("Secure Processor Utilities");