sync with OpenBSD -current
This commit is contained in:
parent
0e1b66badd
commit
7514c4f262
20 changed files with 438 additions and 166 deletions
|
@ -4228,6 +4228,8 @@ int amdgpu_device_prepare(struct drm_device *dev)
|
|||
if (r)
|
||||
return r;
|
||||
|
||||
flush_delayed_work(&adev->gfx.gfx_off_delay_work);
|
||||
|
||||
for (i = 0; i < adev->num_ip_blocks; i++) {
|
||||
if (!adev->ip_blocks[i].status.valid)
|
||||
continue;
|
||||
|
|
|
@ -586,7 +586,16 @@ int drm_gem_map_attach(struct dma_buf *dma_buf,
|
|||
{
|
||||
struct drm_gem_object *obj = dma_buf->priv;
|
||||
|
||||
/*
|
||||
* drm_gem_map_dma_buf() requires obj->get_sg_table(), but drivers
|
||||
* that implement their own ->map_dma_buf() do not.
|
||||
*/
|
||||
#ifdef notyet
|
||||
if (dma_buf->ops->map_dma_buf == drm_gem_map_dma_buf &&
|
||||
!obj->funcs->get_sg_table)
|
||||
#else
|
||||
if (!obj->funcs->get_sg_table)
|
||||
#endif
|
||||
return -ENOSYS;
|
||||
|
||||
return drm_gem_pin(obj);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# $OpenBSD: files.drm,v 1.62 2024/01/22 18:54:01 kettenis Exp $
|
||||
# $OpenBSD: files.drm,v 1.63 2024/04/11 03:40:05 jsg Exp $
|
||||
|
||||
#file dev/pci/drm/aperture.c drm
|
||||
file dev/pci/drm/dma-resv.c drm
|
||||
|
@ -292,6 +292,7 @@ file dev/pci/drm/i915/gt/intel_ggtt_gmch.c inteldrm
|
|||
file dev/pci/drm/i915/gt/intel_gsc.c inteldrm
|
||||
file dev/pci/drm/i915/gt/intel_gt.c inteldrm
|
||||
file dev/pci/drm/i915/gt/intel_gt_buffer_pool.c inteldrm
|
||||
file dev/pci/drm/i915/gt/intel_gt_ccs_mode.c inteldrm
|
||||
file dev/pci/drm/i915/gt/intel_gt_clock_utils.c inteldrm
|
||||
file dev/pci/drm/i915/gt/intel_gt_debugfs.c inteldrm
|
||||
file dev/pci/drm/i915/gt/intel_gt_engines_debugfs.c inteldrm
|
||||
|
|
|
@ -916,6 +916,23 @@ static intel_engine_mask_t init_engine_mask(struct intel_gt *gt)
|
|||
info->engine_mask &= ~BIT(GSC0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Do not create the command streamer for CCS slices beyond the first.
|
||||
* All the workload submitted to the first engine will be shared among
|
||||
* all the slices.
|
||||
*
|
||||
* Once the user will be allowed to customize the CCS mode, then this
|
||||
* check needs to be removed.
|
||||
*/
|
||||
if (IS_DG2(gt->i915)) {
|
||||
u8 first_ccs = __ffs(CCS_MASK(gt));
|
||||
|
||||
/* Mask off all the CCS engine */
|
||||
info->engine_mask &= ~GENMASK(CCS3, CCS0);
|
||||
/* Put back in the first CCS engine */
|
||||
info->engine_mask |= BIT(_CCS(first_ccs));
|
||||
}
|
||||
|
||||
return info->engine_mask;
|
||||
}
|
||||
|
||||
|
|
39
sys/dev/pci/drm/i915/gt/intel_gt_ccs_mode.c
Normal file
39
sys/dev/pci/drm/i915/gt/intel_gt_ccs_mode.c
Normal file
|
@ -0,0 +1,39 @@
|
|||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* Copyright © 2024 Intel Corporation
|
||||
*/
|
||||
|
||||
#include "i915_drv.h"
|
||||
#include "intel_gt.h"
|
||||
#include "intel_gt_ccs_mode.h"
|
||||
#include "intel_gt_regs.h"
|
||||
|
||||
void intel_gt_apply_ccs_mode(struct intel_gt *gt)
|
||||
{
|
||||
int cslice;
|
||||
u32 mode = 0;
|
||||
int first_ccs = __ffs(CCS_MASK(gt));
|
||||
|
||||
if (!IS_DG2(gt->i915))
|
||||
return;
|
||||
|
||||
/* Build the value for the fixed CCS load balancing */
|
||||
for (cslice = 0; cslice < I915_MAX_CCS; cslice++) {
|
||||
if (CCS_MASK(gt) & BIT(cslice))
|
||||
/*
|
||||
* If available, assign the cslice
|
||||
* to the first available engine...
|
||||
*/
|
||||
mode |= XEHP_CCS_MODE_CSLICE(cslice, first_ccs);
|
||||
|
||||
else
|
||||
/*
|
||||
* ... otherwise, mark the cslice as
|
||||
* unavailable if no CCS dispatches here
|
||||
*/
|
||||
mode |= XEHP_CCS_MODE_CSLICE(cslice,
|
||||
XEHP_CCS_MODE_CSLICE_MASK);
|
||||
}
|
||||
|
||||
intel_uncore_write(gt->uncore, XEHP_CCS_MODE, mode);
|
||||
}
|
13
sys/dev/pci/drm/i915/gt/intel_gt_ccs_mode.h
Normal file
13
sys/dev/pci/drm/i915/gt/intel_gt_ccs_mode.h
Normal file
|
@ -0,0 +1,13 @@
|
|||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2024 Intel Corporation
|
||||
*/
|
||||
|
||||
#ifndef __INTEL_GT_CCS_MODE_H__
|
||||
#define __INTEL_GT_CCS_MODE_H__
|
||||
|
||||
struct intel_gt;
|
||||
|
||||
void intel_gt_apply_ccs_mode(struct intel_gt *gt);
|
||||
|
||||
#endif /* __INTEL_GT_CCS_MODE_H__ */
|
|
@ -1468,8 +1468,14 @@
|
|||
#define ECOBITS_PPGTT_CACHE4B (0 << 8)
|
||||
|
||||
#define GEN12_RCU_MODE _MMIO(0x14800)
|
||||
#define XEHP_RCU_MODE_FIXED_SLICE_CCS_MODE REG_BIT(1)
|
||||
#define GEN12_RCU_MODE_CCS_ENABLE REG_BIT(0)
|
||||
|
||||
#define XEHP_CCS_MODE _MMIO(0x14804)
|
||||
#define XEHP_CCS_MODE_CSLICE_MASK REG_GENMASK(2, 0) /* CCS0-3 + rsvd */
|
||||
#define XEHP_CCS_MODE_CSLICE_WIDTH ilog2(XEHP_CCS_MODE_CSLICE_MASK + 1)
|
||||
#define XEHP_CCS_MODE_CSLICE(cslice, ccs) (ccs << (cslice * XEHP_CCS_MODE_CSLICE_WIDTH))
|
||||
|
||||
#define CHV_FUSE_GT _MMIO(VLV_GUNIT_BASE + 0x2168)
|
||||
#define CHV_FGT_DISABLE_SS0 (1 << 10)
|
||||
#define CHV_FGT_DISABLE_SS1 (1 << 11)
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include "intel_engine_regs.h"
|
||||
#include "intel_gpu_commands.h"
|
||||
#include "intel_gt.h"
|
||||
#include "intel_gt_ccs_mode.h"
|
||||
#include "intel_gt_mcr.h"
|
||||
#include "intel_gt_regs.h"
|
||||
#include "intel_ring.h"
|
||||
|
@ -50,7 +51,8 @@
|
|||
* registers belonging to BCS, VCS or VECS should be implemented in
|
||||
* xcs_engine_wa_init(). Workarounds for registers not belonging to a specific
|
||||
* engine's MMIO range but that are part of of the common RCS/CCS reset domain
|
||||
* should be implemented in general_render_compute_wa_init().
|
||||
* should be implemented in general_render_compute_wa_init(). The settings
|
||||
* about the CCS load balancing should be added in ccs_engine_wa_mode().
|
||||
*
|
||||
* - GT workarounds: the list of these WAs is applied whenever these registers
|
||||
* revert to their default values: on GPU reset, suspend/resume [1]_, etc.
|
||||
|
@ -2823,6 +2825,28 @@ add_render_compute_tuning_settings(struct intel_gt *gt,
|
|||
wa_write_clr(wal, GEN8_GARBCNTL, GEN12_BUS_HASH_CTL_BIT_EXC);
|
||||
}
|
||||
|
||||
static void ccs_engine_wa_mode(struct intel_engine_cs *engine, struct i915_wa_list *wal)
|
||||
{
|
||||
struct intel_gt *gt = engine->gt;
|
||||
|
||||
if (!IS_DG2(gt->i915))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Wa_14019159160: This workaround, along with others, leads to
|
||||
* significant challenges in utilizing load balancing among the
|
||||
* CCS slices. Consequently, an architectural decision has been
|
||||
* made to completely disable automatic CCS load balancing.
|
||||
*/
|
||||
wa_masked_en(wal, GEN12_RCU_MODE, XEHP_RCU_MODE_FIXED_SLICE_CCS_MODE);
|
||||
|
||||
/*
|
||||
* After having disabled automatic load balancing we need to
|
||||
* assign all slices to a single CCS. We will call it CCS mode 1
|
||||
*/
|
||||
intel_gt_apply_ccs_mode(gt);
|
||||
}
|
||||
|
||||
/*
|
||||
* The workarounds in this function apply to shared registers in
|
||||
* the general render reset domain that aren't tied to a
|
||||
|
@ -2970,8 +2994,10 @@ engine_init_workarounds(struct intel_engine_cs *engine, struct i915_wa_list *wal
|
|||
* to a single RCS/CCS engine's workaround list since
|
||||
* they're reset as part of the general render domain reset.
|
||||
*/
|
||||
if (engine->flags & I915_ENGINE_FIRST_RENDER_COMPUTE)
|
||||
if (engine->flags & I915_ENGINE_FIRST_RENDER_COMPUTE) {
|
||||
general_render_compute_wa_init(engine, wal);
|
||||
ccs_engine_wa_mode(engine, wal);
|
||||
}
|
||||
|
||||
if (engine->class == COMPUTE_CLASS)
|
||||
ccs_engine_wa_init(engine, wal);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue