Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (C) 2012 Avionic Design GmbH
0004  * Copyright (C) 2012-2013 NVIDIA CORPORATION.  All rights reserved.
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 /* XXX move to include/uapi/drm/drm_fourcc.h? */
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     /* Only used by legacy UAPI. */
0079     unsigned int id;
0080 
0081     /* Only used by new UAPI. */
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     /* Set by driver */
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 /* from output.c */
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 /* from dpaux.c */
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 /* from fb.c */
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 /* HOST1X_DRM_H */