📄 pm3fb.c
字号:
} l_fb_info->fb_size = memsize; if (ptr == pm3fb_timing_retry) { printk(KERN_WARNING "pm3fb: retrying memory timings check"); if (pm3fb_try_memory_timings(l_fb_info) == pm3fb_timing_problem) return(0); } return (memsize);}static void pm3fb_clear_memory(struct pm3fb_info *l_fb_info, u32 cc){ int i; DTRACE; for (i = 0; i < (l_fb_info->fb_size / sizeof(u32)) ; i++) /* clear entire FB memory to black */ {#ifdef KERNEL_2_2#ifdef MUST_BYTESWAP writel(__swab32(cc), (l_fb_info->v_fb + (i * sizeof(u32))));#else writel(cc, (l_fb_info->v_fb + (i * sizeof(u32))));#endif#endif#if (defined KERNEL_2_4) || (defined KERNEL_2_5) fb_writel(cc, (l_fb_info->v_fb + (i * sizeof(u32))));#endif }}static void pm3fb_clear_colormap(struct pm3fb_info *l_fb_info, unsigned char r, unsigned char g, unsigned char b){ int i; DTRACE; for (i = 0; i < 256 ; i++) /* fill color map with white */ pm3fb_set_color(l_fb_info, i, r, g, b);}/* common initialisation */static void pm3fb_common_init(struct pm3fb_info *l_fb_info){ DTRACE; DPRINTK(2, "Initializing board #%ld @ %lx\n", l_fb_info->board_num, (unsigned long) l_fb_info); strcpy(l_fb_info->gen.info.modename, permedia3_name); disp[l_fb_info->board_num].scrollmode = 0; /* SCROLL_YNOMOVE; *//* 0 means "let fbcon choose" */ l_fb_info->gen.parsize = sizeof(struct pm3fb_par); l_fb_info->gen.info.changevar = NULL; l_fb_info->gen.info.node = B_FREE; l_fb_info->gen.info.fbops = &pm3fb_ops; l_fb_info->gen.info.disp = &(disp[l_fb_info->board_num]); if (fontn[l_fb_info->board_num][0]) strcpy(l_fb_info->gen.info.fontname, fontn[l_fb_info->board_num]); l_fb_info->gen.info.switch_con = &fbgen_switch; l_fb_info->gen.info.updatevar = &fbgen_update_var; /* */ l_fb_info->gen.info.blank = &fbgen_blank; /* */ l_fb_info->gen.info.flags = FBINFO_FLAG_DEFAULT; pm3fb_mapIO(l_fb_info); pm3fb_clear_memory(l_fb_info, 0); pm3fb_clear_colormap(l_fb_info, 0, 0, 0); (void) fbgen_get_var(&(disp[l_fb_info->board_num]).var, -1, &l_fb_info->gen.info); if (depth[l_fb_info->board_num]) /* override mode-defined depth */ { pm3fb_encode_depth(&(disp[l_fb_info->board_num]).var, depth[l_fb_info->board_num]); (disp[l_fb_info->board_num]).var.bits_per_pixel = depth2bpp(depth[l_fb_info->board_num]); } (void) fbgen_do_set_var(&(disp[l_fb_info->board_num]).var, 1, &l_fb_info->gen); fbgen_set_disp(-1, &l_fb_info->gen); fbgen_install_cmap(0, &l_fb_info->gen); if (register_framebuffer(&l_fb_info->gen.info) < 0) { DPRINTK(1, "Couldn't register framebuffer\n"); return; } PM3_WRITE_DAC_REG(PM3RD_CursorMode, PM3RD_CursorMode_CURSOR_DISABLE); PM3_SHOW_CUR_MODE; pm3fb_write_mode(l_fb_info); printk("fb%d: %s, using %uK of video memory (%s)\n", GET_FB_IDX(l_fb_info->gen.info.node), permedia3_name, (u32) (l_fb_info->fb_size >> 10), cardbase[l_fb_info->board_type].cardname);}/* **************************************************** *//* ***** accelerated permedia3-specific functions ***** *//* **************************************************** */#ifdef PM3FB_USE_ACCELstatic void pm3fb_wait_pm3(struct pm3fb_info *l_fb_info){ DTRACE; PM3_SLOW_WRITE_REG(PM3FilterMode, PM3FilterModeSync); PM3_SLOW_WRITE_REG(PM3Sync, 0); mb(); do { while ((PM3_READ_REG(PM3OutFIFOWords)) == 0); rmb(); } while ((PM3_READ_REG(PM3OutputFifo)) != PM3Sync_Tag);}static void pm3fb_init_engine(struct pm3fb_info *l_fb_info){ PM3_SLOW_WRITE_REG(PM3FilterMode, PM3FilterModeSync); PM3_SLOW_WRITE_REG(PM3StatisticMode, 0x0); PM3_SLOW_WRITE_REG(PM3DeltaMode, 0x0); PM3_SLOW_WRITE_REG(PM3RasterizerMode, 0x0); PM3_SLOW_WRITE_REG(PM3ScissorMode, 0x0); PM3_SLOW_WRITE_REG(PM3LineStippleMode, 0x0); PM3_SLOW_WRITE_REG(PM3AreaStippleMode, 0x0); PM3_SLOW_WRITE_REG(PM3GIDMode, 0x0); PM3_SLOW_WRITE_REG(PM3DepthMode, 0x0); PM3_SLOW_WRITE_REG(PM3StencilMode, 0x0); PM3_SLOW_WRITE_REG(PM3StencilData, 0x0); PM3_SLOW_WRITE_REG(PM3ColorDDAMode, 0x0); PM3_SLOW_WRITE_REG(PM3TextureCoordMode, 0x0); PM3_SLOW_WRITE_REG(PM3TextureIndexMode0, 0x0); PM3_SLOW_WRITE_REG(PM3TextureIndexMode1, 0x0); PM3_SLOW_WRITE_REG(PM3TextureReadMode, 0x0); PM3_SLOW_WRITE_REG(PM3LUTMode, 0x0); PM3_SLOW_WRITE_REG(PM3TextureFilterMode, 0x0); PM3_SLOW_WRITE_REG(PM3TextureCompositeMode, 0x0); PM3_SLOW_WRITE_REG(PM3TextureApplicationMode, 0x0); PM3_SLOW_WRITE_REG(PM3TextureCompositeColorMode1, 0x0); PM3_SLOW_WRITE_REG(PM3TextureCompositeAlphaMode1, 0x0); PM3_SLOW_WRITE_REG(PM3TextureCompositeColorMode0, 0x0); PM3_SLOW_WRITE_REG(PM3TextureCompositeAlphaMode0, 0x0); PM3_SLOW_WRITE_REG(PM3FogMode, 0x0); PM3_SLOW_WRITE_REG(PM3ChromaTestMode, 0x0); PM3_SLOW_WRITE_REG(PM3AlphaTestMode, 0x0); PM3_SLOW_WRITE_REG(PM3AntialiasMode, 0x0); PM3_SLOW_WRITE_REG(PM3YUVMode, 0x0); PM3_SLOW_WRITE_REG(PM3AlphaBlendColorMode, 0x0); PM3_SLOW_WRITE_REG(PM3AlphaBlendAlphaMode, 0x0); PM3_SLOW_WRITE_REG(PM3DitherMode, 0x0); PM3_SLOW_WRITE_REG(PM3LogicalOpMode, 0x0); PM3_SLOW_WRITE_REG(PM3RouterMode, 0x0); PM3_SLOW_WRITE_REG(PM3Window, 0x0); PM3_SLOW_WRITE_REG(PM3Config2D, 0x0); PM3_SLOW_WRITE_REG(PM3SpanColorMask, 0xffffffff); PM3_SLOW_WRITE_REG(PM3XBias, 0x0); PM3_SLOW_WRITE_REG(PM3YBias, 0x0); PM3_SLOW_WRITE_REG(PM3DeltaControl, 0x0); PM3_SLOW_WRITE_REG(PM3BitMaskPattern, 0xffffffff); PM3_SLOW_WRITE_REG(PM3FBDestReadEnables, PM3FBDestReadEnables_E(0xff) | PM3FBDestReadEnables_R(0xff) | PM3FBDestReadEnables_ReferenceAlpha(0xff)); PM3_SLOW_WRITE_REG(PM3FBDestReadBufferAddr0, 0x0); PM3_SLOW_WRITE_REG(PM3FBDestReadBufferOffset0, 0x0); PM3_SLOW_WRITE_REG(PM3FBDestReadBufferWidth0, PM3FBDestReadBufferWidth_Width(l_fb_info-> current_par-> width)); PM3_SLOW_WRITE_REG(PM3FBDestReadMode, PM3FBDestReadMode_ReadEnable | PM3FBDestReadMode_Enable0); PM3_SLOW_WRITE_REG(PM3FBSourceReadBufferAddr, 0x0); PM3_SLOW_WRITE_REG(PM3FBSourceReadBufferOffset, 0x0); PM3_SLOW_WRITE_REG(PM3FBSourceReadBufferWidth, PM3FBSourceReadBufferWidth_Width(l_fb_info-> current_par-> width)); PM3_SLOW_WRITE_REG(PM3FBSourceReadMode, PM3FBSourceReadMode_Blocking | PM3FBSourceReadMode_ReadEnable); { unsigned long rm = 1; switch (l_fb_info->current_par->depth) { case 8: PM3_SLOW_WRITE_REG(PM3PixelSize, PM3PixelSize_GLOBAL_8BIT); break; case 12: case 15: case 16: PM3_SLOW_WRITE_REG(PM3PixelSize, PM3PixelSize_GLOBAL_16BIT); break; case 32: PM3_SLOW_WRITE_REG(PM3PixelSize, PM3PixelSize_GLOBAL_32BIT); break; default: DPRINTK(1, "Unsupported depth %d\n", l_fb_info->current_par->depth); break; } PM3_SLOW_WRITE_REG(PM3RasterizerMode, rm); } PM3_SLOW_WRITE_REG(PM3FBSoftwareWriteMask, 0xffffffff); PM3_SLOW_WRITE_REG(PM3FBHardwareWriteMask, 0xffffffff); PM3_SLOW_WRITE_REG(PM3FBWriteMode, PM3FBWriteMode_WriteEnable | PM3FBWriteMode_OpaqueSpan | PM3FBWriteMode_Enable0); PM3_SLOW_WRITE_REG(PM3FBWriteBufferAddr0, 0x0); PM3_SLOW_WRITE_REG(PM3FBWriteBufferOffset0, 0x0); PM3_SLOW_WRITE_REG(PM3FBWriteBufferWidth0, PM3FBWriteBufferWidth_Width(l_fb_info-> current_par-> width)); PM3_SLOW_WRITE_REG(PM3SizeOfFramebuffer, 0x0); { unsigned long sofb = (8UL * l_fb_info->fb_size) / ((depth2bpp(l_fb_info->current_par->depth)) * l_fb_info->current_par->width); /* size in lines of FB */ if (sofb > 4095) PM3_SLOW_WRITE_REG(PM3SizeOfFramebuffer, 4095); else PM3_SLOW_WRITE_REG(PM3SizeOfFramebuffer, sofb); switch (l_fb_info->current_par->depth) { case 8: PM3_SLOW_WRITE_REG(PM3DitherMode, (1 << 10) | (2 << 3)); break; case 12: case 15: case 16: PM3_SLOW_WRITE_REG(PM3DitherMode, (1 << 10) | (1 << 3)); break; case 32: PM3_SLOW_WRITE_REG(PM3DitherMode, (1 << 10) | (0 << 3)); break; default: DPRINTK(1, "Unsupported depth %d\n", l_fb_info->current_par->depth); break; } } PM3_SLOW_WRITE_REG(PM3dXDom, 0x0); PM3_SLOW_WRITE_REG(PM3dXSub, 0x0); PM3_SLOW_WRITE_REG(PM3dY, (1 << 16)); PM3_SLOW_WRITE_REG(PM3StartXDom, 0x0); PM3_SLOW_WRITE_REG(PM3StartXSub, 0x0); PM3_SLOW_WRITE_REG(PM3StartY, 0x0); PM3_SLOW_WRITE_REG(PM3Count, 0x0); /* Disable LocalBuffer. better safe than sorry */ PM3_SLOW_WRITE_REG(PM3LBDestReadMode, 0x0); PM3_SLOW_WRITE_REG(PM3LBDestReadEnables, 0x0); PM3_SLOW_WRITE_REG(PM3LBSourceReadMode, 0x0); PM3_SLOW_WRITE_REG(PM3LBWriteMode, 0x0); pm3fb_wait_pm3(l_fb_info);}#ifdef FBCON_HAS_CFB32static void pm3fb_cfb32_clear(struct vc_data *conp, struct display *p, int sy, int sx, int height, int width){ struct pm3fb_info *l_fb_info = (struct pm3fb_info *) p->fb_info; u32 c; DTRACE; sx = sx * fontwidth(p); width = width * fontwidth(p); sy = sy * fontheight(p); height = height * fontheight(p); c = ((u32 *) p->dispsw_data)[attr_bgcol_ec(p, conp)]; /* block fills in 32bpp are hard, but in low res (width <= 1600 :-) we can use 16bpp operations, but not if NoWriteMask is on (SDRAM) */ if ((l_fb_info->current_par->width > 1600) || (l_fb_info->memt.caps & PM3LocalMemCaps_NoWriteMask)) { PM3_WAIT(4); PM3_WRITE_REG(PM3Config2D, PM3Config2D_UseConstantSource | PM3Config2D_ForegroundROPEnable | (PM3Config2D_ForegroundROP(0x3)) | /* Ox3 is GXcopy */ PM3Config2D_FBWriteEnable); PM3_WRITE_REG(PM3ForegroundColor, c); PM3_WRITE_REG(PM3RectanglePosition, (PM3RectanglePosition_XOffset(sx)) | (PM3RectanglePosition_YOffset(sy))); PM3_WRITE_REG(PM3Render2D, PM3Render2D_XPositive | PM3Render2D_YPositive | PM3Render2D_Operation_Normal | PM3Render2D_SpanOperation | (PM3Render2D_Width(width)) | (PM3Render2D_Height(height))); } else { PM3_WAIT(8); PM3_WRITE_REG(PM3FBBlockColor, c); PM3_WRITE_REG(PM3PixelSize, PM3PixelSize_GLOBAL_16BIT); PM3_WRITE_REG(PM3FBWriteBufferWidth0, PM3FBWriteBufferWidth_Width(l_fb_info-> current_par-> width << 1)); PM3_WRITE_REG(PM3Config2D, PM3Config2D_UseConstantSource | PM3Config2D_ForegroundROPEnable | (PM3Config2D_ForegroundROP(0x3)) | /* Ox3 is GXcopy */ PM3Config2D_FBWriteEnable); PM3_WRITE_REG(PM3RectanglePosition, (PM3RectanglePosition_XOffset(sx << 1)) | (PM3RectanglePosition_YOffset(sy))); PM3_WRITE_REG(PM3Render2D, PM3Render2D_XPositive | PM3Render2D_YPositive | PM3Render2D_Operation_Normal | (PM3Render2D_Width(width << 1)) | (PM3Render2D_Height(height))); PM3_WRITE_REG(PM3FBWriteBufferWidth0, PM3FBWriteBufferWidth_Width(l_fb_info-> current_par-> width)); PM3_WRITE_REG(PM3PixelSize, PM3PixelSize_GLOBAL_32BIT); } pm3fb_wait_pm3(l_fb_info);}static void pm3fb_cfb32_clear_margins(struct vc_data *conp, struct display *p, int bottom_only){ struct pm3fb_info *l_fb_info = (struct pm3fb_info *) p->fb_info; int sx, sy; u32 c; DTRACE; sx = conp->vc_cols * fontwidth(p); /* right margin */ sy = conp->vc_rows * fontheight(p); /* bottom margin */ c = ((u32 *) p->dispsw_data)[attr_bgcol_ec(p, conp)]; if (!bottom_only) { /* right margin top->bottom */ PM3_WAIT(4); PM3_WRITE_REG(PM3Config2D, PM3Config2D_UseConstantSource | PM3Config2D_Foregrou
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -