📄 radeon_vid.c
字号:
DEVICE_ATI_RAGE_128_PR_PRO, DEVICE_ATI_RAGE_128_PS_PRO, DEVICE_ATI_RAGE_128_PT_PRO, DEVICE_ATI_RAGE_128_PU_PRO, DEVICE_ATI_RAGE_128_PV_PRO, DEVICE_ATI_RAGE_128_PW_PRO, DEVICE_ATI_RAGE_128_PX_PRO,/* Rage128 GL */ DEVICE_ATI_RAGE_128_RE_SG, DEVICE_ATI_RAGE_128_RF_SG, DEVICE_ATI_RAGE_128_RG, DEVICE_ATI_RAGE_128_RK_VR, DEVICE_ATI_RAGE_128_RL_VR, DEVICE_ATI_RAGE_128_SE_4X, DEVICE_ATI_RAGE_128_SF_4X, DEVICE_ATI_RAGE_128_SG_4X, DEVICE_ATI_RAGE_128_SH, DEVICE_ATI_RAGE_128_SK_4X, DEVICE_ATI_RAGE_128_SL_4X, DEVICE_ATI_RAGE_128_SM_4X, DEVICE_ATI_RAGE_128_4X, DEVICE_ATI_RAGE_128_PRO, DEVICE_ATI_RAGE_128_PRO2, DEVICE_ATI_RAGE_128_PRO3,/* these seem to be based on rage 128 instead of mach64 */ DEVICE_ATI_RAGE_MOBILITY_M3, DEVICE_ATI_RAGE_MOBILITY_M32#else/* Radeons (indeed: Rage 256 Pro ;) */ DEVICE_ATI_RADEON_R100_QD, DEVICE_ATI_RADEON_R100_QE, DEVICE_ATI_RADEON_R100_QF, DEVICE_ATI_RADEON_R100_QG, DEVICE_ATI_RADEON_VE_QY, DEVICE_ATI_RADEON_VE_QZ, DEVICE_ATI_RADEON_MOBILITY_M7, DEVICE_ATI_RADEON_MOBILITY_M72, DEVICE_ATI_RADEON_MOBILITY_M6, DEVICE_ATI_RADEON_MOBILITY_M62, DEVICE_ATI_RADEON_R200_BB, DEVICE_ATI_RADEON_R200_QH, DEVICE_ATI_RADEON_R200_QI, DEVICE_ATI_RADEON_R200_QJ, DEVICE_ATI_RADEON_R200_QK, DEVICE_ATI_RADEON_R200_QL, DEVICE_ATI_RADEON_R200_QH2, DEVICE_ATI_RADEON_R200_QI2, DEVICE_ATI_RADEON_R200_QJ2, DEVICE_ATI_RADEON_R200_QK2, DEVICE_ATI_RADEON_RV200_QW, DEVICE_ATI_RADEON_RV200_QX, DEVICE_ATI_RADEON_R250_ID, DEVICE_ATI_RADEON_R250_IE, DEVICE_ATI_RADEON_R250_IF, DEVICE_ATI_RADEON_R250_IG, DEVICE_ATI_RADEON_R250_LD, DEVICE_ATI_RADEON_R250_LE, DEVICE_ATI_RADEON_R250_LF, DEVICE_ATI_RADEON_R250_LG, DEVICE_ATI_RADEON_R300_ND, DEVICE_ATI_RADEON_R300_NE, DEVICE_ATI_RADEON_R300_NF, DEVICE_ATI_RADEON_R300_NG#endif};static int find_chip(unsigned chip_id){ unsigned i; for(i = 0;i < sizeof(ati_card_ids)/sizeof(unsigned short);i++) { if(chip_id == ati_card_ids[i]) return i; } return -1;}static pciinfo_t pci_info;static int probed=0;vidix_capability_t def_cap = {#ifdef RAGE128 "BES driver for rage128 cards",#else "BES driver for radeon cards",#endif "Nick Kurshev", TYPE_OUTPUT | TYPE_FX, { 0, 0, 0, 0 }, 2048, 2048, 4, 4, -1, FLAG_UPSCALER | FLAG_DOWNSCALER | FLAG_EQUALIZER, VENDOR_ATI, 0, { 0, 0, 0, 0}};int VIDIX_NAME(vixProbe)( int verbose,int force ){ pciinfo_t lst[MAX_PCI_DEVICES]; unsigned i,num_pci; int err; __verbose = verbose; err = pci_scan(lst,&num_pci); if(err) { printf(RADEON_MSG" Error occured during pci scan: %s\n",strerror(err)); return err; } else { err = ENXIO; for(i=0;i<num_pci;i++) { if(lst[i].vendor == VENDOR_ATI) { int idx; const char *dname; idx = find_chip(lst[i].device); if(idx == -1 && force == PROBE_NORMAL) continue; dname = pci_device_name(VENDOR_ATI,lst[i].device); dname = dname ? dname : "Unknown chip"; printf(RADEON_MSG" Found chip: %s\n",dname);#ifndef RAGE128 if(idx != -1) { switch(ati_card_ids[idx]) { /* Original radeon */ case DEVICE_ATI_RADEON_R100_QD: case DEVICE_ATI_RADEON_R100_QE: case DEVICE_ATI_RADEON_R100_QF: case DEVICE_ATI_RADEON_R100_QG: RadeonFamily = 100; break; /* Radeon VE / Radeon Mobility */ case DEVICE_ATI_RADEON_VE_QY: case DEVICE_ATI_RADEON_VE_QZ: case DEVICE_ATI_RADEON_MOBILITY_M6: case DEVICE_ATI_RADEON_MOBILITY_M62: RadeonFamily = 120; break; /* Radeon 7500 / Radeon Mobility 7500 */ case DEVICE_ATI_RADEON_RV200_QW: case DEVICE_ATI_RADEON_RV200_QX: case DEVICE_ATI_RADEON_MOBILITY_M7: case DEVICE_ATI_RADEON_MOBILITY_M72: RadeonFamily = 150; break; /* Radeon 8500 */ case DEVICE_ATI_RADEON_R200_BB: case DEVICE_ATI_RADEON_R200_QH: case DEVICE_ATI_RADEON_R200_QI: case DEVICE_ATI_RADEON_R200_QJ: case DEVICE_ATI_RADEON_R200_QK: case DEVICE_ATI_RADEON_R200_QL: case DEVICE_ATI_RADEON_R200_QH2: case DEVICE_ATI_RADEON_R200_QI2: case DEVICE_ATI_RADEON_R200_QJ2: case DEVICE_ATI_RADEON_R200_QK2: RadeonFamily = 200; break; /* Radeon 9000 */ case DEVICE_ATI_RADEON_R250_ID: case DEVICE_ATI_RADEON_R250_IE: case DEVICE_ATI_RADEON_R250_IF: case DEVICE_ATI_RADEON_R250_IG: case DEVICE_ATI_RADEON_R250_LD: case DEVICE_ATI_RADEON_R250_LE: case DEVICE_ATI_RADEON_R250_LF: case DEVICE_ATI_RADEON_R250_LG: RadeonFamily = 250; break; /* Radeon 9700 */ case DEVICE_ATI_RADEON_R300_ND: case DEVICE_ATI_RADEON_R300_NE: case DEVICE_ATI_RADEON_R300_NF: case DEVICE_ATI_RADEON_R300_NG: RadeonFamily = 300; break; default: break; } }#endif if(force > PROBE_NORMAL) { printf(RADEON_MSG" Driver was forced. Was found %sknown chip\n",idx == -1 ? "un" : ""); if(idx == -1)#ifdef RAGE128 printf(RADEON_MSG" Assuming it as Rage128\n");#else printf(RADEON_MSG" Assuming it as Radeon1\n");#endif } def_cap.device_id = lst[i].device; err = 0; memcpy(&pci_info,&lst[i],sizeof(pciinfo_t)); probed=1; break; } } } if(err && verbose) printf(RADEON_MSG" Can't find chip\n"); return err;}#ifndef RAGE128enum radeon_montype{ MT_NONE, MT_CRT, /* CRT-(cathode ray tube) analog monitor. (15-pin VGA connector) */ MT_LCD, /* Liquid Crystal Display */ MT_DFP, /* DFP-digital flat panel monitor. (24-pin DVI-I connector) */ MT_CTV, /* Composite TV out (not in VE) */ MT_STV /* S-Video TV out (probably in VE only) */};typedef struct radeon_info_s{ int hasCRTC2; int crtDispType; int dviDispType;}rinfo_t;static rinfo_t rinfo;static char * GET_MON_NAME(int type){ char *pret; switch(type) { case MT_NONE: pret = "no"; break; case MT_CRT: pret = "CRT"; break; case MT_DFP: pret = "DFP"; break; case MT_LCD: pret = "LCD"; break; case MT_CTV: pret = "CTV"; break; case MT_STV: pret = "STV"; break; default: pret = "Unknown"; } return pret;}static void radeon_get_moninfo (rinfo_t *rinfo){ unsigned int tmp; tmp = INREG(RADEON_BIOS_4_SCRATCH); if (rinfo->hasCRTC2) { /* primary DVI port */ if (tmp & 0x08) rinfo->dviDispType = MT_DFP; else if (tmp & 0x4) rinfo->dviDispType = MT_LCD; else if (tmp & 0x200) rinfo->dviDispType = MT_CRT; else if (tmp & 0x10) rinfo->dviDispType = MT_CTV; else if (tmp & 0x20) rinfo->dviDispType = MT_STV; /* secondary CRT port */ if (tmp & 0x2) rinfo->crtDispType = MT_CRT; else if (tmp & 0x800) rinfo->crtDispType = MT_DFP; else if (tmp & 0x400) rinfo->crtDispType = MT_LCD; else if (tmp & 0x1000) rinfo->crtDispType = MT_CTV; else if (tmp & 0x2000) rinfo->crtDispType = MT_STV; } else { rinfo->dviDispType = MT_NONE; tmp = INREG(FP_GEN_CNTL); if (tmp & FP_EN_TMDS) rinfo->crtDispType = MT_DFP; else rinfo->crtDispType = MT_CRT; }}#endiftypedef struct saved_regs_s{ uint32_t ov0_vid_key_clr; uint32_t ov0_vid_key_msk; uint32_t ov0_graphics_key_clr; uint32_t ov0_graphics_key_msk; uint32_t ov0_key_cntl;}saved_regs_t;static saved_regs_t savreg;static void save_regs( void ){ radeon_fifo_wait(6); savreg.ov0_vid_key_clr = INREG(OV0_VID_KEY_CLR); savreg.ov0_vid_key_msk = INREG(OV0_VID_KEY_MSK); savreg.ov0_graphics_key_clr = INREG(OV0_GRAPHICS_KEY_CLR); savreg.ov0_graphics_key_msk = INREG(OV0_GRAPHICS_KEY_MSK); savreg.ov0_key_cntl = INREG(OV0_KEY_CNTL);}static void restore_regs( void ){ radeon_fifo_wait(6); OUTREG(OV0_VID_KEY_CLR,savreg.ov0_vid_key_clr); OUTREG(OV0_VID_KEY_MSK,savreg.ov0_vid_key_msk); OUTREG(OV0_GRAPHICS_KEY_CLR,savreg.ov0_graphics_key_clr); OUTREG(OV0_GRAPHICS_KEY_MSK,savreg.ov0_graphics_key_msk); OUTREG(OV0_KEY_CNTL,savreg.ov0_key_cntl);}int VIDIX_NAME(vixInit)( const char *args ){ int err; if(!probed) { printf(RADEON_MSG" Driver was not probed but is being initializing\n"); return EINTR; } if((radeon_mmio_base = map_phys_mem(pci_info.base2,0xFFFF))==(void *)-1) return ENOMEM; radeon_ram_size = INREG(CONFIG_MEMSIZE); /* mem size is bits [28:0], mask off the rest. Range: from 1Mb up to 512 Mb */ radeon_ram_size &= CONFIG_MEMSIZE_MASK; if((radeon_mem_base = map_phys_mem(pci_info.base0,radeon_ram_size))==(void *)-1) return ENOMEM; memset(&besr,0,sizeof(bes_registers_t)); radeon_vid_make_default(); printf(RADEON_MSG" Video memory = %uMb\n",radeon_ram_size/0x100000); err = mtrr_set_type(pci_info.base0,radeon_ram_size,MTRR_TYPE_WRCOMB); if(!err) printf(RADEON_MSG" Set write-combining type of video memory\n");#ifndef RAGE128 { memset(&rinfo,0,sizeof(rinfo_t)); if(RadeonFamily > 100) rinfo.hasCRTC2 = 1; switch(RadeonFamily) { case 100: case 120: case 150: case 250: is_shift_required=1; break; default: break; } radeon_get_moninfo(&rinfo); if(rinfo.hasCRTC2) { printf(RADEON_MSG" DVI port has %s monitor connected\n",GET_MON_NAME(rinfo.dviDispType)); printf(RADEON_MSG" CRT port has %s monitor connected\n",GET_MON_NAME(rinfo.crtDispType)); } else printf(RADEON_MSG" CRT port has %s monitor connected\n",GET_MON_NAME(rinfo.crtDispType)); }#endif#ifdef RADEON_ENABLE_BM if(bm_open() == 0) { if((dma_phys_addrs = malloc(radeon_ram_size*sizeof(unsigned long)/4096)) != 0) def_cap.flags |= FLAG_DMA | FLAG_EQ_DMA; else printf(RADEON_MSG" Can't allocate temopary buffer for DMA\n"); } else if(__verbose) printf(RADEON_MSG" Can't initialize busmastering: %s\n",strerror(errno));#endif save_regs(); return 0; }void VIDIX_NAME(vixDestroy)( void ){ restore_regs(); unmap_phys_mem(radeon_mem_base,radeon_ram_size); unmap_phys_mem(radeon_mmio_base,0xFFFF); bm_close();}int VIDIX_NAME(vixGetCapability)(vidix_capability_t *to){ memcpy(to,&def_cap,sizeof(vidix_capability_t)); return 0; }/* Full list of fourcc which are supported by Win2K radeon driver: YUY2, UYVY, DDES, OGLT, OGL2, OGLS, OGLB, OGNT, OGNZ, OGNS, IF09, YVU9, IMC4, M2IA, IYUV, VBID, DXT1, DXT2, DXT3, DXT4, DXT5*/typedef struct fourcc_desc_s{ uint32_t fourcc; unsigned max_srcw;}fourcc_desc_t;fourcc_desc_t supported_fourcc[] = { { IMGFMT_Y800, 1567 }, { IMGFMT_YVU9, 1567 }, { IMGFMT_IF09, 1567 }, { IMGFMT_YV12, 1567 }, { IMGFMT_I420, 1567 }, { IMGFMT_IYUV, 1567 }, { IMGFMT_UYVY, 1551 }, { IMGFMT_YUY2, 1551 }, { IMGFMT_YVYU, 1551 }, { IMGFMT_RGB15, 1551 }, { IMGFMT_BGR15, 1551 }, { IMGFMT_RGB16, 1551 }, { IMGFMT_BGR16, 1551 }, { IMGFMT_RGB32, 775 }, { IMGFMT_BGR32, 775 }};__inline__ static int is_supported_fourcc(uint32_t fourcc,unsigned srcw)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -