static int __init fastlogo_device_init(unsigned int cpu_id) { int err; logo_time_0 = cpu_clock(0); // init context fastlogo_ctx.bcm_cmd_0 = bcm_cmd_0; fastlogo_ctx.bcm_cmd_0_len = bcm_cmd_0_len; fastlogo_ctx.bcm_cmd_a = bcm_cmd_a; fastlogo_ctx.bcm_cmd_a_len = bcm_cmd_a_len; fastlogo_ctx.bcm_cmd_n = bcm_cmd_n; fastlogo_ctx.bcm_cmd_n_len = bcm_cmd_n_len; fastlogo_ctx.bcm_cmd_z = bcm_cmd_z; fastlogo_ctx.bcm_cmd_z_len = bcm_cmd_z_len; fastlogo_ctx.bcmQ_len = bcmQ_len; fastlogo_ctx.dmaQ_len = 8*8; fastlogo_ctx.cfgQ_len = 8*8; /* set up logo frame */ fastlogo_ctx.length = yuv_logo_stride*yuv_logo_height; #ifndef YUV_LOGO_ALPHA vbuf.alpha = 255; #else vbuf.alpha = YUV_LOGO_ALPHA; #endif #ifndef YUV_LOGO_BGCOLOR vbuf.bgcolor = yuv_logo[0]; if ((vbuf.bgcolor & 0xff00ff) != 0x800080) vbuf.bgcolor = 0x00800080; // black #else vbuf.bgcolor = YUV_LOGO_BGCOLOR; #endif vbuf.m_disp_offset = 0; vbuf.m_active_left = ((720 - yuv_logo_width)/8)*4; // at center vbuf.m_active_top = ((480 - yuv_logo_height)/8)*4; // at center vbuf.m_buf_stride = yuv_logo_stride; vbuf.m_active_width = yuv_logo_width; vbuf.m_active_height = yuv_logo_height; #if LOGO_USE_SHM // use MV_SHM for logo buffer and 3 dhub queues to have contiguous memory fastlogo_ctx.mSHMSize = fastlogo_ctx.length + fastlogo_ctx.bcmQ_len + fastlogo_ctx.dmaQ_len + fastlogo_ctx.cfgQ_len; fastlogo_ctx.mSHMOffset = MV_SHM_NONCACHE_Malloc(fastlogo_ctx.mSHMSize, 4096); if (fastlogo_ctx.mSHMOffset == ERROR_SHM_MALLOC_FAILED) { return -1; } // put logo image in logo buffer fastlogo_ctx.logoBuf = (int *) MV_SHM_GetNonCacheVirtAddr(fastlogo_ctx.mSHMOffset); fastlogo_ctx.mapaddr = (unsigned int *) MV_SHM_GetNonCachePhysAddr(fastlogo_ctx.mSHMOffset); memcpy(fastlogo_ctx.logoBuf, yuv_logo, fastlogo_ctx.length); // arrange dhub queues and commands { char *shm = (char *) fastlogo_ctx.logoBuf; unsigned shm_phys = (unsigned) fastlogo_ctx.mapaddr; fastlogo_ctx.bcmQ = shm + fastlogo_ctx.length; fastlogo_ctx.dmaQ = fastlogo_ctx.bcmQ + fastlogo_ctx.bcmQ_len; fastlogo_ctx.cfgQ = fastlogo_ctx.dmaQ + fastlogo_ctx.dmaQ_len; fastlogo_ctx.bcmQ_phys = shm_phys + fastlogo_ctx.length; fastlogo_ctx.dmaQ_phys = fastlogo_ctx.bcmQ_phys + fastlogo_ctx.bcmQ_len; fastlogo_ctx.cfgQ_phys = fastlogo_ctx.dmaQ_phys + fastlogo_ctx.dmaQ_len; // pre-load vpp commands memcpy(fastlogo_ctx.bcmQ, bcm_cmd_0, bcm_cmd_0_len); // pre-load logo frame dma commands fastlogo_ctx.logo_dma_cmd_len = logo_dma_cmd_len; fastlogo_ctx.logo_frame_dma_cmd = logo_frame_dma_cmd; logo_frame_dma_cmd[2] = shm_phys; vbuf.m_pbuf_start = (void *) shm_phys; memcpy(fastlogo_ctx.dmaQ, logo_frame_dma_cmd, logo_dma_cmd_len); } #else fastlogo_ctx.logoBuf = kmalloc(fastlogo_ctx.length, GFP_KERNEL); if (!fastlogo_ctx.logoBuf) { gs_trace("kmalloc error\n"); return err; } memcpy(fastlogo_ctx.logoBuf, yuv_logo, fastlogo_ctx.length); fastlogo_ctx.mapaddr = (unsigned int *)dma_map_single(NULL, fastlogo_ctx.logoBuf, fastlogo_ctx.length, DMA_TO_DEVICE); err = dma_mapping_error(NULL, (dma_addr_t)fastlogo_ctx.logoBuf); if (err) { gs_trace("dma_mapping_error\n"); kfree(fastlogo_ctx.logoBuf); fastlogo_ctx.logoBuf = NULL; return err; } outer_cache.flush_range(virt_to_phys(fastlogo_ctx.logoBuf), virt_to_phys(fastlogo_ctx.logoBuf)+fastlogo_ctx.length); logo_frame_dma_cmd[2] = virt_to_phys(fastlogo_ctx.logoBuf); vbuf.m_pbuf_start = (void *) logo_frame_dma_cmd[2]; #endif fastlogo_ctx.logoBuf_2 = fastlogo_ctx.logoBuf; /* initialize dhub */ DhubInitialization(cpu_id, VPP_DHUB_BASE, VPP_HBO_SRAM_BASE, &VPP_dhubHandle, VPP_config, VPP_NUM_OF_CHANNELS); DhubInitialization(cpu_id, AG_DHUB_BASE, AG_HBO_SRAM_BASE, &AG_dhubHandle, AG_config, AG_NUM_OF_CHANNELS); MV_THINVPP_Create(MEMMAP_VPP_REG_BASE); MV_THINVPP_Reset(); MV_THINVPP_Config(); /* set output resolution */ MV_THINVPP_SetCPCBOutputResolution(CPCB_1, RES_525P5994, OUTPUT_BIT_DEPTH_8BIT); // use MAIN plane fastlogo_ctx.planes = 1; fastlogo_ctx.win.x = 0; fastlogo_ctx.win.y = 0; fastlogo_ctx.win.width = 720; fastlogo_ctx.win.height = 480; MV_THINVPP_SetMainDisplayFrame(&vbuf); MV_THINVPP_OpenDispWindow(PLANE_MAIN, &fastlogo_ctx.win, NULL); /* register ISR */ err = request_irq(IRQ_DHUBINTRAVIO0, fastlogo_devices_vpp_isr, IRQF_DISABLED, "fastlogo_module_vpp", NULL); if (unlikely(err < 0)) { gs_trace("vec_num:%5d, err:%8x\n", IRQ_DHUBINTRAVIO0, err); return err; } /* * using 3 for debugging legacy; should change to a more reasonable * number after clean-up */ cpcb_start_flag = 3; /* clean up and enable ISR */ VPP_dhub_sem_clear(); semaphore_pop(thinvpp_obj->pSemHandle, avioDhubSemMap_vpp_vppCPCB0_intr, 1); semaphore_clr_full(thinvpp_obj->pSemHandle, avioDhubSemMap_vpp_vppCPCB0_intr); THINVPP_Enable_ISR_Interrupt(thinvpp_obj, CPCB_1, 1); return 0; }
static int pe_device_init(unsigned int cpu_id, void *pHandle) { unsigned int vec_num; int err; vpp_cpcb0_vbi_int_cnt = 0; tasklet_enable(&pe_vpp_tasklet); tasklet_enable(&pe_vdec_tasklet); tasklet_enable(&pe_ma_tasklet); tasklet_enable(&pe_st_tasklet); tasklet_enable(&pe_spdif_tasklet); tasklet_enable(&pe_app_tasklet); tasklet_enable(&pe_zsp_tasklet); tasklet_enable(&pe_pg_done_tasklet); tasklet_enable(&pe_rle_err_tasklet); tasklet_enable(&pe_rle_done_tasklet); // open_softirq(VPP_SOFTIRQ, MV_VPP_action); /* enable VPP interrupt */ vec_num = G_IRQ_dHubIntrAvio0; PIC_SetPerPIC_PerVector(cpu_id, vec_num, PIC_INT_ENABLE, PIC_INT_ENABLE); /* register VPP ISR */ err = request_irq(vec_num, pe_devices_vpp_isr, IRQF_DISABLED, "pe_module_vpp", pHandle); if (unlikely(err < 0)) return E_FAIL; /* enable VDEC interrupt */ vec_num = IRQ_dHubIntrVpro; PIC_SetPerPIC_PerVector(cpu_id, vec_num, PIC_INT_ENABLE, PIC_INT_ENABLE); /* register VDEC ISR */ err = request_irq(vec_num, pe_devices_vdec_isr, IRQF_DISABLED, "pe_module_vdec", pHandle); if (unlikely(err < 0)) return E_FAIL; vec_num = G_IRQ_dHubIntrAvio1; PIC_SetPerPIC_PerVector(cpu_id, vec_num, PIC_INT_ENABLE, PIC_INT_ENABLE); err = request_irq(vec_num, pe_devices_aout_isr, IRQF_DISABLED, "pe_module_aout", pHandle); if (unlikely(err < 0)) return E_FAIL; vec_num = G_IRQ_zspInt; PIC_SetPerPIC_PerVector(cpu_id, vec_num, PIC_INT_ENABLE, PIC_INT_ENABLE); err = request_irq(vec_num, pe_devices_zsp_isr, IRQF_DISABLED, "pe_module_zsp", pHandle); if (unlikely(err < 0)) return E_FAIL; /* initialize dhub */ DhubInitialization(cpu_id, VPP_DHUB_BASE, VPP_HBO_SRAM_BASE, &VPP_dhubHandle, VPP_config, VPP_NUM_OF_CHANNELS); DhubInitialization(cpu_id, AG_DHUB_BASE, AG_HBO_SRAM_BASE, &AG_dhubHandle, AG_config, AG_NUM_OF_CHANNELS); spin_lock_init(&bcm_spinlock); return S_OK; }