Commit 681818fd authored by Matt Roper's avatar Matt Roper Committed by Rodrigo Vivi

drm/xe: Include hardware prefetch buffer in batchbuffer allocations

The hardware prefetches several cachelines of data from batchbuffers
before they are parsed.  This prefetching only stops when the parser
encounters an MI_BATCH_BUFFER_END instruction (or a nested
MI_BATCH_BUFFER_START), so we must ensure that there is enough padding
at the end of the batchbuffer to prevent the prefetcher from running
past the end of the allocation and potentially faulting.

Bspec: 45717
Link: https://lore.kernel.org/r/20230329173334.4015124-2-matthew.d.roper@intel.comSigned-off-by: default avatarMatt Roper <matthew.d.roper@intel.com>
Reviewed-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
parent 3d4451d3
...@@ -8,11 +8,26 @@ ...@@ -8,11 +8,26 @@
#include "regs/xe_gpu_commands.h" #include "regs/xe_gpu_commands.h"
#include "xe_device.h" #include "xe_device.h"
#include "xe_engine_types.h" #include "xe_engine_types.h"
#include "xe_gt.h"
#include "xe_hw_fence.h" #include "xe_hw_fence.h"
#include "xe_sa.h" #include "xe_sa.h"
#include "xe_sched_job.h" #include "xe_sched_job.h"
#include "xe_vm_types.h" #include "xe_vm_types.h"
static int bb_prefetch(struct xe_gt *gt)
{
struct xe_device *xe = gt->xe;
if (GRAPHICS_VERx100(xe) >= 1250 && !xe_gt_is_media_type(gt))
/*
* RCS and CCS require 1K, although other engines would be
* okay with 512.
*/
return SZ_1K;
else
return SZ_512;
}
struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 dwords, bool usm) struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 dwords, bool usm)
{ {
struct xe_bb *bb = kmalloc(sizeof(*bb), GFP_KERNEL); struct xe_bb *bb = kmalloc(sizeof(*bb), GFP_KERNEL);
...@@ -21,8 +36,14 @@ struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 dwords, bool usm) ...@@ -21,8 +36,14 @@ struct xe_bb *xe_bb_new(struct xe_gt *gt, u32 dwords, bool usm)
if (!bb) if (!bb)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
bb->bo = xe_sa_bo_new(!usm ? &gt->kernel_bb_pool : /*
&gt->usm.bb_pool, 4 * dwords + 4); * We need to allocate space for the requested number of dwords,
* one additional MI_BATCH_BUFFER_END dword, and additional buffer
* space to accomodate the platform-specific hardware prefetch
* requirements.
*/
bb->bo = xe_sa_bo_new(!usm ? &gt->kernel_bb_pool : &gt->usm.bb_pool,
4 * (dwords + 1) + bb_prefetch(gt));
if (IS_ERR(bb->bo)) { if (IS_ERR(bb->bo)) {
err = PTR_ERR(bb->bo); err = PTR_ERR(bb->bo);
goto err; goto err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment