linux/drivers/gpu/drm/r128/r128_cce.c
<<
>>
Prefs
   1/* r128_cce.c -- ATI Rage 128 driver -*- linux-c -*-
   2 * Created: Wed Apr  5 19:24:19 2000 by kevin@precisioninsight.com
   3 */
   4/*
   5 * Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
   6 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
   7 * All Rights Reserved.
   8 *
   9 * Permission is hereby granted, free of charge, to any person obtaining a
  10 * copy of this software and associated documentation files (the "Software"),
  11 * to deal in the Software without restriction, including without limitation
  12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  13 * and/or sell copies of the Software, and to permit persons to whom the
  14 * Software is furnished to do so, subject to the following conditions:
  15 *
  16 * The above copyright notice and this permission notice (including the next
  17 * paragraph) shall be included in all copies or substantial portions of the
  18 * Software.
  19 *
  20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  23 * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  24 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  25 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  26 * DEALINGS IN THE SOFTWARE.
  27 *
  28 * Authors:
  29 *    Gareth Hughes <gareth@valinux.com>
  30 */
  31
  32#include <linux/delay.h>
  33#include <linux/dma-mapping.h>
  34#include <linux/firmware.h>
  35#include <linux/module.h>
  36#include <linux/platform_device.h>
  37#include <linux/slab.h>
  38#include <linux/uaccess.h>
  39
  40#include <drm/drm_device.h>
  41#include <drm/drm_file.h>
  42#include <drm/drm_legacy.h>
  43#include <drm/drm_print.h>
  44#include <drm/r128_drm.h>
  45
  46#include "r128_drv.h"
  47
  48#define R128_FIFO_DEBUG         0
  49
  50#define FIRMWARE_NAME           "r128/r128_cce.bin"
  51
  52MODULE_FIRMWARE(FIRMWARE_NAME);
  53
  54static int R128_READ_PLL(struct drm_device *dev, int addr)
  55{
  56        drm_r128_private_t *dev_priv = dev->dev_private;
  57
  58        R128_WRITE8(R128_CLOCK_CNTL_INDEX, addr & 0x1f);
  59        return R128_READ(R128_CLOCK_CNTL_DATA);
  60}
  61
  62#if R128_FIFO_DEBUG
  63static void r128_status(drm_r128_private_t *dev_priv)
  64{
  65        printk("GUI_STAT           = 0x%08x\n",
  66               (unsigned int)R128_READ(R128_GUI_STAT));
  67        printk("PM4_STAT           = 0x%08x\n",
  68               (unsigned int)R128_READ(R128_PM4_STAT));
  69        printk("PM4_BUFFER_DL_WPTR = 0x%08x\n",
  70               (unsigned int)R128_READ(R128_PM4_BUFFER_DL_WPTR));
  71        printk("PM4_BUFFER_DL_RPTR = 0x%08x\n",
  72               (unsigned int)R128_READ(R128_PM4_BUFFER_DL_RPTR));
  73        printk("PM4_MICRO_CNTL     = 0x%08x\n",
  74               (unsigned int)R128_READ(R128_PM4_MICRO_CNTL));
  75        printk("PM4_BUFFER_CNTL    = 0x%08x\n",
  76               (unsigned int)R128_READ(R128_PM4_BUFFER_CNTL));
  77}
  78#endif
  79
  80/* ================================================================
  81 * Engine, FIFO control
  82 */
  83
  84static int r128_do_pixcache_flush(drm_r128_private_t *dev_priv)
  85{
  86        u32 tmp;
  87        int i;
  88
  89        tmp = R128_READ(R128_PC_NGUI_CTLSTAT) | R128_PC_FLUSH_ALL;
  90        R128_WRITE(R128_PC_NGUI_CTLSTAT, tmp);
  91
  92        for (i = 0; i < dev_priv->usec_timeout; i++) {
  93                if (!(R128_READ(R128_PC_NGUI_CTLSTAT) & R128_PC_BUSY))
  94                        return 0;
  95                udelay(1);
  96        }
  97
  98#if R128_FIFO_DEBUG
  99        DRM_ERROR("failed!\n");
 100#endif
 101        return -EBUSY;
 102}
 103
 104static int r128_do_wait_for_fifo(drm_r128_private_t *dev_priv, int entries)
 105{
 106        int i;
 107
 108        for (i = 0; i < dev_priv->usec_timeout; i++) {
 109                int slots = R128_READ(R128_GUI_STAT) & R128_GUI_FIFOCNT_MASK;
 110                if (slots >= entries)
 111                        return 0;
 112                udelay(1);
 113        }
 114
 115#if R128_FIFO_DEBUG
 116        DRM_ERROR("failed!\n");
 117#endif
 118        return -EBUSY;
 119}
 120
 121static int r128_do_wait_for_idle(drm_r128_private_t *dev_priv)
 122{
 123        int i, ret;
 124
 125        ret = r128_do_wait_for_fifo(dev_priv, 64);
 126        if (ret)
 127                return ret;
 128
 129        for (i = 0; i < dev_priv->usec_timeout; i++) {
 130                if (!(R128_READ(R128_GUI_STAT) & R128_GUI_ACTIVE)) {
 131                        r128_do_pixcache_flush(dev_priv);
 132                        return 0;
 133                }
 134                udelay(1);
 135        }
 136
 137#if R128_FIFO_DEBUG
 138        DRM_ERROR("failed!\n");
 139#endif
 140        return -EBUSY;
 141}
 142
 143/* ================================================================
 144 * CCE control, initialization
 145 */
 146
 147/* Load the microcode for the CCE */
 148static int r128_cce_load_microcode(drm_r128_private_t *dev_priv)
 149{
 150        struct platform_device *pdev;
 151        const struct firmware *fw;
 152        const __be32 *fw_data;
 153        int rc, i;
 154
 155        DRM_DEBUG("\n");
 156
 157        pdev = platform_device_register_simple("r128_cce", 0, NULL, 0);
 158        if (IS_ERR(pdev)) {
 159                pr_err("r128_cce: Failed to register firmware\n");
 160                return PTR_ERR(pdev);
 161        }
 162        rc = request_firmware(&fw, FIRMWARE_NAME, &pdev->dev);
 163        platform_device_unregister(pdev);
 164        if (rc) {
 165                pr_err("r128_cce: Failed to load firmware \"%s\"\n",
 166                       FIRMWARE_NAME);
 167                return rc;
 168        }
 169
 170        if (fw->size != 256 * 8) {
 171                pr_err("r128_cce: Bogus length %zu in firmware \"%s\"\n",
 172                       fw->size, FIRMWARE_NAME);
 173                rc = -EINVAL;
 174                goto out_release;
 175        }
 176
 177        r128_do_wait_for_idle(dev_priv);
 178
 179        fw_data = (const __be32 *)fw->data;
 180        R128_WRITE(R128_PM4_MICROCODE_ADDR, 0);
 181        for (i = 0; i < 256; i++) {
 182                R128_WRITE(R128_PM4_MICROCODE_DATAH,
 183                           be32_to_cpup(&fw_data[i * 2]));
 184                R128_WRITE(R128_PM4_MICROCODE_DATAL,
 185                           be32_to_cpup(&fw_data[i * 2 + 1]));
 186        }
 187
 188out_release:
 189        release_firmware(fw);
 190        return rc;
 191}
 192
 193/* Flush any pending commands to the CCE.  This should only be used just
 194 * prior to a wait for idle, as it informs the engine that the command
 195 * stream is ending.
 196 */
 197static void r128_do_cce_flush(drm_r128_private_t *dev_priv)
 198{
 199        u32 tmp;
 200
 201        tmp = R128_READ(R128_PM4_BUFFER_DL_WPTR) | R128_PM4_BUFFER_DL_DONE;
 202        R128_WRITE(R128_PM4_BUFFER_DL_WPTR, tmp);
 203}
 204
 205/* Wait for the CCE to go idle.
 206 */
 207int r128_do_cce_idle(drm_r128_private_t *dev_priv)
 208{
 209        int i;
 210
 211        for (i = 0; i < dev_priv->usec_timeout; i++) {
 212                if (GET_RING_HEAD(dev_priv) == dev_priv->ring.tail) {
 213                        int pm4stat = R128_READ(R128_PM4_STAT);
 214                        if (((pm4stat & R128_PM4_FIFOCNT_MASK) >=
 215                             dev_priv->cce_fifo_size) &&
 216                            !(pm4stat & (R128_PM4_BUSY |
 217                                         R128_PM4_GUI_ACTIVE))) {
 218                                return r128_do_pixcache_flush(dev_priv);
 219                        }
 220                }
 221                udelay(1);
 222        }
 223
 224#if R128_FIFO_DEBUG
 225        DRM_ERROR("failed!\n");
 226        r128_status(dev_priv);
 227#endif
 228        return -EBUSY;
 229}
 230
 231/* Start the Concurrent Command Engine.
 232 */
 233static void r128_do_cce_start(drm_r128_private_t *dev_priv)
 234{
 235        r128_do_wait_for_idle(dev_priv);
 236
 237        R128_WRITE(R128_PM4_BUFFER_CNTL,
 238                   dev_priv->cce_mode | dev_priv->ring.size_l2qw
 239                   | R128_PM4_BUFFER_CNTL_NOUPDATE);
 240        R128_READ(R128_PM4_BUFFER_ADDR);        /* as per the sample code */
 241        R128_WRITE(R128_PM4_MICRO_CNTL, R128_PM4_MICRO_FREERUN);
 242
 243        dev_priv->cce_running = 1;
 244}
 245
 246/* Reset the Concurrent Command Engine.  This will not flush any pending
 247 * commands, so you must wait for the CCE command stream to complete
 248 * before calling this routine.
 249 */
 250static void r128_do_cce_reset(drm_r128_private_t *dev_priv)
 251{
 252        R128_WRITE(R128_PM4_BUFFER_DL_WPTR, 0);
 253        R128_WRITE(R128_PM4_BUFFER_DL_RPTR, 0);
 254        dev_priv->ring.tail = 0;
 255}
 256
 257/* Stop the Concurrent Command Engine.  This will not flush any pending
 258 * commands, so you must flush the command stream and wait for the CCE
 259 * to go idle before calling this routine.
 260 */
 261static void r128_do_cce_stop(drm_r128_private_t *dev_priv)
 262{
 263        R128_WRITE(R128_PM4_MICRO_CNTL, 0);
 264        R128_WRITE(R128_PM4_BUFFER_CNTL,
 265                   R128_PM4_NONPM4 | R128_PM4_BUFFER_CNTL_NOUPDATE);
 266
 267        dev_priv->cce_running = 0;
 268}
 269
 270/* Reset the engine.  This will stop the CCE if it is running.
 271 */
 272static int r128_do_engine_reset(struct drm_device *dev)
 273{
 274        drm_r128_private_t *dev_priv = dev->dev_private;
 275        u32 clock_cntl_index, mclk_cntl, gen_reset_cntl;
 276
 277        r128_do_pixcache_flush(dev_priv);
 278
 279        clock_cntl_index = R128_READ(R128_CLOCK_CNTL_INDEX);
 280        mclk_cntl = R128_READ_PLL(dev, R128_MCLK_CNTL);
 281
 282        R128_WRITE_PLL(R128_MCLK_CNTL,
 283                       mclk_cntl | R128_FORCE_GCP | R128_FORCE_PIPE3D_CP);
 284
 285        gen_reset_cntl = R128_READ(R128_GEN_RESET_CNTL);
 286
 287        /* Taken from the sample code - do not change */
 288        R128_WRITE(R128_GEN_RESET_CNTL, gen_reset_cntl | R128_SOFT_RESET_GUI);
 289        R128_READ(R128_GEN_RESET_CNTL);
 290        R128_WRITE(R128_GEN_RESET_CNTL, gen_reset_cntl & ~R128_SOFT_RESET_GUI);
 291        R128_READ(R128_GEN_RESET_CNTL);
 292
 293        R128_WRITE_PLL(R128_MCLK_CNTL, mclk_cntl);
 294        R128_WRITE(R128_CLOCK_CNTL_INDEX, clock_cntl_index);
 295        R128_WRITE(R128_GEN_RESET_CNTL, gen_reset_cntl);
 296
 297        /* Reset the CCE ring */
 298        r128_do_cce_reset(dev_priv);
 299
 300        /* The CCE is no longer running after an engine reset */
 301        dev_priv->cce_running = 0;
 302
 303        /* Reset any pending vertex, indirect buffers */
 304        r128_freelist_reset(dev);
 305
 306        return 0;
 307}
 308
 309static void r128_cce_init_ring_buffer(struct drm_device *dev,
 310                                      drm_r128_private_t *dev_priv)
 311{
 312        u32 ring_start;
 313        u32 tmp;
 314
 315        DRM_DEBUG("\n");
 316
 317        /* The manual (p. 2) says this address is in "VM space".  This
 318         * means it's an offset from the start of AGP space.
 319         */
 320#if IS_ENABLED(CONFIG_AGP)
 321        if (!dev_priv->is_pci)
 322                ring_start = dev_priv->cce_ring->offset - dev->agp->base;
 323        else
 324#endif
 325                ring_start = dev_priv->cce_ring->offset -
 326                    (unsigned long)dev->sg->virtual;
 327
 328        R128_WRITE(R128_PM4_BUFFER_OFFSET, ring_start | R128_AGP_OFFSET);
 329
 330        R128_WRITE(R128_PM4_BUFFER_DL_WPTR, 0);
 331        R128_WRITE(R128_PM4_BUFFER_DL_RPTR, 0);
 332
 333        /* Set watermark control */
 334        R128_WRITE(R128_PM4_BUFFER_WM_CNTL,
 335                   ((R128_WATERMARK_L / 4) << R128_WMA_SHIFT)
 336                   | ((R128_WATERMARK_M / 4) << R128_WMB_SHIFT)
 337                   | ((R128_WATERMARK_N / 4) << R128_WMC_SHIFT)
 338                   | ((R128_WATERMARK_K / 64) << R128_WB_WM_SHIFT));
 339
 340        /* Force read.  Why?  Because it's in the examples... */
 341        R128_READ(R128_PM4_BUFFER_ADDR);
 342
 343        /* Turn on bus mastering */
 344        tmp = R128_READ(R128_BUS_CNTL) & ~R128_BUS_MASTER_DIS;
 345        R128_WRITE(R128_BUS_CNTL, tmp);
 346}
 347
 348static int r128_do_init_cce(struct drm_device *dev, drm_r128_init_t *init)
 349{
 350        drm_r128_private_t *dev_priv;
 351        int rc;
 352
 353        DRM_DEBUG("\n");
 354
 355        if (dev->dev_private) {
 356                DRM_DEBUG("called when already initialized\n");
 357                return -EINVAL;
 358        }
 359
 360        dev_priv = kzalloc(sizeof(drm_r128_private_t), GFP_KERNEL);
 361        if (dev_priv == NULL)
 362                return -ENOMEM;
 363
 364        dev_priv->is_pci = init->is_pci;
 365
 366        if (dev_priv->is_pci && !dev->sg) {
 367                DRM_ERROR("PCI GART memory not allocated!\n");
 368                dev->dev_private = (void *)dev_priv;
 369                r128_do_cleanup_cce(dev);
 370                return -EINVAL;
 371        }
 372
 373        dev_priv->usec_timeout = init->usec_timeout;
 374        if (dev_priv->usec_timeout < 1 ||
 375            dev_priv->usec_timeout > R128_MAX_USEC_TIMEOUT) {
 376                DRM_DEBUG("TIMEOUT problem!\n");
 377                dev->dev_private = (void *)dev_priv;
 378                r128_do_cleanup_cce(dev);
 379                return -EINVAL;
 380        }
 381
 382        dev_priv->cce_mode = init->cce_mode;
 383
 384        /* GH: Simple idle check.
 385         */
 386        atomic_set(&dev_priv->idle_count, 0);
 387
 388        /* We don't support anything other than bus-mastering ring mode,
 389         * but the ring can be in either AGP or PCI space for the ring
 390         * read pointer.
 391         */
 392        if ((init->cce_mode != R128_PM4_192BM) &&
 393            (init->cce_mode != R128_PM4_128BM_64INDBM) &&
 394            (init->cce_mode != R128_PM4_64BM_128INDBM) &&
 395            (init->cce_mode != R128_PM4_64BM_64VCBM_64INDBM)) {
 396                DRM_DEBUG("Bad cce_mode!\n");
 397                dev->dev_private = (void *)dev_priv;
 398                r128_do_cleanup_cce(dev);
 399                return -EINVAL;
 400        }
 401
 402        switch (init->cce_mode) {
 403        case R128_PM4_NONPM4:
 404                dev_priv->cce_fifo_size = 0;
 405                break;
 406        case R128_PM4_192PIO:
 407        case R128_PM4_192BM:
 408                dev_priv->cce_fifo_size = 192;
 409                break;
 410        case R128_PM4_128PIO_64INDBM:
 411        case R128_PM4_128BM_64INDBM:
 412                dev_priv->cce_fifo_size = 128;
 413                break;
 414        case R128_PM4_64PIO_128INDBM:
 415        case R128_PM4_64BM_128INDBM:
 416        case R128_PM4_64PIO_64VCBM_64INDBM:
 417        case R128_PM4_64BM_64VCBM_64INDBM:
 418        case R128_PM4_64PIO_64VCPIO_64INDPIO:
 419                dev_priv->cce_fifo_size = 64;
 420                break;
 421        }
 422
 423        switch (init->fb_bpp) {
 424        case 16:
 425                dev_priv->color_fmt = R128_DATATYPE_RGB565;
 426                break;
 427        case 32:
 428        default:
 429                dev_priv->color_fmt = R128_DATATYPE_ARGB8888;
 430                break;
 431        }
 432        dev_priv->front_offset = init->front_offset;
 433        dev_priv->front_pitch = init->front_pitch;
 434        dev_priv->back_offset = init->back_offset;
 435        dev_priv->back_pitch = init->back_pitch;
 436
 437        switch (init->depth_bpp) {
 438        case 16:
 439                dev_priv->depth_fmt = R128_DATATYPE_RGB565;
 440                break;
 441        case 24:
 442        case 32:
 443        default:
 444                dev_priv->depth_fmt = R128_DATATYPE_ARGB8888;
 445                break;
 446        }
 447        dev_priv->depth_offset = init->depth_offset;
 448        dev_priv->depth_pitch = init->depth_pitch;
 449        dev_priv->span_offset = init->span_offset;
 450
 451        dev_priv->front_pitch_offset_c = (((dev_priv->front_pitch / 8) << 21) |
 452                                          (dev_priv->front_offset >> 5));
 453        dev_priv->back_pitch_offset_c = (((dev_priv->back_pitch / 8) << 21) |
 454                                         (dev_priv->back_offset >> 5));
 455        dev_priv->depth_pitch_offset_c = (((dev_priv->depth_pitch / 8) << 21) |
 456                                          (dev_priv->depth_offset >> 5) |
 457                                          R128_DST_TILE);
 458        dev_priv->span_pitch_offset_c = (((dev_priv->depth_pitch / 8) << 21) |
 459                                         (dev_priv->span_offset >> 5));
 460
 461        dev_priv->sarea = drm_legacy_getsarea(dev);
 462        if (!dev_priv->sarea) {
 463                DRM_ERROR("could not find sarea!\n");
 464                dev->dev_private = (void *)dev_priv;
 465                r128_do_cleanup_cce(dev);
 466                return -EINVAL;
 467        }
 468
 469        dev_priv->mmio = drm_legacy_findmap(dev, init->mmio_offset);
 470        if (!dev_priv->mmio) {
 471                DRM_ERROR("could not find mmio region!\n");
 472                dev->dev_private = (void *)dev_priv;
 473                r128_do_cleanup_cce(dev);
 474                return -EINVAL;
 475        }
 476        dev_priv->cce_ring = drm_legacy_findmap(dev, init->ring_offset);
 477        if (!dev_priv->cce_ring) {
 478                DRM_ERROR("could not find cce ring region!\n");
 479                dev->dev_private = (void *)dev_priv;
 480                r128_do_cleanup_cce(dev);
 481                return -EINVAL;
 482        }
 483        dev_priv->ring_rptr = drm_legacy_findmap(dev, init->ring_rptr_offset);
 484        if (!dev_priv->ring_rptr) {
 485                DRM_ERROR("could not find ring read pointer!\n");
 486                dev->dev_private = (void *)dev_priv;
 487                r128_do_cleanup_cce(dev);
 488                return -EINVAL;
 489        }
 490        dev->agp_buffer_token = init->buffers_offset;
 491        dev->agp_buffer_map = drm_legacy_findmap(dev, init->buffers_offset);
 492        if (!dev->agp_buffer_map) {
 493                DRM_ERROR("could not find dma buffer region!\n");
 494                dev->dev_private = (void *)dev_priv;
 495                r128_do_cleanup_cce(dev);
 496                return -EINVAL;
 497        }
 498
 499        if (!dev_priv->is_pci) {
 500                dev_priv->agp_textures =
 501                    drm_legacy_findmap(dev, init->agp_textures_offset);
 502                if (!dev_priv->agp_textures) {
 503                        DRM_ERROR("could not find agp texture region!\n");
 504                        dev->dev_private = (void *)dev_priv;
 505                        r128_do_cleanup_cce(dev);
 506                        return -EINVAL;
 507                }
 508        }
 509
 510        dev_priv->sarea_priv =
 511            (drm_r128_sarea_t *) ((u8 *) dev_priv->sarea->handle +
 512                                  init->sarea_priv_offset);
 513
 514#if IS_ENABLED(CONFIG_AGP)
 515        if (!dev_priv->is_pci) {
 516                drm_legacy_ioremap_wc(dev_priv->cce_ring, dev);
 517                drm_legacy_ioremap_wc(dev_priv->ring_rptr, dev);
 518                drm_legacy_ioremap_wc(dev->agp_buffer_map, dev);
 519                if (!dev_priv->cce_ring->handle ||
 520                    !dev_priv->ring_rptr->handle ||
 521                    !dev->agp_buffer_map->handle) {
 522                        DRM_ERROR("Could not ioremap agp regions!\n");
 523                        dev->dev_private = (void *)dev_priv;
 524                        r128_do_cleanup_cce(dev);
 525                        return -ENOMEM;
 526                }
 527        } else
 528#endif
 529        {
 530                dev_priv->cce_ring->handle =
 531                        (void *)(unsigned long)dev_priv->cce_ring->offset;
 532                dev_priv->ring_rptr->handle =
 533                        (void *)(unsigned long)dev_priv->ring_rptr->offset;
 534                dev->agp_buffer_map->handle =
 535                        (void *)(unsigned long)dev->agp_buffer_map->offset;
 536        }
 537
 538#if IS_ENABLED(CONFIG_AGP)
 539        if (!dev_priv->is_pci)
 540                dev_priv->cce_buffers_offset = dev->agp->base;
 541        else
 542#endif
 543                dev_priv->cce_buffers_offset = (unsigned long)dev->sg->virtual;
 544
 545        dev_priv->ring.start = (u32 *) dev_priv->cce_ring->handle;
 546        dev_priv->ring.end = ((u32 *) dev_priv->cce_ring->handle
 547                              + init->ring_size / sizeof(u32));
 548        dev_priv->ring.size = init->ring_size;
 549        dev_priv->ring.size_l2qw = order_base_2(init->ring_size / 8);
 550
 551        dev_priv->ring.tail_mask = (dev_priv->ring.size / sizeof(u32)) - 1;
 552
 553        dev_priv->ring.high_mark = 128;
 554
 555        dev_priv->sarea_priv->last_frame = 0;
 556        R128_WRITE(R128_LAST_FRAME_REG, dev_priv->sarea_priv->last_frame);
 557
 558        dev_priv->sarea_priv->last_dispatch = 0;
 559        R128_WRITE(R128_LAST_DISPATCH_REG, dev_priv->sarea_priv->last_dispatch);
 560
 561#if IS_ENABLED(CONFIG_AGP)
 562        if (dev_priv->is_pci) {
 563#endif
 564                dev_priv->gart_info.table_mask = DMA_BIT_MASK(32);
 565                dev_priv->gart_info.gart_table_location = DRM_ATI_GART_MAIN;
 566                dev_priv->gart_info.table_size = R128_PCIGART_TABLE_SIZE;
 567                dev_priv->gart_info.addr = NULL;
 568                dev_priv->gart_info.bus_addr = 0;
 569                dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_PCI;
 570                rc = drm_ati_pcigart_init(dev, &dev_priv->gart_info);
 571                if (rc) {
 572                        DRM_ERROR("failed to init PCI GART!\n");
 573                        dev->dev_private = (void *)dev_priv;
 574                        r128_do_cleanup_cce(dev);
 575                        return rc;
 576                }
 577                R128_WRITE(R128_PCI_GART_PAGE, dev_priv->gart_info.bus_addr);
 578#if IS_ENABLED(CONFIG_AGP)
 579        }
 580#endif
 581
 582        r128_cce_init_ring_buffer(dev, dev_priv);
 583        rc = r128_cce_load_microcode(dev_priv);
 584
 585        dev->dev_private = (void *)dev_priv;
 586
 587        r128_do_engine_reset(dev);
 588
 589        if (rc) {
 590                DRM_ERROR("Failed to load firmware!\n");
 591                r128_do_cleanup_cce(dev);
 592        }
 593
 594        return rc;
 595}
 596
 597int r128_do_cleanup_cce(struct drm_device *dev)
 598{
 599
 600        /* Make sure interrupts are disabled here because the uninstall ioctl
 601         * may not have been called from userspace and after dev_private
 602         * is freed, it's too late.
 603         */
 604        if (dev->irq_enabled)
 605                drm_legacy_irq_uninstall(dev);
 606
 607        if (dev->dev_private) {
 608                drm_r128_private_t *dev_priv = dev->dev_private;
 609
 610#if IS_ENABLED(CONFIG_AGP)
 611                if (!dev_priv->is_pci) {
 612                        if (dev_priv->cce_ring != NULL)
 613                                drm_legacy_ioremapfree(dev_priv->cce_ring, dev);
 614                        if (dev_priv->ring_rptr != NULL)
 615                                drm_legacy_ioremapfree(dev_priv->ring_rptr, dev);
 616                        if (dev->agp_buffer_map != NULL) {
 617                                drm_legacy_ioremapfree(dev->agp_buffer_map, dev);
 618                                dev->agp_buffer_map = NULL;
 619                        }
 620                } else
 621#endif
 622                {
 623                        if (dev_priv->gart_info.bus_addr)
 624                                if (!drm_ati_pcigart_cleanup(dev,
 625                                                        &dev_priv->gart_info))
 626                                        DRM_ERROR
 627                                            ("failed to cleanup PCI GART!\n");
 628                }
 629
 630                kfree(dev->dev_private);
 631                dev->dev_private = NULL;
 632        }
 633
 634        return 0;
 635}
 636
 637int r128_cce_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
 638{
 639        drm_r128_init_t *init = data;
 640
 641        DRM_DEBUG("\n");
 642
 643        LOCK_TEST_WITH_RETURN(dev, file_priv);
 644
 645        switch (init->func) {
 646        case R128_INIT_CCE:
 647                return r128_do_init_cce(dev, init);
 648        case R128_CLEANUP_CCE:
 649                return r128_do_cleanup_cce(dev);
 650        }
 651
 652        return -EINVAL;
 653}
 654
 655int r128_cce_start(struct drm_device *dev, void *data, struct drm_file *file_priv)
 656{
 657        drm_r128_private_t *dev_priv = dev->dev_private;
 658        DRM_DEBUG("\n");
 659
 660        LOCK_TEST_WITH_RETURN(dev, file_priv);
 661
 662        DEV_INIT_TEST_WITH_RETURN(dev_priv);
 663
 664        if (dev_priv->cce_running || dev_priv->cce_mode == R128_PM4_NONPM4) {
 665                DRM_DEBUG("while CCE running\n");
 666                return 0;
 667        }
 668
 669        r128_do_cce_start(dev_priv);
 670
 671        return 0;
 672}
 673
 674/* Stop the CCE.  The engine must have been idled before calling this
 675 * routine.
 676 */
 677int r128_cce_stop(struct drm_device *dev, void *data, struct drm_file *file_priv)
 678{
 679        drm_r128_private_t *dev_priv = dev->dev_private;
 680        drm_r128_cce_stop_t *stop = data;
 681        int ret;
 682        DRM_DEBUG("\n");
 683
 684        LOCK_TEST_WITH_RETURN(dev, file_priv);
 685
 686        DEV_INIT_TEST_WITH_RETURN(dev_priv);
 687
 688        /* Flush any pending CCE commands.  This ensures any outstanding
 689         * commands are exectuted by the engine before we turn it off.
 690         */
 691        if (stop->flush)
 692                r128_do_cce_flush(dev_priv);
 693
 694        /* If we fail to make the engine go idle, we return an error
 695         * code so that the DRM ioctl wrapper can try again.
 696         */
 697        if (stop->idle) {
 698                ret = r128_do_cce_idle(dev_priv);
 699                if (ret)
 700                        return ret;
 701        }
 702
 703        /* Finally, we can turn off the CCE.  If the engine isn't idle,
 704         * we will get some dropped triangles as they won't be fully
 705         * rendered before the CCE is shut down.
 706         */
 707        r128_do_cce_stop(dev_priv);
 708
 709        /* Reset the engine */
 710        r128_do_engine_reset(dev);
 711
 712        return 0;
 713}
 714
 715/* Just reset the CCE ring.  Called as part of an X Server engine reset.
 716 */
 717int r128_cce_reset(struct drm_device *dev, void *data, struct drm_file *file_priv)
 718{
 719        drm_r128_private_t *dev_priv = dev->dev_private;
 720        DRM_DEBUG("\n");
 721
 722        LOCK_TEST_WITH_RETURN(dev, file_priv);
 723
 724        DEV_INIT_TEST_WITH_RETURN(dev_priv);
 725
 726        r128_do_cce_reset(dev_priv);
 727
 728        /* The CCE is no longer running after an engine reset */
 729        dev_priv->cce_running = 0;
 730
 731        return 0;
 732}
 733
 734int r128_cce_idle(struct drm_device *dev, void *data, struct drm_file *file_priv)
 735{
 736        drm_r128_private_t *dev_priv = dev->dev_private;
 737        DRM_DEBUG("\n");
 738
 739        LOCK_TEST_WITH_RETURN(dev, file_priv);
 740
 741        DEV_INIT_TEST_WITH_RETURN(dev_priv);
 742
 743        if (dev_priv->cce_running)
 744                r128_do_cce_flush(dev_priv);
 745
 746        return r128_do_cce_idle(dev_priv);
 747}
 748
 749int r128_engine_reset(struct drm_device *dev, void *data, struct drm_file *file_priv)
 750{
 751        DRM_DEBUG("\n");
 752
 753        LOCK_TEST_WITH_RETURN(dev, file_priv);
 754
 755        DEV_INIT_TEST_WITH_RETURN(dev->dev_private);
 756
 757        return r128_do_engine_reset(dev);
 758}
 759
 760int r128_fullscreen(struct drm_device *dev, void *data, struct drm_file *file_priv)
 761{
 762        return -EINVAL;
 763}
 764
 765/* ================================================================
 766 * Freelist management
 767 */
 768#define R128_BUFFER_USED        0xffffffff
 769#define R128_BUFFER_FREE        0
 770
 771#if 0
 772static int r128_freelist_init(struct drm_device *dev)
 773{
 774        struct drm_device_dma *dma = dev->dma;
 775        drm_r128_private_t *dev_priv = dev->dev_private;
 776        struct drm_buf *buf;
 777        drm_r128_buf_priv_t *buf_priv;
 778        drm_r128_freelist_t *entry;
 779        int i;
 780
 781        dev_priv->head = kzalloc(sizeof(drm_r128_freelist_t), GFP_KERNEL);
 782        if (dev_priv->head == NULL)
 783                return -ENOMEM;
 784
 785        dev_priv->head->age = R128_BUFFER_USED;
 786
 787        for (i = 0; i < dma->buf_count; i++) {
 788                buf = dma->buflist[i];
 789                buf_priv = buf->dev_private;
 790
 791                entry = kmalloc(sizeof(drm_r128_freelist_t), GFP_KERNEL);
 792                if (!entry)
 793                        return -ENOMEM;
 794
 795                entry->age = R128_BUFFER_FREE;
 796                entry->buf = buf;
 797                entry->prev = dev_priv->head;
 798                entry->next = dev_priv->head->next;
 799                if (!entry->next)
 800                        dev_priv->tail = entry;
 801
 802                buf_priv->discard = 0;
 803                buf_priv->dispatched = 0;
 804                buf_priv->list_entry = entry;
 805
 806                dev_priv->head->next = entry;
 807
 808                if (dev_priv->head->next)
 809                        dev_priv->head->next->prev = entry;
 810        }
 811
 812        return 0;
 813
 814}
 815#endif
 816
 817static struct drm_buf *r128_freelist_get(struct drm_device * dev)
 818{
 819        struct drm_device_dma *dma = dev->dma;
 820        drm_r128_private_t *dev_priv = dev->dev_private;
 821        drm_r128_buf_priv_t *buf_priv;
 822        struct drm_buf *buf;
 823        int i, t;
 824
 825        /* FIXME: Optimize -- use freelist code */
 826
 827        for (i = 0; i < dma->buf_count; i++) {
 828                buf = dma->buflist[i];
 829                buf_priv = buf->dev_private;
 830                if (!buf->file_priv)
 831                        return buf;
 832        }
 833
 834        for (t = 0; t < dev_priv->usec_timeout; t++) {
 835                u32 done_age = R128_READ(R128_LAST_DISPATCH_REG);
 836
 837                for (i = 0; i < dma->buf_count; i++) {
 838                        buf = dma->buflist[i];
 839                        buf_priv = buf->dev_private;
 840                        if (buf->pending && buf_priv->age <= done_age) {
 841                                /* The buffer has been processed, so it
 842                                 * can now be used.
 843                                 */
 844                                buf->pending = 0;
 845                                return buf;
 846                        }
 847                }
 848                udelay(1);
 849        }
 850
 851        DRM_DEBUG("returning NULL!\n");
 852        return NULL;
 853}
 854
 855void r128_freelist_reset(struct drm_device *dev)
 856{
 857        struct drm_device_dma *dma = dev->dma;
 858        int i;
 859
 860        for (i = 0; i < dma->buf_count; i++) {
 861                struct drm_buf *buf = dma->buflist[i];
 862                drm_r128_buf_priv_t *buf_priv = buf->dev_private;
 863                buf_priv->age = 0;
 864        }
 865}
 866
 867/* ================================================================
 868 * CCE command submission
 869 */
 870
 871int r128_wait_ring(drm_r128_private_t *dev_priv, int n)
 872{
 873        drm_r128_ring_buffer_t *ring = &dev_priv->ring;
 874        int i;
 875
 876        for (i = 0; i < dev_priv->usec_timeout; i++) {
 877                r128_update_ring_snapshot(dev_priv);
 878                if (ring->space >= n)
 879                        return 0;
 880                udelay(1);
 881        }
 882
 883        /* FIXME: This is being ignored... */
 884        DRM_ERROR("failed!\n");
 885        return -EBUSY;
 886}
 887
 888static int r128_cce_get_buffers(struct drm_device *dev,
 889                                struct drm_file *file_priv,
 890                                struct drm_dma *d)
 891{
 892        int i;
 893        struct drm_buf *buf;
 894
 895        for (i = d->granted_count; i < d->request_count; i++) {
 896                buf = r128_freelist_get(dev);
 897                if (!buf)
 898                        return -EAGAIN;
 899
 900                buf->file_priv = file_priv;
 901
 902                if (copy_to_user(&d->request_indices[i], &buf->idx,
 903                                     sizeof(buf->idx)))
 904                        return -EFAULT;
 905                if (copy_to_user(&d->request_sizes[i], &buf->total,
 906                                     sizeof(buf->total)))
 907                        return -EFAULT;
 908
 909                d->granted_count++;
 910        }
 911        return 0;
 912}
 913
 914int r128_cce_buffers(struct drm_device *dev, void *data, struct drm_file *file_priv)
 915{
 916        struct drm_device_dma *dma = dev->dma;
 917        int ret = 0;
 918        struct drm_dma *d = data;
 919
 920        LOCK_TEST_WITH_RETURN(dev, file_priv);
 921
 922        /* Please don't send us buffers.
 923         */
 924        if (d->send_count != 0) {
 925                DRM_ERROR("Process %d trying to send %d buffers via drmDMA\n",
 926                          task_pid_nr(current), d->send_count);
 927                return -EINVAL;
 928        }
 929
 930        /* We'll send you buffers.
 931         */
 932        if (d->request_count < 0 || d->request_count > dma->buf_count) {
 933                DRM_ERROR("Process %d trying to get %d buffers (of %d max)\n",
 934                          task_pid_nr(current), d->request_count, dma->buf_count);
 935                return -EINVAL;
 936        }
 937
 938        d->granted_count = 0;
 939
 940        if (d->request_count)
 941                ret = r128_cce_get_buffers(dev, file_priv, d);
 942
 943        return ret;
 944}
 945