summaryrefslogtreecommitdiffstats
path: root/vidix/radeon_vid.c
diff options
context:
space:
mode:
Diffstat (limited to 'vidix/radeon_vid.c')
-rw-r--r--vidix/radeon_vid.c3480
1 files changed, 0 insertions, 3480 deletions
diff --git a/vidix/radeon_vid.c b/vidix/radeon_vid.c
deleted file mode 100644
index ee68653c2c..0000000000
--- a/vidix/radeon_vid.c
+++ /dev/null
@@ -1,3480 +0,0 @@
-/*
- * VIDIX driver for ATI Rage128 and Radeon chipsets.
- *
- * This file is based on sources from
- * GATOS (gatos.sf.net) and X11 (www.xfree86.org)
- *
- * Copyright (C) 2002 Nick Kurshev
- * support for fglrx drivers by Marcel Naziri (zwobbl@zwobbl.de)
- *
- * This file is part of MPlayer.
- *
- * MPlayer is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * MPlayer is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with MPlayer; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#include <inttypes.h>
-
-#include "config.h"
-#include "libavutil/common.h"
-#include "mpbswap.h"
-#include "pci_ids.h"
-#include "pci_names.h"
-#include "vidix.h"
-#include "fourcc.h"
-#include "dha.h"
-#include "radeon.h"
-
-#if !defined(RAGE128) && defined(CONFIG_X11)
-#include <X11/Xlib.h>
-static uint32_t firegl_shift = 0;
-#endif
-
-#ifdef RAGE128
-#define RADEON_MSG "[rage128]"
-#define X_ADJUST 0
-#else
-#define RADEON_MSG "[radeon]"
-#define X_ADJUST (((besr.chip_flags&R_OVL_SHIFT)==R_OVL_SHIFT)?8:0)
-#ifndef RADEON
-#define RADEON
-#endif
-#endif
-
-#define RADEON_ASSERT(msg) printf(RADEON_MSG"################# FATAL:"msg);
-
-#define VERBOSE_LEVEL 0
-static int verbosity = 0;
-typedef struct bes_registers_s
-{
- /* base address of yuv framebuffer */
- uint32_t yuv_base;
- uint32_t fourcc;
- uint32_t surf_id;
- int load_prg_start;
- int horz_pick_nearest;
- int vert_pick_nearest;
- int swap_uv; /* for direct support of bgr fourccs */
- uint32_t dest_bpp;
- /* YUV BES registers */
- uint32_t reg_load_cntl;
- uint32_t h_inc;
- uint32_t step_by;
- uint32_t y_x_start;
- uint32_t y_x_end;
- uint32_t v_inc;
- uint32_t p1_blank_lines_at_top;
- uint32_t p23_blank_lines_at_top;
- uint32_t vid_buf_pitch0_value;
- uint32_t vid_buf_pitch1_value;
- uint32_t p1_x_start_end;
- uint32_t p2_x_start_end;
- uint32_t p3_x_start_end;
- uint32_t base_addr;
- uint32_t vid_buf_base_adrs_y[VID_PLAY_MAXFRAMES];
- uint32_t vid_buf_base_adrs_u[VID_PLAY_MAXFRAMES];
- uint32_t vid_buf_base_adrs_v[VID_PLAY_MAXFRAMES];
- uint32_t vid_nbufs;
-
- uint32_t p1_v_accum_init;
- uint32_t p1_h_accum_init;
- uint32_t p23_v_accum_init;
- uint32_t p23_h_accum_init;
- uint32_t scale_cntl;
- uint32_t exclusive_horz;
- uint32_t auto_flip_cntl;
- uint32_t filter_cntl;
- uint32_t four_tap_coeff[5];
- uint32_t key_cntl;
- uint32_t test;
- /* Configurable stuff */
- int double_buff;
-
- int brightness;
- int saturation;
-
- int ckey_on;
- uint32_t graphics_key_clr;
- uint32_t graphics_key_msk;
- uint32_t ckey_cntl;
- uint32_t merge_cntl;
-
- int deinterlace_on;
- uint32_t deinterlace_pattern;
-
- unsigned chip_flags;
-} bes_registers_t;
-
-typedef struct video_registers_s
-{
- const char * sname;
- uint32_t name;
- uint32_t value;
-}video_registers_t;
-
-static bes_registers_t besr;
-#define DECLARE_VREG(name) { #name, name, 0 }
-static const video_registers_t vregs[] =
-{
- DECLARE_VREG(VIDEOMUX_CNTL),
- DECLARE_VREG(VIPPAD_MASK),
- DECLARE_VREG(VIPPAD1_A),
- DECLARE_VREG(VIPPAD1_EN),
- DECLARE_VREG(VIPPAD1_Y),
- DECLARE_VREG(OV0_Y_X_START),
- DECLARE_VREG(OV0_Y_X_END),
- DECLARE_VREG(OV1_Y_X_START),
- DECLARE_VREG(OV1_Y_X_END),
- DECLARE_VREG(OV0_PIPELINE_CNTL),
- DECLARE_VREG(OV0_EXCLUSIVE_HORZ),
- DECLARE_VREG(OV0_EXCLUSIVE_VERT),
- DECLARE_VREG(OV0_REG_LOAD_CNTL),
- DECLARE_VREG(OV0_SCALE_CNTL),
- DECLARE_VREG(OV0_V_INC),
- DECLARE_VREG(OV0_P1_V_ACCUM_INIT),
- DECLARE_VREG(OV0_P23_V_ACCUM_INIT),
- DECLARE_VREG(OV0_P1_BLANK_LINES_AT_TOP),
- DECLARE_VREG(OV0_P23_BLANK_LINES_AT_TOP),
-#ifdef RADEON
- DECLARE_VREG(OV0_BASE_ADDR),
-#endif
- DECLARE_VREG(OV0_VID_BUF0_BASE_ADRS),
- DECLARE_VREG(OV0_VID_BUF1_BASE_ADRS),
- DECLARE_VREG(OV0_VID_BUF2_BASE_ADRS),
- DECLARE_VREG(OV0_VID_BUF3_BASE_ADRS),
- DECLARE_VREG(OV0_VID_BUF4_BASE_ADRS),
- DECLARE_VREG(OV0_VID_BUF5_BASE_ADRS),
- DECLARE_VREG(OV0_VID_BUF_PITCH0_VALUE),
- DECLARE_VREG(OV0_VID_BUF_PITCH1_VALUE),
- DECLARE_VREG(OV0_AUTO_FLIP_CNTL),
- DECLARE_VREG(OV0_DEINTERLACE_PATTERN),
- DECLARE_VREG(OV0_SUBMIT_HISTORY),
- DECLARE_VREG(OV0_H_INC),
- DECLARE_VREG(OV0_STEP_BY),
- DECLARE_VREG(OV0_P1_H_ACCUM_INIT),
- DECLARE_VREG(OV0_P23_H_ACCUM_INIT),
- DECLARE_VREG(OV0_P1_X_START_END),
- DECLARE_VREG(OV0_P2_X_START_END),
- DECLARE_VREG(OV0_P3_X_START_END),
- DECLARE_VREG(OV0_FILTER_CNTL),
- DECLARE_VREG(OV0_FOUR_TAP_COEF_0),
- DECLARE_VREG(OV0_FOUR_TAP_COEF_1),
- DECLARE_VREG(OV0_FOUR_TAP_COEF_2),
- DECLARE_VREG(OV0_FOUR_TAP_COEF_3),
- DECLARE_VREG(OV0_FOUR_TAP_COEF_4),
- DECLARE_VREG(OV0_FLAG_CNTL),
-#ifdef RAGE128
- DECLARE_VREG(OV0_COLOUR_CNTL),
-#else
- DECLARE_VREG(OV0_SLICE_CNTL),
-#endif
- DECLARE_VREG(OV0_VID_KEY_CLR),
- DECLARE_VREG(OV0_VID_KEY_MSK),
- DECLARE_VREG(OV0_GRAPHICS_KEY_CLR),
- DECLARE_VREG(OV0_GRAPHICS_KEY_MSK),
- DECLARE_VREG(OV0_KEY_CNTL),
- DECLARE_VREG(OV0_TEST),
- DECLARE_VREG(OV0_LIN_TRANS_A),
- DECLARE_VREG(OV0_LIN_TRANS_B),
- DECLARE_VREG(OV0_LIN_TRANS_C),
- DECLARE_VREG(OV0_LIN_TRANS_D),
- DECLARE_VREG(OV0_LIN_TRANS_E),
- DECLARE_VREG(OV0_LIN_TRANS_F),
- DECLARE_VREG(OV0_GAMMA_0_F),
- DECLARE_VREG(OV0_GAMMA_10_1F),
- DECLARE_VREG(OV0_GAMMA_20_3F),
- DECLARE_VREG(OV0_GAMMA_40_7F),
- DECLARE_VREG(OV0_GAMMA_380_3BF),
- DECLARE_VREG(OV0_GAMMA_3C0_3FF),
- DECLARE_VREG(SUBPIC_CNTL),
- DECLARE_VREG(SUBPIC_DEFCOLCON),
- DECLARE_VREG(SUBPIC_Y_X_START),
- DECLARE_VREG(SUBPIC_Y_X_END),
- DECLARE_VREG(SUBPIC_V_INC),
- DECLARE_VREG(SUBPIC_H_INC),
- DECLARE_VREG(SUBPIC_BUF0_OFFSET),
- DECLARE_VREG(SUBPIC_BUF1_OFFSET),
- DECLARE_VREG(SUBPIC_LC0_OFFSET),
- DECLARE_VREG(SUBPIC_LC1_OFFSET),
- DECLARE_VREG(SUBPIC_PITCH),
- DECLARE_VREG(SUBPIC_BTN_HLI_COLCON),
- DECLARE_VREG(SUBPIC_BTN_HLI_Y_X_START),
- DECLARE_VREG(SUBPIC_BTN_HLI_Y_X_END),
- DECLARE_VREG(SUBPIC_PALETTE_INDEX),
- DECLARE_VREG(SUBPIC_PALETTE_DATA),
- DECLARE_VREG(SUBPIC_H_ACCUM_INIT),
- DECLARE_VREG(SUBPIC_V_ACCUM_INIT),
- DECLARE_VREG(IDCT_RUNS),
- DECLARE_VREG(IDCT_LEVELS),
- DECLARE_VREG(IDCT_AUTH_CONTROL),
- DECLARE_VREG(IDCT_AUTH),
- DECLARE_VREG(IDCT_CONTROL),
-#ifdef RAGE128
- DECLARE_VREG(BM_FRAME_BUF_OFFSET),
- DECLARE_VREG(BM_SYSTEM_MEM_ADDR),
- DECLARE_VREG(BM_COMMAND),
- DECLARE_VREG(BM_STATUS),
- DECLARE_VREG(BM_QUEUE_STATUS),
- DECLARE_VREG(BM_QUEUE_FREE_STATUS),
- DECLARE_VREG(BM_CHUNK_0_VAL),
- DECLARE_VREG(BM_CHUNK_1_VAL),
- DECLARE_VREG(BM_VIP0_BUF),
- DECLARE_VREG(BM_VIP0_ACTIVE),
- DECLARE_VREG(BM_VIP1_BUF),
- DECLARE_VREG(BM_VIP1_ACTIVE),
- DECLARE_VREG(BM_VIP2_BUF),
- DECLARE_VREG(BM_VIP2_ACTIVE),
- DECLARE_VREG(BM_VIP3_BUF),
- DECLARE_VREG(BM_VIP3_ACTIVE),
- DECLARE_VREG(BM_VIDCAP_BUF0),
- DECLARE_VREG(BM_VIDCAP_BUF1),
- DECLARE_VREG(BM_VIDCAP_BUF2),
- DECLARE_VREG(BM_VIDCAP_ACTIVE),
- DECLARE_VREG(BM_GUI),
- DECLARE_VREG(BM_ABORT)
-#else
- DECLARE_VREG(DISP_MERGE_CNTL),
- DECLARE_VREG(DMA_GUI_TABLE_ADDR),
- DECLARE_VREG(DMA_GUI_SRC_ADDR),
- DECLARE_VREG(DMA_GUI_DST_ADDR),
- DECLARE_VREG(DMA_GUI_COMMAND),
- DECLARE_VREG(DMA_GUI_STATUS),
- DECLARE_VREG(DMA_GUI_ACT_DSCRPTR),
- DECLARE_VREG(DMA_VID_SRC_ADDR),
- DECLARE_VREG(DMA_VID_DST_ADDR),
- DECLARE_VREG(DMA_VID_COMMAND),
- DECLARE_VREG(DMA_VID_STATUS),
- DECLARE_VREG(DMA_VID_ACT_DSCRPTR),
-#endif
-};
-
-#define R_FAMILY 0x000000FF
-#define R_100 0x00000001
-#define R_120 0x00000002
-#define R_150 0x00000004
-#define R_200 0x00000008
-#define R_250 0x00000010
-#define R_280 0x00000020
-#define R_300 0x00000040
-#define R_350 0x00000080
-#define R_370 0x00000100
-#define R_380 0x00000200
-#define R_420 0x00000400
-#define R_430 0x00000800
-#define R_480 0x00001000
-#define R_OVL_SHIFT 0x01000000
-#define R_INTEGRATED 0x02000000
-#define R_PCIE 0x04000000
-
-typedef struct ati_card_ids_s
-{
- unsigned short id;
- unsigned flags;
-}ati_card_ids_t;
-
-static const ati_card_ids_t 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 */
- { DEVICE_ATI_RAGE_128_PA_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PB_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PC_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PD_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PE_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PF_PRO, 0 },
-/* Rage128 Pro VR */
- { DEVICE_ATI_RAGE_128_PG_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PH_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PI_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PJ_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PK_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PL_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PM_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PN_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PO_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PP_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PQ_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PR_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PS_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PT_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PU_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PV_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PW_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PX_PRO, 0 },
-/* Rage128 GL */
- { DEVICE_ATI_RAGE_128_RE_SG, 0 },
- { DEVICE_ATI_RAGE_128_RF_SG, 0 },
- { DEVICE_ATI_RAGE_128_RG, 0 },
- { DEVICE_ATI_RAGE_128_RK_VR, 0 },
- { DEVICE_ATI_RAGE_128_RL_VR, 0 },
- { DEVICE_ATI_RAGE_128_SE_4X, 0 },
- { DEVICE_ATI_RAGE_128_SF_4X, 0 },
- { DEVICE_ATI_RAGE_128_SG_4X, 0 },
- { DEVICE_ATI_RAGE_128_SH, 0 },
- { DEVICE_ATI_RAGE_128_SK_4X, 0 },
- { DEVICE_ATI_RAGE_128_SL_4X, 0 },
- { DEVICE_ATI_RAGE_128_SM_4X, 0 },
- { DEVICE_ATI_RAGE_128_4X, 0 },
- { DEVICE_ATI_RAGE_128_PRO, 0 },
- { DEVICE_ATI_RAGE_128_PRO2, 0 },
- { DEVICE_ATI_RAGE_128_PRO3, 0 },
-/* these seem to be based on rage 128 instead of mach64 */
- { DEVICE_ATI_RAGE_MOBILITY_M3, 0 },
- { DEVICE_ATI_RAGE_MOBILITY_M32, 0 },
-#else
-/* Radeon1 (indeed: Rage 256 Pro ;) */
- { DEVICE_ATI_RADEON_R100_QD, R_100|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_R100_QE, R_100|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_R100_QF, R_100|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_R100_QG, R_100|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_IGP_320, R_150|R_OVL_SHIFT|R_INTEGRATED },
- { DEVICE_ATI_RADEON_MOBILITY_U1, R_150|R_OVL_SHIFT|R_INTEGRATED },
- { DEVICE_ATI_RADEON_RV100_QY, R_120|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_RV100_QZ, R_120|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_MOBILITY_M7, R_150|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_RV200_LX, R_150|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_MOBILITY_M6, R_120|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_MOBILITY_M62, R_120|R_OVL_SHIFT },
-/* Radeon2 (indeed: Rage 512 Pro ;) */
- { DEVICE_ATI_R200_BB_RADEON, R_200 },
- { DEVICE_ATI_R200_BC_RADEON, R_200 },
- { DEVICE_ATI_RADEON_R200_QH, R_200 },
- { DEVICE_ATI_RADEON_R200_QI, R_200 },
- { DEVICE_ATI_RADEON_R200_QJ, R_200 },
- { DEVICE_ATI_RADEON_R200_QK, R_200 },
- { DEVICE_ATI_RADEON_R200_QL, R_200 },
- { DEVICE_ATI_RADEON_R200_QM, R_200 },
- { DEVICE_ATI_RADEON_R200_QN, R_200 },
- { DEVICE_ATI_RADEON_R200_QO, R_200 },
- { DEVICE_ATI_RADEON_R200_QH2, R_200 },
- { DEVICE_ATI_RADEON_R200_QI2, R_200 },
- { DEVICE_ATI_RADEON_R200_QJ2, R_200 },
- { DEVICE_ATI_RADEON_R200_QK2, R_200 },
- { DEVICE_ATI_RADEON_R200_QL2, R_200 },
- { DEVICE_ATI_RADEON_RV200_QW, R_150|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_RV200_QX, R_150|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_IGP330_340_350,R_200|R_INTEGRATED },
- { DEVICE_ATI_RADEON_IGP_330M_340M_350M,R_200|R_INTEGRATED },
- { DEVICE_ATI_RADEON_RV250_IG, R_250|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_7000_IGP, R_250|R_OVL_SHIFT|R_INTEGRATED },
- { DEVICE_ATI_RADEON_MOBILITY_7000, R_250|R_OVL_SHIFT|R_INTEGRATED },
- { DEVICE_ATI_RADEON_RV250_ID, R_250|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_RV250_IE, R_250|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_RV250_IF, R_250|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_RV250_IG, R_250|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_R250_LD, R_250|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_R250_LE, R_250|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_R250_MOBILITY, R_250|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_R250_LG, R_250|R_OVL_SHIFT },
- { DEVICE_ATI_RV250_RADEON_9000, R_250|R_OVL_SHIFT },
- { DEVICE_ATI_RADEON_RV250_RADEON2, R_250|R_OVL_SHIFT },
- // Only 92006 and 92007 tested to actually require this
- { DEVICE_ATI_RV280_RADEON_9200, R_280|R_OVL_SHIFT },
- { DEVICE_ATI_RV280_RADEON_92002, R_280|R_OVL_SHIFT },
- { DEVICE_ATI_RV280_RADEON_92003, R_280|R_OVL_SHIFT },
- { DEVICE_ATI_RV280_RADEON_92004, R_280|R_OVL_SHIFT },
- { DEVICE_ATI_RV280_RADEON_92005, R_280|R_OVL_SHIFT },
- { DEVICE_ATI_RV280_RADEON_92006, R_280|R_OVL_SHIFT },
- { DEVICE_ATI_RV280_RADEON_92007, R_280|R_OVL_SHIFT },
- { DEVICE_ATI_M9_5C61_RADEON, R_280|R_OVL_SHIFT },
- { DEVICE_ATI_M9_5C63_RADEON, R_280|R_OVL_SHIFT },
-/* Radeon3 (indeed: Rage 1024 Pro ;) */
- { DEVICE_ATI_R300_AG_FIREGL, R_300 },
- { DEVICE_ATI_RADEON_R300_ND, R_300 },
- { DEVICE_ATI_RADEON_R300_NE, R_300 },
- { DEVICE_ATI_RADEON_R300_NG, R_300 },
- { DEVICE_ATI_R300_AD_RADEON, R_300 },
- { DEVICE_ATI_R300_AE_RADEON, R_300 },
- { DEVICE_ATI_R300_AF_RADEON, R_300 },
- { DEVICE_ATI_RADEON_9100_IGP2, R_300|R_OVL_SHIFT|R_INTEGRATED },
- { DEVICE_ATI_RS300M_AGP_RADEON, R_300|R_INTEGRATED },
- { DEVICE_ATI_RS482_RADEON_XPRESS, R_350|R_INTEGRATED },
- { DEVICE_ATI_R350_AH_RADEON, R_350 },
- { DEVICE_ATI_R350_AI_RADEON, R_350 },
- { DEVICE_ATI_R350_AJ_RADEON, R_350 },
- { DEVICE_ATI_R350_AK_FIRE, R_350 },
- { DEVICE_ATI_RADEON_R350_RADEON2, R_350 },
- { DEVICE_ATI_RADEON_R350_RADEON3, R_350 },
- { DEVICE_ATI_RV350_NJ_RADEON, R_350 },
- { DEVICE_ATI_R350_NK_FIRE, R_350 },
- { DEVICE_ATI_RV350_AP_RADEON, R_350 },
- { DEVICE_ATI_RV350_AQ_RADEON, R_350 },
- { DEVICE_ATI_RV350_AR_RADEON, R_350 },
- { DEVICE_ATI_RV350_AS_RADEON, R_350 },
- { DEVICE_ATI_RV350_AT_FIRE, R_350 },
- { DEVICE_ATI_RV350_AU_FIRE, R_350 },
- { DEVICE_ATI_RV350_AV_FIRE, R_350 },
- { DEVICE_ATI_RV350_AW_FIRE, R_350 },
- { DEVICE_ATI_RV350_MOBILITY_RADEON, R_350 },
- { DEVICE_ATI_RV350_NF_RADEON, R_300 },
- { DEVICE_ATI_RV350_NJ_RADEON, R_300 },
- { DEVICE_ATI_RV350_AS_RADEON2, R_350 },
- { DEVICE_ATI_M10_NQ_RADEON, R_350 },
- { DEVICE_ATI_M10_NQ_RADEON2, R_350 },
- { DEVICE_ATI_RV350_MOBILITY_RADEON2, R_350 },
- { DEVICE_ATI_M10_NS_RADEON, R_350 },
- { DEVICE_ATI_M10_NT_FIREGL, R_350 },
- { DEVICE_ATI_M11_NV_FIREGL, R_350 },
- { DEVICE_ATI_RV370_5B60_RADEON, R_370|R_PCIE },
- { DEVICE_ATI_RV370_SAPPHIRE_X550, R_370 },
- { DEVICE_ATI_RV370_5B64_FIREGL, R_370|R_PCIE },
- { DEVICE_ATI_RV370_5B65_FIREGL, R_370|R_PCIE },
- { DEVICE_ATI_M24_1P_RADEON, R_370 },
- { DEVICE_ATI_M22_RADEON_MOBILITY, R_370 },
- { DEVICE_ATI_M24_1T_FIREGL, R_370 },
- { DEVICE_ATI_M24_RADEON_MOBILITY, R_370 },
- { DEVICE_ATI_RV370_RADEON_X300SE, R_370 },
- { DEVICE_ATI_RV370_SECONDARY_SAPPHIRE, R_370 },
- { DEVICE_ATI_RV370_5B64_FIREGL2, R_370 },
- { DEVICE_ATI_RV380_0X3E50_RADEON, R_380|R_PCIE },
- { DEVICE_ATI_RV380_0X3E54_FIREGL, R_380|R_PCIE },
- { DEVICE_ATI_RV380_RADEON_X600, R_380|R_PCIE },
- { DEVICE_ATI_RV380_RADEON_X6002, R_380 },
- { DEVICE_ATI_RV380_RADEON_X6003, R_380 },
- { DEVICE_ATI_RV410_FIREGL_V5000, R_420 },
- { DEVICE_ATI_RV410_FIREGL_V3300, R_420 },
- { DEVICE_ATI_RV410_RADEON_X700XT, R_420 },
- { DEVICE_ATI_RV410_RADEON_X700, R_420|R_PCIE },
- { DEVICE_ATI_RV410_RADEON_X700SE, R_420 },
- { DEVICE_ATI_RV410_RADEON_X7002, R_420|R_PCIE },
- { DEVICE_ATI_RV410_RADEON_X7003, R_420 },
- { DEVICE_ATI_RV410_RADEON_X7004, R_420|R_PCIE },
- { DEVICE_ATI_RV410_RADEON_X7005, R_420|R_PCIE },
- { DEVICE_ATI_M26_MOBILITY_FIREGL, R_420 },
- { DEVICE_ATI_M26_MOBILITY_FIREGL2, R_420 },
- { DEVICE_ATI_M26_RADEON_MOBILITY, R_420 },
- { DEVICE_ATI_M26_RADEON_MOBILITY2, R_420 },
- { DEVICE_ATI_RADEON_MOBILITY_X700, R_420 },
- { DEVICE_ATI_R420_JH_RADEON, R_420|R_PCIE },
- { DEVICE_ATI_R420_JI_RADEON, R_420|R_PCIE },
- { DEVICE_ATI_R420_JJ_RADEON, R_420|R_PCIE },
- { DEVICE_ATI_R420_JK_RADEON, R_420|R_PCIE },
- { DEVICE_ATI_R420_JL_RADEON, R_420|R_PCIE },
- { DEVICE_ATI_R420_JM_FIREGL, R_420|R_PCIE },
- { DEVICE_ATI_M18_JN_RADEON, R_420|R_PCIE },
- { DEVICE_ATI_R420_JP_RADEON, R_420|R_PCIE },
- { DEVICE_ATI_R420_RADEON_X800, R_420|R_PCIE },
- { DEVICE_ATI_R420_RADEON_X8002, R_420|R_PCIE },
- { DEVICE_ATI_R420_RADEON_X8003, R_420|R_PCIE },
- { DEVICE_ATI_R420_RADEON_X8004, R_420|R_PCIE },
- { DEVICE_ATI_R420_RADEON_X8005, R_420|R_PCIE },
- { DEVICE_ATI_R420_JM_FIREGL, R_420|R_PCIE },
- { DEVICE_ATI_R423_5F57_RADEON, R_420|R_PCIE },
- { DEVICE_ATI_R423_5F57_RADEON2, R_420|R_PCIE },
- { DEVICE_ATI_R423_UH_RADEON, R_420|R_PCIE },
- { DEVICE_ATI_R423_UI_RADEON, R_420|R_PCIE },
- { DEVICE_ATI_R423_UJ_RADEON, R_420|R_PCIE },
- { DEVICE_ATI_R423_UK_RADEON, R_420|R_PCIE },
- { DEVICE_ATI_R423_FIRE_GL, R_420|R_PCIE },
- { DEVICE_ATI_R423_UQ_FIREGL, R_420|R_PCIE },
- { DEVICE_ATI_R423_UR_FIREGL, R_420|R_PCIE },
- { DEVICE_ATI_R423_UT_FIREGL, R_420|R_PCIE },
- { DEVICE_ATI_R423_UI_RADEON2, R_420|R_PCIE },
- { DEVICE_ATI_R423GL_SE_ATI_FIREGL, R_420|R_PCIE },
- { DEVICE_ATI_R423_RADEON_X800XT, R_420|R_PCIE },
- { DEVICE_ATI_RADEON_R423_UK, R_420|R_PCIE },
- { DEVICE_ATI_M28_RADEON_MOBILITY, R_420 },
- { DEVICE_ATI_M28_MOBILITY_FIREGL, R_420 },
- { DEVICE_ATI_MOBILITY_RADEON_X800, R_420 },
- { DEVICE_ATI_R430_RADEON_X800, R_430|R_PCIE },
- { DEVICE_ATI_R430_RADEON_X8002, R_430|R_PCIE },
- { DEVICE_ATI_R430_RADEON_X8003, R_430|R_PCIE },
- { DEVICE_ATI_R430_RADEON_X8004, R_430|R_PCIE },
- { DEVICE_ATI_R480_RADEON_X800, R_480 },
- { DEVICE_ATI_R480_RADEON_X8002, R_480 },
- { DEVICE_ATI_R480_RADEON_X850XT, R_480 },
- { DEVICE_ATI_R480_RADEON_X850PRO, R_480 },
- { DEVICE_ATI_R481_RADEON_X850XT_PE, R_480|R_PCIE },
- { DEVICE_ATI_R480_RADEON_X850XT2, R_480 },
- { DEVICE_ATI_R480_RADEON_X850PRO2, R_480 },
- { DEVICE_ATI_R481_RADEON_X850XT_PE2, R_480|R_PCIE },
- { DEVICE_ATI_R480_RADEON_X850XT3, R_480|R_PCIE },
- { DEVICE_ATI_R480_RADEON_X850XT4, R_480|R_PCIE },
- { DEVICE_ATI_R480_RADEON_X850XT5, R_480|R_PCIE },
- { DEVICE_ATI_R480_RADEON_X850XT6, R_480|R_PCIE },
-#endif
-};
-
-
-static void * radeon_mmio_base = 0;
-static void * radeon_mem_base = 0;
-static int32_t radeon_overlay_off = 0;
-static uint32_t radeon_ram_size = 0;
-
-#define GETREG(TYPE,PTR,OFFZ) (*((volatile TYPE*)((PTR)+(OFFZ))))
-#define SETREG(TYPE,PTR,OFFZ,VAL) (*((volatile TYPE*)((PTR)+(OFFZ))))=VAL
-
-#define INREG8(addr) GETREG(uint8_t,(uint8_t *)(radeon_mmio_base),addr)
-#define OUTREG8(addr,val) SETREG(uint8_t,(uint8_t *)(radeon_mmio_base),addr,val)
-static inline uint32_t INREG (uint32_t addr) {
- uint32_t tmp = GETREG(uint32_t,(uint8_t *)(radeon_mmio_base),addr);
- return le2me_32(tmp);
-}
-#define OUTREG(addr,val) SETREG(uint32_t,(uint8_t *)(radeon_mmio_base),addr,le2me_32(val))
-#define OUTREGP(addr,val,mask) \
- do { \
- unsigned int _tmp = INREG(addr); \
- _tmp &= (mask); \
- _tmp |= (val); \
- OUTREG(addr, _tmp); \
- } while (0)
-
-static __inline__ uint32_t INPLL(uint32_t addr)
-{
- OUTREG8(CLOCK_CNTL_INDEX, addr & 0x0000001f);
- return INREG(CLOCK_CNTL_DATA);
-}
-
-#define OUTPLL(addr,val) OUTREG8(CLOCK_CNTL_INDEX, (addr & 0x0000001f) | 0x00000080); \
- OUTREG(CLOCK_CNTL_DATA, val)
-#define OUTPLLP(addr,val,mask) \
- do { \
- unsigned int _tmp = INPLL(addr); \
- _tmp &= (mask); \
- _tmp |= (val); \
- OUTPLL(addr, _tmp); \
- } while (0)
-
-#ifndef RAGE128
-enum 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;
- }
-}
-#endif
-
-static uint32_t radeon_vid_get_dbpp( void )
-{
- uint32_t dbpp,retval;
- dbpp = (INREG(CRTC_GEN_CNTL)>>8)& 0xF;
- switch(dbpp)
- {
- case DST_8BPP: retval = 8; break;
- case DST_15BPP: retval = 15; break;
- case DST_16BPP: retval = 16; break;
- case DST_24BPP: retval = 24; break;
- default: retval=32; break;
- }
- return retval;
-}
-
-static int radeon_is_dbl_scan( void )
-{
- return (INREG(CRTC_GEN_CNTL))&CRTC_DBL_SCAN_EN;
-}
-
-static int radeon_is_interlace( void )
-{
- return (INREG(CRTC_GEN_CNTL))&CRTC_INTERLACE_EN;
-}
-
-static uint32_t radeon_get_xres( void )
-{
- uint32_t xres,h_total;
-#ifndef RAGE128
- if(rinfo.hasCRTC2 &&
- (rinfo.dviDispType == MT_CTV || rinfo.dviDispType == MT_STV))
- h_total = INREG(CRTC2_H_TOTAL_DISP);
- else
-#endif
- h_total = INREG(CRTC_H_TOTAL_DISP);
- xres = (h_total >> 16) & 0xffff;
- return (xres + 1)*8;
-}
-
-static uint32_t radeon_get_yres( void )
-{
- uint32_t yres,v_total;
-#ifndef RAGE128
- if(rinfo.hasCRTC2 &&
- (rinfo.dviDispType == MT_CTV || rinfo.dviDispType == MT_STV))
- v_total = INREG(CRTC2_V_TOTAL_DISP);
- else
-#endif
- v_total = INREG(CRTC_V_TOTAL_DISP);
- yres = (v_total >> 16) & 0xffff;
- return yres + 1;
-}
-
-static void radeon_wait_vsync(void)
-{
- int i;
-
- OUTREG(GEN_INT_STATUS, VSYNC_INT_AK);
- for (i = 0; i < 2000000; i++)
- {
- if (INREG(GEN_INT_STATUS) & VSYNC_INT) break;
- }
-}
-
-#ifdef RAGE128
-static void _radeon_engine_idle(void);
-static void _radeon_fifo_wait(unsigned);
-#define radeon_engine_idle() _radeon_engine_idle()
-#define radeon_fifo_wait(entries) _radeon_fifo_wait(entries)
-/* Flush all dirty data in the Pixel Cache to memory. */
-static __inline__ void radeon_engine_flush ( void )
-{
- unsigned i;
-
- OUTREGP(PC_NGUI_CTLSTAT, PC_FLUSH_ALL, ~PC_FLUSH_ALL);
- for (i = 0; i < 2000000; i++) {
- if (!(INREG(PC_NGUI_CTLSTAT) & PC_BUSY)) break;
- }
-}
-
-/* Reset graphics card to known state. */
-static void radeon_engine_reset( void )
-{
- uint32_t clock_cntl_index;
- uint32_t mclk_cntl;
- uint32_t gen_reset_cntl;
-
- radeon_engine_flush();
-
- clock_cntl_index = INREG(CLOCK_CNTL_INDEX);
- mclk_cntl = INPLL(MCLK_CNTL);
-
- OUTPLL(MCLK_CNTL, mclk_cntl | FORCE_GCP | FORCE_PIPE3D_CP);
-
- gen_reset_cntl = INREG(GEN_RESET_CNTL);
-
- OUTREG(GEN_RESET_CNTL, gen_reset_cntl | SOFT_RESET_GUI);
- INREG(GEN_RESET_CNTL);
- OUTREG(GEN_RESET_CNTL,
- gen_reset_cntl & (uint32_t)(~SOFT_RESET_GUI));
- INREG(GEN_RESET_CNTL);
-
- OUTPLL(MCLK_CNTL, mclk_cntl);
- OUTREG(CLOCK_CNTL_INDEX, clock_cntl_index);
- OUTREG(GEN_RESET_CNTL, gen_reset_cntl);
-}
-#else
-
-static __inline__ void radeon_engine_flush ( void )
-{
- int i;
-
- /* initiate flush */
- OUTREGP(RB2D_DSTCACHE_CTLSTAT, RB2D_DC_FLUSH_ALL,
- ~RB2D_DC_FLUSH_ALL);
-
- for (i=0; i < 2000000; i++) {
- if (!(INREG(RB2D_DSTCACHE_CTLSTAT) & RB2D_DC_BUSY))
- break;
- }
-}
-
-static void _radeon_engine_idle(void);
-static void _radeon_fifo_wait(unsigned);
-#define radeon_engine_idle() _radeon_engine_idle()
-#define radeon_fifo_wait(entries) _radeon_fifo_wait(entries)
-
-static void radeon_engine_reset( void )
-{
- uint32_t clock_cntl_index, mclk_cntl, rbbm_soft_reset;
-
- radeon_engine_flush ();
-
- clock_cntl_index = INREG(CLOCK_CNTL_INDEX);
- mclk_cntl = INPLL(MCLK_CNTL);
-
- OUTPLL(MCLK_CNTL, (mclk_cntl |
- FORCEON_MCLKA |
- FORCEON_MCLKB |
- FORCEON_YCLKA |
- FORCEON_YCLKB |
- FORCEON_MC |
- FORCEON_AIC));
- rbbm_soft_reset = INREG(RBBM_SOFT_RESET);
-
- OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset |
- SOFT_RESET_CP |
- SOFT_RESET_HI |
- SOFT_RESET_SE |
- SOFT_RESET_RE |
- SOFT_RESET_PP |
- SOFT_RESET_E2 |
- SOFT_RESET_RB |
- SOFT_RESET_HDP);
- INREG(RBBM_SOFT_RESET);
- OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset & (uint32_t)
- ~(SOFT_RESET_CP |
- SOFT_RESET_HI |
- SOFT_RESET_SE |
- SOFT_RESET_RE |
- SOFT_RESET_PP |
- SOFT_RESET_E2 |
- SOFT_RESET_RB |
- SOFT_RESET_HDP));
- INREG(RBBM_SOFT_RESET);
-
- OUTPLL(MCLK_CNTL, mclk_cntl);
- OUTREG(CLOCK_CNTL_INDEX, clock_cntl_index);
- OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset);
-
- return;
-}
-#endif
-static void radeon_engine_restore( void )
-{
-#ifndef RAGE128
- int pitch64;
- uint32_t xres,yres,bpp;
- radeon_fifo_wait(1);
- xres = radeon_get_xres();
- yres = radeon_get_yres();
- bpp = radeon_vid_get_dbpp();
- /* turn of all automatic flushing - we'll do it all */
- OUTREG(RB2D_DSTCACHE_MODE, 0);
-
- pitch64 = ((xres * (bpp / 8) + 0x3f)) >> 6;
-
- radeon_fifo_wait(1);
- OUTREG(DEFAULT_OFFSET, (INREG(DEFAULT_OFFSET) & 0xC0000000) |
- (pitch64 << 22));
-
- radeon_fifo_wait(1);
-#if HAVE_BIGENDIAN
- OUTREGP(DP_DATATYPE,
- HOST_BIG_ENDIAN_EN, ~HOST_BIG_ENDIAN_EN);
-#else
- OUTREGP(DP_DATATYPE, 0, ~HOST_BIG_ENDIAN_EN);
-#endif
-
- radeon_fifo_wait(1);
- OUTREG(DEFAULT_SC_BOTTOM_RIGHT, (DEFAULT_SC_RIGHT_MAX
- | DEFAULT_SC_BOTTOM_MAX));
- radeon_fifo_wait(1);
- OUTREG(DP_GUI_MASTER_CNTL, (INREG(DP_GUI_MASTER_CNTL)
- | GMC_BRUSH_SOLID_COLOR
- | GMC_SRC_DATATYPE_COLOR));
-
- radeon_fifo_wait(7);
- OUTREG(DST_LINE_START, 0);
- OUTREG(DST_LINE_END, 0);
- OUTREG(DP_BRUSH_FRGD_CLR, 0xffffffff);
- OUTREG(DP_BRUSH_BKGD_CLR, 0x00000000);
- OUTREG(DP_SRC_FRGD_CLR, 0xffffffff);
- OUTREG(DP_SRC_BKGD_CLR, 0x00000000);
- OUTREG(DP_WRITE_MASK, 0xffffffff);
-
- radeon_engine_idle();
-#endif
-}
-#ifdef RAGE128
-static void _radeon_fifo_wait (unsigned entries)
-{
- unsigned i;
-
- for(;;)
- {
- for (i=0; i<2000000; i++)
- if ((INREG(GUI_STAT) & GUI_FIFOCNT_MASK) >= entries)
- return;
- radeon_engine_reset();
- radeon_engine_restore();
- }
-}
-
-static void _radeon_engine_idle ( void )
-{
- unsigned i;
-
- /* ensure FIFO is empty before waiting for idle */
- radeon_fifo_wait (64);
- for(;;)
- {
- for (i=0; i<2000000; i++) {
- if ((INREG(GUI_STAT) & GUI_ACTIVE) == 0) {
- radeon_engine_flush ();
- return;
- }
- }
- radeon_engine_reset();
- radeon_engine_restore();
- }
-}
-#else
-static void _radeon_fifo_wait (unsigned entries)
-{
- unsigned i;
-
- for(;;)
- {
- for (i=0; i<2000000; i++)
- if ((INREG(RBBM_STATUS) & RBBM_FIFOCNT_MASK) >= entries)
- return;
- radeon_engine_reset();
- radeon_engine_restore();
- }
-}
-static void _radeon_engine_idle ( void )
-{
- int i;
-
- /* ensure FIFO is empty before waiting for idle */
- radeon_fifo_wait (64);
- for(;;)
- {
- for (i=0; i<2000000; i++) {
- if (((INREG(RBBM_STATUS) & RBBM_ACTIVE)) == 0) {
- radeon_engine_flush ();
- return;
- }
- }
- radeon_engine_reset();
- radeon_engine_restore();
- }
-}
-#endif
-
-#ifndef RAGE128
-/* Reference color space transform data */
-typedef struct tagREF_TRANSFORM
-{
- float RefLuma;
- float RefRCb;
- float RefRCr;
- float RefGCb;
- float RefGCr;
- float RefBCb;
- float RefBCr;
-} REF_TRANSFORM;
-
-/* Parameters for ITU-R BT.601 and ITU-R BT.709 colour spaces */
-static const REF_TRANSFORM trans[2] =
-{
- {1.1678, 0.0, 1.6007, -0.3929, -0.8154, 2.0232, 0.0}, /* BT.601 */
- {1.1678, 0.0, 1.7980, -0.2139, -0.5345, 2.1186, 0.0} /* BT.709 */
-};
-/****************************************************************************
- * SetTransform *
- * Function: Calculates and sets color space transform from supplied *
- * reference transform, gamma, brightness, contrast, hue and *
- * saturation. *
- * Inputs: bright - brightness *
- * cont - contrast *
- * sat - saturation *
- * hue - hue *
- * red_intensity - intense of red component *
- * green_intensity - intense of green component *
- * blue_intensity - intense of blue component *
- * ref - index to the table of refernce transforms *
- * Outputs: NONE *
- ****************************************************************************/
-
-static void radeon_set_transform(float bright, float cont, float sat,
- float hue, float red_intensity,
- float green_intensity,float blue_intensity,
- unsigned ref)
-{
- float OvHueSin, OvHueCos;
- float CAdjLuma, CAdjOff;
- float RedAdj,GreenAdj,BlueAdj;
- float CAdjRCb, CAdjRCr;
- float CAdjGCb, CAdjGCr;
- float CAdjBCb, CAdjBCr;
- float OvLuma, OvROff, OvGOff, OvBOff;
- float OvRCb, OvRCr;
- float OvGCb, OvGCr;
- float OvBCb, OvBCr;
- float Loff = 64.0;
- float Coff = 512.0f;
-
- uint32_t dwOvLuma, dwOvROff, dwOvGOff, dwOvBOff;
- uint32_t dwOvRCb, dwOvRCr;
- uint32_t dwOvGCb, dwOvGCr;
- uint32_t dwOvBCb, dwOvBCr;
-
- if (ref >= 2) return;
-
- OvHueSin = sin((double)hue);
- OvHueCos = cos((double)hue);
-
- CAdjLuma = cont * trans[ref].RefLuma;
- CAdjOff = cont * trans[ref].RefLuma * bright * 1023.0;
- RedAdj = cont * trans[ref].RefLuma * red_intensity * 1023.0;
- GreenAdj = cont * trans[ref].RefLuma * green_intensity * 1023.0;
- BlueAdj = cont * trans[ref].RefLuma * blue_intensity * 1023.0;
-
- CAdjRCb = sat * -OvHueSin * trans[ref].RefRCr;
- CAdjRCr = sat * OvHueCos * trans[ref].RefRCr;
- CAdjGCb = sat * (OvHueCos * trans[ref].RefGCb - OvHueSin * trans[ref].RefGCr);
- CAdjGCr = sat * (OvHueSin * trans[ref].RefGCb + OvHueCos * trans[ref].RefGCr);
- CAdjBCb = sat * OvHueCos * trans[ref].RefBCb;
- CAdjBCr = sat * OvHueSin * trans[ref].RefBCb;
-
- OvLuma = CAdjLuma;
- OvRCb = CAdjRCb;
- OvRCr = CAdjRCr;
- OvGCb = CAdjGCb;
- OvGCr = CAdjGCr;
- OvBCb = CAdjBCb;
- OvBCr = CAdjBCr;
- OvROff = RedAdj + CAdjOff -
- OvLuma * Loff - (OvRCb + OvRCr) * Coff;
- OvGOff = GreenAdj + CAdjOff -
- OvLuma * Loff - (OvGCb + OvGCr) * Coff;
- OvBOff = BlueAdj + CAdjOff -
- OvLuma * Loff - (OvBCb + OvBCr) * Coff;
-
- dwOvROff = ((int)(OvROff * 2.0)) & 0x1fff;
- dwOvGOff = (int)(OvGOff * 2.0) & 0x1fff;
- dwOvBOff = (int)(OvBOff * 2.0) & 0x1fff;
- /* Whatever docs say about R200 having 3.8 format instead of 3.11
- as in Radeon is a lie */
-
- dwOvLuma =(((int)(OvLuma * 2048.0))&0x7fff)<<17;
- dwOvRCb = (((int)(OvRCb * 2048.0))&0x7fff)<<1;
- dwOvRCr = (((int)(OvRCr * 2048.0))&0x7fff)<<17;
- dwOvGCb = (((int)(OvGCb * 2048.0))&0x7fff)<<1;
- dwOvGCr = (((int)(OvGCr * 2048.0))&0x7fff)<<17;
- dwOvBCb = (((int)(OvBCb * 2048.0))&0x7fff)<<1;
- dwOvBCr = (((int)(OvBCr * 2048.0))&0x7fff)<<17;
-
- OUTREG(OV0_LIN_TRANS_A, dwOvRCb | dwOvLuma);
- OUTREG(OV0_LIN_TRANS_B, dwOvROff | dwOvRCr);
- OUTREG(OV0_LIN_TRANS_C, dwOvGCb | dwOvLuma);
- OUTREG(OV0_LIN_TRANS_D, dwOvGOff | dwOvGCr);
- OUTREG(OV0_LIN_TRANS_E, dwOvBCb | dwOvLuma);
- OUTREG(OV0_LIN_TRANS_F, dwOvBOff | dwOvBCr);
-}
-
-/* Gamma curve definition */
-typedef struct
-{
- unsigned int gammaReg;
- unsigned int gammaSlope;
- unsigned int gammaOffset;
-}GAMMA_SETTINGS;
-
-/* Recommended gamma curve parameters */
-static const GAMMA_SETTINGS r200_def_gamma[18] =
-{
- {OV0_GAMMA_0_F, 0x100, 0x0000},
- {OV0_GAMMA_10_1F, 0x100, 0x0020},
- {OV0_GAMMA_20_3F, 0x100, 0x0040},
- {OV0_GAMMA_40_7F, 0x100, 0x0080},
- {OV0_GAMMA_80_BF, 0x100, 0x0100},
- {OV0_GAMMA_C0_FF, 0x100, 0x0100},
- {OV0_GAMMA_100_13F, 0x100, 0x0200},
- {OV0_GAMMA_140_17F, 0x100, 0x0200},
- {OV0_GAMMA_180_1BF, 0x100, 0x0300},
- {OV0_GAMMA_1C0_1FF, 0x100, 0x0300},
- {OV0_GAMMA_200_23F, 0x100, 0x0400},
- {OV0_GAMMA_240_27F, 0x100, 0x0400},
- {OV0_GAMMA_280_2BF, 0x100, 0x0500},
- {OV0_GAMMA_2C0_2FF, 0x100, 0x0500},
- {OV0_GAMMA_300_33F, 0x100, 0x0600},
- {OV0_GAMMA_340_37F, 0x100, 0x0600},
- {OV0_GAMMA_380_3BF, 0x100, 0x0700},
- {OV0_GAMMA_3C0_3FF, 0x100, 0x0700}
-};
-
-static const GAMMA_SETTINGS r100_def_gamma[6] =
-{
- {OV0_GAMMA_0_F, 0x100, 0x0000},
- {OV0_GAMMA_10_1F, 0x100, 0x0020},
- {OV0_GAMMA_20_3F, 0x100, 0x0040},
- {OV0_GAMMA_40_7F, 0x100, 0x0080},
- {OV0_GAMMA_380_3BF, 0x100, 0x0100},
- {OV0_GAMMA_3C0_3FF, 0x100, 0x0100}
-};
-
-static void make_default_gamma_correction( void )
-{
- size_t i;
- if((besr.chip_flags & R_100)==R_100||