Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
bee4d4ac
Commit
bee4d4ac
authored
Jun 29, 2011
by
Keith Packard
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'drm-intel-fixes' into drm-intel-next
parents
e489bda4
f71d4af4
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
70 additions
and
94 deletions
+70
-94
drivers/gpu/drm/i915/i915_dma.c
drivers/gpu/drm/i915/i915_dma.c
+1
-30
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_drv.c
+0
-8
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_drv.h
+1
-29
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/i915/i915_irq.c
+58
-20
drivers/gpu/drm/i915/intel_overlay.c
drivers/gpu/drm/i915/intel_overlay.c
+10
-7
No files found.
drivers/gpu/drm/i915/i915_dma.c
View file @
bee4d4ac
...
...
@@ -1266,30 +1266,6 @@ static int i915_load_modeset_init(struct drm_device *dev)
intel_modeset_gem_init
(
dev
);
if
(
IS_IVYBRIDGE
(
dev
))
{
/* Share pre & uninstall handlers with ILK/SNB */
dev
->
driver
->
irq_handler
=
ivybridge_irq_handler
;
dev
->
driver
->
irq_preinstall
=
ironlake_irq_preinstall
;
dev
->
driver
->
irq_postinstall
=
ivybridge_irq_postinstall
;
dev
->
driver
->
irq_uninstall
=
ironlake_irq_uninstall
;
dev
->
driver
->
enable_vblank
=
ivybridge_enable_vblank
;
dev
->
driver
->
disable_vblank
=
ivybridge_disable_vblank
;
}
else
if
(
HAS_PCH_SPLIT
(
dev
))
{
dev
->
driver
->
irq_handler
=
ironlake_irq_handler
;
dev
->
driver
->
irq_preinstall
=
ironlake_irq_preinstall
;
dev
->
driver
->
irq_postinstall
=
ironlake_irq_postinstall
;
dev
->
driver
->
irq_uninstall
=
ironlake_irq_uninstall
;
dev
->
driver
->
enable_vblank
=
ironlake_enable_vblank
;
dev
->
driver
->
disable_vblank
=
ironlake_disable_vblank
;
}
else
{
dev
->
driver
->
irq_preinstall
=
i915_driver_irq_preinstall
;
dev
->
driver
->
irq_postinstall
=
i915_driver_irq_postinstall
;
dev
->
driver
->
irq_uninstall
=
i915_driver_irq_uninstall
;
dev
->
driver
->
irq_handler
=
i915_driver_irq_handler
;
dev
->
driver
->
enable_vblank
=
i915_enable_vblank
;
dev
->
driver
->
disable_vblank
=
i915_disable_vblank
;
}
ret
=
drm_irq_install
(
dev
);
if
(
ret
)
goto
cleanup_gem
;
...
...
@@ -2017,12 +1993,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
/* enable GEM by default */
dev_priv
->
has_gem
=
1
;
dev
->
driver
->
get_vblank_counter
=
i915_get_vblank_counter
;
dev
->
max_vblank_count
=
0xffffff
;
/* only 24 bits of frame count */
if
(
IS_G4X
(
dev
)
||
IS_GEN5
(
dev
)
||
IS_GEN6
(
dev
)
||
IS_IVYBRIDGE
(
dev
))
{
dev
->
max_vblank_count
=
0xffffffff
;
/* full 32 bit counter */
dev
->
driver
->
get_vblank_counter
=
gm45_get_vblank_counter
;
}
intel_irq_init
(
dev
);
/* Try to make sure MCHBAR is enabled before poking at it */
intel_setup_mchbar
(
dev
);
...
...
drivers/gpu/drm/i915/i915_drv.c
View file @
bee4d4ac
...
...
@@ -768,14 +768,6 @@ static struct drm_driver driver = {
.
resume
=
i915_resume
,
.
device_is_agp
=
i915_driver_device_is_agp
,
.
enable_vblank
=
i915_enable_vblank
,
.
disable_vblank
=
i915_disable_vblank
,
.
get_vblank_timestamp
=
i915_get_vblank_timestamp
,
.
get_scanout_position
=
i915_get_crtc_scanoutpos
,
.
irq_preinstall
=
i915_driver_irq_preinstall
,
.
irq_postinstall
=
i915_driver_irq_postinstall
,
.
irq_uninstall
=
i915_driver_irq_uninstall
,
.
irq_handler
=
i915_driver_irq_handler
,
.
reclaim_buffers
=
drm_core_reclaim_buffers
,
.
master_create
=
i915_master_create
,
.
master_destroy
=
i915_master_destroy
,
...
...
drivers/gpu/drm/i915/i915_drv.h
View file @
bee4d4ac
...
...
@@ -1032,33 +1032,12 @@ extern int i915_irq_emit(struct drm_device *dev, void *data,
extern
int
i915_irq_wait
(
struct
drm_device
*
dev
,
void
*
data
,
struct
drm_file
*
file_priv
);
extern
irqreturn_t
i915_driver_irq_handler
(
DRM_IRQ_ARGS
);
extern
void
i915_driver_irq_preinstall
(
struct
drm_device
*
dev
);
extern
int
i915_driver_irq_postinstall
(
struct
drm_device
*
dev
);
extern
void
i915_driver_irq_uninstall
(
struct
drm_device
*
dev
);
extern
irqreturn_t
ironlake_irq_handler
(
DRM_IRQ_ARGS
);
extern
void
ironlake_irq_preinstall
(
struct
drm_device
*
dev
);
extern
int
ironlake_irq_postinstall
(
struct
drm_device
*
dev
);
extern
void
ironlake_irq_uninstall
(
struct
drm_device
*
dev
);
extern
irqreturn_t
ivybridge_irq_handler
(
DRM_IRQ_ARGS
);
extern
void
ivybridge_irq_preinstall
(
struct
drm_device
*
dev
);
extern
int
ivybridge_irq_postinstall
(
struct
drm_device
*
dev
);
extern
void
ivybridge_irq_uninstall
(
struct
drm_device
*
dev
);
extern
void
intel_irq_init
(
struct
drm_device
*
dev
);
extern
int
i915_vblank_pipe_set
(
struct
drm_device
*
dev
,
void
*
data
,
struct
drm_file
*
file_priv
);
extern
int
i915_vblank_pipe_get
(
struct
drm_device
*
dev
,
void
*
data
,
struct
drm_file
*
file_priv
);
extern
int
i915_enable_vblank
(
struct
drm_device
*
dev
,
int
crtc
);
extern
void
i915_disable_vblank
(
struct
drm_device
*
dev
,
int
crtc
);
extern
int
ironlake_enable_vblank
(
struct
drm_device
*
dev
,
int
crtc
);
extern
void
ironlake_disable_vblank
(
struct
drm_device
*
dev
,
int
crtc
);
extern
int
ivybridge_enable_vblank
(
struct
drm_device
*
dev
,
int
crtc
);
extern
void
ivybridge_disable_vblank
(
struct
drm_device
*
dev
,
int
crtc
);
extern
u32
i915_get_vblank_counter
(
struct
drm_device
*
dev
,
int
crtc
);
extern
u32
gm45_get_vblank_counter
(
struct
drm_device
*
dev
,
int
crtc
);
extern
int
i915_vblank_swap
(
struct
drm_device
*
dev
,
void
*
data
,
struct
drm_file
*
file_priv
);
...
...
@@ -1069,13 +1048,6 @@ void
i915_disable_pipestat
(
drm_i915_private_t
*
dev_priv
,
int
pipe
,
u32
mask
);
void
intel_enable_asle
(
struct
drm_device
*
dev
);
int
i915_get_vblank_timestamp
(
struct
drm_device
*
dev
,
int
crtc
,
int
*
max_error
,
struct
timeval
*
vblank_time
,
unsigned
flags
);
int
i915_get_crtc_scanoutpos
(
struct
drm_device
*
dev
,
int
pipe
,
int
*
vpos
,
int
*
hpos
);
#ifdef CONFIG_DEBUG_FS
extern
void
i915_destroy_error_state
(
struct
drm_device
*
dev
);
...
...
drivers/gpu/drm/i915/i915_irq.c
View file @
bee4d4ac
...
...
@@ -152,7 +152,7 @@ i915_pipe_enabled(struct drm_device *dev, int pipe)
/* Called from drm generic code, passed a 'crtc', which
* we use as a pipe index
*/
u32
i915_get_vblank_counter
(
struct
drm_device
*
dev
,
int
pipe
)
static
u32
i915_get_vblank_counter
(
struct
drm_device
*
dev
,
int
pipe
)
{
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
unsigned
long
high_frame
;
...
...
@@ -184,7 +184,7 @@ u32 i915_get_vblank_counter(struct drm_device *dev, int pipe)
return
(
high1
<<
8
)
|
low
;
}
u32
gm45_get_vblank_counter
(
struct
drm_device
*
dev
,
int
pipe
)
static
u32
gm45_get_vblank_counter
(
struct
drm_device
*
dev
,
int
pipe
)
{
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
int
reg
=
PIPE_FRMCOUNT_GM45
(
pipe
);
...
...
@@ -198,7 +198,7 @@ u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe)
return
I915_READ
(
reg
);
}
int
i915_get_crtc_scanoutpos
(
struct
drm_device
*
dev
,
int
pipe
,
static
int
i915_get_crtc_scanoutpos
(
struct
drm_device
*
dev
,
int
pipe
,
int
*
vpos
,
int
*
hpos
)
{
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
...
...
@@ -264,7 +264,7 @@ int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe,
return
ret
;
}
int
i915_get_vblank_timestamp
(
struct
drm_device
*
dev
,
int
pipe
,
static
int
i915_get_vblank_timestamp
(
struct
drm_device
*
dev
,
int
pipe
,
int
*
max_error
,
struct
timeval
*
vblank_time
,
unsigned
flags
)
...
...
@@ -464,7 +464,7 @@ static void pch_irq_handler(struct drm_device *dev)
DRM_DEBUG_DRIVER
(
"PCH transcoder A underrun interrupt
\n
"
);
}
irqreturn_t
ivybridge_irq_handler
(
DRM_IRQ_ARGS
)
static
irqreturn_t
ivybridge_irq_handler
(
DRM_IRQ_ARGS
)
{
struct
drm_device
*
dev
=
(
struct
drm_device
*
)
arg
;
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
...
...
@@ -552,7 +552,7 @@ irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS)
return
ret
;
}
irqreturn_t
ironlake_irq_handler
(
DRM_IRQ_ARGS
)
static
irqreturn_t
ironlake_irq_handler
(
DRM_IRQ_ARGS
)
{
struct
drm_device
*
dev
=
(
struct
drm_device
*
)
arg
;
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
...
...
@@ -1211,7 +1211,7 @@ static void i915_pageflip_stall_check(struct drm_device *dev, int pipe)
}
}
irqreturn_t
i915_driver_irq_handler
(
DRM_IRQ_ARGS
)
static
irqreturn_t
i915_driver_irq_handler
(
DRM_IRQ_ARGS
)
{
struct
drm_device
*
dev
=
(
struct
drm_device
*
)
arg
;
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
...
...
@@ -1456,7 +1456,7 @@ int i915_irq_wait(struct drm_device *dev, void *data,
/* Called from drm generic code, passed 'crtc' which
* we use as a pipe index
*/
int
i915_enable_vblank
(
struct
drm_device
*
dev
,
int
pipe
)
static
int
i915_enable_vblank
(
struct
drm_device
*
dev
,
int
pipe
)
{
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
unsigned
long
irqflags
;
...
...
@@ -1480,7 +1480,7 @@ int i915_enable_vblank(struct drm_device *dev, int pipe)
return
0
;
}
int
ironlake_enable_vblank
(
struct
drm_device
*
dev
,
int
pipe
)
static
int
ironlake_enable_vblank
(
struct
drm_device
*
dev
,
int
pipe
)
{
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
unsigned
long
irqflags
;
...
...
@@ -1496,7 +1496,7 @@ int ironlake_enable_vblank(struct drm_device *dev, int pipe)
return
0
;
}
int
ivybridge_enable_vblank
(
struct
drm_device
*
dev
,
int
pipe
)
static
int
ivybridge_enable_vblank
(
struct
drm_device
*
dev
,
int
pipe
)
{
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
unsigned
long
irqflags
;
...
...
@@ -1515,7 +1515,7 @@ int ivybridge_enable_vblank(struct drm_device *dev, int pipe)
/* Called from drm generic code, passed 'crtc' which
* we use as a pipe index
*/
void
i915_disable_vblank
(
struct
drm_device
*
dev
,
int
pipe
)
static
void
i915_disable_vblank
(
struct
drm_device
*
dev
,
int
pipe
)
{
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
unsigned
long
irqflags
;
...
...
@@ -1531,7 +1531,7 @@ void i915_disable_vblank(struct drm_device *dev, int pipe)
spin_unlock_irqrestore
(
&
dev_priv
->
irq_lock
,
irqflags
);
}
void
ironlake_disable_vblank
(
struct
drm_device
*
dev
,
int
pipe
)
static
void
ironlake_disable_vblank
(
struct
drm_device
*
dev
,
int
pipe
)
{
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
unsigned
long
irqflags
;
...
...
@@ -1542,7 +1542,7 @@ void ironlake_disable_vblank(struct drm_device *dev, int pipe)
spin_unlock_irqrestore
(
&
dev_priv
->
irq_lock
,
irqflags
);
}
void
ivybridge_disable_vblank
(
struct
drm_device
*
dev
,
int
pipe
)
static
void
ivybridge_disable_vblank
(
struct
drm_device
*
dev
,
int
pipe
)
{
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
unsigned
long
irqflags
;
...
...
@@ -1733,7 +1733,7 @@ void i915_hangcheck_elapsed(unsigned long data)
/* drm_dma.h hooks
*/
void
ironlake_irq_preinstall
(
struct
drm_device
*
dev
)
static
void
ironlake_irq_preinstall
(
struct
drm_device
*
dev
)
{
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
...
...
@@ -1774,7 +1774,7 @@ void ironlake_irq_preinstall(struct drm_device *dev)
POSTING_READ
(
SDEIER
);
}
int
ironlake_irq_postinstall
(
struct
drm_device
*
dev
)
static
int
ironlake_irq_postinstall
(
struct
drm_device
*
dev
)
{
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
/* enable kind of interrupts always enabled */
...
...
@@ -1846,7 +1846,7 @@ int ironlake_irq_postinstall(struct drm_device *dev)
return
0
;
}
int
ivybridge_irq_postinstall
(
struct
drm_device
*
dev
)
static
int
ivybridge_irq_postinstall
(
struct
drm_device
*
dev
)
{
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
/* enable kind of interrupts always enabled */
...
...
@@ -1896,7 +1896,7 @@ int ivybridge_irq_postinstall(struct drm_device *dev)
return
0
;
}
void
i915_driver_irq_preinstall
(
struct
drm_device
*
dev
)
static
void
i915_driver_irq_preinstall
(
struct
drm_device
*
dev
)
{
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
int
pipe
;
...
...
@@ -1923,7 +1923,7 @@ void i915_driver_irq_preinstall(struct drm_device * dev)
* Must be called after intel_modeset_init or hotplug interrupts won't be
* enabled correctly.
*/
int
i915_driver_irq_postinstall
(
struct
drm_device
*
dev
)
static
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
;
...
...
@@ -1999,7 +1999,7 @@ int i915_driver_irq_postinstall(struct drm_device *dev)
return
0
;
}
void
ironlake_irq_uninstall
(
struct
drm_device
*
dev
)
static
void
ironlake_irq_uninstall
(
struct
drm_device
*
dev
)
{
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
...
...
@@ -2019,7 +2019,7 @@ void ironlake_irq_uninstall(struct drm_device *dev)
I915_WRITE
(
GTIIR
,
I915_READ
(
GTIIR
));
}
void
i915_driver_irq_uninstall
(
struct
drm_device
*
dev
)
static
void
i915_driver_irq_uninstall
(
struct
drm_device
*
dev
)
{
drm_i915_private_t
*
dev_priv
=
(
drm_i915_private_t
*
)
dev
->
dev_private
;
int
pipe
;
...
...
@@ -2045,3 +2045,41 @@ void i915_driver_irq_uninstall(struct drm_device * dev)
I915_READ
(
PIPESTAT
(
pipe
))
&
0x8000ffff
);
I915_WRITE
(
IIR
,
I915_READ
(
IIR
));
}
void
intel_irq_init
(
struct
drm_device
*
dev
)
{
dev
->
driver
->
get_vblank_counter
=
i915_get_vblank_counter
;
dev
->
max_vblank_count
=
0xffffff
;
/* only 24 bits of frame count */
if
(
IS_G4X
(
dev
)
||
IS_GEN5
(
dev
)
||
IS_GEN6
(
dev
)
||
IS_IVYBRIDGE
(
dev
))
{
dev
->
max_vblank_count
=
0xffffffff
;
/* full 32 bit counter */
dev
->
driver
->
get_vblank_counter
=
gm45_get_vblank_counter
;
}
dev
->
driver
->
get_vblank_timestamp
=
i915_get_vblank_timestamp
;
dev
->
driver
->
get_scanout_position
=
i915_get_crtc_scanoutpos
;
if
(
IS_IVYBRIDGE
(
dev
))
{
/* Share pre & uninstall handlers with ILK/SNB */
dev
->
driver
->
irq_handler
=
ivybridge_irq_handler
;
dev
->
driver
->
irq_preinstall
=
ironlake_irq_preinstall
;
dev
->
driver
->
irq_postinstall
=
ivybridge_irq_postinstall
;
dev
->
driver
->
irq_uninstall
=
ironlake_irq_uninstall
;
dev
->
driver
->
enable_vblank
=
ivybridge_enable_vblank
;
dev
->
driver
->
disable_vblank
=
ivybridge_disable_vblank
;
}
else
if
(
HAS_PCH_SPLIT
(
dev
))
{
dev
->
driver
->
irq_handler
=
ironlake_irq_handler
;
dev
->
driver
->
irq_preinstall
=
ironlake_irq_preinstall
;
dev
->
driver
->
irq_postinstall
=
ironlake_irq_postinstall
;
dev
->
driver
->
irq_uninstall
=
ironlake_irq_uninstall
;
dev
->
driver
->
enable_vblank
=
ironlake_enable_vblank
;
dev
->
driver
->
disable_vblank
=
ironlake_disable_vblank
;
}
else
{
dev
->
driver
->
irq_preinstall
=
i915_driver_irq_preinstall
;
dev
->
driver
->
irq_postinstall
=
i915_driver_irq_postinstall
;
dev
->
driver
->
irq_uninstall
=
i915_driver_irq_uninstall
;
dev
->
driver
->
irq_handler
=
i915_driver_irq_handler
;
dev
->
driver
->
enable_vblank
=
i915_enable_vblank
;
dev
->
driver
->
disable_vblank
=
i915_disable_vblank
;
}
}
drivers/gpu/drm/i915/intel_overlay.c
View file @
bee4d4ac
...
...
@@ -1405,6 +1405,11 @@ void intel_setup_overlay(struct drm_device *dev)
overlay
=
kzalloc
(
sizeof
(
struct
intel_overlay
),
GFP_KERNEL
);
if
(
!
overlay
)
return
;
mutex_lock
(
&
dev
->
struct_mutex
);
if
(
WARN_ON
(
dev_priv
->
overlay
))
goto
out_free
;
overlay
->
dev
=
dev
;
reg_bo
=
i915_gem_alloc_object
(
dev
,
PAGE_SIZE
);
...
...
@@ -1412,8 +1417,6 @@ void intel_setup_overlay(struct drm_device *dev)
goto
out_free
;
overlay
->
reg_bo
=
reg_bo
;
mutex_lock
(
&
dev
->
struct_mutex
);
if
(
OVERLAY_NEEDS_PHYSICAL
(
dev
))
{
ret
=
i915_gem_attach_phys_object
(
dev
,
reg_bo
,
I915_GEM_PHYS_OVERLAY_REGS
,
...
...
@@ -1438,8 +1441,6 @@ void intel_setup_overlay(struct drm_device *dev)
}
}
mutex_unlock
(
&
dev
->
struct_mutex
);
/* init all values */
overlay
->
color_key
=
0x0101fe
;
overlay
->
brightness
=
-
19
;
...
...
@@ -1448,7 +1449,7 @@ void intel_setup_overlay(struct drm_device *dev)
regs
=
intel_overlay_map_regs
(
overlay
);
if
(
!
regs
)
goto
out_
free
_bo
;
goto
out_
unpin
_bo
;
memset
(
regs
,
0
,
sizeof
(
struct
overlay_registers
));
update_polyphase_filter
(
regs
);
...
...
@@ -1457,15 +1458,17 @@ void intel_setup_overlay(struct drm_device *dev)
intel_overlay_unmap_regs
(
overlay
,
regs
);
dev_priv
->
overlay
=
overlay
;
mutex_unlock
(
&
dev
->
struct_mutex
);
DRM_INFO
(
"initialized overlay support
\n
"
);
return
;
out_unpin_bo:
if
(
!
OVERLAY_NEEDS_PHYSICAL
(
dev
))
i915_gem_object_unpin
(
reg_bo
);
out_free_bo:
drm_gem_object_unreference
(
&
reg_bo
->
base
);
mutex_unlock
(
&
dev
->
struct_mutex
);
out_free:
mutex_unlock
(
&
dev
->
struct_mutex
);
kfree
(
overlay
);
return
;
}
...
...
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