misc: pci_endpoint_test: Aggregate params checking for xfer
[platform/kernel/linux-rpi.git] / drivers / misc / pci_endpoint_test.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /**
3  * Host side test driver to test endpoint functionality
4  *
5  * Copyright (C) 2017 Texas Instruments
6  * Author: Kishon Vijay Abraham I <kishon@ti.com>
7  */
8
9 #include <linux/crc32.h>
10 #include <linux/delay.h>
11 #include <linux/fs.h>
12 #include <linux/io.h>
13 #include <linux/interrupt.h>
14 #include <linux/irq.h>
15 #include <linux/miscdevice.h>
16 #include <linux/module.h>
17 #include <linux/mutex.h>
18 #include <linux/random.h>
19 #include <linux/slab.h>
20 #include <linux/uaccess.h>
21 #include <linux/pci.h>
22 #include <linux/pci_ids.h>
23
24 #include <linux/pci_regs.h>
25
26 #include <uapi/linux/pcitest.h>
27
28 #define DRV_MODULE_NAME                         "pci-endpoint-test"
29
30 #define IRQ_TYPE_UNDEFINED                      -1
31 #define IRQ_TYPE_LEGACY                         0
32 #define IRQ_TYPE_MSI                            1
33 #define IRQ_TYPE_MSIX                           2
34
35 #define PCI_ENDPOINT_TEST_MAGIC                 0x0
36
37 #define PCI_ENDPOINT_TEST_COMMAND               0x4
38 #define COMMAND_RAISE_LEGACY_IRQ                BIT(0)
39 #define COMMAND_RAISE_MSI_IRQ                   BIT(1)
40 #define COMMAND_RAISE_MSIX_IRQ                  BIT(2)
41 #define COMMAND_READ                            BIT(3)
42 #define COMMAND_WRITE                           BIT(4)
43 #define COMMAND_COPY                            BIT(5)
44
45 #define PCI_ENDPOINT_TEST_STATUS                0x8
46 #define STATUS_READ_SUCCESS                     BIT(0)
47 #define STATUS_READ_FAIL                        BIT(1)
48 #define STATUS_WRITE_SUCCESS                    BIT(2)
49 #define STATUS_WRITE_FAIL                       BIT(3)
50 #define STATUS_COPY_SUCCESS                     BIT(4)
51 #define STATUS_COPY_FAIL                        BIT(5)
52 #define STATUS_IRQ_RAISED                       BIT(6)
53 #define STATUS_SRC_ADDR_INVALID                 BIT(7)
54 #define STATUS_DST_ADDR_INVALID                 BIT(8)
55
56 #define PCI_ENDPOINT_TEST_LOWER_SRC_ADDR        0x0c
57 #define PCI_ENDPOINT_TEST_UPPER_SRC_ADDR        0x10
58
59 #define PCI_ENDPOINT_TEST_LOWER_DST_ADDR        0x14
60 #define PCI_ENDPOINT_TEST_UPPER_DST_ADDR        0x18
61
62 #define PCI_ENDPOINT_TEST_SIZE                  0x1c
63 #define PCI_ENDPOINT_TEST_CHECKSUM              0x20
64
65 #define PCI_ENDPOINT_TEST_IRQ_TYPE              0x24
66 #define PCI_ENDPOINT_TEST_IRQ_NUMBER            0x28
67
68 #define PCI_ENDPOINT_TEST_FLAGS                 0x2c
69 #define FLAG_USE_DMA                            BIT(0)
70
71 #define PCI_DEVICE_ID_TI_AM654                  0xb00c
72 #define PCI_DEVICE_ID_TI_J7200                  0xb00f
73 #define PCI_DEVICE_ID_TI_AM64                   0xb010
74 #define PCI_DEVICE_ID_LS1088A                   0x80c0
75
76 #define is_am654_pci_dev(pdev)          \
77                 ((pdev)->device == PCI_DEVICE_ID_TI_AM654)
78
79 #define PCI_DEVICE_ID_RENESAS_R8A774A1          0x0028
80 #define PCI_DEVICE_ID_RENESAS_R8A774B1          0x002b
81 #define PCI_DEVICE_ID_RENESAS_R8A774C0          0x002d
82 #define PCI_DEVICE_ID_RENESAS_R8A774E1          0x0025
83
84 static DEFINE_IDA(pci_endpoint_test_ida);
85
86 #define to_endpoint_test(priv) container_of((priv), struct pci_endpoint_test, \
87                                             miscdev)
88
89 static bool no_msi;
90 module_param(no_msi, bool, 0444);
91 MODULE_PARM_DESC(no_msi, "Disable MSI interrupt in pci_endpoint_test");
92
93 static int irq_type = IRQ_TYPE_MSI;
94 module_param(irq_type, int, 0444);
95 MODULE_PARM_DESC(irq_type, "IRQ mode selection in pci_endpoint_test (0 - Legacy, 1 - MSI, 2 - MSI-X)");
96
97 enum pci_barno {
98         BAR_0,
99         BAR_1,
100         BAR_2,
101         BAR_3,
102         BAR_4,
103         BAR_5,
104 };
105
106 struct pci_endpoint_test {
107         struct pci_dev  *pdev;
108         void __iomem    *base;
109         void __iomem    *bar[PCI_STD_NUM_BARS];
110         struct completion irq_raised;
111         int             last_irq;
112         int             num_irqs;
113         int             irq_type;
114         /* mutex to protect the ioctls */
115         struct mutex    mutex;
116         struct miscdevice miscdev;
117         enum pci_barno test_reg_bar;
118         size_t alignment;
119         const char *name;
120 };
121
122 struct pci_endpoint_test_data {
123         enum pci_barno test_reg_bar;
124         size_t alignment;
125         int irq_type;
126 };
127
128 static inline u32 pci_endpoint_test_readl(struct pci_endpoint_test *test,
129                                           u32 offset)
130 {
131         return readl(test->base + offset);
132 }
133
134 static inline void pci_endpoint_test_writel(struct pci_endpoint_test *test,
135                                             u32 offset, u32 value)
136 {
137         writel(value, test->base + offset);
138 }
139
140 static inline u32 pci_endpoint_test_bar_readl(struct pci_endpoint_test *test,
141                                               int bar, int offset)
142 {
143         return readl(test->bar[bar] + offset);
144 }
145
146 static inline void pci_endpoint_test_bar_writel(struct pci_endpoint_test *test,
147                                                 int bar, u32 offset, u32 value)
148 {
149         writel(value, test->bar[bar] + offset);
150 }
151
152 static irqreturn_t pci_endpoint_test_irqhandler(int irq, void *dev_id)
153 {
154         struct pci_endpoint_test *test = dev_id;
155         u32 reg;
156
157         reg = pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_STATUS);
158         if (reg & STATUS_IRQ_RAISED) {
159                 test->last_irq = irq;
160                 complete(&test->irq_raised);
161                 reg &= ~STATUS_IRQ_RAISED;
162         }
163         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_STATUS,
164                                  reg);
165
166         return IRQ_HANDLED;
167 }
168
169 static void pci_endpoint_test_free_irq_vectors(struct pci_endpoint_test *test)
170 {
171         struct pci_dev *pdev = test->pdev;
172
173         pci_free_irq_vectors(pdev);
174         test->irq_type = IRQ_TYPE_UNDEFINED;
175 }
176
177 static bool pci_endpoint_test_alloc_irq_vectors(struct pci_endpoint_test *test,
178                                                 int type)
179 {
180         int irq = -1;
181         struct pci_dev *pdev = test->pdev;
182         struct device *dev = &pdev->dev;
183         bool res = true;
184
185         switch (type) {
186         case IRQ_TYPE_LEGACY:
187                 irq = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_LEGACY);
188                 if (irq < 0)
189                         dev_err(dev, "Failed to get Legacy interrupt\n");
190                 break;
191         case IRQ_TYPE_MSI:
192                 irq = pci_alloc_irq_vectors(pdev, 1, 32, PCI_IRQ_MSI);
193                 if (irq < 0)
194                         dev_err(dev, "Failed to get MSI interrupts\n");
195                 break;
196         case IRQ_TYPE_MSIX:
197                 irq = pci_alloc_irq_vectors(pdev, 1, 2048, PCI_IRQ_MSIX);
198                 if (irq < 0)
199                         dev_err(dev, "Failed to get MSI-X interrupts\n");
200                 break;
201         default:
202                 dev_err(dev, "Invalid IRQ type selected\n");
203         }
204
205         if (irq < 0) {
206                 irq = 0;
207                 res = false;
208         }
209
210         test->irq_type = type;
211         test->num_irqs = irq;
212
213         return res;
214 }
215
216 static void pci_endpoint_test_release_irq(struct pci_endpoint_test *test)
217 {
218         int i;
219         struct pci_dev *pdev = test->pdev;
220         struct device *dev = &pdev->dev;
221
222         for (i = 0; i < test->num_irqs; i++)
223                 devm_free_irq(dev, pci_irq_vector(pdev, i), test);
224
225         test->num_irqs = 0;
226 }
227
228 static bool pci_endpoint_test_request_irq(struct pci_endpoint_test *test)
229 {
230         int i;
231         int err;
232         struct pci_dev *pdev = test->pdev;
233         struct device *dev = &pdev->dev;
234
235         for (i = 0; i < test->num_irqs; i++) {
236                 err = devm_request_irq(dev, pci_irq_vector(pdev, i),
237                                        pci_endpoint_test_irqhandler,
238                                        IRQF_SHARED, test->name, test);
239                 if (err)
240                         goto fail;
241         }
242
243         return true;
244
245 fail:
246         switch (irq_type) {
247         case IRQ_TYPE_LEGACY:
248                 dev_err(dev, "Failed to request IRQ %d for Legacy\n",
249                         pci_irq_vector(pdev, i));
250                 break;
251         case IRQ_TYPE_MSI:
252                 dev_err(dev, "Failed to request IRQ %d for MSI %d\n",
253                         pci_irq_vector(pdev, i),
254                         i + 1);
255                 break;
256         case IRQ_TYPE_MSIX:
257                 dev_err(dev, "Failed to request IRQ %d for MSI-X %d\n",
258                         pci_irq_vector(pdev, i),
259                         i + 1);
260                 break;
261         }
262
263         return false;
264 }
265
266 static bool pci_endpoint_test_bar(struct pci_endpoint_test *test,
267                                   enum pci_barno barno)
268 {
269         int j;
270         u32 val;
271         int size;
272         struct pci_dev *pdev = test->pdev;
273
274         if (!test->bar[barno])
275                 return false;
276
277         size = pci_resource_len(pdev, barno);
278
279         if (barno == test->test_reg_bar)
280                 size = 0x4;
281
282         for (j = 0; j < size; j += 4)
283                 pci_endpoint_test_bar_writel(test, barno, j, 0xA0A0A0A0);
284
285         for (j = 0; j < size; j += 4) {
286                 val = pci_endpoint_test_bar_readl(test, barno, j);
287                 if (val != 0xA0A0A0A0)
288                         return false;
289         }
290
291         return true;
292 }
293
294 static bool pci_endpoint_test_legacy_irq(struct pci_endpoint_test *test)
295 {
296         u32 val;
297
298         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE,
299                                  IRQ_TYPE_LEGACY);
300         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 0);
301         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND,
302                                  COMMAND_RAISE_LEGACY_IRQ);
303         val = wait_for_completion_timeout(&test->irq_raised,
304                                           msecs_to_jiffies(1000));
305         if (!val)
306                 return false;
307
308         return true;
309 }
310
311 static bool pci_endpoint_test_msi_irq(struct pci_endpoint_test *test,
312                                        u16 msi_num, bool msix)
313 {
314         u32 val;
315         struct pci_dev *pdev = test->pdev;
316
317         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE,
318                                  msix == false ? IRQ_TYPE_MSI :
319                                  IRQ_TYPE_MSIX);
320         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, msi_num);
321         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND,
322                                  msix == false ? COMMAND_RAISE_MSI_IRQ :
323                                  COMMAND_RAISE_MSIX_IRQ);
324         val = wait_for_completion_timeout(&test->irq_raised,
325                                           msecs_to_jiffies(1000));
326         if (!val)
327                 return false;
328
329         if (pci_irq_vector(pdev, msi_num - 1) == test->last_irq)
330                 return true;
331
332         return false;
333 }
334
335 static int pci_endpoint_test_validate_xfer_params(struct device *dev,
336                 struct pci_endpoint_test_xfer_param *param, size_t alignment)
337 {
338         if (param->size > SIZE_MAX - alignment) {
339                 dev_dbg(dev, "Maximum transfer data size exceeded\n");
340                 return -EINVAL;
341         }
342
343         return 0;
344 }
345
346 static bool pci_endpoint_test_copy(struct pci_endpoint_test *test,
347                                    unsigned long arg)
348 {
349         struct pci_endpoint_test_xfer_param param;
350         bool ret = false;
351         void *src_addr;
352         void *dst_addr;
353         u32 flags = 0;
354         bool use_dma;
355         size_t size;
356         dma_addr_t src_phys_addr;
357         dma_addr_t dst_phys_addr;
358         struct pci_dev *pdev = test->pdev;
359         struct device *dev = &pdev->dev;
360         void *orig_src_addr;
361         dma_addr_t orig_src_phys_addr;
362         void *orig_dst_addr;
363         dma_addr_t orig_dst_phys_addr;
364         size_t offset;
365         size_t alignment = test->alignment;
366         int irq_type = test->irq_type;
367         u32 src_crc32;
368         u32 dst_crc32;
369         int err;
370
371         err = copy_from_user(&param, (void __user *)arg, sizeof(param));
372         if (err) {
373                 dev_err(dev, "Failed to get transfer param\n");
374                 return false;
375         }
376
377         err = pci_endpoint_test_validate_xfer_params(dev, &param, alignment);
378         if (err)
379                 return false;
380
381         size = param.size;
382
383         use_dma = !!(param.flags & PCITEST_FLAGS_USE_DMA);
384         if (use_dma)
385                 flags |= FLAG_USE_DMA;
386
387         if (irq_type < IRQ_TYPE_LEGACY || irq_type > IRQ_TYPE_MSIX) {
388                 dev_err(dev, "Invalid IRQ type option\n");
389                 goto err;
390         }
391
392         orig_src_addr = kzalloc(size + alignment, GFP_KERNEL);
393         if (!orig_src_addr) {
394                 dev_err(dev, "Failed to allocate source buffer\n");
395                 ret = false;
396                 goto err;
397         }
398
399         get_random_bytes(orig_src_addr, size + alignment);
400         orig_src_phys_addr = dma_map_single(dev, orig_src_addr,
401                                             size + alignment, DMA_TO_DEVICE);
402         if (dma_mapping_error(dev, orig_src_phys_addr)) {
403                 dev_err(dev, "failed to map source buffer address\n");
404                 ret = false;
405                 goto err_src_phys_addr;
406         }
407
408         if (alignment && !IS_ALIGNED(orig_src_phys_addr, alignment)) {
409                 src_phys_addr = PTR_ALIGN(orig_src_phys_addr, alignment);
410                 offset = src_phys_addr - orig_src_phys_addr;
411                 src_addr = orig_src_addr + offset;
412         } else {
413                 src_phys_addr = orig_src_phys_addr;
414                 src_addr = orig_src_addr;
415         }
416
417         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_SRC_ADDR,
418                                  lower_32_bits(src_phys_addr));
419
420         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR,
421                                  upper_32_bits(src_phys_addr));
422
423         src_crc32 = crc32_le(~0, src_addr, size);
424
425         orig_dst_addr = kzalloc(size + alignment, GFP_KERNEL);
426         if (!orig_dst_addr) {
427                 dev_err(dev, "Failed to allocate destination address\n");
428                 ret = false;
429                 goto err_dst_addr;
430         }
431
432         orig_dst_phys_addr = dma_map_single(dev, orig_dst_addr,
433                                             size + alignment, DMA_FROM_DEVICE);
434         if (dma_mapping_error(dev, orig_dst_phys_addr)) {
435                 dev_err(dev, "failed to map destination buffer address\n");
436                 ret = false;
437                 goto err_dst_phys_addr;
438         }
439
440         if (alignment && !IS_ALIGNED(orig_dst_phys_addr, alignment)) {
441                 dst_phys_addr = PTR_ALIGN(orig_dst_phys_addr, alignment);
442                 offset = dst_phys_addr - orig_dst_phys_addr;
443                 dst_addr = orig_dst_addr + offset;
444         } else {
445                 dst_phys_addr = orig_dst_phys_addr;
446                 dst_addr = orig_dst_addr;
447         }
448
449         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_DST_ADDR,
450                                  lower_32_bits(dst_phys_addr));
451         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_DST_ADDR,
452                                  upper_32_bits(dst_phys_addr));
453
454         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE,
455                                  size);
456
457         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags);
458         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type);
459         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1);
460         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND,
461                                  COMMAND_COPY);
462
463         wait_for_completion(&test->irq_raised);
464
465         dma_unmap_single(dev, orig_dst_phys_addr, size + alignment,
466                          DMA_FROM_DEVICE);
467
468         dst_crc32 = crc32_le(~0, dst_addr, size);
469         if (dst_crc32 == src_crc32)
470                 ret = true;
471
472 err_dst_phys_addr:
473         kfree(orig_dst_addr);
474
475 err_dst_addr:
476         dma_unmap_single(dev, orig_src_phys_addr, size + alignment,
477                          DMA_TO_DEVICE);
478
479 err_src_phys_addr:
480         kfree(orig_src_addr);
481
482 err:
483         return ret;
484 }
485
486 static bool pci_endpoint_test_write(struct pci_endpoint_test *test,
487                                     unsigned long arg)
488 {
489         struct pci_endpoint_test_xfer_param param;
490         bool ret = false;
491         u32 flags = 0;
492         bool use_dma;
493         u32 reg;
494         void *addr;
495         dma_addr_t phys_addr;
496         struct pci_dev *pdev = test->pdev;
497         struct device *dev = &pdev->dev;
498         void *orig_addr;
499         dma_addr_t orig_phys_addr;
500         size_t offset;
501         size_t alignment = test->alignment;
502         int irq_type = test->irq_type;
503         size_t size;
504         u32 crc32;
505         int err;
506
507         err = copy_from_user(&param, (void __user *)arg, sizeof(param));
508         if (err != 0) {
509                 dev_err(dev, "Failed to get transfer param\n");
510                 return false;
511         }
512
513         err = pci_endpoint_test_validate_xfer_params(dev, &param, alignment);
514         if (err)
515                 return false;
516
517         size = param.size;
518
519         use_dma = !!(param.flags & PCITEST_FLAGS_USE_DMA);
520         if (use_dma)
521                 flags |= FLAG_USE_DMA;
522
523         if (irq_type < IRQ_TYPE_LEGACY || irq_type > IRQ_TYPE_MSIX) {
524                 dev_err(dev, "Invalid IRQ type option\n");
525                 goto err;
526         }
527
528         orig_addr = kzalloc(size + alignment, GFP_KERNEL);
529         if (!orig_addr) {
530                 dev_err(dev, "Failed to allocate address\n");
531                 ret = false;
532                 goto err;
533         }
534
535         get_random_bytes(orig_addr, size + alignment);
536
537         orig_phys_addr = dma_map_single(dev, orig_addr, size + alignment,
538                                         DMA_TO_DEVICE);
539         if (dma_mapping_error(dev, orig_phys_addr)) {
540                 dev_err(dev, "failed to map source buffer address\n");
541                 ret = false;
542                 goto err_phys_addr;
543         }
544
545         if (alignment && !IS_ALIGNED(orig_phys_addr, alignment)) {
546                 phys_addr =  PTR_ALIGN(orig_phys_addr, alignment);
547                 offset = phys_addr - orig_phys_addr;
548                 addr = orig_addr + offset;
549         } else {
550                 phys_addr = orig_phys_addr;
551                 addr = orig_addr;
552         }
553
554         crc32 = crc32_le(~0, addr, size);
555         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_CHECKSUM,
556                                  crc32);
557
558         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_SRC_ADDR,
559                                  lower_32_bits(phys_addr));
560         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_SRC_ADDR,
561                                  upper_32_bits(phys_addr));
562
563         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, size);
564
565         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags);
566         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type);
567         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1);
568         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND,
569                                  COMMAND_READ);
570
571         wait_for_completion(&test->irq_raised);
572
573         reg = pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_STATUS);
574         if (reg & STATUS_READ_SUCCESS)
575                 ret = true;
576
577         dma_unmap_single(dev, orig_phys_addr, size + alignment,
578                          DMA_TO_DEVICE);
579
580 err_phys_addr:
581         kfree(orig_addr);
582
583 err:
584         return ret;
585 }
586
587 static bool pci_endpoint_test_read(struct pci_endpoint_test *test,
588                                    unsigned long arg)
589 {
590         struct pci_endpoint_test_xfer_param param;
591         bool ret = false;
592         u32 flags = 0;
593         bool use_dma;
594         size_t size;
595         void *addr;
596         dma_addr_t phys_addr;
597         struct pci_dev *pdev = test->pdev;
598         struct device *dev = &pdev->dev;
599         void *orig_addr;
600         dma_addr_t orig_phys_addr;
601         size_t offset;
602         size_t alignment = test->alignment;
603         int irq_type = test->irq_type;
604         u32 crc32;
605         int err;
606
607         err = copy_from_user(&param, (void __user *)arg, sizeof(param));
608         if (err) {
609                 dev_err(dev, "Failed to get transfer param\n");
610                 return false;
611         }
612
613         err = pci_endpoint_test_validate_xfer_params(dev, &param, alignment);
614         if (err)
615                 return false;
616
617         size = param.size;
618
619         use_dma = !!(param.flags & PCITEST_FLAGS_USE_DMA);
620         if (use_dma)
621                 flags |= FLAG_USE_DMA;
622
623         if (irq_type < IRQ_TYPE_LEGACY || irq_type > IRQ_TYPE_MSIX) {
624                 dev_err(dev, "Invalid IRQ type option\n");
625                 goto err;
626         }
627
628         orig_addr = kzalloc(size + alignment, GFP_KERNEL);
629         if (!orig_addr) {
630                 dev_err(dev, "Failed to allocate destination address\n");
631                 ret = false;
632                 goto err;
633         }
634
635         orig_phys_addr = dma_map_single(dev, orig_addr, size + alignment,
636                                         DMA_FROM_DEVICE);
637         if (dma_mapping_error(dev, orig_phys_addr)) {
638                 dev_err(dev, "failed to map source buffer address\n");
639                 ret = false;
640                 goto err_phys_addr;
641         }
642
643         if (alignment && !IS_ALIGNED(orig_phys_addr, alignment)) {
644                 phys_addr = PTR_ALIGN(orig_phys_addr, alignment);
645                 offset = phys_addr - orig_phys_addr;
646                 addr = orig_addr + offset;
647         } else {
648                 phys_addr = orig_phys_addr;
649                 addr = orig_addr;
650         }
651
652         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_LOWER_DST_ADDR,
653                                  lower_32_bits(phys_addr));
654         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_UPPER_DST_ADDR,
655                                  upper_32_bits(phys_addr));
656
657         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, size);
658
659         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, flags);
660         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, irq_type);
661         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1);
662         pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND,
663                                  COMMAND_WRITE);
664
665         wait_for_completion(&test->irq_raised);
666
667         dma_unmap_single(dev, orig_phys_addr, size + alignment,
668                          DMA_FROM_DEVICE);
669
670         crc32 = crc32_le(~0, addr, size);
671         if (crc32 == pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_CHECKSUM))
672                 ret = true;
673
674 err_phys_addr:
675         kfree(orig_addr);
676 err:
677         return ret;
678 }
679
680 static bool pci_endpoint_test_clear_irq(struct pci_endpoint_test *test)
681 {
682         pci_endpoint_test_release_irq(test);
683         pci_endpoint_test_free_irq_vectors(test);
684         return true;
685 }
686
687 static bool pci_endpoint_test_set_irq(struct pci_endpoint_test *test,
688                                       int req_irq_type)
689 {
690         struct pci_dev *pdev = test->pdev;
691         struct device *dev = &pdev->dev;
692
693         if (req_irq_type < IRQ_TYPE_LEGACY || req_irq_type > IRQ_TYPE_MSIX) {
694                 dev_err(dev, "Invalid IRQ type option\n");
695                 return false;
696         }
697
698         if (test->irq_type == req_irq_type)
699                 return true;
700
701         pci_endpoint_test_release_irq(test);
702         pci_endpoint_test_free_irq_vectors(test);
703
704         if (!pci_endpoint_test_alloc_irq_vectors(test, req_irq_type))
705                 goto err;
706
707         if (!pci_endpoint_test_request_irq(test))
708                 goto err;
709
710         return true;
711
712 err:
713         pci_endpoint_test_free_irq_vectors(test);
714         return false;
715 }
716
717 static long pci_endpoint_test_ioctl(struct file *file, unsigned int cmd,
718                                     unsigned long arg)
719 {
720         int ret = -EINVAL;
721         enum pci_barno bar;
722         struct pci_endpoint_test *test = to_endpoint_test(file->private_data);
723         struct pci_dev *pdev = test->pdev;
724
725         mutex_lock(&test->mutex);
726         switch (cmd) {
727         case PCITEST_BAR:
728                 bar = arg;
729                 if (bar > BAR_5)
730                         goto ret;
731                 if (is_am654_pci_dev(pdev) && bar == BAR_0)
732                         goto ret;
733                 ret = pci_endpoint_test_bar(test, bar);
734                 break;
735         case PCITEST_LEGACY_IRQ:
736                 ret = pci_endpoint_test_legacy_irq(test);
737                 break;
738         case PCITEST_MSI:
739         case PCITEST_MSIX:
740                 ret = pci_endpoint_test_msi_irq(test, arg, cmd == PCITEST_MSIX);
741                 break;
742         case PCITEST_WRITE:
743                 ret = pci_endpoint_test_write(test, arg);
744                 break;
745         case PCITEST_READ:
746                 ret = pci_endpoint_test_read(test, arg);
747                 break;
748         case PCITEST_COPY:
749                 ret = pci_endpoint_test_copy(test, arg);
750                 break;
751         case PCITEST_SET_IRQTYPE:
752                 ret = pci_endpoint_test_set_irq(test, arg);
753                 break;
754         case PCITEST_GET_IRQTYPE:
755                 ret = irq_type;
756                 break;
757         case PCITEST_CLEAR_IRQ:
758                 ret = pci_endpoint_test_clear_irq(test);
759                 break;
760         }
761
762 ret:
763         mutex_unlock(&test->mutex);
764         return ret;
765 }
766
767 static const struct file_operations pci_endpoint_test_fops = {
768         .owner = THIS_MODULE,
769         .unlocked_ioctl = pci_endpoint_test_ioctl,
770 };
771
772 static int pci_endpoint_test_probe(struct pci_dev *pdev,
773                                    const struct pci_device_id *ent)
774 {
775         int err;
776         int id;
777         char name[24];
778         enum pci_barno bar;
779         void __iomem *base;
780         struct device *dev = &pdev->dev;
781         struct pci_endpoint_test *test;
782         struct pci_endpoint_test_data *data;
783         enum pci_barno test_reg_bar = BAR_0;
784         struct miscdevice *misc_device;
785
786         if (pci_is_bridge(pdev))
787                 return -ENODEV;
788
789         test = devm_kzalloc(dev, sizeof(*test), GFP_KERNEL);
790         if (!test)
791                 return -ENOMEM;
792
793         test->test_reg_bar = 0;
794         test->alignment = 0;
795         test->pdev = pdev;
796         test->irq_type = IRQ_TYPE_UNDEFINED;
797
798         if (no_msi)
799                 irq_type = IRQ_TYPE_LEGACY;
800
801         data = (struct pci_endpoint_test_data *)ent->driver_data;
802         if (data) {
803                 test_reg_bar = data->test_reg_bar;
804                 test->test_reg_bar = test_reg_bar;
805                 test->alignment = data->alignment;
806                 irq_type = data->irq_type;
807         }
808
809         init_completion(&test->irq_raised);
810         mutex_init(&test->mutex);
811
812         if ((dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(48)) != 0) &&
813             dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)) != 0) {
814                 dev_err(dev, "Cannot set DMA mask\n");
815                 return -EINVAL;
816         }
817
818         err = pci_enable_device(pdev);
819         if (err) {
820                 dev_err(dev, "Cannot enable PCI device\n");
821                 return err;
822         }
823
824         err = pci_request_regions(pdev, DRV_MODULE_NAME);
825         if (err) {
826                 dev_err(dev, "Cannot obtain PCI resources\n");
827                 goto err_disable_pdev;
828         }
829
830         pci_set_master(pdev);
831
832         if (!pci_endpoint_test_alloc_irq_vectors(test, irq_type)) {
833                 err = -EINVAL;
834                 goto err_disable_irq;
835         }
836
837         for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) {
838                 if (pci_resource_flags(pdev, bar) & IORESOURCE_MEM) {
839                         base = pci_ioremap_bar(pdev, bar);
840                         if (!base) {
841                                 dev_err(dev, "Failed to read BAR%d\n", bar);
842                                 WARN_ON(bar == test_reg_bar);
843                         }
844                         test->bar[bar] = base;
845                 }
846         }
847
848         test->base = test->bar[test_reg_bar];
849         if (!test->base) {
850                 err = -ENOMEM;
851                 dev_err(dev, "Cannot perform PCI test without BAR%d\n",
852                         test_reg_bar);
853                 goto err_iounmap;
854         }
855
856         pci_set_drvdata(pdev, test);
857
858         id = ida_simple_get(&pci_endpoint_test_ida, 0, 0, GFP_KERNEL);
859         if (id < 0) {
860                 err = id;
861                 dev_err(dev, "Unable to get id\n");
862                 goto err_iounmap;
863         }
864
865         snprintf(name, sizeof(name), DRV_MODULE_NAME ".%d", id);
866         test->name = kstrdup(name, GFP_KERNEL);
867         if (!test->name) {
868                 err = -ENOMEM;
869                 goto err_ida_remove;
870         }
871
872         if (!pci_endpoint_test_request_irq(test)) {
873                 err = -EINVAL;
874                 goto err_kfree_test_name;
875         }
876
877         misc_device = &test->miscdev;
878         misc_device->minor = MISC_DYNAMIC_MINOR;
879         misc_device->name = kstrdup(name, GFP_KERNEL);
880         if (!misc_device->name) {
881                 err = -ENOMEM;
882                 goto err_release_irq;
883         }
884         misc_device->parent = &pdev->dev;
885         misc_device->fops = &pci_endpoint_test_fops,
886
887         err = misc_register(misc_device);
888         if (err) {
889                 dev_err(dev, "Failed to register device\n");
890                 goto err_kfree_name;
891         }
892
893         return 0;
894
895 err_kfree_name:
896         kfree(misc_device->name);
897
898 err_release_irq:
899         pci_endpoint_test_release_irq(test);
900
901 err_kfree_test_name:
902         kfree(test->name);
903
904 err_ida_remove:
905         ida_simple_remove(&pci_endpoint_test_ida, id);
906
907 err_iounmap:
908         for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) {
909                 if (test->bar[bar])
910                         pci_iounmap(pdev, test->bar[bar]);
911         }
912
913 err_disable_irq:
914         pci_endpoint_test_free_irq_vectors(test);
915         pci_release_regions(pdev);
916
917 err_disable_pdev:
918         pci_disable_device(pdev);
919
920         return err;
921 }
922
923 static void pci_endpoint_test_remove(struct pci_dev *pdev)
924 {
925         int id;
926         enum pci_barno bar;
927         struct pci_endpoint_test *test = pci_get_drvdata(pdev);
928         struct miscdevice *misc_device = &test->miscdev;
929
930         if (sscanf(misc_device->name, DRV_MODULE_NAME ".%d", &id) != 1)
931                 return;
932         if (id < 0)
933                 return;
934
935         misc_deregister(&test->miscdev);
936         kfree(misc_device->name);
937         kfree(test->name);
938         ida_simple_remove(&pci_endpoint_test_ida, id);
939         for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) {
940                 if (test->bar[bar])
941                         pci_iounmap(pdev, test->bar[bar]);
942         }
943
944         pci_endpoint_test_release_irq(test);
945         pci_endpoint_test_free_irq_vectors(test);
946
947         pci_release_regions(pdev);
948         pci_disable_device(pdev);
949 }
950
951 static const struct pci_endpoint_test_data default_data = {
952         .test_reg_bar = BAR_0,
953         .alignment = SZ_4K,
954         .irq_type = IRQ_TYPE_MSI,
955 };
956
957 static const struct pci_endpoint_test_data am654_data = {
958         .test_reg_bar = BAR_2,
959         .alignment = SZ_64K,
960         .irq_type = IRQ_TYPE_MSI,
961 };
962
963 static const struct pci_endpoint_test_data j721e_data = {
964         .alignment = 256,
965         .irq_type = IRQ_TYPE_MSI,
966 };
967
968 static const struct pci_device_id pci_endpoint_test_tbl[] = {
969         { PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_DRA74x),
970           .driver_data = (kernel_ulong_t)&default_data,
971         },
972         { PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_DRA72x),
973           .driver_data = (kernel_ulong_t)&default_data,
974         },
975         { PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, 0x81c0),
976           .driver_data = (kernel_ulong_t)&default_data,
977         },
978         { PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, PCI_DEVICE_ID_LS1088A),
979           .driver_data = (kernel_ulong_t)&default_data,
980         },
981         { PCI_DEVICE_DATA(SYNOPSYS, EDDA, NULL) },
982         { PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_AM654),
983           .driver_data = (kernel_ulong_t)&am654_data
984         },
985         { PCI_DEVICE(PCI_VENDOR_ID_RENESAS, PCI_DEVICE_ID_RENESAS_R8A774A1),},
986         { PCI_DEVICE(PCI_VENDOR_ID_RENESAS, PCI_DEVICE_ID_RENESAS_R8A774B1),},
987         { PCI_DEVICE(PCI_VENDOR_ID_RENESAS, PCI_DEVICE_ID_RENESAS_R8A774C0),},
988         { PCI_DEVICE(PCI_VENDOR_ID_RENESAS, PCI_DEVICE_ID_RENESAS_R8A774E1),},
989         { PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_J721E),
990           .driver_data = (kernel_ulong_t)&j721e_data,
991         },
992         { PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_J7200),
993           .driver_data = (kernel_ulong_t)&j721e_data,
994         },
995         { PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_AM64),
996           .driver_data = (kernel_ulong_t)&j721e_data,
997         },
998         { }
999 };
1000 MODULE_DEVICE_TABLE(pci, pci_endpoint_test_tbl);
1001
1002 static struct pci_driver pci_endpoint_test_driver = {
1003         .name           = DRV_MODULE_NAME,
1004         .id_table       = pci_endpoint_test_tbl,
1005         .probe          = pci_endpoint_test_probe,
1006         .remove         = pci_endpoint_test_remove,
1007         .sriov_configure = pci_sriov_configure_simple,
1008 };
1009 module_pci_driver(pci_endpoint_test_driver);
1010
1011 MODULE_DESCRIPTION("PCI ENDPOINT TEST HOST DRIVER");
1012 MODULE_AUTHOR("Kishon Vijay Abraham I <kishon@ti.com>");
1013 MODULE_LICENSE("GPL v2");