comparison drivers/radeon/radeon_vid.c @ 3305:27be0e71c0ee

Rage128 problems???
author nick
date Tue, 04 Dec 2001 09:22:53 +0000
parents 404cfc1a0942
children f7ba4fb75b69
comparison
equal deleted inserted replaced
3304:f03fc389433d 3305:27be0e71c0ee
12 * This file is partly based on mga_vid and sis_vid stuff from 12 * This file is partly based on mga_vid and sis_vid stuff from
13 * mplayer's package. 13 * mplayer's package.
14 * Also here was used code from CVS of GATOS project and X11 trees. 14 * Also here was used code from CVS of GATOS project and X11 trees.
15 */ 15 */
16 16
17 #define RADEON_VID_VERSION "1.0.2" 17 #define RADEON_VID_VERSION "1.0.2.1"
18 18
19 /* 19 /*
20 It's entirely possible this major conflicts with something else 20 It's entirely possible this major conflicts with something else
21 mknod /dev/radeon_vid c 178 0 21 mknod /dev/radeon_vid c 178 0
22 or 22 or
156 156
157 } bes_registers_t; 157 } bes_registers_t;
158 158
159 typedef struct video_registers_s 159 typedef struct video_registers_s
160 { 160 {
161 const char * sname;
161 uint32_t name; 162 uint32_t name;
162 uint32_t value; 163 uint32_t value;
163 }video_registers_t; 164 }video_registers_t;
164 165
165 static bes_registers_t besr; 166 static bes_registers_t besr;
166 static video_registers_t vregs[] = 167 static video_registers_t vregs[] =
167 { 168 {
168 { OV0_REG_LOAD_CNTL, 0 }, 169 { "OV0_Y_X_START", OV0_Y_X_START, 0 },
169 { OV0_H_INC, 0 }, 170 { "OV0_Y_X_END", OV0_Y_X_END, 0 },
170 { OV0_STEP_BY, 0 }, 171 { "OV0_PIPELINE_CNTL", OV0_PIPELINE_CNTL, 0 },
171 { OV0_Y_X_START, 0 }, 172 { "OV0_EXCLUSIVE_HORZ", OV0_EXCLUSIVE_HORZ, 0 },
172 { OV0_Y_X_END, 0 }, 173 { "OV0_EXCLUSIVE_VERT", OV0_EXCLUSIVE_VERT, 0 },
173 { OV0_V_INC, 0 }, 174 { "OV0_REG_LOAD_CNTL", OV0_REG_LOAD_CNTL, 0 },
174 { OV0_P1_BLANK_LINES_AT_TOP, 0 }, 175 { "OV0_SCALE_CNTL", OV0_SCALE_CNTL, 0 },
175 { OV0_P23_BLANK_LINES_AT_TOP, 0 }, 176 { "OV0_V_INC", OV0_V_INC, 0 },
176 { OV0_VID_BUF_PITCH0_VALUE, 0 }, 177 { "OV0_P1_V_ACCUM_INIT", OV0_P1_V_ACCUM_INIT, 0 },
177 { OV0_VID_BUF_PITCH1_VALUE, 0 }, 178 { "OV0_P23_V_ACCUM_INIT", OV0_P23_V_ACCUM_INIT, 0 },
178 { OV0_P1_X_START_END, 0 }, 179 { "OV0_P1_BLANK_LINES_AT_TOP", OV0_P1_BLANK_LINES_AT_TOP, 0 },
179 { OV0_P2_X_START_END, 0 }, 180 { "OV0_P23_BLANK_LINES_AT_TOP", OV0_P23_BLANK_LINES_AT_TOP, 0 },
180 { OV0_P3_X_START_END, 0 }, 181 { "OV0_BASE_ADDR", OV0_BASE_ADDR, 0 },
181 { OV0_BASE_ADDR, 0 }, 182 { "OV0_VID_BUF0_BASE_ADRS", OV0_VID_BUF0_BASE_ADRS, 0 },
182 { OV0_VID_BUF0_BASE_ADRS, 0 }, 183 { "OV0_VID_BUF1_BASE_ADRS", OV0_VID_BUF1_BASE_ADRS, 0 },
183 { OV0_VID_BUF1_BASE_ADRS, 0 }, 184 { "OV0_VID_BUF2_BASE_ADRS", OV0_VID_BUF2_BASE_ADRS, 0 },
184 { OV0_VID_BUF2_BASE_ADRS, 0 }, 185 { "OV0_VID_BUF3_BASE_ADRS", OV0_VID_BUF3_BASE_ADRS, 0 },
185 { OV0_VID_BUF3_BASE_ADRS, 0 }, 186 { "OV0_VID_BUF4_BASE_ADRS", OV0_VID_BUF4_BASE_ADRS, 0 },
186 { OV0_VID_BUF4_BASE_ADRS, 0 }, 187 { "OV0_VID_BUF5_BASE_ADRS", OV0_VID_BUF5_BASE_ADRS, 0 },
187 { OV0_VID_BUF5_BASE_ADRS, 0 }, 188 { "OV0_VID_BUF_PITCH0_VALUE", OV0_VID_BUF_PITCH0_VALUE, 0 },
188 { OV0_P1_V_ACCUM_INIT, 0 }, 189 { "OV0_VID_BUF_PITCH1_VALUE", OV0_VID_BUF_PITCH1_VALUE, 0 },
189 { OV0_P1_H_ACCUM_INIT, 0 }, 190 { "OV0_AUTO_FLIP_CNTL", OV0_AUTO_FLIP_CNTL, 0 },
190 { OV0_P23_V_ACCUM_INIT, 0 }, 191 { "OV0_DEINTERLACE_PATTERN", OV0_DEINTERLACE_PATTERN, 0 },
191 { OV0_P23_H_ACCUM_INIT, 0 }, 192 { "OV0_SUBMIT_HISTORY", OV0_SUBMIT_HISTORY, 0 },
192 { OV0_SCALE_CNTL, 0 }, 193 { "OV0_H_INC", OV0_H_INC, 0 },
193 { OV0_EXCLUSIVE_HORZ, 0 }, 194 { "OV0_STEP_BY", OV0_STEP_BY, 0 },
194 { OV0_AUTO_FLIP_CNTL, 0 }, 195 { "OV0_P1_H_ACCUM_INIT", OV0_P1_H_ACCUM_INIT, 0 },
195 { OV0_FILTER_CNTL, 0 }, 196 { "OV0_P23_H_ACCUM_INIT", OV0_P23_H_ACCUM_INIT, 0 },
196 { OV0_COLOUR_CNTL, 0 }, 197 { "OV0_P1_X_START_END", OV0_P1_X_START_END, 0 },
197 { OV0_GRAPHICS_KEY_CLR, 0 }, 198 { "OV0_P2_X_START_END", OV0_P2_X_START_END, 0 },
198 { OV0_GRAPHICS_KEY_MSK, 0 }, 199 { "OV0_P3_X_START_END", OV0_P3_X_START_END, 0 },
199 { OV0_KEY_CNTL, 0 }, 200 { "OV0_FILTER_CNTL", OV0_FILTER_CNTL, 0 },
200 { OV0_TEST, 0 } 201 { "OV0_FOUR_TAP_COEF_0", OV0_FOUR_TAP_COEF_0, 0 },
202 { "OV0_FOUR_TAP_COEF_1", OV0_FOUR_TAP_COEF_1, 0 },
203 { "OV0_FOUR_TAP_COEF_2", OV0_FOUR_TAP_COEF_2, 0 },
204 { "OV0_FOUR_TAP_COEF_3", OV0_FOUR_TAP_COEF_3, 0 },
205 { "OV0_FOUR_TAP_COEF_4", OV0_FOUR_TAP_COEF_4, 0 },
206 { "OV0_FLAG_CNTL", OV0_FLAG_CNTL, 0 },
207 { "OV0_COLOUR_CNTL", OV0_COLOUR_CNTL, 0 },
208 { "OV0_VID_KEY_CLR", OV0_VID_KEY_CLR, 0 },
209 { "OV0_VID_KEY_MSK", OV0_VID_KEY_MSK, 0 },
210 { "OV0_GRAPHICS_KEY_CLR", OV0_GRAPHICS_KEY_CLR, 0 },
211 { "OV0_GRAPHICS_KEY_MSK", OV0_GRAPHICS_KEY_MSK, 0 },
212 { "OV0_KEY_CNTL", OV0_KEY_CNTL, 0 },
213 { "OV0_TEST", OV0_TEST, 0 },
214 { "OV0_LIN_TRANS_A", OV0_LIN_TRANS_A, 0 },
215 { "OV0_LIN_TRANS_B", OV0_LIN_TRANS_B, 0 },
216 { "OV0_LIN_TRANS_C", OV0_LIN_TRANS_C, 0 },
217 { "OV0_LIN_TRANS_D", OV0_LIN_TRANS_D, 0 },
218 { "OV0_LIN_TRANS_E", OV0_LIN_TRANS_E, 0 },
219 { "OV0_LIN_TRANS_F", OV0_LIN_TRANS_F, 0 },
220 { "OV0_GAMMA_0_F", OV0_GAMMA_0_F, 0 },
221 { "OV0_GAMMA_10_1F", OV0_GAMMA_10_1F, 0 },
222 { "OV0_GAMMA_20_3F", OV0_GAMMA_20_3F, 0 },
223 { "OV0_GAMMA_40_7F", OV0_GAMMA_40_7F, 0 },
224 { "OV0_GAMMA_380_3BF", OV0_GAMMA_380_3BF, 0 },
225 { "OV0_GAMMA_3C0_3FF", OV0_GAMMA_3C0_3FF, 0 }
201 }; 226 };
202 227
203 static uint32_t radeon_vid_in_use = 0; 228 static uint32_t radeon_vid_in_use = 0;
204 229
205 static uint8_t *radeon_mmio_base = 0; 230 static uint8_t *radeon_mmio_base = 0;
303 size_t i; 328 size_t i;
304 for(i=0;i<sizeof(vregs)/sizeof(video_registers_t);i++) 329 for(i=0;i<sizeof(vregs)/sizeof(video_registers_t);i++)
305 OUTREG(vregs[i].name,vregs[i].value); 330 OUTREG(vregs[i].name,vregs[i].value);
306 } 331 }
307 332
333 #ifdef DEBUG
334 static void radeon_vid_dump_regs( void )
335 {
336 size_t i;
337 printk(RVID_MSG"*** Begin of OV0 registers dump ***\n");
338 for(i=0;i<sizeof(vregs)/sizeof(video_registers_t);i++)
339 printk(RVID_MSG"%s = %08X\n",vregs[i].sname,INREG(vregs[i].name));
340 printk(RVID_MSG"*** End of OV0 registers dump ***\n");
341 }
342 #endif
343
308 static void radeon_vid_stop_video( void ) 344 static void radeon_vid_stop_video( void )
309 { 345 {
310 OUTREG(OV0_SCALE_CNTL, SCALER_SOFT_RESET); 346 OUTREG(OV0_SCALE_CNTL, SCALER_SOFT_RESET);
311 OUTREG(OV0_EXCLUSIVE_HORZ, 0); 347 OUTREG(OV0_EXCLUSIVE_HORZ, 0);
312 OUTREG(OV0_AUTO_FLIP_CNTL, 0); /* maybe */ 348 OUTREG(OV0_AUTO_FLIP_CNTL, 0); /* maybe */
316 } 352 }
317 353
318 static void radeon_vid_display_video( void ) 354 static void radeon_vid_display_video( void )
319 { 355 {
320 int bes_flags; 356 int bes_flags;
321 RTRACE(RVID_MSG"OV0: v_inc=%x h_inc=%x step_by=%x\n",besr.v_inc,besr.h_inc,besr.step_by);
322 RTRACE(RVID_MSG"OV0: vid_buf0_base=%x\n",besr.vid_buf0_base_adrs);
323 RTRACE(RVID_MSG"OV0: y_x_start=%x y_x_end=%x blank_at_top=%x pitch0_value=%x\n"
324 ,besr.y_x_start,besr.y_x_end,besr.p1_blank_lines_at_top,besr.vid_buf_pitch0_value);
325 RTRACE(RVID_MSG"OV0: p1_x_start_end=%x p2_x_start_end=%x p3_x_start-end=%x\n"
326 ,besr.p1_x_start_end,besr.p2_x_start_end,besr.p2_x_start_end);
327 RTRACE(RVID_MSG"OV0: p1_v_accum_init=%x p1_h_accum_init=%x p23_h_accum_init=%x\n"
328 ,besr.p1_v_accum_init,besr.p1_h_accum_init,besr.p23_h_accum_init);
329 OUTREG(OV0_REG_LOAD_CNTL, REG_LD_CTL_LOCK); 357 OUTREG(OV0_REG_LOAD_CNTL, REG_LD_CTL_LOCK);
330 while(!(INREG(OV0_REG_LOAD_CNTL)&REG_LD_CTL_LOCK_READBACK)); 358 while(!(INREG(OV0_REG_LOAD_CNTL)&REG_LD_CTL_LOCK_READBACK));
331 359
332 OUTREG(OV0_AUTO_FLIP_CNTL,OV0_AUTO_FLIP_CNTL_SOFT_BUF_ODD); 360 OUTREG(OV0_AUTO_FLIP_CNTL,OV0_AUTO_FLIP_CNTL_SOFT_BUF_ODD);
333 361
374 OUTREG(OV0_P23_H_ACCUM_INIT, besr.p23_h_accum_init); 402 OUTREG(OV0_P23_H_ACCUM_INIT, besr.p23_h_accum_init);
375 OUTREG(OV0_P23_V_ACCUM_INIT, besr.p23_v_accum_init); 403 OUTREG(OV0_P23_V_ACCUM_INIT, besr.p23_v_accum_init);
376 404
377 bes_flags = SCALER_ENABLE | 405 bes_flags = SCALER_ENABLE |
378 SCALER_SMART_SWITCH | 406 SCALER_SMART_SWITCH |
379 SCALER_HORZ_PICK_NEAREST; 407 SCALER_HORZ_PICK_NEAREST;
380 if(besr.double_buff) bes_flags |= SCALER_DOUBLE_BUFFER; 408 if(besr.double_buff) bes_flags |= SCALER_DOUBLE_BUFFER;
381 if(besr.deinterlace_on) bes_flags |= SCALER_ADAPTIVE_DEINT; 409 if(besr.deinterlace_on) bes_flags |= SCALER_ADAPTIVE_DEINT;
382 #ifdef RAGE128 410 #ifdef RAGE128
383 bes_flags |= SCALER_BURST_PER_PLANE; 411 bes_flags |= SCALER_BURST_PER_PLANE;
384 #endif 412 #endif
396 case IMGFMT_IF09: 424 case IMGFMT_IF09:
397 case IMGFMT_YVU9: bes_flags |= SCALER_SOURCE_YUV9; break; 425 case IMGFMT_YVU9: bes_flags |= SCALER_SOURCE_YUV9; break;
398 /* 4:2:0 */ 426 /* 4:2:0 */
399 case IMGFMT_IYUV: 427 case IMGFMT_IYUV:
400 case IMGFMT_I420: 428 case IMGFMT_I420:
401 case IMGFMT_YV12: bes_flags |= SCALER_SOURCE_YUV12; break; 429 case IMGFMT_YV12: bes_flags |= SCALER_SOURCE_YUV12;
430 #ifdef RAGE128
431 bes_flags |= SCALER_Y2R_TEMP | SCALER_PIX_EXPAND;
432 #endif
433 break;
402 /* 4:2:2 */ 434 /* 4:2:2 */
403 case IMGFMT_UYVY: bes_flags |= SCALER_SOURCE_YVYU422; break; 435 case IMGFMT_UYVY: bes_flags |= SCALER_SOURCE_YVYU422; break;
404 case IMGFMT_YUY2: 436 case IMGFMT_YUY2:
405 default: bes_flags |= SCALER_SOURCE_VYUY422; break; 437 default: bes_flags |= SCALER_SOURCE_VYUY422; break;
406 } 438 }
407 RTRACE(RVID_MSG"OV0: SCALER=%x\n",bes_flags);
408 OUTREG(OV0_SCALE_CNTL, bes_flags); 439 OUTREG(OV0_SCALE_CNTL, bes_flags);
409 OUTREG(OV0_REG_LOAD_CNTL, 0); 440 OUTREG(OV0_REG_LOAD_CNTL, 0);
441 #ifdef DEBUG
442 radeon_vid_dump_regs();
443 #endif
410 } 444 }
411 445
412 void radeon_vid_set_color_key(int ckey_on, uint8_t R, uint8_t G, uint8_t B) 446 void radeon_vid_set_color_key(int ckey_on, uint8_t R, uint8_t G, uint8_t B)
413 { 447 {
414 besr.ckey_on = ckey_on; 448 besr.ckey_on = ckey_on;
580 besr.p23_blank_lines_at_top = P23_BLNK_LN_AT_TOP_M1_MASK|((src_h-1)<<16); 614 besr.p23_blank_lines_at_top = P23_BLNK_LN_AT_TOP_M1_MASK|((src_h-1)<<16);
581 } 615 }
582 else besr.p23_blank_lines_at_top = 0; 616 else besr.p23_blank_lines_at_top = 0;
583 besr.vid_buf_pitch0_value = pitch; 617 besr.vid_buf_pitch0_value = pitch;
584 besr.vid_buf_pitch1_value = is_420 ? pitch>>1 : pitch; 618 besr.vid_buf_pitch1_value = is_420 ? pitch>>1 : pitch;
585 RTRACE(RVID_MSG"BES: v_inc=%x h_inc=%x step_by=%x\n",besr.v_inc,besr.h_inc,besr.step_by);
586 RTRACE(RVID_MSG"BES: vid_buf0_basey=%x\n",besr.vid_buf0_base_adrs);
587 RTRACE(RVID_MSG"BES: y_x_start=%x y_x_end=%x blank_at_top=%x pitch0_value=%x\n"
588 ,besr.y_x_start,besr.y_x_end,besr.p1_blank_lines_at_top,besr.vid_buf_pitch0_value);
589 besr.p1_x_start_end = (src_w+left-1)|(left<<16); 619 besr.p1_x_start_end = (src_w+left-1)|(left<<16);
590 src_w>>=1; 620 src_w>>=1;
591 besr.p2_x_start_end = (src_w+left-1)|(leftUV<<16); 621 besr.p2_x_start_end = (src_w+left-1)|(leftUV<<16);
592 besr.p3_x_start_end = besr.p2_x_start_end; 622 besr.p3_x_start_end = besr.p2_x_start_end;
593 return 0; 623 return 0;
643 int frame; 673 int frame;
644 674
645 switch(cmd) 675 switch(cmd)
646 { 676 {
647 case MGA_VID_CONFIG: 677 case MGA_VID_CONFIG:
648 RTRACE( "radeon_mmio_base = %p\n",radeon_mmio_base); 678 RTRACE(RVID_MSG"radeon_mmio_base = %p\n",radeon_mmio_base);
649 RTRACE( "radeon_mem_base = %08x\n",radeon_mem_base); 679 RTRACE(RVID_MSG"radeon_mem_base = %08x\n",radeon_mem_base);
650 RTRACE(RVID_MSG"Received configuration\n"); 680 RTRACE(RVID_MSG"Received configuration\n");
651 681
652 if(copy_from_user(&radeon_config,(mga_vid_config_t*) arg,sizeof(mga_vid_config_t))) 682 if(copy_from_user(&radeon_config,(mga_vid_config_t*) arg,sizeof(mga_vid_config_t)))
653 { 683 {
654 printk(RVID_MSG"failed copy from userspace\n"); 684 printk(RVID_MSG"failed copy from userspace\n");
677 radeon_overlay_off &= 0xffff0000; 707 radeon_overlay_off &= 0xffff0000;
678 if(radeon_overlay_off < 0){ 708 if(radeon_overlay_off < 0){
679 printk(RVID_MSG"not enough video memory. Need: %u has: %u\n",radeon_config.frame_size*radeon_config.num_frames,radeon_ram_size*0x100000); 709 printk(RVID_MSG"not enough video memory. Need: %u has: %u\n",radeon_config.frame_size*radeon_config.num_frames,radeon_ram_size*0x100000);
680 return -EFAULT; 710 return -EFAULT;
681 } 711 }
682 RTRACE(RVID_MSG"using video overlay at offset %p\n",radeon_overlay_off); 712 RTRACE(RVID_MSG"using video overlay at offset %08X\n",radeon_overlay_off);
683 if (copy_to_user((mga_vid_config_t *) arg, &radeon_config, sizeof(mga_vid_config_t))) 713 if (copy_to_user((mga_vid_config_t *) arg, &radeon_config, sizeof(mga_vid_config_t)))
684 { 714 {
685 printk(RVID_MSG"failed copy to userspace\n"); 715 printk(RVID_MSG"failed copy to userspace\n");
686 return -EFAULT; 716 return -EFAULT;
687 } 717 }