cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

cx25821-core.c (35694B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 *  Driver for the Conexant CX25821 PCIe bridge
      4 *
      5 *  Copyright (C) 2009 Conexant Systems Inc.
      6 *  Authors  <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
      7 *  Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
      8 */
      9
     10#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
     11
     12#include <linux/i2c.h>
     13#include <linux/slab.h>
     14#include "cx25821.h"
     15#include "cx25821-sram.h"
     16#include "cx25821-video.h"
     17
     18MODULE_DESCRIPTION("Driver for Athena cards");
     19MODULE_AUTHOR("Shu Lin - Hiep Huynh");
     20MODULE_LICENSE("GPL");
     21
     22static unsigned int debug;
     23module_param(debug, int, 0644);
     24MODULE_PARM_DESC(debug, "enable debug messages");
     25
     26static unsigned int card[] = {[0 ... (CX25821_MAXBOARDS - 1)] = UNSET };
     27module_param_array(card, int, NULL, 0444);
     28MODULE_PARM_DESC(card, "card type");
     29
     30const struct sram_channel cx25821_sram_channels[] = {
     31	[SRAM_CH00] = {
     32		.i = SRAM_CH00,
     33		.name = "VID A",
     34		.cmds_start = VID_A_DOWN_CMDS,
     35		.ctrl_start = VID_A_IQ,
     36		.cdt = VID_A_CDT,
     37		.fifo_start = VID_A_DOWN_CLUSTER_1,
     38		.fifo_size = (VID_CLUSTER_SIZE << 2),
     39		.ptr1_reg = DMA1_PTR1,
     40		.ptr2_reg = DMA1_PTR2,
     41		.cnt1_reg = DMA1_CNT1,
     42		.cnt2_reg = DMA1_CNT2,
     43		.int_msk = VID_A_INT_MSK,
     44		.int_stat = VID_A_INT_STAT,
     45		.int_mstat = VID_A_INT_MSTAT,
     46		.dma_ctl = VID_DST_A_DMA_CTL,
     47		.gpcnt_ctl = VID_DST_A_GPCNT_CTL,
     48		.gpcnt = VID_DST_A_GPCNT,
     49		.vip_ctl = VID_DST_A_VIP_CTL,
     50		.pix_frmt = VID_DST_A_PIX_FRMT,
     51	},
     52
     53	[SRAM_CH01] = {
     54		.i = SRAM_CH01,
     55		.name = "VID B",
     56		.cmds_start = VID_B_DOWN_CMDS,
     57		.ctrl_start = VID_B_IQ,
     58		.cdt = VID_B_CDT,
     59		.fifo_start = VID_B_DOWN_CLUSTER_1,
     60		.fifo_size = (VID_CLUSTER_SIZE << 2),
     61		.ptr1_reg = DMA2_PTR1,
     62		.ptr2_reg = DMA2_PTR2,
     63		.cnt1_reg = DMA2_CNT1,
     64		.cnt2_reg = DMA2_CNT2,
     65		.int_msk = VID_B_INT_MSK,
     66		.int_stat = VID_B_INT_STAT,
     67		.int_mstat = VID_B_INT_MSTAT,
     68		.dma_ctl = VID_DST_B_DMA_CTL,
     69		.gpcnt_ctl = VID_DST_B_GPCNT_CTL,
     70		.gpcnt = VID_DST_B_GPCNT,
     71		.vip_ctl = VID_DST_B_VIP_CTL,
     72		.pix_frmt = VID_DST_B_PIX_FRMT,
     73	},
     74
     75	[SRAM_CH02] = {
     76		.i = SRAM_CH02,
     77		.name = "VID C",
     78		.cmds_start = VID_C_DOWN_CMDS,
     79		.ctrl_start = VID_C_IQ,
     80		.cdt = VID_C_CDT,
     81		.fifo_start = VID_C_DOWN_CLUSTER_1,
     82		.fifo_size = (VID_CLUSTER_SIZE << 2),
     83		.ptr1_reg = DMA3_PTR1,
     84		.ptr2_reg = DMA3_PTR2,
     85		.cnt1_reg = DMA3_CNT1,
     86		.cnt2_reg = DMA3_CNT2,
     87		.int_msk = VID_C_INT_MSK,
     88		.int_stat = VID_C_INT_STAT,
     89		.int_mstat = VID_C_INT_MSTAT,
     90		.dma_ctl = VID_DST_C_DMA_CTL,
     91		.gpcnt_ctl = VID_DST_C_GPCNT_CTL,
     92		.gpcnt = VID_DST_C_GPCNT,
     93		.vip_ctl = VID_DST_C_VIP_CTL,
     94		.pix_frmt = VID_DST_C_PIX_FRMT,
     95	},
     96
     97	[SRAM_CH03] = {
     98		.i = SRAM_CH03,
     99		.name = "VID D",
    100		.cmds_start = VID_D_DOWN_CMDS,
    101		.ctrl_start = VID_D_IQ,
    102		.cdt = VID_D_CDT,
    103		.fifo_start = VID_D_DOWN_CLUSTER_1,
    104		.fifo_size = (VID_CLUSTER_SIZE << 2),
    105		.ptr1_reg = DMA4_PTR1,
    106		.ptr2_reg = DMA4_PTR2,
    107		.cnt1_reg = DMA4_CNT1,
    108		.cnt2_reg = DMA4_CNT2,
    109		.int_msk = VID_D_INT_MSK,
    110		.int_stat = VID_D_INT_STAT,
    111		.int_mstat = VID_D_INT_MSTAT,
    112		.dma_ctl = VID_DST_D_DMA_CTL,
    113		.gpcnt_ctl = VID_DST_D_GPCNT_CTL,
    114		.gpcnt = VID_DST_D_GPCNT,
    115		.vip_ctl = VID_DST_D_VIP_CTL,
    116		.pix_frmt = VID_DST_D_PIX_FRMT,
    117	},
    118
    119	[SRAM_CH04] = {
    120		.i = SRAM_CH04,
    121		.name = "VID E",
    122		.cmds_start = VID_E_DOWN_CMDS,
    123		.ctrl_start = VID_E_IQ,
    124		.cdt = VID_E_CDT,
    125		.fifo_start = VID_E_DOWN_CLUSTER_1,
    126		.fifo_size = (VID_CLUSTER_SIZE << 2),
    127		.ptr1_reg = DMA5_PTR1,
    128		.ptr2_reg = DMA5_PTR2,
    129		.cnt1_reg = DMA5_CNT1,
    130		.cnt2_reg = DMA5_CNT2,
    131		.int_msk = VID_E_INT_MSK,
    132		.int_stat = VID_E_INT_STAT,
    133		.int_mstat = VID_E_INT_MSTAT,
    134		.dma_ctl = VID_DST_E_DMA_CTL,
    135		.gpcnt_ctl = VID_DST_E_GPCNT_CTL,
    136		.gpcnt = VID_DST_E_GPCNT,
    137		.vip_ctl = VID_DST_E_VIP_CTL,
    138		.pix_frmt = VID_DST_E_PIX_FRMT,
    139	},
    140
    141	[SRAM_CH05] = {
    142		.i = SRAM_CH05,
    143		.name = "VID F",
    144		.cmds_start = VID_F_DOWN_CMDS,
    145		.ctrl_start = VID_F_IQ,
    146		.cdt = VID_F_CDT,
    147		.fifo_start = VID_F_DOWN_CLUSTER_1,
    148		.fifo_size = (VID_CLUSTER_SIZE << 2),
    149		.ptr1_reg = DMA6_PTR1,
    150		.ptr2_reg = DMA6_PTR2,
    151		.cnt1_reg = DMA6_CNT1,
    152		.cnt2_reg = DMA6_CNT2,
    153		.int_msk = VID_F_INT_MSK,
    154		.int_stat = VID_F_INT_STAT,
    155		.int_mstat = VID_F_INT_MSTAT,
    156		.dma_ctl = VID_DST_F_DMA_CTL,
    157		.gpcnt_ctl = VID_DST_F_GPCNT_CTL,
    158		.gpcnt = VID_DST_F_GPCNT,
    159		.vip_ctl = VID_DST_F_VIP_CTL,
    160		.pix_frmt = VID_DST_F_PIX_FRMT,
    161	},
    162
    163	[SRAM_CH06] = {
    164		.i = SRAM_CH06,
    165		.name = "VID G",
    166		.cmds_start = VID_G_DOWN_CMDS,
    167		.ctrl_start = VID_G_IQ,
    168		.cdt = VID_G_CDT,
    169		.fifo_start = VID_G_DOWN_CLUSTER_1,
    170		.fifo_size = (VID_CLUSTER_SIZE << 2),
    171		.ptr1_reg = DMA7_PTR1,
    172		.ptr2_reg = DMA7_PTR2,
    173		.cnt1_reg = DMA7_CNT1,
    174		.cnt2_reg = DMA7_CNT2,
    175		.int_msk = VID_G_INT_MSK,
    176		.int_stat = VID_G_INT_STAT,
    177		.int_mstat = VID_G_INT_MSTAT,
    178		.dma_ctl = VID_DST_G_DMA_CTL,
    179		.gpcnt_ctl = VID_DST_G_GPCNT_CTL,
    180		.gpcnt = VID_DST_G_GPCNT,
    181		.vip_ctl = VID_DST_G_VIP_CTL,
    182		.pix_frmt = VID_DST_G_PIX_FRMT,
    183	},
    184
    185	[SRAM_CH07] = {
    186		.i = SRAM_CH07,
    187		.name = "VID H",
    188		.cmds_start = VID_H_DOWN_CMDS,
    189		.ctrl_start = VID_H_IQ,
    190		.cdt = VID_H_CDT,
    191		.fifo_start = VID_H_DOWN_CLUSTER_1,
    192		.fifo_size = (VID_CLUSTER_SIZE << 2),
    193		.ptr1_reg = DMA8_PTR1,
    194		.ptr2_reg = DMA8_PTR2,
    195		.cnt1_reg = DMA8_CNT1,
    196		.cnt2_reg = DMA8_CNT2,
    197		.int_msk = VID_H_INT_MSK,
    198		.int_stat = VID_H_INT_STAT,
    199		.int_mstat = VID_H_INT_MSTAT,
    200		.dma_ctl = VID_DST_H_DMA_CTL,
    201		.gpcnt_ctl = VID_DST_H_GPCNT_CTL,
    202		.gpcnt = VID_DST_H_GPCNT,
    203		.vip_ctl = VID_DST_H_VIP_CTL,
    204		.pix_frmt = VID_DST_H_PIX_FRMT,
    205	},
    206
    207	[SRAM_CH08] = {
    208		.name = "audio from",
    209		.cmds_start = AUD_A_DOWN_CMDS,
    210		.ctrl_start = AUD_A_IQ,
    211		.cdt = AUD_A_CDT,
    212		.fifo_start = AUD_A_DOWN_CLUSTER_1,
    213		.fifo_size = AUDIO_CLUSTER_SIZE * 3,
    214		.ptr1_reg = DMA17_PTR1,
    215		.ptr2_reg = DMA17_PTR2,
    216		.cnt1_reg = DMA17_CNT1,
    217		.cnt2_reg = DMA17_CNT2,
    218	},
    219
    220	[SRAM_CH09] = {
    221		.i = SRAM_CH09,
    222		.name = "VID Upstream I",
    223		.cmds_start = VID_I_UP_CMDS,
    224		.ctrl_start = VID_I_IQ,
    225		.cdt = VID_I_CDT,
    226		.fifo_start = VID_I_UP_CLUSTER_1,
    227		.fifo_size = (VID_CLUSTER_SIZE << 2),
    228		.ptr1_reg = DMA15_PTR1,
    229		.ptr2_reg = DMA15_PTR2,
    230		.cnt1_reg = DMA15_CNT1,
    231		.cnt2_reg = DMA15_CNT2,
    232		.int_msk = VID_I_INT_MSK,
    233		.int_stat = VID_I_INT_STAT,
    234		.int_mstat = VID_I_INT_MSTAT,
    235		.dma_ctl = VID_SRC_I_DMA_CTL,
    236		.gpcnt_ctl = VID_SRC_I_GPCNT_CTL,
    237		.gpcnt = VID_SRC_I_GPCNT,
    238
    239		.vid_fmt_ctl = VID_SRC_I_FMT_CTL,
    240		.vid_active_ctl1 = VID_SRC_I_ACTIVE_CTL1,
    241		.vid_active_ctl2 = VID_SRC_I_ACTIVE_CTL2,
    242		.vid_cdt_size = VID_SRC_I_CDT_SZ,
    243		.irq_bit = 8,
    244	},
    245
    246	[SRAM_CH10] = {
    247		.i = SRAM_CH10,
    248		.name = "VID Upstream J",
    249		.cmds_start = VID_J_UP_CMDS,
    250		.ctrl_start = VID_J_IQ,
    251		.cdt = VID_J_CDT,
    252		.fifo_start = VID_J_UP_CLUSTER_1,
    253		.fifo_size = (VID_CLUSTER_SIZE << 2),
    254		.ptr1_reg = DMA16_PTR1,
    255		.ptr2_reg = DMA16_PTR2,
    256		.cnt1_reg = DMA16_CNT1,
    257		.cnt2_reg = DMA16_CNT2,
    258		.int_msk = VID_J_INT_MSK,
    259		.int_stat = VID_J_INT_STAT,
    260		.int_mstat = VID_J_INT_MSTAT,
    261		.dma_ctl = VID_SRC_J_DMA_CTL,
    262		.gpcnt_ctl = VID_SRC_J_GPCNT_CTL,
    263		.gpcnt = VID_SRC_J_GPCNT,
    264
    265		.vid_fmt_ctl = VID_SRC_J_FMT_CTL,
    266		.vid_active_ctl1 = VID_SRC_J_ACTIVE_CTL1,
    267		.vid_active_ctl2 = VID_SRC_J_ACTIVE_CTL2,
    268		.vid_cdt_size = VID_SRC_J_CDT_SZ,
    269		.irq_bit = 9,
    270	},
    271
    272	[SRAM_CH11] = {
    273		.i = SRAM_CH11,
    274		.name = "Audio Upstream Channel B",
    275		.cmds_start = AUD_B_UP_CMDS,
    276		.ctrl_start = AUD_B_IQ,
    277		.cdt = AUD_B_CDT,
    278		.fifo_start = AUD_B_UP_CLUSTER_1,
    279		.fifo_size = (AUDIO_CLUSTER_SIZE * 3),
    280		.ptr1_reg = DMA22_PTR1,
    281		.ptr2_reg = DMA22_PTR2,
    282		.cnt1_reg = DMA22_CNT1,
    283		.cnt2_reg = DMA22_CNT2,
    284		.int_msk = AUD_B_INT_MSK,
    285		.int_stat = AUD_B_INT_STAT,
    286		.int_mstat = AUD_B_INT_MSTAT,
    287		.dma_ctl = AUD_INT_DMA_CTL,
    288		.gpcnt_ctl = AUD_B_GPCNT_CTL,
    289		.gpcnt = AUD_B_GPCNT,
    290		.aud_length = AUD_B_LNGTH,
    291		.aud_cfg = AUD_B_CFG,
    292		.fld_aud_fifo_en = FLD_AUD_SRC_B_FIFO_EN,
    293		.fld_aud_risc_en = FLD_AUD_SRC_B_RISC_EN,
    294		.irq_bit = 11,
    295	},
    296};
    297EXPORT_SYMBOL(cx25821_sram_channels);
    298
    299static int cx25821_risc_decode(u32 risc)
    300{
    301	static const char * const instr[16] = {
    302		[RISC_SYNC >> 28] = "sync",
    303		[RISC_WRITE >> 28] = "write",
    304		[RISC_WRITEC >> 28] = "writec",
    305		[RISC_READ >> 28] = "read",
    306		[RISC_READC >> 28] = "readc",
    307		[RISC_JUMP >> 28] = "jump",
    308		[RISC_SKIP >> 28] = "skip",
    309		[RISC_WRITERM >> 28] = "writerm",
    310		[RISC_WRITECM >> 28] = "writecm",
    311		[RISC_WRITECR >> 28] = "writecr",
    312	};
    313	static const int incr[16] = {
    314		[RISC_WRITE >> 28] = 3,
    315		[RISC_JUMP >> 28] = 3,
    316		[RISC_SKIP >> 28] = 1,
    317		[RISC_SYNC >> 28] = 1,
    318		[RISC_WRITERM >> 28] = 3,
    319		[RISC_WRITECM >> 28] = 3,
    320		[RISC_WRITECR >> 28] = 4,
    321	};
    322	static const char * const bits[] = {
    323		"12", "13", "14", "resync",
    324		"cnt0", "cnt1", "18", "19",
    325		"20", "21", "22", "23",
    326		"irq1", "irq2", "eol", "sol",
    327	};
    328	int i;
    329
    330	pr_cont("0x%08x [ %s",
    331		risc, instr[risc >> 28] ? instr[risc >> 28] : "INVALID");
    332	for (i = ARRAY_SIZE(bits) - 1; i >= 0; i--) {
    333		if (risc & (1 << (i + 12)))
    334			pr_cont(" %s", bits[i]);
    335	}
    336	pr_cont(" count=%d ]\n", risc & 0xfff);
    337	return incr[risc >> 28] ? incr[risc >> 28] : 1;
    338}
    339
    340static void cx25821_registers_init(struct cx25821_dev *dev)
    341{
    342	u32 tmp;
    343
    344	/* enable RUN_RISC in Pecos */
    345	cx_write(DEV_CNTRL2, 0x20);
    346
    347	/* Set the master PCI interrupt masks to enable video, audio, MBIF,
    348	 * and GPIO interrupts
    349	 * I2C interrupt masking is handled by the I2C objects themselves. */
    350	cx_write(PCI_INT_MSK, 0x2001FFFF);
    351
    352	tmp = cx_read(RDR_TLCTL0);
    353	tmp &= ~FLD_CFG_RCB_CK_EN;	/* Clear the RCB_CK_EN bit */
    354	cx_write(RDR_TLCTL0, tmp);
    355
    356	/* PLL-A setting for the Audio Master Clock */
    357	cx_write(PLL_A_INT_FRAC, 0x9807A58B);
    358
    359	/* PLL_A_POST = 0x1C, PLL_A_OUT_TO_PIN = 0x1 */
    360	cx_write(PLL_A_POST_STAT_BIST, 0x8000019C);
    361
    362	/* clear reset bit [31] */
    363	tmp = cx_read(PLL_A_INT_FRAC);
    364	cx_write(PLL_A_INT_FRAC, tmp & 0x7FFFFFFF);
    365
    366	/* PLL-B setting for Mobilygen Host Bus Interface */
    367	cx_write(PLL_B_INT_FRAC, 0x9883A86F);
    368
    369	/* PLL_B_POST = 0xD, PLL_B_OUT_TO_PIN = 0x0 */
    370	cx_write(PLL_B_POST_STAT_BIST, 0x8000018D);
    371
    372	/* clear reset bit [31] */
    373	tmp = cx_read(PLL_B_INT_FRAC);
    374	cx_write(PLL_B_INT_FRAC, tmp & 0x7FFFFFFF);
    375
    376	/* PLL-C setting for video upstream channel */
    377	cx_write(PLL_C_INT_FRAC, 0x96A0EA3F);
    378
    379	/* PLL_C_POST = 0x3, PLL_C_OUT_TO_PIN = 0x0 */
    380	cx_write(PLL_C_POST_STAT_BIST, 0x80000103);
    381
    382	/* clear reset bit [31] */
    383	tmp = cx_read(PLL_C_INT_FRAC);
    384	cx_write(PLL_C_INT_FRAC, tmp & 0x7FFFFFFF);
    385
    386	/* PLL-D setting for audio upstream channel */
    387	cx_write(PLL_D_INT_FRAC, 0x98757F5B);
    388
    389	/* PLL_D_POST = 0x13, PLL_D_OUT_TO_PIN = 0x0 */
    390	cx_write(PLL_D_POST_STAT_BIST, 0x80000113);
    391
    392	/* clear reset bit [31] */
    393	tmp = cx_read(PLL_D_INT_FRAC);
    394	cx_write(PLL_D_INT_FRAC, tmp & 0x7FFFFFFF);
    395
    396	/* This selects the PLL C clock source for the video upstream channel
    397	 * I and J */
    398	tmp = cx_read(VID_CH_CLK_SEL);
    399	cx_write(VID_CH_CLK_SEL, (tmp & 0x00FFFFFF) | 0x24000000);
    400
    401	/* 656/VIP SRC Upstream Channel I & J and 7 - Host Bus Interface for
    402	 * channel A-C
    403	 * select 656/VIP DST for downstream Channel A - C */
    404	tmp = cx_read(VID_CH_MODE_SEL);
    405	/* cx_write( VID_CH_MODE_SEL, tmp | 0x1B0001FF); */
    406	cx_write(VID_CH_MODE_SEL, tmp & 0xFFFFFE00);
    407
    408	/* enables 656 port I and J as output */
    409	tmp = cx_read(CLK_RST);
    410	/* use external ALT_PLL_REF pin as its reference clock instead */
    411	tmp |= FLD_USE_ALT_PLL_REF;
    412	cx_write(CLK_RST, tmp & ~(FLD_VID_I_CLK_NOE | FLD_VID_J_CLK_NOE));
    413
    414	msleep(100);
    415}
    416
    417int cx25821_sram_channel_setup(struct cx25821_dev *dev,
    418			       const struct sram_channel *ch,
    419			       unsigned int bpl, u32 risc)
    420{
    421	unsigned int i, lines;
    422	u32 cdt;
    423
    424	if (ch->cmds_start == 0) {
    425		cx_write(ch->ptr1_reg, 0);
    426		cx_write(ch->ptr2_reg, 0);
    427		cx_write(ch->cnt2_reg, 0);
    428		cx_write(ch->cnt1_reg, 0);
    429		return 0;
    430	}
    431
    432	bpl = (bpl + 7) & ~7;	/* alignment */
    433	cdt = ch->cdt;
    434	lines = ch->fifo_size / bpl;
    435
    436	if (lines > 4)
    437		lines = 4;
    438
    439	BUG_ON(lines < 2);
    440
    441	cx_write(8 + 0, RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC);
    442	cx_write(8 + 4, 8);
    443	cx_write(8 + 8, 0);
    444
    445	/* write CDT */
    446	for (i = 0; i < lines; i++) {
    447		cx_write(cdt + 16 * i, ch->fifo_start + bpl * i);
    448		cx_write(cdt + 16 * i + 4, 0);
    449		cx_write(cdt + 16 * i + 8, 0);
    450		cx_write(cdt + 16 * i + 12, 0);
    451	}
    452
    453	/* init the first cdt buffer */
    454	for (i = 0; i < 128; i++)
    455		cx_write(ch->fifo_start + 4 * i, i);
    456
    457	/* write CMDS */
    458	if (ch->jumponly)
    459		cx_write(ch->cmds_start + 0, 8);
    460	else
    461		cx_write(ch->cmds_start + 0, risc);
    462
    463	cx_write(ch->cmds_start + 4, 0);	/* 64 bits 63-32 */
    464	cx_write(ch->cmds_start + 8, cdt);
    465	cx_write(ch->cmds_start + 12, (lines * 16) >> 3);
    466	cx_write(ch->cmds_start + 16, ch->ctrl_start);
    467
    468	if (ch->jumponly)
    469		cx_write(ch->cmds_start + 20, 0x80000000 | (64 >> 2));
    470	else
    471		cx_write(ch->cmds_start + 20, 64 >> 2);
    472
    473	for (i = 24; i < 80; i += 4)
    474		cx_write(ch->cmds_start + i, 0);
    475
    476	/* fill registers */
    477	cx_write(ch->ptr1_reg, ch->fifo_start);
    478	cx_write(ch->ptr2_reg, cdt);
    479	cx_write(ch->cnt2_reg, (lines * 16) >> 3);
    480	cx_write(ch->cnt1_reg, (bpl >> 3) - 1);
    481
    482	return 0;
    483}
    484
    485int cx25821_sram_channel_setup_audio(struct cx25821_dev *dev,
    486				     const struct sram_channel *ch,
    487				     unsigned int bpl, u32 risc)
    488{
    489	unsigned int i, lines;
    490	u32 cdt;
    491
    492	if (ch->cmds_start == 0) {
    493		cx_write(ch->ptr1_reg, 0);
    494		cx_write(ch->ptr2_reg, 0);
    495		cx_write(ch->cnt2_reg, 0);
    496		cx_write(ch->cnt1_reg, 0);
    497		return 0;
    498	}
    499
    500	bpl = (bpl + 7) & ~7;	/* alignment */
    501	cdt = ch->cdt;
    502	lines = ch->fifo_size / bpl;
    503
    504	if (lines > 3)
    505		lines = 3;	/* for AUDIO */
    506
    507	BUG_ON(lines < 2);
    508
    509	cx_write(8 + 0, RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC);
    510	cx_write(8 + 4, 8);
    511	cx_write(8 + 8, 0);
    512
    513	/* write CDT */
    514	for (i = 0; i < lines; i++) {
    515		cx_write(cdt + 16 * i, ch->fifo_start + bpl * i);
    516		cx_write(cdt + 16 * i + 4, 0);
    517		cx_write(cdt + 16 * i + 8, 0);
    518		cx_write(cdt + 16 * i + 12, 0);
    519	}
    520
    521	/* write CMDS */
    522	if (ch->jumponly)
    523		cx_write(ch->cmds_start + 0, 8);
    524	else
    525		cx_write(ch->cmds_start + 0, risc);
    526
    527	cx_write(ch->cmds_start + 4, 0);	/* 64 bits 63-32 */
    528	cx_write(ch->cmds_start + 8, cdt);
    529	cx_write(ch->cmds_start + 12, (lines * 16) >> 3);
    530	cx_write(ch->cmds_start + 16, ch->ctrl_start);
    531
    532	/* IQ size */
    533	if (ch->jumponly)
    534		cx_write(ch->cmds_start + 20, 0x80000000 | (64 >> 2));
    535	else
    536		cx_write(ch->cmds_start + 20, 64 >> 2);
    537
    538	/* zero out */
    539	for (i = 24; i < 80; i += 4)
    540		cx_write(ch->cmds_start + i, 0);
    541
    542	/* fill registers */
    543	cx_write(ch->ptr1_reg, ch->fifo_start);
    544	cx_write(ch->ptr2_reg, cdt);
    545	cx_write(ch->cnt2_reg, (lines * 16) >> 3);
    546	cx_write(ch->cnt1_reg, (bpl >> 3) - 1);
    547
    548	return 0;
    549}
    550EXPORT_SYMBOL(cx25821_sram_channel_setup_audio);
    551
    552void cx25821_sram_channel_dump(struct cx25821_dev *dev, const struct sram_channel *ch)
    553{
    554	static char *name[] = {
    555		"init risc lo",
    556		"init risc hi",
    557		"cdt base",
    558		"cdt size",
    559		"iq base",
    560		"iq size",
    561		"risc pc lo",
    562		"risc pc hi",
    563		"iq wr ptr",
    564		"iq rd ptr",
    565		"cdt current",
    566		"pci target lo",
    567		"pci target hi",
    568		"line / byte",
    569	};
    570	u32 risc;
    571	unsigned int i, j, n;
    572
    573	pr_warn("%s: %s - dma channel status dump\n", dev->name, ch->name);
    574	for (i = 0; i < ARRAY_SIZE(name); i++)
    575		pr_warn("cmds + 0x%2x:   %-15s: 0x%08x\n",
    576			i * 4, name[i], cx_read(ch->cmds_start + 4 * i));
    577
    578	j = i * 4;
    579	for (i = 0; i < 4;) {
    580		risc = cx_read(ch->cmds_start + 4 * (i + 14));
    581		pr_warn("cmds + 0x%2x:   risc%d: ", j + i * 4, i);
    582		i += cx25821_risc_decode(risc);
    583	}
    584
    585	for (i = 0; i < (64 >> 2); i += n) {
    586		risc = cx_read(ch->ctrl_start + 4 * i);
    587		/* No consideration for bits 63-32 */
    588
    589		pr_warn("ctrl + 0x%2x (0x%08x): iq %x: ",
    590			i * 4, ch->ctrl_start + 4 * i, i);
    591		n = cx25821_risc_decode(risc);
    592		for (j = 1; j < n; j++) {
    593			risc = cx_read(ch->ctrl_start + 4 * (i + j));
    594			pr_warn("ctrl + 0x%2x :   iq %x: 0x%08x [ arg #%d ]\n",
    595				4 * (i + j), i + j, risc, j);
    596		}
    597	}
    598
    599	pr_warn("        :   fifo: 0x%08x -> 0x%x\n",
    600		ch->fifo_start, ch->fifo_start + ch->fifo_size);
    601	pr_warn("        :   ctrl: 0x%08x -> 0x%x\n",
    602		ch->ctrl_start, ch->ctrl_start + 6 * 16);
    603	pr_warn("        :   ptr1_reg: 0x%08x\n",
    604		cx_read(ch->ptr1_reg));
    605	pr_warn("        :   ptr2_reg: 0x%08x\n",
    606		cx_read(ch->ptr2_reg));
    607	pr_warn("        :   cnt1_reg: 0x%08x\n",
    608		cx_read(ch->cnt1_reg));
    609	pr_warn("        :   cnt2_reg: 0x%08x\n",
    610		cx_read(ch->cnt2_reg));
    611}
    612
    613void cx25821_sram_channel_dump_audio(struct cx25821_dev *dev,
    614				     const struct sram_channel *ch)
    615{
    616	static const char * const name[] = {
    617		"init risc lo",
    618		"init risc hi",
    619		"cdt base",
    620		"cdt size",
    621		"iq base",
    622		"iq size",
    623		"risc pc lo",
    624		"risc pc hi",
    625		"iq wr ptr",
    626		"iq rd ptr",
    627		"cdt current",
    628		"pci target lo",
    629		"pci target hi",
    630		"line / byte",
    631	};
    632
    633	u32 risc, value, tmp;
    634	unsigned int i, j, n;
    635
    636	pr_info("\n%s: %s - dma Audio channel status dump\n",
    637		dev->name, ch->name);
    638
    639	for (i = 0; i < ARRAY_SIZE(name); i++)
    640		pr_info("%s: cmds + 0x%2x:   %-15s: 0x%08x\n",
    641			dev->name, i * 4, name[i],
    642			cx_read(ch->cmds_start + 4 * i));
    643
    644	j = i * 4;
    645	for (i = 0; i < 4;) {
    646		risc = cx_read(ch->cmds_start + 4 * (i + 14));
    647		pr_warn("cmds + 0x%2x:   risc%d: ", j + i * 4, i);
    648		i += cx25821_risc_decode(risc);
    649	}
    650
    651	for (i = 0; i < (64 >> 2); i += n) {
    652		risc = cx_read(ch->ctrl_start + 4 * i);
    653		/* No consideration for bits 63-32 */
    654
    655		pr_warn("ctrl + 0x%2x (0x%08x): iq %x: ",
    656			i * 4, ch->ctrl_start + 4 * i, i);
    657		n = cx25821_risc_decode(risc);
    658
    659		for (j = 1; j < n; j++) {
    660			risc = cx_read(ch->ctrl_start + 4 * (i + j));
    661			pr_warn("ctrl + 0x%2x :   iq %x: 0x%08x [ arg #%d ]\n",
    662				4 * (i + j), i + j, risc, j);
    663		}
    664	}
    665
    666	pr_warn("        :   fifo: 0x%08x -> 0x%x\n",
    667		ch->fifo_start, ch->fifo_start + ch->fifo_size);
    668	pr_warn("        :   ctrl: 0x%08x -> 0x%x\n",
    669		ch->ctrl_start, ch->ctrl_start + 6 * 16);
    670	pr_warn("        :   ptr1_reg: 0x%08x\n",
    671		cx_read(ch->ptr1_reg));
    672	pr_warn("        :   ptr2_reg: 0x%08x\n",
    673		cx_read(ch->ptr2_reg));
    674	pr_warn("        :   cnt1_reg: 0x%08x\n",
    675		cx_read(ch->cnt1_reg));
    676	pr_warn("        :   cnt2_reg: 0x%08x\n",
    677		cx_read(ch->cnt2_reg));
    678
    679	for (i = 0; i < 4; i++) {
    680		risc = cx_read(ch->cmds_start + 56 + (i * 4));
    681		pr_warn("instruction %d = 0x%x\n", i, risc);
    682	}
    683
    684	/* read data from the first cdt buffer */
    685	risc = cx_read(AUD_A_CDT);
    686	pr_warn("\nread cdt loc=0x%x\n", risc);
    687	for (i = 0; i < 8; i++) {
    688		n = cx_read(risc + i * 4);
    689		pr_cont("0x%x ", n);
    690	}
    691	pr_cont("\n\n");
    692
    693	value = cx_read(CLK_RST);
    694	CX25821_INFO(" CLK_RST = 0x%x\n\n", value);
    695
    696	value = cx_read(PLL_A_POST_STAT_BIST);
    697	CX25821_INFO(" PLL_A_POST_STAT_BIST = 0x%x\n\n", value);
    698	value = cx_read(PLL_A_INT_FRAC);
    699	CX25821_INFO(" PLL_A_INT_FRAC = 0x%x\n\n", value);
    700
    701	value = cx_read(PLL_B_POST_STAT_BIST);
    702	CX25821_INFO(" PLL_B_POST_STAT_BIST = 0x%x\n\n", value);
    703	value = cx_read(PLL_B_INT_FRAC);
    704	CX25821_INFO(" PLL_B_INT_FRAC = 0x%x\n\n", value);
    705
    706	value = cx_read(PLL_C_POST_STAT_BIST);
    707	CX25821_INFO(" PLL_C_POST_STAT_BIST = 0x%x\n\n", value);
    708	value = cx_read(PLL_C_INT_FRAC);
    709	CX25821_INFO(" PLL_C_INT_FRAC = 0x%x\n\n", value);
    710
    711	value = cx_read(PLL_D_POST_STAT_BIST);
    712	CX25821_INFO(" PLL_D_POST_STAT_BIST = 0x%x\n\n", value);
    713	value = cx_read(PLL_D_INT_FRAC);
    714	CX25821_INFO(" PLL_D_INT_FRAC = 0x%x\n\n", value);
    715
    716	value = cx25821_i2c_read(&dev->i2c_bus[0], AFE_AB_DIAG_CTRL, &tmp);
    717	CX25821_INFO(" AFE_AB_DIAG_CTRL (0x10900090) = 0x%x\n\n", value);
    718}
    719EXPORT_SYMBOL(cx25821_sram_channel_dump_audio);
    720
    721static void cx25821_shutdown(struct cx25821_dev *dev)
    722{
    723	int i;
    724
    725	/* disable RISC controller */
    726	cx_write(DEV_CNTRL2, 0);
    727
    728	/* Disable Video A/B activity */
    729	for (i = 0; i < VID_CHANNEL_NUM; i++) {
    730		cx_write(dev->channels[i].sram_channels->dma_ctl, 0);
    731		cx_write(dev->channels[i].sram_channels->int_msk, 0);
    732	}
    733
    734	for (i = VID_UPSTREAM_SRAM_CHANNEL_I;
    735		i <= VID_UPSTREAM_SRAM_CHANNEL_J; i++) {
    736		cx_write(dev->channels[i].sram_channels->dma_ctl, 0);
    737		cx_write(dev->channels[i].sram_channels->int_msk, 0);
    738	}
    739
    740	/* Disable Audio activity */
    741	cx_write(AUD_INT_DMA_CTL, 0);
    742
    743	/* Disable Serial port */
    744	cx_write(UART_CTL, 0);
    745
    746	/* Disable Interrupts */
    747	cx_write(PCI_INT_MSK, 0);
    748	cx_write(AUD_A_INT_MSK, 0);
    749}
    750
    751void cx25821_set_pixel_format(struct cx25821_dev *dev, int channel_select,
    752			      u32 format)
    753{
    754	if (channel_select <= 7 && channel_select >= 0) {
    755		cx_write(dev->channels[channel_select].sram_channels->pix_frmt,
    756				format);
    757	}
    758	dev->channels[channel_select].pixel_formats = format;
    759}
    760
    761static void cx25821_set_vip_mode(struct cx25821_dev *dev,
    762				 const struct sram_channel *ch)
    763{
    764	cx_write(ch->pix_frmt, PIXEL_FRMT_422);
    765	cx_write(ch->vip_ctl, PIXEL_ENGINE_VIP1);
    766}
    767
    768static void cx25821_initialize(struct cx25821_dev *dev)
    769{
    770	int i;
    771
    772	dprintk(1, "%s()\n", __func__);
    773
    774	cx25821_shutdown(dev);
    775	cx_write(PCI_INT_STAT, 0xffffffff);
    776
    777	for (i = 0; i < VID_CHANNEL_NUM; i++)
    778		cx_write(dev->channels[i].sram_channels->int_stat, 0xffffffff);
    779
    780	cx_write(AUD_A_INT_STAT, 0xffffffff);
    781	cx_write(AUD_B_INT_STAT, 0xffffffff);
    782	cx_write(AUD_C_INT_STAT, 0xffffffff);
    783	cx_write(AUD_D_INT_STAT, 0xffffffff);
    784	cx_write(AUD_E_INT_STAT, 0xffffffff);
    785
    786	cx_write(CLK_DELAY, cx_read(CLK_DELAY) & 0x80000000);
    787	cx_write(PAD_CTRL, 0x12);	/* for I2C */
    788	cx25821_registers_init(dev);	/* init Pecos registers */
    789	msleep(100);
    790
    791	for (i = 0; i < VID_CHANNEL_NUM; i++) {
    792		cx25821_set_vip_mode(dev, dev->channels[i].sram_channels);
    793		cx25821_sram_channel_setup(dev, dev->channels[i].sram_channels,
    794						1440, 0);
    795		dev->channels[i].pixel_formats = PIXEL_FRMT_422;
    796		dev->channels[i].use_cif_resolution = 0;
    797	}
    798
    799	/* Probably only affect Downstream */
    800	for (i = VID_UPSTREAM_SRAM_CHANNEL_I;
    801		i <= VID_UPSTREAM_SRAM_CHANNEL_J; i++) {
    802		dev->channels[i].pixel_formats = PIXEL_FRMT_422;
    803		cx25821_set_vip_mode(dev, dev->channels[i].sram_channels);
    804	}
    805
    806	cx25821_sram_channel_setup_audio(dev,
    807			dev->channels[SRAM_CH08].sram_channels, 128, 0);
    808
    809	cx25821_gpio_init(dev);
    810}
    811
    812static int cx25821_get_resources(struct cx25821_dev *dev)
    813{
    814	if (request_mem_region(pci_resource_start(dev->pci, 0),
    815				pci_resource_len(dev->pci, 0), dev->name))
    816		return 0;
    817
    818	pr_err("%s: can't get MMIO memory @ 0x%llx\n",
    819		dev->name, (unsigned long long)pci_resource_start(dev->pci, 0));
    820
    821	return -EBUSY;
    822}
    823
    824static void cx25821_dev_checkrevision(struct cx25821_dev *dev)
    825{
    826	dev->hwrevision = cx_read(RDR_CFG2) & 0xff;
    827
    828	pr_info("Hardware revision = 0x%02x\n", dev->hwrevision);
    829}
    830
    831static void cx25821_iounmap(struct cx25821_dev *dev)
    832{
    833	if (dev == NULL)
    834		return;
    835
    836	/* Releasing IO memory */
    837	if (dev->lmmio != NULL) {
    838		iounmap(dev->lmmio);
    839		dev->lmmio = NULL;
    840	}
    841}
    842
    843static int cx25821_dev_setup(struct cx25821_dev *dev)
    844{
    845	static unsigned int cx25821_devcount;
    846	int i;
    847
    848	mutex_init(&dev->lock);
    849
    850	dev->nr = ++cx25821_devcount;
    851	sprintf(dev->name, "cx25821[%d]", dev->nr);
    852
    853	if (dev->nr >= ARRAY_SIZE(card)) {
    854		CX25821_INFO("dev->nr >= %zd", ARRAY_SIZE(card));
    855		return -ENODEV;
    856	}
    857	if (dev->pci->device != 0x8210) {
    858		pr_info("%s(): Exiting. Incorrect Hardware device = 0x%02x\n",
    859			__func__, dev->pci->device);
    860		return -ENODEV;
    861	}
    862	pr_info("Athena Hardware device = 0x%02x\n", dev->pci->device);
    863
    864	/* Apply a sensible clock frequency for the PCIe bridge */
    865	dev->clk_freq = 28000000;
    866	for (i = 0; i < MAX_VID_CHANNEL_NUM; i++) {
    867		dev->channels[i].dev = dev;
    868		dev->channels[i].id = i;
    869		dev->channels[i].sram_channels = &cx25821_sram_channels[i];
    870	}
    871
    872	/* board config */
    873	dev->board = 1;		/* card[dev->nr]; */
    874	dev->_max_num_decoders = MAX_DECODERS;
    875
    876	dev->pci_bus = dev->pci->bus->number;
    877	dev->pci_slot = PCI_SLOT(dev->pci->devfn);
    878	dev->pci_irqmask = 0x001f00;
    879
    880	/* External Master 1 Bus */
    881	dev->i2c_bus[0].nr = 0;
    882	dev->i2c_bus[0].dev = dev;
    883	dev->i2c_bus[0].reg_stat = I2C1_STAT;
    884	dev->i2c_bus[0].reg_ctrl = I2C1_CTRL;
    885	dev->i2c_bus[0].reg_addr = I2C1_ADDR;
    886	dev->i2c_bus[0].reg_rdata = I2C1_RDATA;
    887	dev->i2c_bus[0].reg_wdata = I2C1_WDATA;
    888	dev->i2c_bus[0].i2c_period = (0x07 << 24);	/* 1.95MHz */
    889
    890	if (cx25821_get_resources(dev) < 0) {
    891		pr_err("%s: No more PCIe resources for subsystem: %04x:%04x\n",
    892		       dev->name, dev->pci->subsystem_vendor,
    893		       dev->pci->subsystem_device);
    894
    895		cx25821_devcount--;
    896		return -EBUSY;
    897	}
    898
    899	/* PCIe stuff */
    900	dev->base_io_addr = pci_resource_start(dev->pci, 0);
    901
    902	if (!dev->base_io_addr) {
    903		CX25821_ERR("No PCI Memory resources, exiting!\n");
    904		return -ENODEV;
    905	}
    906
    907	dev->lmmio = ioremap(dev->base_io_addr, pci_resource_len(dev->pci, 0));
    908
    909	if (!dev->lmmio) {
    910		CX25821_ERR("ioremap failed, maybe increasing __VMALLOC_RESERVE in page.h\n");
    911		cx25821_iounmap(dev);
    912		return -ENOMEM;
    913	}
    914
    915	dev->bmmio = (u8 __iomem *) dev->lmmio;
    916
    917	pr_info("%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
    918		dev->name, dev->pci->subsystem_vendor,
    919		dev->pci->subsystem_device, cx25821_boards[dev->board].name,
    920		dev->board, card[dev->nr] == dev->board ?
    921		"insmod option" : "autodetected");
    922
    923	/* init hardware */
    924	cx25821_initialize(dev);
    925
    926	cx25821_i2c_register(&dev->i2c_bus[0]);
    927/*  cx25821_i2c_register(&dev->i2c_bus[1]);
    928 *  cx25821_i2c_register(&dev->i2c_bus[2]); */
    929
    930	if (medusa_video_init(dev) < 0)
    931		CX25821_ERR("%s(): Failed to initialize medusa!\n", __func__);
    932
    933	cx25821_video_register(dev);
    934
    935	cx25821_dev_checkrevision(dev);
    936	return 0;
    937}
    938
    939void cx25821_dev_unregister(struct cx25821_dev *dev)
    940{
    941	int i;
    942
    943	if (!dev->base_io_addr)
    944		return;
    945
    946	release_mem_region(dev->base_io_addr, pci_resource_len(dev->pci, 0));
    947
    948	for (i = 0; i < MAX_VID_CAP_CHANNEL_NUM - 1; i++) {
    949		if (i == SRAM_CH08) /* audio channel */
    950			continue;
    951		/*
    952		 * TODO: enable when video output is properly
    953		 * supported.
    954		if (i == SRAM_CH09 || i == SRAM_CH10)
    955			cx25821_free_mem_upstream(&dev->channels[i]);
    956		 */
    957		cx25821_video_unregister(dev, i);
    958	}
    959
    960	cx25821_i2c_unregister(&dev->i2c_bus[0]);
    961	cx25821_iounmap(dev);
    962}
    963EXPORT_SYMBOL(cx25821_dev_unregister);
    964
    965int cx25821_riscmem_alloc(struct pci_dev *pci,
    966		       struct cx25821_riscmem *risc,
    967		       unsigned int size)
    968{
    969	__le32 *cpu;
    970	dma_addr_t dma = 0;
    971
    972	if (risc->cpu && risc->size < size) {
    973		dma_free_coherent(&pci->dev, risc->size, risc->cpu, risc->dma);
    974		risc->cpu = NULL;
    975	}
    976	if (NULL == risc->cpu) {
    977		cpu = dma_alloc_coherent(&pci->dev, size, &dma, GFP_KERNEL);
    978		if (NULL == cpu)
    979			return -ENOMEM;
    980		risc->cpu  = cpu;
    981		risc->dma  = dma;
    982		risc->size = size;
    983	}
    984	return 0;
    985}
    986EXPORT_SYMBOL(cx25821_riscmem_alloc);
    987
    988static __le32 *cx25821_risc_field(__le32 * rp, struct scatterlist *sglist,
    989				  unsigned int offset, u32 sync_line,
    990				  unsigned int bpl, unsigned int padding,
    991				  unsigned int lines, bool jump)
    992{
    993	struct scatterlist *sg;
    994	unsigned int line, todo;
    995
    996	if (jump) {
    997		*(rp++) = cpu_to_le32(RISC_JUMP);
    998		*(rp++) = cpu_to_le32(0);
    999		*(rp++) = cpu_to_le32(0); /* bits 63-32 */
   1000	}
   1001
   1002	/* sync instruction */
   1003	if (sync_line != NO_SYNC_LINE)
   1004		*(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
   1005
   1006	/* scan lines */
   1007	sg = sglist;
   1008	for (line = 0; line < lines; line++) {
   1009		while (offset && offset >= sg_dma_len(sg)) {
   1010			offset -= sg_dma_len(sg);
   1011			sg = sg_next(sg);
   1012		}
   1013		if (bpl <= sg_dma_len(sg) - offset) {
   1014			/* fits into current chunk */
   1015			*(rp++) = cpu_to_le32(RISC_WRITE | RISC_SOL | RISC_EOL |
   1016					bpl);
   1017			*(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
   1018			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
   1019			offset += bpl;
   1020		} else {
   1021			/* scanline needs to be split */
   1022			todo = bpl;
   1023			*(rp++) = cpu_to_le32(RISC_WRITE | RISC_SOL |
   1024					(sg_dma_len(sg) - offset));
   1025			*(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
   1026			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
   1027			todo -= (sg_dma_len(sg) - offset);
   1028			offset = 0;
   1029			sg = sg_next(sg);
   1030			while (todo > sg_dma_len(sg)) {
   1031				*(rp++) = cpu_to_le32(RISC_WRITE |
   1032						sg_dma_len(sg));
   1033				*(rp++) = cpu_to_le32(sg_dma_address(sg));
   1034				*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
   1035				todo -= sg_dma_len(sg);
   1036				sg = sg_next(sg);
   1037			}
   1038			*(rp++) = cpu_to_le32(RISC_WRITE | RISC_EOL | todo);
   1039			*(rp++) = cpu_to_le32(sg_dma_address(sg));
   1040			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
   1041			offset += todo;
   1042		}
   1043
   1044		offset += padding;
   1045	}
   1046
   1047	return rp;
   1048}
   1049
   1050int cx25821_risc_buffer(struct pci_dev *pci, struct cx25821_riscmem *risc,
   1051			struct scatterlist *sglist, unsigned int top_offset,
   1052			unsigned int bottom_offset, unsigned int bpl,
   1053			unsigned int padding, unsigned int lines)
   1054{
   1055	u32 instructions;
   1056	u32 fields;
   1057	__le32 *rp;
   1058	int rc;
   1059
   1060	fields = 0;
   1061	if (UNSET != top_offset)
   1062		fields++;
   1063	if (UNSET != bottom_offset)
   1064		fields++;
   1065
   1066	/* estimate risc mem: worst case is one write per page border +
   1067	   one write per scan line + syncs + jump (all 3 dwords).  Padding
   1068	   can cause next bpl to start close to a page border.  First DMA
   1069	   region may be smaller than PAGE_SIZE */
   1070	/* write and jump need and extra dword */
   1071	instructions = fields * (1 + ((bpl + padding) * lines) / PAGE_SIZE +
   1072			lines);
   1073	instructions += 5;
   1074	rc = cx25821_riscmem_alloc(pci, risc, instructions * 12);
   1075
   1076	if (rc < 0)
   1077		return rc;
   1078
   1079	/* write risc instructions */
   1080	rp = risc->cpu;
   1081
   1082	if (UNSET != top_offset) {
   1083		rp = cx25821_risc_field(rp, sglist, top_offset, 0, bpl, padding,
   1084					lines, true);
   1085	}
   1086
   1087	if (UNSET != bottom_offset) {
   1088		rp = cx25821_risc_field(rp, sglist, bottom_offset, 0x200, bpl,
   1089					padding, lines, UNSET == top_offset);
   1090	}
   1091
   1092	/* save pointer to jmp instruction address */
   1093	risc->jmp = rp;
   1094	BUG_ON((risc->jmp - risc->cpu + 3) * sizeof(*risc->cpu) > risc->size);
   1095
   1096	return 0;
   1097}
   1098
   1099static __le32 *cx25821_risc_field_audio(__le32 * rp, struct scatterlist *sglist,
   1100					unsigned int offset, u32 sync_line,
   1101					unsigned int bpl, unsigned int padding,
   1102					unsigned int lines, unsigned int lpi)
   1103{
   1104	struct scatterlist *sg;
   1105	unsigned int line, todo, sol;
   1106
   1107	/* sync instruction */
   1108	if (sync_line != NO_SYNC_LINE)
   1109		*(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
   1110
   1111	/* scan lines */
   1112	sg = sglist;
   1113	for (line = 0; line < lines; line++) {
   1114		while (offset && offset >= sg_dma_len(sg)) {
   1115			offset -= sg_dma_len(sg);
   1116			sg = sg_next(sg);
   1117		}
   1118
   1119		if (lpi && line > 0 && !(line % lpi))
   1120			sol = RISC_SOL | RISC_IRQ1 | RISC_CNT_INC;
   1121		else
   1122			sol = RISC_SOL;
   1123
   1124		if (bpl <= sg_dma_len(sg) - offset) {
   1125			/* fits into current chunk */
   1126			*(rp++) = cpu_to_le32(RISC_WRITE | sol | RISC_EOL |
   1127					bpl);
   1128			*(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
   1129			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
   1130			offset += bpl;
   1131		} else {
   1132			/* scanline needs to be split */
   1133			todo = bpl;
   1134			*(rp++) = cpu_to_le32(RISC_WRITE | sol |
   1135					(sg_dma_len(sg) - offset));
   1136			*(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
   1137			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
   1138			todo -= (sg_dma_len(sg) - offset);
   1139			offset = 0;
   1140			sg = sg_next(sg);
   1141			while (todo > sg_dma_len(sg)) {
   1142				*(rp++) = cpu_to_le32(RISC_WRITE |
   1143						sg_dma_len(sg));
   1144				*(rp++) = cpu_to_le32(sg_dma_address(sg));
   1145				*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
   1146				todo -= sg_dma_len(sg);
   1147				sg = sg_next(sg);
   1148			}
   1149			*(rp++) = cpu_to_le32(RISC_WRITE | RISC_EOL | todo);
   1150			*(rp++) = cpu_to_le32(sg_dma_address(sg));
   1151			*(rp++) = cpu_to_le32(0);	/* bits 63-32 */
   1152			offset += todo;
   1153		}
   1154		offset += padding;
   1155	}
   1156
   1157	return rp;
   1158}
   1159
   1160int cx25821_risc_databuffer_audio(struct pci_dev *pci,
   1161				  struct cx25821_riscmem *risc,
   1162				  struct scatterlist *sglist,
   1163				  unsigned int bpl,
   1164				  unsigned int lines, unsigned int lpi)
   1165{
   1166	u32 instructions;
   1167	__le32 *rp;
   1168	int rc;
   1169
   1170	/* estimate risc mem: worst case is one write per page border +
   1171	   one write per scan line + syncs + jump (all 2 dwords).  Here
   1172	   there is no padding and no sync.  First DMA region may be smaller
   1173	   than PAGE_SIZE */
   1174	/* Jump and write need an extra dword */
   1175	instructions = 1 + (bpl * lines) / PAGE_SIZE + lines;
   1176	instructions += 1;
   1177
   1178	rc = cx25821_riscmem_alloc(pci, risc, instructions * 12);
   1179	if (rc < 0)
   1180		return rc;
   1181
   1182	/* write risc instructions */
   1183	rp = risc->cpu;
   1184	rp = cx25821_risc_field_audio(rp, sglist, 0, NO_SYNC_LINE, bpl, 0,
   1185				      lines, lpi);
   1186
   1187	/* save pointer to jmp instruction address */
   1188	risc->jmp = rp;
   1189	BUG_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size);
   1190	return 0;
   1191}
   1192EXPORT_SYMBOL(cx25821_risc_databuffer_audio);
   1193
   1194void cx25821_free_buffer(struct cx25821_dev *dev, struct cx25821_buffer *buf)
   1195{
   1196	if (WARN_ON(buf->risc.size == 0))
   1197		return;
   1198	dma_free_coherent(&dev->pci->dev, buf->risc.size, buf->risc.cpu,
   1199			  buf->risc.dma);
   1200	memset(&buf->risc, 0, sizeof(buf->risc));
   1201}
   1202
   1203static irqreturn_t cx25821_irq(int irq, void *dev_id)
   1204{
   1205	struct cx25821_dev *dev = dev_id;
   1206	u32 pci_status;
   1207	u32 vid_status;
   1208	int i, handled = 0;
   1209	u32 mask[8] = { 1, 2, 4, 8, 16, 32, 64, 128 };
   1210
   1211	pci_status = cx_read(PCI_INT_STAT);
   1212
   1213	if (pci_status == 0)
   1214		goto out;
   1215
   1216	for (i = 0; i < VID_CHANNEL_NUM; i++) {
   1217		if (pci_status & mask[i]) {
   1218			vid_status = cx_read(dev->channels[i].
   1219				sram_channels->int_stat);
   1220
   1221			if (vid_status)
   1222				handled += cx25821_video_irq(dev, i,
   1223						vid_status);
   1224
   1225			cx_write(PCI_INT_STAT, mask[i]);
   1226		}
   1227	}
   1228
   1229out:
   1230	return IRQ_RETVAL(handled);
   1231}
   1232
   1233void cx25821_print_irqbits(char *name, char *tag, char **strings,
   1234			   int len, u32 bits, u32 mask)
   1235{
   1236	unsigned int i;
   1237
   1238	printk(KERN_DEBUG pr_fmt("%s: %s [0x%x]"), name, tag, bits);
   1239
   1240	for (i = 0; i < len; i++) {
   1241		if (!(bits & (1 << i)))
   1242			continue;
   1243		if (strings[i])
   1244			pr_cont(" %s", strings[i]);
   1245		else
   1246			pr_cont(" %d", i);
   1247		if (!(mask & (1 << i)))
   1248			continue;
   1249		pr_cont("*");
   1250	}
   1251	pr_cont("\n");
   1252}
   1253EXPORT_SYMBOL(cx25821_print_irqbits);
   1254
   1255struct cx25821_dev *cx25821_dev_get(struct pci_dev *pci)
   1256{
   1257	struct cx25821_dev *dev = pci_get_drvdata(pci);
   1258	return dev;
   1259}
   1260EXPORT_SYMBOL(cx25821_dev_get);
   1261
   1262static int cx25821_initdev(struct pci_dev *pci_dev,
   1263			   const struct pci_device_id *pci_id)
   1264{
   1265	struct cx25821_dev *dev;
   1266	int err = 0;
   1267
   1268	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
   1269	if (NULL == dev)
   1270		return -ENOMEM;
   1271
   1272	err = v4l2_device_register(&pci_dev->dev, &dev->v4l2_dev);
   1273	if (err < 0)
   1274		goto fail_free;
   1275
   1276	/* pci init */
   1277	dev->pci = pci_dev;
   1278	if (pci_enable_device(pci_dev)) {
   1279		err = -EIO;
   1280
   1281		pr_info("pci enable failed!\n");
   1282
   1283		goto fail_unregister_device;
   1284	}
   1285
   1286	err = cx25821_dev_setup(dev);
   1287	if (err)
   1288		goto fail_unregister_pci;
   1289
   1290	/* print pci info */
   1291	pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev);
   1292	pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat);
   1293	pr_info("%s/0: found at %s, rev: %d, irq: %d, latency: %d, mmio: 0x%llx\n",
   1294		dev->name, pci_name(pci_dev), dev->pci_rev, pci_dev->irq,
   1295		dev->pci_lat, (unsigned long long)dev->base_io_addr);
   1296
   1297	pci_set_master(pci_dev);
   1298	err = dma_set_mask(&pci_dev->dev, 0xffffffff);
   1299	if (err) {
   1300		pr_err("%s/0: Oops: no 32bit PCI DMA ???\n", dev->name);
   1301		err = -EIO;
   1302		goto fail_irq;
   1303	}
   1304
   1305	err = request_irq(pci_dev->irq, cx25821_irq,
   1306			IRQF_SHARED, dev->name, dev);
   1307
   1308	if (err < 0) {
   1309		pr_err("%s: can't get IRQ %d\n", dev->name, pci_dev->irq);
   1310		goto fail_irq;
   1311	}
   1312
   1313	return 0;
   1314
   1315fail_irq:
   1316	pr_info("cx25821_initdev() can't get IRQ !\n");
   1317	cx25821_dev_unregister(dev);
   1318
   1319fail_unregister_pci:
   1320	pci_disable_device(pci_dev);
   1321fail_unregister_device:
   1322	v4l2_device_unregister(&dev->v4l2_dev);
   1323
   1324fail_free:
   1325	kfree(dev);
   1326	return err;
   1327}
   1328
   1329static void cx25821_finidev(struct pci_dev *pci_dev)
   1330{
   1331	struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
   1332	struct cx25821_dev *dev = get_cx25821(v4l2_dev);
   1333
   1334	cx25821_shutdown(dev);
   1335
   1336	/* unregister stuff */
   1337	if (pci_dev->irq)
   1338		free_irq(pci_dev->irq, dev);
   1339	pci_disable_device(pci_dev);
   1340
   1341	cx25821_dev_unregister(dev);
   1342	v4l2_device_unregister(v4l2_dev);
   1343	kfree(dev);
   1344}
   1345
   1346static const struct pci_device_id cx25821_pci_tbl[] = {
   1347	{
   1348		/* CX25821 Athena */
   1349		.vendor = 0x14f1,
   1350		.device = 0x8210,
   1351		.subvendor = 0x14f1,
   1352		.subdevice = 0x0920,
   1353	}, {
   1354		/* CX25821 No Brand */
   1355		.vendor = 0x14f1,
   1356		.device = 0x8210,
   1357		.subvendor = 0x0000,
   1358		.subdevice = 0x0000,
   1359	}, {
   1360		/* --- end of list --- */
   1361	}
   1362};
   1363
   1364MODULE_DEVICE_TABLE(pci, cx25821_pci_tbl);
   1365
   1366static struct pci_driver cx25821_pci_driver = {
   1367	.name = "cx25821",
   1368	.id_table = cx25821_pci_tbl,
   1369	.probe = cx25821_initdev,
   1370	.remove = cx25821_finidev,
   1371};
   1372
   1373static int __init cx25821_init(void)
   1374{
   1375	pr_info("driver loaded\n");
   1376	return pci_register_driver(&cx25821_pci_driver);
   1377}
   1378
   1379static void __exit cx25821_fini(void)
   1380{
   1381	pci_unregister_driver(&cx25821_pci_driver);
   1382}
   1383
   1384module_init(cx25821_init);
   1385module_exit(cx25821_fini);