mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
5ff0cb1ce2
Currently, for every single MST capable DRM connector we create a set of fake encoders, one for each possible head. Unfortunately this ends up being a huge waste of encoders. While this currently isn't causing us any problems, it's extremely close to doing so. The ThinkPad P71 is a good example of this. Originally when trying to figure out why nouveau was failing to load on this laptop, I discovered it was because nouveau was creating too many encoders. This ended up being because we were mistakenly creating MST encoders for the eDP port, however we are still extremely close to hitting the encoder limit on this machine as it exposes 1 eDP port and 5 DP ports, resulting in 31 encoders. So while this fix didn't end up being necessary to fix the P71, we still need to implement this so that we avoid hitting the encoder limit for valid display configurations in the event that some machine with more connectors then this becomes available. Plus, we don't want to let good code go to waste :) So, use less encoders by only creating one MSTO per head. Then, attach each new MSTC to each MSTO which corresponds to a head that it's parent DP port is capable of using. This brings the number of encoders we register on the ThinkPad P71 from 31, down to just 15. Yay! Signed-off-by: Lyude Paul <lyude@redhat.com> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
92 lines
3.9 KiB
C
92 lines
3.9 KiB
C
#ifndef __NV50_KMS_HEAD_H__
|
|
#define __NV50_KMS_HEAD_H__
|
|
#define nv50_head(c) container_of((c), struct nv50_head, base.base)
|
|
#include "disp.h"
|
|
#include "atom.h"
|
|
#include "lut.h"
|
|
|
|
#include "nouveau_crtc.h"
|
|
|
|
struct nv50_head {
|
|
const struct nv50_head_func *func;
|
|
struct nouveau_crtc base;
|
|
struct nv50_lut olut;
|
|
struct nv50_msto *msto;
|
|
};
|
|
|
|
struct nv50_head *nv50_head_create(struct drm_device *, int index);
|
|
void nv50_head_flush_set(struct nv50_head *, struct nv50_head_atom *);
|
|
void nv50_head_flush_clr(struct nv50_head *, struct nv50_head_atom *, bool y);
|
|
|
|
struct nv50_head_func {
|
|
void (*view)(struct nv50_head *, struct nv50_head_atom *);
|
|
void (*mode)(struct nv50_head *, struct nv50_head_atom *);
|
|
bool (*olut)(struct nv50_head *, struct nv50_head_atom *, int);
|
|
bool olut_identity;
|
|
int olut_size;
|
|
void (*olut_set)(struct nv50_head *, struct nv50_head_atom *);
|
|
void (*olut_clr)(struct nv50_head *);
|
|
void (*core_calc)(struct nv50_head *, struct nv50_head_atom *);
|
|
void (*core_set)(struct nv50_head *, struct nv50_head_atom *);
|
|
void (*core_clr)(struct nv50_head *);
|
|
int (*curs_layout)(struct nv50_head *, struct nv50_wndw_atom *,
|
|
struct nv50_head_atom *);
|
|
int (*curs_format)(struct nv50_head *, struct nv50_wndw_atom *,
|
|
struct nv50_head_atom *);
|
|
void (*curs_set)(struct nv50_head *, struct nv50_head_atom *);
|
|
void (*curs_clr)(struct nv50_head *);
|
|
void (*base)(struct nv50_head *, struct nv50_head_atom *);
|
|
void (*ovly)(struct nv50_head *, struct nv50_head_atom *);
|
|
void (*dither)(struct nv50_head *, struct nv50_head_atom *);
|
|
void (*procamp)(struct nv50_head *, struct nv50_head_atom *);
|
|
void (*or)(struct nv50_head *, struct nv50_head_atom *);
|
|
};
|
|
|
|
extern const struct nv50_head_func head507d;
|
|
void head507d_view(struct nv50_head *, struct nv50_head_atom *);
|
|
void head507d_mode(struct nv50_head *, struct nv50_head_atom *);
|
|
bool head507d_olut(struct nv50_head *, struct nv50_head_atom *, int);
|
|
void head507d_core_calc(struct nv50_head *, struct nv50_head_atom *);
|
|
void head507d_core_clr(struct nv50_head *);
|
|
int head507d_curs_layout(struct nv50_head *, struct nv50_wndw_atom *,
|
|
struct nv50_head_atom *);
|
|
int head507d_curs_format(struct nv50_head *, struct nv50_wndw_atom *,
|
|
struct nv50_head_atom *);
|
|
void head507d_base(struct nv50_head *, struct nv50_head_atom *);
|
|
void head507d_ovly(struct nv50_head *, struct nv50_head_atom *);
|
|
void head507d_dither(struct nv50_head *, struct nv50_head_atom *);
|
|
void head507d_procamp(struct nv50_head *, struct nv50_head_atom *);
|
|
|
|
extern const struct nv50_head_func head827d;
|
|
|
|
extern const struct nv50_head_func head907d;
|
|
void head907d_view(struct nv50_head *, struct nv50_head_atom *);
|
|
void head907d_mode(struct nv50_head *, struct nv50_head_atom *);
|
|
bool head907d_olut(struct nv50_head *, struct nv50_head_atom *, int);
|
|
void head907d_olut_set(struct nv50_head *, struct nv50_head_atom *);
|
|
void head907d_olut_clr(struct nv50_head *);
|
|
void head907d_core_set(struct nv50_head *, struct nv50_head_atom *);
|
|
void head907d_core_clr(struct nv50_head *);
|
|
void head907d_curs_set(struct nv50_head *, struct nv50_head_atom *);
|
|
void head907d_curs_clr(struct nv50_head *);
|
|
void head907d_ovly(struct nv50_head *, struct nv50_head_atom *);
|
|
void head907d_procamp(struct nv50_head *, struct nv50_head_atom *);
|
|
void head907d_or(struct nv50_head *, struct nv50_head_atom *);
|
|
|
|
extern const struct nv50_head_func head917d;
|
|
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
|