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
nexedi
linux
Commits
646c3054
Commit
646c3054
authored
Dec 30, 2002
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://are.twiddle.net/tga-2.5
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
b59d9fff
6a57858a
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
281 additions
and
1 deletion
+281
-1
drivers/video/tgafb.c
drivers/video/tgafb.c
+254
-1
include/video/tgafb.h
include/video/tgafb.h
+27
-0
No files found.
drivers/video/tgafb.c
View file @
646c3054
...
@@ -39,6 +39,9 @@ static int tgafb_setcolreg(unsigned, unsigned, unsigned, unsigned,
...
@@ -39,6 +39,9 @@ static int tgafb_setcolreg(unsigned, unsigned, unsigned, unsigned,
unsigned
,
struct
fb_info
*
);
unsigned
,
struct
fb_info
*
);
static
int
tgafb_blank
(
int
,
struct
fb_info
*
);
static
int
tgafb_blank
(
int
,
struct
fb_info
*
);
static
void
tgafb_init_fix
(
struct
fb_info
*
);
static
void
tgafb_init_fix
(
struct
fb_info
*
);
static
void
tgafb_imageblit
(
struct
fb_info
*
,
struct
fb_image
*
);
static
int
tgafb_pci_register
(
struct
pci_dev
*
,
const
struct
pci_device_id
*
);
static
int
tgafb_pci_register
(
struct
pci_dev
*
,
const
struct
pci_device_id
*
);
#ifdef MODULE
#ifdef MODULE
static
void
tgafb_pci_unregister
(
struct
pci_dev
*
);
static
void
tgafb_pci_unregister
(
struct
pci_dev
*
);
...
@@ -59,7 +62,7 @@ static struct fb_ops tgafb_ops = {
...
@@ -59,7 +62,7 @@ static struct fb_ops tgafb_ops = {
.
fb_blank
=
tgafb_blank
,
.
fb_blank
=
tgafb_blank
,
.
fb_fillrect
=
cfb_fillrect
,
.
fb_fillrect
=
cfb_fillrect
,
.
fb_copyarea
=
cfb_copyarea
,
.
fb_copyarea
=
cfb_copyarea
,
.
fb_imageblit
=
c
fb_imageblit
,
.
fb_imageblit
=
tga
fb_imageblit
,
.
fb_cursor
=
soft_cursor
,
.
fb_cursor
=
soft_cursor
,
};
};
...
@@ -499,6 +502,256 @@ tgafb_blank(int blank, struct fb_info *info)
...
@@ -499,6 +502,256 @@ tgafb_blank(int blank, struct fb_info *info)
}
}
/*
* Acceleration.
*/
static
void
tgafb_imageblit
(
struct
fb_info
*
info
,
struct
fb_image
*
image
)
{
static
unsigned
char
const
bitrev
[
256
]
=
{
0x00
,
0x80
,
0x40
,
0xc0
,
0x20
,
0xa0
,
0x60
,
0xe0
,
0x10
,
0x90
,
0x50
,
0xd0
,
0x30
,
0xb0
,
0x70
,
0xf0
,
0x08
,
0x88
,
0x48
,
0xc8
,
0x28
,
0xa8
,
0x68
,
0xe8
,
0x18
,
0x98
,
0x58
,
0xd8
,
0x38
,
0xb8
,
0x78
,
0xf8
,
0x04
,
0x84
,
0x44
,
0xc4
,
0x24
,
0xa4
,
0x64
,
0xe4
,
0x14
,
0x94
,
0x54
,
0xd4
,
0x34
,
0xb4
,
0x74
,
0xf4
,
0x0c
,
0x8c
,
0x4c
,
0xcc
,
0x2c
,
0xac
,
0x6c
,
0xec
,
0x1c
,
0x9c
,
0x5c
,
0xdc
,
0x3c
,
0xbc
,
0x7c
,
0xfc
,
0x02
,
0x82
,
0x42
,
0xc2
,
0x22
,
0xa2
,
0x62
,
0xe2
,
0x12
,
0x92
,
0x52
,
0xd2
,
0x32
,
0xb2
,
0x72
,
0xf2
,
0x0a
,
0x8a
,
0x4a
,
0xca
,
0x2a
,
0xaa
,
0x6a
,
0xea
,
0x1a
,
0x9a
,
0x5a
,
0xda
,
0x3a
,
0xba
,
0x7a
,
0xfa
,
0x06
,
0x86
,
0x46
,
0xc6
,
0x26
,
0xa6
,
0x66
,
0xe6
,
0x16
,
0x96
,
0x56
,
0xd6
,
0x36
,
0xb6
,
0x76
,
0xf6
,
0x0e
,
0x8e
,
0x4e
,
0xce
,
0x2e
,
0xae
,
0x6e
,
0xee
,
0x1e
,
0x9e
,
0x5e
,
0xde
,
0x3e
,
0xbe
,
0x7e
,
0xfe
,
0x01
,
0x81
,
0x41
,
0xc1
,
0x21
,
0xa1
,
0x61
,
0xe1
,
0x11
,
0x91
,
0x51
,
0xd1
,
0x31
,
0xb1
,
0x71
,
0xf1
,
0x09
,
0x89
,
0x49
,
0xc9
,
0x29
,
0xa9
,
0x69
,
0xe9
,
0x19
,
0x99
,
0x59
,
0xd9
,
0x39
,
0xb9
,
0x79
,
0xf9
,
0x05
,
0x85
,
0x45
,
0xc5
,
0x25
,
0xa5
,
0x65
,
0xe5
,
0x15
,
0x95
,
0x55
,
0xd5
,
0x35
,
0xb5
,
0x75
,
0xf5
,
0x0d
,
0x8d
,
0x4d
,
0xcd
,
0x2d
,
0xad
,
0x6d
,
0xed
,
0x1d
,
0x9d
,
0x5d
,
0xdd
,
0x3d
,
0xbd
,
0x7d
,
0xfd
,
0x03
,
0x83
,
0x43
,
0xc3
,
0x23
,
0xa3
,
0x63
,
0xe3
,
0x13
,
0x93
,
0x53
,
0xd3
,
0x33
,
0xb3
,
0x73
,
0xf3
,
0x0b
,
0x8b
,
0x4b
,
0xcb
,
0x2b
,
0xab
,
0x6b
,
0xeb
,
0x1b
,
0x9b
,
0x5b
,
0xdb
,
0x3b
,
0xbb
,
0x7b
,
0xfb
,
0x07
,
0x87
,
0x47
,
0xc7
,
0x27
,
0xa7
,
0x67
,
0xe7
,
0x17
,
0x97
,
0x57
,
0xd7
,
0x37
,
0xb7
,
0x77
,
0xf7
,
0x0f
,
0x8f
,
0x4f
,
0xcf
,
0x2f
,
0xaf
,
0x6f
,
0xef
,
0x1f
,
0x9f
,
0x5f
,
0xdf
,
0x3f
,
0xbf
,
0x7f
,
0xff
};
struct
tga_par
*
par
=
(
struct
tga_par
*
)
info
->
par
;
u32
fgcolor
,
bgcolor
,
dx
,
dy
,
width
,
height
,
vxres
,
vyres
,
pixelmask
;
unsigned
long
rincr
,
line_length
,
shift
,
pos
,
is8bpp
;
unsigned
long
i
,
j
,
k
;
const
unsigned
char
*
data
;
void
*
regs_base
,
*
fb_base
;
dx
=
image
->
dx
;
dy
=
image
->
dy
;
width
=
image
->
width
;
height
=
image
->
height
;
vxres
=
info
->
var
.
xres_virtual
;
vyres
=
info
->
var
.
yres_virtual
;
line_length
=
info
->
fix
.
line_length
;
rincr
=
(
width
+
7
)
/
8
;
/* Crop the image to the screen. */
if
(
dx
>
vxres
||
dy
>
vyres
)
return
;
if
(
dx
+
width
>
vxres
)
width
=
vxres
-
dx
;
if
(
dy
+
height
>
vyres
)
height
=
vyres
-
dy
;
/* For copies that aren't pixel expansion, there's little we
can do better than the generic code. */
/* ??? There is a DMA write mode; I wonder if that could be
made to pull the data from the image buffer... */
if
(
image
->
depth
>
1
)
{
cfb_imageblit
(
info
,
image
);
return
;
}
regs_base
=
par
->
tga_regs_base
;
fb_base
=
par
->
tga_fb_base
;
is8bpp
=
par
->
tga_type
==
TGA_TYPE_8PLANE
;
/* Expand the color values to fill 32-bits. */
/* ??? Would be nice to notice colour changes elsewhere, so
that we can do this only when necessary. */
fgcolor
=
image
->
fg_color
;
bgcolor
=
image
->
bg_color
;
if
(
is8bpp
)
{
fgcolor
|=
fgcolor
<<
8
;
fgcolor
|=
fgcolor
<<
16
;
bgcolor
|=
bgcolor
<<
8
;
bgcolor
|=
bgcolor
<<
16
;
}
else
{
fgcolor
=
((
u32
*
)
info
->
pseudo_palette
)[
fgcolor
];
bgcolor
=
((
u32
*
)
info
->
pseudo_palette
)[
bgcolor
];
}
__raw_writel
(
fgcolor
,
regs_base
+
TGA_FOREGROUND_REG
);
__raw_writel
(
bgcolor
,
regs_base
+
TGA_BACKGROUND_REG
);
/* Acquire proper alignment; set up the PIXELMASK register
so that we only write the proper character cell. */
pos
=
dy
*
line_length
+
dx
;
if
(
is8bpp
)
{
shift
=
pos
&
3
;
pos
&=
-
4
;
}
else
{
shift
=
(
pos
&
7
)
>>
2
;
pos
&=
-
8
;
}
data
=
(
const
unsigned
char
*
)
image
->
data
;
/* Enable opaque stipple mode. */
__raw_writel
((
is8bpp
?
TGA_MODE_SBM_8BPP
|
TGA_MODE_OPAQUE_STIPPLE
:
TGA_MODE_SBM_24BPP
|
TGA_MODE_OPAQUE_STIPPLE
),
regs_base
+
TGA_MODE_REG
);
if
(
width
+
shift
<=
32
)
{
unsigned
long
bwidth
;
/* Handle common case of imaging a single character, in
a font less than 32 pixels wide. */
pixelmask
=
(
1
<<
width
)
-
1
;
pixelmask
<<=
shift
;
__raw_writel
(
pixelmask
,
regs_base
+
TGA_PIXELMASK_REG
);
wmb
();
bwidth
=
(
width
+
7
)
/
8
;
for
(
i
=
0
;
i
<
height
;
++
i
)
{
u32
mask
=
0
;
/* The image data is bit big endian; we need
little endian. */
for
(
j
=
0
;
j
<
bwidth
;
++
j
)
mask
|=
bitrev
[
data
[
j
]]
<<
(
j
*
8
);
__raw_writel
(
mask
<<
shift
,
fb_base
+
pos
);
pos
+=
line_length
;
data
+=
rincr
;
}
wmb
();
__raw_writel
(
0xffffffff
,
regs_base
+
TGA_PIXELMASK_REG
);
}
else
if
(
shift
==
0
)
{
unsigned
long
pos0
=
pos
;
const
unsigned
char
*
data0
=
data
;
unsigned
long
bincr
=
(
is8bpp
?
8
:
8
*
4
);
unsigned
long
bwidth
;
/* Handle another common case in which accel_putcs
generates a large bitmap, which happens to be aligned.
Allow the tail to be misaligned. This case is
interesting because we've not got to hold partial
bytes across the words being written. */
wmb
();
bwidth
=
(
width
/
8
)
&
-
4
;
for
(
i
=
0
;
i
<
height
;
++
i
)
{
for
(
j
=
0
;
j
<
bwidth
;
j
+=
4
)
{
u32
mask
=
0
;
for
(
k
=
0
;
k
<
4
;
++
k
)
mask
|=
bitrev
[
data
[
j
+
k
]]
<<
(
k
*
8
);
__raw_writel
(
mask
,
fb_base
+
pos
+
j
*
bincr
);
}
pos
+=
line_length
;
data
+=
rincr
;
}
wmb
();
pixelmask
=
(
1ul
<<
(
width
&
31
))
-
1
;
if
(
pixelmask
)
{
__raw_writel
(
pixelmask
,
regs_base
+
TGA_PIXELMASK_REG
);
wmb
();
pos
=
pos0
+
bwidth
*
bincr
;
data
=
data0
+
bwidth
;
bwidth
=
((
width
&
31
)
+
7
)
/
8
;
for
(
i
=
0
;
i
<
height
;
++
i
)
{
u32
mask
=
0
;
for
(
k
=
0
;
k
<
bwidth
;
++
k
)
mask
|=
bitrev
[
data
[
k
]]
<<
(
k
*
8
);
__raw_writel
(
mask
,
fb_base
+
pos
);
pos
+=
line_length
;
data
+=
rincr
;
}
wmb
();
__raw_writel
(
0xffffffff
,
regs_base
+
TGA_PIXELMASK_REG
);
}
}
else
{
unsigned
long
pos0
=
pos
;
const
unsigned
char
*
data0
=
data
;
unsigned
long
bincr
=
(
is8bpp
?
8
:
8
*
4
);
unsigned
long
bwidth
;
/* Finally, handle the generic case of misaligned start.
Here we split the write into 16-bit spans. This allows
us to use only one pixel mask, instead of four as would
be required by writing 24-bit spans. */
pixelmask
=
0xffff
<<
shift
;
__raw_writel
(
pixelmask
,
regs_base
+
TGA_PIXELMASK_REG
);
wmb
();
bwidth
=
(
width
/
8
)
&
-
2
;
for
(
i
=
0
;
i
<
height
;
++
i
)
{
for
(
j
=
0
;
j
<
bwidth
;
j
+=
2
)
{
u32
mask
;
mask
=
bitrev
[
data
[
j
]];
mask
|=
bitrev
[
data
[
j
+
1
]]
<<
8
;
mask
<<=
shift
;
__raw_writel
(
mask
,
fb_base
+
pos
+
j
*
bincr
);
}
pos
+=
line_length
;
data
+=
rincr
;
}
wmb
();
pixelmask
=
((
1ul
<<
(
width
&
15
))
-
1
)
<<
shift
;
if
(
pixelmask
)
{
__raw_writel
(
pixelmask
,
regs_base
+
TGA_PIXELMASK_REG
);
wmb
();
pos
=
pos0
+
bwidth
*
bincr
;
data
=
data0
+
bwidth
;
bwidth
=
(
width
&
15
)
>
8
;
for
(
i
=
0
;
i
<
height
;
++
i
)
{
u32
mask
=
bitrev
[
data
[
0
]];
if
(
bwidth
)
mask
|=
bitrev
[
data
[
1
]]
<<
8
;
mask
<<=
shift
;
__raw_writel
(
mask
,
fb_base
+
pos
);
pos
+=
line_length
;
data
+=
rincr
;
}
wmb
();
}
__raw_writel
(
0xffffffff
,
regs_base
+
TGA_PIXELMASK_REG
);
}
/* Disable opaque stipple mode. */
__raw_writel
((
is8bpp
?
TGA_MODE_SBM_8BPP
|
TGA_MODE_SIMPLE
:
TGA_MODE_SBM_24BPP
|
TGA_MODE_SIMPLE
),
regs_base
+
TGA_MODE_REG
);
}
/*
/*
* Initialisation
* Initialisation
*/
*/
...
...
include/video/tgafb.h
View file @
646c3054
...
@@ -31,7 +31,10 @@
...
@@ -31,7 +31,10 @@
#define TGA_24PLANE_FB_OFFSET 0x0804000
#define TGA_24PLANE_FB_OFFSET 0x0804000
#define TGA_24PLUSZ_FB_OFFSET 0x1004000
#define TGA_24PLUSZ_FB_OFFSET 0x1004000
#define TGA_FOREGROUND_REG 0x0020
#define TGA_BACKGROUND_REG 0x0024
#define TGA_PLANEMASK_REG 0x0028
#define TGA_PLANEMASK_REG 0x0028
#define TGA_PIXELMASK_ONESHOT_REG 0x002c
#define TGA_MODE_REG 0x0030
#define TGA_MODE_REG 0x0030
#define TGA_RASTEROP_REG 0x0034
#define TGA_RASTEROP_REG 0x0034
#define TGA_PIXELSHIFT_REG 0x0038
#define TGA_PIXELSHIFT_REG 0x0038
...
@@ -47,6 +50,14 @@
...
@@ -47,6 +50,14 @@
#define TGA_RAMDAC_SETUP_REG 0x00c0
#define TGA_RAMDAC_SETUP_REG 0x00c0
#define TGA_BLOCK_COLOR0_REG 0x0140
#define TGA_BLOCK_COLOR0_REG 0x0140
#define TGA_BLOCK_COLOR1_REG 0x0144
#define TGA_BLOCK_COLOR1_REG 0x0144
#define TGA_BLOCK_COLOR2_REG 0x0148
#define TGA_BLOCK_COLOR3_REG 0x014c
#define TGA_BLOCK_COLOR4_REG 0x0150
#define TGA_BLOCK_COLOR5_REG 0x0154
#define TGA_BLOCK_COLOR6_REG 0x0158
#define TGA_BLOCK_COLOR7_REG 0x015c
#define TGA_COPY64_SRC 0x0160
#define TGA_COPY64_DST 0x0164
#define TGA_CLOCK_REG 0x01e8
#define TGA_CLOCK_REG 0x01e8
#define TGA_RAMDAC_REG 0x01f0
#define TGA_RAMDAC_REG 0x01f0
#define TGA_CMD_STAT_REG 0x01f8
#define TGA_CMD_STAT_REG 0x01f8
...
@@ -76,6 +87,22 @@
...
@@ -76,6 +87,22 @@
#define TGA_VALID_BLANK 0x02
#define TGA_VALID_BLANK 0x02
#define TGA_VALID_CURSOR 0x04
#define TGA_VALID_CURSOR 0x04
#define TGA_MODE_SBM_8BPP 0x000
#define TGA_MODE_SBM_24BPP 0x300
#define TGA_MODE_SIMPLE 0x00
#define TGA_MODE_SIMPLEZ 0x10
#define TGA_MODE_OPAQUE_STIPPLE 0x01
#define TGA_MODE_OPAQUE_FILL 0x21
#define TGA_MODE_TRANSPARENT_STIPPLE 0x03
#define TGA_MODE_TRANSPARENT_FILL 0x23
#define TGA_MODE_BLOCK_STIPPLE 0x0d
#define TGA_MODE_BLOCK_FILL 0x2d
#define TGA_MODE_COPY 0x07
#define TGA_MODE_DMA_READ_COPY_ND 0x17
#define TGA_MODE_DMA_READ_COPY_D 0x37
#define TGA_MODE_DMA_WRITE_COPY 0x1f
/*
/*
* Useful defines for managing the ICS1562 PLL clock
* Useful defines for managing the ICS1562 PLL clock
...
...
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