Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

parisc: DMA API: return error instead of BUG_ON for dma ops on non dma devs

Enabling parport pc driver on a B2600 (and probably other 64bit PARISC
systems) produced following BUG:

CPU: 0 PID: 1 Comm: swapper Not tainted 4.12.0-rc5-30198-g1132d5e #156
task: 000000009e050000 task.stack: 000000009e04c000

YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI
PSW: 00001000000001101111111100001111 Not tainted
r00-03 000000ff0806ff0f 000000009e04c990 0000000040871b78 000000009e04cac0
r04-07 0000000040c14de0 ffffffffffffffff 000000009e07f098 000000009d82d200
r08-11 000000009d82d210 0000000000000378 0000000000000000 0000000040c345e0
r12-15 0000000000000005 0000000040c345e0 0000000000000000 0000000040c9d5e0
r16-19 0000000040c345e0 00000000f00001c4 00000000f00001bc 0000000000000061
r20-23 000000009e04ce28 0000000000000010 0000000000000010 0000000040b89e40
r24-27 0000000000000003 0000000000ffffff 000000009d82d210 0000000040c14de0
r28-31 0000000000000000 000000009e04ca90 000000009e04cb40 0000000000000000
sr00-03 0000000000000000 0000000000000000 0000000000000000 0000000000000000
sr04-07 0000000000000000 0000000000000000 0000000000000000 0000000000000000

IASQ: 0000000000000000 0000000000000000 IAOQ: 00000000404aece0 00000000404aece4
IIR: 03ffe01f ISR: 0000000010340000 IOR: 000001781304cac8
CPU: 0 CR30: 000000009e04c000 CR31: 00000000e2976de2
ORIG_R28: 0000000000000200
IAOQ[0]: sba_dma_supported+0x80/0xd0
IAOQ[1]: sba_dma_supported+0x84/0xd0
RP(r2): parport_pc_probe_port+0x178/0x1200

Cause is a call to dma_coerce_mask_and_coherenet in parport_pc_probe_port,
which PARISC DMA API doesn't handle very nicely. This commit gives back
DMA_ERROR_CODE for DMA API calls, if device isn't capable of DMA
transaction.

Cc: <stable@vger.kernel.org> # v3.13+
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Signed-off-by: Helge Deller <deller@gmx.de>

authored by

Thomas Bogendoerfer and committed by
Helge Deller
33f9e024 24746231

+41 -7
+7 -4
arch/parisc/include/asm/dma-mapping.h
··· 20 20 ** flush/purge and allocate "regular" cacheable pages for everything. 21 21 */ 22 22 23 + #define DMA_ERROR_CODE (~(dma_addr_t)0) 24 + 23 25 #ifdef CONFIG_PA11 24 26 extern const struct dma_map_ops pcxl_dma_ops; 25 27 extern const struct dma_map_ops pcx_dma_ops; ··· 56 54 break; 57 55 } 58 56 } 59 - BUG_ON(!dev->platform_data); 60 57 return dev->platform_data; 61 58 } 62 - 63 - #define GET_IOC(dev) (HBA_DATA(parisc_walk_tree(dev))->iommu) 64 - 59 + 60 + #define GET_IOC(dev) ({ \ 61 + void *__pdata = parisc_walk_tree(dev); \ 62 + __pdata ? HBA_DATA(__pdata)->iommu : NULL; \ 63 + }) 65 64 66 65 #ifdef CONFIG_IOMMU_CCIO 67 66 struct parisc_device;
+12
drivers/parisc/ccio-dma.c
··· 741 741 742 742 BUG_ON(!dev); 743 743 ioc = GET_IOC(dev); 744 + if (!ioc) 745 + return DMA_ERROR_CODE; 744 746 745 747 BUG_ON(size <= 0); 746 748 ··· 816 814 817 815 BUG_ON(!dev); 818 816 ioc = GET_IOC(dev); 817 + if (!ioc) { 818 + WARN_ON(!ioc); 819 + return; 820 + } 819 821 820 822 DBG_RUN("%s() iovp 0x%lx/%x\n", 821 823 __func__, (long)iova, size); ··· 924 918 925 919 BUG_ON(!dev); 926 920 ioc = GET_IOC(dev); 921 + if (!ioc) 922 + return 0; 927 923 928 924 DBG_RUN_SG("%s() START %d entries\n", __func__, nents); 929 925 ··· 998 990 999 991 BUG_ON(!dev); 1000 992 ioc = GET_IOC(dev); 993 + if (!ioc) { 994 + WARN_ON(!ioc); 995 + return; 996 + } 1001 997 1002 998 DBG_RUN_SG("%s() START %d entries, %p,%x\n", 1003 999 __func__, nents, sg_virt(sglist), sglist->length);
+4 -1
drivers/parisc/dino.c
··· 154 154 }; 155 155 156 156 /* Looks nice and keeps the compiler happy */ 157 - #define DINO_DEV(d) ((struct dino_device *) d) 157 + #define DINO_DEV(d) ({ \ 158 + void *__pdata = d; \ 159 + BUG_ON(!__pdata); \ 160 + (struct dino_device *)__pdata; }) 158 161 159 162 160 163 /*
+4 -2
drivers/parisc/lba_pci.c
··· 111 111 112 112 113 113 /* Looks nice and keeps the compiler happy */ 114 - #define LBA_DEV(d) ((struct lba_device *) (d)) 115 - 114 + #define LBA_DEV(d) ({ \ 115 + void *__pdata = d; \ 116 + BUG_ON(!__pdata); \ 117 + (struct lba_device *)__pdata; }) 116 118 117 119 /* 118 120 ** Only allow 8 subsidiary busses per LBA
+14
drivers/parisc/sba_iommu.c
··· 691 691 return 0; 692 692 693 693 ioc = GET_IOC(dev); 694 + if (!ioc) 695 + return 0; 694 696 695 697 /* 696 698 * check if mask is >= than the current max IO Virt Address ··· 724 722 int pide; 725 723 726 724 ioc = GET_IOC(dev); 725 + if (!ioc) 726 + return DMA_ERROR_CODE; 727 727 728 728 /* save offset bits */ 729 729 offset = ((dma_addr_t) (long) addr) & ~IOVP_MASK; ··· 817 813 DBG_RUN("%s() iovp 0x%lx/%x\n", __func__, (long) iova, size); 818 814 819 815 ioc = GET_IOC(dev); 816 + if (!ioc) { 817 + WARN_ON(!ioc); 818 + return; 819 + } 820 820 offset = iova & ~IOVP_MASK; 821 821 iova ^= offset; /* clear offset bits */ 822 822 size += offset; ··· 960 952 DBG_RUN_SG("%s() START %d entries\n", __func__, nents); 961 953 962 954 ioc = GET_IOC(dev); 955 + if (!ioc) 956 + return 0; 963 957 964 958 /* Fast path single entry scatterlists. */ 965 959 if (nents == 1) { ··· 1047 1037 __func__, nents, sg_virt(sglist), sglist->length); 1048 1038 1049 1039 ioc = GET_IOC(dev); 1040 + if (!ioc) { 1041 + WARN_ON(!ioc); 1042 + return; 1043 + } 1050 1044 1051 1045 #ifdef SBA_COLLECT_STATS 1052 1046 ioc->usg_calls++;