void omap_set_dma_params(int lch, struct omap_dma_channel_params *params) { omap_set_dma_transfer_params(lch, params->data_type, params->elem_count, params->frame_count, params->sync_mode, params->trigger, params->src_or_dst_synch); omap_set_dma_src_params(lch, params->src_port, params->src_amode, params->src_start, params->src_ei, params->src_fi); omap_set_dma_dest_params(lch, params->dst_port, params->dst_amode, params->dst_start, params->dst_ei, params->dst_fi); if (params->read_prio || params->write_prio) omap_dma_set_prio_lch(lch, params->read_prio, params->write_prio); }
static void OMAPLFBFliepNoLock_HDMI(OMAPLFB_SWAPCHAIN *psSwapChain, OMAPLFB_DEVINFO *psDevInfo, struct omapfb_info *ofbi, struct fb_info *framebuffer, unsigned long fb_offset) { struct omap_overlay *ovl_hdmi; struct omap_overlay_info info; struct omap_overlay *hdmi; struct omap_overlay_manager *manager; bool overlay_change_requested = false; enum omap_dss_overlay_s3d_type s3d_type_in_video_hdmi = omap_dss_overlay_s3d_none; ovl_hdmi = omap_dss_get_overlay(3); if(ovl_hdmi->info.enabled) s3d_type_in_video_hdmi = ovl_hdmi->info.s3d_type; hdmi = psSwapChain->stHdmiTiler.overlay; manager = hdmi->manager; hdmi->get_overlay_info(hdmi, &info); //not good... if ( omap_overlay_info_req[hdmi->id].status==2 ) { info.enabled = omap_overlay_info_req[hdmi->id].enabled; info.rotation = omap_overlay_info_req[hdmi->id].rotation; info.pos_x = omap_overlay_info_req[hdmi->id].pos_x; info.pos_y = omap_overlay_info_req[hdmi->id].pos_y; info.out_width = omap_overlay_info_req[hdmi->id].out_width; info.out_height = omap_overlay_info_req[hdmi->id].out_height; info.global_alpha = omap_overlay_info_req[hdmi->id].global_alpha; info.zorder = omap_overlay_info_req[hdmi->id].zorder; printk("GUI HDMI layer change requested. req_enabled(%d)\n", omap_overlay_info_req[hdmi->id].enabled); omap_overlay_info_req[hdmi->id].status = 0; overlay_change_requested = true; } if ( info.enabled ) { mutex_lock(&psSwapChain->stHdmiTiler.lock); if ( !psSwapChain->stHdmiTiler.alloc ) { // if ( AllocTilerForHdmi(psSwapChain, psDevInfo) ) { ERROR_PRINTK("Tiler memory for HDMI GUI cloning is not allocated\n"); mutex_unlock(&psSwapChain->stHdmiTiler.lock); return; // } } if ( psSwapChain->stHdmiTiler.alloc ) //if Tiler memory is allocated { unsigned long line_offset; unsigned long w, h; unsigned long src_stride, dst_stride; unsigned long i; unsigned char *dst, *src; unsigned long pStride; u32 j, *src_4, *dst_4, *dst1_4; int ch; src_stride = psDevInfo->sFBInfo.ulByteStride; dst_stride = psSwapChain->stHdmiTiler.vStride; line_offset = fb_offset / src_stride; h = psDevInfo->sFBInfo.ulHeight; w = psDevInfo->sFBInfo.ulWidth; pStride = psSwapChain->stHdmiTiler.pStride; //Copy dst = (unsigned char*)psSwapChain->stHdmiTiler.vAddr + (line_offset * dst_stride); src = (unsigned char*)framebuffer->screen_base + fb_offset; DEBUG_PRINTK("Copy Start h:%d, src:0x%p src_stride:%d, dst:0x%p dst_stride:%d, line offset:%d, pStride:%d\n", h, src, src_stride, dst, dst_stride, line_offset, pStride); if( psSwapChain->s3d_type==omap_dss_overlay_s3d_side_by_side && s3d_type_in_video_hdmi == omap_dss_overlay_s3d_top_bottom) { for(j=0; j<h/2; j++) { src_4 = (u32 *)(src + src_stride*j); dst_4 = (u32 *)(dst + dst_stride*2*j); dst1_4 = (u32 *)(dst + dst_stride*2*j + w*2); for(i=0;i<w/2;i++) { *dst_4++ = *src_4; *dst1_4++ = *src_4++; src_4++; } src_4 = (u32 *)(src + src_stride*j); dst_4 = (u32 *)(dst + dst_stride*(2*j+1)); dst1_4 = (u32 *)(dst + dst_stride*(2*j+1) + w*2); for(i=0;i<w/2;i++) { *dst_4++ = *src_4; *dst1_4++ = *src_4++; src_4++; } } info.s3d_type = omap_dss_overlay_s3d_top_bottom; } else { if(hdmi_dma.state == HDMI_DMA_DONE) { ch = hdmi_dma.frame_pos; hdmi->get_overlay_info(hdmi, &hdmi_dma.info[ch]); hdmi_dma.hdmi = hdmi; printk("S:%x\n", psSwapChain->stHdmiTiler.pAddr + (h * pStride * ch)); omap_set_dma_transfer_params(hdmi_dma.lch, OMAP_DMA_DATA_TYPE_S32, src_stride>>2, h, 0, 0, 0); omap_set_dma_src_params(hdmi_dma.lch, 0, OMAP_DMA_AMODE_POST_INC, framebuffer->fix.smem_start + fb_offset, 1, 1); omap_set_dma_dest_params(hdmi_dma.lch, 0, OMAP_DMA_AMODE_DOUBLE_IDX, psSwapChain->stHdmiTiler.pAddr + (h * pStride * ch), 1, pStride - src_stride + 1 ); omap_dma_set_prio_lch(hdmi_dma.lch, DMA_CH_PRIO_HIGH, DMA_CH_PRIO_HIGH); omap_set_dma_src_burst_mode(hdmi_dma.lch, OMAP_DMA_DATA_BURST_16); omap_set_dma_dest_burst_mode(hdmi_dma.lch, OMAP_DMA_DATA_BURST_16); omap_start_dma(hdmi_dma.lch); hdmi_dma.state = HDMI_DMA_TRANSFERRING; if ( omap_overlay_info_req[hdmi->id].status==2 ) { hdmi_dma.info[ch].enabled = omap_overlay_info_req[hdmi->id].enabled; hdmi_dma.info[ch].rotation = omap_overlay_info_req[hdmi->id].rotation; hdmi_dma.info[ch].pos_x = omap_overlay_info_req[hdmi->id].pos_x; hdmi_dma.info[ch].pos_y = omap_overlay_info_req[hdmi->id].pos_y; hdmi_dma.info[ch].out_width = omap_overlay_info_req[hdmi->id].out_width; hdmi_dma.info[ch].out_height = omap_overlay_info_req[hdmi->id].out_height; hdmi_dma.info[ch].global_alpha = omap_overlay_info_req[hdmi->id].global_alpha; hdmi_dma.info[ch].zorder = omap_overlay_info_req[hdmi->id].zorder; } //fill info //@todo not good find another way later hdmi_dma.info[ch].color_mode = ofbi->overlays[0]->info.color_mode; hdmi_dma.info[ch].paddr = psSwapChain->stHdmiTiler.pAddr + (h * pStride * ch); hdmi_dma.info[ch].vaddr = NULL; //no need if ( hdmi_dma.info[ch].rotation==OMAP_DSS_ROT_90 || hdmi_dma.info[ch].rotation==OMAP_DSS_ROT_270 ) { hdmi_dma.info[ch].width = h; hdmi_dma.info[ch].height = w; hdmi_dma.info[ch].screen_width = h; } else { hdmi_dma.info[ch].width =w; hdmi_dma.info[ch].height = h; hdmi_dma.info[ch].screen_width = w; } hdmi_dma.info[ch].rotation_type = OMAP_DSS_ROT_TILER; hdmi_dma.info[ch].s3d_type = psSwapChain->s3d_type; hdmi_dma.curr_frame = hdmi_dma.frame_pos; if( ++hdmi_dma.frame_pos >= HDMI_DMA_MAX ) hdmi_dma.frame_pos = 0; if( omap_overlay_info_req[hdmi->id].status == 2) { omap_overlay_info_req[hdmi->id].status = 0; } } else printk("DOLCOM : DMA busy!!!!!!!!!!!!!!!!!\n");