162306a36Sopenharmony_ci#ifndef __NV50_KMS_H__ 262306a36Sopenharmony_ci#define __NV50_KMS_H__ 362306a36Sopenharmony_ci#include <linux/workqueue.h> 462306a36Sopenharmony_ci#include <nvif/mem.h> 562306a36Sopenharmony_ci#include <nvif/push.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include "nouveau_display.h" 862306a36Sopenharmony_ci 962306a36Sopenharmony_cistruct nv50_msto; 1062306a36Sopenharmony_cistruct nouveau_encoder; 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cistruct nv50_disp { 1362306a36Sopenharmony_ci struct nvif_disp *disp; 1462306a36Sopenharmony_ci struct nv50_core *core; 1562306a36Sopenharmony_ci struct nvif_object caps; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define NV50_DISP_SYNC(c, o) ((c) * 0x040 + (o)) 1862306a36Sopenharmony_ci#define NV50_DISP_CORE_NTFY NV50_DISP_SYNC(0 , 0x00) 1962306a36Sopenharmony_ci#define NV50_DISP_WNDW_SEM0(c) NV50_DISP_SYNC(1 + (c), 0x00) 2062306a36Sopenharmony_ci#define NV50_DISP_WNDW_SEM1(c) NV50_DISP_SYNC(1 + (c), 0x10) 2162306a36Sopenharmony_ci#define NV50_DISP_WNDW_NTFY(c) NV50_DISP_SYNC(1 + (c), 0x20) 2262306a36Sopenharmony_ci#define NV50_DISP_BASE_SEM0(c) NV50_DISP_WNDW_SEM0(0 + (c)) 2362306a36Sopenharmony_ci#define NV50_DISP_BASE_SEM1(c) NV50_DISP_WNDW_SEM1(0 + (c)) 2462306a36Sopenharmony_ci#define NV50_DISP_BASE_NTFY(c) NV50_DISP_WNDW_NTFY(0 + (c)) 2562306a36Sopenharmony_ci#define NV50_DISP_OVLY_SEM0(c) NV50_DISP_WNDW_SEM0(4 + (c)) 2662306a36Sopenharmony_ci#define NV50_DISP_OVLY_SEM1(c) NV50_DISP_WNDW_SEM1(4 + (c)) 2762306a36Sopenharmony_ci#define NV50_DISP_OVLY_NTFY(c) NV50_DISP_WNDW_NTFY(4 + (c)) 2862306a36Sopenharmony_ci struct nouveau_bo *sync; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci struct mutex mutex; 3162306a36Sopenharmony_ci}; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistatic inline struct nv50_disp * 3462306a36Sopenharmony_cinv50_disp(struct drm_device *dev) 3562306a36Sopenharmony_ci{ 3662306a36Sopenharmony_ci return nouveau_display(dev)->priv; 3762306a36Sopenharmony_ci} 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cistruct nv50_disp_interlock { 4062306a36Sopenharmony_ci enum nv50_disp_interlock_type { 4162306a36Sopenharmony_ci NV50_DISP_INTERLOCK_CORE = 0, 4262306a36Sopenharmony_ci NV50_DISP_INTERLOCK_CURS, 4362306a36Sopenharmony_ci NV50_DISP_INTERLOCK_BASE, 4462306a36Sopenharmony_ci NV50_DISP_INTERLOCK_OVLY, 4562306a36Sopenharmony_ci NV50_DISP_INTERLOCK_WNDW, 4662306a36Sopenharmony_ci NV50_DISP_INTERLOCK_WIMM, 4762306a36Sopenharmony_ci NV50_DISP_INTERLOCK__SIZE 4862306a36Sopenharmony_ci } type; 4962306a36Sopenharmony_ci u32 data; 5062306a36Sopenharmony_ci u32 wimm; 5162306a36Sopenharmony_ci}; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_civoid corec37d_ntfy_init(struct nouveau_bo *, u32); 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_civoid head907d_olut_load(struct drm_color_lut *, int size, void __iomem *); 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistruct nv50_chan { 5862306a36Sopenharmony_ci struct nvif_object user; 5962306a36Sopenharmony_ci struct nvif_device *device; 6062306a36Sopenharmony_ci}; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cistruct nv50_dmac { 6362306a36Sopenharmony_ci struct nv50_chan base; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci struct nvif_push _push; 6662306a36Sopenharmony_ci struct nvif_push *push; 6762306a36Sopenharmony_ci u32 *ptr; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci struct nvif_object sync; 7062306a36Sopenharmony_ci struct nvif_object vram; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci /* Protects against concurrent pushbuf access to this channel, lock is 7362306a36Sopenharmony_ci * grabbed by evo_wait (if the pushbuf reservation is successful) and 7462306a36Sopenharmony_ci * dropped again by evo_kick. */ 7562306a36Sopenharmony_ci struct mutex lock; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci u32 cur; 7862306a36Sopenharmony_ci u32 put; 7962306a36Sopenharmony_ci u32 max; 8062306a36Sopenharmony_ci}; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cistruct nv50_outp_atom { 8362306a36Sopenharmony_ci struct list_head head; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci struct drm_encoder *encoder; 8662306a36Sopenharmony_ci bool flush_disable; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci union nv50_outp_atom_mask { 8962306a36Sopenharmony_ci struct { 9062306a36Sopenharmony_ci bool ctrl:1; 9162306a36Sopenharmony_ci }; 9262306a36Sopenharmony_ci u8 mask; 9362306a36Sopenharmony_ci } set, clr; 9462306a36Sopenharmony_ci}; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ciint nv50_dmac_create(struct nvif_device *device, struct nvif_object *disp, 9762306a36Sopenharmony_ci const s32 *oclass, u8 head, void *data, u32 size, 9862306a36Sopenharmony_ci s64 syncbuf, struct nv50_dmac *dmac); 9962306a36Sopenharmony_civoid nv50_dmac_destroy(struct nv50_dmac *); 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci/* 10262306a36Sopenharmony_ci * For normal encoders this just returns the encoder. For active MST encoders, 10362306a36Sopenharmony_ci * this returns the real outp that's driving displays on the topology. 10462306a36Sopenharmony_ci * Inactive MST encoders return NULL, since they would have no real outp to 10562306a36Sopenharmony_ci * return anyway. 10662306a36Sopenharmony_ci */ 10762306a36Sopenharmony_cistruct nouveau_encoder *nv50_real_outp(struct drm_encoder *encoder); 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_cibool nv50_has_mst(struct nouveau_drm *drm); 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ciu32 *evo_wait(struct nv50_dmac *, int nr); 11262306a36Sopenharmony_civoid evo_kick(u32 *, struct nv50_dmac *); 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ciextern const u64 disp50xx_modifiers[]; 11562306a36Sopenharmony_ciextern const u64 disp90xx_modifiers[]; 11662306a36Sopenharmony_ciextern const u64 wndwc57e_modifiers[]; 11762306a36Sopenharmony_ci#endif 118