Merge tag 'drm-intel-gt-next-2021-04-06' of git://anongit.freedesktop.org/drm/drm-intel into drm-next
Driver Changes: - Prepare for local/device memory support on DG1 by starting to use it for kernel internal allocations: context, ring and engine scratch (Matt A, CQ, Abdiel, Imre) - Sandybridge fix to avoid hard hang on ring resume (Chris) - Limit imported dma-buf size to int32 (Matt A) - Double check heartbeat timeout before resetting (Chris) - Use new tasklet API for execution list (Emil) - Fix SPDX checkpats warnings (Chris) - Fixes for various checkpatch warnings (Chris) - Selftest improvements (Chris) - Move the defer_request waiter active assertion to correct spot (Chris) - Make local-memory probing a GT operation (Matt, Tvrtko) - Protect against request freeing during cancellation on wedging (Chris) - Retire unexpected starting state error dumping (Chris) - Distinction of memory regions in debugging (Zbigniew) - Always flush the submission queue on checking for idle (Chris) - Consolidate 2big error check to helper (Matt) - Decrease number of subplatform bits (Tvrtko) - Remove unused internal request priority levels (Chris) - Document the unused internal header bits in buddy allocator (Matt) - Cleanup the region class/instance encoding (Matt) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/YGxksaZGXHnFxlwg@jlahtine-mobl.ger.corp.intel.com
This commit is contained in:
commit
41d1d0c51f
@ -11404,9 +11404,7 @@ int
|
||||
intel_prepare_plane_fb(struct drm_plane *_plane,
|
||||
struct drm_plane_state *_new_plane_state)
|
||||
{
|
||||
struct i915_sched_attr attr = {
|
||||
.priority = I915_USER_PRIORITY(I915_PRIORITY_DISPLAY),
|
||||
};
|
||||
struct i915_sched_attr attr = { .priority = I915_PRIORITY_DISPLAY };
|
||||
struct intel_plane *plane = to_intel_plane(_plane);
|
||||
struct intel_plane_state *new_plane_state =
|
||||
to_intel_plane_state(_new_plane_state);
|
||||
|
@ -649,7 +649,7 @@ __create_context(struct drm_i915_private *i915)
|
||||
|
||||
kref_init(&ctx->ref);
|
||||
ctx->i915 = i915;
|
||||
ctx->sched.priority = I915_USER_PRIORITY(I915_PRIORITY_NORMAL);
|
||||
ctx->sched.priority = I915_PRIORITY_NORMAL;
|
||||
mutex_init(&ctx->mutex);
|
||||
INIT_LIST_HEAD(&ctx->link);
|
||||
|
||||
@ -1966,7 +1966,7 @@ static int set_priority(struct i915_gem_context *ctx,
|
||||
!capable(CAP_SYS_NICE))
|
||||
return -EPERM;
|
||||
|
||||
ctx->sched.priority = I915_USER_PRIORITY(priority);
|
||||
ctx->sched.priority = priority;
|
||||
context_apply_all(ctx, __apply_priority, ctx);
|
||||
|
||||
return 0;
|
||||
@ -2470,7 +2470,7 @@ int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data,
|
||||
|
||||
case I915_CONTEXT_PARAM_PRIORITY:
|
||||
args->size = 0;
|
||||
args->value = ctx->sched.priority >> I915_USER_PRIORITY_SHIFT;
|
||||
args->value = ctx->sched.priority;
|
||||
break;
|
||||
|
||||
case I915_CONTEXT_PARAM_SSEU:
|
||||
|
@ -250,6 +250,9 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
|
||||
}
|
||||
}
|
||||
|
||||
if (i915_gem_object_size_2big(dma_buf->size))
|
||||
return ERR_PTR(-E2BIG);
|
||||
|
||||
/* need to attach */
|
||||
attach = dma_buf_attach(dma_buf, dev->dev);
|
||||
if (IS_ERR(attach))
|
||||
|
@ -16,6 +16,32 @@
|
||||
#include "i915_gem_gtt.h"
|
||||
#include "i915_vma_types.h"
|
||||
|
||||
/*
|
||||
* XXX: There is a prevalence of the assumption that we fit the
|
||||
* object's page count inside a 32bit _signed_ variable. Let's document
|
||||
* this and catch if we ever need to fix it. In the meantime, if you do
|
||||
* spot such a local variable, please consider fixing!
|
||||
*
|
||||
* Aside from our own locals (for which we have no excuse!):
|
||||
* - sg_table embeds unsigned int for num_pages
|
||||
* - get_user_pages*() mixed ints with longs
|
||||
*/
|
||||
#define GEM_CHECK_SIZE_OVERFLOW(sz) \
|
||||
GEM_WARN_ON((sz) >> PAGE_SHIFT > INT_MAX)
|
||||
|
||||
static inline bool i915_gem_object_size_2big(u64 size)
|
||||
{
|
||||
struct drm_i915_gem_object *obj;
|
||||
|
||||
if (GEM_CHECK_SIZE_OVERFLOW(size))
|
||||
return true;
|
||||
|
||||
if (overflows_type(size, obj->base.size))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void i915_gem_init__objects(struct drm_i915_private *i915);
|
||||
|
||||
struct drm_i915_gem_object *i915_gem_object_alloc(void);
|
||||
|
@ -159,17 +159,7 @@ i915_gem_object_create_region(struct intel_memory_region *mem,
|
||||
GEM_BUG_ON(!size);
|
||||
GEM_BUG_ON(!IS_ALIGNED(size, I915_GTT_MIN_ALIGNMENT));
|
||||
|
||||
/*
|
||||
* XXX: There is a prevalence of the assumption that we fit the
|
||||
* object's page count inside a 32bit _signed_ variable. Let's document
|
||||
* this and catch if we ever need to fix it. In the meantime, if you do
|
||||
* spot such a local variable, please consider fixing!
|
||||
*/
|
||||
|
||||
if (size >> PAGE_SHIFT > INT_MAX)
|
||||
return ERR_PTR(-E2BIG);
|
||||
|
||||
if (overflows_type(size, obj->base.size))
|
||||
if (i915_gem_object_size_2big(size))
|
||||
return ERR_PTR(-E2BIG);
|
||||
|
||||
obj = i915_gem_object_alloc();
|
||||
|
@ -688,7 +688,7 @@ struct drm_i915_gem_object *
|
||||
i915_gem_object_create_stolen(struct drm_i915_private *i915,
|
||||
resource_size_t size)
|
||||
{
|
||||
return i915_gem_object_create_region(i915->mm.regions[INTEL_REGION_STOLEN],
|
||||
return i915_gem_object_create_region(i915->mm.regions[INTEL_REGION_STOLEN_SMEM],
|
||||
size, I915_BO_ALLOC_CONTIGUOUS);
|
||||
}
|
||||
|
||||
@ -728,7 +728,7 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *i915,
|
||||
resource_size_t stolen_offset,
|
||||
resource_size_t size)
|
||||
{
|
||||
struct intel_memory_region *mem = i915->mm.regions[INTEL_REGION_STOLEN];
|
||||
struct intel_memory_region *mem = i915->mm.regions[INTEL_REGION_STOLEN_SMEM];
|
||||
struct drm_i915_gem_object *obj;
|
||||
struct drm_mm_node *stolen;
|
||||
int ret;
|
||||
|
@ -508,21 +508,7 @@ i915_gem_userptr_ioctl(struct drm_device *dev,
|
||||
I915_USERPTR_UNSYNCHRONIZED))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* XXX: There is a prevalence of the assumption that we fit the
|
||||
* object's page count inside a 32bit _signed_ variable. Let's document
|
||||
* this and catch if we ever need to fix it. In the meantime, if you do
|
||||
* spot such a local variable, please consider fixing!
|
||||
*
|
||||
* Aside from our own locals (for which we have no excuse!):
|
||||
* - sg_table embeds unsigned int for num_pages
|
||||
* - get_user_pages*() mixed ints with longs
|
||||
*/
|
||||
|
||||
if (args->user_size >> PAGE_SHIFT > INT_MAX)
|
||||
return -E2BIG;
|
||||
|
||||
if (overflows_type(args->user_size, obj->base.size))
|
||||
if (i915_gem_object_size_2big(args->user_size))
|
||||
return -E2BIG;
|
||||
|
||||
if (!args->user_size)
|
||||
|
@ -220,7 +220,7 @@ static int igt_fill_blt_thread(void *arg)
|
||||
return PTR_ERR(ctx);
|
||||
|
||||
prio = i915_prandom_u32_max_state(I915_PRIORITY_MAX, prng);
|
||||
ctx->sched.priority = I915_USER_PRIORITY(prio);
|
||||
ctx->sched.priority = prio;
|
||||
}
|
||||
|
||||
ce = i915_gem_context_get_engine(ctx, 0);
|
||||
@ -338,7 +338,7 @@ static int igt_copy_blt_thread(void *arg)
|
||||
return PTR_ERR(ctx);
|
||||
|
||||
prio = i915_prandom_u32_max_state(I915_PRIORITY_MAX, prng);
|
||||
ctx->sched.priority = I915_USER_PRIORITY(prio);
|
||||
ctx->sched.priority = prio;
|
||||
}
|
||||
|
||||
ce = i915_gem_context_get_engine(ctx, 0);
|
||||
|
@ -1,5 +1,4 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
/*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
@ -37,6 +36,7 @@ void intel_gt_debugfs_register_files(struct dentry *root,
|
||||
{
|
||||
while (count--) {
|
||||
umode_t mode = files->fops->write ? 0644 : 0444;
|
||||
|
||||
if (!files->eval || files->eval(data))
|
||||
debugfs_create_file(files->name,
|
||||
mode, root, data,
|
||||
|
@ -59,9 +59,9 @@ static inline struct gen6_ppgtt *to_gen6_ppgtt(struct i915_ppgtt *base)
|
||||
for (iter = gen6_pde_index(start); \
|
||||
length > 0 && iter < I915_PDES && \
|
||||
(pt = i915_pt_entry(pd, iter), true); \
|
||||
({ u32 temp = ALIGN(start+1, 1 << GEN6_PDE_SHIFT); \
|
||||
({ u32 temp = ALIGN(start + 1, 1 << GEN6_PDE_SHIFT); \
|
||||
temp = min(temp - start, length); \
|
||||
start += temp, length -= temp; }), ++iter)
|
||||
start += temp; length -= temp; }), ++iter)
|
||||
|
||||
#define gen6_for_all_pdes(pt, pd, iter) \
|
||||
for (iter = 0; \
|
||||
|
@ -1,25 +1,7 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* Copyright © 2014 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Generated by: intel-gpu-tools-1.8-220-g01153e7
|
||||
*/
|
||||
|
||||
|
@ -1,25 +1,7 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* Copyright © 2014 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Generated by: intel-gpu-tools-1.8-220-g01153e7
|
||||
*/
|
||||
|
||||
|
@ -5,6 +5,8 @@
|
||||
|
||||
#include <linux/log2.h>
|
||||
|
||||
#include "gem/i915_gem_lmem.h"
|
||||
|
||||
#include "gen8_ppgtt.h"
|
||||
#include "i915_scatterlist.h"
|
||||
#include "i915_trace.h"
|
||||
@ -35,6 +37,9 @@ static u64 gen8_pte_encode(dma_addr_t addr,
|
||||
if (unlikely(flags & PTE_READ_ONLY))
|
||||
pte &= ~_PAGE_RW;
|
||||
|
||||
if (flags & PTE_LM)
|
||||
pte |= GEN12_PPGTT_PTE_LM;
|
||||
|
||||
switch (level) {
|
||||
case I915_CACHE_NONE:
|
||||
pte |= PPAT_UNCACHED;
|
||||
@ -145,6 +150,7 @@ static unsigned int gen8_pt_count(u64 start, u64 end)
|
||||
static unsigned int gen8_pd_top_count(const struct i915_address_space *vm)
|
||||
{
|
||||
unsigned int shift = __gen8_pte_shift(vm->top);
|
||||
|
||||
return (vm->total + (1ull << shift) - 1) >> shift;
|
||||
}
|
||||
|
||||
@ -557,6 +563,7 @@ static void gen8_ppgtt_insert(struct i915_address_space *vm,
|
||||
|
||||
static int gen8_init_scratch(struct i915_address_space *vm)
|
||||
{
|
||||
u32 pte_flags;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
@ -580,9 +587,13 @@ static int gen8_init_scratch(struct i915_address_space *vm)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pte_flags = vm->has_read_only;
|
||||
if (i915_gem_object_is_lmem(vm->scratch[0]))
|
||||
pte_flags |= PTE_LM;
|
||||
|
||||
vm->scratch[0]->encode =
|
||||
gen8_pte_encode(px_dma(vm->scratch[0]),
|
||||
I915_CACHE_LLC, vm->has_read_only);
|
||||
I915_CACHE_LLC, pte_flags);
|
||||
|
||||
for (i = 1; i <= vm->top; i++) {
|
||||
struct drm_i915_gem_object *obj;
|
||||
|
@ -1,25 +1,7 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* Copyright © 2014 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Generated by: intel-gpu-tools-1.8-220-g01153e7
|
||||
*/
|
||||
|
||||
|
@ -1,25 +1,7 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* Copyright © 2014 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Generated by: intel-gpu-tools-1.19-177-g68e2eab2
|
||||
*/
|
||||
|
||||
|
@ -1,25 +1,6 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* Copyright © 2015 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* Copyright © 2015-2021 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/kthread.h>
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,25 +1,6 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* Copyright © 2016 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <drm/drm_print.h>
|
||||
@ -1251,14 +1232,14 @@ void __intel_engine_flush_submission(struct intel_engine_cs *engine, bool sync)
|
||||
{
|
||||
struct tasklet_struct *t = &engine->execlists.tasklet;
|
||||
|
||||
if (!t->func)
|
||||
if (!t->callback)
|
||||
return;
|
||||
|
||||
local_bh_disable();
|
||||
if (tasklet_trylock(t)) {
|
||||
/* Must wait for any GPU reset in progress. */
|
||||
if (__tasklet_is_enabled(t))
|
||||
t->func(t->data);
|
||||
t->callback(t);
|
||||
tasklet_unlock(t);
|
||||
}
|
||||
local_bh_enable();
|
||||
@ -1285,14 +1266,8 @@ bool intel_engine_is_idle(struct intel_engine_cs *engine)
|
||||
return true;
|
||||
|
||||
/* Waiting to drain ELSP? */
|
||||
if (execlists_active(&engine->execlists)) {
|
||||
synchronize_hardirq(to_pci_dev(engine->i915->drm.dev)->irq);
|
||||
|
||||
intel_engine_flush_submission(engine);
|
||||
|
||||
if (execlists_active(&engine->execlists))
|
||||
return false;
|
||||
}
|
||||
synchronize_hardirq(to_pci_dev(engine->i915->drm.dev)->irq);
|
||||
intel_engine_flush_submission(engine);
|
||||
|
||||
/* ELSP is empty, but there are ready requests? E.g. after reset */
|
||||
if (!RB_EMPTY_ROOT(&engine->execlists.queue.rb_root))
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
@ -32,7 +31,7 @@ static bool next_heartbeat(struct intel_engine_cs *engine)
|
||||
delay = msecs_to_jiffies_timeout(delay);
|
||||
if (delay >= HZ)
|
||||
delay = round_jiffies_up_relative(delay);
|
||||
mod_delayed_work(system_highpri_wq, &engine->heartbeat.work, delay);
|
||||
mod_delayed_work(system_highpri_wq, &engine->heartbeat.work, delay + 1);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -81,9 +80,7 @@ static void show_heartbeat(const struct i915_request *rq,
|
||||
|
||||
static void heartbeat(struct work_struct *wrk)
|
||||
{
|
||||
struct i915_sched_attr attr = {
|
||||
.priority = I915_USER_PRIORITY(I915_PRIORITY_MIN),
|
||||
};
|
||||
struct i915_sched_attr attr = { .priority = I915_PRIORITY_MIN };
|
||||
struct intel_engine_cs *engine =
|
||||
container_of(wrk, typeof(*engine), heartbeat.work.work);
|
||||
struct intel_context *ce = engine->kernel_context;
|
||||
@ -106,6 +103,13 @@ static void heartbeat(struct work_struct *wrk)
|
||||
goto out;
|
||||
|
||||
if (engine->heartbeat.systole) {
|
||||
long delay = READ_ONCE(engine->props.heartbeat_interval_ms);
|
||||
|
||||
/* Safeguard against too-fast worker invocations */
|
||||
if (!time_after(jiffies,
|
||||
rq->emitted_jiffies + msecs_to_jiffies(delay)))
|
||||
goto out;
|
||||
|
||||
if (!i915_sw_fence_signaled(&rq->submit)) {
|
||||
/*
|
||||
* Not yet submitted, system is stalled.
|
||||
@ -125,9 +129,9 @@ static void heartbeat(struct work_struct *wrk)
|
||||
* low latency and no jitter] the chance to naturally
|
||||
* complete before being preempted.
|
||||
*/
|
||||
attr.priority = I915_PRIORITY_MASK;
|
||||
attr.priority = 0;
|
||||
if (rq->sched.attr.priority >= attr.priority)
|
||||
attr.priority |= I915_USER_PRIORITY(I915_PRIORITY_HEARTBEAT);
|
||||
attr.priority = I915_PRIORITY_HEARTBEAT;
|
||||
if (rq->sched.attr.priority >= attr.priority)
|
||||
attr.priority = I915_PRIORITY_BARRIER;
|
||||
|
||||
@ -143,6 +147,8 @@ static void heartbeat(struct work_struct *wrk)
|
||||
"stopped heartbeat on %s",
|
||||
engine->name);
|
||||
}
|
||||
|
||||
rq->emitted_jiffies = jiffies;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -286,9 +292,7 @@ int intel_engine_pulse(struct intel_engine_cs *engine)
|
||||
|
||||
int intel_engine_flush_barriers(struct intel_engine_cs *engine)
|
||||
{
|
||||
struct i915_sched_attr attr = {
|
||||
.priority = I915_USER_PRIORITY(I915_PRIORITY_MIN),
|
||||
};
|
||||
struct i915_sched_attr attr = { .priority = I915_PRIORITY_MIN };
|
||||
struct intel_context *ce = engine->kernel_context;
|
||||
struct i915_request *rq;
|
||||
int err;
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -274,22 +274,13 @@ static int effective_prio(const struct i915_request *rq)
|
||||
|
||||
static int queue_prio(const struct intel_engine_execlists *execlists)
|
||||
{
|
||||
struct i915_priolist *p;
|
||||
struct rb_node *rb;
|
||||
|
||||
rb = rb_first_cached(&execlists->queue);
|
||||
if (!rb)
|
||||
return INT_MIN;
|
||||
|
||||
/*
|
||||
* As the priolist[] are inverted, with the highest priority in [0],
|
||||
* we have to flip the index value to become priority.
|
||||
*/
|
||||
p = to_priolist(rb);
|
||||
if (!I915_USER_PRIORITY_SHIFT)
|
||||
return p->priority;
|
||||
|
||||
return ((p->priority + 1) << I915_USER_PRIORITY_SHIFT) - ffs(p->used);
|
||||
return to_priolist(rb)->priority;
|
||||
}
|
||||
|
||||
static int virtual_prio(const struct intel_engine_execlists *el)
|
||||
@ -1081,7 +1072,6 @@ static void defer_request(struct i915_request *rq, struct list_head * const pl)
|
||||
__i915_request_has_started(w) &&
|
||||
!__i915_request_is_complete(rq));
|
||||
|
||||
GEM_BUG_ON(i915_request_is_active(w));
|
||||
if (!i915_request_is_ready(w))
|
||||
continue;
|
||||
|
||||
@ -1089,6 +1079,7 @@ static void defer_request(struct i915_request *rq, struct list_head * const pl)
|
||||
continue;
|
||||
|
||||
GEM_BUG_ON(rq_prio(w) > rq_prio(rq));
|
||||
GEM_BUG_ON(i915_request_is_active(w));
|
||||
list_move_tail(&w->sched.link, &list);
|
||||
}
|
||||
|
||||
@ -1461,9 +1452,8 @@ unlock:
|
||||
while ((rb = rb_first_cached(&execlists->queue))) {
|
||||
struct i915_priolist *p = to_priolist(rb);
|
||||
struct i915_request *rq, *rn;
|
||||
int i;
|
||||
|
||||
priolist_for_each_request_consume(rq, rn, p, i) {
|
||||
priolist_for_each_request_consume(rq, rn, p) {
|
||||
bool merge = true;
|
||||
|
||||
/*
|
||||
@ -2353,9 +2343,10 @@ static bool preempt_timeout(const struct intel_engine_cs *const engine)
|
||||
* Check the unread Context Status Buffers and manage the submission of new
|
||||
* contexts to the ELSP accordingly.
|
||||
*/
|
||||
static void execlists_submission_tasklet(unsigned long data)
|
||||
static void execlists_submission_tasklet(struct tasklet_struct *t)
|
||||
{
|
||||
struct intel_engine_cs * const engine = (struct intel_engine_cs *)data;
|
||||
struct intel_engine_cs * const engine =
|
||||
from_tasklet(engine, t, execlists.tasklet);
|
||||
struct i915_request *post[2 * EXECLIST_MAX_PORTS];
|
||||
struct i915_request **inactive;
|
||||
|
||||
@ -2758,31 +2749,11 @@ static void enable_execlists(struct intel_engine_cs *engine)
|
||||
enable_error_interrupt(engine);
|
||||
}
|
||||
|
||||
static bool unexpected_starting_state(struct intel_engine_cs *engine)
|
||||
{
|
||||
bool unexpected = false;
|
||||
|
||||
if (ENGINE_READ_FW(engine, RING_MI_MODE) & STOP_RING) {
|
||||
drm_dbg(&engine->i915->drm,
|
||||
"STOP_RING still set in RING_MI_MODE\n");
|
||||
unexpected = true;
|
||||
}
|
||||
|
||||
return unexpected;
|
||||
}
|
||||
|
||||
static int execlists_resume(struct intel_engine_cs *engine)
|
||||
{
|
||||
intel_mocs_init_engine(engine);
|
||||
|
||||
intel_breadcrumbs_reset(engine->breadcrumbs);
|
||||
|
||||
if (GEM_SHOW_DEBUG() && unexpected_starting_state(engine)) {
|
||||
struct drm_printer p = drm_debug_printer(__func__);
|
||||
|
||||
intel_engine_dump(engine, &p, NULL);
|
||||
}
|
||||
|
||||
enable_execlists(engine);
|
||||
|
||||
return 0;
|
||||
@ -2953,9 +2924,10 @@ static void execlists_reset_rewind(struct intel_engine_cs *engine, bool stalled)
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static void nop_submission_tasklet(unsigned long data)
|
||||
static void nop_submission_tasklet(struct tasklet_struct *t)
|
||||
{
|
||||
struct intel_engine_cs * const engine = (struct intel_engine_cs *)data;
|
||||
struct intel_engine_cs * const engine =
|
||||
from_tasklet(engine, t, execlists.tasklet);
|
||||
|
||||
/* The driver is wedged; don't process any more events. */
|
||||
WRITE_ONCE(engine->execlists.queue_priority_hint, INT_MIN);
|
||||
@ -2991,17 +2963,18 @@ static void execlists_reset_cancel(struct intel_engine_cs *engine)
|
||||
|
||||
/* Mark all executing requests as skipped. */
|
||||
list_for_each_entry(rq, &engine->active.requests, sched.link)
|
||||
i915_request_mark_eio(rq);
|
||||
i915_request_put(i915_request_mark_eio(rq));
|
||||
intel_engine_signal_breadcrumbs(engine);
|
||||
|
||||
/* Flush the queued requests to the timeline list (for retiring). */
|
||||
while ((rb = rb_first_cached(&execlists->queue))) {
|
||||
struct i915_priolist *p = to_priolist(rb);
|
||||
int i;
|
||||
|
||||
priolist_for_each_request_consume(rq, rn, p, i) {
|
||||
i915_request_mark_eio(rq);
|
||||
__i915_request_submit(rq);
|
||||
priolist_for_each_request_consume(rq, rn, p) {
|
||||
if (i915_request_mark_eio(rq)) {
|
||||
__i915_request_submit(rq);
|
||||
i915_request_put(rq);
|
||||
}
|
||||
}
|
||||
|
||||
rb_erase_cached(&p->node, &execlists->queue);
|
||||
@ -3010,7 +2983,7 @@ static void execlists_reset_cancel(struct intel_engine_cs *engine)
|
||||
|
||||
/* On-hold requests will be flushed to timeline upon their release */
|
||||
list_for_each_entry(rq, &engine->active.hold, sched.link)
|
||||
i915_request_mark_eio(rq);
|
||||
i915_request_put(i915_request_mark_eio(rq));
|
||||
|
||||
/* Cancel all attached virtual engines */
|
||||
while ((rb = rb_first_cached(&execlists->virtual))) {
|
||||
@ -3023,10 +2996,11 @@ static void execlists_reset_cancel(struct intel_engine_cs *engine)
|
||||
spin_lock(&ve->base.active.lock);
|
||||
rq = fetch_and_zero(&ve->request);
|
||||
if (rq) {
|
||||
i915_request_mark_eio(rq);
|
||||
|
||||
rq->engine = engine;
|
||||
__i915_request_submit(rq);
|
||||
if (i915_request_mark_eio(rq)) {
|
||||
rq->engine = engine;
|
||||
__i915_request_submit(rq);
|
||||
i915_request_put(rq);
|
||||
}
|
||||
i915_request_put(rq);
|
||||
|
||||
ve->base.execlists.queue_priority_hint = INT_MIN;
|
||||
@ -3040,7 +3014,7 @@ static void execlists_reset_cancel(struct intel_engine_cs *engine)
|
||||
execlists->queue = RB_ROOT_CACHED;
|
||||
|
||||
GEM_BUG_ON(__tasklet_is_enabled(&execlists->tasklet));
|
||||
execlists->tasklet.func = nop_submission_tasklet;
|
||||
execlists->tasklet.callback = nop_submission_tasklet;
|
||||
|
||||
spin_unlock_irqrestore(&engine->active.lock, flags);
|
||||
rcu_read_unlock();
|
||||
@ -3101,7 +3075,7 @@ static void execlists_set_default_submission(struct intel_engine_cs *engine)
|
||||
{
|
||||
engine->submit_request = execlists_submit_request;
|
||||
engine->schedule = i915_schedule;
|
||||
engine->execlists.tasklet.func = execlists_submission_tasklet;
|
||||
engine->execlists.tasklet.callback = execlists_submission_tasklet;
|
||||
|
||||
engine->reset.prepare = execlists_reset_prepare;
|
||||
engine->reset.rewind = execlists_reset_rewind;
|
||||
@ -3148,7 +3122,7 @@ static void execlists_release(struct intel_engine_cs *engine)
|
||||
static void
|
||||
logical_ring_default_vfuncs(struct intel_engine_cs *engine)
|
||||
{
|
||||
/* Default vfuncs which can be overriden by each engine. */
|
||||
/* Default vfuncs which can be overridden by each engine. */
|
||||
|
||||
engine->resume = execlists_resume;
|
||||
|
||||
@ -3224,8 +3198,7 @@ int intel_execlists_submission_setup(struct intel_engine_cs *engine)
|
||||
struct intel_uncore *uncore = engine->uncore;
|
||||
u32 base = engine->mmio_base;
|
||||
|
||||
tasklet_init(&engine->execlists.tasklet,
|
||||
execlists_submission_tasklet, (unsigned long)engine);
|
||||
tasklet_setup(&engine->execlists.tasklet, execlists_submission_tasklet);
|
||||
timer_setup(&engine->execlists.timer, execlists_timeslice, 0);
|
||||
timer_setup(&engine->execlists.preempt, execlists_preempt, 0);
|
||||
|
||||
@ -3273,7 +3246,7 @@ int intel_execlists_submission_setup(struct intel_engine_cs *engine)
|
||||
|
||||
static struct list_head *virtual_queue(struct virtual_engine *ve)
|
||||
{
|
||||
return &ve->base.execlists.default_priolist.requests[0];
|
||||
return &ve->base.execlists.default_priolist.requests;
|
||||
}
|
||||
|
||||
static void rcu_virtual_context_destroy(struct work_struct *wrk)
|
||||
@ -3389,8 +3362,8 @@ static int virtual_context_alloc(struct intel_context *ce)
|
||||
}
|
||||
|
||||
static int virtual_context_pre_pin(struct intel_context *ce,
|
||||
struct i915_gem_ww_ctx *ww,
|
||||
void **vaddr)
|
||||
struct i915_gem_ww_ctx *ww,
|
||||
void **vaddr)
|
||||
{
|
||||
struct virtual_engine *ve = container_of(ce, typeof(*ve), context);
|
||||
|
||||
@ -3467,9 +3440,10 @@ static intel_engine_mask_t virtual_submission_mask(struct virtual_engine *ve)
|
||||
return mask;
|
||||
}
|
||||
|
||||
static void virtual_submission_tasklet(unsigned long data)
|
||||
static void virtual_submission_tasklet(struct tasklet_struct *t)
|
||||
{
|
||||
struct virtual_engine * const ve = (struct virtual_engine *)data;
|
||||
struct virtual_engine * const ve =
|
||||
from_tasklet(ve, t, base.execlists.tasklet);
|
||||
const int prio = READ_ONCE(ve->base.execlists.queue_priority_hint);
|
||||
intel_engine_mask_t mask;
|
||||
unsigned int n;
|
||||
@ -3679,9 +3653,7 @@ intel_execlists_create_virtual(struct intel_engine_cs **siblings,
|
||||
|
||||
INIT_LIST_HEAD(virtual_queue(ve));
|
||||
ve->base.execlists.queue_priority_hint = INT_MIN;
|
||||
tasklet_init(&ve->base.execlists.tasklet,
|
||||
virtual_submission_tasklet,
|
||||
(unsigned long)ve);
|
||||
tasklet_setup(&ve->base.execlists.tasklet, virtual_submission_tasklet);
|
||||
|
||||
intel_context_init(&ve->context, &ve->base);
|
||||
|
||||
@ -3709,7 +3681,7 @@ intel_execlists_create_virtual(struct intel_engine_cs **siblings,
|
||||
* layering if we handle cloning of the requests and
|
||||
* submitting a copy into each backend.
|
||||
*/
|
||||
if (sibling->execlists.tasklet.func !=
|
||||
if (sibling->execlists.tasklet.callback !=
|
||||
execlists_submission_tasklet) {
|
||||
err = -ENODEV;
|
||||
goto err_put;
|
||||
@ -3869,9 +3841,8 @@ void intel_execlists_show_requests(struct intel_engine_cs *engine,
|
||||
count = 0;
|
||||
for (rb = rb_first_cached(&execlists->queue); rb; rb = rb_next(rb)) {
|
||||
struct i915_priolist *p = rb_entry(rb, typeof(*p), node);
|
||||
int i;
|
||||
|
||||
priolist_for_each_request(rq, p, i) {
|
||||
priolist_for_each_request(rq, p) {
|
||||
if (count++ < max - 1)
|
||||
show_request(m, rq, "\t\t", 0);
|
||||
else
|
||||
|
@ -10,6 +10,8 @@
|
||||
|
||||
#include <drm/i915_drm.h>
|
||||
|
||||
#include "gem/i915_gem_lmem.h"
|
||||
|
||||
#include "intel_gt.h"
|
||||
#include "i915_drv.h"
|
||||
#include "i915_scatterlist.h"
|
||||
@ -92,7 +94,7 @@ int i915_ggtt_init_hw(struct drm_i915_private *i915)
|
||||
}
|
||||
|
||||
/*
|
||||
* Certain Gen5 chipsets require require idling the GPU before
|
||||
* Certain Gen5 chipsets require idling the GPU before
|
||||
* unmapping anything from the GTT when VT-d is enabled.
|
||||
*/
|
||||
static bool needs_idle_maps(struct drm_i915_private *i915)
|
||||
@ -189,7 +191,12 @@ static u64 gen8_ggtt_pte_encode(dma_addr_t addr,
|
||||
enum i915_cache_level level,
|
||||
u32 flags)
|
||||
{
|
||||
return addr | _PAGE_PRESENT;
|
||||
gen8_pte_t pte = addr | _PAGE_PRESENT;
|
||||
|
||||
if (flags & PTE_LM)
|
||||
pte |= GEN12_GGTT_PTE_LM;
|
||||
|
||||
return pte;
|
||||
}
|
||||
|
||||
static void gen8_set_pte(void __iomem *addr, gen8_pte_t pte)
|
||||
@ -201,13 +208,13 @@ static void gen8_ggtt_insert_page(struct i915_address_space *vm,
|
||||
dma_addr_t addr,
|
||||
u64 offset,
|
||||
enum i915_cache_level level,
|
||||
u32 unused)
|
||||
u32 flags)
|
||||
{
|
||||
struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
|
||||
gen8_pte_t __iomem *pte =
|
||||
(gen8_pte_t __iomem *)ggtt->gsm + offset / I915_GTT_PAGE_SIZE;
|
||||
|
||||
gen8_set_pte(pte, gen8_ggtt_pte_encode(addr, level, 0));
|
||||
gen8_set_pte(pte, gen8_ggtt_pte_encode(addr, level, flags));
|
||||
|
||||
ggtt->invalidate(ggtt);
|
||||
}
|
||||
@ -217,7 +224,7 @@ static void gen8_ggtt_insert_entries(struct i915_address_space *vm,
|
||||
enum i915_cache_level level,
|
||||
u32 flags)
|
||||
{
|
||||
const gen8_pte_t pte_encode = gen8_ggtt_pte_encode(0, level, 0);
|
||||
const gen8_pte_t pte_encode = gen8_ggtt_pte_encode(0, level, flags);
|
||||
struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
|
||||
gen8_pte_t __iomem *gte;
|
||||
gen8_pte_t __iomem *end;
|
||||
@ -459,6 +466,8 @@ static void ggtt_bind_vma(struct i915_address_space *vm,
|
||||
pte_flags = 0;
|
||||
if (i915_gem_object_is_readonly(obj))
|
||||
pte_flags |= PTE_READ_ONLY;
|
||||
if (i915_gem_object_is_lmem(obj))
|
||||
pte_flags |= PTE_LM;
|
||||
|
||||
vm->insert_entries(vm, vma, cache_level, pte_flags);
|
||||
vma->page_sizes.gtt = I915_GTT_PAGE_SIZE;
|
||||
@ -797,6 +806,7 @@ static int ggtt_probe_common(struct i915_ggtt *ggtt, u64 size)
|
||||
struct drm_i915_private *i915 = ggtt->vm.i915;
|
||||
struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
|
||||
phys_addr_t phys_addr;
|
||||
u32 pte_flags;
|
||||
int ret;
|
||||
|
||||
/* For Modern GENs the PTEs and register space are split in the BAR */
|
||||
@ -826,9 +836,13 @@ static int ggtt_probe_common(struct i915_ggtt *ggtt, u64 size)
|
||||
return ret;
|
||||
}
|
||||
|
||||
pte_flags = 0;
|
||||
if (i915_gem_object_is_lmem(ggtt->vm.scratch[0]))
|
||||
pte_flags |= PTE_LM;
|
||||
|
||||
ggtt->vm.scratch[0]->encode =
|
||||
ggtt->vm.pte_encode(px_dma(ggtt->vm.scratch[0]),
|
||||
I915_CACHE_NONE, 0);
|
||||
I915_CACHE_NONE, pte_flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,24 +1,6 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* Copyright © 2008-2015 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "i915_drv.h"
|
||||
@ -598,6 +580,7 @@ static void detect_bit_6_swizzle(struct i915_ggtt *ggtt)
|
||||
}
|
||||
} else {
|
||||
u32 dimm_c0, dimm_c1;
|
||||
|
||||
dimm_c0 = intel_uncore_read(uncore, MAD_DIMM_C0);
|
||||
dimm_c1 = intel_uncore_read(uncore, MAD_DIMM_C1);
|
||||
dimm_c0 &= MAD_DIMM_A_SIZE_MASK | MAD_DIMM_B_SIZE_MASK;
|
||||
@ -787,10 +770,12 @@ i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj,
|
||||
i = 0;
|
||||
for_each_sgt_page(page, sgt_iter, pages) {
|
||||
char new_bit_17 = page_to_phys(page) >> 17;
|
||||
|
||||
if ((new_bit_17 & 0x1) != (test_bit(i, obj->bit_17) != 0)) {
|
||||
swizzle_page(page);
|
||||
set_page_dirty(page);
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
@ -1,25 +1,6 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2016 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __INTEL_GGTT_FENCING_H__
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT*/
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright <EFBFBD> 2003-2018 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -4,6 +4,8 @@
|
||||
*/
|
||||
|
||||
#include "debugfs_gt.h"
|
||||
|
||||
#include "gem/i915_gem_lmem.h"
|
||||
#include "i915_drv.h"
|
||||
#include "intel_context.h"
|
||||
#include "intel_gt.h"
|
||||
@ -42,6 +44,42 @@ void intel_gt_init_early(struct intel_gt *gt, struct drm_i915_private *i915)
|
||||
intel_uc_init_early(>->uc);
|
||||
}
|
||||
|
||||
int intel_gt_probe_lmem(struct intel_gt *gt)
|
||||
{
|
||||
struct drm_i915_private *i915 = gt->i915;
|
||||
struct intel_memory_region *mem;
|
||||
int id;
|
||||
int err;
|
||||
|
||||
mem = intel_gt_setup_lmem(gt);
|
||||
if (mem == ERR_PTR(-ENODEV))
|
||||
mem = intel_gt_setup_fake_lmem(gt);
|
||||
if (IS_ERR(mem)) {
|
||||
err = PTR_ERR(mem);
|
||||
if (err == -ENODEV)
|
||||
return 0;
|
||||
|
||||
drm_err(&i915->drm,
|
||||
"Failed to setup region(%d) type=%d\n",
|
||||
err, INTEL_MEMORY_LOCAL);
|
||||
return err;
|
||||
}
|
||||
|
||||
id = INTEL_REGION_LMEM;
|
||||
|
||||
mem->id = id;
|
||||
mem->type = INTEL_MEMORY_LOCAL;
|
||||
mem->instance = 0;
|
||||
|
||||
intel_memory_region_set_name(mem, "local%u", mem->instance);
|
||||
|
||||
GEM_BUG_ON(!HAS_REGION(i915, id));
|
||||
GEM_BUG_ON(i915->mm.regions[id]);
|
||||
i915->mm.regions[id] = mem;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void intel_gt_init_hw_early(struct intel_gt *gt, struct i915_ggtt *ggtt)
|
||||
{
|
||||
gt->ggtt = ggtt;
|
||||
@ -347,11 +385,13 @@ static int intel_gt_init_scratch(struct intel_gt *gt, unsigned int size)
|
||||
struct i915_vma *vma;
|
||||
int ret;
|
||||
|
||||
obj = i915_gem_object_create_stolen(i915, size);
|
||||
obj = i915_gem_object_create_lmem(i915, size, I915_BO_ALLOC_VOLATILE);
|
||||
if (IS_ERR(obj))
|
||||
obj = i915_gem_object_create_stolen(i915, size);
|
||||
if (IS_ERR(obj))
|
||||
obj = i915_gem_object_create_internal(i915, size);
|
||||
if (IS_ERR(obj)) {
|
||||
DRM_ERROR("Failed to allocate scratch page\n");
|
||||
drm_err(&i915->drm, "Failed to allocate scratch page\n");
|
||||
return PTR_ERR(obj);
|
||||
}
|
||||
|
||||
|
@ -36,6 +36,7 @@ static inline struct intel_gt *huc_to_gt(struct intel_huc *huc)
|
||||
|
||||
void intel_gt_init_early(struct intel_gt *gt, struct drm_i915_private *i915);
|
||||
void intel_gt_init_hw_early(struct intel_gt *gt, struct i915_ggtt *ggtt);
|
||||
int intel_gt_probe_lmem(struct intel_gt *gt);
|
||||
int intel_gt_init_mmio(struct intel_gt *gt);
|
||||
int __must_check intel_gt_init_hw(struct intel_gt *gt);
|
||||
int intel_gt_init(struct intel_gt *gt);
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2014-2018 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -165,7 +165,6 @@ void intel_gt_init_clock_frequency(struct intel_gt *gt)
|
||||
gt->clock_period_ns,
|
||||
div_u64(mul_u32_u32(gt->clock_period_ns, S32_MAX),
|
||||
USEC_PER_SEC));
|
||||
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -85,6 +85,10 @@ typedef u64 gen8_pte_t;
|
||||
#define BYT_PTE_SNOOPED_BY_CPU_CACHES REG_BIT(2)
|
||||
#define BYT_PTE_WRITEABLE REG_BIT(1)
|
||||
|
||||
#define GEN12_PPGTT_PTE_LM BIT_ULL(11)
|
||||
|
||||
#define GEN12_GGTT_PTE_LM BIT_ULL(1)
|
||||
|
||||
/*
|
||||
* Cacheability Control is a 4-bit value. The low three bits are stored in bits
|
||||
* 3:1 of the PTE, while the fourth bit is stored in bit 11 of the PTE.
|
||||
@ -265,6 +269,7 @@ struct i915_address_space {
|
||||
enum i915_cache_level level,
|
||||
u32 flags); /* Create a valid PTE */
|
||||
#define PTE_READ_ONLY BIT(0)
|
||||
#define PTE_LM BIT(1)
|
||||
|
||||
void (*allocate_va_range)(struct i915_address_space *vm,
|
||||
struct i915_vm_pt_stash *stash,
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -3,6 +3,8 @@
|
||||
* Copyright © 2014 Intel Corporation
|
||||
*/
|
||||
|
||||
#include "gem/i915_gem_lmem.h"
|
||||
|
||||
#include "gen8_engine_cs.h"
|
||||
#include "i915_drv.h"
|
||||
#include "i915_perf.h"
|
||||
@ -808,7 +810,9 @@ __lrc_alloc_state(struct intel_context *ce, struct intel_engine_cs *engine)
|
||||
context_size += PAGE_SIZE;
|
||||
}
|
||||
|
||||
obj = i915_gem_object_create_shmem(engine->i915, context_size);
|
||||
obj = i915_gem_object_create_lmem(engine->i915, context_size, 0);
|
||||
if (IS_ERR(obj))
|
||||
obj = i915_gem_object_create_shmem(engine->i915, context_size);
|
||||
if (IS_ERR(obj))
|
||||
return ERR_CAST(obj);
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2014-2018 Intel Corporation
|
||||
*/
|
||||
|
||||
@ -40,7 +39,7 @@
|
||||
|
||||
#define ASSIGN_CTX_PML4(ppgtt, reg_state) do { \
|
||||
u32 *reg_state__ = (reg_state); \
|
||||
const u64 addr__ = px_dma(ppgtt->pd); \
|
||||
const u64 addr__ = px_dma((ppgtt)->pd); \
|
||||
(reg_state__)[CTX_PDP0_UDW] = upper_32_bits(addr__); \
|
||||
(reg_state__)[CTX_PDP0_LDW] = lower_32_bits(addr__); \
|
||||
} while (0)
|
||||
|
@ -1,23 +1,6 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* Copyright (c) 2015 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions: *
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
* Copyright © 2015 Intel Corporation
|
||||
*/
|
||||
|
||||
#include "i915_drv.h"
|
||||
|
@ -1,24 +1,6 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright (c) 2015 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
* Copyright © 2015 Intel Corporation
|
||||
*/
|
||||
|
||||
#ifndef INTEL_MOCS_H
|
||||
|
@ -5,6 +5,8 @@
|
||||
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "gem/i915_gem_lmem.h"
|
||||
|
||||
#include "i915_trace.h"
|
||||
#include "intel_gtt.h"
|
||||
#include "gen6_ppgtt.h"
|
||||
@ -192,6 +194,8 @@ void ppgtt_bind_vma(struct i915_address_space *vm,
|
||||
pte_flags = 0;
|
||||
if (i915_gem_object_is_readonly(vma->obj))
|
||||
pte_flags |= PTE_READ_ONLY;
|
||||
if (i915_gem_object_is_lmem(vma->obj))
|
||||
pte_flags |= PTE_LM;
|
||||
|
||||
vm->insert_entries(vm, vma, cache_level, pte_flags);
|
||||
wmb();
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
@ -176,7 +175,6 @@ static void gen9_rc6_enable(struct intel_rc6 *rc6)
|
||||
/* 3a: Enable RC6 */
|
||||
set(uncore, GEN6_RC6_THRESHOLD, 37500); /* 37.5/125ms per EI */
|
||||
|
||||
|
||||
rc6->ctl_enable =
|
||||
GEN6_RC_CTL_HW_ENABLE |
|
||||
GEN6_RC_CTL_RC6_ENABLE |
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -90,8 +90,6 @@ region_lmem_init(struct intel_memory_region *mem)
|
||||
if (ret)
|
||||
io_mapping_fini(&mem->iomap);
|
||||
|
||||
intel_memory_region_set_name(mem, "local");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -102,20 +100,26 @@ static const struct intel_memory_region_ops intel_region_lmem_ops = {
|
||||
};
|
||||
|
||||
struct intel_memory_region *
|
||||
intel_setup_fake_lmem(struct drm_i915_private *i915)
|
||||
intel_gt_setup_fake_lmem(struct intel_gt *gt)
|
||||
{
|
||||
struct drm_i915_private *i915 = gt->i915;
|
||||
struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
|
||||
struct intel_memory_region *mem;
|
||||
resource_size_t mappable_end;
|
||||
resource_size_t io_start;
|
||||
resource_size_t start;
|
||||
|
||||
if (!HAS_LMEM(i915))
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
if (!i915->params.fake_lmem_start)
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
GEM_BUG_ON(i915_ggtt_has_aperture(&i915->ggtt));
|
||||
GEM_BUG_ON(!i915->params.fake_lmem_start);
|
||||
|
||||
/* Your mappable aperture belongs to me now! */
|
||||
mappable_end = pci_resource_len(pdev, 2);
|
||||
io_start = pci_resource_start(pdev, 2),
|
||||
io_start = pci_resource_start(pdev, 2);
|
||||
start = i915->params.fake_lmem_start;
|
||||
|
||||
mem = intel_memory_region_create(i915,
|
||||
@ -136,3 +140,86 @@ intel_setup_fake_lmem(struct drm_i915_private *i915)
|
||||
|
||||
return mem;
|
||||
}
|
||||
|
||||
static bool get_legacy_lowmem_region(struct intel_uncore *uncore,
|
||||
u64 *start, u32 *size)
|
||||
{
|
||||
if (!IS_DG1_REVID(uncore->i915, DG1_REVID_A0, DG1_REVID_B0))
|
||||
return false;
|
||||
|
||||
*start = 0;
|
||||
*size = SZ_1M;
|
||||
|
||||
drm_dbg(&uncore->i915->drm, "LMEM: reserved legacy low-memory [0x%llx-0x%llx]\n",
|
||||
*start, *start + *size);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int reserve_lowmem_region(struct intel_uncore *uncore,
|
||||
struct intel_memory_region *mem)
|
||||
{
|
||||
u64 reserve_start;
|
||||
u32 reserve_size;
|
||||
int ret;
|
||||
|
||||
if (!get_legacy_lowmem_region(uncore, &reserve_start, &reserve_size))
|
||||
return 0;
|
||||
|
||||
ret = intel_memory_region_reserve(mem, reserve_start, reserve_size);
|
||||
if (ret)
|
||||
drm_err(&uncore->i915->drm, "LMEM: reserving low memory region failed\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct intel_memory_region *setup_lmem(struct intel_gt *gt)
|
||||
{
|
||||
struct drm_i915_private *i915 = gt->i915;
|
||||
struct intel_uncore *uncore = gt->uncore;
|
||||
struct pci_dev *pdev = i915->drm.pdev;
|
||||
struct intel_memory_region *mem;
|
||||
resource_size_t io_start;
|
||||
resource_size_t lmem_size;
|
||||
int err;
|
||||
|
||||
if (!IS_DGFX(i915))
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
/* Stolen starts from GSMBASE on DG1 */
|
||||
lmem_size = intel_uncore_read64(uncore, GEN12_GSMBASE);
|
||||
|
||||
io_start = pci_resource_start(pdev, 2);
|
||||
if (GEM_WARN_ON(lmem_size > pci_resource_len(pdev, 2)))
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
mem = intel_memory_region_create(i915,
|
||||
0,
|
||||
lmem_size,
|
||||
I915_GTT_PAGE_SIZE_4K,
|
||||
io_start,
|
||||
&intel_region_lmem_ops);
|
||||
if (IS_ERR(mem))
|
||||
return mem;
|
||||
|
||||
err = reserve_lowmem_region(uncore, mem);
|
||||
if (err)
|
||||
goto err_region_put;
|
||||
|
||||
drm_dbg(&i915->drm, "Local memory: %pR\n", &mem->region);
|
||||
drm_dbg(&i915->drm, "Local memory IO start: %pa\n",
|
||||
&mem->io_start);
|
||||
drm_info(&i915->drm, "Local memory available: %pa\n",
|
||||
&lmem_size);
|
||||
|
||||
return mem;
|
||||
|
||||
err_region_put:
|
||||
intel_memory_region_put(mem);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
struct intel_memory_region *intel_gt_setup_lmem(struct intel_gt *gt)
|
||||
{
|
||||
return setup_lmem(gt);
|
||||
}
|
||||
|
@ -6,9 +6,11 @@
|
||||
#ifndef __INTEL_REGION_LMEM_H
|
||||
#define __INTEL_REGION_LMEM_H
|
||||
|
||||
struct drm_i915_private;
|
||||
struct intel_gt;
|
||||
|
||||
struct intel_memory_region *intel_gt_setup_lmem(struct intel_gt *gt);
|
||||
|
||||
struct intel_memory_region *
|
||||
intel_setup_fake_lmem(struct drm_i915_private *i915);
|
||||
intel_gt_setup_fake_lmem(struct intel_gt *gt);
|
||||
|
||||
#endif /* !__INTEL_REGION_LMEM_H */
|
||||
|
@ -1,28 +1,6 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* Copyright © 2014 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* Authors:
|
||||
* Mika Kuoppala <mika.kuoppala@intel.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "i915_drv.h"
|
||||
@ -65,7 +43,7 @@ render_state_get_rodata(const struct intel_engine_cs *engine)
|
||||
if ((i) >= PAGE_SIZE / sizeof(u32)) \
|
||||
goto out; \
|
||||
(batch)[(i)++] = (val); \
|
||||
} while(0)
|
||||
} while (0)
|
||||
|
||||
static int render_state_setup(struct intel_renderstate *so,
|
||||
struct drm_i915_private *i915)
|
||||
@ -84,6 +62,7 @@ static int render_state_setup(struct intel_renderstate *so,
|
||||
|
||||
if (i * 4 == rodata->reloc[reloc_index]) {
|
||||
u64 r = s + so->vma->node.start;
|
||||
|
||||
s = lower_32_bits(r);
|
||||
if (HAS_64BIT_RELOC(i915)) {
|
||||
if (i + 1 >= rodata->batch_items ||
|
||||
|
@ -1,24 +1,6 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2014 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _INTEL_RENDERSTATE_H_
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2008-2018 Intel Corporation
|
||||
*/
|
||||
|
||||
@ -787,18 +786,15 @@ static void reset_finish(struct intel_gt *gt, intel_engine_mask_t awake)
|
||||
|
||||
static void nop_submit_request(struct i915_request *request)
|
||||
{
|
||||
struct intel_engine_cs *engine = request->engine;
|
||||
unsigned long flags;
|
||||
|
||||
RQ_TRACE(request, "-EIO\n");
|
||||
i915_request_set_error_once(request, -EIO);
|
||||
|
||||
spin_lock_irqsave(&engine->active.lock, flags);
|
||||
__i915_request_submit(request);
|
||||
i915_request_mark_complete(request);
|
||||
spin_unlock_irqrestore(&engine->active.lock, flags);
|
||||
request = i915_request_mark_eio(request);
|
||||
if (request) {
|
||||
i915_request_submit(request);
|
||||
intel_engine_signal_breadcrumbs(request->engine);
|
||||
|
||||
intel_engine_signal_breadcrumbs(engine);
|
||||
i915_request_put(request);
|
||||
}
|
||||
}
|
||||
|
||||
static void __intel_gt_set_wedged(struct intel_gt *gt)
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2008-2018 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -32,7 +32,7 @@ struct intel_reset {
|
||||
*
|
||||
* #I915_WEDGED_ON_INIT - If we fail to initialize the GPU we can no
|
||||
* longer use the GPU - similar to #I915_WEDGED bit. The difference in
|
||||
* in the way we're handling "forced" unwedged (e.g. through debugfs),
|
||||
* the way we're handling "forced" unwedged (e.g. through debugfs),
|
||||
* which is not allowed in case we failed to initialize.
|
||||
*
|
||||
* #I915_WEDGED_ON_FINI - Similar to #I915_WEDGED_ON_INIT, except we
|
||||
|
@ -1,9 +1,9 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
#include "gem/i915_gem_lmem.h"
|
||||
#include "gem/i915_gem_object.h"
|
||||
|
||||
#include "i915_drv.h"
|
||||
@ -109,8 +109,8 @@ static struct i915_vma *create_ring_vma(struct i915_ggtt *ggtt, int size)
|
||||
struct drm_i915_gem_object *obj;
|
||||
struct i915_vma *vma;
|
||||
|
||||
obj = ERR_PTR(-ENODEV);
|
||||
if (i915_ggtt_has_aperture(ggtt))
|
||||
obj = i915_gem_object_create_lmem(i915, size, I915_BO_ALLOC_VOLATILE);
|
||||
if (IS_ERR(obj) && i915_ggtt_has_aperture(ggtt))
|
||||
obj = i915_gem_object_create_stolen(i915, size);
|
||||
if (IS_ERR(obj))
|
||||
obj = i915_gem_object_create_internal(i915, size);
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
@ -82,6 +81,7 @@ static inline u32 intel_ring_offset(const struct i915_request *rq, void *addr)
|
||||
{
|
||||
/* Don't write ring->size (equivalent to 0) as that hangs some GPUs. */
|
||||
u32 offset = addr - rq->ring->vaddr;
|
||||
|
||||
GEM_BUG_ON(offset > rq->ring->size);
|
||||
return intel_ring_wrap(rq->ring, offset);
|
||||
}
|
||||
|
@ -1,30 +1,6 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* Copyright © 2008-2010 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* Authors:
|
||||
* Eric Anholt <eric@anholt.net>
|
||||
* Zou Nan hai <nanhai.zou@intel.com>
|
||||
* Xiang Hai hao<haihao.xiang@intel.com>
|
||||
*
|
||||
* Copyright © 2008-2021 Intel Corporation
|
||||
*/
|
||||
|
||||
#include "gen2_engine_cs.h"
|
||||
@ -183,15 +159,36 @@ static void set_pp_dir(struct intel_engine_cs *engine)
|
||||
}
|
||||
}
|
||||
|
||||
static bool stop_ring(struct intel_engine_cs *engine)
|
||||
{
|
||||
/* Empty the ring by skipping to the end */
|
||||
ENGINE_WRITE_FW(engine, RING_HEAD, ENGINE_READ_FW(engine, RING_TAIL));
|
||||
ENGINE_POSTING_READ(engine, RING_HEAD);
|
||||
|
||||
/* The ring must be empty before it is disabled */
|
||||
ENGINE_WRITE_FW(engine, RING_CTL, 0);
|
||||
ENGINE_POSTING_READ(engine, RING_CTL);
|
||||
|
||||
/* Then reset the disabled ring */
|
||||
ENGINE_WRITE_FW(engine, RING_HEAD, 0);
|
||||
ENGINE_WRITE_FW(engine, RING_TAIL, 0);
|
||||
|
||||
return (ENGINE_READ_FW(engine, RING_HEAD) & HEAD_ADDR) == 0;
|
||||
}
|
||||
|
||||
static int xcs_resume(struct intel_engine_cs *engine)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = engine->i915;
|
||||
struct intel_ring *ring = engine->legacy.ring;
|
||||
|
||||
ENGINE_TRACE(engine, "ring:{HEAD:%04x, TAIL:%04x}\n",
|
||||
ring->head, ring->tail);
|
||||
|
||||
if (HWS_NEEDS_PHYSICAL(dev_priv))
|
||||
/* Double check the ring is empty & disabled before we resume */
|
||||
synchronize_hardirq(engine->i915->drm.irq);
|
||||
if (!stop_ring(engine))
|
||||
goto err;
|
||||
|
||||
if (HWS_NEEDS_PHYSICAL(engine->i915))
|
||||
ring_setup_phys_status_page(engine);
|
||||
else
|
||||
ring_setup_status_page(engine);
|
||||
@ -228,21 +225,10 @@ static int xcs_resume(struct intel_engine_cs *engine)
|
||||
if (__intel_wait_for_register_fw(engine->uncore,
|
||||
RING_CTL(engine->mmio_base),
|
||||
RING_VALID, RING_VALID,
|
||||
5000, 0, NULL)) {
|
||||
drm_err(&dev_priv->drm,
|
||||
"%s initialization failed; "
|
||||
"ctl %08x (valid? %d) head %08x [%08x] tail %08x [%08x] start %08x [expected %08x]\n",
|
||||
engine->name,
|
||||
ENGINE_READ(engine, RING_CTL),
|
||||
ENGINE_READ(engine, RING_CTL) & RING_VALID,
|
||||
ENGINE_READ(engine, RING_HEAD), ring->head,
|
||||
ENGINE_READ(engine, RING_TAIL), ring->tail,
|
||||
ENGINE_READ(engine, RING_START),
|
||||
i915_ggtt_offset(ring->vma));
|
||||
return -EIO;
|
||||
}
|
||||
5000, 0, NULL))
|
||||
goto err;
|
||||
|
||||
if (INTEL_GEN(dev_priv) > 2)
|
||||
if (INTEL_GEN(engine->i915) > 2)
|
||||
ENGINE_WRITE_FW(engine,
|
||||
RING_MI_MODE, _MASKED_BIT_DISABLE(STOP_RING));
|
||||
|
||||
@ -255,6 +241,19 @@ static int xcs_resume(struct intel_engine_cs *engine)
|
||||
/* Papering over lost _interrupts_ immediately following the restart */
|
||||
intel_engine_signal_breadcrumbs(engine);
|
||||
return 0;
|
||||
|
||||
err:
|
||||
drm_err(&engine->i915->drm,
|
||||
"%s initialization failed; "
|
||||
"ctl %08x (valid? %d) head %08x [%08x] tail %08x [%08x] start %08x [expected %08x]\n",
|
||||
engine->name,
|
||||
ENGINE_READ(engine, RING_CTL),
|
||||
ENGINE_READ(engine, RING_CTL) & RING_VALID,
|
||||
ENGINE_READ(engine, RING_HEAD), ring->head,
|
||||
ENGINE_READ(engine, RING_TAIL), ring->tail,
|
||||
ENGINE_READ(engine, RING_START),
|
||||
i915_ggtt_offset(ring->vma));
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
static void sanitize_hwsp(struct intel_engine_cs *engine)
|
||||
@ -290,23 +289,6 @@ static void xcs_sanitize(struct intel_engine_cs *engine)
|
||||
clflush_cache_range(engine->status_page.addr, PAGE_SIZE);
|
||||
}
|
||||
|
||||
static bool stop_ring(struct intel_engine_cs *engine)
|
||||
{
|
||||
/* Empty the ring by skipping to the end */
|
||||
ENGINE_WRITE_FW(engine, RING_HEAD, ENGINE_READ_FW(engine, RING_TAIL));
|
||||
ENGINE_POSTING_READ(engine, RING_HEAD);
|
||||
|
||||
/* The ring must be empty before it is disabled */
|
||||
ENGINE_WRITE_FW(engine, RING_CTL, 0);
|
||||
ENGINE_POSTING_READ(engine, RING_CTL);
|
||||
|
||||
/* Then reset the disabled ring */
|
||||
ENGINE_WRITE_FW(engine, RING_HEAD, 0);
|
||||
ENGINE_WRITE_FW(engine, RING_TAIL, 0);
|
||||
|
||||
return (ENGINE_READ_FW(engine, RING_HEAD) & HEAD_ADDR) == 0;
|
||||
}
|
||||
|
||||
static void reset_prepare(struct intel_engine_cs *engine)
|
||||
{
|
||||
/*
|
||||
@ -329,25 +311,23 @@ static void reset_prepare(struct intel_engine_cs *engine)
|
||||
|
||||
if (!stop_ring(engine)) {
|
||||
/* G45 ring initialization often fails to reset head to zero */
|
||||
drm_dbg(&engine->i915->drm,
|
||||
"%s head not reset to zero "
|
||||
"ctl %08x head %08x tail %08x start %08x\n",
|
||||
engine->name,
|
||||
ENGINE_READ_FW(engine, RING_CTL),
|
||||
ENGINE_READ_FW(engine, RING_HEAD),
|
||||
ENGINE_READ_FW(engine, RING_TAIL),
|
||||
ENGINE_READ_FW(engine, RING_START));
|
||||
}
|
||||
|
||||
if (!stop_ring(engine)) {
|
||||
drm_err(&engine->i915->drm,
|
||||
"failed to set %s head to zero "
|
||||
"ctl %08x head %08x tail %08x start %08x\n",
|
||||
engine->name,
|
||||
ENGINE_READ_FW(engine, RING_CTL),
|
||||
ENGINE_READ_FW(engine, RING_HEAD),
|
||||
ENGINE_READ_FW(engine, RING_TAIL),
|
||||
ENGINE_READ_FW(engine, RING_START));
|
||||
ENGINE_TRACE(engine,
|
||||
"HEAD not reset to zero, "
|
||||
"{ CTL:%08x, HEAD:%08x, TAIL:%08x, START:%08x }\n",
|
||||
ENGINE_READ_FW(engine, RING_CTL),
|
||||
ENGINE_READ_FW(engine, RING_HEAD),
|
||||
ENGINE_READ_FW(engine, RING_TAIL),
|
||||
ENGINE_READ_FW(engine, RING_START));
|
||||
if (!stop_ring(engine)) {
|
||||
drm_err(&engine->i915->drm,
|
||||
"failed to set %s head to zero "
|
||||
"ctl %08x head %08x tail %08x start %08x\n",
|
||||
engine->name,
|
||||
ENGINE_READ_FW(engine, RING_CTL),
|
||||
ENGINE_READ_FW(engine, RING_HEAD),
|
||||
ENGINE_READ_FW(engine, RING_TAIL),
|
||||
ENGINE_READ_FW(engine, RING_START));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -431,7 +411,7 @@ static void reset_cancel(struct intel_engine_cs *engine)
|
||||
|
||||
/* Mark all submitted requests as skipped. */
|
||||
list_for_each_entry(request, &engine->active.requests, sched.link)
|
||||
i915_request_mark_eio(request);
|
||||
i915_request_put(i915_request_mark_eio(request));
|
||||
intel_engine_signal_breadcrumbs(engine);
|
||||
|
||||
/* Remaining _unready_ requests will be nop'ed when submitted */
|
||||
@ -770,13 +750,14 @@ static int mi_set_context(struct i915_request *rq,
|
||||
|
||||
static int remap_l3_slice(struct i915_request *rq, int slice)
|
||||
{
|
||||
#define L3LOG_DW (GEN7_L3LOG_SIZE / sizeof(u32))
|
||||
u32 *cs, *remap_info = rq->engine->i915->l3_parity.remap_info[slice];
|
||||
int i;
|
||||
|
||||
if (!remap_info)
|
||||
return 0;
|
||||
|
||||
cs = intel_ring_begin(rq, GEN7_L3LOG_SIZE/4 * 2 + 2);
|
||||
cs = intel_ring_begin(rq, L3LOG_DW * 2 + 2);
|
||||
if (IS_ERR(cs))
|
||||
return PTR_ERR(cs);
|
||||
|
||||
@ -785,8 +766,8 @@ static int remap_l3_slice(struct i915_request *rq, int slice)
|
||||
* here because no other code should access these registers other than
|
||||
* at initialization time.
|
||||
*/
|
||||
*cs++ = MI_LOAD_REGISTER_IMM(GEN7_L3LOG_SIZE/4);
|
||||
for (i = 0; i < GEN7_L3LOG_SIZE/4; i++) {
|
||||
*cs++ = MI_LOAD_REGISTER_IMM(L3LOG_DW);
|
||||
for (i = 0; i < L3LOG_DW; i++) {
|
||||
*cs++ = i915_mmio_reg_offset(GEN7_L3LOG(slice, i));
|
||||
*cs++ = remap_info[i];
|
||||
}
|
||||
@ -794,6 +775,7 @@ static int remap_l3_slice(struct i915_request *rq, int slice)
|
||||
intel_ring_advance(rq, cs);
|
||||
|
||||
return 0;
|
||||
#undef L3LOG_DW
|
||||
}
|
||||
|
||||
static int remap_l3(struct i915_request *rq)
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2016-2018 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,25 +1,6 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2016 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef I915_TIMELINE_H
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2016 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2014-2018 Intel Corporation
|
||||
*/
|
||||
|
||||
@ -281,7 +280,7 @@ static void gen8_ctx_workarounds_init(struct intel_engine_cs *engine,
|
||||
PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE);
|
||||
|
||||
/* Use Force Non-Coherent whenever executing a 3D context. This is a
|
||||
* workaround for for a possible hang in the unlikely event a TLB
|
||||
* workaround for a possible hang in the unlikely event a TLB
|
||||
* invalidation occurs during a PSD flush.
|
||||
*/
|
||||
/* WaForceEnableNonCoherent:bdw,chv */
|
||||
@ -758,7 +757,7 @@ __intel_engine_init_ctx_wa(struct intel_engine_cs *engine,
|
||||
else if (IS_GEN(i915, 6))
|
||||
gen6_ctx_workarounds_init(engine, wal);
|
||||
else if (INTEL_GEN(i915) < 8)
|
||||
return;
|
||||
;
|
||||
else
|
||||
MISSING_CASE(INTEL_GEN(i915));
|
||||
|
||||
@ -1112,11 +1111,10 @@ icl_gt_workarounds_init(struct drm_i915_private *i915, struct i915_wa_list *wal)
|
||||
|
||||
/* Wa_1607087056:icl,ehl,jsl */
|
||||
if (IS_ICELAKE(i915) ||
|
||||
IS_JSL_EHL_REVID(i915, EHL_REVID_A0, EHL_REVID_A0)) {
|
||||
IS_JSL_EHL_REVID(i915, EHL_REVID_A0, EHL_REVID_A0))
|
||||
wa_write_or(wal,
|
||||
SLICE_UNIT_LEVEL_CLKGATE,
|
||||
L3_CLKGATE_DIS | L3_CR2X_CLKGATE_DIS);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1211,7 +1209,7 @@ gt_init_workarounds(struct drm_i915_private *i915, struct i915_wa_list *wal)
|
||||
else if (IS_GEN(i915, 4))
|
||||
gen4_gt_workarounds_init(i915, wal);
|
||||
else if (INTEL_GEN(i915) <= 8)
|
||||
return;
|
||||
;
|
||||
else
|
||||
MISSING_CASE(INTEL_GEN(i915));
|
||||
}
|
||||
@ -1586,7 +1584,7 @@ void intel_engine_init_whitelist(struct intel_engine_cs *engine)
|
||||
else if (IS_SKYLAKE(i915))
|
||||
skl_whitelist_build(engine);
|
||||
else if (INTEL_GEN(i915) <= 8)
|
||||
return;
|
||||
;
|
||||
else
|
||||
MISSING_CASE(INTEL_GEN(i915));
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2014-2018 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2014-2018 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,25 +1,6 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* Copyright © 2016 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "gem/i915_gem_context.h"
|
||||
@ -276,13 +257,15 @@ static void mock_reset_cancel(struct intel_engine_cs *engine)
|
||||
|
||||
/* Mark all submitted requests as skipped. */
|
||||
list_for_each_entry(rq, &engine->active.requests, sched.link)
|
||||
i915_request_mark_eio(rq);
|
||||
i915_request_put(i915_request_mark_eio(rq));
|
||||
intel_engine_signal_breadcrumbs(engine);
|
||||
|
||||
/* Cancel and submit all pending requests. */
|
||||
list_for_each_entry(rq, &mock->hw_queue, mock.link) {
|
||||
i915_request_mark_eio(rq);
|
||||
__i915_request_submit(rq);
|
||||
if (i915_request_mark_eio(rq)) {
|
||||
__i915_request_submit(rq);
|
||||
i915_request_put(rq);
|
||||
}
|
||||
}
|
||||
INIT_LIST_HEAD(&mock->hw_queue);
|
||||
|
||||
|
@ -1,25 +1,6 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2016 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __MOCK_ENGINE_H__
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* Copyright © 2018 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* Copyright © 2018 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2018 Intel Corporation
|
||||
*/
|
||||
|
||||
@ -12,6 +11,12 @@
|
||||
#include "i915_selftest.h"
|
||||
#include "selftest_engine_heartbeat.h"
|
||||
|
||||
static void reset_heartbeat(struct intel_engine_cs *engine)
|
||||
{
|
||||
intel_engine_set_heartbeat(engine,
|
||||
engine->defaults.heartbeat_interval_ms);
|
||||
}
|
||||
|
||||
static int timeline_sync(struct intel_timeline *tl)
|
||||
{
|
||||
struct dma_fence *fence;
|
||||
@ -270,7 +275,7 @@ static int __live_heartbeat_fast(struct intel_engine_cs *engine)
|
||||
err = -EINVAL;
|
||||
}
|
||||
|
||||
intel_engine_set_heartbeat(engine, CONFIG_DRM_I915_HEARTBEAT_INTERVAL);
|
||||
reset_heartbeat(engine);
|
||||
err_pm:
|
||||
intel_engine_pm_put(engine);
|
||||
intel_context_put(ce);
|
||||
@ -285,7 +290,7 @@ static int live_heartbeat_fast(void *arg)
|
||||
int err = 0;
|
||||
|
||||
/* Check that the heartbeat ticks at the desired rate. */
|
||||
if (!CONFIG_DRM_I915_HEARTBEAT_INTERVAL)
|
||||
if (!IS_ACTIVE(CONFIG_DRM_I915_HEARTBEAT_INTERVAL))
|
||||
return 0;
|
||||
|
||||
for_each_engine(engine, gt, id) {
|
||||
@ -333,7 +338,7 @@ static int __live_heartbeat_off(struct intel_engine_cs *engine)
|
||||
}
|
||||
|
||||
err_beat:
|
||||
intel_engine_set_heartbeat(engine, CONFIG_DRM_I915_HEARTBEAT_INTERVAL);
|
||||
reset_heartbeat(engine);
|
||||
err_pm:
|
||||
intel_engine_pm_put(engine);
|
||||
return err;
|
||||
@ -347,7 +352,7 @@ static int live_heartbeat_off(void *arg)
|
||||
int err = 0;
|
||||
|
||||
/* Check that we can turn off heartbeat and not interrupt VIP */
|
||||
if (!CONFIG_DRM_I915_HEARTBEAT_INTERVAL)
|
||||
if (!IS_ACTIVE(CONFIG_DRM_I915_HEARTBEAT_INTERVAL))
|
||||
return 0;
|
||||
|
||||
for_each_engine(engine, gt, id) {
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* Copyright © 2018 Intel Corporation
|
||||
*/
|
||||
|
||||
@ -111,13 +110,15 @@ static int __measure_timestamps(struct intel_context *ce,
|
||||
cpu_relax();
|
||||
|
||||
/* Run the request for a 100us, sampling timestamps before/after */
|
||||
preempt_disable();
|
||||
*dt = local_clock();
|
||||
local_irq_disable();
|
||||
write_semaphore(&sema[2], 0);
|
||||
while (READ_ONCE(sema[1]) == 0) /* wait for the gpu to catch up */
|
||||
cpu_relax();
|
||||
*dt = local_clock();
|
||||
udelay(100);
|
||||
*dt = local_clock() - *dt;
|
||||
write_semaphore(&sema[2], 1);
|
||||
preempt_enable();
|
||||
local_irq_enable();
|
||||
|
||||
if (i915_request_wait(rq, 0, HZ / 2) < 0) {
|
||||
i915_request_put(rq);
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2018 Intel Corporation
|
||||
*/
|
||||
|
||||
@ -321,7 +320,7 @@ static int live_unlite_switch(void *arg)
|
||||
|
||||
static int live_unlite_preempt(void *arg)
|
||||
{
|
||||
return live_unlite_restore(arg, I915_USER_PRIORITY(I915_PRIORITY_MAX));
|
||||
return live_unlite_restore(arg, I915_PRIORITY_MAX);
|
||||
}
|
||||
|
||||
static int live_unlite_ring(void *arg)
|
||||
@ -609,7 +608,7 @@ static int live_hold_reset(void *arg)
|
||||
}
|
||||
tasklet_disable(&engine->execlists.tasklet);
|
||||
|
||||
engine->execlists.tasklet.func(engine->execlists.tasklet.data);
|
||||
engine->execlists.tasklet.callback(&engine->execlists.tasklet);
|
||||
GEM_BUG_ON(execlists_active(&engine->execlists) != rq);
|
||||
|
||||
i915_request_get(rq);
|
||||
@ -1081,7 +1080,6 @@ create_rewinder(struct intel_context *ce,
|
||||
|
||||
intel_ring_advance(rq, cs);
|
||||
|
||||
rq->sched.attr.priority = I915_PRIORITY_MASK;
|
||||
err = 0;
|
||||
err:
|
||||
i915_request_get(rq);
|
||||
@ -1312,9 +1310,7 @@ static int live_timeslice_queue(void *arg)
|
||||
goto err_pin;
|
||||
|
||||
for_each_engine(engine, gt, id) {
|
||||
struct i915_sched_attr attr = {
|
||||
.priority = I915_USER_PRIORITY(I915_PRIORITY_MAX),
|
||||
};
|
||||
struct i915_sched_attr attr = { .priority = I915_PRIORITY_MAX };
|
||||
struct i915_request *rq, *nop;
|
||||
|
||||
if (!intel_engine_has_preemption(engine))
|
||||
@ -1529,14 +1525,12 @@ static int live_busywait_preempt(void *arg)
|
||||
ctx_hi = kernel_context(gt->i915);
|
||||
if (!ctx_hi)
|
||||
return -ENOMEM;
|
||||
ctx_hi->sched.priority =
|
||||
I915_USER_PRIORITY(I915_CONTEXT_MAX_USER_PRIORITY);
|
||||
ctx_hi->sched.priority = I915_CONTEXT_MAX_USER_PRIORITY;
|
||||
|
||||
ctx_lo = kernel_context(gt->i915);
|
||||
if (!ctx_lo)
|
||||
goto err_ctx_hi;
|
||||
ctx_lo->sched.priority =
|
||||
I915_USER_PRIORITY(I915_CONTEXT_MIN_USER_PRIORITY);
|
||||
ctx_lo->sched.priority = I915_CONTEXT_MIN_USER_PRIORITY;
|
||||
|
||||
obj = i915_gem_object_create_internal(gt->i915, PAGE_SIZE);
|
||||
if (IS_ERR(obj)) {
|
||||
@ -1733,14 +1727,12 @@ static int live_preempt(void *arg)
|
||||
ctx_hi = kernel_context(gt->i915);
|
||||
if (!ctx_hi)
|
||||
goto err_spin_lo;
|
||||
ctx_hi->sched.priority =
|
||||
I915_USER_PRIORITY(I915_CONTEXT_MAX_USER_PRIORITY);
|
||||
ctx_hi->sched.priority = I915_CONTEXT_MAX_USER_PRIORITY;
|
||||
|
||||
ctx_lo = kernel_context(gt->i915);
|
||||
if (!ctx_lo)
|
||||
goto err_ctx_hi;
|
||||
ctx_lo->sched.priority =
|
||||
I915_USER_PRIORITY(I915_CONTEXT_MIN_USER_PRIORITY);
|
||||
ctx_lo->sched.priority = I915_CONTEXT_MIN_USER_PRIORITY;
|
||||
|
||||
for_each_engine(engine, gt, id) {
|
||||
struct igt_live_test t;
|
||||
@ -1833,7 +1825,7 @@ static int live_late_preempt(void *arg)
|
||||
goto err_ctx_hi;
|
||||
|
||||
/* Make sure ctx_lo stays before ctx_hi until we trigger preemption. */
|
||||
ctx_lo->sched.priority = I915_USER_PRIORITY(1);
|
||||
ctx_lo->sched.priority = 1;
|
||||
|
||||
for_each_engine(engine, gt, id) {
|
||||
struct igt_live_test t;
|
||||
@ -1874,7 +1866,7 @@ static int live_late_preempt(void *arg)
|
||||
goto err_wedged;
|
||||
}
|
||||
|
||||
attr.priority = I915_USER_PRIORITY(I915_PRIORITY_MAX);
|
||||
attr.priority = I915_PRIORITY_MAX;
|
||||
engine->schedule(rq, &attr);
|
||||
|
||||
if (!igt_wait_for_spinner(&spin_hi, rq)) {
|
||||
@ -1955,7 +1947,7 @@ static int live_nopreempt(void *arg)
|
||||
return -ENOMEM;
|
||||
if (preempt_client_init(gt, &b))
|
||||
goto err_client_a;
|
||||
b.ctx->sched.priority = I915_USER_PRIORITY(I915_PRIORITY_MAX);
|
||||
b.ctx->sched.priority = I915_PRIORITY_MAX;
|
||||
|
||||
for_each_engine(engine, gt, id) {
|
||||
struct i915_request *rq_a, *rq_b;
|
||||
@ -2420,11 +2412,9 @@ err_wedged:
|
||||
|
||||
static int live_suppress_self_preempt(void *arg)
|
||||
{
|
||||
struct i915_sched_attr attr = { .priority = I915_PRIORITY_MAX };
|
||||
struct intel_gt *gt = arg;
|
||||
struct intel_engine_cs *engine;
|
||||
struct i915_sched_attr attr = {
|
||||
.priority = I915_USER_PRIORITY(I915_PRIORITY_MAX)
|
||||
};
|
||||
struct preempt_client a, b;
|
||||
enum intel_engine_id id;
|
||||
int err = -ENOMEM;
|
||||
@ -2555,9 +2545,7 @@ static int live_chain_preempt(void *arg)
|
||||
goto err_client_hi;
|
||||
|
||||
for_each_engine(engine, gt, id) {
|
||||
struct i915_sched_attr attr = {
|
||||
.priority = I915_USER_PRIORITY(I915_PRIORITY_MAX),
|
||||
};
|
||||
struct i915_sched_attr attr = { .priority = I915_PRIORITY_MAX };
|
||||
struct igt_live_test t;
|
||||
struct i915_request *rq;
|
||||
int ring_size, count, i;
|
||||
@ -2876,7 +2864,7 @@ static int __live_preempt_ring(struct intel_engine_cs *engine,
|
||||
err = wait_for_submit(engine, rq, HZ / 2);
|
||||
i915_request_put(rq);
|
||||
if (err) {
|
||||
pr_err("%s: preemption request was not submited\n",
|
||||
pr_err("%s: preemption request was not submitted\n",
|
||||
engine->name);
|
||||
err = -ETIME;
|
||||
}
|
||||
@ -2976,9 +2964,7 @@ static int live_preempt_gang(void *arg)
|
||||
return -EIO;
|
||||
|
||||
do {
|
||||
struct i915_sched_attr attr = {
|
||||
.priority = I915_USER_PRIORITY(prio++),
|
||||
};
|
||||
struct i915_sched_attr attr = { .priority = prio++ };
|
||||
|
||||
err = create_gang(engine, &rq);
|
||||
if (err)
|
||||
@ -3014,7 +3000,7 @@ static int live_preempt_gang(void *arg)
|
||||
drm_info_printer(engine->i915->drm.dev);
|
||||
|
||||
pr_err("Failed to flush chain of %d requests, at %d\n",
|
||||
prio, rq_prio(rq) >> I915_USER_PRIORITY_SHIFT);
|
||||
prio, rq_prio(rq));
|
||||
intel_engine_dump(engine, &p,
|
||||
"%s\n", engine->name);
|
||||
|
||||
@ -3384,14 +3370,12 @@ static int live_preempt_timeout(void *arg)
|
||||
ctx_hi = kernel_context(gt->i915);
|
||||
if (!ctx_hi)
|
||||
goto err_spin_lo;
|
||||
ctx_hi->sched.priority =
|
||||
I915_USER_PRIORITY(I915_CONTEXT_MAX_USER_PRIORITY);
|
||||
ctx_hi->sched.priority = I915_CONTEXT_MAX_USER_PRIORITY;
|
||||
|
||||
ctx_lo = kernel_context(gt->i915);
|
||||
if (!ctx_lo)
|
||||
goto err_ctx_hi;
|
||||
ctx_lo->sched.priority =
|
||||
I915_USER_PRIORITY(I915_CONTEXT_MIN_USER_PRIORITY);
|
||||
ctx_lo->sched.priority = I915_CONTEXT_MIN_USER_PRIORITY;
|
||||
|
||||
for_each_engine(engine, gt, id) {
|
||||
unsigned long saved_timeout;
|
||||
@ -4611,7 +4595,7 @@ static int reset_virtual_engine(struct intel_gt *gt,
|
||||
}
|
||||
tasklet_disable(&engine->execlists.tasklet);
|
||||
|
||||
engine->execlists.tasklet.func(engine->execlists.tasklet.data);
|
||||
engine->execlists.tasklet.callback(&engine->execlists.tasklet);
|
||||
GEM_BUG_ON(execlists_active(&engine->execlists) != rq);
|
||||
|
||||
/* Fake a preemption event; failed of course */
|
||||
|
@ -1,7 +1,5 @@
|
||||
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,25 +1,6 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* Copyright © 2016 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kthread.h>
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -733,7 +733,6 @@ create_timestamp(struct intel_context *ce, void *slot, int idx)
|
||||
|
||||
intel_ring_advance(rq, cs);
|
||||
|
||||
rq->sched.attr.priority = I915_PRIORITY_MASK;
|
||||
err = 0;
|
||||
err:
|
||||
i915_request_get(rq);
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
@ -13,8 +12,9 @@
|
||||
#include "selftests/igt_spinner.h"
|
||||
|
||||
struct live_mocs {
|
||||
struct drm_i915_mocs_table mocs;
|
||||
struct drm_i915_mocs_table l3cc;
|
||||
struct drm_i915_mocs_table table;
|
||||
struct drm_i915_mocs_table *mocs;
|
||||
struct drm_i915_mocs_table *l3cc;
|
||||
struct i915_vma *scratch;
|
||||
void *vaddr;
|
||||
};
|
||||
@ -59,21 +59,20 @@ static int request_add_spin(struct i915_request *rq, struct igt_spinner *spin)
|
||||
|
||||
static int live_mocs_init(struct live_mocs *arg, struct intel_gt *gt)
|
||||
{
|
||||
struct drm_i915_mocs_table table;
|
||||
unsigned int flags;
|
||||
int err;
|
||||
|
||||
memset(arg, 0, sizeof(*arg));
|
||||
|
||||
flags = get_mocs_settings(gt->i915, &table);
|
||||
flags = get_mocs_settings(gt->i915, &arg->table);
|
||||
if (!flags)
|
||||
return -EINVAL;
|
||||
|
||||
if (flags & HAS_RENDER_L3CC)
|
||||
arg->l3cc = table;
|
||||
arg->l3cc = &arg->table;
|
||||
|
||||
if (flags & (HAS_GLOBAL_MOCS | HAS_ENGINE_MOCS))
|
||||
arg->mocs = table;
|
||||
arg->mocs = &arg->table;
|
||||
|
||||
arg->scratch =
|
||||
__vm_create_scratch_for_read_pinned(>->ggtt->vm, PAGE_SIZE);
|
||||
@ -132,6 +131,9 @@ static int read_mocs_table(struct i915_request *rq,
|
||||
{
|
||||
u32 addr;
|
||||
|
||||
if (!table)
|
||||
return 0;
|
||||
|
||||
if (HAS_GLOBAL_MOCS_REGISTERS(rq->engine->i915))
|
||||
addr = global_mocs_offset();
|
||||
else
|
||||
@ -146,6 +148,9 @@ static int read_l3cc_table(struct i915_request *rq,
|
||||
{
|
||||
u32 addr = i915_mmio_reg_offset(GEN9_LNCFCMOCS(0));
|
||||
|
||||
if (!table)
|
||||
return 0;
|
||||
|
||||
return read_regs(rq, addr, (table->n_entries + 1) / 2, offset);
|
||||
}
|
||||
|
||||
@ -156,6 +161,9 @@ static int check_mocs_table(struct intel_engine_cs *engine,
|
||||
unsigned int i;
|
||||
u32 expect;
|
||||
|
||||
if (!table)
|
||||
return 0;
|
||||
|
||||
for_each_mocs(expect, table, i) {
|
||||
if (**vaddr != expect) {
|
||||
pr_err("%s: Invalid MOCS[%d] entry, found %08x, expected %08x\n",
|
||||
@ -187,6 +195,9 @@ static int check_l3cc_table(struct intel_engine_cs *engine,
|
||||
unsigned int i;
|
||||
u32 expect;
|
||||
|
||||
if (!table)
|
||||
return 0;
|
||||
|
||||
for_each_l3cc(expect, table, i) {
|
||||
if (!mcr_range(engine->i915, reg) && **vaddr != expect) {
|
||||
pr_err("%s: Invalid L3CC[%d] entry, found %08x, expected %08x\n",
|
||||
@ -224,9 +235,9 @@ static int check_mocs_engine(struct live_mocs *arg,
|
||||
/* Read the mocs tables back using SRM */
|
||||
offset = i915_ggtt_offset(vma);
|
||||
if (!err)
|
||||
err = read_mocs_table(rq, &arg->mocs, &offset);
|
||||
err = read_mocs_table(rq, arg->mocs, &offset);
|
||||
if (!err && ce->engine->class == RENDER_CLASS)
|
||||
err = read_l3cc_table(rq, &arg->l3cc, &offset);
|
||||
err = read_l3cc_table(rq, arg->l3cc, &offset);
|
||||
offset -= i915_ggtt_offset(vma);
|
||||
GEM_BUG_ON(offset > PAGE_SIZE);
|
||||
|
||||
@ -237,9 +248,9 @@ static int check_mocs_engine(struct live_mocs *arg,
|
||||
/* Compare the results against the expected tables */
|
||||
vaddr = arg->vaddr;
|
||||
if (!err)
|
||||
err = check_mocs_table(ce->engine, &arg->mocs, &vaddr);
|
||||
err = check_mocs_table(ce->engine, arg->mocs, &vaddr);
|
||||
if (!err && ce->engine->class == RENDER_CLASS)
|
||||
err = check_l3cc_table(ce->engine, &arg->l3cc, &vaddr);
|
||||
err = check_l3cc_table(ce->engine, arg->l3cc, &vaddr);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2017-2018 Intel Corporation
|
||||
*/
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Copyright © 2018 Intel Corporation
|
||||
*/
|
||||
|
||||
@ -1242,7 +1241,11 @@ live_engine_reset_workarounds(void *arg)
|
||||
goto err;
|
||||
}
|
||||
|
||||
intel_engine_reset(engine, "live_workarounds:idle");
|
||||
ret = intel_engine_reset(engine, "live_workarounds:idle");
|
||||
if (ret) {
|
||||
pr_err("%s: Reset failed while idle\n", engine->name);
|
||||
goto err;
|
||||
}
|
||||
|
||||
ok = verify_wa_lists(gt, &lists, "after idle reset");
|
||||
if (!ok) {
|
||||
@ -1263,12 +1266,18 @@ live_engine_reset_workarounds(void *arg)
|
||||
|
||||
ret = request_add_spin(rq, &spin);
|
||||
if (ret) {
|
||||
pr_err("Spinner failed to start\n");
|
||||
pr_err("%s: Spinner failed to start\n", engine->name);
|
||||
igt_spinner_fini(&spin);
|
||||
goto err;
|
||||
}
|
||||
|
||||
intel_engine_reset(engine, "live_workarounds:active");
|
||||
ret = intel_engine_reset(engine, "live_workarounds:active");
|
||||
if (ret) {
|
||||
pr_err("%s: Reset failed on an active spinner\n",
|
||||
engine->name);
|
||||
igt_spinner_fini(&spin);
|
||||
goto err;
|
||||
}
|
||||
|
||||
igt_spinner_end(&spin);
|
||||
igt_spinner_fini(&spin);
|
||||
|
@ -206,9 +206,8 @@ static void __guc_dequeue(struct intel_engine_cs *engine)
|
||||
while ((rb = rb_first_cached(&execlists->queue))) {
|
||||
struct i915_priolist *p = to_priolist(rb);
|
||||
struct i915_request *rq, *rn;
|
||||
int i;
|
||||
|
||||
priolist_for_each_request_consume(rq, rn, p, i) {
|
||||
priolist_for_each_request_consume(rq, rn, p) {
|
||||
if (last && rq->context != last->context) {
|
||||
if (port == last_port)
|
||||
goto done;
|
||||
@ -238,9 +237,10 @@ done:
|
||||
execlists->active = execlists->inflight;
|
||||
}
|
||||
|
||||
static void guc_submission_tasklet(unsigned long data)
|
||||
static void guc_submission_tasklet(struct tasklet_struct *t)
|
||||
{
|
||||
struct intel_engine_cs * const engine = (struct intel_engine_cs *)data;
|
||||
struct intel_engine_cs * const engine =
|
||||
from_tasklet(engine, t, execlists.tasklet);
|
||||
struct intel_engine_execlists * const execlists = &engine->execlists;
|
||||
struct i915_request **port, *rq;
|
||||
unsigned long flags;
|
||||
@ -361,9 +361,8 @@ static void guc_reset_cancel(struct intel_engine_cs *engine)
|
||||
/* Flush the queued requests to the timeline list (for retiring). */
|
||||
while ((rb = rb_first_cached(&execlists->queue))) {
|
||||
struct i915_priolist *p = to_priolist(rb);
|
||||
int i;
|
||||
|
||||
priolist_for_each_request_consume(rq, rn, p, i) {
|
||||
priolist_for_each_request_consume(rq, rn, p) {
|
||||
list_del_init(&rq->sched.link);
|
||||
__i915_request_submit(rq);
|
||||
dma_fence_set_error(&rq->fence, -EIO);
|
||||
@ -610,7 +609,7 @@ static void guc_set_default_submission(struct intel_engine_cs *engine)
|
||||
{
|
||||
engine->submit_request = guc_submit_request;
|
||||
engine->schedule = i915_schedule;
|
||||
engine->execlists.tasklet.func = guc_submission_tasklet;
|
||||
engine->execlists.tasklet.callback = guc_submission_tasklet;
|
||||
|
||||
engine->reset.prepare = guc_reset_prepare;
|
||||
engine->reset.rewind = guc_reset_rewind;
|
||||
@ -702,8 +701,7 @@ int intel_guc_submission_setup(struct intel_engine_cs *engine)
|
||||
*/
|
||||
GEM_BUG_ON(INTEL_GEN(i915) < 11);
|
||||
|
||||
tasklet_init(&engine->execlists.tasklet,
|
||||
guc_submission_tasklet, (unsigned long)engine);
|
||||
tasklet_setup(&engine->execlists.tasklet, guc_submission_tasklet);
|
||||
|
||||
guc_default_vfuncs(engine);
|
||||
guc_default_irqs(engine);
|
||||
|
@ -48,6 +48,8 @@ static struct i915_buddy_block *i915_block_alloc(struct i915_buddy_block *parent
|
||||
{
|
||||
struct i915_buddy_block *block;
|
||||
|
||||
GEM_BUG_ON(order > I915_BUDDY_MAX_ORDER);
|
||||
|
||||
block = kmem_cache_zalloc(global.slab_blocks, GFP_KERNEL);
|
||||
if (!block)
|
||||
return NULL;
|
||||
@ -56,6 +58,7 @@ static struct i915_buddy_block *i915_block_alloc(struct i915_buddy_block *parent
|
||||
block->header |= order;
|
||||
block->parent = parent;
|
||||
|
||||
GEM_BUG_ON(block->header & I915_BUDDY_HEADER_UNUSED);
|
||||
return block;
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,9 @@ struct i915_buddy_block {
|
||||
#define I915_BUDDY_ALLOCATED (1 << 10)
|
||||
#define I915_BUDDY_FREE (2 << 10)
|
||||
#define I915_BUDDY_SPLIT (3 << 10)
|
||||
#define I915_BUDDY_HEADER_ORDER GENMASK_ULL(9, 0)
|
||||
/* Free to be used, if needed in the future */
|
||||
#define I915_BUDDY_HEADER_UNUSED GENMASK_ULL(9, 6)
|
||||
#define I915_BUDDY_HEADER_ORDER GENMASK_ULL(5, 0)
|
||||
u64 header;
|
||||
|
||||
struct i915_buddy_block *left;
|
||||
@ -34,7 +36,8 @@ struct i915_buddy_block {
|
||||
struct list_head tmp_link;
|
||||
};
|
||||
|
||||
#define I915_BUDDY_MAX_ORDER I915_BUDDY_HEADER_ORDER
|
||||
/* Order-zero must be at least PAGE_SIZE */
|
||||
#define I915_BUDDY_MAX_ORDER (63 - PAGE_SHIFT)
|
||||
|
||||
/*
|
||||
* Binary Buddy System.
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user