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
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
Hide 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
)
{
goto
found
;
if
(
!
strcmp
(
edev
->
prom_name
,
"power"
))
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