Lines Matching +full:rom +full:- +full:15 +full:h
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (C) 2019-2020 Linaro Limited */
4 #include <linux/acpi.h>
5 #include <linux/firmware.h>
6 #include <linux/module.h>
7 #include <linux/pci.h>
8 #include <linux/slab.h>
9 #include <asm/unaligned.h>
11 #include "xhci.h"
12 #include "xhci-trace.h"
13 #include "xhci-pci.h"
45 #define RENESAS_ROM_STATUS_ROM_EXISTS BIT(15)
54 const u32 *fw, size_t step, bool rom) in renesas_fw_download_image() argument
62 if (rom) in renesas_fw_download_image()
68 * The hardware does alternate between two 32-bit pages. in renesas_fw_download_image()
79 dev_err(&dev->dev, "Read Status failed: %d\n", in renesas_fw_download_image()
89 dev_err(&dev->dev, "Timeout for Set DATAX step: %zd\n", step); in renesas_fw_download_image()
90 return -ETIMEDOUT; in renesas_fw_download_image()
101 dev_err(&dev->dev, "Write to DATAX failed: %d\n", in renesas_fw_download_image()
111 dev_err(&dev->dev, "Write config for DATAX failed: %d\n", in renesas_fw_download_image()
135 pr_err("firmware is size %zd is not (4k - 64k).", in renesas_fw_verify()
137 return -EINVAL; in renesas_fw_verify()
143 return -EINVAL; in renesas_fw_verify()
150 return -EINVAL; in renesas_fw_verify()
164 /* Check if external ROM exists */ in renesas_check_rom()
171 dev_dbg(&pdev->dev, "External ROM exists\n"); in renesas_check_rom()
172 return true; /* External ROM exists */ in renesas_check_rom()
191 dev_dbg(&pdev->dev, "Found ROM version: %x\n", version); in renesas_check_rom_state()
194 * Test if ROM is present and loaded, if so we can skip everything in renesas_check_rom_state()
200 if (rom_state & BIT(15)) { in renesas_check_rom_state()
201 /* ROM exists */ in renesas_check_rom_state()
202 dev_dbg(&pdev->dev, "ROM exists\n"); in renesas_check_rom_state()
210 dev_dbg(&pdev->dev, "Unknown ROM status ...\n"); in renesas_check_rom_state()
211 return -ENOENT; in renesas_check_rom_state()
215 dev_err(&pdev->dev, "Invalid ROM.."); in renesas_check_rom_state()
220 return -EIO; in renesas_check_rom_state()
243 dev_dbg(&pdev->dev, "FW Download Lock is engaged."); in renesas_fw_check_running()
248 dev_err(&pdev->dev, in renesas_fw_check_running()
250 return -EIO; in renesas_fw_check_running()
259 dev_err(&pdev->dev, in renesas_fw_check_running()
261 return -EIO; in renesas_fw_check_running()
267 dev_dbg(&pdev->dev, "FW is not ready/loaded yet."); in renesas_fw_check_running()
273 dev_dbg(&pdev->dev, "FW is ready."); in renesas_fw_check_running()
277 dev_err(&pdev->dev, in renesas_fw_check_running()
279 return -ENODEV; in renesas_fw_check_running()
282 dev_err(&pdev->dev, in renesas_fw_check_running()
285 return -EINVAL; in renesas_fw_check_running()
292 const u32 *fw_data = (const u32 *)fw->data; in renesas_fw_download()
312 /* 1 - 10 follow one step after the other. */ in renesas_fw_download()
313 for (i = 0; i < fw->size / 4; i++) { in renesas_fw_download()
316 dev_err(&pdev->dev, in renesas_fw_download()
339 dev_warn(&pdev->dev, "Final Firmware Download step timed out."); in renesas_fw_download()
360 /* Timed out / Error - let's see if we can fix this */ in renesas_fw_download()
371 dev_err(&pdev->dev, "FW Load timedout"); in renesas_fw_download()
372 return -ETIMEDOUT; in renesas_fw_download()
387 dev_dbg(&pdev->dev, "Performing ROM Erase...\n"); in renesas_rom_erase()
391 dev_err(&pdev->dev, "ROM erase, magic word write failed: %d\n", in renesas_rom_erase()
398 dev_err(&pdev->dev, "ROM status read failed: %d\n", in renesas_rom_erase()
405 dev_err(&pdev->dev, "ROM erase set word write failed\n"); in renesas_rom_erase()
409 /* sleep a bit while ROM is erased */ in renesas_rom_erase()
423 dev_dbg(&pdev->dev, "Chip erase timedout: %x\n", status); in renesas_rom_erase()
425 dev_dbg(&pdev->dev, "ROM Erase... Done success\n"); in renesas_rom_erase()
430 const u32 *fw_data = (const u32 *)fw->data; in renesas_setup_rom()
440 /* 3. Set External ROM access */ in renesas_setup_rom()
452 dev_err(&pdev->dev, in renesas_setup_rom()
453 "setting external rom failed: %x\n", status); in renesas_setup_rom()
458 for (i = 0; i < fw->size / 4; i++) { in renesas_setup_rom()
461 dev_err(&pdev->dev, in renesas_setup_rom()
462 "ROM Download Step %d failed at position %d bytes with (%d)\n", in renesas_setup_rom()
482 dev_err(&pdev->dev, "Final Firmware ROM Download step timed out\n"); in renesas_setup_rom()
497 dev_err(&pdev->dev, "Read ROM status failed:%d\n", in renesas_setup_rom()
503 dev_dbg(&pdev->dev, "Download ROM success\n"); in renesas_setup_rom()
509 dev_err(&pdev->dev, in renesas_setup_rom()
510 "Download to external ROM TO: %x\n", status); in renesas_setup_rom()
514 dev_dbg(&pdev->dev, "Download to external ROM succeeded\n"); in renesas_setup_rom()
520 dev_err(&pdev->dev, "Set ROM execute failed: %d\n", in renesas_setup_rom()
538 dev_err(&pdev->dev, "ROM Exec timed out: %x\n", status); in renesas_setup_rom()
552 bool rom; in renesas_load_fw() local
554 /* Check if the device has external ROM */ in renesas_load_fw()
555 rom = renesas_check_rom(pdev); in renesas_load_fw()
556 if (rom) { in renesas_load_fw()
560 /* lets try loading fw on ROM first */ in renesas_load_fw()
561 rom = renesas_setup_rom(pdev, fw); in renesas_load_fw()
562 if (!rom) { in renesas_load_fw()
563 dev_dbg(&pdev->dev, in renesas_load_fw()
564 "ROM load failed, falling back on FW load\n"); in renesas_load_fw()
566 dev_dbg(&pdev->dev, in renesas_load_fw()
567 "ROM load success\n"); in renesas_load_fw()
576 dev_err(&pdev->dev, "firmware failed to download (%d).", err); in renesas_load_fw()
584 (struct xhci_driver_data *)id->driver_data; in renesas_xhci_check_request_fw()
585 const char *fw_name = driver_data->firmware; in renesas_xhci_check_request_fw()
590 /* Check if device has ROM and loaded, if so skip everything */ in renesas_xhci_check_request_fw()
596 else if (err != -ENOENT) in renesas_xhci_check_request_fw()
610 err = firmware_request_nowarn(&fw, fw_name, &pdev->dev); in renesas_xhci_check_request_fw()
614 dev_info(&pdev->dev, "failed to load firmware %s, fallback to ROM\n", in renesas_xhci_check_request_fw()
618 dev_err(&pdev->dev, "failed to load firmware %s: %d\n", in renesas_xhci_check_request_fw()
623 err = renesas_fw_verify(fw->data, fw->size); in renesas_xhci_check_request_fw()