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
563737c5
Commit
563737c5
authored
Dec 11, 2018
by
Ben Skeggs
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
drm/nouveau/kms/tu104: initial support
Signed-off-by:
Ben Skeggs
<
bskeggs@redhat.com
>
parent
c36322d2
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
457 additions
and
19 deletions
+457
-19
drivers/gpu/drm/nouveau/dispnv50/Kbuild
drivers/gpu/drm/nouveau/dispnv50/Kbuild
+3
-0
drivers/gpu/drm/nouveau/dispnv50/atom.h
drivers/gpu/drm/nouveau/dispnv50/atom.h
+2
-2
drivers/gpu/drm/nouveau/dispnv50/core.c
drivers/gpu/drm/nouveau/dispnv50/core.c
+1
-0
drivers/gpu/drm/nouveau/dispnv50/core.h
drivers/gpu/drm/nouveau/dispnv50/core.h
+4
-0
drivers/gpu/drm/nouveau/dispnv50/corec37d.c
drivers/gpu/drm/nouveau/dispnv50/corec37d.c
+2
-2
drivers/gpu/drm/nouveau/dispnv50/corec57d.c
drivers/gpu/drm/nouveau/dispnv50/corec57d.c
+61
-0
drivers/gpu/drm/nouveau/dispnv50/curs.c
drivers/gpu/drm/nouveau/dispnv50/curs.c
+1
-0
drivers/gpu/drm/nouveau/dispnv50/head.h
drivers/gpu/drm/nouveau/dispnv50/head.h
+10
-0
drivers/gpu/drm/nouveau/dispnv50/headc37d.c
drivers/gpu/drm/nouveau/dispnv50/headc37d.c
+5
-5
drivers/gpu/drm/nouveau/dispnv50/headc57d.c
drivers/gpu/drm/nouveau/dispnv50/headc57d.c
+206
-0
drivers/gpu/drm/nouveau/dispnv50/wimm.c
drivers/gpu/drm/nouveau/dispnv50/wimm.c
+1
-0
drivers/gpu/drm/nouveau/dispnv50/wndw.c
drivers/gpu/drm/nouveau/dispnv50/wndw.c
+1
-0
drivers/gpu/drm/nouveau/dispnv50/wndw.h
drivers/gpu/drm/nouveau/dispnv50/wndw.h
+17
-0
drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
+10
-10
drivers/gpu/drm/nouveau/dispnv50/wndwc57e.c
drivers/gpu/drm/nouveau/dispnv50/wndwc57e.c
+133
-0
No files found.
drivers/gpu/drm/nouveau/dispnv50/Kbuild
View file @
563737c5
...
...
@@ -7,6 +7,7 @@ nouveau-y += dispnv50/core827d.o
nouveau-y += dispnv50/core907d.o
nouveau-y += dispnv50/core917d.o
nouveau-y += dispnv50/corec37d.o
nouveau-y += dispnv50/corec57d.o
nouveau-y += dispnv50/dac507d.o
nouveau-y += dispnv50/dac907d.o
...
...
@@ -23,12 +24,14 @@ nouveau-y += dispnv50/head827d.o
nouveau-y += dispnv50/head907d.o
nouveau-y += dispnv50/head917d.o
nouveau-y += dispnv50/headc37d.o
nouveau-y += dispnv50/headc57d.o
nouveau-y += dispnv50/wimm.o
nouveau-y += dispnv50/wimmc37b.o
nouveau-y += dispnv50/wndw.o
nouveau-y += dispnv50/wndwc37e.o
nouveau-y += dispnv50/wndwc57e.o
nouveau-y += dispnv50/base.o
nouveau-y += dispnv50/base507c.o
...
...
drivers/gpu/drm/nouveau/dispnv50/atom.h
View file @
563737c5
...
...
@@ -54,7 +54,7 @@ struct nv50_head_atom {
u64
offset
:
40
;
u8
buffer
:
1
;
u8
mode
:
4
;
u
8
size
:
2
;
u
16
size
:
11
;
u8
range
:
2
;
u8
output_mode
:
2
;
void
(
*
load
)(
struct
drm_color_lut
*
,
int
size
,
void
__iomem
*
);
...
...
@@ -170,7 +170,7 @@ struct nv50_wndw_atom {
u8
buffer
:
1
;
u8
enable
:
2
;
u8
mode
:
4
;
u
8
size
:
2
;
u
16
size
:
11
;
u8
range
:
2
;
u8
output_mode
:
2
;
void
(
*
load
)(
struct
drm_color_lut
*
,
int
size
,
...
...
drivers/gpu/drm/nouveau/dispnv50/core.c
View file @
563737c5
...
...
@@ -42,6 +42,7 @@ nv50_core_new(struct nouveau_drm *drm, struct nv50_core **pcore)
int
version
;
int
(
*
new
)(
struct
nouveau_drm
*
,
s32
,
struct
nv50_core
**
);
}
cores
[]
=
{
{
TU104_DISP_CORE_CHANNEL_DMA
,
0
,
corec57d_new
},
{
GV100_DISP_CORE_CHANNEL_DMA
,
0
,
corec37d_new
},
{
GP102_DISP_CORE_CHANNEL_DMA
,
0
,
core917d_new
},
{
GP100_DISP_CORE_CHANNEL_DMA
,
0
,
core917d_new
},
...
...
drivers/gpu/drm/nouveau/dispnv50/core.h
View file @
563737c5
...
...
@@ -46,5 +46,9 @@ extern const struct nv50_outp_func sor907d;
int
core917d_new
(
struct
nouveau_drm
*
,
s32
,
struct
nv50_core
**
);
int
corec37d_new
(
struct
nouveau_drm
*
,
s32
,
struct
nv50_core
**
);
int
corec37d_ntfy_wait_done
(
struct
nouveau_bo
*
,
u32
,
struct
nvif_device
*
);
void
corec37d_update
(
struct
nv50_core
*
,
u32
*
,
bool
);
extern
const
struct
nv50_outp_func
sorc37d
;
int
corec57d_new
(
struct
nouveau_drm
*
,
s32
,
struct
nv50_core
**
);
#endif
drivers/gpu/drm/nouveau/dispnv50/corec37d.c
View file @
563737c5
...
...
@@ -24,7 +24,7 @@
#include <nouveau_bo.h>
static
void
void
corec37d_update
(
struct
nv50_core
*
core
,
u32
*
interlock
,
bool
ntfy
)
{
u32
*
push
;
...
...
@@ -71,7 +71,7 @@ corec37d_ntfy_init(struct nouveau_bo *bo, u32 offset)
nouveau_bo_wr32
(
bo
,
offset
/
4
+
3
,
0x00000000
);
}
void
static
void
corec37d_init
(
struct
nv50_core
*
core
)
{
const
u32
windows
=
8
;
/*XXX*/
...
...
drivers/gpu/drm/nouveau/dispnv50/corec57d.c
0 → 100644
View file @
563737c5
/*
* Copyright 2018 Red Hat Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
#include "core.h"
#include "head.h"
static
void
corec57d_init
(
struct
nv50_core
*
core
)
{
const
u32
windows
=
8
;
/*XXX*/
u32
*
push
,
i
;
if
((
push
=
evo_wait
(
&
core
->
chan
,
2
+
6
*
windows
+
2
)))
{
evo_mthd
(
push
,
0x0208
,
1
);
evo_data
(
push
,
core
->
chan
.
sync
.
handle
);
for
(
i
=
0
;
i
<
windows
;
i
++
)
{
evo_mthd
(
push
,
0x1000
+
(
i
*
0x080
),
3
);
evo_data
(
push
,
i
>>
1
);
evo_data
(
push
,
0x0000000f
);
evo_data
(
push
,
0x00000000
);
evo_mthd
(
push
,
0x1010
+
(
i
*
0x080
),
1
);
evo_data
(
push
,
0x00117fff
);
}
evo_mthd
(
push
,
0x0200
,
1
);
evo_data
(
push
,
0x00000001
);
evo_kick
(
push
,
&
core
->
chan
);
}
}
static
const
struct
nv50_core_func
corec57d
=
{
.
init
=
corec57d_init
,
.
ntfy_init
=
corec37d_ntfy_init
,
.
ntfy_wait_done
=
corec37d_ntfy_wait_done
,
.
update
=
corec37d_update
,
.
head
=
&
headc57d
,
.
sor
=
&
sorc37d
,
};
int
corec57d_new
(
struct
nouveau_drm
*
drm
,
s32
oclass
,
struct
nv50_core
**
pcore
)
{
return
core507d_new_
(
&
corec57d
,
drm
,
oclass
,
pcore
);
}
drivers/gpu/drm/nouveau/dispnv50/curs.c
View file @
563737c5
...
...
@@ -31,6 +31,7 @@ nv50_curs_new(struct nouveau_drm *drm, int head, struct nv50_wndw **pwndw)
int
version
;
int
(
*
new
)(
struct
nouveau_drm
*
,
int
,
s32
,
struct
nv50_wndw
**
);
}
curses
[]
=
{
{
TU104_DISP_CURSOR
,
0
,
cursc37a_new
},
{
GV100_DISP_CURSOR
,
0
,
cursc37a_new
},
{
GK104_DISP_CURSOR
,
0
,
curs907a_new
},
{
GF110_DISP_CURSOR
,
0
,
curs907a_new
},
...
...
drivers/gpu/drm/nouveau/dispnv50/head.h
View file @
563737c5
...
...
@@ -76,4 +76,14 @@ int head917d_curs_layout(struct nv50_head *, struct nv50_wndw_atom *,
struct
nv50_head_atom
*
);
extern
const
struct
nv50_head_func
headc37d
;
void
headc37d_view
(
struct
nv50_head
*
,
struct
nv50_head_atom
*
);
void
headc37d_core_set
(
struct
nv50_head
*
,
struct
nv50_head_atom
*
);
void
headc37d_core_clr
(
struct
nv50_head
*
);
int
headc37d_curs_format
(
struct
nv50_head
*
,
struct
nv50_wndw_atom
*
,
struct
nv50_head_atom
*
);
void
headc37d_curs_set
(
struct
nv50_head
*
,
struct
nv50_head_atom
*
);
void
headc37d_curs_clr
(
struct
nv50_head
*
);
void
headc37d_dither
(
struct
nv50_head
*
,
struct
nv50_head_atom
*
);
extern
const
struct
nv50_head_func
headc57d
;
#endif
drivers/gpu/drm/nouveau/dispnv50/headc37d.c
View file @
563737c5
...
...
@@ -65,7 +65,7 @@ headc37d_procamp(struct nv50_head *head, struct nv50_head_atom *asyh)
}
}
static
void
void
headc37d_dither
(
struct
nv50_head
*
head
,
struct
nv50_head_atom
*
asyh
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
...
...
@@ -79,7 +79,7 @@ headc37d_dither(struct nv50_head *head, struct nv50_head_atom *asyh)
}
}
static
void
void
headc37d_curs_clr
(
struct
nv50_head
*
head
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
...
...
@@ -93,7 +93,7 @@ headc37d_curs_clr(struct nv50_head *head)
}
}
static
void
void
headc37d_curs_set
(
struct
nv50_head
*
head
,
struct
nv50_head_atom
*
asyh
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
...
...
@@ -112,7 +112,7 @@ headc37d_curs_set(struct nv50_head *head, struct nv50_head_atom *asyh)
}
}
static
int
int
headc37d_curs_format
(
struct
nv50_head
*
head
,
struct
nv50_wndw_atom
*
asyw
,
struct
nv50_head_atom
*
asyh
)
{
...
...
@@ -182,7 +182,7 @@ headc37d_mode(struct nv50_head *head, struct nv50_head_atom *asyh)
}
}
static
void
void
headc37d_view
(
struct
nv50_head
*
head
,
struct
nv50_head_atom
*
asyh
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
...
...
drivers/gpu/drm/nouveau/dispnv50/headc57d.c
0 → 100644
View file @
563737c5
/*
* Copyright 2018 Red Hat Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
#include "head.h"
#include "atom.h"
#include "core.h"
static
void
headc57d_or
(
struct
nv50_head
*
head
,
struct
nv50_head_atom
*
asyh
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
u32
*
push
;
if
((
push
=
evo_wait
(
core
,
2
)))
{
/*XXX: This is a dirty hack until OR depth handling is
* improved later for deep colour etc.
*/
switch
(
asyh
->
or
.
depth
)
{
case
6
:
asyh
->
or
.
depth
=
5
;
break
;
case
5
:
asyh
->
or
.
depth
=
4
;
break
;
case
2
:
asyh
->
or
.
depth
=
1
;
break
;
case
0
:
asyh
->
or
.
depth
=
4
;
break
;
default:
WARN_ON
(
1
);
break
;
}
evo_mthd
(
push
,
0x2004
+
(
head
->
base
.
index
*
0x400
),
1
);
evo_data
(
push
,
0xfc000001
|
asyh
->
or
.
depth
<<
4
|
asyh
->
or
.
nvsync
<<
3
|
asyh
->
or
.
nhsync
<<
2
);
evo_kick
(
push
,
core
);
}
}
static
void
headc57d_procamp
(
struct
nv50_head
*
head
,
struct
nv50_head_atom
*
asyh
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
u32
*
push
;
if
((
push
=
evo_wait
(
core
,
2
)))
{
evo_mthd
(
push
,
0x2000
+
(
head
->
base
.
index
*
0x400
),
1
);
#if 0
evo_data(push, 0x80000000 |
asyh->procamp.sat.sin << 16 |
asyh->procamp.sat.cos << 4);
#else
evo_data
(
push
,
0
);
#endif
evo_kick
(
push
,
core
);
}
}
void
headc57d_olut_clr
(
struct
nv50_head
*
head
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
u32
*
push
;
if
((
push
=
evo_wait
(
core
,
2
)))
{
evo_mthd
(
push
,
0x2288
+
(
head
->
base
.
index
*
0x400
),
1
);
evo_data
(
push
,
0x00000000
);
evo_kick
(
push
,
core
);
}
}
void
headc57d_olut_set
(
struct
nv50_head
*
head
,
struct
nv50_head_atom
*
asyh
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
u32
*
push
;
if
((
push
=
evo_wait
(
core
,
4
)))
{
evo_mthd
(
push
,
0x2280
+
(
head
->
base
.
index
*
0x400
),
4
);
evo_data
(
push
,
asyh
->
olut
.
size
<<
8
|
asyh
->
olut
.
mode
<<
2
|
asyh
->
olut
.
output_mode
);
evo_data
(
push
,
0xffffffff
);
/* FP_NORM_SCALE. */
evo_data
(
push
,
asyh
->
olut
.
handle
);
evo_data
(
push
,
asyh
->
olut
.
offset
>>
8
);
evo_kick
(
push
,
core
);
}
}
static
void
headc57d_olut_load_8
(
struct
drm_color_lut
*
in
,
int
size
,
void
__iomem
*
mem
)
{
memset_io
(
mem
,
0x00
,
0x20
);
/* VSS header. */
mem
+=
0x20
;
while
(
size
--
)
{
u16
r
=
drm_color_lut_extract
(
in
->
red
+
0
,
16
);
u16
g
=
drm_color_lut_extract
(
in
->
green
+
0
,
16
);
u16
b
=
drm_color_lut_extract
(
in
->
blue
+
0
,
16
);
u16
ri
=
0
,
gi
=
0
,
bi
=
0
,
i
;
if
(
in
++
,
size
)
{
ri
=
(
drm_color_lut_extract
(
in
->
red
,
16
)
-
r
)
/
4
;
gi
=
(
drm_color_lut_extract
(
in
->
green
,
16
)
-
g
)
/
4
;
bi
=
(
drm_color_lut_extract
(
in
->
blue
,
16
)
-
b
)
/
4
;
}
for
(
i
=
0
;
i
<
4
;
i
++
,
mem
+=
8
)
{
writew
(
r
+
ri
*
i
,
mem
+
0
);
writew
(
g
+
gi
*
i
,
mem
+
2
);
writew
(
b
+
bi
*
i
,
mem
+
4
);
}
}
/* INTERPOLATE modes require a "next" entry to interpolate with,
* so we replicate the last entry to deal with this for now.
*/
writew
(
readw
(
mem
-
8
),
mem
+
0
);
writew
(
readw
(
mem
-
6
),
mem
+
2
);
writew
(
readw
(
mem
-
4
),
mem
+
4
);
}
static
void
headc57d_olut_load
(
struct
drm_color_lut
*
in
,
int
size
,
void
__iomem
*
mem
)
{
memset_io
(
mem
,
0x00
,
0x20
);
/* VSS header. */
mem
+=
0x20
;
for
(;
size
--
;
in
++
,
mem
+=
0x08
)
{
writew
(
drm_color_lut_extract
(
in
->
red
,
16
),
mem
+
0
);
writew
(
drm_color_lut_extract
(
in
->
green
,
16
),
mem
+
2
);
writew
(
drm_color_lut_extract
(
in
->
blue
,
16
),
mem
+
4
);
}
/* INTERPOLATE modes require a "next" entry to interpolate with,
* so we replicate the last entry to deal with this for now.
*/
writew
(
readw
(
mem
-
8
),
mem
+
0
);
writew
(
readw
(
mem
-
6
),
mem
+
2
);
writew
(
readw
(
mem
-
4
),
mem
+
4
);
}
void
headc57d_olut
(
struct
nv50_head
*
head
,
struct
nv50_head_atom
*
asyh
)
{
asyh
->
olut
.
mode
=
2
;
/* DIRECT10 */
asyh
->
olut
.
size
=
4
/* VSS header. */
+
1024
+
1
/* Entries. */
;
asyh
->
olut
.
output_mode
=
1
;
/* INTERPOLATE_ENABLE. */
if
(
asyh
->
state
.
gamma_lut
&&
asyh
->
state
.
gamma_lut
->
length
/
sizeof
(
struct
drm_color_lut
)
==
256
)
asyh
->
olut
.
load
=
headc57d_olut_load_8
;
else
asyh
->
olut
.
load
=
headc57d_olut_load
;
}
static
void
headc57d_mode
(
struct
nv50_head
*
head
,
struct
nv50_head_atom
*
asyh
)
{
struct
nv50_dmac
*
core
=
&
nv50_disp
(
head
->
base
.
base
.
dev
)
->
core
->
chan
;
struct
nv50_head_mode
*
m
=
&
asyh
->
mode
;
u32
*
push
;
if
((
push
=
evo_wait
(
core
,
12
)))
{
evo_mthd
(
push
,
0x2064
+
(
head
->
base
.
index
*
0x400
),
5
);
evo_data
(
push
,
(
m
->
v
.
active
<<
16
)
|
m
->
h
.
active
);
evo_data
(
push
,
(
m
->
v
.
synce
<<
16
)
|
m
->
h
.
synce
);
evo_data
(
push
,
(
m
->
v
.
blanke
<<
16
)
|
m
->
h
.
blanke
);
evo_data
(
push
,
(
m
->
v
.
blanks
<<
16
)
|
m
->
h
.
blanks
);
evo_data
(
push
,
(
m
->
v
.
blank2e
<<
16
)
|
m
->
v
.
blank2s
);
evo_mthd
(
push
,
0x200c
+
(
head
->
base
.
index
*
0x400
),
1
);
evo_data
(
push
,
m
->
clock
*
1000
);
evo_mthd
(
push
,
0x2028
+
(
head
->
base
.
index
*
0x400
),
1
);
evo_data
(
push
,
m
->
clock
*
1000
);
/*XXX: HEAD_USAGE_BOUNDS, doesn't belong here. */
evo_mthd
(
push
,
0x2030
+
(
head
->
base
.
index
*
0x400
),
1
);
evo_data
(
push
,
0x00001014
);
evo_kick
(
push
,
core
);
}
}
const
struct
nv50_head_func
headc57d
=
{
.
view
=
headc37d_view
,
.
mode
=
headc57d_mode
,
.
olut
=
headc57d_olut
,
.
olut_identity
=
true
,
.
olut_set
=
headc57d_olut_set
,
.
olut_clr
=
headc57d_olut_clr
,
.
curs_layout
=
head917d_curs_layout
,
.
curs_format
=
headc37d_curs_format
,
.
curs_set
=
headc37d_curs_set
,
.
curs_clr
=
headc37d_curs_clr
,
.
dither
=
headc37d_dither
,
.
procamp
=
headc57d_procamp
,
.
or
=
headc57d_or
,
};
drivers/gpu/drm/nouveau/dispnv50/wimm.c
View file @
563737c5
...
...
@@ -31,6 +31,7 @@ nv50_wimm_init(struct nouveau_drm *drm, struct nv50_wndw *wndw)
int
version
;
int
(
*
init
)(
struct
nouveau_drm
*
,
s32
,
struct
nv50_wndw
*
);
}
wimms
[]
=
{
{
TU104_DISP_WINDOW_IMM_CHANNEL_DMA
,
0
,
wimmc37b_init
},
{
GV100_DISP_WINDOW_IMM_CHANNEL_DMA
,
0
,
wimmc37b_init
},
{}
};
...
...
drivers/gpu/drm/nouveau/dispnv50/wndw.c
View file @
563737c5
...
...
@@ -626,6 +626,7 @@ nv50_wndw_new(struct nouveau_drm *drm, enum drm_plane_type type, int index,
int
(
*
new
)(
struct
nouveau_drm
*
,
enum
drm_plane_type
,
int
,
s32
,
struct
nv50_wndw
**
);
}
wndws
[]
=
{
{
TU104_DISP_WINDOW_CHANNEL_DMA
,
0
,
wndwc57e_new
},
{
GV100_DISP_WINDOW_CHANNEL_DMA
,
0
,
wndwc37e_new
},
{}
};
...
...
drivers/gpu/drm/nouveau/dispnv50/wndw.h
View file @
563737c5
...
...
@@ -91,6 +91,23 @@ extern const struct nv50_wimm_func curs507a;
int
wndwc37e_new
(
struct
nouveau_drm
*
,
enum
drm_plane_type
,
int
,
s32
,
struct
nv50_wndw
**
);
int
wndwc37e_new_
(
const
struct
nv50_wndw_func
*
,
struct
nouveau_drm
*
,
enum
drm_plane_type
type
,
int
index
,
s32
oclass
,
u32
heads
,
struct
nv50_wndw
**
);
int
wndwc37e_acquire
(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
,
struct
nv50_head_atom
*
);
void
wndwc37e_release
(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
,
struct
nv50_head_atom
*
);
void
wndwc37e_sema_set
(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
);
void
wndwc37e_sema_clr
(
struct
nv50_wndw
*
);
void
wndwc37e_ntfy_set
(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
);
void
wndwc37e_ntfy_clr
(
struct
nv50_wndw
*
);
void
wndwc37e_image_set
(
struct
nv50_wndw
*
,
struct
nv50_wndw_atom
*
);
void
wndwc37e_image_clr
(
struct
nv50_wndw
*
);
void
wndwc37e_update
(
struct
nv50_wndw
*
,
u32
*
);
int
wndwc57e_new
(
struct
nouveau_drm
*
,
enum
drm_plane_type
,
int
,
s32
,
struct
nv50_wndw
**
);
int
nv50_wndw_new
(
struct
nouveau_drm
*
,
enum
drm_plane_type
,
int
index
,
struct
nv50_wndw
**
);
...
...
drivers/gpu/drm/nouveau/dispnv50/wndwc37e.c
View file @
563737c5
...
...
@@ -64,7 +64,7 @@ wndwc37e_ilut(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
asyw
->
xlut
.
i
.
load
=
head907d_olut_load
;
}
static
void
void
wndwc37e_image_clr
(
struct
nv50_wndw
*
wndw
)
{
u32
*
push
;
...
...
@@ -77,7 +77,7 @@ wndwc37e_image_clr(struct nv50_wndw *wndw)
}
}
static
void
void
wndwc37e_image_set
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
)
{
u32
*
push
;
...
...
@@ -118,7 +118,7 @@ wndwc37e_image_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
evo_kick
(
push
,
&
wndw
->
wndw
);
}
static
void
void
wndwc37e_ntfy_clr
(
struct
nv50_wndw
*
wndw
)
{
u32
*
push
;
...
...
@@ -129,7 +129,7 @@ wndwc37e_ntfy_clr(struct nv50_wndw *wndw)
}
}
static
void
void
wndwc37e_ntfy_set
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
)
{
u32
*
push
;
...
...
@@ -141,7 +141,7 @@ wndwc37e_ntfy_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
}
}
static
void
void
wndwc37e_sema_clr
(
struct
nv50_wndw
*
wndw
)
{
u32
*
push
;
...
...
@@ -152,7 +152,7 @@ wndwc37e_sema_clr(struct nv50_wndw *wndw)
}
}
static
void
void
wndwc37e_sema_set
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
)
{
u32
*
push
;
...
...
@@ -166,7 +166,7 @@ wndwc37e_sema_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw)
}
}
static
void
void
wndwc37e_update
(
struct
nv50_wndw
*
wndw
,
u32
*
interlock
)
{
u32
*
push
;
...
...
@@ -184,13 +184,13 @@ wndwc37e_update(struct nv50_wndw *wndw, u32 *interlock)
}
}
static
void
void
wndwc37e_release
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
,
struct
nv50_head_atom
*
asyh
)
{
}
static
int
int
wndwc37e_acquire
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
,
struct
nv50_head_atom
*
asyh
)
{
...
...
@@ -237,7 +237,7 @@ wndwc37e = {
.
update
=
wndwc37e_update
,
};
static
int
int
wndwc37e_new_
(
const
struct
nv50_wndw_func
*
func
,
struct
nouveau_drm
*
drm
,
enum
drm_plane_type
type
,
int
index
,
s32
oclass
,
u32
heads
,
struct
nv50_wndw
**
pwndw
)
...
...
drivers/gpu/drm/nouveau/dispnv50/wndwc57e.c
0 → 100644
View file @
563737c5
/*
* Copyright 2018 Red Hat Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
#include "wndw.h"
#include "atom.h"
#include <drm/drm_atomic_helper.h>
#include <drm/drm_plane_helper.h>
#include <nouveau_bo.h>
#include <nvif/clc37e.h>
static
void
wndwc57e_ilut_clr
(
struct
nv50_wndw
*
wndw
)
{
u32
*
push
;
if
((
push
=
evo_wait
(
&
wndw
->
wndw
,
2
)))
{
evo_mthd
(
push
,
0x0444
,
1
);
evo_data
(
push
,
0x00000000
);
evo_kick
(
push
,
&
wndw
->
wndw
);
}
}
static
void
wndwc57e_ilut_set
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
)
{
u32
*
push
;
if
((
push
=
evo_wait
(
&
wndw
->
wndw
,
4
)))
{
evo_mthd
(
push
,
0x0440
,
3
);
evo_data
(
push
,
asyw
->
xlut
.
i
.
size
<<
8
|
asyw
->
xlut
.
i
.
mode
<<
2
|
asyw
->
xlut
.
i
.
output_mode
);
evo_data
(
push
,
asyw
->
xlut
.
handle
);
evo_data
(
push
,
asyw
->
xlut
.
i
.
offset
>>
8
);
evo_kick
(
push
,
&
wndw
->
wndw
);
}
}
static
u16
fixedU0_16_FP16
(
u16
fixed
)
{
int
sign
=
0
,
exp
=
0
,
man
=
0
;
if
(
fixed
)
{
while
(
--
exp
&&
!
(
fixed
&
0x8000
))
fixed
<<=
1
;
man
=
((
fixed
<<
1
)
&
0xffc0
)
>>
6
;
exp
+=
15
;
}
return
(
sign
<<
15
)
|
(
exp
<<
10
)
|
man
;
}
static
void
wndwc57e_ilut_load
(
struct
drm_color_lut
*
in
,
int
size
,
void
__iomem
*
mem
)
{
memset_io
(
mem
,
0x00
,
0x20
);
/* VSS header. */
mem
+=
0x20
;
for
(;
size
--
;
in
++
,
mem
+=
0x08
)
{
u16
r
=
fixedU0_16_FP16
(
drm_color_lut_extract
(
in
->
red
,
16
));
u16
g
=
fixedU0_16_FP16
(
drm_color_lut_extract
(
in
->
green
,
16
));
u16
b
=
fixedU0_16_FP16
(
drm_color_lut_extract
(
in
->
blue
,
16
));
writew
(
r
,
mem
+
0
);
writew
(
g
,
mem
+
2
);
writew
(
b
,
mem
+
4
);
}
/* INTERPOLATE modes require a "next" entry to interpolate with,
* so we replicate the last entry to deal with this for now.
*/
writew
(
readw
(
mem
-
8
),
mem
+
0
);
writew
(
readw
(
mem
-
6
),
mem
+
2
);
writew
(
readw
(
mem
-
4
),
mem
+
4
);
}
static
void
wndwc57e_ilut
(
struct
nv50_wndw
*
wndw
,
struct
nv50_wndw_atom
*
asyw
)
{
u16
size
=
asyw
->
ilut
->
length
/
sizeof
(
struct
drm_color_lut
);
if
(
size
==
256
)
{
asyw
->
xlut
.
i
.
mode
=
1
;
/* DIRECT8. */
}
else
{
asyw
->
xlut
.
i
.
mode
=
2
;
/* DIRECT10. */
size
=
1024
;
}
asyw
->
xlut
.
i
.
size
=
4
/* VSS header. */
+
size
+
1
/* Entries. */
;
asyw
->
xlut
.
i
.
output_mode
=
0
;
/* INTERPOLATE_DISABLE. */
asyw
->
xlut
.
i
.
load
=
wndwc57e_ilut_load
;
}
static
const
struct
nv50_wndw_func
wndwc57e
=
{
.
acquire
=
wndwc37e_acquire
,
.
release
=
wndwc37e_release
,
.
sema_set
=
wndwc37e_sema_set
,
.
sema_clr
=
wndwc37e_sema_clr
,
.
ntfy_set
=
wndwc37e_ntfy_set
,
.
ntfy_clr
=
wndwc37e_ntfy_clr
,
.
ntfy_reset
=
corec37d_ntfy_init
,
.
ntfy_wait_begun
=
base507c_ntfy_wait_begun
,
.
ilut
=
wndwc57e_ilut
,
.
ilut_identity
=
true
,
.
xlut_set
=
wndwc57e_ilut_set
,
.
xlut_clr
=
wndwc57e_ilut_clr
,
.
image_set
=
wndwc37e_image_set
,
.
image_clr
=
wndwc37e_image_clr
,
.
update
=
wndwc37e_update
,
};
int
wndwc57e_new
(
struct
nouveau_drm
*
drm
,
enum
drm_plane_type
type
,
int
index
,
s32
oclass
,
struct
nv50_wndw
**
pwndw
)
{
return
wndwc37e_new_
(
&
wndwc57e
,
drm
,
type
,
index
,
oclass
,
BIT
(
index
>>
1
),
pwndw
);
}
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