2008-06-07 10:25:07 +00:00
|
|
|
/*
|
|
|
|
* S3 chipsets registers definition.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2004 Reza Jelveh
|
|
|
|
* Thanks to Alex Deucher for Support
|
|
|
|
* Trio/Virge support by Michael Kostylev
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
2008-02-29 20:02:37 +00:00
|
|
|
#ifndef MPLAYER_SAVAGE_REGS_H
|
|
|
|
#define MPLAYER_SAVAGE_REGS_H
|
2008-02-29 20:01:28 +00:00
|
|
|
|
|
|
|
#define S3_SAVAGE3D_SERIES(chip) ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE_MX))
|
|
|
|
#define S3_SAVAGE4_SERIES(chip) ((chip==S3_SAVAGE4) || (chip==S3_PROSAVAGE))
|
|
|
|
#define S3_SAVAGE_MOBILE_SERIES(chip) ((chip==S3_SAVAGE_MX) || (chip==S3_SUPERSAVAGE))
|
|
|
|
#define S3_SAVAGE_SERIES(chip) ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE2000))
|
|
|
|
|
2009-07-06 23:26:13 +00:00
|
|
|
/*
|
|
|
|
* Chip tags. These are used to group the adapters into
|
2008-02-29 20:01:28 +00:00
|
|
|
* related families.
|
|
|
|
*/
|
|
|
|
enum S3CHIPTAGS {
|
|
|
|
S3_UNKNOWN = 0,
|
|
|
|
S3_TRIO64V,
|
|
|
|
S3_VIRGE,
|
|
|
|
S3_SAVAGE3D,
|
|
|
|
S3_SAVAGE_MX,
|
|
|
|
S3_SAVAGE4,
|
|
|
|
S3_PROSAVAGE,
|
|
|
|
S3_SUPERSAVAGE,
|
|
|
|
S3_SAVAGE2000,
|
|
|
|
S3_LAST
|
|
|
|
};
|
|
|
|
|
|
|
|
#define BIOS_BSIZE 1024
|
|
|
|
#define BIOS_BASE 0xc0000
|
|
|
|
|
|
|
|
#define S3_NEWMMIO_REGBASE 0x1000000 /* 16MB */
|
|
|
|
#define S3_NEWMMIO_REGSIZE 0x0010000 /* 64KB */
|
|
|
|
#define S3_NEWMMIO_REGSIZE_SAVAGE 0x0080000 /* 512KB */
|
|
|
|
|
2009-07-06 23:26:13 +00:00
|
|
|
#define BASE_FREQ 14.31818
|
2008-02-29 20:01:28 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* There are two different streams engines used in the S3 line.
|
|
|
|
* The old engine is in the Trio64, Virge,
|
|
|
|
* Savage3D, Savage4, SavagePro, and SavageTwister.
|
|
|
|
* The new engine is in the Savage2000, SavageMX,
|
|
|
|
* SavageIX, and SuperSavage.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Old engine registers */
|
|
|
|
#define PSTREAM_CONTROL_REG 0x8180
|
|
|
|
#define COL_CHROMA_KEY_CONTROL_REG 0x8184
|
|
|
|
#define SSTREAM_CONTROL_REG 0x8190
|
|
|
|
#define CHROMA_KEY_UPPER_BOUND_REG 0x8194
|
|
|
|
#define SSTREAM_STRETCH_REG 0x8198
|
|
|
|
#define COLOR_ADJUSTMENT_REG 0x819C
|
|
|
|
#define BLEND_CONTROL_REG 0x81A0
|
|
|
|
#define PSTREAM_FBADDR0_REG 0x81C0
|
|
|
|
#define PSTREAM_FBADDR1_REG 0x81C4
|
|
|
|
#define PSTREAM_STRIDE_REG 0x81C8
|
|
|
|
#define DOUBLE_BUFFER_REG 0x81CC
|
|
|
|
#define SSTREAM_FBADDR0_REG 0x81D0
|
|
|
|
#define SSTREAM_FBADDR1_REG 0x81D4
|
|
|
|
#define SSTREAM_STRIDE_REG 0x81D8
|
|
|
|
#define OPAQUE_OVERLAY_CONTROL_REG 0x81DC
|
|
|
|
#define K1_VSCALE_REG 0x81E0
|
|
|
|
#define SSTREAM_VSCALE_REG 0x81E0
|
|
|
|
#define K2_VSCALE_REG 0x81E4
|
|
|
|
#define SSTREAM_VINITIAL_REG 0x81E4
|
|
|
|
#define DDA_VERT_REG 0x81E8
|
|
|
|
#define SSTREAM_LINES_REG 0x81E8
|
|
|
|
#define STREAMS_FIFO_REG 0x81EC
|
|
|
|
#define PSTREAM_WINDOW_START_REG 0x81F0
|
|
|
|
#define PSTREAM_WINDOW_SIZE_REG 0x81F4
|
|
|
|
#define SSTREAM_WINDOW_START_REG 0x81F8
|
|
|
|
#define SSTREAM_WINDOW_SIZE_REG 0x81FC
|
|
|
|
#define FIFO_CONTROL 0x8200
|
|
|
|
#define PSTREAM_FBSIZE_REG 0x8300
|
|
|
|
#define SSTREAM_FBSIZE_REG 0x8304
|
|
|
|
#define SSTREAM_FBADDR2_REG 0x8308
|
|
|
|
|
|
|
|
/* New engine registers */
|
|
|
|
#define PRI_STREAM_FBUF_ADDR0 0x81c0
|
|
|
|
#define PRI_STREAM_FBUF_ADDR1 0x81c4
|
|
|
|
#define PRI_STREAM_STRIDE 0x81c8
|
|
|
|
#define PRI_STREAM_BUFFERSIZE 0x8214
|
|
|
|
#define SEC_STREAM_CKEY_LOW 0x8184
|
|
|
|
#define SEC_STREAM_CKEY_UPPER 0x8194
|
|
|
|
#define BLEND_CONTROL 0x8190
|
|
|
|
#define SEC_STREAM_COLOR_CONVERT1 0x8198
|
|
|
|
#define SEC_STREAM_COLOR_CONVERT2 0x819c
|
|
|
|
#define SEC_STREAM_COLOR_CONVERT3 0x81e4
|
|
|
|
#define SEC_STREAM_HSCALING 0x81a0
|
|
|
|
#define SEC_STREAM_BUFFERSIZE 0x81a8
|
|
|
|
#define SEC_STREAM_HSCALE_NORMALIZE 0x81ac
|
|
|
|
#define SEC_STREAM_VSCALING 0x81e8
|
|
|
|
#define SEC_STREAM_FBUF_ADDR0 0x81d0
|
|
|
|
#define SEC_STREAM_FBUF_ADDR1 0x81d4
|
|
|
|
#define SEC_STREAM_FBUF_ADDR2 0x81ec
|
|
|
|
#define SEC_STREAM_STRIDE 0x81d8
|
|
|
|
#define SEC_STREAM_WINDOW_START 0x81f8
|
|
|
|
#define SEC_STREAM_WINDOW_SZ 0x81fc
|
|
|
|
#define SEC_STREAM_TILE_OFF 0x821c
|
|
|
|
#define SEC_STREAM_OPAQUE_OVERLAY 0x81dc
|
|
|
|
|
|
|
|
/* Savage 2000 registers */
|
|
|
|
#define SEC_STREAM_COLOR_CONVERT0_2000 0x8198
|
|
|
|
#define SEC_STREAM_COLOR_CONVERT1_2000 0x819c
|
|
|
|
#define SEC_STREAM_COLOR_CONVERT2_2000 0x81e0
|
|
|
|
#define SEC_STREAM_COLOR_CONVERT3_2000 0x81e4
|
|
|
|
|
|
|
|
/* Virge+ registers */
|
|
|
|
#define FIFO_CONTROL_REG 0x8200
|
|
|
|
#define MIU_CONTROL_REG 0x8204
|
|
|
|
#define STREAMS_TIMEOUT_REG 0x8208
|
|
|
|
#define MISC_TIMEOUT_REG 0x820c
|
|
|
|
|
|
|
|
/* VGA stuff */
|
|
|
|
#define vgaCRIndex 0x3d4
|
|
|
|
#define vgaCRReg 0x3d5
|
|
|
|
|
|
|
|
/* CRT Control registers */
|
|
|
|
#define EXT_MEM_CTRL1 0x53
|
|
|
|
#define LIN_ADDR_CTRL 0x58
|
|
|
|
#define EXT_MISC_CTRL2 0x67
|
|
|
|
|
|
|
|
/* Old engine constants */
|
|
|
|
#define ENABLE_NEWMMIO 0x08
|
|
|
|
#define ENABLE_LFB 0x10
|
|
|
|
#define ENABLE_STREAMS_OLD 0x0c
|
|
|
|
#define NO_STREAMS_OLD 0xf3
|
|
|
|
|
|
|
|
/* New engine constants */
|
|
|
|
#define ENABLE_STREAM1 0x04
|
|
|
|
#define NO_STREAMS 0xF9
|
|
|
|
|
|
|
|
#define VerticalRetraceWait() \
|
|
|
|
do { \
|
|
|
|
VGAIN8(0x3d4); \
|
|
|
|
VGAOUT8(0x3d4, 0x17); \
|
|
|
|
if (VGAIN8(0x3d5) & 0x80) { \
|
|
|
|
int i = 0x10000; \
|
|
|
|
while ((VGAIN8(0x3da) & 0x08) == 0x08 && i--) ; \
|
|
|
|
i = 0x10000; \
|
|
|
|
while ((VGAIN8(0x3da) & 0x08) == 0x00 && i--) ; \
|
|
|
|
} \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
/* Scaling operations */
|
|
|
|
#define HSCALING_Shift 0
|
|
|
|
#define HSCALING_Mask (((1L << 16)-1) << HSCALING_Shift)
|
|
|
|
#define HSCALING(w0,w1) ((((unsigned int)(((double)w0/(double)w1) * (1 << 15))) << HSCALING_Shift) & HSCALING_Mask)
|
2009-07-06 23:26:13 +00:00
|
|
|
|
2008-02-29 20:01:28 +00:00
|
|
|
#define VSCALING_Shift 0
|
|
|
|
#define VSCALING_Mask (((1L << 20)-1) << VSCALING_Shift)
|
|
|
|
#define VSCALING(h0,h1) ((((unsigned int) (((double)h0/(double)h1) * (1 << 15))) << VSCALING_Shift) & VSCALING_Mask)
|
|
|
|
|
|
|
|
/* Scaling factors */
|
|
|
|
#define HDM_SHIFT 16
|
|
|
|
#define HDSCALE_4 (2 << HDM_SHIFT)
|
|
|
|
#define HDSCALE_8 (3 << HDM_SHIFT)
|
|
|
|
#define HDSCALE_16 (4 << HDM_SHIFT)
|
|
|
|
#define HDSCALE_32 (5 << HDM_SHIFT)
|
|
|
|
#define HDSCALE_64 (6 << HDM_SHIFT)
|
|
|
|
|
|
|
|
/* Window parameters */
|
|
|
|
#define OS_XY(x,y) (((x+1)<<16)|(y+1))
|
|
|
|
#define OS_WH(x,y) (((x-1)<<16)|(y))
|
|
|
|
|
|
|
|
/* PCI stuff */
|
|
|
|
|
|
|
|
/* PCI-Memory IO access macros. */
|
|
|
|
#define VID_WR08(p,i,val) (((uint8_t *)(p))[(i)]=(val))
|
|
|
|
#define VID_RD08(p,i) (((uint8_t *)(p))[(i)])
|
|
|
|
|
|
|
|
#define VID_WR32(p,i,val) (((uint32_t *)(p))[(i)/4]=(val))
|
|
|
|
#define VID_RD32(p,i) (((uint32_t *)(p))[(i)/4])
|
|
|
|
|
|
|
|
#ifndef USE_RMW_CYCLES
|
|
|
|
|
|
|
|
/* Can be used to inhibit READ-MODIFY-WRITE cycles. On by default. */
|
2008-10-16 20:17:56 +00:00
|
|
|
#define MEM_BARRIER() __asm__ volatile ("" : : : "memory")
|
2008-02-29 20:01:28 +00:00
|
|
|
|
|
|
|
#undef VID_WR08
|
|
|
|
#define VID_WR08(p,i,val) ({ MEM_BARRIER(); ((uint8_t *)(p))[(i)]=(val); })
|
|
|
|
#undef VID_RD08
|
|
|
|
#define VID_RD08(p,i) ({ MEM_BARRIER(); ((uint8_t *)(p))[(i)]; })
|
|
|
|
|
|
|
|
#undef VID_WR16
|
|
|
|
#define VID_WR16(p,i,val) ({ MEM_BARRIER(); ((uint16_t *)(p))[(i)/2]=(val); })
|
|
|
|
#undef VID_RD16
|
|
|
|
#define VID_RD16(p,i) ({ MEM_BARRIER(); ((uint16_t *)(p))[(i)/2]; })
|
|
|
|
|
|
|
|
#undef VID_WR32
|
|
|
|
#define VID_WR32(p,i,val) ({ MEM_BARRIER(); ((uint32_t *)(p))[(i)/4]=(val); })
|
|
|
|
#undef VID_RD32
|
|
|
|
#define VID_RD32(p,i) ({ MEM_BARRIER(); ((uint32_t *)(p))[(i)/4]; })
|
|
|
|
#endif /* USE_RMW_CYCLES */
|
|
|
|
|
|
|
|
#define VID_AND32(p,i,val) VID_WR32(p,i,VID_RD32(p,i)&(val))
|
|
|
|
#define VID_OR32(p,i,val) VID_WR32(p,i,VID_RD32(p,i)|(val))
|
|
|
|
#define VID_XOR32(p,i,val) VID_WR32(p,i,VID_RD32(p,i)^(val))
|
|
|
|
|
|
|
|
#define VGAIN8(addr) VID_RD08(info->control_base+0x8000, addr)
|
|
|
|
#define VGAIN16(addr) VID_RD16(info->control_base+0x8000, addr)
|
|
|
|
#define VGAIN(addr) VID_RD32(info->control_base+0x8000, addr)
|
|
|
|
|
|
|
|
#define VGAOUT8(addr,val) VID_WR08(info->control_base+0x8000, addr, val)
|
|
|
|
#define VGAOUT16(addr,val) VID_WR16(info->control_base+0x8000, addr, val)
|
|
|
|
#define VGAOUT(addr,val) VID_WR32(info->control_base+0x8000, addr, val)
|
|
|
|
|
|
|
|
#define INREG(addr) VID_RD32(info->control_base, addr)
|
|
|
|
#define OUTREG(addr,val) VID_WR32(info->control_base, addr, val)
|
|
|
|
#define INREG8(addr) VID_RD08(info->control_base, addr)
|
|
|
|
#define OUTREG8(addr,val) VID_WR08(info->control_base, addr, val)
|
|
|
|
#define INREG16(addr) VID_RD16(info->control_base, addr)
|
|
|
|
#define OUTREG16(addr,val) VID_WR16(info->control_base, addr, val)
|
|
|
|
|
|
|
|
#define ALIGN_TO(v, n) (((v) + (n-1)) & ~(n-1))
|
|
|
|
|
2008-02-29 20:02:37 +00:00
|
|
|
#endif /* MPLAYER_S3_REGS_H */
|