xhci-pci-renesas.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright (C) 2019-2020 Linaro Limited */
  3. #include <linux/acpi.h>
  4. #include <linux/firmware.h>
  5. #include <linux/module.h>
  6. #include <linux/pci.h>
  7. #include <linux/slab.h>
  8. #include <asm/unaligned.h>
  9. #include "xhci.h"
  10. #include "xhci-trace.h"
  11. #include "xhci-pci.h"
  12. #define RENESAS_FW_VERSION 0x6C
  13. #define RENESAS_ROM_CONFIG 0xF0
  14. #define RENESAS_FW_STATUS 0xF4
  15. #define RENESAS_FW_STATUS_MSB 0xF5
  16. #define RENESAS_ROM_STATUS 0xF6
  17. #define RENESAS_ROM_STATUS_MSB 0xF7
  18. #define RENESAS_DATA0 0xF8
  19. #define RENESAS_DATA1 0xFC
  20. #define RENESAS_FW_VERSION_FIELD GENMASK(23, 7)
  21. #define RENESAS_FW_VERSION_OFFSET 8
  22. #define RENESAS_FW_STATUS_DOWNLOAD_ENABLE BIT(0)
  23. #define RENESAS_FW_STATUS_LOCK BIT(1)
  24. #define RENESAS_FW_STATUS_RESULT GENMASK(6, 4)
  25. #define RENESAS_FW_STATUS_INVALID 0
  26. #define RENESAS_FW_STATUS_SUCCESS BIT(4)
  27. #define RENESAS_FW_STATUS_ERROR BIT(5)
  28. #define RENESAS_FW_STATUS_SET_DATA0 BIT(8)
  29. #define RENESAS_FW_STATUS_SET_DATA1 BIT(9)
  30. #define RENESAS_ROM_STATUS_ACCESS BIT(0)
  31. #define RENESAS_ROM_STATUS_ERASE BIT(1)
  32. #define RENESAS_ROM_STATUS_RELOAD BIT(2)
  33. #define RENESAS_ROM_STATUS_RESULT GENMASK(6, 4)
  34. #define RENESAS_ROM_STATUS_NO_RESULT 0
  35. #define RENESAS_ROM_STATUS_SUCCESS BIT(4)
  36. #define RENESAS_ROM_STATUS_ERROR BIT(5)
  37. #define RENESAS_ROM_STATUS_SET_DATA0 BIT(8)
  38. #define RENESAS_ROM_STATUS_SET_DATA1 BIT(9)
  39. #define RENESAS_ROM_STATUS_ROM_EXISTS BIT(15)
  40. #define RENESAS_ROM_ERASE_MAGIC 0x5A65726F
  41. #define RENESAS_ROM_WRITE_MAGIC 0x53524F4D
  42. #define RENESAS_RETRY 10000
  43. #define RENESAS_DELAY 10
  44. static int renesas_fw_download_image(struct pci_dev *dev,
  45. const u32 *fw, size_t step, bool rom)
  46. {
  47. size_t i;
  48. int err;
  49. u8 fw_status;
  50. bool data0_or_data1;
  51. u32 status_reg;
  52. if (rom)
  53. status_reg = RENESAS_ROM_STATUS_MSB;
  54. else
  55. status_reg = RENESAS_FW_STATUS_MSB;
  56. /*
  57. * The hardware does alternate between two 32-bit pages.
  58. * (This is because each row of the firmware is 8 bytes).
  59. *
  60. * for even steps we use DATA0, for odd steps DATA1.
  61. */
  62. data0_or_data1 = (step & 1) == 1;
  63. /* step+1. Read "Set DATAX" and confirm it is cleared. */
  64. for (i = 0; i < RENESAS_RETRY; i++) {
  65. err = pci_read_config_byte(dev, status_reg, &fw_status);
  66. if (err) {
  67. dev_err(&dev->dev, "Read Status failed: %d\n",
  68. pcibios_err_to_errno(err));
  69. return pcibios_err_to_errno(err);
  70. }
  71. if (!(fw_status & BIT(data0_or_data1)))
  72. break;
  73. udelay(RENESAS_DELAY);
  74. }
  75. if (i == RENESAS_RETRY) {
  76. dev_err(&dev->dev, "Timeout for Set DATAX step: %zd\n", step);
  77. return -ETIMEDOUT;
  78. }
  79. /*
  80. * step+2. Write FW data to "DATAX".
  81. * "LSB is left" => force little endian
  82. */
  83. err = pci_write_config_dword(dev, data0_or_data1 ?
  84. RENESAS_DATA1 : RENESAS_DATA0,
  85. (__force u32)cpu_to_le32(fw[step]));
  86. if (err) {
  87. dev_err(&dev->dev, "Write to DATAX failed: %d\n",
  88. pcibios_err_to_errno(err));
  89. return pcibios_err_to_errno(err);
  90. }
  91. udelay(100);
  92. /* step+3. Set "Set DATAX". */
  93. err = pci_write_config_byte(dev, status_reg, BIT(data0_or_data1));
  94. if (err) {
  95. dev_err(&dev->dev, "Write config for DATAX failed: %d\n",
  96. pcibios_err_to_errno(err));
  97. return pcibios_err_to_errno(err);
  98. }
  99. return 0;
  100. }
  101. static int renesas_fw_verify(const void *fw_data,
  102. size_t length)
  103. {
  104. u16 fw_version_pointer;
  105. /*
  106. * The Firmware's Data Format is describe in
  107. * "6.3 Data Format" R19UH0078EJ0500 Rev.5.00 page 124
  108. */
  109. /*
  110. * The bootrom chips of the big brother have sizes up to 64k, let's
  111. * assume that's the biggest the firmware can get.
  112. */
  113. if (length < 0x1000 || length >= 0x10000) {
  114. pr_err("firmware is size %zd is not (4k - 64k).",
  115. length);
  116. return -EINVAL;
  117. }
  118. /* The First 2 bytes are fixed value (55aa). "LSB on Left" */
  119. if (get_unaligned_le16(fw_data) != 0x55aa) {
  120. pr_err("no valid firmware header found.");
  121. return -EINVAL;
  122. }
  123. /* verify the firmware version position and print it. */
  124. fw_version_pointer = get_unaligned_le16(fw_data + 4);
  125. if (fw_version_pointer + 2 >= length) {
  126. pr_err("fw ver pointer is outside of the firmware image");
  127. return -EINVAL;
  128. }
  129. return 0;
  130. }
  131. static bool renesas_check_rom(struct pci_dev *pdev)
  132. {
  133. u16 rom_status;
  134. int retval;
  135. /* Check if external ROM exists */
  136. retval = pci_read_config_word(pdev, RENESAS_ROM_STATUS, &rom_status);
  137. if (retval)
  138. return false;
  139. rom_status &= RENESAS_ROM_STATUS_ROM_EXISTS;
  140. if (rom_status) {
  141. dev_dbg(&pdev->dev, "External ROM exists\n");
  142. return true; /* External ROM exists */
  143. }
  144. return false;
  145. }
  146. static int renesas_check_rom_state(struct pci_dev *pdev)
  147. {
  148. u16 rom_state;
  149. u32 version;
  150. int err;
  151. /* check FW version */
  152. err = pci_read_config_dword(pdev, RENESAS_FW_VERSION, &version);
  153. if (err)
  154. return pcibios_err_to_errno(err);
  155. version &= RENESAS_FW_VERSION_FIELD;
  156. version = version >> RENESAS_FW_VERSION_OFFSET;
  157. dev_dbg(&pdev->dev, "Found ROM version: %x\n", version);
  158. /*
  159. * Test if ROM is present and loaded, if so we can skip everything
  160. */
  161. err = pci_read_config_word(pdev, RENESAS_ROM_STATUS, &rom_state);
  162. if (err)
  163. return pcibios_err_to_errno(err);
  164. if (rom_state & RENESAS_ROM_STATUS_ROM_EXISTS) {
  165. /* ROM exists */
  166. dev_dbg(&pdev->dev, "ROM exists\n");
  167. /* Check the "Result Code" Bits (6:4) and act accordingly */
  168. switch (rom_state & RENESAS_ROM_STATUS_RESULT) {
  169. case RENESAS_ROM_STATUS_SUCCESS:
  170. return 0;
  171. case RENESAS_ROM_STATUS_NO_RESULT: /* No result yet */
  172. dev_dbg(&pdev->dev, "Unknown ROM status ...\n");
  173. return -ENOENT;
  174. case RENESAS_ROM_STATUS_ERROR: /* Error State */
  175. default: /* All other states are marked as "Reserved states" */
  176. dev_err(&pdev->dev, "Invalid ROM..");
  177. break;
  178. }
  179. }
  180. return -EIO;
  181. }
  182. static int renesas_fw_check_running(struct pci_dev *pdev)
  183. {
  184. u8 fw_state;
  185. int err;
  186. /*
  187. * Test if the device is actually needing the firmware. As most
  188. * BIOSes will initialize the device for us. If the device is
  189. * initialized.
  190. */
  191. err = pci_read_config_byte(pdev, RENESAS_FW_STATUS, &fw_state);
  192. if (err)
  193. return pcibios_err_to_errno(err);
  194. /*
  195. * Check if "FW Download Lock" is locked. If it is and the FW is
  196. * ready we can simply continue. If the FW is not ready, we have
  197. * to give up.
  198. */
  199. if (fw_state & RENESAS_FW_STATUS_LOCK) {
  200. dev_dbg(&pdev->dev, "FW Download Lock is engaged.");
  201. if (fw_state & RENESAS_FW_STATUS_SUCCESS)
  202. return 0;
  203. dev_err(&pdev->dev,
  204. "FW Download Lock is set and FW is not ready. Giving Up.");
  205. return -EIO;
  206. }
  207. /*
  208. * Check if "FW Download Enable" is set. If someone (us?) tampered
  209. * with it and it can't be reset, we have to give up too... and
  210. * ask for a forgiveness and a reboot.
  211. */
  212. if (fw_state & RENESAS_FW_STATUS_DOWNLOAD_ENABLE) {
  213. dev_err(&pdev->dev,
  214. "FW Download Enable is stale. Giving Up (poweroff/reboot needed).");
  215. return -EIO;
  216. }
  217. /* Otherwise, Check the "Result Code" Bits (6:4) and act accordingly */
  218. switch (fw_state & RENESAS_FW_STATUS_RESULT) {
  219. case 0: /* No result yet */
  220. dev_dbg(&pdev->dev, "FW is not ready/loaded yet.");
  221. /* tell the caller, that this device needs the firmware. */
  222. return 1;
  223. case RENESAS_FW_STATUS_SUCCESS: /* Success, device should be working. */
  224. dev_dbg(&pdev->dev, "FW is ready.");
  225. return 0;
  226. case RENESAS_FW_STATUS_ERROR: /* Error State */
  227. dev_err(&pdev->dev,
  228. "hardware is in an error state. Giving up (poweroff/reboot needed).");
  229. return -ENODEV;
  230. default: /* All other states are marked as "Reserved states" */
  231. dev_err(&pdev->dev,
  232. "hardware is in an invalid state %lx. Giving up (poweroff/reboot needed).",
  233. (fw_state & RENESAS_FW_STATUS_RESULT) >> 4);
  234. return -EINVAL;
  235. }
  236. }
  237. static int renesas_fw_download(struct pci_dev *pdev,
  238. const struct firmware *fw)
  239. {
  240. const u32 *fw_data = (const u32 *)fw->data;
  241. size_t i;
  242. int err;
  243. u8 fw_status;
  244. /*
  245. * For more information and the big picture: please look at the
  246. * "Firmware Download Sequence" in "7.1 FW Download Interface"
  247. * of R19UH0078EJ0500 Rev.5.00 page 131
  248. */
  249. /*
  250. * 0. Set "FW Download Enable" bit in the
  251. * "FW Download Control & Status Register" at 0xF4
  252. */
  253. err = pci_write_config_byte(pdev, RENESAS_FW_STATUS,
  254. RENESAS_FW_STATUS_DOWNLOAD_ENABLE);
  255. if (err)
  256. return pcibios_err_to_errno(err);
  257. /* 1 - 10 follow one step after the other. */
  258. for (i = 0; i < fw->size / 4; i++) {
  259. err = renesas_fw_download_image(pdev, fw_data, i, false);
  260. if (err) {
  261. dev_err(&pdev->dev,
  262. "Firmware Download Step %zd failed at position %zd bytes with (%d).",
  263. i, i * 4, err);
  264. return err;
  265. }
  266. }
  267. /*
  268. * This sequence continues until the last data is written to
  269. * "DATA0" or "DATA1". Naturally, we wait until "SET DATA0/1"
  270. * is cleared by the hardware beforehand.
  271. */
  272. for (i = 0; i < RENESAS_RETRY; i++) {
  273. err = pci_read_config_byte(pdev, RENESAS_FW_STATUS_MSB,
  274. &fw_status);
  275. if (err)
  276. return pcibios_err_to_errno(err);
  277. if (!(fw_status & (BIT(0) | BIT(1))))
  278. break;
  279. udelay(RENESAS_DELAY);
  280. }
  281. if (i == RENESAS_RETRY)
  282. dev_warn(&pdev->dev, "Final Firmware Download step timed out.");
  283. /*
  284. * 11. After finishing writing the last data of FW, the
  285. * System Software must clear "FW Download Enable"
  286. */
  287. err = pci_write_config_byte(pdev, RENESAS_FW_STATUS, 0);
  288. if (err)
  289. return pcibios_err_to_errno(err);
  290. /* 12. Read "Result Code" and confirm it is good. */
  291. for (i = 0; i < RENESAS_RETRY; i++) {
  292. err = pci_read_config_byte(pdev, RENESAS_FW_STATUS, &fw_status);
  293. if (err)
  294. return pcibios_err_to_errno(err);
  295. if (fw_status & RENESAS_FW_STATUS_SUCCESS)
  296. break;
  297. udelay(RENESAS_DELAY);
  298. }
  299. if (i == RENESAS_RETRY) {
  300. /* Timed out / Error - let's see if we can fix this */
  301. err = renesas_fw_check_running(pdev);
  302. switch (err) {
  303. case 0: /*
  304. * we shouldn't end up here.
  305. * maybe it took a little bit longer.
  306. * But all should be well?
  307. */
  308. break;
  309. case 1: /* (No result yet! */
  310. dev_err(&pdev->dev, "FW Load timedout");
  311. return -ETIMEDOUT;
  312. default:
  313. return err;
  314. }
  315. }
  316. return 0;
  317. }
  318. static void renesas_rom_erase(struct pci_dev *pdev)
  319. {
  320. int retval, i;
  321. u8 status;
  322. dev_dbg(&pdev->dev, "Performing ROM Erase...\n");
  323. retval = pci_write_config_dword(pdev, RENESAS_DATA0,
  324. RENESAS_ROM_ERASE_MAGIC);
  325. if (retval) {
  326. dev_err(&pdev->dev, "ROM erase, magic word write failed: %d\n",
  327. pcibios_err_to_errno(retval));
  328. return;
  329. }
  330. retval = pci_read_config_byte(pdev, RENESAS_ROM_STATUS, &status);
  331. if (retval) {
  332. dev_err(&pdev->dev, "ROM status read failed: %d\n",
  333. pcibios_err_to_errno(retval));
  334. return;
  335. }
  336. status |= RENESAS_ROM_STATUS_ERASE;
  337. retval = pci_write_config_byte(pdev, RENESAS_ROM_STATUS, status);
  338. if (retval) {
  339. dev_err(&pdev->dev, "ROM erase set word write failed\n");
  340. return;
  341. }
  342. /* sleep a bit while ROM is erased */
  343. msleep(20);
  344. for (i = 0; i < RENESAS_RETRY; i++) {
  345. retval = pci_read_config_byte(pdev, RENESAS_ROM_STATUS,
  346. &status);
  347. status &= RENESAS_ROM_STATUS_ERASE;
  348. if (!status)
  349. break;
  350. mdelay(RENESAS_DELAY);
  351. }
  352. if (i == RENESAS_RETRY)
  353. dev_dbg(&pdev->dev, "Chip erase timedout: %x\n", status);
  354. dev_dbg(&pdev->dev, "ROM Erase... Done success\n");
  355. }
  356. static bool renesas_setup_rom(struct pci_dev *pdev, const struct firmware *fw)
  357. {
  358. const u32 *fw_data = (const u32 *)fw->data;
  359. int err, i;
  360. u8 status;
  361. /* 2. Write magic word to Data0 */
  362. err = pci_write_config_dword(pdev, RENESAS_DATA0,
  363. RENESAS_ROM_WRITE_MAGIC);
  364. if (err)
  365. return false;
  366. /* 3. Set External ROM access */
  367. err = pci_write_config_byte(pdev, RENESAS_ROM_STATUS,
  368. RENESAS_ROM_STATUS_ACCESS);
  369. if (err)
  370. goto remove_bypass;
  371. /* 4. Check the result */
  372. err = pci_read_config_byte(pdev, RENESAS_ROM_STATUS, &status);
  373. if (err)
  374. goto remove_bypass;
  375. status &= GENMASK(6, 4);
  376. if (status) {
  377. dev_err(&pdev->dev,
  378. "setting external rom failed: %x\n", status);
  379. goto remove_bypass;
  380. }
  381. /* 5 to 16 Write FW to DATA0/1 while checking SetData0/1 */
  382. for (i = 0; i < fw->size / 4; i++) {
  383. err = renesas_fw_download_image(pdev, fw_data, i, true);
  384. if (err) {
  385. dev_err(&pdev->dev,
  386. "ROM Download Step %d failed at position %d bytes with (%d)\n",
  387. i, i * 4, err);
  388. goto remove_bypass;
  389. }
  390. }
  391. /*
  392. * wait till DATA0/1 is cleared
  393. */
  394. for (i = 0; i < RENESAS_RETRY; i++) {
  395. err = pci_read_config_byte(pdev, RENESAS_ROM_STATUS_MSB,
  396. &status);
  397. if (err)
  398. goto remove_bypass;
  399. if (!(status & (BIT(0) | BIT(1))))
  400. break;
  401. udelay(RENESAS_DELAY);
  402. }
  403. if (i == RENESAS_RETRY) {
  404. dev_err(&pdev->dev, "Final Firmware ROM Download step timed out\n");
  405. goto remove_bypass;
  406. }
  407. /* 17. Remove bypass */
  408. err = pci_write_config_byte(pdev, RENESAS_ROM_STATUS, 0);
  409. if (err)
  410. return false;
  411. udelay(10);
  412. /* 18. check result */
  413. for (i = 0; i < RENESAS_RETRY; i++) {
  414. err = pci_read_config_byte(pdev, RENESAS_ROM_STATUS, &status);
  415. if (err) {
  416. dev_err(&pdev->dev, "Read ROM status failed:%d\n",
  417. pcibios_err_to_errno(err));
  418. return false;
  419. }
  420. status &= RENESAS_ROM_STATUS_RESULT;
  421. if (status == RENESAS_ROM_STATUS_SUCCESS) {
  422. dev_dbg(&pdev->dev, "Download ROM success\n");
  423. break;
  424. }
  425. udelay(RENESAS_DELAY);
  426. }
  427. if (i == RENESAS_RETRY) { /* Timed out */
  428. dev_err(&pdev->dev,
  429. "Download to external ROM TO: %x\n", status);
  430. return false;
  431. }
  432. dev_dbg(&pdev->dev, "Download to external ROM succeeded\n");
  433. /* Last step set Reload */
  434. err = pci_write_config_byte(pdev, RENESAS_ROM_STATUS,
  435. RENESAS_ROM_STATUS_RELOAD);
  436. if (err) {
  437. dev_err(&pdev->dev, "Set ROM execute failed: %d\n",
  438. pcibios_err_to_errno(err));
  439. return false;
  440. }
  441. /*
  442. * wait till Reload is cleared
  443. */
  444. for (i = 0; i < RENESAS_RETRY; i++) {
  445. err = pci_read_config_byte(pdev, RENESAS_ROM_STATUS, &status);
  446. if (err)
  447. return false;
  448. if (!(status & RENESAS_ROM_STATUS_RELOAD))
  449. break;
  450. udelay(RENESAS_DELAY);
  451. }
  452. if (i == RENESAS_RETRY) {
  453. dev_err(&pdev->dev, "ROM Exec timed out: %x\n", status);
  454. return false;
  455. }
  456. return true;
  457. remove_bypass:
  458. pci_write_config_byte(pdev, RENESAS_ROM_STATUS, 0);
  459. return false;
  460. }
  461. static int renesas_load_fw(struct pci_dev *pdev, const struct firmware *fw)
  462. {
  463. int err = 0;
  464. bool rom;
  465. /* Check if the device has external ROM */
  466. rom = renesas_check_rom(pdev);
  467. if (rom) {
  468. /* perform chip erase first */
  469. renesas_rom_erase(pdev);
  470. /* lets try loading fw on ROM first */
  471. rom = renesas_setup_rom(pdev, fw);
  472. if (!rom) {
  473. dev_dbg(&pdev->dev,
  474. "ROM load failed, falling back on FW load\n");
  475. } else {
  476. dev_dbg(&pdev->dev,
  477. "ROM load success\n");
  478. goto exit;
  479. }
  480. }
  481. err = renesas_fw_download(pdev, fw);
  482. exit:
  483. if (err)
  484. dev_err(&pdev->dev, "firmware failed to download (%d).", err);
  485. return err;
  486. }
  487. int renesas_xhci_check_request_fw(struct pci_dev *pdev,
  488. const struct pci_device_id *id)
  489. {
  490. struct xhci_driver_data *driver_data =
  491. (struct xhci_driver_data *)id->driver_data;
  492. const char *fw_name = driver_data->firmware;
  493. const struct firmware *fw;
  494. bool has_rom;
  495. int err;
  496. /* Check if device has ROM and loaded, if so skip everything */
  497. has_rom = renesas_check_rom(pdev);
  498. if (has_rom) {
  499. err = renesas_check_rom_state(pdev);
  500. if (!err)
  501. return 0;
  502. else if (err != -ENOENT)
  503. has_rom = false;
  504. }
  505. err = renesas_fw_check_running(pdev);
  506. /* Continue ahead, if the firmware is already running. */
  507. if (!err)
  508. return 0;
  509. /* no firmware interface available */
  510. if (err != 1)
  511. return has_rom ? 0 : err;
  512. pci_dev_get(pdev);
  513. err = firmware_request_nowarn(&fw, fw_name, &pdev->dev);
  514. pci_dev_put(pdev);
  515. if (err) {
  516. if (has_rom) {
  517. dev_info(&pdev->dev, "failed to load firmware %s, fallback to ROM\n",
  518. fw_name);
  519. return 0;
  520. }
  521. dev_err(&pdev->dev, "failed to load firmware %s: %d\n",
  522. fw_name, err);
  523. return err;
  524. }
  525. err = renesas_fw_verify(fw->data, fw->size);
  526. if (err)
  527. goto exit;
  528. err = renesas_load_fw(pdev, fw);
  529. exit:
  530. release_firmware(fw);
  531. return err;
  532. }
  533. EXPORT_SYMBOL_GPL(renesas_xhci_check_request_fw);
  534. MODULE_LICENSE("GPL v2");