2012-11-15 21:28:22 +00:00
/*
* Copyright ( C ) 2012 Avionic Design GmbH
2013-03-22 16:34:09 +02:00
* Copyright ( C ) 2012 - 2013 NVIDIA CORPORATION . All rights reserved .
2012-11-15 21:28:22 +00:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
2013-03-22 16:34:05 +02:00
# ifndef HOST1X_DRM_H
# define HOST1X_DRM_H 1
2012-11-15 21:28:22 +00:00
2013-09-24 13:59:01 +02:00
# include <uapi/drm/tegra_drm.h>
# include <linux/host1x.h>
2012-11-15 21:28:22 +00:00
# include <drm/drmP.h>
# include <drm/drm_crtc_helper.h>
# include <drm/drm_edid.h>
# include <drm/drm_fb_helper.h>
# include <drm/drm_fixed.h>
2014-06-03 14:48:12 +02:00
# include "gem.h"
2013-11-06 16:20:54 -07:00
struct reset_control ;
2013-03-22 16:34:08 +02:00
struct tegra_fb {
struct drm_framebuffer base ;
struct tegra_bo * * planes ;
unsigned int num_planes ;
} ;
2013-10-31 13:28:50 +01:00
# ifdef CONFIG_DRM_TEGRA_FBDEV
2013-03-22 16:34:08 +02:00
struct tegra_fbdev {
struct drm_fb_helper base ;
struct tegra_fb * fb ;
} ;
2013-10-31 13:28:50 +01:00
# endif
2013-03-22 16:34:08 +02:00
2013-09-24 13:22:17 +02:00
struct tegra_drm {
2012-11-15 21:28:22 +00:00
struct drm_device * drm ;
2014-06-26 21:41:53 +02:00
struct iommu_domain * domain ;
struct drm_mm mm ;
2012-11-15 21:28:22 +00:00
struct mutex clients_lock ;
struct list_head clients ;
2013-10-31 13:28:50 +01:00
# ifdef CONFIG_DRM_TEGRA_FBDEV
2013-03-22 16:34:08 +02:00
struct tegra_fbdev * fbdev ;
2013-10-31 13:28:50 +01:00
# endif
2014-07-11 08:29:14 +02:00
unsigned int pitch_align ;
2014-11-24 17:41:23 +01:00
struct {
struct drm_atomic_state * state ;
struct work_struct work ;
struct mutex lock ;
} commit ;
2012-11-15 21:28:22 +00:00
} ;
2013-09-24 15:35:40 +02:00
struct tegra_drm_client ;
2012-11-15 21:28:22 +00:00
2013-09-26 16:08:22 +02:00
struct tegra_drm_context {
2013-09-24 15:35:40 +02:00
struct tegra_drm_client * client ;
2013-03-22 16:34:09 +02:00
struct host1x_channel * channel ;
struct list_head list ;
} ;
2013-09-24 15:35:40 +02:00
struct tegra_drm_client_ops {
int ( * open_channel ) ( struct tegra_drm_client * client ,
2013-09-26 16:08:22 +02:00
struct tegra_drm_context * context ) ;
void ( * close_channel ) ( struct tegra_drm_context * context ) ;
2013-10-10 11:00:33 +02:00
int ( * is_addr_reg ) ( struct device * dev , u32 class , u32 offset ) ;
2013-09-26 16:08:22 +02:00
int ( * submit ) ( struct tegra_drm_context * context ,
2013-03-22 16:34:09 +02:00
struct drm_tegra_submit * args , struct drm_device * drm ,
struct drm_file * file ) ;
} ;
2013-10-10 11:00:33 +02:00
int tegra_drm_submit ( struct tegra_drm_context * context ,
struct drm_tegra_submit * args , struct drm_device * drm ,
struct drm_file * file ) ;
2013-09-24 15:35:40 +02:00
struct tegra_drm_client {
struct host1x_client base ;
2013-10-14 14:43:22 +02:00
struct list_head list ;
2013-03-22 16:34:09 +02:00
2013-09-24 15:35:40 +02:00
const struct tegra_drm_client_ops * ops ;
2012-11-15 21:28:22 +00:00
} ;
2013-09-24 15:35:40 +02:00
static inline struct tegra_drm_client *
2013-10-14 14:43:22 +02:00
host1x_to_drm_client ( struct host1x_client * client )
2013-09-24 15:35:40 +02:00
{
return container_of ( client , struct tegra_drm_client , base ) ;
}
2014-04-16 09:54:21 +02:00
int tegra_drm_register_client ( struct tegra_drm * tegra ,
struct tegra_drm_client * client ) ;
int tegra_drm_unregister_client ( struct tegra_drm * tegra ,
struct tegra_drm_client * client ) ;
2013-10-14 14:43:22 +02:00
2014-04-16 09:54:21 +02:00
int tegra_drm_init ( struct tegra_drm * tegra , struct drm_device * drm ) ;
int tegra_drm_exit ( struct tegra_drm * tegra ) ;
2012-11-15 21:28:22 +00:00
2013-12-12 11:03:59 +01:00
struct tegra_dc_soc_info ;
2012-11-15 21:28:22 +00:00
struct tegra_output ;
struct tegra_dc {
2013-10-14 14:43:22 +02:00
struct host1x_client client ;
2015-01-28 14:43:05 +01:00
struct host1x_syncpt * syncpt ;
2012-11-15 21:28:22 +00:00
struct device * dev ;
2013-09-26 16:09:19 +02:00
spinlock_t lock ;
2012-11-15 21:28:22 +00:00
struct drm_crtc base ;
2014-07-07 15:32:53 +02:00
int powergate ;
2012-11-15 21:28:22 +00:00
int pipe ;
struct clk * clk ;
2013-11-06 16:20:54 -07:00
struct reset_control * rst ;
2012-11-15 21:28:22 +00:00
void __iomem * regs ;
int irq ;
struct tegra_output * rgb ;
struct list_head list ;
struct drm_info_list * debugfs_files ;
struct drm_minor * minor ;
struct dentry * debugfs ;
2012-11-28 12:00:18 +01:00
/* page-flip handling */
struct drm_pending_vblank_event * event ;
2013-12-12 11:03:59 +01:00
const struct tegra_dc_soc_info * soc ;
2014-06-26 21:41:53 +02:00
struct iommu_domain * domain ;
2012-11-15 21:28:22 +00:00
} ;
2013-09-24 15:35:40 +02:00
static inline struct tegra_dc *
2013-10-14 14:43:22 +02:00
host1x_client_to_dc ( struct host1x_client * client )
2012-11-15 21:28:22 +00:00
{
return container_of ( client , struct tegra_dc , client ) ;
}
static inline struct tegra_dc * to_tegra_dc ( struct drm_crtc * crtc )
{
2013-11-08 12:30:37 +01:00
return crtc ? container_of ( crtc , struct tegra_dc , base ) : NULL ;
2012-11-15 21:28:22 +00:00
}
2014-10-21 13:48:48 +02:00
static inline void tegra_dc_writel ( struct tegra_dc * dc , u32 value ,
unsigned long offset )
2012-11-15 21:28:22 +00:00
{
2014-10-21 13:48:48 +02:00
writel ( value , dc - > regs + ( offset < < 2 ) ) ;
2012-11-15 21:28:22 +00:00
}
2014-10-21 13:48:48 +02:00
static inline u32 tegra_dc_readl ( struct tegra_dc * dc , unsigned long offset )
2012-11-15 21:28:22 +00:00
{
2014-10-21 13:48:48 +02:00
return readl ( dc - > regs + ( offset < < 2 ) ) ;
2012-11-15 21:28:22 +00:00
}
2012-11-04 21:47:13 +01:00
struct tegra_dc_window {
struct {
unsigned int x ;
unsigned int y ;
unsigned int w ;
unsigned int h ;
} src ;
struct {
unsigned int x ;
unsigned int y ;
unsigned int w ;
unsigned int h ;
} dst ;
unsigned int bits_per_pixel ;
unsigned int stride [ 2 ] ;
unsigned long base [ 3 ] ;
2013-10-07 09:47:58 +02:00
bool bottom_up ;
2014-06-03 14:48:12 +02:00
struct tegra_bo_tiling tiling ;
2014-11-28 13:14:55 +01:00
u32 format ;
u32 swap ;
2012-11-04 21:47:13 +01:00
} ;
/* from dc.c */
2015-01-28 14:43:05 +01:00
u32 tegra_dc_get_vblank_counter ( struct tegra_dc * dc ) ;
2014-04-16 09:54:21 +02:00
void tegra_dc_enable_vblank ( struct tegra_dc * dc ) ;
void tegra_dc_disable_vblank ( struct tegra_dc * dc ) ;
void tegra_dc_cancel_page_flip ( struct drm_crtc * crtc , struct drm_file * file ) ;
2014-11-21 17:33:33 +01:00
void tegra_dc_commit ( struct tegra_dc * dc ) ;
2014-12-08 16:14:45 +01:00
int tegra_dc_state_setup_clock ( struct tegra_dc * dc ,
struct drm_crtc_state * crtc_state ,
struct clk * clk , unsigned long pclk ,
unsigned int div ) ;
2012-11-04 21:47:13 +01:00
2012-11-15 21:28:22 +00:00
struct tegra_output {
struct device_node * of_node ;
struct device * dev ;
2013-08-30 15:22:36 +02:00
struct drm_panel * panel ;
2012-11-15 21:28:22 +00:00
struct i2c_adapter * ddc ;
const struct edid * edid ;
unsigned int hpd_irq ;
int hpd_gpio ;
struct drm_encoder encoder ;
struct drm_connector connector ;
} ;
static inline struct tegra_output * encoder_to_output ( struct drm_encoder * e )
{
return container_of ( e , struct tegra_output , encoder ) ;
}
static inline struct tegra_output * connector_to_output ( struct drm_connector * c )
{
return container_of ( c , struct tegra_output , connector ) ;
}
/* from rgb.c */
2014-04-16 09:54:21 +02:00
int tegra_dc_rgb_probe ( struct tegra_dc * dc ) ;
int tegra_dc_rgb_remove ( struct tegra_dc * dc ) ;
int tegra_dc_rgb_init ( struct drm_device * drm , struct tegra_dc * dc ) ;
int tegra_dc_rgb_exit ( struct tegra_dc * dc ) ;
2012-11-15 21:28:22 +00:00
/* from output.c */
2014-04-16 09:54:21 +02:00
int tegra_output_probe ( struct tegra_output * output ) ;
2014-12-19 15:55:08 +01:00
void tegra_output_remove ( struct tegra_output * output ) ;
2014-04-16 09:54:21 +02:00
int tegra_output_init ( struct drm_device * drm , struct tegra_output * output ) ;
2014-12-19 15:55:08 +01:00
void tegra_output_exit ( struct tegra_output * output ) ;
2012-11-15 21:28:22 +00:00
2014-11-28 15:38:40 +01:00
int tegra_output_connector_get_modes ( struct drm_connector * connector ) ;
struct drm_encoder *
tegra_output_connector_best_encoder ( struct drm_connector * connector ) ;
enum drm_connector_status
tegra_output_connector_detect ( struct drm_connector * connector , bool force ) ;
void tegra_output_connector_destroy ( struct drm_connector * connector ) ;
void tegra_output_encoder_destroy ( struct drm_encoder * encoder ) ;
2013-11-15 16:06:05 +01:00
/* from dpaux.c */
struct tegra_dpaux ;
struct drm_dp_link ;
struct tegra_dpaux * tegra_dpaux_find_by_of_node ( struct device_node * np ) ;
enum drm_connector_status tegra_dpaux_detect ( struct tegra_dpaux * dpaux ) ;
int tegra_dpaux_attach ( struct tegra_dpaux * dpaux , struct tegra_output * output ) ;
int tegra_dpaux_detach ( struct tegra_dpaux * dpaux ) ;
int tegra_dpaux_enable ( struct tegra_dpaux * dpaux ) ;
int tegra_dpaux_disable ( struct tegra_dpaux * dpaux ) ;
int tegra_dpaux_prepare ( struct tegra_dpaux * dpaux , u8 encoding ) ;
int tegra_dpaux_train ( struct tegra_dpaux * dpaux , struct drm_dp_link * link ,
u8 pattern ) ;
2012-11-15 21:28:22 +00:00
/* from fb.c */
2013-03-22 16:34:08 +02:00
struct tegra_bo * tegra_fb_get_plane ( struct drm_framebuffer * framebuffer ,
unsigned int index ) ;
2013-10-07 09:47:58 +02:00
bool tegra_fb_is_bottom_up ( struct drm_framebuffer * framebuffer ) ;
2014-06-03 14:48:12 +02:00
int tegra_fb_get_tiling ( struct drm_framebuffer * framebuffer ,
struct tegra_bo_tiling * tiling ) ;
2014-11-26 13:03:57 +01:00
struct drm_framebuffer * tegra_fb_create ( struct drm_device * drm ,
struct drm_file * file ,
struct drm_mode_fb_cmd2 * cmd ) ;
2014-06-27 17:19:25 +02:00
int tegra_drm_fb_prepare ( struct drm_device * drm ) ;
2014-11-06 14:12:08 +01:00
void tegra_drm_fb_free ( struct drm_device * drm ) ;
2014-04-16 09:54:21 +02:00
int tegra_drm_fb_init ( struct drm_device * drm ) ;
void tegra_drm_fb_exit ( struct drm_device * drm ) ;
2013-10-31 13:28:50 +01:00
# ifdef CONFIG_DRM_TEGRA_FBDEV
2014-04-16 09:54:21 +02:00
void tegra_fbdev_restore_mode ( struct tegra_fbdev * fbdev ) ;
2014-11-26 13:03:57 +01:00
void tegra_fb_output_poll_changed ( struct drm_device * drm ) ;
2013-10-31 13:28:50 +01:00
# endif
2012-11-15 21:28:22 +00:00
2013-10-14 14:43:22 +02:00
extern struct platform_driver tegra_dc_driver ;
2013-09-03 08:45:46 +02:00
extern struct platform_driver tegra_dsi_driver ;
2013-11-15 16:06:05 +01:00
extern struct platform_driver tegra_sor_driver ;
2013-10-14 14:43:22 +02:00
extern struct platform_driver tegra_hdmi_driver ;
2013-11-15 16:06:05 +01:00
extern struct platform_driver tegra_dpaux_driver ;
2013-10-14 14:43:22 +02:00
extern struct platform_driver tegra_gr2d_driver ;
2013-02-28 08:08:01 +01:00
extern struct platform_driver tegra_gr3d_driver ;
2012-11-15 21:28:22 +00:00
2013-03-22 16:34:05 +02:00
# endif /* HOST1X_DRM_H */