cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

drm.h (6108B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright (C) 2012 Avionic Design GmbH
      4 * Copyright (C) 2012-2013 NVIDIA CORPORATION.  All rights reserved.
      5 */
      6
      7#ifndef HOST1X_DRM_H
      8#define HOST1X_DRM_H 1
      9
     10#include <linux/host1x.h>
     11#include <linux/iova.h>
     12#include <linux/gpio/consumer.h>
     13
     14#include <drm/drm_atomic.h>
     15#include <drm/drm_bridge.h>
     16#include <drm/drm_edid.h>
     17#include <drm/drm_encoder.h>
     18#include <drm/drm_fb_helper.h>
     19#include <drm/drm_fixed.h>
     20#include <drm/drm_probe_helper.h>
     21#include <uapi/drm/tegra_drm.h>
     22
     23#include "gem.h"
     24#include "hub.h"
     25#include "trace.h"
     26
     27/* XXX move to include/uapi/drm/drm_fourcc.h? */
     28#define DRM_FORMAT_MOD_NVIDIA_SECTOR_LAYOUT BIT_ULL(22)
     29
     30struct reset_control;
     31
     32#ifdef CONFIG_DRM_FBDEV_EMULATION
     33struct tegra_fbdev {
     34	struct drm_fb_helper base;
     35	struct drm_framebuffer *fb;
     36};
     37#endif
     38
     39struct tegra_drm {
     40	struct drm_device *drm;
     41
     42	struct iommu_domain *domain;
     43	bool use_explicit_iommu;
     44	struct mutex mm_lock;
     45	struct drm_mm mm;
     46
     47	struct {
     48		struct iova_domain domain;
     49		unsigned long shift;
     50		unsigned long limit;
     51	} carveout;
     52
     53	struct mutex clients_lock;
     54	struct list_head clients;
     55
     56#ifdef CONFIG_DRM_FBDEV_EMULATION
     57	struct tegra_fbdev *fbdev;
     58#endif
     59
     60	unsigned int hmask, vmask;
     61	unsigned int pitch_align;
     62	unsigned int num_crtcs;
     63
     64	struct tegra_display_hub *hub;
     65};
     66
     67static inline struct host1x *tegra_drm_to_host1x(struct tegra_drm *tegra)
     68{
     69	return dev_get_drvdata(tegra->drm->dev->parent);
     70}
     71
     72struct tegra_drm_client;
     73
     74struct tegra_drm_context {
     75	struct tegra_drm_client *client;
     76	struct host1x_channel *channel;
     77
     78	/* Only used by legacy UAPI. */
     79	unsigned int id;
     80
     81	/* Only used by new UAPI. */
     82	struct xarray mappings;
     83};
     84
     85struct tegra_drm_client_ops {
     86	int (*open_channel)(struct tegra_drm_client *client,
     87			    struct tegra_drm_context *context);
     88	void (*close_channel)(struct tegra_drm_context *context);
     89	int (*is_addr_reg)(struct device *dev, u32 class, u32 offset);
     90	int (*is_valid_class)(u32 class);
     91	int (*submit)(struct tegra_drm_context *context,
     92		      struct drm_tegra_submit *args, struct drm_device *drm,
     93		      struct drm_file *file);
     94};
     95
     96int tegra_drm_submit(struct tegra_drm_context *context,
     97		     struct drm_tegra_submit *args, struct drm_device *drm,
     98		     struct drm_file *file);
     99
    100struct tegra_drm_client {
    101	struct host1x_client base;
    102	struct list_head list;
    103	struct tegra_drm *drm;
    104	struct host1x_channel *shared_channel;
    105
    106	/* Set by driver */
    107	unsigned int version;
    108	const struct tegra_drm_client_ops *ops;
    109};
    110
    111static inline struct tegra_drm_client *
    112host1x_to_drm_client(struct host1x_client *client)
    113{
    114	return container_of(client, struct tegra_drm_client, base);
    115}
    116
    117int tegra_drm_register_client(struct tegra_drm *tegra,
    118			      struct tegra_drm_client *client);
    119int tegra_drm_unregister_client(struct tegra_drm *tegra,
    120				struct tegra_drm_client *client);
    121int host1x_client_iommu_attach(struct host1x_client *client);
    122void host1x_client_iommu_detach(struct host1x_client *client);
    123
    124int tegra_drm_init(struct tegra_drm *tegra, struct drm_device *drm);
    125int tegra_drm_exit(struct tegra_drm *tegra);
    126
    127void *tegra_drm_alloc(struct tegra_drm *tegra, size_t size, dma_addr_t *iova);
    128void tegra_drm_free(struct tegra_drm *tegra, size_t size, void *virt,
    129		    dma_addr_t iova);
    130
    131struct cec_notifier;
    132
    133struct tegra_output {
    134	struct device_node *of_node;
    135	struct device *dev;
    136
    137	struct drm_bridge *bridge;
    138	struct drm_panel *panel;
    139	struct i2c_adapter *ddc;
    140	const struct edid *edid;
    141	struct cec_notifier *cec;
    142	unsigned int hpd_irq;
    143	struct gpio_desc *hpd_gpio;
    144
    145	struct drm_encoder encoder;
    146	struct drm_connector connector;
    147};
    148
    149static inline struct tegra_output *encoder_to_output(struct drm_encoder *e)
    150{
    151	return container_of(e, struct tegra_output, encoder);
    152}
    153
    154static inline struct tegra_output *connector_to_output(struct drm_connector *c)
    155{
    156	return container_of(c, struct tegra_output, connector);
    157}
    158
    159/* from output.c */
    160int tegra_output_probe(struct tegra_output *output);
    161void tegra_output_remove(struct tegra_output *output);
    162int tegra_output_init(struct drm_device *drm, struct tegra_output *output);
    163void tegra_output_exit(struct tegra_output *output);
    164void tegra_output_find_possible_crtcs(struct tegra_output *output,
    165				      struct drm_device *drm);
    166int tegra_output_suspend(struct tegra_output *output);
    167int tegra_output_resume(struct tegra_output *output);
    168
    169int tegra_output_connector_get_modes(struct drm_connector *connector);
    170enum drm_connector_status
    171tegra_output_connector_detect(struct drm_connector *connector, bool force);
    172void tegra_output_connector_destroy(struct drm_connector *connector);
    173
    174/* from dpaux.c */
    175struct drm_dp_aux *drm_dp_aux_find_by_of_node(struct device_node *np);
    176enum drm_connector_status drm_dp_aux_detect(struct drm_dp_aux *aux);
    177int drm_dp_aux_attach(struct drm_dp_aux *aux, struct tegra_output *output);
    178int drm_dp_aux_detach(struct drm_dp_aux *aux);
    179int drm_dp_aux_enable(struct drm_dp_aux *aux);
    180int drm_dp_aux_disable(struct drm_dp_aux *aux);
    181
    182/* from fb.c */
    183struct tegra_bo *tegra_fb_get_plane(struct drm_framebuffer *framebuffer,
    184				    unsigned int index);
    185bool tegra_fb_is_bottom_up(struct drm_framebuffer *framebuffer);
    186int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
    187			struct tegra_bo_tiling *tiling);
    188struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
    189					struct drm_file *file,
    190					const struct drm_mode_fb_cmd2 *cmd);
    191int tegra_drm_fb_prepare(struct drm_device *drm);
    192void tegra_drm_fb_free(struct drm_device *drm);
    193int tegra_drm_fb_init(struct drm_device *drm);
    194void tegra_drm_fb_exit(struct drm_device *drm);
    195
    196extern struct platform_driver tegra_display_hub_driver;
    197extern struct platform_driver tegra_dc_driver;
    198extern struct platform_driver tegra_hdmi_driver;
    199extern struct platform_driver tegra_dsi_driver;
    200extern struct platform_driver tegra_dpaux_driver;
    201extern struct platform_driver tegra_sor_driver;
    202extern struct platform_driver tegra_gr2d_driver;
    203extern struct platform_driver tegra_gr3d_driver;
    204extern struct platform_driver tegra_vic_driver;
    205extern struct platform_driver tegra_nvdec_driver;
    206
    207#endif /* HOST1X_DRM_H */