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
bce0670d
Commit
bce0670d
authored
Jun 30, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://linux-dj.bkbits.net/agpgart
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
6079e248
67221af3
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
84 additions
and
35 deletions
+84
-35
drivers/char/agp/Kconfig
drivers/char/agp/Kconfig
+1
-1
drivers/char/agp/amd64-agp.c
drivers/char/agp/amd64-agp.c
+9
-0
drivers/char/agp/generic.c
drivers/char/agp/generic.c
+64
-30
drivers/char/agp/sworks-agp.c
drivers/char/agp/sworks-agp.c
+7
-3
drivers/char/agp/via-agp.c
drivers/char/agp/via-agp.c
+1
-0
include/linux/pci_ids.h
include/linux/pci_ids.h
+2
-1
No files found.
drivers/char/agp/Kconfig
View file @
bce0670d
...
@@ -165,7 +165,7 @@ config AGP_EFFICEON
...
@@ -165,7 +165,7 @@ config AGP_EFFICEON
tristate "Transmeta Efficeon support"
tristate "Transmeta Efficeon support"
depends on AGP && X86 && !X86_64
depends on AGP && X86 && !X86_64
help
help
This option
f
ives you AGP support for the Transmeta Efficeon
This option
g
ives you AGP support for the Transmeta Efficeon
series processors with integrated northbridges.
series processors with integrated northbridges.
You should say Y here if you use XFree86 3.3.6 or 4.x and want to
You should say Y here if you use XFree86 3.3.6 or 4.x and want to
...
...
drivers/char/agp/amd64-agp.c
View file @
bce0670d
...
@@ -536,6 +536,15 @@ static struct pci_device_id agp_amd64_pci_table[] = {
...
@@ -536,6 +536,15 @@ static struct pci_device_id agp_amd64_pci_table[] = {
.
subvendor
=
PCI_ANY_ID
,
.
subvendor
=
PCI_ANY_ID
,
.
subdevice
=
PCI_ANY_ID
,
.
subdevice
=
PCI_ANY_ID
,
},
},
/* VIA K8T800Pro */
{
.
class
=
(
PCI_CLASS_BRIDGE_HOST
<<
8
),
.
class_mask
=
~
0
,
.
vendor
=
PCI_VENDOR_ID_VIA
,
.
device
=
PCI_DEVICE_ID_VIA_K8T800PRO_0
,
.
subvendor
=
PCI_ANY_ID
,
.
subdevice
=
PCI_ANY_ID
,
},
/* VIA K8T800 */
/* VIA K8T800 */
{
{
.
class
=
(
PCI_CLASS_BRIDGE_HOST
<<
8
),
.
class
=
(
PCI_CLASS_BRIDGE_HOST
<<
8
),
...
...
drivers/char/agp/generic.c
View file @
bce0670d
/*
/*
* AGPGART driver.
* AGPGART driver.
* Copyright (C) 2002-200
3
Dave Jones.
* Copyright (C) 2002-200
4
Dave Jones.
* Copyright (C) 1999 Jeff Hartmann.
* Copyright (C) 1999 Jeff Hartmann.
* Copyright (C) 1999 Precision Insight, Inc.
* Copyright (C) 1999 Precision Insight, Inc.
* Copyright (C) 1999 Xi Graphics, Inc.
* Copyright (C) 1999 Xi Graphics, Inc.
...
@@ -18,12 +18,12 @@
...
@@ -18,12 +18,12 @@
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
* JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*
* TODO:
* TODO:
* - Allocate more than order 0 pages to avoid too much linear map splitting.
* - Allocate more than order 0 pages to avoid too much linear map splitting.
*/
*/
#include <linux/config.h>
#include <linux/config.h>
...
@@ -37,7 +37,7 @@
...
@@ -37,7 +37,7 @@
#include <linux/vmalloc.h>
#include <linux/vmalloc.h>
#include "agp.h"
#include "agp.h"
__u32
*
agp_gatt_table
;
__u32
*
agp_gatt_table
;
int
agp_memory_reserved
;
int
agp_memory_reserved
;
/*
/*
...
@@ -46,7 +46,7 @@ int agp_memory_reserved;
...
@@ -46,7 +46,7 @@ int agp_memory_reserved;
*/
*/
EXPORT_SYMBOL_GPL
(
agp_memory_reserved
);
EXPORT_SYMBOL_GPL
(
agp_memory_reserved
);
/*
/*
* Generic routines for handling agp_memory structures -
* Generic routines for handling agp_memory structures -
* They use the basic page allocation routines to do the brunt of the work.
* They use the basic page allocation routines to do the brunt of the work.
*/
*/
...
@@ -142,12 +142,12 @@ EXPORT_SYMBOL(agp_free_memory);
...
@@ -142,12 +142,12 @@ EXPORT_SYMBOL(agp_free_memory);
* agp_allocate_memory - allocate a group of pages of a certain type.
* agp_allocate_memory - allocate a group of pages of a certain type.
*
*
* @page_count: size_t argument of the number of pages
* @page_count: size_t argument of the number of pages
* @type: u32 argument of the type of memory to be allocated.
* @type: u32 argument of the type of memory to be allocated.
*
*
* Every agp bridge device will allow you to allocate AGP_NORMAL_MEMORY which
* Every agp bridge device will allow you to allocate AGP_NORMAL_MEMORY which
* maps to physical ram. Any other type is device dependent.
* maps to physical ram. Any other type is device dependent.
*
*
* It returns NULL whenever memory is unavailable.
* It returns NULL whenever memory is unavailable.
*/
*/
struct
agp_memory
*
agp_allocate_memory
(
size_t
page_count
,
u32
type
)
struct
agp_memory
*
agp_allocate_memory
(
size_t
page_count
,
u32
type
)
{
{
...
@@ -311,7 +311,7 @@ EXPORT_SYMBOL(agp_copy_info);
...
@@ -311,7 +311,7 @@ EXPORT_SYMBOL(agp_copy_info);
/**
/**
* agp_bind_memory - Bind an agp_memory structure into the GATT.
* agp_bind_memory - Bind an agp_memory structure into the GATT.
*
*
* @curr: agp_memory pointer
* @curr: agp_memory pointer
* @pg_start: an offset into the graphics aperture translation table
* @pg_start: an offset into the graphics aperture translation table
*
*
...
@@ -347,9 +347,9 @@ EXPORT_SYMBOL(agp_bind_memory);
...
@@ -347,9 +347,9 @@ EXPORT_SYMBOL(agp_bind_memory);
/**
/**
* agp_unbind_memory - Removes an agp_memory structure from the GATT
* agp_unbind_memory - Removes an agp_memory structure from the GATT
*
*
* @curr: agp_memory pointer to be removed from the GATT.
* @curr: agp_memory pointer to be removed from the GATT.
*
*
* It returns -EINVAL if this piece of agp_memory is not currently bound to
* It returns -EINVAL if this piece of agp_memory is not currently bound to
* the graphics aperture translation table or if the agp_memory pointer == NULL
* the graphics aperture translation table or if the agp_memory pointer == NULL
*/
*/
...
@@ -404,12 +404,18 @@ static void agp_v2_parse_one(u32 *mode, u32 *cmd, u32 *tmp)
...
@@ -404,12 +404,18 @@ static void agp_v2_parse_one(u32 *mode, u32 *cmd, u32 *tmp)
*
cmd
&=
~
(
AGPSTAT2_1X
|
AGPSTAT2_4X
);
/* 2X */
*
cmd
&=
~
(
AGPSTAT2_1X
|
AGPSTAT2_4X
);
/* 2X */
if
(
*
cmd
&
AGPSTAT2_1X
)
if
(
*
cmd
&
AGPSTAT2_1X
)
*
cmd
&=
~
(
AGPSTAT2_2X
|
AGPSTAT2_4X
);
/* 1X
f
*/
*
cmd
&=
~
(
AGPSTAT2_2X
|
AGPSTAT2_4X
);
/* 1X */
}
}
/*
* mode = requested mode.
* cmd = PCI_AGP_STATUS from agp bridge.
* tmp = PCI_AGP_STATUS from graphic card.
*/
static
void
agp_v3_parse_one
(
u32
*
mode
,
u32
*
cmd
,
u32
*
tmp
)
static
void
agp_v3_parse_one
(
u32
*
mode
,
u32
*
cmd
,
u32
*
tmp
)
{
{
u32
origcmd
=*
cmd
,
origtmp
=*
tmp
;
/* ARQSZ - Set the value to the maximum one.
/* ARQSZ - Set the value to the maximum one.
* Don't allow the mode register to override values. */
* Don't allow the mode register to override values. */
*
cmd
=
((
*
cmd
&
~
AGPSTAT_ARQSZ
)
|
*
cmd
=
((
*
cmd
&
~
AGPSTAT_ARQSZ
)
|
...
@@ -452,17 +458,43 @@ static void agp_v3_parse_one(u32 *mode, u32 *cmd, u32 *tmp)
...
@@ -452,17 +458,43 @@ static void agp_v3_parse_one(u32 *mode, u32 *cmd, u32 *tmp)
*
mode
|=
AGPSTAT3_4X
;
*
mode
|=
AGPSTAT3_4X
;
}
}
if
(
!
((
*
cmd
&
AGPSTAT3_8X
)
&&
(
*
tmp
&
AGPSTAT3_8X
)
&&
(
*
mode
&
AGPSTAT3_8X
)))
if
(
*
mode
&
AGPSTAT3_8X
)
{
*
cmd
&=
~
AGPSTAT3_8X
;
if
(
!
(
*
cmd
&
AGPSTAT3_8X
))
{
*
cmd
&=
~
(
AGPSTAT3_8X
|
AGPSTAT3_RSVD
);
*
cmd
|=
AGPSTAT3_4X
;
printk
(
"%s requested AGPx8 but bridge not capable.
\n
"
,
current
->
comm
);
return
;
}
if
(
!
(
*
tmp
&
AGPSTAT3_8X
))
{
*
cmd
&=
~
(
AGPSTAT3_8X
|
AGPSTAT3_RSVD
);
*
cmd
|=
AGPSTAT3_4X
;
printk
(
"%s requested AGPx8 but graphic card not capable.
\n
"
,
current
->
comm
);
return
;
}
/* All set, bridge & device can do AGP x8*/
*
cmd
&=
~
(
AGPSTAT3_4X
|
AGPSTAT3_RSVD
);
return
;
if
(
!
((
*
cmd
&
AGPSTAT3_4X
)
&&
(
*
tmp
&
AGPSTAT3_4X
)
&&
(
*
mode
&
AGPSTAT3_4X
)))
}
else
{
*
cmd
&=
~
AGPSTAT3_4X
;
/* Clear out unwanted bits. */
/*
if
(
*
cmd
&
AGPSTAT3_8X
)
* If we didn't specify AGPx8, we can only do x4.
*
cmd
&=
~
(
AGPSTAT3_4X
|
AGPSTAT3_RSVD
);
* If the hardware can't do x4, we're up shit creek, and never
if
(
*
cmd
&
AGPSTAT3_4X
)
* should have got this far.
*/
*
cmd
&=
~
(
AGPSTAT3_8X
|
AGPSTAT3_RSVD
);
*
cmd
&=
~
(
AGPSTAT3_8X
|
AGPSTAT3_RSVD
);
if
((
*
cmd
&
AGPSTAT3_4X
)
&&
(
*
tmp
&
AGPSTAT3_4X
))
*
cmd
|=
AGPSTAT3_4X
;
else
{
printk
(
KERN_INFO
PFX
"Badness. Don't know which AGP mode to set. "
"[cmd:%x tmp:%x fell back to:- cmd:%x tmp:%x]
\n
"
,
origcmd
,
origtmp
,
*
cmd
,
*
tmp
);
if
(
!
(
*
cmd
&
AGPSTAT3_4X
))
printk
(
KERN_INFO
PFX
"Bridge couldn't do AGP x4.
\n
"
);
if
(
!
(
*
tmp
&
AGPSTAT3_4X
))
printk
(
KERN_INFO
PFX
"Graphic card couldn't do AGP x4.
\n
"
);
}
}
}
}
//FIXME: This doesn't smell right.
//FIXME: This doesn't smell right.
...
@@ -479,8 +511,10 @@ u32 agp_collect_device_status(u32 mode, u32 cmd)
...
@@ -479,8 +511,10 @@ u32 agp_collect_device_status(u32 mode, u32 cmd)
if
(
!
cap_ptr
)
if
(
!
cap_ptr
)
continue
;
continue
;
//FIXME: We should probably skip anything here that
// isn't an AGP graphic card.
/*
/*
* Ok, here we have a AGP device. Disable impossible
* Ok, here we have a AGP device. Disable impossible
* settings, and adjust the readqueue to the minimum.
* settings, and adjust the readqueue to the minimum.
*/
*/
pci_read_config_dword
(
device
,
cap_ptr
+
PCI_AGP_STATUS
,
&
tmp
);
pci_read_config_dword
(
device
,
cap_ptr
+
PCI_AGP_STATUS
,
&
tmp
);
...
@@ -489,7 +523,7 @@ u32 agp_collect_device_status(u32 mode, u32 cmd)
...
@@ -489,7 +523,7 @@ u32 agp_collect_device_status(u32 mode, u32 cmd)
cmd
=
((
cmd
&
~
AGPSTAT_RQ_DEPTH
)
|
cmd
=
((
cmd
&
~
AGPSTAT_RQ_DEPTH
)
|
min_t
(
u32
,
(
mode
&
AGPSTAT_RQ_DEPTH
),
min_t
(
u32
,
(
mode
&
AGPSTAT_RQ_DEPTH
),
min_t
(
u32
,
(
cmd
&
AGPSTAT_RQ_DEPTH
),
(
tmp
&
AGPSTAT_RQ_DEPTH
))));
min_t
(
u32
,
(
cmd
&
AGPSTAT_RQ_DEPTH
),
(
tmp
&
AGPSTAT_RQ_DEPTH
))));
/* disable FW if it's not supported */
/* disable FW if it's not supported */
if
(
!
((
cmd
&
AGPSTAT_FW
)
&&
(
tmp
&
AGPSTAT_FW
)
&&
(
mode
&
AGPSTAT_FW
)))
if
(
!
((
cmd
&
AGPSTAT_FW
)
&&
(
tmp
&
AGPSTAT_FW
)
&&
(
mode
&
AGPSTAT_FW
)))
cmd
&=
~
AGPSTAT_FW
;
cmd
&=
~
AGPSTAT_FW
;
...
@@ -663,7 +697,7 @@ int agp_generic_create_gatt_table(void)
...
@@ -663,7 +697,7 @@ int agp_generic_create_gatt_table(void)
agp_bridge
->
current_size
;
agp_bridge
->
current_size
;
break
;
break
;
}
}
temp
=
agp_bridge
->
current_size
;
temp
=
agp_bridge
->
current_size
;
}
else
{
}
else
{
agp_bridge
->
aperture_size_idx
=
i
;
agp_bridge
->
aperture_size_idx
=
i
;
}
}
...
@@ -684,7 +718,7 @@ int agp_generic_create_gatt_table(void)
...
@@ -684,7 +718,7 @@ int agp_generic_create_gatt_table(void)
SetPageReserved
(
page
);
SetPageReserved
(
page
);
agp_bridge
->
gatt_table_real
=
(
u32
*
)
table
;
agp_bridge
->
gatt_table_real
=
(
u32
*
)
table
;
agp_gatt_table
=
(
void
*
)
table
;
agp_gatt_table
=
(
void
*
)
table
;
agp_bridge
->
driver
->
cache_flush
();
agp_bridge
->
driver
->
cache_flush
();
agp_bridge
->
gatt_table
=
ioremap_nocache
(
virt_to_phys
(
table
),
agp_bridge
->
gatt_table
=
ioremap_nocache
(
virt_to_phys
(
table
),
...
@@ -870,9 +904,9 @@ void agp_generic_free_by_type(struct agp_memory *curr)
...
@@ -870,9 +904,9 @@ void agp_generic_free_by_type(struct agp_memory *curr)
EXPORT_SYMBOL
(
agp_generic_free_by_type
);
EXPORT_SYMBOL
(
agp_generic_free_by_type
);
/*
/*
* Basic Page Allocation Routines -
* Basic Page Allocation Routines -
* These routines handle page allocation and by default they reserve the allocated
* These routines handle page allocation and by default they reserve the allocated
* memory. They also handle incrementing the current_memory_agp value, Which is checked
* memory. They also handle incrementing the current_memory_agp value, Which is checked
* against a maximum value.
* against a maximum value.
*/
*/
...
@@ -914,9 +948,9 @@ EXPORT_SYMBOL(agp_generic_destroy_page);
...
@@ -914,9 +948,9 @@ EXPORT_SYMBOL(agp_generic_destroy_page);
/* End Basic Page Allocation Routines */
/* End Basic Page Allocation Routines */
/**
/**
* agp_enable - initialise the agp point-to-point connection.
* agp_enable - initialise the agp point-to-point connection.
*
*
* @mode: agp mode register value to configure with.
* @mode: agp mode register value to configure with.
*/
*/
void
agp_enable
(
u32
mode
)
void
agp_enable
(
u32
mode
)
...
...
drivers/char/agp/sworks-agp.c
View file @
bce0670d
...
@@ -447,6 +447,7 @@ static int __devinit agp_serverworks_probe(struct pci_dev *pdev,
...
@@ -447,6 +447,7 @@ static int __devinit agp_serverworks_probe(struct pci_dev *pdev,
struct
agp_bridge_data
*
bridge
;
struct
agp_bridge_data
*
bridge
;
struct
pci_dev
*
bridge_dev
;
struct
pci_dev
*
bridge_dev
;
u32
temp
,
temp2
;
u32
temp
,
temp2
;
u8
cap_ptr
=
0
;
/* Everything is on func 1 here so we are hardcoding function one */
/* Everything is on func 1 here so we are hardcoding function one */
bridge_dev
=
pci_find_slot
((
unsigned
int
)
pdev
->
bus
->
number
,
bridge_dev
=
pci_find_slot
((
unsigned
int
)
pdev
->
bus
->
number
,
...
@@ -457,6 +458,8 @@ static int __devinit agp_serverworks_probe(struct pci_dev *pdev,
...
@@ -457,6 +458,8 @@ static int __devinit agp_serverworks_probe(struct pci_dev *pdev,
return
-
ENODEV
;
return
-
ENODEV
;
}
}
cap_ptr
=
pci_find_capability
(
pdev
,
PCI_CAP_ID_AGP
);
switch
(
pdev
->
device
)
{
switch
(
pdev
->
device
)
{
case
0x0006
:
case
0x0006
:
/* ServerWorks CNB20HE
/* ServerWorks CNB20HE
...
@@ -470,14 +473,15 @@ static int __devinit agp_serverworks_probe(struct pci_dev *pdev,
...
@@ -470,14 +473,15 @@ static int __devinit agp_serverworks_probe(struct pci_dev *pdev,
break
;
break
;
default:
default:
printk
(
KERN_ERR
PFX
"Unsupported Serverworks chipset "
if
(
cap_ptr
)
"(device id: %04x)
\n
"
,
pdev
->
device
);
printk
(
KERN_ERR
PFX
"Unsupported Serverworks chipset "
"(device id: %04x)
\n
"
,
pdev
->
device
);
return
-
ENODEV
;
return
-
ENODEV
;
}
}
serverworks_private
.
svrwrks_dev
=
bridge_dev
;
serverworks_private
.
svrwrks_dev
=
bridge_dev
;
serverworks_private
.
gart_addr_ofs
=
0x10
;
serverworks_private
.
gart_addr_ofs
=
0x10
;
pci_read_config_dword
(
pdev
,
SVWRKS_APSIZE
,
&
temp
);
pci_read_config_dword
(
pdev
,
SVWRKS_APSIZE
,
&
temp
);
if
(
temp
&
PCI_BASE_ADDRESS_MEM_TYPE_64
)
{
if
(
temp
&
PCI_BASE_ADDRESS_MEM_TYPE_64
)
{
pci_read_config_dword
(
pdev
,
SVWRKS_APSIZE
+
4
,
&
temp2
);
pci_read_config_dword
(
pdev
,
SVWRKS_APSIZE
+
4
,
&
temp2
);
...
...
drivers/char/agp/via-agp.c
View file @
bce0670d
...
@@ -434,6 +434,7 @@ static struct pci_device_id agp_via_pci_table[] = {
...
@@ -434,6 +434,7 @@ static struct pci_device_id agp_via_pci_table[] = {
.subvendor = PCI_ANY_ID, \
.subvendor = PCI_ANY_ID, \
.subdevice = PCI_ANY_ID, \
.subdevice = PCI_ANY_ID, \
}
}
ID
(
PCI_DEVICE_ID_VIA_82C597_0
),
ID
(
PCI_DEVICE_ID_VIA_82C598_0
),
ID
(
PCI_DEVICE_ID_VIA_82C598_0
),
ID
(
PCI_DEVICE_ID_VIA_8501_0
),
ID
(
PCI_DEVICE_ID_VIA_8501_0
),
ID
(
PCI_DEVICE_ID_VIA_8601_0
),
ID
(
PCI_DEVICE_ID_VIA_8601_0
),
...
...
include/linux/pci_ids.h
View file @
bce0670d
...
@@ -1176,7 +1176,8 @@
...
@@ -1176,7 +1176,8 @@
#define PCI_DEVICE_ID_VIA_8763_0 0x0198
#define PCI_DEVICE_ID_VIA_8763_0 0x0198
#define PCI_DEVICE_ID_VIA_8380_0 0x0204
#define PCI_DEVICE_ID_VIA_8380_0 0x0204
#define PCI_DEVICE_ID_VIA_PX8X0_0 0x0259
#define PCI_DEVICE_ID_VIA_PX8X0_0 0x0259
#define PCI_DEVICE_ID_VIA_8363_0 0x0305
#define PCI_DEVICE_ID_VIA_K8T800PRO_0 0x0282
#define PCI_DEVICE_ID_VIA_8363_0 0x0305
#define PCI_DEVICE_ID_VIA_8371_0 0x0391
#define PCI_DEVICE_ID_VIA_8371_0 0x0391
#define PCI_DEVICE_ID_VIA_8501_0 0x0501
#define PCI_DEVICE_ID_VIA_8501_0 0x0501
#define PCI_DEVICE_ID_VIA_82C505 0x0505
#define PCI_DEVICE_ID_VIA_82C505 0x0505
...
...
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