0001
0002
0003
0004
0005
0006
0007 #ifndef HOST1X_DRM_H
0008 #define HOST1X_DRM_H 1
0009
0010 #include <linux/host1x.h>
0011 #include <linux/iova.h>
0012 #include <linux/gpio/consumer.h>
0013
0014 #include <drm/drm_atomic.h>
0015 #include <drm/drm_bridge.h>
0016 #include <drm/drm_edid.h>
0017 #include <drm/drm_encoder.h>
0018 #include <drm/drm_fb_helper.h>
0019 #include <drm/drm_fixed.h>
0020 #include <drm/drm_probe_helper.h>
0021 #include <uapi/drm/tegra_drm.h>
0022
0023 #include "gem.h"
0024 #include "hub.h"
0025 #include "trace.h"
0026
0027
0028 #define DRM_FORMAT_MOD_NVIDIA_SECTOR_LAYOUT BIT_ULL(22)
0029
0030 struct reset_control;
0031
0032 #ifdef CONFIG_DRM_FBDEV_EMULATION
0033 struct tegra_fbdev {
0034 struct drm_fb_helper base;
0035 struct drm_framebuffer *fb;
0036 };
0037 #endif
0038
0039 struct tegra_drm {
0040 struct drm_device *drm;
0041
0042 struct iommu_domain *domain;
0043 bool use_explicit_iommu;
0044 struct mutex mm_lock;
0045 struct drm_mm mm;
0046
0047 struct {
0048 struct iova_domain domain;
0049 unsigned long shift;
0050 unsigned long limit;
0051 } carveout;
0052
0053 struct mutex clients_lock;
0054 struct list_head clients;
0055
0056 #ifdef CONFIG_DRM_FBDEV_EMULATION
0057 struct tegra_fbdev *fbdev;
0058 #endif
0059
0060 unsigned int hmask, vmask;
0061 unsigned int pitch_align;
0062 unsigned int num_crtcs;
0063
0064 struct tegra_display_hub *hub;
0065 };
0066
0067 static inline struct host1x *tegra_drm_to_host1x(struct tegra_drm *tegra)
0068 {
0069 return dev_get_drvdata(tegra->drm->dev->parent);
0070 }
0071
0072 struct tegra_drm_client;
0073
0074 struct tegra_drm_context {
0075 struct tegra_drm_client *client;
0076 struct host1x_channel *channel;
0077
0078
0079 unsigned int id;
0080
0081
0082 struct xarray mappings;
0083 struct host1x_memory_context *memory_context;
0084 };
0085
0086 struct tegra_drm_client_ops {
0087 int (*open_channel)(struct tegra_drm_client *client,
0088 struct tegra_drm_context *context);
0089 void (*close_channel)(struct tegra_drm_context *context);
0090 int (*is_addr_reg)(struct device *dev, u32 class, u32 offset);
0091 int (*is_valid_class)(u32 class);
0092 int (*submit)(struct tegra_drm_context *context,
0093 struct drm_tegra_submit *args, struct drm_device *drm,
0094 struct drm_file *file);
0095 int (*get_streamid_offset)(struct tegra_drm_client *client, u32 *offset);
0096 int (*can_use_memory_ctx)(struct tegra_drm_client *client, bool *supported);
0097 };
0098
0099 int tegra_drm_submit(struct tegra_drm_context *context,
0100 struct drm_tegra_submit *args, struct drm_device *drm,
0101 struct drm_file *file);
0102
0103 static inline int
0104 tegra_drm_get_streamid_offset_thi(struct tegra_drm_client *client, u32 *offset)
0105 {
0106 *offset = 0x30;
0107
0108 return 0;
0109 }
0110
0111 struct tegra_drm_client {
0112 struct host1x_client base;
0113 struct list_head list;
0114 struct tegra_drm *drm;
0115 struct host1x_channel *shared_channel;
0116
0117
0118 unsigned int version;
0119 const struct tegra_drm_client_ops *ops;
0120 };
0121
0122 static inline struct tegra_drm_client *
0123 host1x_to_drm_client(struct host1x_client *client)
0124 {
0125 return container_of(client, struct tegra_drm_client, base);
0126 }
0127
0128 int tegra_drm_register_client(struct tegra_drm *tegra,
0129 struct tegra_drm_client *client);
0130 int tegra_drm_unregister_client(struct tegra_drm *tegra,
0131 struct tegra_drm_client *client);
0132 int host1x_client_iommu_attach(struct host1x_client *client);
0133 void host1x_client_iommu_detach(struct host1x_client *client);
0134
0135 int tegra_drm_init(struct tegra_drm *tegra, struct drm_device *drm);
0136 int tegra_drm_exit(struct tegra_drm *tegra);
0137
0138 void *tegra_drm_alloc(struct tegra_drm *tegra, size_t size, dma_addr_t *iova);
0139 void tegra_drm_free(struct tegra_drm *tegra, size_t size, void *virt,
0140 dma_addr_t iova);
0141
0142 struct cec_notifier;
0143
0144 struct tegra_output {
0145 struct device_node *of_node;
0146 struct device *dev;
0147
0148 struct drm_bridge *bridge;
0149 struct drm_panel *panel;
0150 struct i2c_adapter *ddc;
0151 const struct edid *edid;
0152 struct cec_notifier *cec;
0153 unsigned int hpd_irq;
0154 struct gpio_desc *hpd_gpio;
0155
0156 struct drm_encoder encoder;
0157 struct drm_connector connector;
0158 };
0159
0160 static inline struct tegra_output *encoder_to_output(struct drm_encoder *e)
0161 {
0162 return container_of(e, struct tegra_output, encoder);
0163 }
0164
0165 static inline struct tegra_output *connector_to_output(struct drm_connector *c)
0166 {
0167 return container_of(c, struct tegra_output, connector);
0168 }
0169
0170
0171 int tegra_output_probe(struct tegra_output *output);
0172 void tegra_output_remove(struct tegra_output *output);
0173 int tegra_output_init(struct drm_device *drm, struct tegra_output *output);
0174 void tegra_output_exit(struct tegra_output *output);
0175 void tegra_output_find_possible_crtcs(struct tegra_output *output,
0176 struct drm_device *drm);
0177 int tegra_output_suspend(struct tegra_output *output);
0178 int tegra_output_resume(struct tegra_output *output);
0179
0180 int tegra_output_connector_get_modes(struct drm_connector *connector);
0181 enum drm_connector_status
0182 tegra_output_connector_detect(struct drm_connector *connector, bool force);
0183 void tegra_output_connector_destroy(struct drm_connector *connector);
0184
0185
0186 struct drm_dp_aux *drm_dp_aux_find_by_of_node(struct device_node *np);
0187 enum drm_connector_status drm_dp_aux_detect(struct drm_dp_aux *aux);
0188 int drm_dp_aux_attach(struct drm_dp_aux *aux, struct tegra_output *output);
0189 int drm_dp_aux_detach(struct drm_dp_aux *aux);
0190 int drm_dp_aux_enable(struct drm_dp_aux *aux);
0191 int drm_dp_aux_disable(struct drm_dp_aux *aux);
0192
0193
0194 struct tegra_bo *tegra_fb_get_plane(struct drm_framebuffer *framebuffer,
0195 unsigned int index);
0196 bool tegra_fb_is_bottom_up(struct drm_framebuffer *framebuffer);
0197 int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
0198 struct tegra_bo_tiling *tiling);
0199 struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
0200 struct drm_file *file,
0201 const struct drm_mode_fb_cmd2 *cmd);
0202 int tegra_drm_fb_prepare(struct drm_device *drm);
0203 void tegra_drm_fb_free(struct drm_device *drm);
0204 int tegra_drm_fb_init(struct drm_device *drm);
0205 void tegra_drm_fb_exit(struct drm_device *drm);
0206
0207 extern struct platform_driver tegra_display_hub_driver;
0208 extern struct platform_driver tegra_dc_driver;
0209 extern struct platform_driver tegra_hdmi_driver;
0210 extern struct platform_driver tegra_dsi_driver;
0211 extern struct platform_driver tegra_dpaux_driver;
0212 extern struct platform_driver tegra_sor_driver;
0213 extern struct platform_driver tegra_gr2d_driver;
0214 extern struct platform_driver tegra_gr3d_driver;
0215 extern struct platform_driver tegra_vic_driver;
0216 extern struct platform_driver tegra_nvdec_driver;
0217
0218 #endif