git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git]
/
drivers
/
char
/
drm
/
radeon_cp.c
diff --git
a/drivers/char/drm/radeon_cp.c
b/drivers/char/drm/radeon_cp.c
index
7f949c9
..
5ed9656
100644
(file)
--- a/
drivers/char/drm/radeon_cp.c
+++ b/
drivers/char/drm/radeon_cp.c
@@
-39,7
+39,7
@@
static int radeon_do_cleanup_cp(drm_device_t * dev);
/* CP microcode (from ATI) */
static int radeon_do_cleanup_cp(drm_device_t * dev);
/* CP microcode (from ATI) */
-static u32 R200_cp_microcode[][2] = {
+static
const
u32 R200_cp_microcode[][2] = {
{0x21007000, 0000000000},
{0x20007000, 0000000000},
{0x000000ab, 0x00000004},
{0x21007000, 0000000000},
{0x20007000, 0000000000},
{0x000000ab, 0x00000004},
@@
-298,7
+298,7
@@
static u32 R200_cp_microcode[][2] = {
{0000000000, 0000000000},
};
{0000000000, 0000000000},
};
-static u32 radeon_cp_microcode[][2] = {
+static
const
u32 radeon_cp_microcode[][2] = {
{0x21007000, 0000000000},
{0x20007000, 0000000000},
{0x000000b4, 0x00000004},
{0x21007000, 0000000000},
{0x20007000, 0000000000},
{0x000000b4, 0x00000004},
@@
-557,7
+557,7
@@
static u32 radeon_cp_microcode[][2] = {
{0000000000, 0000000000},
};
{0000000000, 0000000000},
};
-static u32 R300_cp_microcode[][2] = {
+static
const
u32 R300_cp_microcode[][2] = {
{0x4200e000, 0000000000},
{0x4000e000, 0000000000},
{0x000000af, 0x00000008},
{0x4200e000, 0000000000},
{0x4000e000, 0000000000},
{0x000000af, 0x00000008},
@@
-864,13
+864,13
@@
static int radeon_do_pixcache_flush(drm_radeon_private_t * dev_priv)
dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
- tmp = RADEON_READ(RADEON_RB
2
D_DSTCACHE_CTLSTAT);
- tmp |= RADEON_RB
2
D_DC_FLUSH_ALL;
- RADEON_WRITE(RADEON_RB
2
D_DSTCACHE_CTLSTAT, tmp);
+ tmp = RADEON_READ(RADEON_RB
3
D_DSTCACHE_CTLSTAT);
+ tmp |= RADEON_RB
3
D_DC_FLUSH_ALL;
+ RADEON_WRITE(RADEON_RB
3
D_DSTCACHE_CTLSTAT, tmp);
for (i = 0; i < dev_priv->usec_timeout; i++) {
for (i = 0; i < dev_priv->usec_timeout; i++) {
- if (!(RADEON_READ(RADEON_RB
2
D_DSTCACHE_CTLSTAT)
- & RADEON_RB
2
D_DC_BUSY)) {
+ if (!(RADEON_READ(RADEON_RB
3
D_DSTCACHE_CTLSTAT)
+ & RADEON_RB
3
D_DC_BUSY)) {
return 0;
}
DRM_UDELAY(1);
return 0;
}
DRM_UDELAY(1);
@@
-1130,7
+1130,7
@@
static void radeon_cp_init_ring_buffer(drm_device_t * dev,
| (dev_priv->fb_location >> 16));
#if __OS_HAS_AGP
| (dev_priv->fb_location >> 16));
#if __OS_HAS_AGP
- if (dev_priv->flags &
CHIP
_IS_AGP) {
+ if (dev_priv->flags &
RADEON
_IS_AGP) {
RADEON_WRITE(RADEON_AGP_BASE, (unsigned int)dev->agp->base);
RADEON_WRITE(RADEON_MC_AGP_LOCATION,
(((dev_priv->gart_vm_start - 1 +
RADEON_WRITE(RADEON_AGP_BASE, (unsigned int)dev->agp->base);
RADEON_WRITE(RADEON_MC_AGP_LOCATION,
(((dev_priv->gart_vm_start - 1 +
@@
-1158,7
+1158,7
@@
static void radeon_cp_init_ring_buffer(drm_device_t * dev,
dev_priv->ring.tail = cur_read_ptr;
#if __OS_HAS_AGP
dev_priv->ring.tail = cur_read_ptr;
#if __OS_HAS_AGP
- if (dev_priv->flags &
CHIP
_IS_AGP) {
+ if (dev_priv->flags &
RADEON
_IS_AGP) {
RADEON_WRITE(RADEON_CP_RB_RPTR_ADDR,
dev_priv->ring_rptr->offset
- dev->agp->base + dev_priv->gart_vm_start);
RADEON_WRITE(RADEON_CP_RB_RPTR_ADDR,
dev_priv->ring_rptr->offset
- dev->agp->base + dev_priv->gart_vm_start);
@@
-1258,6
+1258,13
@@
static void radeon_test_writeback(drm_radeon_private_t * dev_priv)
dev_priv->writeback_works = 0;
DRM_INFO("writeback forced off\n");
}
dev_priv->writeback_works = 0;
DRM_INFO("writeback forced off\n");
}
+
+ if (!dev_priv->writeback_works) {
+ /* Disable writeback to avoid unnecessary bus master transfer */
+ RADEON_WRITE(RADEON_CP_RB_CNTL, RADEON_READ(RADEON_CP_RB_CNTL) |
+ RADEON_RB_NO_UPDATE);
+ RADEON_WRITE(RADEON_SCRATCH_UMSK, 0);
+ }
}
/* Enable or disable PCI-E GART on the chip */
}
/* Enable or disable PCI-E GART on the chip */
@@
-1295,7
+1302,7
@@
static void radeon_set_pcigart(drm_radeon_private_t * dev_priv, int on)
{
u32 tmp;
{
u32 tmp;
- if (dev_priv->flags &
CHIP
_IS_PCIE) {
+ if (dev_priv->flags &
RADEON
_IS_PCIE) {
radeon_set_pciegart(dev_priv, on);
return;
}
radeon_set_pciegart(dev_priv, on);
return;
}
@@
-1333,20
+1340,22
@@
static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)
DRM_DEBUG("\n");
/* if we require new memory map but we don't have it fail */
DRM_DEBUG("\n");
/* if we require new memory map but we don't have it fail */
- if ((dev_priv->flags & CHIP_NEW_MEMMAP) && !dev_priv->new_memmap)
- {
- DRM_ERROR("Cannot initialise DRM on this card\nThis card requires a new X.org DDX\n");
+ if ((dev_priv->flags & RADEON_NEW_MEMMAP) && !dev_priv->new_memmap) {
+ DRM_ERROR("Cannot initialise DRM on this card\nThis card requires a new X.org DDX for 3D\n");
radeon_do_cleanup_cp(dev);
return DRM_ERR(EINVAL);
}
radeon_do_cleanup_cp(dev);
return DRM_ERR(EINVAL);
}
- if (init->is_pci && (dev_priv->flags & CHIP_IS_AGP))
- {
+ if (init->is_pci && (dev_priv->flags & RADEON_IS_AGP)) {
DRM_DEBUG("Forcing AGP card to PCI mode\n");
DRM_DEBUG("Forcing AGP card to PCI mode\n");
- dev_priv->flags &= ~CHIP_IS_AGP;
+ dev_priv->flags &= ~RADEON_IS_AGP;
+ } else if (!(dev_priv->flags & (RADEON_IS_AGP | RADEON_IS_PCI | RADEON_IS_PCIE))
+ && !init->is_pci) {
+ DRM_DEBUG("Restoring AGP flag\n");
+ dev_priv->flags |= RADEON_IS_AGP;
}
}
- if ((!(dev_priv->flags &
CHIP
_IS_AGP)) && !dev->sg) {
+ if ((!(dev_priv->flags &
RADEON
_IS_AGP)) && !dev->sg) {
DRM_ERROR("PCI GART memory not allocated!\n");
radeon_do_cleanup_cp(dev);
return DRM_ERR(EINVAL);
DRM_ERROR("PCI GART memory not allocated!\n");
radeon_do_cleanup_cp(dev);
return DRM_ERR(EINVAL);
@@
-1489,7
+1498,7
@@
static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)
init->sarea_priv_offset);
#if __OS_HAS_AGP
init->sarea_priv_offset);
#if __OS_HAS_AGP
- if (dev_priv->flags &
CHIP
_IS_AGP) {
+ if (dev_priv->flags &
RADEON
_IS_AGP) {
drm_core_ioremap(dev_priv->cp_ring, dev);
drm_core_ioremap(dev_priv->ring_rptr, dev);
drm_core_ioremap(dev->agp_buffer_map, dev);
drm_core_ioremap(dev_priv->cp_ring, dev);
drm_core_ioremap(dev_priv->ring_rptr, dev);
drm_core_ioremap(dev->agp_buffer_map, dev);
@@
-1548,7
+1557,7
@@
static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)
* align it down.
*/
#if __OS_HAS_AGP
* align it down.
*/
#if __OS_HAS_AGP
- if (dev_priv->flags &
CHIP
_IS_AGP) {
+ if (dev_priv->flags &
RADEON
_IS_AGP) {
base = dev->agp->base;
/* Check if valid */
if ((base + dev_priv->gart_size) > dev_priv->fb_location &&
base = dev->agp->base;
/* Check if valid */
if ((base + dev_priv->gart_size) > dev_priv->fb_location &&
@@
-1578,7
+1587,7
@@
static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)
}
#if __OS_HAS_AGP
}
#if __OS_HAS_AGP
- if (dev_priv->flags &
CHIP
_IS_AGP)
+ if (dev_priv->flags &
RADEON
_IS_AGP)
dev_priv->gart_buffers_offset = (dev->agp_buffer_map->offset
- dev->agp->base
+ dev_priv->gart_vm_start);
dev_priv->gart_buffers_offset = (dev->agp_buffer_map->offset
- dev->agp->base
+ dev_priv->gart_vm_start);
@@
-1604,7
+1613,7
@@
static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)
dev_priv->ring.high_mark = RADEON_RING_HIGH_MARK;
#if __OS_HAS_AGP
dev_priv->ring.high_mark = RADEON_RING_HIGH_MARK;
#if __OS_HAS_AGP
- if (dev_priv->flags &
CHIP
_IS_AGP) {
+ if (dev_priv->flags &
RADEON
_IS_AGP) {
/* Turn off PCI GART */
radeon_set_pcigart(dev_priv, 0);
} else
/* Turn off PCI GART */
radeon_set_pcigart(dev_priv, 0);
} else
@@
-1624,7
+1633,7
@@
static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)
dev_priv->gart_info.mapping.handle;
dev_priv->gart_info.is_pcie =
dev_priv->gart_info.mapping.handle;
dev_priv->gart_info.is_pcie =
- !!(dev_priv->flags &
CHIP
_IS_PCIE);
+ !!(dev_priv->flags &
RADEON
_IS_PCIE);
dev_priv->gart_info.gart_table_location =
DRM_ATI_GART_FB;
dev_priv->gart_info.gart_table_location =
DRM_ATI_GART_FB;
@@
-1636,7
+1645,7
@@
static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)
DRM_ATI_GART_MAIN;
dev_priv->gart_info.addr = NULL;
dev_priv->gart_info.bus_addr = 0;
DRM_ATI_GART_MAIN;
dev_priv->gart_info.addr = NULL;
dev_priv->gart_info.bus_addr = 0;
- if (dev_priv->flags &
CHIP
_IS_PCIE) {
+ if (dev_priv->flags &
RADEON
_IS_PCIE) {
DRM_ERROR
("Cannot use PCI Express without GART in FB memory\n");
radeon_do_cleanup_cp(dev);
DRM_ERROR
("Cannot use PCI Express without GART in FB memory\n");
radeon_do_cleanup_cp(dev);
@@
-1678,7
+1687,7
@@
static int radeon_do_cleanup_cp(drm_device_t * dev)
drm_irq_uninstall(dev);
#if __OS_HAS_AGP
drm_irq_uninstall(dev);
#if __OS_HAS_AGP
- if (dev_priv->flags &
CHIP
_IS_AGP) {
+ if (dev_priv->flags &
RADEON
_IS_AGP) {
if (dev_priv->cp_ring != NULL) {
drm_core_ioremapfree(dev_priv->cp_ring, dev);
dev_priv->cp_ring = NULL;
if (dev_priv->cp_ring != NULL) {
drm_core_ioremapfree(dev_priv->cp_ring, dev);
dev_priv->cp_ring = NULL;
@@
-1733,7
+1742,7
@@
static int radeon_do_resume_cp(drm_device_t * dev)
DRM_DEBUG("Starting radeon_do_resume_cp()\n");
#if __OS_HAS_AGP
DRM_DEBUG("Starting radeon_do_resume_cp()\n");
#if __OS_HAS_AGP
- if (dev_priv->flags &
CHIP
_IS_AGP) {
+ if (dev_priv->flags &
RADEON
_IS_AGP) {
/* Turn off PCI GART */
radeon_set_pcigart(dev_priv, 0);
} else
/* Turn off PCI GART */
radeon_set_pcigart(dev_priv, 0);
} else
@@
-2177,13
+2186,15
@@
int radeon_driver_load(struct drm_device *dev, unsigned long flags)
dev->dev_private = (void *)dev_priv;
dev_priv->flags = flags;
dev->dev_private = (void *)dev_priv;
dev_priv->flags = flags;
- switch (flags &
CHIP
_FAMILY_MASK) {
+ switch (flags &
RADEON
_FAMILY_MASK) {
case CHIP_R100:
case CHIP_RV200:
case CHIP_R200:
case CHIP_R300:
case CHIP_R100:
case CHIP_RV200:
case CHIP_R200:
case CHIP_R300:
+ case CHIP_R350:
case CHIP_R420:
case CHIP_R420:
- dev_priv->flags |= CHIP_HAS_HIERZ;
+ case CHIP_RV410:
+ dev_priv->flags |= RADEON_HAS_HIERZ;
break;
default:
/* all other chips have no hierarchical z buffer */
break;
default:
/* all other chips have no hierarchical z buffer */
@@
-2191,13
+2202,14
@@
int radeon_driver_load(struct drm_device *dev, unsigned long flags)
}
if (drm_device_is_agp(dev))
}
if (drm_device_is_agp(dev))
- dev_priv->flags |= CHIP_IS_AGP;
-
- if (drm_device_is_pcie(dev))
- dev_priv->flags |= CHIP_IS_PCIE;
+ dev_priv->flags |= RADEON_IS_AGP;
+ else if (drm_device_is_pcie(dev))
+ dev_priv->flags |= RADEON_IS_PCIE;
+ else
+ dev_priv->flags |= RADEON_IS_PCI;
DRM_DEBUG("%s card detected\n",
DRM_DEBUG("%s card detected\n",
- ((dev_priv->flags &
CHIP_IS_AGP) ? "AGP" : (((dev_priv->flags & CHIP
_IS_PCIE) ? "PCIE" : "PCI"))));
+ ((dev_priv->flags &
RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON
_IS_PCIE) ? "PCIE" : "PCI"))));
return ret;
}
return ret;
}