spss_utils.c 33 KB

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