aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorImre Deak <imre.deak@intel.com>2015-12-15 13:10:38 -0500
committerImre Deak <imre.deak@intel.com>2015-12-17 09:37:44 -0500
commitbe69459a8027787b63e7541d53d1ee86ec9c5056 (patch)
tree07ba717035c84ee33a922f7eb54efd510f16b8a6
parent2b19efebf175bb2120c5ae00b8e79febe73d225a (diff)
drm/i915: check that we are in an RPM atomic section in GGTT PTE updaters
The device should be on for the whole duration of the update, so check for this. v2: - use the existing dev_priv directly everywhere (Ville) v3: - check also that we are in an RPM atomic section (Chris) - add the assert to i915_ggtt_insert_entries/clear_range too (Chris) Signed-off-by: Imre Deak <imre.deak@intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Link: http://patchwork.freedesktop.org/patch/msgid/1450203038-5150-11-git-send-email-imre.deak@intel.com
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 7cfa1b9b3b96..c14b8f8d0c87 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -2351,6 +2351,9 @@ static void gen8_ggtt_insert_entries(struct i915_address_space *vm,
2351 int i = 0; 2351 int i = 0;
2352 struct sg_page_iter sg_iter; 2352 struct sg_page_iter sg_iter;
2353 dma_addr_t addr = 0; /* shut up gcc */ 2353 dma_addr_t addr = 0; /* shut up gcc */
2354 int rpm_atomic_seq;
2355
2356 rpm_atomic_seq = assert_rpm_atomic_begin(dev_priv);
2354 2357
2355 for_each_sg_page(st->sgl, &sg_iter, st->nents, 0) { 2358 for_each_sg_page(st->sgl, &sg_iter, st->nents, 0) {
2356 addr = sg_dma_address(sg_iter.sg) + 2359 addr = sg_dma_address(sg_iter.sg) +
@@ -2377,6 +2380,8 @@ static void gen8_ggtt_insert_entries(struct i915_address_space *vm,
2377 */ 2380 */
2378 I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN); 2381 I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
2379 POSTING_READ(GFX_FLSH_CNTL_GEN6); 2382 POSTING_READ(GFX_FLSH_CNTL_GEN6);
2383
2384 assert_rpm_atomic_end(dev_priv, rpm_atomic_seq);
2380} 2385}
2381 2386
2382/* 2387/*
@@ -2397,6 +2402,9 @@ static void gen6_ggtt_insert_entries(struct i915_address_space *vm,
2397 int i = 0; 2402 int i = 0;
2398 struct sg_page_iter sg_iter; 2403 struct sg_page_iter sg_iter;
2399 dma_addr_t addr = 0; 2404 dma_addr_t addr = 0;
2405 int rpm_atomic_seq;
2406
2407 rpm_atomic_seq = assert_rpm_atomic_begin(dev_priv);
2400 2408
2401 for_each_sg_page(st->sgl, &sg_iter, st->nents, 0) { 2409 for_each_sg_page(st->sgl, &sg_iter, st->nents, 0) {
2402 addr = sg_page_iter_dma_address(&sg_iter); 2410 addr = sg_page_iter_dma_address(&sg_iter);
@@ -2421,6 +2429,8 @@ static void gen6_ggtt_insert_entries(struct i915_address_space *vm,
2421 */ 2429 */
2422 I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN); 2430 I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
2423 POSTING_READ(GFX_FLSH_CNTL_GEN6); 2431 POSTING_READ(GFX_FLSH_CNTL_GEN6);
2432
2433 assert_rpm_atomic_end(dev_priv, rpm_atomic_seq);
2424} 2434}
2425 2435
2426static void gen8_ggtt_clear_range(struct i915_address_space *vm, 2436static void gen8_ggtt_clear_range(struct i915_address_space *vm,
@@ -2435,6 +2445,9 @@ static void gen8_ggtt_clear_range(struct i915_address_space *vm,
2435 (gen8_pte_t __iomem *) dev_priv->gtt.gsm + first_entry; 2445 (gen8_pte_t __iomem *) dev_priv->gtt.gsm + first_entry;
2436 const int max_entries = gtt_total_entries(dev_priv->gtt) - first_entry; 2446 const int max_entries = gtt_total_entries(dev_priv->gtt) - first_entry;
2437 int i; 2447 int i;
2448 int rpm_atomic_seq;
2449
2450 rpm_atomic_seq = assert_rpm_atomic_begin(dev_priv);
2438 2451
2439 if (WARN(num_entries > max_entries, 2452 if (WARN(num_entries > max_entries,
2440 "First entry = %d; Num entries = %d (max=%d)\n", 2453 "First entry = %d; Num entries = %d (max=%d)\n",
@@ -2447,6 +2460,8 @@ static void gen8_ggtt_clear_range(struct i915_address_space *vm,
2447 for (i = 0; i < num_entries; i++) 2460 for (i = 0; i < num_entries; i++)
2448 gen8_set_pte(&gtt_base[i], scratch_pte); 2461 gen8_set_pte(&gtt_base[i], scratch_pte);
2449 readl(gtt_base); 2462 readl(gtt_base);
2463
2464 assert_rpm_atomic_end(dev_priv, rpm_atomic_seq);
2450} 2465}
2451 2466
2452static void gen6_ggtt_clear_range(struct i915_address_space *vm, 2467static void gen6_ggtt_clear_range(struct i915_address_space *vm,
@@ -2461,6 +2476,9 @@ static void gen6_ggtt_clear_range(struct i915_address_space *vm,
2461 (gen6_pte_t __iomem *) dev_priv->gtt.gsm + first_entry; 2476 (gen6_pte_t __iomem *) dev_priv->gtt.gsm + first_entry;
2462 const int max_entries = gtt_total_entries(dev_priv->gtt) - first_entry; 2477 const int max_entries = gtt_total_entries(dev_priv->gtt) - first_entry;
2463 int i; 2478 int i;
2479 int rpm_atomic_seq;
2480
2481 rpm_atomic_seq = assert_rpm_atomic_begin(dev_priv);
2464 2482
2465 if (WARN(num_entries > max_entries, 2483 if (WARN(num_entries > max_entries,
2466 "First entry = %d; Num entries = %d (max=%d)\n", 2484 "First entry = %d; Num entries = %d (max=%d)\n",
@@ -2473,6 +2491,8 @@ static void gen6_ggtt_clear_range(struct i915_address_space *vm,
2473 for (i = 0; i < num_entries; i++) 2491 for (i = 0; i < num_entries; i++)
2474 iowrite32(scratch_pte, &gtt_base[i]); 2492 iowrite32(scratch_pte, &gtt_base[i]);
2475 readl(gtt_base); 2493 readl(gtt_base);
2494
2495 assert_rpm_atomic_end(dev_priv, rpm_atomic_seq);
2476} 2496}
2477 2497
2478static void i915_ggtt_insert_entries(struct i915_address_space *vm, 2498static void i915_ggtt_insert_entries(struct i915_address_space *vm,
@@ -2480,11 +2500,17 @@ static void i915_ggtt_insert_entries(struct i915_address_space *vm,
2480 uint64_t start, 2500 uint64_t start,
2481 enum i915_cache_level cache_level, u32 unused) 2501 enum i915_cache_level cache_level, u32 unused)
2482{ 2502{
2503 struct drm_i915_private *dev_priv = vm->dev->dev_private;
2483 unsigned int flags = (cache_level == I915_CACHE_NONE) ? 2504 unsigned int flags = (cache_level == I915_CACHE_NONE) ?
2484 AGP_USER_MEMORY : AGP_USER_CACHED_MEMORY; 2505 AGP_USER_MEMORY : AGP_USER_CACHED_MEMORY;
2506 int rpm_atomic_seq;
2507
2508 rpm_atomic_seq = assert_rpm_atomic_begin(dev_priv);
2485 2509
2486 intel_gtt_insert_sg_entries(pages, start >> PAGE_SHIFT, flags); 2510 intel_gtt_insert_sg_entries(pages, start >> PAGE_SHIFT, flags);
2487 2511
2512 assert_rpm_atomic_end(dev_priv, rpm_atomic_seq);
2513
2488} 2514}
2489 2515
2490static void i915_ggtt_clear_range(struct i915_address_space *vm, 2516static void i915_ggtt_clear_range(struct i915_address_space *vm,
@@ -2492,9 +2518,16 @@ static void i915_ggtt_clear_range(struct i915_address_space *vm,
2492 uint64_t length, 2518 uint64_t length,
2493 bool unused) 2519 bool unused)
2494{ 2520{
2521 struct drm_i915_private *dev_priv = vm->dev->dev_private;
2495 unsigned first_entry = start >> PAGE_SHIFT; 2522 unsigned first_entry = start >> PAGE_SHIFT;
2496 unsigned num_entries = length >> PAGE_SHIFT; 2523 unsigned num_entries = length >> PAGE_SHIFT;
2524 int rpm_atomic_seq;
2525
2526 rpm_atomic_seq = assert_rpm_atomic_begin(dev_priv);
2527
2497 intel_gtt_clear_range(first_entry, num_entries); 2528 intel_gtt_clear_range(first_entry, num_entries);
2529
2530 assert_rpm_atomic_end(dev_priv, rpm_atomic_seq);
2498} 2531}
2499 2532
2500static int ggtt_bind_vma(struct i915_vma *vma, 2533static int ggtt_bind_vma(struct i915_vma *vma,