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
Kirill Smelkov
linux
Commits
582fd487
Commit
582fd487
authored
Oct 08, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
parents
7ab501db
ba639933
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
90 additions
and
37 deletions
+90
-37
arch/sparc/Kconfig
arch/sparc/Kconfig
+4
-0
arch/sparc/defconfig
arch/sparc/defconfig
+1
-0
arch/sparc64/kernel/entry.S
arch/sparc64/kernel/entry.S
+21
-18
arch/sparc64/kernel/power.c
arch/sparc64/kernel/power.c
+51
-13
arch/sparc64/kernel/rtrap.S
arch/sparc64/kernel/rtrap.S
+4
-3
arch/sparc64/lib/VISsave.S
arch/sparc64/lib/VISsave.S
+5
-3
drivers/video/p9100.c
drivers/video/p9100.c
+4
-0
No files found.
arch/sparc/Kconfig
View file @
582fd487
...
@@ -21,6 +21,10 @@ config GENERIC_ISA_DMA
...
@@ -21,6 +21,10 @@ config GENERIC_ISA_DMA
bool
bool
default y
default y
config GENERIC_IOMAP
bool
default y
source "init/Kconfig"
source "init/Kconfig"
menu "General machine setup"
menu "General machine setup"
...
...
arch/sparc/defconfig
View file @
582fd487
...
@@ -5,6 +5,7 @@ CONFIG_MMU=y
...
@@ -5,6 +5,7 @@ CONFIG_MMU=y
CONFIG_UID16=y
CONFIG_UID16=y
CONFIG_HIGHMEM=y
CONFIG_HIGHMEM=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_IOMAP=y
#
#
# Code maturity level options
# Code maturity level options
...
...
arch/sparc64/kernel/entry.S
View file @
582fd487
...
@@ -33,7 +33,7 @@
...
@@ -33,7 +33,7 @@
/
*
This
is
trivial
with
the
new
code
...
*/
/
*
This
is
trivial
with
the
new
code
...
*/
.
globl
do_fpdis
.
globl
do_fpdis
do_fpdis
:
do_fpdis
:
sethi
%
hi
(
TSTATE_PEF
),
%
g4
!
IEU0
sethi
%
hi
(
TSTATE_PEF
),
%
g4
rdpr
%
tstate
,
%
g5
rdpr
%
tstate
,
%
g5
andcc
%
g5
,
%
g4
,
%
g0
andcc
%
g5
,
%
g4
,
%
g0
be
,
pt
%
xcc
,
1
f
be
,
pt
%
xcc
,
1
f
...
@@ -50,18 +50,18 @@ do_fpdis:
...
@@ -50,18 +50,18 @@ do_fpdis:
add
%
g0
,
%
g0
,
%
g0
add
%
g0
,
%
g0
,
%
g0
ba
,
a
,
pt
%
xcc
,
rtrap_clr_l6
ba
,
a
,
pt
%
xcc
,
rtrap_clr_l6
1
:
ldub
[%
g6
+
TI_FPSAVED
],
%
g5
!
Load
Group
1
:
ldub
[%
g6
+
TI_FPSAVED
],
%
g5
wr
%
g0
,
FPRS_FEF
,
%
fprs
!
LSU
Group
+
4
bubbles
wr
%
g0
,
FPRS_FEF
,
%
fprs
andcc
%
g5
,
FPRS_FEF
,
%
g0
!
IEU1
Group
andcc
%
g5
,
FPRS_FEF
,
%
g0
be
,
a
,
pt
%
icc
,
1
f
!
CTI
be
,
a
,
pt
%
icc
,
1
f
clr
%
g7
!
IEU0
clr
%
g7
ldx
[%
g6
+
TI_GSR
],
%
g7
!
Load
Group
ldx
[%
g6
+
TI_GSR
],
%
g7
1
:
andcc
%
g5
,
FPRS_DL
,
%
g0
!
IEU1
1
:
andcc
%
g5
,
FPRS_DL
,
%
g0
bne
,
pn
%
icc
,
2
f
!
CTI
bne
,
pn
%
icc
,
2
f
fzero
%f0
!
FPA
fzero
%f0
andcc
%
g5
,
FPRS_DU
,
%
g0
!
IEU1
Group
andcc
%
g5
,
FPRS_DU
,
%
g0
bne
,
pn
%
icc
,
1
f
!
CTI
bne
,
pn
%
icc
,
1
f
fzero
%f2
!
FPA
fzero
%f2
faddd
%f0
,
%f2
,
%f4
faddd
%f0
,
%f2
,
%f4
fmuld
%f0
,
%f2
,
%f6
fmuld
%f0
,
%f2
,
%f6
faddd
%f0
,
%f2
,
%f8
faddd
%f0
,
%f2
,
%f8
...
@@ -104,8 +104,10 @@ do_fpdis:
...
@@ -104,8 +104,10 @@ do_fpdis:
add
%
g6
,
TI_FPREGS
+
0xc0
,
%
g2
add
%
g6
,
TI_FPREGS
+
0xc0
,
%
g2
faddd
%f0
,
%f2
,
%f8
faddd
%f0
,
%f2
,
%f8
fmuld
%f0
,
%f2
,
%f10
fmuld
%f0
,
%f2
,
%f10
ldda
[%
g1
]
ASI_BLK_S
,
%f32
!
grrr
,
where
is
ASI_BLK_NUCLEUS
8
-(
membar
#
Sync
ldda
[%
g1
]
ASI_BLK_S
,
%f32
ldda
[%
g2
]
ASI_BLK_S
,
%f48
ldda
[%
g2
]
ASI_BLK_S
,
%f48
membar
#
Sync
faddd
%f0
,
%f2
,
%f12
faddd
%f0
,
%f2
,
%f12
fmuld
%f0
,
%f2
,
%f14
fmuld
%f0
,
%f2
,
%f14
faddd
%f0
,
%f2
,
%f16
faddd
%f0
,
%f2
,
%f16
...
@@ -116,7 +118,6 @@ do_fpdis:
...
@@ -116,7 +118,6 @@ do_fpdis:
fmuld
%f0
,
%f2
,
%f26
fmuld
%f0
,
%f2
,
%f26
faddd
%f0
,
%f2
,
%f28
faddd
%f0
,
%f2
,
%f28
fmuld
%f0
,
%f2
,
%f30
fmuld
%f0
,
%f2
,
%f30
membar
#
Sync
b
,
pt
%
xcc
,
fpdis_exit
b
,
pt
%
xcc
,
fpdis_exit
nop
nop
2
:
andcc
%
g5
,
FPRS_DU
,
%
g0
2
:
andcc
%
g5
,
FPRS_DU
,
%
g0
...
@@ -133,8 +134,10 @@ do_fpdis:
...
@@ -133,8 +134,10 @@ do_fpdis:
add
%
g6
,
TI_FPREGS
+
0x40
,
%
g2
add
%
g6
,
TI_FPREGS
+
0x40
,
%
g2
faddd
%f32
,
%f34
,
%f36
faddd
%f32
,
%f34
,
%f36
fmuld
%f32
,
%f34
,
%f38
fmuld
%f32
,
%f34
,
%f38
ldda
[%
g1
]
ASI_BLK_S
,
%f0
!
grrr
,
where
is
ASI_BLK_NUCLEUS
8
-(
membar
#
Sync
ldda
[%
g1
]
ASI_BLK_S
,
%f0
ldda
[%
g2
]
ASI_BLK_S
,
%f16
ldda
[%
g2
]
ASI_BLK_S
,
%f16
membar
#
Sync
faddd
%f32
,
%f34
,
%f40
faddd
%f32
,
%f34
,
%f40
fmuld
%f32
,
%f34
,
%f42
fmuld
%f32
,
%f34
,
%f42
faddd
%f32
,
%f34
,
%f44
faddd
%f32
,
%f34
,
%f44
...
@@ -147,7 +150,6 @@ do_fpdis:
...
@@ -147,7 +150,6 @@ do_fpdis:
fmuld
%f32
,
%f34
,
%f58
fmuld
%f32
,
%f34
,
%f58
faddd
%f32
,
%f34
,
%f60
faddd
%f32
,
%f34
,
%f60
fmuld
%f32
,
%f34
,
%f62
fmuld
%f32
,
%f34
,
%f62
membar
#
Sync
ba
,
pt
%
xcc
,
fpdis_exit
ba
,
pt
%
xcc
,
fpdis_exit
nop
nop
3
:
mov
SECONDARY_CONTEXT
,
%
g3
3
:
mov
SECONDARY_CONTEXT
,
%
g3
...
@@ -158,7 +160,8 @@ do_fpdis:
...
@@ -158,7 +160,8 @@ do_fpdis:
stxa
%
g2
,
[%
g3
]
ASI_DMMU
stxa
%
g2
,
[%
g3
]
ASI_DMMU
membar
#
Sync
membar
#
Sync
mov
0x40
,
%
g2
mov
0x40
,
%
g2
ldda
[%
g1
]
ASI_BLK_S
,
%f0
!
grrr
,
where
is
ASI_BLK_NUCLEUS
8
-(
membar
#
Sync
ldda
[%
g1
]
ASI_BLK_S
,
%f0
ldda
[%
g1
+
%
g2
]
ASI_BLK_S
,
%f16
ldda
[%
g1
+
%
g2
]
ASI_BLK_S
,
%f16
add
%
g1
,
0x80
,
%
g1
add
%
g1
,
0x80
,
%
g1
ldda
[%
g1
]
ASI_BLK_S
,
%f32
ldda
[%
g1
]
ASI_BLK_S
,
%f32
...
...
arch/sparc64/kernel/power.c
View file @
582fd487
...
@@ -17,6 +17,7 @@
...
@@ -17,6 +17,7 @@
#include <asm/system.h>
#include <asm/system.h>
#include <asm/ebus.h>
#include <asm/ebus.h>
#include <asm/isa.h>
#include <asm/auxio.h>
#include <asm/auxio.h>
#include <linux/unistd.h>
#include <linux/unistd.h>
...
@@ -100,46 +101,83 @@ static int powerd(void *__unused)
...
@@ -100,46 +101,83 @@ static int powerd(void *__unused)
return
0
;
return
0
;
}
}
static
int
__init
has_button_interrupt
(
struct
linux_ebus_device
*
edev
)
static
int
__init
has_button_interrupt
(
unsigned
int
irq
,
int
prom_node
)
{
{
if
(
edev
->
irqs
[
0
]
==
PCI_IRQ_NONE
)
if
(
irq
==
PCI_IRQ_NONE
)
return
0
;
return
0
;
if
(
!
prom_node_has_property
(
edev
->
prom_node
,
"button"
))
if
(
!
prom_node_has_property
(
prom_node
,
"button"
))
return
0
;
return
0
;
return
1
;
return
1
;
}
}
void
__init
power_init
(
void
)
static
int
__init
power_probe_ebus
(
struct
resource
**
resp
,
unsigned
int
*
irq_p
,
int
*
prom_node_p
)
{
{
struct
linux_ebus
*
ebus
;
struct
linux_ebus
*
ebus
;
struct
linux_ebus_device
*
edev
;
struct
linux_ebus_device
*
edev
;
for_each_ebus
(
ebus
)
{
for_each_ebusdev
(
edev
,
ebus
)
{
if
(
!
strcmp
(
edev
->
prom_name
,
"power"
))
{
*
resp
=
&
edev
->
resource
[
0
];
*
irq_p
=
edev
->
irqs
[
0
];
*
prom_node_p
=
edev
->
prom_node
;
return
0
;
}
}
}
return
-
ENODEV
;
}
static
int
__init
power_probe_isa
(
struct
resource
**
resp
,
unsigned
int
*
irq_p
,
int
*
prom_node_p
)
{
struct
sparc_isa_bridge
*
isa_bus
;
struct
sparc_isa_device
*
isa_dev
;
for_each_isa
(
isa_bus
)
{
for_each_isadev
(
isa_dev
,
isa_bus
)
{
if
(
!
strcmp
(
isa_dev
->
prom_name
,
"power"
))
{
*
resp
=
&
isa_dev
->
resource
;
*
irq_p
=
isa_dev
->
irq
;
*
prom_node_p
=
isa_dev
->
prom_node
;
return
0
;
}
}
}
return
-
ENODEV
;
}
void
__init
power_init
(
void
)
{
struct
resource
*
res
=
NULL
;
unsigned
int
irq
;
int
prom_node
;
static
int
invoked
;
static
int
invoked
;
if
(
invoked
)
if
(
invoked
)
return
;
return
;
invoked
=
1
;
invoked
=
1
;
for_each_ebus
(
ebus
)
{
if
(
!
power_probe_ebus
(
&
res
,
&
irq
,
&
prom_node
))
for_each_ebusdev
(
edev
,
ebus
)
{
if
(
!
strcmp
(
edev
->
prom_name
,
"power"
))
goto
found
;
goto
found
;
}
}
if
(
!
power_probe_isa
(
&
res
,
&
irq
,
&
prom_node
))
goto
found
;
return
;
return
;
found:
found:
power_reg
=
ioremap
(
edev
->
resource
[
0
].
start
,
0x4
);
power_reg
=
ioremap
(
res
->
start
,
0x4
);
printk
(
"power: Control reg at %p ... "
,
power_reg
);
printk
(
"power: Control reg at %p ... "
,
power_reg
);
poweroff_method
=
machine_halt
;
/* able to use the standard halt */
poweroff_method
=
machine_halt
;
/* able to use the standard halt */
if
(
has_button_interrupt
(
edev
))
{
if
(
has_button_interrupt
(
irq
,
prom_node
))
{
if
(
kernel_thread
(
powerd
,
NULL
,
CLONE_FS
)
<
0
)
{
if
(
kernel_thread
(
powerd
,
NULL
,
CLONE_FS
)
<
0
)
{
printk
(
"Failed to start power daemon.
\n
"
);
printk
(
"Failed to start power daemon.
\n
"
);
return
;
return
;
}
}
printk
(
"powerd running.
\n
"
);
printk
(
"powerd running.
\n
"
);
if
(
request_irq
(
edev
->
irqs
[
0
]
,
if
(
request_irq
(
irq
,
power_handler
,
SA_SHIRQ
,
"power"
,
NULL
)
<
0
)
power_handler
,
SA_SHIRQ
,
"power"
,
NULL
)
<
0
)
printk
(
"power: Error, cannot register IRQ handler.
\n
"
);
printk
(
"power: Error, cannot register IRQ handler.
\n
"
);
}
else
{
}
else
{
...
...
arch/sparc64/kernel/rtrap.S
View file @
582fd487
...
@@ -312,32 +312,33 @@ kern_fpucheck: ldub [%g6 + TI_FPDEPTH], %l5
...
@@ -312,32 +312,33 @@ kern_fpucheck: ldub [%g6 + TI_FPDEPTH], %l5
wr
%
g1
,
FPRS_FEF
,
%
fprs
wr
%
g1
,
FPRS_FEF
,
%
fprs
ldx
[%
o1
+
%
o5
],
%
g1
ldx
[%
o1
+
%
o5
],
%
g1
add
%
g6
,
TI_XFSR
,
%
o1
add
%
g6
,
TI_XFSR
,
%
o1
membar
#
StoreLoad
|
#
LoadLoad
sll
%
o0
,
8
,
%
o2
sll
%
o0
,
8
,
%
o2
add
%
g6
,
TI_FPREGS
,
%
o3
add
%
g6
,
TI_FPREGS
,
%
o3
brz
,
pn
%
l6
,
1
f
brz
,
pn
%
l6
,
1
f
add
%
g6
,
TI_FPREGS
+
0x40
,
%
o4
add
%
g6
,
TI_FPREGS
+
0x40
,
%
o4
membar
#
Sync
ldda
[%
o3
+
%
o2
]
ASI_BLK_P
,
%f0
ldda
[%
o3
+
%
o2
]
ASI_BLK_P
,
%f0
ldda
[%
o4
+
%
o2
]
ASI_BLK_P
,
%f16
ldda
[%
o4
+
%
o2
]
ASI_BLK_P
,
%f16
membar
#
Sync
1
:
andcc
%
l2
,
FPRS_DU
,
%
g0
1
:
andcc
%
l2
,
FPRS_DU
,
%
g0
be
,
pn
%
icc
,
1
f
be
,
pn
%
icc
,
1
f
wr
%
g1
,
0
,
%
gsr
wr
%
g1
,
0
,
%
gsr
add
%
o2
,
0x80
,
%
o2
add
%
o2
,
0x80
,
%
o2
membar
#
Sync
ldda
[%
o3
+
%
o2
]
ASI_BLK_P
,
%f32
ldda
[%
o3
+
%
o2
]
ASI_BLK_P
,
%f32
ldda
[%
o4
+
%
o2
]
ASI_BLK_P
,
%f48
ldda
[%
o4
+
%
o2
]
ASI_BLK_P
,
%f48
1
:
membar
#
Sync
1
:
membar
#
Sync
ldx
[%
o1
+
%
o5
],
%
fsr
ldx
[%
o1
+
%
o5
],
%
fsr
2
:
stb
%
l5
,
[%
g6
+
TI_FPDEPTH
]
2
:
stb
%
l5
,
[%
g6
+
TI_FPDEPTH
]
ba
,
pt
%
xcc
,
rt_continue
ba
,
pt
%
xcc
,
rt_continue
nop
nop
5
:
wr
%
g0
,
FPRS_FEF
,
%
fprs
5
:
wr
%
g0
,
FPRS_FEF
,
%
fprs
membar
#
StoreLoad
|
#
LoadLoad
sll
%
o0
,
8
,
%
o2
sll
%
o0
,
8
,
%
o2
add
%
g6
,
TI_FPREGS
+
0x80
,
%
o3
add
%
g6
,
TI_FPREGS
+
0x80
,
%
o3
add
%
g6
,
TI_FPREGS
+
0xc0
,
%
o4
add
%
g6
,
TI_FPREGS
+
0xc0
,
%
o4
membar
#
Sync
ldda
[%
o3
+
%
o2
]
ASI_BLK_P
,
%f32
ldda
[%
o3
+
%
o2
]
ASI_BLK_P
,
%f32
ldda
[%
o4
+
%
o2
]
ASI_BLK_P
,
%f48
ldda
[%
o4
+
%
o2
]
ASI_BLK_P
,
%f48
membar
#
Sync
membar
#
Sync
...
...
arch/sparc64/lib/VISsave.S
View file @
582fd487
...
@@ -59,15 +59,17 @@ vis1: ldub [%g6 + TI_FPSAVED], %g3
...
@@ -59,15 +59,17 @@ vis1: ldub [%g6 + TI_FPSAVED], %g3
be
,
pn
%
icc
,
9
b
be
,
pn
%
icc
,
9
b
add
%
g6
,
TI_FPREGS
,
%
g2
add
%
g6
,
TI_FPREGS
,
%
g2
andcc
%
o5
,
FPRS_DL
,
%
g0
andcc
%
o5
,
FPRS_DL
,
%
g0
membar
#
StoreStore
|
#
LoadStore
be
,
pn
%
icc
,
4
f
be
,
pn
%
icc
,
4
f
add
%
g6
,
TI_FPREGS
+
0x40
,
%
g3
add
%
g6
,
TI_FPREGS
+
0x40
,
%
g3
membar
#
Sync
stda
%f0
,
[%
g2
+
%
g1
]
ASI_BLK_P
stda
%f0
,
[%
g2
+
%
g1
]
ASI_BLK_P
stda
%f16
,
[%
g3
+
%
g1
]
ASI_BLK_P
stda
%f16
,
[%
g3
+
%
g1
]
ASI_BLK_P
membar
#
Sync
andcc
%
o5
,
FPRS_DU
,
%
g0
andcc
%
o5
,
FPRS_DU
,
%
g0
be
,
pn
%
icc
,
5
f
be
,
pn
%
icc
,
5
f
4
:
add
%
g1
,
128
,
%
g1
4
:
add
%
g1
,
128
,
%
g1
membar
#
Sync
stda
%f32
,
[%
g2
+
%
g1
]
ASI_BLK_P
stda
%f32
,
[%
g2
+
%
g1
]
ASI_BLK_P
stda
%f48
,
[%
g3
+
%
g1
]
ASI_BLK_P
stda
%f48
,
[%
g3
+
%
g1
]
ASI_BLK_P
...
@@ -87,7 +89,7 @@ vis1: ldub [%g6 + TI_FPSAVED], %g3
...
@@ -87,7 +89,7 @@ vis1: ldub [%g6 + TI_FPSAVED], %g3
sll
%
g1
,
5
,
%
g1
sll
%
g1
,
5
,
%
g1
add
%
g6
,
TI_FPREGS
+
0xc0
,
%
g3
add
%
g6
,
TI_FPREGS
+
0xc0
,
%
g3
wr
%
g0
,
FPRS_FEF
,
%
fprs
wr
%
g0
,
FPRS_FEF
,
%
fprs
membar
#
S
toreStore
|
#
LoadStore
membar
#
S
ync
stda
%f32
,
[%
g2
+
%
g1
]
ASI_BLK_P
stda
%f32
,
[%
g2
+
%
g1
]
ASI_BLK_P
stda
%f48
,
[%
g3
+
%
g1
]
ASI_BLK_P
stda
%f48
,
[%
g3
+
%
g1
]
ASI_BLK_P
membar
#
Sync
membar
#
Sync
...
@@ -128,8 +130,8 @@ VISenterhalf:
...
@@ -128,8 +130,8 @@ VISenterhalf:
be
,
pn
%
icc
,
4
f
be
,
pn
%
icc
,
4
f
add
%
g6
,
TI_FPREGS
,
%
g2
add
%
g6
,
TI_FPREGS
,
%
g2
membar
#
StoreStore
|
#
LoadStore
add
%
g6
,
TI_FPREGS
+
0x40
,
%
g3
add
%
g6
,
TI_FPREGS
+
0x40
,
%
g3
membar
#
Sync
stda
%f0
,
[%
g2
+
%
g1
]
ASI_BLK_P
stda
%f0
,
[%
g2
+
%
g1
]
ASI_BLK_P
stda
%f16
,
[%
g3
+
%
g1
]
ASI_BLK_P
stda
%f16
,
[%
g3
+
%
g1
]
ASI_BLK_P
membar
#
Sync
membar
#
Sync
...
...
drivers/video/p9100.c
View file @
582fd487
...
@@ -288,6 +288,9 @@ static void p9100_init_one(struct sbus_dev *sdev)
...
@@ -288,6 +288,9 @@ static void p9100_init_one(struct sbus_dev *sdev)
all
->
par
.
physbase
=
sdev
->
reg_addrs
[
2
].
phys_addr
;
all
->
par
.
physbase
=
sdev
->
reg_addrs
[
2
].
phys_addr
;
sbusfb_fill_var
(
&
all
->
info
.
var
,
sdev
->
prom_node
,
8
);
sbusfb_fill_var
(
&
all
->
info
.
var
,
sdev
->
prom_node
,
8
);
all
->
info
.
var
.
red
.
length
=
8
;
all
->
info
.
var
.
green
.
length
=
8
;
all
->
info
.
var
.
blue
.
length
=
8
;
linebytes
=
prom_getintdefault
(
sdev
->
prom_node
,
"linebytes"
,
linebytes
=
prom_getintdefault
(
sdev
->
prom_node
,
"linebytes"
,
all
->
info
.
var
.
xres
);
all
->
info
.
var
.
xres
);
...
@@ -323,6 +326,7 @@ static void p9100_init_one(struct sbus_dev *sdev)
...
@@ -323,6 +326,7 @@ static void p9100_init_one(struct sbus_dev *sdev)
kfree
(
all
);
kfree
(
all
);
return
;
return
;
}
}
fb_set_cmap
(
&
all
->
info
.
cmap
,
&
all
->
info
);
list_add
(
&
all
->
list
,
&
p9100_list
);
list_add
(
&
all
->
list
,
&
p9100_list
);
...
...
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