Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
L
Linux
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
jan.koester
Linux
Commits
bb7ef1ec
Commit
bb7ef1ec
authored
10 years ago
by
Ben Skeggs
Browse files
Options
Downloads
Patches
Plain Diff
drm/nouveau/disp/dp: maintain receiver caps in response to hpd signal
Signed-off-by:
Ben Skeggs
<
bskeggs@redhat.com
>
parent
b8407c9e
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
drivers/gpu/drm/nouveau/core/engine/disp/outpdp.c
+64
-8
64 additions, 8 deletions
drivers/gpu/drm/nouveau/core/engine/disp/outpdp.c
drivers/gpu/drm/nouveau/core/engine/disp/outpdp.h
+4
-0
4 additions, 0 deletions
drivers/gpu/drm/nouveau/core/engine/disp/outpdp.h
with
68 additions
and
8 deletions
drivers/gpu/drm/nouveau/core/engine/disp/outpdp.c
+
64
−
8
View file @
bb7ef1ec
...
@@ -26,21 +26,73 @@
...
@@ -26,21 +26,73 @@
#include
"outpdp.h"
#include
"outpdp.h"
#include
"conn.h"
#include
"conn.h"
#include
"dport.h"
static
int
static
void
nvkm_output_dp_
service
(
void
*
data
,
u32
type
,
int
index
)
nvkm_output_dp_
enable
(
struct
nvkm_output_dp
*
outp
,
bool
present
)
{
{
struct
nvkm_output_dp
*
outp
=
data
;
struct
nouveau_i2c_port
*
port
=
outp
->
base
.
edid
;
DBG
(
"IRQ: %d
\n
"
,
type
);
if
(
present
)
{
return
NVKM_EVENT_KEEP
;
if
(
!
outp
->
present
)
{
nouveau_i2c
(
port
)
->
acquire_pad
(
port
,
0
);
DBG
(
"aux power -> always
\n
"
);
outp
->
present
=
true
;
}
}
else
{
if
(
outp
->
present
)
{
nouveau_i2c
(
port
)
->
release_pad
(
port
);
DBG
(
"aux power -> demand
\n
"
);
outp
->
present
=
false
;
}
}
}
static
void
nvkm_output_dp_detect
(
struct
nvkm_output_dp
*
outp
)
{
struct
nouveau_i2c_port
*
port
=
outp
->
base
.
edid
;
int
ret
=
nouveau_i2c
(
port
)
->
acquire_pad
(
port
,
0
);
if
(
ret
==
0
)
{
ret
=
nv_rdaux
(
outp
->
base
.
edid
,
DPCD_RC00_DPCD_REV
,
outp
->
dpcd
,
sizeof
(
outp
->
dpcd
));
nvkm_output_dp_enable
(
outp
,
ret
==
0
);
nouveau_i2c
(
port
)
->
release_pad
(
port
);
}
}
static
void
nvkm_output_dp_service_work
(
struct
work_struct
*
work
)
{
struct
nvkm_output_dp
*
outp
=
container_of
(
work
,
typeof
(
*
outp
),
work
);
struct
nouveau_disp
*
disp
=
nouveau_disp
(
outp
);
int
type
=
atomic_xchg
(
&
outp
->
pending
,
0
);
u32
send
=
0
;
if
(
type
&
(
NVKM_I2C_PLUG
|
NVKM_I2C_UNPLUG
))
{
nvkm_output_dp_detect
(
outp
);
if
(
type
&
NVKM_I2C_UNPLUG
)
send
|=
NVKM_HPD_UNPLUG
;
if
(
type
&
NVKM_I2C_PLUG
)
send
|=
NVKM_HPD_PLUG
;
nouveau_event_get
(
outp
->
base
.
conn
->
hpd
.
event
);
}
if
(
type
&
NVKM_I2C_IRQ
)
{
nouveau_event_get
(
outp
->
irq
);
send
|=
NVKM_HPD_IRQ
;
}
nouveau_event_trigger
(
disp
->
hpd
,
send
,
outp
->
base
.
info
.
connector
);
}
}
static
int
static
int
nvkm_output_dp_
hotplug
(
void
*
data
,
u32
type
,
int
index
)
nvkm_output_dp_
service
(
void
*
data
,
u32
type
,
int
index
)
{
{
struct
nvkm_output_dp
*
outp
=
data
;
struct
nvkm_output_dp
*
outp
=
data
;
DBG
(
"HPD: %d
\n
"
,
type
);
DBG
(
"HPD: %d
\n
"
,
type
);
return
NVKM_EVENT_KEEP
;
atomic_or
(
type
,
&
outp
->
pending
);
schedule_work
(
&
outp
->
work
);
return
NVKM_EVENT_DROP
;
}
}
int
int
...
@@ -48,6 +100,7 @@ _nvkm_output_dp_fini(struct nouveau_object *object, bool suspend)
...
@@ -48,6 +100,7 @@ _nvkm_output_dp_fini(struct nouveau_object *object, bool suspend)
{
{
struct
nvkm_output_dp
*
outp
=
(
void
*
)
object
;
struct
nvkm_output_dp
*
outp
=
(
void
*
)
object
;
nouveau_event_put
(
outp
->
irq
);
nouveau_event_put
(
outp
->
irq
);
nvkm_output_dp_enable
(
outp
,
false
);
return
nvkm_output_fini
(
&
outp
->
base
,
suspend
);
return
nvkm_output_fini
(
&
outp
->
base
,
suspend
);
}
}
...
@@ -55,6 +108,7 @@ int
...
@@ -55,6 +108,7 @@ int
_nvkm_output_dp_init
(
struct
nouveau_object
*
object
)
_nvkm_output_dp_init
(
struct
nouveau_object
*
object
)
{
{
struct
nvkm_output_dp
*
outp
=
(
void
*
)
object
;
struct
nvkm_output_dp
*
outp
=
(
void
*
)
object
;
nvkm_output_dp_detect
(
outp
);
return
nvkm_output_init
(
&
outp
->
base
);
return
nvkm_output_init
(
&
outp
->
base
);
}
}
...
@@ -113,10 +167,12 @@ nvkm_output_dp_create_(struct nouveau_object *parent,
...
@@ -113,10 +167,12 @@ nvkm_output_dp_create_(struct nouveau_object *parent,
return
ret
;
return
ret
;
}
}
INIT_WORK
(
&
outp
->
work
,
nvkm_output_dp_service_work
);
/* hotplug detect, replaces gpio-based mechanism with aux events */
/* hotplug detect, replaces gpio-based mechanism with aux events */
ret
=
nouveau_event_new
(
i2c
->
ntfy
,
NVKM_I2C_PLUG
|
NVKM_I2C_UNPLUG
,
ret
=
nouveau_event_new
(
i2c
->
ntfy
,
NVKM_I2C_PLUG
|
NVKM_I2C_UNPLUG
,
outp
->
base
.
edid
->
index
,
outp
->
base
.
edid
->
index
,
nvkm_output_dp_
hotplug
,
outp
,
nvkm_output_dp_
service
,
outp
,
&
outp
->
base
.
conn
->
hpd
.
event
);
&
outp
->
base
.
conn
->
hpd
.
event
);
if
(
ret
)
{
if
(
ret
)
{
ERR
(
"error monitoring aux hpd events: %d
\n
"
,
ret
);
ERR
(
"error monitoring aux hpd events: %d
\n
"
,
ret
);
...
...
This diff is collapsed.
Click to expand it.
drivers/gpu/drm/nouveau/core/engine/disp/outpdp.h
+
4
−
0
View file @
bb7ef1ec
...
@@ -14,6 +14,10 @@ struct nvkm_output_dp {
...
@@ -14,6 +14,10 @@ struct nvkm_output_dp {
struct
nouveau_eventh
*
irq
;
struct
nouveau_eventh
*
irq
;
struct
nouveau_eventh
*
hpd
;
struct
nouveau_eventh
*
hpd
;
struct
work_struct
work
;
atomic_t
pending
;
bool
present
;
u8
dpcd
[
16
];
};
};
#define nvkm_output_dp_create(p,e,c,b,i,d) \
#define nvkm_output_dp_create(p,e,c,b,i,d) \
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment