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>
2016-12-14 13:16:11 +02:00
# include <linux/iova.h>
2015-04-27 15:12:39 +02:00
# include <linux/of_gpio.h>
2013-09-24 13:59:01 +02:00
2012-11-15 21:28:22 +00:00
# include <drm/drmP.h>
2017-11-13 11:08:13 +01:00
# include <drm/drm_atomic.h>
2012-11-15 21:28:22 +00:00
# include <drm/drm_crtc_helper.h>
# include <drm/drm_edid.h>
2016-11-28 20:51:09 +02:00
# include <drm/drm_encoder.h>
2012-11-15 21:28:22 +00:00
# include <drm/drm_fb_helper.h>
# include <drm/drm_fixed.h>
2014-06-03 14:48:12 +02:00
# include "gem.h"
2017-11-13 11:08:13 +01:00
# include "hub.h"
2017-08-15 15:41:10 +02:00
# include "trace.h"
2014-06-03 14:48:12 +02:00
2013-11-06 16:20:54 -07:00
struct reset_control ;
2015-10-27 13:40:59 +05:30
# ifdef CONFIG_DRM_FBDEV_EMULATION
2013-03-22 16:34:08 +02:00
struct tegra_fbdev {
struct drm_fb_helper base ;
2018-03-30 15:11:27 +01:00
struct drm_framebuffer * fb ;
2013-03-22 16:34:08 +02:00
} ;
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 ;
2017-10-12 17:43:33 +02:00
struct iommu_group * group ;
2017-03-09 20:04:56 +01:00
struct mutex mm_lock ;
2014-06-26 21:41:53 +02:00
struct drm_mm mm ;
2016-12-14 13:16:11 +02:00
struct {
struct iova_domain domain ;
unsigned long shift ;
unsigned long limit ;
} carveout ;
2012-11-15 21:28:22 +00:00
struct mutex clients_lock ;
struct list_head clients ;
2015-10-27 13:40:59 +05:30
# ifdef CONFIG_DRM_FBDEV_EMULATION
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
2017-11-13 11:08:13 +01:00
struct tegra_display_hub * hub ;
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 ;
2017-03-09 20:04:55 +01:00
unsigned int id ;
2013-03-22 16:34:09 +02:00
} ;
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 ) ;
2017-06-15 02:18:37 +03:00
int ( * is_valid_class ) ( u32 class ) ;
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
2018-05-16 17:05:04 +02:00
unsigned int version ;
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 ) ;
2018-05-04 15:02:24 +02:00
struct iommu_group * host1x_client_iommu_attach ( struct host1x_client * client ,
bool shared ) ;
void host1x_client_iommu_detach ( struct host1x_client * client ,
struct iommu_group * group ) ;
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
2016-12-14 13:16:11 +02:00
void * tegra_drm_alloc ( struct tegra_drm * tegra , size_t size , dma_addr_t * iova ) ;
void tegra_drm_free ( struct tegra_drm * tegra , size_t size , void * virt ,
dma_addr_t iova ) ;
2017-09-11 14:29:52 +02:00
struct cec_notifier ;
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 ;
2017-09-11 14:29:52 +02:00
struct cec_notifier * notifier ;
2012-11-15 21:28:22 +00:00
unsigned int hpd_irq ;
int hpd_gpio ;
2015-04-27 15:12:39 +02:00
enum of_gpio_flags hpd_gpio_flags ;
2012-11-15 21:28:22 +00:00
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 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 ) ;
2017-10-12 19:12:57 +02:00
void tegra_output_find_possible_crtcs ( struct tegra_output * output ,
struct drm_device * drm ) ;
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 ) ;
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 drm_dp_link ;
2015-07-08 13:39:09 +02:00
struct drm_dp_aux * drm_dp_aux_find_by_of_node ( struct device_node * np ) ;
enum drm_connector_status drm_dp_aux_detect ( struct drm_dp_aux * aux ) ;
int drm_dp_aux_attach ( struct drm_dp_aux * aux , struct tegra_output * output ) ;
int drm_dp_aux_detach ( struct drm_dp_aux * aux ) ;
int drm_dp_aux_enable ( struct drm_dp_aux * aux ) ;
int drm_dp_aux_disable ( struct drm_dp_aux * aux ) ;
int drm_dp_aux_prepare ( struct drm_dp_aux * aux , u8 encoding ) ;
int drm_dp_aux_train ( struct drm_dp_aux * aux , struct drm_dp_link * link ,
u8 pattern ) ;
2013-11-15 16:06:05 +01:00
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 ,
2015-11-11 19:11:29 +02:00
const 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 ) ;
2012-11-15 21:28:22 +00:00
2017-11-13 11:08:13 +01:00
extern struct platform_driver tegra_display_hub_driver ;
2013-10-14 14:43:22 +02:00
extern struct platform_driver tegra_dc_driver ;
extern struct platform_driver tegra_hdmi_driver ;
2015-09-10 16:07:14 +02:00
extern struct platform_driver tegra_dsi_driver ;
2013-11-15 16:06:05 +01:00
extern struct platform_driver tegra_dpaux_driver ;
2015-09-10 16:07:14 +02:00
extern struct platform_driver tegra_sor_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 ;
2016-12-14 13:16:13 +02:00
extern struct platform_driver tegra_vic_driver ;
2012-11-15 21:28:22 +00:00
2013-03-22 16:34:05 +02:00
# endif /* HOST1X_DRM_H */