Mercurial > mplayer.hg
changeset 3164:3c5ad8d5ac00
radeon_vid new features:
- tested UYVY format and known as working
- YV12, I420, IYUV direct support
(were missed: p23_blank_lines_at_top, p23_v_accum_init in
radeon_vid_display_video - good info for Y800 support ;)
- experimental support for Rage128/Rage128Pro chips
author | nick |
---|---|
date | Tue, 27 Nov 2001 18:36:02 +0000 |
parents | 27986f4dcd30 |
children | c9f140f5a34e |
files | drivers/radeon/Makefile drivers/radeon/README drivers/radeon/radeon.h drivers/radeon/radeon_vid.c |
diffstat | 4 files changed, 218 insertions(+), 104 deletions(-) [+] |
line wrap: on
line diff
--- a/drivers/radeon/Makefile Tue Nov 27 18:09:45 2001 +0000 +++ b/drivers/radeon/Makefile Tue Nov 27 18:36:02 2001 +0000 @@ -13,12 +13,14 @@ AFLAGS := -D__ASSEMBLY__ $(CPPFLAGS) -all: radeonfb.o radeon_vid.o +all: radeonfb.o radeon_vid.o rage128_vid.o radeonfb.o: radeonfb.c radeon.h $(CC) $(CFLAGS) $(INCLUDES) -c $(basename $@).c radeon_vid.o: radeon_vid.c radeon.h radeon_vid.h $(CC) $(CFLAGS) $(INCLUDES) -c $(basename $@).c +rage128_vid.o: radeon_vid.c radeon.h radeon_vid.h + $(CC) $(CFLAGS) -DRAGE128 $(INCLUDES) -c radeon_vid.c -o $@ dep:
--- a/drivers/radeon/README Tue Nov 27 18:09:45 2001 +0000 +++ b/drivers/radeon/README Tue Nov 27 18:36:02 2001 +0000 @@ -21,4 +21,48 @@ (But if you plan to use this module with mplayer you also should have 16bpp, 24bpp and 32bpp pixel support compiled as modules). + + Radeon video overlay + ==================== + +Was designed for mplayer and currently can be used only by mplayer. +It's RGB-YUV BES for radeon cards (althrough there is experimental +support for rage128 / rage128pro chips). + +Installation: +~~~~~~~~~~~~~ + +After building modules just copy them to: +/lib/modules/$(LINUX_VER)/kernel/drivers/video +directory. +Don't forget about: +depmod -a + +If you are doing it first time then create the device then execute +following command: +mknod /dev/radeon_vid c 178 0 +for radeon_vid.o +mknod /dev/rage128_vid c 178 0 +for rage128_vid.o + +Using with mplayer: +~~~~~~~~~~~~~~~~~~~ + +Currently there is only way to use ATI's drivers: +mplayer -vo vesa:lvo:/dev/radeon_vid -<your options> filename +or +mplayer -vo vesa:lvo:/dev/rage128_vid -<your options> filename + +Note: +~~~~~ +You can pass only options with can be recognized by vo_vesa driver. +(Indeed radeon_vid and rage128_vid are stupid things and can create +video overlay only. But mode switching and other adjustement performs +vo_vesa driver. This mean that they use VESA BIOS as graphics server). + +Conslusion: +~~~~~~~~~~~ +This stuff (radeon(rage128)_vid) currently doesn't support any standards. +So after implementing linux standards I'll fully rewrite this driver. + Enjoy \ No newline at end of file
--- a/drivers/radeon/radeon.h Tue Nov 27 18:09:45 2001 +0000 +++ b/drivers/radeon/radeon.h Tue Nov 27 18:36:02 2001 +0000 @@ -506,6 +506,7 @@ # define REG_LD_CTL_VBLANK_DURING_LOCK 0x00000002L # define REG_LD_CTL_STALL_GUI_UNTIL_FLIP 0x00000004L # define REG_LD_CTL_LOCK_READBACK 0x00000008L +/*#define OV0_REG_SLICE_CNTL 0xXXXX*/ #define OV0_SCALE_CNTL 0x0420 # define SCALER_PIX_EXPAND 0x00000001L # define SCALER_Y2R_TEMP 0x00000002L @@ -594,7 +595,6 @@ # define VIF_BUF5_1ST_LINE_LSBS_MASK 0x48000000L #define OV0_VID_BUF_PITCH0_VALUE 0x0460 #define OV0_VID_BUF_PITCH1_VALUE 0x0464 -#define OV0_VID_BUF_PITCH2_VALUE 0x0468 #define OV0_AUTO_FLIP_CNTL 0x0470 # define OV0_AUTO_FLIP_CNTL_SOFT_BUF_NUM 0x00000007 # define OV0_AUTO_FLIP_CNTL_SOFT_REPEAT_FIELD 0x00000008
--- a/drivers/radeon/radeon_vid.c Tue Nov 27 18:09:45 2001 +0000 +++ b/drivers/radeon/radeon_vid.c Tue Nov 27 18:36:02 2001 +0000 @@ -4,7 +4,7 @@ * * Copyright (C) 2001 Nick Kurshev * - * BES YUV video overlay driver for Radeon cards + * BES YUV video overlay driver for Radeon/Rage128Pro/Rage128 cards * * This software has been released under the terms of the GNU Public * license. See http://www.gnu.org/copyleft/gpl.html for details. @@ -14,19 +14,20 @@ * Also here was used code from CVS of GATOS project and X11 trees. */ -#define RADEON_VID_VERSION "0.9.9.1" +#define RADEON_VID_VERSION "1.0.0" /* It's entirely possible this major conflicts with something else mknod /dev/radeon_vid c 178 0 - */ - -/* TESTED and WORKING formats: YUY2 */ - -/* + or + mknod /dev/rage128_vid c 178 0 + for Rage128/Rage128Pro chips (althrough it doesn't matter) + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + TESTED and WORKING formats: YUY2, UYVY, IYUV, I420, YV12 + ----------------------------------------------------------- TODO: - Highest priority: fbvid.h compatibility and UYVY test - High priority: YV12, I420, IYUV support + Highest priority: fbvid.h compatibility + High priority: RGB/BGR 2-32, YVU9, IF09 support Middle priority: OV0_COLOUR_CNTL brightness saturation SCALER_GAMMA_SEL_BRIGHT gamma correction ??? @@ -35,7 +36,7 @@ OV0_FILTER_CNTL OV0_VIDEO_KEY_CLR OV0_KEY_CNTL - Low priority: RGB/BGR 2-32, YVU9, IF09, CLPL, IYU1, IYU2, UYNV, CYUV + Low priority: CLPL, IYU1, IYU2, UYNV, CYUV YUNV, YVYU, Y41P, Y211, Y41T, Y42T, V422, V655, CLJR ^^^^ YUVP, UYVP, Mpeg PES (mpeg-1,2) support @@ -73,11 +74,19 @@ MODULE_AUTHOR("Nick Kurshev <nickols_k@mail.ru>"); -MODULE_DESCRIPTION("Accelerated YUV BES driver for Radeons. Version: "RADEON_VID_VERSION); +MODULE_DESCRIPTION("Accelerated YUV BES driver for Rage128/Radeons. Version: "RADEON_VID_VERSION); #ifdef MODULE_LICENSE MODULE_LICENSE("GPL"); #endif +#ifdef RAGE128 +#define RVID_MSG "rage128_vid: " +#define X_ADJUST 0 +#else +#define RVID_MSG "radeon_vid: " +#define X_ADJUST 8 +#endif + typedef struct bes_registers_s { /* base address of yuv framebuffer */ @@ -173,7 +182,6 @@ static uint32_t radeon_ram_size = 0; -//static struct video_window radeon_win; static mga_vid_config_t radeon_config; #undef DEBUG @@ -269,20 +277,20 @@ static void radeon_vid_display_video( void ) { int bes_flags; -RTRACE("radeon_vid: OV0: v_inc=%x h_inc=%x step_by=%x\n",besr.v_inc,besr.h_inc,besr.step_by); -RTRACE("radeon_vid: OV0: vid_buf0_base=%x\n",besr.vid_buf0_base_adrs); -RTRACE("radeon_vid: OV0: y_x_start=%x y_x_end=%x blank_at_top=%x pitch0_value=%x\n" +RTRACE(RVID_MSG"OV0: v_inc=%x h_inc=%x step_by=%x\n",besr.v_inc,besr.h_inc,besr.step_by); +RTRACE(RVID_MSG"OV0: vid_buf0_base=%x\n",besr.vid_buf0_base_adrs); +RTRACE(RVID_MSG"OV0: y_x_start=%x y_x_end=%x blank_at_top=%x pitch0_value=%x\n" ,besr.y_x_start,besr.y_x_end,besr.p1_blank_lines_at_top,besr.vid_buf_pitch0_value); -RTRACE("radeon_vid: OV0: p1_x_start_end=%x p2_x_start_end=%x p3_x_start-end=%x\n" +RTRACE(RVID_MSG"OV0: p1_x_start_end=%x p2_x_start_end=%x p3_x_start-end=%x\n" ,besr.p1_x_start_end,besr.p2_x_start_end,besr.p2_x_start_end); -RTRACE("radeon_vid: OV0: p1_v_accum_init=%x p1_h_accum_init=%x p23_h_accum_init=%x\n" +RTRACE(RVID_MSG"OV0: p1_v_accum_init=%x p1_h_accum_init=%x p23_h_accum_init=%x\n" ,besr.p1_v_accum_init,besr.p1_h_accum_init,besr.p23_h_accum_init); OUTREG(OV0_REG_LOAD_CNTL, REG_LD_CTL_LOCK); while(!(INREG(OV0_REG_LOAD_CNTL)®_LD_CTL_LOCK_READBACK)); OUTREG(OV0_AUTO_FLIP_CNTL,OV0_AUTO_FLIP_CNTL_SOFT_BUF_ODD); - OUTREG(OV0_DEINTERLACE_PATTERN,0xAAAAAAAA); + OUTREG(OV0_DEINTERLACE_PATTERN,0x900AAAAA); OUTREG(OV0_AUTO_FLIP_CNTL,(INREG(OV0_AUTO_FLIP_CNTL)^OV0_AUTO_FLIP_CNTL_SOFT_EOF_TOGGLE)); OUTREG(OV0_AUTO_FLIP_CNTL,(INREG(OV0_AUTO_FLIP_CNTL)^OV0_AUTO_FLIP_CNTL_SOFT_EOF_TOGGLE)); @@ -293,12 +301,13 @@ OUTREG(OV0_Y_X_END, besr.y_x_end); OUTREG(OV0_V_INC, besr.v_inc); OUTREG(OV0_P1_BLANK_LINES_AT_TOP, besr.p1_blank_lines_at_top); + OUTREG(OV0_P23_BLANK_LINES_AT_TOP, besr.p23_blank_lines_at_top); OUTREG(OV0_VID_BUF_PITCH0_VALUE, besr.vid_buf_pitch0_value); OUTREG(OV0_VID_BUF_PITCH1_VALUE, besr.vid_buf_pitch1_value); OUTREG(OV0_P1_X_START_END, besr.p1_x_start_end); OUTREG(OV0_P2_X_START_END, besr.p2_x_start_end); OUTREG(OV0_P3_X_START_END, besr.p3_x_start_end); -#if 0 +#if 1 OUTREG(OV0_BASE_ADDR, besr.base_addr); #endif OUTREG(OV0_VID_BUF0_BASE_ADRS, besr.vid_buf0_base_adrs); @@ -310,6 +319,7 @@ OUTREG(OV0_P1_V_ACCUM_INIT, besr.p1_v_accum_init); OUTREG(OV0_P1_H_ACCUM_INIT, besr.p1_h_accum_init); OUTREG(OV0_P23_H_ACCUM_INIT, besr.p23_h_accum_init); + OUTREG(OV0_P23_V_ACCUM_INIT, besr.p23_v_accum_init); bes_flags = SCALER_ENABLE | SCALER_DOUBLE_BUFFER | @@ -326,18 +336,19 @@ case IMGFMT_BGR24: bes_flags |= SCALER_SOURCE_24BPP; break; case IMGFMT_RGB32: case IMGFMT_BGR32: bes_flags |= SCALER_SOURCE_32BPP; break; - - case IMGFMT_UYVY: bes_flags |= SCALER_SOURCE_YVYU422; break; + /* 4:1:0*/ + case IMGFMT_IF09: case IMGFMT_YVU9: bes_flags |= SCALER_SOURCE_YUV9; break; - + /* 4:2:0 */ case IMGFMT_IYUV: case IMGFMT_I420: - case IMGFMT_YV12: bes_flags |= SCALER_SOURCE_YUV12; - break; + case IMGFMT_YV12: bes_flags |= SCALER_SOURCE_YUV12; break; + /* 4:2:2 */ + case IMGFMT_UYVY: bes_flags |= SCALER_SOURCE_YVYU422; break; case IMGFMT_YUY2: default: bes_flags |= SCALER_SOURCE_VYUY422; break; } -RTRACE("radeon_vid: OV0: SCALER=%x\n",bes_flags); +RTRACE(RVID_MSG"OV0: SCALER=%x\n",bes_flags); OUTREG(OV0_SCALE_CNTL, bes_flags); /* TODO: @@ -352,11 +363,6 @@ OUTREG(OV0_REG_LOAD_CNTL, 0); } -static void radeon_vid_start_video( void ) -{ - radeon_vid_display_video(); -} - #define XXX_SRC_X 0 #define XXX_SRC_Y 0 @@ -370,7 +376,7 @@ { uint32_t tmp,src_w,src_h,pitch,h_inc,step_by,left,leftUV,top; int is_420; -RTRACE("radeon_vid: usr_config: version = %x format=%x card=%x ram=%u src(%ux%u) dest(%u:%ux%u:%u) frame_size=%u num_frames=%u\n" +RTRACE(RVID_MSG"usr_config: version = %x format=%x card=%x ram=%u src(%ux%u) dest(%u:%ux%u:%u) frame_size=%u num_frames=%u\n" ,(uint32_t)config->version ,(uint32_t)config->format ,(uint32_t)config->card_type @@ -398,17 +404,19 @@ case IMGFMT_BGR24: case IMGFMT_RGB32: case IMGFMT_BGR32: - + /* 4:1:0 */ + case IMGFMT_IF09: case IMGFMT_YVU9: + /* 4:2:0 */ case IMGFMT_IYUV: - case IMGFMT_UYVY: - case IMGFMT_YV12: case IMGFMT_I420: + /* 4:2:2 */ + case IMGFMT_UYVY: case IMGFMT_YUY2: break; default: - printk( "radeon_vid: Unsupported pixel format: 0x%X\n",config->format); + printk(RVID_MSG"Unsupported pixel format: 0x%X\n",config->format); return -1; } is_420 = 0; @@ -417,12 +425,16 @@ config->format == IMGFMT_IYUV) is_420 = 1; switch(config->format) { - default: + /* 4:1:0 */ case IMGFMT_YVU9: + case IMGFMT_IF09: + /* 4:2:0 */ case IMGFMT_IYUV: + case IMGFMT_YV12: + case IMGFMT_I420: pitch = (src_w + 31) & ~31; break; + /* 4:2:2 */ + default: case IMGFMT_UYVY: - case IMGFMT_YV12: - case IMGFMT_I420: case IMGFMT_YUY2: case IMGFMT_RGB15: case IMGFMT_BGR15: @@ -446,17 +458,26 @@ } /* keep everything in 16.16 */ - besr.base_addr = radeon_overlay_off; + besr.base_addr = radeon_mem_base; if(is_420) { - uint32_t dstPitch,d1line,d2line,d3line; - dstPitch = ((src_w + 15) & ~15); /* of luma */ - d1line = top*dstPitch; - d2line = src_h*dstPitch+(d1line>>1); - d3line = d2line+((src_h*dstPitch)>>2); - besr.vid_buf0_base_adrs=((radeon_overlay_off+d1line)&VIF_BUF0_BASE_ADRS_MASK)|VIF_BUF0_PITCH_SEL; - besr.vid_buf1_base_adrs=((radeon_overlay_off+d2line)&VIF_BUF1_BASE_ADRS_MASK)|VIF_BUF0_PITCH_SEL; - besr.vid_buf2_base_adrs=((radeon_overlay_off+d3line)&VIF_BUF2_BASE_ADRS_MASK)|VIF_BUF0_PITCH_SEL; + uint32_t d1line,d2line,d3line; + d1line = top*pitch; + d2line = src_h*pitch+(d1line>>1); + d3line = d2line+((src_h*pitch)>>2); + d1line += (left >> 16) & ~15; + d2line += (left >> 17) & ~15; + d3line += (left >> 17) & ~15; + besr.vid_buf0_base_adrs=((radeon_overlay_off+d1line)&VIF_BUF0_BASE_ADRS_MASK); + besr.vid_buf1_base_adrs=((radeon_overlay_off+d2line)&VIF_BUF1_BASE_ADRS_MASK)|VIF_BUF1_PITCH_SEL; + besr.vid_buf2_base_adrs=((radeon_overlay_off+d3line)&VIF_BUF2_BASE_ADRS_MASK)|VIF_BUF2_PITCH_SEL; + if(besr.fourcc == IMGFMT_I420 || besr.fourcc == IMGFMT_IYUV) + { + uint32_t tmp; + tmp = besr.vid_buf1_base_adrs; + besr.vid_buf1_base_adrs = besr.vid_buf2_base_adrs; + besr.vid_buf2_base_adrs = tmp; + } } else { @@ -476,7 +497,6 @@ tmp = ((left >> 1) & 0x0001ffff) + 0x00028000 + (h_inc << 2); besr.p23_h_accum_init = ((tmp << 4) & 0x000f8000) | ((tmp << 12) & 0x70000000); - tmp = (top & 0x0000ffff) + 0x00018000; besr.p1_v_accum_init = ((tmp << 4) & OV0_P1_V_ACCUM_INIT_MASK) |(OV0_P1_MAX_LN_IN_PER_LN_OUT & 1); @@ -489,8 +509,8 @@ left = (left >> 16) & 15; besr.h_inc = h_inc | ((h_inc >> 1) << 16); besr.step_by = step_by | (step_by << 8); - besr.y_x_start = (config->x_org+8) | (config->y_org << 16); - besr.y_x_end = (config->x_org + config->dest_width+8) | ((config->y_org + config->dest_height) << 16); + besr.y_x_start = (config->x_org+X_ADJUST) | (config->y_org << 16); + besr.y_x_end = (config->x_org + config->dest_width+X_ADJUST) | ((config->y_org + config->dest_height) << 16); besr.p1_blank_lines_at_top = P1_BLNK_LN_AT_TOP_M1_MASK|((src_h-1)<<16); if(is_420) { @@ -500,30 +520,14 @@ else besr.p23_blank_lines_at_top = 0; besr.vid_buf_pitch0_value = pitch; besr.vid_buf_pitch1_value = is_420 ? pitch>>1 : pitch; -RTRACE("radeon_vid: BES: v_inc=%x h_inc=%x step_by=%x\n",besr.v_inc,besr.h_inc,besr.step_by); -RTRACE("radeon_vid: BES: vid_buf0_basey=%x\n",besr.vid_buf0_base_adrs); -RTRACE("radeon_vid: BES: y_x_start=%x y_x_end=%x blank_at_top=%x pitch0_value=%x\n" +RTRACE(RVID_MSG"BES: v_inc=%x h_inc=%x step_by=%x\n",besr.v_inc,besr.h_inc,besr.step_by); +RTRACE(RVID_MSG"BES: vid_buf0_basey=%x\n",besr.vid_buf0_base_adrs); +RTRACE(RVID_MSG"BES: y_x_start=%x y_x_end=%x blank_at_top=%x pitch0_value=%x\n" ,besr.y_x_start,besr.y_x_end,besr.p1_blank_lines_at_top,besr.vid_buf_pitch0_value); besr.p1_x_start_end = (src_w+left-1)|(left<<16); - if(is_420) - { - if(config->format == IMGFMT_YV12) - { - besr.p3_x_start_end = ((src_w/2)+left-1)|((leftUV)<<16); - besr.p2_x_start_end = (src_w+left-1)|((src_w/2+leftUV)<<16); - } - else - { - besr.p2_x_start_end = ((src_w/2)+left-1)|((leftUV)<<16); - besr.p3_x_start_end = (src_w+left-1)|((src_w/2+leftUV)<<16); - } - } - else - { - src_w>>=1; - besr.p2_x_start_end = (src_w+left-1)|(leftUV<<16); - besr.p3_x_start_end = besr.p2_x_start_end; - } + src_w>>=1; + besr.p2_x_start_end = (src_w+left-1)|(leftUV<<16); + besr.p3_x_start_end = besr.p2_x_start_end; return 0; } @@ -561,25 +565,25 @@ case MGA_VID_CONFIG: RTRACE( "radeon_mmio_base = %p\n",radeon_mmio_base); RTRACE( "radeon_mem_base = %08x\n",radeon_mem_base); - RTRACE( "radeon_vid: Received configuration\n"); + RTRACE(RVID_MSG"Received configuration\n"); if(copy_from_user(&radeon_config,(mga_vid_config_t*) arg,sizeof(mga_vid_config_t))) { - printk( "radeon_vid: failed copy from userspace\n"); + printk(RVID_MSG"failed copy from userspace\n"); return -EFAULT; } if(radeon_config.version != MGA_VID_VERSION){ - printk( "radeon_vid: incompatible version! driver: %X requested: %X\n",MGA_VID_VERSION,radeon_config.version); + printk(RVID_MSG"incompatible version! driver: %X requested: %X\n",MGA_VID_VERSION,radeon_config.version); return -EFAULT; } if(radeon_config.frame_size==0 || radeon_config.frame_size>1024*768*2){ - printk( "radeon_vid: illegal frame_size: %d\n",radeon_config.frame_size); + printk(RVID_MSG"illegal frame_size: %d\n",radeon_config.frame_size); return -EFAULT; } if(radeon_config.num_frames<1 || radeon_config.num_frames>4){ - printk( "radeon_vid: illegal num_frames: %d\n",radeon_config.num_frames); + printk(RVID_MSG"illegal num_frames: %d\n",radeon_config.num_frames); return -EFAULT; } @@ -589,27 +593,27 @@ radeon_overlay_off = radeon_ram_size*0x100000 - radeon_config.frame_size*radeon_config.num_frames; radeon_overlay_off &= 0xffff0000; if(radeon_overlay_off < 0){ - printk("radeon_vid: not enough video memory. Need: %u has: %u\n",radeon_config.frame_size*radeon_config.num_frames,radeon_ram_size*0x100000); + printk(RVID_MSG"not enough video memory. Need: %u has: %u\n",radeon_config.frame_size*radeon_config.num_frames,radeon_ram_size*0x100000); return -EFAULT; } - RTRACE("radeon_vid: using video overlay at offset %p\n",radeon_overlay_off); + RTRACE(RVID_MSG"using video overlay at offset %p\n",radeon_overlay_off); if (copy_to_user((mga_vid_config_t *) arg, &radeon_config, sizeof(mga_vid_config_t))) { - printk( "radeon_vid: failed copy to userspace\n"); + printk(RVID_MSG"failed copy to userspace\n"); return -EFAULT; } - printk("radeon_vid: configuring for '%s' fourcc\n",fourcc_format_name(radeon_config.format)); + printk(RVID_MSG"configuring for '%s' fourcc\n",fourcc_format_name(radeon_config.format)); return radeon_vid_init_video(&radeon_config); break; case MGA_VID_ON: - RTRACE( "radeon_vid: Video ON (ioctl)\n"); - radeon_vid_start_video(); + RTRACE(RVID_MSG"Video ON (ioctl)\n"); + radeon_vid_display_video(); video_on = 1; break; case MGA_VID_OFF: - RTRACE( "radeon_vid: Video OFF (ioctl)\n"); + RTRACE(RVID_MSG"Video OFF (ioctl)\n"); if(video_on) radeon_vid_stop_video(); video_on = 0; break; @@ -617,14 +621,14 @@ case MGA_VID_FSEL: if(copy_from_user(&frame,(int *) arg,sizeof(int))) { - printk("radeon_vid: FSEL failed copy from userspace\n"); + printk(RVID_MSG"FSEL failed copy from userspace\n"); return(-EFAULT); } radeon_vid_frame_sel(frame); break; default: - printk( "radeon_vid: Invalid ioctl\n"); + printk(RVID_MSG"Invalid ioctl\n"); return (-EINVAL); } @@ -633,10 +637,71 @@ struct ati_card_id_s { - int id; - char name[17]; -}ati_card_ids[]= + const int id; + const char name[17]; +}; + +const struct ati_card_id_s ati_card_ids[]= { +#ifdef RAGE128 + /* + This driver should be compatible with Rage128 (pro) chips. + (include adaptive deinterlacing!!!). + Moreover: the same logic can be used with Mach64 chips. + (I mean: mach64xx, 3d rage, 3d rage IIc, 3D rage pro, 3d rage mobility). + but they are incompatible by i/o ports. So if enthusiasts will want + then they can redefine OUTREG and INREG macros and redefine OV0_* + constants. Also it seems that mach64 chips supports only: YUY2, YV12, UYVY + fourccs (422 and 420 formats only). + */ +/* Rage128 Pro GL */ + { PCI_DEVICE_ID_ATI_Rage128_PA, "R128Pro PA" }, + { PCI_DEVICE_ID_ATI_Rage128_PB, "R128Pro PB" }, + { PCI_DEVICE_ID_ATI_Rage128_PC, "R128Pro PC" }, + { PCI_DEVICE_ID_ATI_Rage128_PD, "R128Pro PD" }, + { PCI_DEVICE_ID_ATI_Rage128_PE, "R128Pro PE" }, + { PCI_DEVICE_ID_ATI_RAGE128_PF, "R128Pro PF" }, +/* Rage128 Pro VR */ + { PCI_DEVICE_ID_ATI_RAGE128_PG, "R128Pro PG" }, + { PCI_DEVICE_ID_ATI_RAGE128_PH, "R128Pro PH" }, + { PCI_DEVICE_ID_ATI_RAGE128_PI, "R128Pro PI" }, + { PCI_DEVICE_ID_ATI_RAGE128_PJ, "R128Pro PJ" }, + { PCI_DEVICE_ID_ATI_RAGE128_PK, "R128Pro PK" }, + { PCI_DEVICE_ID_ATI_RAGE128_PL, "R128Pro PL" }, + { PCI_DEVICE_ID_ATI_RAGE128_PM, "R128Pro PM" }, + { PCI_DEVICE_ID_ATI_RAGE128_PN, "R128Pro PN" }, + { PCI_DEVICE_ID_ATI_RAGE128_PO, "R128Pro PO" }, + { PCI_DEVICE_ID_ATI_RAGE128_PP, "R128Pro PP" }, + { PCI_DEVICE_ID_ATI_RAGE128_PQ, "R128Pro PQ" }, + { PCI_DEVICE_ID_ATI_RAGE128_PR, "R128Pro PR" }, + { PCI_DEVICE_ID_ATI_RAGE128_TR, "R128Pro TR" }, + { PCI_DEVICE_ID_ATI_RAGE128_PS, "R128Pro PS" }, + { PCI_DEVICE_ID_ATI_RAGE128_PT, "R128Pro PT" }, + { PCI_DEVICE_ID_ATI_RAGE128_PU, "R128Pro PU" }, + { PCI_DEVICE_ID_ATI_RAGE128_PV, "R128Pro PV" }, + { PCI_DEVICE_ID_ATI_RAGE128_PW, "R128Pro PW" }, + { PCI_DEVICE_ID_ATI_RAGE128_PX, "R128Pro PX" }, +/* Rage128 GL */ + { PCI_DEVICE_ID_ATI_RAGE128_RE, "R128 RE" }, + { PCI_DEVICE_ID_ATI_RAGE128_RF, "R128 RF" }, + { PCI_DEVICE_ID_ATI_RAGE128_RG, "R128 RG" }, + { PCI_DEVICE_ID_ATI_RAGE128_RH, "R128 RH" }, + { PCI_DEVICE_ID_ATI_RAGE128_RI, "R128 RI" }, +/* Rage128 VR */ + { PCI_DEVICE_ID_ATI_RAGE128_RK, "R128 RK" }, + { PCI_DEVICE_ID_ATI_RAGE128_RL, "R128 RL" }, + { PCI_DEVICE_ID_ATI_RAGE128_RM, "R128 RM" }, + { PCI_DEVICE_ID_ATI_RAGE128_RN, "R128 RN" }, + { PCI_DEVICE_ID_ATI_RAGE128_RO, "R128 RO" }, +/* Rage128 M3 */ + { PCI_DEVICE_ID_ATI_RAGE128_LE, "R128 LE" }, + { PCI_DEVICE_ID_ATI_RAGE128_LF, "R128 LF" }, +/* Rage128 Pro Ultra */ + { PCI_DEVICE_ID_ATI_RAGE128_U1, "R128 U1" }, + { PCI_DEVICE_ID_ATI_RAGE128_U2, "R128 U2" }, + { PCI_DEVICE_ID_ATI_RAGE128_U3, "R128 U3" } +#else +/* Radeons (indeed: Rage 256 Pro ;) */ { PCI_DEVICE_ID_RADEON_QD, "Radeon QD " }, { PCI_DEVICE_ID_RADEON_QE, "Radeon QE " }, { PCI_DEVICE_ID_RADEON_QF, "Radeon QF " }, @@ -648,6 +713,7 @@ { PCI_DEVICE_ID_RADEON_LW, "Radeon M7 LW " }, { PCI_DEVICE_ID_R200_QL, "Radeon2 8500 QL " }, { PCI_DEVICE_ID_RV200_QW, "Radeon2 7500 QW " } +#endif }; static int radeon_vid_config_card(void) @@ -660,23 +726,23 @@ break; if(!dev) { - printk("radeon_vid: No supported cards found\n"); + printk(RVID_MSG"No supported cards found\n"); return FALSE; } radeon_mmio_base = ioremap_nocache(pci_resource_start (dev, 2),RADEON_REGSIZE); radeon_mem_base = dev->resource[0].start; - RTRACE( "radeon_vid: MMIO at 0x%p\n", radeon_mmio_base); - RTRACE( "radeon_vid: Frame Buffer at 0x%08x\n", radeon_mem_base); + RTRACE(RVID_MSG"MMIO at 0x%p\n", radeon_mmio_base); + RTRACE(RVID_MSG"Frame Buffer at 0x%08x\n", radeon_mem_base); /* video memory size */ radeon_ram_size = INREG(CONFIG_MEMSIZE); - /* mem size is bits [28:0], mask off the rest */ + /* mem size is bits [28:0], mask off the rest. Range: from 1Mb up to 512 Mb */ radeon_ram_size &= CONFIG_MEMSIZE_MASK; radeon_ram_size /= 0x100000; - printk("radeon_vid: Found %s (%uMb memory)\n",ati_card_ids[i].name,radeon_ram_size); + printk(RVID_MSG"Found %s (%uMb memory)\n",ati_card_ids[i].name,radeon_ram_size); return TRUE; } @@ -695,11 +761,11 @@ static int radeon_vid_mmap(struct file *file, struct vm_area_struct *vma) { - RTRACE( "radeon_vid: mapping video memory into userspace\n"); + RTRACE(RVID_MSG"mapping video memory into userspace\n"); if(remap_page_range(vma->vm_start, radeon_mem_base + radeon_overlay_off, vma->vm_end - vma->vm_start, vma->vm_page_prot)) { - printk( "radeon_vid: error mapping video memory\n"); + printk(RVID_MSG"error mapping video memory\n"); return(-EAGAIN); } @@ -708,7 +774,6 @@ static int radeon_vid_release(struct inode *inode, struct file *file) { - //Close the window just in case radeon_vid_in_use = 0; radeon_vid_stop_video(); @@ -771,17 +836,20 @@ static int radeon_vid_initialize(void) { radeon_vid_in_use = 0; - - printk( "radeon_vid: Radeon video overlay driver v"RADEON_VID_VERSION" (C) Nick Kurshev\n"); +#ifdef RAGE128 + printk(RVID_MSG"Rage128/Rage128Pro video overlay driver v"RADEON_VID_VERSION" (C) Nick Kurshev\n"); +#else + printk(RVID_MSG"Radeon video overlay driver v"RADEON_VID_VERSION" (C) Nick Kurshev\n"); +#endif if(register_chrdev(RADEON_VID_MAJOR, "radeon_vid", &radeon_vid_fops)) { - printk( "radeon_vid: unable to get major: %d\n", RADEON_VID_MAJOR); + printk(RVID_MSG"unable to get major: %d\n", RADEON_VID_MAJOR); return -EIO; } if (!radeon_vid_config_card()) { - printk("radeon_vid: can't configure this card\n"); + printk(RVID_MSG"can't configure this card\n"); unregister_chrdev(RADEON_VID_MAJOR, "radeon_vid"); return -EINVAL; } @@ -800,7 +868,7 @@ if(radeon_mmio_base) iounmap(radeon_mmio_base); - RTRACE( "radeon_vid: Cleaning up module\n"); + RTRACE(RVID_MSG"Cleaning up module\n"); unregister_chrdev(RADEON_VID_MAJOR, "radeon_vid"); }