mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 04:02:20 +00:00
drm fixes for 6.11-rc1
amdgpu: - Bump driver version for GFX12 DCC - DC documention warning fixes - VCN unified queue power fix - SMU fix - RAS fix - Display corruption fix - SDMA 5.2 workaround - GFX12 fixes - Uninitialized variable fix - VCN/JPEG 4.0.3 fixes - Misc display fixes - RAS fixes - VCN4/5 harvest fix - GPU reset fix i915: - Reset intel_dp->link_trained before retraining the link - Don't switch the LTTPR mode on an active link - Do not consider preemption during execlists_dequeue for gen8 - Allow NULL memory region xe: - xe_exec ioctl minor fix on sync entry cleanup upon error - SRIOV: limit VF LMEM provisioning - Wedge mode fixes v3d: - fix indirect dispatch on newer v3d revs panel: - fix panel backlight bindings -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEEKbZHaGwW9KfbeusDHTzWXnEhr4FAmajHvoACgkQDHTzWXnE hr68LhAAgECxBS+p5QFd600gMWz3kTrmseEooyCm1xCRkR1fEzv48Z1YP0+nvNXg ASohnrv7gO/xbJpNiDZoigELOClapioBIR4/FdjF4jixNMWjVd8iI7SyKWJTLQA8 0x6oHzBkGi7oFwEHqXomRNtKaXnmf2woYzoNKfxHwkTweNuT2WLqHQrm7Q42BfsA u6DDBt54nkjqnjSrPHm8lWDTL3ywoyLGchlfZlra+SyXZCx+cb1wK96uTUk9v+21 XhKlfpCgdTlUPr9Qz8fK0W8pxqnHBrc9qbWuMZXtMYOB9pKahazguoojSGwnmHx1 HLohIl5lOnpLTDRDyOBvqQ/J3Rx1CK48rgdR1TT6zcNULmuTMqYRN0UMGzuTUIWI swiTY+esm61OiN3xD0fRDnsO0VEcWS3dQW4ioCOV0uvXAuByXeDRv5G065iBHCrn HViDLTK61jCS/zh0ef7FriQASIAFMfOXhM2pho9UDjNB2ezykCLk0OgLmwIUnDnQ ruxoK5TG0IZnYLMnsNUJJ8XTo6ZcaQACbyTldR8aC2M/t5z1euhqmVrbVxfWOSMJ EMLSL6wP6dxAmmKfXc2MYrt514yDov7GDEcQgEmD5VZzRLxNWST1lwmoROokjwuw UM/GsnMDYNC2pcVpRjk2cV7/ChlPJsuGcYRY1qJKqGW7JF9V/iw= =R3HS -----END PGP SIGNATURE----- Merge tag 'drm-next-2024-07-26' of https://gitlab.freedesktop.org/drm/kernel Pull drm fixes from Dave Airlie: "Fixes for rc1, mostly amdgpu, i915 and xe, with some other misc ones, doesn't seem to be anything too serious. amdgpu: - Bump driver version for GFX12 DCC - DC documention warning fixes - VCN unified queue power fix - SMU fix - RAS fix - Display corruption fix - SDMA 5.2 workaround - GFX12 fixes - Uninitialized variable fix - VCN/JPEG 4.0.3 fixes - Misc display fixes - RAS fixes - VCN4/5 harvest fix - GPU reset fix i915: - Reset intel_dp->link_trained before retraining the link - Don't switch the LTTPR mode on an active link - Do not consider preemption during execlists_dequeue for gen8 - Allow NULL memory region xe: - xe_exec ioctl minor fix on sync entry cleanup upon error - SRIOV: limit VF LMEM provisioning - Wedge mode fixes v3d: - fix indirect dispatch on newer v3d revs panel: - fix panel backlight bindings" * tag 'drm-next-2024-07-26' of https://gitlab.freedesktop.org/drm/kernel: (39 commits) drm/amdgpu: reset vm state machine after gpu reset(vram lost) drm/amdgpu: add missed harvest check for VCN IP v4/v5 drm/amdgpu: Fix eeprom max record count drm/amdgpu: fix ras UE error injection failure issue drm/amd/display: Remove ASSERT if significance is zero in math_ceil2 drm/amd/display: Check for NULL pointer drm/amdgpu/vcn: Use offsets local to VCN/JPEG in VF drm/amdgpu: Add empty HDP flush function to VCN v4.0.3 drm/amdgpu: Add empty HDP flush function to JPEG v4.0.3 drm/amd/amdgpu: Fix uninitialized variable warnings drm/amdgpu: Fix atomics on GFX12 drm/amdgpu/sdma5.2: Update wptr registers as well as doorbell drm/i915: Allow NULL memory region drm/i915/gt: Do not consider preemption during execlists_dequeue for gen8 dt-bindings: display: panel: samsung,atna33xc20: Document ATNA45AF01 drm/xe: Don't suspend device upon wedge drm/xe: Wedge the entire device drm/xe/pf: Limit fair VF LMEM provisioning drm/xe/exec: Fix minor bug related to xe_sync_entry_cleanup drm/amd/display: fix corruption with high refresh rates on DCN 3.0 ...
This commit is contained in:
commit
0ba9b15511
@ -14,7 +14,13 @@ allOf:
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: samsung,atna33xc20
|
||||
oneOf:
|
||||
# Samsung 13.3" FHD (1920x1080 pixels) eDP AMOLED panel
|
||||
- const: samsung,atna33xc20
|
||||
# Samsung 14.5" WQXGA+ (2880x1800 pixels) eDP AMOLED panel
|
||||
- items:
|
||||
- const: samsung,atna45af01
|
||||
- const: samsung,atna33xc20
|
||||
|
||||
enable-gpios: true
|
||||
port: true
|
||||
|
@ -8,37 +8,22 @@ and the code documentation when it is automatically generated.
|
||||
DCHUBBUB
|
||||
--------
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h
|
||||
:doc: overview
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h
|
||||
:export:
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h
|
||||
:internal:
|
||||
|
||||
HUBP
|
||||
----
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h
|
||||
:doc: overview
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h
|
||||
:export:
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h
|
||||
:internal:
|
||||
|
||||
DPP
|
||||
---
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h
|
||||
:doc: overview
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h
|
||||
:export:
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/hubp.h
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h
|
||||
:internal:
|
||||
|
||||
MPC
|
||||
@ -47,11 +32,9 @@ MPC
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/mpc.h
|
||||
:doc: overview
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/mpc.h
|
||||
:export:
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/mpc.h
|
||||
:internal:
|
||||
:no-identifiers: mpcc_blnd_cfg mpcc_alpha_blend_mode
|
||||
|
||||
OPP
|
||||
---
|
||||
@ -59,20 +42,14 @@ OPP
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/opp.h
|
||||
:doc: overview
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/opp.h
|
||||
:export:
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/opp.h
|
||||
:internal:
|
||||
|
||||
DIO
|
||||
---
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_dio.h
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_dio.c
|
||||
:doc: overview
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_dio.h
|
||||
:export:
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_dio.h
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_dio.c
|
||||
:internal:
|
||||
|
@ -132,7 +132,7 @@ The DRM blend mode and its elements are then mapped by AMDGPU display manager
|
||||
(MPC), as follows:
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/mpc.h
|
||||
:functions: mpcc_blnd_cfg
|
||||
:identifiers: mpcc_blnd_cfg
|
||||
|
||||
Therefore, the blending configuration for a single MPCC instance on the MPC
|
||||
tree is defined by :c:type:`mpcc_blnd_cfg`, where
|
||||
@ -144,7 +144,7 @@ alpha and plane alpha values. It sets one of the three modes for
|
||||
:c:type:`MPCC_ALPHA_BLND_MODE`, as described below.
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/mpc.h
|
||||
:functions: mpcc_alpha_blend_mode
|
||||
:identifiers: mpcc_alpha_blend_mode
|
||||
|
||||
DM then maps the elements of `enum mpcc_alpha_blend_mode` to those in the DRM
|
||||
blend formula, as follows:
|
||||
|
@ -106,7 +106,8 @@ amdgpu-y += \
|
||||
df_v1_7.o \
|
||||
df_v3_6.o \
|
||||
df_v4_3.o \
|
||||
df_v4_6_2.o
|
||||
df_v4_6_2.o \
|
||||
df_v4_15.o
|
||||
|
||||
# add GMC block
|
||||
amdgpu-y += \
|
||||
|
@ -33,6 +33,7 @@ struct amdgpu_df_hash_status {
|
||||
struct amdgpu_df_funcs {
|
||||
void (*sw_init)(struct amdgpu_device *adev);
|
||||
void (*sw_fini)(struct amdgpu_device *adev);
|
||||
void (*hw_init)(struct amdgpu_device *adev);
|
||||
void (*enable_broadcast_mode)(struct amdgpu_device *adev,
|
||||
bool enable);
|
||||
u32 (*get_fb_channel_number)(struct amdgpu_device *adev);
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include "df_v3_6.h"
|
||||
#include "df_v4_3.h"
|
||||
#include "df_v4_6_2.h"
|
||||
#include "df_v4_15.h"
|
||||
#include "nbio_v6_1.h"
|
||||
#include "nbio_v7_0.h"
|
||||
#include "nbio_v7_4.h"
|
||||
@ -2803,6 +2804,10 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)
|
||||
case IP_VERSION(4, 6, 2):
|
||||
adev->df.funcs = &df_v4_6_2_funcs;
|
||||
break;
|
||||
case IP_VERSION(4, 15, 0):
|
||||
case IP_VERSION(4, 15, 1):
|
||||
adev->df.funcs = &df_v4_15_funcs;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -116,9 +116,10 @@
|
||||
* - 3.55.0 - Add AMDGPU_INFO_GPUVM_FAULT query
|
||||
* - 3.56.0 - Update IB start address and size alignment for decode and encode
|
||||
* - 3.57.0 - Compute tunneling on GFX10+
|
||||
* - 3.58.0 - Add GFX12 DCC support
|
||||
*/
|
||||
#define KMS_DRIVER_MAJOR 3
|
||||
#define KMS_DRIVER_MINOR 57
|
||||
#define KMS_DRIVER_MINOR 58
|
||||
#define KMS_DRIVER_PATCHLEVEL 0
|
||||
|
||||
/*
|
||||
|
@ -1591,6 +1591,66 @@ static void psp_ras_ta_check_status(struct psp_context *psp)
|
||||
}
|
||||
}
|
||||
|
||||
static int psp_ras_send_cmd(struct psp_context *psp,
|
||||
enum ras_command cmd_id, void *in, void *out)
|
||||
{
|
||||
struct ta_ras_shared_memory *ras_cmd;
|
||||
uint32_t cmd = cmd_id;
|
||||
int ret = 0;
|
||||
|
||||
if (!in)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&psp->ras_context.mutex);
|
||||
ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf;
|
||||
memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory));
|
||||
|
||||
switch (cmd) {
|
||||
case TA_RAS_COMMAND__ENABLE_FEATURES:
|
||||
case TA_RAS_COMMAND__DISABLE_FEATURES:
|
||||
memcpy(&ras_cmd->ras_in_message,
|
||||
in, sizeof(ras_cmd->ras_in_message));
|
||||
break;
|
||||
case TA_RAS_COMMAND__TRIGGER_ERROR:
|
||||
memcpy(&ras_cmd->ras_in_message.trigger_error,
|
||||
in, sizeof(ras_cmd->ras_in_message.trigger_error));
|
||||
break;
|
||||
case TA_RAS_COMMAND__QUERY_ADDRESS:
|
||||
memcpy(&ras_cmd->ras_in_message.address,
|
||||
in, sizeof(ras_cmd->ras_in_message.address));
|
||||
break;
|
||||
default:
|
||||
dev_err(psp->adev->dev, "Invalid ras cmd id: %u\n", cmd);
|
||||
ret = -EINVAL;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
ras_cmd->cmd_id = cmd;
|
||||
ret = psp_ras_invoke(psp, ras_cmd->cmd_id);
|
||||
|
||||
switch (cmd) {
|
||||
case TA_RAS_COMMAND__TRIGGER_ERROR:
|
||||
if (!ret && out)
|
||||
memcpy(out, &ras_cmd->ras_status, sizeof(ras_cmd->ras_status));
|
||||
break;
|
||||
case TA_RAS_COMMAND__QUERY_ADDRESS:
|
||||
if (ret || ras_cmd->ras_status || psp->cmd_buf_mem->resp.status)
|
||||
ret = -EINVAL;
|
||||
else if (out)
|
||||
memcpy(out,
|
||||
&ras_cmd->ras_out_message.address,
|
||||
sizeof(ras_cmd->ras_out_message.address));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
err_out:
|
||||
mutex_unlock(&psp->ras_context.mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
|
||||
{
|
||||
struct ta_ras_shared_memory *ras_cmd;
|
||||
@ -1632,23 +1692,15 @@ int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
|
||||
int psp_ras_enable_features(struct psp_context *psp,
|
||||
union ta_ras_cmd_input *info, bool enable)
|
||||
{
|
||||
struct ta_ras_shared_memory *ras_cmd;
|
||||
enum ras_command cmd_id;
|
||||
int ret;
|
||||
|
||||
if (!psp->ras_context.context.initialized)
|
||||
if (!psp->ras_context.context.initialized || !info)
|
||||
return -EINVAL;
|
||||
|
||||
ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf;
|
||||
memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory));
|
||||
|
||||
if (enable)
|
||||
ras_cmd->cmd_id = TA_RAS_COMMAND__ENABLE_FEATURES;
|
||||
else
|
||||
ras_cmd->cmd_id = TA_RAS_COMMAND__DISABLE_FEATURES;
|
||||
|
||||
ras_cmd->ras_in_message = *info;
|
||||
|
||||
ret = psp_ras_invoke(psp, ras_cmd->cmd_id);
|
||||
cmd_id = enable ?
|
||||
TA_RAS_COMMAND__ENABLE_FEATURES : TA_RAS_COMMAND__DISABLE_FEATURES;
|
||||
ret = psp_ras_send_cmd(psp, cmd_id, info, NULL);
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
|
||||
@ -1672,6 +1724,8 @@ int psp_ras_terminate(struct psp_context *psp)
|
||||
|
||||
psp->ras_context.context.initialized = false;
|
||||
|
||||
mutex_destroy(&psp->ras_context.mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1756,9 +1810,10 @@ int psp_ras_initialize(struct psp_context *psp)
|
||||
|
||||
ret = psp_ta_load(psp, &psp->ras_context.context);
|
||||
|
||||
if (!ret && !ras_cmd->ras_status)
|
||||
if (!ret && !ras_cmd->ras_status) {
|
||||
psp->ras_context.context.initialized = true;
|
||||
else {
|
||||
mutex_init(&psp->ras_context.mutex);
|
||||
} else {
|
||||
if (ras_cmd->ras_status)
|
||||
dev_warn(adev->dev, "RAS Init Status: 0x%X\n", ras_cmd->ras_status);
|
||||
|
||||
@ -1772,12 +1827,12 @@ int psp_ras_initialize(struct psp_context *psp)
|
||||
int psp_ras_trigger_error(struct psp_context *psp,
|
||||
struct ta_ras_trigger_error_input *info, uint32_t instance_mask)
|
||||
{
|
||||
struct ta_ras_shared_memory *ras_cmd;
|
||||
struct amdgpu_device *adev = psp->adev;
|
||||
int ret;
|
||||
uint32_t dev_mask;
|
||||
uint32_t ras_status = 0;
|
||||
|
||||
if (!psp->ras_context.context.initialized)
|
||||
if (!psp->ras_context.context.initialized || !info)
|
||||
return -EINVAL;
|
||||
|
||||
switch (info->block_id) {
|
||||
@ -1801,13 +1856,8 @@ int psp_ras_trigger_error(struct psp_context *psp,
|
||||
dev_mask &= AMDGPU_RAS_INST_MASK;
|
||||
info->sub_block_index |= dev_mask;
|
||||
|
||||
ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf;
|
||||
memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory));
|
||||
|
||||
ras_cmd->cmd_id = TA_RAS_COMMAND__TRIGGER_ERROR;
|
||||
ras_cmd->ras_in_message.trigger_error = *info;
|
||||
|
||||
ret = psp_ras_invoke(psp, ras_cmd->cmd_id);
|
||||
ret = psp_ras_send_cmd(psp,
|
||||
TA_RAS_COMMAND__TRIGGER_ERROR, info, &ras_status);
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
|
||||
@ -1817,9 +1867,9 @@ int psp_ras_trigger_error(struct psp_context *psp,
|
||||
if (amdgpu_ras_intr_triggered())
|
||||
return 0;
|
||||
|
||||
if (ras_cmd->ras_status == TA_RAS_STATUS__TEE_ERROR_ACCESS_DENIED)
|
||||
if (ras_status == TA_RAS_STATUS__TEE_ERROR_ACCESS_DENIED)
|
||||
return -EACCES;
|
||||
else if (ras_cmd->ras_status)
|
||||
else if (ras_status)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
@ -1829,25 +1879,16 @@ int psp_ras_query_address(struct psp_context *psp,
|
||||
struct ta_ras_query_address_input *addr_in,
|
||||
struct ta_ras_query_address_output *addr_out)
|
||||
{
|
||||
struct ta_ras_shared_memory *ras_cmd;
|
||||
int ret;
|
||||
|
||||
if (!psp->ras_context.context.initialized)
|
||||
if (!psp->ras_context.context.initialized ||
|
||||
!addr_in || !addr_out)
|
||||
return -EINVAL;
|
||||
|
||||
ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf;
|
||||
memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory));
|
||||
ret = psp_ras_send_cmd(psp,
|
||||
TA_RAS_COMMAND__QUERY_ADDRESS, addr_in, addr_out);
|
||||
|
||||
ras_cmd->cmd_id = TA_RAS_COMMAND__QUERY_ADDRESS;
|
||||
ras_cmd->ras_in_message.address = *addr_in;
|
||||
|
||||
ret = psp_ras_invoke(psp, ras_cmd->cmd_id);
|
||||
if (ret || ras_cmd->ras_status || psp->cmd_buf_mem->resp.status)
|
||||
return -EINVAL;
|
||||
|
||||
*addr_out = ras_cmd->ras_out_message.address;
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
// ras end
|
||||
|
||||
|
@ -200,6 +200,7 @@ struct psp_xgmi_context {
|
||||
struct psp_ras_context {
|
||||
struct ta_context context;
|
||||
struct amdgpu_ras *ras;
|
||||
struct mutex mutex;
|
||||
};
|
||||
|
||||
#define MEM_TRAIN_SYSTEM_SIGNATURE 0x54534942
|
||||
|
@ -348,6 +348,7 @@ static ssize_t ta_if_invoke_debugfs_write(struct file *fp, const char *buf, size
|
||||
|
||||
context->session_id = ta_id;
|
||||
|
||||
mutex_lock(&psp->ras_context.mutex);
|
||||
ret = prep_ta_mem_context(&context->mem_context, shared_buf, shared_buf_len);
|
||||
if (ret)
|
||||
goto err_free_shared_buf;
|
||||
@ -366,6 +367,7 @@ static ssize_t ta_if_invoke_debugfs_write(struct file *fp, const char *buf, size
|
||||
ret = -EFAULT;
|
||||
|
||||
err_free_shared_buf:
|
||||
mutex_unlock(&psp->ras_context.mutex);
|
||||
kfree(shared_buf);
|
||||
|
||||
return ret;
|
||||
|
@ -1011,6 +1011,9 @@ Out:
|
||||
|
||||
uint32_t amdgpu_ras_eeprom_max_record_count(struct amdgpu_ras_eeprom_control *control)
|
||||
{
|
||||
/* get available eeprom table version first before eeprom table init */
|
||||
amdgpu_ras_set_eeprom_table_version(control);
|
||||
|
||||
if (control->tbl_hdr.version == RAS_TABLE_VER_V2_1)
|
||||
return RAS_MAX_RECORD_COUNT_V2_1;
|
||||
else
|
||||
|
@ -147,6 +147,10 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
|
||||
}
|
||||
}
|
||||
|
||||
/* from vcn4 and above, only unified queue is used */
|
||||
adev->vcn.using_unified_queue =
|
||||
amdgpu_ip_version(adev, UVD_HWIP, 0) >= IP_VERSION(4, 0, 0);
|
||||
|
||||
hdr = (const struct common_firmware_header *)adev->vcn.fw[0]->data;
|
||||
adev->vcn.fw_version = le32_to_cpu(hdr->ucode_version);
|
||||
|
||||
@ -275,18 +279,6 @@ int amdgpu_vcn_sw_fini(struct amdgpu_device *adev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* from vcn4 and above, only unified queue is used */
|
||||
static bool amdgpu_vcn_using_unified_queue(struct amdgpu_ring *ring)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
bool ret = false;
|
||||
|
||||
if (amdgpu_ip_version(adev, UVD_HWIP, 0) >= IP_VERSION(4, 0, 0))
|
||||
ret = true;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool amdgpu_vcn_is_disabled_vcn(struct amdgpu_device *adev, enum vcn_ring_type type, uint32_t vcn_instance)
|
||||
{
|
||||
bool ret = false;
|
||||
@ -397,7 +389,9 @@ static void amdgpu_vcn_idle_work_handler(struct work_struct *work)
|
||||
for (i = 0; i < adev->vcn.num_enc_rings; ++i)
|
||||
fence[j] += amdgpu_fence_count_emitted(&adev->vcn.inst[j].ring_enc[i]);
|
||||
|
||||
if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) {
|
||||
/* Only set DPG pause for VCN3 or below, VCN4 and above will be handled by FW */
|
||||
if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG &&
|
||||
!adev->vcn.using_unified_queue) {
|
||||
struct dpg_pause_state new_state;
|
||||
|
||||
if (fence[j] ||
|
||||
@ -443,7 +437,9 @@ void amdgpu_vcn_ring_begin_use(struct amdgpu_ring *ring)
|
||||
amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCN,
|
||||
AMD_PG_STATE_UNGATE);
|
||||
|
||||
if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) {
|
||||
/* Only set DPG pause for VCN3 or below, VCN4 and above will be handled by FW */
|
||||
if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG &&
|
||||
!adev->vcn.using_unified_queue) {
|
||||
struct dpg_pause_state new_state;
|
||||
|
||||
if (ring->funcs->type == AMDGPU_RING_TYPE_VCN_ENC) {
|
||||
@ -469,8 +465,12 @@ void amdgpu_vcn_ring_begin_use(struct amdgpu_ring *ring)
|
||||
|
||||
void amdgpu_vcn_ring_end_use(struct amdgpu_ring *ring)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
/* Only set DPG pause for VCN3 or below, VCN4 and above will be handled by FW */
|
||||
if (ring->adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG &&
|
||||
ring->funcs->type == AMDGPU_RING_TYPE_VCN_ENC)
|
||||
ring->funcs->type == AMDGPU_RING_TYPE_VCN_ENC &&
|
||||
!adev->vcn.using_unified_queue)
|
||||
atomic_dec(&ring->adev->vcn.inst[ring->me].dpg_enc_submission_cnt);
|
||||
|
||||
atomic_dec(&ring->adev->vcn.total_submission_cnt);
|
||||
@ -724,12 +724,11 @@ static int amdgpu_vcn_dec_sw_send_msg(struct amdgpu_ring *ring,
|
||||
struct amdgpu_job *job;
|
||||
struct amdgpu_ib *ib;
|
||||
uint64_t addr = AMDGPU_GPU_PAGE_ALIGN(ib_msg->gpu_addr);
|
||||
bool sq = amdgpu_vcn_using_unified_queue(ring);
|
||||
uint32_t *ib_checksum;
|
||||
uint32_t ib_pack_in_dw;
|
||||
int i, r;
|
||||
|
||||
if (sq)
|
||||
if (adev->vcn.using_unified_queue)
|
||||
ib_size_dw += 8;
|
||||
|
||||
r = amdgpu_job_alloc_with_ib(ring->adev, NULL, NULL,
|
||||
@ -742,7 +741,7 @@ static int amdgpu_vcn_dec_sw_send_msg(struct amdgpu_ring *ring,
|
||||
ib->length_dw = 0;
|
||||
|
||||
/* single queue headers */
|
||||
if (sq) {
|
||||
if (adev->vcn.using_unified_queue) {
|
||||
ib_pack_in_dw = sizeof(struct amdgpu_vcn_decode_buffer) / sizeof(uint32_t)
|
||||
+ 4 + 2; /* engine info + decoding ib in dw */
|
||||
ib_checksum = amdgpu_vcn_unified_ring_ib_header(ib, ib_pack_in_dw, false);
|
||||
@ -761,7 +760,7 @@ static int amdgpu_vcn_dec_sw_send_msg(struct amdgpu_ring *ring,
|
||||
for (i = ib->length_dw; i < ib_size_dw; ++i)
|
||||
ib->ptr[i] = 0x0;
|
||||
|
||||
if (sq)
|
||||
if (adev->vcn.using_unified_queue)
|
||||
amdgpu_vcn_unified_ring_ib_checksum(&ib_checksum, ib_pack_in_dw);
|
||||
|
||||
r = amdgpu_job_submit_direct(job, ring, &f);
|
||||
@ -851,15 +850,15 @@ static int amdgpu_vcn_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t hand
|
||||
struct dma_fence **fence)
|
||||
{
|
||||
unsigned int ib_size_dw = 16;
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
struct amdgpu_job *job;
|
||||
struct amdgpu_ib *ib;
|
||||
struct dma_fence *f = NULL;
|
||||
uint32_t *ib_checksum = NULL;
|
||||
uint64_t addr;
|
||||
bool sq = amdgpu_vcn_using_unified_queue(ring);
|
||||
int i, r;
|
||||
|
||||
if (sq)
|
||||
if (adev->vcn.using_unified_queue)
|
||||
ib_size_dw += 8;
|
||||
|
||||
r = amdgpu_job_alloc_with_ib(ring->adev, NULL, NULL,
|
||||
@ -873,7 +872,7 @@ static int amdgpu_vcn_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t hand
|
||||
|
||||
ib->length_dw = 0;
|
||||
|
||||
if (sq)
|
||||
if (adev->vcn.using_unified_queue)
|
||||
ib_checksum = amdgpu_vcn_unified_ring_ib_header(ib, 0x11, true);
|
||||
|
||||
ib->ptr[ib->length_dw++] = 0x00000018;
|
||||
@ -895,7 +894,7 @@ static int amdgpu_vcn_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t hand
|
||||
for (i = ib->length_dw; i < ib_size_dw; ++i)
|
||||
ib->ptr[i] = 0x0;
|
||||
|
||||
if (sq)
|
||||
if (adev->vcn.using_unified_queue)
|
||||
amdgpu_vcn_unified_ring_ib_checksum(&ib_checksum, 0x11);
|
||||
|
||||
r = amdgpu_job_submit_direct(job, ring, &f);
|
||||
@ -918,15 +917,15 @@ static int amdgpu_vcn_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t han
|
||||
struct dma_fence **fence)
|
||||
{
|
||||
unsigned int ib_size_dw = 16;
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
struct amdgpu_job *job;
|
||||
struct amdgpu_ib *ib;
|
||||
struct dma_fence *f = NULL;
|
||||
uint32_t *ib_checksum = NULL;
|
||||
uint64_t addr;
|
||||
bool sq = amdgpu_vcn_using_unified_queue(ring);
|
||||
int i, r;
|
||||
|
||||
if (sq)
|
||||
if (adev->vcn.using_unified_queue)
|
||||
ib_size_dw += 8;
|
||||
|
||||
r = amdgpu_job_alloc_with_ib(ring->adev, NULL, NULL,
|
||||
@ -940,7 +939,7 @@ static int amdgpu_vcn_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t han
|
||||
|
||||
ib->length_dw = 0;
|
||||
|
||||
if (sq)
|
||||
if (adev->vcn.using_unified_queue)
|
||||
ib_checksum = amdgpu_vcn_unified_ring_ib_header(ib, 0x11, true);
|
||||
|
||||
ib->ptr[ib->length_dw++] = 0x00000018;
|
||||
@ -962,7 +961,7 @@ static int amdgpu_vcn_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t han
|
||||
for (i = ib->length_dw; i < ib_size_dw; ++i)
|
||||
ib->ptr[i] = 0x0;
|
||||
|
||||
if (sq)
|
||||
if (adev->vcn.using_unified_queue)
|
||||
amdgpu_vcn_unified_ring_ib_checksum(&ib_checksum, 0x11);
|
||||
|
||||
r = amdgpu_job_submit_direct(job, ring, &f);
|
||||
|
@ -329,6 +329,7 @@ struct amdgpu_vcn {
|
||||
|
||||
uint16_t inst_mask;
|
||||
uint8_t num_inst_per_aid;
|
||||
bool using_unified_queue;
|
||||
};
|
||||
|
||||
struct amdgpu_fw_shared_rb_ptrs_struct {
|
||||
|
@ -434,7 +434,7 @@ uint64_t amdgpu_vm_generation(struct amdgpu_device *adev, struct amdgpu_vm *vm)
|
||||
if (!vm)
|
||||
return result;
|
||||
|
||||
result += vm->generation;
|
||||
result += lower_32_bits(vm->generation);
|
||||
/* Add one if the page tables will be re-generated on next CS */
|
||||
if (drm_sched_entity_error(&vm->delayed))
|
||||
++result;
|
||||
@ -463,13 +463,14 @@ int amdgpu_vm_validate(struct amdgpu_device *adev, struct amdgpu_vm *vm,
|
||||
int (*validate)(void *p, struct amdgpu_bo *bo),
|
||||
void *param)
|
||||
{
|
||||
uint64_t new_vm_generation = amdgpu_vm_generation(adev, vm);
|
||||
struct amdgpu_vm_bo_base *bo_base;
|
||||
struct amdgpu_bo *shadow;
|
||||
struct amdgpu_bo *bo;
|
||||
int r;
|
||||
|
||||
if (drm_sched_entity_error(&vm->delayed)) {
|
||||
++vm->generation;
|
||||
if (vm->generation != new_vm_generation) {
|
||||
vm->generation = new_vm_generation;
|
||||
amdgpu_vm_bo_reset_state_machine(vm);
|
||||
amdgpu_vm_fini_entities(vm);
|
||||
r = amdgpu_vm_init_entities(adev, vm);
|
||||
@ -2439,7 +2440,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
|
||||
vm->last_update = dma_fence_get_stub();
|
||||
vm->last_unlocked = dma_fence_get_stub();
|
||||
vm->last_tlb_flush = dma_fence_get_stub();
|
||||
vm->generation = 0;
|
||||
vm->generation = amdgpu_vm_generation(adev, NULL);
|
||||
|
||||
mutex_init(&vm->eviction_lock);
|
||||
vm->evicting = false;
|
||||
|
45
drivers/gpu/drm/amd/amdgpu/df_v4_15.c
Normal file
45
drivers/gpu/drm/amd/amdgpu/df_v4_15.c
Normal file
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright 2024 Advanced Micro Devices, Inc.
|
||||
*
|
||||
* 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 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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 "amdgpu.h"
|
||||
#include "df_v4_15.h"
|
||||
|
||||
#include "df/df_4_15_offset.h"
|
||||
#include "df/df_4_15_sh_mask.h"
|
||||
|
||||
static void df_v4_15_hw_init(struct amdgpu_device *adev)
|
||||
{
|
||||
if (adev->have_atomics_support) {
|
||||
uint32_t tmp;
|
||||
uint32_t dis_lcl_proc = (1 << 1 |
|
||||
1 << 2 |
|
||||
1 << 13);
|
||||
|
||||
tmp = RREG32_SOC15(DF, 0, regNCSConfigurationRegister1);
|
||||
tmp |= (dis_lcl_proc << NCSConfigurationRegister1__DisIntAtomicsLclProcessing__SHIFT);
|
||||
WREG32_SOC15(DF, 0, regNCSConfigurationRegister1, tmp);
|
||||
}
|
||||
}
|
||||
|
||||
const struct amdgpu_df_funcs df_v4_15_funcs = {
|
||||
.hw_init = df_v4_15_hw_init
|
||||
};
|
30
drivers/gpu/drm/amd/amdgpu/df_v4_15.h
Normal file
30
drivers/gpu/drm/amd/amdgpu/df_v4_15.h
Normal file
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright 2024 Advanced Micro Devices, Inc.
|
||||
*
|
||||
* 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 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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 __DF_V4_15_H__
|
||||
#define __DF_V4_15_H__
|
||||
|
||||
extern const struct amdgpu_df_funcs df_v4_15_funcs;
|
||||
|
||||
#endif /* __DF_V4_15_H__ */
|
||||
|
@ -32,6 +32,9 @@
|
||||
#include "vcn/vcn_4_0_3_sh_mask.h"
|
||||
#include "ivsrcid/vcn/irqsrcs_vcn_4_0.h"
|
||||
|
||||
#define NORMALIZE_JPEG_REG_OFFSET(offset) \
|
||||
(offset & 0x1FFFF)
|
||||
|
||||
enum jpeg_engin_status {
|
||||
UVD_PGFSM_STATUS__UVDJ_PWR_ON = 0,
|
||||
UVD_PGFSM_STATUS__UVDJ_PWR_OFF = 2,
|
||||
@ -621,6 +624,13 @@ static uint64_t jpeg_v4_0_3_dec_ring_get_wptr(struct amdgpu_ring *ring)
|
||||
ring->pipe ? (0x40 * ring->pipe - 0xc80) : 0);
|
||||
}
|
||||
|
||||
static void jpeg_v4_0_3_ring_emit_hdp_flush(struct amdgpu_ring *ring)
|
||||
{
|
||||
/* JPEG engine access for HDP flush doesn't work when RRMT is enabled.
|
||||
* This is a workaround to avoid any HDP flush through JPEG ring.
|
||||
*/
|
||||
}
|
||||
|
||||
/**
|
||||
* jpeg_v4_0_3_dec_ring_set_wptr - set write pointer
|
||||
*
|
||||
@ -817,7 +827,13 @@ void jpeg_v4_0_3_dec_ring_emit_ib(struct amdgpu_ring *ring,
|
||||
void jpeg_v4_0_3_dec_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg,
|
||||
uint32_t val, uint32_t mask)
|
||||
{
|
||||
uint32_t reg_offset = (reg << 2);
|
||||
uint32_t reg_offset;
|
||||
|
||||
/* For VF, only local offsets should be used */
|
||||
if (amdgpu_sriov_vf(ring->adev))
|
||||
reg = NORMALIZE_JPEG_REG_OFFSET(reg);
|
||||
|
||||
reg_offset = (reg << 2);
|
||||
|
||||
amdgpu_ring_write(ring, PACKETJ(regUVD_JRBC_RB_COND_RD_TIMER_INTERNAL_OFFSET,
|
||||
0, 0, PACKETJ_TYPE0));
|
||||
@ -858,7 +874,13 @@ void jpeg_v4_0_3_dec_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
||||
|
||||
void jpeg_v4_0_3_dec_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, uint32_t val)
|
||||
{
|
||||
uint32_t reg_offset = (reg << 2);
|
||||
uint32_t reg_offset;
|
||||
|
||||
/* For VF, only local offsets should be used */
|
||||
if (amdgpu_sriov_vf(ring->adev))
|
||||
reg = NORMALIZE_JPEG_REG_OFFSET(reg);
|
||||
|
||||
reg_offset = (reg << 2);
|
||||
|
||||
amdgpu_ring_write(ring, PACKETJ(regUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET,
|
||||
0, 0, PACKETJ_TYPE0));
|
||||
@ -1072,6 +1094,7 @@ static const struct amdgpu_ring_funcs jpeg_v4_0_3_dec_ring_vm_funcs = {
|
||||
.emit_ib = jpeg_v4_0_3_dec_ring_emit_ib,
|
||||
.emit_fence = jpeg_v4_0_3_dec_ring_emit_fence,
|
||||
.emit_vm_flush = jpeg_v4_0_3_dec_ring_emit_vm_flush,
|
||||
.emit_hdp_flush = jpeg_v4_0_3_ring_emit_hdp_flush,
|
||||
.test_ring = amdgpu_jpeg_dec_ring_test_ring,
|
||||
.test_ib = amdgpu_jpeg_dec_ring_test_ib,
|
||||
.insert_nop = jpeg_v4_0_3_dec_ring_nop,
|
||||
|
@ -176,6 +176,14 @@ static void sdma_v5_2_ring_set_wptr(struct amdgpu_ring *ring)
|
||||
DRM_DEBUG("calling WDOORBELL64(0x%08x, 0x%016llx)\n",
|
||||
ring->doorbell_index, ring->wptr << 2);
|
||||
WDOORBELL64(ring->doorbell_index, ring->wptr << 2);
|
||||
/* SDMA seems to miss doorbells sometimes when powergating kicks in.
|
||||
* Updating the wptr directly will wake it. This is only safe because
|
||||
* we disallow gfxoff in begin_use() and then allow it again in end_use().
|
||||
*/
|
||||
WREG32(sdma_v5_2_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR),
|
||||
lower_32_bits(ring->wptr << 2));
|
||||
WREG32(sdma_v5_2_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI),
|
||||
upper_32_bits(ring->wptr << 2));
|
||||
} else {
|
||||
DRM_DEBUG("Not using doorbell -- "
|
||||
"mmSDMA%i_GFX_RB_WPTR == 0x%08x "
|
||||
@ -1647,6 +1655,10 @@ static void sdma_v5_2_ring_begin_use(struct amdgpu_ring *ring)
|
||||
* but it shouldn't hurt for other parts since
|
||||
* this GFXOFF will be disallowed anyway when SDMA is
|
||||
* active, this just makes it explicit.
|
||||
* sdma_v5_2_ring_set_wptr() takes advantage of this
|
||||
* to update the wptr because sometimes SDMA seems to miss
|
||||
* doorbells when entering PG. If you remove this, update
|
||||
* sdma_v5_2_ring_set_wptr() as well!
|
||||
*/
|
||||
amdgpu_gfx_off_ctrl(adev, false);
|
||||
}
|
||||
|
@ -91,7 +91,7 @@ static int smu_v13_0_10_mode2_suspend_ip(struct amdgpu_device *adev)
|
||||
adev->ip_blocks[i].status.hw = false;
|
||||
}
|
||||
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -484,6 +484,10 @@ static int soc24_common_hw_init(void *handle)
|
||||
*/
|
||||
if (adev->nbio.funcs->remap_hdp_registers)
|
||||
adev->nbio.funcs->remap_hdp_registers(adev);
|
||||
|
||||
if (adev->df.funcs->hw_init)
|
||||
adev->df.funcs->hw_init(adev);
|
||||
|
||||
/* enable the doorbell aperture */
|
||||
soc24_enable_doorbell_aperture(adev, true);
|
||||
|
||||
|
@ -1045,6 +1045,9 @@ static int vcn_v4_0_start(struct amdgpu_device *adev)
|
||||
amdgpu_dpm_enable_uvd(adev, true);
|
||||
|
||||
for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
|
||||
if (adev->vcn.harvest_config & (1 << i))
|
||||
continue;
|
||||
|
||||
fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr;
|
||||
|
||||
if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) {
|
||||
@ -1498,6 +1501,9 @@ static int vcn_v4_0_stop(struct amdgpu_device *adev)
|
||||
int i, r = 0;
|
||||
|
||||
for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
|
||||
if (adev->vcn.harvest_config & (1 << i))
|
||||
continue;
|
||||
|
||||
fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr;
|
||||
fw_shared->sq.queue_mode |= FW_QUEUE_DPG_HOLD_OFF;
|
||||
|
||||
|
@ -45,6 +45,9 @@
|
||||
#define VCN_VID_SOC_ADDRESS_2_0 0x1fb00
|
||||
#define VCN1_VID_SOC_ADDRESS_3_0 0x48300
|
||||
|
||||
#define NORMALIZE_VCN_REG_OFFSET(offset) \
|
||||
(offset & 0x1FFFF)
|
||||
|
||||
static int vcn_v4_0_3_start_sriov(struct amdgpu_device *adev);
|
||||
static void vcn_v4_0_3_set_unified_ring_funcs(struct amdgpu_device *adev);
|
||||
static void vcn_v4_0_3_set_irq_funcs(struct amdgpu_device *adev);
|
||||
@ -1375,6 +1378,50 @@ static uint64_t vcn_v4_0_3_unified_ring_get_wptr(struct amdgpu_ring *ring)
|
||||
regUVD_RB_WPTR);
|
||||
}
|
||||
|
||||
static void vcn_v4_0_3_enc_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg,
|
||||
uint32_t val, uint32_t mask)
|
||||
{
|
||||
/* For VF, only local offsets should be used */
|
||||
if (amdgpu_sriov_vf(ring->adev))
|
||||
reg = NORMALIZE_VCN_REG_OFFSET(reg);
|
||||
|
||||
amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WAIT);
|
||||
amdgpu_ring_write(ring, reg << 2);
|
||||
amdgpu_ring_write(ring, mask);
|
||||
amdgpu_ring_write(ring, val);
|
||||
}
|
||||
|
||||
static void vcn_v4_0_3_enc_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, uint32_t val)
|
||||
{
|
||||
/* For VF, only local offsets should be used */
|
||||
if (amdgpu_sriov_vf(ring->adev))
|
||||
reg = NORMALIZE_VCN_REG_OFFSET(reg);
|
||||
|
||||
amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WRITE);
|
||||
amdgpu_ring_write(ring, reg << 2);
|
||||
amdgpu_ring_write(ring, val);
|
||||
}
|
||||
|
||||
static void vcn_v4_0_3_enc_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
||||
unsigned int vmid, uint64_t pd_addr)
|
||||
{
|
||||
struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->vm_hub];
|
||||
|
||||
pd_addr = amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr);
|
||||
|
||||
/* wait for reg writes */
|
||||
vcn_v4_0_3_enc_ring_emit_reg_wait(ring, hub->ctx0_ptb_addr_lo32 +
|
||||
vmid * hub->ctx_addr_distance,
|
||||
lower_32_bits(pd_addr), 0xffffffff);
|
||||
}
|
||||
|
||||
static void vcn_v4_0_3_ring_emit_hdp_flush(struct amdgpu_ring *ring)
|
||||
{
|
||||
/* VCN engine access for HDP flush doesn't work when RRMT is enabled.
|
||||
* This is a workaround to avoid any HDP flush through VCN ring.
|
||||
*/
|
||||
}
|
||||
|
||||
/**
|
||||
* vcn_v4_0_3_unified_ring_set_wptr - set enc write pointer
|
||||
*
|
||||
@ -1414,7 +1461,8 @@ static const struct amdgpu_ring_funcs vcn_v4_0_3_unified_ring_vm_funcs = {
|
||||
.emit_ib_size = 5, /* vcn_v2_0_enc_ring_emit_ib */
|
||||
.emit_ib = vcn_v2_0_enc_ring_emit_ib,
|
||||
.emit_fence = vcn_v2_0_enc_ring_emit_fence,
|
||||
.emit_vm_flush = vcn_v2_0_enc_ring_emit_vm_flush,
|
||||
.emit_vm_flush = vcn_v4_0_3_enc_ring_emit_vm_flush,
|
||||
.emit_hdp_flush = vcn_v4_0_3_ring_emit_hdp_flush,
|
||||
.test_ring = amdgpu_vcn_enc_ring_test_ring,
|
||||
.test_ib = amdgpu_vcn_unified_ring_test_ib,
|
||||
.insert_nop = amdgpu_ring_insert_nop,
|
||||
@ -1422,8 +1470,8 @@ static const struct amdgpu_ring_funcs vcn_v4_0_3_unified_ring_vm_funcs = {
|
||||
.pad_ib = amdgpu_ring_generic_pad_ib,
|
||||
.begin_use = amdgpu_vcn_ring_begin_use,
|
||||
.end_use = amdgpu_vcn_ring_end_use,
|
||||
.emit_wreg = vcn_v2_0_enc_ring_emit_wreg,
|
||||
.emit_reg_wait = vcn_v2_0_enc_ring_emit_reg_wait,
|
||||
.emit_wreg = vcn_v4_0_3_enc_ring_emit_wreg,
|
||||
.emit_reg_wait = vcn_v4_0_3_enc_ring_emit_reg_wait,
|
||||
.emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper,
|
||||
};
|
||||
|
||||
|
@ -958,6 +958,9 @@ static int vcn_v4_0_5_start(struct amdgpu_device *adev)
|
||||
amdgpu_dpm_enable_uvd(adev, true);
|
||||
|
||||
for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
|
||||
if (adev->vcn.harvest_config & (1 << i))
|
||||
continue;
|
||||
|
||||
fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr;
|
||||
|
||||
if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) {
|
||||
@ -1162,6 +1165,9 @@ static int vcn_v4_0_5_stop(struct amdgpu_device *adev)
|
||||
int i, r = 0;
|
||||
|
||||
for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
|
||||
if (adev->vcn.harvest_config & (1 << i))
|
||||
continue;
|
||||
|
||||
fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr;
|
||||
fw_shared->sq.queue_mode |= FW_QUEUE_DPG_HOLD_OFF;
|
||||
|
||||
|
@ -721,6 +721,9 @@ static int vcn_v5_0_0_start(struct amdgpu_device *adev)
|
||||
amdgpu_dpm_enable_uvd(adev, true);
|
||||
|
||||
for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
|
||||
if (adev->vcn.harvest_config & (1 << i))
|
||||
continue;
|
||||
|
||||
fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr;
|
||||
|
||||
if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) {
|
||||
@ -898,6 +901,9 @@ static int vcn_v5_0_0_stop(struct amdgpu_device *adev)
|
||||
int i, r = 0;
|
||||
|
||||
for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
|
||||
if (adev->vcn.harvest_config & (1 << i))
|
||||
continue;
|
||||
|
||||
fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr;
|
||||
fw_shared->sq.queue_mode |= FW_QUEUE_DPG_HOLD_OFF;
|
||||
|
||||
|
@ -137,6 +137,13 @@ struct vblank_control_work {
|
||||
bool enable;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct idle_workqueue - Work data for periodic action in idle
|
||||
* @work: Kernel work data for the work event
|
||||
* @dm: amdgpu display manager device
|
||||
* @enable: true if idle worker is enabled
|
||||
* @running: true if idle worker is running
|
||||
*/
|
||||
struct idle_workqueue {
|
||||
struct work_struct work;
|
||||
struct amdgpu_display_manager *dm;
|
||||
@ -502,6 +509,12 @@ struct amdgpu_display_manager {
|
||||
* Deferred work for vblank control events.
|
||||
*/
|
||||
struct workqueue_struct *vblank_control_workqueue;
|
||||
|
||||
/**
|
||||
* @idle_workqueue:
|
||||
*
|
||||
* Periodic work for idle events.
|
||||
*/
|
||||
struct idle_workqueue *idle_workqueue;
|
||||
|
||||
struct drm_atomic_state *cached_state;
|
||||
@ -587,7 +600,9 @@ struct amdgpu_display_manager {
|
||||
*/
|
||||
struct mutex dpia_aux_lock;
|
||||
|
||||
/*
|
||||
/**
|
||||
* @bb_from_dmub:
|
||||
*
|
||||
* Bounding box data read from dmub during early initialization for DCN4+
|
||||
*/
|
||||
struct dml2_soc_bb *bb_from_dmub;
|
||||
|
@ -143,7 +143,8 @@ const struct dc_plane_status *dc_plane_get_status(
|
||||
if (pipe_ctx->plane_state != plane_state)
|
||||
continue;
|
||||
|
||||
pipe_ctx->plane_state->status.is_flip_pending = false;
|
||||
if (pipe_ctx->plane_state)
|
||||
pipe_ctx->plane_state->status.is_flip_pending = false;
|
||||
|
||||
break;
|
||||
}
|
||||
|
@ -64,8 +64,6 @@ double math_ceil(const double arg)
|
||||
|
||||
double math_ceil2(const double arg, const double significance)
|
||||
{
|
||||
ASSERT(significance != 0);
|
||||
|
||||
return ((int)(arg / significance + 0.99999)) * significance;
|
||||
}
|
||||
|
||||
|
@ -147,16 +147,28 @@ struct cnv_color_keyer_params {
|
||||
int color_keyer_blue_high;
|
||||
};
|
||||
|
||||
/* new for dcn2: set the 8bit alpha values based on the 2 bit alpha
|
||||
*ALPHA_2BIT_LUT. ALPHA_2BIT_LUT0 default: 0b00000000
|
||||
*ALPHA_2BIT_LUT. ALPHA_2BIT_LUT1 default: 0b01010101
|
||||
*ALPHA_2BIT_LUT. ALPHA_2BIT_LUT2 default: 0b10101010
|
||||
*ALPHA_2BIT_LUT. ALPHA_2BIT_LUT3 default: 0b11111111
|
||||
/**
|
||||
* struct cnv_alpha_2bit_lut - Set the 8bit alpha values based on the 2 bit alpha
|
||||
*/
|
||||
struct cnv_alpha_2bit_lut {
|
||||
/**
|
||||
* @lut0: ALPHA_2BIT_LUT. ALPHA_2BIT_LUT0. Default: 0b00000000
|
||||
*/
|
||||
int lut0;
|
||||
|
||||
/**
|
||||
* @lut1: ALPHA_2BIT_LUT. ALPHA_2BIT_LUT1. Default: 0b01010101
|
||||
*/
|
||||
int lut1;
|
||||
|
||||
/**
|
||||
* @lut2: ALPHA_2BIT_LUT. ALPHA_2BIT_LUT2. Default: 0b10101010
|
||||
*/
|
||||
int lut2;
|
||||
|
||||
/**
|
||||
* @lut3: ALPHA_2BIT_LUT. ALPHA_2BIT_LUT3. Default: 0b11111111
|
||||
*/
|
||||
int lut3;
|
||||
};
|
||||
|
||||
|
@ -1039,6 +1039,20 @@ struct mpc_funcs {
|
||||
*/
|
||||
void (*program_lut_mode)(struct mpc *mpc, const enum MCM_LUT_ID id, const enum MCM_LUT_XABLE xable,
|
||||
bool lut_bank_a, int mpcc_id);
|
||||
/**
|
||||
* @program_3dlut_size:
|
||||
*
|
||||
* Program 3D LUT size.
|
||||
*
|
||||
* Parameters:
|
||||
* - [in/out] mpc - MPC context.
|
||||
* - [in] is_17x17x17 - is 3dlut 17x17x17
|
||||
* - [in] mpcc_id
|
||||
*
|
||||
* Return:
|
||||
*
|
||||
* void
|
||||
*/
|
||||
void (*program_3dlut_size)(struct mpc *mpc, bool is_17x17x17, int mpcc_id);
|
||||
};
|
||||
|
||||
|
@ -205,9 +205,24 @@ struct gamma_coefficients {
|
||||
struct fixed31_32 user_brightness;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct pwl_float_data - Fixed point RGB color
|
||||
*/
|
||||
struct pwl_float_data {
|
||||
/**
|
||||
* @r: Component Red.
|
||||
*/
|
||||
struct fixed31_32 r;
|
||||
|
||||
/**
|
||||
* @g: Component Green.
|
||||
*/
|
||||
|
||||
struct fixed31_32 g;
|
||||
|
||||
/**
|
||||
* @b: Component Blue.
|
||||
*/
|
||||
struct fixed31_32 b;
|
||||
};
|
||||
|
||||
|
@ -26,6 +26,16 @@
|
||||
#include "core_types.h"
|
||||
#include "link_enc_cfg.h"
|
||||
|
||||
/**
|
||||
* DOC: overview
|
||||
*
|
||||
* Display Input Output (DIO), is the display input and output unit in DCN. It
|
||||
* includes output encoders to support different display output, like
|
||||
* DisplayPort, HDMI, DVI interface, and others. It also includes the control
|
||||
* and status channels for these interfaces.
|
||||
*/
|
||||
|
||||
|
||||
void set_dio_throttled_vcp_size(struct pipe_ctx *pipe_ctx,
|
||||
struct fixed31_32 throttled_vcp_size)
|
||||
{
|
||||
@ -254,12 +264,31 @@ static const struct link_hwss dio_link_hwss = {
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* can_use_dio_link_hwss - Check if the link_hwss is accessible
|
||||
*
|
||||
* @link: Reference a link struct containing one or more sinks and the
|
||||
* connective status.
|
||||
* @link_res: Mappable hardware resource used to enable a link.
|
||||
*
|
||||
* Returns:
|
||||
* Return true if the link encoder is accessible from link.
|
||||
*/
|
||||
bool can_use_dio_link_hwss(const struct dc_link *link,
|
||||
const struct link_resource *link_res)
|
||||
{
|
||||
return link->link_enc != NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* get_dio_link_hwss - Return link_hwss reference
|
||||
*
|
||||
* This function behaves like a get function to return the link_hwss populated
|
||||
* in the link_hwss_dio.c file.
|
||||
*
|
||||
* Returns:
|
||||
* Return the reference to the filled struct of link_hwss.
|
||||
*/
|
||||
const struct link_hwss *get_dio_link_hwss(void)
|
||||
{
|
||||
return &dio_link_hwss;
|
||||
|
@ -23,15 +23,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* DOC: overview
|
||||
*
|
||||
* Display Input Output (DIO), is the display input and output unit in DCN. It
|
||||
* includes output encoders to support different display output, like
|
||||
* DisplayPort, HDMI, DVI interface, and others. It also includes the control
|
||||
* and status channels for these interfaces.
|
||||
*/
|
||||
|
||||
#ifndef __LINK_HWSS_DIO_H__
|
||||
#define __LINK_HWSS_DIO_H__
|
||||
|
||||
|
@ -945,19 +945,10 @@ void optc1_set_drr(
|
||||
OTG_FORCE_LOCK_ON_EVENT, 0,
|
||||
OTG_SET_V_TOTAL_MIN_MASK_EN, 0,
|
||||
OTG_SET_V_TOTAL_MIN_MASK, 0);
|
||||
|
||||
// Setup manual flow control for EOF via TRIG_A
|
||||
optc->funcs->setup_manual_trigger(optc);
|
||||
|
||||
} else {
|
||||
REG_UPDATE_4(OTG_V_TOTAL_CONTROL,
|
||||
OTG_SET_V_TOTAL_MIN_MASK, 0,
|
||||
OTG_V_TOTAL_MIN_SEL, 0,
|
||||
OTG_V_TOTAL_MAX_SEL, 0,
|
||||
OTG_FORCE_LOCK_ON_EVENT, 0);
|
||||
|
||||
optc->funcs->set_vtotal_min_max(optc, 0, 0);
|
||||
}
|
||||
|
||||
// Setup manual flow control for EOF via TRIG_A
|
||||
optc->funcs->setup_manual_trigger(optc);
|
||||
}
|
||||
|
||||
void optc1_set_vtotal_min_max(struct timing_generator *optc, int vtotal_min, int vtotal_max)
|
||||
|
@ -453,6 +453,16 @@ void optc2_setup_manual_trigger(struct timing_generator *optc)
|
||||
{
|
||||
struct optc *optc1 = DCN10TG_FROM_TG(optc);
|
||||
|
||||
/* Set the min/max selectors unconditionally so that
|
||||
* DMCUB fw may change OTG timings when necessary
|
||||
* TODO: Remove the w/a after fixing the issue in DMCUB firmware
|
||||
*/
|
||||
REG_UPDATE_4(OTG_V_TOTAL_CONTROL,
|
||||
OTG_V_TOTAL_MIN_SEL, 1,
|
||||
OTG_V_TOTAL_MAX_SEL, 1,
|
||||
OTG_FORCE_LOCK_ON_EVENT, 0,
|
||||
OTG_SET_V_TOTAL_MIN_MASK, (1 << 1)); /* TRIGA */
|
||||
|
||||
REG_SET_8(OTG_TRIGA_CNTL, 0,
|
||||
OTG_TRIGA_SOURCE_SELECT, 21,
|
||||
OTG_TRIGA_SOURCE_PIPE_SELECT, optc->inst,
|
||||
|
28
drivers/gpu/drm/amd/include/asic_reg/df/df_4_15_offset.h
Normal file
28
drivers/gpu/drm/amd/include/asic_reg/df/df_4_15_offset.h
Normal file
@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Copyright (C) 2024 Advanced Micro Devices, Inc.
|
||||
*
|
||||
* 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 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 COPYRIGHT HOLDER(S) 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 _df_4_15_OFFSET_HEADER
|
||||
#define _df_4_15_OFFSET_HEADER
|
||||
|
||||
#define regNCSConfigurationRegister1 0x0901
|
||||
#define regNCSConfigurationRegister1_BASE_IDX 4
|
||||
|
||||
#endif
|
28
drivers/gpu/drm/amd/include/asic_reg/df/df_4_15_sh_mask.h
Normal file
28
drivers/gpu/drm/amd/include/asic_reg/df/df_4_15_sh_mask.h
Normal file
@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Copyright (C) 2024 Advanced Micro Devices, Inc.
|
||||
*
|
||||
* 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 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 COPYRIGHT HOLDER(S) 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 _df_4_15_SH_MASK_HEADER
|
||||
#define _df_4_15_SH_MASK_HEADER
|
||||
|
||||
#define NCSConfigurationRegister1__DisIntAtomicsLclProcessing__SHIFT 0x3
|
||||
#define NCSConfigurationRegister1__DisIntAtomicsLclProcessing_MASK 0x0003FFF8L
|
||||
|
||||
#endif
|
@ -1924,20 +1924,12 @@ static int smu_disable_dpms(struct smu_context *smu)
|
||||
}
|
||||
|
||||
/*
|
||||
* For SMU 13.0.4/11 and 14.0.0, PMFW will handle the features disablement properly
|
||||
* For GFX11 and subsequent APUs, PMFW will handle the features disablement properly
|
||||
* for gpu reset and S0i3 cases. Driver involvement is unnecessary.
|
||||
*/
|
||||
if (amdgpu_in_reset(adev) || adev->in_s0ix) {
|
||||
switch (amdgpu_ip_version(adev, MP1_HWIP, 0)) {
|
||||
case IP_VERSION(13, 0, 4):
|
||||
case IP_VERSION(13, 0, 11):
|
||||
case IP_VERSION(14, 0, 0):
|
||||
case IP_VERSION(14, 0, 1):
|
||||
return 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (IP_VERSION_MAJ(amdgpu_ip_version(adev, GC_HWIP, 0)) >= 11 &&
|
||||
smu->is_apu && (amdgpu_in_reset(adev) || adev->in_s0ix))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* For gpu reset, runpm and hibernation through BACO,
|
||||
|
@ -69,6 +69,9 @@
|
||||
#define SMU_14_0_0_UMD_PSTATE_SOCCLK 678
|
||||
#define SMU_14_0_0_UMD_PSTATE_FCLK 1800
|
||||
|
||||
#define SMU_14_0_4_UMD_PSTATE_GFXCLK 938
|
||||
#define SMU_14_0_4_UMD_PSTATE_SOCCLK 938
|
||||
|
||||
#define FEATURE_MASK(feature) (1ULL << feature)
|
||||
#define SMC_DPM_FEATURE ( \
|
||||
FEATURE_MASK(FEATURE_CCLK_DPM_BIT) | \
|
||||
@ -1296,19 +1299,28 @@ static int smu_v14_0_common_get_dpm_profile_freq(struct smu_context *smu,
|
||||
switch (clk_type) {
|
||||
case SMU_GFXCLK:
|
||||
case SMU_SCLK:
|
||||
clk_limit = SMU_14_0_0_UMD_PSTATE_GFXCLK;
|
||||
if (amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(14, 0, 4))
|
||||
clk_limit = SMU_14_0_4_UMD_PSTATE_GFXCLK;
|
||||
else
|
||||
clk_limit = SMU_14_0_0_UMD_PSTATE_GFXCLK;
|
||||
if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK)
|
||||
smu_v14_0_common_get_dpm_ultimate_freq(smu, SMU_SCLK, NULL, &clk_limit);
|
||||
else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK)
|
||||
smu_v14_0_common_get_dpm_ultimate_freq(smu, SMU_SCLK, &clk_limit, NULL);
|
||||
break;
|
||||
case SMU_SOCCLK:
|
||||
clk_limit = SMU_14_0_0_UMD_PSTATE_SOCCLK;
|
||||
if (amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(14, 0, 4))
|
||||
clk_limit = SMU_14_0_4_UMD_PSTATE_SOCCLK;
|
||||
else
|
||||
clk_limit = SMU_14_0_0_UMD_PSTATE_SOCCLK;
|
||||
if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK)
|
||||
smu_v14_0_common_get_dpm_ultimate_freq(smu, SMU_SOCCLK, NULL, &clk_limit);
|
||||
break;
|
||||
case SMU_FCLK:
|
||||
clk_limit = SMU_14_0_0_UMD_PSTATE_FCLK;
|
||||
if (amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(14, 0, 4))
|
||||
smu_v14_0_common_get_dpm_ultimate_freq(smu, SMU_FCLK, NULL, &clk_limit);
|
||||
else
|
||||
clk_limit = SMU_14_0_0_UMD_PSTATE_FCLK;
|
||||
if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK)
|
||||
smu_v14_0_common_get_dpm_ultimate_freq(smu, SMU_FCLK, NULL, &clk_limit);
|
||||
else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK)
|
||||
|
@ -5314,6 +5314,8 @@ static int intel_dp_retrain_link(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state =
|
||||
to_intel_crtc_state(crtc->base.state);
|
||||
|
||||
intel_dp->link_trained = false;
|
||||
|
||||
intel_dp_check_frl_training(intel_dp);
|
||||
intel_dp_pcon_dsc_configure(intel_dp, crtc_state);
|
||||
intel_dp_start_link_train(NULL, intel_dp, crtc_state);
|
||||
|
@ -117,10 +117,24 @@ intel_dp_set_lttpr_transparent_mode(struct intel_dp *intel_dp, bool enable)
|
||||
return drm_dp_dpcd_write(&intel_dp->aux, DP_PHY_REPEATER_MODE, &val, 1) == 1;
|
||||
}
|
||||
|
||||
static int intel_dp_init_lttpr(struct intel_dp *intel_dp, const u8 dpcd[DP_RECEIVER_CAP_SIZE])
|
||||
static bool intel_dp_lttpr_transparent_mode_enabled(struct intel_dp *intel_dp)
|
||||
{
|
||||
return intel_dp->lttpr_common_caps[DP_PHY_REPEATER_MODE -
|
||||
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV] ==
|
||||
DP_PHY_REPEATER_MODE_TRANSPARENT;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read the LTTPR common capabilities and switch the LTTPR PHYs to
|
||||
* non-transparent mode if this is supported. Preserve the
|
||||
* transparent/non-transparent mode on an active link.
|
||||
*
|
||||
* Return the number of detected LTTPRs in non-transparent mode or 0 if the
|
||||
* LTTPRs are in transparent mode or the detection failed.
|
||||
*/
|
||||
static int intel_dp_init_lttpr_phys(struct intel_dp *intel_dp, const u8 dpcd[DP_RECEIVER_CAP_SIZE])
|
||||
{
|
||||
int lttpr_count;
|
||||
int i;
|
||||
|
||||
if (!intel_dp_read_lttpr_common_caps(intel_dp, dpcd))
|
||||
return 0;
|
||||
@ -134,6 +148,19 @@ static int intel_dp_init_lttpr(struct intel_dp *intel_dp, const u8 dpcd[DP_RECEI
|
||||
if (lttpr_count == 0)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Don't change the mode on an active link, to prevent a loss of link
|
||||
* synchronization. See DP Standard v2.0 3.6.7. about the LTTPR
|
||||
* resetting its internal state when the mode is changed from
|
||||
* non-transparent to transparent.
|
||||
*/
|
||||
if (intel_dp->link_trained) {
|
||||
if (lttpr_count < 0 || intel_dp_lttpr_transparent_mode_enabled(intel_dp))
|
||||
goto out_reset_lttpr_count;
|
||||
|
||||
return lttpr_count;
|
||||
}
|
||||
|
||||
/*
|
||||
* See DP Standard v2.0 3.6.6.1. about the explicit disabling of
|
||||
* non-transparent mode and the disable->enable non-transparent mode
|
||||
@ -154,11 +181,25 @@ static int intel_dp_init_lttpr(struct intel_dp *intel_dp, const u8 dpcd[DP_RECEI
|
||||
"Switching to LTTPR non-transparent LT mode failed, fall-back to transparent mode\n");
|
||||
|
||||
intel_dp_set_lttpr_transparent_mode(intel_dp, true);
|
||||
intel_dp_reset_lttpr_count(intel_dp);
|
||||
|
||||
return 0;
|
||||
goto out_reset_lttpr_count;
|
||||
}
|
||||
|
||||
return lttpr_count;
|
||||
|
||||
out_reset_lttpr_count:
|
||||
intel_dp_reset_lttpr_count(intel_dp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int intel_dp_init_lttpr(struct intel_dp *intel_dp, const u8 dpcd[DP_RECEIVER_CAP_SIZE])
|
||||
{
|
||||
int lttpr_count;
|
||||
int i;
|
||||
|
||||
lttpr_count = intel_dp_init_lttpr_phys(intel_dp, dpcd);
|
||||
|
||||
for (i = 0; i < lttpr_count; i++)
|
||||
intel_dp_read_lttpr_phy_caps(intel_dp, dpcd, DP_PHY_LTTPR(i));
|
||||
|
||||
@ -1482,10 +1523,10 @@ void intel_dp_start_link_train(struct intel_atomic_state *state,
|
||||
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
|
||||
struct intel_encoder *encoder = &dig_port->base;
|
||||
bool passed;
|
||||
|
||||
/*
|
||||
* TODO: Reiniting LTTPRs here won't be needed once proper connector
|
||||
* HW state readout is added.
|
||||
* Reinit the LTTPRs here to ensure that they are switched to
|
||||
* non-transparent mode. During an earlier LTTPR detection this
|
||||
* could've been prevented by an active link.
|
||||
*/
|
||||
int lttpr_count = intel_dp_init_lttpr_and_dprx_caps(intel_dp);
|
||||
|
||||
|
@ -3315,11 +3315,7 @@ static void remove_from_engine(struct i915_request *rq)
|
||||
|
||||
static bool can_preempt(struct intel_engine_cs *engine)
|
||||
{
|
||||
if (GRAPHICS_VER(engine->i915) > 8)
|
||||
return true;
|
||||
|
||||
/* GPGPU on bdw requires extra w/a; not implemented */
|
||||
return engine->class != RENDER_CLASS;
|
||||
return GRAPHICS_VER(engine->i915) > 8;
|
||||
}
|
||||
|
||||
static void kick_execlists(const struct i915_request *rq, int prio)
|
||||
|
@ -368,8 +368,10 @@ int intel_memory_regions_hw_probe(struct drm_i915_private *i915)
|
||||
goto out_cleanup;
|
||||
}
|
||||
|
||||
mem->id = i;
|
||||
i915->mm.regions[i] = mem;
|
||||
if (mem) { /* Skip on non-fatal errors */
|
||||
mem->id = i;
|
||||
i915->mm.regions[i] = mem;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(i915->mm.regions); i++) {
|
||||
|
@ -265,7 +265,7 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
|
||||
struct v3d_dev *v3d;
|
||||
int ret;
|
||||
u32 mmu_debug;
|
||||
u32 ident1;
|
||||
u32 ident1, ident3;
|
||||
u64 mask;
|
||||
|
||||
v3d = devm_drm_dev_alloc(dev, &v3d_drm_driver, struct v3d_dev, drm);
|
||||
@ -298,6 +298,9 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
|
||||
v3d->cores = V3D_GET_FIELD(ident1, V3D_HUB_IDENT1_NCORES);
|
||||
WARN_ON(v3d->cores > 1); /* multicore not yet implemented */
|
||||
|
||||
ident3 = V3D_READ(V3D_HUB_IDENT3);
|
||||
v3d->rev = V3D_GET_FIELD(ident3, V3D_HUB_IDENT3_IPREV);
|
||||
|
||||
if (v3d->ver >= 71)
|
||||
v3d->max_counters = V3D_V71_NUM_PERFCOUNTERS;
|
||||
else if (v3d->ver >= 42)
|
||||
|
@ -98,10 +98,12 @@ struct v3d_perfmon {
|
||||
struct v3d_dev {
|
||||
struct drm_device drm;
|
||||
|
||||
/* Short representation (e.g. 33, 41) of the V3D tech version
|
||||
* and revision.
|
||||
*/
|
||||
/* Short representation (e.g. 33, 41) of the V3D tech version */
|
||||
int ver;
|
||||
|
||||
/* Short representation (e.g. 5, 6) of the V3D tech revision */
|
||||
int rev;
|
||||
|
||||
bool single_irq_line;
|
||||
|
||||
/* Different revisions of V3D have different total number of performance
|
||||
|
@ -331,7 +331,8 @@ v3d_rewrite_csd_job_wg_counts_from_indirect(struct v3d_cpu_job *job)
|
||||
struct v3d_bo *bo = to_v3d_bo(job->base.bo[0]);
|
||||
struct v3d_bo *indirect = to_v3d_bo(indirect_csd->indirect);
|
||||
struct drm_v3d_submit_csd *args = &indirect_csd->job->args;
|
||||
u32 *wg_counts;
|
||||
struct v3d_dev *v3d = job->base.v3d;
|
||||
u32 num_batches, *wg_counts;
|
||||
|
||||
v3d_get_bo_vaddr(bo);
|
||||
v3d_get_bo_vaddr(indirect);
|
||||
@ -344,8 +345,17 @@ v3d_rewrite_csd_job_wg_counts_from_indirect(struct v3d_cpu_job *job)
|
||||
args->cfg[0] = wg_counts[0] << V3D_CSD_CFG012_WG_COUNT_SHIFT;
|
||||
args->cfg[1] = wg_counts[1] << V3D_CSD_CFG012_WG_COUNT_SHIFT;
|
||||
args->cfg[2] = wg_counts[2] << V3D_CSD_CFG012_WG_COUNT_SHIFT;
|
||||
args->cfg[4] = DIV_ROUND_UP(indirect_csd->wg_size, 16) *
|
||||
(wg_counts[0] * wg_counts[1] * wg_counts[2]) - 1;
|
||||
|
||||
num_batches = DIV_ROUND_UP(indirect_csd->wg_size, 16) *
|
||||
(wg_counts[0] * wg_counts[1] * wg_counts[2]);
|
||||
|
||||
/* V3D 7.1.6 and later don't subtract 1 from the number of batches */
|
||||
if (v3d->ver < 71 || (v3d->ver == 71 && v3d->rev < 6))
|
||||
args->cfg[4] = num_batches - 1;
|
||||
else
|
||||
args->cfg[4] = num_batches;
|
||||
|
||||
WARN_ON(args->cfg[4] == ~0);
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
/* 0xffffffff indicates that the uniform rewrite is not needed */
|
||||
|
@ -854,6 +854,13 @@ u64 xe_device_uncanonicalize_addr(struct xe_device *xe, u64 address)
|
||||
return address & GENMASK_ULL(xe->info.va_bits - 1, 0);
|
||||
}
|
||||
|
||||
static void xe_device_wedged_fini(struct drm_device *drm, void *arg)
|
||||
{
|
||||
struct xe_device *xe = arg;
|
||||
|
||||
xe_pm_runtime_put(xe);
|
||||
}
|
||||
|
||||
/**
|
||||
* xe_device_declare_wedged - Declare device wedged
|
||||
* @xe: xe device instance
|
||||
@ -870,11 +877,21 @@ u64 xe_device_uncanonicalize_addr(struct xe_device *xe, u64 address)
|
||||
*/
|
||||
void xe_device_declare_wedged(struct xe_device *xe)
|
||||
{
|
||||
struct xe_gt *gt;
|
||||
u8 id;
|
||||
|
||||
if (xe->wedged.mode == 0) {
|
||||
drm_dbg(&xe->drm, "Wedged mode is forcibly disabled\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (drmm_add_action_or_reset(&xe->drm, xe_device_wedged_fini, xe)) {
|
||||
drm_err(&xe->drm, "Failed to register xe_device_wedged_fini clean-up. Although device is wedged.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
xe_pm_runtime_get_noresume(xe);
|
||||
|
||||
if (!atomic_xchg(&xe->wedged.flag, 1)) {
|
||||
xe->needs_flr_on_fini = true;
|
||||
drm_err(&xe->drm,
|
||||
@ -883,4 +900,7 @@ void xe_device_declare_wedged(struct xe_device *xe)
|
||||
"Please file a _new_ bug report at https://gitlab.freedesktop.org/drm/xe/kernel/issues/new\n",
|
||||
dev_name(xe->drm.dev));
|
||||
}
|
||||
|
||||
for_each_gt(gt, xe, id)
|
||||
xe_gt_declare_wedged(gt);
|
||||
}
|
||||
|
@ -118,7 +118,7 @@ int xe_exec_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
|
||||
u64 addresses[XE_HW_ENGINE_MAX_INSTANCE];
|
||||
struct drm_gpuvm_exec vm_exec = {.extra.fn = xe_exec_fn};
|
||||
struct drm_exec *exec = &vm_exec.exec;
|
||||
u32 i, num_syncs = 0, num_ufence = 0;
|
||||
u32 i, num_syncs, num_ufence = 0;
|
||||
struct xe_sched_job *job;
|
||||
struct xe_vm *vm;
|
||||
bool write_locked, skip_retry = false;
|
||||
@ -156,15 +156,15 @@ int xe_exec_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
|
||||
|
||||
vm = q->vm;
|
||||
|
||||
for (i = 0; i < args->num_syncs; i++) {
|
||||
err = xe_sync_entry_parse(xe, xef, &syncs[num_syncs++],
|
||||
&syncs_user[i], SYNC_PARSE_FLAG_EXEC |
|
||||
for (num_syncs = 0; num_syncs < args->num_syncs; num_syncs++) {
|
||||
err = xe_sync_entry_parse(xe, xef, &syncs[num_syncs],
|
||||
&syncs_user[num_syncs], SYNC_PARSE_FLAG_EXEC |
|
||||
(xe_vm_in_lr_mode(vm) ?
|
||||
SYNC_PARSE_FLAG_LR_MODE : 0));
|
||||
if (err)
|
||||
goto err_syncs;
|
||||
|
||||
if (xe_sync_is_ufence(&syncs[i]))
|
||||
if (xe_sync_is_ufence(&syncs[num_syncs]))
|
||||
num_ufence++;
|
||||
}
|
||||
|
||||
@ -325,8 +325,8 @@ err_unlock_list:
|
||||
if (err == -EAGAIN && !skip_retry)
|
||||
goto retry;
|
||||
err_syncs:
|
||||
for (i = 0; i < num_syncs; i++)
|
||||
xe_sync_entry_cleanup(&syncs[i]);
|
||||
while (num_syncs--)
|
||||
xe_sync_entry_cleanup(&syncs[num_syncs]);
|
||||
kfree(syncs);
|
||||
err_exec_queue:
|
||||
xe_exec_queue_put(q);
|
||||
|
@ -904,3 +904,18 @@ struct xe_hw_engine *xe_gt_any_hw_engine(struct xe_gt *gt)
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* xe_gt_declare_wedged() - Declare GT wedged
|
||||
* @gt: the GT object
|
||||
*
|
||||
* Wedge the GT which stops all submission, saves desired debug state, and
|
||||
* cleans up anything which could timeout.
|
||||
*/
|
||||
void xe_gt_declare_wedged(struct xe_gt *gt)
|
||||
{
|
||||
xe_gt_assert(gt, gt_to_xe(gt)->wedged.mode);
|
||||
|
||||
xe_uc_declare_wedged(>->uc);
|
||||
xe_gt_tlb_invalidation_reset(gt);
|
||||
}
|
||||
|
@ -37,6 +37,7 @@ struct xe_gt *xe_gt_alloc(struct xe_tile *tile);
|
||||
int xe_gt_init_hwconfig(struct xe_gt *gt);
|
||||
int xe_gt_init_early(struct xe_gt *gt);
|
||||
int xe_gt_init(struct xe_gt *gt);
|
||||
void xe_gt_declare_wedged(struct xe_gt *gt);
|
||||
int xe_gt_record_default_lrcs(struct xe_gt *gt);
|
||||
|
||||
/**
|
||||
|
@ -1543,6 +1543,7 @@ static u64 pf_estimate_fair_lmem(struct xe_gt *gt, unsigned int num_vfs)
|
||||
u64 fair;
|
||||
|
||||
fair = div_u64(available, num_vfs);
|
||||
fair = rounddown_pow_of_two(fair); /* XXX: ttm_vram_mgr & drm_buddy limitation */
|
||||
fair = ALIGN_DOWN(fair, alignment);
|
||||
#ifdef MAX_FAIR_LMEM
|
||||
fair = min_t(u64, MAX_FAIR_LMEM, fair);
|
||||
|
@ -1178,3 +1178,19 @@ void xe_guc_print_info(struct xe_guc *guc, struct drm_printer *p)
|
||||
xe_guc_ct_print(&guc->ct, p, false);
|
||||
xe_guc_submit_print(guc, p);
|
||||
}
|
||||
|
||||
/**
|
||||
* xe_guc_declare_wedged() - Declare GuC wedged
|
||||
* @guc: the GuC object
|
||||
*
|
||||
* Wedge the GuC which stops all submission, saves desired debug state, and
|
||||
* cleans up anything which could timeout.
|
||||
*/
|
||||
void xe_guc_declare_wedged(struct xe_guc *guc)
|
||||
{
|
||||
xe_gt_assert(guc_to_gt(guc), guc_to_xe(guc)->wedged.mode);
|
||||
|
||||
xe_guc_reset_prepare(guc);
|
||||
xe_guc_ct_stop(&guc->ct);
|
||||
xe_guc_submit_wedge(guc);
|
||||
}
|
||||
|
@ -37,6 +37,7 @@ void xe_guc_reset_wait(struct xe_guc *guc);
|
||||
void xe_guc_stop_prepare(struct xe_guc *guc);
|
||||
void xe_guc_stop(struct xe_guc *guc);
|
||||
int xe_guc_start(struct xe_guc *guc);
|
||||
void xe_guc_declare_wedged(struct xe_guc *guc);
|
||||
|
||||
static inline u16 xe_engine_class_to_guc_class(enum xe_engine_class class)
|
||||
{
|
||||
|
@ -861,13 +861,40 @@ static void xe_guc_exec_queue_trigger_cleanup(struct xe_exec_queue *q)
|
||||
xe_sched_tdr_queue_imm(&q->guc->sched);
|
||||
}
|
||||
|
||||
static bool guc_submit_hint_wedged(struct xe_guc *guc)
|
||||
/**
|
||||
* xe_guc_submit_wedge() - Wedge GuC submission
|
||||
* @guc: the GuC object
|
||||
*
|
||||
* Save exec queue's registered with GuC state by taking a ref to each queue.
|
||||
* Register a DRMM handler to drop refs upon driver unload.
|
||||
*/
|
||||
void xe_guc_submit_wedge(struct xe_guc *guc)
|
||||
{
|
||||
struct xe_device *xe = guc_to_xe(guc);
|
||||
struct xe_exec_queue *q;
|
||||
unsigned long index;
|
||||
int err;
|
||||
|
||||
xe_gt_assert(guc_to_gt(guc), guc_to_xe(guc)->wedged.mode);
|
||||
|
||||
err = drmm_add_action_or_reset(&guc_to_xe(guc)->drm,
|
||||
guc_submit_wedged_fini, guc);
|
||||
if (err) {
|
||||
drm_err(&xe->drm, "Failed to register xe_guc_submit clean-up on wedged.mode=2. Although device is wedged.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
mutex_lock(&guc->submission_state.lock);
|
||||
xa_for_each(&guc->submission_state.exec_queue_lookup, index, q)
|
||||
if (xe_exec_queue_get_unless_zero(q))
|
||||
set_exec_queue_wedged(q);
|
||||
mutex_unlock(&guc->submission_state.lock);
|
||||
}
|
||||
|
||||
static bool guc_submit_hint_wedged(struct xe_guc *guc)
|
||||
{
|
||||
struct xe_device *xe = guc_to_xe(guc);
|
||||
|
||||
if (xe->wedged.mode != 2)
|
||||
return false;
|
||||
|
||||
@ -876,22 +903,6 @@ static bool guc_submit_hint_wedged(struct xe_guc *guc)
|
||||
|
||||
xe_device_declare_wedged(xe);
|
||||
|
||||
xe_guc_submit_reset_prepare(guc);
|
||||
xe_guc_ct_stop(&guc->ct);
|
||||
|
||||
err = drmm_add_action_or_reset(&guc_to_xe(guc)->drm,
|
||||
guc_submit_wedged_fini, guc);
|
||||
if (err) {
|
||||
drm_err(&xe->drm, "Failed to register xe_guc_submit clean-up on wedged.mode=2. Although device is wedged.\n");
|
||||
return true; /* Device is wedged anyway */
|
||||
}
|
||||
|
||||
mutex_lock(&guc->submission_state.lock);
|
||||
xa_for_each(&guc->submission_state.exec_queue_lookup, index, q)
|
||||
if (xe_exec_queue_get_unless_zero(q))
|
||||
set_exec_queue_wedged(q);
|
||||
mutex_unlock(&guc->submission_state.lock);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -1677,7 +1688,8 @@ int xe_guc_submit_reset_prepare(struct xe_guc *guc)
|
||||
|
||||
void xe_guc_submit_reset_wait(struct xe_guc *guc)
|
||||
{
|
||||
wait_event(guc->ct.wq, !guc_read_stopped(guc));
|
||||
wait_event(guc->ct.wq, xe_device_wedged(guc_to_xe(guc)) ||
|
||||
!guc_read_stopped(guc));
|
||||
}
|
||||
|
||||
void xe_guc_submit_stop(struct xe_guc *guc)
|
||||
|
@ -18,6 +18,7 @@ int xe_guc_submit_reset_prepare(struct xe_guc *guc);
|
||||
void xe_guc_submit_reset_wait(struct xe_guc *guc);
|
||||
void xe_guc_submit_stop(struct xe_guc *guc);
|
||||
int xe_guc_submit_start(struct xe_guc *guc);
|
||||
void xe_guc_submit_wedge(struct xe_guc *guc);
|
||||
|
||||
int xe_guc_sched_done_handler(struct xe_guc *guc, u32 *msg, u32 len);
|
||||
int xe_guc_deregister_done_handler(struct xe_guc *guc, u32 *msg, u32 len);
|
||||
|
@ -300,3 +300,17 @@ void xe_uc_remove(struct xe_uc *uc)
|
||||
{
|
||||
xe_gsc_remove(&uc->gsc);
|
||||
}
|
||||
|
||||
/**
|
||||
* xe_uc_declare_wedged() - Declare UC wedged
|
||||
* @uc: the UC object
|
||||
*
|
||||
* Wedge the UC which stops all submission, saves desired debug state, and
|
||||
* cleans up anything which could timeout.
|
||||
*/
|
||||
void xe_uc_declare_wedged(struct xe_uc *uc)
|
||||
{
|
||||
xe_gt_assert(uc_to_gt(uc), uc_to_xe(uc)->wedged.mode);
|
||||
|
||||
xe_guc_declare_wedged(&uc->guc);
|
||||
}
|
||||
|
@ -21,5 +21,6 @@ int xe_uc_start(struct xe_uc *uc);
|
||||
int xe_uc_suspend(struct xe_uc *uc);
|
||||
int xe_uc_sanitize_reset(struct xe_uc *uc);
|
||||
void xe_uc_remove(struct xe_uc *uc);
|
||||
void xe_uc_declare_wedged(struct xe_uc *uc);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user