18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2012 Avionic Design GmbH
48c2ecf20Sopenharmony_ci * Copyright (C) 2012-2013 NVIDIA CORPORATION.  All rights reserved.
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#ifndef HOST1X_DRM_H
88c2ecf20Sopenharmony_ci#define HOST1X_DRM_H 1
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <linux/host1x.h>
118c2ecf20Sopenharmony_ci#include <linux/iova.h>
128c2ecf20Sopenharmony_ci#include <linux/gpio/consumer.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <drm/drm_atomic.h>
158c2ecf20Sopenharmony_ci#include <drm/drm_bridge.h>
168c2ecf20Sopenharmony_ci#include <drm/drm_edid.h>
178c2ecf20Sopenharmony_ci#include <drm/drm_encoder.h>
188c2ecf20Sopenharmony_ci#include <drm/drm_fb_helper.h>
198c2ecf20Sopenharmony_ci#include <drm/drm_fixed.h>
208c2ecf20Sopenharmony_ci#include <drm/drm_probe_helper.h>
218c2ecf20Sopenharmony_ci#include <uapi/drm/tegra_drm.h>
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci#include "gem.h"
248c2ecf20Sopenharmony_ci#include "hub.h"
258c2ecf20Sopenharmony_ci#include "trace.h"
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_cistruct reset_control;
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci#ifdef CONFIG_DRM_FBDEV_EMULATION
308c2ecf20Sopenharmony_cistruct tegra_fbdev {
318c2ecf20Sopenharmony_ci	struct drm_fb_helper base;
328c2ecf20Sopenharmony_ci	struct drm_framebuffer *fb;
338c2ecf20Sopenharmony_ci};
348c2ecf20Sopenharmony_ci#endif
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_cistruct tegra_drm {
378c2ecf20Sopenharmony_ci	struct drm_device *drm;
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	struct iommu_domain *domain;
408c2ecf20Sopenharmony_ci	bool use_explicit_iommu;
418c2ecf20Sopenharmony_ci	struct mutex mm_lock;
428c2ecf20Sopenharmony_ci	struct drm_mm mm;
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	struct {
458c2ecf20Sopenharmony_ci		struct iova_domain domain;
468c2ecf20Sopenharmony_ci		unsigned long shift;
478c2ecf20Sopenharmony_ci		unsigned long limit;
488c2ecf20Sopenharmony_ci	} carveout;
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci	struct mutex clients_lock;
518c2ecf20Sopenharmony_ci	struct list_head clients;
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci#ifdef CONFIG_DRM_FBDEV_EMULATION
548c2ecf20Sopenharmony_ci	struct tegra_fbdev *fbdev;
558c2ecf20Sopenharmony_ci#endif
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci	unsigned int pitch_align;
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci	struct tegra_display_hub *hub;
608c2ecf20Sopenharmony_ci};
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_cistruct tegra_drm_client;
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_cistruct tegra_drm_context {
658c2ecf20Sopenharmony_ci	struct tegra_drm_client *client;
668c2ecf20Sopenharmony_ci	struct host1x_channel *channel;
678c2ecf20Sopenharmony_ci	unsigned int id;
688c2ecf20Sopenharmony_ci};
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_cistruct tegra_drm_client_ops {
718c2ecf20Sopenharmony_ci	int (*open_channel)(struct tegra_drm_client *client,
728c2ecf20Sopenharmony_ci			    struct tegra_drm_context *context);
738c2ecf20Sopenharmony_ci	void (*close_channel)(struct tegra_drm_context *context);
748c2ecf20Sopenharmony_ci	int (*is_addr_reg)(struct device *dev, u32 class, u32 offset);
758c2ecf20Sopenharmony_ci	int (*is_valid_class)(u32 class);
768c2ecf20Sopenharmony_ci	int (*submit)(struct tegra_drm_context *context,
778c2ecf20Sopenharmony_ci		      struct drm_tegra_submit *args, struct drm_device *drm,
788c2ecf20Sopenharmony_ci		      struct drm_file *file);
798c2ecf20Sopenharmony_ci};
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ciint tegra_drm_submit(struct tegra_drm_context *context,
828c2ecf20Sopenharmony_ci		     struct drm_tegra_submit *args, struct drm_device *drm,
838c2ecf20Sopenharmony_ci		     struct drm_file *file);
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_cistruct tegra_drm_client {
868c2ecf20Sopenharmony_ci	struct host1x_client base;
878c2ecf20Sopenharmony_ci	struct list_head list;
888c2ecf20Sopenharmony_ci	struct tegra_drm *drm;
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci	unsigned int version;
918c2ecf20Sopenharmony_ci	const struct tegra_drm_client_ops *ops;
928c2ecf20Sopenharmony_ci};
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_cistatic inline struct tegra_drm_client *
958c2ecf20Sopenharmony_cihost1x_to_drm_client(struct host1x_client *client)
968c2ecf20Sopenharmony_ci{
978c2ecf20Sopenharmony_ci	return container_of(client, struct tegra_drm_client, base);
988c2ecf20Sopenharmony_ci}
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ciint tegra_drm_register_client(struct tegra_drm *tegra,
1018c2ecf20Sopenharmony_ci			      struct tegra_drm_client *client);
1028c2ecf20Sopenharmony_ciint tegra_drm_unregister_client(struct tegra_drm *tegra,
1038c2ecf20Sopenharmony_ci				struct tegra_drm_client *client);
1048c2ecf20Sopenharmony_ciint host1x_client_iommu_attach(struct host1x_client *client);
1058c2ecf20Sopenharmony_civoid host1x_client_iommu_detach(struct host1x_client *client);
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ciint tegra_drm_init(struct tegra_drm *tegra, struct drm_device *drm);
1088c2ecf20Sopenharmony_ciint tegra_drm_exit(struct tegra_drm *tegra);
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_civoid *tegra_drm_alloc(struct tegra_drm *tegra, size_t size, dma_addr_t *iova);
1118c2ecf20Sopenharmony_civoid tegra_drm_free(struct tegra_drm *tegra, size_t size, void *virt,
1128c2ecf20Sopenharmony_ci		    dma_addr_t iova);
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_cistruct cec_notifier;
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_cistruct tegra_output {
1178c2ecf20Sopenharmony_ci	struct device_node *of_node;
1188c2ecf20Sopenharmony_ci	struct device *dev;
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_ci	struct drm_bridge *bridge;
1218c2ecf20Sopenharmony_ci	struct drm_panel *panel;
1228c2ecf20Sopenharmony_ci	struct i2c_adapter *ddc;
1238c2ecf20Sopenharmony_ci	const struct edid *edid;
1248c2ecf20Sopenharmony_ci	struct cec_notifier *cec;
1258c2ecf20Sopenharmony_ci	unsigned int hpd_irq;
1268c2ecf20Sopenharmony_ci	struct gpio_desc *hpd_gpio;
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_ci	struct drm_encoder encoder;
1298c2ecf20Sopenharmony_ci	struct drm_connector connector;
1308c2ecf20Sopenharmony_ci};
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_cistatic inline struct tegra_output *encoder_to_output(struct drm_encoder *e)
1338c2ecf20Sopenharmony_ci{
1348c2ecf20Sopenharmony_ci	return container_of(e, struct tegra_output, encoder);
1358c2ecf20Sopenharmony_ci}
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_cistatic inline struct tegra_output *connector_to_output(struct drm_connector *c)
1388c2ecf20Sopenharmony_ci{
1398c2ecf20Sopenharmony_ci	return container_of(c, struct tegra_output, connector);
1408c2ecf20Sopenharmony_ci}
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ci/* from output.c */
1438c2ecf20Sopenharmony_ciint tegra_output_probe(struct tegra_output *output);
1448c2ecf20Sopenharmony_civoid tegra_output_remove(struct tegra_output *output);
1458c2ecf20Sopenharmony_ciint tegra_output_init(struct drm_device *drm, struct tegra_output *output);
1468c2ecf20Sopenharmony_civoid tegra_output_exit(struct tegra_output *output);
1478c2ecf20Sopenharmony_civoid tegra_output_find_possible_crtcs(struct tegra_output *output,
1488c2ecf20Sopenharmony_ci				      struct drm_device *drm);
1498c2ecf20Sopenharmony_ciint tegra_output_suspend(struct tegra_output *output);
1508c2ecf20Sopenharmony_ciint tegra_output_resume(struct tegra_output *output);
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ciint tegra_output_connector_get_modes(struct drm_connector *connector);
1538c2ecf20Sopenharmony_cienum drm_connector_status
1548c2ecf20Sopenharmony_citegra_output_connector_detect(struct drm_connector *connector, bool force);
1558c2ecf20Sopenharmony_civoid tegra_output_connector_destroy(struct drm_connector *connector);
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_ci/* from dpaux.c */
1588c2ecf20Sopenharmony_cistruct drm_dp_aux *drm_dp_aux_find_by_of_node(struct device_node *np);
1598c2ecf20Sopenharmony_cienum drm_connector_status drm_dp_aux_detect(struct drm_dp_aux *aux);
1608c2ecf20Sopenharmony_ciint drm_dp_aux_attach(struct drm_dp_aux *aux, struct tegra_output *output);
1618c2ecf20Sopenharmony_ciint drm_dp_aux_detach(struct drm_dp_aux *aux);
1628c2ecf20Sopenharmony_ciint drm_dp_aux_enable(struct drm_dp_aux *aux);
1638c2ecf20Sopenharmony_ciint drm_dp_aux_disable(struct drm_dp_aux *aux);
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_ci/* from fb.c */
1668c2ecf20Sopenharmony_cistruct tegra_bo *tegra_fb_get_plane(struct drm_framebuffer *framebuffer,
1678c2ecf20Sopenharmony_ci				    unsigned int index);
1688c2ecf20Sopenharmony_cibool tegra_fb_is_bottom_up(struct drm_framebuffer *framebuffer);
1698c2ecf20Sopenharmony_ciint tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
1708c2ecf20Sopenharmony_ci			struct tegra_bo_tiling *tiling);
1718c2ecf20Sopenharmony_cistruct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
1728c2ecf20Sopenharmony_ci					struct drm_file *file,
1738c2ecf20Sopenharmony_ci					const struct drm_mode_fb_cmd2 *cmd);
1748c2ecf20Sopenharmony_ciint tegra_drm_fb_prepare(struct drm_device *drm);
1758c2ecf20Sopenharmony_civoid tegra_drm_fb_free(struct drm_device *drm);
1768c2ecf20Sopenharmony_ciint tegra_drm_fb_init(struct drm_device *drm);
1778c2ecf20Sopenharmony_civoid tegra_drm_fb_exit(struct drm_device *drm);
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_ciextern struct platform_driver tegra_display_hub_driver;
1808c2ecf20Sopenharmony_ciextern struct platform_driver tegra_dc_driver;
1818c2ecf20Sopenharmony_ciextern struct platform_driver tegra_hdmi_driver;
1828c2ecf20Sopenharmony_ciextern struct platform_driver tegra_dsi_driver;
1838c2ecf20Sopenharmony_ciextern struct platform_driver tegra_dpaux_driver;
1848c2ecf20Sopenharmony_ciextern struct platform_driver tegra_sor_driver;
1858c2ecf20Sopenharmony_ciextern struct platform_driver tegra_gr2d_driver;
1868c2ecf20Sopenharmony_ciextern struct platform_driver tegra_gr3d_driver;
1878c2ecf20Sopenharmony_ciextern struct platform_driver tegra_vic_driver;
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_ci#endif /* HOST1X_DRM_H */
190