Deleted Added
full compact
radeon_cp.c (152909) radeon_cp.c (157617)
1/* radeon_cp.c -- CP support for Radeon -*- linux-c -*- */
2/*-
3 * Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
4 * Copyright 2000 VA Linux Systems, Inc., Fremont, California.
5 * All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),

--- 15 unchanged lines hidden (view full) ---

24 * DEALINGS IN THE SOFTWARE.
25 *
26 * Authors:
27 * Kevin E. Martin <martin@valinux.com>
28 * Gareth Hughes <gareth@valinux.com>
29 */
30
31#include <sys/cdefs.h>
1/* radeon_cp.c -- CP support for Radeon -*- linux-c -*- */
2/*-
3 * Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
4 * Copyright 2000 VA Linux Systems, Inc., Fremont, California.
5 * All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),

--- 15 unchanged lines hidden (view full) ---

24 * DEALINGS IN THE SOFTWARE.
25 *
26 * Authors:
27 * Kevin E. Martin <martin@valinux.com>
28 * Gareth Hughes <gareth@valinux.com>
29 */
30
31#include <sys/cdefs.h>
32__FBSDID("$FreeBSD: head/sys/dev/drm/radeon_cp.c 152909 2005-11-28 23:13:57Z anholt $");
32__FBSDID("$FreeBSD: head/sys/dev/drm/radeon_cp.c 157617 2006-04-09 20:45:45Z anholt $");
33
34#include "dev/drm/drmP.h"
35#include "dev/drm/drm.h"
36#include "dev/drm/radeon_drm.h"
37#include "dev/drm/radeon_drv.h"
38#include "dev/drm/r300_reg.h"
39
40#define RADEON_FIFO_DEBUG 0

--- 901 unchanged lines hidden (view full) ---

942{
943 int i;
944 DRM_DEBUG("\n");
945
946 radeon_do_wait_for_idle(dev_priv);
947
948 RADEON_WRITE(RADEON_CP_ME_RAM_ADDR, 0);
949
33
34#include "dev/drm/drmP.h"
35#include "dev/drm/drm.h"
36#include "dev/drm/radeon_drm.h"
37#include "dev/drm/radeon_drv.h"
38#include "dev/drm/r300_reg.h"
39
40#define RADEON_FIFO_DEBUG 0

--- 901 unchanged lines hidden (view full) ---

942{
943 int i;
944 DRM_DEBUG("\n");
945
946 radeon_do_wait_for_idle(dev_priv);
947
948 RADEON_WRITE(RADEON_CP_ME_RAM_ADDR, 0);
949
950 if (dev_priv->microcode_version==UCODE_R200) {
950 if (dev_priv->microcode_version == UCODE_R200) {
951 DRM_INFO("Loading R200 Microcode\n");
952 for (i = 0; i < 256; i++) {
953 RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
954 R200_cp_microcode[i][1]);
955 RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
956 R200_cp_microcode[i][0]);
957 }
951 DRM_INFO("Loading R200 Microcode\n");
952 for (i = 0; i < 256; i++) {
953 RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
954 R200_cp_microcode[i][1]);
955 RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
956 R200_cp_microcode[i][0]);
957 }
958 } else if (dev_priv->microcode_version==UCODE_R300) {
958 } else if (dev_priv->microcode_version == UCODE_R300) {
959 DRM_INFO("Loading R300 Microcode\n");
959 DRM_INFO("Loading R300 Microcode\n");
960 for ( i = 0 ; i < 256 ; i++ ) {
961 RADEON_WRITE( RADEON_CP_ME_RAM_DATAH,
962 R300_cp_microcode[i][1] );
963 RADEON_WRITE( RADEON_CP_ME_RAM_DATAL,
964 R300_cp_microcode[i][0] );
960 for (i = 0; i < 256; i++) {
961 RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
962 R300_cp_microcode[i][1]);
963 RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
964 R300_cp_microcode[i][0]);
965 }
966 } else {
967 for (i = 0; i < 256; i++) {
968 RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
969 radeon_cp_microcode[i][1]);
970 RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
971 radeon_cp_microcode[i][0]);
972 }

--- 143 unchanged lines hidden (view full) ---

1116 return 0;
1117}
1118
1119static void radeon_cp_init_ring_buffer(drm_device_t * dev,
1120 drm_radeon_private_t * dev_priv)
1121{
1122 u32 ring_start, cur_read_ptr;
1123 u32 tmp;
965 }
966 } else {
967 for (i = 0; i < 256; i++) {
968 RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
969 radeon_cp_microcode[i][1]);
970 RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
971 radeon_cp_microcode[i][0]);
972 }

--- 143 unchanged lines hidden (view full) ---

1116 return 0;
1117}
1118
1119static void radeon_cp_init_ring_buffer(drm_device_t * dev,
1120 drm_radeon_private_t * dev_priv)
1121{
1122 u32 ring_start, cur_read_ptr;
1123 u32 tmp;
1124
1125 /* Initialize the memory controller. With new memory map, the fb location
1126 * is not changed, it should have been properly initialized already. Part
1127 * of the problem is that the code below is bogus, assuming the GART is
1128 * always appended to the fb which is not necessarily the case
1129 */
1130 if (!dev_priv->new_memmap)
1131 RADEON_WRITE(RADEON_MC_FB_LOCATION,
1132 ((dev_priv->gart_vm_start - 1) & 0xffff0000)
1133 | (dev_priv->fb_location >> 16));
1124
1134
1125 /* Initialize the memory controller */
1126 RADEON_WRITE(RADEON_MC_FB_LOCATION,
1127 ((dev_priv->gart_vm_start - 1) & 0xffff0000)
1128 | (dev_priv->fb_location >> 16));
1129
1130#if __OS_HAS_AGP
1131 if (dev_priv->flags & CHIP_IS_AGP) {
1135#if __OS_HAS_AGP
1136 if (dev_priv->flags & CHIP_IS_AGP) {
1137 RADEON_WRITE(RADEON_AGP_BASE, (unsigned int)dev->agp->base);
1132 RADEON_WRITE(RADEON_MC_AGP_LOCATION,
1133 (((dev_priv->gart_vm_start - 1 +
1134 dev_priv->gart_size) & 0xffff0000) |
1135 (dev_priv->gart_vm_start >> 16)));
1136
1137 ring_start = (dev_priv->cp_ring->offset
1138 RADEON_WRITE(RADEON_MC_AGP_LOCATION,
1139 (((dev_priv->gart_vm_start - 1 +
1140 dev_priv->gart_size) & 0xffff0000) |
1141 (dev_priv->gart_vm_start >> 16)));
1142
1143 ring_start = (dev_priv->cp_ring->offset
1138 - dev->agp->base + dev_priv->gart_vm_start);
1144 - dev->agp->base
1145 + dev_priv->gart_vm_start);
1139 } else
1140#endif
1141 ring_start = (dev_priv->cp_ring->offset
1146 } else
1147#endif
1148 ring_start = (dev_priv->cp_ring->offset
1142 - (unsigned long)dev->sg->virtual + dev_priv->gart_vm_start);
1149 - (unsigned long)dev->sg->virtual
1150 + dev_priv->gart_vm_start);
1143
1151
1144
1145 RADEON_WRITE(RADEON_CP_RB_BASE, ring_start);
1146
1147 /* Set the write pointer delay */
1148 RADEON_WRITE(RADEON_CP_RB_WPTR_DELAY, 0);
1149
1150 /* Initialize the ring buffer's read and write pointers */
1151 cur_read_ptr = RADEON_READ(RADEON_CP_RB_RPTR);
1152 RADEON_WRITE(RADEON_CP_RB_WPTR, cur_read_ptr);
1153 SET_RING_HEAD(dev_priv, cur_read_ptr);
1154 dev_priv->ring.tail = cur_read_ptr;
1155
1156#if __OS_HAS_AGP
1157 if (dev_priv->flags & CHIP_IS_AGP) {
1152 RADEON_WRITE(RADEON_CP_RB_BASE, ring_start);
1153
1154 /* Set the write pointer delay */
1155 RADEON_WRITE(RADEON_CP_RB_WPTR_DELAY, 0);
1156
1157 /* Initialize the ring buffer's read and write pointers */
1158 cur_read_ptr = RADEON_READ(RADEON_CP_RB_RPTR);
1159 RADEON_WRITE(RADEON_CP_RB_WPTR, cur_read_ptr);
1160 SET_RING_HEAD(dev_priv, cur_read_ptr);
1161 dev_priv->ring.tail = cur_read_ptr;
1162
1163#if __OS_HAS_AGP
1164 if (dev_priv->flags & CHIP_IS_AGP) {
1158 /* set RADEON_AGP_BASE here instead of relying on X from user space */
1159 RADEON_WRITE(RADEON_AGP_BASE, (unsigned int)dev->agp->base);
1160 RADEON_WRITE(RADEON_CP_RB_RPTR_ADDR,
1161 dev_priv->ring_rptr->offset
1162 - dev->agp->base + dev_priv->gart_vm_start);
1163 } else
1164#endif
1165 {
1166 drm_sg_mem_t *entry = dev->sg;
1167 unsigned long tmp_ofs, page_ofs;
1168
1165 RADEON_WRITE(RADEON_CP_RB_RPTR_ADDR,
1166 dev_priv->ring_rptr->offset
1167 - dev->agp->base + dev_priv->gart_vm_start);
1168 } else
1169#endif
1170 {
1171 drm_sg_mem_t *entry = dev->sg;
1172 unsigned long tmp_ofs, page_ofs;
1173
1169 tmp_ofs = dev_priv->ring_rptr->offset - (unsigned long)dev->sg->virtual;
1174 tmp_ofs = dev_priv->ring_rptr->offset -
1175 (unsigned long)dev->sg->virtual;
1170 page_ofs = tmp_ofs >> PAGE_SHIFT;
1171
1172 RADEON_WRITE(RADEON_CP_RB_RPTR_ADDR, entry->busaddr[page_ofs]);
1173 DRM_DEBUG("ring rptr: offset=0x%08lx handle=0x%08lx\n",
1174 (unsigned long)entry->busaddr[page_ofs],
1175 entry->handle + tmp_ofs);
1176 }
1177
1176 page_ofs = tmp_ofs >> PAGE_SHIFT;
1177
1178 RADEON_WRITE(RADEON_CP_RB_RPTR_ADDR, entry->busaddr[page_ofs]);
1179 DRM_DEBUG("ring rptr: offset=0x%08lx handle=0x%08lx\n",
1180 (unsigned long)entry->busaddr[page_ofs],
1181 entry->handle + tmp_ofs);
1182 }
1183
1184 /* Set ring buffer size */
1185#ifdef __BIG_ENDIAN
1186 RADEON_WRITE(RADEON_CP_RB_CNTL,
1187 dev_priv->ring.size_l2qw | RADEON_BUF_SWAP_32BIT);
1188#else
1189 RADEON_WRITE(RADEON_CP_RB_CNTL, dev_priv->ring.size_l2qw);
1190#endif
1191
1192 /* Start with assuming that writeback doesn't work */
1193 dev_priv->writeback_works = 0;
1194
1178 /* Initialize the scratch register pointer. This will cause
1179 * the scratch register values to be written out to memory
1180 * whenever they are updated.
1181 *
1182 * We simply put this behind the ring read pointer, this works
1183 * with PCI GART as well as (whatever kind of) AGP GART
1184 */
1185 RADEON_WRITE(RADEON_SCRATCH_ADDR, RADEON_READ(RADEON_CP_RB_RPTR_ADDR)
1186 + RADEON_SCRATCH_REG_OFFSET);
1187
1188 dev_priv->scratch = ((__volatile__ u32 *)
1189 dev_priv->ring_rptr->handle +
1190 (RADEON_SCRATCH_REG_OFFSET / sizeof(u32)));
1191
1192 RADEON_WRITE(RADEON_SCRATCH_UMSK, 0x7);
1193
1195 /* Initialize the scratch register pointer. This will cause
1196 * the scratch register values to be written out to memory
1197 * whenever they are updated.
1198 *
1199 * We simply put this behind the ring read pointer, this works
1200 * with PCI GART as well as (whatever kind of) AGP GART
1201 */
1202 RADEON_WRITE(RADEON_SCRATCH_ADDR, RADEON_READ(RADEON_CP_RB_RPTR_ADDR)
1203 + RADEON_SCRATCH_REG_OFFSET);
1204
1205 dev_priv->scratch = ((__volatile__ u32 *)
1206 dev_priv->ring_rptr->handle +
1207 (RADEON_SCRATCH_REG_OFFSET / sizeof(u32)));
1208
1209 RADEON_WRITE(RADEON_SCRATCH_UMSK, 0x7);
1210
1194 /* Writeback doesn't seem to work everywhere, test it first */
1195 DRM_WRITE32(dev_priv->ring_rptr, RADEON_SCRATCHOFF(1), 0);
1196 RADEON_WRITE(RADEON_SCRATCH_REG1, 0xdeadbeef);
1211 /* Turn on bus mastering */
1212 tmp = RADEON_READ(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS;
1213 RADEON_WRITE(RADEON_BUS_CNTL, tmp);
1197
1214
1198 for (tmp = 0; tmp < dev_priv->usec_timeout; tmp++) {
1199 if (DRM_READ32(dev_priv->ring_rptr, RADEON_SCRATCHOFF(1)) ==
1200 0xdeadbeef)
1201 break;
1202 DRM_UDELAY(1);
1203 }
1204
1205 if (tmp < dev_priv->usec_timeout) {
1206 dev_priv->writeback_works = 1;
1207 DRM_DEBUG("writeback test succeeded, tmp=%d\n", tmp);
1208 } else {
1209 dev_priv->writeback_works = 0;
1210 DRM_DEBUG("writeback test failed\n");
1211 }
1212 if (radeon_no_wb == 1) {
1213 dev_priv->writeback_works = 0;
1214 DRM_DEBUG("writeback forced off\n");
1215 }
1216
1217 dev_priv->sarea_priv->last_frame = dev_priv->scratch[0] = 0;
1218 RADEON_WRITE(RADEON_LAST_FRAME_REG, dev_priv->sarea_priv->last_frame);
1219
1220 dev_priv->sarea_priv->last_dispatch = dev_priv->scratch[1] = 0;
1221 RADEON_WRITE(RADEON_LAST_DISPATCH_REG,
1222 dev_priv->sarea_priv->last_dispatch);
1223
1224 dev_priv->sarea_priv->last_clear = dev_priv->scratch[2] = 0;
1225 RADEON_WRITE(RADEON_LAST_CLEAR_REG, dev_priv->sarea_priv->last_clear);
1226
1215 dev_priv->sarea_priv->last_frame = dev_priv->scratch[0] = 0;
1216 RADEON_WRITE(RADEON_LAST_FRAME_REG, dev_priv->sarea_priv->last_frame);
1217
1218 dev_priv->sarea_priv->last_dispatch = dev_priv->scratch[1] = 0;
1219 RADEON_WRITE(RADEON_LAST_DISPATCH_REG,
1220 dev_priv->sarea_priv->last_dispatch);
1221
1222 dev_priv->sarea_priv->last_clear = dev_priv->scratch[2] = 0;
1223 RADEON_WRITE(RADEON_LAST_CLEAR_REG, dev_priv->sarea_priv->last_clear);
1224
1227 /* Set ring buffer size */
1228#ifdef __BIG_ENDIAN
1229 RADEON_WRITE(RADEON_CP_RB_CNTL,
1230 dev_priv->ring.size_l2qw | RADEON_BUF_SWAP_32BIT);
1231#else
1232 RADEON_WRITE(RADEON_CP_RB_CNTL, dev_priv->ring.size_l2qw);
1233#endif
1234
1235 radeon_do_wait_for_idle(dev_priv);
1236
1225 radeon_do_wait_for_idle(dev_priv);
1226
1237 /* Turn on bus mastering */
1238 tmp = RADEON_READ(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS;
1239 RADEON_WRITE(RADEON_BUS_CNTL, tmp);
1240
1241 /* Sync everything up */
1242 RADEON_WRITE(RADEON_ISYNC_CNTL,
1243 (RADEON_ISYNC_ANY2D_IDLE3D |
1244 RADEON_ISYNC_ANY3D_IDLE2D |
1245 RADEON_ISYNC_WAIT_IDLEGUI |
1246 RADEON_ISYNC_CPSCRATCH_IDLEGUI));
1227 /* Sync everything up */
1228 RADEON_WRITE(RADEON_ISYNC_CNTL,
1229 (RADEON_ISYNC_ANY2D_IDLE3D |
1230 RADEON_ISYNC_ANY3D_IDLE2D |
1231 RADEON_ISYNC_WAIT_IDLEGUI |
1232 RADEON_ISYNC_CPSCRATCH_IDLEGUI));
1233
1247}
1248
1234}
1235
1236static void radeon_test_writeback(drm_radeon_private_t * dev_priv)
1237{
1238 u32 tmp;
1239
1240 /* Writeback doesn't seem to work everywhere, test it here and possibly
1241 * enable it if it appears to work
1242 */
1243 DRM_WRITE32(dev_priv->ring_rptr, RADEON_SCRATCHOFF(1), 0);
1244 RADEON_WRITE(RADEON_SCRATCH_REG1, 0xdeadbeef);
1245
1246 for (tmp = 0; tmp < dev_priv->usec_timeout; tmp++) {
1247 if (DRM_READ32(dev_priv->ring_rptr, RADEON_SCRATCHOFF(1)) ==
1248 0xdeadbeef)
1249 break;
1250 DRM_UDELAY(1);
1251 }
1252
1253 if (tmp < dev_priv->usec_timeout) {
1254 dev_priv->writeback_works = 1;
1255 DRM_INFO("writeback test succeeded in %d usecs\n", tmp);
1256 } else {
1257 dev_priv->writeback_works = 0;
1258 DRM_INFO("writeback test failed\n");
1259 }
1260 if (radeon_no_wb == 1) {
1261 dev_priv->writeback_works = 0;
1262 DRM_INFO("writeback forced off\n");
1263 }
1264}
1265
1249/* Enable or disable PCI-E GART on the chip */
1250static void radeon_set_pciegart(drm_radeon_private_t * dev_priv, int on)
1251{
1252 u32 tmp = RADEON_READ_PCIE(dev_priv, RADEON_PCIE_TX_GART_CNTL);
1253 if (on) {
1254
1255 DRM_DEBUG("programming pcie %08X %08lX %08X\n",
1266/* Enable or disable PCI-E GART on the chip */
1267static void radeon_set_pciegart(drm_radeon_private_t * dev_priv, int on)
1268{
1269 u32 tmp = RADEON_READ_PCIE(dev_priv, RADEON_PCIE_TX_GART_CNTL);
1270 if (on) {
1271
1272 DRM_DEBUG("programming pcie %08X %08lX %08X\n",
1256 dev_priv->gart_vm_start, (long)dev_priv->gart_info.bus_addr,
1273 dev_priv->gart_vm_start,
1274 (long)dev_priv->gart_info.bus_addr,
1257 dev_priv->gart_size);
1275 dev_priv->gart_size);
1258 RADEON_WRITE_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_LO, dev_priv->gart_vm_start);
1259 RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_BASE, dev_priv->gart_info.bus_addr);
1260 RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_START_LO, dev_priv->gart_vm_start);
1261 RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_END_LO, dev_priv->gart_vm_start
1262 + dev_priv->gart_size - 1);
1276 RADEON_WRITE_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_LO,
1277 dev_priv->gart_vm_start);
1278 RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_BASE,
1279 dev_priv->gart_info.bus_addr);
1280 RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_START_LO,
1281 dev_priv->gart_vm_start);
1282 RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_END_LO,
1283 dev_priv->gart_vm_start +
1284 dev_priv->gart_size - 1);
1263
1264 RADEON_WRITE(RADEON_MC_AGP_LOCATION, 0xffffffc0); /* ?? */
1265
1285
1286 RADEON_WRITE(RADEON_MC_AGP_LOCATION, 0xffffffc0); /* ?? */
1287
1266 RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_CNTL, RADEON_PCIE_TX_GART_EN);
1288 RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_CNTL,
1289 RADEON_PCIE_TX_GART_EN);
1267 } else {
1290 } else {
1268 RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_CNTL, (tmp & ~RADEON_PCIE_TX_GART_EN) | RADEON_PCIE_TX_GART_INVALIDATE_TLB);
1291 RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_CNTL,
1292 tmp & ~RADEON_PCIE_TX_GART_EN);
1269 }
1270}
1271
1272/* Enable or disable PCI GART on the chip */
1273static void radeon_set_pcigart(drm_radeon_private_t * dev_priv, int on)
1274{
1275 u32 tmp;
1276
1293 }
1294}
1295
1296/* Enable or disable PCI GART on the chip */
1297static void radeon_set_pcigart(drm_radeon_private_t * dev_priv, int on)
1298{
1299 u32 tmp;
1300
1277 if (dev_priv->flags & CHIP_IS_PCIE)
1278 {
1301 if (dev_priv->flags & CHIP_IS_PCIE) {
1279 radeon_set_pciegart(dev_priv, on);
1280 return;
1281 }
1282
1283 tmp = RADEON_READ(RADEON_AIC_CNTL);
1284
1285 if (on) {
1286 RADEON_WRITE(RADEON_AIC_CNTL,

--- 17 unchanged lines hidden (view full) ---

1304 RADEON_WRITE(RADEON_AIC_CNTL,
1305 tmp & ~RADEON_PCIGART_TRANSLATE_EN);
1306 }
1307}
1308
1309static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)
1310{
1311 drm_radeon_private_t *dev_priv = dev->dev_private;
1302 radeon_set_pciegart(dev_priv, on);
1303 return;
1304 }
1305
1306 tmp = RADEON_READ(RADEON_AIC_CNTL);
1307
1308 if (on) {
1309 RADEON_WRITE(RADEON_AIC_CNTL,

--- 17 unchanged lines hidden (view full) ---

1327 RADEON_WRITE(RADEON_AIC_CNTL,
1328 tmp & ~RADEON_PCIGART_TRANSLATE_EN);
1329 }
1330}
1331
1332static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)
1333{
1334 drm_radeon_private_t *dev_priv = dev->dev_private;
1335
1312 DRM_DEBUG("\n");
1313
1336 DRM_DEBUG("\n");
1337
1338 /* if we require new memory map but we don't have it fail */
1339 if ((dev_priv->flags & CHIP_NEW_MEMMAP) && !dev_priv->new_memmap)
1340 {
1341 DRM_ERROR("Cannot initialise DRM on this card\nThis card requires a new X.org DDX for 3D\n");
1342 radeon_do_cleanup_cp(dev);
1343 return DRM_ERR(EINVAL);
1344 }
1345
1314 if (init->is_pci && (dev_priv->flags & CHIP_IS_AGP))
1315 {
1316 DRM_DEBUG("Forcing AGP card to PCI mode\n");
1317 dev_priv->flags &= ~CHIP_IS_AGP;
1318 }
1319
1320 if ((!(dev_priv->flags & CHIP_IS_AGP)) && !dev->sg) {
1321 DRM_ERROR("PCI GART memory not allocated!\n");

--- 6 unchanged lines hidden (view full) ---

1328 dev_priv->usec_timeout > RADEON_MAX_USEC_TIMEOUT) {
1329 DRM_DEBUG("TIMEOUT problem!\n");
1330 radeon_do_cleanup_cp(dev);
1331 return DRM_ERR(EINVAL);
1332 }
1333
1334 switch(init->func) {
1335 case RADEON_INIT_R200_CP:
1346 if (init->is_pci && (dev_priv->flags & CHIP_IS_AGP))
1347 {
1348 DRM_DEBUG("Forcing AGP card to PCI mode\n");
1349 dev_priv->flags &= ~CHIP_IS_AGP;
1350 }
1351
1352 if ((!(dev_priv->flags & CHIP_IS_AGP)) && !dev->sg) {
1353 DRM_ERROR("PCI GART memory not allocated!\n");

--- 6 unchanged lines hidden (view full) ---

1360 dev_priv->usec_timeout > RADEON_MAX_USEC_TIMEOUT) {
1361 DRM_DEBUG("TIMEOUT problem!\n");
1362 radeon_do_cleanup_cp(dev);
1363 return DRM_ERR(EINVAL);
1364 }
1365
1366 switch(init->func) {
1367 case RADEON_INIT_R200_CP:
1336 dev_priv->microcode_version=UCODE_R200;
1368 dev_priv->microcode_version = UCODE_R200;
1337 break;
1338 case RADEON_INIT_R300_CP:
1369 break;
1370 case RADEON_INIT_R300_CP:
1339 dev_priv->microcode_version=UCODE_R300;
1371 dev_priv->microcode_version = UCODE_R300;
1340 break;
1341 default:
1372 break;
1373 default:
1342 dev_priv->microcode_version=UCODE_R100;
1343 break;
1374 dev_priv->microcode_version = UCODE_R100;
1344 }
1345
1346 dev_priv->do_boxes = 0;
1347 dev_priv->cp_mode = init->cp_mode;
1348
1349 /* We don't support anything other than bus-mastering ring mode,
1350 * but the ring can be in either AGP or PCI space for the ring
1351 * read pointer.

--- 33 unchanged lines hidden (view full) ---

1385
1386 /* Hardware state for depth clears. Remove this if/when we no
1387 * longer clear the depth buffer with a 3D rectangle. Hard-code
1388 * all values to prevent unwanted 3D state from slipping through
1389 * and screwing with the clear operation.
1390 */
1391 dev_priv->depth_clear.rb3d_cntl = (RADEON_PLANE_MASK_ENABLE |
1392 (dev_priv->color_fmt << 10) |
1375 }
1376
1377 dev_priv->do_boxes = 0;
1378 dev_priv->cp_mode = init->cp_mode;
1379
1380 /* We don't support anything other than bus-mastering ring mode,
1381 * but the ring can be in either AGP or PCI space for the ring
1382 * read pointer.

--- 33 unchanged lines hidden (view full) ---

1416
1417 /* Hardware state for depth clears. Remove this if/when we no
1418 * longer clear the depth buffer with a 3D rectangle. Hard-code
1419 * all values to prevent unwanted 3D state from slipping through
1420 * and screwing with the clear operation.
1421 */
1422 dev_priv->depth_clear.rb3d_cntl = (RADEON_PLANE_MASK_ENABLE |
1423 (dev_priv->color_fmt << 10) |
1393 (dev_priv->microcode_version == UCODE_R100 ?
1394 RADEON_ZBLOCK16 : 0));
1424 (dev_priv->microcode_version ==
1425 UCODE_R100 ? RADEON_ZBLOCK16 : 0));
1395
1396 dev_priv->depth_clear.rb3d_zstencilcntl =
1397 (dev_priv->depth_fmt |
1398 RADEON_Z_TEST_ALWAYS |
1399 RADEON_STENCIL_TEST_ALWAYS |
1400 RADEON_STENCIL_S_FAIL_REPLACE |
1401 RADEON_STENCIL_ZPASS_REPLACE |
1402 RADEON_STENCIL_ZFAIL_REPLACE | RADEON_Z_WRITE_ENABLE);

--- 83 unchanged lines hidden (view full) ---

1486 DRM_DEBUG("dev_priv->ring_rptr->handle %p\n",
1487 dev_priv->ring_rptr->handle);
1488 DRM_DEBUG("dev->agp_buffer_map->handle %p\n",
1489 dev->agp_buffer_map->handle);
1490 }
1491
1492 dev_priv->fb_location = (RADEON_READ(RADEON_MC_FB_LOCATION)
1493 & 0xffff) << 16;
1426
1427 dev_priv->depth_clear.rb3d_zstencilcntl =
1428 (dev_priv->depth_fmt |
1429 RADEON_Z_TEST_ALWAYS |
1430 RADEON_STENCIL_TEST_ALWAYS |
1431 RADEON_STENCIL_S_FAIL_REPLACE |
1432 RADEON_STENCIL_ZPASS_REPLACE |
1433 RADEON_STENCIL_ZFAIL_REPLACE | RADEON_Z_WRITE_ENABLE);

--- 83 unchanged lines hidden (view full) ---

1517 DRM_DEBUG("dev_priv->ring_rptr->handle %p\n",
1518 dev_priv->ring_rptr->handle);
1519 DRM_DEBUG("dev->agp_buffer_map->handle %p\n",
1520 dev->agp_buffer_map->handle);
1521 }
1522
1523 dev_priv->fb_location = (RADEON_READ(RADEON_MC_FB_LOCATION)
1524 & 0xffff) << 16;
1525 dev_priv->fb_size =
1526 ((RADEON_READ(RADEON_MC_FB_LOCATION) & 0xffff0000u) + 0x10000)
1527 - dev_priv->fb_location;
1494
1495 dev_priv->front_pitch_offset = (((dev_priv->front_pitch / 64) << 22) |
1496 ((dev_priv->front_offset
1497 + dev_priv->fb_location) >> 10));
1498
1499 dev_priv->back_pitch_offset = (((dev_priv->back_pitch / 64) << 22) |
1500 ((dev_priv->back_offset
1501 + dev_priv->fb_location) >> 10));
1502
1503 dev_priv->depth_pitch_offset = (((dev_priv->depth_pitch / 64) << 22) |
1504 ((dev_priv->depth_offset
1505 + dev_priv->fb_location) >> 10));
1506
1507 dev_priv->gart_size = init->gart_size;
1528
1529 dev_priv->front_pitch_offset = (((dev_priv->front_pitch / 64) << 22) |
1530 ((dev_priv->front_offset
1531 + dev_priv->fb_location) >> 10));
1532
1533 dev_priv->back_pitch_offset = (((dev_priv->back_pitch / 64) << 22) |
1534 ((dev_priv->back_offset
1535 + dev_priv->fb_location) >> 10));
1536
1537 dev_priv->depth_pitch_offset = (((dev_priv->depth_pitch / 64) << 22) |
1538 ((dev_priv->depth_offset
1539 + dev_priv->fb_location) >> 10));
1540
1541 dev_priv->gart_size = init->gart_size;
1508 dev_priv->gart_vm_start = dev_priv->fb_location
1509 + RADEON_READ(RADEON_CONFIG_APER_SIZE);
1510
1542
1543 /* New let's set the memory map ... */
1544 if (dev_priv->new_memmap) {
1545 u32 base = 0;
1546
1547 DRM_INFO("Setting GART location based on new memory map\n");
1548
1549 /* If using AGP, try to locate the AGP aperture at the same
1550 * location in the card and on the bus, though we have to
1551 * align it down.
1552 */
1511#if __OS_HAS_AGP
1553#if __OS_HAS_AGP
1554 if (dev_priv->flags & CHIP_IS_AGP) {
1555 base = dev->agp->base;
1556 /* Check if valid */
1557 if ((base + dev_priv->gart_size) > dev_priv->fb_location &&
1558 base < (dev_priv->fb_location + dev_priv->fb_size)) {
1559 DRM_INFO("Can't use AGP base @0x%08lx, won't fit\n",
1560 dev->agp->base);
1561 base = 0;
1562 }
1563 }
1564#endif
1565 /* If not or if AGP is at 0 (Macs), try to put it elsewhere */
1566 if (base == 0) {
1567 base = dev_priv->fb_location + dev_priv->fb_size;
1568 if (((base + dev_priv->gart_size) & 0xfffffffful)
1569 < base)
1570 base = dev_priv->fb_location
1571 - dev_priv->gart_size;
1572 }
1573 dev_priv->gart_vm_start = base & 0xffc00000u;
1574 if (dev_priv->gart_vm_start != base)
1575 DRM_INFO("GART aligned down from 0x%08x to 0x%08x\n",
1576 base, dev_priv->gart_vm_start);
1577 } else {
1578 DRM_INFO("Setting GART location based on old memory map\n");
1579 dev_priv->gart_vm_start = dev_priv->fb_location +
1580 RADEON_READ(RADEON_CONFIG_APER_SIZE);
1581 }
1582
1583#if __OS_HAS_AGP
1512 if (dev_priv->flags & CHIP_IS_AGP)
1513 dev_priv->gart_buffers_offset = (dev->agp_buffer_map->offset
1514 - dev->agp->base
1515 + dev_priv->gart_vm_start);
1516 else
1517#endif
1518 dev_priv->gart_buffers_offset = (dev->agp_buffer_map->offset
1584 if (dev_priv->flags & CHIP_IS_AGP)
1585 dev_priv->gart_buffers_offset = (dev->agp_buffer_map->offset
1586 - dev->agp->base
1587 + dev_priv->gart_vm_start);
1588 else
1589#endif
1590 dev_priv->gart_buffers_offset = (dev->agp_buffer_map->offset
1519 - (unsigned long)dev->sg->virtual
1520 + dev_priv->gart_vm_start);
1591 - (unsigned long)dev->sg->virtual
1592 + dev_priv->gart_vm_start);
1521
1522 DRM_DEBUG("dev_priv->gart_size %d\n", dev_priv->gart_size);
1523 DRM_DEBUG("dev_priv->gart_vm_start 0x%x\n", dev_priv->gart_vm_start);
1524 DRM_DEBUG("dev_priv->gart_buffers_offset 0x%lx\n",
1525 dev_priv->gart_buffers_offset);
1526
1527 dev_priv->ring.start = (u32 *) dev_priv->cp_ring->handle;
1528 dev_priv->ring.end = ((u32 *) dev_priv->cp_ring->handle

--- 9 unchanged lines hidden (view full) ---

1538 if (dev_priv->flags & CHIP_IS_AGP) {
1539 /* Turn off PCI GART */
1540 radeon_set_pcigart(dev_priv, 0);
1541 } else
1542#endif
1543 {
1544 /* if we have an offset set from userspace */
1545 if (dev_priv->pcigart_offset) {
1593
1594 DRM_DEBUG("dev_priv->gart_size %d\n", dev_priv->gart_size);
1595 DRM_DEBUG("dev_priv->gart_vm_start 0x%x\n", dev_priv->gart_vm_start);
1596 DRM_DEBUG("dev_priv->gart_buffers_offset 0x%lx\n",
1597 dev_priv->gart_buffers_offset);
1598
1599 dev_priv->ring.start = (u32 *) dev_priv->cp_ring->handle;
1600 dev_priv->ring.end = ((u32 *) dev_priv->cp_ring->handle

--- 9 unchanged lines hidden (view full) ---

1610 if (dev_priv->flags & CHIP_IS_AGP) {
1611 /* Turn off PCI GART */
1612 radeon_set_pcigart(dev_priv, 0);
1613 } else
1614#endif
1615 {
1616 /* if we have an offset set from userspace */
1617 if (dev_priv->pcigart_offset) {
1546 dev_priv->gart_info.bus_addr = dev_priv->pcigart_offset + dev_priv->fb_location;
1547 dev_priv->gart_info.mapping.offset = dev_priv->gart_info.bus_addr;
1548 dev_priv->gart_info.mapping.size = RADEON_PCIGART_TABLE_SIZE;
1618 dev_priv->gart_info.bus_addr =
1619 dev_priv->pcigart_offset + dev_priv->fb_location;
1620 dev_priv->gart_info.mapping.offset =
1621 dev_priv->gart_info.bus_addr;
1622 dev_priv->gart_info.mapping.size =
1623 RADEON_PCIGART_TABLE_SIZE;
1624
1549 drm_core_ioremap(&dev_priv->gart_info.mapping, dev);
1625 drm_core_ioremap(&dev_priv->gart_info.mapping, dev);
1550 dev_priv->gart_info.addr = dev_priv->gart_info.mapping.handle;
1626 dev_priv->gart_info.addr =
1627 dev_priv->gart_info.mapping.handle;
1551
1628
1552 dev_priv->gart_info.is_pcie = !!(dev_priv->flags & CHIP_IS_PCIE);
1553 dev_priv->gart_info.gart_table_location = DRM_ATI_GART_FB;
1554
1555 DRM_DEBUG("Setting phys_pci_gart to %p %08lX\n", dev_priv->gart_info.addr, dev_priv->pcigart_offset);
1556 }
1557 else {
1558 dev_priv->gart_info.gart_table_location = DRM_ATI_GART_MAIN;
1629 dev_priv->gart_info.is_pcie =
1630 !!(dev_priv->flags & CHIP_IS_PCIE);
1631 dev_priv->gart_info.gart_table_location =
1632 DRM_ATI_GART_FB;
1633
1634 DRM_DEBUG("Setting phys_pci_gart to %p %08lX\n",
1635 dev_priv->gart_info.addr,
1636 dev_priv->pcigart_offset);
1637 } else {
1638 dev_priv->gart_info.gart_table_location =
1639 DRM_ATI_GART_MAIN;
1559 dev_priv->gart_info.addr = NULL;
1560 dev_priv->gart_info.bus_addr = 0;
1640 dev_priv->gart_info.addr = NULL;
1641 dev_priv->gart_info.bus_addr = 0;
1561 if (dev_priv->flags & CHIP_IS_PCIE)
1562 {
1563 DRM_ERROR("Cannot use PCI Express without GART in FB memory\n");
1642 if (dev_priv->flags & CHIP_IS_PCIE) {
1643 DRM_ERROR
1644 ("Cannot use PCI Express without GART in FB memory\n");
1564 radeon_do_cleanup_cp(dev);
1565 return DRM_ERR(EINVAL);
1566 }
1567 }
1568
1569 if (!drm_ati_pcigart_init(dev, &dev_priv->gart_info)) {
1570 DRM_ERROR("failed to init PCI GART!\n");
1571 radeon_do_cleanup_cp(dev);

--- 5 unchanged lines hidden (view full) ---

1577 }
1578
1579 radeon_cp_load_microcode(dev_priv);
1580 radeon_cp_init_ring_buffer(dev, dev_priv);
1581
1582 dev_priv->last_buf = 0;
1583
1584 radeon_do_engine_reset(dev);
1645 radeon_do_cleanup_cp(dev);
1646 return DRM_ERR(EINVAL);
1647 }
1648 }
1649
1650 if (!drm_ati_pcigart_init(dev, &dev_priv->gart_info)) {
1651 DRM_ERROR("failed to init PCI GART!\n");
1652 radeon_do_cleanup_cp(dev);

--- 5 unchanged lines hidden (view full) ---

1658 }
1659
1660 radeon_cp_load_microcode(dev_priv);
1661 radeon_cp_init_ring_buffer(dev, dev_priv);
1662
1663 dev_priv->last_buf = 0;
1664
1665 radeon_do_engine_reset(dev);
1666 radeon_test_writeback(dev_priv);
1585
1586 return 0;
1587}
1588
1589static int radeon_do_cleanup_cp(drm_device_t * dev)
1590{
1591 drm_radeon_private_t *dev_priv = dev->dev_private;
1592 DRM_DEBUG("\n");

--- 86 unchanged lines hidden (view full) ---

1679 DRM_DEVICE;
1680 drm_radeon_init_t init;
1681
1682 LOCK_TEST_WITH_RETURN(dev, filp);
1683
1684 DRM_COPY_FROM_USER_IOCTL(init, (drm_radeon_init_t __user *) data,
1685 sizeof(init));
1686
1667
1668 return 0;
1669}
1670
1671static int radeon_do_cleanup_cp(drm_device_t * dev)
1672{
1673 drm_radeon_private_t *dev_priv = dev->dev_private;
1674 DRM_DEBUG("\n");

--- 86 unchanged lines hidden (view full) ---

1761 DRM_DEVICE;
1762 drm_radeon_init_t init;
1763
1764 LOCK_TEST_WITH_RETURN(dev, filp);
1765
1766 DRM_COPY_FROM_USER_IOCTL(init, (drm_radeon_init_t __user *) data,
1767 sizeof(init));
1768
1687 if(init.func == RADEON_INIT_R300_CP)
1769 if (init.func == RADEON_INIT_R300_CP)
1688 r300_init_reg_flags();
1770 r300_init_reg_flags();
1689
1771
1690 switch (init.func) {
1691 case RADEON_INIT_CP:
1692 case RADEON_INIT_R200_CP:
1693 case RADEON_INIT_R300_CP:
1694 return radeon_do_init_cp(dev, &init);
1695 case RADEON_CLEANUP_CP:
1696 return radeon_do_cleanup_cp(dev);
1697 }

--- 72 unchanged lines hidden (view full) ---

1770}
1771
1772void radeon_do_release(drm_device_t * dev)
1773{
1774 drm_radeon_private_t *dev_priv = dev->dev_private;
1775 int i, ret;
1776
1777 if (dev_priv) {
1772 switch (init.func) {
1773 case RADEON_INIT_CP:
1774 case RADEON_INIT_R200_CP:
1775 case RADEON_INIT_R300_CP:
1776 return radeon_do_init_cp(dev, &init);
1777 case RADEON_CLEANUP_CP:
1778 return radeon_do_cleanup_cp(dev);
1779 }

--- 72 unchanged lines hidden (view full) ---

1852}
1853
1854void radeon_do_release(drm_device_t * dev)
1855{
1856 drm_radeon_private_t *dev_priv = dev->dev_private;
1857 int i, ret;
1858
1859 if (dev_priv) {
1778
1779 if (dev_priv->cp_running) {
1780 /* Stop the cp */
1781 while ((ret = radeon_do_cp_idle(dev_priv)) != 0) {
1782 DRM_DEBUG("radeon_do_cp_idle %d\n", ret);
1783#ifdef __linux__
1784 schedule();
1785#else
1786#if defined(__FreeBSD__) && __FreeBSD_version > 500000

--- 7 unchanged lines hidden (view full) ---

1794 radeon_do_cp_stop(dev_priv);
1795 radeon_do_engine_reset(dev);
1796 }
1797
1798 /* Disable *all* interrupts */
1799 if (dev_priv->mmio) /* remove this after permanent addmaps */
1800 RADEON_WRITE(RADEON_GEN_INT_CNTL, 0);
1801
1860 if (dev_priv->cp_running) {
1861 /* Stop the cp */
1862 while ((ret = radeon_do_cp_idle(dev_priv)) != 0) {
1863 DRM_DEBUG("radeon_do_cp_idle %d\n", ret);
1864#ifdef __linux__
1865 schedule();
1866#else
1867#if defined(__FreeBSD__) && __FreeBSD_version > 500000

--- 7 unchanged lines hidden (view full) ---

1875 radeon_do_cp_stop(dev_priv);
1876 radeon_do_engine_reset(dev);
1877 }
1878
1879 /* Disable *all* interrupts */
1880 if (dev_priv->mmio) /* remove this after permanent addmaps */
1881 RADEON_WRITE(RADEON_GEN_INT_CNTL, 0);
1882
1802 if (dev_priv->mmio) {/* remove all surfaces */
1883 if (dev_priv->mmio) { /* remove all surfaces */
1803 for (i = 0; i < RADEON_MAX_SURFACES; i++) {
1884 for (i = 0; i < RADEON_MAX_SURFACES; i++) {
1804 RADEON_WRITE(RADEON_SURFACE0_INFO + 16*i, 0);
1805 RADEON_WRITE(RADEON_SURFACE0_LOWER_BOUND + 16*i, 0);
1806 RADEON_WRITE(RADEON_SURFACE0_UPPER_BOUND + 16*i, 0);
1885 RADEON_WRITE(RADEON_SURFACE0_INFO + 16 * i, 0);
1886 RADEON_WRITE(RADEON_SURFACE0_LOWER_BOUND +
1887 16 * i, 0);
1888 RADEON_WRITE(RADEON_SURFACE0_UPPER_BOUND +
1889 16 * i, 0);
1807 }
1808 }
1809
1810 /* Free memory heap structures */
1811 radeon_mem_takedown(&(dev_priv->gart_heap));
1812 radeon_mem_takedown(&(dev_priv->fb_heap));
1813
1814 /* deallocate kernel resources */

--- 287 unchanged lines hidden (view full) ---

2102 dev->dev_private = (void *)dev_priv;
2103 dev_priv->flags = flags;
2104
2105 switch (flags & CHIP_FAMILY_MASK) {
2106 case CHIP_R100:
2107 case CHIP_RV200:
2108 case CHIP_R200:
2109 case CHIP_R300:
1890 }
1891 }
1892
1893 /* Free memory heap structures */
1894 radeon_mem_takedown(&(dev_priv->gart_heap));
1895 radeon_mem_takedown(&(dev_priv->fb_heap));
1896
1897 /* deallocate kernel resources */

--- 287 unchanged lines hidden (view full) ---

2185 dev->dev_private = (void *)dev_priv;
2186 dev_priv->flags = flags;
2187
2188 switch (flags & CHIP_FAMILY_MASK) {
2189 case CHIP_R100:
2190 case CHIP_RV200:
2191 case CHIP_R200:
2192 case CHIP_R300:
2193 case CHIP_R350:
2110 case CHIP_R420:
2194 case CHIP_R420:
2195 case CHIP_RV410:
2111 dev_priv->flags |= CHIP_HAS_HIERZ;
2112 break;
2113 default:
2196 dev_priv->flags |= CHIP_HAS_HIERZ;
2197 break;
2198 default:
2114 /* all other chips have no hierarchical z buffer */
2199 /* all other chips have no hierarchical z buffer */
2115 break;
2116 }
2117
2118 if (drm_device_is_agp(dev))
2119 dev_priv->flags |= CHIP_IS_AGP;
2120
2121 if (drm_device_is_pcie(dev))
2122 dev_priv->flags |= CHIP_IS_PCIE;
2123
2124 DRM_DEBUG("%s card detected\n",
2125 ((dev_priv->flags & CHIP_IS_AGP) ? "AGP" : (((dev_priv->flags & CHIP_IS_PCIE) ? "PCIE" : "PCI"))));
2200 break;
2201 }
2202
2203 if (drm_device_is_agp(dev))
2204 dev_priv->flags |= CHIP_IS_AGP;
2205
2206 if (drm_device_is_pcie(dev))
2207 dev_priv->flags |= CHIP_IS_PCIE;
2208
2209 DRM_DEBUG("%s card detected\n",
2210 ((dev_priv->flags & CHIP_IS_AGP) ? "AGP" : (((dev_priv->flags & CHIP_IS_PCIE) ? "PCIE" : "PCI"))));
2126
2127 return ret;
2128}
2129
2130/* Create mappings for registers and framebuffer so userland doesn't necessarily
2131 * have to find them.
2132 */
2133int radeon_driver_firstopen(struct drm_device *dev)
2134{

--- 29 unchanged lines hidden ---
2211 return ret;
2212}
2213
2214/* Create mappings for registers and framebuffer so userland doesn't necessarily
2215 * have to find them.
2216 */
2217int radeon_driver_firstopen(struct drm_device *dev)
2218{

--- 29 unchanged lines hidden ---