Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
63ffa3f0
Commit
63ffa3f0
authored
Oct 13, 2002
by
Russell King
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[ARM] Update cyber2000fb for 2.5 fbcon.
parent
a2ca74ad
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
498 additions
and
307 deletions
+498
-307
drivers/video/cyber2000fb.c
drivers/video/cyber2000fb.c
+444
-290
drivers/video/cyber2000fb.h
drivers/video/cyber2000fb.h
+54
-17
No files found.
drivers/video/cyber2000fb.c
View file @
63ffa3f0
/*
* linux/drivers/video/cyber2000fb.c
*
* Copyright (C) 1998-200
0
Russell King
* Copyright (C) 1998-200
2
Russell King
*
* MIPS and 50xx clock support
* Copyright (C) 2001 Bradley D. LaRonde <brad@ltc.com>
*
* 32 bit support, text color and panning fixes for modes != 8 bit
* Copyright (C) 2002 Denis Oliver Kropp <dok@directfb.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
...
...
@@ -14,17 +17,24 @@
*
* Based on cyberfb.c.
*
* Note that we now use the new fbcon fix, var and cmap scheme. We do still
* have to check which console is the currently displayed one however, since
* especially for the colourmap stuff.
* Note that we now use the new fbcon fix, var and cmap scheme. We do
* still have to check which console is the currently displayed one
* however, especially for the colourmap stuff.
*
* We also use the new hotplug PCI subsystem. I'm not sure if there
* are any such cards, but I'm erring on the side of caution. We don't
* want to go pop just because someone does have one.
*
*
We also use the new hotplug PCI subsystem. I'm not sure if there are any
*
such cards, but I'm erring on the side of caution. We don't want to go
*
pop just because someone does have one
.
*
Note that this doesn't work fully in the case of multiple CyberPro
*
cards with grabbers. We currently can only attach to the first
*
CyberPro card found
.
*
* Note that this doesn't work fully in the case of multiple CyberPro cards
* with grabbers. We currently can only attach to the first CyberPro card
* found.
* When we're in truecolour mode, we power down the LUT RAM as a power
* saving feature. Also, when we enter any of the powersaving modes
* (except soft blanking) we power down the RAMDACs. This saves about
* 1W, which is roughly 8% of the power consumption of a NetWinder
* (which, incidentally, is about the same saving as a 2.5in hard disk
* entering standby mode.)
*/
#include <linux/config.h>
#include <linux/module.h>
...
...
@@ -49,11 +59,7 @@
#include <video/fbcon-cfb8.h>
#include <video/fbcon-cfb16.h>
#include <video/fbcon-cfb24.h>
/*
* Define this if you don't want RGB565, but RGB555 for 16bpp displays.
*/
/*#define CFB16_IS_CFB15*/
#include <video/fbcon-cfb32.h>
#include "cyber2000fb.h"
...
...
@@ -64,6 +70,7 @@ struct cfb_info {
struct
pci_dev
*
dev
;
unsigned
char
*
region
;
unsigned
char
*
regs
;
u_int
id
;
int
func_use_count
;
u_long
ref_ps
;
...
...
@@ -80,6 +87,11 @@ struct cfb_info {
u_char
mem_ctl2
;
u_char
mclk_mult
;
u_char
mclk_div
;
/*
* RAMDAC control register is both of these or'ed together
*/
u_char
ramdac_ctrl
;
u_char
ramdac_powerdown
;
};
static
char
default_font_storage
[
40
];
...
...
@@ -139,7 +151,7 @@ static void cyber2000_accel_wait(struct cfb_info *cfb)
{
int
count
=
100000
;
while
(
cyber2000fb_readb
(
CO_REG_CONTROL
,
cfb
)
&
0x80
)
{
while
(
cyber2000fb_readb
(
CO_REG_CONTROL
,
cfb
)
&
CO_CTRL_BUSY
)
{
if
(
!
count
--
)
{
debug_printf
(
"accel_wait timed out
\n
"
);
cyber2000fb_writeb
(
0
,
CO_REG_CONTROL
,
cfb
);
...
...
@@ -163,8 +175,7 @@ cyber2000_accel_bmove(struct display *display, int sy, int sx, int dy, int dx,
struct
cfb_info
*
cfb
=
(
struct
cfb_info
*
)
display
->
fb_info
;
struct
fb_var_screeninfo
*
var
=
&
display
->
var
;
u_long
src
,
dst
;
u_int
fh
,
fw
;
int
cmd
=
CO_CMD_L_PATTERN_FGCOL
;
u_int
fh
,
fw
,
cmd
=
CO_CMD_L_PATTERN_FGCOL
;
fw
=
fontwidth
(
display
);
sx
*=
fw
;
...
...
@@ -195,21 +206,20 @@ cyber2000_accel_bmove(struct display *display, int sy, int sx, int dy, int dx,
cyber2000_accel_wait
(
cfb
);
cyber2000fb_writeb
(
0x00
,
CO_REG_CONTROL
,
cfb
);
cyber2000fb_write
b
(
0x03
,
CO_REG_FORE_MIX
,
cfb
);
cyber2000fb_writew
(
width
,
CO_REG_WIDTH
,
cfb
);
cyber2000fb_write
w
(
width
,
CO_REG_PIXWIDTH
,
cfb
);
cyber2000fb_writew
(
height
,
CO_REG_PIXHEIGHT
,
cfb
);
if
(
var
->
bits_per_pixel
!=
24
)
{
cyber2000fb_writel
(
dst
,
CO_REG_DEST_PTR
,
cfb
);
cyber2000fb_writel
(
src
,
CO_REG_SRC_PTR
,
cfb
);
}
else
{
cyber2000fb_writel
(
dst
*
3
,
CO_REG_DEST_PTR
,
cfb
);
if
(
var
->
bits_per_pixel
==
24
)
{
cyber2000fb_writeb
(
dst
,
CO_REG_X_PHASE
,
cfb
);
cyber2000fb_writel
(
src
*
3
,
CO_REG_SRC_PTR
,
cfb
);
dst
*=
3
;
src
*=
3
;
}
cyber2000fb_writew
(
height
,
CO_REG_HEIGHT
,
cfb
);
cyber2000fb_writel
(
src
,
CO_REG_SRC1_PTR
,
cfb
);
cyber2000fb_writel
(
dst
,
CO_REG_DEST_PTR
,
cfb
);
cyber2000fb_writeb
(
CO_FG_MIX_SRC
,
CO_REG_FGMIX
,
cfb
);
cyber2000fb_writew
(
cmd
,
CO_REG_CMD_L
,
cfb
);
cyber2000fb_writew
(
0x2800
,
CO_REG_CMD_H
,
cfb
);
cyber2000fb_writew
(
CO_CMD_H_FGSRCMAP
|
CO_CMD_H_BLITTER
,
CO_REG_CMD_H
,
cfb
);
}
static
void
...
...
@@ -231,27 +241,24 @@ cyber2000_accel_clear(struct vc_data *conp, struct display *display, int sy,
cyber2000_accel_wait
(
cfb
);
cyber2000fb_writeb
(
0x00
,
CO_REG_CONTROL
,
cfb
);
cyber2000fb_writeb
(
0x03
,
CO_REG_FORE_MIX
,
cfb
);
cyber2000fb_writew
(
width
,
CO_REG_WIDTH
,
cfb
);
cyber2000fb_writew
(
height
,
CO_REG_HEIGHT
,
cfb
);
cyber2000fb_writew
(
width
,
CO_REG_PIXWIDTH
,
cfb
);
cyber2000fb_writew
(
height
,
CO_REG_PIXHEIGHT
,
cfb
);
switch
(
var
->
bits_per_pixel
)
{
case
16
:
bgx
=
((
u16
*
)
display
->
dispsw_data
)[
bgx
];
case
8
:
cyber2000fb_writel
(
dst
,
CO_REG_DEST_PTR
,
cfb
);
break
;
case
24
:
cyber2000fb_writel
(
dst
*
3
,
CO_REG_DEST_PTR
,
cfb
);
if
(
var
->
bits_per_pixel
==
24
)
{
cyber2000fb_writeb
(
dst
,
CO_REG_X_PHASE
,
cfb
);
bgx
=
((
u32
*
)
display
->
dispsw_data
)[
bgx
];
break
;
dst
*=
3
;
}
cyber2000fb_writel
(
bgx
,
CO_REG_FOREGROUND
,
cfb
);
if
(
var
->
bits_per_pixel
==
16
)
bgx
=
((
u16
*
)
display
->
dispsw_data
)[
bgx
];
else
if
(
var
->
bits_per_pixel
>=
24
)
bgx
=
((
u32
*
)
display
->
dispsw_data
)[
bgx
];
cyber2000fb_writel
(
bgx
,
CO_REG_FGCOLOUR
,
cfb
);
cyber2000fb_writel
(
dst
,
CO_REG_DEST_PTR
,
cfb
);
cyber2000fb_writeb
(
CO_FG_MIX_SRC
,
CO_REG_FGMIX
,
cfb
);
cyber2000fb_writew
(
CO_CMD_L_PATTERN_FGCOL
,
CO_REG_CMD_L
,
cfb
);
cyber2000fb_writew
(
0x0800
,
CO_REG_CMD_H
,
cfb
);
cyber2000fb_writew
(
CO_CMD_H_BLITTER
,
CO_REG_CMD_H
,
cfb
);
}
static
void
...
...
@@ -298,10 +305,17 @@ static struct display_switch fbcon_cyber_accel = {
.
putc
=
cyber2000_accel_putc
,
.
putcs
=
cyber2000_accel_putcs
,
.
revc
=
cyber2000_accel_revc
,
.
clear_margins
=
cyber2000_accel_clear_margins
,
.
fontwidthmask
=
FONTWIDTH
(
8
)
|
FONTWIDTH
(
16
)
.
clear_margins
=
cyber2000_accel_clear_margins
,
.
fontwidthmask
=
FONTWIDTH
(
8
)
|
FONTWIDTH
(
16
)
};
static
inline
u32
convert_bitfield
(
u_int
val
,
struct
fb_bitfield
*
bf
)
{
u_int
mask
=
(
1
<<
bf
->
length
)
-
1
;
return
(
val
>>
(
16
-
bf
->
length
)
&
mask
)
<<
bf
->
offset
;
}
/*
* Set a single color register. Return != 0 for invalid regno.
*/
...
...
@@ -311,7 +325,24 @@ cyber2000fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
{
struct
cfb_info
*
cfb
=
(
struct
cfb_info
*
)
info
;
struct
fb_var_screeninfo
*
var
=
&
cfb
->
display
->
var
;
u32
pseudo_val
;
int
ret
=
1
;
switch
(
cfb
->
fb
.
fix
.
visual
)
{
default:
return
1
;
#ifdef FBCON_HAS_CFB8
/*
* Pseudocolour:
* 8 8
* pixel --/--+--/--> red lut --> red dac
* | 8
* +--/--> green lut --> green dac
* | 8
* +--/--> blue lut --> blue dac
*/
case
FB_VISUAL_PSEUDOCOLOR
:
if
(
regno
>=
NR_PALETTE
)
return
1
;
...
...
@@ -323,73 +354,116 @@ cyber2000fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
cfb
->
palette
[
regno
].
green
=
green
;
cfb
->
palette
[
regno
].
blue
=
blue
;
switch
(
var
->
bits_per_pixel
)
{
#ifdef FBCON_HAS_CFB8
case
8
:
cyber2000fb_writeb
(
regno
,
0x3c8
,
cfb
);
cyber2000fb_writeb
(
red
,
0x3c9
,
cfb
);
cyber2000fb_writeb
(
green
,
0x3c9
,
cfb
);
cyber2000fb_writeb
(
blue
,
0x3c9
,
cfb
);
break
;
return
0
;
#endif
#ifdef FBCON_HAS_CFB16
case
16
:
#ifndef CFB16_IS_CFB15
if
(
var
->
green
.
length
==
6
)
{
if
(
regno
<
64
)
{
/* write green */
/*
* Direct colour:
* n rl
* pixel --/--+--/--> red lut --> red dac
* | gl
* +--/--> green lut --> green dac
* | bl
* +--/--> blue lut --> blue dac
* n = bpp, rl = red length, gl = green length, bl = blue length
*/
case
FB_VISUAL_DIRECTCOLOR
:
red
>>=
8
;
green
>>=
8
;
blue
>>=
8
;
if
(
var
->
green
.
length
==
6
&&
regno
<
64
)
{
cfb
->
palette
[
regno
<<
2
].
green
=
green
;
/*
* The 6 bits of the green component are applied
* to the high 6 bits of the LUT.
*/
cyber2000fb_writeb
(
regno
<<
2
,
0x3c8
,
cfb
);
cyber2000fb_writeb
(
cfb
->
palette
[
regno
>>
1
].
red
,
0x3c9
,
cfb
);
cyber2000fb_writeb
(
green
,
0x3c9
,
cfb
);
cyber2000fb_writeb
(
cfb
->
palette
[
regno
>>
1
].
blue
,
0x3c9
,
cfb
);
}
if
(
regno
<
32
)
{
/* write red,blue */
cyber2000fb_writeb
(
regno
<<
3
,
0x3c8
,
cfb
);
cyber2000fb_writeb
(
red
,
0x3c9
,
cfb
);
cyber2000fb_writeb
(
cfb
->
palette
[
regno
<<
1
].
green
,
0x3c9
,
cfb
);
cyber2000fb_writeb
(
blue
,
0x3c9
,
cfb
);
}
green
=
cfb
->
palette
[
regno
<<
3
].
green
;
if
(
regno
<
16
)
((
u16
*
)
cfb
->
fb
.
pseudo_palette
)[
regno
]
=
regno
|
regno
<<
5
|
regno
<<
11
;
break
;
ret
=
0
;
}
#endif
if
(
regno
<
32
)
{
if
(
var
->
green
.
length
>=
5
&&
regno
<
32
)
{
cfb
->
palette
[
regno
<<
3
].
red
=
red
;
cfb
->
palette
[
regno
<<
3
].
green
=
green
;
cfb
->
palette
[
regno
<<
3
].
blue
=
blue
;
/*
* The 5 bits of each colour component are
* applied to the high 5 bits of the LUT.
*/
cyber2000fb_writeb
(
regno
<<
3
,
0x3c8
,
cfb
);
cyber2000fb_writeb
(
red
,
0x3c9
,
cfb
);
cyber2000fb_writeb
(
green
,
0x3c9
,
cfb
);
cyber2000fb_writeb
(
blue
,
0x3c9
,
cfb
);
ret
=
0
;
}
if
(
regno
<
16
)
((
u16
*
)
cfb
->
fb
.
pseudo_palette
)[
regno
]
=
regno
|
regno
<<
5
|
regno
<<
10
;
break
;
#endif
if
(
var
->
green
.
length
==
4
&&
regno
<
16
)
{
cfb
->
palette
[
regno
<<
4
].
red
=
red
;
cfb
->
palette
[
regno
<<
4
].
green
=
green
;
cfb
->
palette
[
regno
<<
4
].
blue
=
blue
;
#ifdef FBCON_HAS_CFB24
case
24
:
cyber2000fb_writeb
(
regno
,
0x3c8
,
cfb
);
/*
* The 5 bits of each colour component are
* applied to the high 5 bits of the LUT.
*/
cyber2000fb_writeb
(
regno
<<
4
,
0x3c8
,
cfb
);
cyber2000fb_writeb
(
red
,
0x3c9
,
cfb
);
cyber2000fb_writeb
(
green
,
0x3c9
,
cfb
);
cyber2000fb_writeb
(
blue
,
0x3c9
,
cfb
);
ret
=
0
;
}
if
(
regno
<
16
)
((
u32
*
)
cfb
->
fb
.
pseudo_palette
)[
regno
]
=
regno
|
regno
<<
8
|
regno
<<
16
;
/*
* Since this is only used for the first 16 colours, we
* don't have to care about overflowing for regno >= 32
*/
pseudo_val
=
regno
<<
var
->
red
.
offset
|
regno
<<
var
->
green
.
offset
|
regno
<<
var
->
blue
.
offset
;
break
;
#endif
default:
return
1
;
/*
* True colour:
* n rl
* pixel --/--+--/--> red dac
* | gl
* +--/--> green dac
* | bl
* +--/--> blue dac
* n = bpp, rl = red length, gl = green length, bl = blue length
*/
case
FB_VISUAL_TRUECOLOR
:
pseudo_val
=
convert_bitfield
(
transp
^
0xffff
,
&
var
->
transp
);
pseudo_val
|=
convert_bitfield
(
red
,
&
var
->
red
);
pseudo_val
|=
convert_bitfield
(
green
,
&
var
->
green
);
pseudo_val
|=
convert_bitfield
(
blue
,
&
var
->
blue
);
break
;
}
return
0
;
/*
* Now set our pseudo palette for the CFB16/24/32 drivers.
*/
if
(
regno
<
16
)
{
if
(
var
->
bits_per_pixel
==
16
)
((
u16
*
)
cfb
->
fb
.
pseudo_palette
)[
regno
]
=
pseudo_val
;
else
((
u32
*
)
cfb
->
fb
.
pseudo_palette
)[
regno
]
=
pseudo_val
;
ret
=
0
;
}
return
ret
;
}
struct
par_info
{
...
...
@@ -399,7 +473,7 @@ struct par_info {
u_char
clock_mult
;
u_char
clock_div
;
u_char
extseqmisc
;
u_char
pixforma
t
;
u_char
co_pixfm
t
;
u_char
crtc_ofl
;
u_char
crtc
[
19
];
u_int
width
;
...
...
@@ -409,8 +483,7 @@ struct par_info {
/*
* Other
*/
u_char
palette_ctrl
;
u_int
vmode
;
u_char
ramdac
;
};
static
const
u_char
crtc_idx
[]
=
{
...
...
@@ -419,6 +492,18 @@ static const u_char crtc_idx[] = {
0x10
,
0x11
,
0x12
,
0x13
,
0x14
,
0x15
,
0x16
,
0x17
,
0x18
};
static
void
cyber2000fb_write_ramdac_ctrl
(
struct
cfb_info
*
cfb
)
{
unsigned
int
i
;
unsigned
int
val
=
cfb
->
ramdac_ctrl
|
cfb
->
ramdac_powerdown
;
cyber2000fb_writeb
(
0x56
,
0x3ce
,
cfb
);
i
=
cyber2000fb_readb
(
0x3cf
,
cfb
);
cyber2000fb_writeb
(
i
|
4
,
0x3cf
,
cfb
);
cyber2000fb_writeb
(
val
,
0x3c6
,
cfb
);
cyber2000fb_writeb
(
i
,
0x3cf
,
cfb
);
}
static
void
cyber2000fb_set_timing
(
struct
cfb_info
*
cfb
,
struct
par_info
*
hw
)
{
u_int
i
;
...
...
@@ -450,7 +535,7 @@ static void cyber2000fb_set_timing(struct cfb_info *cfb, struct par_info *hw)
for
(
i
=
0x0a
;
i
<
0x10
;
i
++
)
cyber2000_crtcw
(
i
,
0
,
cfb
);
cyber2000_grphw
(
0x11
,
hw
->
crtc_ofl
,
cfb
);
cyber2000_grphw
(
EXT_CRT_VRTOFL
,
hw
->
crtc_ofl
,
cfb
);
cyber2000_grphw
(
0x00
,
0x00
,
cfb
);
cyber2000_grphw
(
0x01
,
0x00
,
cfb
);
cyber2000_grphw
(
0x02
,
0x00
,
cfb
);
...
...
@@ -471,16 +556,6 @@ static void cyber2000fb_set_timing(struct cfb_info *cfb, struct par_info *hw)
cyber2000_attrw
(
0x13
,
0x00
,
cfb
);
cyber2000_attrw
(
0x14
,
0x00
,
cfb
);
/* woody: set the interlaced bit... */
/* FIXME: what about doublescan? */
cyber2000fb_writeb
(
0x11
,
0x3ce
,
cfb
);
i
=
cyber2000fb_readb
(
0x3cf
,
cfb
);
if
(
hw
->
vmode
==
FB_VMODE_INTERLACED
)
i
|=
0x20
;
else
i
&=
~
0x20
;
cyber2000fb_writeb
(
i
,
0x3cf
,
cfb
);
/* PLL registers */
cyber2000_grphw
(
EXT_DCLK_MULT
,
hw
->
clock_mult
,
cfb
);
cyber2000_grphw
(
EXT_DCLK_DIV
,
hw
->
clock_div
,
cfb
);
...
...
@@ -490,11 +565,8 @@ static void cyber2000fb_set_timing(struct cfb_info *cfb, struct par_info *hw)
cyber2000_grphw
(
0xb9
,
0x80
,
cfb
);
cyber2000_grphw
(
0xb9
,
0x00
,
cfb
);
cyber2000fb_writeb
(
0x56
,
0x3ce
,
cfb
);
i
=
cyber2000fb_readb
(
0x3cf
,
cfb
);
cyber2000fb_writeb
(
i
|
4
,
0x3cf
,
cfb
);
cyber2000fb_writeb
(
hw
->
palette_ctrl
,
0x3c6
,
cfb
);
cyber2000fb_writeb
(
i
,
0x3cf
,
cfb
);
cfb
->
ramdac_ctrl
=
hw
->
ramdac
;
cyber2000fb_write_ramdac_ctrl
(
cfb
);
cyber2000fb_writeb
(
0x20
,
0x3c0
,
cfb
);
cyber2000fb_writeb
(
0xff
,
0x3c6
,
cfb
);
...
...
@@ -504,25 +576,20 @@ static void cyber2000fb_set_timing(struct cfb_info *cfb, struct par_info *hw)
((
hw
->
pitch
>>
4
)
&
0x30
),
cfb
);
cyber2000_grphw
(
EXT_SEQ_MISC
,
hw
->
extseqmisc
,
cfb
);
cyber2000_grphw
(
EXT_BIU_MISC
,
EXT_BIU_MISC_LIN_ENABLE
|
EXT_BIU_MISC_COP_ENABLE
|
EXT_BIU_MISC_COP_BFC
,
cfb
);
/*
* Set up accelerator registers
*/
cyber2000fb_writew
(
hw
->
width
,
CO_REG_SRC_WIDTH
,
cfb
);
cyber2000fb_writew
(
hw
->
width
,
CO_REG_DEST_WIDTH
,
cfb
);
cyber2000fb_writeb
(
hw
->
pixformat
,
CO_REG_PIX_FORMA
T
,
cfb
);
cyber2000fb_writeb
(
hw
->
co_pixfmt
,
CO_REG_PIXFM
T
,
cfb
);
}
static
inline
int
cyber2000fb_update_start
(
struct
cfb_info
*
cfb
,
struct
fb_var_screeninfo
*
var
)
{
u_int
base
;
u_int
base
=
var
->
yoffset
*
var
->
xres_virtual
+
var
->
xoffset
;
base
=
var
->
yoffset
*
var
->
xres_virtual
*
var
->
bits_per_pixel
+
var
->
xoffset
*
var
->
bits_per_pixel
;
base
*=
var
->
bits_per_pixel
;
/*
* Convert to bytes and shift two extra bits because DAC
...
...
@@ -606,8 +673,9 @@ cyber2000fb_decode_crtc(struct par_info *hw, struct cfb_info *cfb,
hw
->
crtc
[
16
]
=
Vblankend
;
hw
->
crtc
[
18
]
=
0xff
;
/* overflow - graphics reg 0x11 */
/* 0=VTOTAL:10 1=VDEND:10 2=VRSTART:10 3=VBSTART:10
/*
* overflow - graphics reg 0x11
* 0=VTOTAL:10 1=VDEND:10 2=VRSTART:10 3=VBSTART:10
* 4=LINECOMP:10 5-IVIDEO 6=FIXCNT
*/
hw
->
crtc_ofl
=
...
...
@@ -615,7 +683,12 @@ cyber2000fb_decode_crtc(struct par_info *hw, struct cfb_info *cfb,
BIT
(
Vdispend
,
10
,
0x01
,
1
)
|
BIT
(
Vsyncstart
,
10
,
0x01
,
2
)
|
BIT
(
Vblankstart
,
10
,
0x01
,
3
)
|
1
<<
4
;
EXT_CRT_VRTOFL_LINECOMP10
;
/* woody: set the interlaced bit... */
/* FIXME: what about doublescan? */
if
((
var
->
vmode
&
FB_VMODE_MASK
)
==
FB_VMODE_INTERLACED
)
hw
->
crtc_ofl
|=
EXT_CRT_VRTOFL_INTERLACE
;
return
0
;
}
...
...
@@ -735,51 +808,131 @@ static int
cyber2000fb_decode_var
(
struct
fb_var_screeninfo
*
var
,
struct
cfb_info
*
cfb
,
struct
par_info
*
hw
)
{
unsigned
int
mem
;
int
err
;
hw
->
width
=
var
->
xres_virtual
;
hw
->
palette_ctrl
=
0x06
;
hw
->
vmode
=
var
->
vmode
;
hw
->
ramdac
=
RAMDAC_VREFEN
|
RAMDAC_DAC8BIT
;
var
->
transp
.
msb_right
=
0
;
var
->
red
.
msb_right
=
0
;
var
->
green
.
msb_right
=
0
;
var
->
blue
.
msb_right
=
0
;
switch
(
var
->
bits_per_pixel
)
{
#ifdef FBCON_HAS_CFB8
case
8
:
/* PSEUDOCOLOUR, 256 */
hw
->
pixformat
=
PIXFORMAT_8BPP
;
hw
->
extseqmisc
=
EXT_SEQ_MISC_8
;
hw
->
co_pixfmt
=
CO_PIXFMT_8BPP
;
hw
->
pitch
=
hw
->
width
>>
3
;
hw
->
extseqmisc
=
EXT_SEQ_MISC_8
;
var
->
transp
.
offset
=
0
;
var
->
transp
.
length
=
0
;
var
->
red
.
offset
=
0
;
var
->
red
.
length
=
8
;
var
->
green
.
offset
=
0
;
var
->
green
.
length
=
8
;
var
->
blue
.
offset
=
0
;
var
->
blue
.
length
=
8
;
break
;
#endif
#ifdef FBCON_HAS_CFB16
case
16
:
hw
->
pixformat
=
PIXFORMA
T_16BPP
;
case
16
:
/* DIRECTCOLOUR, 64k or 32k */
hw
->
co_pixfmt
=
CO_PIXFM
T_16BPP
;
hw
->
pitch
=
hw
->
width
>>
2
;
hw
->
palette_ctrl
|=
0x10
;
#ifndef CFB16_IS_CFB15
/* DIRECTCOLOUR, 64k */
if
(
var
->
green
.
length
==
6
)
{
switch
(
var
->
green
.
length
)
{
case
6
:
/* RGB565, 64k */
hw
->
extseqmisc
=
EXT_SEQ_MISC_16_RGB565
;
var
->
transp
.
offset
=
0
;
var
->
transp
.
length
=
0
;
var
->
red
.
offset
=
11
;
var
->
red
.
length
=
5
;
var
->
green
.
offset
=
5
;
var
->
green
.
length
=
6
;
var
->
blue
.
offset
=
0
;
var
->
blue
.
length
=
5
;
break
;
}
#endif
/* DIRECTCOLOUR
, 32k */
default:
case
5
:
/* RGB555
, 32k */
hw
->
extseqmisc
=
EXT_SEQ_MISC_16_RGB555
;
var
->
transp
.
offset
=
0
;
var
->
transp
.
length
=
0
;
var
->
red
.
offset
=
10
;
var
->
red
.
length
=
5
;
var
->
green
.
offset
=
5
;
var
->
green
.
length
=
5
;
var
->
blue
.
offset
=
0
;
var
->
blue
.
length
=
5
;
break
;
case
4
:
/* RGB444, 4k + transparency? */
hw
->
extseqmisc
=
EXT_SEQ_MISC_16_RGB444
;
var
->
transp
.
offset
=
12
;
var
->
transp
.
length
=
4
;
var
->
red
.
offset
=
8
;
var
->
red
.
length
=
4
;
var
->
green
.
offset
=
4
;
var
->
green
.
length
=
4
;
var
->
blue
.
offset
=
0
;
var
->
blue
.
length
=
4
;
break
;
}
break
;
#endif
#ifdef FBCON_HAS_CFB24
case
24
:
/* TRUECOLOUR, 16m */
hw
->
pixformat
=
PIXFORMAT_24BPP
;
hw
->
extseqmisc
=
EXT_SEQ_MISC_24_RGB888
;
hw
->
co_pixfmt
=
CO_PIXFMT_24BPP
;
hw
->
width
*=
3
;
hw
->
pitch
=
hw
->
width
>>
3
;
hw
->
palette_ctrl
|=
0x10
;
hw
->
ramdac
|=
(
RAMDAC_BYPASS
|
RAMDAC_RAMPWRDN
);
hw
->
extseqmisc
=
EXT_SEQ_MISC_24_RGB888
;
var
->
transp
.
offset
=
0
;
var
->
transp
.
length
=
0
;
var
->
red
.
offset
=
16
;
var
->
red
.
length
=
8
;
var
->
green
.
offset
=
8
;
var
->
green
.
length
=
8
;
var
->
blue
.
offset
=
0
;
var
->
blue
.
length
=
8
;
break
;
#endif
#ifdef FBCON_HAS_CFB32
case
32
:
/* TRUECOLOUR, 16m */
hw
->
co_pixfmt
=
CO_PIXFMT_32BPP
;
hw
->
pitch
=
hw
->
width
>>
1
;
hw
->
ramdac
|=
(
RAMDAC_BYPASS
|
RAMDAC_RAMPWRDN
);
hw
->
extseqmisc
=
EXT_SEQ_MISC_32
;
var
->
transp
.
offset
=
24
;
var
->
transp
.
length
=
8
;
var
->
red
.
offset
=
16
;
var
->
red
.
length
=
8
;
var
->
green
.
offset
=
8
;
var
->
green
.
length
=
8
;
var
->
blue
.
offset
=
0
;
var
->
blue
.
length
=
8
;
break
;
#endif
default:
return
-
EINVAL
;
}
mem
=
var
->
xres_virtual
*
var
->
yres_virtual
*
(
var
->
bits_per_pixel
/
8
);
if
(
mem
>
cfb
->
fb
.
fix
.
smem_len
)
var
->
yres_virtual
=
cfb
->
fb
.
fix
.
smem_len
*
8
/
(
var
->
bits_per_pixel
*
var
->
xres_virtual
);
if
(
var
->
yres
>
var
->
yres_virtual
)
var
->
yres
=
var
->
yres_virtual
;
if
(
var
->
xres
>
var
->
xres_virtual
)
var
->
xres
=
var
->
xres_virtual
;
err
=
cyber2000fb_decode_clock
(
hw
,
cfb
,
var
);
if
(
err
)
return
err
;
...
...
@@ -807,7 +960,7 @@ cyber2000fb_set_var(struct fb_var_screeninfo *var, int con,
struct
cfb_info
*
cfb
=
(
struct
cfb_info
*
)
info
;
struct
display
*
display
;
struct
par_info
hw
;
int
err
,
chgvar
=
0
;
int
err
,
chgvar
;
/*
* CONUPDATE and SMOOTH_XPAN are equal. However,
...
...
@@ -819,7 +972,7 @@ cyber2000fb_set_var(struct fb_var_screeninfo *var, int con,
var
->
yoffset
=
cfb
->
display
->
var
.
yoffset
;
}
err
=
cyber2000fb_decode_var
(
var
,
(
struct
cfb_info
*
)
info
,
&
hw
);
err
=
cyber2000fb_decode_var
(
var
,
cfb
,
&
hw
);
if
(
err
)
return
err
;
...
...
@@ -831,84 +984,62 @@ cyber2000fb_set_var(struct fb_var_screeninfo *var, int con,
if
(
con
<
0
)
{
display
=
cfb
->
fb
.
disp
;
chgvar
=
0
;
}
else
{
display
=
fb_display
+
con
;
}
if
(
display
->
var
.
xres
!=
var
->
xres
)
chgvar
=
1
;
if
(
display
->
var
.
yres
!=
var
->
yres
)
chgvar
=
1
;
if
(
display
->
var
.
xres_virtual
!=
var
->
xres_virtual
)
chgvar
=
1
;
if
(
display
->
var
.
yres_virtual
!=
var
->
yres_virtual
)
chgvar
=
1
;
if
(
display
->
var
.
bits_per_pixel
!=
var
->
bits_per_pixel
)
chgvar
=
cfb
->
fb
.
var
.
xres
!=
var
->
xres
||
cfb
->
fb
.
var
.
yres
!=
var
->
yres
||
cfb
->
fb
.
var
.
xres_virtual
!=
var
->
xres_virtual
||
cfb
->
fb
.
var
.
yres_virtual
!=
var
->
yres_virtual
||
cfb
->
fb
.
var
.
bits_per_pixel
!=
var
->
bits_per_pixel
;
if
(
memcmp
(
&
cfb
->
fb
.
var
.
red
,
&
var
->
red
,
sizeof
(
var
->
red
))
||
memcmp
(
&
cfb
->
fb
.
var
.
green
,
&
var
->
green
,
sizeof
(
var
->
green
))
||
memcmp
(
&
cfb
->
fb
.
var
.
blue
,
&
var
->
blue
,
sizeof
(
var
->
blue
))
)
chgvar
=
1
;
if
(
con
>=
0
&&
chgvar
==
0
)
return
0
;
if
(
con
<
0
)
chgvar
=
0
;
var
->
red
.
msb_right
=
0
;
var
->
green
.
msb_right
=
0
;
var
->
blue
.
msb_right
=
0
;
/*
* If we are setting all the virtual consoles, also set the
* defaults used to create new consoles.
*/
err
=
var
->
activate
;
var
->
activate
=
FB_ACTIVATE_NOW
;
if
(
err
&
FB_ACTIVATE_ALL
)
cfb
->
fb
.
disp
->
var
=
*
var
;
cfb
->
fb
.
var
=
*
var
;
cfb
->
fb
.
fix
.
line_length
=
var
->
xres_virtual
*
var
->
bits_per_pixel
/
8
;
switch
(
var
->
bits_per_pixel
)
{
#ifdef FBCON_HAS_CFB8
case
8
:
/* PSEUDOCOLOUR, 256 */
var
->
red
.
offset
=
0
;
var
->
red
.
length
=
8
;
var
->
green
.
offset
=
0
;
var
->
green
.
length
=
8
;
var
->
blue
.
offset
=
0
;
var
->
blue
.
length
=
8
;
cfb
->
fb
.
fix
.
visual
=
FB_VISUAL_PSEUDOCOLOR
;
cfb
->
dispsw
=
&
fbcon_cfb8
;
display
->
dispsw_data
=
NULL
;
display
->
next_line
=
var
->
xres_virtual
;
break
;
#endif
#ifdef FBCON_HAS_CFB16
case
16
:
var
->
bits_per_pixel
=
16
;
var
->
red
.
length
=
5
;
var
->
green
.
offset
=
5
;
var
->
blue
.
offset
=
0
;
var
->
blue
.
length
=
5
;
cfb
->
fb
.
fix
.
visual
=
FB_VISUAL_DIRECTCOLOR
;
case
16
:
/* DIRECTCOLOUR */
cfb
->
dispsw
=
&
fbcon_cfb16
;
display
->
dispsw_data
=
cfb
->
fb
.
pseudo_palette
;
display
->
next_line
=
var
->
xres_virtual
*
2
;
#ifndef CFB16_IS_CFB15
/* DIRECTCOLOUR, 64k */
if
(
var
->
green
.
length
==
6
)
{
var
->
red
.
offset
=
11
;
var
->
green
.
length
=
6
;
break
;
}
#endif
/* DIRECTCOLOUR, 32k */
var
->
red
.
offset
=
10
;
var
->
green
.
length
=
5
;
break
;
#endif
#ifdef FBCON_HAS_CFB24
case
24
:
/* TRUECOLOUR, 16m */
var
->
red
.
offset
=
16
;
var
->
red
.
length
=
8
;
var
->
green
.
offset
=
8
;
var
->
green
.
length
=
8
;
var
->
blue
.
offset
=
0
;
var
->
blue
.
length
=
8
;
cfb
->
fb
.
fix
.
visual
=
FB_VISUAL_TRUECOLOR
;
cfb
->
dispsw
=
&
fbcon_cfb24
;
display
->
dispsw_data
=
cfb
->
fb
.
pseudo_palette
;
display
->
next_line
=
var
->
xres_virtual
*
3
;
break
;
#endif
#ifdef FBCON_HAS_CFB32
case
32
:
/* TRUECOLOUR, 16m */
cfb
->
dispsw
=
&
fbcon_cfb32
;
display
->
dispsw_data
=
cfb
->
fb
.
pseudo_palette
;
break
;
#endif
default:
/* in theory this should never happen */
...
...
@@ -918,40 +1049,34 @@ cyber2000fb_set_var(struct fb_var_screeninfo *var, int con,
break
;
}
/*
* 8bpp displays are always pseudo colour.
* 16bpp and above are direct colour or true colour, depending
* on whether the RAMDAC palettes are bypassed. (Direct colour
* has palettes, true colour does not.)
*/
if
(
var
->
bits_per_pixel
==
8
)
cfb
->
fb
.
fix
.
visual
=
FB_VISUAL_PSEUDOCOLOR
;
else
if
(
hw
.
ramdac
&
RAMDAC_BYPASS
)
cfb
->
fb
.
fix
.
visual
=
FB_VISUAL_TRUECOLOR
;
else
cfb
->
fb
.
fix
.
visual
=
FB_VISUAL_DIRECTCOLOR
;
if
(
var
->
accel_flags
&
FB_ACCELF_TEXT
&&
cfb
->
dispsw
!=
&
fbcon_dummy
)
display
->
dispsw
=
&
fbcon_cyber_accel
;
else
display
->
dispsw
=
cfb
->
dispsw
;
cfb
->
fb
.
fix
.
line_length
=
display
->
next_line
;
display
->
line_length
=
cfb
->
fb
.
fix
.
line_length
;
display
->
visual
=
cfb
->
fb
.
fix
.
visual
;
display
->
type
=
cfb
->
fb
.
fix
.
type
;
display
->
type_aux
=
cfb
->
fb
.
fix
.
type_aux
;
display
->
ypanstep
=
cfb
->
fb
.
fix
.
ypanstep
;
display
->
ywrapstep
=
cfb
->
fb
.
fix
.
ywrapstep
;
display
->
can_soft_blank
=
1
;
display
->
inverse
=
0
;
display
->
var
=
*
var
;
display
->
var
.
activate
&=
~
FB_ACTIVATE_ALL
;
cfb
->
fb
.
var
=
display
->
var
;
/*
* If we are setting all the virtual consoles, also set the
* defaults used to create new consoles.
*/
if
(
var
->
activate
&
FB_ACTIVATE_ALL
)
cfb
->
fb
.
disp
->
var
=
display
->
var
;
if
(
chgvar
&&
info
&&
cfb
->
fb
.
changevar
)
cfb
->
fb
.
changevar
(
con
);
cyber2000fb_update_start
(
cfb
,
var
);
cyber2000fb_set_timing
(
cfb
,
&
hw
);
cyber2000fb_update_start
(
cfb
,
var
);
fb_set_cmap
(
&
cfb
->
fb
.
cmap
,
1
,
&
cfb
->
fb
);
if
(
chgvar
&&
cfb
->
fb
.
changevar
)
cfb
->
fb
.
changevar
(
con
);
return
0
;
}
...
...
@@ -1044,14 +1169,7 @@ static int cyber2000fb_switch(int con, struct fb_info *info)
/*
* (Un)Blank the display.
*/
static
int
cyber2000fb_blank
(
int
blank
,
struct
fb_info
*
info
)
{
struct
cfb_info
*
cfb
=
(
struct
cfb_info
*
)
info
;
unsigned
int
sync
=
0
;
int
i
;
/*
*
* Blank the screen if blank_mode != 0, else unblank. If
* blank == NULL then the caller blanks by setting the CLUT
* (Color Look Up Table) to all black. Return 0 if blanking
...
...
@@ -1066,6 +1184,11 @@ static int cyber2000fb_blank(int blank, struct fb_info *info)
* wms...Enable VESA DMPS compatible powerdown mode
* run "setterm -powersave powerdown" to take advantage
*/
static
int
cyber2000fb_blank
(
int
blank
,
struct
fb_info
*
info
)
{
struct
cfb_info
*
cfb
=
(
struct
cfb_info
*
)
info
;
unsigned
int
sync
=
0
;
int
i
;
switch
(
blank
)
{
case
4
:
/* powerdown - both sync lines down */
...
...
@@ -1078,44 +1201,54 @@ static int cyber2000fb_blank(int blank, struct fb_info *info)
sync
=
EXT_SYNC_CTL_VS_0
|
EXT_SYNC_CTL_HS_NORMAL
;
break
;
case
1
:
/* soft blank */
break
;
default:
/* unblank */
break
;
}
cyber2000_grphw
(
EXT_SYNC_CTL
,
sync
,
cfb
);
switch
(
blank
)
{
case
4
:
case
3
:
case
2
:
case
1
:
/* soft blank */
if
(
blank
<=
1
)
{
/* turn on ramdacs */
cfb
->
ramdac_powerdown
&=
~
(
RAMDAC_DACPWRDN
|
RAMDAC_BYPASS
|
RAMDAC_RAMPWRDN
);
cyber2000fb_write_ramdac_ctrl
(
cfb
);
}
/*
* Soft blank/unblank the display.
*/
if
(
blank
)
{
/* soft blank */
for
(
i
=
0
;
i
<
NR_PALETTE
;
i
++
)
{
cyber2000fb_writeb
(
i
,
0x3c8
,
cfb
);
cyber2000fb_writeb
(
0
,
0x3c9
,
cfb
);
cyber2000fb_writeb
(
0
,
0x3c9
,
cfb
);
cyber2000fb_writeb
(
0
,
0x3c9
,
cfb
);
}
break
;
default:
/* unblank */
}
else
{
/* unblank */
for
(
i
=
0
;
i
<
NR_PALETTE
;
i
++
)
{
cyber2000fb_writeb
(
i
,
0x3c8
,
cfb
);
cyber2000fb_writeb
(
cfb
->
palette
[
i
].
red
,
0x3c9
,
cfb
);
cyber2000fb_writeb
(
cfb
->
palette
[
i
].
green
,
0x3c9
,
cfb
);
cyber2000fb_writeb
(
cfb
->
palette
[
i
].
blue
,
0x3c9
,
cfb
);
}
break
;
}
if
(
blank
>=
2
)
{
/* turn off ramdacs */
cfb
->
ramdac_powerdown
|=
RAMDAC_DACPWRDN
|
RAMDAC_BYPASS
|
RAMDAC_RAMPWRDN
;
cyber2000fb_write_ramdac_ctrl
(
cfb
);
}
return
0
;
}
static
struct
fb_ops
cyber2000fb_ops
=
{
.
owner
=
THIS_MODULE
,
.
fb_set_var
=
cyber2000fb_set_var
,
.
fb_get_cmap
=
gen_get_cmap
,
.
fb_set_cmap
=
gen_set_cmap
,
.
fb_setcolreg
=
cyber2000fb_setcolreg
,
.
fb_pan_display
=
cyber2000fb_pan_display
,
.
fb_blank
=
cyber2000fb_blank
,
.
fb_get_cmap
=
gen_get_cmap
,
.
fb_set_cmap
=
gen_set_cmap
,
};
/*
...
...
@@ -1265,7 +1398,7 @@ static void cyberpro_init_hw(struct cfb_info *cfb)
for
(
i
=
0
;
i
<
sizeof
(
igs_regs
);
i
+=
2
)
cyber2000_grphw
(
igs_regs
[
i
],
igs_regs
[
i
+
1
],
cfb
);
if
(
cfb
->
fb
.
fix
.
accel
==
FB_ACCEL_IGS_CYBER
5000
)
{
if
(
cfb
->
id
==
ID_CYBERPRO_
5000
)
{
unsigned
char
val
;
cyber2000fb_writeb
(
0xba
,
0x3ce
,
cfb
);
val
=
cyber2000fb_readb
(
0x3cf
,
cfb
)
&
0x80
;
...
...
@@ -1286,6 +1419,8 @@ cyberpro_alloc_fb_info(unsigned int id, char *name)
memset
(
cfb
,
0
,
sizeof
(
struct
cfb_info
)
+
sizeof
(
struct
display
));
cfb
->
id
=
id
;
if
(
id
==
ID_CYBERPRO_5000
)
cfb
->
ref_ps
=
40690
;
// 24.576 MHz
else
...
...
@@ -1403,6 +1538,8 @@ static int __devinit cyberpro_common_probe(struct cfb_info *cfb)
u_int
h_sync
,
v_sync
;
int
err
;
cyberpro_init_hw
(
cfb
);
/*
* Get the video RAM size and width from the VGA register.
* This should have been already initialised by the BIOS,
...
...
@@ -1521,8 +1658,6 @@ cyberpro_vl_probe(void)
cfb
->
mclk_mult
=
0xdb
;
cfb
->
mclk_div
=
0x54
;
cyberpro_init_hw
(
cfb
);
err
=
cyberpro_common_probe
(
cfb
);
if
(
err
)
goto
failed
;
...
...
@@ -1559,6 +1694,8 @@ cyberpro_vl_probe(void)
*/
static
int
cyberpro_pci_enable_mmio
(
struct
cfb_info
*
cfb
)
{
unsigned
char
val
;
#if defined(__sparc_v9__)
#error "You loose, consult DaveM."
#elif defined(__sparc__)
...
...
@@ -1593,6 +1730,22 @@ static int cyberpro_pci_enable_mmio(struct cfb_info *cfb)
outb
(
EXT_BIU_MISC
,
0x3ce
);
outb
(
EXT_BIU_MISC_LIN_ENABLE
,
0x3cf
);
#endif
/*
* Allow the CyberPro to accept PCI burst accesses
*/
val
=
cyber2000_grphr
(
EXT_BUS_CTL
,
cfb
);
if
(
!
(
val
&
EXT_BUS_CTL_PCIBURST_WRITE
))
{
printk
(
KERN_INFO
"%s: enabling PCI bursts
\n
"
,
cfb
->
fb
.
fix
.
id
);
val
|=
EXT_BUS_CTL_PCIBURST_WRITE
;
if
(
cfb
->
id
==
ID_CYBERPRO_5000
)
val
|=
EXT_BUS_CTL_PCIBURST_READ
;
cyber2000_grphw
(
EXT_BUS_CTL
,
val
,
cfb
);
}
return
0
;
}
...
...
@@ -1652,8 +1805,6 @@ cyberpro_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
cfb
->
mclk_div
=
0x54
;
#endif
cyberpro_init_hw
(
cfb
);
err
=
cyberpro_common_probe
(
cfb
);
if
(
err
)
goto
failed
;
...
...
@@ -1758,17 +1909,20 @@ static struct pci_driver cyberpro_driver = {
*/
int
__init
cyber2000fb_init
(
void
)
{
int
ret
=
-
1
,
err
=
-
ENODEV
;
int
ret
=
-
1
,
err
;
#ifdef CONFIG_ARCH_SHARK
err
=
cyberpro_vl_probe
();
if
(
!
err
)
{
ret
=
err
;
ret
=
0
;
MOD_INC_USE_COUNT
;
}
#endif
#ifdef CONFIG_PCI
err
=
pci_module_init
(
&
cyberpro_driver
);
if
(
!
err
)
ret
=
err
;
ret
=
0
;
#endif
return
ret
?
err
:
0
;
}
...
...
drivers/video/cyber2000fb.h
View file @
63ffa3f0
...
...
@@ -36,9 +36,15 @@ static void debug_printf(char *fmt, ...)
#define debug_printf(x...) do { } while (0)
#endif
#define PIXFORMAT_8BPP 0
#define PIXFORMAT_16BPP 1
#define PIXFORMAT_24BPP 2
#define RAMDAC_RAMPWRDN 0x01
#define RAMDAC_DAC8BIT 0x02
#define RAMDAC_VREFEN 0x04
#define RAMDAC_BYPASS 0x10
#define RAMDAC_DACPWRDN 0x40
#define EXT_CRT_VRTOFL 0x11
#define EXT_CRT_VRTOFL_LINECOMP10 0x10
#define EXT_CRT_VRTOFL_INTERLACE 0x20
#define EXT_CRT_IRQ 0x12
#define EXT_CRT_IRQ_ENABLE 0x01
...
...
@@ -61,7 +67,8 @@ static void debug_printf(char *fmt, ...)
#define EXT_BUS_CTL_LIN_2MB 0x01
#define EXT_BUS_CTL_LIN_4MB 0x02
#define EXT_BUS_CTL_ZEROWAIT 0x04
#define EXT_BUS_CTL_PCIBURST 0x20
#define EXT_BUS_CTL_PCIBURST_WRITE 0x20
#define EXT_BUS_CTL_PCIBURST_READ 0x80
/* CyberPro 5000 only */
#define EXT_SEG_WRITE_PTR 0x31
#define EXT_SEG_READ_PTR 0x32
...
...
@@ -401,24 +408,54 @@ static void debug_printf(char *fmt, ...)
/*
* Graphics Co-processor
*/
#define CO_REG_CONTROL 0xbf011
#define CO_CTRL_BUSY 0x80
#define CO_CTRL_CMDFULL 0x04
#define CO_CTRL_FIFOEMPTY 0x02
#define CO_CTRL_READY 0x01
#define CO_REG_SRC_WIDTH 0xbf018
#define CO_REG_PIXFMT 0xbf01c
#define CO_PIXFMT_32BPP 0x03
#define CO_PIXFMT_24BPP 0x02
#define CO_PIXFMT_16BPP 0x01
#define CO_PIXFMT_8BPP 0x00
#define CO_REG_FGMIX 0xbf048
#define CO_FG_MIX_ZERO 0x00
#define CO_FG_MIX_SRC_AND_DST 0x01
#define CO_FG_MIX_SRC_AND_NDST 0x02
#define CO_FG_MIX_SRC 0x03
#define CO_FG_MIX_NSRC_AND_DST 0x04
#define CO_FG_MIX_DST 0x05
#define CO_FG_MIX_SRC_XOR_DST 0x06
#define CO_FG_MIX_SRC_OR_DST 0x07
#define CO_FG_MIX_NSRC_AND_NDST 0x08
#define CO_FG_MIX_SRC_XOR_NDST 0x09
#define CO_FG_MIX_NDST 0x0a
#define CO_FG_MIX_SRC_OR_NDST 0x0b
#define CO_FG_MIX_NSRC 0x0c
#define CO_FG_MIX_NSRC_OR_DST 0x0d
#define CO_FG_MIX_NSRC_OR_NDST 0x0e
#define CO_FG_MIX_ONES 0x0f
#define CO_REG_FGCOLOUR 0xbf058
#define CO_REG_BGCOLOUR 0xbf05c
#define CO_REG_PIXWIDTH 0xbf060
#define CO_REG_PIXHEIGHT 0xbf062
#define CO_REG_X_PHASE 0xbf078
#define CO_REG_CMD_L 0xbf07c
#define CO_CMD_L_PATTERN_FGCOL 0x8000
#define CO_CMD_L_INC_LEFT 0x0004
#define CO_CMD_L_INC_UP 0x0002
#define CO_CMD_H_SRC_PIXMAP 0x2000
#define CO_REG_CMD_H 0xbf07e
#define CO_CMD_H_BGSRCMAP 0x8000
/* otherwise bg colour */
#define CO_CMD_H_FGSRCMAP 0x2000
/* otherwise fg colour */
#define CO_CMD_H_BLITTER 0x0800
#define CO_REG_CONTROL 0xbf011
#define CO_REG_SRC_WIDTH 0xbf018
#define CO_REG_PIX_FORMAT 0xbf01c
#define CO_REG_FORE_MIX 0xbf048
#define CO_REG_FOREGROUND 0xbf058
#define CO_REG_WIDTH 0xbf060
#define CO_REG_HEIGHT 0xbf062
#define CO_REG_X_PHASE 0xbf078
#define CO_REG_CMD_L 0xbf07c
#define CO_REG_CMD_H 0xbf07e
#define CO_REG_SRC_PTR 0xbf170
#define CO_REG_SRC1_PTR 0xbf170
#define CO_REG_SRC2_PTR 0xbf174
#define CO_REG_DEST_PTR 0xbf178
#define CO_REG_DEST_WIDTH 0xbf218
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment