Commit e501b3d8 authored by Bjorn Helgaas's avatar Bjorn Helgaas

agp: Support 64-bit APBASE

Per the AGP 3.0 spec, APBASE is a standard PCI BAR and may be either 32
bits or 64 bits wide.  Many drivers read APBASE directly, but they only
handled 32-bit BARs.

The PCI core reads APBASE at enumeration-time.  Use pci_bus_address()
instead of reading it again in the driver.  This works correctly for both
32-bit and 64-bit BARs.
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 06cf56e4
...@@ -239,6 +239,7 @@ long compat_agp_ioctl(struct file *file, unsigned int cmd, unsigned long arg); ...@@ -239,6 +239,7 @@ long compat_agp_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
/* Chipset independent registers (from AGP Spec) */ /* Chipset independent registers (from AGP Spec) */
#define AGP_APBASE 0x10 #define AGP_APBASE 0x10
#define AGP_APERTURE_BAR 0
#define AGPSTAT 0x4 #define AGPSTAT 0x4
#define AGPCMD 0x8 #define AGPCMD 0x8
......
...@@ -85,8 +85,8 @@ static int ali_configure(void) ...@@ -85,8 +85,8 @@ static int ali_configure(void)
pci_write_config_dword(agp_bridge->dev, ALI_TLBCTRL, ((temp & 0xffffff00) | 0x00000010)); pci_write_config_dword(agp_bridge->dev, ALI_TLBCTRL, ((temp & 0xffffff00) | 0x00000010));
/* address to map to */ /* address to map to */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); AGP_APERTURE_BAR);
#if 0 #if 0
if (agp_bridge->type == ALI_M1541) { if (agp_bridge->type == ALI_M1541) {
......
...@@ -126,7 +126,6 @@ static int amd_create_gatt_table(struct agp_bridge_data *bridge) ...@@ -126,7 +126,6 @@ static int amd_create_gatt_table(struct agp_bridge_data *bridge)
unsigned long __iomem *cur_gatt; unsigned long __iomem *cur_gatt;
unsigned long addr; unsigned long addr;
int retval; int retval;
u32 temp;
int i; int i;
value = A_SIZE_LVL2(agp_bridge->current_size); value = A_SIZE_LVL2(agp_bridge->current_size);
...@@ -149,8 +148,7 @@ static int amd_create_gatt_table(struct agp_bridge_data *bridge) ...@@ -149,8 +148,7 @@ static int amd_create_gatt_table(struct agp_bridge_data *bridge)
* used to program the agp master not the cpu * used to program the agp master not the cpu
*/ */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); addr = pci_bus_address(agp_bridge->dev, AGP_APERTURE_BAR);
addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
agp_bridge->gart_bus_addr = addr; agp_bridge->gart_bus_addr = addr;
/* Calculate the agp offset */ /* Calculate the agp offset */
......
...@@ -269,7 +269,6 @@ static int agp_aperture_valid(u64 aper, u32 size) ...@@ -269,7 +269,6 @@ static int agp_aperture_valid(u64 aper, u32 size)
*/ */
static int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp, u16 cap) static int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp, u16 cap)
{ {
u32 aper_low, aper_hi;
u64 aper, nb_aper; u64 aper, nb_aper;
int order = 0; int order = 0;
u32 nb_order, nb_base; u32 nb_order, nb_base;
...@@ -295,9 +294,7 @@ static int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp, u16 cap) ...@@ -295,9 +294,7 @@ static int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp, u16 cap)
apsize |= 0xf00; apsize |= 0xf00;
order = 7 - hweight16(apsize); order = 7 - hweight16(apsize);
pci_read_config_dword(agp, 0x10, &aper_low); aper = pci_bus_address(agp, AGP_APERTURE_BAR);
pci_read_config_dword(agp, 0x14, &aper_hi);
aper = (aper_low & ~((1<<22)-1)) | ((u64)aper_hi << 32);
/* /*
* On some sick chips APSIZE is 0. This means it wants 4G * On some sick chips APSIZE is 0. This means it wants 4G
......
...@@ -211,10 +211,10 @@ static int ati_configure(void) ...@@ -211,10 +211,10 @@ static int ati_configure(void)
else else
pci_write_config_dword(agp_bridge->dev, ATI_RS300_IG_AGPMODE, 0x20000); pci_write_config_dword(agp_bridge->dev, ATI_RS300_IG_AGPMODE, 0x20000);
/* address to map too */ /* address to map to */
/* /*
pci_read_config_dword(agp_bridge.dev, AGP_APBASE, &temp); agp_bridge.gart_bus_addr = pci_bus_address(agp_bridge.dev,
agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); AGP_APERTURE_BAR);
printk(KERN_INFO PFX "IGP320 gart_bus_addr: %x\n", agp_bridge.gart_bus_addr); printk(KERN_INFO PFX "IGP320 gart_bus_addr: %x\n", agp_bridge.gart_bus_addr);
*/ */
writel(0x60000, ati_generic_private.registers+ATI_GART_FEATURE_ID); writel(0x60000, ati_generic_private.registers+ATI_GART_FEATURE_ID);
...@@ -385,8 +385,7 @@ static int ati_create_gatt_table(struct agp_bridge_data *bridge) ...@@ -385,8 +385,7 @@ static int ati_create_gatt_table(struct agp_bridge_data *bridge)
* This is a bus address even on the alpha, b/c its * This is a bus address even on the alpha, b/c its
* used to program the agp master not the cpu * used to program the agp master not the cpu
*/ */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); addr = pci_bus_address(agp_bridge->dev, AGP_APERTURE_BAR);
addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
agp_bridge->gart_bus_addr = addr; agp_bridge->gart_bus_addr = addr;
/* Calculate the agp offset */ /* Calculate the agp offset */
......
...@@ -128,7 +128,6 @@ static void efficeon_cleanup(void) ...@@ -128,7 +128,6 @@ static void efficeon_cleanup(void)
static int efficeon_configure(void) static int efficeon_configure(void)
{ {
u32 temp;
u16 temp2; u16 temp2;
struct aper_size_info_lvl2 *current_size; struct aper_size_info_lvl2 *current_size;
...@@ -141,8 +140,8 @@ static int efficeon_configure(void) ...@@ -141,8 +140,8 @@ static int efficeon_configure(void)
current_size->size_value); current_size->size_value);
/* address to map to */ /* address to map to */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); AGP_APERTURE_BAR);
/* agpctrl */ /* agpctrl */
pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280); pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280);
......
...@@ -1396,8 +1396,8 @@ int agp3_generic_configure(void) ...@@ -1396,8 +1396,8 @@ int agp3_generic_configure(void)
current_size = A_SIZE_16(agp_bridge->current_size); current_size = A_SIZE_16(agp_bridge->current_size);
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); AGP_APERTURE_BAR);
/* set aperture size */ /* set aperture size */
pci_write_config_word(agp_bridge->dev, agp_bridge->capndx+AGPAPSIZE, current_size->size_value); pci_write_config_word(agp_bridge->dev, agp_bridge->capndx+AGPAPSIZE, current_size->size_value);
......
...@@ -118,7 +118,6 @@ static void intel_8xx_cleanup(void) ...@@ -118,7 +118,6 @@ static void intel_8xx_cleanup(void)
static int intel_configure(void) static int intel_configure(void)
{ {
u32 temp;
u16 temp2; u16 temp2;
struct aper_size_info_16 *current_size; struct aper_size_info_16 *current_size;
...@@ -128,8 +127,8 @@ static int intel_configure(void) ...@@ -128,8 +127,8 @@ static int intel_configure(void)
pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
/* address to map to */ /* address to map to */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); AGP_APERTURE_BAR);
/* attbase - aperture base */ /* attbase - aperture base */
pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
...@@ -148,7 +147,7 @@ static int intel_configure(void) ...@@ -148,7 +147,7 @@ static int intel_configure(void)
static int intel_815_configure(void) static int intel_815_configure(void)
{ {
u32 temp, addr; u32 addr;
u8 temp2; u8 temp2;
struct aper_size_info_8 *current_size; struct aper_size_info_8 *current_size;
...@@ -167,8 +166,8 @@ static int intel_815_configure(void) ...@@ -167,8 +166,8 @@ static int intel_815_configure(void)
current_size->size_value); current_size->size_value);
/* address to map to */ /* address to map to */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); AGP_APERTURE_BAR);
pci_read_config_dword(agp_bridge->dev, INTEL_ATTBASE, &addr); pci_read_config_dword(agp_bridge->dev, INTEL_ATTBASE, &addr);
addr &= INTEL_815_ATTBASE_MASK; addr &= INTEL_815_ATTBASE_MASK;
...@@ -208,7 +207,6 @@ static void intel_820_cleanup(void) ...@@ -208,7 +207,6 @@ static void intel_820_cleanup(void)
static int intel_820_configure(void) static int intel_820_configure(void)
{ {
u32 temp;
u8 temp2; u8 temp2;
struct aper_size_info_8 *current_size; struct aper_size_info_8 *current_size;
...@@ -218,8 +216,8 @@ static int intel_820_configure(void) ...@@ -218,8 +216,8 @@ static int intel_820_configure(void)
pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
/* address to map to */ /* address to map to */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); AGP_APERTURE_BAR);
/* attbase - aperture base */ /* attbase - aperture base */
pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
...@@ -239,7 +237,6 @@ static int intel_820_configure(void) ...@@ -239,7 +237,6 @@ static int intel_820_configure(void)
static int intel_840_configure(void) static int intel_840_configure(void)
{ {
u32 temp;
u16 temp2; u16 temp2;
struct aper_size_info_8 *current_size; struct aper_size_info_8 *current_size;
...@@ -249,8 +246,8 @@ static int intel_840_configure(void) ...@@ -249,8 +246,8 @@ static int intel_840_configure(void)
pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
/* address to map to */ /* address to map to */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); AGP_APERTURE_BAR);
/* attbase - aperture base */ /* attbase - aperture base */
pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
...@@ -268,7 +265,6 @@ static int intel_840_configure(void) ...@@ -268,7 +265,6 @@ static int intel_840_configure(void)
static int intel_845_configure(void) static int intel_845_configure(void)
{ {
u32 temp;
u8 temp2; u8 temp2;
struct aper_size_info_8 *current_size; struct aper_size_info_8 *current_size;
...@@ -282,9 +278,9 @@ static int intel_845_configure(void) ...@@ -282,9 +278,9 @@ static int intel_845_configure(void)
agp_bridge->apbase_config); agp_bridge->apbase_config);
} else { } else {
/* address to map to */ /* address to map to */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); AGP_APERTURE_BAR);
agp_bridge->apbase_config = temp; agp_bridge->apbase_config = agp_bridge->gart_bus_addr;
} }
/* attbase - aperture base */ /* attbase - aperture base */
...@@ -303,7 +299,6 @@ static int intel_845_configure(void) ...@@ -303,7 +299,6 @@ static int intel_845_configure(void)
static int intel_850_configure(void) static int intel_850_configure(void)
{ {
u32 temp;
u16 temp2; u16 temp2;
struct aper_size_info_8 *current_size; struct aper_size_info_8 *current_size;
...@@ -313,8 +308,8 @@ static int intel_850_configure(void) ...@@ -313,8 +308,8 @@ static int intel_850_configure(void)
pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
/* address to map to */ /* address to map to */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); AGP_APERTURE_BAR);
/* attbase - aperture base */ /* attbase - aperture base */
pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
...@@ -332,7 +327,6 @@ static int intel_850_configure(void) ...@@ -332,7 +327,6 @@ static int intel_850_configure(void)
static int intel_860_configure(void) static int intel_860_configure(void)
{ {
u32 temp;
u16 temp2; u16 temp2;
struct aper_size_info_8 *current_size; struct aper_size_info_8 *current_size;
...@@ -342,8 +336,8 @@ static int intel_860_configure(void) ...@@ -342,8 +336,8 @@ static int intel_860_configure(void)
pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
/* address to map to */ /* address to map to */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); AGP_APERTURE_BAR);
/* attbase - aperture base */ /* attbase - aperture base */
pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
...@@ -361,7 +355,6 @@ static int intel_860_configure(void) ...@@ -361,7 +355,6 @@ static int intel_860_configure(void)
static int intel_830mp_configure(void) static int intel_830mp_configure(void)
{ {
u32 temp;
u16 temp2; u16 temp2;
struct aper_size_info_8 *current_size; struct aper_size_info_8 *current_size;
...@@ -371,8 +364,8 @@ static int intel_830mp_configure(void) ...@@ -371,8 +364,8 @@ static int intel_830mp_configure(void)
pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
/* address to map to */ /* address to map to */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); AGP_APERTURE_BAR);
/* attbase - aperture base */ /* attbase - aperture base */
pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
...@@ -390,7 +383,6 @@ static int intel_830mp_configure(void) ...@@ -390,7 +383,6 @@ static int intel_830mp_configure(void)
static int intel_7505_configure(void) static int intel_7505_configure(void)
{ {
u32 temp;
u16 temp2; u16 temp2;
struct aper_size_info_8 *current_size; struct aper_size_info_8 *current_size;
...@@ -400,8 +392,8 @@ static int intel_7505_configure(void) ...@@ -400,8 +392,8 @@ static int intel_7505_configure(void)
pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
/* address to map to */ /* address to map to */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); AGP_APERTURE_BAR);
/* attbase - aperture base */ /* attbase - aperture base */
pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
......
...@@ -116,8 +116,7 @@ static int nvidia_configure(void) ...@@ -116,8 +116,7 @@ static int nvidia_configure(void)
current_size->size_value); current_size->size_value);
/* address to map to */ /* address to map to */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &apbase); apbase = pci_bus_address(agp_bridge->dev, AGP_APERTURE_BAR);
apbase &= PCI_BASE_ADDRESS_MEM_MASK;
agp_bridge->gart_bus_addr = apbase; agp_bridge->gart_bus_addr = apbase;
aplimit = apbase + (current_size->size * 1024 * 1024) - 1; aplimit = apbase + (current_size->size * 1024 * 1024) - 1;
pci_write_config_dword(nvidia_private.dev_2, NVIDIA_2_APBASE, apbase); pci_write_config_dword(nvidia_private.dev_2, NVIDIA_2_APBASE, apbase);
......
...@@ -50,13 +50,12 @@ static void sis_tlbflush(struct agp_memory *mem) ...@@ -50,13 +50,12 @@ static void sis_tlbflush(struct agp_memory *mem)
static int sis_configure(void) static int sis_configure(void)
{ {
u32 temp;
struct aper_size_info_8 *current_size; struct aper_size_info_8 *current_size;
current_size = A_SIZE_8(agp_bridge->current_size); current_size = A_SIZE_8(agp_bridge->current_size);
pci_write_config_byte(agp_bridge->dev, SIS_TLBCNTRL, 0x05); pci_write_config_byte(agp_bridge->dev, SIS_TLBCNTRL, 0x05);
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); AGP_APERTURE_BAR);
pci_write_config_dword(agp_bridge->dev, SIS_ATTBASE, pci_write_config_dword(agp_bridge->dev, SIS_ATTBASE,
agp_bridge->gatt_bus_addr); agp_bridge->gatt_bus_addr);
pci_write_config_byte(agp_bridge->dev, SIS_APSIZE, pci_write_config_byte(agp_bridge->dev, SIS_APSIZE,
......
...@@ -43,16 +43,15 @@ static int via_fetch_size(void) ...@@ -43,16 +43,15 @@ static int via_fetch_size(void)
static int via_configure(void) static int via_configure(void)
{ {
u32 temp;
struct aper_size_info_8 *current_size; struct aper_size_info_8 *current_size;
current_size = A_SIZE_8(agp_bridge->current_size); current_size = A_SIZE_8(agp_bridge->current_size);
/* aperture size */ /* aperture size */
pci_write_config_byte(agp_bridge->dev, VIA_APSIZE, pci_write_config_byte(agp_bridge->dev, VIA_APSIZE,
current_size->size_value); current_size->size_value);
/* address to map too */ /* address to map to */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); AGP_APERTURE_BAR);
/* GART control register */ /* GART control register */
pci_write_config_dword(agp_bridge->dev, VIA_GARTCTRL, 0x0000000f); pci_write_config_dword(agp_bridge->dev, VIA_GARTCTRL, 0x0000000f);
...@@ -132,9 +131,9 @@ static int via_configure_agp3(void) ...@@ -132,9 +131,9 @@ static int via_configure_agp3(void)
current_size = A_SIZE_16(agp_bridge->current_size); current_size = A_SIZE_16(agp_bridge->current_size);
/* address to map too */ /* address to map to */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); AGP_APERTURE_BAR);
/* attbase - aperture GATT base */ /* attbase - aperture GATT base */
pci_write_config_dword(agp_bridge->dev, VIA_AGP3_ATTBASE, pci_write_config_dword(agp_bridge->dev, VIA_AGP3_ATTBASE,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment