コード例 #1
0
void VPP_dhub_sem_clear(void)
{
    int instat;
    HDL_dhub2d *pDhubHandle;
    int dhubID;
    int status;

    HDL_semaphore *pSemHandle = thinvpp_obj->pSemHandle;

    instat = semaphore_chk_full(pSemHandle, -1);

    if (bTST(instat, avioDhubSemMap_vpp_vppCPCB0_intr)){
        semaphore_pop(pSemHandle, avioDhubSemMap_vpp_vppCPCB0_intr, 1);
        semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_vppCPCB0_intr);
    } else if (bTST(instat, avioDhubSemMap_vpp_vppCPCB2_intr)){
        semaphore_pop(pSemHandle, avioDhubSemMap_vpp_vppCPCB2_intr, 1);
        semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_vppCPCB2_intr);
    }


    dhubID = avioDhubChMap_vpp_BCM_R;
    pDhubHandle = &VPP_dhubHandle;

    /* clear BCM interrupt */
    pSemHandle = dhub_semaphore(&(pDhubHandle->dhub));
    status = semaphore_chk_full(pSemHandle, dhubID);
    while (status) {
        semaphore_pop(pSemHandle, dhubID, 1);
        semaphore_clr_full(pSemHandle, dhubID);
        status = semaphore_chk_full(pSemHandle, dhubID);
    }

    return;
}
コード例 #2
0
/*********************************************************************
 * FUNCTION: do the hardware transaction
 * PARAMS: *buf - pointer to the buffer descriptor
 ********************************************************************/
void THINVPP_BCMBUF_HardwareTrans(BCMBUF *pbcmbuf, int block)
{
    HDL_semaphore *pSemHandle;
    HDL_dhub2d *pDhubHandle;
    unsigned int bcm_sched_cmd[2];
    int dhubID;
    unsigned int *start;
    int status;
    int size;

    if (pbcmbuf->subID == CPCB_1)
        start = pbcmbuf->dv1_head;
    else if (pbcmbuf->subID == CPCB_3)
        start = pbcmbuf->dv3_head;
    else
        start = pbcmbuf->head;

    size = (int)pbcmbuf->writer-(int)start;

    if (size <= 0)
        return;

    /* flush data in D$ */
    FLUSH_DCACHE_RANGE(start, size);
#if __LINUX_KERNEL__
    start = (unsigned int *)virt_to_phys(start);
#endif

    /* start BCM engine */
    dhubID = avioDhubChMap_vpp_BCM_R;
    pDhubHandle = &VPP_dhubHandle;

    /* clear BCM interrupt */
    pSemHandle = dhub_semaphore(&(pDhubHandle->dhub));
    status = semaphore_chk_full(pSemHandle, dhubID);
    while (status) {
        semaphore_pop(pSemHandle, dhubID, 1);
        semaphore_clr_full(pSemHandle, dhubID);
        status = semaphore_chk_full(pSemHandle, dhubID);
    }

    dhub_channel_generate_cmd(&(pDhubHandle->dhub), dhubID, (int)start, (int)size, 0, 0, 0, 1, bcm_sched_cmd);
    while( !BCM_SCHED_PushCmd(BCM_SCHED_Q12, bcm_sched_cmd, NULL));

    if (block){
        /* check BCM interrupt */
        pSemHandle = dhub_semaphore(&(pDhubHandle->dhub));
        status = semaphore_chk_full(pSemHandle, dhubID);
        while (!status) {
            status = semaphore_chk_full(pSemHandle, dhubID);
        }

        /* clear BCM interrupt */
        semaphore_pop(pSemHandle, dhubID, 1);
        semaphore_clr_full(pSemHandle, dhubID);
    }

    return;
}
コード例 #3
0
static irqreturn_t fastlogo_devices_vpp_isr(int irq, void *dev_id)
{
    int instat;
    HDL_semaphore *pSemHandle;
    u64 cpcb0_isr_time_current;

    ++fastlogo_ctx.count;
    logo_isr_count++;

    cpcb0_isr_time_current = cpu_clock(smp_processor_id());
    last_isr_interval = (unsigned) (cpcb0_isr_time_current - last_isr_time);
    last_isr_time = cpcb0_isr_time_current;

#if LOGO_TIME_PROFILE
    {
        u64 curr_interval;
        if (cpcb0_isr_time_previous) {
            curr_interval = cpcb0_isr_time_current - cpcb0_isr_time_previous;
            if (logo_tp_count < LOGO_TP_MAX_COUNT)
                lat[logo_tp_count++] = curr_interval;
        }
        cpcb0_isr_time_previous = cpcb0_isr_time_current;
    }
#endif

    /* VPP interrupt handling  */
    pSemHandle = dhub_semaphore(&VPP_dhubHandle.dhub);
    instat = semaphore_chk_full(pSemHandle, -1);

    if (bTST(instat, avioDhubSemMap_vpp_vppCPCB0_intr)) {
        /* our CPCB interrupt */
        /* clear interrupt */
        semaphore_pop(pSemHandle, avioDhubSemMap_vpp_vppCPCB0_intr, 1);
        semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_vppCPCB0_intr);

		if(logo_isr_count > 1)
		{
			THINVPP_CPCB_ISR_service(thinvpp_obj, CPCB_1);
		}
    }

#if LOGO_TIME_PROFILE
    if (logo_tp_count) {
        u64 curr_interval = cpu_clock(0) - cpcb0_isr_time_current;
        if ((logo_tp_count-1) < LOGO_TP_MAX_COUNT)
            lat2[logo_tp_count-1] = curr_interval;
    }
#endif

    return IRQ_HANDLED;
}
コード例 #4
0
static irqreturn_t pe_devices_aout_isr(int irq, void *dev_id)
{
    int instat;
    UNSG32 chanId;
    HDL_semaphore *pSemHandle;

    PIC_SetPerPIC_PerVector(CPUINDEX, irq, PIC_INT_DISABLE, PIC_INT_DISABLE);

    pSemHandle = dhub_semaphore(&AG_dhubHandle.dhub);
    instat = semaphore_chk_full(pSemHandle, -1);

    for (chanId = avioDhubChMap_ag_MA0_R; chanId <= avioDhubChMap_ag_MA3_R; chanId++)
    {
        if (bTST(instat, chanId))
        {
                semaphore_pop(pSemHandle, chanId, 1);
                semaphore_clr_full(pSemHandle, chanId); // clear source

                if(chanId == avioDhubChMap_ag_MA0_R)
                {
                        tasklet_hi_schedule(&pe_ma_tasklet);
                }
        }
    }

    chanId = avioDhubChMap_ag_SA_R;
    {
        if (bTST(instat, chanId))
        {
                semaphore_pop(pSemHandle, chanId, 1);
                semaphore_clr_full(pSemHandle, chanId);
                tasklet_hi_schedule(&pe_st_tasklet);
        }
    }

    chanId = avioDhubChMap_ag_SPDIF_R;
    {
        if (bTST(instat, chanId))
        {
                semaphore_pop(pSemHandle, chanId, 1);
                semaphore_clr_full(pSemHandle, chanId);
                tasklet_hi_schedule(&pe_spdif_tasklet);
        }
    }

    chanId = avioDhubChMap_ag_APPDAT_W;
    if (bTST(instat, chanId))
    {
                semaphore_pop(pSemHandle, chanId, 1);
                semaphore_clr_full(pSemHandle, chanId);
                tasklet_hi_schedule(&pe_app_tasklet);
    }

    chanId = avioDhubChMap_ag_PG_ENG_W;
    if (bTST(instat, chanId))
    {
	semaphore_pop(pSemHandle, chanId, 1);
	semaphore_clr_full(pSemHandle, chanId);
	tasklet_hi_schedule(&pe_pg_done_tasklet);
    }

    chanId = avioDhubSemMap_ag_spu_intr0;
    if (bTST(instat, chanId))
    {
	semaphore_pop(pSemHandle, chanId, 1);
	semaphore_clr_full(pSemHandle, chanId);
	tasklet_hi_schedule(&pe_rle_err_tasklet);
    }

    chanId = avioDhubSemMap_ag_spu_intr1;
    if (bTST(instat, chanId))
    {
	semaphore_pop(pSemHandle, chanId, 1);
	semaphore_clr_full(pSemHandle, chanId);
	tasklet_hi_schedule(&pe_rle_done_tasklet);
    }

    PIC_SetPerPIC_PerVector(CPUINDEX, irq, PIC_INT_ENABLE, PIC_INT_ENABLE);

    return IRQ_HANDLED;
}
コード例 #5
0
static irqreturn_t pe_devices_vpp_isr(int irq, void *dev_id)
{
    INT instat;
    HDL_semaphore *pSemHandle;

#if 0
    GA_REG_WORD32_READ(0xf7e82C00+0x04 + 7*0x14, &val);
    vpp_int_time = DEBUG_TIMER_VALUE - val;
#endif

    /* disable interrupt */
    PIC_SetPerPIC_PerVector(CPUINDEX, irq, PIC_INT_DISABLE, PIC_INT_DISABLE);

    /* VPP interrupt handling  */
    pSemHandle = dhub_semaphore(&VPP_dhubHandle.dhub);
    instat = semaphore_chk_full(pSemHandle, -1);

    if (bTST(instat, avioDhubSemMap_vpp_vppCPCB0_intr))
    {
        /* CPCB-0 interrupt */
        /* clear interrupt */
        semaphore_pop(pSemHandle, avioDhubSemMap_vpp_vppCPCB0_intr, 1);
        semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_vppCPCB0_intr);

        /* Clear the bits for CPCB0 VDE interrupt */
        if (bTST(instat, avioDhubSemMap_vpp_vppOUT4_intr)){
            semaphore_pop(pSemHandle, avioDhubSemMap_vpp_vppOUT4_intr, 1);
            semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_vppOUT4_intr);
            bCLR(instat, avioDhubSemMap_vpp_vppOUT4_intr);
        }


        start_vbi_dma_transaction(0);
        start_vbi_bcm_transaction(0);
    }

    if (bTST(instat, avioDhubSemMap_vpp_vppCPCB1_intr)){
        /* CPCB-1 interrupt */
        /* clear interrupt */
        semaphore_pop(pSemHandle, avioDhubSemMap_vpp_vppCPCB1_intr, 1);
        semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_vppCPCB1_intr);

        /* Clear the bits for CPCB1 VDE interrupt */
        if (bTST(instat, avioDhubSemMap_vpp_vppOUT5_intr)){
            semaphore_pop(pSemHandle, avioDhubSemMap_vpp_vppOUT5_intr, 1);
            semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_vppOUT5_intr);
            bCLR(instat, avioDhubSemMap_vpp_vppOUT5_intr);
        }
        start_vbi_dma_transaction(1);
        start_vbi_bcm_transaction(1);
    }
  
    if (bTST(instat, avioDhubSemMap_vpp_vppCPCB2_intr)){
        /* CPCB-2 interrupt */
        /* clear interrupt */
        semaphore_pop(pSemHandle, avioDhubSemMap_vpp_vppCPCB2_intr, 1);
        semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_vppCPCB2_intr);

        /* Clear the bits for CPCB2 VDE interrupt */
        if (bTST(instat, avioDhubSemMap_vpp_vppOUT6_intr)){
            semaphore_pop(pSemHandle, avioDhubSemMap_vpp_vppOUT6_intr, 1);
            semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_vppOUT6_intr);
            bCLR(instat, avioDhubSemMap_vpp_vppOUT6_intr);
        }

        start_vbi_dma_transaction(2);
        start_vbi_bcm_transaction(2);
    }
  
    if (bTST(instat, avioDhubSemMap_vpp_vppOUT4_intr)){
        /* CPCB-0 VDE interrupt */
        /* clear interrupt */
        semaphore_pop(pSemHandle, avioDhubSemMap_vpp_vppOUT4_intr, 1);
        semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_vppOUT4_intr);

        start_vde_bcm_transaction(0);
    }
  
    if (bTST(instat, avioDhubSemMap_vpp_vppOUT5_intr)){
        /* CPCB-1 VDE interrupt */
        /* clear interrupt */
        semaphore_pop(pSemHandle, avioDhubSemMap_vpp_vppOUT5_intr, 1);
        semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_vppOUT5_intr);

        start_vde_bcm_transaction(1);
    }
  
    if (bTST(instat, avioDhubSemMap_vpp_vppOUT6_intr)){
        /* CPCB-2 VDE interrupt */
        /* clear interrupt */
        semaphore_pop(pSemHandle, avioDhubSemMap_vpp_vppOUT6_intr, 1);
        semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_vppOUT6_intr);

        start_vde_bcm_transaction(2);
    }
  
    if (bTST(instat, avioDhubSemMap_vpp_vppOUT3_intr)){
        /* VOUT3 interrupt */
        /* clear interrupt */
        semaphore_pop(pSemHandle, avioDhubSemMap_vpp_vppOUT3_intr, 1);
        semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_vppOUT3_intr);
    }
  
    if (bTST(instat, avioDhubSemMap_vpp_CH10_intr)){
        /* HDMI audio interrupt */
        /* clear interrupt */
        semaphore_pop(pSemHandle, avioDhubSemMap_vpp_CH10_intr, 1);
        semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_CH10_intr);
    }
  
    if (bTST(instat, avioDhubSemMap_vpp_vppOUT0_intr)){
        /* VOUT0 interrupt */
        /* clear interrupt */
        semaphore_pop(pSemHandle, avioDhubSemMap_vpp_vppOUT0_intr, 1);
        semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_vppOUT0_intr);
    }
  
    if (bTST(instat, avioDhubSemMap_vpp_vppOUT1_intr)){
        /* VOUT1 interrupt */
        /* clear interrupt */
        semaphore_pop(pSemHandle, avioDhubSemMap_vpp_vppOUT1_intr, 1);
        semaphore_clr_full(pSemHandle, avioDhubSemMap_vpp_vppOUT1_intr);
    }

#ifdef VPP_DBG
    pe_trace("ISR instat:%x\n", instat);
#endif

    pe_vpp_tasklet.data = instat;    
    tasklet_hi_schedule(&pe_vpp_tasklet);

     // enable ICC RX Soft IRQ
//     raise_softirq(VPP_SOFTIRQ);
//    up(&vpp_sem);

    /* enable again */
    PIC_SetPerPIC_PerVector(CPUINDEX, irq, PIC_INT_ENABLE, PIC_INT_ENABLE);

    return IRQ_HANDLED;
}