0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 #include <linux/delay.h>
0033 #include <linux/dma-mapping.h>
0034 #include <linux/firmware.h>
0035 #include <linux/module.h>
0036 #include <linux/platform_device.h>
0037 #include <linux/slab.h>
0038 #include <linux/uaccess.h>
0039
0040 #include <drm/drm_device.h>
0041 #include <drm/drm_file.h>
0042 #include <drm/drm_legacy.h>
0043 #include <drm/drm_print.h>
0044 #include <drm/r128_drm.h>
0045
0046 #include "r128_drv.h"
0047
0048 #define R128_FIFO_DEBUG 0
0049
0050 #define FIRMWARE_NAME "r128/r128_cce.bin"
0051
0052 MODULE_FIRMWARE(FIRMWARE_NAME);
0053
0054 static int R128_READ_PLL(struct drm_device *dev, int addr)
0055 {
0056 drm_r128_private_t *dev_priv = dev->dev_private;
0057
0058 R128_WRITE8(R128_CLOCK_CNTL_INDEX, addr & 0x1f);
0059 return R128_READ(R128_CLOCK_CNTL_DATA);
0060 }
0061
0062 #if R128_FIFO_DEBUG
0063 static void r128_status(drm_r128_private_t *dev_priv)
0064 {
0065 printk("GUI_STAT = 0x%08x\n",
0066 (unsigned int)R128_READ(R128_GUI_STAT));
0067 printk("PM4_STAT = 0x%08x\n",
0068 (unsigned int)R128_READ(R128_PM4_STAT));
0069 printk("PM4_BUFFER_DL_WPTR = 0x%08x\n",
0070 (unsigned int)R128_READ(R128_PM4_BUFFER_DL_WPTR));
0071 printk("PM4_BUFFER_DL_RPTR = 0x%08x\n",
0072 (unsigned int)R128_READ(R128_PM4_BUFFER_DL_RPTR));
0073 printk("PM4_MICRO_CNTL = 0x%08x\n",
0074 (unsigned int)R128_READ(R128_PM4_MICRO_CNTL));
0075 printk("PM4_BUFFER_CNTL = 0x%08x\n",
0076 (unsigned int)R128_READ(R128_PM4_BUFFER_CNTL));
0077 }
0078 #endif
0079
0080
0081
0082
0083
0084 static int r128_do_pixcache_flush(drm_r128_private_t *dev_priv)
0085 {
0086 u32 tmp;
0087 int i;
0088
0089 tmp = R128_READ(R128_PC_NGUI_CTLSTAT) | R128_PC_FLUSH_ALL;
0090 R128_WRITE(R128_PC_NGUI_CTLSTAT, tmp);
0091
0092 for (i = 0; i < dev_priv->usec_timeout; i++) {
0093 if (!(R128_READ(R128_PC_NGUI_CTLSTAT) & R128_PC_BUSY))
0094 return 0;
0095 udelay(1);
0096 }
0097
0098 #if R128_FIFO_DEBUG
0099 DRM_ERROR("failed!\n");
0100 #endif
0101 return -EBUSY;
0102 }
0103
0104 static int r128_do_wait_for_fifo(drm_r128_private_t *dev_priv, int entries)
0105 {
0106 int i;
0107
0108 for (i = 0; i < dev_priv->usec_timeout; i++) {
0109 int slots = R128_READ(R128_GUI_STAT) & R128_GUI_FIFOCNT_MASK;
0110 if (slots >= entries)
0111 return 0;
0112 udelay(1);
0113 }
0114
0115 #if R128_FIFO_DEBUG
0116 DRM_ERROR("failed!\n");
0117 #endif
0118 return -EBUSY;
0119 }
0120
0121 static int r128_do_wait_for_idle(drm_r128_private_t *dev_priv)
0122 {
0123 int i, ret;
0124
0125 ret = r128_do_wait_for_fifo(dev_priv, 64);
0126 if (ret)
0127 return ret;
0128
0129 for (i = 0; i < dev_priv->usec_timeout; i++) {
0130 if (!(R128_READ(R128_GUI_STAT) & R128_GUI_ACTIVE)) {
0131 r128_do_pixcache_flush(dev_priv);
0132 return 0;
0133 }
0134 udelay(1);
0135 }
0136
0137 #if R128_FIFO_DEBUG
0138 DRM_ERROR("failed!\n");
0139 #endif
0140 return -EBUSY;
0141 }
0142
0143
0144
0145
0146
0147
0148 static int r128_cce_load_microcode(drm_r128_private_t *dev_priv)
0149 {
0150 struct platform_device *pdev;
0151 const struct firmware *fw;
0152 const __be32 *fw_data;
0153 int rc, i;
0154
0155 DRM_DEBUG("\n");
0156
0157 pdev = platform_device_register_simple("r128_cce", 0, NULL, 0);
0158 if (IS_ERR(pdev)) {
0159 pr_err("r128_cce: Failed to register firmware\n");
0160 return PTR_ERR(pdev);
0161 }
0162 rc = request_firmware(&fw, FIRMWARE_NAME, &pdev->dev);
0163 platform_device_unregister(pdev);
0164 if (rc) {
0165 pr_err("r128_cce: Failed to load firmware \"%s\"\n",
0166 FIRMWARE_NAME);
0167 return rc;
0168 }
0169
0170 if (fw->size != 256 * 8) {
0171 pr_err("r128_cce: Bogus length %zu in firmware \"%s\"\n",
0172 fw->size, FIRMWARE_NAME);
0173 rc = -EINVAL;
0174 goto out_release;
0175 }
0176
0177 r128_do_wait_for_idle(dev_priv);
0178
0179 fw_data = (const __be32 *)fw->data;
0180 R128_WRITE(R128_PM4_MICROCODE_ADDR, 0);
0181 for (i = 0; i < 256; i++) {
0182 R128_WRITE(R128_PM4_MICROCODE_DATAH,
0183 be32_to_cpup(&fw_data[i * 2]));
0184 R128_WRITE(R128_PM4_MICROCODE_DATAL,
0185 be32_to_cpup(&fw_data[i * 2 + 1]));
0186 }
0187
0188 out_release:
0189 release_firmware(fw);
0190 return rc;
0191 }
0192
0193
0194
0195
0196
0197 static void r128_do_cce_flush(drm_r128_private_t *dev_priv)
0198 {
0199 u32 tmp;
0200
0201 tmp = R128_READ(R128_PM4_BUFFER_DL_WPTR) | R128_PM4_BUFFER_DL_DONE;
0202 R128_WRITE(R128_PM4_BUFFER_DL_WPTR, tmp);
0203 }
0204
0205
0206
0207 int r128_do_cce_idle(drm_r128_private_t *dev_priv)
0208 {
0209 int i;
0210
0211 for (i = 0; i < dev_priv->usec_timeout; i++) {
0212 if (GET_RING_HEAD(dev_priv) == dev_priv->ring.tail) {
0213 int pm4stat = R128_READ(R128_PM4_STAT);
0214 if (((pm4stat & R128_PM4_FIFOCNT_MASK) >=
0215 dev_priv->cce_fifo_size) &&
0216 !(pm4stat & (R128_PM4_BUSY |
0217 R128_PM4_GUI_ACTIVE))) {
0218 return r128_do_pixcache_flush(dev_priv);
0219 }
0220 }
0221 udelay(1);
0222 }
0223
0224 #if R128_FIFO_DEBUG
0225 DRM_ERROR("failed!\n");
0226 r128_status(dev_priv);
0227 #endif
0228 return -EBUSY;
0229 }
0230
0231
0232
0233 static void r128_do_cce_start(drm_r128_private_t *dev_priv)
0234 {
0235 r128_do_wait_for_idle(dev_priv);
0236
0237 R128_WRITE(R128_PM4_BUFFER_CNTL,
0238 dev_priv->cce_mode | dev_priv->ring.size_l2qw
0239 | R128_PM4_BUFFER_CNTL_NOUPDATE);
0240 R128_READ(R128_PM4_BUFFER_ADDR);
0241 R128_WRITE(R128_PM4_MICRO_CNTL, R128_PM4_MICRO_FREERUN);
0242
0243 dev_priv->cce_running = 1;
0244 }
0245
0246
0247
0248
0249
0250 static void r128_do_cce_reset(drm_r128_private_t *dev_priv)
0251 {
0252 R128_WRITE(R128_PM4_BUFFER_DL_WPTR, 0);
0253 R128_WRITE(R128_PM4_BUFFER_DL_RPTR, 0);
0254 dev_priv->ring.tail = 0;
0255 }
0256
0257
0258
0259
0260
0261 static void r128_do_cce_stop(drm_r128_private_t *dev_priv)
0262 {
0263 R128_WRITE(R128_PM4_MICRO_CNTL, 0);
0264 R128_WRITE(R128_PM4_BUFFER_CNTL,
0265 R128_PM4_NONPM4 | R128_PM4_BUFFER_CNTL_NOUPDATE);
0266
0267 dev_priv->cce_running = 0;
0268 }
0269
0270
0271
0272 static int r128_do_engine_reset(struct drm_device *dev)
0273 {
0274 drm_r128_private_t *dev_priv = dev->dev_private;
0275 u32 clock_cntl_index, mclk_cntl, gen_reset_cntl;
0276
0277 r128_do_pixcache_flush(dev_priv);
0278
0279 clock_cntl_index = R128_READ(R128_CLOCK_CNTL_INDEX);
0280 mclk_cntl = R128_READ_PLL(dev, R128_MCLK_CNTL);
0281
0282 R128_WRITE_PLL(R128_MCLK_CNTL,
0283 mclk_cntl | R128_FORCE_GCP | R128_FORCE_PIPE3D_CP);
0284
0285 gen_reset_cntl = R128_READ(R128_GEN_RESET_CNTL);
0286
0287
0288 R128_WRITE(R128_GEN_RESET_CNTL, gen_reset_cntl | R128_SOFT_RESET_GUI);
0289 R128_READ(R128_GEN_RESET_CNTL);
0290 R128_WRITE(R128_GEN_RESET_CNTL, gen_reset_cntl & ~R128_SOFT_RESET_GUI);
0291 R128_READ(R128_GEN_RESET_CNTL);
0292
0293 R128_WRITE_PLL(R128_MCLK_CNTL, mclk_cntl);
0294 R128_WRITE(R128_CLOCK_CNTL_INDEX, clock_cntl_index);
0295 R128_WRITE(R128_GEN_RESET_CNTL, gen_reset_cntl);
0296
0297
0298 r128_do_cce_reset(dev_priv);
0299
0300
0301 dev_priv->cce_running = 0;
0302
0303
0304 r128_freelist_reset(dev);
0305
0306 return 0;
0307 }
0308
0309 static void r128_cce_init_ring_buffer(struct drm_device *dev,
0310 drm_r128_private_t *dev_priv)
0311 {
0312 u32 ring_start;
0313 u32 tmp;
0314
0315 DRM_DEBUG("\n");
0316
0317
0318
0319
0320 #if IS_ENABLED(CONFIG_AGP)
0321 if (!dev_priv->is_pci)
0322 ring_start = dev_priv->cce_ring->offset - dev->agp->base;
0323 else
0324 #endif
0325 ring_start = dev_priv->cce_ring->offset -
0326 (unsigned long)dev->sg->virtual;
0327
0328 R128_WRITE(R128_PM4_BUFFER_OFFSET, ring_start | R128_AGP_OFFSET);
0329
0330 R128_WRITE(R128_PM4_BUFFER_DL_WPTR, 0);
0331 R128_WRITE(R128_PM4_BUFFER_DL_RPTR, 0);
0332
0333
0334 R128_WRITE(R128_PM4_BUFFER_WM_CNTL,
0335 ((R128_WATERMARK_L / 4) << R128_WMA_SHIFT)
0336 | ((R128_WATERMARK_M / 4) << R128_WMB_SHIFT)
0337 | ((R128_WATERMARK_N / 4) << R128_WMC_SHIFT)
0338 | ((R128_WATERMARK_K / 64) << R128_WB_WM_SHIFT));
0339
0340
0341 R128_READ(R128_PM4_BUFFER_ADDR);
0342
0343
0344 tmp = R128_READ(R128_BUS_CNTL) & ~R128_BUS_MASTER_DIS;
0345 R128_WRITE(R128_BUS_CNTL, tmp);
0346 }
0347
0348 static int r128_do_init_cce(struct drm_device *dev, drm_r128_init_t *init)
0349 {
0350 drm_r128_private_t *dev_priv;
0351 int rc;
0352
0353 DRM_DEBUG("\n");
0354
0355 if (dev->dev_private) {
0356 DRM_DEBUG("called when already initialized\n");
0357 return -EINVAL;
0358 }
0359
0360 dev_priv = kzalloc(sizeof(drm_r128_private_t), GFP_KERNEL);
0361 if (dev_priv == NULL)
0362 return -ENOMEM;
0363
0364 dev_priv->is_pci = init->is_pci;
0365
0366 if (dev_priv->is_pci && !dev->sg) {
0367 DRM_ERROR("PCI GART memory not allocated!\n");
0368 dev->dev_private = (void *)dev_priv;
0369 r128_do_cleanup_cce(dev);
0370 return -EINVAL;
0371 }
0372
0373 dev_priv->usec_timeout = init->usec_timeout;
0374 if (dev_priv->usec_timeout < 1 ||
0375 dev_priv->usec_timeout > R128_MAX_USEC_TIMEOUT) {
0376 DRM_DEBUG("TIMEOUT problem!\n");
0377 dev->dev_private = (void *)dev_priv;
0378 r128_do_cleanup_cce(dev);
0379 return -EINVAL;
0380 }
0381
0382 dev_priv->cce_mode = init->cce_mode;
0383
0384
0385
0386 atomic_set(&dev_priv->idle_count, 0);
0387
0388
0389
0390
0391
0392 if ((init->cce_mode != R128_PM4_192BM) &&
0393 (init->cce_mode != R128_PM4_128BM_64INDBM) &&
0394 (init->cce_mode != R128_PM4_64BM_128INDBM) &&
0395 (init->cce_mode != R128_PM4_64BM_64VCBM_64INDBM)) {
0396 DRM_DEBUG("Bad cce_mode!\n");
0397 dev->dev_private = (void *)dev_priv;
0398 r128_do_cleanup_cce(dev);
0399 return -EINVAL;
0400 }
0401
0402 switch (init->cce_mode) {
0403 case R128_PM4_NONPM4:
0404 dev_priv->cce_fifo_size = 0;
0405 break;
0406 case R128_PM4_192PIO:
0407 case R128_PM4_192BM:
0408 dev_priv->cce_fifo_size = 192;
0409 break;
0410 case R128_PM4_128PIO_64INDBM:
0411 case R128_PM4_128BM_64INDBM:
0412 dev_priv->cce_fifo_size = 128;
0413 break;
0414 case R128_PM4_64PIO_128INDBM:
0415 case R128_PM4_64BM_128INDBM:
0416 case R128_PM4_64PIO_64VCBM_64INDBM:
0417 case R128_PM4_64BM_64VCBM_64INDBM:
0418 case R128_PM4_64PIO_64VCPIO_64INDPIO:
0419 dev_priv->cce_fifo_size = 64;
0420 break;
0421 }
0422
0423 switch (init->fb_bpp) {
0424 case 16:
0425 dev_priv->color_fmt = R128_DATATYPE_RGB565;
0426 break;
0427 case 32:
0428 default:
0429 dev_priv->color_fmt = R128_DATATYPE_ARGB8888;
0430 break;
0431 }
0432 dev_priv->front_offset = init->front_offset;
0433 dev_priv->front_pitch = init->front_pitch;
0434 dev_priv->back_offset = init->back_offset;
0435 dev_priv->back_pitch = init->back_pitch;
0436
0437 switch (init->depth_bpp) {
0438 case 16:
0439 dev_priv->depth_fmt = R128_DATATYPE_RGB565;
0440 break;
0441 case 24:
0442 case 32:
0443 default:
0444 dev_priv->depth_fmt = R128_DATATYPE_ARGB8888;
0445 break;
0446 }
0447 dev_priv->depth_offset = init->depth_offset;
0448 dev_priv->depth_pitch = init->depth_pitch;
0449 dev_priv->span_offset = init->span_offset;
0450
0451 dev_priv->front_pitch_offset_c = (((dev_priv->front_pitch / 8) << 21) |
0452 (dev_priv->front_offset >> 5));
0453 dev_priv->back_pitch_offset_c = (((dev_priv->back_pitch / 8) << 21) |
0454 (dev_priv->back_offset >> 5));
0455 dev_priv->depth_pitch_offset_c = (((dev_priv->depth_pitch / 8) << 21) |
0456 (dev_priv->depth_offset >> 5) |
0457 R128_DST_TILE);
0458 dev_priv->span_pitch_offset_c = (((dev_priv->depth_pitch / 8) << 21) |
0459 (dev_priv->span_offset >> 5));
0460
0461 dev_priv->sarea = drm_legacy_getsarea(dev);
0462 if (!dev_priv->sarea) {
0463 DRM_ERROR("could not find sarea!\n");
0464 dev->dev_private = (void *)dev_priv;
0465 r128_do_cleanup_cce(dev);
0466 return -EINVAL;
0467 }
0468
0469 dev_priv->mmio = drm_legacy_findmap(dev, init->mmio_offset);
0470 if (!dev_priv->mmio) {
0471 DRM_ERROR("could not find mmio region!\n");
0472 dev->dev_private = (void *)dev_priv;
0473 r128_do_cleanup_cce(dev);
0474 return -EINVAL;
0475 }
0476 dev_priv->cce_ring = drm_legacy_findmap(dev, init->ring_offset);
0477 if (!dev_priv->cce_ring) {
0478 DRM_ERROR("could not find cce ring region!\n");
0479 dev->dev_private = (void *)dev_priv;
0480 r128_do_cleanup_cce(dev);
0481 return -EINVAL;
0482 }
0483 dev_priv->ring_rptr = drm_legacy_findmap(dev, init->ring_rptr_offset);
0484 if (!dev_priv->ring_rptr) {
0485 DRM_ERROR("could not find ring read pointer!\n");
0486 dev->dev_private = (void *)dev_priv;
0487 r128_do_cleanup_cce(dev);
0488 return -EINVAL;
0489 }
0490 dev->agp_buffer_token = init->buffers_offset;
0491 dev->agp_buffer_map = drm_legacy_findmap(dev, init->buffers_offset);
0492 if (!dev->agp_buffer_map) {
0493 DRM_ERROR("could not find dma buffer region!\n");
0494 dev->dev_private = (void *)dev_priv;
0495 r128_do_cleanup_cce(dev);
0496 return -EINVAL;
0497 }
0498
0499 if (!dev_priv->is_pci) {
0500 dev_priv->agp_textures =
0501 drm_legacy_findmap(dev, init->agp_textures_offset);
0502 if (!dev_priv->agp_textures) {
0503 DRM_ERROR("could not find agp texture region!\n");
0504 dev->dev_private = (void *)dev_priv;
0505 r128_do_cleanup_cce(dev);
0506 return -EINVAL;
0507 }
0508 }
0509
0510 dev_priv->sarea_priv =
0511 (drm_r128_sarea_t *) ((u8 *) dev_priv->sarea->handle +
0512 init->sarea_priv_offset);
0513
0514 #if IS_ENABLED(CONFIG_AGP)
0515 if (!dev_priv->is_pci) {
0516 drm_legacy_ioremap_wc(dev_priv->cce_ring, dev);
0517 drm_legacy_ioremap_wc(dev_priv->ring_rptr, dev);
0518 drm_legacy_ioremap_wc(dev->agp_buffer_map, dev);
0519 if (!dev_priv->cce_ring->handle ||
0520 !dev_priv->ring_rptr->handle ||
0521 !dev->agp_buffer_map->handle) {
0522 DRM_ERROR("Could not ioremap agp regions!\n");
0523 dev->dev_private = (void *)dev_priv;
0524 r128_do_cleanup_cce(dev);
0525 return -ENOMEM;
0526 }
0527 } else
0528 #endif
0529 {
0530 dev_priv->cce_ring->handle =
0531 (void *)(unsigned long)dev_priv->cce_ring->offset;
0532 dev_priv->ring_rptr->handle =
0533 (void *)(unsigned long)dev_priv->ring_rptr->offset;
0534 dev->agp_buffer_map->handle =
0535 (void *)(unsigned long)dev->agp_buffer_map->offset;
0536 }
0537
0538 #if IS_ENABLED(CONFIG_AGP)
0539 if (!dev_priv->is_pci)
0540 dev_priv->cce_buffers_offset = dev->agp->base;
0541 else
0542 #endif
0543 dev_priv->cce_buffers_offset = (unsigned long)dev->sg->virtual;
0544
0545 dev_priv->ring.start = (u32 *) dev_priv->cce_ring->handle;
0546 dev_priv->ring.end = ((u32 *) dev_priv->cce_ring->handle
0547 + init->ring_size / sizeof(u32));
0548 dev_priv->ring.size = init->ring_size;
0549 dev_priv->ring.size_l2qw = order_base_2(init->ring_size / 8);
0550
0551 dev_priv->ring.tail_mask = (dev_priv->ring.size / sizeof(u32)) - 1;
0552
0553 dev_priv->ring.high_mark = 128;
0554
0555 dev_priv->sarea_priv->last_frame = 0;
0556 R128_WRITE(R128_LAST_FRAME_REG, dev_priv->sarea_priv->last_frame);
0557
0558 dev_priv->sarea_priv->last_dispatch = 0;
0559 R128_WRITE(R128_LAST_DISPATCH_REG, dev_priv->sarea_priv->last_dispatch);
0560
0561 #if IS_ENABLED(CONFIG_AGP)
0562 if (dev_priv->is_pci) {
0563 #endif
0564 dev_priv->gart_info.table_mask = DMA_BIT_MASK(32);
0565 dev_priv->gart_info.gart_table_location = DRM_ATI_GART_MAIN;
0566 dev_priv->gart_info.table_size = R128_PCIGART_TABLE_SIZE;
0567 dev_priv->gart_info.addr = NULL;
0568 dev_priv->gart_info.bus_addr = 0;
0569 dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_PCI;
0570 rc = drm_ati_pcigart_init(dev, &dev_priv->gart_info);
0571 if (rc) {
0572 DRM_ERROR("failed to init PCI GART!\n");
0573 dev->dev_private = (void *)dev_priv;
0574 r128_do_cleanup_cce(dev);
0575 return rc;
0576 }
0577 R128_WRITE(R128_PCI_GART_PAGE, dev_priv->gart_info.bus_addr);
0578 #if IS_ENABLED(CONFIG_AGP)
0579 }
0580 #endif
0581
0582 r128_cce_init_ring_buffer(dev, dev_priv);
0583 rc = r128_cce_load_microcode(dev_priv);
0584
0585 dev->dev_private = (void *)dev_priv;
0586
0587 r128_do_engine_reset(dev);
0588
0589 if (rc) {
0590 DRM_ERROR("Failed to load firmware!\n");
0591 r128_do_cleanup_cce(dev);
0592 }
0593
0594 return rc;
0595 }
0596
0597 int r128_do_cleanup_cce(struct drm_device *dev)
0598 {
0599
0600
0601
0602
0603
0604 if (dev->irq_enabled)
0605 drm_legacy_irq_uninstall(dev);
0606
0607 if (dev->dev_private) {
0608 drm_r128_private_t *dev_priv = dev->dev_private;
0609
0610 #if IS_ENABLED(CONFIG_AGP)
0611 if (!dev_priv->is_pci) {
0612 if (dev_priv->cce_ring != NULL)
0613 drm_legacy_ioremapfree(dev_priv->cce_ring, dev);
0614 if (dev_priv->ring_rptr != NULL)
0615 drm_legacy_ioremapfree(dev_priv->ring_rptr, dev);
0616 if (dev->agp_buffer_map != NULL) {
0617 drm_legacy_ioremapfree(dev->agp_buffer_map, dev);
0618 dev->agp_buffer_map = NULL;
0619 }
0620 } else
0621 #endif
0622 {
0623 if (dev_priv->gart_info.bus_addr)
0624 if (!drm_ati_pcigart_cleanup(dev,
0625 &dev_priv->gart_info))
0626 DRM_ERROR
0627 ("failed to cleanup PCI GART!\n");
0628 }
0629
0630 kfree(dev->dev_private);
0631 dev->dev_private = NULL;
0632 }
0633
0634 return 0;
0635 }
0636
0637 int r128_cce_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
0638 {
0639 drm_r128_init_t *init = data;
0640
0641 DRM_DEBUG("\n");
0642
0643 LOCK_TEST_WITH_RETURN(dev, file_priv);
0644
0645 switch (init->func) {
0646 case R128_INIT_CCE:
0647 return r128_do_init_cce(dev, init);
0648 case R128_CLEANUP_CCE:
0649 return r128_do_cleanup_cce(dev);
0650 }
0651
0652 return -EINVAL;
0653 }
0654
0655 int r128_cce_start(struct drm_device *dev, void *data, struct drm_file *file_priv)
0656 {
0657 drm_r128_private_t *dev_priv = dev->dev_private;
0658 DRM_DEBUG("\n");
0659
0660 LOCK_TEST_WITH_RETURN(dev, file_priv);
0661
0662 DEV_INIT_TEST_WITH_RETURN(dev_priv);
0663
0664 if (dev_priv->cce_running || dev_priv->cce_mode == R128_PM4_NONPM4) {
0665 DRM_DEBUG("while CCE running\n");
0666 return 0;
0667 }
0668
0669 r128_do_cce_start(dev_priv);
0670
0671 return 0;
0672 }
0673
0674
0675
0676
0677 int r128_cce_stop(struct drm_device *dev, void *data, struct drm_file *file_priv)
0678 {
0679 drm_r128_private_t *dev_priv = dev->dev_private;
0680 drm_r128_cce_stop_t *stop = data;
0681 int ret;
0682 DRM_DEBUG("\n");
0683
0684 LOCK_TEST_WITH_RETURN(dev, file_priv);
0685
0686 DEV_INIT_TEST_WITH_RETURN(dev_priv);
0687
0688
0689
0690
0691 if (stop->flush)
0692 r128_do_cce_flush(dev_priv);
0693
0694
0695
0696
0697 if (stop->idle) {
0698 ret = r128_do_cce_idle(dev_priv);
0699 if (ret)
0700 return ret;
0701 }
0702
0703
0704
0705
0706
0707 r128_do_cce_stop(dev_priv);
0708
0709
0710 r128_do_engine_reset(dev);
0711
0712 return 0;
0713 }
0714
0715
0716
0717 int r128_cce_reset(struct drm_device *dev, void *data, struct drm_file *file_priv)
0718 {
0719 drm_r128_private_t *dev_priv = dev->dev_private;
0720 DRM_DEBUG("\n");
0721
0722 LOCK_TEST_WITH_RETURN(dev, file_priv);
0723
0724 DEV_INIT_TEST_WITH_RETURN(dev_priv);
0725
0726 r128_do_cce_reset(dev_priv);
0727
0728
0729 dev_priv->cce_running = 0;
0730
0731 return 0;
0732 }
0733
0734 int r128_cce_idle(struct drm_device *dev, void *data, struct drm_file *file_priv)
0735 {
0736 drm_r128_private_t *dev_priv = dev->dev_private;
0737 DRM_DEBUG("\n");
0738
0739 LOCK_TEST_WITH_RETURN(dev, file_priv);
0740
0741 DEV_INIT_TEST_WITH_RETURN(dev_priv);
0742
0743 if (dev_priv->cce_running)
0744 r128_do_cce_flush(dev_priv);
0745
0746 return r128_do_cce_idle(dev_priv);
0747 }
0748
0749 int r128_engine_reset(struct drm_device *dev, void *data, struct drm_file *file_priv)
0750 {
0751 DRM_DEBUG("\n");
0752
0753 LOCK_TEST_WITH_RETURN(dev, file_priv);
0754
0755 DEV_INIT_TEST_WITH_RETURN(dev->dev_private);
0756
0757 return r128_do_engine_reset(dev);
0758 }
0759
0760 int r128_fullscreen(struct drm_device *dev, void *data, struct drm_file *file_priv)
0761 {
0762 return -EINVAL;
0763 }
0764
0765
0766
0767
0768 #define R128_BUFFER_USED 0xffffffff
0769 #define R128_BUFFER_FREE 0
0770
0771 #if 0
0772 static int r128_freelist_init(struct drm_device *dev)
0773 {
0774 struct drm_device_dma *dma = dev->dma;
0775 drm_r128_private_t *dev_priv = dev->dev_private;
0776 struct drm_buf *buf;
0777 drm_r128_buf_priv_t *buf_priv;
0778 drm_r128_freelist_t *entry;
0779 int i;
0780
0781 dev_priv->head = kzalloc(sizeof(drm_r128_freelist_t), GFP_KERNEL);
0782 if (dev_priv->head == NULL)
0783 return -ENOMEM;
0784
0785 dev_priv->head->age = R128_BUFFER_USED;
0786
0787 for (i = 0; i < dma->buf_count; i++) {
0788 buf = dma->buflist[i];
0789 buf_priv = buf->dev_private;
0790
0791 entry = kmalloc(sizeof(drm_r128_freelist_t), GFP_KERNEL);
0792 if (!entry)
0793 return -ENOMEM;
0794
0795 entry->age = R128_BUFFER_FREE;
0796 entry->buf = buf;
0797 entry->prev = dev_priv->head;
0798 entry->next = dev_priv->head->next;
0799 if (!entry->next)
0800 dev_priv->tail = entry;
0801
0802 buf_priv->discard = 0;
0803 buf_priv->dispatched = 0;
0804 buf_priv->list_entry = entry;
0805
0806 dev_priv->head->next = entry;
0807
0808 if (dev_priv->head->next)
0809 dev_priv->head->next->prev = entry;
0810 }
0811
0812 return 0;
0813
0814 }
0815 #endif
0816
0817 static struct drm_buf *r128_freelist_get(struct drm_device * dev)
0818 {
0819 struct drm_device_dma *dma = dev->dma;
0820 drm_r128_private_t *dev_priv = dev->dev_private;
0821 drm_r128_buf_priv_t *buf_priv;
0822 struct drm_buf *buf;
0823 int i, t;
0824
0825
0826
0827 for (i = 0; i < dma->buf_count; i++) {
0828 buf = dma->buflist[i];
0829 buf_priv = buf->dev_private;
0830 if (!buf->file_priv)
0831 return buf;
0832 }
0833
0834 for (t = 0; t < dev_priv->usec_timeout; t++) {
0835 u32 done_age = R128_READ(R128_LAST_DISPATCH_REG);
0836
0837 for (i = 0; i < dma->buf_count; i++) {
0838 buf = dma->buflist[i];
0839 buf_priv = buf->dev_private;
0840 if (buf->pending && buf_priv->age <= done_age) {
0841
0842
0843
0844 buf->pending = 0;
0845 return buf;
0846 }
0847 }
0848 udelay(1);
0849 }
0850
0851 DRM_DEBUG("returning NULL!\n");
0852 return NULL;
0853 }
0854
0855 void r128_freelist_reset(struct drm_device *dev)
0856 {
0857 struct drm_device_dma *dma = dev->dma;
0858 int i;
0859
0860 for (i = 0; i < dma->buf_count; i++) {
0861 struct drm_buf *buf = dma->buflist[i];
0862 drm_r128_buf_priv_t *buf_priv = buf->dev_private;
0863 buf_priv->age = 0;
0864 }
0865 }
0866
0867
0868
0869
0870
0871 int r128_wait_ring(drm_r128_private_t *dev_priv, int n)
0872 {
0873 drm_r128_ring_buffer_t *ring = &dev_priv->ring;
0874 int i;
0875
0876 for (i = 0; i < dev_priv->usec_timeout; i++) {
0877 r128_update_ring_snapshot(dev_priv);
0878 if (ring->space >= n)
0879 return 0;
0880 udelay(1);
0881 }
0882
0883
0884 DRM_ERROR("failed!\n");
0885 return -EBUSY;
0886 }
0887
0888 static int r128_cce_get_buffers(struct drm_device *dev,
0889 struct drm_file *file_priv,
0890 struct drm_dma *d)
0891 {
0892 int i;
0893 struct drm_buf *buf;
0894
0895 for (i = d->granted_count; i < d->request_count; i++) {
0896 buf = r128_freelist_get(dev);
0897 if (!buf)
0898 return -EAGAIN;
0899
0900 buf->file_priv = file_priv;
0901
0902 if (copy_to_user(&d->request_indices[i], &buf->idx,
0903 sizeof(buf->idx)))
0904 return -EFAULT;
0905 if (copy_to_user(&d->request_sizes[i], &buf->total,
0906 sizeof(buf->total)))
0907 return -EFAULT;
0908
0909 d->granted_count++;
0910 }
0911 return 0;
0912 }
0913
0914 int r128_cce_buffers(struct drm_device *dev, void *data, struct drm_file *file_priv)
0915 {
0916 struct drm_device_dma *dma = dev->dma;
0917 int ret = 0;
0918 struct drm_dma *d = data;
0919
0920 LOCK_TEST_WITH_RETURN(dev, file_priv);
0921
0922
0923
0924 if (d->send_count != 0) {
0925 DRM_ERROR("Process %d trying to send %d buffers via drmDMA\n",
0926 task_pid_nr(current), d->send_count);
0927 return -EINVAL;
0928 }
0929
0930
0931
0932 if (d->request_count < 0 || d->request_count > dma->buf_count) {
0933 DRM_ERROR("Process %d trying to get %d buffers (of %d max)\n",
0934 task_pid_nr(current), d->request_count, dma->buf_count);
0935 return -EINVAL;
0936 }
0937
0938 d->granted_count = 0;
0939
0940 if (d->request_count)
0941 ret = r128_cce_get_buffers(dev, file_priv, d);
0942
0943 return ret;
0944 }