2009-12-11 19:24:15 +10:00
/*
* Copyright ( C ) 2008 Maarten Maathuis .
* All Rights Reserved .
*
* 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 ( including the
* next paragraph ) 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 OWNER ( S ) AND / OR ITS SUPPLIERS 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 .
*
*/
# ifndef __NOUVEAU_ENCODER_H__
# define __NOUVEAU_ENCODER_H__
2012-07-26 09:12:47 +10:00
# include <subdev/bios/dcb.h>
2012-10-02 18:01:07 +01:00
# include <drm/drm_encoder_slave.h>
2016-11-04 17:20:36 +10:00
# include <drm/drm_dp_mst_helper.h>
2013-03-21 15:45:11 +10:00
# include "dispnv04/disp.h"
2018-05-08 20:39:47 +10:00
struct nv50_head_atom ;
2009-12-11 19:24:15 +10:00
# define NV_DPMS_CLEARED 0x80
2015-01-14 15:36:34 +10:00
struct nvkm_i2c_port ;
2012-07-10 14:36:38 +10:00
2009-12-11 19:24:15 +10:00
struct nouveau_encoder {
struct drm_encoder_slave base ;
2012-07-11 10:44:20 +10:00
struct dcb_output * dcb ;
2009-12-11 19:24:15 +10:00
int or ;
2017-05-19 23:59:35 +10:00
int link ;
2015-08-20 14:54:15 +10:00
struct i2c_adapter * i2c ;
struct nvkm_i2c_aux * aux ;
2009-12-11 19:24:15 +10:00
2010-07-01 15:33:45 +10:00
/* different to drm_encoder.crtc, this reflects what's
* actually programmed on the hw , not the proposed crtc */
struct drm_crtc * crtc ;
2014-06-05 10:59:55 +10:00
u32 ctrl ;
2010-07-01 15:33:45 +10:00
2009-12-11 19:24:15 +10:00
struct drm_display_mode mode ;
int last_dpms ;
struct nv04_output_reg restore ;
union {
struct {
2016-11-04 17:20:36 +10:00
struct nv50_mstm * mstm ;
2009-12-11 19:24:15 +10:00
int link_nr ;
int link_bw ;
} dp ;
} ;
2015-12-04 17:14:07 +01:00
void ( * enc_save ) ( struct drm_encoder * encoder ) ;
void ( * enc_restore ) ( struct drm_encoder * encoder ) ;
2016-11-04 17:20:36 +10:00
void ( * update ) ( struct nouveau_encoder * , u8 head ,
2018-05-08 20:39:47 +10:00
struct nv50_head_atom * , u8 proto , u8 depth ) ;
2009-12-11 19:24:15 +10:00
} ;
2011-08-02 19:29:37 +10:00
struct nouveau_encoder *
find_encoder ( struct drm_connector * connector , int type ) ;
2009-12-11 19:24:15 +10:00
static inline struct nouveau_encoder * nouveau_encoder ( struct drm_encoder * enc )
{
struct drm_encoder_slave * slave = to_encoder_slave ( enc ) ;
return container_of ( slave , struct nouveau_encoder , base ) ;
}
static inline struct drm_encoder * to_drm_encoder ( struct nouveau_encoder * enc )
{
return & enc - > base . base ;
}
2015-12-15 12:20:58 +01:00
static inline const struct drm_encoder_slave_funcs *
2010-07-20 16:48:08 +02:00
get_slave_funcs ( struct drm_encoder * enc )
{
return to_encoder_slave ( enc ) - > slave_funcs ;
}
2012-03-09 16:22:56 +10:00
/* nouveau_dp.c */
2016-11-04 17:20:36 +10:00
enum nouveau_dp_status {
NOUVEAU_DP_SST ,
NOUVEAU_DP_MST ,
} ;
2014-06-06 18:09:55 +10:00
int nouveau_dp_detect ( struct nouveau_encoder * ) ;
2012-03-09 16:22:56 +10:00
2009-12-11 19:24:15 +10:00
struct nouveau_connector *
nouveau_encoder_connector_get ( struct nouveau_encoder * encoder ) ;
2012-03-09 16:22:56 +10:00
2016-11-04 17:20:36 +10:00
int nv50_mstm_detect ( struct nv50_mstm * , u8 dpcd [ 8 ] , int allow ) ;
2016-11-04 17:20:36 +10:00
void nv50_mstm_remove ( struct nv50_mstm * ) ;
void nv50_mstm_service ( struct nv50_mstm * ) ;
2009-12-11 19:24:15 +10:00
# endif /* __NOUVEAU_ENCODER_H__ */