diff options
author | Imre Deak <imre.deak@intel.com> | 2015-12-15 13:10:38 -0500 |
---|---|---|
committer | Imre Deak <imre.deak@intel.com> | 2015-12-17 09:37:44 -0500 |
commit | be69459a8027787b63e7541d53d1ee86ec9c5056 (patch) | |
tree | 07ba717035c84ee33a922f7eb54efd510f16b8a6 | |
parent | 2b19efebf175bb2120c5ae00b8e79febe73d225a (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.c | 33 |
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 | ||
2426 | static void gen8_ggtt_clear_range(struct i915_address_space *vm, | 2436 | static 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(>t_base[i], scratch_pte); | 2461 | gen8_set_pte(>t_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 | ||
2452 | static void gen6_ggtt_clear_range(struct i915_address_space *vm, | 2467 | static 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, >t_base[i]); | 2492 | iowrite32(scratch_pte, >t_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 | ||
2478 | static void i915_ggtt_insert_entries(struct i915_address_space *vm, | 2498 | static 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 | ||
2490 | static void i915_ggtt_clear_range(struct i915_address_space *vm, | 2516 | static 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 | ||
2500 | static int ggtt_bind_vma(struct i915_vma *vma, | 2533 | static int ggtt_bind_vma(struct i915_vma *vma, |