📄 hw.c
字号:
viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIASR); /* Set FIFO High Threshold Select */ reg_value = IGA1_FIFO_HIGH_THRESHOLD_FORMULA(iga1_fifo_high_threshold); viafb_load_reg_num = fifo_high_threshold_select_reg. iga1_fifo_high_threshold_select_reg.reg_num; reg = fifo_high_threshold_select_reg. iga1_fifo_high_threshold_select_reg.reg; viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIASR); /* Set Display Queue Expire Num */ reg_value = IGA1_DISPLAY_QUEUE_EXPIRE_NUM_FORMULA (iga1_display_queue_expire_num); viafb_load_reg_num = display_queue_expire_num_reg. iga1_display_queue_expire_num_reg.reg_num; reg = display_queue_expire_num_reg. iga1_display_queue_expire_num_reg.reg; viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIASR); } else { if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_K800) { iga2_fifo_max_depth = K800_IGA2_FIFO_MAX_DEPTH; iga2_fifo_threshold = K800_IGA2_FIFO_THRESHOLD; iga2_fifo_high_threshold = K800_IGA2_FIFO_HIGH_THRESHOLD; /* If resolution > 1280x1024, expire length = 64, else expire length = 128 */ if ((hor_active > 1280) && (ver_active > 1024)) iga2_display_queue_expire_num = 16; else iga2_display_queue_expire_num = K800_IGA2_DISPLAY_QUEUE_EXPIRE_NUM; } if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_PM800) { iga2_fifo_max_depth = P880_IGA2_FIFO_MAX_DEPTH; iga2_fifo_threshold = P880_IGA2_FIFO_THRESHOLD; iga2_fifo_high_threshold = P880_IGA2_FIFO_HIGH_THRESHOLD; /* If resolution > 1280x1024, expire length = 64, else expire length = 128 */ if ((hor_active > 1280) && (ver_active > 1024)) iga2_display_queue_expire_num = 16; else iga2_display_queue_expire_num = P880_IGA2_DISPLAY_QUEUE_EXPIRE_NUM; } if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CN700) { iga2_fifo_max_depth = CN700_IGA2_FIFO_MAX_DEPTH; iga2_fifo_threshold = CN700_IGA2_FIFO_THRESHOLD; iga2_fifo_high_threshold = CN700_IGA2_FIFO_HIGH_THRESHOLD; /* If resolution > 1280x1024, expire length = 64, else expire length = 128 */ if ((hor_active > 1280) && (ver_active > 1024)) iga2_display_queue_expire_num = 16; else iga2_display_queue_expire_num = CN700_IGA2_DISPLAY_QUEUE_EXPIRE_NUM; } if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700) { iga2_fifo_max_depth = CX700_IGA2_FIFO_MAX_DEPTH; iga2_fifo_threshold = CX700_IGA2_FIFO_THRESHOLD; iga2_fifo_high_threshold = CX700_IGA2_FIFO_HIGH_THRESHOLD; iga2_display_queue_expire_num = CX700_IGA2_DISPLAY_QUEUE_EXPIRE_NUM; } if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_K8M890) { iga2_fifo_max_depth = K8M890_IGA2_FIFO_MAX_DEPTH; iga2_fifo_threshold = K8M890_IGA2_FIFO_THRESHOLD; iga2_fifo_high_threshold = K8M890_IGA2_FIFO_HIGH_THRESHOLD; iga2_display_queue_expire_num = K8M890_IGA2_DISPLAY_QUEUE_EXPIRE_NUM; } if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_P4M890) { iga2_fifo_max_depth = P4M890_IGA2_FIFO_MAX_DEPTH; iga2_fifo_threshold = P4M890_IGA2_FIFO_THRESHOLD; iga2_fifo_high_threshold = P4M890_IGA2_FIFO_HIGH_THRESHOLD; iga2_display_queue_expire_num = P4M890_IGA2_DISPLAY_QUEUE_EXPIRE_NUM; } if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_P4M900) { iga2_fifo_max_depth = P4M900_IGA2_FIFO_MAX_DEPTH; iga2_fifo_threshold = P4M900_IGA2_FIFO_THRESHOLD; iga2_fifo_high_threshold = P4M900_IGA2_FIFO_HIGH_THRESHOLD; iga2_display_queue_expire_num = P4M900_IGA2_DISPLAY_QUEUE_EXPIRE_NUM; } if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_VX800) { iga2_fifo_max_depth = VX800_IGA2_FIFO_MAX_DEPTH; iga2_fifo_threshold = VX800_IGA2_FIFO_THRESHOLD; iga2_fifo_high_threshold = VX800_IGA2_FIFO_HIGH_THRESHOLD; iga2_display_queue_expire_num = VX800_IGA2_DISPLAY_QUEUE_EXPIRE_NUM; } if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_K800) { /* Set Display FIFO Depath Select */ reg_value = IGA2_FIFO_DEPTH_SELECT_FORMULA(iga2_fifo_max_depth) - 1; /* Patch LCD in IGA2 case */ viafb_load_reg_num = display_fifo_depth_reg. iga2_fifo_depth_select_reg.reg_num; reg = display_fifo_depth_reg. iga2_fifo_depth_select_reg.reg; viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIACR); } else { /* Set Display FIFO Depath Select */ reg_value = IGA2_FIFO_DEPTH_SELECT_FORMULA(iga2_fifo_max_depth); viafb_load_reg_num = display_fifo_depth_reg. iga2_fifo_depth_select_reg.reg_num; reg = display_fifo_depth_reg. iga2_fifo_depth_select_reg.reg; viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIACR); } /* Set Display FIFO Threshold Select */ reg_value = IGA2_FIFO_THRESHOLD_FORMULA(iga2_fifo_threshold); viafb_load_reg_num = fifo_threshold_select_reg. iga2_fifo_threshold_select_reg.reg_num; reg = fifo_threshold_select_reg. iga2_fifo_threshold_select_reg.reg; viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIACR); /* Set FIFO High Threshold Select */ reg_value = IGA2_FIFO_HIGH_THRESHOLD_FORMULA(iga2_fifo_high_threshold); viafb_load_reg_num = fifo_high_threshold_select_reg. iga2_fifo_high_threshold_select_reg.reg_num; reg = fifo_high_threshold_select_reg. iga2_fifo_high_threshold_select_reg.reg; viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIACR); /* Set Display Queue Expire Num */ reg_value = IGA2_DISPLAY_QUEUE_EXPIRE_NUM_FORMULA (iga2_display_queue_expire_num); viafb_load_reg_num = display_queue_expire_num_reg. iga2_display_queue_expire_num_reg.reg_num; reg = display_queue_expire_num_reg. iga2_display_queue_expire_num_reg.reg; viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIACR); }}u32 viafb_get_clk_value(int clk){ int i; for (i = 0; i < NUM_TOTAL_PLL_TABLE; i++) { if (clk == pll_value[i].clk) { switch (viaparinfo->chip_info->gfx_chip_name) { case UNICHROME_CLE266: case UNICHROME_K400: return (pll_value[i].cle266_pll); case UNICHROME_K800: case UNICHROME_PM800: case UNICHROME_CN700: return (pll_value[i].k800_pll); case UNICHROME_CX700: case UNICHROME_K8M890: case UNICHROME_P4M890: case UNICHROME_P4M900: case UNICHROME_VX800: return (pll_value[i].cx700_pll); } } } DEBUG_MSG(KERN_INFO "Can't find match PLL value\n\n"); return (0);}/* Set VCLK*/void viafb_set_vclock(u32 CLK, int set_iga){ unsigned char RegTemp; /* H.W. Reset : ON */ viafb_write_reg_mask(CR17, VIACR, 0x00, BIT7); if ((set_iga == IGA1) || (set_iga == IGA1_IGA2)) { /* Change D,N FOR VCLK */ switch (viaparinfo->chip_info->gfx_chip_name) { case UNICHROME_CLE266: case UNICHROME_K400: viafb_write_reg(SR46, VIASR, CLK / 0x100); viafb_write_reg(SR47, VIASR, CLK % 0x100); break; case UNICHROME_K800: case UNICHROME_PM800: case UNICHROME_CN700: case UNICHROME_CX700: case UNICHROME_K8M890: case UNICHROME_P4M890: case UNICHROME_P4M900: case UNICHROME_VX800: viafb_write_reg(SR44, VIASR, CLK / 0x10000); DEBUG_MSG(KERN_INFO "\nSR44=%x", CLK / 0x10000); viafb_write_reg(SR45, VIASR, (CLK & 0xFFFF) / 0x100); DEBUG_MSG(KERN_INFO "\nSR45=%x", (CLK & 0xFFFF) / 0x100); viafb_write_reg(SR46, VIASR, CLK % 0x100); DEBUG_MSG(KERN_INFO "\nSR46=%x", CLK % 0x100); break; } } if ((set_iga == IGA2) || (set_iga == IGA1_IGA2)) { /* Change D,N FOR LCK */ switch (viaparinfo->chip_info->gfx_chip_name) { case UNICHROME_CLE266: case UNICHROME_K400: viafb_write_reg(SR44, VIASR, CLK / 0x100); viafb_write_reg(SR45, VIASR, CLK % 0x100); break; case UNICHROME_K800: case UNICHROME_PM800: case UNICHROME_CN700: case UNICHROME_CX700: case UNICHROME_K8M890: case UNICHROME_P4M890: case UNICHROME_P4M900: case UNICHROME_VX800: viafb_write_reg(SR4A, VIASR, CLK / 0x10000); viafb_write_reg(SR4B, VIASR, (CLK & 0xFFFF) / 0x100); viafb_write_reg(SR4C, VIASR, CLK % 0x100); break; } } /* H.W. Reset : OFF */ viafb_write_reg_mask(CR17, VIACR, 0x80, BIT7); /* Reset PLL */ if ((set_iga == IGA1) || (set_iga == IGA1_IGA2)) { viafb_write_reg_mask(SR40, VIASR, 0x02, BIT1); viafb_write_reg_mask(SR40, VIASR, 0x00, BIT1); } if ((set_iga == IGA2) || (set_iga == IGA1_IGA2)) { viafb_write_reg_mask(SR40, VIASR, 0x01, BIT0); viafb_write_reg_mask(SR40, VIASR, 0x00, BIT0); } /* Fire! */ RegTemp = inb(VIARMisc); outb(RegTemp | (BIT2 + BIT3), VIAWMisc);}void viafb_load_crtc_timing(struct display_timing device_timing, int set_iga){ int i; int viafb_load_reg_num = 0; int reg_value = 0; struct io_register *reg = NULL; viafb_unlock_crt(); for (i = 0; i < 12; i++) { if (set_iga == IGA1) { switch (i) { case H_TOTAL_INDEX: reg_value = IGA1_HOR_TOTAL_FORMULA(device_timing. hor_total); viafb_load_reg_num = iga1_crtc_reg.hor_total.reg_num; reg = iga1_crtc_reg.hor_total.reg; break; case H_ADDR_INDEX: reg_value = IGA1_HOR_ADDR_FORMULA(device_timing. hor_addr); viafb_load_reg_num = iga1_crtc_reg.hor_addr.reg_num; reg = iga1_crtc_reg.hor_addr.reg; break; case H_BLANK_START_INDEX: reg_value = IGA1_HOR_BLANK_START_FORMULA (device_timing.hor_blank_start); viafb_load_reg_num = iga1_crtc_reg.hor_blank_start.reg_num; reg = iga1_crtc_reg.hor_blank_start.reg; break; case H_BLANK_END_INDEX: reg_value = IGA1_HOR_BLANK_END_FORMULA (device_timing.hor_blank_start, device_timing.hor_blank_end); viafb_load_reg_num = iga1_crtc_reg.hor_blank_end.reg_num; reg = iga1_crtc_reg.hor_blank_end.reg; break; case H_SYNC_START_INDEX: reg_value = IGA1_HOR_SYNC_START_FORMULA (device_timing.hor_sync_start); viafb_load_reg_num = iga1_crtc_reg.hor_sync_start.reg_num; reg = iga1_crtc_reg.hor_sync_start.reg; break; case H_SYNC_END_INDEX: reg_value = IGA1_HOR_SYNC_END_FORMULA (device_timing.hor_sync_start, device_timing.hor_sync_end); viafb_load_reg_num = iga1_crtc_reg.hor_sync_end.reg_num; reg = iga1_crtc_reg.hor_sync_end.reg; break; case V_TOTAL_INDEX: reg_value = IGA1_VER_TOTAL_FORMULA(device_timing. ver_total); viafb_load_reg_num = iga1_crtc_reg.ver_total.reg_num; reg = iga1_crtc_reg.ver_total.reg; break; case V_ADDR_INDEX: reg_value = IGA1_VER_ADDR_FORMULA(device_timing. ver_addr); viafb_load_reg_num = iga1_crtc_reg.ver_addr.reg_num; reg = iga1_crtc_reg.ver_addr.reg; break; case V_BLANK_START_INDEX: reg_value = IGA1_VER_BLANK_START_FORMULA (device_timing.ver_blank_start); viafb_load_reg_num = iga1_crtc_reg.ver_blank_start.reg_num; reg = iga1_crtc_reg.ver_blank_start.reg; break; case V_BLANK_END_INDEX: reg_value = IGA1_VER_BLANK_END_FORMULA (device_timing.ver_blank_start, device_timing.ver_blank_end); viafb_load_reg_num = iga1_crtc_reg.ver_blank_end.reg_num; reg = iga1_crtc_reg.ver_blank_end.reg; break; case V_SYNC_START_INDEX: reg_value = IGA1_VER_SYNC_START_FORMULA (device_timing.ver_sync_start); viafb_load_reg_num = iga1_crtc_reg.ver_sync_start.reg_num; reg = iga1_crtc_reg.ver_sync_start.reg; break; case V_SYNC_END_INDEX: reg_value = IGA1_VER_SYNC_END_FORMULA (device_timing.ver_sync_start, device_timing.ver_sync_end); viafb_load_reg_num = iga1_crtc_reg.ver_sync_end.reg_num; reg = iga1_crtc_reg.ver_sync_end.reg; break; } } if (set_iga == IGA2) { switch (i) { case H_TOTAL_INDEX: reg_value = IGA2_HOR_TOTAL_FORMULA(device_timing. hor_total); viafb_load_reg_num = iga2_crtc_reg.hor_total.reg_num; reg = iga2_crtc_reg.hor_total.reg; break; case H_ADDR_INDEX: reg_value = IGA2_HOR_ADDR_FORMULA(device_timing. hor_addr); viafb_load_reg_num = iga2_crtc_reg.hor_addr.reg_num; reg = iga2_crtc_reg.hor_addr.reg; break; case H_BLANK_START_INDEX: reg_value = IGA2_HOR_BLANK_START_FORMULA (device_timing.hor_blank_start); viafb_load_reg_num = iga2_crtc_reg.hor_blank_start.reg_num; reg = iga2_crtc_reg.hor_blank_start.reg; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -