Merge remote branch 'anholt/drm-intel-next' of /home/airlied/kernel/drm-next into drm-core-next
* 'anholt/drm-intel-next' of /home/airlied/kernel/drm-next: (48 commits) agp/intel-gtt: kill previous_size assignments agp/intel-gtt: kill intel_i830_tlbflush agp/intel: split out gmch/gtt probe, part 1 agp/intel: kill mutli_gmch_chip agp/intel: uncoditionally reconfigure driver on resume agp/intel: split out the GTT support agp/intel: introduce intel-agp.h header file drm/i915: Don't touch PORT_HOTPLUG_EN in intel_dp_detect() drm/i915/pch: Use minimal number of FDI lanes (v2) drm/i915: Add the support of memory self-refresh on Ironlake drm/i915: Move Pineview CxSR and watermark code into update_wm hook. drm/i915: Only save/restore FBC on the platform that supports FBC drm/i915: Fix the incorrect argument for SDVO SET_TV_format command drm/i915: Add support of SDVO on Ibexpeak PCH drm/i915: Don't enable pipe/plane/VCO early (wait for DPMS on). drm/i915: do not read uninitialized ->dev_private Revert "drm/i915: Use a dmi quirk to skip a broken SDVO TV output." drm/i915: implement multifunction SDVO device support drm/i915: remove unused intel_pipe_get_connector() drm/i915: remove connector object in old output structure ...
This commit is contained in:
commit
97921a5b03
|
@ -178,86 +178,6 @@ struct agp_bridge_data {
|
|||
#define PGE_EMPTY(b, p) (!(p) || (p) == (unsigned long) (b)->scratch_page)
|
||||
|
||||
|
||||
/* Intel registers */
|
||||
#define INTEL_APSIZE 0xb4
|
||||
#define INTEL_ATTBASE 0xb8
|
||||
#define INTEL_AGPCTRL 0xb0
|
||||
#define INTEL_NBXCFG 0x50
|
||||
#define INTEL_ERRSTS 0x91
|
||||
|
||||
/* Intel i830 registers */
|
||||
#define I830_GMCH_CTRL 0x52
|
||||
#define I830_GMCH_ENABLED 0x4
|
||||
#define I830_GMCH_MEM_MASK 0x1
|
||||
#define I830_GMCH_MEM_64M 0x1
|
||||
#define I830_GMCH_MEM_128M 0
|
||||
#define I830_GMCH_GMS_MASK 0x70
|
||||
#define I830_GMCH_GMS_DISABLED 0x00
|
||||
#define I830_GMCH_GMS_LOCAL 0x10
|
||||
#define I830_GMCH_GMS_STOLEN_512 0x20
|
||||
#define I830_GMCH_GMS_STOLEN_1024 0x30
|
||||
#define I830_GMCH_GMS_STOLEN_8192 0x40
|
||||
#define I830_RDRAM_CHANNEL_TYPE 0x03010
|
||||
#define I830_RDRAM_ND(x) (((x) & 0x20) >> 5)
|
||||
#define I830_RDRAM_DDT(x) (((x) & 0x18) >> 3)
|
||||
|
||||
/* This one is for I830MP w. an external graphic card */
|
||||
#define INTEL_I830_ERRSTS 0x92
|
||||
|
||||
/* Intel 855GM/852GM registers */
|
||||
#define I855_GMCH_GMS_MASK 0xF0
|
||||
#define I855_GMCH_GMS_STOLEN_0M 0x0
|
||||
#define I855_GMCH_GMS_STOLEN_1M (0x1 << 4)
|
||||
#define I855_GMCH_GMS_STOLEN_4M (0x2 << 4)
|
||||
#define I855_GMCH_GMS_STOLEN_8M (0x3 << 4)
|
||||
#define I855_GMCH_GMS_STOLEN_16M (0x4 << 4)
|
||||
#define I855_GMCH_GMS_STOLEN_32M (0x5 << 4)
|
||||
#define I85X_CAPID 0x44
|
||||
#define I85X_VARIANT_MASK 0x7
|
||||
#define I85X_VARIANT_SHIFT 5
|
||||
#define I855_GME 0x0
|
||||
#define I855_GM 0x4
|
||||
#define I852_GME 0x2
|
||||
#define I852_GM 0x5
|
||||
|
||||
/* Intel i845 registers */
|
||||
#define INTEL_I845_AGPM 0x51
|
||||
#define INTEL_I845_ERRSTS 0xc8
|
||||
|
||||
/* Intel i860 registers */
|
||||
#define INTEL_I860_MCHCFG 0x50
|
||||
#define INTEL_I860_ERRSTS 0xc8
|
||||
|
||||
/* Intel i810 registers */
|
||||
#define I810_GMADDR 0x10
|
||||
#define I810_MMADDR 0x14
|
||||
#define I810_PTE_BASE 0x10000
|
||||
#define I810_PTE_MAIN_UNCACHED 0x00000000
|
||||
#define I810_PTE_LOCAL 0x00000002
|
||||
#define I810_PTE_VALID 0x00000001
|
||||
#define I830_PTE_SYSTEM_CACHED 0x00000006
|
||||
#define I810_SMRAM_MISCC 0x70
|
||||
#define I810_GFX_MEM_WIN_SIZE 0x00010000
|
||||
#define I810_GFX_MEM_WIN_32M 0x00010000
|
||||
#define I810_GMS 0x000000c0
|
||||
#define I810_GMS_DISABLE 0x00000000
|
||||
#define I810_PGETBL_CTL 0x2020
|
||||
#define I810_PGETBL_ENABLED 0x00000001
|
||||
#define I965_PGETBL_SIZE_MASK 0x0000000e
|
||||
#define I965_PGETBL_SIZE_512KB (0 << 1)
|
||||
#define I965_PGETBL_SIZE_256KB (1 << 1)
|
||||
#define I965_PGETBL_SIZE_128KB (2 << 1)
|
||||
#define I965_PGETBL_SIZE_1MB (3 << 1)
|
||||
#define I965_PGETBL_SIZE_2MB (4 << 1)
|
||||
#define I965_PGETBL_SIZE_1_5MB (5 << 1)
|
||||
#define G33_PGETBL_SIZE_MASK (3 << 8)
|
||||
#define G33_PGETBL_SIZE_1M (1 << 8)
|
||||
#define G33_PGETBL_SIZE_2M (2 << 8)
|
||||
|
||||
#define I810_DRAM_CTL 0x3000
|
||||
#define I810_DRAM_ROW_0 0x00000001
|
||||
#define I810_DRAM_ROW_0_SDRAM 0x00000001
|
||||
|
||||
struct agp_device_ids {
|
||||
unsigned short device_id; /* first, to make table easier to read */
|
||||
enum chipset_type chipset;
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include <linux/page-flags.h>
|
||||
#include <linux/mm.h>
|
||||
#include "agp.h"
|
||||
#include "intel-agp.h"
|
||||
|
||||
/*
|
||||
* The real differences to the generic AGP code is
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,239 @@
|
|||
/*
|
||||
* Common Intel AGPGART and GTT definitions.
|
||||
*/
|
||||
|
||||
/* Intel registers */
|
||||
#define INTEL_APSIZE 0xb4
|
||||
#define INTEL_ATTBASE 0xb8
|
||||
#define INTEL_AGPCTRL 0xb0
|
||||
#define INTEL_NBXCFG 0x50
|
||||
#define INTEL_ERRSTS 0x91
|
||||
|
||||
/* Intel i830 registers */
|
||||
#define I830_GMCH_CTRL 0x52
|
||||
#define I830_GMCH_ENABLED 0x4
|
||||
#define I830_GMCH_MEM_MASK 0x1
|
||||
#define I830_GMCH_MEM_64M 0x1
|
||||
#define I830_GMCH_MEM_128M 0
|
||||
#define I830_GMCH_GMS_MASK 0x70
|
||||
#define I830_GMCH_GMS_DISABLED 0x00
|
||||
#define I830_GMCH_GMS_LOCAL 0x10
|
||||
#define I830_GMCH_GMS_STOLEN_512 0x20
|
||||
#define I830_GMCH_GMS_STOLEN_1024 0x30
|
||||
#define I830_GMCH_GMS_STOLEN_8192 0x40
|
||||
#define I830_RDRAM_CHANNEL_TYPE 0x03010
|
||||
#define I830_RDRAM_ND(x) (((x) & 0x20) >> 5)
|
||||
#define I830_RDRAM_DDT(x) (((x) & 0x18) >> 3)
|
||||
|
||||
/* This one is for I830MP w. an external graphic card */
|
||||
#define INTEL_I830_ERRSTS 0x92
|
||||
|
||||
/* Intel 855GM/852GM registers */
|
||||
#define I855_GMCH_GMS_MASK 0xF0
|
||||
#define I855_GMCH_GMS_STOLEN_0M 0x0
|
||||
#define I855_GMCH_GMS_STOLEN_1M (0x1 << 4)
|
||||
#define I855_GMCH_GMS_STOLEN_4M (0x2 << 4)
|
||||
#define I855_GMCH_GMS_STOLEN_8M (0x3 << 4)
|
||||
#define I855_GMCH_GMS_STOLEN_16M (0x4 << 4)
|
||||
#define I855_GMCH_GMS_STOLEN_32M (0x5 << 4)
|
||||
#define I85X_CAPID 0x44
|
||||
#define I85X_VARIANT_MASK 0x7
|
||||
#define I85X_VARIANT_SHIFT 5
|
||||
#define I855_GME 0x0
|
||||
#define I855_GM 0x4
|
||||
#define I852_GME 0x2
|
||||
#define I852_GM 0x5
|
||||
|
||||
/* Intel i845 registers */
|
||||
#define INTEL_I845_AGPM 0x51
|
||||
#define INTEL_I845_ERRSTS 0xc8
|
||||
|
||||
/* Intel i860 registers */
|
||||
#define INTEL_I860_MCHCFG 0x50
|
||||
#define INTEL_I860_ERRSTS 0xc8
|
||||
|
||||
/* Intel i810 registers */
|
||||
#define I810_GMADDR 0x10
|
||||
#define I810_MMADDR 0x14
|
||||
#define I810_PTE_BASE 0x10000
|
||||
#define I810_PTE_MAIN_UNCACHED 0x00000000
|
||||
#define I810_PTE_LOCAL 0x00000002
|
||||
#define I810_PTE_VALID 0x00000001
|
||||
#define I830_PTE_SYSTEM_CACHED 0x00000006
|
||||
#define I810_SMRAM_MISCC 0x70
|
||||
#define I810_GFX_MEM_WIN_SIZE 0x00010000
|
||||
#define I810_GFX_MEM_WIN_32M 0x00010000
|
||||
#define I810_GMS 0x000000c0
|
||||
#define I810_GMS_DISABLE 0x00000000
|
||||
#define I810_PGETBL_CTL 0x2020
|
||||
#define I810_PGETBL_ENABLED 0x00000001
|
||||
#define I965_PGETBL_SIZE_MASK 0x0000000e
|
||||
#define I965_PGETBL_SIZE_512KB (0 << 1)
|
||||
#define I965_PGETBL_SIZE_256KB (1 << 1)
|
||||
#define I965_PGETBL_SIZE_128KB (2 << 1)
|
||||
#define I965_PGETBL_SIZE_1MB (3 << 1)
|
||||
#define I965_PGETBL_SIZE_2MB (4 << 1)
|
||||
#define I965_PGETBL_SIZE_1_5MB (5 << 1)
|
||||
#define G33_PGETBL_SIZE_MASK (3 << 8)
|
||||
#define G33_PGETBL_SIZE_1M (1 << 8)
|
||||
#define G33_PGETBL_SIZE_2M (2 << 8)
|
||||
|
||||
#define I810_DRAM_CTL 0x3000
|
||||
#define I810_DRAM_ROW_0 0x00000001
|
||||
#define I810_DRAM_ROW_0_SDRAM 0x00000001
|
||||
|
||||
/* Intel 815 register */
|
||||
#define INTEL_815_APCONT 0x51
|
||||
#define INTEL_815_ATTBASE_MASK ~0x1FFFFFFF
|
||||
|
||||
/* Intel i820 registers */
|
||||
#define INTEL_I820_RDCR 0x51
|
||||
#define INTEL_I820_ERRSTS 0xc8
|
||||
|
||||
/* Intel i840 registers */
|
||||
#define INTEL_I840_MCHCFG 0x50
|
||||
#define INTEL_I840_ERRSTS 0xc8
|
||||
|
||||
/* Intel i850 registers */
|
||||
#define INTEL_I850_MCHCFG 0x50
|
||||
#define INTEL_I850_ERRSTS 0xc8
|
||||
|
||||
/* intel 915G registers */
|
||||
#define I915_GMADDR 0x18
|
||||
#define I915_MMADDR 0x10
|
||||
#define I915_PTEADDR 0x1C
|
||||
#define I915_GMCH_GMS_STOLEN_48M (0x6 << 4)
|
||||
#define I915_GMCH_GMS_STOLEN_64M (0x7 << 4)
|
||||
#define G33_GMCH_GMS_STOLEN_128M (0x8 << 4)
|
||||
#define G33_GMCH_GMS_STOLEN_256M (0x9 << 4)
|
||||
#define INTEL_GMCH_GMS_STOLEN_96M (0xa << 4)
|
||||
#define INTEL_GMCH_GMS_STOLEN_160M (0xb << 4)
|
||||
#define INTEL_GMCH_GMS_STOLEN_224M (0xc << 4)
|
||||
#define INTEL_GMCH_GMS_STOLEN_352M (0xd << 4)
|
||||
|
||||
#define I915_IFPADDR 0x60
|
||||
|
||||
/* Intel 965G registers */
|
||||
#define I965_MSAC 0x62
|
||||
#define I965_IFPADDR 0x70
|
||||
|
||||
/* Intel 7505 registers */
|
||||
#define INTEL_I7505_APSIZE 0x74
|
||||
#define INTEL_I7505_NCAPID 0x60
|
||||
#define INTEL_I7505_NISTAT 0x6c
|
||||
#define INTEL_I7505_ATTBASE 0x78
|
||||
#define INTEL_I7505_ERRSTS 0x42
|
||||
#define INTEL_I7505_AGPCTRL 0x70
|
||||
#define INTEL_I7505_MCHCFG 0x50
|
||||
|
||||
#define SNB_GMCH_CTRL 0x50
|
||||
#define SNB_GMCH_GMS_STOLEN_MASK 0xF8
|
||||
#define SNB_GMCH_GMS_STOLEN_32M (1 << 3)
|
||||
#define SNB_GMCH_GMS_STOLEN_64M (2 << 3)
|
||||
#define SNB_GMCH_GMS_STOLEN_96M (3 << 3)
|
||||
#define SNB_GMCH_GMS_STOLEN_128M (4 << 3)
|
||||
#define SNB_GMCH_GMS_STOLEN_160M (5 << 3)
|
||||
#define SNB_GMCH_GMS_STOLEN_192M (6 << 3)
|
||||
#define SNB_GMCH_GMS_STOLEN_224M (7 << 3)
|
||||
#define SNB_GMCH_GMS_STOLEN_256M (8 << 3)
|
||||
#define SNB_GMCH_GMS_STOLEN_288M (9 << 3)
|
||||
#define SNB_GMCH_GMS_STOLEN_320M (0xa << 3)
|
||||
#define SNB_GMCH_GMS_STOLEN_352M (0xb << 3)
|
||||
#define SNB_GMCH_GMS_STOLEN_384M (0xc << 3)
|
||||
#define SNB_GMCH_GMS_STOLEN_416M (0xd << 3)
|
||||
#define SNB_GMCH_GMS_STOLEN_448M (0xe << 3)
|
||||
#define SNB_GMCH_GMS_STOLEN_480M (0xf << 3)
|
||||
#define SNB_GMCH_GMS_STOLEN_512M (0x10 << 3)
|
||||
#define SNB_GTT_SIZE_0M (0 << 8)
|
||||
#define SNB_GTT_SIZE_1M (1 << 8)
|
||||
#define SNB_GTT_SIZE_2M (2 << 8)
|
||||
#define SNB_GTT_SIZE_MASK (3 << 8)
|
||||
|
||||
/* pci devices ids */
|
||||
#define PCI_DEVICE_ID_INTEL_E7221_HB 0x2588
|
||||
#define PCI_DEVICE_ID_INTEL_E7221_IG 0x258a
|
||||
#define PCI_DEVICE_ID_INTEL_82946GZ_HB 0x2970
|
||||
#define PCI_DEVICE_ID_INTEL_82946GZ_IG 0x2972
|
||||
#define PCI_DEVICE_ID_INTEL_82G35_HB 0x2980
|
||||
#define PCI_DEVICE_ID_INTEL_82G35_IG 0x2982
|
||||
#define PCI_DEVICE_ID_INTEL_82965Q_HB 0x2990
|
||||
#define PCI_DEVICE_ID_INTEL_82965Q_IG 0x2992
|
||||
#define PCI_DEVICE_ID_INTEL_82965G_HB 0x29A0
|
||||
#define PCI_DEVICE_ID_INTEL_82965G_IG 0x29A2
|
||||
#define PCI_DEVICE_ID_INTEL_82965GM_HB 0x2A00
|
||||
#define PCI_DEVICE_ID_INTEL_82965GM_IG 0x2A02
|
||||
#define PCI_DEVICE_ID_INTEL_82965GME_HB 0x2A10
|
||||
#define PCI_DEVICE_ID_INTEL_82965GME_IG 0x2A12
|
||||
#define PCI_DEVICE_ID_INTEL_82945GME_HB 0x27AC
|
||||
#define PCI_DEVICE_ID_INTEL_82945GME_IG 0x27AE
|
||||
#define PCI_DEVICE_ID_INTEL_PINEVIEW_M_HB 0xA010
|
||||
#define PCI_DEVICE_ID_INTEL_PINEVIEW_M_IG 0xA011
|
||||
#define PCI_DEVICE_ID_INTEL_PINEVIEW_HB 0xA000
|
||||
#define PCI_DEVICE_ID_INTEL_PINEVIEW_IG 0xA001
|
||||
#define PCI_DEVICE_ID_INTEL_G33_HB 0x29C0
|
||||
#define PCI_DEVICE_ID_INTEL_G33_IG 0x29C2
|
||||
#define PCI_DEVICE_ID_INTEL_Q35_HB 0x29B0
|
||||
#define PCI_DEVICE_ID_INTEL_Q35_IG 0x29B2
|
||||
#define PCI_DEVICE_ID_INTEL_Q33_HB 0x29D0
|
||||
#define PCI_DEVICE_ID_INTEL_Q33_IG 0x29D2
|
||||
#define PCI_DEVICE_ID_INTEL_B43_HB 0x2E40
|
||||
#define PCI_DEVICE_ID_INTEL_B43_IG 0x2E42
|
||||
#define PCI_DEVICE_ID_INTEL_GM45_HB 0x2A40
|
||||
#define PCI_DEVICE_ID_INTEL_GM45_IG 0x2A42
|
||||
#define PCI_DEVICE_ID_INTEL_EAGLELAKE_HB 0x2E00
|
||||
#define PCI_DEVICE_ID_INTEL_EAGLELAKE_IG 0x2E02
|
||||
#define PCI_DEVICE_ID_INTEL_Q45_HB 0x2E10
|
||||
#define PCI_DEVICE_ID_INTEL_Q45_IG 0x2E12
|
||||
#define PCI_DEVICE_ID_INTEL_G45_HB 0x2E20
|
||||
#define PCI_DEVICE_ID_INTEL_G45_IG 0x2E22
|
||||
#define PCI_DEVICE_ID_INTEL_G41_HB 0x2E30
|
||||
#define PCI_DEVICE_ID_INTEL_G41_IG 0x2E32
|
||||
#define PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB 0x0040
|
||||
#define PCI_DEVICE_ID_INTEL_IRONLAKE_D_IG 0x0042
|
||||
#define PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB 0x0044
|
||||
#define PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB 0x0062
|
||||
#define PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB 0x006a
|
||||
#define PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG 0x0046
|
||||
#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB 0x0100
|
||||
#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_IG 0x0102
|
||||
#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB 0x0104
|
||||
#define PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_IG 0x0106
|
||||
|
||||
/* cover 915 and 945 variants */
|
||||
#define IS_I915 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_E7221_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915G_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GME_HB)
|
||||
|
||||
#define IS_I965 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82946GZ_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82G35_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965Q_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965GM_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965GME_HB)
|
||||
|
||||
#define IS_G33 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G33_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q35_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q33_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_PINEVIEW_M_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_PINEVIEW_HB)
|
||||
|
||||
#define IS_PINEVIEW (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_PINEVIEW_M_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_PINEVIEW_HB)
|
||||
|
||||
#define IS_SNB (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB)
|
||||
|
||||
#define IS_G4X (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_EAGLELAKE_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q45_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G45_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_GM45_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G41_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_B43_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB || \
|
||||
IS_SNB)
|
File diff suppressed because it is too large
Load Diff
|
@ -69,16 +69,6 @@ struct intel_dvo_dev_ops {
|
|||
*/
|
||||
void (*dpms)(struct intel_dvo_device *dvo, int mode);
|
||||
|
||||
/*
|
||||
* Saves the output's state for restoration on VT switch.
|
||||
*/
|
||||
void (*save)(struct intel_dvo_device *dvo);
|
||||
|
||||
/*
|
||||
* Restore's the output's state at VT switch.
|
||||
*/
|
||||
void (*restore)(struct intel_dvo_device *dvo);
|
||||
|
||||
/*
|
||||
* Callback for testing a video mode for a given output.
|
||||
*
|
||||
|
|
|
@ -159,16 +159,7 @@
|
|||
#define CH7017_BANG_LIMIT_CONTROL 0x7f
|
||||
|
||||
struct ch7017_priv {
|
||||
uint8_t save_hapi;
|
||||
uint8_t save_vali;
|
||||
uint8_t save_valo;
|
||||
uint8_t save_ailo;
|
||||
uint8_t save_lvds_pll_vco;
|
||||
uint8_t save_feedback_div;
|
||||
uint8_t save_lvds_control_2;
|
||||
uint8_t save_outputs_enable;
|
||||
uint8_t save_lvds_power_down;
|
||||
uint8_t save_power_management;
|
||||
uint8_t dummy;
|
||||
};
|
||||
|
||||
static void ch7017_dump_regs(struct intel_dvo_device *dvo);
|
||||
|
@ -401,39 +392,6 @@ do { \
|
|||
DUMP(CH7017_LVDS_POWER_DOWN);
|
||||
}
|
||||
|
||||
static void ch7017_save(struct intel_dvo_device *dvo)
|
||||
{
|
||||
struct ch7017_priv *priv = dvo->dev_priv;
|
||||
|
||||
ch7017_read(dvo, CH7017_HORIZONTAL_ACTIVE_PIXEL_INPUT, &priv->save_hapi);
|
||||
ch7017_read(dvo, CH7017_VERTICAL_ACTIVE_LINE_OUTPUT, &priv->save_valo);
|
||||
ch7017_read(dvo, CH7017_ACTIVE_INPUT_LINE_OUTPUT, &priv->save_ailo);
|
||||
ch7017_read(dvo, CH7017_LVDS_PLL_VCO_CONTROL, &priv->save_lvds_pll_vco);
|
||||
ch7017_read(dvo, CH7017_LVDS_PLL_FEEDBACK_DIV, &priv->save_feedback_div);
|
||||
ch7017_read(dvo, CH7017_LVDS_CONTROL_2, &priv->save_lvds_control_2);
|
||||
ch7017_read(dvo, CH7017_OUTPUTS_ENABLE, &priv->save_outputs_enable);
|
||||
ch7017_read(dvo, CH7017_LVDS_POWER_DOWN, &priv->save_lvds_power_down);
|
||||
ch7017_read(dvo, CH7017_POWER_MANAGEMENT, &priv->save_power_management);
|
||||
}
|
||||
|
||||
static void ch7017_restore(struct intel_dvo_device *dvo)
|
||||
{
|
||||
struct ch7017_priv *priv = dvo->dev_priv;
|
||||
|
||||
/* Power down before changing mode */
|
||||
ch7017_dpms(dvo, DRM_MODE_DPMS_OFF);
|
||||
|
||||
ch7017_write(dvo, CH7017_HORIZONTAL_ACTIVE_PIXEL_INPUT, priv->save_hapi);
|
||||
ch7017_write(dvo, CH7017_VERTICAL_ACTIVE_LINE_OUTPUT, priv->save_valo);
|
||||
ch7017_write(dvo, CH7017_ACTIVE_INPUT_LINE_OUTPUT, priv->save_ailo);
|
||||
ch7017_write(dvo, CH7017_LVDS_PLL_VCO_CONTROL, priv->save_lvds_pll_vco);
|
||||
ch7017_write(dvo, CH7017_LVDS_PLL_FEEDBACK_DIV, priv->save_feedback_div);
|
||||
ch7017_write(dvo, CH7017_LVDS_CONTROL_2, priv->save_lvds_control_2);
|
||||
ch7017_write(dvo, CH7017_OUTPUTS_ENABLE, priv->save_outputs_enable);
|
||||
ch7017_write(dvo, CH7017_LVDS_POWER_DOWN, priv->save_lvds_power_down);
|
||||
ch7017_write(dvo, CH7017_POWER_MANAGEMENT, priv->save_power_management);
|
||||
}
|
||||
|
||||
static void ch7017_destroy(struct intel_dvo_device *dvo)
|
||||
{
|
||||
struct ch7017_priv *priv = dvo->dev_priv;
|
||||
|
@ -451,7 +409,5 @@ struct intel_dvo_dev_ops ch7017_ops = {
|
|||
.mode_set = ch7017_mode_set,
|
||||
.dpms = ch7017_dpms,
|
||||
.dump_regs = ch7017_dump_regs,
|
||||
.save = ch7017_save,
|
||||
.restore = ch7017_restore,
|
||||
.destroy = ch7017_destroy,
|
||||
};
|
||||
|
|
|
@ -92,21 +92,10 @@ static struct ch7xxx_id_struct {
|
|||
{ CH7301_VID, "CH7301" },
|
||||
};
|
||||
|
||||
struct ch7xxx_reg_state {
|
||||
uint8_t regs[CH7xxx_NUM_REGS];
|
||||
};
|
||||
|
||||
struct ch7xxx_priv {
|
||||
bool quiet;
|
||||
|
||||
struct ch7xxx_reg_state save_reg;
|
||||
struct ch7xxx_reg_state mode_reg;
|
||||
uint8_t save_TCTL, save_TPCP, save_TPD, save_TPVT;
|
||||
uint8_t save_TLPF, save_TCT, save_PM, save_IDF;
|
||||
};
|
||||
|
||||
static void ch7xxx_save(struct intel_dvo_device *dvo);
|
||||
|
||||
static char *ch7xxx_get_id(uint8_t vid)
|
||||
{
|
||||
int i;
|
||||
|
@ -312,42 +301,17 @@ static void ch7xxx_dpms(struct intel_dvo_device *dvo, int mode)
|
|||
|
||||
static void ch7xxx_dump_regs(struct intel_dvo_device *dvo)
|
||||
{
|
||||
struct ch7xxx_priv *ch7xxx = dvo->dev_priv;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < CH7xxx_NUM_REGS; i++) {
|
||||
uint8_t val;
|
||||
if ((i % 8) == 0 )
|
||||
DRM_LOG_KMS("\n %02X: ", i);
|
||||
DRM_LOG_KMS("%02X ", ch7xxx->mode_reg.regs[i]);
|
||||
ch7xxx_readb(dvo, i, &val);
|
||||
DRM_LOG_KMS("%02X ", val);
|
||||
}
|
||||
}
|
||||
|
||||
static void ch7xxx_save(struct intel_dvo_device *dvo)
|
||||
{
|
||||
struct ch7xxx_priv *ch7xxx= dvo->dev_priv;
|
||||
|
||||
ch7xxx_readb(dvo, CH7xxx_TCTL, &ch7xxx->save_TCTL);
|
||||
ch7xxx_readb(dvo, CH7xxx_TPCP, &ch7xxx->save_TPCP);
|
||||
ch7xxx_readb(dvo, CH7xxx_TPD, &ch7xxx->save_TPD);
|
||||
ch7xxx_readb(dvo, CH7xxx_TPVT, &ch7xxx->save_TPVT);
|
||||
ch7xxx_readb(dvo, CH7xxx_TLPF, &ch7xxx->save_TLPF);
|
||||
ch7xxx_readb(dvo, CH7xxx_PM, &ch7xxx->save_PM);
|
||||
ch7xxx_readb(dvo, CH7xxx_IDF, &ch7xxx->save_IDF);
|
||||
}
|
||||
|
||||
static void ch7xxx_restore(struct intel_dvo_device *dvo)
|
||||
{
|
||||
struct ch7xxx_priv *ch7xxx = dvo->dev_priv;
|
||||
|
||||
ch7xxx_writeb(dvo, CH7xxx_TCTL, ch7xxx->save_TCTL);
|
||||
ch7xxx_writeb(dvo, CH7xxx_TPCP, ch7xxx->save_TPCP);
|
||||
ch7xxx_writeb(dvo, CH7xxx_TPD, ch7xxx->save_TPD);
|
||||
ch7xxx_writeb(dvo, CH7xxx_TPVT, ch7xxx->save_TPVT);
|
||||
ch7xxx_writeb(dvo, CH7xxx_TLPF, ch7xxx->save_TLPF);
|
||||
ch7xxx_writeb(dvo, CH7xxx_IDF, ch7xxx->save_IDF);
|
||||
ch7xxx_writeb(dvo, CH7xxx_PM, ch7xxx->save_PM);
|
||||
}
|
||||
|
||||
static void ch7xxx_destroy(struct intel_dvo_device *dvo)
|
||||
{
|
||||
struct ch7xxx_priv *ch7xxx = dvo->dev_priv;
|
||||
|
@ -365,7 +329,5 @@ struct intel_dvo_dev_ops ch7xxx_ops = {
|
|||
.mode_set = ch7xxx_mode_set,
|
||||
.dpms = ch7xxx_dpms,
|
||||
.dump_regs = ch7xxx_dump_regs,
|
||||
.save = ch7xxx_save,
|
||||
.restore = ch7xxx_restore,
|
||||
.destroy = ch7xxx_destroy,
|
||||
};
|
||||
|
|
|
@ -153,9 +153,6 @@ struct ivch_priv {
|
|||
bool quiet;
|
||||
|
||||
uint16_t width, height;
|
||||
|
||||
uint16_t save_VR01;
|
||||
uint16_t save_VR40;
|
||||
};
|
||||
|
||||
|
||||
|
@ -405,22 +402,6 @@ static void ivch_dump_regs(struct intel_dvo_device *dvo)
|
|||
DRM_LOG_KMS("VR8F: 0x%04x\n", val);
|
||||
}
|
||||
|
||||
static void ivch_save(struct intel_dvo_device *dvo)
|
||||
{
|
||||
struct ivch_priv *priv = dvo->dev_priv;
|
||||
|
||||
ivch_read(dvo, VR01, &priv->save_VR01);
|
||||
ivch_read(dvo, VR40, &priv->save_VR40);
|
||||
}
|
||||
|
||||
static void ivch_restore(struct intel_dvo_device *dvo)
|
||||
{
|
||||
struct ivch_priv *priv = dvo->dev_priv;
|
||||
|
||||
ivch_write(dvo, VR01, priv->save_VR01);
|
||||
ivch_write(dvo, VR40, priv->save_VR40);
|
||||
}
|
||||
|
||||
static void ivch_destroy(struct intel_dvo_device *dvo)
|
||||
{
|
||||
struct ivch_priv *priv = dvo->dev_priv;
|
||||
|
@ -434,8 +415,6 @@ static void ivch_destroy(struct intel_dvo_device *dvo)
|
|||
struct intel_dvo_dev_ops ivch_ops= {
|
||||
.init = ivch_init,
|
||||
.dpms = ivch_dpms,
|
||||
.save = ivch_save,
|
||||
.restore = ivch_restore,
|
||||
.mode_valid = ivch_mode_valid,
|
||||
.mode_set = ivch_mode_set,
|
||||
.detect = ivch_detect,
|
||||
|
|
|
@ -58,17 +58,9 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
||||
#define SIL164_REGC 0x0c
|
||||
|
||||
struct sil164_save_rec {
|
||||
uint8_t reg8;
|
||||
uint8_t reg9;
|
||||
uint8_t regc;
|
||||
};
|
||||
|
||||
struct sil164_priv {
|
||||
//I2CDevRec d;
|
||||
bool quiet;
|
||||
struct sil164_save_rec save_regs;
|
||||
struct sil164_save_rec mode_regs;
|
||||
};
|
||||
|
||||
#define SILPTR(d) ((SIL164Ptr)(d->DriverPrivate.ptr))
|
||||
|
@ -252,34 +244,6 @@ static void sil164_dump_regs(struct intel_dvo_device *dvo)
|
|||
DRM_LOG_KMS("SIL164_REGC: 0x%02x\n", val);
|
||||
}
|
||||
|
||||
static void sil164_save(struct intel_dvo_device *dvo)
|
||||
{
|
||||
struct sil164_priv *sil= dvo->dev_priv;
|
||||
|
||||
if (!sil164_readb(dvo, SIL164_REG8, &sil->save_regs.reg8))
|
||||
return;
|
||||
|
||||
if (!sil164_readb(dvo, SIL164_REG9, &sil->save_regs.reg9))
|
||||
return;
|
||||
|
||||
if (!sil164_readb(dvo, SIL164_REGC, &sil->save_regs.regc))
|
||||
return;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static void sil164_restore(struct intel_dvo_device *dvo)
|
||||
{
|
||||
struct sil164_priv *sil = dvo->dev_priv;
|
||||
|
||||
/* Restore it powered down initially */
|
||||
sil164_writeb(dvo, SIL164_REG8, sil->save_regs.reg8 & ~0x1);
|
||||
|
||||
sil164_writeb(dvo, SIL164_REG9, sil->save_regs.reg9);
|
||||
sil164_writeb(dvo, SIL164_REGC, sil->save_regs.regc);
|
||||
sil164_writeb(dvo, SIL164_REG8, sil->save_regs.reg8);
|
||||
}
|
||||
|
||||
static void sil164_destroy(struct intel_dvo_device *dvo)
|
||||
{
|
||||
struct sil164_priv *sil = dvo->dev_priv;
|
||||
|
@ -297,7 +261,5 @@ struct intel_dvo_dev_ops sil164_ops = {
|
|||
.mode_set = sil164_mode_set,
|
||||
.dpms = sil164_dpms,
|
||||
.dump_regs = sil164_dump_regs,
|
||||
.save = sil164_save,
|
||||
.restore = sil164_restore,
|
||||
.destroy = sil164_destroy,
|
||||
};
|
||||
|
|
|
@ -86,16 +86,8 @@
|
|||
#define TFP410_V_RES_LO 0x3C
|
||||
#define TFP410_V_RES_HI 0x3D
|
||||
|
||||
struct tfp410_save_rec {
|
||||
uint8_t ctl1;
|
||||
uint8_t ctl2;
|
||||
};
|
||||
|
||||
struct tfp410_priv {
|
||||
bool quiet;
|
||||
|
||||
struct tfp410_save_rec saved_reg;
|
||||
struct tfp410_save_rec mode_reg;
|
||||
};
|
||||
|
||||
static bool tfp410_readb(struct intel_dvo_device *dvo, int addr, uint8_t *ch)
|
||||
|
@ -293,28 +285,6 @@ static void tfp410_dump_regs(struct intel_dvo_device *dvo)
|
|||
DRM_LOG_KMS("TFP410_V_RES: 0x%02X%02X\n", val2, val);
|
||||
}
|
||||
|
||||
static void tfp410_save(struct intel_dvo_device *dvo)
|
||||
{
|
||||
struct tfp410_priv *tfp = dvo->dev_priv;
|
||||
|
||||
if (!tfp410_readb(dvo, TFP410_CTL_1, &tfp->saved_reg.ctl1))
|
||||
return;
|
||||
|
||||
if (!tfp410_readb(dvo, TFP410_CTL_2, &tfp->saved_reg.ctl2))
|
||||
return;
|
||||
}
|
||||
|
||||
static void tfp410_restore(struct intel_dvo_device *dvo)
|
||||
{
|
||||
struct tfp410_priv *tfp = dvo->dev_priv;
|
||||
|
||||
/* Restore it powered down initially */
|
||||
tfp410_writeb(dvo, TFP410_CTL_1, tfp->saved_reg.ctl1 & ~0x1);
|
||||
|
||||
tfp410_writeb(dvo, TFP410_CTL_2, tfp->saved_reg.ctl2);
|
||||
tfp410_writeb(dvo, TFP410_CTL_1, tfp->saved_reg.ctl1);
|
||||
}
|
||||
|
||||
static void tfp410_destroy(struct intel_dvo_device *dvo)
|
||||
{
|
||||
struct tfp410_priv *tfp = dvo->dev_priv;
|
||||
|
@ -332,7 +302,5 @@ struct intel_dvo_dev_ops tfp410_ops = {
|
|||
.mode_set = tfp410_mode_set,
|
||||
.dpms = tfp410_dpms,
|
||||
.dump_regs = tfp410_dump_regs,
|
||||
.save = tfp410_save,
|
||||
.restore = tfp410_restore,
|
||||
.destroy = tfp410_destroy,
|
||||
};
|
||||
|
|
|
@ -1579,7 +1579,7 @@ static void i915_get_mem_freq(struct drm_device *dev)
|
|||
*/
|
||||
int i915_driver_load(struct drm_device *dev, unsigned long flags)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct drm_i915_private *dev_priv;
|
||||
resource_size_t base, size;
|
||||
int ret = 0, mmio_bar;
|
||||
uint32_t agp_size, prealloc_size, prealloc_start;
|
||||
|
@ -1711,6 +1711,8 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
|
|||
/* Start out suspended */
|
||||
dev_priv->mm.suspended = 1;
|
||||
|
||||
intel_detect_pch(dev);
|
||||
|
||||
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
|
||||
ret = i915_load_modeset_init(dev, prealloc_start,
|
||||
prealloc_size, agp_size);
|
||||
|
|
|
@ -187,6 +187,35 @@ const static struct pci_device_id pciidlist[] = {
|
|||
MODULE_DEVICE_TABLE(pci, pciidlist);
|
||||
#endif
|
||||
|
||||
#define INTEL_PCH_DEVICE_ID_MASK 0xff00
|
||||
#define INTEL_PCH_CPT_DEVICE_ID_TYPE 0x1c00
|
||||
|
||||
void intel_detect_pch (struct drm_device *dev)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct pci_dev *pch;
|
||||
|
||||
/*
|
||||
* The reason to probe ISA bridge instead of Dev31:Fun0 is to
|
||||
* make graphics device passthrough work easy for VMM, that only
|
||||
* need to expose ISA bridge to let driver know the real hardware
|
||||
* underneath. This is a requirement from virtualization team.
|
||||
*/
|
||||
pch = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, NULL);
|
||||
if (pch) {
|
||||
if (pch->vendor == PCI_VENDOR_ID_INTEL) {
|
||||
int id;
|
||||
id = pch->device & INTEL_PCH_DEVICE_ID_MASK;
|
||||
|
||||
if (id == INTEL_PCH_CPT_DEVICE_ID_TYPE) {
|
||||
dev_priv->pch_type = PCH_CPT;
|
||||
DRM_DEBUG_KMS("Found CougarPoint PCH\n");
|
||||
}
|
||||
}
|
||||
pci_dev_put(pch);
|
||||
}
|
||||
}
|
||||
|
||||
static int i915_drm_freeze(struct drm_device *dev)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
|
|
|
@ -221,6 +221,11 @@ enum no_fbc_reason {
|
|||
FBC_NOT_TILED, /* buffer not tiled */
|
||||
};
|
||||
|
||||
enum intel_pch {
|
||||
PCH_IBX, /* Ibexpeak PCH */
|
||||
PCH_CPT, /* Cougarpoint PCH */
|
||||
};
|
||||
|
||||
typedef struct drm_i915_private {
|
||||
struct drm_device *dev;
|
||||
|
||||
|
@ -331,6 +336,9 @@ typedef struct drm_i915_private {
|
|||
/* Display functions */
|
||||
struct drm_i915_display_funcs display;
|
||||
|
||||
/* PCH chipset type */
|
||||
enum intel_pch pch_type;
|
||||
|
||||
/* Register state */
|
||||
bool modeset_on_lid;
|
||||
u8 saveLBB;
|
||||
|
@ -992,6 +1000,9 @@ extern int intel_modeset_vga_set_state(struct drm_device *dev, bool state);
|
|||
extern void i8xx_disable_fbc(struct drm_device *dev);
|
||||
extern void g4x_disable_fbc(struct drm_device *dev);
|
||||
|
||||
extern void intel_detect_pch (struct drm_device *dev);
|
||||
extern int intel_trans_dp_port_sel (struct drm_crtc *crtc);
|
||||
|
||||
/**
|
||||
* Lock test for when it's just for synchronization of ring access.
|
||||
*
|
||||
|
@ -1123,7 +1134,8 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
|
|||
#define SUPPORTS_INTEGRATED_DP(dev) (IS_G4X(dev) || IS_IRONLAKE(dev))
|
||||
#define SUPPORTS_EDP(dev) (IS_IRONLAKE_M(dev))
|
||||
#define SUPPORTS_TV(dev) (IS_I9XX(dev) && IS_MOBILE(dev) && \
|
||||
!IS_IRONLAKE(dev) && !IS_PINEVIEW(dev))
|
||||
!IS_IRONLAKE(dev) && !IS_PINEVIEW(dev) && \
|
||||
!IS_GEN6(dev))
|
||||
#define I915_HAS_HOTPLUG(dev) (INTEL_INFO(dev)->has_hotplug)
|
||||
/* dsparb controlled by hw only */
|
||||
#define DSPARB_HWCONTROL(dev) (IS_G4X(dev) || IS_IRONLAKE(dev))
|
||||
|
@ -1136,6 +1148,9 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
|
|||
#define HAS_PCH_SPLIT(dev) (IS_IRONLAKE(dev) || \
|
||||
IS_GEN6(dev))
|
||||
|
||||
#define INTEL_PCH_TYPE(dev) (((struct drm_i915_private *)(dev)->dev_private)->pch_type)
|
||||
#define HAS_PCH_CPT(dev) (INTEL_PCH_TYPE(dev) == PCH_CPT)
|
||||
|
||||
#define PRIMARY_RINGBUFFER_SIZE (128*1024)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -169,9 +169,13 @@ void intel_enable_asle (struct drm_device *dev)
|
|||
|
||||
if (HAS_PCH_SPLIT(dev))
|
||||
ironlake_enable_display_irq(dev_priv, DE_GSE);
|
||||
else
|
||||
else {
|
||||
i915_enable_pipestat(dev_priv, 1,
|
||||
I915_LEGACY_BLC_EVENT_ENABLE);
|
||||
if (IS_I965G(dev))
|
||||
i915_enable_pipestat(dev_priv, 0,
|
||||
I915_LEGACY_BLC_EVENT_ENABLE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -256,11 +260,11 @@ static void i915_hotplug_work_func(struct work_struct *work)
|
|||
hotplug_work);
|
||||
struct drm_device *dev = dev_priv->dev;
|
||||
struct drm_mode_config *mode_config = &dev->mode_config;
|
||||
struct drm_connector *connector;
|
||||
struct drm_encoder *encoder;
|
||||
|
||||
if (mode_config->num_connector) {
|
||||
list_for_each_entry(connector, &mode_config->connector_list, head) {
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
if (mode_config->num_encoder) {
|
||||
list_for_each_entry(encoder, &mode_config->encoder_list, head) {
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
|
||||
if (intel_encoder->hot_plug)
|
||||
(*intel_encoder->hot_plug) (intel_encoder);
|
||||
|
@ -946,7 +950,8 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
|
|||
intel_finish_page_flip(dev, 1);
|
||||
}
|
||||
|
||||
if ((pipeb_stats & I915_LEGACY_BLC_EVENT_STATUS) ||
|
||||
if ((pipea_stats & I915_LEGACY_BLC_EVENT_STATUS) ||
|
||||
(pipeb_stats & I915_LEGACY_BLC_EVENT_STATUS) ||
|
||||
(iir & I915_ASLE_INTERRUPT))
|
||||
opregion_asle_intr(dev);
|
||||
|
||||
|
|
|
@ -1754,6 +1754,14 @@
|
|||
#define DP_LINK_TRAIN_MASK (3 << 28)
|
||||
#define DP_LINK_TRAIN_SHIFT 28
|
||||
|
||||
/* CPT Link training mode */
|
||||
#define DP_LINK_TRAIN_PAT_1_CPT (0 << 8)
|
||||
#define DP_LINK_TRAIN_PAT_2_CPT (1 << 8)
|
||||
#define DP_LINK_TRAIN_PAT_IDLE_CPT (2 << 8)
|
||||
#define DP_LINK_TRAIN_OFF_CPT (3 << 8)
|
||||
#define DP_LINK_TRAIN_MASK_CPT (7 << 8)
|
||||
#define DP_LINK_TRAIN_SHIFT_CPT 8
|
||||
|
||||
/* Signal voltages. These are mostly controlled by the other end */
|
||||
#define DP_VOLTAGE_0_4 (0 << 25)
|
||||
#define DP_VOLTAGE_0_6 (1 << 25)
|
||||
|
@ -1978,15 +1986,24 @@
|
|||
|
||||
#define DSPFW1 0x70034
|
||||
#define DSPFW_SR_SHIFT 23
|
||||
#define DSPFW_SR_MASK (0x1ff<<23)
|
||||
#define DSPFW_CURSORB_SHIFT 16
|
||||
#define DSPFW_CURSORB_MASK (0x3f<<16)
|
||||
#define DSPFW_PLANEB_SHIFT 8
|
||||
#define DSPFW_PLANEB_MASK (0x7f<<8)
|
||||
#define DSPFW_PLANEA_MASK (0x7f)
|
||||
#define DSPFW2 0x70038
|
||||
#define DSPFW_CURSORA_MASK 0x00003f00
|
||||
#define DSPFW_CURSORA_SHIFT 8
|
||||
#define DSPFW_PLANEC_MASK (0x7f)
|
||||
#define DSPFW3 0x7003c
|
||||
#define DSPFW_HPLL_SR_EN (1<<31)
|
||||
#define DSPFW_CURSOR_SR_SHIFT 24
|
||||
#define PINEVIEW_SELF_REFRESH_EN (1<<30)
|
||||
#define DSPFW_CURSOR_SR_MASK (0x3f<<24)
|
||||
#define DSPFW_HPLL_CURSOR_SHIFT 16
|
||||
#define DSPFW_HPLL_CURSOR_MASK (0x3f<<16)
|
||||
#define DSPFW_HPLL_SR_MASK (0x1ff)
|
||||
|
||||
/* FIFO watermark sizes etc */
|
||||
#define G4X_FIFO_LINE_SIZE 64
|
||||
|
@ -2013,6 +2030,43 @@
|
|||
#define PINEVIEW_CURSOR_DFT_WM 0
|
||||
#define PINEVIEW_CURSOR_GUARD_WM 5
|
||||
|
||||
|
||||
/* define the Watermark register on Ironlake */
|
||||
#define WM0_PIPEA_ILK 0x45100
|
||||
#define WM0_PIPE_PLANE_MASK (0x7f<<16)
|
||||
#define WM0_PIPE_PLANE_SHIFT 16
|
||||
#define WM0_PIPE_SPRITE_MASK (0x3f<<8)
|
||||
#define WM0_PIPE_SPRITE_SHIFT 8
|
||||
#define WM0_PIPE_CURSOR_MASK (0x1f)
|
||||
|
||||
#define WM0_PIPEB_ILK 0x45104
|
||||
#define WM1_LP_ILK 0x45108
|
||||
#define WM1_LP_SR_EN (1<<31)
|
||||
#define WM1_LP_LATENCY_SHIFT 24
|
||||
#define WM1_LP_LATENCY_MASK (0x7f<<24)
|
||||
#define WM1_LP_SR_MASK (0x1ff<<8)
|
||||
#define WM1_LP_SR_SHIFT 8
|
||||
#define WM1_LP_CURSOR_MASK (0x3f)
|
||||
|
||||
/* Memory latency timer register */
|
||||
#define MLTR_ILK 0x11222
|
||||
/* the unit of memory self-refresh latency time is 0.5us */
|
||||
#define ILK_SRLT_MASK 0x3f
|
||||
|
||||
/* define the fifo size on Ironlake */
|
||||
#define ILK_DISPLAY_FIFO 128
|
||||
#define ILK_DISPLAY_MAXWM 64
|
||||
#define ILK_DISPLAY_DFTWM 8
|
||||
|
||||
#define ILK_DISPLAY_SR_FIFO 512
|
||||
#define ILK_DISPLAY_MAX_SRWM 0x1ff
|
||||
#define ILK_DISPLAY_DFT_SRWM 0x3f
|
||||
#define ILK_CURSOR_SR_FIFO 64
|
||||
#define ILK_CURSOR_MAX_SRWM 0x3f
|
||||
#define ILK_CURSOR_DFT_SRWM 8
|
||||
|
||||
#define ILK_FIFO_LINE_SIZE 64
|
||||
|
||||
/*
|
||||
* The two pipe frame counter registers are not synchronized, so
|
||||
* reading a stable value is somewhat tricky. The following code
|
||||
|
@ -2293,8 +2347,15 @@
|
|||
#define GTIIR 0x44018
|
||||
#define GTIER 0x4401c
|
||||
|
||||
#define ILK_DISPLAY_CHICKEN2 0x42004
|
||||
#define ILK_DPARB_GATE (1<<22)
|
||||
#define ILK_VSDPFD_FULL (1<<21)
|
||||
#define ILK_DSPCLK_GATE 0x42020
|
||||
#define ILK_DPARB_CLK_GATE (1<<5)
|
||||
|
||||
#define DISP_ARB_CTL 0x45000
|
||||
#define DISP_TILE_SURFACE_SWIZZLING (1<<13)
|
||||
#define DISP_FBC_WM_DIS (1<<15)
|
||||
|
||||
/* PCH */
|
||||
|
||||
|
@ -2305,6 +2366,11 @@
|
|||
#define SDE_PORTB_HOTPLUG (1 << 8)
|
||||
#define SDE_SDVOB_HOTPLUG (1 << 6)
|
||||
#define SDE_HOTPLUG_MASK (0xf << 8)
|
||||
/* CPT */
|
||||
#define SDE_CRT_HOTPLUG_CPT (1 << 19)
|
||||
#define SDE_PORTD_HOTPLUG_CPT (1 << 23)
|
||||
#define SDE_PORTC_HOTPLUG_CPT (1 << 22)
|
||||
#define SDE_PORTB_HOTPLUG_CPT (1 << 21)
|
||||
|
||||
#define SDEISR 0xc4000
|
||||
#define SDEIMR 0xc4004
|
||||
|
@ -2396,6 +2462,17 @@
|
|||
#define PCH_SSC4_PARMS 0xc6210
|
||||
#define PCH_SSC4_AUX_PARMS 0xc6214
|
||||
|
||||
#define PCH_DPLL_SEL 0xc7000
|
||||
#define TRANSA_DPLL_ENABLE (1<<3)
|
||||
#define TRANSA_DPLLB_SEL (1<<0)
|
||||
#define TRANSA_DPLLA_SEL 0
|
||||
#define TRANSB_DPLL_ENABLE (1<<7)
|
||||
#define TRANSB_DPLLB_SEL (1<<4)
|
||||
#define TRANSB_DPLLA_SEL (0)
|
||||
#define TRANSC_DPLL_ENABLE (1<<11)
|
||||
#define TRANSC_DPLLB_SEL (1<<8)
|
||||
#define TRANSC_DPLLA_SEL (0)
|
||||
|
||||
/* transcoder */
|
||||
|
||||
#define TRANS_HTOTAL_A 0xe0000
|
||||
|
@ -2482,6 +2559,19 @@
|
|||
#define FDI_LINK_TRAIN_PRE_EMPHASIS_1_5X (1<<22)
|
||||
#define FDI_LINK_TRAIN_PRE_EMPHASIS_2X (2<<22)
|
||||
#define FDI_LINK_TRAIN_PRE_EMPHASIS_3X (3<<22)
|
||||
/* ILK always use 400mV 0dB for voltage swing and pre-emphasis level.
|
||||
SNB has different settings. */
|
||||
/* SNB A-stepping */
|
||||
#define FDI_LINK_TRAIN_400MV_0DB_SNB_A (0x38<<22)
|
||||
#define FDI_LINK_TRAIN_400MV_6DB_SNB_A (0x02<<22)
|
||||
#define FDI_LINK_TRAIN_600MV_3_5DB_SNB_A (0x01<<22)
|
||||
#define FDI_LINK_TRAIN_800MV_0DB_SNB_A (0x0<<22)
|
||||
/* SNB B-stepping */
|
||||
#define FDI_LINK_TRAIN_400MV_0DB_SNB_B (0x0<<22)
|
||||
#define FDI_LINK_TRAIN_400MV_6DB_SNB_B (0x3a<<22)
|
||||
#define FDI_LINK_TRAIN_600MV_3_5DB_SNB_B (0x39<<22)
|
||||
#define FDI_LINK_TRAIN_800MV_0DB_SNB_B (0x38<<22)
|
||||
#define FDI_LINK_TRAIN_VOL_EMP_MASK (0x3f<<22)
|
||||
#define FDI_DP_PORT_WIDTH_X1 (0<<19)
|
||||
#define FDI_DP_PORT_WIDTH_X2 (1<<19)
|
||||
#define FDI_DP_PORT_WIDTH_X3 (2<<19)
|
||||
|
@ -2514,6 +2604,13 @@
|
|||
#define FDI_RX_ENHANCE_FRAME_ENABLE (1<<6)
|
||||
#define FDI_SEL_RAWCLK (0<<4)
|
||||
#define FDI_SEL_PCDCLK (1<<4)
|
||||
/* CPT */
|
||||
#define FDI_AUTO_TRAINING (1<<10)
|
||||
#define FDI_LINK_TRAIN_PATTERN_1_CPT (0<<8)
|
||||
#define FDI_LINK_TRAIN_PATTERN_2_CPT (1<<8)
|
||||
#define FDI_LINK_TRAIN_PATTERN_IDLE_CPT (2<<8)
|
||||
#define FDI_LINK_TRAIN_NORMAL_CPT (3<<8)
|
||||
#define FDI_LINK_TRAIN_PATTERN_MASK_CPT (3<<8)
|
||||
|
||||
#define FDI_RXA_MISC 0xf0010
|
||||
#define FDI_RXB_MISC 0xf1010
|
||||
|
@ -2585,6 +2682,9 @@
|
|||
#define HSYNC_ACTIVE_HIGH (1 << 3)
|
||||
#define PORT_DETECTED (1 << 2)
|
||||
|
||||
/* PCH SDVOB multiplex with HDMIB */
|
||||
#define PCH_SDVOB HDMIB
|
||||
|
||||
#define HDMIC 0xe1150
|
||||
#define HDMID 0xe1160
|
||||
|
||||
|
@ -2642,4 +2742,42 @@
|
|||
#define PCH_DPD_AUX_CH_DATA4 0xe4320
|
||||
#define PCH_DPD_AUX_CH_DATA5 0xe4324
|
||||
|
||||
/* CPT */
|
||||
#define PORT_TRANS_A_SEL_CPT 0
|
||||
#define PORT_TRANS_B_SEL_CPT (1<<29)
|
||||
#define PORT_TRANS_C_SEL_CPT (2<<29)
|
||||
#define PORT_TRANS_SEL_MASK (3<<29)
|
||||
|
||||
#define TRANS_DP_CTL_A 0xe0300
|
||||
#define TRANS_DP_CTL_B 0xe1300
|
||||
#define TRANS_DP_CTL_C 0xe2300
|
||||
#define TRANS_DP_OUTPUT_ENABLE (1<<31)
|
||||
#define TRANS_DP_PORT_SEL_B (0<<29)
|
||||
#define TRANS_DP_PORT_SEL_C (1<<29)
|
||||
#define TRANS_DP_PORT_SEL_D (2<<29)
|
||||
#define TRANS_DP_PORT_SEL_MASK (3<<29)
|
||||
#define TRANS_DP_AUDIO_ONLY (1<<26)
|
||||
#define TRANS_DP_ENH_FRAMING (1<<18)
|
||||
#define TRANS_DP_8BPC (0<<9)
|
||||
#define TRANS_DP_10BPC (1<<9)
|
||||
#define TRANS_DP_6BPC (2<<9)
|
||||
#define TRANS_DP_12BPC (3<<9)
|
||||
#define TRANS_DP_VSYNC_ACTIVE_HIGH (1<<4)
|
||||
#define TRANS_DP_VSYNC_ACTIVE_LOW 0
|
||||
#define TRANS_DP_HSYNC_ACTIVE_HIGH (1<<3)
|
||||
#define TRANS_DP_HSYNC_ACTIVE_LOW 0
|
||||
|
||||
/* SNB eDP training params */
|
||||
/* SNB A-stepping */
|
||||
#define EDP_LINK_TRAIN_400MV_0DB_SNB_A (0x38<<22)
|
||||
#define EDP_LINK_TRAIN_400MV_6DB_SNB_A (0x02<<22)
|
||||
#define EDP_LINK_TRAIN_600MV_3_5DB_SNB_A (0x01<<22)
|
||||
#define EDP_LINK_TRAIN_800MV_0DB_SNB_A (0x0<<22)
|
||||
/* SNB B-stepping */
|
||||
#define EDP_LINK_TRAIN_400MV_0DB_SNB_B (0x0<<22)
|
||||
#define EDP_LINK_TRAIN_400MV_6DB_SNB_B (0x3a<<22)
|
||||
#define EDP_LINK_TRAIN_600MV_3_5DB_SNB_B (0x39<<22)
|
||||
#define EDP_LINK_TRAIN_800MV_0DB_SNB_B (0x38<<22)
|
||||
#define EDP_LINK_TRAIN_VOL_EMP_MASK_SNB (0x3f<<22)
|
||||
|
||||
#endif /* _I915_REG_H_ */
|
||||
|
|
|
@ -600,14 +600,16 @@ void i915_save_display(struct drm_device *dev)
|
|||
}
|
||||
/* FIXME: save TV & SDVO state */
|
||||
|
||||
/* FBC state */
|
||||
if (IS_GM45(dev)) {
|
||||
dev_priv->saveDPFC_CB_BASE = I915_READ(DPFC_CB_BASE);
|
||||
} else {
|
||||
dev_priv->saveFBC_CFB_BASE = I915_READ(FBC_CFB_BASE);
|
||||
dev_priv->saveFBC_LL_BASE = I915_READ(FBC_LL_BASE);
|
||||
dev_priv->saveFBC_CONTROL2 = I915_READ(FBC_CONTROL2);
|
||||
dev_priv->saveFBC_CONTROL = I915_READ(FBC_CONTROL);
|
||||
/* Only save FBC state on the platform that supports FBC */
|
||||
if (I915_HAS_FBC(dev)) {
|
||||
if (IS_GM45(dev)) {
|
||||
dev_priv->saveDPFC_CB_BASE = I915_READ(DPFC_CB_BASE);
|
||||
} else {
|
||||
dev_priv->saveFBC_CFB_BASE = I915_READ(FBC_CFB_BASE);
|
||||
dev_priv->saveFBC_LL_BASE = I915_READ(FBC_LL_BASE);
|
||||
dev_priv->saveFBC_CONTROL2 = I915_READ(FBC_CONTROL2);
|
||||
dev_priv->saveFBC_CONTROL = I915_READ(FBC_CONTROL);
|
||||
}
|
||||
}
|
||||
|
||||
/* VGA state */
|
||||
|
@ -702,18 +704,19 @@ void i915_restore_display(struct drm_device *dev)
|
|||
}
|
||||
/* FIXME: restore TV & SDVO state */
|
||||
|
||||
/* FBC info */
|
||||
if (IS_GM45(dev)) {
|
||||
g4x_disable_fbc(dev);
|
||||
I915_WRITE(DPFC_CB_BASE, dev_priv->saveDPFC_CB_BASE);
|
||||
} else {
|
||||
i8xx_disable_fbc(dev);
|
||||
I915_WRITE(FBC_CFB_BASE, dev_priv->saveFBC_CFB_BASE);
|
||||
I915_WRITE(FBC_LL_BASE, dev_priv->saveFBC_LL_BASE);
|
||||
I915_WRITE(FBC_CONTROL2, dev_priv->saveFBC_CONTROL2);
|
||||
I915_WRITE(FBC_CONTROL, dev_priv->saveFBC_CONTROL);
|
||||
/* only restore FBC info on the platform that supports FBC*/
|
||||
if (I915_HAS_FBC(dev)) {
|
||||
if (IS_GM45(dev)) {
|
||||
g4x_disable_fbc(dev);
|
||||
I915_WRITE(DPFC_CB_BASE, dev_priv->saveDPFC_CB_BASE);
|
||||
} else {
|
||||
i8xx_disable_fbc(dev);
|
||||
I915_WRITE(FBC_CFB_BASE, dev_priv->saveFBC_CFB_BASE);
|
||||
I915_WRITE(FBC_LL_BASE, dev_priv->saveFBC_LL_BASE);
|
||||
I915_WRITE(FBC_CONTROL2, dev_priv->saveFBC_CONTROL2);
|
||||
I915_WRITE(FBC_CONTROL, dev_priv->saveFBC_CONTROL);
|
||||
}
|
||||
}
|
||||
|
||||
/* VGA state */
|
||||
if (IS_IRONLAKE(dev))
|
||||
I915_WRITE(CPU_VGACNTRL, dev_priv->saveVGACNTRL);
|
||||
|
|
|
@ -115,7 +115,7 @@ TRACE_EVENT(i915_gem_object_get_fence,
|
|||
__entry->obj, __entry->fence, __entry->tiling_mode)
|
||||
);
|
||||
|
||||
TRACE_EVENT(i915_gem_object_unbind,
|
||||
DECLARE_EVENT_CLASS(i915_gem_object,
|
||||
|
||||
TP_PROTO(struct drm_gem_object *obj),
|
||||
|
||||
|
@ -132,21 +132,18 @@ TRACE_EVENT(i915_gem_object_unbind,
|
|||
TP_printk("obj=%p", __entry->obj)
|
||||
);
|
||||
|
||||
TRACE_EVENT(i915_gem_object_destroy,
|
||||
DEFINE_EVENT(i915_gem_object, i915_gem_object_unbind,
|
||||
|
||||
TP_PROTO(struct drm_gem_object *obj),
|
||||
|
||||
TP_ARGS(obj),
|
||||
TP_ARGS(obj)
|
||||
);
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(struct drm_gem_object *, obj)
|
||||
),
|
||||
DEFINE_EVENT(i915_gem_object, i915_gem_object_destroy,
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->obj = obj;
|
||||
),
|
||||
TP_PROTO(struct drm_gem_object *obj),
|
||||
|
||||
TP_printk("obj=%p", __entry->obj)
|
||||
TP_ARGS(obj)
|
||||
);
|
||||
|
||||
/* batch tracing */
|
||||
|
@ -197,8 +194,7 @@ TRACE_EVENT(i915_gem_request_flush,
|
|||
__entry->flush_domains, __entry->invalidate_domains)
|
||||
);
|
||||
|
||||
|
||||
TRACE_EVENT(i915_gem_request_complete,
|
||||
DECLARE_EVENT_CLASS(i915_gem_request,
|
||||
|
||||
TP_PROTO(struct drm_device *dev, u32 seqno),
|
||||
|
||||
|
@ -217,64 +213,35 @@ TRACE_EVENT(i915_gem_request_complete,
|
|||
TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno)
|
||||
);
|
||||
|
||||
TRACE_EVENT(i915_gem_request_retire,
|
||||
DEFINE_EVENT(i915_gem_request, i915_gem_request_complete,
|
||||
|
||||
TP_PROTO(struct drm_device *dev, u32 seqno),
|
||||
|
||||
TP_ARGS(dev, seqno),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(u32, dev)
|
||||
__field(u32, seqno)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev = dev->primary->index;
|
||||
__entry->seqno = seqno;
|
||||
),
|
||||
|
||||
TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno)
|
||||
TP_ARGS(dev, seqno)
|
||||
);
|
||||
|
||||
TRACE_EVENT(i915_gem_request_wait_begin,
|
||||
DEFINE_EVENT(i915_gem_request, i915_gem_request_retire,
|
||||
|
||||
TP_PROTO(struct drm_device *dev, u32 seqno),
|
||||
|
||||
TP_ARGS(dev, seqno),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(u32, dev)
|
||||
__field(u32, seqno)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev = dev->primary->index;
|
||||
__entry->seqno = seqno;
|
||||
),
|
||||
|
||||
TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno)
|
||||
TP_ARGS(dev, seqno)
|
||||
);
|
||||
|
||||
TRACE_EVENT(i915_gem_request_wait_end,
|
||||
DEFINE_EVENT(i915_gem_request, i915_gem_request_wait_begin,
|
||||
|
||||
TP_PROTO(struct drm_device *dev, u32 seqno),
|
||||
|
||||
TP_ARGS(dev, seqno),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(u32, dev)
|
||||
__field(u32, seqno)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev = dev->primary->index;
|
||||
__entry->seqno = seqno;
|
||||
),
|
||||
|
||||
TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno)
|
||||
TP_ARGS(dev, seqno)
|
||||
);
|
||||
|
||||
TRACE_EVENT(i915_ring_wait_begin,
|
||||
DEFINE_EVENT(i915_gem_request, i915_gem_request_wait_end,
|
||||
|
||||
TP_PROTO(struct drm_device *dev, u32 seqno),
|
||||
|
||||
TP_ARGS(dev, seqno)
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(i915_ring,
|
||||
|
||||
TP_PROTO(struct drm_device *dev),
|
||||
|
||||
|
@ -291,21 +258,18 @@ TRACE_EVENT(i915_ring_wait_begin,
|
|||
TP_printk("dev=%u", __entry->dev)
|
||||
);
|
||||
|
||||
TRACE_EVENT(i915_ring_wait_end,
|
||||
DEFINE_EVENT(i915_ring, i915_ring_wait_begin,
|
||||
|
||||
TP_PROTO(struct drm_device *dev),
|
||||
|
||||
TP_ARGS(dev),
|
||||
TP_ARGS(dev)
|
||||
);
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(u32, dev)
|
||||
),
|
||||
DEFINE_EVENT(i915_ring, i915_ring_wait_end,
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->dev = dev->primary->index;
|
||||
),
|
||||
TP_PROTO(struct drm_device *dev),
|
||||
|
||||
TP_printk("dev=%u", __entry->dev)
|
||||
TP_ARGS(dev)
|
||||
);
|
||||
|
||||
#endif /* _I915_TRACE_H_ */
|
||||
|
|
|
@ -136,11 +136,17 @@ static void intel_crt_mode_set(struct drm_encoder *encoder,
|
|||
adpa |= ADPA_VSYNC_ACTIVE_HIGH;
|
||||
|
||||
if (intel_crtc->pipe == 0) {
|
||||
adpa |= ADPA_PIPE_A_SELECT;
|
||||
if (HAS_PCH_CPT(dev))
|
||||
adpa |= PORT_TRANS_A_SEL_CPT;
|
||||
else
|
||||
adpa |= ADPA_PIPE_A_SELECT;
|
||||
if (!HAS_PCH_SPLIT(dev))
|
||||
I915_WRITE(BCLRPAT_A, 0);
|
||||
} else {
|
||||
adpa |= ADPA_PIPE_B_SELECT;
|
||||
if (HAS_PCH_CPT(dev))
|
||||
adpa |= PORT_TRANS_B_SEL_CPT;
|
||||
else
|
||||
adpa |= ADPA_PIPE_B_SELECT;
|
||||
if (!HAS_PCH_SPLIT(dev))
|
||||
I915_WRITE(BCLRPAT_B, 0);
|
||||
}
|
||||
|
@ -152,15 +158,21 @@ static bool intel_ironlake_crt_detect_hotplug(struct drm_connector *connector)
|
|||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
u32 adpa;
|
||||
u32 adpa, temp;
|
||||
bool ret;
|
||||
|
||||
adpa = I915_READ(PCH_ADPA);
|
||||
temp = adpa = I915_READ(PCH_ADPA);
|
||||
|
||||
adpa &= ~ADPA_CRT_HOTPLUG_MASK;
|
||||
/* disable HPD first */
|
||||
I915_WRITE(PCH_ADPA, adpa);
|
||||
(void)I915_READ(PCH_ADPA);
|
||||
if (HAS_PCH_CPT(dev)) {
|
||||
/* Disable DAC before force detect */
|
||||
I915_WRITE(PCH_ADPA, adpa & ~ADPA_DAC_ENABLE);
|
||||
(void)I915_READ(PCH_ADPA);
|
||||
} else {
|
||||
adpa &= ~ADPA_CRT_HOTPLUG_MASK;
|
||||
/* disable HPD first */
|
||||
I915_WRITE(PCH_ADPA, adpa);
|
||||
(void)I915_READ(PCH_ADPA);
|
||||
}
|
||||
|
||||
adpa |= (ADPA_CRT_HOTPLUG_PERIOD_128 |
|
||||
ADPA_CRT_HOTPLUG_WARMUP_10MS |
|
||||
|
@ -176,6 +188,11 @@ static bool intel_ironlake_crt_detect_hotplug(struct drm_connector *connector)
|
|||
while ((I915_READ(PCH_ADPA) & ADPA_CRT_HOTPLUG_FORCE_TRIGGER) != 0)
|
||||
;
|
||||
|
||||
if (HAS_PCH_CPT(dev)) {
|
||||
I915_WRITE(PCH_ADPA, temp);
|
||||
(void)I915_READ(PCH_ADPA);
|
||||
}
|
||||
|
||||
/* Check the status to see if both blue and green are on now */
|
||||
adpa = I915_READ(PCH_ADPA);
|
||||
adpa &= ADPA_CRT_HOTPLUG_MONITOR_MASK;
|
||||
|
@ -245,9 +262,9 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)
|
|||
return false;
|
||||
}
|
||||
|
||||
static bool intel_crt_detect_ddc(struct drm_connector *connector)
|
||||
static bool intel_crt_detect_ddc(struct drm_encoder *encoder)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
|
||||
/* CRT should always be at 0, but check anyway */
|
||||
if (intel_encoder->type != INTEL_OUTPUT_ANALOG)
|
||||
|
@ -387,8 +404,8 @@ intel_crt_load_detect(struct drm_crtc *crtc, struct intel_encoder *intel_encoder
|
|||
static enum drm_connector_status intel_crt_detect(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_encoder *encoder = &intel_encoder->enc;
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct drm_crtc *crtc;
|
||||
int dpms_mode;
|
||||
enum drm_connector_status status;
|
||||
|
@ -400,18 +417,19 @@ static enum drm_connector_status intel_crt_detect(struct drm_connector *connecto
|
|||
return connector_status_disconnected;
|
||||
}
|
||||
|
||||
if (intel_crt_detect_ddc(connector))
|
||||
if (intel_crt_detect_ddc(encoder))
|
||||
return connector_status_connected;
|
||||
|
||||
/* for pre-945g platforms use load detect */
|
||||
if (encoder->crtc && encoder->crtc->enabled) {
|
||||
status = intel_crt_load_detect(encoder->crtc, intel_encoder);
|
||||
} else {
|
||||
crtc = intel_get_load_detect_pipe(intel_encoder,
|
||||
crtc = intel_get_load_detect_pipe(intel_encoder, connector,
|
||||
NULL, &dpms_mode);
|
||||
if (crtc) {
|
||||
status = intel_crt_load_detect(crtc, intel_encoder);
|
||||
intel_release_load_detect_pipe(intel_encoder, dpms_mode);
|
||||
intel_release_load_detect_pipe(intel_encoder,
|
||||
connector, dpms_mode);
|
||||
} else
|
||||
status = connector_status_unknown;
|
||||
}
|
||||
|
@ -421,9 +439,6 @@ static enum drm_connector_status intel_crt_detect(struct drm_connector *connecto
|
|||
|
||||
static void intel_crt_destroy(struct drm_connector *connector)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
|
||||
intel_i2c_destroy(intel_encoder->ddc_bus);
|
||||
drm_sysfs_connector_remove(connector);
|
||||
drm_connector_cleanup(connector);
|
||||
kfree(connector);
|
||||
|
@ -432,29 +447,27 @@ static void intel_crt_destroy(struct drm_connector *connector)
|
|||
static int intel_crt_get_modes(struct drm_connector *connector)
|
||||
{
|
||||
int ret;
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct i2c_adapter *ddcbus;
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct i2c_adapter *ddc_bus;
|
||||
struct drm_device *dev = connector->dev;
|
||||
|
||||
|
||||
ret = intel_ddc_get_modes(intel_encoder);
|
||||
ret = intel_ddc_get_modes(connector, intel_encoder->ddc_bus);
|
||||
if (ret || !IS_G4X(dev))
|
||||
goto end;
|
||||
|
||||
ddcbus = intel_encoder->ddc_bus;
|
||||
/* Try to probe digital port for output in DVI-I -> VGA mode. */
|
||||
intel_encoder->ddc_bus =
|
||||
intel_i2c_create(connector->dev, GPIOD, "CRTDDC_D");
|
||||
ddc_bus = intel_i2c_create(connector->dev, GPIOD, "CRTDDC_D");
|
||||
|
||||
if (!intel_encoder->ddc_bus) {
|
||||
intel_encoder->ddc_bus = ddcbus;
|
||||
if (!ddc_bus) {
|
||||
dev_printk(KERN_ERR, &connector->dev->pdev->dev,
|
||||
"DDC bus registration failed for CRTDDC_D.\n");
|
||||
goto end;
|
||||
}
|
||||
/* Try to get modes by GPIOD port */
|
||||
ret = intel_ddc_get_modes(intel_encoder);
|
||||
intel_i2c_destroy(ddcbus);
|
||||
ret = intel_ddc_get_modes(connector, ddc_bus);
|
||||
intel_i2c_destroy(ddc_bus);
|
||||
|
||||
end:
|
||||
return ret;
|
||||
|
@ -491,12 +504,16 @@ static const struct drm_connector_funcs intel_crt_connector_funcs = {
|
|||
static const struct drm_connector_helper_funcs intel_crt_connector_helper_funcs = {
|
||||
.mode_valid = intel_crt_mode_valid,
|
||||
.get_modes = intel_crt_get_modes,
|
||||
.best_encoder = intel_best_encoder,
|
||||
.best_encoder = intel_attached_encoder,
|
||||
};
|
||||
|
||||
static void intel_crt_enc_destroy(struct drm_encoder *encoder)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
|
||||
intel_i2c_destroy(intel_encoder->ddc_bus);
|
||||
drm_encoder_cleanup(encoder);
|
||||
kfree(intel_encoder);
|
||||
}
|
||||
|
||||
static const struct drm_encoder_funcs intel_crt_enc_funcs = {
|
||||
|
@ -507,6 +524,7 @@ void intel_crt_init(struct drm_device *dev)
|
|||
{
|
||||
struct drm_connector *connector;
|
||||
struct intel_encoder *intel_encoder;
|
||||
struct intel_connector *intel_connector;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
u32 i2c_reg;
|
||||
|
||||
|
@ -514,14 +532,20 @@ void intel_crt_init(struct drm_device *dev)
|
|||
if (!intel_encoder)
|
||||
return;
|
||||
|
||||
connector = &intel_encoder->base;
|
||||
drm_connector_init(dev, &intel_encoder->base,
|
||||
intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
|
||||
if (!intel_connector) {
|
||||
kfree(intel_encoder);
|
||||
return;
|
||||
}
|
||||
|
||||
connector = &intel_connector->base;
|
||||
drm_connector_init(dev, &intel_connector->base,
|
||||
&intel_crt_connector_funcs, DRM_MODE_CONNECTOR_VGA);
|
||||
|
||||
drm_encoder_init(dev, &intel_encoder->enc, &intel_crt_enc_funcs,
|
||||
DRM_MODE_ENCODER_DAC);
|
||||
|
||||
drm_mode_connector_attach_encoder(&intel_encoder->base,
|
||||
drm_mode_connector_attach_encoder(&intel_connector->base,
|
||||
&intel_encoder->enc);
|
||||
|
||||
/* Set up the DDC bus. */
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -48,8 +48,6 @@ struct intel_dp_priv {
|
|||
uint32_t output_reg;
|
||||
uint32_t DP;
|
||||
uint8_t link_configuration[DP_LINK_CONFIGURATION_SIZE];
|
||||
uint32_t save_DP;
|
||||
uint8_t save_link_configuration[DP_LINK_CONFIGURATION_SIZE];
|
||||
bool has_audio;
|
||||
int dpms_mode;
|
||||
uint8_t link_bw;
|
||||
|
@ -141,7 +139,8 @@ static int
|
|||
intel_dp_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
int max_link_clock = intel_dp_link_clock(intel_dp_max_link_bw(intel_encoder));
|
||||
int max_lanes = intel_dp_max_lane_count(intel_encoder);
|
||||
|
||||
|
@ -215,7 +214,7 @@ intel_dp_aux_ch(struct intel_encoder *intel_encoder,
|
|||
{
|
||||
struct intel_dp_priv *dp_priv = intel_encoder->dev_priv;
|
||||
uint32_t output_reg = dp_priv->output_reg;
|
||||
struct drm_device *dev = intel_encoder->base.dev;
|
||||
struct drm_device *dev = intel_encoder->enc.dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
uint32_t ch_ctl = output_reg + 0x10;
|
||||
uint32_t ch_data = ch_ctl + 4;
|
||||
|
@ -224,19 +223,27 @@ intel_dp_aux_ch(struct intel_encoder *intel_encoder,
|
|||
uint32_t ctl;
|
||||
uint32_t status;
|
||||
uint32_t aux_clock_divider;
|
||||
int try;
|
||||
int try, precharge;
|
||||
|
||||
/* The clock divider is based off the hrawclk,
|
||||
* and would like to run at 2MHz. So, take the
|
||||
* hrawclk value and divide by 2 and use that
|
||||
*/
|
||||
if (IS_eDP(intel_encoder))
|
||||
aux_clock_divider = 225; /* eDP input clock at 450Mhz */
|
||||
else if (HAS_PCH_SPLIT(dev))
|
||||
if (IS_eDP(intel_encoder)) {
|
||||
if (IS_GEN6(dev))
|
||||
aux_clock_divider = 200; /* SNB eDP input clock at 400Mhz */
|
||||
else
|
||||
aux_clock_divider = 225; /* eDP input clock at 450Mhz */
|
||||
} else if (HAS_PCH_SPLIT(dev))
|
||||
aux_clock_divider = 62; /* IRL input clock fixed at 125Mhz */
|
||||
else
|
||||
aux_clock_divider = intel_hrawclk(dev) / 2;
|
||||
|
||||
if (IS_GEN6(dev))
|
||||
precharge = 3;
|
||||
else
|
||||
precharge = 5;
|
||||
|
||||
/* Must try at least 3 times according to DP spec */
|
||||
for (try = 0; try < 5; try++) {
|
||||
/* Load the send data into the aux channel data registers */
|
||||
|
@ -249,7 +256,7 @@ intel_dp_aux_ch(struct intel_encoder *intel_encoder,
|
|||
ctl = (DP_AUX_CH_CTL_SEND_BUSY |
|
||||
DP_AUX_CH_CTL_TIME_OUT_400us |
|
||||
(send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) |
|
||||
(5 << DP_AUX_CH_CTL_PRECHARGE_2US_SHIFT) |
|
||||
(precharge << DP_AUX_CH_CTL_PRECHARGE_2US_SHIFT) |
|
||||
(aux_clock_divider << DP_AUX_CH_CTL_BIT_CLOCK_2X_SHIFT) |
|
||||
DP_AUX_CH_CTL_DONE |
|
||||
DP_AUX_CH_CTL_TIME_OUT_ERROR |
|
||||
|
@ -465,7 +472,8 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
|
|||
}
|
||||
|
||||
static int
|
||||
intel_dp_i2c_init(struct intel_encoder *intel_encoder, const char *name)
|
||||
intel_dp_i2c_init(struct intel_encoder *intel_encoder,
|
||||
struct intel_connector *intel_connector, const char *name)
|
||||
{
|
||||
struct intel_dp_priv *dp_priv = intel_encoder->dev_priv;
|
||||
|
||||
|
@ -480,7 +488,7 @@ intel_dp_i2c_init(struct intel_encoder *intel_encoder, const char *name)
|
|||
strncpy (dp_priv->adapter.name, name, sizeof(dp_priv->adapter.name) - 1);
|
||||
dp_priv->adapter.name[sizeof(dp_priv->adapter.name) - 1] = '\0';
|
||||
dp_priv->adapter.algo_data = &dp_priv->algo;
|
||||
dp_priv->adapter.dev.parent = &intel_encoder->base.kdev;
|
||||
dp_priv->adapter.dev.parent = &intel_connector->base.kdev;
|
||||
|
||||
return i2c_dp_aux_add_bus(&dp_priv->adapter);
|
||||
}
|
||||
|
@ -555,7 +563,7 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode,
|
|||
{
|
||||
struct drm_device *dev = crtc->dev;
|
||||
struct drm_mode_config *mode_config = &dev->mode_config;
|
||||
struct drm_connector *connector;
|
||||
struct drm_encoder *encoder;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
||||
int lane_count = 4;
|
||||
|
@ -564,13 +572,16 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode,
|
|||
/*
|
||||
* Find the lane count in the intel_encoder private
|
||||
*/
|
||||
list_for_each_entry(connector, &mode_config->connector_list, head) {
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct intel_dp_priv *dp_priv = intel_encoder->dev_priv;
|
||||
list_for_each_entry(encoder, &mode_config->encoder_list, head) {
|
||||
struct intel_encoder *intel_encoder;
|
||||
struct intel_dp_priv *dp_priv;
|
||||
|
||||
if (!connector->encoder || connector->encoder->crtc != crtc)
|
||||
if (!encoder || encoder->crtc != crtc)
|
||||
continue;
|
||||
|
||||
intel_encoder = enc_to_intel_encoder(encoder);
|
||||
dp_priv = intel_encoder->dev_priv;
|
||||
|
||||
if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT) {
|
||||
lane_count = dp_priv->lane_count;
|
||||
break;
|
||||
|
@ -626,16 +637,24 @@ static void
|
|||
intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode)
|
||||
{
|
||||
struct drm_device *dev = encoder->dev;
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct intel_dp_priv *dp_priv = intel_encoder->dev_priv;
|
||||
struct drm_crtc *crtc = intel_encoder->enc.crtc;
|
||||
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
||||
|
||||
dp_priv->DP = (DP_LINK_TRAIN_OFF |
|
||||
DP_VOLTAGE_0_4 |
|
||||
DP_PRE_EMPHASIS_0 |
|
||||
DP_SYNC_VS_HIGH |
|
||||
DP_SYNC_HS_HIGH);
|
||||
dp_priv->DP = (DP_VOLTAGE_0_4 |
|
||||
DP_PRE_EMPHASIS_0);
|
||||
|
||||
if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
|
||||
dp_priv->DP |= DP_SYNC_HS_HIGH;
|
||||
if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
|
||||
dp_priv->DP |= DP_SYNC_VS_HIGH;
|
||||
|
||||
if (HAS_PCH_CPT(dev) && !IS_eDP(intel_encoder))
|
||||
dp_priv->DP |= DP_LINK_TRAIN_OFF_CPT;
|
||||
else
|
||||
dp_priv->DP |= DP_LINK_TRAIN_OFF;
|
||||
|
||||
switch (dp_priv->lane_count) {
|
||||
case 1:
|
||||
|
@ -664,7 +683,8 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
|
|||
dp_priv->DP |= DP_ENHANCED_FRAMING;
|
||||
}
|
||||
|
||||
if (intel_crtc->pipe == 1)
|
||||
/* CPT DP's pipe select is decided in TRANS_DP_CTL */
|
||||
if (intel_crtc->pipe == 1 && !HAS_PCH_CPT(dev))
|
||||
dp_priv->DP |= DP_PIPEB_SELECT;
|
||||
|
||||
if (IS_eDP(intel_encoder)) {
|
||||
|
@ -704,7 +724,7 @@ intel_dp_dpms(struct drm_encoder *encoder, int mode)
|
|||
{
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct intel_dp_priv *dp_priv = intel_encoder->dev_priv;
|
||||
struct drm_device *dev = intel_encoder->base.dev;
|
||||
struct drm_device *dev = encoder->dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
uint32_t dp_reg = I915_READ(dp_priv->output_reg);
|
||||
|
||||
|
@ -749,20 +769,6 @@ intel_dp_link_status(uint8_t link_status[DP_LINK_STATUS_SIZE],
|
|||
return link_status[r - DP_LANE0_1_STATUS];
|
||||
}
|
||||
|
||||
static void
|
||||
intel_dp_save(struct drm_connector *connector)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_device *dev = intel_encoder->base.dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct intel_dp_priv *dp_priv = intel_encoder->dev_priv;
|
||||
|
||||
dp_priv->save_DP = I915_READ(dp_priv->output_reg);
|
||||
intel_dp_aux_native_read(intel_encoder, DP_LINK_BW_SET,
|
||||
dp_priv->save_link_configuration,
|
||||
sizeof (dp_priv->save_link_configuration));
|
||||
}
|
||||
|
||||
static uint8_t
|
||||
intel_get_adjust_request_voltage(uint8_t link_status[DP_LINK_STATUS_SIZE],
|
||||
int lane)
|
||||
|
@ -892,6 +898,25 @@ intel_dp_signal_levels(uint8_t train_set, int lane_count)
|
|||
return signal_levels;
|
||||
}
|
||||
|
||||
/* Gen6's DP voltage swing and pre-emphasis control */
|
||||
static uint32_t
|
||||
intel_gen6_edp_signal_levels(uint8_t train_set)
|
||||
{
|
||||
switch (train_set & (DP_TRAIN_VOLTAGE_SWING_MASK|DP_TRAIN_PRE_EMPHASIS_MASK)) {
|
||||
case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_0:
|
||||
return EDP_LINK_TRAIN_400MV_0DB_SNB_B;
|
||||
case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_6:
|
||||
return EDP_LINK_TRAIN_400MV_6DB_SNB_B;
|
||||
case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_3_5:
|
||||
return EDP_LINK_TRAIN_600MV_3_5DB_SNB_B;
|
||||
case DP_TRAIN_VOLTAGE_SWING_800 | DP_TRAIN_PRE_EMPHASIS_0:
|
||||
return EDP_LINK_TRAIN_800MV_0DB_SNB_B;
|
||||
default:
|
||||
DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level\n");
|
||||
return EDP_LINK_TRAIN_400MV_0DB_SNB_B;
|
||||
}
|
||||
}
|
||||
|
||||
static uint8_t
|
||||
intel_get_lane_status(uint8_t link_status[DP_LINK_STATUS_SIZE],
|
||||
int lane)
|
||||
|
@ -948,7 +973,7 @@ intel_dp_set_link_train(struct intel_encoder *intel_encoder,
|
|||
uint8_t train_set[4],
|
||||
bool first)
|
||||
{
|
||||
struct drm_device *dev = intel_encoder->base.dev;
|
||||
struct drm_device *dev = intel_encoder->enc.dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct intel_dp_priv *dp_priv = intel_encoder->dev_priv;
|
||||
int ret;
|
||||
|
@ -974,7 +999,7 @@ static void
|
|||
intel_dp_link_train(struct intel_encoder *intel_encoder, uint32_t DP,
|
||||
uint8_t link_configuration[DP_LINK_CONFIGURATION_SIZE])
|
||||
{
|
||||
struct drm_device *dev = intel_encoder->base.dev;
|
||||
struct drm_device *dev = intel_encoder->enc.dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct intel_dp_priv *dp_priv = intel_encoder->dev_priv;
|
||||
uint8_t train_set[4];
|
||||
|
@ -985,23 +1010,38 @@ intel_dp_link_train(struct intel_encoder *intel_encoder, uint32_t DP,
|
|||
bool channel_eq = false;
|
||||
bool first = true;
|
||||
int tries;
|
||||
u32 reg;
|
||||
|
||||
/* Write the link configuration data */
|
||||
intel_dp_aux_native_write(intel_encoder, 0x100,
|
||||
intel_dp_aux_native_write(intel_encoder, DP_LINK_BW_SET,
|
||||
link_configuration, DP_LINK_CONFIGURATION_SIZE);
|
||||
|
||||
DP |= DP_PORT_EN;
|
||||
DP &= ~DP_LINK_TRAIN_MASK;
|
||||
if (HAS_PCH_CPT(dev) && !IS_eDP(intel_encoder))
|
||||
DP &= ~DP_LINK_TRAIN_MASK_CPT;
|
||||
else
|
||||
DP &= ~DP_LINK_TRAIN_MASK;
|
||||
memset(train_set, 0, 4);
|
||||
voltage = 0xff;
|
||||
tries = 0;
|
||||
clock_recovery = false;
|
||||
for (;;) {
|
||||
/* Use train_set[0] to set the voltage and pre emphasis values */
|
||||
uint32_t signal_levels = intel_dp_signal_levels(train_set[0], dp_priv->lane_count);
|
||||
DP = (DP & ~(DP_VOLTAGE_MASK|DP_PRE_EMPHASIS_MASK)) | signal_levels;
|
||||
uint32_t signal_levels;
|
||||
if (IS_GEN6(dev) && IS_eDP(intel_encoder)) {
|
||||
signal_levels = intel_gen6_edp_signal_levels(train_set[0]);
|
||||
DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_SNB) | signal_levels;
|
||||
} else {
|
||||
signal_levels = intel_dp_signal_levels(train_set[0], dp_priv->lane_count);
|
||||
DP = (DP & ~(DP_VOLTAGE_MASK|DP_PRE_EMPHASIS_MASK)) | signal_levels;
|
||||
}
|
||||
|
||||
if (!intel_dp_set_link_train(intel_encoder, DP | DP_LINK_TRAIN_PAT_1,
|
||||
if (HAS_PCH_CPT(dev) && !IS_eDP(intel_encoder))
|
||||
reg = DP | DP_LINK_TRAIN_PAT_1_CPT;
|
||||
else
|
||||
reg = DP | DP_LINK_TRAIN_PAT_1;
|
||||
|
||||
if (!intel_dp_set_link_train(intel_encoder, reg,
|
||||
DP_TRAINING_PATTERN_1, train_set, first))
|
||||
break;
|
||||
first = false;
|
||||
|
@ -1041,11 +1081,23 @@ intel_dp_link_train(struct intel_encoder *intel_encoder, uint32_t DP,
|
|||
channel_eq = false;
|
||||
for (;;) {
|
||||
/* Use train_set[0] to set the voltage and pre emphasis values */
|
||||
uint32_t signal_levels = intel_dp_signal_levels(train_set[0], dp_priv->lane_count);
|
||||
DP = (DP & ~(DP_VOLTAGE_MASK|DP_PRE_EMPHASIS_MASK)) | signal_levels;
|
||||
uint32_t signal_levels;
|
||||
|
||||
if (IS_GEN6(dev) && IS_eDP(intel_encoder)) {
|
||||
signal_levels = intel_gen6_edp_signal_levels(train_set[0]);
|
||||
DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_SNB) | signal_levels;
|
||||
} else {
|
||||
signal_levels = intel_dp_signal_levels(train_set[0], dp_priv->lane_count);
|
||||
DP = (DP & ~(DP_VOLTAGE_MASK|DP_PRE_EMPHASIS_MASK)) | signal_levels;
|
||||
}
|
||||
|
||||
if (HAS_PCH_CPT(dev) && !IS_eDP(intel_encoder))
|
||||
reg = DP | DP_LINK_TRAIN_PAT_2_CPT;
|
||||
else
|
||||
reg = DP | DP_LINK_TRAIN_PAT_2;
|
||||
|
||||
/* channel eq pattern */
|
||||
if (!intel_dp_set_link_train(intel_encoder, DP | DP_LINK_TRAIN_PAT_2,
|
||||
if (!intel_dp_set_link_train(intel_encoder, reg,
|
||||
DP_TRAINING_PATTERN_2, train_set,
|
||||
false))
|
||||
break;
|
||||
|
@ -1068,7 +1120,12 @@ intel_dp_link_train(struct intel_encoder *intel_encoder, uint32_t DP,
|
|||
++tries;
|
||||
}
|
||||
|
||||
I915_WRITE(dp_priv->output_reg, DP | DP_LINK_TRAIN_OFF);
|
||||
if (HAS_PCH_CPT(dev) && !IS_eDP(intel_encoder))
|
||||
reg = DP | DP_LINK_TRAIN_OFF_CPT;
|
||||
else
|
||||
reg = DP | DP_LINK_TRAIN_OFF;
|
||||
|
||||
I915_WRITE(dp_priv->output_reg, reg);
|
||||
POSTING_READ(dp_priv->output_reg);
|
||||
intel_dp_aux_native_write_1(intel_encoder,
|
||||
DP_TRAINING_PATTERN_SET, DP_TRAINING_PATTERN_DISABLE);
|
||||
|
@ -1077,7 +1134,7 @@ intel_dp_link_train(struct intel_encoder *intel_encoder, uint32_t DP,
|
|||
static void
|
||||
intel_dp_link_down(struct intel_encoder *intel_encoder, uint32_t DP)
|
||||
{
|
||||
struct drm_device *dev = intel_encoder->base.dev;
|
||||
struct drm_device *dev = intel_encoder->enc.dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct intel_dp_priv *dp_priv = intel_encoder->dev_priv;
|
||||
|
||||
|
@ -1090,9 +1147,15 @@ intel_dp_link_down(struct intel_encoder *intel_encoder, uint32_t DP)
|
|||
udelay(100);
|
||||
}
|
||||
|
||||
DP &= ~DP_LINK_TRAIN_MASK;
|
||||
I915_WRITE(dp_priv->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE);
|
||||
POSTING_READ(dp_priv->output_reg);
|
||||
if (HAS_PCH_CPT(dev) && !IS_eDP(intel_encoder)) {
|
||||
DP &= ~DP_LINK_TRAIN_MASK_CPT;
|
||||
I915_WRITE(dp_priv->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE_CPT);
|
||||
POSTING_READ(dp_priv->output_reg);
|
||||
} else {
|
||||
DP &= ~DP_LINK_TRAIN_MASK;
|
||||
I915_WRITE(dp_priv->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE);
|
||||
POSTING_READ(dp_priv->output_reg);
|
||||
}
|
||||
|
||||
udelay(17000);
|
||||
|
||||
|
@ -1102,18 +1165,6 @@ intel_dp_link_down(struct intel_encoder *intel_encoder, uint32_t DP)
|
|||
POSTING_READ(dp_priv->output_reg);
|
||||
}
|
||||
|
||||
static void
|
||||
intel_dp_restore(struct drm_connector *connector)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct intel_dp_priv *dp_priv = intel_encoder->dev_priv;
|
||||
|
||||
if (dp_priv->save_DP & DP_PORT_EN)
|
||||
intel_dp_link_train(intel_encoder, dp_priv->save_DP, dp_priv->save_link_configuration);
|
||||
else
|
||||
intel_dp_link_down(intel_encoder, dp_priv->save_DP);
|
||||
}
|
||||
|
||||
/*
|
||||
* According to DP spec
|
||||
* 5.1.2:
|
||||
|
@ -1144,7 +1195,8 @@ intel_dp_check_link_status(struct intel_encoder *intel_encoder)
|
|||
static enum drm_connector_status
|
||||
ironlake_dp_detect(struct drm_connector *connector)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct intel_dp_priv *dp_priv = intel_encoder->dev_priv;
|
||||
enum drm_connector_status status;
|
||||
|
||||
|
@ -1168,8 +1220,9 @@ ironlake_dp_detect(struct drm_connector *connector)
|
|||
static enum drm_connector_status
|
||||
intel_dp_detect(struct drm_connector *connector)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_device *dev = intel_encoder->base.dev;
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct drm_device *dev = intel_encoder->enc.dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct intel_dp_priv *dp_priv = intel_encoder->dev_priv;
|
||||
uint32_t temp, bit;
|
||||
|
@ -1180,16 +1233,6 @@ intel_dp_detect(struct drm_connector *connector)
|
|||
if (HAS_PCH_SPLIT(dev))
|
||||
return ironlake_dp_detect(connector);
|
||||
|
||||
temp = I915_READ(PORT_HOTPLUG_EN);
|
||||
|
||||
I915_WRITE(PORT_HOTPLUG_EN,
|
||||
temp |
|
||||
DPB_HOTPLUG_INT_EN |
|
||||
DPC_HOTPLUG_INT_EN |
|
||||
DPD_HOTPLUG_INT_EN);
|
||||
|
||||
POSTING_READ(PORT_HOTPLUG_EN);
|
||||
|
||||
switch (dp_priv->output_reg) {
|
||||
case DP_B:
|
||||
bit = DPB_HOTPLUG_INT_STATUS;
|
||||
|
@ -1222,15 +1265,16 @@ intel_dp_detect(struct drm_connector *connector)
|
|||
|
||||
static int intel_dp_get_modes(struct drm_connector *connector)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_device *dev = intel_encoder->base.dev;
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct drm_device *dev = intel_encoder->enc.dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
int ret;
|
||||
|
||||
/* We should parse the EDID data and find out if it has an audio sink
|
||||
*/
|
||||
|
||||
ret = intel_ddc_get_modes(intel_encoder);
|
||||
ret = intel_ddc_get_modes(connector, intel_encoder->ddc_bus);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@ -1249,13 +1293,9 @@ static int intel_dp_get_modes(struct drm_connector *connector)
|
|||
static void
|
||||
intel_dp_destroy (struct drm_connector *connector)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
|
||||
if (intel_encoder->i2c_bus)
|
||||
intel_i2c_destroy(intel_encoder->i2c_bus);
|
||||
drm_sysfs_connector_remove(connector);
|
||||
drm_connector_cleanup(connector);
|
||||
kfree(intel_encoder);
|
||||
kfree(connector);
|
||||
}
|
||||
|
||||
static const struct drm_encoder_helper_funcs intel_dp_helper_funcs = {
|
||||
|
@ -1268,8 +1308,6 @@ static const struct drm_encoder_helper_funcs intel_dp_helper_funcs = {
|
|||
|
||||
static const struct drm_connector_funcs intel_dp_connector_funcs = {
|
||||
.dpms = drm_helper_connector_dpms,
|
||||
.save = intel_dp_save,
|
||||
.restore = intel_dp_restore,
|
||||
.detect = intel_dp_detect,
|
||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||
.destroy = intel_dp_destroy,
|
||||
|
@ -1278,12 +1316,17 @@ static const struct drm_connector_funcs intel_dp_connector_funcs = {
|
|||
static const struct drm_connector_helper_funcs intel_dp_connector_helper_funcs = {
|
||||
.get_modes = intel_dp_get_modes,
|
||||
.mode_valid = intel_dp_mode_valid,
|
||||
.best_encoder = intel_best_encoder,
|
||||
.best_encoder = intel_attached_encoder,
|
||||
};
|
||||
|
||||
static void intel_dp_enc_destroy(struct drm_encoder *encoder)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
|
||||
if (intel_encoder->i2c_bus)
|
||||
intel_i2c_destroy(intel_encoder->i2c_bus);
|
||||
drm_encoder_cleanup(encoder);
|
||||
kfree(intel_encoder);
|
||||
}
|
||||
|
||||
static const struct drm_encoder_funcs intel_dp_enc_funcs = {
|
||||
|
@ -1299,12 +1342,35 @@ intel_dp_hot_plug(struct intel_encoder *intel_encoder)
|
|||
intel_dp_check_link_status(intel_encoder);
|
||||
}
|
||||
|
||||
/* Return which DP Port should be selected for Transcoder DP control */
|
||||
int
|
||||
intel_trans_dp_port_sel (struct drm_crtc *crtc)
|
||||
{
|
||||
struct drm_device *dev = crtc->dev;
|
||||
struct drm_mode_config *mode_config = &dev->mode_config;
|
||||
struct drm_encoder *encoder;
|
||||
struct intel_encoder *intel_encoder = NULL;
|
||||
|
||||
list_for_each_entry(encoder, &mode_config->encoder_list, head) {
|
||||
if (!encoder || encoder->crtc != crtc)
|
||||
continue;
|
||||
|
||||
intel_encoder = enc_to_intel_encoder(encoder);
|
||||
if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT) {
|
||||
struct intel_dp_priv *dp_priv = intel_encoder->dev_priv;
|
||||
return dp_priv->output_reg;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void
|
||||
intel_dp_init(struct drm_device *dev, int output_reg)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct drm_connector *connector;
|
||||
struct intel_encoder *intel_encoder;
|
||||
struct intel_connector *intel_connector;
|
||||
struct intel_dp_priv *dp_priv;
|
||||
const char *name = NULL;
|
||||
|
||||
|
@ -1313,9 +1379,15 @@ intel_dp_init(struct drm_device *dev, int output_reg)
|
|||
if (!intel_encoder)
|
||||
return;
|
||||
|
||||
intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
|
||||
if (!intel_connector) {
|
||||
kfree(intel_encoder);
|
||||
return;
|
||||
}
|
||||
|
||||
dp_priv = (struct intel_dp_priv *)(intel_encoder + 1);
|
||||
|
||||
connector = &intel_encoder->base;
|
||||
connector = &intel_connector->base;
|
||||
drm_connector_init(dev, connector, &intel_dp_connector_funcs,
|
||||
DRM_MODE_CONNECTOR_DisplayPort);
|
||||
drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs);
|
||||
|
@ -1349,7 +1421,7 @@ intel_dp_init(struct drm_device *dev, int output_reg)
|
|||
DRM_MODE_ENCODER_TMDS);
|
||||
drm_encoder_helper_add(&intel_encoder->enc, &intel_dp_helper_funcs);
|
||||
|
||||
drm_mode_connector_attach_encoder(&intel_encoder->base,
|
||||
drm_mode_connector_attach_encoder(&intel_connector->base,
|
||||
&intel_encoder->enc);
|
||||
drm_sysfs_connector_add(connector);
|
||||
|
||||
|
@ -1378,7 +1450,7 @@ intel_dp_init(struct drm_device *dev, int output_reg)
|
|||
break;
|
||||
}
|
||||
|
||||
intel_dp_i2c_init(intel_encoder, name);
|
||||
intel_dp_i2c_init(intel_encoder, intel_connector, name);
|
||||
|
||||
intel_encoder->ddc_bus = &dp_priv->adapter;
|
||||
intel_encoder->hot_plug = intel_dp_hot_plug;
|
||||
|
|
|
@ -96,8 +96,6 @@ struct intel_framebuffer {
|
|||
|
||||
|
||||
struct intel_encoder {
|
||||
struct drm_connector base;
|
||||
|
||||
struct drm_encoder enc;
|
||||
int type;
|
||||
struct i2c_adapter *i2c_bus;
|
||||
|
@ -110,6 +108,11 @@ struct intel_encoder {
|
|||
int clone_mask;
|
||||
};
|
||||
|
||||
struct intel_connector {
|
||||
struct drm_connector base;
|
||||
void *dev_priv;
|
||||
};
|
||||
|
||||
struct intel_crtc;
|
||||
struct intel_overlay {
|
||||
struct drm_device *dev;
|
||||
|
@ -149,17 +152,18 @@ struct intel_crtc {
|
|||
bool lowfreq_avail;
|
||||
struct intel_overlay *overlay;
|
||||
struct intel_unpin_work *unpin_work;
|
||||
int fdi_lanes;
|
||||
};
|
||||
|
||||
#define to_intel_crtc(x) container_of(x, struct intel_crtc, base)
|
||||
#define to_intel_encoder(x) container_of(x, struct intel_encoder, base)
|
||||
#define to_intel_connector(x) container_of(x, struct intel_connector, base)
|
||||
#define enc_to_intel_encoder(x) container_of(x, struct intel_encoder, enc)
|
||||
#define to_intel_framebuffer(x) container_of(x, struct intel_framebuffer, base)
|
||||
|
||||
struct i2c_adapter *intel_i2c_create(struct drm_device *dev, const u32 reg,
|
||||
const char *name);
|
||||
void intel_i2c_destroy(struct i2c_adapter *adapter);
|
||||
int intel_ddc_get_modes(struct intel_encoder *intel_encoder);
|
||||
int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter);
|
||||
extern bool intel_ddc_probe(struct intel_encoder *intel_encoder);
|
||||
void intel_i2c_quirk_set(struct drm_device *dev, bool enable);
|
||||
void intel_i2c_reset_gmbus(struct drm_device *dev);
|
||||
|
@ -183,7 +187,7 @@ extern void intel_crtc_load_lut(struct drm_crtc *crtc);
|
|||
extern void intel_encoder_prepare (struct drm_encoder *encoder);
|
||||
extern void intel_encoder_commit (struct drm_encoder *encoder);
|
||||
|
||||
extern struct drm_encoder *intel_best_encoder(struct drm_connector *connector);
|
||||
extern struct drm_encoder *intel_attached_encoder(struct drm_connector *connector);
|
||||
|
||||
extern struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev,
|
||||
struct drm_crtc *crtc);
|
||||
|
@ -192,9 +196,11 @@ int intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data,
|
|||
extern void intel_wait_for_vblank(struct drm_device *dev);
|
||||
extern struct drm_crtc *intel_get_crtc_from_pipe(struct drm_device *dev, int pipe);
|
||||
extern struct drm_crtc *intel_get_load_detect_pipe(struct intel_encoder *intel_encoder,
|
||||
struct drm_connector *connector,
|
||||
struct drm_display_mode *mode,
|
||||
int *dpms_mode);
|
||||
extern void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder,
|
||||
struct drm_connector *connector,
|
||||
int dpms_mode);
|
||||
|
||||
extern struct drm_connector* intel_sdvo_find(struct drm_device *dev, int sdvoB);
|
||||
|
|
|
@ -96,39 +96,11 @@ static void intel_dvo_dpms(struct drm_encoder *encoder, int mode)
|
|||
}
|
||||
}
|
||||
|
||||
static void intel_dvo_save(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = connector->dev->dev_private;
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct intel_dvo_device *dvo = intel_encoder->dev_priv;
|
||||
|
||||
/* Each output should probably just save the registers it touches,
|
||||
* but for now, use more overkill.
|
||||
*/
|
||||
dev_priv->saveDVOA = I915_READ(DVOA);
|
||||
dev_priv->saveDVOB = I915_READ(DVOB);
|
||||
dev_priv->saveDVOC = I915_READ(DVOC);
|
||||
|
||||
dvo->dev_ops->save(dvo);
|
||||
}
|
||||
|
||||
static void intel_dvo_restore(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = connector->dev->dev_private;
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct intel_dvo_device *dvo = intel_encoder->dev_priv;
|
||||
|
||||
dvo->dev_ops->restore(dvo);
|
||||
|
||||
I915_WRITE(DVOA, dev_priv->saveDVOA);
|
||||
I915_WRITE(DVOB, dev_priv->saveDVOB);
|
||||
I915_WRITE(DVOC, dev_priv->saveDVOC);
|
||||
}
|
||||
|
||||
static int intel_dvo_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct intel_dvo_device *dvo = intel_encoder->dev_priv;
|
||||
|
||||
if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
||||
|
@ -241,7 +213,8 @@ static void intel_dvo_mode_set(struct drm_encoder *encoder,
|
|||
*/
|
||||
static enum drm_connector_status intel_dvo_detect(struct drm_connector *connector)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct intel_dvo_device *dvo = intel_encoder->dev_priv;
|
||||
|
||||
return dvo->dev_ops->detect(dvo);
|
||||
|
@ -249,7 +222,8 @@ static enum drm_connector_status intel_dvo_detect(struct drm_connector *connecto
|
|||
|
||||
static int intel_dvo_get_modes(struct drm_connector *connector)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct intel_dvo_device *dvo = intel_encoder->dev_priv;
|
||||
|
||||
/* We should probably have an i2c driver get_modes function for those
|
||||
|
@ -257,7 +231,7 @@ static int intel_dvo_get_modes(struct drm_connector *connector)
|
|||
* (TV-out, for example), but for now with just TMDS and LVDS,
|
||||
* that's not the case.
|
||||
*/
|
||||
intel_ddc_get_modes(intel_encoder);
|
||||
intel_ddc_get_modes(connector, intel_encoder->ddc_bus);
|
||||
if (!list_empty(&connector->probed_modes))
|
||||
return 1;
|
||||
|
||||
|
@ -275,39 +249,11 @@ static int intel_dvo_get_modes(struct drm_connector *connector)
|
|||
|
||||
static void intel_dvo_destroy (struct drm_connector *connector)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct intel_dvo_device *dvo = intel_encoder->dev_priv;
|
||||
|
||||
if (dvo) {
|
||||
if (dvo->dev_ops->destroy)
|
||||
dvo->dev_ops->destroy(dvo);
|
||||
if (dvo->panel_fixed_mode)
|
||||
kfree(dvo->panel_fixed_mode);
|
||||
/* no need, in i830_dvoices[] now */
|
||||
//kfree(dvo);
|
||||
}
|
||||
if (intel_encoder->i2c_bus)
|
||||
intel_i2c_destroy(intel_encoder->i2c_bus);
|
||||
if (intel_encoder->ddc_bus)
|
||||
intel_i2c_destroy(intel_encoder->ddc_bus);
|
||||
drm_sysfs_connector_remove(connector);
|
||||
drm_connector_cleanup(connector);
|
||||
kfree(intel_encoder);
|
||||
kfree(connector);
|
||||
}
|
||||
|
||||
#ifdef RANDR_GET_CRTC_INTERFACE
|
||||
static struct drm_crtc *intel_dvo_get_crtc(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct intel_dvo_device *dvo = intel_encoder->dev_priv;
|
||||
int pipe = !!(I915_READ(dvo->dvo_reg) & SDVO_PIPE_B_SELECT);
|
||||
|
||||
return intel_pipe_to_crtc(pScrn, pipe);
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct drm_encoder_helper_funcs intel_dvo_helper_funcs = {
|
||||
.dpms = intel_dvo_dpms,
|
||||
.mode_fixup = intel_dvo_mode_fixup,
|
||||
|
@ -318,8 +264,6 @@ static const struct drm_encoder_helper_funcs intel_dvo_helper_funcs = {
|
|||
|
||||
static const struct drm_connector_funcs intel_dvo_connector_funcs = {
|
||||
.dpms = drm_helper_connector_dpms,
|
||||
.save = intel_dvo_save,
|
||||
.restore = intel_dvo_restore,
|
||||
.detect = intel_dvo_detect,
|
||||
.destroy = intel_dvo_destroy,
|
||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||
|
@ -328,12 +272,26 @@ static const struct drm_connector_funcs intel_dvo_connector_funcs = {
|
|||
static const struct drm_connector_helper_funcs intel_dvo_connector_helper_funcs = {
|
||||
.mode_valid = intel_dvo_mode_valid,
|
||||
.get_modes = intel_dvo_get_modes,
|
||||
.best_encoder = intel_best_encoder,
|
||||
.best_encoder = intel_attached_encoder,
|
||||
};
|
||||
|
||||
static void intel_dvo_enc_destroy(struct drm_encoder *encoder)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct intel_dvo_device *dvo = intel_encoder->dev_priv;
|
||||
|
||||
if (dvo) {
|
||||
if (dvo->dev_ops->destroy)
|
||||
dvo->dev_ops->destroy(dvo);
|
||||
if (dvo->panel_fixed_mode)
|
||||
kfree(dvo->panel_fixed_mode);
|
||||
}
|
||||
if (intel_encoder->i2c_bus)
|
||||
intel_i2c_destroy(intel_encoder->i2c_bus);
|
||||
if (intel_encoder->ddc_bus)
|
||||
intel_i2c_destroy(intel_encoder->ddc_bus);
|
||||
drm_encoder_cleanup(encoder);
|
||||
kfree(intel_encoder);
|
||||
}
|
||||
|
||||
static const struct drm_encoder_funcs intel_dvo_enc_funcs = {
|
||||
|
@ -352,7 +310,8 @@ intel_dvo_get_current_mode (struct drm_connector *connector)
|
|||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct intel_dvo_device *dvo = intel_encoder->dev_priv;
|
||||
uint32_t dvo_reg = dvo->dvo_reg;
|
||||
uint32_t dvo_val = I915_READ(dvo_reg);
|
||||
|
@ -384,6 +343,7 @@ intel_dvo_get_current_mode (struct drm_connector *connector)
|
|||
void intel_dvo_init(struct drm_device *dev)
|
||||
{
|
||||
struct intel_encoder *intel_encoder;
|
||||
struct intel_connector *intel_connector;
|
||||
struct intel_dvo_device *dvo;
|
||||
struct i2c_adapter *i2cbus = NULL;
|
||||
int ret = 0;
|
||||
|
@ -393,6 +353,12 @@ void intel_dvo_init(struct drm_device *dev)
|
|||
if (!intel_encoder)
|
||||
return;
|
||||
|
||||
intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
|
||||
if (!intel_connector) {
|
||||
kfree(intel_encoder);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Set up the DDC bus */
|
||||
intel_encoder->ddc_bus = intel_i2c_create(dev, GPIOD, "DVODDC_D");
|
||||
if (!intel_encoder->ddc_bus)
|
||||
|
@ -400,7 +366,7 @@ void intel_dvo_init(struct drm_device *dev)
|
|||
|
||||
/* Now, try to find a controller */
|
||||
for (i = 0; i < ARRAY_SIZE(intel_dvo_devices); i++) {
|
||||
struct drm_connector *connector = &intel_encoder->base;
|
||||
struct drm_connector *connector = &intel_connector->base;
|
||||
int gpio;
|
||||
|
||||
dvo = &intel_dvo_devices[i];
|
||||
|
@ -471,7 +437,7 @@ void intel_dvo_init(struct drm_device *dev)
|
|||
drm_encoder_helper_add(&intel_encoder->enc,
|
||||
&intel_dvo_helper_funcs);
|
||||
|
||||
drm_mode_connector_attach_encoder(&intel_encoder->base,
|
||||
drm_mode_connector_attach_encoder(&intel_connector->base,
|
||||
&intel_encoder->enc);
|
||||
if (dvo->type == INTEL_DVO_CHIP_LVDS) {
|
||||
/* For our LVDS chipsets, we should hopefully be able
|
||||
|
@ -496,4 +462,5 @@ void intel_dvo_init(struct drm_device *dev)
|
|||
intel_i2c_destroy(i2cbus);
|
||||
free_intel:
|
||||
kfree(intel_encoder);
|
||||
kfree(intel_connector);
|
||||
}
|
||||
|
|
|
@ -39,7 +39,6 @@
|
|||
|
||||
struct intel_hdmi_priv {
|
||||
u32 sdvox_reg;
|
||||
u32 save_SDVOX;
|
||||
bool has_hdmi_sink;
|
||||
};
|
||||
|
||||
|
@ -63,8 +62,12 @@ static void intel_hdmi_mode_set(struct drm_encoder *encoder,
|
|||
if (hdmi_priv->has_hdmi_sink)
|
||||
sdvox |= SDVO_AUDIO_ENABLE;
|
||||
|
||||
if (intel_crtc->pipe == 1)
|
||||
sdvox |= SDVO_PIPE_B_SELECT;
|
||||
if (intel_crtc->pipe == 1) {
|
||||
if (HAS_PCH_CPT(dev))
|
||||
sdvox |= PORT_TRANS_B_SEL_CPT;
|
||||
else
|
||||
sdvox |= SDVO_PIPE_B_SELECT;
|
||||
}
|
||||
|
||||
I915_WRITE(hdmi_priv->sdvox_reg, sdvox);
|
||||
POSTING_READ(hdmi_priv->sdvox_reg);
|
||||
|
@ -106,27 +109,6 @@ static void intel_hdmi_dpms(struct drm_encoder *encoder, int mode)
|
|||
}
|
||||
}
|
||||
|
||||
static void intel_hdmi_save(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct intel_hdmi_priv *hdmi_priv = intel_encoder->dev_priv;
|
||||
|
||||
hdmi_priv->save_SDVOX = I915_READ(hdmi_priv->sdvox_reg);
|
||||
}
|
||||
|
||||
static void intel_hdmi_restore(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct intel_hdmi_priv *hdmi_priv = intel_encoder->dev_priv;
|
||||
|
||||
I915_WRITE(hdmi_priv->sdvox_reg, hdmi_priv->save_SDVOX);
|
||||
POSTING_READ(hdmi_priv->sdvox_reg);
|
||||
}
|
||||
|
||||
static int intel_hdmi_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
|
@ -151,13 +133,14 @@ static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder,
|
|||
static enum drm_connector_status
|
||||
intel_hdmi_detect(struct drm_connector *connector)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct intel_hdmi_priv *hdmi_priv = intel_encoder->dev_priv;
|
||||
struct edid *edid = NULL;
|
||||
enum drm_connector_status status = connector_status_disconnected;
|
||||
|
||||
hdmi_priv->has_hdmi_sink = false;
|
||||
edid = drm_get_edid(&intel_encoder->base,
|
||||
edid = drm_get_edid(connector,
|
||||
intel_encoder->ddc_bus);
|
||||
|
||||
if (edid) {
|
||||
|
@ -165,7 +148,7 @@ intel_hdmi_detect(struct drm_connector *connector)
|
|||
status = connector_status_connected;
|
||||
hdmi_priv->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
|
||||
}
|
||||
intel_encoder->base.display_info.raw_edid = NULL;
|
||||
connector->display_info.raw_edid = NULL;
|
||||
kfree(edid);
|
||||
}
|
||||
|
||||
|
@ -174,24 +157,21 @@ intel_hdmi_detect(struct drm_connector *connector)
|
|||
|
||||
static int intel_hdmi_get_modes(struct drm_connector *connector)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
|
||||
/* We should parse the EDID data and find out if it's an HDMI sink so
|
||||
* we can send audio to it.
|
||||
*/
|
||||
|
||||
return intel_ddc_get_modes(intel_encoder);
|
||||
return intel_ddc_get_modes(connector, intel_encoder->ddc_bus);
|
||||
}
|
||||
|
||||
static void intel_hdmi_destroy(struct drm_connector *connector)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
|
||||
if (intel_encoder->i2c_bus)
|
||||
intel_i2c_destroy(intel_encoder->i2c_bus);
|
||||
drm_sysfs_connector_remove(connector);
|
||||
drm_connector_cleanup(connector);
|
||||
kfree(intel_encoder);
|
||||
kfree(connector);
|
||||
}
|
||||
|
||||
static const struct drm_encoder_helper_funcs intel_hdmi_helper_funcs = {
|
||||
|
@ -204,8 +184,6 @@ static const struct drm_encoder_helper_funcs intel_hdmi_helper_funcs = {
|
|||
|
||||
static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
|
||||
.dpms = drm_helper_connector_dpms,
|
||||
.save = intel_hdmi_save,
|
||||
.restore = intel_hdmi_restore,
|
||||
.detect = intel_hdmi_detect,
|
||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||
.destroy = intel_hdmi_destroy,
|
||||
|
@ -214,12 +192,17 @@ static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
|
|||
static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
|
||||
.get_modes = intel_hdmi_get_modes,
|
||||
.mode_valid = intel_hdmi_mode_valid,
|
||||
.best_encoder = intel_best_encoder,
|
||||
.best_encoder = intel_attached_encoder,
|
||||
};
|
||||
|
||||
static void intel_hdmi_enc_destroy(struct drm_encoder *encoder)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
|
||||
if (intel_encoder->i2c_bus)
|
||||
intel_i2c_destroy(intel_encoder->i2c_bus);
|
||||
drm_encoder_cleanup(encoder);
|
||||
kfree(intel_encoder);
|
||||
}
|
||||
|
||||
static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
|
||||
|
@ -231,15 +214,23 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
|
|||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct drm_connector *connector;
|
||||
struct intel_encoder *intel_encoder;
|
||||
struct intel_connector *intel_connector;
|
||||
struct intel_hdmi_priv *hdmi_priv;
|
||||
|
||||
intel_encoder = kcalloc(sizeof(struct intel_encoder) +
|
||||
sizeof(struct intel_hdmi_priv), 1, GFP_KERNEL);
|
||||
if (!intel_encoder)
|
||||
return;
|
||||
|
||||
intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
|
||||
if (!intel_connector) {
|
||||
kfree(intel_encoder);
|
||||
return;
|
||||
}
|
||||
|
||||
hdmi_priv = (struct intel_hdmi_priv *)(intel_encoder + 1);
|
||||
|
||||
connector = &intel_encoder->base;
|
||||
connector = &intel_connector->base;
|
||||
drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
|
||||
DRM_MODE_CONNECTOR_HDMIA);
|
||||
drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);
|
||||
|
@ -285,7 +276,7 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
|
|||
DRM_MODE_ENCODER_TMDS);
|
||||
drm_encoder_helper_add(&intel_encoder->enc, &intel_hdmi_helper_funcs);
|
||||
|
||||
drm_mode_connector_attach_encoder(&intel_encoder->base,
|
||||
drm_mode_connector_attach_encoder(&intel_connector->base,
|
||||
&intel_encoder->enc);
|
||||
drm_sysfs_connector_add(connector);
|
||||
|
||||
|
@ -303,6 +294,7 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
|
|||
err_connector:
|
||||
drm_connector_cleanup(connector);
|
||||
kfree(intel_encoder);
|
||||
kfree(intel_connector);
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -139,75 +139,6 @@ static void intel_lvds_dpms(struct drm_encoder *encoder, int mode)
|
|||
/* XXX: We never power down the LVDS pairs. */
|
||||
}
|
||||
|
||||
static void intel_lvds_save(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
u32 pp_on_reg, pp_off_reg, pp_ctl_reg, pp_div_reg;
|
||||
u32 pwm_ctl_reg;
|
||||
|
||||
if (HAS_PCH_SPLIT(dev)) {
|
||||
pp_on_reg = PCH_PP_ON_DELAYS;
|
||||
pp_off_reg = PCH_PP_OFF_DELAYS;
|
||||
pp_ctl_reg = PCH_PP_CONTROL;
|
||||
pp_div_reg = PCH_PP_DIVISOR;
|
||||
pwm_ctl_reg = BLC_PWM_CPU_CTL;
|
||||
} else {
|
||||
pp_on_reg = PP_ON_DELAYS;
|
||||
pp_off_reg = PP_OFF_DELAYS;
|
||||
pp_ctl_reg = PP_CONTROL;
|
||||
pp_div_reg = PP_DIVISOR;
|
||||
pwm_ctl_reg = BLC_PWM_CTL;
|
||||
}
|
||||
|
||||
dev_priv->savePP_ON = I915_READ(pp_on_reg);
|
||||
dev_priv->savePP_OFF = I915_READ(pp_off_reg);
|
||||
dev_priv->savePP_CONTROL = I915_READ(pp_ctl_reg);
|
||||
dev_priv->savePP_DIVISOR = I915_READ(pp_div_reg);
|
||||
dev_priv->saveBLC_PWM_CTL = I915_READ(pwm_ctl_reg);
|
||||
dev_priv->backlight_duty_cycle = (dev_priv->saveBLC_PWM_CTL &
|
||||
BACKLIGHT_DUTY_CYCLE_MASK);
|
||||
|
||||
/*
|
||||
* If the light is off at server startup, just make it full brightness
|
||||
*/
|
||||
if (dev_priv->backlight_duty_cycle == 0)
|
||||
dev_priv->backlight_duty_cycle =
|
||||
intel_lvds_get_max_backlight(dev);
|
||||
}
|
||||
|
||||
static void intel_lvds_restore(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
u32 pp_on_reg, pp_off_reg, pp_ctl_reg, pp_div_reg;
|
||||
u32 pwm_ctl_reg;
|
||||
|
||||
if (HAS_PCH_SPLIT(dev)) {
|
||||
pp_on_reg = PCH_PP_ON_DELAYS;
|
||||
pp_off_reg = PCH_PP_OFF_DELAYS;
|
||||
pp_ctl_reg = PCH_PP_CONTROL;
|
||||
pp_div_reg = PCH_PP_DIVISOR;
|
||||
pwm_ctl_reg = BLC_PWM_CPU_CTL;
|
||||
} else {
|
||||
pp_on_reg = PP_ON_DELAYS;
|
||||
pp_off_reg = PP_OFF_DELAYS;
|
||||
pp_ctl_reg = PP_CONTROL;
|
||||
pp_div_reg = PP_DIVISOR;
|
||||
pwm_ctl_reg = BLC_PWM_CTL;
|
||||
}
|
||||
|
||||
I915_WRITE(pwm_ctl_reg, dev_priv->saveBLC_PWM_CTL);
|
||||
I915_WRITE(pp_on_reg, dev_priv->savePP_ON);
|
||||
I915_WRITE(pp_off_reg, dev_priv->savePP_OFF);
|
||||
I915_WRITE(pp_div_reg, dev_priv->savePP_DIVISOR);
|
||||
I915_WRITE(pp_ctl_reg, dev_priv->savePP_CONTROL);
|
||||
if (dev_priv->savePP_CONTROL & POWER_TARGET_ON)
|
||||
intel_lvds_set_power(dev, true);
|
||||
else
|
||||
intel_lvds_set_power(dev, false);
|
||||
}
|
||||
|
||||
static int intel_lvds_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
|
@ -635,12 +566,13 @@ static enum drm_connector_status intel_lvds_detect(struct drm_connector *connect
|
|||
static int intel_lvds_get_modes(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
int ret = 0;
|
||||
|
||||
if (dev_priv->lvds_edid_good) {
|
||||
ret = intel_ddc_get_modes(intel_encoder);
|
||||
ret = intel_ddc_get_modes(connector, intel_encoder->ddc_bus);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -717,11 +649,8 @@ static int intel_lid_notify(struct notifier_block *nb, unsigned long val,
|
|||
static void intel_lvds_destroy(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
|
||||
if (intel_encoder->ddc_bus)
|
||||
intel_i2c_destroy(intel_encoder->ddc_bus);
|
||||
if (dev_priv->lid_notifier.notifier_call)
|
||||
acpi_lid_notifier_unregister(&dev_priv->lid_notifier);
|
||||
drm_sysfs_connector_remove(connector);
|
||||
|
@ -734,13 +663,14 @@ static int intel_lvds_set_property(struct drm_connector *connector,
|
|||
uint64_t value)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct intel_encoder *intel_encoder =
|
||||
to_intel_encoder(connector);
|
||||
|
||||
if (property == dev->mode_config.scaling_mode_property &&
|
||||
connector->encoder) {
|
||||
struct drm_crtc *crtc = connector->encoder->crtc;
|
||||
struct drm_encoder *encoder = connector->encoder;
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct intel_lvds_priv *lvds_priv = intel_encoder->dev_priv;
|
||||
|
||||
if (value == DRM_MODE_SCALE_NONE) {
|
||||
DRM_DEBUG_KMS("no scaling not supported\n");
|
||||
return 0;
|
||||
|
@ -774,13 +704,11 @@ static const struct drm_encoder_helper_funcs intel_lvds_helper_funcs = {
|
|||
static const struct drm_connector_helper_funcs intel_lvds_connector_helper_funcs = {
|
||||
.get_modes = intel_lvds_get_modes,
|
||||
.mode_valid = intel_lvds_mode_valid,
|
||||
.best_encoder = intel_best_encoder,
|
||||
.best_encoder = intel_attached_encoder,
|
||||
};
|
||||
|
||||
static const struct drm_connector_funcs intel_lvds_connector_funcs = {
|
||||
.dpms = drm_helper_connector_dpms,
|
||||
.save = intel_lvds_save,
|
||||
.restore = intel_lvds_restore,
|
||||
.detect = intel_lvds_detect,
|
||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||
.set_property = intel_lvds_set_property,
|
||||
|
@ -790,7 +718,12 @@ static const struct drm_connector_funcs intel_lvds_connector_funcs = {
|
|||
|
||||
static void intel_lvds_enc_destroy(struct drm_encoder *encoder)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
|
||||
if (intel_encoder->ddc_bus)
|
||||
intel_i2c_destroy(intel_encoder->ddc_bus);
|
||||
drm_encoder_cleanup(encoder);
|
||||
kfree(intel_encoder);
|
||||
}
|
||||
|
||||
static const struct drm_encoder_funcs intel_lvds_enc_funcs = {
|
||||
|
@ -979,6 +912,7 @@ void intel_lvds_init(struct drm_device *dev)
|
|||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct intel_encoder *intel_encoder;
|
||||
struct intel_connector *intel_connector;
|
||||
struct drm_connector *connector;
|
||||
struct drm_encoder *encoder;
|
||||
struct drm_display_mode *scan; /* *modes, *bios_mode; */
|
||||
|
@ -1012,19 +946,27 @@ void intel_lvds_init(struct drm_device *dev)
|
|||
return;
|
||||
}
|
||||
|
||||
connector = &intel_encoder->base;
|
||||
intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
|
||||
if (!intel_connector) {
|
||||
kfree(intel_encoder);
|
||||
return;
|
||||
}
|
||||
|
||||
connector = &intel_connector->base;
|
||||
encoder = &intel_encoder->enc;
|
||||
drm_connector_init(dev, &intel_encoder->base, &intel_lvds_connector_funcs,
|
||||
drm_connector_init(dev, &intel_connector->base, &intel_lvds_connector_funcs,
|
||||
DRM_MODE_CONNECTOR_LVDS);
|
||||
|
||||
drm_encoder_init(dev, &intel_encoder->enc, &intel_lvds_enc_funcs,
|
||||
DRM_MODE_ENCODER_LVDS);
|
||||
|
||||
drm_mode_connector_attach_encoder(&intel_encoder->base, &intel_encoder->enc);
|
||||
drm_mode_connector_attach_encoder(&intel_connector->base, &intel_encoder->enc);
|
||||
intel_encoder->type = INTEL_OUTPUT_LVDS;
|
||||
|
||||
intel_encoder->clone_mask = (1 << INTEL_LVDS_CLONE_BIT);
|
||||
intel_encoder->crtc_mask = (1 << 1);
|
||||
if (IS_I965G(dev))
|
||||
intel_encoder->crtc_mask |= (1 << 0);
|
||||
drm_encoder_helper_add(encoder, &intel_lvds_helper_funcs);
|
||||
drm_connector_helper_add(connector, &intel_lvds_connector_helper_funcs);
|
||||
connector->display_info.subpixel_order = SubPixelHorizontalRGB;
|
||||
|
@ -1039,7 +981,7 @@ void intel_lvds_init(struct drm_device *dev)
|
|||
* the initial panel fitting mode will be FULL_SCREEN.
|
||||
*/
|
||||
|
||||
drm_connector_attach_property(&intel_encoder->base,
|
||||
drm_connector_attach_property(&intel_connector->base,
|
||||
dev->mode_config.scaling_mode_property,
|
||||
DRM_MODE_SCALE_FULLSCREEN);
|
||||
lvds_priv->fitting_mode = DRM_MODE_SCALE_FULLSCREEN;
|
||||
|
@ -1067,7 +1009,7 @@ void intel_lvds_init(struct drm_device *dev)
|
|||
*/
|
||||
dev_priv->lvds_edid_good = true;
|
||||
|
||||
if (!intel_ddc_get_modes(intel_encoder))
|
||||
if (!intel_ddc_get_modes(connector, intel_encoder->ddc_bus))
|
||||
dev_priv->lvds_edid_good = false;
|
||||
|
||||
list_for_each_entry(scan, &connector->probed_modes, head) {
|
||||
|
@ -1151,4 +1093,5 @@ failed:
|
|||
drm_connector_cleanup(connector);
|
||||
drm_encoder_cleanup(encoder);
|
||||
kfree(intel_encoder);
|
||||
kfree(intel_connector);
|
||||
}
|
||||
|
|
|
@ -54,9 +54,9 @@ bool intel_ddc_probe(struct intel_encoder *intel_encoder)
|
|||
}
|
||||
};
|
||||
|
||||
intel_i2c_quirk_set(intel_encoder->base.dev, true);
|
||||
intel_i2c_quirk_set(intel_encoder->enc.dev, true);
|
||||
ret = i2c_transfer(intel_encoder->ddc_bus, msgs, 2);
|
||||
intel_i2c_quirk_set(intel_encoder->base.dev, false);
|
||||
intel_i2c_quirk_set(intel_encoder->enc.dev, false);
|
||||
if (ret == 2)
|
||||
return true;
|
||||
|
||||
|
@ -66,22 +66,23 @@ bool intel_ddc_probe(struct intel_encoder *intel_encoder)
|
|||
/**
|
||||
* intel_ddc_get_modes - get modelist from monitor
|
||||
* @connector: DRM connector device to use
|
||||
* @adapter: i2c adapter
|
||||
*
|
||||
* Fetch the EDID information from @connector using the DDC bus.
|
||||
*/
|
||||
int intel_ddc_get_modes(struct intel_encoder *intel_encoder)
|
||||
int intel_ddc_get_modes(struct drm_connector *connector,
|
||||
struct i2c_adapter *adapter)
|
||||
{
|
||||
struct edid *edid;
|
||||
int ret = 0;
|
||||
|
||||
intel_i2c_quirk_set(intel_encoder->base.dev, true);
|
||||
edid = drm_get_edid(&intel_encoder->base, intel_encoder->ddc_bus);
|
||||
intel_i2c_quirk_set(intel_encoder->base.dev, false);
|
||||
intel_i2c_quirk_set(connector->dev, true);
|
||||
edid = drm_get_edid(connector, adapter);
|
||||
intel_i2c_quirk_set(connector->dev, false);
|
||||
if (edid) {
|
||||
drm_mode_connector_update_edid_property(&intel_encoder->base,
|
||||
edid);
|
||||
ret = drm_add_edid_modes(&intel_encoder->base, edid);
|
||||
intel_encoder->base.display_info.raw_edid = NULL;
|
||||
drm_mode_connector_update_edid_property(connector, edid);
|
||||
ret = drm_add_edid_modes(connector, edid);
|
||||
connector->display_info.raw_edid = NULL;
|
||||
kfree(edid);
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -916,143 +916,6 @@ intel_tv_dpms(struct drm_encoder *encoder, int mode)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
intel_tv_save(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct intel_tv_priv *tv_priv = intel_encoder->dev_priv;
|
||||
int i;
|
||||
|
||||
tv_priv->save_TV_H_CTL_1 = I915_READ(TV_H_CTL_1);
|
||||
tv_priv->save_TV_H_CTL_2 = I915_READ(TV_H_CTL_2);
|
||||
tv_priv->save_TV_H_CTL_3 = I915_READ(TV_H_CTL_3);
|
||||
tv_priv->save_TV_V_CTL_1 = I915_READ(TV_V_CTL_1);
|
||||
tv_priv->save_TV_V_CTL_2 = I915_READ(TV_V_CTL_2);
|
||||
tv_priv->save_TV_V_CTL_3 = I915_READ(TV_V_CTL_3);
|
||||
tv_priv->save_TV_V_CTL_4 = I915_READ(TV_V_CTL_4);
|
||||
tv_priv->save_TV_V_CTL_5 = I915_READ(TV_V_CTL_5);
|
||||
tv_priv->save_TV_V_CTL_6 = I915_READ(TV_V_CTL_6);
|
||||
tv_priv->save_TV_V_CTL_7 = I915_READ(TV_V_CTL_7);
|
||||
tv_priv->save_TV_SC_CTL_1 = I915_READ(TV_SC_CTL_1);
|
||||
tv_priv->save_TV_SC_CTL_2 = I915_READ(TV_SC_CTL_2);
|
||||
tv_priv->save_TV_SC_CTL_3 = I915_READ(TV_SC_CTL_3);
|
||||
|
||||
tv_priv->save_TV_CSC_Y = I915_READ(TV_CSC_Y);
|
||||
tv_priv->save_TV_CSC_Y2 = I915_READ(TV_CSC_Y2);
|
||||
tv_priv->save_TV_CSC_U = I915_READ(TV_CSC_U);
|
||||
tv_priv->save_TV_CSC_U2 = I915_READ(TV_CSC_U2);
|
||||
tv_priv->save_TV_CSC_V = I915_READ(TV_CSC_V);
|
||||
tv_priv->save_TV_CSC_V2 = I915_READ(TV_CSC_V2);
|
||||
tv_priv->save_TV_CLR_KNOBS = I915_READ(TV_CLR_KNOBS);
|
||||
tv_priv->save_TV_CLR_LEVEL = I915_READ(TV_CLR_LEVEL);
|
||||
tv_priv->save_TV_WIN_POS = I915_READ(TV_WIN_POS);
|
||||
tv_priv->save_TV_WIN_SIZE = I915_READ(TV_WIN_SIZE);
|
||||
tv_priv->save_TV_FILTER_CTL_1 = I915_READ(TV_FILTER_CTL_1);
|
||||
tv_priv->save_TV_FILTER_CTL_2 = I915_READ(TV_FILTER_CTL_2);
|
||||
tv_priv->save_TV_FILTER_CTL_3 = I915_READ(TV_FILTER_CTL_3);
|
||||
|
||||
for (i = 0; i < 60; i++)
|
||||
tv_priv->save_TV_H_LUMA[i] = I915_READ(TV_H_LUMA_0 + (i <<2));
|
||||
for (i = 0; i < 60; i++)
|
||||
tv_priv->save_TV_H_CHROMA[i] = I915_READ(TV_H_CHROMA_0 + (i <<2));
|
||||
for (i = 0; i < 43; i++)
|
||||
tv_priv->save_TV_V_LUMA[i] = I915_READ(TV_V_LUMA_0 + (i <<2));
|
||||
for (i = 0; i < 43; i++)
|
||||
tv_priv->save_TV_V_CHROMA[i] = I915_READ(TV_V_CHROMA_0 + (i <<2));
|
||||
|
||||
tv_priv->save_TV_DAC = I915_READ(TV_DAC);
|
||||
tv_priv->save_TV_CTL = I915_READ(TV_CTL);
|
||||
}
|
||||
|
||||
static void
|
||||
intel_tv_restore(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct intel_tv_priv *tv_priv = intel_encoder->dev_priv;
|
||||
struct drm_crtc *crtc = connector->encoder->crtc;
|
||||
struct intel_crtc *intel_crtc;
|
||||
int i;
|
||||
|
||||
/* FIXME: No CRTC? */
|
||||
if (!crtc)
|
||||
return;
|
||||
|
||||
intel_crtc = to_intel_crtc(crtc);
|
||||
I915_WRITE(TV_H_CTL_1, tv_priv->save_TV_H_CTL_1);
|
||||
I915_WRITE(TV_H_CTL_2, tv_priv->save_TV_H_CTL_2);
|
||||
I915_WRITE(TV_H_CTL_3, tv_priv->save_TV_H_CTL_3);
|
||||
I915_WRITE(TV_V_CTL_1, tv_priv->save_TV_V_CTL_1);
|
||||
I915_WRITE(TV_V_CTL_2, tv_priv->save_TV_V_CTL_2);
|
||||
I915_WRITE(TV_V_CTL_3, tv_priv->save_TV_V_CTL_3);
|
||||
I915_WRITE(TV_V_CTL_4, tv_priv->save_TV_V_CTL_4);
|
||||
I915_WRITE(TV_V_CTL_5, tv_priv->save_TV_V_CTL_5);
|
||||
I915_WRITE(TV_V_CTL_6, tv_priv->save_TV_V_CTL_6);
|
||||
I915_WRITE(TV_V_CTL_7, tv_priv->save_TV_V_CTL_7);
|
||||
I915_WRITE(TV_SC_CTL_1, tv_priv->save_TV_SC_CTL_1);
|
||||
I915_WRITE(TV_SC_CTL_2, tv_priv->save_TV_SC_CTL_2);
|
||||
I915_WRITE(TV_SC_CTL_3, tv_priv->save_TV_SC_CTL_3);
|
||||
|
||||
I915_WRITE(TV_CSC_Y, tv_priv->save_TV_CSC_Y);
|
||||
I915_WRITE(TV_CSC_Y2, tv_priv->save_TV_CSC_Y2);
|
||||
I915_WRITE(TV_CSC_U, tv_priv->save_TV_CSC_U);
|
||||
I915_WRITE(TV_CSC_U2, tv_priv->save_TV_CSC_U2);
|
||||
I915_WRITE(TV_CSC_V, tv_priv->save_TV_CSC_V);
|
||||
I915_WRITE(TV_CSC_V2, tv_priv->save_TV_CSC_V2);
|
||||
I915_WRITE(TV_CLR_KNOBS, tv_priv->save_TV_CLR_KNOBS);
|
||||
I915_WRITE(TV_CLR_LEVEL, tv_priv->save_TV_CLR_LEVEL);
|
||||
|
||||
{
|
||||
int pipeconf_reg = (intel_crtc->pipe == 0) ?
|
||||
PIPEACONF : PIPEBCONF;
|
||||
int dspcntr_reg = (intel_crtc->plane == 0) ?
|
||||
DSPACNTR : DSPBCNTR;
|
||||
int pipeconf = I915_READ(pipeconf_reg);
|
||||
int dspcntr = I915_READ(dspcntr_reg);
|
||||
int dspbase_reg = (intel_crtc->plane == 0) ?
|
||||
DSPAADDR : DSPBADDR;
|
||||
/* Pipe must be off here */
|
||||
I915_WRITE(dspcntr_reg, dspcntr & ~DISPLAY_PLANE_ENABLE);
|
||||
/* Flush the plane changes */
|
||||
I915_WRITE(dspbase_reg, I915_READ(dspbase_reg));
|
||||
|
||||
if (!IS_I9XX(dev)) {
|
||||
/* Wait for vblank for the disable to take effect */
|
||||
intel_wait_for_vblank(dev);
|
||||
}
|
||||
|
||||
I915_WRITE(pipeconf_reg, pipeconf & ~PIPEACONF_ENABLE);
|
||||
/* Wait for vblank for the disable to take effect. */
|
||||
intel_wait_for_vblank(dev);
|
||||
|
||||
/* Filter ctl must be set before TV_WIN_SIZE */
|
||||
I915_WRITE(TV_FILTER_CTL_1, tv_priv->save_TV_FILTER_CTL_1);
|
||||
I915_WRITE(TV_FILTER_CTL_2, tv_priv->save_TV_FILTER_CTL_2);
|
||||
I915_WRITE(TV_FILTER_CTL_3, tv_priv->save_TV_FILTER_CTL_3);
|
||||
I915_WRITE(TV_WIN_POS, tv_priv->save_TV_WIN_POS);
|
||||
I915_WRITE(TV_WIN_SIZE, tv_priv->save_TV_WIN_SIZE);
|
||||
I915_WRITE(pipeconf_reg, pipeconf);
|
||||
I915_WRITE(dspcntr_reg, dspcntr);
|
||||
/* Flush the plane changes */
|
||||
I915_WRITE(dspbase_reg, I915_READ(dspbase_reg));
|
||||
}
|
||||
|
||||
for (i = 0; i < 60; i++)
|
||||
I915_WRITE(TV_H_LUMA_0 + (i <<2), tv_priv->save_TV_H_LUMA[i]);
|
||||
for (i = 0; i < 60; i++)
|
||||
I915_WRITE(TV_H_CHROMA_0 + (i <<2), tv_priv->save_TV_H_CHROMA[i]);
|
||||
for (i = 0; i < 43; i++)
|
||||
I915_WRITE(TV_V_LUMA_0 + (i <<2), tv_priv->save_TV_V_LUMA[i]);
|
||||
for (i = 0; i < 43; i++)
|
||||
I915_WRITE(TV_V_CHROMA_0 + (i <<2), tv_priv->save_TV_V_CHROMA[i]);
|
||||
|
||||
I915_WRITE(TV_DAC, tv_priv->save_TV_DAC);
|
||||
I915_WRITE(TV_CTL, tv_priv->save_TV_CTL);
|
||||
}
|
||||
|
||||
static const struct tv_mode *
|
||||
intel_tv_mode_lookup (char *tv_format)
|
||||
{
|
||||
|
@ -1078,7 +941,8 @@ intel_tv_mode_find (struct intel_encoder *intel_encoder)
|
|||
static enum drm_mode_status
|
||||
intel_tv_mode_valid(struct drm_connector *connector, struct drm_display_mode *mode)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
const struct tv_mode *tv_mode = intel_tv_mode_find(intel_encoder);
|
||||
|
||||
/* Ensure TV refresh is close to desired refresh */
|
||||
|
@ -1399,6 +1263,15 @@ intel_tv_detect_type (struct drm_crtc *crtc, struct intel_encoder *intel_encoder
|
|||
DAC_A_0_7_V |
|
||||
DAC_B_0_7_V |
|
||||
DAC_C_0_7_V);
|
||||
|
||||
/*
|
||||
* The TV sense state should be cleared to zero on cantiga platform. Otherwise
|
||||
* the TV is misdetected. This is hardware requirement.
|
||||
*/
|
||||
if (IS_GM45(dev))
|
||||
tv_dac &= ~(TVDAC_STATE_CHG_EN | TVDAC_A_SENSE_CTL |
|
||||
TVDAC_B_SENSE_CTL | TVDAC_C_SENSE_CTL);
|
||||
|
||||
I915_WRITE(TV_CTL, tv_ctl);
|
||||
I915_WRITE(TV_DAC, tv_dac);
|
||||
intel_wait_for_vblank(dev);
|
||||
|
@ -1441,7 +1314,8 @@ intel_tv_detect_type (struct drm_crtc *crtc, struct intel_encoder *intel_encoder
|
|||
*/
|
||||
static void intel_tv_find_better_format(struct drm_connector *connector)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct intel_tv_priv *tv_priv = intel_encoder->dev_priv;
|
||||
const struct tv_mode *tv_mode = intel_tv_mode_find(intel_encoder);
|
||||
int i;
|
||||
|
@ -1475,9 +1349,9 @@ intel_tv_detect(struct drm_connector *connector)
|
|||
{
|
||||
struct drm_crtc *crtc;
|
||||
struct drm_display_mode mode;
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct intel_tv_priv *tv_priv = intel_encoder->dev_priv;
|
||||
struct drm_encoder *encoder = &intel_encoder->enc;
|
||||
int dpms_mode;
|
||||
int type = tv_priv->type;
|
||||
|
||||
|
@ -1487,10 +1361,12 @@ intel_tv_detect(struct drm_connector *connector)
|
|||
if (encoder->crtc && encoder->crtc->enabled) {
|
||||
type = intel_tv_detect_type(encoder->crtc, intel_encoder);
|
||||
} else {
|
||||
crtc = intel_get_load_detect_pipe(intel_encoder, &mode, &dpms_mode);
|
||||
crtc = intel_get_load_detect_pipe(intel_encoder, connector,
|
||||
&mode, &dpms_mode);
|
||||
if (crtc) {
|
||||
type = intel_tv_detect_type(crtc, intel_encoder);
|
||||
intel_release_load_detect_pipe(intel_encoder, dpms_mode);
|
||||
intel_release_load_detect_pipe(intel_encoder, connector,
|
||||
dpms_mode);
|
||||
} else
|
||||
type = -1;
|
||||
}
|
||||
|
@ -1525,7 +1401,8 @@ static void
|
|||
intel_tv_chose_preferred_modes(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode_ptr)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
const struct tv_mode *tv_mode = intel_tv_mode_find(intel_encoder);
|
||||
|
||||
if (tv_mode->nbr_end < 480 && mode_ptr->vdisplay == 480)
|
||||
|
@ -1550,7 +1427,8 @@ static int
|
|||
intel_tv_get_modes(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_display_mode *mode_ptr;
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
const struct tv_mode *tv_mode = intel_tv_mode_find(intel_encoder);
|
||||
int j, count = 0;
|
||||
u64 tmp;
|
||||
|
@ -1604,11 +1482,9 @@ intel_tv_get_modes(struct drm_connector *connector)
|
|||
static void
|
||||
intel_tv_destroy (struct drm_connector *connector)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
|
||||
drm_sysfs_connector_remove(connector);
|
||||
drm_connector_cleanup(connector);
|
||||
kfree(intel_encoder);
|
||||
kfree(connector);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1617,9 +1493,9 @@ intel_tv_set_property(struct drm_connector *connector, struct drm_property *prop
|
|||
uint64_t val)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct intel_encoder *intel_encoder = to_intel_encoder(connector);
|
||||
struct drm_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
struct intel_tv_priv *tv_priv = intel_encoder->dev_priv;
|
||||
struct drm_encoder *encoder = &intel_encoder->enc;
|
||||
struct drm_crtc *crtc = encoder->crtc;
|
||||
int ret = 0;
|
||||
bool changed = false;
|
||||
|
@ -1676,8 +1552,6 @@ static const struct drm_encoder_helper_funcs intel_tv_helper_funcs = {
|
|||
|
||||
static const struct drm_connector_funcs intel_tv_connector_funcs = {
|
||||
.dpms = drm_helper_connector_dpms,
|
||||
.save = intel_tv_save,
|
||||
.restore = intel_tv_restore,
|
||||
.detect = intel_tv_detect,
|
||||
.destroy = intel_tv_destroy,
|
||||
.set_property = intel_tv_set_property,
|
||||
|
@ -1687,12 +1561,15 @@ static const struct drm_connector_funcs intel_tv_connector_funcs = {
|
|||
static const struct drm_connector_helper_funcs intel_tv_connector_helper_funcs = {
|
||||
.mode_valid = intel_tv_mode_valid,
|
||||
.get_modes = intel_tv_get_modes,
|
||||
.best_encoder = intel_best_encoder,
|
||||
.best_encoder = intel_attached_encoder,
|
||||
};
|
||||
|
||||
static void intel_tv_enc_destroy(struct drm_encoder *encoder)
|
||||
{
|
||||
struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
|
||||
|
||||
drm_encoder_cleanup(encoder);
|
||||
kfree(intel_encoder);
|
||||
}
|
||||
|
||||
static const struct drm_encoder_funcs intel_tv_enc_funcs = {
|
||||
|
@ -1741,6 +1618,7 @@ intel_tv_init(struct drm_device *dev)
|
|||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct drm_connector *connector;
|
||||
struct intel_encoder *intel_encoder;
|
||||
struct intel_connector *intel_connector;
|
||||
struct intel_tv_priv *tv_priv;
|
||||
u32 tv_dac_on, tv_dac_off, save_tv_dac;
|
||||
char **tv_format_names;
|
||||
|
@ -1786,7 +1664,13 @@ intel_tv_init(struct drm_device *dev)
|
|||
return;
|
||||
}
|
||||
|
||||
connector = &intel_encoder->base;
|
||||
intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
|
||||
if (!intel_connector) {
|
||||
kfree(intel_encoder);
|
||||
return;
|
||||
}
|
||||
|
||||
connector = &intel_connector->base;
|
||||
|
||||
drm_connector_init(dev, connector, &intel_tv_connector_funcs,
|
||||
DRM_MODE_CONNECTOR_SVIDEO);
|
||||
|
@ -1794,7 +1678,7 @@ intel_tv_init(struct drm_device *dev)
|
|||
drm_encoder_init(dev, &intel_encoder->enc, &intel_tv_enc_funcs,
|
||||
DRM_MODE_ENCODER_TVDAC);
|
||||
|
||||
drm_mode_connector_attach_encoder(&intel_encoder->base, &intel_encoder->enc);
|
||||
drm_mode_connector_attach_encoder(&intel_connector->base, &intel_encoder->enc);
|
||||
tv_priv = (struct intel_tv_priv *)(intel_encoder + 1);
|
||||
intel_encoder->type = INTEL_OUTPUT_TVOUT;
|
||||
intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
|
||||
|
|
Loading…
Reference in New Issue