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 48 int 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 /* See the comment at the drm_mm_init() call for more about this check. 58 * WaSkipStolenMemoryFirstPage:bdw,chv (incomplete) */ 59 if (INTEL_INFO(dev_priv)->gen == 8 && start < 4096) 60 start = 4096; 61 62 mutex_lock(&dev_priv->mm.stolen_lock); 63 ret = drm_mm_insert_node_in_range(&dev_priv->mm.stolen, node, size, 64 alignment, start, end, 65 DRM_MM_SEARCH_DEFAULT); 66 mutex_unlock(&dev_priv->mm.stolen_lock); 67 68 return ret; 69 } 70 71 int i915_gem_stolen_insert_node(struct drm_i915_private *dev_priv, 72 struct drm_mm_node *node, u64 size, 73 unsigned alignment) 74 { 75 return i915_gem_stolen_insert_node_in_range(dev_priv, node, size, 76 alignment, 0, 77 dev_priv->gtt.stolen_usable_size); 78 } 79 80 void i915_gem_stolen_remove_node(struct drm_i915_private *dev_priv, 81 struct drm_mm_node *node) 82 { 83 mutex_lock(&dev_priv->mm.stolen_lock); 84 drm_mm_remove_node(node); 85 mutex_unlock(&dev_priv->mm.stolen_lock); 86 } 87 88 static unsigned long i915_stolen_to_physical(struct drm_device *dev) 89 { 90 struct drm_i915_private *dev_priv = dev->dev_private; 91 u32 base; 92 93 /* Almost universally we can find the Graphics Base of Stolen Memory 94 * at offset 0x5c in the igfx configuration space. On a few (desktop) 95 * machines this is also mirrored in the bridge device at different 96 * locations, or in the MCHBAR. 97 * 98 * On 865 we just check the TOUD register. 99 * 100 * On 830/845/85x the stolen memory base isn't available in any 101 * register. We need to calculate it as TOM-TSEG_SIZE-stolen_size. 102 * 103 */ 104 base = 0; 105 if (INTEL_INFO(dev)->gen >= 3) { 106 /* Read Graphics Base of Stolen Memory directly */ 107 pci_read_config_dword(dev->pdev, 0x5c, &base); 108 base &= ~((1<<20) - 1); 109 #if 0 110 } else if (IS_I865G(dev)) { 111 u16 toud = 0; 112 113 /* 114 * FIXME is the graphics stolen memory region 115 * always at TOUD? Ie. is it always the last 116 * one to be allocated by the BIOS? 117 */ 118 pci_bus_read_config_word(dev->pdev->bus, PCI_DEVFN(0, 0), 119 I865_TOUD, &toud); 120 121 base = toud << 16; 122 } else if (IS_I85X(dev)) { 123 u32 tseg_size = 0; 124 u32 tom; 125 u8 tmp; 126 127 pci_bus_read_config_byte(dev->pdev->bus, PCI_DEVFN(0, 0), 128 I85X_ESMRAMC, &tmp); 129 130 if (tmp & TSEG_ENABLE) 131 tseg_size = MB(1); 132 133 pci_bus_read_config_byte(dev->pdev->bus, PCI_DEVFN(0, 1), 134 I85X_DRB3, &tmp); 135 tom = tmp * MB(32); 136 137 base = tom - tseg_size - dev_priv->gtt.stolen_size; 138 } else if (IS_845G(dev)) { 139 u32 tseg_size = 0; 140 u32 tom; 141 u8 tmp; 142 143 pci_bus_read_config_byte(dev->pdev->bus, PCI_DEVFN(0, 0), 144 I845_ESMRAMC, &tmp); 145 146 if (tmp & TSEG_ENABLE) { 147 switch (tmp & I845_TSEG_SIZE_MASK) { 148 case I845_TSEG_SIZE_512K: 149 tseg_size = KB(512); 150 break; 151 case I845_TSEG_SIZE_1M: 152 tseg_size = MB(1); 153 break; 154 } 155 } 156 157 pci_bus_read_config_byte(dev->pdev->bus, PCI_DEVFN(0, 0), 158 I830_DRB3, &tmp); 159 tom = tmp * MB(32); 160 161 base = tom - tseg_size - dev_priv->gtt.stolen_size; 162 } else if (IS_I830(dev)) { 163 u32 tseg_size = 0; 164 u32 tom; 165 u8 tmp; 166 167 pci_bus_read_config_byte(dev->pdev->bus, PCI_DEVFN(0, 0), 168 I830_ESMRAMC, &tmp); 169 170 if (tmp & TSEG_ENABLE) { 171 if (tmp & I830_TSEG_SIZE_1M) 172 tseg_size = MB(1); 173 else 174 tseg_size = KB(512); 175 } 176 177 pci_bus_read_config_byte(dev->pdev->bus, PCI_DEVFN(0, 0), 178 I830_DRB3, &tmp); 179 tom = tmp * MB(32); 180 181 base = tom - tseg_size - dev_priv->gtt.stolen_size; 182 #endif 183 } 184 185 if (base == 0) 186 return 0; 187 188 /* make sure we don't clobber the GTT if it's within stolen memory */ 189 if (INTEL_INFO(dev)->gen <= 4 && !IS_G33(dev) && !IS_G4X(dev)) { 190 struct { 191 u32 start, end; 192 } stolen[2] = { 193 { .start = base, .end = base + dev_priv->gtt.stolen_size, }, 194 { .start = base, .end = base + dev_priv->gtt.stolen_size, }, 195 }; 196 u64 gtt_start, gtt_end; 197 198 gtt_start = I915_READ(PGTBL_CTL); 199 if (IS_GEN4(dev)) 200 gtt_start = (gtt_start & PGTBL_ADDRESS_LO_MASK) | 201 (gtt_start & PGTBL_ADDRESS_HI_MASK) << 28; 202 else 203 gtt_start &= PGTBL_ADDRESS_LO_MASK; 204 gtt_end = gtt_start + gtt_total_entries(dev_priv->gtt) * 4; 205 206 if (gtt_start >= stolen[0].start && gtt_start < stolen[0].end) 207 stolen[0].end = gtt_start; 208 if (gtt_end > stolen[1].start && gtt_end <= stolen[1].end) 209 stolen[1].start = gtt_end; 210 211 /* pick the larger of the two chunks */ 212 if (stolen[0].end - stolen[0].start > 213 stolen[1].end - stolen[1].start) { 214 base = stolen[0].start; 215 dev_priv->gtt.stolen_size = stolen[0].end - stolen[0].start; 216 } else { 217 base = stolen[1].start; 218 dev_priv->gtt.stolen_size = stolen[1].end - stolen[1].start; 219 } 220 221 if (stolen[0].start != stolen[1].start || 222 stolen[0].end != stolen[1].end) { 223 DRM_DEBUG_KMS("GTT within stolen memory at 0x%llx-0x%llx\n", 224 (unsigned long long) gtt_start, 225 (unsigned long long) gtt_end - 1); 226 DRM_DEBUG_KMS("Stolen memory adjusted to 0x%x-0x%x\n", 227 base, base + (u32) dev_priv->gtt.stolen_size - 1); 228 } 229 } 230 231 232 /* Verify that nothing else uses this physical address. Stolen 233 * memory should be reserved by the BIOS and hidden from the 234 * kernel. So if the region is already marked as busy, something 235 * is seriously wrong. 236 */ 237 #if 0 238 r = devm_request_mem_region(dev->dev, base, dev_priv->gtt.stolen_size, 239 "Graphics Stolen Memory"); 240 if (r == NULL) { 241 /* 242 * One more attempt but this time requesting region from 243 * base + 1, as we have seen that this resolves the region 244 * conflict with the PCI Bus. 245 * This is a BIOS w/a: Some BIOS wrap stolen in the root 246 * PCI bus, but have an off-by-one error. Hence retry the 247 * reservation starting from 1 instead of 0. 248 */ 249 r = devm_request_mem_region(dev->dev, base + 1, 250 dev_priv->gtt.stolen_size - 1, 251 "Graphics Stolen Memory"); 252 /* 253 * GEN3 firmware likes to smash pci bridges into the stolen 254 * range. Apparently this works. 255 */ 256 if (r == NULL && !IS_GEN3(dev)) { 257 DRM_ERROR("conflict detected with stolen region: [0x%08x - 0x%08x]\n", 258 base, base + (uint32_t)dev_priv->gtt.stolen_size); 259 base = 0; 260 } 261 } 262 #endif 263 264 return base; 265 } 266 267 void i915_gem_cleanup_stolen(struct drm_device *dev) 268 { 269 struct drm_i915_private *dev_priv = dev->dev_private; 270 271 if (!drm_mm_initialized(&dev_priv->mm.stolen)) 272 return; 273 274 drm_mm_takedown(&dev_priv->mm.stolen); 275 } 276 277 static void g4x_get_stolen_reserved(struct drm_i915_private *dev_priv, 278 unsigned long *base, unsigned long *size) 279 { 280 uint32_t reg_val = I915_READ(IS_GM45(dev_priv) ? 281 CTG_STOLEN_RESERVED : 282 ELK_STOLEN_RESERVED); 283 unsigned long stolen_top = dev_priv->mm.stolen_base + 284 dev_priv->gtt.stolen_size; 285 286 *base = (reg_val & G4X_STOLEN_RESERVED_ADDR2_MASK) << 16; 287 288 WARN_ON((reg_val & G4X_STOLEN_RESERVED_ADDR1_MASK) < *base); 289 290 /* On these platforms, the register doesn't have a size field, so the 291 * size is the distance between the base and the top of the stolen 292 * memory. We also have the genuine case where base is zero and there's 293 * nothing reserved. */ 294 if (*base == 0) 295 *size = 0; 296 else 297 *size = stolen_top - *base; 298 } 299 300 static void gen6_get_stolen_reserved(struct drm_i915_private *dev_priv, 301 unsigned long *base, unsigned long *size) 302 { 303 uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED); 304 305 *base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK; 306 307 switch (reg_val & GEN6_STOLEN_RESERVED_SIZE_MASK) { 308 case GEN6_STOLEN_RESERVED_1M: 309 *size = 1024 * 1024; 310 break; 311 case GEN6_STOLEN_RESERVED_512K: 312 *size = 512 * 1024; 313 break; 314 case GEN6_STOLEN_RESERVED_256K: 315 *size = 256 * 1024; 316 break; 317 case GEN6_STOLEN_RESERVED_128K: 318 *size = 128 * 1024; 319 break; 320 default: 321 *size = 1024 * 1024; 322 MISSING_CASE(reg_val & GEN6_STOLEN_RESERVED_SIZE_MASK); 323 } 324 } 325 326 static void gen7_get_stolen_reserved(struct drm_i915_private *dev_priv, 327 unsigned long *base, unsigned long *size) 328 { 329 uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED); 330 331 *base = reg_val & GEN7_STOLEN_RESERVED_ADDR_MASK; 332 333 switch (reg_val & GEN7_STOLEN_RESERVED_SIZE_MASK) { 334 case GEN7_STOLEN_RESERVED_1M: 335 *size = 1024 * 1024; 336 break; 337 case GEN7_STOLEN_RESERVED_256K: 338 *size = 256 * 1024; 339 break; 340 default: 341 *size = 1024 * 1024; 342 MISSING_CASE(reg_val & GEN7_STOLEN_RESERVED_SIZE_MASK); 343 } 344 } 345 346 static void gen8_get_stolen_reserved(struct drm_i915_private *dev_priv, 347 unsigned long *base, unsigned long *size) 348 { 349 uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED); 350 351 *base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK; 352 353 switch (reg_val & GEN8_STOLEN_RESERVED_SIZE_MASK) { 354 case GEN8_STOLEN_RESERVED_1M: 355 *size = 1024 * 1024; 356 break; 357 case GEN8_STOLEN_RESERVED_2M: 358 *size = 2 * 1024 * 1024; 359 break; 360 case GEN8_STOLEN_RESERVED_4M: 361 *size = 4 * 1024 * 1024; 362 break; 363 case GEN8_STOLEN_RESERVED_8M: 364 *size = 8 * 1024 * 1024; 365 break; 366 default: 367 *size = 8 * 1024 * 1024; 368 MISSING_CASE(reg_val & GEN8_STOLEN_RESERVED_SIZE_MASK); 369 } 370 } 371 372 static void bdw_get_stolen_reserved(struct drm_i915_private *dev_priv, 373 unsigned long *base, unsigned long *size) 374 { 375 uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED); 376 unsigned long stolen_top; 377 378 stolen_top = dev_priv->mm.stolen_base + dev_priv->gtt.stolen_size; 379 380 *base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK; 381 382 /* On these platforms, the register doesn't have a size field, so the 383 * size is the distance between the base and the top of the stolen 384 * memory. We also have the genuine case where base is zero and there's 385 * nothing reserved. */ 386 if (*base == 0) 387 *size = 0; 388 else 389 *size = stolen_top - *base; 390 } 391 392 int i915_gem_init_stolen(struct drm_device *dev) 393 { 394 struct drm_i915_private *dev_priv = dev->dev_private; 395 unsigned long reserved_total, reserved_base = 0, reserved_size; 396 unsigned long stolen_top; 397 398 lockinit(&dev_priv->mm.stolen_lock, "i915msl", 0, LK_CANRECURSE); 399 400 #ifdef CONFIG_INTEL_IOMMU 401 if (intel_iommu_gfx_mapped && INTEL_INFO(dev)->gen < 8) { 402 DRM_INFO("DMAR active, disabling use of stolen memory\n"); 403 return 0; 404 } 405 #endif 406 407 if (dev_priv->gtt.stolen_size == 0) 408 return 0; 409 410 dev_priv->mm.stolen_base = i915_stolen_to_physical(dev); 411 if (dev_priv->mm.stolen_base == 0) 412 return 0; 413 414 stolen_top = dev_priv->mm.stolen_base + dev_priv->gtt.stolen_size; 415 416 switch (INTEL_INFO(dev_priv)->gen) { 417 case 2: 418 case 3: 419 break; 420 case 4: 421 if (IS_G4X(dev)) 422 g4x_get_stolen_reserved(dev_priv, &reserved_base, 423 &reserved_size); 424 break; 425 case 5: 426 /* Assume the gen6 maximum for the older platforms. */ 427 reserved_size = 1024 * 1024; 428 reserved_base = stolen_top - reserved_size; 429 break; 430 case 6: 431 gen6_get_stolen_reserved(dev_priv, &reserved_base, 432 &reserved_size); 433 break; 434 case 7: 435 gen7_get_stolen_reserved(dev_priv, &reserved_base, 436 &reserved_size); 437 break; 438 default: 439 if (IS_BROADWELL(dev_priv) || IS_SKYLAKE(dev_priv)) 440 bdw_get_stolen_reserved(dev_priv, &reserved_base, 441 &reserved_size); 442 else 443 gen8_get_stolen_reserved(dev_priv, &reserved_base, 444 &reserved_size); 445 break; 446 } 447 448 /* It is possible for the reserved base to be zero, but the register 449 * field for size doesn't have a zero option. */ 450 if (reserved_base == 0) { 451 reserved_size = 0; 452 reserved_base = stolen_top; 453 } 454 455 if (reserved_base < dev_priv->mm.stolen_base || 456 reserved_base + reserved_size > stolen_top) { 457 DRM_DEBUG_KMS("Stolen reserved area [0x%08lx - 0x%08lx] outside stolen memory [0x%08lx - 0x%08lx]\n", 458 reserved_base, reserved_base + reserved_size, 459 dev_priv->mm.stolen_base, stolen_top); 460 return 0; 461 } 462 463 /* It is possible for the reserved area to end before the end of stolen 464 * memory, so just consider the start. */ 465 reserved_total = stolen_top - reserved_base; 466 467 DRM_DEBUG_KMS("Memory reserved for graphics device: %zuK, usable: %luK\n", 468 dev_priv->gtt.stolen_size >> 10, 469 (dev_priv->gtt.stolen_size - reserved_total) >> 10); 470 471 dev_priv->gtt.stolen_usable_size = dev_priv->gtt.stolen_size - 472 reserved_total; 473 474 /* 475 * Basic memrange allocator for stolen space. 476 * 477 * TODO: Notice that some platforms require us to not use the first page 478 * of the stolen memory but their BIOSes may still put the framebuffer 479 * on the first page. So we don't reserve this page for now because of 480 * that. Our current solution is to just prevent new nodes from being 481 * inserted on the first page - see the check we have at 482 * i915_gem_stolen_insert_node_in_range(). We may want to fix the fbcon 483 * problem later. 484 */ 485 drm_mm_init(&dev_priv->mm.stolen, 0, dev_priv->gtt.stolen_usable_size); 486 487 return 0; 488 } 489 490 static struct sg_table * 491 i915_pages_create_for_stolen(struct drm_device *dev, 492 u32 offset, u32 size) 493 { 494 struct drm_i915_private *dev_priv = dev->dev_private; 495 struct sg_table *st; 496 struct scatterlist *sg; 497 498 DRM_DEBUG_DRIVER("offset=0x%x, size=%d\n", offset, size); 499 BUG_ON(offset > dev_priv->gtt.stolen_size - size); 500 501 /* We hide that we have no struct page backing our stolen object 502 * by wrapping the contiguous physical allocation with a fake 503 * dma mapping in a single scatterlist. 504 */ 505 506 st = kmalloc(sizeof(*st), M_DRM, M_WAITOK); 507 if (st == NULL) 508 return NULL; 509 510 if (sg_alloc_table(st, 1, GFP_KERNEL)) { 511 kfree(st); 512 return NULL; 513 } 514 515 sg = st->sgl; 516 sg->offset = 0; 517 sg->length = size; 518 519 sg_dma_address(sg) = (dma_addr_t)dev_priv->mm.stolen_base + offset; 520 sg_dma_len(sg) = size; 521 522 return st; 523 } 524 525 static int i915_gem_object_get_pages_stolen(struct drm_i915_gem_object *obj) 526 { 527 BUG(); 528 return -EINVAL; 529 } 530 531 static void i915_gem_object_put_pages_stolen(struct drm_i915_gem_object *obj) 532 { 533 /* Should only be called during free */ 534 sg_free_table(obj->pages); 535 kfree(obj->pages); 536 } 537 538 539 static void 540 i915_gem_object_release_stolen(struct drm_i915_gem_object *obj) 541 { 542 struct drm_i915_private *dev_priv = obj->base.dev->dev_private; 543 544 if (obj->stolen) { 545 i915_gem_stolen_remove_node(dev_priv, obj->stolen); 546 kfree(obj->stolen); 547 obj->stolen = NULL; 548 } 549 } 550 static const struct drm_i915_gem_object_ops i915_gem_object_stolen_ops = { 551 .get_pages = i915_gem_object_get_pages_stolen, 552 .put_pages = i915_gem_object_put_pages_stolen, 553 .release = i915_gem_object_release_stolen, 554 }; 555 556 static struct drm_i915_gem_object * 557 _i915_gem_object_create_stolen(struct drm_device *dev, 558 struct drm_mm_node *stolen) 559 { 560 struct drm_i915_gem_object *obj; 561 562 obj = i915_gem_object_alloc(dev); 563 if (obj == NULL) 564 return NULL; 565 566 drm_gem_private_object_init(dev, &obj->base, stolen->size); 567 i915_gem_object_init(obj, &i915_gem_object_stolen_ops); 568 569 obj->pages = i915_pages_create_for_stolen(dev, 570 stolen->start, stolen->size); 571 if (obj->pages == NULL) 572 goto cleanup; 573 574 i915_gem_object_pin_pages(obj); 575 obj->stolen = stolen; 576 577 obj->base.read_domains = I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT; 578 obj->cache_level = HAS_LLC(dev) ? I915_CACHE_LLC : I915_CACHE_NONE; 579 580 return obj; 581 582 cleanup: 583 i915_gem_object_free(obj); 584 return NULL; 585 } 586 587 struct drm_i915_gem_object * 588 i915_gem_object_create_stolen(struct drm_device *dev, u32 size) 589 { 590 struct drm_i915_private *dev_priv = dev->dev_private; 591 struct drm_i915_gem_object *obj; 592 struct drm_mm_node *stolen; 593 int ret; 594 595 if (!drm_mm_initialized(&dev_priv->mm.stolen)) 596 return NULL; 597 598 DRM_DEBUG_KMS("creating stolen object: size=%x\n", size); 599 if (size == 0) 600 return NULL; 601 602 stolen = kzalloc(sizeof(*stolen), GFP_KERNEL); 603 if (!stolen) 604 return NULL; 605 606 ret = i915_gem_stolen_insert_node(dev_priv, stolen, size, 4096); 607 if (ret) { 608 kfree(stolen); 609 return NULL; 610 } 611 612 obj = _i915_gem_object_create_stolen(dev, stolen); 613 if (obj) 614 return obj; 615 616 i915_gem_stolen_remove_node(dev_priv, stolen); 617 kfree(stolen); 618 return NULL; 619 } 620 621 struct drm_i915_gem_object * 622 i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev, 623 u32 stolen_offset, 624 u32 gtt_offset, 625 u32 size) 626 { 627 struct drm_i915_private *dev_priv = dev->dev_private; 628 struct i915_address_space *ggtt = &dev_priv->gtt.base; 629 struct drm_i915_gem_object *obj; 630 struct drm_mm_node *stolen; 631 struct i915_vma *vma; 632 int ret; 633 634 if (!drm_mm_initialized(&dev_priv->mm.stolen)) 635 return NULL; 636 637 DRM_DEBUG_KMS("creating preallocated stolen object: stolen_offset=%x, gtt_offset=%x, size=%x\n", 638 stolen_offset, gtt_offset, size); 639 640 /* KISS and expect everything to be page-aligned */ 641 if (WARN_ON(size == 0) || WARN_ON(size & 4095) || 642 WARN_ON(stolen_offset & 4095)) 643 return NULL; 644 645 stolen = kzalloc(sizeof(*stolen), GFP_KERNEL); 646 if (!stolen) 647 return NULL; 648 649 stolen->start = stolen_offset; 650 stolen->size = size; 651 mutex_lock(&dev_priv->mm.stolen_lock); 652 ret = drm_mm_reserve_node(&dev_priv->mm.stolen, stolen); 653 mutex_unlock(&dev_priv->mm.stolen_lock); 654 if (ret) { 655 DRM_DEBUG_KMS("failed to allocate stolen space\n"); 656 kfree(stolen); 657 return NULL; 658 } 659 660 obj = _i915_gem_object_create_stolen(dev, stolen); 661 if (obj == NULL) { 662 DRM_DEBUG_KMS("failed to allocate stolen object\n"); 663 i915_gem_stolen_remove_node(dev_priv, stolen); 664 kfree(stolen); 665 return NULL; 666 } 667 668 /* Some objects just need physical mem from stolen space */ 669 if (gtt_offset == I915_GTT_OFFSET_NONE) 670 return obj; 671 672 vma = i915_gem_obj_lookup_or_create_vma(obj, ggtt); 673 if (IS_ERR(vma)) { 674 ret = PTR_ERR(vma); 675 goto err; 676 } 677 678 /* To simplify the initialisation sequence between KMS and GTT, 679 * we allow construction of the stolen object prior to 680 * setting up the GTT space. The actual reservation will occur 681 * later. 682 */ 683 vma->node.start = gtt_offset; 684 vma->node.size = size; 685 if (drm_mm_initialized(&ggtt->mm)) { 686 ret = drm_mm_reserve_node(&ggtt->mm, &vma->node); 687 if (ret) { 688 DRM_DEBUG_KMS("failed to allocate stolen GTT space\n"); 689 goto err; 690 } 691 692 vma->bound |= GLOBAL_BIND; 693 __i915_vma_set_map_and_fenceable(vma); 694 list_add_tail(&vma->mm_list, &ggtt->inactive_list); 695 } 696 697 list_add_tail(&obj->global_list, &dev_priv->mm.bound_list); 698 i915_gem_object_pin_pages(obj); 699 700 return obj; 701 702 err: 703 drm_gem_object_unreference(&obj->base); 704 return NULL; 705 } 706