linux/drivers/gpu/drm/gma500/psb_intel_drv.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (c) 2009-2011, Intel Corporation.
   4 */
   5
   6#ifndef __INTEL_DRV_H__
   7#define __INTEL_DRV_H__
   8
   9#include <linux/i2c.h>
  10#include <linux/i2c-algo-bit.h>
  11#include <drm/drm_crtc.h>
  12#include <drm/drm_crtc_helper.h>
  13#include <drm/drm_encoder.h>
  14#include <drm/drm_probe_helper.h>
  15#include <drm/drm_vblank.h>
  16#include <linux/gpio.h>
  17#include "gma_display.h"
  18
  19/*
  20 * Display related stuff
  21 */
  22
  23/* maximum connectors per crtcs in the mode set */
  24#define INTELFB_CONN_LIMIT 4
  25
  26/* Intel Pipe Clone Bit */
  27#define INTEL_HDMIB_CLONE_BIT 1
  28#define INTEL_HDMIC_CLONE_BIT 2
  29#define INTEL_HDMID_CLONE_BIT 3
  30#define INTEL_HDMIE_CLONE_BIT 4
  31#define INTEL_HDMIF_CLONE_BIT 5
  32#define INTEL_SDVO_NON_TV_CLONE_BIT 6
  33#define INTEL_SDVO_TV_CLONE_BIT 7
  34#define INTEL_SDVO_LVDS_CLONE_BIT 8
  35#define INTEL_ANALOG_CLONE_BIT 9
  36#define INTEL_TV_CLONE_BIT 10
  37#define INTEL_DP_B_CLONE_BIT 11
  38#define INTEL_DP_C_CLONE_BIT 12
  39#define INTEL_DP_D_CLONE_BIT 13
  40#define INTEL_LVDS_CLONE_BIT 14
  41#define INTEL_DVO_TMDS_CLONE_BIT 15
  42#define INTEL_DVO_LVDS_CLONE_BIT 16
  43#define INTEL_EDP_CLONE_BIT 17
  44
  45/* these are outputs from the chip - integrated only
  46 * external chips are via DVO or SDVO output */
  47#define INTEL_OUTPUT_UNUSED 0
  48#define INTEL_OUTPUT_ANALOG 1
  49#define INTEL_OUTPUT_DVO 2
  50#define INTEL_OUTPUT_SDVO 3
  51#define INTEL_OUTPUT_LVDS 4
  52#define INTEL_OUTPUT_TVOUT 5
  53#define INTEL_OUTPUT_HDMI 6
  54#define INTEL_OUTPUT_MIPI 7
  55#define INTEL_OUTPUT_MIPI2 8
  56#define INTEL_OUTPUT_DISPLAYPORT 9
  57#define INTEL_OUTPUT_EDP 10
  58
  59#define INTEL_MODE_PIXEL_MULTIPLIER_SHIFT (0x0)
  60#define INTEL_MODE_PIXEL_MULTIPLIER_MASK (0xf << INTEL_MODE_PIXEL_MULTIPLIER_SHIFT)
  61
  62static inline void
  63psb_intel_mode_set_pixel_multiplier(struct drm_display_mode *mode,
  64                                int multiplier)
  65{
  66        mode->clock *= multiplier;
  67        mode->private_flags |= multiplier;
  68}
  69
  70static inline int
  71psb_intel_mode_get_pixel_multiplier(const struct drm_display_mode *mode)
  72{
  73        return (mode->private_flags & INTEL_MODE_PIXEL_MULTIPLIER_MASK)
  74               >> INTEL_MODE_PIXEL_MULTIPLIER_SHIFT;
  75}
  76
  77
  78/*
  79 * Hold information useally put on the device driver privates here,
  80 * since it needs to be shared across multiple of devices drivers privates.
  81 */
  82struct psb_intel_mode_device {
  83
  84        /*
  85         * Abstracted memory manager operations
  86         */
  87         size_t(*bo_offset) (struct drm_device *dev, void *bo);
  88
  89        /*
  90         * LVDS info
  91         */
  92        int backlight_duty_cycle;       /* restore backlight to this value */
  93        bool panel_wants_dither;
  94        struct drm_display_mode *panel_fixed_mode;
  95        struct drm_display_mode *panel_fixed_mode2;
  96        struct drm_display_mode *vbt_mode;      /* if any */
  97
  98        uint32_t saveBLC_PWM_CTL;
  99};
 100
 101struct psb_intel_i2c_chan {
 102        /* for getting at dev. private (mmio etc.) */
 103        struct drm_device *drm_dev;
 104        u32 reg;                /* GPIO reg */
 105        struct i2c_adapter adapter;
 106        struct i2c_algo_bit_data algo;
 107        u8 slave_addr;
 108};
 109
 110struct gma_encoder {
 111        struct drm_encoder base;
 112        int type;
 113        bool needs_tv_clock;
 114        void (*hot_plug)(struct gma_encoder *);
 115        int crtc_mask;
 116        int clone_mask;
 117        u32 ddi_select; /* Channel info */
 118#define DDI0_SELECT     0x01
 119#define DDI1_SELECT     0x02
 120#define DP_MASK         0x8000
 121#define DDI_MASK        0x03
 122        void *dev_priv; /* For sdvo_priv, lvds_priv, etc... */
 123
 124        /* FIXME: Either make SDVO and LVDS store it's i2c here or give CDV it's
 125           own set of output privates */
 126        struct psb_intel_i2c_chan *i2c_bus;
 127        struct psb_intel_i2c_chan *ddc_bus;
 128};
 129
 130struct gma_connector {
 131        struct drm_connector base;
 132        struct gma_encoder *encoder;
 133
 134        void (*save)(struct drm_connector *connector);
 135        void (*restore)(struct drm_connector *connector);
 136};
 137
 138struct psb_intel_crtc_state {
 139        uint32_t saveDSPCNTR;
 140        uint32_t savePIPECONF;
 141        uint32_t savePIPESRC;
 142        uint32_t saveDPLL;
 143        uint32_t saveFP0;
 144        uint32_t saveFP1;
 145        uint32_t saveHTOTAL;
 146        uint32_t saveHBLANK;
 147        uint32_t saveHSYNC;
 148        uint32_t saveVTOTAL;
 149        uint32_t saveVBLANK;
 150        uint32_t saveVSYNC;
 151        uint32_t saveDSPSTRIDE;
 152        uint32_t saveDSPSIZE;
 153        uint32_t saveDSPPOS;
 154        uint32_t saveDSPBASE;
 155        uint32_t savePalette[256];
 156};
 157
 158struct gma_crtc {
 159        struct drm_crtc base;
 160        int pipe;
 161        int plane;
 162        uint32_t cursor_addr;
 163        struct gtt_range *cursor_gt;
 164        u8 lut_adj[256];
 165        struct psb_intel_framebuffer *fbdev_fb;
 166        /* a mode_set for fbdev users on this crtc */
 167        struct drm_mode_set mode_set;
 168
 169        /* GEM object that holds our cursor */
 170        struct drm_gem_object *cursor_obj;
 171
 172        struct drm_display_mode saved_mode;
 173        struct drm_display_mode saved_adjusted_mode;
 174
 175        struct psb_intel_mode_device *mode_dev;
 176
 177        /*crtc mode setting flags*/
 178        u32 mode_flags;
 179
 180        bool active;
 181
 182        /* Saved Crtc HW states */
 183        struct psb_intel_crtc_state *crtc_state;
 184
 185        const struct gma_clock_funcs *clock_funcs;
 186
 187        struct drm_pending_vblank_event *page_flip_event;
 188};
 189
 190#define to_gma_crtc(x)  \
 191                container_of(x, struct gma_crtc, base)
 192#define to_gma_connector(x) \
 193                container_of(x, struct gma_connector, base)
 194#define to_gma_encoder(x)       \
 195                container_of(x, struct gma_encoder, base)
 196#define to_psb_intel_framebuffer(x)     \
 197                container_of(x, struct psb_intel_framebuffer, base)
 198
 199struct psb_intel_i2c_chan *psb_intel_i2c_create(struct drm_device *dev,
 200                                        const u32 reg, const char *name);
 201void psb_intel_i2c_destroy(struct psb_intel_i2c_chan *chan);
 202int psb_intel_ddc_get_modes(struct drm_connector *connector,
 203                            struct i2c_adapter *adapter);
 204extern bool psb_intel_ddc_probe(struct i2c_adapter *adapter);
 205
 206extern void psb_intel_crtc_init(struct drm_device *dev, int pipe,
 207                            struct psb_intel_mode_device *mode_dev);
 208extern void psb_intel_crt_init(struct drm_device *dev);
 209extern bool psb_intel_sdvo_init(struct drm_device *dev, int output_device);
 210extern void psb_intel_dvo_init(struct drm_device *dev);
 211extern void psb_intel_tv_init(struct drm_device *dev);
 212extern void psb_intel_lvds_init(struct drm_device *dev,
 213                            struct psb_intel_mode_device *mode_dev);
 214extern void psb_intel_lvds_set_brightness(struct drm_device *dev, int level);
 215extern void oaktrail_lvds_init(struct drm_device *dev,
 216                           struct psb_intel_mode_device *mode_dev);
 217extern void oaktrail_wait_for_INTR_PKT_SENT(struct drm_device *dev);
 218extern void oaktrail_dsi_init(struct drm_device *dev,
 219                           struct psb_intel_mode_device *mode_dev);
 220extern void oaktrail_lvds_i2c_init(struct drm_encoder *encoder);
 221extern void mid_dsi_init(struct drm_device *dev,
 222                    struct psb_intel_mode_device *mode_dev, int dsi_num);
 223
 224extern struct drm_encoder *gma_best_encoder(struct drm_connector *connector);
 225extern void gma_connector_attach_encoder(struct gma_connector *connector,
 226                                         struct gma_encoder *encoder);
 227
 228static inline struct gma_encoder *gma_attached_encoder(
 229                                                struct drm_connector *connector)
 230{
 231        return to_gma_connector(connector)->encoder;
 232}
 233
 234extern struct drm_display_mode *psb_intel_crtc_mode_get(struct drm_device *dev,
 235                                                    struct drm_crtc *crtc);
 236extern struct drm_crtc *psb_intel_get_crtc_from_pipe(struct drm_device *dev,
 237                                                 int pipe);
 238extern struct drm_connector *psb_intel_sdvo_find(struct drm_device *dev,
 239                                             int sdvoB);
 240extern int psb_intel_sdvo_supports_hotplug(struct drm_connector *connector);
 241extern void psb_intel_sdvo_set_hotplug(struct drm_connector *connector,
 242                                   int enable);
 243extern int intelfb_probe(struct drm_device *dev);
 244extern int intelfb_remove(struct drm_device *dev,
 245                          struct drm_framebuffer *fb);
 246extern bool psb_intel_lvds_mode_fixup(struct drm_encoder *encoder,
 247                                      const struct drm_display_mode *mode,
 248                                      struct drm_display_mode *adjusted_mode);
 249extern enum drm_mode_status psb_intel_lvds_mode_valid(struct drm_connector *connector,
 250                                     struct drm_display_mode *mode);
 251extern int psb_intel_lvds_set_property(struct drm_connector *connector,
 252                                        struct drm_property *property,
 253                                        uint64_t value);
 254extern void psb_intel_lvds_destroy(struct drm_connector *connector);
 255extern const struct drm_encoder_funcs psb_intel_lvds_enc_funcs;
 256
 257/* intel_gmbus.c */
 258extern void gma_intel_i2c_reset(struct drm_device *dev);
 259extern int gma_intel_setup_gmbus(struct drm_device *dev);
 260extern void gma_intel_gmbus_set_speed(struct i2c_adapter *adapter, int speed);
 261extern void gma_intel_gmbus_force_bit(struct i2c_adapter *adapter, bool force_bit);
 262extern void gma_intel_teardown_gmbus(struct drm_device *dev);
 263
 264/* DP support */
 265extern void cdv_intel_dp_init(struct drm_device *dev, struct psb_intel_mode_device *mode_dev, int output_reg);
 266extern void cdv_intel_dp_set_m_n(struct drm_crtc *crtc,
 267                                        struct drm_display_mode *mode,
 268                                        struct drm_display_mode *adjusted_mode);
 269
 270extern void psb_intel_attach_force_audio_property(struct drm_connector *connector);
 271extern void psb_intel_attach_broadcast_rgb_property(struct drm_connector *connector);
 272
 273extern int cdv_sb_read(struct drm_device *dev, u32 reg, u32 *val);
 274extern int cdv_sb_write(struct drm_device *dev, u32 reg, u32 val);
 275extern void cdv_sb_reset(struct drm_device *dev);
 276
 277extern void cdv_intel_attach_force_audio_property(struct drm_connector *connector);
 278extern void cdv_intel_attach_broadcast_rgb_property(struct drm_connector *connector);
 279
 280#endif                          /* __INTEL_DRV_H__ */
 281