Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
5f3dbedf
Commit
5f3dbedf
authored
Apr 03, 2009
by
Dave Airlie
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'drm-intel-next' of ../anholt-2.6 into drm-linus
parents
7a1fb5d0
1055f9dd
Changes
16
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
292 additions
and
123 deletions
+292
-123
drivers/gpu/drm/drm_gem.c
drivers/gpu/drm/drm_gem.c
+1
-6
drivers/gpu/drm/drm_sysfs.c
drivers/gpu/drm/drm_sysfs.c
+1
-0
drivers/gpu/drm/i915/i915_dma.c
drivers/gpu/drm/i915/i915_dma.c
+1
-8
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_drv.h
+5
-0
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem.c
+29
-9
drivers/gpu/drm/i915/i915_gem_debug.c
drivers/gpu/drm/i915/i915_gem_debug.c
+2
-0
drivers/gpu/drm/i915/i915_gem_debugfs.c
drivers/gpu/drm/i915/i915_gem_debugfs.c
+6
-0
drivers/gpu/drm/i915/i915_gem_tiling.c
drivers/gpu/drm/i915/i915_gem_tiling.c
+16
-0
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/i915/i915_irq.c
+62
-5
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/i915_reg.h
+11
-0
drivers/gpu/drm/i915/intel_crt.c
drivers/gpu/drm/i915/intel_crt.c
+2
-2
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_display.c
+21
-1
drivers/gpu/drm/i915/intel_modes.c
drivers/gpu/drm/i915/intel_modes.c
+1
-0
drivers/gpu/drm/i915/intel_sdvo.c
drivers/gpu/drm/i915/intel_sdvo.c
+108
-85
drivers/gpu/drm/i915/intel_sdvo_regs.h
drivers/gpu/drm/i915/intel_sdvo_regs.h
+3
-0
drivers/gpu/drm/i915/intel_tv.c
drivers/gpu/drm/i915/intel_tv.c
+23
-7
No files found.
drivers/gpu/drm/drm_gem.c
View file @
5f3dbedf
...
...
@@ -505,7 +505,6 @@ int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
struct
drm_local_map
*
map
=
NULL
;
struct
drm_gem_object
*
obj
;
struct
drm_hash_item
*
hash
;
unsigned
long
prot
;
int
ret
=
0
;
mutex_lock
(
&
dev
->
struct_mutex
);
...
...
@@ -538,11 +537,7 @@ int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
vma
->
vm_ops
=
obj
->
dev
->
driver
->
gem_vm_ops
;
vma
->
vm_private_data
=
map
->
handle
;
/* FIXME: use pgprot_writecombine when available */
prot
=
pgprot_val
(
vma
->
vm_page_prot
);
#ifdef CONFIG_X86
prot
|=
_PAGE_CACHE_WC
;
#endif
vma
->
vm_page_prot
=
__pgprot
(
prot
);
vma
->
vm_page_prot
=
pgprot_writecombine
(
vma
->
vm_page_prot
);
/* Take a ref for this mapping of the object, so that the fault
* handler can dereference the mmap offset's pointer to the object.
...
...
drivers/gpu/drm/drm_sysfs.c
View file @
5f3dbedf
...
...
@@ -451,6 +451,7 @@ void drm_sysfs_hotplug_event(struct drm_device *dev)
kobject_uevent_env
(
&
dev
->
primary
->
kdev
.
kobj
,
KOBJ_CHANGE
,
envp
);
}
EXPORT_SYMBOL
(
drm_sysfs_hotplug_event
);
/**
* drm_sysfs_device_add - adds a class device to sysfs for a character driver
...
...
drivers/gpu/drm/i915/i915_dma.c
View file @
5f3dbedf
...
...
@@ -922,7 +922,7 @@ static int i915_probe_agp(struct drm_device *dev, unsigned long *aperture_size,
* Some of the preallocated space is taken by the GTT
* and popup. GTT is 1K per MB of aperture size, and popup is 4K.
*/
if
(
IS_G4X
(
dev
))
if
(
IS_G4X
(
dev
)
||
IS_IGD
(
dev
)
)
overhead
=
4096
;
else
overhead
=
(
*
aperture_size
/
1024
)
+
4096
;
...
...
@@ -1030,13 +1030,6 @@ static int i915_load_modeset_init(struct drm_device *dev)
if
(
ret
)
goto
destroy_ringbuffer
;
/* FIXME: re-add hotplug support */
#if 0
ret = drm_hotplug_init(dev);
if (ret)
goto destroy_ringbuffer;
#endif
/* Always safe in the mode setting case. */
/* FIXME: do pre/post-mode set stuff in core KMS code */
dev
->
vblank_disable_allowed
=
1
;
...
...
drivers/gpu/drm/i915/i915_drv.h
View file @
5f3dbedf
...
...
@@ -159,6 +159,9 @@ typedef struct drm_i915_private {
u32
irq_mask_reg
;
u32
pipestat
[
2
];
u32
hotplug_supported_mask
;
struct
work_struct
hotplug_work
;
int
tex_lru_log_granularity
;
int
allow_batchbuffer
;
struct
mem_block
*
agp_heap
;
...
...
@@ -297,6 +300,7 @@ typedef struct drm_i915_private {
*
* A reference is held on the buffer while on this list.
*/
spinlock_t
active_list_lock
;
struct
list_head
active_list
;
/**
...
...
@@ -810,6 +814,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
#define HAS_128_BYTE_Y_TILING(dev) (IS_I9XX(dev) && !(IS_I915G(dev) || \
IS_I915GM(dev)))
#define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev))
#define I915_HAS_HOTPLUG(dev) (IS_I945G(dev) || IS_I945GM(dev) || IS_I965G(dev))
#define PRIMARY_RINGBUFFER_SIZE (128*1024)
...
...
drivers/gpu/drm/i915/i915_gem.c
View file @
5f3dbedf
...
...
@@ -1072,6 +1072,7 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
case
-
EAGAIN
:
return
VM_FAULT_OOM
;
case
-
EFAULT
:
case
-
EINVAL
:
return
VM_FAULT_SIGBUS
;
default:
return
VM_FAULT_NOPAGE
;
...
...
@@ -1324,8 +1325,10 @@ i915_gem_object_move_to_active(struct drm_gem_object *obj, uint32_t seqno)
obj_priv
->
active
=
1
;
}
/* Move from whatever list we were on to the tail of execution. */
spin_lock
(
&
dev_priv
->
mm
.
active_list_lock
);
list_move_tail
(
&
obj_priv
->
list
,
&
dev_priv
->
mm
.
active_list
);
spin_unlock
(
&
dev_priv
->
mm
.
active_list_lock
);
obj_priv
->
last_rendering_seqno
=
seqno
;
}
...
...
@@ -1467,6 +1470,7 @@ i915_gem_retire_request(struct drm_device *dev,
/* Move any buffers on the active list that are no longer referenced
* by the ringbuffer to the flushing/inactive lists as appropriate.
*/
spin_lock
(
&
dev_priv
->
mm
.
active_list_lock
);
while
(
!
list_empty
(
&
dev_priv
->
mm
.
active_list
))
{
struct
drm_gem_object
*
obj
;
struct
drm_i915_gem_object
*
obj_priv
;
...
...
@@ -1481,7 +1485,7 @@ i915_gem_retire_request(struct drm_device *dev,
* this seqno.
*/
if
(
obj_priv
->
last_rendering_seqno
!=
request
->
seqno
)
return
;
goto
out
;
#if WATCH_LRU
DRM_INFO
(
"%s: retire %d moves to inactive list %p
\n
"
,
...
...
@@ -1493,6 +1497,8 @@ i915_gem_retire_request(struct drm_device *dev,
else
i915_gem_object_move_to_inactive
(
obj
);
}
out:
spin_unlock
(
&
dev_priv
->
mm
.
active_list_lock
);
}
/**
...
...
@@ -1990,20 +1996,23 @@ static void i830_write_fence_reg(struct drm_i915_fence_reg *reg)
int
regnum
=
obj_priv
->
fence_reg
;
uint32_t
val
;
uint32_t
pitch_val
;
uint32_t
fence_size_bits
;
if
((
obj_priv
->
gtt_offset
&
~
I
915
_FENCE_START_MASK
)
||
if
((
obj_priv
->
gtt_offset
&
~
I
830
_FENCE_START_MASK
)
||
(
obj_priv
->
gtt_offset
&
(
obj
->
size
-
1
)))
{
WARN
(
1
,
"%s: object 0x%08x not
1M
or size aligned
\n
"
,
WARN
(
1
,
"%s: object 0x%08x not
512K
or size aligned
\n
"
,
__func__
,
obj_priv
->
gtt_offset
);
return
;
}
pitch_val
=
(
obj_priv
->
stride
/
128
)
-
1
;
WARN_ON
(
pitch_val
&
~
0x0000000f
);
val
=
obj_priv
->
gtt_offset
;
if
(
obj_priv
->
tiling_mode
==
I915_TILING_Y
)
val
|=
1
<<
I830_FENCE_TILING_Y_SHIFT
;
val
|=
I830_FENCE_SIZE_BITS
(
obj
->
size
);
fence_size_bits
=
I830_FENCE_SIZE_BITS
(
obj
->
size
);
WARN_ON
(
fence_size_bits
&
~
0x00000f00
);
val
|=
fence_size_bits
;
val
|=
pitch_val
<<
I830_FENCE_PITCH_SHIFT
;
val
|=
I830_FENCE_REG_VALID
;
...
...
@@ -2194,7 +2203,7 @@ i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, unsigned alignment)
return
-
EBUSY
;
if
(
alignment
==
0
)
alignment
=
i915_gem_get_gtt_alignment
(
obj
);
if
(
alignment
&
(
PAGE_SIZE
-
1
))
{
if
(
alignment
&
(
i915_gem_get_gtt_alignment
(
obj
)
-
1
))
{
DRM_ERROR
(
"Invalid object alignment requested %u
\n
"
,
alignment
);
return
-
EINVAL
;
}
...
...
@@ -2211,15 +2220,20 @@ i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, unsigned alignment)
}
}
if
(
obj_priv
->
gtt_space
==
NULL
)
{
bool
lists_empty
;
/* If the gtt is empty and we're still having trouble
* fitting our object in, we're out of memory.
*/
#if WATCH_LRU
DRM_INFO
(
"%s: GTT full, evicting something
\n
"
,
__func__
);
#endif
if
(
list_empty
(
&
dev_priv
->
mm
.
inactive_list
)
&&
list_empty
(
&
dev_priv
->
mm
.
flushing_list
)
&&
list_empty
(
&
dev_priv
->
mm
.
active_list
))
{
spin_lock
(
&
dev_priv
->
mm
.
active_list_lock
);
lists_empty
=
(
list_empty
(
&
dev_priv
->
mm
.
inactive_list
)
&&
list_empty
(
&
dev_priv
->
mm
.
flushing_list
)
&&
list_empty
(
&
dev_priv
->
mm
.
active_list
));
spin_unlock
(
&
dev_priv
->
mm
.
active_list_lock
);
if
(
lists_empty
)
{
DRM_ERROR
(
"GTT full, but LRU list empty
\n
"
);
return
-
ENOMEM
;
}
...
...
@@ -3675,6 +3689,7 @@ i915_gem_idle(struct drm_device *dev)
i915_gem_retire_requests
(
dev
);
spin_lock
(
&
dev_priv
->
mm
.
active_list_lock
);
if
(
!
dev_priv
->
mm
.
wedged
)
{
/* Active and flushing should now be empty as we've
* waited for a sequence higher than any pending execbuffer
...
...
@@ -3701,6 +3716,7 @@ i915_gem_idle(struct drm_device *dev)
obj_priv
->
obj
->
write_domain
&=
~
I915_GEM_GPU_DOMAINS
;
i915_gem_object_move_to_inactive
(
obj_priv
->
obj
);
}
spin_unlock
(
&
dev_priv
->
mm
.
active_list_lock
);
while
(
!
list_empty
(
&
dev_priv
->
mm
.
flushing_list
))
{
struct
drm_i915_gem_object
*
obj_priv
;
...
...
@@ -3949,7 +3965,10 @@ i915_gem_entervt_ioctl(struct drm_device *dev, void *data,
if
(
ret
!=
0
)
return
ret
;
spin_lock
(
&
dev_priv
->
mm
.
active_list_lock
);
BUG_ON
(
!
list_empty
(
&
dev_priv
->
mm
.
active_list
));
spin_unlock
(
&
dev_priv
->
mm
.
active_list_lock
);
BUG_ON
(
!
list_empty
(
&
dev_priv
->
mm
.
flushing_list
));
BUG_ON
(
!
list_empty
(
&
dev_priv
->
mm
.
inactive_list
));
BUG_ON
(
!
list_empty
(
&
dev_priv
->
mm
.
request_list
));
...
...
@@ -3993,6 +4012,7 @@ i915_gem_load(struct drm_device *dev)
{
drm_i915_private_t
*
dev_priv
=
dev
->
dev_private
;
spin_lock_init
(
&
dev_priv
->
mm
.
active_list_lock
);
INIT_LIST_HEAD
(
&
dev_priv
->
mm
.
active_list
);
INIT_LIST_HEAD
(
&
dev_priv
->
mm
.
flushing_list
);
INIT_LIST_HEAD
(
&
dev_priv
->
mm
.
inactive_list
);
...
...
drivers/gpu/drm/i915/i915_gem_debug.c
View file @
5f3dbedf
...
...
@@ -105,12 +105,14 @@ i915_dump_lru(struct drm_device *dev, const char *where)
struct
drm_i915_gem_object
*
obj_priv
;
DRM_INFO
(
"active list %s {
\n
"
,
where
);
spin_lock
(
&
dev_priv
->
mm
.
active_list_lock
);
list_for_each_entry
(
obj_priv
,
&
dev_priv
->
mm
.
active_list
,
list
)
{
DRM_INFO
(
" %p: %08x
\n
"
,
obj_priv
,
obj_priv
->
last_rendering_seqno
);
}
spin_unlock
(
&
dev_priv
->
mm
.
active_list_lock
);
DRM_INFO
(
"}
\n
"
);
DRM_INFO
(
"flushing list %s {
\n
"
,
where
);
list_for_each_entry
(
obj_priv
,
&
dev_priv
->
mm
.
flushing_list
,
...
...
drivers/gpu/drm/i915/i915_gem_debugfs.c
View file @
5f3dbedf
...
...
@@ -69,10 +69,13 @@ static int i915_gem_object_list_info(struct seq_file *m, void *data)
struct
drm_device
*
dev
=
node
->
minor
->
dev
;
drm_i915_private_t
*
dev_priv
=
dev
->
dev_private
;
struct
drm_i915_gem_object
*
obj_priv
;
spinlock_t
*
lock
=
NULL
;
switch
(
list
)
{
case
ACTIVE_LIST
:
seq_printf
(
m
,
"Active:
\n
"
);
lock
=
&
dev_priv
->
mm
.
active_list_lock
;
spin_lock
(
lock
);
head
=
&
dev_priv
->
mm
.
active_list
;
break
;
case
INACTIVE_LIST
:
...
...
@@ -104,6 +107,9 @@ static int i915_gem_object_list_info(struct seq_file *m, void *data)
seq_printf
(
m
,
" (fence: %d
\n
"
,
obj_priv
->
fence_reg
);
seq_printf
(
m
,
"
\n
"
);
}
if
(
lock
)
spin_unlock
(
lock
);
return
0
;
}
...
...
drivers/gpu/drm/i915/i915_gem_tiling.c
View file @
5f3dbedf
...
...
@@ -216,6 +216,22 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode)
else
tile_width
=
512
;
/* check maximum stride & object size */
if
(
IS_I965G
(
dev
))
{
/* i965 stores the end address of the gtt mapping in the fence
* reg, so dont bother to check the size */
if
(
stride
/
128
>
I965_FENCE_MAX_PITCH_VAL
)
return
false
;
}
else
if
(
IS_I9XX
(
dev
))
{
if
(
stride
/
tile_width
>
I830_FENCE_MAX_PITCH_VAL
||
size
>
(
I830_FENCE_MAX_SIZE_VAL
<<
20
))
return
false
;
}
else
{
if
(
stride
/
128
>
I830_FENCE_MAX_PITCH_VAL
||
size
>
(
I830_FENCE_MAX_SIZE_VAL
<<
19
))
return
false
;
}
/* 965+ just needs multiples of tile width */
if
(
IS_I965G
(
dev
))
{
if
(
stride
&
(
tile_width
-
1
))
...
...
drivers/gpu/drm/i915/i915_irq.c
View file @
5f3dbedf
...
...
@@ -48,10 +48,6 @@
/** Interrupts that we mask and unmask at runtime. */
#define I915_INTERRUPT_ENABLE_VAR (I915_USER_INTERRUPT)
/** These are all of the interrupts used by the driver */
#define I915_INTERRUPT_ENABLE_MASK (I915_INTERRUPT_ENABLE_FIX | \
I915_INTERRUPT_ENABLE_VAR)
#define I915_PIPE_VBLANK_STATUS (PIPE_START_VBLANK_INTERRUPT_STATUS |\
PIPE_VBLANK_INTERRUPT_STATUS)
...
...
@@ -187,6 +183,19 @@ u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe)
return
I915_READ
(
reg
);
}
/*
* Handle hotplug events outside the interrupt handler proper.
*/
static
void
i915_hotplug_work_func
(
struct
work_struct
*
work
)
{
drm_i915_private_t
*
dev_priv
=
container_of
(
work
,
drm_i915_private_t
,
hotplug_work
);
struct
drm_device
*
dev
=
dev_priv
->
dev
;
/* Just fire off a uevent and let userspace tell us what to do */
drm_sysfs_hotplug_event
(
dev
);
}
irqreturn_t
i915_driver_irq_handler
(
DRM_IRQ_ARGS
)
{
struct
drm_device
*
dev
=
(
struct
drm_device
*
)
arg
;
...
...
@@ -244,6 +253,20 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
ret
=
IRQ_HANDLED
;
/* Consume port. Then clear IIR or we'll miss events */
if
((
I915_HAS_HOTPLUG
(
dev
))
&&
(
iir
&
I915_DISPLAY_PORT_INTERRUPT
))
{
u32
hotplug_status
=
I915_READ
(
PORT_HOTPLUG_STAT
);
DRM_DEBUG
(
"hotplug event received, stat 0x%08x
\n
"
,
hotplug_status
);
if
(
hotplug_status
&
dev_priv
->
hotplug_supported_mask
)
schedule_work
(
&
dev_priv
->
hotplug_work
);
I915_WRITE
(
PORT_HOTPLUG_STAT
,
hotplug_status
);
I915_READ
(
PORT_HOTPLUG_STAT
);
}
I915_WRITE
(
IIR
,
iir
);
new_iir
=
I915_READ
(
IIR
);
/* Flush posted writes */
...
...
@@ -528,17 +551,24 @@ void i915_driver_irq_preinstall(struct drm_device * dev)
atomic_set
(
&
dev_priv
->
irq_received
,
0
);
if
(
I915_HAS_HOTPLUG
(
dev
))
{
I915_WRITE
(
PORT_HOTPLUG_EN
,
0
);
I915_WRITE
(
PORT_HOTPLUG_STAT
,
I915_READ
(
PORT_HOTPLUG_STAT
));
}
I915_WRITE
(
HWSTAM
,
0xeffe
);
I915_WRITE
(
PIPEASTAT
,
0
);
I915_WRITE
(
PIPEBSTAT
,
0
);
I915_WRITE
(
IMR
,
0xffffffff
);
I915_WRITE
(
IER
,
0x0
);
(
void
)
I915_READ
(
IER
);
INIT_WORK
(
&
dev_priv
->
hotplug_work
,
i915_hotplug_work_func
);
}
int
i915_driver_irq_postinstall
(
struct
drm_device
*
dev
)
{
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
u32
enable_mask
=
I915_INTERRUPT_ENABLE_FIX
|
I915_INTERRUPT_ENABLE_VAR
;
dev_priv
->
vblank_pipe
=
DRM_I915_VBLANK_PIPE_A
|
DRM_I915_VBLANK_PIPE_B
;
...
...
@@ -550,13 +580,35 @@ int i915_driver_irq_postinstall(struct drm_device *dev)
dev_priv
->
pipestat
[
0
]
=
0
;
dev_priv
->
pipestat
[
1
]
=
0
;
if
(
I915_HAS_HOTPLUG
(
dev
))
{
u32
hotplug_en
=
I915_READ
(
PORT_HOTPLUG_EN
);
/* Leave other bits alone */
hotplug_en
|=
HOTPLUG_EN_MASK
;
I915_WRITE
(
PORT_HOTPLUG_EN
,
hotplug_en
);
dev_priv
->
hotplug_supported_mask
=
CRT_HOTPLUG_INT_STATUS
|
TV_HOTPLUG_INT_STATUS
|
SDVOC_HOTPLUG_INT_STATUS
|
SDVOB_HOTPLUG_INT_STATUS
;
if
(
IS_G4X
(
dev
))
{
dev_priv
->
hotplug_supported_mask
|=
HDMIB_HOTPLUG_INT_STATUS
|
HDMIC_HOTPLUG_INT_STATUS
|
HDMID_HOTPLUG_INT_STATUS
;
}
/* Enable in IER... */
enable_mask
|=
I915_DISPLAY_PORT_INTERRUPT
;
/* and unmask in IMR */
i915_enable_irq
(
dev_priv
,
I915_DISPLAY_PORT_INTERRUPT
);
}
/* Disable pipe interrupt enables, clear pending pipe status */
I915_WRITE
(
PIPEASTAT
,
I915_READ
(
PIPEASTAT
)
&
0x8000ffff
);
I915_WRITE
(
PIPEBSTAT
,
I915_READ
(
PIPEBSTAT
)
&
0x8000ffff
);
/* Clear pending interrupt status */
I915_WRITE
(
IIR
,
I915_READ
(
IIR
));
I915_WRITE
(
IER
,
I915_INTERRUPT_ENABLE_MASK
);
I915_WRITE
(
IER
,
enable_mask
);
I915_WRITE
(
IMR
,
dev_priv
->
irq_mask_reg
);
(
void
)
I915_READ
(
IER
);
...
...
@@ -575,6 +627,11 @@ void i915_driver_irq_uninstall(struct drm_device * dev)
dev_priv
->
vblank_pipe
=
0
;
if
(
I915_HAS_HOTPLUG
(
dev
))
{
I915_WRITE
(
PORT_HOTPLUG_EN
,
0
);
I915_WRITE
(
PORT_HOTPLUG_STAT
,
I915_READ
(
PORT_HOTPLUG_STAT
));
}
I915_WRITE
(
HWSTAM
,
0xffffffff
);
I915_WRITE
(
PIPEASTAT
,
0
);
I915_WRITE
(
PIPEBSTAT
,
0
);
...
...
drivers/gpu/drm/i915/i915_reg.h
View file @
5f3dbedf
...
...
@@ -190,6 +190,8 @@
#define I830_FENCE_SIZE_BITS(size) ((ffs((size) >> 19) - 1) << 8)
#define I830_FENCE_PITCH_SHIFT 4
#define I830_FENCE_REG_VALID (1<<0)
#define I830_FENCE_MAX_PITCH_VAL 0x10
#define I830_FENCE_MAX_SIZE_VAL (1<<8)
#define I915_FENCE_START_MASK 0x0ff00000
#define I915_FENCE_SIZE_BITS(size) ((ffs((size) >> 20) - 1) << 8)
...
...
@@ -198,6 +200,7 @@
#define I965_FENCE_PITCH_SHIFT 2
#define I965_FENCE_TILING_Y_SHIFT 1
#define I965_FENCE_REG_VALID (1<<0)
#define I965_FENCE_MAX_PITCH_VAL 0x0400
/*
* Instruction and interrupt control regs
...
...
@@ -648,6 +651,14 @@
#define CRT_HOTPLUG_DETECT_VOLTAGE_325MV (0 << 2)
#define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2)
#define CRT_HOTPLUG_MASK (0x3fc)
/* Bits 9-2 */
#define CRT_FORCE_HOTPLUG_MASK 0xfffffe1f
#define HOTPLUG_EN_MASK (HDMIB_HOTPLUG_INT_EN | \
HDMIC_HOTPLUG_INT_EN | \
HDMID_HOTPLUG_INT_EN | \
SDVOB_HOTPLUG_INT_EN | \
SDVOC_HOTPLUG_INT_EN | \
TV_HOTPLUG_INT_EN | \
CRT_HOTPLUG_INT_EN)
#define PORT_HOTPLUG_STAT 0x61114
...
...
drivers/gpu/drm/i915/intel_crt.c
View file @
5f3dbedf
...
...
@@ -41,7 +41,7 @@ static void intel_crt_dpms(struct drm_encoder *encoder, int mode)
temp
=
I915_READ
(
ADPA
);
temp
&=
~
(
ADPA_HSYNC_CNTL_DISABLE
|
ADPA_VSYNC_CNTL_DISABLE
);
temp
&=
~
ADPA_DAC_ENABLE
;
temp
|=
ADPA_DAC_ENABLE
;
switch
(
mode
)
{
case
DRM_MODE_DPMS_ON
:
...
...
@@ -158,7 +158,7 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)
else
tries
=
1
;
hotplug_en
=
I915_READ
(
PORT_HOTPLUG_EN
);
hotplug_en
&=
~
(
CRT_HOTPLUG_MASK
)
;
hotplug_en
&=
CRT_FORCE_HOTPLUG_MASK
;
hotplug_en
|=
CRT_HOTPLUG_FORCE_DETECT
;
if
(
IS_GM45
(
dev
))
...
...
drivers/gpu/drm/i915/intel_display.c
View file @
5f3dbedf
...
...
@@ -636,7 +636,7 @@ void
intel_wait_for_vblank
(
struct
drm_device
*
dev
)
{
/* Wait for 20ms, i.e. one cycle at 50hz. */
udelay
(
2000
0
);
mdelay
(
2
0
);
}
static
int
...
...
@@ -1106,6 +1106,26 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
return
-
EINVAL
;
}
/* SDVO TV has fixed PLL values depend on its clock range,
this mirrors vbios setting. */
if
(
is_sdvo
&&
is_tv
)
{
if
(
adjusted_mode
->
clock
>=
100000
&&
adjusted_mode
->
clock
<
140500
)
{
clock
.
p1
=
2
;
clock
.
p2
=
10
;
clock
.
n
=
3
;
clock
.
m1
=
16
;
clock
.
m2
=
8
;
}
else
if
(
adjusted_mode
->
clock
>=
140500
&&
adjusted_mode
->
clock
<=
200000
)
{
clock
.
p1
=
1
;
clock
.
p2
=
10
;
clock
.
n
=
6
;
clock
.
m1
=
12
;
clock
.
m2
=
8
;
}
}
if
(
IS_IGD
(
dev
))
fp
=
(
1
<<
clock
.
n
)
<<
16
|
clock
.
m1
<<
8
|
clock
.
m2
;
else
...
...
drivers/gpu/drm/i915/intel_modes.c
View file @
5f3dbedf
...
...
@@ -76,6 +76,7 @@ int intel_ddc_get_modes(struct intel_output *intel_output)
drm_mode_connector_update_edid_property
(
&
intel_output
->
base
,
edid
);
ret
=
drm_add_edid_modes
(
&
intel_output
->
base
,
edid
);
intel_output
->
base
.
display_info
.
raw_edid
=
NULL
;
kfree
(
edid
);
}
...
...
drivers/gpu/drm/i915/intel_sdvo.c
View file @
5f3dbedf
This diff is collapsed.
Click to expand it.
drivers/gpu/drm/i915/intel_sdvo_regs.h
View file @
5f3dbedf
...
...
@@ -100,6 +100,9 @@ struct intel_sdvo_preferred_input_timing_args {
u16
clock
;
u16
width
;
u16
height
;
u8
interlace
:
1
;
u8
scaled
:
1
;
u8
pad
:
6
;
}
__attribute__
((
packed
));
/* I2C registers for SDVO */
...
...
drivers/gpu/drm/i915/intel_tv.c
View file @
5f3dbedf
...
...
@@ -1570,33 +1570,49 @@ intel_tv_set_property(struct drm_connector *connector, struct drm_property *prop
struct
drm_device
*
dev
=
connector
->
dev
;
struct
intel_output
*
intel_output
=
to_intel_output
(
connector
);
struct
intel_tv_priv
*
tv_priv
=
intel_output
->
dev_priv
;
struct
drm_encoder
*
encoder
=
&
intel_output
->
enc
;
struct
drm_crtc
*
crtc
=
encoder
->
crtc
;
int
ret
=
0
;
bool
changed
=
false
;
ret
=
drm_connector_property_set_value
(
connector
,
property
,
val
);
if
(
ret
<
0
)
goto
out
;
if
(
property
==
dev
->
mode_config
.
tv_left_margin_property
)
if
(
property
==
dev
->
mode_config
.
tv_left_margin_property
&&
tv_priv
->
margin
[
TV_MARGIN_LEFT
]
!=
val
)
{
tv_priv
->
margin
[
TV_MARGIN_LEFT
]
=
val
;
else
if
(
property
==
dev
->
mode_config
.
tv_right_margin_property
)
changed
=
true
;
}
else
if
(
property
==
dev
->
mode_config
.
tv_right_margin_property
&&
tv_priv
->
margin
[
TV_MARGIN_RIGHT
]
!=
val
)
{
tv_priv
->
margin
[
TV_MARGIN_RIGHT
]
=
val
;
else
if
(
property
==
dev
->
mode_config
.
tv_top_margin_property
)
changed
=
true
;
}
else
if
(
property
==
dev
->
mode_config
.
tv_top_margin_property
&&
tv_priv
->
margin
[
TV_MARGIN_TOP
]
!=
val
)
{
tv_priv
->
margin
[
TV_MARGIN_TOP
]
=
val
;
else
if
(
property
==
dev
->
mode_config
.
tv_bottom_margin_property
)
changed
=
true
;
}
else
if
(
property
==
dev
->
mode_config
.
tv_bottom_margin_property
&&
tv_priv
->
margin
[
TV_MARGIN_BOTTOM
]
!=
val
)
{
tv_priv
->
margin
[
TV_MARGIN_BOTTOM
]
=
val
;
else
if
(
property
==
dev
->
mode_config
.
tv_mode_property
)
{
changed
=
true
;
}
else
if
(
property
==
dev
->
mode_config
.
tv_mode_property
)
{
if
(
val
>=
NUM_TV_MODES
)
{
ret
=
-
EINVAL
;
goto
out
;
}
if
(
!
strcmp
(
tv_priv
->
tv_format
,
tv_modes
[
val
].
name
))
goto
out
;
tv_priv
->
tv_format
=
tv_modes
[
val
].
name
;
intel_tv_mode_set
(
&
intel_output
->
enc
,
NULL
,
NULL
)
;
changed
=
true
;
}
else
{
ret
=
-
EINVAL
;
goto
out
;
}
intel_tv_mode_set
(
&
intel_output
->
enc
,
NULL
,
NULL
);
if
(
changed
&&
crtc
)
drm_crtc_helper_set_mode
(
crtc
,
&
crtc
->
mode
,
crtc
->
x
,
crtc
->
y
,
crtc
->
fb
);
out:
return
ret
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment