linux/drivers/gpu/drm/i915/i915_gem_stolen.c
<<
>>
Prefs
   1/*
   2 * Copyright © 2008-2012 Intel Corporation
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice (including the next
  12 * paragraph) shall be included in all copies or substantial portions of the
  13 * Software.
  14 *
  15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  21 * IN THE SOFTWARE.
  22 *
  23 * Authors:
  24 *    Eric Anholt <eric@anholt.net>
  25 *    Chris Wilson <chris@chris-wilson.co.uk>
  26 *
  27 */
  28
  29#include <drm/drmP.h>
  30#include <drm/i915_drm.h>
  31#include "i915_drv.h"
  32
  33#define KB(x) ((x) * 1024)
  34#define MB(x) (KB(x) * 1024)
  35
  36/*
  37 * The BIOS typically reserves some of the system's memory for the exclusive
  38 * use of the integrated graphics. This memory is no longer available for
  39 * use by the OS and so the user finds that his system has less memory
  40 * available than he put in. We refer to this memory as stolen.
  41 *
  42 * The BIOS will allocate its framebuffer from the stolen memory. Our
  43 * goal is try to reuse that object for our own fbcon which must always
  44 * be available for panics. Anything else we can reuse the stolen memory
  45 * for is a boon.
  46 */
  47
  48int i915_gem_stolen_insert_node_in_range(struct drm_i915_private *dev_priv,
  49                                         struct drm_mm_node *node, u64 size,
  50                                         unsigned alignment, u64 start, u64 end)
  51{
  52        int ret;
  53
  54        if (!drm_mm_initialized(&dev_priv->mm.stolen))
  55                return -ENODEV;
  56
  57        mutex_lock(&dev_priv->mm.stolen_lock);
  58        ret = drm_mm_insert_node_in_range(&dev_priv->mm.stolen, node,
  59                                          size, alignment, 0,
  60                                          start, end, DRM_MM_INSERT_BEST);
  61        mutex_unlock(&dev_priv->mm.stolen_lock);
  62
  63        return ret;
  64}
  65
  66int i915_gem_stolen_insert_node(struct drm_i915_private *dev_priv,
  67                                struct drm_mm_node *node, u64 size,
  68                                unsigned alignment)
  69{
  70        return i915_gem_stolen_insert_node_in_range(dev_priv, node, size,
  71                                                    alignment, 0, U64_MAX);
  72}
  73
  74void i915_gem_stolen_remove_node(struct drm_i915_private *dev_priv,
  75                                 struct drm_mm_node *node)
  76{
  77        mutex_lock(&dev_priv->mm.stolen_lock);
  78        drm_mm_remove_node(node);
  79        mutex_unlock(&dev_priv->mm.stolen_lock);
  80}
  81
  82static dma_addr_t i915_stolen_to_dma(struct drm_i915_private *dev_priv)
  83{
  84        struct pci_dev *pdev = dev_priv->drm.pdev;
  85        struct i915_ggtt *ggtt = &dev_priv->ggtt;
  86        struct resource *r;
  87        dma_addr_t base;
  88
  89        /* Almost universally we can find the Graphics Base of Stolen Memory
  90         * at register BSM (0x5c) in the igfx configuration space. On a few
  91         * (desktop) machines this is also mirrored in the bridge device at
  92         * different locations, or in the MCHBAR.
  93         *
  94         * On 865 we just check the TOUD register.
  95         *
  96         * On 830/845/85x the stolen memory base isn't available in any
  97         * register. We need to calculate it as TOM-TSEG_SIZE-stolen_size.
  98         *
  99         */
 100        base = 0;
 101        if (INTEL_GEN(dev_priv) >= 3) {
 102                u32 bsm;
 103
 104                pci_read_config_dword(pdev, INTEL_BSM, &bsm);
 105
 106                base = bsm & INTEL_BSM_MASK;
 107        } else if (IS_I865G(dev_priv)) {
 108                u32 tseg_size = 0;
 109                u16 toud = 0;
 110                u8 tmp;
 111
 112                pci_bus_read_config_byte(pdev->bus, PCI_DEVFN(0, 0),
 113                                         I845_ESMRAMC, &tmp);
 114
 115                if (tmp & TSEG_ENABLE) {
 116                        switch (tmp & I845_TSEG_SIZE_MASK) {
 117                        case I845_TSEG_SIZE_512K:
 118                                tseg_size = KB(512);
 119                                break;
 120                        case I845_TSEG_SIZE_1M:
 121                                tseg_size = MB(1);
 122                                break;
 123                        }
 124                }
 125
 126                pci_bus_read_config_word(pdev->bus, PCI_DEVFN(0, 0),
 127                                         I865_TOUD, &toud);
 128
 129                base = (toud << 16) + tseg_size;
 130        } else if (IS_I85X(dev_priv)) {
 131                u32 tseg_size = 0;
 132                u32 tom;
 133                u8 tmp;
 134
 135                pci_bus_read_config_byte(pdev->bus, PCI_DEVFN(0, 0),
 136                                         I85X_ESMRAMC, &tmp);
 137
 138                if (tmp & TSEG_ENABLE)
 139                        tseg_size = MB(1);
 140
 141                pci_bus_read_config_byte(pdev->bus, PCI_DEVFN(0, 1),
 142                                         I85X_DRB3, &tmp);
 143                tom = tmp * MB(32);
 144
 145                base = tom - tseg_size - ggtt->stolen_size;
 146        } else if (IS_I845G(dev_priv)) {
 147                u32 tseg_size = 0;
 148                u32 tom;
 149                u8 tmp;
 150
 151                pci_bus_read_config_byte(pdev->bus, PCI_DEVFN(0, 0),
 152                                         I845_ESMRAMC, &tmp);
 153
 154                if (tmp & TSEG_ENABLE) {
 155                        switch (tmp & I845_TSEG_SIZE_MASK) {
 156                        case I845_TSEG_SIZE_512K:
 157                                tseg_size = KB(512);
 158                                break;
 159                        case I845_TSEG_SIZE_1M:
 160                                tseg_size = MB(1);
 161                                break;
 162                        }
 163                }
 164
 165                pci_bus_read_config_byte(pdev->bus, PCI_DEVFN(0, 0),
 166                                         I830_DRB3, &tmp);
 167                tom = tmp * MB(32);
 168
 169                base = tom - tseg_size - ggtt->stolen_size;
 170        } else if (IS_I830(dev_priv)) {
 171                u32 tseg_size = 0;
 172                u32 tom;
 173                u8 tmp;
 174
 175                pci_bus_read_config_byte(pdev->bus, PCI_DEVFN(0, 0),
 176                                         I830_ESMRAMC, &tmp);
 177
 178                if (tmp & TSEG_ENABLE) {
 179                        if (tmp & I830_TSEG_SIZE_1M)
 180                                tseg_size = MB(1);
 181                        else
 182                                tseg_size = KB(512);
 183                }
 184
 185                pci_bus_read_config_byte(pdev->bus, PCI_DEVFN(0, 0),
 186                                         I830_DRB3, &tmp);
 187                tom = tmp * MB(32);
 188
 189                base = tom - tseg_size - ggtt->stolen_size;
 190        }
 191
 192        if (base == 0 || add_overflows(base, ggtt->stolen_size))
 193                return 0;
 194
 195        /* make sure we don't clobber the GTT if it's within stolen memory */
 196        if (INTEL_GEN(dev_priv) <= 4 &&
 197            !IS_G33(dev_priv) && !IS_PINEVIEW(dev_priv) && !IS_G4X(dev_priv)) {
 198                struct {
 199                        dma_addr_t start, end;
 200                } stolen[2] = {
 201                        { .start = base, .end = base + ggtt->stolen_size, },
 202                        { .start = base, .end = base + ggtt->stolen_size, },
 203                };
 204                u64 ggtt_start, ggtt_end;
 205
 206                ggtt_start = I915_READ(PGTBL_CTL);
 207                if (IS_GEN4(dev_priv))
 208                        ggtt_start = (ggtt_start & PGTBL_ADDRESS_LO_MASK) |
 209                                     (ggtt_start & PGTBL_ADDRESS_HI_MASK) << 28;
 210                else
 211                        ggtt_start &= PGTBL_ADDRESS_LO_MASK;
 212                ggtt_end = ggtt_start + ggtt_total_entries(ggtt) * 4;
 213
 214                if (ggtt_start >= stolen[0].start && ggtt_start < stolen[0].end)
 215                        stolen[0].end = ggtt_start;
 216                if (ggtt_end > stolen[1].start && ggtt_end <= stolen[1].end)
 217                        stolen[1].start = ggtt_end;
 218
 219                /* pick the larger of the two chunks */
 220                if (stolen[0].end - stolen[0].start >
 221                    stolen[1].end - stolen[1].start) {
 222                        base = stolen[0].start;
 223                        ggtt->stolen_size = stolen[0].end - stolen[0].start;
 224                } else {
 225                        base = stolen[1].start;
 226                        ggtt->stolen_size = stolen[1].end - stolen[1].start;
 227                }
 228
 229                if (stolen[0].start != stolen[1].start ||
 230                    stolen[0].end != stolen[1].end) {
 231                        dma_addr_t end = base + ggtt->stolen_size - 1;
 232
 233                        DRM_DEBUG_KMS("GTT within stolen memory at 0x%llx-0x%llx\n",
 234                                      (unsigned long long)ggtt_start,
 235                                      (unsigned long long)ggtt_end - 1);
 236                        DRM_DEBUG_KMS("Stolen memory adjusted to %pad - %pad\n",
 237                                      &base, &end);
 238                }
 239        }
 240
 241
 242        /* Verify that nothing else uses this physical address. Stolen
 243         * memory should be reserved by the BIOS and hidden from the
 244         * kernel. So if the region is already marked as busy, something
 245         * is seriously wrong.
 246         */
 247        r = devm_request_mem_region(dev_priv->drm.dev, base, ggtt->stolen_size,
 248                                    "Graphics Stolen Memory");
 249        if (r == NULL) {
 250                /*
 251                 * One more attempt but this time requesting region from
 252                 * base + 1, as we have seen that this resolves the region
 253                 * conflict with the PCI Bus.
 254                 * This is a BIOS w/a: Some BIOS wrap stolen in the root
 255                 * PCI bus, but have an off-by-one error. Hence retry the
 256                 * reservation starting from 1 instead of 0.
 257                 */
 258                r = devm_request_mem_region(dev_priv->drm.dev, base + 1,
 259                                            ggtt->stolen_size - 1,
 260                                            "Graphics Stolen Memory");
 261                /*
 262                 * GEN3 firmware likes to smash pci bridges into the stolen
 263                 * range. Apparently this works.
 264                 */
 265                if (r == NULL && !IS_GEN3(dev_priv)) {
 266                        dma_addr_t end = base + ggtt->stolen_size;
 267
 268                        DRM_ERROR("conflict detected with stolen region: [%pad - %pad]\n",
 269                                  &base, &end);
 270                        base = 0;
 271                }
 272        }
 273
 274        return base;
 275}
 276
 277void i915_gem_cleanup_stolen(struct drm_device *dev)
 278{
 279        struct drm_i915_private *dev_priv = to_i915(dev);
 280
 281        if (!drm_mm_initialized(&dev_priv->mm.stolen))
 282                return;
 283
 284        drm_mm_takedown(&dev_priv->mm.stolen);
 285}
 286
 287static void g4x_get_stolen_reserved(struct drm_i915_private *dev_priv,
 288                                    dma_addr_t *base, u32 *size)
 289{
 290        struct i915_ggtt *ggtt = &dev_priv->ggtt;
 291        uint32_t reg_val = I915_READ(IS_GM45(dev_priv) ?
 292                                     CTG_STOLEN_RESERVED :
 293                                     ELK_STOLEN_RESERVED);
 294        dma_addr_t stolen_top = dev_priv->mm.stolen_base + ggtt->stolen_size;
 295
 296        *base = (reg_val & G4X_STOLEN_RESERVED_ADDR2_MASK) << 16;
 297
 298        WARN_ON((reg_val & G4X_STOLEN_RESERVED_ADDR1_MASK) < *base);
 299
 300        /* On these platforms, the register doesn't have a size field, so the
 301         * size is the distance between the base and the top of the stolen
 302         * memory. We also have the genuine case where base is zero and there's
 303         * nothing reserved. */
 304        if (*base == 0)
 305                *size = 0;
 306        else
 307                *size = stolen_top - *base;
 308}
 309
 310static void gen6_get_stolen_reserved(struct drm_i915_private *dev_priv,
 311                                     dma_addr_t *base, u32 *size)
 312{
 313        uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED);
 314
 315        *base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK;
 316
 317        switch (reg_val & GEN6_STOLEN_RESERVED_SIZE_MASK) {
 318        case GEN6_STOLEN_RESERVED_1M:
 319                *size = 1024 * 1024;
 320                break;
 321        case GEN6_STOLEN_RESERVED_512K:
 322                *size = 512 * 1024;
 323                break;
 324        case GEN6_STOLEN_RESERVED_256K:
 325                *size = 256 * 1024;
 326                break;
 327        case GEN6_STOLEN_RESERVED_128K:
 328                *size = 128 * 1024;
 329                break;
 330        default:
 331                *size = 1024 * 1024;
 332                MISSING_CASE(reg_val & GEN6_STOLEN_RESERVED_SIZE_MASK);
 333        }
 334}
 335
 336static void gen7_get_stolen_reserved(struct drm_i915_private *dev_priv,
 337                                     dma_addr_t *base, u32 *size)
 338{
 339        uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED);
 340
 341        *base = reg_val & GEN7_STOLEN_RESERVED_ADDR_MASK;
 342
 343        switch (reg_val & GEN7_STOLEN_RESERVED_SIZE_MASK) {
 344        case GEN7_STOLEN_RESERVED_1M:
 345                *size = 1024 * 1024;
 346                break;
 347        case GEN7_STOLEN_RESERVED_256K:
 348                *size = 256 * 1024;
 349                break;
 350        default:
 351                *size = 1024 * 1024;
 352                MISSING_CASE(reg_val & GEN7_STOLEN_RESERVED_SIZE_MASK);
 353        }
 354}
 355
 356static void chv_get_stolen_reserved(struct drm_i915_private *dev_priv,
 357                                    dma_addr_t *base, u32 *size)
 358{
 359        uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED);
 360
 361        *base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK;
 362
 363        switch (reg_val & GEN8_STOLEN_RESERVED_SIZE_MASK) {
 364        case GEN8_STOLEN_RESERVED_1M:
 365                *size = 1024 * 1024;
 366                break;
 367        case GEN8_STOLEN_RESERVED_2M:
 368                *size = 2 * 1024 * 1024;
 369                break;
 370        case GEN8_STOLEN_RESERVED_4M:
 371                *size = 4 * 1024 * 1024;
 372                break;
 373        case GEN8_STOLEN_RESERVED_8M:
 374                *size = 8 * 1024 * 1024;
 375                break;
 376        default:
 377                *size = 8 * 1024 * 1024;
 378                MISSING_CASE(reg_val & GEN8_STOLEN_RESERVED_SIZE_MASK);
 379        }
 380}
 381
 382static void bdw_get_stolen_reserved(struct drm_i915_private *dev_priv,
 383                                    dma_addr_t *base, u32 *size)
 384{
 385        struct i915_ggtt *ggtt = &dev_priv->ggtt;
 386        uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED);
 387        dma_addr_t stolen_top;
 388
 389        stolen_top = dev_priv->mm.stolen_base + ggtt->stolen_size;
 390
 391        *base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK;
 392
 393        /* On these platforms, the register doesn't have a size field, so the
 394         * size is the distance between the base and the top of the stolen
 395         * memory. We also have the genuine case where base is zero and there's
 396         * nothing reserved. */
 397        if (*base == 0)
 398                *size = 0;
 399        else
 400                *size = stolen_top - *base;
 401}
 402
 403int i915_gem_init_stolen(struct drm_i915_private *dev_priv)
 404{
 405        struct i915_ggtt *ggtt = &dev_priv->ggtt;
 406        dma_addr_t reserved_base, stolen_top;
 407        u32 reserved_total, reserved_size;
 408        u32 stolen_usable_start;
 409
 410        mutex_init(&dev_priv->mm.stolen_lock);
 411
 412        if (intel_vgpu_active(dev_priv)) {
 413                DRM_INFO("iGVT-g active, disabling use of stolen memory\n");
 414                return 0;
 415        }
 416
 417        if (intel_vtd_active() && INTEL_GEN(dev_priv) < 8) {
 418                DRM_INFO("DMAR active, disabling use of stolen memory\n");
 419                return 0;
 420        }
 421
 422        if (ggtt->stolen_size == 0)
 423                return 0;
 424
 425        dev_priv->mm.stolen_base = i915_stolen_to_dma(dev_priv);
 426        if (dev_priv->mm.stolen_base == 0)
 427                return 0;
 428
 429        stolen_top = dev_priv->mm.stolen_base + ggtt->stolen_size;
 430        reserved_base = 0;
 431        reserved_size = 0;
 432
 433        switch (INTEL_INFO(dev_priv)->gen) {
 434        case 2:
 435        case 3:
 436                break;
 437        case 4:
 438                if (IS_G4X(dev_priv))
 439                        g4x_get_stolen_reserved(dev_priv,
 440                                                &reserved_base, &reserved_size);
 441                break;
 442        case 5:
 443                /* Assume the gen6 maximum for the older platforms. */
 444                reserved_size = 1024 * 1024;
 445                reserved_base = stolen_top - reserved_size;
 446                break;
 447        case 6:
 448                gen6_get_stolen_reserved(dev_priv,
 449                                         &reserved_base, &reserved_size);
 450                break;
 451        case 7:
 452                gen7_get_stolen_reserved(dev_priv,
 453                                         &reserved_base, &reserved_size);
 454                break;
 455        default:
 456                if (IS_LP(dev_priv))
 457                        chv_get_stolen_reserved(dev_priv,
 458                                                &reserved_base, &reserved_size);
 459                else
 460                        bdw_get_stolen_reserved(dev_priv,
 461                                                &reserved_base, &reserved_size);
 462                break;
 463        }
 464
 465        /* It is possible for the reserved base to be zero, but the register
 466         * field for size doesn't have a zero option. */
 467        if (reserved_base == 0) {
 468                reserved_size = 0;
 469                reserved_base = stolen_top;
 470        }
 471
 472        if (reserved_base < dev_priv->mm.stolen_base ||
 473            reserved_base + reserved_size > stolen_top) {
 474                dma_addr_t reserved_top = reserved_base + reserved_size;
 475                DRM_DEBUG_KMS("Stolen reserved area [%pad - %pad] outside stolen memory [%pad - %pad]\n",
 476                              &reserved_base, &reserved_top,
 477                              &dev_priv->mm.stolen_base, &stolen_top);
 478                return 0;
 479        }
 480
 481        ggtt->stolen_reserved_base = reserved_base;
 482        ggtt->stolen_reserved_size = reserved_size;
 483
 484        /* It is possible for the reserved area to end before the end of stolen
 485         * memory, so just consider the start. */
 486        reserved_total = stolen_top - reserved_base;
 487
 488        DRM_DEBUG_KMS("Memory reserved for graphics device: %uK, usable: %uK\n",
 489                      ggtt->stolen_size >> 10,
 490                      (ggtt->stolen_size - reserved_total) >> 10);
 491
 492        stolen_usable_start = 0;
 493        /* WaSkipStolenMemoryFirstPage:bdw+ */
 494        if (INTEL_GEN(dev_priv) >= 8)
 495                stolen_usable_start = 4096;
 496
 497        ggtt->stolen_usable_size =
 498                ggtt->stolen_size - reserved_total - stolen_usable_start;
 499
 500        /* Basic memrange allocator for stolen space. */
 501        drm_mm_init(&dev_priv->mm.stolen, stolen_usable_start,
 502                    ggtt->stolen_usable_size);
 503
 504        return 0;
 505}
 506
 507static struct sg_table *
 508i915_pages_create_for_stolen(struct drm_device *dev,
 509                             u32 offset, u32 size)
 510{
 511        struct drm_i915_private *dev_priv = to_i915(dev);
 512        struct sg_table *st;
 513        struct scatterlist *sg;
 514
 515        GEM_BUG_ON(range_overflows(offset, size, dev_priv->ggtt.stolen_size));
 516
 517        /* We hide that we have no struct page backing our stolen object
 518         * by wrapping the contiguous physical allocation with a fake
 519         * dma mapping in a single scatterlist.
 520         */
 521
 522        st = kmalloc(sizeof(*st), GFP_KERNEL);
 523        if (st == NULL)
 524                return ERR_PTR(-ENOMEM);
 525
 526        if (sg_alloc_table(st, 1, GFP_KERNEL)) {
 527                kfree(st);
 528                return ERR_PTR(-ENOMEM);
 529        }
 530
 531        sg = st->sgl;
 532        sg->offset = 0;
 533        sg->length = size;
 534
 535        sg_dma_address(sg) = (dma_addr_t)dev_priv->mm.stolen_base + offset;
 536        sg_dma_len(sg) = size;
 537
 538        return st;
 539}
 540
 541static struct sg_table *
 542i915_gem_object_get_pages_stolen(struct drm_i915_gem_object *obj)
 543{
 544        return i915_pages_create_for_stolen(obj->base.dev,
 545                                            obj->stolen->start,
 546                                            obj->stolen->size);
 547}
 548
 549static void i915_gem_object_put_pages_stolen(struct drm_i915_gem_object *obj,
 550                                             struct sg_table *pages)
 551{
 552        /* Should only be called from i915_gem_object_release_stolen() */
 553        sg_free_table(pages);
 554        kfree(pages);
 555}
 556
 557static void
 558i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
 559{
 560        struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
 561        struct drm_mm_node *stolen = fetch_and_zero(&obj->stolen);
 562
 563        GEM_BUG_ON(!stolen);
 564
 565        __i915_gem_object_unpin_pages(obj);
 566
 567        i915_gem_stolen_remove_node(dev_priv, stolen);
 568        kfree(stolen);
 569}
 570
 571static const struct drm_i915_gem_object_ops i915_gem_object_stolen_ops = {
 572        .get_pages = i915_gem_object_get_pages_stolen,
 573        .put_pages = i915_gem_object_put_pages_stolen,
 574        .release = i915_gem_object_release_stolen,
 575};
 576
 577static struct drm_i915_gem_object *
 578_i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
 579                               struct drm_mm_node *stolen)
 580{
 581        struct drm_i915_gem_object *obj;
 582
 583        obj = i915_gem_object_alloc(dev_priv);
 584        if (obj == NULL)
 585                return NULL;
 586
 587        drm_gem_private_object_init(&dev_priv->drm, &obj->base, stolen->size);
 588        i915_gem_object_init(obj, &i915_gem_object_stolen_ops);
 589
 590        obj->stolen = stolen;
 591        obj->base.read_domains = I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT;
 592        obj->cache_level = HAS_LLC(dev_priv) ? I915_CACHE_LLC : I915_CACHE_NONE;
 593        obj->cache_coherent = true; /* assumptions! more like cache_oblivious */
 594
 595        if (i915_gem_object_pin_pages(obj))
 596                goto cleanup;
 597
 598        return obj;
 599
 600cleanup:
 601        i915_gem_object_free(obj);
 602        return NULL;
 603}
 604
 605struct drm_i915_gem_object *
 606i915_gem_object_create_stolen(struct drm_i915_private *dev_priv, u32 size)
 607{
 608        struct drm_i915_gem_object *obj;
 609        struct drm_mm_node *stolen;
 610        int ret;
 611
 612        if (!drm_mm_initialized(&dev_priv->mm.stolen))
 613                return NULL;
 614
 615        if (size == 0)
 616                return NULL;
 617
 618        stolen = kzalloc(sizeof(*stolen), GFP_KERNEL);
 619        if (!stolen)
 620                return NULL;
 621
 622        ret = i915_gem_stolen_insert_node(dev_priv, stolen, size, 4096);
 623        if (ret) {
 624                kfree(stolen);
 625                return NULL;
 626        }
 627
 628        obj = _i915_gem_object_create_stolen(dev_priv, stolen);
 629        if (obj)
 630                return obj;
 631
 632        i915_gem_stolen_remove_node(dev_priv, stolen);
 633        kfree(stolen);
 634        return NULL;
 635}
 636
 637struct drm_i915_gem_object *
 638i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv,
 639                                               u32 stolen_offset,
 640                                               u32 gtt_offset,
 641                                               u32 size)
 642{
 643        struct i915_ggtt *ggtt = &dev_priv->ggtt;
 644        struct drm_i915_gem_object *obj;
 645        struct drm_mm_node *stolen;
 646        struct i915_vma *vma;
 647        int ret;
 648
 649        if (!drm_mm_initialized(&dev_priv->mm.stolen))
 650                return NULL;
 651
 652        lockdep_assert_held(&dev_priv->drm.struct_mutex);
 653
 654        DRM_DEBUG_KMS("creating preallocated stolen object: stolen_offset=%x, gtt_offset=%x, size=%x\n",
 655                        stolen_offset, gtt_offset, size);
 656
 657        /* KISS and expect everything to be page-aligned */
 658        if (WARN_ON(size == 0) ||
 659            WARN_ON(!IS_ALIGNED(size, I915_GTT_PAGE_SIZE)) ||
 660            WARN_ON(!IS_ALIGNED(stolen_offset, I915_GTT_MIN_ALIGNMENT)))
 661                return NULL;
 662
 663        stolen = kzalloc(sizeof(*stolen), GFP_KERNEL);
 664        if (!stolen)
 665                return NULL;
 666
 667        stolen->start = stolen_offset;
 668        stolen->size = size;
 669        mutex_lock(&dev_priv->mm.stolen_lock);
 670        ret = drm_mm_reserve_node(&dev_priv->mm.stolen, stolen);
 671        mutex_unlock(&dev_priv->mm.stolen_lock);
 672        if (ret) {
 673                DRM_DEBUG_KMS("failed to allocate stolen space\n");
 674                kfree(stolen);
 675                return NULL;
 676        }
 677
 678        obj = _i915_gem_object_create_stolen(dev_priv, stolen);
 679        if (obj == NULL) {
 680                DRM_DEBUG_KMS("failed to allocate stolen object\n");
 681                i915_gem_stolen_remove_node(dev_priv, stolen);
 682                kfree(stolen);
 683                return NULL;
 684        }
 685
 686        /* Some objects just need physical mem from stolen space */
 687        if (gtt_offset == I915_GTT_OFFSET_NONE)
 688                return obj;
 689
 690        ret = i915_gem_object_pin_pages(obj);
 691        if (ret)
 692                goto err;
 693
 694        vma = i915_vma_instance(obj, &ggtt->base, NULL);
 695        if (IS_ERR(vma)) {
 696                ret = PTR_ERR(vma);
 697                goto err_pages;
 698        }
 699
 700        /* To simplify the initialisation sequence between KMS and GTT,
 701         * we allow construction of the stolen object prior to
 702         * setting up the GTT space. The actual reservation will occur
 703         * later.
 704         */
 705        ret = i915_gem_gtt_reserve(&ggtt->base, &vma->node,
 706                                   size, gtt_offset, obj->cache_level,
 707                                   0);
 708        if (ret) {
 709                DRM_DEBUG_KMS("failed to allocate stolen GTT space\n");
 710                goto err_pages;
 711        }
 712
 713        GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
 714
 715        vma->pages = obj->mm.pages;
 716        vma->flags |= I915_VMA_GLOBAL_BIND;
 717        __i915_vma_set_map_and_fenceable(vma);
 718        list_move_tail(&vma->vm_link, &ggtt->base.inactive_list);
 719        list_move_tail(&obj->global_link, &dev_priv->mm.bound_list);
 720        obj->bind_count++;
 721
 722        return obj;
 723
 724err_pages:
 725        i915_gem_object_unpin_pages(obj);
 726err:
 727        i915_gem_object_put(obj);
 728        return NULL;
 729}
 730