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