source: svn/trunk/newcon3bcm2_21bu/magnum/portinginterface/xpt/7552/bxpt_remux.c

Last change on this file was 2, checked in by jglee, 11 years ago

first commit

  • Property svn:executable set to *
File size: 21.5 KB
Line 
1/***************************************************************************
2 *     Copyright (c) 2003-2012, Broadcom Corporation
3 *     All Rights Reserved
4 *     Confidential Property of Broadcom Corporation
5 *
6 *  THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE
7 *  AGREEMENT  BETWEEN THE USER AND BROADCOM.  YOU HAVE NO RIGHT TO USE OR
8 *  EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT.
9 *
10 * $brcm_Workfile: bxpt_remux.c $
11 * $brcm_Revision: Hydra_Software_Devel/4 $
12 * $brcm_Date: 2/13/12 4:00p $
13 *
14 * Porting interface code for the data transport core.
15 *
16 * Revision History:
17 *
18 * $brcm_Log: /magnum/portinginterface/xpt/base2/bxpt_remux.c $
19 *
20 * Hydra_Software_Devel/4   2/13/12 4:00p gmullen
21 * SW7231-658: Fixed array overrun
22 *
23 * Hydra_Software_Devel/3   5/12/11 4:59p gmullen
24 * SW7231-128: Merged to mainline
25 *
26 * Hydra_Software_Devel/SW7231-128/1   5/10/11 1:40p gmohile
27 * SW7231-128 : Add power management support
28 *
29 * Hydra_Software_Devel/2   10/28/10 2:08p gmullen
30 * SW7422-20: Checkin ported files
31 *
32 * Hydra_Software_Devel/38   8/30/10 5:24p gmullen
33 * SW7403-924: Protected access to the PID and SPID table from other
34 * modules in the PI
35 *
36 * Hydra_Software_Devel/37   7/29/10 1:59p gmullen
37 * SW7420-904: Added RMX_NULL_PKT_THRESHOLD
38 *
39 * Hydra_Software_Devel/36   7/27/10 6:13p gmullen
40 * SW7420-903: Corrected code to match hw default
41 *
42 * Hydra_Software_Devel/35   4/23/10 8:54a gmullen
43 * SW3556-1102: Added param to control NULL packet insertion
44 *
45 * Hydra_Software_Devel/34   2/18/10 9:35a gmullen
46 * SW3548-2790: Added API for controlling PCR jitter adjust
47 *
48 * Hydra_Software_Devel/33   9/9/09 8:07a piyushg
49 * SW7630-30: Add 7630 XPT PI support.
50 * Added directory element "7630".
51 *
52 * Hydra_Software_Devel/32   8/11/09 10:40a piyushg
53 * PR55216: Added initial 7340 XPT support.
54 *
55 * Hydra_Software_Devel/31   8/5/09 4:52p piyushg
56 * PR55545: Add 7125 XPT PI support
57 * Added file element "bxpt_rave_ihex.c".
58 * Added file element "bxpt_rave_ihex.h".
59 *
60 * Hydra_Software_Devel/PR55545/1   7/24/09 10:50a mward
61 * PR55548: Adapted for 7125 based on 7342, 7340.
62 *
63 * Hydra_Software_Devel/30   7/14/09 10:22a piyushg
64 * PR56771: Add XPT PI code for 7342.
65 *
66 * Hydra_Software_Devel/29   6/18/09 8:07a gmullen
67 * PR56110: Fixed build errors for other chips.
68 *
69 * Hydra_Software_Devel/28   6/17/09 6:46p gmullen
70 * PR56110: Added support.xpt/7550/uif_image/a0
71 *
72 * Hydra_Software_Devel/27   4/16/09 7:20p piyushg
73 * PR53728: Each of the XC buffer clients (Remux, RAVE, and the Mesg
74 * filters) would get a separate API to set
75 * their input bitrates. That API would take a client handle and the ID of
76 * the parser band. The XPT PI would
77 * then walk backwards through the pipeline, increasing only the bitrates
78 * for the XC and RS buffers that it
79 * needs to.
80 *
81 * Hydra_Software_Devel/26   4/14/09 2:50p piyushg
82 * PR52851: Fix coverity defect. Break statement missing.
83 * Also fix PR52843.
84 *
85 * Hydra_Software_Devel/26   4/14/09 2:47p piyushg
86 * PR52851: Fix coverity defect. Break statement missing.
87 * Also fix PR52843.
88 *
89 * Hydra_Software_Devel/25   4/7/09 5:25p piyushg
90 * PR52986: Add support for 7635
91 * Added directory element "7635".
92 *
93 * Hydra_Software_Devel/24   3/26/09 6:11p gmullen
94 * PR53579: Fixed BCHP mismatches between C and H files.
95 *
96 * Hydra_Software_Devel/23   3/6/09 3:18p piyushg
97 * PR52841: Fixed Coverity defect. Also fix PR52842, 52843,
98 * 52850, 52851.
99 *
100 * Hydra_Software_Devel/22   1/29/09 10:47a gmullen
101 * PR50362: Added workaround for hardware bug (PR 51706).
102 *
103 * Hydra_Software_Devel/21   1/27/09 1:10p gmullen
104 * PR51625: Added 7336 support
105 *
106 * Hydra_Software_Devel/20   1/27/09 10:43a gmullen
107 * PR51620: Changed AddPidChannel and PacketSubControl to static.
108 *
109 * Hydra_Software_Devel/19   1/12/09 4:43p gmullen
110 * PR50362: Fixed addressing bug. Some parts have the remux IO registers
111 * outside of the remux block.
112 *
113 * Hydra_Software_Devel/18   11/26/08 4:15p gmullen
114 * PR47755: Added support for 7420.
115 *
116 * Hydra_Software_Devel/17   11/4/08 4:43p gmullen
117 * PR48062: Removed deadcode.
118 *
119 * Hydra_Software_Devel/16   10/20/08 11:11a gmullen
120 * PR48062: Fixed coverity deadcode warning (I hope...)
121 *
122 * Hydra_Software_Devel/15   6/30/08 10:13a gmullen
123 * PR44320: Enabled missing features in remux PI
124 *
125 * Hydra_Software_Devel/14   5/5/08 3:07p gmullen
126 * PR42437: 7325, 3556, and 3548 only have 2 playback channels.
127 *
128 * Hydra_Software_Devel/13   3/26/08 11:24a gmullen
129 * PR38954: Added 3548 support to XPT PI.
130 *
131 * Hydra_Software_Devel/12   2/22/08 11:09a gmullen
132 * PR39874: Disabled XC buffer pause before disabling remux.
133 *
134 * Hydra_Software_Devel/11   11/28/07 12:12p gmullen
135 * PR36900: Added 7335 support
136 *
137 * Hydra_Software_Devel/10   10/30/07 3:53p gmullen
138 * PR35018: Removed unsupported struct members from
139 * BXPT_Remux_GetChannelDefaultSettings
140 *
141 * Hydra_Software_Devel/9   10/30/07 3:12p gmullen
142 * PR35018: Added support for 7325
143 *
144 * Hydra_Software_Devel/8   11/17/06 5:34p gmullen
145 * PR26034: Fixed BXPT_Remux_AllocPidMap().
146 *
147 * Hydra_Software_Devel/7   11/2/06 8:40a gmullen
148 * PR23189: Added 3563 support.
149 *
150 * Hydra_Software_Devel/6   7/17/06 5:19p gmullen
151 * PR20624: Added code for 7118.
152 *
153 * Hydra_Software_Devel/5   6/2/06 4:23p gmullen
154 * PR21868: Added bitfields to BXPT_Remux_ChannelSettings struct.
155 *
156 * Hydra_Software_Devel/4   4/13/06 4:02p gmullen
157 * PR20914: Ported over Prashant's fix from 7401A0
158 *
159 * Hydra_Software_Devel/3   3/28/06 9:06a gmullen
160 * PR18998: Added SetAllPassMode
161 *
162 * Hydra_Software_Devel/2   3/16/06 5:10p gmullen
163 * PR18998: Added support for reading data from R-pipe (security related).
164 *
165 * Hydra_Software_Devel/1   1/16/06 2:09p gmullen
166 * PR18998: Initial checkin for 7400
167 *
168 * Hydra_Software_Devel/4   1/6/06 4:41p gmullen
169 * PR18489: Changes to other modules to support fix for PR 18489.
170 *
171 * Hydra_Software_Devel/3   12/2/05 3:24p gmullen
172 * PR15309: Saved updates for ccase server move
173 *
174 * Hydra_Software_Devel/2   11/8/05 10:22a gmullen
175 * PR15309: Updated.
176 *
177 * Hydra_Software_Devel/1   7/28/05 3:40p gmullen
178 * PR15309: Initial version for building.
179 *
180 *
181 ***************************************************************************/
182
183#include "bstd.h"
184#include "bxpt_priv.h"
185#include "bxpt_remux.h"
186#include "bxpt_remux_priv.h"
187#include "bchp_xpt_fe.h"
188
189#if BCHP_PWR_SUPPORT
190#include "bchp_pwr.h"
191#endif
192
193#include "bchp_xpt_rmx0.h"
194
195#include "bxpt.h"
196#include "bchp_xpt_rmx0_io.h"
197
198#if BXPT_NUM_REMULTIPLEXORS > 1
199        #include "bchp_xpt_rmx1_io.h"
200    #include "bchp_xpt_rmx1.h"
201#endif
202
203#if( BDBG_DEBUG_BUILD == 1 )
204BDBG_MODULE( xpt_remux );
205#endif
206
207#define BXPT_P_REMUX_DEFAULT_OUTPUT_CLOCK       BXPT_RemuxClock_e81Mhz
208#define BXPT_P_REMUX_DEFAULT_HOLD_LEVEL                 BXPT_RemuxHoldLevel_eNever
209#define BXPT_P_REMUX_DEFAULT_TIMEBASE                   BXPT_RemuxTimeBase_e27Mhz
210#define BXPT_P_REMUX_DEFAULT_PACKET_DELAY               ( 0 )
211#define BXPT_P_REMUX_DEFAULT_USE_PCR_TIMEBASE   false
212#define BXPT_P_REMUX_DEFAULT_WHICH_PCR                  ( 0 )
213#define BXPT_P_REMUX_PCR_BAND_A_DEFAULT                 ( 0x1F )
214#define BXPT_P_REMUX_PCR_BAND_B_DEFAULT                 ( 0x1F )
215#define BXPT_P_REMUX_PARALLEL_EN_DEFAULT                false
216#define BXPT_P_REMUX_PARALLEL_INV_CLK_DEFAULT   false
217#define BXPT_P_REMUX_PARALLEL_INV_SYNC_DEFAULT  false
218#define BXPT_P_REMUX_INV_CLK_DEFAULT                    false
219#define BXPT_P_REMUX_INV_SYNC_DEFAULT                   false
220#define BXPT_P_REMUX_BYTE_SYNC_DEFAULT                  false
221
222#define SPID_CHNL_STEPSIZE      ( 4 )
223
224static BERR_Code AddPidChannel(
225        BXPT_Remux_Handle hRmx,                         
226        unsigned int PidChannelNum,
227        bool UseRPipe                   
228        );
229
230BERR_Code BXPT_Remux_GetTotalChannels(
231        BXPT_Handle hXpt,                       /* [in] Handle for this transport */
232        unsigned int *TotalChannels             /* [out] The number of remux channels. */
233        )
234{
235        BERR_Code ExitCode = BERR_SUCCESS;
236
237        BDBG_ASSERT( hXpt );
238        BSTD_UNUSED( hXpt ); 
239       
240        *TotalChannels = BXPT_NUM_REMULTIPLEXORS;
241
242        return( ExitCode );
243}
244
245BERR_Code BXPT_Remux_GetChannelDefaultSettings(
246        BXPT_Handle hXpt,                       /* [in] Handle for this transport */
247        unsigned int ChannelNo,                 /* [in] Which channel to get defaults from. */
248        BXPT_Remux_ChannelSettings *ChannelSettings /* [out] The defaults */
249        )
250{
251        BERR_Code ExitCode = BERR_SUCCESS;
252
253        BDBG_ASSERT( hXpt );
254        BDBG_ASSERT( ChannelSettings );
255        BSTD_UNUSED( hXpt ); 
256
257        if( ChannelNo > BXPT_NUM_REMULTIPLEXORS )
258        {
259                /* Bad PID channel number. Complain. */
260                BDBG_ERR(( "ChannelNo %lu is out of range!", ( unsigned long ) ChannelNo ));
261                ExitCode = BERR_INVALID_PARAMETER;
262        }
263        else
264        {
265                ChannelSettings->OutputClock = BXPT_P_REMUX_DEFAULT_OUTPUT_CLOCK;
266                ChannelSettings->PacketDelayCount = BXPT_P_REMUX_DEFAULT_PACKET_DELAY;
267                ChannelSettings->ParallelEn = BXPT_P_REMUX_PARALLEL_EN_DEFAULT;                 
268                ChannelSettings->ParallelInvertClk = BXPT_P_REMUX_PARALLEL_INV_CLK_DEFAULT;             
269                ChannelSettings->ParallelInvertSync = BXPT_P_REMUX_PARALLEL_INV_SYNC_DEFAULT;   
270                ChannelSettings->InvertClk = BXPT_P_REMUX_INV_CLK_DEFAULT;             
271                ChannelSettings->InvertSync = BXPT_P_REMUX_INV_SYNC_DEFAULT;   
272                ChannelSettings->ByteSync = BXPT_P_REMUX_BYTE_SYNC_DEFAULT;     
273        ChannelSettings->PauseEn = false;
274                ChannelSettings->InsertNullPackets = true;
275                ChannelSettings->NullPacketInsertionThreshold = 16;
276        }
277
278        return( ExitCode );
279}
280
281BERR_Code BXPT_Remux_OpenChannel(
282        BXPT_Handle hXpt,                                               /* [in] Handle for this transport */
283        BXPT_Remux_Handle *hRmx,                        /* [out] Handle for opened remux channel */
284        unsigned int ChannelNo,                                         /* [in] Which channel to open. */
285        BXPT_Remux_ChannelSettings *ChannelSettings /* [in] The defaults to use */
286        )
287{
288        BERR_Code ExitCode = BERR_SUCCESS;
289        BXPT_Remux_Handle lhRmx = NULL;
290
291        BDBG_ASSERT( hXpt );
292        BDBG_ASSERT( ChannelSettings );                                                 
293
294        if( ChannelNo > BXPT_NUM_REMULTIPLEXORS )
295        {
296                /* Bad PID channel number. Complain. */
297                BDBG_ERR(( "ChannelNo %lu is out of range!", ( unsigned long ) ChannelNo ));
298                ExitCode = BERR_INVALID_PARAMETER;
299        }
300        else
301        {
302                uint32_t Reg;
303                uint32_t BaseAddr = 0;
304
305                /*
306                ** Use the address of the first register in the remux block as the
307                ** base address of the entire block.
308                */
309                switch( ChannelNo )
310                {
311                        case 0:
312                        BaseAddr = BCHP_XPT_RMX0_CTRL; 
313                        break;
314
315#if BXPT_NUM_REMULTIPLEXORS > 1
316                        case 1:
317                            BaseAddr = BCHP_XPT_RMX1_CTRL; 
318                            break;
319#endif                     
320                        default:
321                            BDBG_ERR(( "Internal error" ));
322                            goto Done;
323                }
324               
325                lhRmx = &hXpt->RemuxHandles[ ChannelNo ];
326                lhRmx->vhXpt = ( void * ) hXpt;
327                lhRmx->hChip = hXpt->hChip;
328                lhRmx->hRegister = hXpt->hRegister;
329                lhRmx->hMemory = hXpt->hMemory;
330                lhRmx->BaseAddr = BaseAddr;
331                lhRmx->ChannelNo = ChannelNo;
332                lhRmx->Running = false;
333
334#ifdef BCHP_PWR_RESOURCE_XPT_REMUX
335        BCHP_PWR_AcquireResource(hXpt->hChip, BCHP_PWR_RESOURCE_XPT_REMUX);
336#endif
337
338                /* Use MPEG defaults. The BXPT_DirecTv_Remux APIs can change that. */
339                Reg = BXPT_Remux_P_ReadReg( lhRmx, BCHP_XPT_RMX0_CTRL );
340                Reg &= ~(
341                        BCHP_MASK( XPT_RMX0_CTRL, RMX_PKT_LENGTH ) |
342                        BCHP_MASK( XPT_RMX0_CTRL, RMX_PKT_MODE ) 
343                );
344                Reg |= (
345                        BCHP_FIELD_DATA( XPT_RMX0_CTRL, RMX_PKT_LENGTH, 188 ) |
346                        BCHP_FIELD_DATA( XPT_RMX0_CTRL, RMX_PKT_MODE, 0 ) 
347                );
348                BXPT_Remux_P_WriteReg( lhRmx, BCHP_XPT_RMX0_CTRL, Reg );
349
350                Reg = BXPT_Remux_P_ReadReg( lhRmx, BCHP_XPT_RMX0_IO_FORMAT );
351                Reg &= ~(
352                        BCHP_MASK( XPT_RMX0_IO_FORMAT, RMXP_INVERT_CLK ) |
353                        BCHP_MASK( XPT_RMX0_IO_FORMAT, RMXP_INVERT_SYNC ) |
354                        BCHP_MASK( XPT_RMX0_IO_FORMAT, RMXP_ENABLE ) |
355                        BCHP_MASK( XPT_RMX0_IO_FORMAT, RMX_INVERT_SYNC ) |
356                        BCHP_MASK( XPT_RMX0_IO_FORMAT, RMX_INVERT_CLK ) |
357                        BCHP_MASK( XPT_RMX0_IO_FORMAT, RMX_BYTE_SYNC ) |
358                        BCHP_MASK( XPT_RMX0_IO_FORMAT, RMX_MUTE )
359                );
360                Reg |= (
361                        BCHP_FIELD_DATA( XPT_RMX0_IO_FORMAT, RMXP_INVERT_CLK, ChannelSettings->ParallelInvertClk ) |
362                        BCHP_FIELD_DATA( XPT_RMX0_IO_FORMAT, RMXP_INVERT_SYNC, ChannelSettings->ParallelInvertSync ) |
363                        BCHP_FIELD_DATA( XPT_RMX0_IO_FORMAT, RMXP_ENABLE, ChannelSettings->ParallelEn ) |
364                        BCHP_FIELD_DATA( XPT_RMX0_IO_FORMAT, RMX_INVERT_SYNC, ChannelSettings->InvertSync ) |
365                        BCHP_FIELD_DATA( XPT_RMX0_IO_FORMAT, RMX_INVERT_CLK, ChannelSettings->InvertClk ) |
366                        BCHP_FIELD_DATA( XPT_RMX0_IO_FORMAT, RMX_BYTE_SYNC, ChannelSettings->ByteSync ) |
367                        BCHP_FIELD_DATA( XPT_RMX0_IO_FORMAT, RMX_MUTE, 0 )
368                );
369                BXPT_Remux_P_WriteReg( lhRmx, BCHP_XPT_RMX0_IO_FORMAT, Reg );
370       
371                Reg = BXPT_Remux_P_ReadReg( lhRmx, BCHP_XPT_RMX0_IO_PKT_DLY_CNT );
372                Reg &= ~(
373                        BCHP_MASK( XPT_RMX0_IO_PKT_DLY_CNT, RMX_PKT_DLY_CNT )
374                );
375                Reg |= (
376                        BCHP_FIELD_DATA( XPT_RMX0_IO_PKT_DLY_CNT, RMX_PKT_DLY_CNT, ChannelSettings->PacketDelayCount )
377                );
378                BXPT_Remux_P_WriteReg( lhRmx, BCHP_XPT_RMX0_IO_PKT_DLY_CNT, Reg );
379
380                /* Load the defaults. */
381                Reg = BXPT_Remux_P_ReadReg( lhRmx, BCHP_XPT_RMX0_CTRL );
382                Reg &= ~(
383                        BCHP_MASK( XPT_RMX0_CTRL, RMX_CLK_SEL ) |
384                        BCHP_MASK( XPT_RMX0_CTRL, RMX_NULL_PKT_THRESHOLD ) |
385                        BCHP_MASK( XPT_RMX0_CTRL, RMX_NULL_PKT_DIS )
386                );
387                Reg |= (
388                        BCHP_FIELD_DATA( XPT_RMX0_CTRL, RMX_CLK_SEL, ChannelSettings->OutputClock ) |
389                        BCHP_FIELD_DATA( XPT_RMX0_CTRL, RMX_NULL_PKT_THRESHOLD, ChannelSettings->NullPacketInsertionThreshold ) |
390                        BCHP_FIELD_DATA( XPT_RMX0_CTRL, RMX_NULL_PKT_DIS, ChannelSettings->InsertNullPackets ? false : true )
391                );
392                BXPT_Remux_P_WriteReg( lhRmx, BCHP_XPT_RMX0_CTRL, Reg );
393
394#ifdef BCHP_PWR_RESOURCE_XPT_REMUX
395                BCHP_PWR_ReleaseResource(hXpt->hChip, BCHP_PWR_RESOURCE_XPT_REMUX);
396#endif
397
398                lhRmx->Opened = true;
399                *hRmx = lhRmx;
400        }
401
402        Done:
403        return( ExitCode );
404}
405
406void BXPT_Remux_CloseChannel(
407        BXPT_Remux_Handle hRmx  /* [in] Handle for the channel to close*/
408        )
409{
410        uint32_t Reg;
411
412        BDBG_ASSERT( hRmx );
413
414        /* Stop remuxing, stop the remapping logic, and packet subbing. */
415        Reg = BXPT_Remux_P_ReadReg( hRmx, BCHP_XPT_RMX0_CTRL );
416        Reg &= ~(
417                BCHP_MASK( XPT_RMX0_CTRL, RMX_BYPASS ) |
418                BCHP_MASK( XPT_RMX0_CTRL, RMX_ENABLE )
419        );
420        BXPT_Remux_P_WriteReg( hRmx, BCHP_XPT_RMX0_CTRL, Reg );
421        hRmx->Opened = false;
422}
423
424BERR_Code BXPT_Remux_AddPidChannelToRemux( 
425        BXPT_Remux_Handle hRmx,                         /* [in] Handle for the remux channel */
426        BXPT_RemuxInput RemuxInput,             /* [in] Which remux input */
427        unsigned int PidChannelNum                      /* [in] Which PID channel. */
428        )
429{
430        BDBG_ASSERT( hRmx );
431        BSTD_UNUSED( RemuxInput );
432
433        return AddPidChannel( hRmx, PidChannelNum, false ); 
434}
435
436BERR_Code BXPT_Remux_AddRPipePidChannelToRemux( 
437        BXPT_Remux_Handle hRmx,                         /* [in] Handle for the remux channel */
438        BXPT_RemuxInput RemuxInput,             /* [in] Which remux input */
439        unsigned int PidChannelNum                      /* [in] Which PID channel. */
440        )
441{
442        BDBG_ASSERT( hRmx );
443        BSTD_UNUSED( RemuxInput );
444
445        return AddPidChannel( hRmx, PidChannelNum, true ); 
446}
447
448BERR_Code AddPidChannel(
449        BXPT_Remux_Handle hRmx,                         
450        unsigned int PidChannelNum,
451        bool UseRPipe                   
452        )
453{
454        BERR_Code ExitCode = BERR_SUCCESS;
455
456        if( PidChannelNum >= BXPT_NUM_PID_CHANNELS )
457        {
458                BDBG_ERR(( "PidChannelNum %lu is out of range!", ( unsigned long ) PidChannelNum ));
459                ExitCode = BERR_INVALID_PARAMETER;
460        }
461        else
462        {
463                uint32_t PipeShift;
464
465                /* Set the PID channels enable bit. */
466                switch( hRmx->ChannelNo )
467                {
468                        case 0:
469                        PipeShift = 0;          /* G pipe */
470                        break;
471
472                        case 1:
473                        PipeShift = 2;          /* G pipe */
474                        break;
475
476                        default:
477                        BDBG_ERR(( "ChannelNo %lu invalid!", ( unsigned long ) hRmx->ChannelNo ));
478                        ExitCode = BERR_INVALID_PARAMETER;
479                        goto Done;
480                }
481
482                if( UseRPipe == true )
483                        PipeShift++;
484
485                BXPT_P_SetPidChannelDestination( (BXPT_Handle) hRmx->vhXpt, PidChannelNum, PipeShift, true );
486        }
487
488        Done:
489        return( ExitCode );         
490}
491
492BERR_Code BXPT_Remux_DoRemux( 
493        BXPT_Remux_Handle hRmx, /* [in] Handle for the remux channel */
494        bool Enable                             /* [in] Remux on if TRUE, or off if FALSE. */
495        )
496{
497        uint32_t Reg;
498        BXPT_Handle hXpt;
499
500        BERR_Code ExitCode = BERR_SUCCESS;
501#ifdef BCHP_PWR_RESOURCE_XPT_REMUX
502        unsigned wasEnabled;
503#endif
504        BDBG_ASSERT( hRmx );
505
506#ifdef BCHP_PWR_RESOURCE_XPT_REMUX
507        Reg = BXPT_Remux_P_ReadReg(hRmx, BCHP_XPT_RMX0_CTRL);
508        wasEnabled = BCHP_GET_FIELD_DATA(Reg, XPT_RMX0_CTRL, RMX_ENABLE);
509        /* only change refcnt if changing state */
510        if (!wasEnabled && Enable) {
511            BCHP_PWR_AcquireResource(hRmx->hChip, BCHP_PWR_RESOURCE_XPT_REMUX);
512        }
513#endif
514
515        hXpt = (BXPT_Handle) hRmx->vhXpt;
516        Reg = BXPT_Remux_P_ReadReg( hRmx, BCHP_XPT_RMX0_CTRL );
517        Reg &= ~( BCHP_MASK( XPT_RMX0_CTRL, RMX_ENABLE ) );
518       
519        if( Enable )
520        {
521            Reg |= BCHP_FIELD_DATA( XPT_RMX0_CTRL, RMX_ENABLE, 1 );
522            BXPT_Remux_P_WriteReg( hRmx, BCHP_XPT_RMX0_CTRL, Reg );
523        }
524        else
525        {
526            BXPT_Remux_P_WriteReg( hRmx, BCHP_XPT_RMX0_CTRL, Reg );
527        }   
528       
529#ifdef BCHP_PWR_RESOURCE_XPT_REMUX
530        if (wasEnabled && !Enable) {
531            BCHP_PWR_ReleaseResource(hRmx->hChip, BCHP_PWR_RESOURCE_XPT_REMUX);
532        }       
533#endif
534       
535        hRmx->Running = Enable;
536
537        return( ExitCode );
538}
539
540BERR_Code BXPT_Remux_RemovePidChannelFromRemux( 
541        BXPT_Remux_Handle hRmx,                 /* [in] Handle for the remux channel */
542        BXPT_RemuxInput RemuxInput,     /* [in] Which remux input */
543        unsigned int PidChannelNum                      /* [in] Which PID channel. */
544        )
545{
546        BERR_Code ExitCode = BERR_SUCCESS;
547
548        BDBG_ASSERT( hRmx );
549        BSTD_UNUSED( RemuxInput );
550
551        if( PidChannelNum >= BXPT_NUM_PID_CHANNELS )
552        {
553                BDBG_ERR(( "PidChannelNum %lu is out of range!", ( unsigned long ) PidChannelNum ));
554                ExitCode = BERR_INVALID_PARAMETER;
555        }
556        else
557        {
558                uint32_t PipeShift;
559
560                /* Clear the PID channels enable bit. */
561                switch( hRmx->ChannelNo )
562                {
563                        case 0:
564                        PipeShift = 0;          /* G pipe */
565                        break;
566
567                        case 1:
568                        PipeShift = 2;          /* G pipe */
569                        break;
570
571                        default:
572                        BDBG_ERR(( "ChannelNo %lu invalid!", ( unsigned long ) hRmx->ChannelNo ));
573                        ExitCode = BERR_INVALID_PARAMETER;
574                        goto Done;
575                }
576
577                BXPT_P_SetPidChannelDestination( (BXPT_Handle) hRmx->vhXpt, PidChannelNum, PipeShift, false );
578        }
579
580        Done:
581        return( ExitCode );         
582}
583
584BERR_Code BXPT_Remux_GetPidChannel( 
585        BXPT_Remux_Handle hRmx,                 /* [in] Handle for the remux channel */
586        BXPT_RemuxInput RemuxInput,                     /* [in] Which remux input */
587        unsigned int PidChannelNum,                     /* [in] Which PID channel. */
588        bool *Enable                                            /* [out] Where to put channel status. */
589        )
590{
591        BERR_Code ExitCode = BERR_SUCCESS;
592
593        BDBG_ASSERT( hRmx );
594        BSTD_UNUSED( RemuxInput );
595
596        *Enable = false;
597
598        if( PidChannelNum > BXPT_NUM_PID_CHANNELS )
599        {
600                BDBG_ERR(( "PidChannelNum %lu is out of range!", ( unsigned long ) PidChannelNum ));
601                ExitCode = BERR_INVALID_PARAMETER;
602                *Enable = false;
603        }
604        else
605        {
606                uint32_t Reg, RegAddr, PipeShift;
607
608                /* Set the PID channels enable bit. */
609                RegAddr = BCHP_XPT_FE_SPID_TABLE_i_ARRAY_BASE + ( PidChannelNum * SPID_CHNL_STEPSIZE );
610                Reg = BREG_Read32( hRmx->hRegister, RegAddr );
611               
612                switch( hRmx->ChannelNo )
613                {
614                        case 0:
615                        PipeShift = 24;         /* G pipe */
616                        break;
617
618                        case 1:
619                        PipeShift = 24 + 2;             /* G pipe */
620                        break;
621
622                        default:
623                        BDBG_ERR(( "ChannelNo %lu invalid!", ( unsigned long ) hRmx->ChannelNo ));
624                        ExitCode = BERR_INVALID_PARAMETER;
625                        goto Done;
626                }
627
628                if( Reg & ( 3ul << PipeShift ) )
629                        *Enable = true;
630                else
631                        *Enable = false;
632        }
633
634        Done:
635        return( ExitCode );         
636}
637
638BERR_Code BXPT_Remux_RemoveAllPidChannel( 
639        BXPT_Remux_Handle hRmx,                 /* [in] Handle for the remux channel */
640        BXPT_RemuxInput RemuxInput                      /* [in] Which remux input */
641        )
642{
643        unsigned PidChannelNum;
644        uint32_t PipeShift;
645
646        BERR_Code ExitCode = BERR_SUCCESS;
647
648        BDBG_ASSERT( hRmx );
649        BSTD_UNUSED( RemuxInput );
650
651        /* Clear all the PID channels' enable bit. */
652        for( PidChannelNum = 0; PidChannelNum < BXPT_NUM_PID_CHANNELS; PidChannelNum++ )
653        {
654                switch( hRmx->ChannelNo )
655                {
656                        case 0:
657                        PipeShift = 0;          /* G pipe */
658                        break;
659
660                        case 1:
661                        PipeShift = 2;          /* G pipe */
662                        break;
663
664                        default:
665                        BDBG_ERR(( "ChannelNo %lu invalid!", ( unsigned long ) hRmx->ChannelNo ));
666                        ExitCode = BERR_INVALID_PARAMETER;
667                        goto Done;
668                }
669
670                BXPT_P_SetPidChannelDestination( (BXPT_Handle) hRmx->vhXpt, PidChannelNum, PipeShift, false );
671        }
672
673        Done:
674        return( ExitCode );
675}
676
677BERR_Code BXPT_Remux_AddPcrOffset( 
678        BXPT_Remux_Handle hRmx,         /* [in] Handle for the remux channel */
679    bool AddOffsetEn,               /* [in] Enable/disable the PCR correction */
680    uint32_t FixedPcrOffset                     /* [in] The PCR correction offset, if enabled */               
681        )
682{
683        uint32_t Reg;
684
685        BERR_Code ret = BERR_SUCCESS;
686
687        if( AddOffsetEn )
688        {
689                Reg = BXPT_Remux_P_ReadReg( hRmx, BCHP_XPT_RMX0_FIXED_OFFSET );
690                Reg &= ~BCHP_MASK( XPT_RMX0_FIXED_OFFSET, RMX_FIXED_OFFSET );
691                Reg |= BCHP_FIELD_DATA( XPT_RMX0_FIXED_OFFSET, RMX_FIXED_OFFSET, FixedPcrOffset );
692                BXPT_Remux_P_WriteReg( hRmx, BCHP_XPT_RMX0_FIXED_OFFSET, Reg );
693        }
694
695        Reg = BXPT_Remux_P_ReadReg( hRmx, BCHP_XPT_RMX0_PCR_CTRL );
696        Reg &= ~BCHP_MASK( XPT_RMX0_PCR_CTRL, RMX_FIXED_OFFSET_EN );
697        Reg |= BCHP_FIELD_DATA( XPT_RMX0_PCR_CTRL, RMX_FIXED_OFFSET_EN, AddOffsetEn == true ? 1 : 0 ); 
698        BXPT_Remux_P_WriteReg( hRmx, BCHP_XPT_RMX0_PCR_CTRL, Reg );
699
700        return ret;
701}
702
703void BXPT_Remux_SetPcrJitterAdj( 
704        BXPT_Remux_Handle hRmx,         /* [in] Handle for the remux channel */
705        bool ForPlayback,               /* [in] true = control adjustment for playback, false = control for live */
706        bool EnableAdjust                   /* [in] Enable/disable the PCR jitter adjust */
707        )
708{
709        uint32_t Reg;
710
711        Reg = BXPT_Remux_P_ReadReg( hRmx, BCHP_XPT_RMX0_PCR_CTRL );
712        if( ForPlayback )
713        {
714                /* HW uses reverse-logic */
715                Reg &= ~BCHP_MASK( XPT_RMX0_PCR_CTRL, RMX_PLAYBACK_PCR_JITTER_DIS );
716                Reg |= BCHP_FIELD_DATA( XPT_RMX0_PCR_CTRL, RMX_PLAYBACK_PCR_JITTER_DIS, EnableAdjust == true ? 0 : 1 ); 
717        }
718        else
719        {
720                /* HW uses reverse-logic */
721                Reg &= ~BCHP_MASK( XPT_RMX0_PCR_CTRL, RMX_LIVE_PCR_JITTER_DIS );
722                Reg |= BCHP_FIELD_DATA( XPT_RMX0_PCR_CTRL, RMX_LIVE_PCR_JITTER_DIS, EnableAdjust == true ? 0 : 1 );     
723        }
724        BXPT_Remux_P_WriteReg( hRmx, BCHP_XPT_RMX0_PCR_CTRL, Reg );
725}
726
727
728BERR_Code BXPT_Remux_SetBypassMode( 
729        BXPT_Remux_Handle hRmx,                 /* [in] Handle for the remux channel */
730        bool Enable
731        )
732{
733        BERR_Code ExitCode = BERR_SUCCESS;
734        uint32_t Reg = BXPT_Remux_P_ReadReg( hRmx, BCHP_XPT_RMX0_CTRL );
735
736        if( Enable )
737                Reg |= ( BCHP_FIELD_DATA( XPT_RMX0_CTRL, RMX_BYPASS, 1 ) );
738        else
739                Reg &= ~( BCHP_MASK( XPT_RMX0_CTRL, RMX_BYPASS ) );
740        BXPT_Remux_P_WriteReg( hRmx, BCHP_XPT_RMX0_CTRL, Reg );
741
742        return( ExitCode );         
743}
744
745
Note: See TracBrowser for help on using the repository browser.