linux/drivers/media/pci/cx23885
Brad Love 95f408bbc4 media: cx23885: Ryzen DMA related RiSC engine stall fixes
This bug affects all of Hauppauge QuadHD boards when used on all Ryzen
platforms and some XEON platforms. On these platforms it is possible to
error out the RiSC engine and cause it to stall, whereafter the only
way to reset the board to a working state is to reboot.

This is the fatal condition with current driver:

[  255.663598] cx23885: cx23885[0]: mpeg risc op code error
[  255.663607] cx23885: cx23885[0]: TS1 B - dma channel status dump
[  255.663612] cx23885: cx23885[0]:   cmds: init risc lo   : 0xffe54000
[  255.663615] cx23885: cx23885[0]:   cmds: init risc hi   : 0x00000000
[  255.663619] cx23885: cx23885[0]:   cmds: cdt base       : 0x00010870
[  255.663622] cx23885: cx23885[0]:   cmds: cdt size       : 0x0000000a
[  255.663625] cx23885: cx23885[0]:   cmds: iq base        : 0x00010630
[  255.663629] cx23885: cx23885[0]:   cmds: iq size        : 0x00000010
[  255.663632] cx23885: cx23885[0]:   cmds: risc pc lo     : 0xffe54018
[  255.663636] cx23885: cx23885[0]:   cmds: risc pc hi     : 0x00000000
[  255.663639] cx23885: cx23885[0]:   cmds: iq wr ptr      : 0x00004192
[  255.663642] cx23885: cx23885[0]:   cmds: iq rd ptr      : 0x0000418c
[  255.663645] cx23885: cx23885[0]:   cmds: cdt current    : 0x00010898
[  255.663649] cx23885: cx23885[0]:   cmds: pci target lo  : 0xf85ca340
[  255.663652] cx23885: cx23885[0]:   cmds: pci target hi  : 0x00000000
[  255.663655] cx23885: cx23885[0]:   cmds: line / byte    : 0x000c0000
[  255.663659] cx23885: cx23885[0]:   risc0:
[  255.663661] 0x1c0002f0 [ write sol eol count=752 ]
[  255.663666] cx23885: cx23885[0]:   risc1:
[  255.663667] 0xf85ca050 [ INVALID sol 22 20 19 18 resync 13 count=80 ]
[  255.663674] cx23885: cx23885[0]:   risc2:
[  255.663674] 0x00000000 [ INVALID count=0 ]
[  255.663678] cx23885: cx23885[0]:   risc3:
[  255.663679] 0x1c0002f0 [ write sol eol count=752 ]
[  255.663684] cx23885: cx23885[0]:   (0x00010630) iq 0:
[  255.663685] 0x1c0002f0 [ write sol eol count=752 ]
[  255.663690] cx23885: cx23885[0]:   iq 1: 0xf85ca630 [ arg #1 ]
[  255.663693] cx23885: cx23885[0]:   iq 2: 0x00000000 [ arg #2 ]
[  255.663696] cx23885: cx23885[0]:   (0x0001063c) iq 3:
[  255.663697] 0x1c0002f0 [ write sol eol count=752 ]
[  255.663702] cx23885: cx23885[0]:   iq 4: 0xf85ca920 [ arg #1 ]
[  255.663705] cx23885: cx23885[0]:   iq 5: 0x00000000 [ arg #2 ]
[  255.663709] cx23885: cx23885[0]:   (0x00010648) iq 6:
[  255.663709] 0xf85ca340 [ INVALID sol 22 20 19 18 resync 13 count=832 ]
[  255.663716] cx23885: cx23885[0]:   (0x0001064c) iq 7:
[  255.663717] 0x00000000 [ INVALID count=0 ]
[  255.663721] cx23885: cx23885[0]:   (0x00010650) iq 8:
[  255.663721] 0x00000000 [ INVALID count=0 ]
[  255.663725] cx23885: cx23885[0]:   (0x00010654) iq 9:
[  255.663726] 0x1c0002f0 [ write sol eol count=752 ]
[  255.663731] cx23885: cx23885[0]:   iq a: 0xf85c9780 [ arg #1 ]
[  255.663734] cx23885: cx23885[0]:   iq b: 0x00000000 [ arg #2 ]
[  255.663737] cx23885: cx23885[0]:   (0x00010660) iq c:
[  255.663738] 0x1c0002f0 [ write sol eol count=752 ]
[  255.663743] cx23885: cx23885[0]:   iq d: 0xf85c9a70 [ arg #1 ]
[  255.663746] cx23885: cx23885[0]:   iq e: 0x00000000 [ arg #2 ]
[  255.663749] cx23885: cx23885[0]:   (0x0001066c) iq f:
[  255.663750] 0x1c0002f0 [ write sol eol count=752 ]
[  255.663755] cx23885: cx23885[0]:   iq 10: 0xf4fa2920 [ arg #1 ]
[  255.663758] cx23885: cx23885[0]:   iq 11: 0x00000000 [ arg #2 ]
[  255.663759] cx23885: cx23885[0]: fifo: 0x00005000 -> 0x6000
[  255.663760] cx23885: cx23885[0]: ctrl: 0x00010630 -> 0x10690
[  255.663764] cx23885: cx23885[0]:   ptr1_reg: 0x00005980
[  255.663767] cx23885: cx23885[0]:   ptr2_reg: 0x000108a8
[  255.663770] cx23885: cx23885[0]:   cnt1_reg: 0x0000000b
[  255.663773] cx23885: cx23885[0]:   cnt2_reg: 0x00000003

Included is checks of the TC_REQ and TC_REQ_SET registers during states
of board initialization, reset, DMA start, and DMA stop. If both registers
are set, this indicates a stall in the RiSC engine, at which point the
bridge error is cleared.

A small delay is introduced in stop_dma as well, to allow transfers in
progress to finish.

After application all models work on Ryzen, occasionally yielding:

cx23885_clear_bridge_error: dma in progress detected 0x00000001 0x00000001, clearing

Signed-off-by: Brad Love <brad@nextdimension.cc>
Signed-off-by: Hans Verkuil <hansverk@cisco.com>
[hansverk@cisco.com: fix compiler warning of unused 'reg' variable]
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
2018-05-11 11:29:11 -04:00
..
altera-ci.c media: move dvb kAPI headers to include/media 2017-12-28 13:16:01 -05:00
altera-ci.h [media] cx23885: convert it to use pr_foo() macros 2016-11-18 08:09:36 -02:00
cimax2.c media: replace all <spaces><tab> occurrences 2018-01-04 13:15:05 -05:00
cimax2.h media: move dvb kAPI headers to include/media 2017-12-28 13:16:01 -05:00
cx23885-417.c media: cx23885: add const to v4l2_file_operations structure 2017-07-19 14:56:41 -04:00
cx23885-alsa.c media: cx23885: fix a warning 2018-03-23 06:55:26 -04:00
cx23885-av.c [media] cx23885: uninitialized variable in cx23885_av_work_handler() 2016-04-13 17:10:32 -03:00
cx23885-av.h [media] cx23885: remove FSF address as per checkpatch 2014-09-03 08:35:55 -03:00
cx23885-cards.c media: cx23885: Set subdev host data to clk_freq pointer 2018-03-07 04:06:20 -05:00
cx23885-core.c media: cx23885: Ryzen DMA related RiSC engine stall fixes 2018-05-11 11:29:11 -04:00
cx23885-dvb.c media: lgdt330x: convert it to the new I2C binding way 2018-05-04 11:09:26 -04:00
cx23885-f300.c [media] cx23885: convert it to use pr_foo() macros 2016-11-18 08:09:36 -02:00
cx23885-f300.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
cx23885-i2c.c media: pci: make i2c_client const 2017-09-23 08:28:03 -04:00
cx23885-input.c MAINTAINERS & files: Canonize the e-mails I use at files 2018-05-04 06:21:06 -04:00
cx23885-input.h [media] cx23885: remove FSF address as per checkpatch 2014-09-03 08:35:55 -03:00
cx23885-ioctl.c [media] cx23885: remove FSF address as per checkpatch 2014-09-03 08:35:55 -03:00
cx23885-ioctl.h [media] cx23885: remove FSF address as per checkpatch 2014-09-03 08:35:55 -03:00
cx23885-ir.c [media] cx23885: convert it to use pr_foo() macros 2016-11-18 08:09:36 -02:00
cx23885-ir.h [media] cx23885: remove FSF address as per checkpatch 2014-09-03 08:35:55 -03:00
cx23885-reg.h media: cx23885: Ryzen DMA related RiSC engine stall fixes 2018-05-11 11:29:11 -04:00
cx23885-vbi.c media: cx23885/saa7134: make vb2_ops const 2017-10-27 14:12:44 +02:00
cx23885-video.c media: cx23885: Add support for Hauppauge PCIe HVR1265 K4 2018-03-06 06:03:26 -05:00
cx23885-video.h [media] cx23885: remove FSF address as per checkpatch 2014-09-03 08:35:55 -03:00
cx23885.h media: cx23885: Add support for new Hauppauge QuadHD (885) 2018-03-06 06:04:36 -05:00
cx23888-ir.c media: replace all <spaces><tab> occurrences 2018-01-04 13:15:05 -05:00
cx23888-ir.h [media] cx23885: remove FSF address as per checkpatch 2014-09-03 08:35:55 -03:00
Kconfig [media] cx23885: add support for ViewCast 260e and 460e 2015-12-18 13:36:43 -02:00
Makefile media: don't include drivers/media/i2c at cflags 2017-12-28 14:14:09 -05:00
netup-eeprom.c [media] cx23885: convert it to use pr_foo() macros 2016-11-18 08:09:36 -02:00
netup-eeprom.h [media] cx23885: remove FSF address as per checkpatch 2014-09-03 08:35:55 -03:00
netup-init.c [media] cx23885: convert it to use pr_foo() macros 2016-11-18 08:09:36 -02:00
netup-init.h [media] cx23885: remove FSF address as per checkpatch 2014-09-03 08:35:55 -03:00