mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
amd-drm-next-7.2-2026-05-13:
amdgpu: - Userq fixes - DCN 3.2 fix - RAS fixes - GC 12 fixes - Add PTL support for profiler - SMU multi-msg helpers - OLED fix - Misc cleanups - DC aux transfer refactor - Introduce dc_plane_cm and migrate surface update color path - IPS fixes - DCN 4.2 updates - SR-IOV fixes - Add FRL registers for HDMI 2.1 - NBIO 7.11.4 updates - VPE 2.0 support - Aldebaran SMU update amdkfd: - Add profiler API UAPI: - Add profiler IOCTL Userspace:40abc95a64-----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQQgO5Idg2tXNTSZAr293/aFa7yZ2AUCagUCFQAKCRC93/aFa7yZ 2AaeAQCiVfMIFkyHU98SVciz0ltRWoq4zqH9ahGp+yN7Bwii7AEAnlO8hQOcT2sb pr6flWd0eVYB3wYXJsD91OFPKsHREgQ= =Xb18 -----END PGP SIGNATURE----- Merge tag 'amd-drm-next-7.2-2026-05-13' of https://gitlab.freedesktop.org/agd5f/linux into drm-next amd-drm-next-7.2-2026-05-13: amdgpu: - Userq fixes - DCN 3.2 fix - RAS fixes - GC 12 fixes - Add PTL support for profiler - SMU multi-msg helpers - OLED fix - Misc cleanups - DC aux transfer refactor - Introduce dc_plane_cm and migrate surface update color path - IPS fixes - DCN 4.2 updates - SR-IOV fixes - Add FRL registers for HDMI 2.1 - NBIO 7.11.4 updates - VPE 2.0 support - Aldebaran SMU update amdkfd: - Add profiler API UAPI: - Add profiler IOCTL Userspace:40abc95a64Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexander.deucher@amd.com> Link: https://patch.msgid.link/20260513232911.41274-1-alexander.deucher@amd.com
This commit is contained in:
commit
565626e74d
|
|
@ -23,3 +23,4 @@ Next (GCN), Radeon DNA (RDNA), and Compute DNA (CDNA) architectures.
|
|||
debugfs
|
||||
process-isolation
|
||||
amdgpu-glossary
|
||||
ptl
|
||||
|
|
|
|||
94
Documentation/gpu/amdgpu/ptl.rst
Normal file
94
Documentation/gpu/amdgpu/ptl.rst
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
=======================================
|
||||
Peak Tops Limiter (PTL) sysfs Interface
|
||||
=======================================
|
||||
|
||||
Overview
|
||||
--------
|
||||
The Peak Tops Limiter (PTL) sysfs interface enables users to control and
|
||||
configure the PTL feature for each GPU individually. All PTL-related
|
||||
sysfs files are located under `/sys/class/drm/cardX/device/ptl/`, where
|
||||
`X` is the GPU index. Through these files, users can enable or disable
|
||||
PTL, set preferred data formats, and query supported formats for each GPU.
|
||||
|
||||
PTL sysfs files
|
||||
----------------
|
||||
The following files are available under `/sys/class/drm/cardX/device/ptl/`:
|
||||
|
||||
- `ptl_enable`
|
||||
- `ptl_format`
|
||||
- `ptl_supported_formats`
|
||||
|
||||
PTL Enable/Disable
|
||||
------------------
|
||||
File: `ptl_enable`
|
||||
Type: Read/Write (rw)
|
||||
|
||||
Read: Returns the current PTL status as a string: `enabled` if PTL
|
||||
is active, or `disabled` if inactive.
|
||||
|
||||
Write:
|
||||
|
||||
- Write `1` or `enabled` to enable PTL
|
||||
- Write `0` or `disabled` to disable PTL
|
||||
|
||||
Examples::
|
||||
|
||||
# Query PTL status
|
||||
cat /sys/class/drm/card1/device/ptl/ptl_enable
|
||||
# Output: enabled
|
||||
|
||||
# Enable PTL
|
||||
sudo bash -c "echo 1 > /sys/class/drm/card1/device/ptl/ptl_enable"
|
||||
|
||||
# Disable PTL
|
||||
sudo bash -c "echo 0 > /sys/class/drm/card1/device/ptl/ptl_enable"
|
||||
|
||||
PTL Format (Preferred Data Formats)
|
||||
-----------------------------------
|
||||
File: `ptl_format`
|
||||
Type: Read/Write (rw)
|
||||
|
||||
Read: Returns the two preferred formats, e.g. `I8,F32`.
|
||||
|
||||
Write: Accepts two formats separated by a comma, e.g. `I8,F32`.
|
||||
|
||||
- Both formats must be supported and different.
|
||||
- If an invalid format is provided (not supported, or both formats are the
|
||||
same), the driver will return "write error: Invalid argument".
|
||||
|
||||
Examples::
|
||||
|
||||
# Query PTL formats
|
||||
cat /sys/class/drm/card1/device/ptl/ptl_format
|
||||
# Output: I8,F32
|
||||
|
||||
# Set PTL formats
|
||||
sudo bash -c "echo I8,F32 > /sys/class/drm/card1/device/ptl/ptl_format"
|
||||
|
||||
Supported Formats
|
||||
-----------------
|
||||
File: `ptl_supported_formats`
|
||||
Type: Read-only (r)
|
||||
|
||||
Read: Returns a comma-separated list of supported formats, e.g.
|
||||
`I8,F16,BF16,F32,F64`.
|
||||
|
||||
Example::
|
||||
|
||||
# Check supported formats
|
||||
cat /sys/class/drm/card1/device/ptl/ptl_supported_formats
|
||||
# Output: I8,F16,BF16,F32,F64
|
||||
|
||||
Behavioral Notes
|
||||
----------------
|
||||
- PTL formats can only be set when PTL is enabled.
|
||||
- If PTL is disabled, `ptl_format` returns `N/A`.
|
||||
- Only two formats can be set at a time, and they must be from the supported set and different..
|
||||
- All commands support per-GPU targeting.
|
||||
- Root permission is required to enable/disable PTL or change formats.
|
||||
- If the hardware does not support PTL, the PTL sysfs directory will not
|
||||
be created.
|
||||
|
||||
Implementation
|
||||
--------------
|
||||
The PTL sysfs nodes are implemented in `drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c`.
|
||||
|
|
@ -234,7 +234,8 @@ amdgpu-y += \
|
|||
# add VPE block
|
||||
amdgpu-y += \
|
||||
amdgpu_vpe.o \
|
||||
vpe_v6_1.o
|
||||
vpe_v6_1.o \
|
||||
vpe_v2_0.o
|
||||
|
||||
# add UMSCH block
|
||||
amdgpu-y += \
|
||||
|
|
|
|||
|
|
@ -267,6 +267,7 @@ extern int amdgpu_rebar;
|
|||
|
||||
extern int amdgpu_wbrf;
|
||||
extern int amdgpu_user_queue;
|
||||
extern int amdgpu_ptl;
|
||||
|
||||
extern uint amdgpu_hdmi_hpd_debounce_delay_ms;
|
||||
|
||||
|
|
|
|||
|
|
@ -38,6 +38,8 @@
|
|||
#include "amdgpu_vm.h"
|
||||
#include "amdgpu_xcp.h"
|
||||
#include "kfd_topology.h"
|
||||
#include "amdgpu_ptl.h"
|
||||
|
||||
extern uint64_t amdgpu_amdkfd_total_mem_size;
|
||||
|
||||
enum TLB_FLUSH_TYPE {
|
||||
|
|
@ -434,8 +436,10 @@ int kgd2kfd_check_and_lock_kfd(struct kfd_dev *kfd);
|
|||
void kgd2kfd_unlock_kfd(struct kfd_dev *kfd);
|
||||
int kgd2kfd_start_sched(struct kfd_dev *kfd, uint32_t node_id);
|
||||
int kgd2kfd_start_sched_all_nodes(struct kfd_dev *kfd);
|
||||
int amdgpu_amdkfd_start_sched_all(struct amdgpu_device *adev);
|
||||
int kgd2kfd_stop_sched(struct kfd_dev *kfd, uint32_t node_id);
|
||||
int kgd2kfd_stop_sched_all_nodes(struct kfd_dev *kfd);
|
||||
int amdgpu_amdkfd_stop_sched_all(struct amdgpu_device *adev);
|
||||
bool kgd2kfd_compute_active(struct kfd_dev *kfd, uint32_t node_id);
|
||||
bool kgd2kfd_vmfault_fast_path(struct amdgpu_device *adev, struct amdgpu_iv_entry *entry,
|
||||
bool retry_fault);
|
||||
|
|
@ -532,6 +536,11 @@ static inline int kgd2kfd_start_sched_all_nodes(struct kfd_dev *kfd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int amdgpu_amdkfd_start_sched_all(struct amdgpu_device *adev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int kgd2kfd_stop_sched(struct kfd_dev *kfd, uint32_t node_id)
|
||||
{
|
||||
return 0;
|
||||
|
|
@ -542,6 +551,11 @@ static inline int kgd2kfd_stop_sched_all_nodes(struct kfd_dev *kfd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int amdgpu_amdkfd_stop_sched_all(struct amdgpu_device *adev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline bool kgd2kfd_compute_active(struct kfd_dev *kfd, uint32_t node_id)
|
||||
{
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -520,6 +520,16 @@ static uint32_t kgd_gfx_v9_4_3_hqd_sdma_get_doorbell(struct amdgpu_device *adev,
|
|||
return is_active ? doorbell_off >> 2 : 0;
|
||||
}
|
||||
|
||||
static uint32_t kgd_v9_4_3_ptl_ctrl(struct amdgpu_device *adev,
|
||||
uint32_t cmd,
|
||||
uint32_t *ptl_state,
|
||||
enum amdgpu_ptl_fmt *fmt1,
|
||||
enum amdgpu_ptl_fmt *fmt2)
|
||||
{
|
||||
return amdgpu_ptl_perf_monitor_ctrl(adev, cmd,
|
||||
ptl_state, fmt1, fmt2);
|
||||
}
|
||||
|
||||
const struct kfd2kgd_calls gc_9_4_3_kfd2kgd = {
|
||||
.program_sh_mem_settings = kgd_gfx_v9_program_sh_mem_settings,
|
||||
.set_pasid_vmid_mapping = kgd_gfx_v9_4_3_set_pasid_vmid_mapping,
|
||||
|
|
@ -555,5 +565,6 @@ const struct kfd2kgd_calls gc_9_4_3_kfd2kgd = {
|
|||
.clear_address_watch = kgd_gfx_v9_4_3_clear_address_watch,
|
||||
.hqd_get_pq_addr = kgd_gfx_v9_hqd_get_pq_addr,
|
||||
.hqd_reset = kgd_gfx_v9_hqd_reset,
|
||||
.hqd_sdma_get_doorbell = kgd_gfx_v9_4_3_hqd_sdma_get_doorbell
|
||||
.hqd_sdma_get_doorbell = kgd_gfx_v9_4_3_hqd_sdma_get_doorbell,
|
||||
.ptl_ctrl = kgd_v9_4_3_ptl_ctrl
|
||||
};
|
||||
|
|
|
|||
|
|
@ -2049,7 +2049,7 @@ static int amdgpu_debugfs_ib_preempt(void *data, u64 val)
|
|||
/* swap out the old fences */
|
||||
amdgpu_ib_preempt_fences_swap(ring, fences);
|
||||
|
||||
amdgpu_fence_driver_force_completion(ring);
|
||||
amdgpu_fence_driver_force_completion(ring, NULL);
|
||||
|
||||
/* resubmit unfinished jobs */
|
||||
amdgpu_ib_preempt_job_recovery(&ring->sched);
|
||||
|
|
|
|||
|
|
@ -3647,6 +3647,7 @@ static int amdgpu_device_sys_interface_init(struct amdgpu_device *adev)
|
|||
amdgpu_reg_state_sysfs_init(adev);
|
||||
amdgpu_xcp_sysfs_init(adev);
|
||||
amdgpu_uma_sysfs_init(adev);
|
||||
amdgpu_ptl_sysfs_init(adev);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
@ -3663,6 +3664,7 @@ static void amdgpu_device_sys_interface_fini(struct amdgpu_device *adev)
|
|||
amdgpu_reg_state_sysfs_fini(adev);
|
||||
amdgpu_xcp_sysfs_fini(adev);
|
||||
amdgpu_uma_sysfs_fini(adev);
|
||||
amdgpu_ptl_sysfs_fini(adev);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -3731,6 +3733,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
|
|||
mutex_init(&adev->virt.vf_errors.lock);
|
||||
hash_init(adev->mn_hash);
|
||||
mutex_init(&adev->psp.mutex);
|
||||
mutex_init(&adev->psp.ptl.mutex);
|
||||
mutex_init(&adev->notifier_lock);
|
||||
mutex_init(&adev->pm.stable_pstate_ctx_lock);
|
||||
mutex_init(&adev->benchmark_mutex);
|
||||
|
|
@ -5090,6 +5093,7 @@ int amdgpu_device_pre_asic_reset(struct amdgpu_device *adev,
|
|||
{
|
||||
int i, r = 0;
|
||||
struct amdgpu_job *job = NULL;
|
||||
struct dma_fence *fence = NULL;
|
||||
struct amdgpu_device *tmp_adev = reset_context->reset_req_dev;
|
||||
bool need_full_reset =
|
||||
test_bit(AMDGPU_NEED_FULL_RESET, &reset_context->flags);
|
||||
|
|
@ -5102,6 +5106,9 @@ int amdgpu_device_pre_asic_reset(struct amdgpu_device *adev,
|
|||
|
||||
amdgpu_fence_driver_isr_toggle(adev, true);
|
||||
|
||||
if (job)
|
||||
fence = &job->hw_fence->base;
|
||||
|
||||
/* block all schedulers and reset given job's ring */
|
||||
for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
|
||||
struct amdgpu_ring *ring = adev->rings[i];
|
||||
|
|
@ -5110,7 +5117,7 @@ int amdgpu_device_pre_asic_reset(struct amdgpu_device *adev,
|
|||
continue;
|
||||
|
||||
/* after all hw jobs are reset, hw fence is meaningless, so force_completion */
|
||||
amdgpu_fence_driver_force_completion(ring);
|
||||
amdgpu_fence_driver_force_completion(ring, fence);
|
||||
}
|
||||
|
||||
amdgpu_fence_driver_isr_toggle(adev, false);
|
||||
|
|
|
|||
|
|
@ -2738,6 +2738,9 @@ static int amdgpu_discovery_set_vpe_ip_blocks(struct amdgpu_device *adev)
|
|||
case IP_VERSION(6, 1, 3):
|
||||
amdgpu_device_ip_block_add(adev, &vpe_v6_1_ip_block);
|
||||
break;
|
||||
case IP_VERSION(2, 0, 0):
|
||||
amdgpu_device_ip_block_add(adev, &vpe_v2_0_ip_block);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -246,6 +246,7 @@ int amdgpu_umsch_mm_fwlog;
|
|||
int amdgpu_rebar = -1; /* auto */
|
||||
int amdgpu_user_queue = -1;
|
||||
uint amdgpu_hdmi_hpd_debounce_delay_ms;
|
||||
int amdgpu_ptl = -1; /* auto */
|
||||
|
||||
DECLARE_DYNDBG_CLASSMAP(drm_debug_classes, DD_CLASS_TYPE_DISJOINT_BITS, 0,
|
||||
"DRM_UT_CORE",
|
||||
|
|
@ -1112,6 +1113,18 @@ module_param_named(user_queue, amdgpu_user_queue, int, 0444);
|
|||
MODULE_PARM_DESC(hdmi_hpd_debounce_delay_ms, "HDMI HPD disconnect debounce delay in milliseconds (0 to disable (by default), 1500 is common)");
|
||||
module_param_named(hdmi_hpd_debounce_delay_ms, amdgpu_hdmi_hpd_debounce_delay_ms, uint, 0644);
|
||||
|
||||
/**
|
||||
* DOC: ptl (int)
|
||||
* Enable PTL feature at boot time. Possible values:
|
||||
*
|
||||
* - -1 = auto (ASIC specific default)
|
||||
* - 0 = disable PTL (default)
|
||||
* - 1 = enable PTL
|
||||
* - 2 = permanently disable PTL (cannot be re-enabled at runtime)
|
||||
*/
|
||||
MODULE_PARM_DESC(ptl, "Enable PTL (-1 = auto, 0 = disable (default), 1 = enable, 2 = permanently disable)");
|
||||
module_param_named(ptl, amdgpu_ptl, int, 0444);
|
||||
|
||||
/* These devices are not supported by amdgpu.
|
||||
* They are supported by the mach64, r128, radeon drivers
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -547,7 +547,7 @@ void amdgpu_fence_driver_hw_fini(struct amdgpu_device *adev)
|
|||
r = -ENODEV;
|
||||
/* no need to trigger GPU reset as we are unloading */
|
||||
if (r)
|
||||
amdgpu_fence_driver_force_completion(ring);
|
||||
amdgpu_fence_driver_force_completion(ring, NULL);
|
||||
|
||||
if (!drm_dev_is_unplugged(adev_to_drm(adev)) &&
|
||||
ring->fence_drv.irq_src &&
|
||||
|
|
@ -662,16 +662,34 @@ void amdgpu_fence_driver_set_error(struct amdgpu_ring *ring, int error)
|
|||
* amdgpu_fence_driver_force_completion - force signal latest fence of ring
|
||||
*
|
||||
* @ring: fence of the ring to signal
|
||||
* @timedout_fence: fence of the timedout job
|
||||
*
|
||||
*/
|
||||
void amdgpu_fence_driver_force_completion(struct amdgpu_ring *ring)
|
||||
void amdgpu_fence_driver_force_completion(struct amdgpu_ring *ring,
|
||||
struct dma_fence *timedout_fence)
|
||||
{
|
||||
amdgpu_fence_driver_set_error(ring, -ECANCELED);
|
||||
struct amdgpu_fence_driver *drv = &ring->fence_drv;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&drv->lock, flags);
|
||||
for (unsigned int i = 0; i <= drv->num_fences_mask; ++i) {
|
||||
struct dma_fence *fence;
|
||||
|
||||
fence = rcu_dereference_protected(drv->fences[i],
|
||||
lockdep_is_held(&drv->lock));
|
||||
if (fence && !dma_fence_is_signaled_locked(fence)) {
|
||||
if (fence == timedout_fence)
|
||||
dma_fence_set_error(fence, -ETIME);
|
||||
else
|
||||
dma_fence_set_error(fence, -ECANCELED);
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&drv->lock, flags);
|
||||
|
||||
amdgpu_fence_write(ring, ring->fence_drv.sync_seq);
|
||||
amdgpu_fence_process(ring);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Kernel queue reset handling
|
||||
*
|
||||
|
|
|
|||
|
|
@ -52,6 +52,17 @@ static int psp_load_smu_fw(struct psp_context *psp);
|
|||
static int psp_rap_terminate(struct psp_context *psp);
|
||||
static int psp_securedisplay_terminate(struct psp_context *psp);
|
||||
|
||||
static const char * const amdgpu_ptl_fmt_str[] = {
|
||||
[AMDGPU_PTL_FMT_I8] = "I8",
|
||||
[AMDGPU_PTL_FMT_F16] = "F16",
|
||||
[AMDGPU_PTL_FMT_BF16] = "BF16",
|
||||
[AMDGPU_PTL_FMT_F32] = "F32",
|
||||
[AMDGPU_PTL_FMT_F64] = "F64",
|
||||
[AMDGPU_PTL_FMT_F8] = "F8",
|
||||
[AMDGPU_PTL_FMT_VECTOR] = "VECTOR",
|
||||
[AMDGPU_PTL_FMT_INVALID] = "INVALID",
|
||||
};
|
||||
|
||||
static int psp_ring_init(struct psp_context *psp,
|
||||
enum psp_ring_type ring_type)
|
||||
{
|
||||
|
|
@ -682,6 +693,8 @@ static const char *psp_gfx_cmd_name(enum psp_gfx_cmd_id cmd_id)
|
|||
return "SPATIAL_PARTITION";
|
||||
case GFX_CMD_ID_FB_NPS_MODE:
|
||||
return "NPS_MODE_CHANGE";
|
||||
case GFX_CMD_ID_PERF_HW:
|
||||
return "PERF MONITORING HW";
|
||||
default:
|
||||
return "UNKNOWN CMD";
|
||||
}
|
||||
|
|
@ -1201,6 +1214,369 @@ int psp_memory_partition(struct psp_context *psp, int mode)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int psp_ptl_fmt_verify(struct psp_context *psp, enum amdgpu_ptl_fmt fmt,
|
||||
uint32_t *ptl_fmt)
|
||||
{
|
||||
struct amdgpu_device *adev = psp->adev;
|
||||
|
||||
if (amdgpu_ip_version(adev, GC_HWIP, 0) != IP_VERSION(9, 4, 4))
|
||||
return -EINVAL;
|
||||
|
||||
switch (fmt) {
|
||||
case AMDGPU_PTL_FMT_I8:
|
||||
*ptl_fmt = GFX_FTYPE_I8;
|
||||
break;
|
||||
case AMDGPU_PTL_FMT_F16:
|
||||
*ptl_fmt = GFX_FTYPE_F16;
|
||||
break;
|
||||
case AMDGPU_PTL_FMT_BF16:
|
||||
*ptl_fmt = GFX_FTYPE_BF16;
|
||||
break;
|
||||
case AMDGPU_PTL_FMT_F32:
|
||||
*ptl_fmt = GFX_FTYPE_F32;
|
||||
break;
|
||||
case AMDGPU_PTL_FMT_F64:
|
||||
*ptl_fmt = GFX_FTYPE_F64;
|
||||
break;
|
||||
case AMDGPU_PTL_FMT_F8:
|
||||
*ptl_fmt = GFX_FTYPE_F8;
|
||||
break;
|
||||
case AMDGPU_PTL_FMT_VECTOR:
|
||||
*ptl_fmt = GFX_FTYPE_VECTOR;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int psp_ptl_invoke(struct psp_context *psp, u32 req_code,
|
||||
uint32_t *ptl_state, uint32_t *fmt1, uint32_t *fmt2)
|
||||
{
|
||||
struct psp_gfx_cmd_resp *cmd;
|
||||
struct amdgpu_ptl *ptl = &psp->ptl;
|
||||
int ret;
|
||||
|
||||
cmd = acquire_psp_cmd_buf(psp);
|
||||
|
||||
cmd->cmd_id = GFX_CMD_ID_PERF_HW;
|
||||
cmd->cmd.cmd_req_perf_hw.req = req_code;
|
||||
cmd->cmd.cmd_req_perf_hw.ptl_state = *ptl_state;
|
||||
cmd->cmd.cmd_req_perf_hw.pref_format1 = *fmt1;
|
||||
cmd->cmd.cmd_req_perf_hw.pref_format2 = *fmt2;
|
||||
|
||||
ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Check response status explicitly to avoid
|
||||
* updating cached PTL state with invalid data.
|
||||
*/
|
||||
if (cmd->resp.status) {
|
||||
dev_err(psp->adev->dev,
|
||||
"PTL command 0x%x failed, PSP response status: 0x%X fw resp=0x%X\n",
|
||||
req_code, cmd->resp.status,
|
||||
cmd->resp.uresp.perf_hw_info.resp);
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Parse response */
|
||||
switch (req_code) {
|
||||
case PSP_PTL_PERF_MON_QUERY:
|
||||
*ptl_state = cmd->resp.uresp.perf_hw_info.ptl_state;
|
||||
*fmt1 = cmd->resp.uresp.perf_hw_info.pref_format1;
|
||||
*fmt2 = cmd->resp.uresp.perf_hw_info.pref_format2;
|
||||
dev_dbg(psp->adev->dev, "PTL query: state=%d, fmt1=%d, fmt2=%d\n",
|
||||
*ptl_state, *fmt1, *fmt2);
|
||||
break;
|
||||
case PSP_PTL_PERF_MON_SET:
|
||||
/* Update cached state only on success */
|
||||
ptl->enabled = *ptl_state;
|
||||
ptl->fmt1 = *fmt1;
|
||||
ptl->fmt2 = *fmt2;
|
||||
dev_dbg(psp->adev->dev, "PTL set: state=%d, fmt1=%d, fmt2=%d\n",
|
||||
*ptl_state, *fmt1, *fmt2);
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
release_psp_cmd_buf(psp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int amdgpu_ptl_perf_monitor_ctrl(struct amdgpu_device *adev, u32 req_code,
|
||||
uint32_t *ptl_state,
|
||||
enum amdgpu_ptl_fmt *fmt1,
|
||||
enum amdgpu_ptl_fmt *fmt2)
|
||||
{
|
||||
uint32_t ptl_fmt1, ptl_fmt2;
|
||||
struct psp_context *psp;
|
||||
struct amdgpu_ptl *ptl;
|
||||
int ret;
|
||||
|
||||
if (!adev || !ptl_state || !fmt1 || !fmt2)
|
||||
return -EINVAL;
|
||||
|
||||
if (amdgpu_sriov_vf(adev))
|
||||
return 0;
|
||||
|
||||
psp = &adev->psp;
|
||||
ptl = &psp->ptl;
|
||||
|
||||
if (ptl->permanently_disabled && *ptl_state == 1)
|
||||
return 0;
|
||||
|
||||
if (amdgpu_ip_version(adev, GC_HWIP, 0) != IP_VERSION(9, 4, 4) ||
|
||||
psp->sos.fw_version < 0x0036081a)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* Verify formats */
|
||||
if (psp_ptl_fmt_verify(psp, *fmt1, &ptl_fmt1) ||
|
||||
psp_ptl_fmt_verify(psp, *fmt2, &ptl_fmt2))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Add check to skip if state and formats are identical to current ones
|
||||
*/
|
||||
if (req_code == PSP_PTL_PERF_MON_SET &&
|
||||
ptl->enabled == *ptl_state &&
|
||||
ptl->fmt1 == ptl_fmt1 &&
|
||||
ptl->fmt2 == ptl_fmt2)
|
||||
return 0;
|
||||
|
||||
/* If enabling PTL, check disable bitmap */
|
||||
if (req_code == PSP_PTL_PERF_MON_SET && *ptl_state == 1) {
|
||||
if (!bitmap_empty(ptl->disable_bitmap,
|
||||
AMDGPU_PTL_DISABLE_MAX)) {
|
||||
dev_dbg(adev->dev,
|
||||
"PTL enable blocked: SYSFS=%d, PROFILER=%d (ref=%d)\n",
|
||||
test_bit(AMDGPU_PTL_DISABLE_SYSFS,
|
||||
ptl->disable_bitmap),
|
||||
test_bit(AMDGPU_PTL_DISABLE_PROFILER,
|
||||
ptl->disable_bitmap),
|
||||
atomic_read(&ptl->disable_ref));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (req_code == PSP_PTL_PERF_MON_SET) {
|
||||
amdgpu_amdkfd_stop_sched_all(adev);
|
||||
/* Wait for GFX engine idle before PTL state transition */
|
||||
ret = amdgpu_device_ip_wait_for_idle(adev,
|
||||
AMD_IP_BLOCK_TYPE_GFX);
|
||||
if (ret) {
|
||||
amdgpu_amdkfd_start_sched_all(adev);
|
||||
dev_err(adev->dev, "GFX not idle before PTL operation (%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
ret = psp_ptl_invoke(psp, req_code, ptl_state, &ptl_fmt1, &ptl_fmt2);
|
||||
amdgpu_amdkfd_start_sched_all(adev);
|
||||
} else {
|
||||
ret = psp_ptl_invoke(psp, req_code, ptl_state, &ptl_fmt1, &ptl_fmt2);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static enum amdgpu_ptl_fmt str_to_ptl_fmt(const char *str)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < AMDGPU_PTL_FMT_INVALID; ++i) {
|
||||
if (!strcmp(str, amdgpu_ptl_fmt_str[i]))
|
||||
return (enum amdgpu_ptl_fmt)i;
|
||||
}
|
||||
|
||||
return AMDGPU_PTL_FMT_INVALID;
|
||||
}
|
||||
|
||||
static ssize_t ptl_supported_formats_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
ssize_t len = 0;
|
||||
|
||||
for (int i = 0; i < AMDGPU_PTL_FMT_INVALID; ++i) {
|
||||
const char *fmt = amdgpu_ptl_fmt_str[i];
|
||||
|
||||
len += sysfs_emit_at(buf, len, "%s%s",
|
||||
fmt ? fmt : "UNKNOWN",
|
||||
(i < AMDGPU_PTL_FMT_INVALID - 1) ? "," : "\n");
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static ssize_t ptl_enable_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct drm_device *ddev = dev_get_drvdata(dev);
|
||||
struct amdgpu_device *adev = drm_to_adev(ddev);
|
||||
struct amdgpu_ptl *ptl = &adev->psp.ptl;
|
||||
uint32_t ptl_state, fmt1, fmt2;
|
||||
int ret;
|
||||
bool enable;
|
||||
bool bit_changed = false;
|
||||
|
||||
mutex_lock(&ptl->mutex);
|
||||
if (sysfs_streq(buf, "enabled") || sysfs_streq(buf, "1")) {
|
||||
enable = true;
|
||||
} else if (sysfs_streq(buf, "disabled") || sysfs_streq(buf, "0")) {
|
||||
enable = false;
|
||||
} else {
|
||||
mutex_unlock(&ptl->mutex);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Block enable when permanently disabled */
|
||||
if (ptl->permanently_disabled) {
|
||||
mutex_unlock(&ptl->mutex);
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
fmt1 = ptl->fmt1;
|
||||
fmt2 = ptl->fmt2;
|
||||
ptl_state = enable ? 1 : 0;
|
||||
|
||||
if (enable)
|
||||
bit_changed = test_and_clear_bit(AMDGPU_PTL_DISABLE_SYSFS,
|
||||
ptl->disable_bitmap);
|
||||
|
||||
ret = amdgpu_ptl_perf_monitor_ctrl(adev, PSP_PTL_PERF_MON_SET, &ptl_state, &fmt1, &fmt2);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "Failed to set PTL err = %d\n", ret);
|
||||
if (enable && bit_changed)
|
||||
set_bit(AMDGPU_PTL_DISABLE_SYSFS, ptl->disable_bitmap);
|
||||
mutex_unlock(&ptl->mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!enable)
|
||||
set_bit(AMDGPU_PTL_DISABLE_SYSFS, ptl->disable_bitmap);
|
||||
|
||||
mutex_unlock(&ptl->mutex);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t ptl_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct drm_device *ddev = dev_get_drvdata(dev);
|
||||
struct amdgpu_device *adev = drm_to_adev(ddev);
|
||||
struct amdgpu_ptl *ptl = &adev->psp.ptl;
|
||||
|
||||
if (ptl->permanently_disabled)
|
||||
return sysfs_emit(buf, "permanently disabled\n");
|
||||
|
||||
return sysfs_emit(buf, "%s\n", ptl->enabled ? "enabled" : "disabled");
|
||||
}
|
||||
|
||||
static ssize_t ptl_format_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct drm_device *ddev = dev_get_drvdata(dev);
|
||||
struct amdgpu_device *adev = drm_to_adev(ddev);
|
||||
char fmt1_str[8], fmt2_str[8];
|
||||
enum amdgpu_ptl_fmt fmt1_enum, fmt2_enum;
|
||||
struct amdgpu_ptl *ptl = &adev->psp.ptl;
|
||||
uint32_t ptl_state, fmt1, fmt2;
|
||||
int ret;
|
||||
|
||||
/* Only allow format update when PTL is enabled */
|
||||
if (!ptl->enabled)
|
||||
return -EPERM;
|
||||
|
||||
mutex_lock(&ptl->mutex);
|
||||
/* Parse input, expecting "FMT1,FMT2" */
|
||||
if (sscanf(buf, "%7[^,],%7s", fmt1_str, fmt2_str) != 2) {
|
||||
mutex_unlock(&ptl->mutex);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
fmt1_enum = str_to_ptl_fmt(fmt1_str);
|
||||
fmt2_enum = str_to_ptl_fmt(fmt2_str);
|
||||
|
||||
if (fmt1_enum >= AMDGPU_PTL_FMT_INVALID ||
|
||||
fmt2_enum >= AMDGPU_PTL_FMT_INVALID ||
|
||||
fmt1_enum == fmt2_enum) {
|
||||
mutex_unlock(&ptl->mutex);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ptl_state = ptl->enabled;
|
||||
fmt1 = fmt1_enum;
|
||||
fmt2 = fmt2_enum;
|
||||
ret = amdgpu_ptl_perf_monitor_ctrl(adev, PSP_PTL_PERF_MON_SET, &ptl_state, &fmt1, &fmt2);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "Failed to update PTL err = %d\n", ret);
|
||||
mutex_unlock(&ptl->mutex);
|
||||
return ret;
|
||||
}
|
||||
mutex_unlock(&ptl->mutex);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t ptl_format_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct drm_device *ddev = dev_get_drvdata(dev);
|
||||
struct amdgpu_device *adev = drm_to_adev(ddev);
|
||||
struct psp_context *psp = &adev->psp;
|
||||
|
||||
return sysfs_emit(buf, "%s,%s\n",
|
||||
amdgpu_ptl_fmt_str[psp->ptl.fmt1],
|
||||
amdgpu_ptl_fmt_str[psp->ptl.fmt2]);
|
||||
}
|
||||
|
||||
static umode_t amdgpu_ptl_is_visible(struct kobject *kobj, struct attribute *attr, int idx)
|
||||
{
|
||||
struct device *dev = kobj_to_dev(kobj);
|
||||
struct drm_device *ddev = dev_get_drvdata(dev);
|
||||
struct amdgpu_device *adev = drm_to_adev(ddev);
|
||||
|
||||
/* Only show PTL sysfs files if PTL hardware is supported */
|
||||
if (!adev->psp.ptl.hw_supported)
|
||||
return 0;
|
||||
|
||||
return attr->mode;
|
||||
}
|
||||
|
||||
int amdgpu_ptl_sysfs_init(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_ptl *ptl = &adev->psp.ptl;
|
||||
int ret;
|
||||
|
||||
if (!ptl->hw_supported)
|
||||
return 0;
|
||||
|
||||
if (ptl->ptl_sysfs_created)
|
||||
return 0;
|
||||
|
||||
ret = sysfs_create_group(&adev->dev->kobj, &amdgpu_ptl_attr_group);
|
||||
if (!ret)
|
||||
ptl->ptl_sysfs_created = true;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void amdgpu_ptl_sysfs_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_ptl *ptl = &adev->psp.ptl;
|
||||
|
||||
if (!ptl->hw_supported)
|
||||
return;
|
||||
|
||||
if (!ptl->ptl_sysfs_created)
|
||||
return;
|
||||
|
||||
sysfs_remove_group(&adev->dev->kobj, &amdgpu_ptl_attr_group);
|
||||
ptl->ptl_sysfs_created = false;
|
||||
}
|
||||
|
||||
int psp_spatial_partition(struct psp_context *psp, int mode)
|
||||
{
|
||||
struct psp_gfx_cmd_resp *cmd;
|
||||
|
|
@ -4207,6 +4583,31 @@ void psp_copy_fw(struct psp_context *psp, uint8_t *start_addr, uint32_t bin_size
|
|||
static DEVICE_ATTR(usbc_pd_fw, 0644,
|
||||
psp_usbc_pd_fw_sysfs_read,
|
||||
psp_usbc_pd_fw_sysfs_write);
|
||||
/**
|
||||
* DOC: PTL sysfs attributes
|
||||
* These sysfs files under /sys/class/drm/cardX/device/ptl allow users to enable or disable
|
||||
* the Peak Tops Limiter (PTL), configure preferred PTL data formats, and query supported
|
||||
* formats for each GPU.
|
||||
*/
|
||||
static DEVICE_ATTR(ptl_enable, 0644,
|
||||
ptl_enable_show, ptl_enable_store);
|
||||
static DEVICE_ATTR(ptl_format, 0644,
|
||||
ptl_format_show, ptl_format_store);
|
||||
static DEVICE_ATTR(ptl_supported_formats, 0444,
|
||||
ptl_supported_formats_show, NULL);
|
||||
|
||||
static struct attribute *ptl_attrs[] = {
|
||||
&dev_attr_ptl_enable.attr,
|
||||
&dev_attr_ptl_format.attr,
|
||||
&dev_attr_ptl_supported_formats.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const struct attribute_group amdgpu_ptl_attr_group = {
|
||||
.name = "ptl",
|
||||
.attrs = ptl_attrs,
|
||||
.is_visible = amdgpu_ptl_is_visible,
|
||||
};
|
||||
|
||||
int is_psp_fw_valid(struct psp_bin_desc bin)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -31,6 +31,8 @@
|
|||
#include "ta_ras_if.h"
|
||||
#include "ta_rap_if.h"
|
||||
#include "ta_secureDisplay_if.h"
|
||||
#include <linux/bitops.h>
|
||||
#include "amdgpu_ptl.h"
|
||||
|
||||
#define PSP_FENCE_BUFFER_SIZE 0x1000
|
||||
#define PSP_CMD_BUFFER_SIZE 0x1000
|
||||
|
|
@ -358,6 +360,29 @@ struct spirom_bo {
|
|||
};
|
||||
#endif
|
||||
|
||||
enum psp_ptl_cmd {
|
||||
PSP_PTL_PERF_MON_QUERY = 0xA0000000,
|
||||
PSP_PTL_PERF_MON_SET = 0xA0000001,
|
||||
};
|
||||
|
||||
enum psp_ptl_format_type {
|
||||
GFX_FTYPE_I8 = 0x00000000,
|
||||
GFX_FTYPE_F16 = 0x00000001,
|
||||
GFX_FTYPE_BF16 = 0x00000002,
|
||||
GFX_FTYPE_F32 = 0x00000003,
|
||||
GFX_FTYPE_F64 = 0x00000004,
|
||||
GFX_FTYPE_F8 = 0x00000005,
|
||||
GFX_FTYPE_VECTOR = 0x00000006,
|
||||
GFX_FTYPE_INVALID = 0xFFFFFFFF,
|
||||
};
|
||||
|
||||
struct psp_ptl_perf_req {
|
||||
enum psp_ptl_cmd req;
|
||||
uint32_t ptl_state;
|
||||
uint32_t pref_format1;
|
||||
uint32_t pref_format2;
|
||||
};
|
||||
|
||||
struct psp_context {
|
||||
struct amdgpu_device *adev;
|
||||
struct psp_ring km_ring;
|
||||
|
|
@ -448,6 +473,7 @@ struct psp_context {
|
|||
#if defined(CONFIG_DEBUG_FS)
|
||||
struct spirom_bo *spirom_dump_trip;
|
||||
#endif
|
||||
struct amdgpu_ptl ptl;
|
||||
};
|
||||
|
||||
struct amdgpu_psp_funcs {
|
||||
|
|
@ -631,5 +657,4 @@ void amdgpu_psp_debugfs_init(struct amdgpu_device *adev);
|
|||
int amdgpu_psp_get_fw_type(struct amdgpu_firmware_info *ucode,
|
||||
enum psp_gfx_fw_type *type);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -90,6 +90,7 @@ static int amdgpu_reset_xgmi_reset_on_init_restore_hwctxt(
|
|||
kgd2kfd_init_zone_device(tmp_adev);
|
||||
amdgpu_amdkfd_device_init(tmp_adev);
|
||||
amdgpu_amdkfd_drm_client_create(tmp_adev);
|
||||
amdgpu_ptl_sysfs_init(tmp_adev);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -552,8 +552,9 @@ static ssize_t amdgpu_debugfs_ring_read(struct file *f, char __user *buf,
|
|||
size_t size, loff_t *pos)
|
||||
{
|
||||
struct amdgpu_ring *ring = file_inode(f)->i_private;
|
||||
uint32_t value, result, early[3];
|
||||
u32 value, result, early[3] = { 0 };
|
||||
uint64_t p;
|
||||
u32 avail_dw, start_dw, read_dw;
|
||||
loff_t i;
|
||||
int r;
|
||||
|
||||
|
|
@ -565,10 +566,10 @@ static ssize_t amdgpu_debugfs_ring_read(struct file *f, char __user *buf,
|
|||
|
||||
result = 0;
|
||||
|
||||
if (*pos < 12) {
|
||||
if (ring->funcs->type == AMDGPU_RING_TYPE_CPER)
|
||||
mutex_lock(&ring->adev->cper.ring_lock);
|
||||
if (ring->funcs->type == AMDGPU_RING_TYPE_CPER)
|
||||
mutex_lock(&ring->adev->cper.ring_lock);
|
||||
|
||||
if (*pos < 12) {
|
||||
early[0] = amdgpu_ring_get_rptr(ring) & ring->buf_mask;
|
||||
early[1] = amdgpu_ring_get_wptr(ring) & ring->buf_mask;
|
||||
early[2] = ring->wptr & ring->buf_mask;
|
||||
|
|
@ -600,13 +601,24 @@ static ssize_t amdgpu_debugfs_ring_read(struct file *f, char __user *buf,
|
|||
*pos += 4;
|
||||
}
|
||||
} else {
|
||||
early[0] = amdgpu_ring_get_rptr(ring) & ring->buf_mask;
|
||||
early[1] = amdgpu_ring_get_wptr(ring) & ring->buf_mask;
|
||||
|
||||
p = early[0];
|
||||
if (early[0] <= early[1])
|
||||
size = (early[1] - early[0]);
|
||||
avail_dw = early[1] - early[0];
|
||||
else
|
||||
size = ring->ring_size - (early[0] - early[1]);
|
||||
avail_dw = ring->buf_mask + 1 - (early[0] - early[1]);
|
||||
|
||||
while (size) {
|
||||
start_dw = (*pos > 12) ? ((*pos - 12) >> 2) : 0;
|
||||
if (start_dw >= avail_dw)
|
||||
goto out;
|
||||
|
||||
p = (p + start_dw) & ring->ptr_mask;
|
||||
avail_dw -= start_dw;
|
||||
read_dw = min_t(u32, avail_dw, size >> 2);
|
||||
|
||||
while (read_dw) {
|
||||
if (p == early[1])
|
||||
goto out;
|
||||
|
||||
|
|
@ -619,9 +631,10 @@ static ssize_t amdgpu_debugfs_ring_read(struct file *f, char __user *buf,
|
|||
|
||||
buf += 4;
|
||||
result += 4;
|
||||
size--;
|
||||
read_dw--;
|
||||
p++;
|
||||
p &= ring->ptr_mask;
|
||||
*pos += 4;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -159,7 +159,8 @@ struct amdgpu_fence {
|
|||
extern const struct drm_sched_backend_ops amdgpu_sched_ops;
|
||||
|
||||
void amdgpu_fence_driver_set_error(struct amdgpu_ring *ring, int error);
|
||||
void amdgpu_fence_driver_force_completion(struct amdgpu_ring *ring);
|
||||
void amdgpu_fence_driver_force_completion(struct amdgpu_ring *ring,
|
||||
struct dma_fence *timedout_fence);
|
||||
void amdgpu_ring_set_fence_errors_and_reemit(struct amdgpu_ring *ring,
|
||||
struct amdgpu_fence *guilty_fence);
|
||||
|
||||
|
|
|
|||
|
|
@ -600,10 +600,10 @@ int amdgpu_sdma_reset_engine(struct amdgpu_device *adev, uint32_t instance_id,
|
|||
* to be submitted to the queues after the reset is complete.
|
||||
*/
|
||||
if (!ret) {
|
||||
amdgpu_fence_driver_force_completion(gfx_ring);
|
||||
amdgpu_fence_driver_force_completion(gfx_ring, NULL);
|
||||
drm_sched_wqueue_start(&gfx_ring->sched);
|
||||
if (adev->sdma.has_page_queue) {
|
||||
amdgpu_fence_driver_force_completion(page_ring);
|
||||
amdgpu_fence_driver_force_completion(page_ring, NULL);
|
||||
drm_sched_wqueue_start(&page_ring->sched);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -106,9 +106,6 @@ amdgpu_userq_detect_and_reset_queues(struct amdgpu_userq_mgr *uq_mgr)
|
|||
int r = 0;
|
||||
int i;
|
||||
|
||||
/* Warning if current process mutex is not held */
|
||||
WARN_ON(!mutex_is_locked(&uq_mgr->userq_mutex));
|
||||
|
||||
if (unlikely(adev->debug_disable_gpu_ring_reset)) {
|
||||
dev_err(adev->dev, "userq reset disabled by debug mask\n");
|
||||
return 0;
|
||||
|
|
@ -127,9 +124,11 @@ amdgpu_userq_detect_and_reset_queues(struct amdgpu_userq_mgr *uq_mgr)
|
|||
*/
|
||||
for (i = 0; i < num_queue_types; i++) {
|
||||
int ring_type = queue_types[i];
|
||||
const struct amdgpu_userq_funcs *funcs = adev->userq_funcs[ring_type];
|
||||
const struct amdgpu_userq_funcs *funcs =
|
||||
adev->userq_funcs[ring_type];
|
||||
|
||||
if (!amdgpu_userq_is_reset_type_supported(adev, ring_type, AMDGPU_RESET_TYPE_PER_QUEUE))
|
||||
if (!amdgpu_userq_is_reset_type_supported(adev, ring_type,
|
||||
AMDGPU_RESET_TYPE_PER_QUEUE))
|
||||
continue;
|
||||
|
||||
if (atomic_read(&uq_mgr->userq_count[ring_type]) > 0 &&
|
||||
|
|
@ -150,38 +149,22 @@ amdgpu_userq_detect_and_reset_queues(struct amdgpu_userq_mgr *uq_mgr)
|
|||
|
||||
static void amdgpu_userq_hang_detect_work(struct work_struct *work)
|
||||
{
|
||||
struct amdgpu_usermode_queue *queue = container_of(work,
|
||||
struct amdgpu_usermode_queue,
|
||||
hang_detect_work.work);
|
||||
struct dma_fence *fence;
|
||||
struct amdgpu_userq_mgr *uq_mgr;
|
||||
struct amdgpu_usermode_queue *queue =
|
||||
container_of(work, struct amdgpu_usermode_queue,
|
||||
hang_detect_work.work);
|
||||
|
||||
if (!queue->userq_mgr)
|
||||
return;
|
||||
|
||||
uq_mgr = queue->userq_mgr;
|
||||
fence = READ_ONCE(queue->hang_detect_fence);
|
||||
/* Fence already signaled – no action needed */
|
||||
if (!fence || dma_fence_is_signaled(fence))
|
||||
return;
|
||||
|
||||
mutex_lock(&uq_mgr->userq_mutex);
|
||||
amdgpu_userq_detect_and_reset_queues(uq_mgr);
|
||||
mutex_unlock(&uq_mgr->userq_mutex);
|
||||
amdgpu_userq_detect_and_reset_queues(queue->userq_mgr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Start hang detection for a user queue fence. A delayed work will be scheduled
|
||||
* to check if the fence is still pending after the timeout period.
|
||||
*/
|
||||
* to reset the queues when the fence doesn't signal in time.
|
||||
*/
|
||||
void amdgpu_userq_start_hang_detect_work(struct amdgpu_usermode_queue *queue)
|
||||
{
|
||||
struct amdgpu_device *adev;
|
||||
unsigned long timeout_ms;
|
||||
|
||||
if (!queue || !queue->userq_mgr || !queue->userq_mgr->adev)
|
||||
return;
|
||||
|
||||
adev = queue->userq_mgr->adev;
|
||||
/* Determine timeout based on queue type */
|
||||
switch (queue->queue_type) {
|
||||
|
|
@ -199,8 +182,6 @@ void amdgpu_userq_start_hang_detect_work(struct amdgpu_usermode_queue *queue)
|
|||
break;
|
||||
}
|
||||
|
||||
/* Store the fence to monitor and schedule hang detection */
|
||||
WRITE_ONCE(queue->hang_detect_fence, queue->last_fence);
|
||||
schedule_delayed_work(&queue->hang_detect_work,
|
||||
msecs_to_jiffies(timeout_ms));
|
||||
}
|
||||
|
|
@ -210,18 +191,24 @@ void amdgpu_userq_process_fence_irq(struct amdgpu_device *adev, u32 doorbell)
|
|||
struct xarray *xa = &adev->userq_doorbell_xa;
|
||||
struct amdgpu_usermode_queue *queue;
|
||||
unsigned long flags;
|
||||
int r;
|
||||
|
||||
xa_lock_irqsave(xa, flags);
|
||||
queue = xa_load(xa, doorbell);
|
||||
if (queue)
|
||||
amdgpu_userq_fence_driver_process(queue->fence_drv);
|
||||
xa_unlock_irqrestore(xa, flags);
|
||||
}
|
||||
if (queue) {
|
||||
r = amdgpu_userq_fence_driver_process(queue->fence_drv);
|
||||
/*
|
||||
* We are in interrupt context here, this *can't* wait for
|
||||
* reset work to finish.
|
||||
*/
|
||||
if (r >= 0)
|
||||
cancel_delayed_work(&queue->hang_detect_work);
|
||||
|
||||
static void amdgpu_userq_init_hang_detect_work(struct amdgpu_usermode_queue *queue)
|
||||
{
|
||||
INIT_DELAYED_WORK(&queue->hang_detect_work, amdgpu_userq_hang_detect_work);
|
||||
queue->hang_detect_fence = NULL;
|
||||
/* Restart the timer when there are still fences pending */
|
||||
if (r == 1)
|
||||
amdgpu_userq_start_hang_detect_work(queue);
|
||||
}
|
||||
xa_unlock_irqrestore(xa, flags);
|
||||
}
|
||||
|
||||
static int amdgpu_userq_buffer_va_list_add(struct amdgpu_usermode_queue *queue,
|
||||
|
|
@ -345,23 +332,18 @@ static int amdgpu_userq_preempt_helper(struct amdgpu_usermode_queue *queue)
|
|||
struct amdgpu_device *adev = uq_mgr->adev;
|
||||
const struct amdgpu_userq_funcs *userq_funcs =
|
||||
adev->userq_funcs[queue->queue_type];
|
||||
bool found_hung_queue = false;
|
||||
int r = 0;
|
||||
int r;
|
||||
|
||||
if (queue->state == AMDGPU_USERQ_STATE_MAPPED) {
|
||||
r = userq_funcs->preempt(queue);
|
||||
if (r) {
|
||||
queue->state = AMDGPU_USERQ_STATE_HUNG;
|
||||
found_hung_queue = true;
|
||||
return r;
|
||||
} else {
|
||||
queue->state = AMDGPU_USERQ_STATE_PREEMPTED;
|
||||
}
|
||||
}
|
||||
|
||||
if (found_hung_queue)
|
||||
amdgpu_userq_detect_and_reset_queues(uq_mgr);
|
||||
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amdgpu_userq_restore_helper(struct amdgpu_usermode_queue *queue)
|
||||
|
|
@ -390,24 +372,21 @@ static int amdgpu_userq_unmap_helper(struct amdgpu_usermode_queue *queue)
|
|||
struct amdgpu_device *adev = uq_mgr->adev;
|
||||
const struct amdgpu_userq_funcs *userq_funcs =
|
||||
adev->userq_funcs[queue->queue_type];
|
||||
bool found_hung_queue = false;
|
||||
int r = 0;
|
||||
int r;
|
||||
|
||||
if ((queue->state == AMDGPU_USERQ_STATE_MAPPED) ||
|
||||
(queue->state == AMDGPU_USERQ_STATE_PREEMPTED)) {
|
||||
(queue->state == AMDGPU_USERQ_STATE_PREEMPTED)) {
|
||||
|
||||
r = userq_funcs->unmap(queue);
|
||||
if (r) {
|
||||
queue->state = AMDGPU_USERQ_STATE_HUNG;
|
||||
found_hung_queue = true;
|
||||
return r;
|
||||
} else {
|
||||
queue->state = AMDGPU_USERQ_STATE_UNMAPPED;
|
||||
}
|
||||
}
|
||||
|
||||
if (found_hung_queue)
|
||||
amdgpu_userq_detect_and_reset_queues(uq_mgr);
|
||||
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amdgpu_userq_map_helper(struct amdgpu_usermode_queue *queue)
|
||||
|
|
@ -416,19 +395,19 @@ static int amdgpu_userq_map_helper(struct amdgpu_usermode_queue *queue)
|
|||
struct amdgpu_device *adev = uq_mgr->adev;
|
||||
const struct amdgpu_userq_funcs *userq_funcs =
|
||||
adev->userq_funcs[queue->queue_type];
|
||||
int r = 0;
|
||||
int r;
|
||||
|
||||
if (queue->state == AMDGPU_USERQ_STATE_UNMAPPED) {
|
||||
r = userq_funcs->map(queue);
|
||||
if (r) {
|
||||
queue->state = AMDGPU_USERQ_STATE_HUNG;
|
||||
amdgpu_userq_detect_and_reset_queues(uq_mgr);
|
||||
return r;
|
||||
} else {
|
||||
queue->state = AMDGPU_USERQ_STATE_MAPPED;
|
||||
}
|
||||
}
|
||||
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void amdgpu_userq_wait_for_last_fence(struct amdgpu_usermode_queue *queue)
|
||||
|
|
@ -648,13 +627,11 @@ amdgpu_userq_destroy(struct amdgpu_userq_mgr *uq_mgr, struct amdgpu_usermode_que
|
|||
amdgpu_bo_unreserve(vm->root.bo);
|
||||
|
||||
mutex_lock(&uq_mgr->userq_mutex);
|
||||
queue->hang_detect_fence = NULL;
|
||||
amdgpu_userq_wait_for_last_fence(queue);
|
||||
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
debugfs_remove_recursive(queue->debugfs_queue);
|
||||
#endif
|
||||
amdgpu_userq_detect_and_reset_queues(uq_mgr);
|
||||
r = amdgpu_userq_unmap_helper(queue);
|
||||
atomic_dec(&uq_mgr->userq_count[queue->queue_type]);
|
||||
amdgpu_userq_cleanup(queue);
|
||||
|
|
@ -800,6 +777,7 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)
|
|||
}
|
||||
|
||||
queue->doorbell_index = index;
|
||||
mutex_init(&queue->fence_drv_lock);
|
||||
xa_init_flags(&queue->fence_drv_xa, XA_FLAGS_ALLOC);
|
||||
r = amdgpu_userq_fence_driver_alloc(adev, &queue->fence_drv);
|
||||
if (r) {
|
||||
|
|
@ -855,7 +833,8 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)
|
|||
up_read(&adev->reset_domain->sem);
|
||||
|
||||
amdgpu_debugfs_userq_init(filp, queue, qid);
|
||||
amdgpu_userq_init_hang_detect_work(queue);
|
||||
INIT_DELAYED_WORK(&queue->hang_detect_work,
|
||||
amdgpu_userq_hang_detect_work);
|
||||
|
||||
args->out.queue_id = qid;
|
||||
atomic_inc(&uq_mgr->userq_count[queue->queue_type]);
|
||||
|
|
@ -873,6 +852,7 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)
|
|||
amdgpu_bo_reserve(fpriv->vm.root.bo, true);
|
||||
amdgpu_userq_buffer_vas_list_cleanup(adev, queue);
|
||||
amdgpu_bo_unreserve(fpriv->vm.root.bo);
|
||||
mutex_destroy(&queue->fence_drv_lock);
|
||||
free_queue:
|
||||
kfree(queue);
|
||||
err_pm_runtime:
|
||||
|
|
@ -1262,7 +1242,6 @@ amdgpu_userq_evict_all(struct amdgpu_userq_mgr *uq_mgr)
|
|||
unsigned long queue_id;
|
||||
int ret = 0, r;
|
||||
|
||||
amdgpu_userq_detect_and_reset_queues(uq_mgr);
|
||||
/* Try to unmap all the queues in this process ctx */
|
||||
xa_for_each(&uq_mgr->userq_xa, queue_id, queue) {
|
||||
r = amdgpu_userq_preempt_helper(queue);
|
||||
|
|
@ -1270,9 +1249,11 @@ amdgpu_userq_evict_all(struct amdgpu_userq_mgr *uq_mgr)
|
|||
ret = r;
|
||||
}
|
||||
|
||||
if (ret)
|
||||
if (ret) {
|
||||
drm_file_err(uq_mgr->file,
|
||||
"Couldn't unmap all the queues, eviction failed ret=%d\n", ret);
|
||||
amdgpu_userq_detect_and_reset_queues(uq_mgr);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -1372,7 +1353,6 @@ int amdgpu_userq_suspend(struct amdgpu_device *adev)
|
|||
uqm = queue->userq_mgr;
|
||||
cancel_delayed_work_sync(&uqm->resume_work);
|
||||
guard(mutex)(&uqm->userq_mutex);
|
||||
amdgpu_userq_detect_and_reset_queues(uqm);
|
||||
if (adev->in_s0ix)
|
||||
r = amdgpu_userq_preempt_helper(queue);
|
||||
else
|
||||
|
|
@ -1431,7 +1411,6 @@ int amdgpu_userq_stop_sched_for_enforce_isolation(struct amdgpu_device *adev,
|
|||
if (((queue->queue_type == AMDGPU_HW_IP_GFX) ||
|
||||
(queue->queue_type == AMDGPU_HW_IP_COMPUTE)) &&
|
||||
(queue->xcp_id == idx)) {
|
||||
amdgpu_userq_detect_and_reset_queues(uqm);
|
||||
r = amdgpu_userq_preempt_helper(queue);
|
||||
if (r)
|
||||
ret = r;
|
||||
|
|
@ -1504,23 +1483,21 @@ void amdgpu_userq_pre_reset(struct amdgpu_device *adev)
|
|||
{
|
||||
const struct amdgpu_userq_funcs *userq_funcs;
|
||||
struct amdgpu_usermode_queue *queue;
|
||||
struct amdgpu_userq_mgr *uqm;
|
||||
unsigned long queue_id;
|
||||
|
||||
/* TODO: We probably need a new lock for the queue state */
|
||||
xa_for_each(&adev->userq_doorbell_xa, queue_id, queue) {
|
||||
uqm = queue->userq_mgr;
|
||||
cancel_delayed_work_sync(&uqm->resume_work);
|
||||
if (queue->state == AMDGPU_USERQ_STATE_MAPPED) {
|
||||
amdgpu_userq_wait_for_last_fence(queue);
|
||||
userq_funcs = adev->userq_funcs[queue->queue_type];
|
||||
userq_funcs->unmap(queue);
|
||||
/* just mark all queues as hung at this point.
|
||||
* if unmap succeeds, we could map again
|
||||
* in amdgpu_userq_post_reset() if vram is not lost
|
||||
*/
|
||||
queue->state = AMDGPU_USERQ_STATE_HUNG;
|
||||
amdgpu_userq_fence_driver_force_completion(queue);
|
||||
}
|
||||
if (queue->state != AMDGPU_USERQ_STATE_MAPPED)
|
||||
continue;
|
||||
|
||||
userq_funcs = adev->userq_funcs[queue->queue_type];
|
||||
userq_funcs->unmap(queue);
|
||||
/* just mark all queues as hung at this point.
|
||||
* if unmap succeeds, we could map again
|
||||
* in amdgpu_userq_post_reset() if vram is not lost
|
||||
*/
|
||||
queue->state = AMDGPU_USERQ_STATE_HUNG;
|
||||
amdgpu_userq_fence_driver_force_completion(queue);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -66,6 +66,18 @@ struct amdgpu_usermode_queue {
|
|||
struct amdgpu_userq_obj db_obj;
|
||||
struct amdgpu_userq_obj fw_obj;
|
||||
struct amdgpu_userq_obj wptr_obj;
|
||||
|
||||
/**
|
||||
* @fence_drv_lock: Protecting @fence_drv_xa.
|
||||
*/
|
||||
struct mutex fence_drv_lock;
|
||||
|
||||
/**
|
||||
* @fence_drv_xa:
|
||||
*
|
||||
* References to the external fence drivers returned by wait_ioctl.
|
||||
* Dropped on the next signaled dma_fence or queue destruction.
|
||||
*/
|
||||
struct xarray fence_drv_xa;
|
||||
struct amdgpu_userq_fence_driver *fence_drv;
|
||||
struct dma_fence *last_fence;
|
||||
|
|
@ -73,7 +85,6 @@ struct amdgpu_usermode_queue {
|
|||
int priority;
|
||||
struct dentry *debugfs_queue;
|
||||
struct delayed_work hang_detect_work;
|
||||
struct dma_fence *hang_detect_fence;
|
||||
struct kref refcount;
|
||||
|
||||
struct list_head userq_va_list;
|
||||
|
|
|
|||
|
|
@ -121,6 +121,7 @@ amdgpu_userq_fence_driver_free(struct amdgpu_usermode_queue *userq)
|
|||
userq->last_fence = NULL;
|
||||
amdgpu_userq_walk_and_drop_fence_drv(&userq->fence_drv_xa);
|
||||
xa_destroy(&userq->fence_drv_xa);
|
||||
mutex_destroy(&userq->fence_drv_lock);
|
||||
/* Drop the queue's ownership reference to fence_drv explicitly */
|
||||
amdgpu_userq_fence_driver_put(userq->fence_drv);
|
||||
}
|
||||
|
|
@ -134,7 +135,14 @@ amdgpu_userq_fence_put_fence_drv_array(struct amdgpu_userq_fence *userq_fence)
|
|||
userq_fence->fence_drv_array_count = 0;
|
||||
}
|
||||
|
||||
void amdgpu_userq_fence_driver_process(struct amdgpu_userq_fence_driver *fence_drv)
|
||||
/*
|
||||
* Returns:
|
||||
* -ENOENT when no fences were processes
|
||||
* 1 when more fences are pending
|
||||
* 0 when no fences are pending any more
|
||||
*/
|
||||
int
|
||||
amdgpu_userq_fence_driver_process(struct amdgpu_userq_fence_driver *fence_drv)
|
||||
{
|
||||
struct amdgpu_userq_fence *userq_fence, *tmp;
|
||||
LIST_HEAD(to_be_signaled);
|
||||
|
|
@ -142,9 +150,6 @@ void amdgpu_userq_fence_driver_process(struct amdgpu_userq_fence_driver *fence_d
|
|||
unsigned long flags;
|
||||
u64 rptr;
|
||||
|
||||
if (!fence_drv)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&fence_drv->fence_list_lock, flags);
|
||||
rptr = amdgpu_userq_fence_read(fence_drv);
|
||||
|
||||
|
|
@ -157,6 +162,9 @@ void amdgpu_userq_fence_driver_process(struct amdgpu_userq_fence_driver *fence_d
|
|||
&userq_fence->link);
|
||||
spin_unlock_irqrestore(&fence_drv->fence_list_lock, flags);
|
||||
|
||||
if (list_empty(&to_be_signaled))
|
||||
return -ENOENT;
|
||||
|
||||
list_for_each_entry_safe(userq_fence, tmp, &to_be_signaled, link) {
|
||||
fence = &userq_fence->base;
|
||||
list_del_init(&userq_fence->link);
|
||||
|
|
@ -168,6 +176,8 @@ void amdgpu_userq_fence_driver_process(struct amdgpu_userq_fence_driver *fence_d
|
|||
dma_fence_put(fence);
|
||||
}
|
||||
|
||||
/* That doesn't need to be accurate so no locking */
|
||||
return list_empty(&fence_drv->fences) ? 0 : 1;
|
||||
}
|
||||
|
||||
void amdgpu_userq_fence_driver_destroy(struct kref *ref)
|
||||
|
|
@ -209,80 +219,84 @@ void amdgpu_userq_fence_driver_put(struct amdgpu_userq_fence_driver *fence_drv)
|
|||
kref_put(&fence_drv->refcount, amdgpu_userq_fence_driver_destroy);
|
||||
}
|
||||
|
||||
static int amdgpu_userq_fence_alloc(struct amdgpu_userq_fence **userq_fence)
|
||||
static int amdgpu_userq_fence_alloc(struct amdgpu_usermode_queue *userq,
|
||||
struct amdgpu_userq_fence **pfence)
|
||||
{
|
||||
*userq_fence = kmalloc(sizeof(**userq_fence), GFP_KERNEL);
|
||||
return *userq_fence ? 0 : -ENOMEM;
|
||||
struct amdgpu_userq_fence_driver *fence_drv = userq->fence_drv;
|
||||
struct amdgpu_userq_fence *userq_fence;
|
||||
void *entry;
|
||||
|
||||
userq_fence = kmalloc(sizeof(*userq_fence), GFP_KERNEL);
|
||||
if (!userq_fence)
|
||||
return -ENOMEM;
|
||||
|
||||
/*
|
||||
* Get the next unused entry, since we fill from the start this can be
|
||||
* used as size to allocate the array.
|
||||
*/
|
||||
mutex_lock(&userq->fence_drv_lock);
|
||||
XA_STATE(xas, &userq->fence_drv_xa, 0);
|
||||
|
||||
rcu_read_lock();
|
||||
do {
|
||||
entry = xas_find_marked(&xas, ULONG_MAX, XA_FREE_MARK);
|
||||
} while (xas_retry(&xas, entry));
|
||||
rcu_read_unlock();
|
||||
|
||||
userq_fence->fence_drv_array = kvmalloc_array(xas.xa_index,
|
||||
sizeof(fence_drv),
|
||||
GFP_KERNEL);
|
||||
if (!userq_fence->fence_drv_array) {
|
||||
mutex_unlock(&userq->fence_drv_lock);
|
||||
kfree(userq_fence);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
userq_fence->fence_drv_array_count = xas.xa_index;
|
||||
xa_extract(&userq->fence_drv_xa, (void **)userq_fence->fence_drv_array,
|
||||
0, ULONG_MAX, xas.xa_index, XA_PRESENT);
|
||||
xa_destroy(&userq->fence_drv_xa);
|
||||
|
||||
mutex_unlock(&userq->fence_drv_lock);
|
||||
|
||||
amdgpu_userq_fence_driver_get(fence_drv);
|
||||
userq_fence->fence_drv = fence_drv;
|
||||
|
||||
*pfence = userq_fence;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amdgpu_userq_fence_create(struct amdgpu_usermode_queue *userq,
|
||||
struct amdgpu_userq_fence *userq_fence,
|
||||
u64 seq, struct dma_fence **f)
|
||||
static void amdgpu_userq_fence_init(struct amdgpu_usermode_queue *userq,
|
||||
struct amdgpu_userq_fence *fence,
|
||||
u64 seq)
|
||||
{
|
||||
struct amdgpu_userq_fence_driver *fence_drv;
|
||||
struct dma_fence *fence;
|
||||
struct amdgpu_userq_fence_driver *fence_drv = userq->fence_drv;
|
||||
unsigned long flags;
|
||||
bool signaled = false;
|
||||
|
||||
fence_drv = userq->fence_drv;
|
||||
if (!fence_drv)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_init(&userq_fence->lock);
|
||||
INIT_LIST_HEAD(&userq_fence->link);
|
||||
fence = &userq_fence->base;
|
||||
userq_fence->fence_drv = fence_drv;
|
||||
|
||||
dma_fence_init64(fence, &amdgpu_userq_fence_ops, &userq_fence->lock,
|
||||
spin_lock_init(&fence->lock);
|
||||
dma_fence_init64(&fence->base, &amdgpu_userq_fence_ops, &fence->lock,
|
||||
fence_drv->context, seq);
|
||||
|
||||
amdgpu_userq_fence_driver_get(fence_drv);
|
||||
dma_fence_get(fence);
|
||||
/* Make sure the fence is visible to the hang detect worker */
|
||||
dma_fence_put(userq->last_fence);
|
||||
userq->last_fence = dma_fence_get(&fence->base);
|
||||
|
||||
if (!xa_empty(&userq->fence_drv_xa)) {
|
||||
struct amdgpu_userq_fence_driver *stored_fence_drv;
|
||||
unsigned long index, count = 0;
|
||||
int i = 0;
|
||||
|
||||
xa_lock(&userq->fence_drv_xa);
|
||||
xa_for_each(&userq->fence_drv_xa, index, stored_fence_drv)
|
||||
count++;
|
||||
|
||||
userq_fence->fence_drv_array =
|
||||
kvmalloc_objs(struct amdgpu_userq_fence_driver *, count,
|
||||
GFP_ATOMIC);
|
||||
|
||||
if (userq_fence->fence_drv_array) {
|
||||
xa_for_each(&userq->fence_drv_xa, index, stored_fence_drv) {
|
||||
userq_fence->fence_drv_array[i] = stored_fence_drv;
|
||||
__xa_erase(&userq->fence_drv_xa, index);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
userq_fence->fence_drv_array_count = i;
|
||||
xa_unlock(&userq->fence_drv_xa);
|
||||
} else {
|
||||
userq_fence->fence_drv_array = NULL;
|
||||
userq_fence->fence_drv_array_count = 0;
|
||||
}
|
||||
|
||||
/* Check if hardware has already processed the job */
|
||||
/* Check if hardware has already processed the fence */
|
||||
spin_lock_irqsave(&fence_drv->fence_list_lock, flags);
|
||||
if (!dma_fence_is_signaled(fence)) {
|
||||
list_add_tail(&userq_fence->link, &fence_drv->fences);
|
||||
if (!dma_fence_is_signaled(&fence->base)) {
|
||||
dma_fence_get(&fence->base);
|
||||
list_add_tail(&fence->link, &fence_drv->fences);
|
||||
} else {
|
||||
INIT_LIST_HEAD(&fence->link);
|
||||
signaled = true;
|
||||
dma_fence_put(fence);
|
||||
}
|
||||
spin_unlock_irqrestore(&fence_drv->fence_list_lock, flags);
|
||||
|
||||
if (signaled)
|
||||
amdgpu_userq_fence_put_fence_drv_array(userq_fence);
|
||||
|
||||
*f = fence;
|
||||
|
||||
return 0;
|
||||
amdgpu_userq_fence_put_fence_drv_array(fence);
|
||||
else
|
||||
amdgpu_userq_start_hang_detect_work(userq);
|
||||
}
|
||||
|
||||
static const char *amdgpu_userq_fence_get_driver_name(struct dma_fence *f)
|
||||
|
|
@ -403,11 +417,6 @@ static int amdgpu_userq_fence_read_wptr(struct amdgpu_device *adev,
|
|||
return r;
|
||||
}
|
||||
|
||||
static void amdgpu_userq_fence_cleanup(struct dma_fence *fence)
|
||||
{
|
||||
dma_fence_put(fence);
|
||||
}
|
||||
|
||||
static void
|
||||
amdgpu_userq_fence_driver_set_error(struct amdgpu_userq_fence *fence,
|
||||
int error)
|
||||
|
|
@ -451,13 +460,14 @@ int amdgpu_userq_signal_ioctl(struct drm_device *dev, void *data,
|
|||
const unsigned int num_read_bo_handles = args->num_bo_read_handles;
|
||||
struct amdgpu_fpriv *fpriv = filp->driver_priv;
|
||||
struct amdgpu_userq_mgr *userq_mgr = &fpriv->userq_mgr;
|
||||
|
||||
struct drm_gem_object **gobj_write, **gobj_read;
|
||||
u32 *syncobj_handles, num_syncobj_handles;
|
||||
struct amdgpu_userq_fence *userq_fence;
|
||||
struct amdgpu_usermode_queue *queue = NULL;
|
||||
struct drm_syncobj **syncobj = NULL;
|
||||
struct dma_fence *fence;
|
||||
struct amdgpu_usermode_queue *queue;
|
||||
struct amdgpu_userq_fence *fence;
|
||||
struct drm_syncobj **syncobj;
|
||||
struct drm_exec exec;
|
||||
void __user *ptr;
|
||||
int r, i, entry;
|
||||
u64 wptr;
|
||||
|
||||
|
|
@ -469,13 +479,14 @@ int amdgpu_userq_signal_ioctl(struct drm_device *dev, void *data,
|
|||
return -EINVAL;
|
||||
|
||||
num_syncobj_handles = args->num_syncobj_handles;
|
||||
syncobj_handles = memdup_array_user(u64_to_user_ptr(args->syncobj_handles),
|
||||
num_syncobj_handles, sizeof(u32));
|
||||
ptr = u64_to_user_ptr(args->syncobj_handles);
|
||||
syncobj_handles = memdup_array_user(ptr, num_syncobj_handles,
|
||||
sizeof(u32));
|
||||
if (IS_ERR(syncobj_handles))
|
||||
return PTR_ERR(syncobj_handles);
|
||||
|
||||
/* Array of pointers to the looked up syncobjs */
|
||||
syncobj = kmalloc_array(num_syncobj_handles, sizeof(*syncobj), GFP_KERNEL);
|
||||
syncobj = kmalloc_array(num_syncobj_handles, sizeof(*syncobj),
|
||||
GFP_KERNEL);
|
||||
if (!syncobj) {
|
||||
r = -ENOMEM;
|
||||
goto free_syncobj_handles;
|
||||
|
|
@ -489,21 +500,17 @@ int amdgpu_userq_signal_ioctl(struct drm_device *dev, void *data,
|
|||
}
|
||||
}
|
||||
|
||||
r = drm_gem_objects_lookup(filp,
|
||||
u64_to_user_ptr(args->bo_read_handles),
|
||||
num_read_bo_handles,
|
||||
&gobj_read);
|
||||
ptr = u64_to_user_ptr(args->bo_read_handles);
|
||||
r = drm_gem_objects_lookup(filp, ptr, num_read_bo_handles, &gobj_read);
|
||||
if (r)
|
||||
goto free_syncobj;
|
||||
|
||||
r = drm_gem_objects_lookup(filp,
|
||||
u64_to_user_ptr(args->bo_write_handles),
|
||||
num_write_bo_handles,
|
||||
ptr = u64_to_user_ptr(args->bo_write_handles);
|
||||
r = drm_gem_objects_lookup(filp, ptr, num_write_bo_handles,
|
||||
&gobj_write);
|
||||
if (r)
|
||||
goto put_gobj_read;
|
||||
|
||||
/* Retrieve the user queue */
|
||||
queue = amdgpu_userq_get(userq_mgr, args->queue_id);
|
||||
if (!queue) {
|
||||
r = -ENOENT;
|
||||
|
|
@ -512,73 +519,61 @@ int amdgpu_userq_signal_ioctl(struct drm_device *dev, void *data,
|
|||
|
||||
r = amdgpu_userq_fence_read_wptr(adev, queue, &wptr);
|
||||
if (r)
|
||||
goto put_gobj_write;
|
||||
goto put_queue;
|
||||
|
||||
r = amdgpu_userq_fence_alloc(&userq_fence);
|
||||
r = amdgpu_userq_fence_alloc(queue, &fence);
|
||||
if (r)
|
||||
goto put_gobj_write;
|
||||
goto put_queue;
|
||||
|
||||
/* We are here means UQ is active, make sure the eviction fence is valid */
|
||||
amdgpu_userq_ensure_ev_fence(&fpriv->userq_mgr, &fpriv->evf_mgr);
|
||||
|
||||
/* Create a new fence */
|
||||
r = amdgpu_userq_fence_create(queue, userq_fence, wptr, &fence);
|
||||
if (r) {
|
||||
mutex_unlock(&userq_mgr->userq_mutex);
|
||||
kfree(userq_fence);
|
||||
goto put_gobj_write;
|
||||
}
|
||||
/* Create the new fence */
|
||||
amdgpu_userq_fence_init(queue, fence, wptr);
|
||||
|
||||
dma_fence_put(queue->last_fence);
|
||||
queue->last_fence = dma_fence_get(fence);
|
||||
amdgpu_userq_start_hang_detect_work(queue);
|
||||
mutex_unlock(&userq_mgr->userq_mutex);
|
||||
|
||||
/*
|
||||
* This needs to come after the fence is created since
|
||||
* amdgpu_userq_ensure_ev_fence() can't be called while holding the resv
|
||||
* locks.
|
||||
*/
|
||||
drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT,
|
||||
(num_read_bo_handles + num_write_bo_handles));
|
||||
|
||||
/* Lock all BOs with retry handling */
|
||||
drm_exec_until_all_locked(&exec) {
|
||||
r = drm_exec_prepare_array(&exec, gobj_read, num_read_bo_handles, 1);
|
||||
r = drm_exec_prepare_array(&exec, gobj_read,
|
||||
num_read_bo_handles, 1);
|
||||
drm_exec_retry_on_contention(&exec);
|
||||
if (r) {
|
||||
amdgpu_userq_fence_cleanup(fence);
|
||||
if (r)
|
||||
goto exec_fini;
|
||||
}
|
||||
|
||||
r = drm_exec_prepare_array(&exec, gobj_write, num_write_bo_handles, 1);
|
||||
r = drm_exec_prepare_array(&exec, gobj_write,
|
||||
num_write_bo_handles, 1);
|
||||
drm_exec_retry_on_contention(&exec);
|
||||
if (r) {
|
||||
amdgpu_userq_fence_cleanup(fence);
|
||||
if (r)
|
||||
goto exec_fini;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < num_read_bo_handles; i++) {
|
||||
if (!gobj_read || !gobj_read[i]->resv)
|
||||
continue;
|
||||
|
||||
dma_resv_add_fence(gobj_read[i]->resv, fence,
|
||||
/* And publish the new fence in the BOs and syncobj */
|
||||
for (i = 0; i < num_read_bo_handles; i++)
|
||||
dma_resv_add_fence(gobj_read[i]->resv, &fence->base,
|
||||
DMA_RESV_USAGE_READ);
|
||||
}
|
||||
|
||||
for (i = 0; i < num_write_bo_handles; i++) {
|
||||
if (!gobj_write || !gobj_write[i]->resv)
|
||||
continue;
|
||||
|
||||
dma_resv_add_fence(gobj_write[i]->resv, fence,
|
||||
for (i = 0; i < num_write_bo_handles; i++)
|
||||
dma_resv_add_fence(gobj_write[i]->resv, &fence->base,
|
||||
DMA_RESV_USAGE_WRITE);
|
||||
}
|
||||
|
||||
/* Add the created fence to syncobj/BO's */
|
||||
for (i = 0; i < num_syncobj_handles; i++)
|
||||
drm_syncobj_replace_fence(syncobj[i], fence);
|
||||
|
||||
/* drop the reference acquired in fence creation function */
|
||||
dma_fence_put(fence);
|
||||
drm_syncobj_replace_fence(syncobj[i], &fence->base);
|
||||
|
||||
exec_fini:
|
||||
/* drop the reference acquired in fence creation function */
|
||||
dma_fence_put(&fence->base);
|
||||
|
||||
drm_exec_fini(&exec);
|
||||
put_queue:
|
||||
amdgpu_userq_put(queue);
|
||||
put_gobj_write:
|
||||
for (i = 0; i < num_write_bo_handles; i++)
|
||||
drm_gem_object_put(gobj_write[i]);
|
||||
|
|
@ -589,15 +584,11 @@ int amdgpu_userq_signal_ioctl(struct drm_device *dev, void *data,
|
|||
kvfree(gobj_read);
|
||||
free_syncobj:
|
||||
while (entry-- > 0)
|
||||
if (syncobj[entry])
|
||||
drm_syncobj_put(syncobj[entry]);
|
||||
drm_syncobj_put(syncobj[entry]);
|
||||
kfree(syncobj);
|
||||
free_syncobj_handles:
|
||||
kfree(syncobj_handles);
|
||||
|
||||
if (queue)
|
||||
amdgpu_userq_put(queue);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
@ -872,8 +863,10 @@ amdgpu_userq_wait_return_fence_info(struct drm_file *filp,
|
|||
* Otherwise, we would gather those references until we don't
|
||||
* have any more space left and crash.
|
||||
*/
|
||||
mutex_lock(&waitq->fence_drv_lock);
|
||||
r = xa_alloc(&waitq->fence_drv_xa, &index, fence_drv,
|
||||
xa_limit_32b, GFP_KERNEL);
|
||||
mutex_unlock(&waitq->fence_drv_lock);
|
||||
if (r)
|
||||
goto put_waitq;
|
||||
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ void amdgpu_userq_fence_driver_put(struct amdgpu_userq_fence_driver *fence_drv);
|
|||
int amdgpu_userq_fence_driver_alloc(struct amdgpu_device *adev,
|
||||
struct amdgpu_userq_fence_driver **fence_drv_req);
|
||||
void amdgpu_userq_fence_driver_free(struct amdgpu_usermode_queue *userq);
|
||||
void amdgpu_userq_fence_driver_process(struct amdgpu_userq_fence_driver *fence_drv);
|
||||
int amdgpu_userq_fence_driver_process(struct amdgpu_userq_fence_driver *fence_drv);
|
||||
void amdgpu_userq_fence_driver_force_completion(struct amdgpu_usermode_queue *userq);
|
||||
void amdgpu_userq_fence_driver_destroy(struct kref *ref);
|
||||
int amdgpu_userq_signal_ioctl(struct drm_device *dev, void *data,
|
||||
|
|
|
|||
|
|
@ -512,7 +512,7 @@ int amdgpu_uvd_resume(struct amdgpu_device *adev)
|
|||
}
|
||||
memset_io(ptr, 0, size);
|
||||
/* to restore uvd fence seq */
|
||||
amdgpu_fence_driver_force_completion(&adev->uvd.inst[i].ring);
|
||||
amdgpu_fence_driver_force_completion(&adev->uvd.inst[i].ring, NULL);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -1486,18 +1486,27 @@ int vcn_set_powergating_state(struct amdgpu_ip_block *ip_block,
|
|||
}
|
||||
|
||||
/**
|
||||
* amdgpu_vcn_reset_engine - Reset a specific VCN engine
|
||||
* @adev: Pointer to the AMDGPU device
|
||||
* @instance_id: VCN engine instance to reset
|
||||
* amdgpu_vcn_ring_reset - Reset a VCN ring
|
||||
* @ring: ring to reset
|
||||
* @vmid: vmid of guilty job
|
||||
* @timedout_fence: fence of timed out job
|
||||
*
|
||||
* This helper is for VCN blocks without unified queues because
|
||||
* resetting the engine resets all queues in that case. With
|
||||
* unified queues we have one queue per engine.
|
||||
* Returns: 0 on success, or a negative error code on failure.
|
||||
*/
|
||||
static int amdgpu_vcn_reset_engine(struct amdgpu_device *adev,
|
||||
uint32_t instance_id)
|
||||
int amdgpu_vcn_ring_reset(struct amdgpu_ring *ring,
|
||||
unsigned int vmid,
|
||||
struct amdgpu_fence *timedout_fence)
|
||||
{
|
||||
struct amdgpu_vcn_inst *vinst = &adev->vcn.inst[instance_id];
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
struct amdgpu_vcn_inst *vinst = &adev->vcn.inst[ring->me];
|
||||
int r, i;
|
||||
|
||||
if (adev->vcn.inst[ring->me].using_unified_queue)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&vinst->engine_reset_mutex);
|
||||
/* Stop the scheduler's work queue for the dec and enc rings if they are running.
|
||||
* This ensures that no new tasks are submitted to the queues while
|
||||
|
|
@ -1519,9 +1528,13 @@ static int amdgpu_vcn_reset_engine(struct amdgpu_device *adev,
|
|||
if (r)
|
||||
goto unlock;
|
||||
}
|
||||
amdgpu_fence_driver_force_completion(&vinst->ring_dec);
|
||||
amdgpu_fence_driver_force_completion(&vinst->ring_dec,
|
||||
(&vinst->ring_dec == ring) ?
|
||||
&timedout_fence->base : NULL);
|
||||
for (i = 0; i < vinst->num_enc_rings; i++)
|
||||
amdgpu_fence_driver_force_completion(&vinst->ring_enc[i]);
|
||||
amdgpu_fence_driver_force_completion(&vinst->ring_enc[i],
|
||||
(&vinst->ring_enc[i] == ring) ?
|
||||
&timedout_fence->base : NULL);
|
||||
|
||||
/* Restart the scheduler's work queue for the dec and enc rings
|
||||
* if they were stopped by this function. This allows new tasks
|
||||
|
|
@ -1537,29 +1550,6 @@ static int amdgpu_vcn_reset_engine(struct amdgpu_device *adev,
|
|||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_vcn_ring_reset - Reset a VCN ring
|
||||
* @ring: ring to reset
|
||||
* @vmid: vmid of guilty job
|
||||
* @timedout_fence: fence of timed out job
|
||||
*
|
||||
* This helper is for VCN blocks without unified queues because
|
||||
* resetting the engine resets all queues in that case. With
|
||||
* unified queues we have one queue per engine.
|
||||
* Returns: 0 on success, or a negative error code on failure.
|
||||
*/
|
||||
int amdgpu_vcn_ring_reset(struct amdgpu_ring *ring,
|
||||
unsigned int vmid,
|
||||
struct amdgpu_fence *timedout_fence)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
if (adev->vcn.inst[ring->me].using_unified_queue)
|
||||
return -EINVAL;
|
||||
|
||||
return amdgpu_vcn_reset_engine(adev, ring->me);
|
||||
}
|
||||
|
||||
int amdgpu_vcn_reg_dump_init(struct amdgpu_device *adev,
|
||||
const struct amdgpu_hwip_reg_entry *reg, u32 count)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -163,6 +163,8 @@ enum AMDGIM_FEATURE_FLAG {
|
|||
AMDGIM_FEATURE_RAS_CPER = (1 << 11),
|
||||
AMDGIM_FEATURE_XGMI_TA_EXT_PEER_LINK = (1 << 12),
|
||||
AMDGIM_FEATURE_XGMI_CONNECTED_TO_CPU = (1 << 13),
|
||||
AMDGIM_FEATURE_PTL_SUPPORT = (1 << 14),
|
||||
AMDGIM_FEATURE_UNITID_SUPPORT = (1 << 15),
|
||||
};
|
||||
|
||||
enum AMDGIM_REG_ACCESS_FLAG {
|
||||
|
|
@ -441,6 +443,8 @@ static inline bool is_virtual_machine(void)
|
|||
((adev)->virt.gim_feature & AMDGIM_FEATURE_VCN_RB_DECOUPLE)
|
||||
#define amdgpu_sriov_is_mes_info_enable(adev) \
|
||||
((adev)->virt.gim_feature & AMDGIM_FEATURE_MES_INFO_ENABLE)
|
||||
#define amdgpu_sriov_is_unitid_support(adev) \
|
||||
((adev)->virt.gim_feature & AMDGIM_FEATURE_UNITID_SUPPORT)
|
||||
|
||||
#define amdgpu_virt_xgmi_migrate_enabled(adev) \
|
||||
((adev)->virt.is_xgmi_node_migrate_enabled && (adev)->gmc.xgmi.node_segment_size != 0)
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
#include "amdgpu_smu.h"
|
||||
#include "soc15_common.h"
|
||||
#include "vpe_v6_1.h"
|
||||
#include "vpe_v2_0.h"
|
||||
|
||||
#define AMDGPU_CSA_VPE_SIZE 64
|
||||
/* VPE CSA resides in the 4th page of CSA */
|
||||
|
|
@ -310,6 +311,9 @@ static int vpe_early_init(struct amdgpu_ip_block *ip_block)
|
|||
vpe_v6_1_set_funcs(vpe);
|
||||
vpe->collaborate_mode = true;
|
||||
break;
|
||||
case IP_VERSION(2, 0, 0):
|
||||
vpe_v2_0_set_funcs(vpe);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
@ -1009,6 +1013,19 @@ const struct amd_ip_funcs vpe_ip_funcs = {
|
|||
.set_powergating_state = vpe_set_powergating_state,
|
||||
};
|
||||
|
||||
const struct amd_ip_funcs vpe2_ip_funcs = {
|
||||
.name = "vpe_v2_0",
|
||||
.early_init = vpe_early_init,
|
||||
.sw_init = vpe_sw_init,
|
||||
.sw_fini = vpe_sw_fini,
|
||||
.hw_init = vpe_hw_init,
|
||||
.hw_fini = vpe_hw_fini,
|
||||
.suspend = vpe_suspend,
|
||||
.resume = vpe_resume,
|
||||
.set_clockgating_state = vpe_set_clockgating_state,
|
||||
.set_powergating_state = vpe_set_powergating_state,
|
||||
};
|
||||
|
||||
const struct amdgpu_ip_block_version vpe_v6_1_ip_block = {
|
||||
.type = AMD_IP_BLOCK_TYPE_VPE,
|
||||
.major = 6,
|
||||
|
|
@ -1016,3 +1033,11 @@ const struct amdgpu_ip_block_version vpe_v6_1_ip_block = {
|
|||
.rev = 0,
|
||||
.funcs = &vpe_ip_funcs,
|
||||
};
|
||||
|
||||
const struct amdgpu_ip_block_version vpe_v2_0_ip_block = {
|
||||
.type = AMD_IP_BLOCK_TYPE_VPE,
|
||||
.major = 2,
|
||||
.minor = 0,
|
||||
.rev = 0,
|
||||
.funcs = &vpe2_ip_funcs,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -107,5 +107,6 @@ int amdgpu_vpe_sysfs_reset_mask_init(struct amdgpu_device *adev);
|
|||
((vpe)->funcs->load_microcode ? (vpe)->funcs->load_microcode((vpe)) : 0)
|
||||
|
||||
extern const struct amdgpu_ip_block_version vpe_v6_1_ip_block;
|
||||
extern const struct amdgpu_ip_block_version vpe_v2_0_ip_block;
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -162,7 +162,9 @@ union amd_sriov_msg_feature_flags {
|
|||
uint32_t ras_cper : 1;
|
||||
uint32_t xgmi_ta_ext_peer_link : 1;
|
||||
uint32_t xgmi_connected_to_cpu : 1;
|
||||
uint32_t reserved : 18;
|
||||
uint32_t ptl_support : 1;
|
||||
uint32_t unitid_support : 1;
|
||||
uint32_t reserved : 16;
|
||||
} flags;
|
||||
uint32_t all;
|
||||
};
|
||||
|
|
@ -256,7 +258,7 @@ struct amd_sriov_msg_pf2vf_info_header {
|
|||
uint32_t reserved[2];
|
||||
};
|
||||
|
||||
#define AMD_SRIOV_MSG_PF2VF_INFO_FILLED_SIZE (55)
|
||||
#define AMD_SRIOV_MSG_PF2VF_INFO_FILLED_SIZE (59)
|
||||
struct amd_sriov_msg_pf2vf_info {
|
||||
/* header contains size and version */
|
||||
struct amd_sriov_msg_pf2vf_info_header header;
|
||||
|
|
@ -314,6 +316,13 @@ struct amd_sriov_msg_pf2vf_info {
|
|||
uint32_t more_bp; //Reserved for future use.
|
||||
union amd_sriov_ras_caps ras_en_caps;
|
||||
union amd_sriov_ras_caps ras_telemetry_en_caps;
|
||||
/* PTL status response for guest */
|
||||
uint32_t ptl_enabled; // PTL enable status: 0=disabled, 1=enabled
|
||||
uint32_t ptl_pref_format1; // Current preferred format 1
|
||||
uint32_t ptl_pref_format2; // Current preferred format 2
|
||||
/* unit ID assigned by host; vf_idx [0..254] maps to unitid [1..255] (0 = pf) */
|
||||
uint8_t unitid;
|
||||
uint8_t padding[3]; //use the 3 bytes to align
|
||||
|
||||
/* reserved */
|
||||
uint32_t reserved[256 - AMD_SRIOV_MSG_PF2VF_INFO_FILLED_SIZE];
|
||||
|
|
|
|||
|
|
@ -602,6 +602,13 @@ static int gfx_v12_0_init_microcode(struct amdgpu_device *adev)
|
|||
"amdgpu/%s_pfp.bin", ucode_prefix);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
adev->gfx.rs64_enable = amdgpu_ucode_hdr_version(
|
||||
(union amdgpu_firmware_header *)
|
||||
adev->gfx.pfp_fw->data, 2, 0);
|
||||
if (adev->gfx.rs64_enable)
|
||||
dev_dbg(adev->dev, "CP RS64 enable\n");
|
||||
|
||||
amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_RS64_PFP);
|
||||
amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_RS64_PFP_P0_STACK);
|
||||
|
||||
|
|
|
|||
|
|
@ -2374,11 +2374,78 @@ static int gfx_v9_4_3_hw_init(struct amdgpu_ip_block *ip_block)
|
|||
return r;
|
||||
}
|
||||
|
||||
static int gfx_v9_4_3_perf_monitor_ptl_init(struct amdgpu_device *adev, bool enable)
|
||||
{
|
||||
struct amdgpu_ptl *ptl = &adev->psp.ptl;
|
||||
uint32_t ptl_state = enable ? 1 : 0;
|
||||
uint32_t fmt1, fmt2;
|
||||
int r;
|
||||
|
||||
if (!adev->psp.funcs)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!ptl->hw_supported) {
|
||||
fmt1 = GFX_FTYPE_VECTOR;
|
||||
fmt2 = GFX_FTYPE_F8;
|
||||
} else {
|
||||
fmt1 = ptl->fmt1;
|
||||
fmt2 = ptl->fmt2;
|
||||
}
|
||||
|
||||
/* initialize PTL with default formats: GFX_FTYPE_VECTOR & GFX_FTYPE_F8 */
|
||||
r = amdgpu_ptl_perf_monitor_ctrl(adev, PSP_PTL_PERF_MON_SET, &ptl_state,
|
||||
&fmt1, &fmt2);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
ptl->hw_supported = true;
|
||||
|
||||
atomic_set(&ptl->disable_ref, 0);
|
||||
if (!enable && !amdgpu_in_reset(adev) && !adev->in_suspend) {
|
||||
dev_dbg(adev->dev,
|
||||
"PTL disabled (amdgpu.ptl=%d)\
|
||||
To enable, set amdgpu.ptl=1 via module param or kernel cmdline\n",
|
||||
amdgpu_ptl);
|
||||
set_bit(AMDGPU_PTL_DISABLE_SYSFS, ptl->disable_bitmap);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gfx_v9_4_3_ptl_hw_init(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_ptl *ptl = &adev->psp.ptl;
|
||||
bool enable;
|
||||
|
||||
switch (amdgpu_ptl) {
|
||||
case 1:
|
||||
enable = true;
|
||||
break;
|
||||
case 2:
|
||||
/* Permanently disabled - cannot be re-enabled */
|
||||
enable = false;
|
||||
ptl->permanently_disabled = true;
|
||||
break;
|
||||
case -1:
|
||||
case 0:
|
||||
default:
|
||||
enable = false;
|
||||
break;
|
||||
}
|
||||
|
||||
gfx_v9_4_3_perf_monitor_ptl_init(adev, enable ? 1 : 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gfx_v9_4_3_hw_fini(struct amdgpu_ip_block *ip_block)
|
||||
{
|
||||
struct amdgpu_device *adev = ip_block->adev;
|
||||
int i, num_xcc;
|
||||
|
||||
if (adev->psp.ptl.hw_supported && !amdgpu_in_reset(adev))
|
||||
gfx_v9_4_3_perf_monitor_ptl_init(adev, false);
|
||||
|
||||
amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0);
|
||||
amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0);
|
||||
amdgpu_irq_put(adev, &adev->gfx.bad_op_irq, 0);
|
||||
|
|
@ -2405,12 +2472,21 @@ static bool gfx_v9_4_3_is_idle(struct amdgpu_ip_block *ip_block)
|
|||
{
|
||||
struct amdgpu_device *adev = ip_block->adev;
|
||||
int i, num_xcc;
|
||||
u32 gc_ip_version;
|
||||
|
||||
num_xcc = NUM_XCC(adev->gfx.xcc_mask);
|
||||
gc_ip_version = amdgpu_ip_version(adev, GC_HWIP, 0);
|
||||
|
||||
for (i = 0; i < num_xcc; i++) {
|
||||
if (REG_GET_FIELD(RREG32_SOC15(GC, GET_INST(GC, i), regGRBM_STATUS),
|
||||
GRBM_STATUS, GUI_ACTIVE))
|
||||
return false;
|
||||
if (gc_ip_version == IP_VERSION(9, 4, 4)) {
|
||||
if (REG_GET_FIELD(RREG32_SOC15(GC, GET_INST(GC, i), regGRBM_STATUS),
|
||||
GRBM_STATUS, SPI_BUSY))
|
||||
return false;
|
||||
} else {
|
||||
if (REG_GET_FIELD(RREG32_SOC15(GC, GET_INST(GC, i), regGRBM_STATUS),
|
||||
GRBM_STATUS, GUI_ACTIVE))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -2553,6 +2629,8 @@ static int gfx_v9_4_3_late_init(struct amdgpu_ip_block *ip_block)
|
|||
adev->gfx.ras->enable_watchdog_timer)
|
||||
adev->gfx.ras->enable_watchdog_timer(adev);
|
||||
|
||||
gfx_v9_4_3_ptl_hw_init(adev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2063,7 +2063,7 @@ static int mes_v12_1_map_test_bo(struct amdgpu_device *adev,
|
|||
|
||||
error:
|
||||
amdgpu_sync_free(&sync);
|
||||
return 0;
|
||||
return r;
|
||||
}
|
||||
|
||||
static int mes_v12_1_test_ring(struct amdgpu_device *adev, int xcc_id,
|
||||
|
|
|
|||
|
|
@ -144,10 +144,13 @@ static void nbif_v6_3_1_vcn_doorbell_range(struct amdgpu_device *adev,
|
|||
{
|
||||
u32 doorbell_range;
|
||||
|
||||
if (instance)
|
||||
if (instance) {
|
||||
if (amdgpu_ip_version(adev, NBIO_HWIP, 0) == IP_VERSION(7, 11, 4))
|
||||
return;
|
||||
doorbell_range = RREG32_SOC15(NBIO, 0, regGDC_S2A0_S2A_DOORBELL_ENTRY_5_CTRL);
|
||||
else
|
||||
} else {
|
||||
doorbell_range = RREG32_SOC15(NBIO, 0, regGDC_S2A0_S2A_DOORBELL_ENTRY_4_CTRL);
|
||||
}
|
||||
|
||||
if (use_doorbell) {
|
||||
doorbell_range = REG_SET_FIELD(doorbell_range,
|
||||
|
|
@ -177,10 +180,7 @@ static void nbif_v6_3_1_vcn_doorbell_range(struct amdgpu_device *adev,
|
|||
0);
|
||||
|
||||
if (amdgpu_ip_version(adev, NBIO_HWIP, 0) == IP_VERSION(7, 11, 4)) {
|
||||
if (instance)
|
||||
WREG32_SOC15(NBIO, 0, regGDC_S2A0_S2A_DOORBELL_ENTRY_5_CTRL_nbif_4_10, doorbell_range);
|
||||
else
|
||||
WREG32_SOC15(NBIO, 0, regGDC_S2A0_S2A_DOORBELL_ENTRY_4_CTRL_nbif_4_10, doorbell_range);
|
||||
WREG32_SOC15(NBIO, 0, regGDC_S2A0_S2A_DOORBELL_ENTRY_4_CTRL_nbif_4_10, doorbell_range);
|
||||
} else {
|
||||
if (instance)
|
||||
WREG32_SOC15(NBIO, 0, regGDC_S2A0_S2A_DOORBELL_ENTRY_5_CTRL, doorbell_range);
|
||||
|
|
@ -189,6 +189,51 @@ static void nbif_v6_3_1_vcn_doorbell_range(struct amdgpu_device *adev,
|
|||
}
|
||||
}
|
||||
|
||||
static void nbif_v6_3_1_vpe_doorbell_range(struct amdgpu_device *adev,
|
||||
int instance, bool use_doorbell,
|
||||
int doorbell_index,
|
||||
int doorbell_size)
|
||||
{
|
||||
if (instance)
|
||||
return;
|
||||
|
||||
u32 doorbell_range = RREG32_SOC15(NBIO, 0, regGDC_S2A0_S2A_DOORBELL_ENTRY_5_CTRL);
|
||||
|
||||
if (use_doorbell) {
|
||||
doorbell_range = REG_SET_FIELD(doorbell_range,
|
||||
GDC_S2A0_S2A_DOORBELL_ENTRY_5_CTRL,
|
||||
S2A_DOORBELL_PORT5_ENABLE,
|
||||
0x1);
|
||||
doorbell_range = REG_SET_FIELD(doorbell_range,
|
||||
GDC_S2A0_S2A_DOORBELL_ENTRY_5_CTRL,
|
||||
S2A_DOORBELL_PORT5_AWID,
|
||||
0xf);
|
||||
doorbell_range = REG_SET_FIELD(doorbell_range,
|
||||
GDC_S2A0_S2A_DOORBELL_ENTRY_5_CTRL,
|
||||
S2A_DOORBELL_PORT5_RANGE_OFFSET,
|
||||
doorbell_index);
|
||||
doorbell_range = REG_SET_FIELD(doorbell_range,
|
||||
GDC_S2A0_S2A_DOORBELL_ENTRY_5_CTRL,
|
||||
S2A_DOORBELL_PORT5_RANGE_SIZE,
|
||||
doorbell_size);
|
||||
doorbell_range = REG_SET_FIELD(doorbell_range,
|
||||
GDC_S2A0_S2A_DOORBELL_ENTRY_5_CTRL,
|
||||
S2A_DOORBELL_PORT5_AWADDR_31_28_VALUE,
|
||||
0xf);
|
||||
} else {
|
||||
doorbell_range = REG_SET_FIELD(doorbell_range,
|
||||
GDC_S2A0_S2A_DOORBELL_ENTRY_5_CTRL,
|
||||
S2A_DOORBELL_PORT5_RANGE_SIZE,
|
||||
0);
|
||||
}
|
||||
|
||||
if (amdgpu_ip_version(adev, NBIO_HWIP, 0) == IP_VERSION(7, 11, 4))
|
||||
WREG32_SOC15(NBIO, 0, regGDC_S2A0_S2A_DOORBELL_ENTRY_5_CTRL_nbif_4_10, doorbell_range);
|
||||
else
|
||||
WREG32_SOC15(NBIO, 0, regGDC_S2A0_S2A_DOORBELL_ENTRY_5_CTRL, doorbell_range);
|
||||
|
||||
}
|
||||
|
||||
static void nbif_v6_3_1_gc_doorbell_init(struct amdgpu_device *adev)
|
||||
{
|
||||
if (amdgpu_ip_version(adev, NBIO_HWIP, 0) == IP_VERSION(7, 11, 4)) {
|
||||
|
|
@ -517,6 +562,7 @@ const struct amdgpu_nbio_funcs nbif_v6_3_1_funcs = {
|
|||
.get_memsize = nbif_v6_3_1_get_memsize,
|
||||
.sdma_doorbell_range = nbif_v6_3_1_sdma_doorbell_range,
|
||||
.vcn_doorbell_range = nbif_v6_3_1_vcn_doorbell_range,
|
||||
.vpe_doorbell_range = nbif_v6_3_1_vpe_doorbell_range,
|
||||
.gc_doorbell_init = nbif_v6_3_1_gc_doorbell_init,
|
||||
.enable_doorbell_aperture = nbif_v6_3_1_enable_doorbell_aperture,
|
||||
.enable_doorbell_selfring_aperture = nbif_v6_3_1_enable_doorbell_selfring_aperture,
|
||||
|
|
|
|||
|
|
@ -107,6 +107,7 @@ enum psp_gfx_cmd_id
|
|||
GFX_CMD_ID_CONFIG_SQ_PERFMON = 0x00000046, /* Config CGTT_SQ_CLK_CTRL */
|
||||
/* Dynamic memory partitioninig (NPS mode change)*/
|
||||
GFX_CMD_ID_FB_NPS_MODE = 0x00000048, /* Configure memory partitioning mode */
|
||||
GFX_CMD_ID_PERF_HW = 0x0000004C, /* performance monitor */
|
||||
GFX_CMD_ID_FB_FW_RESERV_ADDR = 0x00000050, /* Query FW reservation addr */
|
||||
GFX_CMD_ID_FB_FW_RESERV_EXT_ADDR = 0x00000051, /* Query FW reservation extended addr */
|
||||
};
|
||||
|
|
@ -373,6 +374,13 @@ struct psp_gfx_cmd_fb_memory_part {
|
|||
uint32_t resvd;
|
||||
};
|
||||
|
||||
struct psp_gfx_cmd_req_perf_hw {
|
||||
uint32_t req;
|
||||
uint32_t ptl_state;
|
||||
uint32_t pref_format1;
|
||||
uint32_t pref_format2;
|
||||
};
|
||||
|
||||
/* All GFX ring buffer commands. */
|
||||
union psp_gfx_commands
|
||||
{
|
||||
|
|
@ -389,6 +397,7 @@ union psp_gfx_commands
|
|||
struct psp_gfx_cmd_sriov_spatial_part cmd_spatial_part;
|
||||
struct psp_gfx_cmd_config_sq_perfmon config_sq_perfmon;
|
||||
struct psp_gfx_cmd_fb_memory_part cmd_memory_part;
|
||||
struct psp_gfx_cmd_req_perf_hw cmd_req_perf_hw;
|
||||
};
|
||||
|
||||
struct psp_gfx_uresp_reserved
|
||||
|
|
@ -415,12 +424,20 @@ struct psp_gfx_uresp_fw_reserve_info {
|
|||
uint32_t reserve_size;
|
||||
};
|
||||
|
||||
struct psp_gfx_uresp_perf_hw {
|
||||
uint32_t resp;
|
||||
uint32_t ptl_state;
|
||||
uint32_t pref_format1;
|
||||
uint32_t pref_format2;
|
||||
};
|
||||
|
||||
/* Union of command-specific responses for GPCOM ring. */
|
||||
union psp_gfx_uresp {
|
||||
struct psp_gfx_uresp_reserved reserved;
|
||||
struct psp_gfx_uresp_bootcfg boot_cfg;
|
||||
struct psp_gfx_uresp_fwar_db_info fwar_db_info;
|
||||
struct psp_gfx_uresp_fw_reserve_info fw_reserve_info;
|
||||
struct psp_gfx_uresp_perf_hw perf_hw_info;
|
||||
};
|
||||
|
||||
/* Structure of GFX Response buffer.
|
||||
|
|
|
|||
|
|
@ -1686,7 +1686,7 @@ static int vcn_v4_0_3_reset_jpeg_post_helper(struct amdgpu_device *adev, int ins
|
|||
for (i = 0; i < adev->jpeg.num_jpeg_rings; ++i) {
|
||||
ring = &adev->jpeg.inst[inst].ring_dec[i];
|
||||
/* Force completion of any remaining jobs */
|
||||
amdgpu_fence_driver_force_completion(ring);
|
||||
amdgpu_fence_driver_force_completion(ring, NULL);
|
||||
|
||||
if (ring->use_doorbell)
|
||||
WREG32_SOC15_OFFSET(
|
||||
|
|
|
|||
|
|
@ -1332,7 +1332,7 @@ static int vcn_v5_0_1_reset_jpeg_post_helper(struct amdgpu_device *adev, int ins
|
|||
for (i = 0; i < adev->jpeg.num_jpeg_rings; ++i) {
|
||||
ring = &adev->jpeg.inst[inst].ring_dec[i];
|
||||
/* Force completion of any remaining jobs */
|
||||
amdgpu_fence_driver_force_completion(ring);
|
||||
amdgpu_fence_driver_force_completion(ring, NULL);
|
||||
|
||||
if (ring->use_doorbell)
|
||||
WREG32_SOC15_OFFSET(
|
||||
|
|
|
|||
350
drivers/gpu/drm/amd/amdgpu/vpe_v2_0.c
Normal file
350
drivers/gpu/drm/amd/amdgpu/vpe_v2_0.c
Normal file
|
|
@ -0,0 +1,350 @@
|
|||
/*
|
||||
* Copyright 2025 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 <linux/firmware.h>
|
||||
#include "amdgpu.h"
|
||||
#include "amdgpu_ucode.h"
|
||||
#include "amdgpu_vpe.h"
|
||||
#include "vpe_v2_0.h"
|
||||
#include "soc15_common.h"
|
||||
#include "ivsrcid/vpe/irqsrcs_vpe_6_1.h"
|
||||
#include "vpe/vpe_2_0_0_offset.h"
|
||||
#include "vpe/vpe_2_0_0_sh_mask.h"
|
||||
|
||||
MODULE_FIRMWARE("amdgpu/vpe_2_0_0.bin");
|
||||
|
||||
#define VPE_THREAD1_UCODE_OFFSET 0x8000
|
||||
|
||||
static uint32_t vpe_v2_0_get_reg_offset(struct amdgpu_vpe *vpe, uint32_t inst, uint32_t offset)
|
||||
{
|
||||
uint32_t base;
|
||||
|
||||
base = vpe->ring.adev->reg_offset[VPE_HWIP][inst][0];
|
||||
|
||||
return base + offset;
|
||||
}
|
||||
|
||||
static int vpe_v2_0_irq_init(struct amdgpu_vpe *vpe)
|
||||
{
|
||||
struct amdgpu_device *adev = container_of(vpe, struct amdgpu_device, vpe);
|
||||
int ret;
|
||||
|
||||
ret = amdgpu_irq_add_id(adev, SOC21_IH_CLIENTID_VPE,
|
||||
VPE_6_1_SRCID__VPE_TRAP,
|
||||
&adev->vpe.trap_irq);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vpe_v2_0_load_microcode(struct amdgpu_vpe *vpe)
|
||||
{
|
||||
struct amdgpu_device *adev = vpe->ring.adev;
|
||||
const struct vpe_firmware_header_v1_0 *vpe_hdr;
|
||||
const __le32 *data;
|
||||
uint32_t ucode_offset[2], ucode_size[2], size_dw, ret;
|
||||
uint32_t f32_offset, f32_cntl, reg_data;
|
||||
|
||||
ret = RREG32(vpe_get_reg_offset(vpe, 0, regVPEC_CNTL));
|
||||
ret = REG_SET_FIELD(ret, VPEC_CNTL, UMSCH_INT_ENABLE, 0);
|
||||
WREG32(vpe_get_reg_offset(vpe, 0, regVPEC_CNTL), ret);
|
||||
|
||||
reg_data = RREG32(vpe_get_reg_offset(vpe, 0, regVPEC_CNTL2));
|
||||
reg_data = REG_SET_FIELD(reg_data, VPEC_CNTL2, IB_FIFO_WATERMARK, 1);
|
||||
WREG32(vpe_get_reg_offset(vpe, 0, regVPEC_CNTL2), reg_data);
|
||||
|
||||
if (amdgpu_vpe_configure_dpm(vpe))
|
||||
dev_warn(adev->dev, "VPE DPM not enabled.\n");
|
||||
|
||||
if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
|
||||
|
||||
f32_offset = vpe_get_reg_offset(vpe, 0, regVPEC_F32_CNTL);
|
||||
f32_cntl = RREG32(f32_offset);
|
||||
f32_cntl = REG_SET_FIELD(f32_cntl, VPEC_F32_CNTL, HALT, 0);
|
||||
f32_cntl = REG_SET_FIELD(f32_cntl, VPEC_F32_CNTL, TH1_RESET, 0);
|
||||
|
||||
adev->vpe.cmdbuf_cpu_addr[0] = f32_offset;
|
||||
adev->vpe.cmdbuf_cpu_addr[1] = f32_cntl;
|
||||
|
||||
return amdgpu_vpe_psp_update_sram(adev);
|
||||
}
|
||||
|
||||
/* Halt and Check F32 cleaness */
|
||||
f32_offset = vpe_get_reg_offset(vpe, 0, regVPEC_F32_CNTL);
|
||||
f32_cntl = RREG32(f32_offset);
|
||||
f32_cntl = REG_SET_FIELD(f32_cntl, VPEC_F32_CNTL, HALT, 1);
|
||||
f32_cntl = REG_SET_FIELD(f32_cntl, VPEC_F32_CNTL, TH1_RESET, 1);
|
||||
f32_cntl = REG_SET_FIELD(f32_cntl, VPEC_F32_CNTL, TH1_CHECKSUM_CLR, 1);
|
||||
f32_cntl = REG_SET_FIELD(f32_cntl, VPEC_F32_CNTL, TH0_CHECKSUM_CLR, 1);
|
||||
WREG32(vpe_get_reg_offset(vpe, 0, regVPEC_F32_CNTL), f32_cntl);
|
||||
|
||||
f32_cntl = RREG32(f32_offset);
|
||||
if (!REG_GET_FIELD(f32_cntl, VPEC_F32_CNTL, HALT)) {
|
||||
dev_err(adev->dev, "VPEC is not halted");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
f32_cntl = REG_SET_FIELD(f32_cntl, VPEC_F32_CNTL, TH1_CHECKSUM_CLR, 0);
|
||||
f32_cntl = REG_SET_FIELD(f32_cntl, VPEC_F32_CNTL, TH0_CHECKSUM_CLR, 0);
|
||||
WREG32(vpe_get_reg_offset(vpe, 0, regVPEC_F32_CNTL), f32_cntl);
|
||||
|
||||
reg_data = RREG32(vpe_get_reg_offset(vpe, 0, regVPEC_UCODE_CHECKSUM));
|
||||
if (reg_data) {
|
||||
dev_err(adev->dev, "VPE FW checksum 0 not clean");
|
||||
return -EBUSY;
|
||||
}
|
||||
reg_data = RREG32(vpe_get_reg_offset(vpe, 0, regVPEC_UCODE1_CHECKSUM));
|
||||
if (reg_data) {
|
||||
dev_err(adev->dev, "VPE FW checksum 1 not clean");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
reg_data = RREG32(vpe_get_reg_offset(vpe, 0, regVPEC_STATUS2));
|
||||
if (REG_GET_FIELD(reg_data, VPEC_STATUS2, TH0F32_INSTR_PTR)) {
|
||||
dev_err(adev->dev, "VPE FW initial status not clean");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
reg_data = RREG32(vpe_get_reg_offset(vpe, 0, regVPEC_STATUS6));
|
||||
if (REG_GET_FIELD(reg_data, VPEC_STATUS6, TH1F32_INSTR_PTR)) {
|
||||
dev_err(adev->dev, "VPE FW initial status not clean");
|
||||
return -EBUSY;
|
||||
}
|
||||
/* end of F32 cleaness check */
|
||||
|
||||
vpe_hdr = (const struct vpe_firmware_header_v1_0 *)adev->vpe.fw->data;
|
||||
|
||||
/* Thread 0(command thread) ucode offset/size */
|
||||
ucode_offset[0] = le32_to_cpu(vpe_hdr->header.ucode_array_offset_bytes);
|
||||
ucode_size[0] = le32_to_cpu(vpe_hdr->ctx_ucode_size_bytes);
|
||||
/* Thread 1(control thread) ucode offset/size */
|
||||
ucode_offset[1] = le32_to_cpu(vpe_hdr->ctl_ucode_offset);
|
||||
ucode_size[1] = le32_to_cpu(vpe_hdr->ctl_ucode_size_bytes);
|
||||
|
||||
reg_data = RREG32(vpe_get_reg_offset(vpe, 0, regVPEC_PG_CNTL));
|
||||
reg_data = REG_SET_FIELD(reg_data, VPEC_PG_CNTL, PG_EN, 0);
|
||||
WREG32(vpe_get_reg_offset(vpe, 0, regVPEC_PG_CNTL), reg_data);
|
||||
|
||||
for (int j = 0; j < vpe->num_instances; j++) {
|
||||
for (int i = 0; i < 2; i++) {
|
||||
if (i > 0)
|
||||
WREG32(vpe_get_reg_offset(vpe, j, regVPEC_UCODE_ADDR), VPE_THREAD1_UCODE_OFFSET);
|
||||
else
|
||||
WREG32(vpe_get_reg_offset(vpe, j, regVPEC_UCODE_ADDR), 0);
|
||||
|
||||
data = (const __le32 *)(adev->vpe.fw->data + ucode_offset[i]);
|
||||
size_dw = ucode_size[i] / sizeof(__le32);
|
||||
|
||||
while (size_dw--) {
|
||||
if (amdgpu_emu_mode && size_dw % 500 == 0)
|
||||
msleep(1);
|
||||
WREG32(vpe_get_reg_offset(vpe, j, regVPEC_UCODE_DATA), le32_to_cpup(data++));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
reg_data = RREG32(vpe_get_reg_offset(vpe, 0, regVPEC_PG_CNTL));
|
||||
reg_data = REG_SET_FIELD(reg_data, VPEC_PG_CNTL, PG_EN, 1);
|
||||
WREG32(vpe_get_reg_offset(vpe, 0, regVPEC_PG_CNTL), reg_data);
|
||||
|
||||
/* Unhalt F32 */
|
||||
f32_cntl = RREG32(f32_offset);
|
||||
f32_cntl = REG_SET_FIELD(f32_cntl, VPEC_F32_CNTL, HALT, 0);
|
||||
f32_cntl = REG_SET_FIELD(f32_cntl, VPEC_F32_CNTL, TH1_RESET, 0);
|
||||
WREG32(vpe_get_reg_offset(vpe, 0, regVPEC_F32_CNTL), f32_cntl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vpe_v2_0_ring_start(struct amdgpu_vpe *vpe)
|
||||
{
|
||||
struct amdgpu_ring *ring = &vpe->ring;
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
uint32_t doorbell, doorbell_offset;
|
||||
uint32_t rb_bufsz, rb_cntl;
|
||||
uint32_t ib_cntl, i;
|
||||
int ret;
|
||||
|
||||
for (i = 0; i < vpe->num_instances; i++) {
|
||||
/* Set ring buffer size in dwords */
|
||||
rb_bufsz = order_base_2(ring->ring_size / 4);
|
||||
rb_cntl = RREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_RB_CNTL));
|
||||
rb_cntl = REG_SET_FIELD(rb_cntl, VPEC_QUEUE0_RB_CNTL, RB_SIZE, rb_bufsz);
|
||||
rb_cntl = REG_SET_FIELD(rb_cntl, VPEC_QUEUE0_RB_CNTL, RB_PRIV, 1);
|
||||
rb_cntl = REG_SET_FIELD(rb_cntl, VPEC_QUEUE0_RB_CNTL, RB_VMID, 0);
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_RB_CNTL), rb_cntl);
|
||||
|
||||
/* Initialize the ring buffer's read and write pointers */
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_RB_RPTR), 0);
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_RB_RPTR_HI), 0);
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_RB_WPTR), 0);
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_RB_WPTR_HI), 0);
|
||||
|
||||
/* set the wb address whether it's enabled or not */
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_RB_RPTR_ADDR_LO),
|
||||
lower_32_bits(ring->rptr_gpu_addr) & 0xFFFFFFFC);
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_RB_RPTR_ADDR_HI),
|
||||
upper_32_bits(ring->rptr_gpu_addr) & 0xFFFFFFFF);
|
||||
|
||||
rb_cntl = REG_SET_FIELD(rb_cntl, VPEC_QUEUE0_RB_CNTL, RPTR_WRITEBACK_ENABLE, 1);
|
||||
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_RB_BASE), ring->gpu_addr >> 8);
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_RB_BASE_HI), ring->gpu_addr >> 40);
|
||||
|
||||
ring->wptr = 0;
|
||||
|
||||
/* before programing wptr to a less value, need set minor_ptr_update first */
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_MINOR_PTR_UPDATE), 1);
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_RB_WPTR), lower_32_bits(ring->wptr) << 2);
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_RB_WPTR_HI), upper_32_bits(ring->wptr) << 2);
|
||||
/* set minor_ptr_update to 0 after wptr programed */
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_MINOR_PTR_UPDATE), 0);
|
||||
|
||||
doorbell_offset = RREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_DOORBELL_OFFSET));
|
||||
doorbell_offset = REG_SET_FIELD(doorbell_offset, VPEC_QUEUE0_DOORBELL_OFFSET, OFFSET, ring->doorbell_index + i*4);
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_DOORBELL_OFFSET), doorbell_offset);
|
||||
|
||||
doorbell = RREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_DOORBELL));
|
||||
doorbell = REG_SET_FIELD(doorbell, VPEC_QUEUE0_DOORBELL, ENABLE, ring->use_doorbell ? 1 : 0);
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_DOORBELL), doorbell);
|
||||
|
||||
adev->nbio.funcs->vpe_doorbell_range(adev, i, ring->use_doorbell, ring->doorbell_index + i*4, 4);
|
||||
|
||||
rb_cntl = REG_SET_FIELD(rb_cntl, VPEC_QUEUE0_RB_CNTL, RPTR_WRITEBACK_ENABLE, 1);
|
||||
rb_cntl = REG_SET_FIELD(rb_cntl, VPEC_QUEUE0_RB_CNTL, RB_ENABLE, 1);
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_RB_CNTL), rb_cntl);
|
||||
|
||||
ib_cntl = RREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_IB_CNTL));
|
||||
ib_cntl = REG_SET_FIELD(ib_cntl, VPEC_QUEUE0_IB_CNTL, IB_ENABLE, 1);
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE0_IB_CNTL), ib_cntl);
|
||||
}
|
||||
|
||||
ret = amdgpu_ring_test_helper(ring);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vpe_v2_0_ring_stop(struct amdgpu_vpe *vpe)
|
||||
{
|
||||
struct amdgpu_device *adev = vpe->ring.adev;
|
||||
uint32_t queue_reset, i;
|
||||
int ret;
|
||||
|
||||
for (i = 0; i < vpe->num_instances; i++) {
|
||||
queue_reset = RREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE_RESET_REQ));
|
||||
|
||||
queue_reset = REG_SET_FIELD(queue_reset, VPEC_QUEUE_RESET_REQ, QUEUE0_RESET, 1);
|
||||
|
||||
WREG32(vpe_get_reg_offset(vpe, i, regVPEC_QUEUE_RESET_REQ), queue_reset);
|
||||
/* timeout length is adev->timeout_usec */
|
||||
ret = SOC15_WAIT_ON_RREG(VPE, i, regVPEC_QUEUE_RESET_REQ, 0,
|
||||
VPEC_QUEUE_RESET_REQ__QUEUE0_RESET_MASK);
|
||||
|
||||
if (ret)
|
||||
dev_err(adev->dev, "VPE queue reset failed\n");
|
||||
}
|
||||
|
||||
vpe->ring.sched.ready = false;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int vpe_v2_0_set_trap_irq_state(struct amdgpu_device *adev,
|
||||
struct amdgpu_irq_src *source,
|
||||
unsigned int type,
|
||||
enum amdgpu_interrupt_state state)
|
||||
{
|
||||
struct amdgpu_vpe *vpe = &adev->vpe;
|
||||
uint32_t vpe_cntl;
|
||||
|
||||
vpe_cntl = RREG32(vpe_get_reg_offset(vpe, 0, regVPEC_CNTL));
|
||||
vpe_cntl = REG_SET_FIELD(vpe_cntl, VPEC_CNTL, TRAP_ENABLE,
|
||||
state == AMDGPU_IRQ_STATE_ENABLE ? 1 : 0);
|
||||
|
||||
WREG32(vpe_get_reg_offset(vpe, 0, regVPEC_CNTL), vpe_cntl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vpe_v2_0_process_trap_irq(struct amdgpu_device *adev,
|
||||
struct amdgpu_irq_src *source,
|
||||
struct amdgpu_iv_entry *entry)
|
||||
{
|
||||
|
||||
DRM_DEBUG("IH: VPE trap\n");
|
||||
|
||||
switch (entry->client_id) {
|
||||
case SOC21_IH_CLIENTID_VPE:
|
||||
amdgpu_fence_process(&adev->vpe.ring);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vpe_v2_0_set_regs(struct amdgpu_vpe *vpe)
|
||||
{
|
||||
vpe->regs.queue0_rb_rptr_lo = regVPEC_QUEUE0_RB_RPTR;
|
||||
vpe->regs.queue0_rb_rptr_hi = regVPEC_QUEUE0_RB_RPTR_HI;
|
||||
vpe->regs.queue0_rb_wptr_lo = regVPEC_QUEUE0_RB_WPTR;
|
||||
vpe->regs.queue0_rb_wptr_hi = regVPEC_QUEUE0_RB_WPTR_HI;
|
||||
vpe->regs.queue0_preempt = regVPEC_QUEUE0_PREEMPT;
|
||||
vpe->regs.dpm_enable = regVPEC_PUB_DUMMY2;
|
||||
|
||||
vpe->regs.dpm_pratio = regVPEC_QUEUE6_DUMMY4;
|
||||
vpe->regs.dpm_request_interval = regVPEC_QUEUE5_DUMMY3;
|
||||
vpe->regs.dpm_decision_threshold = regVPEC_QUEUE5_DUMMY4;
|
||||
vpe->regs.dpm_busy_clamp_threshold = regVPEC_QUEUE7_DUMMY2;
|
||||
vpe->regs.dpm_idle_clamp_threshold = regVPEC_QUEUE7_DUMMY3;
|
||||
vpe->regs.dpm_request_lv = regVPEC_QUEUE7_DUMMY1;
|
||||
vpe->regs.context_indicator = regVPEC_QUEUE6_DUMMY3;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct vpe_funcs vpe_v2_0_funcs = {
|
||||
.get_reg_offset = vpe_v2_0_get_reg_offset,
|
||||
.set_regs = vpe_v2_0_set_regs,
|
||||
.irq_init = vpe_v2_0_irq_init,
|
||||
.init_microcode = amdgpu_vpe_init_microcode,
|
||||
.load_microcode = vpe_v2_0_load_microcode,
|
||||
.ring_init = amdgpu_vpe_ring_init,
|
||||
.ring_start = vpe_v2_0_ring_start,
|
||||
.ring_stop = vpe_v2_0_ring_stop,
|
||||
.ring_fini = amdgpu_vpe_ring_fini,
|
||||
};
|
||||
|
||||
static const struct amdgpu_irq_src_funcs vpe_v2_0_trap_irq_funcs = {
|
||||
.set = vpe_v2_0_set_trap_irq_state,
|
||||
.process = vpe_v2_0_process_trap_irq,
|
||||
};
|
||||
|
||||
void vpe_v2_0_set_funcs(struct amdgpu_vpe *vpe)
|
||||
{
|
||||
vpe->funcs = &vpe_v2_0_funcs;
|
||||
vpe->trap_irq.funcs = &vpe_v2_0_trap_irq_funcs;
|
||||
}
|
||||
29
drivers/gpu/drm/amd/amdgpu/vpe_v2_0.h
Normal file
29
drivers/gpu/drm/amd/amdgpu/vpe_v2_0.h
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* Copyright 2025 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 __VPE_V2_0_H__
|
||||
#define __VPE_V2_0_H__
|
||||
|
||||
#include "amdgpu_vpe.h"
|
||||
|
||||
void vpe_v2_0_set_funcs(struct amdgpu_vpe *vpe);
|
||||
|
||||
#endif
|
||||
|
|
@ -21,6 +21,7 @@
|
|||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/capability.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/fs.h>
|
||||
|
|
@ -44,6 +45,7 @@
|
|||
#include "kfd_smi_events.h"
|
||||
#include "amdgpu_dma_buf.h"
|
||||
#include "kfd_debug.h"
|
||||
#include "amdgpu_ptl.h"
|
||||
|
||||
static long kfd_ioctl(struct file *, unsigned int, unsigned long);
|
||||
static int kfd_open(struct inode *, struct file *);
|
||||
|
|
@ -1772,6 +1774,108 @@ static int kfd_ioctl_svm(struct file *filep, struct kfd_process *p, void *data)
|
|||
}
|
||||
#endif
|
||||
|
||||
static int kfd_ptl_control(struct kfd_process_device *pdd, bool enable)
|
||||
{
|
||||
struct amdgpu_device *adev = pdd->dev->adev;
|
||||
struct amdgpu_ptl *ptl = &adev->psp.ptl;
|
||||
enum amdgpu_ptl_fmt pref_format1 = ptl->fmt1;
|
||||
enum amdgpu_ptl_fmt pref_format2 = ptl->fmt2;
|
||||
uint32_t ptl_state = enable ? 1 : 0;
|
||||
int ret;
|
||||
|
||||
if (!ptl->hw_supported)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!pdd->dev->kfd2kgd || !pdd->dev->kfd2kgd->ptl_ctrl)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ret = pdd->dev->kfd2kgd->ptl_ctrl(adev, PSP_PTL_PERF_MON_SET,
|
||||
&ptl_state,
|
||||
&pref_format1,
|
||||
&pref_format2);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int kfd_ptl_disable_request(struct kfd_process_device *pdd,
|
||||
struct kfd_process *p)
|
||||
{
|
||||
struct amdgpu_device *adev = pdd->dev->adev;
|
||||
struct amdgpu_ptl *ptl = &adev->psp.ptl;
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&ptl->mutex);
|
||||
|
||||
if (pdd->ptl_disable_req)
|
||||
goto out;
|
||||
|
||||
if (atomic_inc_return(&ptl->disable_ref) == 1) {
|
||||
ret = kfd_ptl_control(pdd, false);
|
||||
if (ret) {
|
||||
atomic_dec(&ptl->disable_ref);
|
||||
dev_warn(pdd->dev->adev->dev,
|
||||
"failed to disable PTL\n");
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
set_bit(AMDGPU_PTL_DISABLE_PROFILER, ptl->disable_bitmap);
|
||||
pdd->ptl_disable_req = true;
|
||||
|
||||
out:
|
||||
mutex_unlock(&ptl->mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int kfd_ptl_disable_release(struct kfd_process_device *pdd,
|
||||
struct kfd_process *p)
|
||||
{
|
||||
struct amdgpu_device *adev = pdd->dev->adev;
|
||||
struct amdgpu_ptl *ptl = &adev->psp.ptl;
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&ptl->mutex);
|
||||
|
||||
if (!pdd->ptl_disable_req)
|
||||
goto out;
|
||||
|
||||
if (atomic_dec_return(&ptl->disable_ref) == 0) {
|
||||
clear_bit(AMDGPU_PTL_DISABLE_PROFILER, ptl->disable_bitmap);
|
||||
ret = kfd_ptl_control(pdd, true);
|
||||
if (ret) {
|
||||
atomic_inc(&ptl->disable_ref);
|
||||
set_bit(AMDGPU_PTL_DISABLE_PROFILER, ptl->disable_bitmap);
|
||||
dev_warn(adev->dev, "Failed to enable PTL on release: %d\n", ret);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
pdd->ptl_disable_req = false;
|
||||
|
||||
out:
|
||||
mutex_unlock(&ptl->mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int kfd_profiler_ptl_control(struct kfd_process *p,
|
||||
struct kfd_ioctl_ptl_control *args)
|
||||
{
|
||||
struct kfd_process_device *pdd;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&p->mutex);
|
||||
pdd = kfd_process_device_data_by_id(p, args->gpu_id);
|
||||
mutex_unlock(&p->mutex);
|
||||
|
||||
if (!pdd || !pdd->dev || !pdd->dev->kfd)
|
||||
return -EINVAL;
|
||||
|
||||
if (args->enable == 0)
|
||||
ret = kfd_ptl_disable_request(pdd, p);
|
||||
else
|
||||
ret = kfd_ptl_disable_release(pdd, p);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int criu_checkpoint_process(struct kfd_process *p,
|
||||
uint8_t __user *user_priv_data,
|
||||
uint64_t *priv_offset)
|
||||
|
|
@ -3216,6 +3320,107 @@ static int kfd_ioctl_create_process(struct file *filep, struct kfd_process *p, v
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline uint32_t profile_lock_device(struct kfd_process *p,
|
||||
uint32_t gpu_id, uint32_t op)
|
||||
{
|
||||
struct kfd_process_device *pdd;
|
||||
struct kfd_dev *kfd;
|
||||
int status = -EINVAL;
|
||||
struct amdgpu_ptl *ptl;
|
||||
|
||||
if (!p)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&p->mutex);
|
||||
pdd = kfd_process_device_data_by_id(p, gpu_id);
|
||||
mutex_unlock(&p->mutex);
|
||||
|
||||
if (!pdd || !pdd->dev || !pdd->dev->kfd)
|
||||
return -EINVAL;
|
||||
|
||||
kfd = pdd->dev->kfd;
|
||||
ptl = &pdd->dev->adev->psp.ptl;
|
||||
|
||||
mutex_lock(&kfd->profiler_lock);
|
||||
if (op == 1) {
|
||||
if (!kfd->profiler_process) {
|
||||
kfd->profiler_process = p;
|
||||
status = 0;
|
||||
mutex_unlock(&kfd->profiler_lock);
|
||||
if (ptl->hw_supported) {
|
||||
status = kfd_ptl_disable_request(pdd, p);
|
||||
if (status != 0)
|
||||
dev_err(kfd_device,
|
||||
"Failed to lock device %d for profiling, error %d\n",
|
||||
gpu_id, status);
|
||||
}
|
||||
return status;
|
||||
} else if (kfd->profiler_process == p) {
|
||||
status = -EALREADY;
|
||||
} else {
|
||||
status = -EBUSY;
|
||||
}
|
||||
} else if (op == 0 && kfd->profiler_process == p) {
|
||||
kfd->profiler_process = NULL;
|
||||
status = 0;
|
||||
mutex_unlock(&kfd->profiler_lock);
|
||||
|
||||
if (ptl->hw_supported) {
|
||||
status = kfd_ptl_disable_release(pdd, p);
|
||||
if (status)
|
||||
dev_err(kfd_device,
|
||||
"Failed to unlock device %d for profiling, error %d\n",
|
||||
gpu_id, status);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
mutex_unlock(&kfd->profiler_lock);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static inline int kfd_profiler_pmc(struct kfd_process *p,
|
||||
struct kfd_ioctl_pmc_settings *args)
|
||||
{
|
||||
struct kfd_process_device *pdd;
|
||||
struct device_queue_manager *dqm;
|
||||
int status;
|
||||
|
||||
/* Check if we have the correct permissions. */
|
||||
if (!perfmon_capable())
|
||||
return -EPERM;
|
||||
|
||||
/* Lock/Unlock the device based on the parameter given in OP */
|
||||
status = profile_lock_device(p, args->gpu_id, args->lock);
|
||||
if (status != 0)
|
||||
return status;
|
||||
|
||||
/* Enable/disable perfcount if requested */
|
||||
mutex_lock(&p->mutex);
|
||||
pdd = kfd_process_device_data_by_id(p, args->gpu_id);
|
||||
dqm = pdd->dev->dqm;
|
||||
mutex_unlock(&p->mutex);
|
||||
|
||||
dqm->ops.set_perfcount(dqm, args->perfcount_enable);
|
||||
return status;
|
||||
}
|
||||
|
||||
static int kfd_ioctl_profiler(struct file *filep, struct kfd_process *p, void *data)
|
||||
{
|
||||
struct kfd_ioctl_profiler_args *args = data;
|
||||
|
||||
switch (args->op) {
|
||||
case KFD_IOC_PROFILER_VERSION:
|
||||
args->version = KFD_IOC_PROFILER_VERSION_NUM;
|
||||
return 0;
|
||||
case KFD_IOC_PROFILER_PMC:
|
||||
return kfd_profiler_pmc(p, &args->pmc);
|
||||
case KFD_IOC_PROFILER_PTL_CONTROL:
|
||||
return kfd_profiler_ptl_control(p, &args->ptl);
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#define AMDKFD_IOCTL_DEF(ioctl, _func, _flags) \
|
||||
[_IOC_NR(ioctl)] = {.cmd = ioctl, .func = _func, .flags = _flags, \
|
||||
.validate = NULL, .cmd_drv = 0, .name = #ioctl}
|
||||
|
|
@ -3342,6 +3547,9 @@ static const struct amdkfd_ioctl_desc amdkfd_ioctls[] = {
|
|||
|
||||
AMDKFD_IOCTL_DEF(AMDKFD_IOC_CREATE_PROCESS,
|
||||
kfd_ioctl_create_process, 0),
|
||||
|
||||
AMDKFD_IOCTL_DEF(AMDKFD_IOC_PROFILER,
|
||||
kfd_ioctl_profiler, 0),
|
||||
};
|
||||
|
||||
#define AMDKFD_CORE_IOCTL_COUNT ARRAY_SIZE(amdkfd_ioctls)
|
||||
|
|
|
|||
|
|
@ -936,6 +936,9 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
|
|||
|
||||
svm_range_set_max_pages(kfd->adev);
|
||||
|
||||
kfd->profiler_process = NULL;
|
||||
mutex_init(&kfd->profiler_lock);
|
||||
|
||||
kfd->init_complete = true;
|
||||
dev_info(kfd_device, "added device %x:%x\n", kfd->adev->pdev->vendor,
|
||||
kfd->adev->pdev->device);
|
||||
|
|
@ -971,6 +974,7 @@ void kgd2kfd_device_exit(struct kfd_dev *kfd)
|
|||
ida_destroy(&kfd->doorbell_ida);
|
||||
kfd_gtt_sa_fini(kfd);
|
||||
amdgpu_amdkfd_free_kernel_mem(kfd->adev, &kfd->gtt_mem);
|
||||
mutex_destroy(&kfd->profiler_lock);
|
||||
}
|
||||
|
||||
kfree(kfd);
|
||||
|
|
@ -1647,6 +1651,22 @@ int kgd2kfd_stop_sched_all_nodes(struct kfd_dev *kfd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int amdgpu_amdkfd_stop_sched_all(struct amdgpu_device *adev)
|
||||
{
|
||||
if (!adev->kfd.init_complete)
|
||||
return 0;
|
||||
|
||||
return kgd2kfd_stop_sched_all_nodes(adev->kfd.dev);
|
||||
}
|
||||
|
||||
int amdgpu_amdkfd_start_sched_all(struct amdgpu_device *adev)
|
||||
{
|
||||
if (!adev->kfd.init_complete)
|
||||
return 0;
|
||||
|
||||
return kgd2kfd_start_sched_all_nodes(adev->kfd.dev);
|
||||
}
|
||||
|
||||
bool kgd2kfd_compute_active(struct kfd_dev *kfd, uint32_t node_id)
|
||||
{
|
||||
struct kfd_node *node;
|
||||
|
|
|
|||
|
|
@ -324,6 +324,29 @@ static int remove_queue_mes_on_reset_option(struct device_queue_manager *dqm, st
|
|||
return r;
|
||||
}
|
||||
|
||||
static void set_perfcount(struct device_queue_manager *dqm, int enable)
|
||||
{
|
||||
struct device_process_node *cur;
|
||||
struct qcm_process_device *qpd;
|
||||
struct queue *q;
|
||||
struct mqd_update_info minfo = { 0 };
|
||||
|
||||
if (!dqm)
|
||||
return;
|
||||
|
||||
minfo.update_flag = (enable == 1 ? UPDATE_FLAG_PERFCOUNT_ENABLE :
|
||||
UPDATE_FLAG_PERFCOUNT_DISABLE);
|
||||
dqm_lock(dqm);
|
||||
list_for_each_entry(cur, &dqm->queues, list) {
|
||||
qpd = cur->qpd;
|
||||
list_for_each_entry(q, &qpd->queues_list, list) {
|
||||
pqm_update_mqd(qpd->pqm, q->properties.queue_id,
|
||||
&minfo);
|
||||
}
|
||||
}
|
||||
dqm_unlock(dqm);
|
||||
}
|
||||
|
||||
static int remove_queue_mes(struct device_queue_manager *dqm, struct queue *q,
|
||||
struct qcm_process_device *qpd)
|
||||
{
|
||||
|
|
@ -1911,10 +1934,11 @@ static int halt_cpsch(struct device_queue_manager *dqm)
|
|||
static int unhalt_cpsch(struct device_queue_manager *dqm)
|
||||
{
|
||||
int ret = 0;
|
||||
struct amdgpu_device *adev = dqm->dev->adev;
|
||||
|
||||
dqm_lock(dqm);
|
||||
if (!dqm->sched_running || !dqm->sched_halt) {
|
||||
WARN_ONCE(!dqm->sched_halt, "Scheduling is not on halt.\n");
|
||||
dev_dbg(adev->dev, "Scheduling is not on halt.\n");
|
||||
dqm_unlock(dqm);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -3113,6 +3137,7 @@ struct device_queue_manager *device_queue_manager_init(struct kfd_node *dev)
|
|||
dqm->ops.reset_queues = reset_queues_cpsch;
|
||||
dqm->ops.get_queue_checkpoint_info = get_queue_checkpoint_info;
|
||||
dqm->ops.checkpoint_mqd = checkpoint_mqd;
|
||||
dqm->ops.set_perfcount = set_perfcount;
|
||||
break;
|
||||
case KFD_SCHED_POLICY_NO_HWS:
|
||||
/* initialize dqm for no cp scheduling */
|
||||
|
|
@ -3133,6 +3158,7 @@ struct device_queue_manager *device_queue_manager_init(struct kfd_node *dev)
|
|||
dqm->ops.get_wave_state = get_wave_state;
|
||||
dqm->ops.get_queue_checkpoint_info = get_queue_checkpoint_info;
|
||||
dqm->ops.checkpoint_mqd = checkpoint_mqd;
|
||||
dqm->ops.set_perfcount = set_perfcount;
|
||||
break;
|
||||
default:
|
||||
dev_err(dev->adev->dev, "Invalid scheduling policy %d\n", dqm->sched_policy);
|
||||
|
|
|
|||
|
|
@ -199,6 +199,8 @@ struct device_queue_manager_ops {
|
|||
const struct queue *q,
|
||||
void *mqd,
|
||||
void *ctl_stack);
|
||||
void (*set_perfcount)(struct device_queue_manager *dqm,
|
||||
int enable);
|
||||
};
|
||||
|
||||
struct device_queue_manager_asic_ops {
|
||||
|
|
|
|||
|
|
@ -123,10 +123,9 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,
|
|||
*/
|
||||
m->cp_hqd_hq_scheduler0 = 1 << 14;
|
||||
|
||||
if (q->format == KFD_QUEUE_FORMAT_AQL) {
|
||||
if (q->format == KFD_QUEUE_FORMAT_AQL)
|
||||
m->cp_hqd_aql_control =
|
||||
1 << CP_HQD_AQL_CONTROL__CONTROL0__SHIFT;
|
||||
}
|
||||
|
||||
if (mm->dev->kfd->cwsr_enabled) {
|
||||
m->cp_hqd_persistent_state |=
|
||||
|
|
@ -141,6 +140,12 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,
|
|||
m->cp_hqd_wg_state_offset = q->ctl_stack_size;
|
||||
}
|
||||
|
||||
mutex_lock(&mm->dev->kfd->profiler_lock);
|
||||
if (mm->dev->kfd->profiler_process != NULL)
|
||||
m->compute_perfcount_enable = 1;
|
||||
|
||||
mutex_unlock(&mm->dev->kfd->profiler_lock);
|
||||
|
||||
*mqd = m;
|
||||
if (gart_addr)
|
||||
*gart_addr = addr;
|
||||
|
|
@ -220,6 +225,13 @@ static void update_mqd(struct mqd_manager *mm, void *mqd,
|
|||
if (mm->dev->kfd->cwsr_enabled)
|
||||
m->cp_hqd_ctx_save_control = 0;
|
||||
|
||||
if (minfo) {
|
||||
if (minfo->update_flag == UPDATE_FLAG_PERFCOUNT_ENABLE)
|
||||
m->compute_perfcount_enable = 1;
|
||||
else if (minfo->update_flag == UPDATE_FLAG_PERFCOUNT_DISABLE)
|
||||
m->compute_perfcount_enable = 0;
|
||||
}
|
||||
|
||||
update_cu_mask(mm, mqd, minfo);
|
||||
set_priority(m, q);
|
||||
|
||||
|
|
|
|||
|
|
@ -163,10 +163,9 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,
|
|||
if (amdgpu_amdkfd_have_atomics_support(mm->dev->adev))
|
||||
m->cp_hqd_hq_status0 |= 1 << 29;
|
||||
|
||||
if (q->format == KFD_QUEUE_FORMAT_AQL) {
|
||||
if (q->format == KFD_QUEUE_FORMAT_AQL)
|
||||
m->cp_hqd_aql_control =
|
||||
1 << CP_HQD_AQL_CONTROL__CONTROL0__SHIFT;
|
||||
}
|
||||
|
||||
if (mm->dev->kfd->cwsr_enabled) {
|
||||
m->cp_hqd_persistent_state |=
|
||||
|
|
@ -181,6 +180,11 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,
|
|||
m->cp_hqd_wg_state_offset = q->ctl_stack_size;
|
||||
}
|
||||
|
||||
mutex_lock(&mm->dev->kfd->profiler_lock);
|
||||
if (mm->dev->kfd->profiler_process != NULL)
|
||||
m->compute_perfcount_enable = 1;
|
||||
mutex_unlock(&mm->dev->kfd->profiler_lock);
|
||||
|
||||
*mqd = m;
|
||||
if (gart_addr)
|
||||
*gart_addr = addr;
|
||||
|
|
@ -258,6 +262,12 @@ static void update_mqd(struct mqd_manager *mm, void *mqd,
|
|||
}
|
||||
if (mm->dev->kfd->cwsr_enabled)
|
||||
m->cp_hqd_ctx_save_control = 0;
|
||||
if (minfo) {
|
||||
if (minfo->update_flag == UPDATE_FLAG_PERFCOUNT_ENABLE)
|
||||
m->compute_perfcount_enable = 1;
|
||||
else if (minfo->update_flag == UPDATE_FLAG_PERFCOUNT_DISABLE)
|
||||
m->compute_perfcount_enable = 0;
|
||||
}
|
||||
|
||||
update_cu_mask(mm, mqd, minfo);
|
||||
set_priority(m, q);
|
||||
|
|
|
|||
|
|
@ -138,10 +138,9 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,
|
|||
if (amdgpu_amdkfd_have_atomics_support(mm->dev->adev))
|
||||
m->cp_hqd_hq_status0 |= 1 << 29;
|
||||
|
||||
if (q->format == KFD_QUEUE_FORMAT_AQL) {
|
||||
if (q->format == KFD_QUEUE_FORMAT_AQL)
|
||||
m->cp_hqd_aql_control =
|
||||
1 << CP_HQD_AQL_CONTROL__CONTROL0__SHIFT;
|
||||
}
|
||||
|
||||
if (mm->dev->kfd->cwsr_enabled) {
|
||||
m->cp_hqd_persistent_state |=
|
||||
|
|
@ -156,6 +155,11 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,
|
|||
m->cp_hqd_wg_state_offset = q->ctl_stack_size;
|
||||
}
|
||||
|
||||
mutex_lock(&mm->dev->kfd->profiler_lock);
|
||||
if (mm->dev->kfd->profiler_process != NULL)
|
||||
m->compute_perfcount_enable = 1;
|
||||
mutex_unlock(&mm->dev->kfd->profiler_lock);
|
||||
|
||||
*mqd = m;
|
||||
if (gart_addr)
|
||||
*gart_addr = addr;
|
||||
|
|
|
|||
|
|
@ -227,10 +227,9 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,
|
|||
m->cp_hqd_aql_control =
|
||||
1 << CP_HQD_AQL_CONTROL__CONTROL0__SHIFT;
|
||||
|
||||
if (q->tba_addr) {
|
||||
if (q->tba_addr)
|
||||
m->compute_pgm_rsrc2 |=
|
||||
(1 << COMPUTE_PGM_RSRC2__TRAP_PRESENT__SHIFT);
|
||||
}
|
||||
|
||||
if (mm->dev->kfd->cwsr_enabled && q->ctx_save_restore_area_address) {
|
||||
m->cp_hqd_persistent_state |=
|
||||
|
|
@ -245,6 +244,11 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,
|
|||
m->cp_hqd_wg_state_offset = q->ctl_stack_size;
|
||||
}
|
||||
|
||||
mutex_lock(&mm->dev->kfd->profiler_lock);
|
||||
if (mm->dev->kfd->profiler_process != NULL)
|
||||
m->compute_perfcount_enable = 1;
|
||||
mutex_unlock(&mm->dev->kfd->profiler_lock);
|
||||
|
||||
*mqd = m;
|
||||
if (gart_addr)
|
||||
*gart_addr = addr;
|
||||
|
|
@ -327,6 +331,13 @@ static void update_mqd(struct mqd_manager *mm, void *mqd,
|
|||
if (mm->dev->kfd->cwsr_enabled && q->ctx_save_restore_area_address)
|
||||
m->cp_hqd_ctx_save_control = 0;
|
||||
|
||||
if (minfo) {
|
||||
if (minfo->update_flag == UPDATE_FLAG_PERFCOUNT_ENABLE)
|
||||
m->compute_perfcount_enable = 1;
|
||||
else if (minfo->update_flag == UPDATE_FLAG_PERFCOUNT_DISABLE)
|
||||
m->compute_perfcount_enable = 0;
|
||||
}
|
||||
|
||||
if (KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 4, 3) &&
|
||||
KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 4, 4) &&
|
||||
KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 5, 0))
|
||||
|
|
|
|||
|
|
@ -148,6 +148,11 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,
|
|||
m->cp_hqd_wg_state_offset = q->ctl_stack_size;
|
||||
}
|
||||
|
||||
mutex_lock(&mm->dev->kfd->profiler_lock);
|
||||
if (mm->dev->kfd->profiler_process != NULL)
|
||||
m->compute_perfcount_enable = 1;
|
||||
mutex_unlock(&mm->dev->kfd->profiler_lock);
|
||||
|
||||
*mqd = m;
|
||||
if (gart_addr)
|
||||
*gart_addr = addr;
|
||||
|
|
@ -230,6 +235,12 @@ static void __update_mqd(struct mqd_manager *mm, void *mqd,
|
|||
m->cp_hqd_ctx_save_control =
|
||||
atc_bit << CP_HQD_CTX_SAVE_CONTROL__ATC__SHIFT |
|
||||
mtype << CP_HQD_CTX_SAVE_CONTROL__MTYPE__SHIFT;
|
||||
if (minfo) {
|
||||
if (minfo->update_flag == UPDATE_FLAG_PERFCOUNT_ENABLE)
|
||||
m->compute_perfcount_enable = 1;
|
||||
else if (minfo->update_flag == UPDATE_FLAG_PERFCOUNT_DISABLE)
|
||||
m->compute_perfcount_enable = 0;
|
||||
}
|
||||
|
||||
update_cu_mask(mm, mqd, minfo);
|
||||
set_priority(m, q);
|
||||
|
|
|
|||
|
|
@ -383,6 +383,11 @@ struct kfd_dev {
|
|||
int kfd_dev_lock;
|
||||
|
||||
atomic_t kfd_processes_count;
|
||||
|
||||
/* Lock for profiler process */
|
||||
struct mutex profiler_lock;
|
||||
/* Process currently holding the lock */
|
||||
struct kfd_process *profiler_process;
|
||||
};
|
||||
|
||||
enum kfd_mempool {
|
||||
|
|
@ -556,6 +561,8 @@ enum mqd_update_flag {
|
|||
UPDATE_FLAG_DBG_WA_ENABLE = 1,
|
||||
UPDATE_FLAG_DBG_WA_DISABLE = 2,
|
||||
UPDATE_FLAG_IS_GWS = 4, /* quirk for gfx9 IP */
|
||||
UPDATE_FLAG_PERFCOUNT_ENABLE = 5,
|
||||
UPDATE_FLAG_PERFCOUNT_DISABLE = 6,
|
||||
};
|
||||
|
||||
struct mqd_update_info {
|
||||
|
|
@ -865,6 +872,8 @@ struct kfd_process_device {
|
|||
bool has_reset_queue;
|
||||
|
||||
u32 pasid;
|
||||
/* Indicates this process has requested PTL stay disabled */
|
||||
bool ptl_disable_req;
|
||||
};
|
||||
|
||||
#define qpd_to_pdd(x) container_of(x, struct kfd_process_device, qpd)
|
||||
|
|
@ -1596,6 +1605,12 @@ static inline bool kfd_is_first_node(struct kfd_node *node)
|
|||
return (node == node->kfd->nodes[0]);
|
||||
}
|
||||
|
||||
/* PTL support */
|
||||
int kfd_ptl_disable_request(struct kfd_process_device *pdd,
|
||||
struct kfd_process *p);
|
||||
int kfd_ptl_disable_release(struct kfd_process_device *pdd,
|
||||
struct kfd_process *p);
|
||||
|
||||
/* Debugfs */
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
|
||||
|
|
|
|||
|
|
@ -1106,6 +1106,16 @@ static void kfd_process_free_outstanding_kfd_bos(struct kfd_process *p)
|
|||
kfd_process_device_free_bos(p->pdds[i]);
|
||||
}
|
||||
|
||||
static void kfd_process_profiler_release(struct kfd_process *p, struct kfd_process_device *pdd)
|
||||
{
|
||||
mutex_lock(&pdd->dev->kfd->profiler_lock);
|
||||
if (pdd->dev->kfd->profiler_process == p) {
|
||||
pdd->qpd.dqm->ops.set_perfcount(pdd->qpd.dqm, 0);
|
||||
pdd->dev->kfd->profiler_process = NULL;
|
||||
}
|
||||
mutex_unlock(&pdd->dev->kfd->profiler_lock);
|
||||
}
|
||||
|
||||
static void kfd_process_destroy_pdds(struct kfd_process *p)
|
||||
{
|
||||
int i;
|
||||
|
|
@ -1117,6 +1127,11 @@ static void kfd_process_destroy_pdds(struct kfd_process *p)
|
|||
|
||||
pr_debug("Releasing pdd (topology id %d, for pid %d)\n",
|
||||
pdd->dev->id, p->lead_thread->pid);
|
||||
kfd_process_profiler_release(p, pdd);
|
||||
|
||||
if (pdd->ptl_disable_req)
|
||||
kfd_ptl_disable_release(pdd, p);
|
||||
|
||||
kfd_process_device_destroy_cwsr_dgpu(pdd);
|
||||
kfd_process_device_destroy_ib_mem(pdd);
|
||||
|
||||
|
|
|
|||
|
|
@ -1870,7 +1870,7 @@ static enum dmub_ips_disable_type dm_get_default_ips_mode(
|
|||
ret = DMUB_IPS_RCG_IN_ACTIVE_IPS2_IN_OFF;
|
||||
break;
|
||||
case IP_VERSION(4, 2, 0):
|
||||
ret = DMUB_IPS_DISABLE_ALL;
|
||||
ret = DMUB_IPS_ENABLE;
|
||||
break;
|
||||
default:
|
||||
/* ASICs older than DCN35 do not have IPSs */
|
||||
|
|
@ -9941,6 +9941,7 @@ static void amdgpu_dm_handle_vrr_transition(struct amdgpu_display_manager *dm,
|
|||
__func__, new_state->base.crtc->base.id);
|
||||
|
||||
scoped_guard(mutex, &dm->dc_lock) {
|
||||
dc_exit_ips_for_hw_access(dm->dc);
|
||||
amdgpu_dm_psr_set_event(dm, new_state->stream, true,
|
||||
psr_event_vrr_transition, true);
|
||||
amdgpu_dm_replay_set_event(dm, new_state->stream, true,
|
||||
|
|
@ -9956,6 +9957,7 @@ static void amdgpu_dm_handle_vrr_transition(struct amdgpu_display_manager *dm,
|
|||
__func__, new_state->base.crtc->base.id);
|
||||
|
||||
scoped_guard(mutex, &dm->dc_lock) {
|
||||
dc_exit_ips_for_hw_access(dm->dc);
|
||||
amdgpu_dm_psr_set_event(dm, new_state->stream, false,
|
||||
psr_event_vrr_transition, false);
|
||||
amdgpu_dm_replay_set_event(dm, new_state->stream, false,
|
||||
|
|
@ -10090,8 +10092,6 @@ static void amdgpu_dm_enable_self_refresh(struct amdgpu_display_manager *dm,
|
|||
amdgpu_dm_psr_set_event(dm, acrtc_state->stream, false,
|
||||
psr_event_hw_programming, false);
|
||||
|
||||
amdgpu_dm_replay_set_event(dm, acrtc_state->stream, true,
|
||||
replay_event_general_ui, true);
|
||||
amdgpu_dm_replay_set_event(dm, acrtc_state->stream, false,
|
||||
replay_event_hw_programming, false);
|
||||
}
|
||||
|
|
@ -10259,6 +10259,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_commit *state,
|
|||
mutex_lock(&dm->dc_lock);
|
||||
acrtc_state->stream->link->psr_settings.psr_dirty_rects_change_timestamp_ns =
|
||||
timestamp_ns;
|
||||
dc_exit_ips_for_hw_access(dm->dc);
|
||||
amdgpu_dm_psr_set_event(dm, acrtc_state->stream, true,
|
||||
psr_event_hw_programming, true);
|
||||
mutex_unlock(&dm->dc_lock);
|
||||
|
|
@ -10616,10 +10617,13 @@ static void amdgpu_dm_mod_power_update_streams(struct drm_atomic_commit *state,
|
|||
*/
|
||||
if (old_crtc_state->active) {
|
||||
scoped_guard(mutex, &dm->dc_lock) {
|
||||
dc_exit_ips_for_hw_access(dm->dc);
|
||||
amdgpu_dm_psr_set_event(dm, dm_old_crtc_state->stream, true,
|
||||
psr_event_hw_programming, true);
|
||||
amdgpu_dm_replay_set_event(dm, dm_old_crtc_state->stream, true,
|
||||
replay_event_hw_programming, true);
|
||||
amdgpu_dm_replay_set_event(dm, dm_old_crtc_state->stream, false,
|
||||
replay_event_general_ui, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -10673,6 +10677,18 @@ static void amdgpu_dm_mod_power_setup_streams(struct drm_atomic_commit *state,
|
|||
mod_power_notify_mode_change(dm->power_module,
|
||||
dm_new_crtc_state->stream,
|
||||
false);
|
||||
|
||||
/*
|
||||
* Block PSR / Replay on the new stream until display settles post-modeset.
|
||||
* These events will be cleared by amdgpu_dm_enable_self_refresh() once
|
||||
* allow_sr_entry becomes true.
|
||||
*/
|
||||
amdgpu_dm_psr_set_event(dm, dm_new_crtc_state->stream, true,
|
||||
psr_event_hw_programming, true);
|
||||
|
||||
amdgpu_dm_replay_set_event(dm, dm_new_crtc_state->stream, true,
|
||||
replay_event_hw_programming | replay_event_general_ui,
|
||||
true);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -613,8 +613,13 @@ int amdgpu_dm_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name)
|
|||
*/
|
||||
ret = wait_for_completion_interruptible_timeout(
|
||||
&commit->hw_done, 10 * HZ);
|
||||
if (ret)
|
||||
if (ret < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (ret == 0) {
|
||||
ret = -ETIMEDOUT;
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
enable = amdgpu_dm_is_valid_crc_source(source);
|
||||
|
|
|
|||
|
|
@ -3163,10 +3163,25 @@ static int replay_get_state(void *data, u64 *val)
|
|||
{
|
||||
struct amdgpu_dm_connector *connector = data;
|
||||
struct dc_link *link = connector->dc_link;
|
||||
struct amdgpu_device *adev = drm_to_adev(connector->base.dev);
|
||||
struct dc *dc = adev->dm.dc;
|
||||
uint64_t state = REPLAY_STATE_INVALID;
|
||||
bool reallow_idle = false;
|
||||
|
||||
mutex_lock(&adev->dm.dc_lock);
|
||||
|
||||
if (dc->idle_optimizations_allowed) {
|
||||
dc_allow_idle_optimizations(dc, false);
|
||||
reallow_idle = true;
|
||||
}
|
||||
|
||||
dc_link_get_replay_state(link, &state);
|
||||
|
||||
if (reallow_idle)
|
||||
dc_allow_idle_optimizations(dc, true);
|
||||
|
||||
mutex_unlock(&adev->dm.dc_lock);
|
||||
|
||||
*val = state;
|
||||
|
||||
return 0;
|
||||
|
|
@ -3179,10 +3194,26 @@ static int replay_set_residency(void *data, u64 val)
|
|||
{
|
||||
struct amdgpu_dm_connector *connector = data;
|
||||
struct dc_link *link = connector->dc_link;
|
||||
struct amdgpu_device *adev = drm_to_adev(connector->base.dev);
|
||||
struct dc *dc = adev->dm.dc;
|
||||
bool is_start = (val != 0);
|
||||
u32 residency = 0;
|
||||
bool reallow_idle = false;
|
||||
|
||||
mutex_lock(&adev->dm.dc_lock);
|
||||
|
||||
if (dc->idle_optimizations_allowed) {
|
||||
dc_allow_idle_optimizations(dc, false);
|
||||
reallow_idle = true;
|
||||
}
|
||||
|
||||
link->dc->link_srv->edp_replay_residency(link, &residency, is_start, PR_RESIDENCY_MODE_PHY);
|
||||
|
||||
if (reallow_idle)
|
||||
dc_allow_idle_optimizations(dc, true);
|
||||
|
||||
mutex_unlock(&adev->dm.dc_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -3193,9 +3224,25 @@ static int replay_get_residency(void *data, u64 *val)
|
|||
{
|
||||
struct amdgpu_dm_connector *connector = data;
|
||||
struct dc_link *link = connector->dc_link;
|
||||
struct amdgpu_device *adev = drm_to_adev(connector->base.dev);
|
||||
struct dc *dc = adev->dm.dc;
|
||||
u32 residency = 0;
|
||||
bool reallow_idle = false;
|
||||
|
||||
mutex_lock(&adev->dm.dc_lock);
|
||||
|
||||
if (dc->idle_optimizations_allowed) {
|
||||
dc_allow_idle_optimizations(dc, false);
|
||||
reallow_idle = true;
|
||||
}
|
||||
|
||||
link->dc->link_srv->edp_replay_residency(link, &residency, false, PR_RESIDENCY_MODE_PHY);
|
||||
|
||||
if (reallow_idle)
|
||||
dc_allow_idle_optimizations(dc, true);
|
||||
|
||||
mutex_unlock(&adev->dm.dc_lock);
|
||||
|
||||
*val = (u64)residency;
|
||||
|
||||
return 0;
|
||||
|
|
@ -3208,10 +3255,25 @@ static int psr_get(void *data, u64 *val)
|
|||
{
|
||||
struct amdgpu_dm_connector *connector = data;
|
||||
struct dc_link *link = connector->dc_link;
|
||||
struct amdgpu_device *adev = drm_to_adev(connector->base.dev);
|
||||
struct dc *dc = adev->dm.dc;
|
||||
enum dc_psr_state state = PSR_STATE0;
|
||||
bool reallow_idle = false;
|
||||
|
||||
mutex_lock(&adev->dm.dc_lock);
|
||||
|
||||
if (dc->idle_optimizations_allowed) {
|
||||
dc_allow_idle_optimizations(dc, false);
|
||||
reallow_idle = true;
|
||||
}
|
||||
|
||||
dc_link_get_psr_state(link, &state);
|
||||
|
||||
if (reallow_idle)
|
||||
dc_allow_idle_optimizations(dc, true);
|
||||
|
||||
mutex_unlock(&adev->dm.dc_lock);
|
||||
|
||||
*val = state;
|
||||
|
||||
return 0;
|
||||
|
|
@ -3224,10 +3286,25 @@ static int psr_read_residency(void *data, u64 *val)
|
|||
{
|
||||
struct amdgpu_dm_connector *connector = data;
|
||||
struct dc_link *link = connector->dc_link;
|
||||
struct amdgpu_device *adev = drm_to_adev(connector->base.dev);
|
||||
struct dc *dc = adev->dm.dc;
|
||||
u32 residency = 0;
|
||||
bool reallow_idle = false;
|
||||
|
||||
mutex_lock(&adev->dm.dc_lock);
|
||||
|
||||
if (dc->idle_optimizations_allowed) {
|
||||
dc_allow_idle_optimizations(dc, false);
|
||||
reallow_idle = true;
|
||||
}
|
||||
|
||||
link->dc->link_srv->edp_get_psr_residency(link, &residency, PSR_RESIDENCY_MODE_PHY);
|
||||
|
||||
if (reallow_idle)
|
||||
dc_allow_idle_optimizations(dc, true);
|
||||
|
||||
mutex_unlock(&adev->dm.dc_lock);
|
||||
|
||||
*val = (u64)residency;
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ static const struct state_dependent_clocks dce80_max_clks_by_state[] = {
|
|||
/* ClocksStatePerformance */
|
||||
{ .display_clk_khz = 625000, .pixel_clk_khz = 400000 } };
|
||||
|
||||
int dentist_get_divider_from_did(int did)
|
||||
unsigned int dentist_get_divider_from_did(unsigned int did)
|
||||
{
|
||||
if (did < DENTIST_BASE_DID_1)
|
||||
did = DENTIST_BASE_DID_1;
|
||||
|
|
@ -155,8 +155,8 @@ static int dce60_get_dp_ref_freq_khz(struct clk_mgr *clk_mgr_base)
|
|||
int dce_get_dp_ref_freq_khz(struct clk_mgr *clk_mgr_base)
|
||||
{
|
||||
struct clk_mgr_internal *clk_mgr = TO_CLK_MGR_INTERNAL(clk_mgr_base);
|
||||
int dprefclk_wdivider;
|
||||
int dprefclk_src_sel;
|
||||
uint32_t dprefclk_wdivider;
|
||||
uint32_t dprefclk_src_sel;
|
||||
int dp_ref_clk_khz;
|
||||
int target_div;
|
||||
|
||||
|
|
|
|||
|
|
@ -54,6 +54,6 @@ int dce_set_clock(
|
|||
|
||||
void dce_clk_mgr_destroy(struct clk_mgr **clk_mgr);
|
||||
|
||||
int dentist_get_divider_from_did(int did);
|
||||
unsigned int dentist_get_divider_from_did(unsigned int did);
|
||||
|
||||
#endif /* _DCE_CLK_MGR_H_ */
|
||||
|
|
|
|||
|
|
@ -430,8 +430,8 @@ void dcn2_read_clocks_from_hw_dentist(struct clk_mgr *clk_mgr_base)
|
|||
struct clk_mgr_internal *clk_mgr = TO_CLK_MGR_INTERNAL(clk_mgr_base);
|
||||
uint32_t dispclk_wdivider;
|
||||
uint32_t dppclk_wdivider;
|
||||
int disp_divider;
|
||||
int dpp_divider;
|
||||
unsigned int disp_divider;
|
||||
unsigned int dpp_divider;
|
||||
|
||||
REG_GET(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_WDIVIDER, &dispclk_wdivider);
|
||||
REG_GET(DENTIST_DISPCLK_CNTL, DENTIST_DPPCLK_WDIVIDER, &dppclk_wdivider);
|
||||
|
|
@ -534,8 +534,8 @@ void dcn20_clk_mgr_construct(
|
|||
struct pp_smu_funcs *pp_smu,
|
||||
struct dccg *dccg)
|
||||
{
|
||||
int dprefclk_did;
|
||||
int target_div;
|
||||
unsigned int dprefclk_did;
|
||||
unsigned int target_div;
|
||||
uint32_t pll_req_reg;
|
||||
struct fixed31_32 pll_req;
|
||||
|
||||
|
|
|
|||
|
|
@ -123,12 +123,12 @@ bool dcn30_smu_test_message(struct clk_mgr_internal *clk_mgr, uint32_t input)
|
|||
return false;
|
||||
}
|
||||
|
||||
bool dcn30_smu_get_smu_version(struct clk_mgr_internal *clk_mgr, unsigned int *version)
|
||||
bool dcn30_smu_get_smu_version(struct clk_mgr_internal *clk_mgr, int *version)
|
||||
{
|
||||
smu_print("SMU Get SMU version\n");
|
||||
|
||||
if (dcn30_smu_send_msg_with_param(clk_mgr,
|
||||
DALSMC_MSG_GetSmuVersion, 0, version)) {
|
||||
DALSMC_MSG_GetSmuVersion, 0, (uint32_t *)version)) {
|
||||
|
||||
smu_print("SMU version: %d\n", *version);
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
struct clk_mgr_internal;
|
||||
|
||||
bool dcn30_smu_test_message(struct clk_mgr_internal *clk_mgr, uint32_t input);
|
||||
bool dcn30_smu_get_smu_version(struct clk_mgr_internal *clk_mgr, unsigned int *version);
|
||||
bool dcn30_smu_get_smu_version(struct clk_mgr_internal *clk_mgr, int *version);
|
||||
bool dcn30_smu_check_driver_if_version(struct clk_mgr_internal *clk_mgr);
|
||||
bool dcn30_smu_check_msg_header_version(struct clk_mgr_internal *clk_mgr);
|
||||
void dcn30_smu_set_dram_addr_high(struct clk_mgr_internal *clk_mgr, uint32_t addr_high);
|
||||
|
|
|
|||
|
|
@ -475,7 +475,7 @@ static int dcn32_get_dispclk_from_dentist(struct clk_mgr *clk_mgr_base)
|
|||
{
|
||||
struct clk_mgr_internal *clk_mgr = TO_CLK_MGR_INTERNAL(clk_mgr_base);
|
||||
uint32_t dispclk_wdivider;
|
||||
int disp_divider;
|
||||
unsigned int disp_divider;
|
||||
|
||||
REG_GET(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_WDIVIDER, &dispclk_wdivider);
|
||||
disp_divider = dentist_get_divider_from_did(dispclk_wdivider);
|
||||
|
|
|
|||
|
|
@ -1490,7 +1490,7 @@ static int dcn401_get_dispclk_from_dentist(struct clk_mgr *clk_mgr_base)
|
|||
{
|
||||
struct clk_mgr_internal *clk_mgr = TO_CLK_MGR_INTERNAL(clk_mgr_base);
|
||||
uint32_t dispclk_wdivider;
|
||||
int disp_divider;
|
||||
unsigned int disp_divider;
|
||||
|
||||
REG_GET(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_WDIVIDER, &dispclk_wdivider);
|
||||
disp_divider = dentist_get_divider_from_did(dispclk_wdivider);
|
||||
|
|
|
|||
|
|
@ -17,14 +17,14 @@ union dcn401_clk_mgr_block_sequence_params {
|
|||
uint32_t ppclk;
|
||||
uint16_t freq_mhz;
|
||||
/* outputs */
|
||||
uint32_t *response;
|
||||
int *response;
|
||||
} update_hardmin_params;
|
||||
struct {
|
||||
/* inputs */
|
||||
uint32_t ppclk;
|
||||
int freq_khz;
|
||||
/* outputs */
|
||||
uint32_t *response;
|
||||
int *response;
|
||||
} update_hardmin_optimized_params;
|
||||
struct {
|
||||
/* inputs */
|
||||
|
|
|
|||
|
|
@ -143,12 +143,12 @@ static bool dcn401_smu_send_msg_with_param_delay(struct clk_mgr_internal *clk_mg
|
|||
return false;
|
||||
}
|
||||
|
||||
bool dcn401_smu_get_smu_version(struct clk_mgr_internal *clk_mgr, unsigned int *version)
|
||||
bool dcn401_smu_get_smu_version(struct clk_mgr_internal *clk_mgr, int *version)
|
||||
{
|
||||
smu_print("SMU Get SMU version\n");
|
||||
|
||||
if (dcn401_smu_send_msg_with_param(clk_mgr,
|
||||
DALSMC_MSG_GetSmuVersion, 0, version)) {
|
||||
DALSMC_MSG_GetSmuVersion, 0, (uint32_t *)version)) {
|
||||
|
||||
smu_print("SMU version: %d\n", *version);
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
|
||||
struct clk_mgr_internal;
|
||||
|
||||
bool dcn401_smu_get_smu_version(struct clk_mgr_internal *clk_mgr, unsigned int *version);
|
||||
bool dcn401_smu_get_smu_version(struct clk_mgr_internal *clk_mgr, int *version);
|
||||
bool dcn401_smu_check_driver_if_version(struct clk_mgr_internal *clk_mgr);
|
||||
bool dcn401_smu_check_msg_header_version(struct clk_mgr_internal *clk_mgr);
|
||||
void dcn401_smu_send_fclk_pstate_message(struct clk_mgr_internal *clk_mgr, bool support);
|
||||
|
|
|
|||
|
|
@ -879,7 +879,7 @@ int dcn42_get_dispclk_from_dentist(struct clk_mgr *clk_mgr_base)
|
|||
(void)clk_mgr_base;
|
||||
struct clk_mgr_internal *clk_mgr = TO_CLK_MGR_INTERNAL(clk_mgr_base);
|
||||
uint32_t dispclk_wdivider;
|
||||
int disp_divider;
|
||||
unsigned int disp_divider;
|
||||
|
||||
REG_GET(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_WDIVIDER, &dispclk_wdivider);
|
||||
disp_divider = dentist_get_divider_from_did(dispclk_wdivider);
|
||||
|
|
@ -1078,10 +1078,11 @@ void dcn42_clk_mgr_construct(
|
|||
|
||||
dcn42_bw_params.vram_type = ctx->dc_bios->integrated_info->memory_type;
|
||||
dcn42_bw_params.dram_channel_width_bytes = ctx->dc_bios->integrated_info->memory_type == 0x22 ? 8 : 4;
|
||||
dcn42_bw_params.num_channels = ctx->dc_bios->integrated_info->ma_channel_number ? ctx->dc_bios->integrated_info->ma_channel_number : 1;
|
||||
clk_mgr->base.base.dprefclk_khz = dcn42_smu_get_dprefclk(&clk_mgr->base);
|
||||
clk_mgr->base.base.clks.ref_dtbclk_khz = dcn42_smu_get_dtbclk(&clk_mgr->base);
|
||||
|
||||
dcn42_bw_params.num_channels = ctx->dc_bios->integrated_info->ma_channel_number ? ctx->dc_bios->integrated_info->ma_channel_number : 2;
|
||||
if (clk_mgr->base.smu_present) {
|
||||
clk_mgr->base.base.clks.ref_dtbclk_khz = dcn42_smu_get_dtbclk(&clk_mgr->base);
|
||||
clk_mgr->base.base.dprefclk_khz = dcn42_smu_get_dprefclk(&clk_mgr->base);
|
||||
}
|
||||
clk_mgr->base.base.bw_params = &dcn42_bw_params;
|
||||
|
||||
if (clk_mgr->base.smu_present)
|
||||
|
|
|
|||
|
|
@ -3011,8 +3011,7 @@ static struct surface_update_descriptor det_surface_update(
|
|||
update_flags->bits.gamut_remap_change ||
|
||||
update_flags->bits.input_csc_change ||
|
||||
update_flags->bits.cm_hist_change ||
|
||||
update_flags->bits.coeff_reduction_change ||
|
||||
update_flags->bits.cursor_csc_color_matrix_change)) {
|
||||
update_flags->bits.coeff_reduction_change)) {
|
||||
elevate_update_type(&overall_type, UPDATE_TYPE_FULL, LOCK_DESCRIPTOR_GLOBAL);
|
||||
}
|
||||
return overall_type;
|
||||
|
|
@ -3102,10 +3101,8 @@ static struct surface_update_descriptor check_update_surfaces_for_stream(
|
|||
stream_update->vrr_active_variable || stream_update->vrr_active_fixed))
|
||||
su_flags->bits.fams_changed = 1;
|
||||
|
||||
if (stream_update->scaler_sharpener_update) {
|
||||
if (stream_update->scaler_sharpener_update)
|
||||
su_flags->bits.scaler_sharpener = 1;
|
||||
elevate_update_type(&overall_type, UPDATE_TYPE_FULL, LOCK_DESCRIPTOR_STREAM);
|
||||
}
|
||||
|
||||
if (stream_update->sharpening_required)
|
||||
su_flags->bits.sharpening_required = 1;
|
||||
|
|
@ -3170,16 +3167,6 @@ static struct surface_update_descriptor check_update_surfaces_for_stream(
|
|||
su_flags->bits.cursor_pos = 1;
|
||||
elevate_update_type(&overall_type, UPDATE_TYPE_FAST, LOCK_DESCRIPTOR_STREAM);
|
||||
}
|
||||
|
||||
if (stream_update->func_shaper) {
|
||||
su_flags->bits.func_shaper = 1;
|
||||
elevate_update_type(&overall_type, UPDATE_TYPE_FULL, LOCK_DESCRIPTOR_STREAM);
|
||||
}
|
||||
|
||||
if (stream_update->lut3d_func) {
|
||||
su_flags->bits.lut3d_func = 1;
|
||||
elevate_update_type(&overall_type, UPDATE_TYPE_FULL, LOCK_DESCRIPTOR_STREAM);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0 ; i < surface_count; i++) {
|
||||
|
|
@ -3844,7 +3831,7 @@ static void program_cursor_attributes_sequence(
|
|||
struct pipe_ctx *pipe_to_program = NULL;
|
||||
bool enable_cursor_offload = dc_dmub_srv_is_cursor_offload_enabled(dc);
|
||||
|
||||
for (k = 0; k < dc->res_pool->pipe_count; k++) {
|
||||
for (k = 0; k < (int)dc->res_pool->pipe_count; k++) {
|
||||
struct pipe_ctx *tmp_pipe = &context->res_ctx.pipe_ctx[k];
|
||||
|
||||
if (tmp_pipe->stream != stream)
|
||||
|
|
@ -3892,7 +3879,7 @@ static void program_cursor_position_sequence(
|
|||
struct pipe_ctx *pipe_to_program = NULL;
|
||||
bool enable_cursor_offload = dc_dmub_srv_is_cursor_offload_enabled(dc);
|
||||
|
||||
for (k = 0; k < dc->res_pool->pipe_count; k++) {
|
||||
for (k = 0; k < (int)dc->res_pool->pipe_count; k++) {
|
||||
struct pipe_ctx *tmp_pipe = &context->res_ctx.pipe_ctx[k];
|
||||
|
||||
if (tmp_pipe->stream != stream ||
|
||||
|
|
@ -4082,7 +4069,7 @@ static void commit_planes_do_stream_update_sequence(struct dc *dc,
|
|||
*num_steps = 0; // Initialize to 0
|
||||
|
||||
// Stream updates
|
||||
for (j = 0; j < dc->res_pool->pipe_count; j++) {
|
||||
for (j = 0; j < (int)dc->res_pool->pipe_count; j++) {
|
||||
struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[j];
|
||||
|
||||
if (resource_is_pipe_type(pipe_ctx, OTG_MASTER) && pipe_ctx->stream == stream) {
|
||||
|
|
@ -4549,7 +4536,7 @@ static void build_dmub_update_dirty_rect(
|
|||
}
|
||||
}
|
||||
|
||||
bool dc_check_address_only_update(union surface_update_flags update_flags)
|
||||
static bool check_address_only_update(union surface_update_flags update_flags)
|
||||
{
|
||||
union surface_update_flags addr_only_update_flags;
|
||||
addr_only_update_flags.raw = 0;
|
||||
|
|
@ -4655,7 +4642,7 @@ static void commit_planes_for_stream_fast(struct dc *dc,
|
|||
for (i = 0; i < surface_count; i++) {
|
||||
if (srf_updates[i].surface &&
|
||||
srf_updates[i].surface->update_flags.raw &&
|
||||
!dc_check_address_only_update(srf_updates[i].surface->update_flags)) {
|
||||
!check_address_only_update(srf_updates[i].surface->update_flags)) {
|
||||
/* more than address update, need to acquire FAMS2 lock */
|
||||
should_offload_fams2_flip = false;
|
||||
break;
|
||||
|
|
@ -4975,7 +4962,7 @@ static void commit_planes_for_stream(struct dc *dc,
|
|||
if (!pipe_ctx->top_pipe &&
|
||||
!pipe_ctx->prev_odm_pipe &&
|
||||
should_update_pipe_for_stream(context, pipe_ctx, stream)) {
|
||||
struct dc_stream_status *stream_status = NULL;
|
||||
struct dc_stream_status *pipe_stream_status = NULL;
|
||||
|
||||
if (!pipe_ctx->plane_state)
|
||||
continue;
|
||||
|
|
@ -4984,12 +4971,12 @@ static void commit_planes_for_stream(struct dc *dc,
|
|||
if (update_type == UPDATE_TYPE_FAST)
|
||||
continue;
|
||||
|
||||
stream_status =
|
||||
pipe_stream_status =
|
||||
stream_get_status(context, pipe_ctx->stream);
|
||||
|
||||
if (dc->hwss.apply_ctx_for_surface && stream_status)
|
||||
if (dc->hwss.apply_ctx_for_surface && pipe_stream_status)
|
||||
dc->hwss.apply_ctx_for_surface(
|
||||
dc, pipe_ctx->stream, stream_status->plane_count, context);
|
||||
dc, pipe_ctx->stream, pipe_stream_status->plane_count, context);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -5623,6 +5610,127 @@ static bool commit_minimal_transition_state(struct dc *dc,
|
|||
return true;
|
||||
}
|
||||
|
||||
void populate_fast_updates(struct dc_fast_update *fast_update,
|
||||
struct dc_surface_update *srf_updates,
|
||||
int surface_count,
|
||||
struct dc_stream_update *stream_update)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
if (stream_update) {
|
||||
fast_update[0].out_transfer_func = stream_update->out_transfer_func;
|
||||
fast_update[0].output_csc_transform = stream_update->output_csc_transform;
|
||||
fast_update[0].cursor_attributes = stream_update->cursor_attributes;
|
||||
fast_update[0].cursor_position = stream_update->cursor_position;
|
||||
fast_update[0].periodic_interrupt = stream_update->periodic_interrupt;
|
||||
fast_update[0].dither_option = stream_update->dither_option;
|
||||
fast_update[0].gamut_remap = stream_update->gamut_remap;
|
||||
fast_update[0].vrr_infopacket = stream_update->vrr_infopacket;
|
||||
fast_update[0].vsc_infopacket = stream_update->vsc_infopacket;
|
||||
fast_update[0].vsp_infopacket = stream_update->vsp_infopacket;
|
||||
fast_update[0].hfvsif_infopacket = stream_update->hfvsif_infopacket;
|
||||
fast_update[0].vtem_infopacket = stream_update->vtem_infopacket;
|
||||
fast_update[0].adaptive_sync_infopacket = stream_update->adaptive_sync_infopacket;
|
||||
fast_update[0].avi_infopacket = stream_update->avi_infopacket;
|
||||
fast_update[0].hdr_static_metadata = stream_update->hdr_static_metadata;
|
||||
} else {
|
||||
fast_update[0].out_transfer_func = NULL;
|
||||
fast_update[0].output_csc_transform = NULL;
|
||||
fast_update[0].cursor_attributes = NULL;
|
||||
fast_update[0].cursor_position = NULL;
|
||||
fast_update[0].periodic_interrupt = NULL;
|
||||
fast_update[0].dither_option = NULL;
|
||||
fast_update[0].gamut_remap = NULL;
|
||||
fast_update[0].vrr_infopacket = NULL;
|
||||
fast_update[0].vsc_infopacket = NULL;
|
||||
fast_update[0].vsp_infopacket = NULL;
|
||||
fast_update[0].hfvsif_infopacket = NULL;
|
||||
fast_update[0].vtem_infopacket = NULL;
|
||||
fast_update[0].adaptive_sync_infopacket = NULL;
|
||||
fast_update[0].avi_infopacket = NULL;
|
||||
fast_update[0].hdr_static_metadata = NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < surface_count; i++) {
|
||||
fast_update[i].flip_addr = srf_updates[i].flip_addr;
|
||||
fast_update[i].gamma = srf_updates[i].gamma;
|
||||
fast_update[i].gamut_remap_matrix = srf_updates[i].gamut_remap_matrix;
|
||||
fast_update[i].input_csc_color_matrix = srf_updates[i].input_csc_color_matrix;
|
||||
fast_update[i].coeff_reduction_factor = srf_updates[i].coeff_reduction_factor;
|
||||
fast_update[i].cursor_csc_color_matrix = srf_updates[i].cursor_csc_color_matrix;
|
||||
fast_update[i].cm_hist_control = srf_updates[i].cm_hist_control;
|
||||
}
|
||||
}
|
||||
|
||||
static bool fast_updates_exist(const struct dc_fast_update *fast_update, int surface_count)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (fast_update[0].out_transfer_func ||
|
||||
fast_update[0].output_csc_transform ||
|
||||
fast_update[0].cursor_attributes ||
|
||||
fast_update[0].cursor_position ||
|
||||
fast_update[0].periodic_interrupt ||
|
||||
fast_update[0].dither_option ||
|
||||
fast_update[0].gamut_remap ||
|
||||
fast_update[0].vrr_infopacket ||
|
||||
fast_update[0].vsc_infopacket ||
|
||||
fast_update[0].vsp_infopacket ||
|
||||
fast_update[0].hfvsif_infopacket ||
|
||||
fast_update[0].vtem_infopacket ||
|
||||
fast_update[0].adaptive_sync_infopacket ||
|
||||
fast_update[0].avi_infopacket ||
|
||||
fast_update[0].hdr_static_metadata)
|
||||
return true;
|
||||
|
||||
for (i = 0; i < surface_count; i++) {
|
||||
if (fast_update[i].flip_addr ||
|
||||
fast_update[i].gamma ||
|
||||
fast_update[i].gamut_remap_matrix ||
|
||||
fast_update[i].input_csc_color_matrix ||
|
||||
fast_update[i].cursor_csc_color_matrix ||
|
||||
fast_update[i].cm_hist_control ||
|
||||
fast_update[i].coeff_reduction_factor)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool fast_nonaddr_updates_exist(struct dc_fast_update *fast_update, int surface_count)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (fast_update[0].out_transfer_func ||
|
||||
fast_update[0].output_csc_transform ||
|
||||
fast_update[0].gamut_remap ||
|
||||
fast_update[0].cursor_attributes ||
|
||||
fast_update[0].cursor_position ||
|
||||
fast_update[0].periodic_interrupt ||
|
||||
fast_update[0].dither_option ||
|
||||
fast_update[0].vrr_infopacket ||
|
||||
fast_update[0].vsc_infopacket ||
|
||||
fast_update[0].vsp_infopacket ||
|
||||
fast_update[0].hfvsif_infopacket ||
|
||||
fast_update[0].vtem_infopacket ||
|
||||
fast_update[0].adaptive_sync_infopacket ||
|
||||
fast_update[0].avi_infopacket ||
|
||||
fast_update[0].hdr_static_metadata)
|
||||
return true;
|
||||
|
||||
for (i = 0; i < surface_count; i++) {
|
||||
if (fast_update[i].input_csc_color_matrix ||
|
||||
fast_update[i].gamma ||
|
||||
fast_update[i].gamut_remap_matrix ||
|
||||
fast_update[i].coeff_reduction_factor ||
|
||||
fast_update[i].cm_hist_control ||
|
||||
fast_update[i].cursor_csc_color_matrix)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool full_update_required_weak(
|
||||
const struct dc *dc,
|
||||
const struct dc_surface_update *srf_updates,
|
||||
|
|
@ -5651,6 +5759,72 @@ static bool full_update_required_weak(
|
|||
return false;
|
||||
}
|
||||
|
||||
static bool full_update_required(
|
||||
const struct dc *dc,
|
||||
const struct dc_surface_update *srf_updates,
|
||||
int surface_count,
|
||||
const struct dc_stream_update *stream_update,
|
||||
const struct dc_stream_state *stream)
|
||||
{
|
||||
if (full_update_required_weak(dc, srf_updates, surface_count, stream_update, stream))
|
||||
return true;
|
||||
|
||||
for (int i = 0; i < surface_count; i++) {
|
||||
if (srf_updates &&
|
||||
(srf_updates[i].plane_info ||
|
||||
srf_updates[i].scaling_info ||
|
||||
(srf_updates[i].hdr_mult.value &&
|
||||
srf_updates[i].hdr_mult.value != srf_updates->surface->hdr_mult.value) ||
|
||||
(srf_updates[i].sdr_white_level_nits &&
|
||||
srf_updates[i].sdr_white_level_nits != srf_updates->surface->sdr_white_level_nits) ||
|
||||
srf_updates[i].in_transfer_func ||
|
||||
srf_updates[i].func_shaper ||
|
||||
srf_updates[i].lut3d_func ||
|
||||
srf_updates[i].surface->force_full_update ||
|
||||
(srf_updates[i].flip_addr &&
|
||||
srf_updates[i].flip_addr->address.tmz_surface != srf_updates[i].surface->address.tmz_surface) ||
|
||||
(srf_updates[i].cm2_params &&
|
||||
(srf_updates[i].cm2_params->component_settings.shaper_3dlut_setting != srf_updates[i].surface->mcm_shaper_3dlut_setting ||
|
||||
srf_updates[i].cm2_params->component_settings.lut1d_enable != srf_updates[i].surface->mcm_lut1d_enable))))
|
||||
return true;
|
||||
}
|
||||
|
||||
if (stream_update &&
|
||||
(((stream_update->src.height != 0 && stream_update->src.width != 0) ||
|
||||
(stream_update->dst.height != 0 && stream_update->dst.width != 0) ||
|
||||
stream_update->integer_scaling_update) ||
|
||||
stream_update->abm_level ||
|
||||
stream_update->dpms_off ||
|
||||
stream_update->allow_freesync ||
|
||||
stream_update->vrr_active_variable ||
|
||||
stream_update->vrr_active_fixed ||
|
||||
stream_update->output_color_space ||
|
||||
stream_update->wb_update ||
|
||||
stream_update->dsc_config ||
|
||||
stream_update->mst_bw_update ||
|
||||
stream_update->func_shaper ||
|
||||
stream_update->lut3d_func ||
|
||||
stream_update->pending_test_pattern ||
|
||||
stream_update->crtc_timing_adjust ||
|
||||
stream_update->scaler_sharpener_update ||
|
||||
stream_update->hw_cursor_req))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool fast_update_only(
|
||||
const struct dc *dc,
|
||||
const struct dc_fast_update *fast_update,
|
||||
const struct dc_surface_update *srf_updates,
|
||||
int surface_count,
|
||||
const struct dc_stream_update *stream_update,
|
||||
const struct dc_stream_state *stream)
|
||||
{
|
||||
return fast_updates_exist(fast_update, surface_count)
|
||||
&& !full_update_required(dc, srf_updates, surface_count, stream_update, stream);
|
||||
}
|
||||
|
||||
static bool update_planes_and_stream_v2(struct dc *dc,
|
||||
struct dc_surface_update *srf_updates, int surface_count,
|
||||
struct dc_stream_state *stream,
|
||||
|
|
@ -5658,6 +5832,7 @@ static bool update_planes_and_stream_v2(struct dc *dc,
|
|||
{
|
||||
struct dc_state *context;
|
||||
enum surface_update_type update_type;
|
||||
struct dc_fast_update fast_update[MAX_SURFACES] = {0};
|
||||
|
||||
/* In cases where MPO and split or ODM are used transitions can
|
||||
* cause underflow. Apply stream configuration with minimal pipe
|
||||
|
|
@ -5665,7 +5840,11 @@ static bool update_planes_and_stream_v2(struct dc *dc,
|
|||
*/
|
||||
bool force_minimal_pipe_splitting = 0;
|
||||
bool is_plane_addition = 0;
|
||||
bool is_fast_update_only;
|
||||
|
||||
populate_fast_updates(fast_update, srf_updates, surface_count, stream_update);
|
||||
is_fast_update_only = fast_update_only(dc, fast_update, srf_updates,
|
||||
surface_count, stream_update, stream);
|
||||
force_minimal_pipe_splitting = could_mpcc_tree_change_for_active_pipes(
|
||||
dc,
|
||||
stream,
|
||||
|
|
@ -5703,7 +5882,7 @@ static bool update_planes_and_stream_v2(struct dc *dc,
|
|||
commit_minimal_transition_state_in_dc_update(dc, context, stream,
|
||||
srf_updates, surface_count);
|
||||
|
||||
if (update_type == UPDATE_TYPE_FAST && !dc->check_config.enable_legacy_fast_update) {
|
||||
if (is_fast_update_only && !dc->check_config.enable_legacy_fast_update) {
|
||||
commit_planes_for_stream_fast(dc,
|
||||
srf_updates,
|
||||
surface_count,
|
||||
|
|
@ -5739,8 +5918,13 @@ static void commit_planes_and_stream_update_on_current_context(struct dc *dc,
|
|||
struct dc_stream_update *stream_update,
|
||||
enum surface_update_type update_type)
|
||||
{
|
||||
struct dc_fast_update fast_update[MAX_SURFACES] = {0};
|
||||
|
||||
ASSERT(update_type < UPDATE_TYPE_FULL);
|
||||
if (update_type == UPDATE_TYPE_FAST &&
|
||||
populate_fast_updates(fast_update, srf_updates, surface_count,
|
||||
stream_update);
|
||||
if (fast_update_only(dc, fast_update, srf_updates, surface_count,
|
||||
stream_update, stream) &&
|
||||
!dc->check_config.enable_legacy_fast_update)
|
||||
commit_planes_for_stream_fast(dc,
|
||||
srf_updates,
|
||||
|
|
@ -7005,7 +7189,7 @@ bool dc_can_clear_cursor_limit(const struct dc *dc)
|
|||
return false;
|
||||
}
|
||||
|
||||
void dc_get_underflow_debug_data_for_otg(struct dc *dc, int primary_otg_inst,
|
||||
void dc_get_underflow_debug_data_for_otg(struct dc *dc, unsigned int primary_otg_inst,
|
||||
struct dc_underflow_debug_data *out_data)
|
||||
{
|
||||
struct timing_generator *tg = NULL;
|
||||
|
|
@ -7023,7 +7207,7 @@ void dc_get_underflow_debug_data_for_otg(struct dc *dc, int primary_otg_inst,
|
|||
dc->hwss.get_underflow_debug_data(dc, tg, out_data);
|
||||
}
|
||||
|
||||
void dc_get_power_feature_status(struct dc *dc, int primary_otg_inst,
|
||||
void dc_get_power_feature_status(struct dc *dc, unsigned int primary_otg_inst,
|
||||
struct power_features *out_data)
|
||||
{
|
||||
(void)primary_otg_inst;
|
||||
|
|
@ -7743,6 +7927,23 @@ static bool update_planes_and_stream_prepare_v3(
|
|||
ASSERT(scratch->flow == UPDATE_V3_FLOW_INVALID);
|
||||
dc_exit_ips_for_hw_access(scratch->dc);
|
||||
|
||||
/* HWSS path determination needs to be done prior to updating the surface and stream states. */
|
||||
struct dc_fast_update fast_update[MAX_SURFACES] = { 0 };
|
||||
|
||||
populate_fast_updates(fast_update,
|
||||
scratch->surface_updates,
|
||||
scratch->surface_count,
|
||||
scratch->stream_update);
|
||||
|
||||
const bool is_hwss_fast_path_only =
|
||||
fast_update_only(scratch->dc,
|
||||
fast_update,
|
||||
scratch->surface_updates,
|
||||
scratch->surface_count,
|
||||
scratch->stream_update,
|
||||
scratch->stream) &&
|
||||
!scratch->dc->check_config.enable_legacy_fast_update;
|
||||
|
||||
if (!update_planes_and_stream_state(
|
||||
scratch->dc,
|
||||
scratch->surface_updates,
|
||||
|
|
@ -7758,8 +7959,7 @@ static bool update_planes_and_stream_prepare_v3(
|
|||
if (scratch->new_context == scratch->dc->current_state) {
|
||||
ASSERT(scratch->update_type < UPDATE_TYPE_FULL);
|
||||
|
||||
scratch->flow = (scratch->update_type == UPDATE_TYPE_FAST &&
|
||||
!scratch->dc->check_config.enable_legacy_fast_update)
|
||||
scratch->flow = is_hwss_fast_path_only
|
||||
? UPDATE_V3_FLOW_NO_NEW_CONTEXT_CONTEXT_FAST
|
||||
: UPDATE_V3_FLOW_NO_NEW_CONTEXT_CONTEXT_FULL;
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -1057,18 +1057,6 @@ void hwss_build_fast_sequence(struct dc *dc,
|
|||
(*num_steps)++;
|
||||
}
|
||||
|
||||
if (current_mpc_pipe->plane_state->update_flags.bits.lut_3d &&
|
||||
current_mpc_pipe->plane_state->mcm_luts.lut3d_data.lut3d_src ==
|
||||
DC_CM2_TRANSFER_FUNC_SOURCE_VIDMEM &&
|
||||
current_mpc_pipe->plane_state->mcm_shaper_3dlut_setting ==
|
||||
DC_CM2_SHAPER_3DLUT_SETTING_ENABLE_SHAPER_3DLUT &&
|
||||
current_mpc_pipe->plane_res.hubp->funcs->hubp_enable_3dlut_fl) {
|
||||
block_sequence[*num_steps].params.hubp_enable_3dlut_fl_params.hubp =
|
||||
current_mpc_pipe->plane_res.hubp;
|
||||
block_sequence[*num_steps].func = HUBP_ENABLE_3DLUT_FL;
|
||||
(*num_steps)++;
|
||||
}
|
||||
|
||||
if (hws->funcs.set_input_transfer_func && current_mpc_pipe->plane_state->update_flags.bits.gamma_change) {
|
||||
block_sequence[*num_steps].params.set_input_transfer_func_params.dc = dc;
|
||||
block_sequence[*num_steps].params.set_input_transfer_func_params.pipe_ctx = current_mpc_pipe;
|
||||
|
|
|
|||
|
|
@ -282,7 +282,7 @@ unsigned int dc_dp_trace_get_link_loss_count(struct dc_link *link)
|
|||
struct dc_sink *dc_link_add_remote_sink(
|
||||
struct dc_link *link,
|
||||
const uint8_t *edid,
|
||||
int len,
|
||||
unsigned int len,
|
||||
struct dc_sink_init_data *init_data)
|
||||
{
|
||||
return link->dc->link_srv->add_remote_sink(link, edid, len, init_data);
|
||||
|
|
|
|||
|
|
@ -982,7 +982,7 @@ static struct rect calculate_mpc_slice_in_timing_active(
|
|||
}
|
||||
|
||||
static void calculate_adjust_recout_for_visual_confirm(struct pipe_ctx *pipe_ctx,
|
||||
int *base_offset, int *dpp_offset)
|
||||
unsigned int *base_offset, unsigned int *dpp_offset)
|
||||
{
|
||||
struct dc *dc = pipe_ctx->stream->ctx->dc;
|
||||
*base_offset = 0;
|
||||
|
|
@ -1004,7 +1004,7 @@ static void calculate_adjust_recout_for_visual_confirm(struct pipe_ctx *pipe_ctx
|
|||
static void reverse_adjust_recout_for_visual_confirm(struct rect *recout,
|
||||
struct pipe_ctx *pipe_ctx)
|
||||
{
|
||||
int dpp_offset, base_offset;
|
||||
unsigned int dpp_offset, base_offset;
|
||||
|
||||
calculate_adjust_recout_for_visual_confirm(pipe_ctx, &base_offset,
|
||||
&dpp_offset);
|
||||
|
|
@ -1015,7 +1015,7 @@ static void reverse_adjust_recout_for_visual_confirm(struct rect *recout,
|
|||
static void adjust_recout_for_visual_confirm(struct rect *recout,
|
||||
struct pipe_ctx *pipe_ctx)
|
||||
{
|
||||
int dpp_offset, base_offset;
|
||||
unsigned int dpp_offset, base_offset;
|
||||
|
||||
calculate_adjust_recout_for_visual_confirm(pipe_ctx, &base_offset,
|
||||
&dpp_offset);
|
||||
|
|
@ -1692,7 +1692,7 @@ bool resource_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx)
|
|||
struct pipe_ctx *test_pipe, *split_pipe;
|
||||
struct rect r1 = pipe_ctx->plane_res.scl_data.recout;
|
||||
int r1_right, r1_bottom;
|
||||
int cur_layer = pipe_ctx->plane_state->layer_index;
|
||||
unsigned int cur_layer = pipe_ctx->plane_state->layer_index;
|
||||
|
||||
reverse_adjust_recout_for_visual_confirm(&r1, pipe_ctx);
|
||||
r1_right = r1.x + r1.width;
|
||||
|
|
@ -4103,9 +4103,9 @@ bool dc_resource_is_dsc_encoding_supported(const struct dc *dc)
|
|||
static bool planes_changed_for_existing_stream(struct dc_state *context,
|
||||
struct dc_stream_state *stream,
|
||||
const struct dc_validation_set set[],
|
||||
int set_count)
|
||||
unsigned int set_count)
|
||||
{
|
||||
int i, j;
|
||||
unsigned int i, j;
|
||||
struct dc_stream_status *stream_status = NULL;
|
||||
|
||||
for (i = 0; i < context->stream_count; i++) {
|
||||
|
|
@ -4141,10 +4141,10 @@ static bool add_all_planes_for_stream(
|
|||
const struct dc *dc,
|
||||
struct dc_stream_state *stream,
|
||||
const struct dc_validation_set set[],
|
||||
int set_count,
|
||||
unsigned int set_count,
|
||||
struct dc_state *state)
|
||||
{
|
||||
int i, j;
|
||||
unsigned int i, j;
|
||||
|
||||
for (i = 0; i < set_count; i++)
|
||||
if (set[i].stream == stream)
|
||||
|
|
@ -4182,7 +4182,7 @@ static bool add_all_planes_for_stream(
|
|||
*/
|
||||
enum dc_status dc_validate_with_context(struct dc *dc,
|
||||
const struct dc_validation_set set[],
|
||||
int set_count,
|
||||
unsigned int set_count,
|
||||
struct dc_state *context,
|
||||
enum dc_validate_mode validate_mode)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -218,13 +218,13 @@ struct dc_state *dc_state_create(struct dc *dc, struct dc_state_create_params *p
|
|||
}
|
||||
|
||||
if (dc->caps.dcmode_power_limits_present) {
|
||||
bool status;
|
||||
bool dc_power_status;
|
||||
|
||||
DC_FP_START();
|
||||
status = dml2_create(dc, &dc->dml2_dc_power_options, &state->bw_ctx.dml2_dc_power_source);
|
||||
dc_power_status = dml2_create(dc, &dc->dml2_dc_power_options, &state->bw_ctx.dml2_dc_power_source);
|
||||
DC_FP_END();
|
||||
|
||||
if (!status) {
|
||||
if (!dc_power_status) {
|
||||
dc_state_release(state);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -602,7 +602,7 @@ bool dc_stream_add_writeback(struct dc *dc,
|
|||
|
||||
if (dc->hwss.enable_writeback) {
|
||||
struct dc_stream_status *stream_status = dc_stream_get_status(stream);
|
||||
struct dwbc *dwb = dc->res_pool->dwbc[wb_info->dwb_pipe_inst];
|
||||
dwb = dc->res_pool->dwbc[wb_info->dwb_pipe_inst];
|
||||
if (stream_status)
|
||||
dwb->otg_inst = stream_status->primary_otg_inst;
|
||||
}
|
||||
|
|
@ -614,7 +614,7 @@ bool dc_stream_add_writeback(struct dc *dc,
|
|||
|
||||
/* enable writeback */
|
||||
if (dc->hwss.enable_writeback) {
|
||||
struct dwbc *dwb = dc->res_pool->dwbc[wb_info->dwb_pipe_inst];
|
||||
dwb = dc->res_pool->dwbc[wb_info->dwb_pipe_inst];
|
||||
|
||||
if (dwb->funcs->is_enabled(dwb)) {
|
||||
/* writeback pipe already enabled, only need to update */
|
||||
|
|
|
|||
|
|
@ -34,9 +34,9 @@ void vm_helper_mark_vmid_used(struct vm_helper *vm_helper, unsigned int pos, uin
|
|||
vmids.vmid_usage[1] = 1 << pos;
|
||||
}
|
||||
|
||||
int dc_setup_system_context(struct dc *dc, struct dc_phy_addr_space_config *pa_config)
|
||||
unsigned int dc_setup_system_context(struct dc *dc, struct dc_phy_addr_space_config *pa_config)
|
||||
{
|
||||
int num_vmids = 0;
|
||||
unsigned int num_vmids = 0;
|
||||
|
||||
/* Call HWSS to setup HUBBUB for address config */
|
||||
if (dc->hwss.init_sys_ctx) {
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ struct dcn_dsc_reg_state;
|
|||
struct dcn_optc_reg_state;
|
||||
struct dcn_dccg_reg_state;
|
||||
|
||||
#define DC_VER "3.2.381"
|
||||
#define DC_VER "3.2.382"
|
||||
|
||||
/**
|
||||
* MAX_SURFACES - representative of the upper bound of surfaces that can be piped to a single CRTC
|
||||
|
|
@ -540,7 +540,7 @@ struct dc_config {
|
|||
bool use_default_clock_table;
|
||||
bool force_bios_enable_lttpr;
|
||||
uint8_t force_bios_fixed_vs;
|
||||
int sdpif_request_limit_words_per_umc;
|
||||
unsigned int sdpif_request_limit_words_per_umc;
|
||||
bool dc_mode_clk_limit_support;
|
||||
bool EnableMinDispClkODM;
|
||||
bool enable_auto_dpm_test_logs;
|
||||
|
|
@ -944,20 +944,20 @@ struct dc_virtual_addr_space_config {
|
|||
};
|
||||
|
||||
struct dc_bounding_box_overrides {
|
||||
int sr_exit_time_ns;
|
||||
int sr_enter_plus_exit_time_ns;
|
||||
int sr_exit_z8_time_ns;
|
||||
int sr_enter_plus_exit_z8_time_ns;
|
||||
int urgent_latency_ns;
|
||||
int percent_of_ideal_drambw;
|
||||
int dram_clock_change_latency_ns;
|
||||
int dummy_clock_change_latency_ns;
|
||||
int fclk_clock_change_latency_ns;
|
||||
unsigned int sr_exit_time_ns;
|
||||
unsigned int sr_enter_plus_exit_time_ns;
|
||||
unsigned int sr_exit_z8_time_ns;
|
||||
unsigned int sr_enter_plus_exit_z8_time_ns;
|
||||
unsigned int urgent_latency_ns;
|
||||
unsigned int percent_of_ideal_drambw;
|
||||
unsigned int dram_clock_change_latency_ns;
|
||||
unsigned int dummy_clock_change_latency_ns;
|
||||
unsigned int fclk_clock_change_latency_ns;
|
||||
/* This forces a hard min on the DCFCLK we use
|
||||
* for DML. Unlike the debug option for forcing
|
||||
* DCFCLK, this override affects watermark calculations
|
||||
*/
|
||||
int min_dcfclk_mhz;
|
||||
unsigned int min_dcfclk_mhz;
|
||||
};
|
||||
|
||||
struct dc_qos_info {
|
||||
|
|
@ -990,7 +990,7 @@ struct link_service;
|
|||
struct dc_debug_options {
|
||||
bool disable_dsc;
|
||||
enum visual_confirm visual_confirm;
|
||||
int visual_confirm_rect_height;
|
||||
unsigned int visual_confirm_rect_height;
|
||||
|
||||
bool sanity_checks;
|
||||
bool max_disp_clk;
|
||||
|
|
@ -1026,23 +1026,23 @@ struct dc_debug_options {
|
|||
bool disable_io_clk_power_gate;
|
||||
bool disable_mem_power_gate;
|
||||
bool disable_dio_power_gate;
|
||||
int dsc_min_slice_height_override;
|
||||
int dsc_bpp_increment_div;
|
||||
unsigned int dsc_min_slice_height_override;
|
||||
unsigned int dsc_bpp_increment_div;
|
||||
bool disable_pplib_wm_range;
|
||||
enum wm_report_mode pplib_wm_report_mode;
|
||||
unsigned int min_disp_clk_khz;
|
||||
unsigned int min_dpp_clk_khz;
|
||||
unsigned int min_dram_clk_khz;
|
||||
int sr_exit_time_dpm0_ns;
|
||||
int sr_enter_plus_exit_time_dpm0_ns;
|
||||
int sr_exit_time_ns;
|
||||
int sr_enter_plus_exit_time_ns;
|
||||
int sr_exit_z8_time_ns;
|
||||
int sr_enter_plus_exit_z8_time_ns;
|
||||
int urgent_latency_ns;
|
||||
unsigned int sr_exit_time_dpm0_ns;
|
||||
unsigned int sr_enter_plus_exit_time_dpm0_ns;
|
||||
unsigned int sr_exit_time_ns;
|
||||
unsigned int sr_enter_plus_exit_time_ns;
|
||||
unsigned int sr_exit_z8_time_ns;
|
||||
unsigned int sr_enter_plus_exit_z8_time_ns;
|
||||
unsigned int urgent_latency_ns;
|
||||
uint32_t underflow_assert_delay_us;
|
||||
int percent_of_ideal_drambw;
|
||||
int dram_clock_change_latency_ns;
|
||||
unsigned int percent_of_ideal_drambw;
|
||||
unsigned int dram_clock_change_latency_ns;
|
||||
bool optimized_watermark;
|
||||
int always_scale;
|
||||
bool disable_pplib_clock_request;
|
||||
|
|
@ -1067,8 +1067,8 @@ struct dc_debug_options {
|
|||
uint8_t seamless_boot_odm_combine;
|
||||
uint8_t force_odm_combine_4to1; //bit vector based on otg inst
|
||||
|
||||
int minimum_z8_residency_time;
|
||||
int minimum_z10_residency_time;
|
||||
unsigned int minimum_z8_residency_time;
|
||||
unsigned int minimum_z10_residency_time;
|
||||
bool disable_z9_mpc;
|
||||
unsigned int force_fclk_khz;
|
||||
bool enable_tri_buf;
|
||||
|
|
@ -1117,7 +1117,7 @@ struct dc_debug_options {
|
|||
uint8_t fec_enable_delay_in100us;
|
||||
bool enable_driver_sequence_debug;
|
||||
enum det_size crb_alloc_policy;
|
||||
int crb_alloc_policy_min_disp_count;
|
||||
unsigned int crb_alloc_policy_min_disp_count;
|
||||
bool disable_z10;
|
||||
bool enable_z9_disable_interface;
|
||||
bool psr_skip_crtc_disable;
|
||||
|
|
@ -1219,6 +1219,7 @@ struct dc_debug_options {
|
|||
unsigned int force_vmin_threshold;
|
||||
bool enable_otg_frame_sync_pwa;
|
||||
unsigned int min_deep_sleep_dcfclk_khz;
|
||||
unsigned int force_odm2to1_for_edp_pixclk_mhz;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -1291,7 +1292,7 @@ void dc_hardware_init(struct dc *dc);
|
|||
int dc_get_vmid_use_vector(struct dc *dc);
|
||||
void dc_setup_vm_context(struct dc *dc, struct dc_virtual_addr_space_config *va_config, int vmid);
|
||||
/* Returns the number of vmids supported */
|
||||
int dc_setup_system_context(struct dc *dc, struct dc_phy_addr_space_config *pa_config);
|
||||
unsigned int dc_setup_system_context(struct dc *dc, struct dc_phy_addr_space_config *pa_config);
|
||||
void dc_init_callbacks(struct dc *dc,
|
||||
const struct dc_callback_init *init_params);
|
||||
void dc_deinit_callbacks(struct dc *dc);
|
||||
|
|
@ -1466,14 +1467,11 @@ union surface_update_flags {
|
|||
uint32_t full_update:1;
|
||||
uint32_t sdr_white_level_nits:1;
|
||||
uint32_t cm_hist_change:1;
|
||||
uint32_t reserved:2; /* adjust when adding new flags */
|
||||
} bits;
|
||||
|
||||
uint32_t raw;
|
||||
};
|
||||
|
||||
bool dc_check_address_only_update(union surface_update_flags update_flags);
|
||||
|
||||
#define DC_REMOVE_PLANE_POINTERS 1
|
||||
|
||||
struct dc_plane_state {
|
||||
|
|
@ -1520,7 +1518,7 @@ struct dc_plane_state {
|
|||
bool visible;
|
||||
bool flip_immediate;
|
||||
bool horizontal_mirror;
|
||||
int layer_index;
|
||||
unsigned int layer_index;
|
||||
|
||||
union surface_update_flags update_flags;
|
||||
bool flip_int_enabled;
|
||||
|
|
@ -1550,7 +1548,7 @@ struct dc_plane_state {
|
|||
struct dc_csc_transform cursor_csc_color_matrix;
|
||||
bool adaptive_sharpness_en;
|
||||
int adaptive_sharpness_policy;
|
||||
int sharpness_level;
|
||||
unsigned int sharpness_level;
|
||||
enum linear_light_scaling linear_light_scaling;
|
||||
unsigned int sdr_white_level_nits;
|
||||
struct cm_hist_control cm_hist_control;
|
||||
|
|
@ -1573,7 +1571,7 @@ struct dc_plane_info {
|
|||
bool global_alpha;
|
||||
int global_alpha_value;
|
||||
bool input_csc_enabled;
|
||||
int layer_index;
|
||||
unsigned int layer_index;
|
||||
enum chroma_cositing cositing;
|
||||
};
|
||||
|
||||
|
|
@ -1853,6 +1851,32 @@ struct dc_scaling_info {
|
|||
struct scaling_taps scaling_quality;
|
||||
};
|
||||
|
||||
struct dc_fast_update {
|
||||
const struct dc_flip_addrs *flip_addr;
|
||||
const struct dc_gamma *gamma;
|
||||
const struct colorspace_transform *gamut_remap_matrix;
|
||||
const struct dc_csc_transform *input_csc_color_matrix;
|
||||
const struct fixed31_32 *coeff_reduction_factor;
|
||||
struct dc_transfer_func *out_transfer_func;
|
||||
struct dc_csc_transform *output_csc_transform;
|
||||
const struct dc_csc_transform *cursor_csc_color_matrix;
|
||||
struct cm_hist_control *cm_hist_control;
|
||||
/* stream-level fast updates */
|
||||
const struct colorspace_transform *gamut_remap;
|
||||
const struct dc_cursor_attributes *cursor_attributes;
|
||||
const struct dc_cursor_position *cursor_position;
|
||||
const struct periodic_interrupt_config *periodic_interrupt;
|
||||
const enum dc_dither_option *dither_option;
|
||||
struct dc_info_packet *vrr_infopacket;
|
||||
struct dc_info_packet *vsc_infopacket;
|
||||
struct dc_info_packet *vsp_infopacket;
|
||||
struct dc_info_packet *hfvsif_infopacket;
|
||||
struct dc_info_packet *vtem_infopacket;
|
||||
struct dc_info_packet *adaptive_sync_infopacket;
|
||||
struct dc_info_packet *avi_infopacket;
|
||||
struct dc_info_packet *hdr_static_metadata;
|
||||
};
|
||||
|
||||
struct dc_surface_update {
|
||||
struct dc_plane_state *surface;
|
||||
|
||||
|
|
@ -1965,7 +1989,7 @@ enum dc_status dc_validate_plane(struct dc *dc, const struct dc_plane_state *pla
|
|||
|
||||
enum dc_status dc_validate_with_context(struct dc *dc,
|
||||
const struct dc_validation_set set[],
|
||||
int set_count,
|
||||
unsigned int set_count,
|
||||
struct dc_state *context,
|
||||
enum dc_validate_mode validate_mode);
|
||||
|
||||
|
|
@ -1987,6 +2011,11 @@ bool dc_resource_is_dsc_encoding_supported(const struct dc *dc);
|
|||
void get_audio_check(struct audio_info *aud_modes,
|
||||
struct audio_check *aud_chk);
|
||||
|
||||
bool fast_nonaddr_updates_exist(struct dc_fast_update *fast_update, int surface_count);
|
||||
void populate_fast_updates(struct dc_fast_update *fast_update,
|
||||
struct dc_surface_update *srf_updates,
|
||||
int surface_count,
|
||||
struct dc_stream_update *stream_update);
|
||||
/*
|
||||
* Set up streams and links associated to drive sinks
|
||||
* The streams parameter is an absolute set of all active streams.
|
||||
|
|
@ -2072,7 +2101,7 @@ struct dc_sink_init_data;
|
|||
struct dc_sink *dc_link_add_remote_sink(
|
||||
struct dc_link *dc_link,
|
||||
const uint8_t *edid,
|
||||
int len,
|
||||
unsigned int len,
|
||||
struct dc_sink_init_data *init_data);
|
||||
|
||||
/* Remove remote sink from a link with dc_connection_mst_branch connection type.
|
||||
|
|
@ -2869,9 +2898,9 @@ bool dc_can_clear_cursor_limit(const struct dc *dc);
|
|||
* including OTG underflow status, current read positions, frame count, and per-HUBP debug data.
|
||||
* The results are stored in the provided out_data structure for further analysis or logging.
|
||||
*/
|
||||
void dc_get_underflow_debug_data_for_otg(struct dc *dc, int primary_otg_inst, struct dc_underflow_debug_data *out_data);
|
||||
void dc_get_underflow_debug_data_for_otg(struct dc *dc, unsigned int primary_otg_inst, struct dc_underflow_debug_data *out_data);
|
||||
|
||||
void dc_get_power_feature_status(struct dc *dc, int primary_otg_inst, struct power_features *out_data);
|
||||
void dc_get_power_feature_status(struct dc *dc, unsigned int primary_otg_inst, struct power_features *out_data);
|
||||
|
||||
/*
|
||||
* Software state variables used to program register fields across the display pipeline
|
||||
|
|
|
|||
|
|
@ -488,12 +488,11 @@ bool dc_dmub_srv_p_state_delegate(struct dc *dc, bool should_manage_pstate, stru
|
|||
for (i = 0, k = 0; context && i < dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
|
||||
|
||||
if (!resource_is_pipe_type(pipe, OTG_MASTER))
|
||||
if (!resource_is_pipe_type(pipe, OTG_MASTER) || !pipe->stream)
|
||||
continue;
|
||||
|
||||
stream_status = dc_state_get_stream_status(context, pipe->stream);
|
||||
if (stream_status && stream_status->fpo_in_use) {
|
||||
struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
|
||||
uint8_t min_refresh_in_hz;
|
||||
|
||||
min_refresh_in_hz = (uint8_t)((pipe->stream->timing.min_refresh_in_uhz + 999999) / 1000000);
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ uint32_t dc_dsc_stream_bandwidth_in_kbps(const struct dc_crtc_timing *timing,
|
|||
|
||||
uint32_t dc_dsc_stream_bandwidth_overhead_in_kbps(
|
||||
const struct dc_crtc_timing *timing,
|
||||
const int num_slices_h,
|
||||
const uint32_t num_slices_h,
|
||||
const bool is_dp);
|
||||
|
||||
void dc_dsc_dump_decoder_caps(const struct display_stream_compressor *dsc,
|
||||
|
|
|
|||
|
|
@ -123,9 +123,6 @@ union stream_update_flags {
|
|||
uint32_t info_frame : 1;
|
||||
uint32_t dmdata : 1;
|
||||
uint32_t dither : 1;
|
||||
uint32_t func_shaper : 1;
|
||||
uint32_t lut3d_func : 1;
|
||||
uint32_t reserved : 11; /* adjust when adding new flags */
|
||||
} bits;
|
||||
|
||||
uint32_t raw;
|
||||
|
|
@ -159,8 +156,8 @@ struct luminance_data {
|
|||
int luminance_millinits[LUMINANCE_DATA_TABLE_SIZE];
|
||||
int flicker_criteria_milli_nits_GAMING;
|
||||
int flicker_criteria_milli_nits_STATIC;
|
||||
int nominal_refresh_rate;
|
||||
int dm_max_decrease_from_nominal;
|
||||
unsigned int nominal_refresh_rate;
|
||||
unsigned int dm_max_decrease_from_nominal;
|
||||
};
|
||||
|
||||
enum dc_drr_trigger_mode {
|
||||
|
|
|
|||
|
|
@ -917,7 +917,7 @@ struct dsc_dec_dpcd_caps {
|
|||
union dsc_slice_caps2 slice_caps2;
|
||||
int32_t lb_bit_depth;
|
||||
bool is_block_pred_supported;
|
||||
int32_t edp_max_bits_per_pixel; /* Valid only in eDP */
|
||||
uint32_t edp_max_bits_per_pixel; /* Valid only in eDP */
|
||||
union dsc_color_formats color_formats;
|
||||
union dsc_color_depth color_depth;
|
||||
int32_t throughput_mode_0_mps; /* In MPs */
|
||||
|
|
|
|||
|
|
@ -559,6 +559,18 @@ static enum i2caux_transaction_action i2caux_action_from_payload(struct aux_payl
|
|||
int dce_aux_transfer_raw(struct ddc_service *ddc,
|
||||
struct aux_payload *payload,
|
||||
enum aux_return_code_type *operation_result)
|
||||
{
|
||||
if (ddc->ctx->dc->debug.enable_dmub_aux_for_legacy_ddc ||
|
||||
!ddc->ddc_pin) {
|
||||
return dce_aux_transfer_dmub_raw(ddc, payload, operation_result);
|
||||
} else {
|
||||
return dce_aux_transfer_raw_with_ddc_pin(ddc, payload, operation_result);
|
||||
}
|
||||
}
|
||||
|
||||
int dce_aux_transfer_raw_with_ddc_pin(struct ddc_service *ddc,
|
||||
struct aux_payload *payload,
|
||||
enum aux_return_code_type *operation_result)
|
||||
{
|
||||
struct ddc *ddc_pin = ddc->ddc_pin;
|
||||
struct dce_aux *aux_engine;
|
||||
|
|
@ -740,13 +752,7 @@ bool dce_aux_transfer_with_retries(struct ddc_service *ddc,
|
|||
if (payload->write)
|
||||
dce_aux_log_payload(" write", payload->data, payload->length, 16);
|
||||
|
||||
/* Check whether aux to be processed via dmub or dcn directly */
|
||||
if (ddc->ctx->dc->debug.enable_dmub_aux_for_legacy_ddc
|
||||
|| ddc->ddc_pin == NULL) {
|
||||
ret = dce_aux_transfer_dmub_raw(ddc, payload, &operation_result);
|
||||
} else {
|
||||
ret = dce_aux_transfer_raw(ddc, payload, &operation_result);
|
||||
}
|
||||
ret = dce_aux_transfer_raw(ddc, payload, &operation_result);
|
||||
|
||||
DC_TRACE_LEVEL_MESSAGE(DAL_TRACE_LEVEL_INFORMATION,
|
||||
LOG_FLAG_I2cAux_DceAux,
|
||||
|
|
|
|||
|
|
@ -304,6 +304,10 @@ int dce_aux_transfer_raw(struct ddc_service *ddc,
|
|||
struct aux_payload *cmd,
|
||||
enum aux_return_code_type *operation_result);
|
||||
|
||||
int dce_aux_transfer_raw_with_ddc_pin(struct ddc_service *ddc,
|
||||
struct aux_payload *cmd,
|
||||
enum aux_return_code_type *operation_result);
|
||||
|
||||
int dce_aux_transfer_dmub_raw(struct ddc_service *ddc,
|
||||
struct aux_payload *payload,
|
||||
enum aux_return_code_type *operation_result);
|
||||
|
|
|
|||
|
|
@ -205,7 +205,7 @@ static bool update_cfg_data(
|
|||
static bool dcn21_link_encoder_acquire_phy(struct link_encoder *enc)
|
||||
{
|
||||
struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
|
||||
int value;
|
||||
uint32_t value;
|
||||
|
||||
if (enc->features.flags.bits.DP_IS_USB_C) {
|
||||
REG_GET(RDPCSTX_PHY_CNTL6,
|
||||
|
|
|
|||
|
|
@ -450,7 +450,7 @@ static uint8_t get_frontend_source(
|
|||
unsigned int dcn10_get_dig_frontend(struct link_encoder *enc)
|
||||
{
|
||||
struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
|
||||
int32_t value;
|
||||
uint32_t value;
|
||||
enum engine_id result;
|
||||
|
||||
REG_GET(DIG_BE_CNTL, DIG_FE_SOURCE_SELECT, &value);
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
#ifndef __DM_HELPERS__
|
||||
#define __DM_HELPERS__
|
||||
|
||||
#include "modules/inc/mod_info_packet_types.h"
|
||||
#include "dc_types.h"
|
||||
#include "dc.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -1105,7 +1105,7 @@ static enum dcn_zstate_support_state decide_zstate_support(struct dc *dc, struc
|
|||
}
|
||||
|
||||
static void dcn20_adjust_freesync_v_startup(
|
||||
const struct dc_crtc_timing *dc_crtc_timing, int *vstartup_start)
|
||||
const struct dc_crtc_timing *dc_crtc_timing, unsigned int *vstartup_start)
|
||||
{
|
||||
struct dc_crtc_timing patched_crtc_timing;
|
||||
uint32_t asic_blank_end = 0;
|
||||
|
|
@ -1253,7 +1253,7 @@ void dcn20_calculate_dlg_params(struct dc *dc,
|
|||
|
||||
static void swizzle_to_dml_params(
|
||||
enum swizzle_mode_values swizzle,
|
||||
unsigned int *sw_mode)
|
||||
int *sw_mode)
|
||||
{
|
||||
switch (swizzle) {
|
||||
case DC_SW_LINEAR:
|
||||
|
|
@ -2217,7 +2217,7 @@ static void calculate_wm_set_for_vlevel(int vlevel,
|
|||
{
|
||||
double dram_clock_change_latency_cached = dml->soc.dram_clock_change_latency_us;
|
||||
|
||||
ASSERT(vlevel < dml->soc.num_states);
|
||||
ASSERT(vlevel < (int)dml->soc.num_states);
|
||||
/* only pipe 0 is read for voltage and dcf/soc clocks */
|
||||
pipes[0].clks_cfg.voltage = vlevel;
|
||||
pipes[0].clks_cfg.dcfclk_mhz = dml->soc.clock_limits[vlevel].dcfclk_mhz;
|
||||
|
|
|
|||
|
|
@ -296,7 +296,7 @@ static void CalculateWatermarksAndDRAMSpeedChangeSupport(
|
|||
double UrgentOutOfOrderReturn,
|
||||
double ReturnBW,
|
||||
bool GPUVMEnable,
|
||||
int dpte_group_bytes[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
unsigned int MetaChunkSize,
|
||||
double UrgentLatency,
|
||||
double ExtraLatency,
|
||||
|
|
@ -307,7 +307,7 @@ static void CalculateWatermarksAndDRAMSpeedChangeSupport(
|
|||
double SRExitTime,
|
||||
double SREnterPlusExitTime,
|
||||
double DCFCLKDeepSleep,
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
bool DCCEnable[],
|
||||
double DPPCLK[],
|
||||
double SwathWidthSingleDPPY[],
|
||||
|
|
@ -346,7 +346,7 @@ static void CalculateDCFCLKDeepSleep(
|
|||
double BytePerPixelDETC[],
|
||||
double VRatio[],
|
||||
double SwathWidthY[],
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
double HRatio[],
|
||||
double PixelClock[],
|
||||
double PSCL_THROUGHPUT[],
|
||||
|
|
@ -390,7 +390,7 @@ static void CalculatePixelDeliveryTimes(
|
|||
double VRatioPrefetchC[],
|
||||
unsigned int swath_width_luma_ub[],
|
||||
unsigned int swath_width_chroma_ub[],
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
double HRatio[],
|
||||
double PixelClock[],
|
||||
double PSCL_THROUGHPUT[],
|
||||
|
|
@ -436,7 +436,7 @@ static void CalculateMetaAndPTETimes(
|
|||
unsigned int meta_row_height[],
|
||||
unsigned int meta_req_width[],
|
||||
unsigned int meta_req_height[],
|
||||
int dpte_group_bytes[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
unsigned int PTERequestSizeY[],
|
||||
unsigned int PTERequestSizeC[],
|
||||
unsigned int PixelPTEReqWidthY[],
|
||||
|
|
@ -477,8 +477,8 @@ static double CalculateExtraLatency(
|
|||
bool GPUVMEnable,
|
||||
bool HostVMEnable,
|
||||
int NumberOfActivePlanes,
|
||||
int NumberOfDPP[],
|
||||
int dpte_group_bytes[],
|
||||
unsigned int NumberOfDPP[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
|
||||
double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
|
||||
int HostVMMaxPageTableLevels,
|
||||
|
|
@ -4809,14 +4809,14 @@ void dml21_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
|
|||
mode_lib->vba.MaximumReadBandwidthWithoutPrefetch = 0.0;
|
||||
mode_lib->vba.MaximumReadBandwidthWithPrefetch = 0.0;
|
||||
for (k = 0; k <= mode_lib->vba.NumberOfActivePlanes - 1; k++) {
|
||||
unsigned int m;
|
||||
unsigned int cursor_idx;
|
||||
|
||||
locals->cursor_bw[k] = 0;
|
||||
locals->cursor_bw_pre[k] = 0;
|
||||
for (m = 0; m < mode_lib->vba.NumberOfCursors[k]; m++) {
|
||||
locals->cursor_bw[k] = mode_lib->vba.CursorWidth[k][m] * mode_lib->vba.CursorBPP[k][m]
|
||||
for (cursor_idx = 0; cursor_idx < mode_lib->vba.NumberOfCursors[k]; cursor_idx++) {
|
||||
locals->cursor_bw[k] = mode_lib->vba.CursorWidth[k][cursor_idx] * mode_lib->vba.CursorBPP[k][cursor_idx]
|
||||
/ 8.0 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * mode_lib->vba.VRatio[k];
|
||||
locals->cursor_bw_pre[k] = mode_lib->vba.CursorWidth[k][m] * mode_lib->vba.CursorBPP[k][m]
|
||||
locals->cursor_bw_pre[k] = mode_lib->vba.CursorWidth[k][cursor_idx] * mode_lib->vba.CursorBPP[k][cursor_idx]
|
||||
/ 8.0 / (mode_lib->vba.HTotal[k] / mode_lib->vba.PixelClock[k]) * locals->VRatioPreY[i][j][k];
|
||||
}
|
||||
|
||||
|
|
@ -5257,7 +5257,7 @@ static void CalculateWatermarksAndDRAMSpeedChangeSupport(
|
|||
double UrgentOutOfOrderReturn,
|
||||
double ReturnBW,
|
||||
bool GPUVMEnable,
|
||||
int dpte_group_bytes[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
unsigned int MetaChunkSize,
|
||||
double UrgentLatency,
|
||||
double ExtraLatency,
|
||||
|
|
@ -5268,7 +5268,7 @@ static void CalculateWatermarksAndDRAMSpeedChangeSupport(
|
|||
double SRExitTime,
|
||||
double SREnterPlusExitTime,
|
||||
double DCFCLKDeepSleep,
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
bool DCCEnable[],
|
||||
double DPPCLK[],
|
||||
double SwathWidthSingleDPPY[],
|
||||
|
|
@ -5543,7 +5543,7 @@ static void CalculateDCFCLKDeepSleep(
|
|||
double BytePerPixelDETC[],
|
||||
double VRatio[],
|
||||
double SwathWidthY[],
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
double HRatio[],
|
||||
double PixelClock[],
|
||||
double PSCL_THROUGHPUT[],
|
||||
|
|
@ -5749,7 +5749,7 @@ static void CalculatePixelDeliveryTimes(
|
|||
double VRatioPrefetchC[],
|
||||
unsigned int swath_width_luma_ub[],
|
||||
unsigned int swath_width_chroma_ub[],
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
double HRatio[],
|
||||
double PixelClock[],
|
||||
double PSCL_THROUGHPUT[],
|
||||
|
|
@ -5870,7 +5870,7 @@ static void CalculateMetaAndPTETimes(
|
|||
unsigned int meta_row_height[],
|
||||
unsigned int meta_req_width[],
|
||||
unsigned int meta_req_height[],
|
||||
int dpte_group_bytes[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
unsigned int PTERequestSizeY[],
|
||||
unsigned int PTERequestSizeC[],
|
||||
unsigned int PixelPTEReqWidthY[],
|
||||
|
|
@ -6126,8 +6126,8 @@ static double CalculateExtraLatency(
|
|||
bool GPUVMEnable,
|
||||
bool HostVMEnable,
|
||||
int NumberOfActivePlanes,
|
||||
int NumberOfDPP[],
|
||||
int dpte_group_bytes[],
|
||||
unsigned int NumberOfDPP[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
|
||||
double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
|
||||
int HostVMMaxPageTableLevels,
|
||||
|
|
|
|||
|
|
@ -721,9 +721,9 @@ void dcn3_fpu_build_wm_range_table(struct clk_mgr *base)
|
|||
base->bw_params->wm_table.nv_entries[WM_D].pmfw_breakdown.max_uclk = 0xFFFF;
|
||||
}
|
||||
|
||||
void patch_dcn30_soc_bounding_box(struct dc *dc, struct _vcs_dpi_soc_bounding_box_st *dcn3_0_ip)
|
||||
void patch_dcn30_soc_bounding_box(struct dc *dc, struct _vcs_dpi_soc_bounding_box_st *soc_bb)
|
||||
{
|
||||
(void)dcn3_0_ip;
|
||||
(void)soc_bb;
|
||||
dc_assert_fp_enabled();
|
||||
|
||||
if (dc->ctx->dc_bios->funcs->get_soc_bb_info) {
|
||||
|
|
|
|||
|
|
@ -285,8 +285,8 @@ static void CalculateWatermarksAndDRAMSpeedChangeSupport(
|
|||
static void CalculateDCFCLKDeepSleep(
|
||||
struct display_mode_lib *mode_lib,
|
||||
unsigned int NumberOfActivePlanes,
|
||||
int BytePerPixelY[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelY[],
|
||||
unsigned int BytePerPixelC[],
|
||||
double VRatio[],
|
||||
double VRatioChroma[],
|
||||
double SwathWidthY[],
|
||||
|
|
@ -327,7 +327,7 @@ static void CalculateUrgentBurstFactor(
|
|||
static void UseMinimumDCFCLK(
|
||||
struct display_mode_lib *mode_lib,
|
||||
struct vba_vars_st *v,
|
||||
int MaxPrefetchMode,
|
||||
unsigned int MaxPrefetchMode,
|
||||
int ReorderingBytes);
|
||||
|
||||
static void CalculatePixelDeliveryTimes(
|
||||
|
|
@ -345,7 +345,7 @@ static void CalculatePixelDeliveryTimes(
|
|||
double PSCL_THROUGHPUT[],
|
||||
double PSCL_THROUGHPUT_CHROMA[],
|
||||
double DPPCLK[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelC[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
unsigned int NumberOfCursors[],
|
||||
unsigned int CursorWidth[][2],
|
||||
|
|
@ -370,35 +370,35 @@ static void CalculateMetaAndPTETimes(
|
|||
bool GPUVMEnable,
|
||||
int MetaChunkSize,
|
||||
int MinMetaChunkSizeBytes,
|
||||
int HTotal[],
|
||||
unsigned int HTotal[],
|
||||
double VRatio[],
|
||||
double VRatioChroma[],
|
||||
double DestinationLinesToRequestRowInVBlank[],
|
||||
double DestinationLinesToRequestRowInImmediateFlip[],
|
||||
bool DCCEnable[],
|
||||
double PixelClock[],
|
||||
int BytePerPixelY[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelY[],
|
||||
unsigned int BytePerPixelC[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
int dpte_row_height[],
|
||||
int dpte_row_height_chroma[],
|
||||
int meta_row_width[],
|
||||
int meta_row_width_chroma[],
|
||||
int meta_row_height[],
|
||||
int meta_row_height_chroma[],
|
||||
int meta_req_width[],
|
||||
int meta_req_width_chroma[],
|
||||
int meta_req_height[],
|
||||
int meta_req_height_chroma[],
|
||||
int dpte_group_bytes[],
|
||||
int PTERequestSizeY[],
|
||||
int PTERequestSizeC[],
|
||||
int PixelPTEReqWidthY[],
|
||||
int PixelPTEReqHeightY[],
|
||||
int PixelPTEReqWidthC[],
|
||||
int PixelPTEReqHeightC[],
|
||||
int dpte_row_width_luma_ub[],
|
||||
int dpte_row_width_chroma_ub[],
|
||||
unsigned int dpte_row_height[],
|
||||
unsigned int dpte_row_height_chroma[],
|
||||
unsigned int meta_row_width[],
|
||||
unsigned int meta_row_width_chroma[],
|
||||
unsigned int meta_row_height[],
|
||||
unsigned int meta_row_height_chroma[],
|
||||
unsigned int meta_req_width[],
|
||||
unsigned int meta_req_width_chroma[],
|
||||
unsigned int meta_req_height[],
|
||||
unsigned int meta_req_height_chroma[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
unsigned int PTERequestSizeY[],
|
||||
unsigned int PTERequestSizeC[],
|
||||
unsigned int PixelPTEReqWidthY[],
|
||||
unsigned int PixelPTEReqHeightY[],
|
||||
unsigned int PixelPTEReqWidthC[],
|
||||
unsigned int PixelPTEReqHeightC[],
|
||||
unsigned int dpte_row_width_luma_ub[],
|
||||
unsigned int dpte_row_width_chroma_ub[],
|
||||
double DST_Y_PER_PTE_ROW_NOM_L[],
|
||||
double DST_Y_PER_PTE_ROW_NOM_C[],
|
||||
double DST_Y_PER_META_ROW_NOM_L[],
|
||||
|
|
@ -421,18 +421,18 @@ static void CalculateVMGroupAndRequestTimes(
|
|||
bool GPUVMEnable,
|
||||
unsigned int GPUVMMaxPageTableLevels,
|
||||
unsigned int HTotal[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelC[],
|
||||
double DestinationLinesToRequestVMInVBlank[],
|
||||
double DestinationLinesToRequestVMInImmediateFlip[],
|
||||
bool DCCEnable[],
|
||||
double PixelClock[],
|
||||
int dpte_row_width_luma_ub[],
|
||||
int dpte_row_width_chroma_ub[],
|
||||
int vm_group_bytes[],
|
||||
unsigned int dpte_row_width_luma_ub[],
|
||||
unsigned int dpte_row_width_chroma_ub[],
|
||||
unsigned int vm_group_bytes[],
|
||||
unsigned int dpde0_bytes_per_frame_ub_l[],
|
||||
unsigned int dpde0_bytes_per_frame_ub_c[],
|
||||
int meta_pte_bytes_per_frame_ub_l[],
|
||||
int meta_pte_bytes_per_frame_ub_c[],
|
||||
unsigned int meta_pte_bytes_per_frame_ub_l[],
|
||||
unsigned int meta_pte_bytes_per_frame_ub_c[],
|
||||
double TimePerVMGroupVBlank[],
|
||||
double TimePerVMGroupFlip[],
|
||||
double TimePerVMRequestVBlank[],
|
||||
|
|
@ -446,27 +446,27 @@ static void CalculateStutterEfficiency(
|
|||
double ReturnBW,
|
||||
double SRExitTime,
|
||||
bool SynchronizedVBlank,
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
unsigned int DETBufferSizeY[],
|
||||
int BytePerPixelY[],
|
||||
unsigned int BytePerPixelY[],
|
||||
double BytePerPixelDETY[],
|
||||
double SwathWidthY[],
|
||||
int SwathHeightY[],
|
||||
int SwathHeightC[],
|
||||
unsigned int SwathHeightY[],
|
||||
unsigned int SwathHeightC[],
|
||||
double DCCRateLuma[],
|
||||
double DCCRateChroma[],
|
||||
int HTotal[],
|
||||
int VTotal[],
|
||||
unsigned int HTotal[],
|
||||
unsigned int VTotal[],
|
||||
double PixelClock[],
|
||||
double VRatio[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
int BlockHeight256BytesY[],
|
||||
int BlockWidth256BytesY[],
|
||||
int BlockHeight256BytesC[],
|
||||
int BlockWidth256BytesC[],
|
||||
int DCCYMaxUncompressedBlock[],
|
||||
int DCCCMaxUncompressedBlock[],
|
||||
int VActive[],
|
||||
unsigned int BlockHeight256BytesY[],
|
||||
unsigned int BlockWidth256BytesY[],
|
||||
unsigned int BlockHeight256BytesC[],
|
||||
unsigned int BlockWidth256BytesC[],
|
||||
unsigned int DCCYMaxUncompressedBlock[],
|
||||
unsigned int DCCCMaxUncompressedBlock[],
|
||||
unsigned int VActive[],
|
||||
bool DCCEnable[],
|
||||
bool WritebackEnable[],
|
||||
double ReadBandwidthPlaneLuma[],
|
||||
|
|
@ -486,32 +486,32 @@ static void CalculateSwathAndDETConfiguration(
|
|||
enum scan_direction_class SourceScan[],
|
||||
enum source_format_class SourcePixelFormat[],
|
||||
enum dm_swizzle_mode SurfaceTiling[],
|
||||
int ViewportWidth[],
|
||||
int ViewportHeight[],
|
||||
int SurfaceWidthY[],
|
||||
int SurfaceWidthC[],
|
||||
int SurfaceHeightY[],
|
||||
int SurfaceHeightC[],
|
||||
int Read256BytesBlockHeightY[],
|
||||
int Read256BytesBlockHeightC[],
|
||||
int Read256BytesBlockWidthY[],
|
||||
int Read256BytesBlockWidthC[],
|
||||
unsigned int ViewportWidth[],
|
||||
unsigned int ViewportHeight[],
|
||||
unsigned int SurfaceWidthY[],
|
||||
unsigned int SurfaceWidthC[],
|
||||
unsigned int SurfaceHeightY[],
|
||||
unsigned int SurfaceHeightC[],
|
||||
unsigned int Read256BytesBlockHeightY[],
|
||||
unsigned int Read256BytesBlockHeightC[],
|
||||
unsigned int Read256BytesBlockWidthY[],
|
||||
unsigned int Read256BytesBlockWidthC[],
|
||||
enum odm_combine_mode ODMCombineEnabled[],
|
||||
int BlendingAndTiming[],
|
||||
int BytePerPixY[],
|
||||
int BytePerPixC[],
|
||||
unsigned int BlendingAndTiming[],
|
||||
unsigned int BytePerPixY[],
|
||||
unsigned int BytePerPixC[],
|
||||
double BytePerPixDETY[],
|
||||
double BytePerPixDETC[],
|
||||
int HActive[],
|
||||
unsigned int HActive[],
|
||||
double HRatio[],
|
||||
double HRatioChroma[],
|
||||
int DPPPerPlane[],
|
||||
int swath_width_luma_ub[],
|
||||
int swath_width_chroma_ub[],
|
||||
unsigned int DPPPerPlane[],
|
||||
unsigned int swath_width_luma_ub[],
|
||||
unsigned int swath_width_chroma_ub[],
|
||||
double SwathWidth[],
|
||||
double SwathWidthChroma[],
|
||||
int SwathHeightY[],
|
||||
int SwathHeightC[],
|
||||
unsigned int SwathHeightY[],
|
||||
unsigned int SwathHeightC[],
|
||||
unsigned int DETBufferSizeY[],
|
||||
unsigned int DETBufferSizeC[],
|
||||
bool ViewportSizeSupportPerPlane[],
|
||||
|
|
@ -528,22 +528,22 @@ static void CalculateSwathWidth(
|
|||
unsigned int SurfaceHeightY[],
|
||||
unsigned int SurfaceHeightC[],
|
||||
enum odm_combine_mode ODMCombineEnabled[],
|
||||
int BytePerPixY[],
|
||||
int BytePerPixC[],
|
||||
int Read256BytesBlockHeightY[],
|
||||
int Read256BytesBlockHeightC[],
|
||||
int Read256BytesBlockWidthY[],
|
||||
int Read256BytesBlockWidthC[],
|
||||
int BlendingAndTiming[],
|
||||
unsigned int BytePerPixY[],
|
||||
unsigned int BytePerPixC[],
|
||||
unsigned int Read256BytesBlockHeightY[],
|
||||
unsigned int Read256BytesBlockHeightC[],
|
||||
unsigned int Read256BytesBlockWidthY[],
|
||||
unsigned int Read256BytesBlockWidthC[],
|
||||
unsigned int BlendingAndTiming[],
|
||||
unsigned int HActive[],
|
||||
double HRatio[],
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
double SwathWidthSingleDPPY[],
|
||||
double SwathWidthSingleDPPC[],
|
||||
double SwathWidthY[],
|
||||
double SwathWidthC[],
|
||||
int MaximumSwathHeightY[],
|
||||
int MaximumSwathHeightC[],
|
||||
unsigned int MaximumSwathHeightY[],
|
||||
unsigned int MaximumSwathHeightC[],
|
||||
unsigned int swath_width_luma_ub[],
|
||||
unsigned int swath_width_chroma_ub[]);
|
||||
static double CalculateExtraLatency(
|
||||
|
|
@ -558,8 +558,8 @@ static double CalculateExtraLatency(
|
|||
bool GPUVMEnable,
|
||||
bool HostVMEnable,
|
||||
int NumberOfActivePlanes,
|
||||
int NumberOfDPP[],
|
||||
int dpte_group_bytes[],
|
||||
unsigned int NumberOfDPP[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
|
||||
double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
|
||||
double HostVMMinPageSize,
|
||||
|
|
@ -573,8 +573,8 @@ static double CalculateExtraLatencyBytes(
|
|||
bool GPUVMEnable,
|
||||
bool HostVMEnable,
|
||||
unsigned int NumberOfActivePlanes,
|
||||
int NumberOfDPP[],
|
||||
int dpte_group_bytes[],
|
||||
unsigned int NumberOfDPP[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
|
||||
double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
|
||||
double HostVMMinPageSize,
|
||||
|
|
@ -2888,18 +2888,18 @@ static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib)
|
|||
// Display Pipe Configuration
|
||||
double BytePerPixDETY[DC__NUM_DPP__MAX] = { 0 };
|
||||
double BytePerPixDETC[DC__NUM_DPP__MAX] = { 0 };
|
||||
int BytePerPixY[DC__NUM_DPP__MAX] = { 0 };
|
||||
int BytePerPixC[DC__NUM_DPP__MAX] = { 0 };
|
||||
int Read256BytesBlockHeightY[DC__NUM_DPP__MAX] = { 0 };
|
||||
int Read256BytesBlockHeightC[DC__NUM_DPP__MAX] = { 0 };
|
||||
int Read256BytesBlockWidthY[DC__NUM_DPP__MAX] = { 0 };
|
||||
int Read256BytesBlockWidthC[DC__NUM_DPP__MAX] = { 0 };
|
||||
unsigned int BytePerPixY[DC__NUM_DPP__MAX] = { 0 };
|
||||
unsigned int BytePerPixC[DC__NUM_DPP__MAX] = { 0 };
|
||||
unsigned int Read256BytesBlockHeightY[DC__NUM_DPP__MAX] = { 0 };
|
||||
unsigned int Read256BytesBlockHeightC[DC__NUM_DPP__MAX] = { 0 };
|
||||
unsigned int Read256BytesBlockWidthY[DC__NUM_DPP__MAX] = { 0 };
|
||||
unsigned int Read256BytesBlockWidthC[DC__NUM_DPP__MAX] = { 0 };
|
||||
double dummy1[DC__NUM_DPP__MAX] = { 0 };
|
||||
double dummy2[DC__NUM_DPP__MAX] = { 0 };
|
||||
double dummy3[DC__NUM_DPP__MAX] = { 0 };
|
||||
double dummy4[DC__NUM_DPP__MAX] = { 0 };
|
||||
int dummy5[DC__NUM_DPP__MAX] = { 0 };
|
||||
int dummy6[DC__NUM_DPP__MAX] = { 0 };
|
||||
unsigned int dummy5[DC__NUM_DPP__MAX] = { 0 };
|
||||
unsigned int dummy6[DC__NUM_DPP__MAX] = { 0 };
|
||||
bool dummy7[DC__NUM_DPP__MAX] = { 0 };
|
||||
bool dummysinglestring = 0;
|
||||
unsigned int k;
|
||||
|
|
@ -3381,7 +3381,7 @@ static double TruncToValidBPP(
|
|||
void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib)
|
||||
{
|
||||
struct vba_vars_st *v = &mode_lib->vba;
|
||||
int MinPrefetchMode, MaxPrefetchMode;
|
||||
unsigned int MinPrefetchMode, MaxPrefetchMode;
|
||||
int idx, start_state;
|
||||
unsigned int i, j, k, m;
|
||||
bool EnoughWritebackUnits = true;
|
||||
|
|
@ -4550,7 +4550,7 @@ void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
|
|||
|
||||
for (i = start_state; i < mode_lib->soc.num_states; ++i) {
|
||||
for (j = 0; j <= 1; ++j) {
|
||||
int NextPrefetchModeState = MinPrefetchMode;
|
||||
unsigned int NextPrefetchModeState = MinPrefetchMode;
|
||||
|
||||
v->TimeCalc = 24 / v->ProjectedDCFCLKDeepSleep[i][j];
|
||||
|
||||
|
|
@ -5153,8 +5153,8 @@ static void CalculateWatermarksAndDRAMSpeedChangeSupport(
|
|||
static void CalculateDCFCLKDeepSleep(
|
||||
struct display_mode_lib *mode_lib,
|
||||
unsigned int NumberOfActivePlanes,
|
||||
int BytePerPixelY[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelY[],
|
||||
unsigned int BytePerPixelC[],
|
||||
double VRatio[],
|
||||
double VRatioChroma[],
|
||||
double SwathWidthY[],
|
||||
|
|
@ -5306,7 +5306,7 @@ static void CalculatePixelDeliveryTimes(
|
|||
double PSCL_THROUGHPUT[],
|
||||
double PSCL_THROUGHPUT_CHROMA[],
|
||||
double DPPCLK[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelC[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
unsigned int NumberOfCursors[],
|
||||
unsigned int CursorWidth[][2],
|
||||
|
|
@ -5411,35 +5411,35 @@ static void CalculateMetaAndPTETimes(
|
|||
bool GPUVMEnable,
|
||||
int MetaChunkSize,
|
||||
int MinMetaChunkSizeBytes,
|
||||
int HTotal[],
|
||||
unsigned int HTotal[],
|
||||
double VRatio[],
|
||||
double VRatioChroma[],
|
||||
double DestinationLinesToRequestRowInVBlank[],
|
||||
double DestinationLinesToRequestRowInImmediateFlip[],
|
||||
bool DCCEnable[],
|
||||
double PixelClock[],
|
||||
int BytePerPixelY[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelY[],
|
||||
unsigned int BytePerPixelC[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
int dpte_row_height[],
|
||||
int dpte_row_height_chroma[],
|
||||
int meta_row_width[],
|
||||
int meta_row_width_chroma[],
|
||||
int meta_row_height[],
|
||||
int meta_row_height_chroma[],
|
||||
int meta_req_width[],
|
||||
int meta_req_width_chroma[],
|
||||
int meta_req_height[],
|
||||
int meta_req_height_chroma[],
|
||||
int dpte_group_bytes[],
|
||||
int PTERequestSizeY[],
|
||||
int PTERequestSizeC[],
|
||||
int PixelPTEReqWidthY[],
|
||||
int PixelPTEReqHeightY[],
|
||||
int PixelPTEReqWidthC[],
|
||||
int PixelPTEReqHeightC[],
|
||||
int dpte_row_width_luma_ub[],
|
||||
int dpte_row_width_chroma_ub[],
|
||||
unsigned int dpte_row_height[],
|
||||
unsigned int dpte_row_height_chroma[],
|
||||
unsigned int meta_row_width[],
|
||||
unsigned int meta_row_width_chroma[],
|
||||
unsigned int meta_row_height[],
|
||||
unsigned int meta_row_height_chroma[],
|
||||
unsigned int meta_req_width[],
|
||||
unsigned int meta_req_width_chroma[],
|
||||
unsigned int meta_req_height[],
|
||||
unsigned int meta_req_height_chroma[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
unsigned int PTERequestSizeY[],
|
||||
unsigned int PTERequestSizeC[],
|
||||
unsigned int PixelPTEReqWidthY[],
|
||||
unsigned int PixelPTEReqHeightY[],
|
||||
unsigned int PixelPTEReqWidthC[],
|
||||
unsigned int PixelPTEReqHeightC[],
|
||||
unsigned int dpte_row_width_luma_ub[],
|
||||
unsigned int dpte_row_width_chroma_ub[],
|
||||
double DST_Y_PER_PTE_ROW_NOM_L[],
|
||||
double DST_Y_PER_PTE_ROW_NOM_C[],
|
||||
double DST_Y_PER_META_ROW_NOM_L[],
|
||||
|
|
@ -5584,18 +5584,18 @@ static void CalculateVMGroupAndRequestTimes(
|
|||
bool GPUVMEnable,
|
||||
unsigned int GPUVMMaxPageTableLevels,
|
||||
unsigned int HTotal[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelC[],
|
||||
double DestinationLinesToRequestVMInVBlank[],
|
||||
double DestinationLinesToRequestVMInImmediateFlip[],
|
||||
bool DCCEnable[],
|
||||
double PixelClock[],
|
||||
int dpte_row_width_luma_ub[],
|
||||
int dpte_row_width_chroma_ub[],
|
||||
int vm_group_bytes[],
|
||||
unsigned int dpte_row_width_luma_ub[],
|
||||
unsigned int dpte_row_width_chroma_ub[],
|
||||
unsigned int vm_group_bytes[],
|
||||
unsigned int dpde0_bytes_per_frame_ub_l[],
|
||||
unsigned int dpde0_bytes_per_frame_ub_c[],
|
||||
int meta_pte_bytes_per_frame_ub_l[],
|
||||
int meta_pte_bytes_per_frame_ub_c[],
|
||||
unsigned int meta_pte_bytes_per_frame_ub_l[],
|
||||
unsigned int meta_pte_bytes_per_frame_ub_c[],
|
||||
double TimePerVMGroupVBlank[],
|
||||
double TimePerVMGroupFlip[],
|
||||
double TimePerVMRequestVBlank[],
|
||||
|
|
@ -5700,27 +5700,27 @@ static void CalculateStutterEfficiency(
|
|||
double ReturnBW,
|
||||
double SRExitTime,
|
||||
bool SynchronizedVBlank,
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
unsigned int DETBufferSizeY[],
|
||||
int BytePerPixelY[],
|
||||
unsigned int BytePerPixelY[],
|
||||
double BytePerPixelDETY[],
|
||||
double SwathWidthY[],
|
||||
int SwathHeightY[],
|
||||
int SwathHeightC[],
|
||||
unsigned int SwathHeightY[],
|
||||
unsigned int SwathHeightC[],
|
||||
double DCCRateLuma[],
|
||||
double DCCRateChroma[],
|
||||
int HTotal[],
|
||||
int VTotal[],
|
||||
unsigned int HTotal[],
|
||||
unsigned int VTotal[],
|
||||
double PixelClock[],
|
||||
double VRatio[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
int BlockHeight256BytesY[],
|
||||
int BlockWidth256BytesY[],
|
||||
int BlockHeight256BytesC[],
|
||||
int BlockWidth256BytesC[],
|
||||
int DCCYMaxUncompressedBlock[],
|
||||
int DCCCMaxUncompressedBlock[],
|
||||
int VActive[],
|
||||
unsigned int BlockHeight256BytesY[],
|
||||
unsigned int BlockWidth256BytesY[],
|
||||
unsigned int BlockHeight256BytesC[],
|
||||
unsigned int BlockWidth256BytesC[],
|
||||
unsigned int DCCYMaxUncompressedBlock[],
|
||||
unsigned int DCCCMaxUncompressedBlock[],
|
||||
unsigned int VActive[],
|
||||
bool DCCEnable[],
|
||||
bool WritebackEnable[],
|
||||
double ReadBandwidthPlaneLuma[],
|
||||
|
|
@ -5854,42 +5854,42 @@ static void CalculateSwathAndDETConfiguration(
|
|||
enum scan_direction_class SourceScan[],
|
||||
enum source_format_class SourcePixelFormat[],
|
||||
enum dm_swizzle_mode SurfaceTiling[],
|
||||
int ViewportWidth[],
|
||||
int ViewportHeight[],
|
||||
int SurfaceWidthY[],
|
||||
int SurfaceWidthC[],
|
||||
int SurfaceHeightY[],
|
||||
int SurfaceHeightC[],
|
||||
int Read256BytesBlockHeightY[],
|
||||
int Read256BytesBlockHeightC[],
|
||||
int Read256BytesBlockWidthY[],
|
||||
int Read256BytesBlockWidthC[],
|
||||
unsigned int ViewportWidth[],
|
||||
unsigned int ViewportHeight[],
|
||||
unsigned int SurfaceWidthY[],
|
||||
unsigned int SurfaceWidthC[],
|
||||
unsigned int SurfaceHeightY[],
|
||||
unsigned int SurfaceHeightC[],
|
||||
unsigned int Read256BytesBlockHeightY[],
|
||||
unsigned int Read256BytesBlockHeightC[],
|
||||
unsigned int Read256BytesBlockWidthY[],
|
||||
unsigned int Read256BytesBlockWidthC[],
|
||||
enum odm_combine_mode ODMCombineEnabled[],
|
||||
int BlendingAndTiming[],
|
||||
int BytePerPixY[],
|
||||
int BytePerPixC[],
|
||||
unsigned int BlendingAndTiming[],
|
||||
unsigned int BytePerPixY[],
|
||||
unsigned int BytePerPixC[],
|
||||
double BytePerPixDETY[],
|
||||
double BytePerPixDETC[],
|
||||
int HActive[],
|
||||
unsigned int HActive[],
|
||||
double HRatio[],
|
||||
double HRatioChroma[],
|
||||
int DPPPerPlane[],
|
||||
int swath_width_luma_ub[],
|
||||
int swath_width_chroma_ub[],
|
||||
unsigned int DPPPerPlane[],
|
||||
unsigned int swath_width_luma_ub[],
|
||||
unsigned int swath_width_chroma_ub[],
|
||||
double SwathWidth[],
|
||||
double SwathWidthChroma[],
|
||||
int SwathHeightY[],
|
||||
int SwathHeightC[],
|
||||
unsigned int SwathHeightY[],
|
||||
unsigned int SwathHeightC[],
|
||||
unsigned int DETBufferSizeY[],
|
||||
unsigned int DETBufferSizeC[],
|
||||
bool ViewportSizeSupportPerPlane[],
|
||||
bool *ViewportSizeSupport)
|
||||
{
|
||||
(void)HRatioChroma;
|
||||
int MaximumSwathHeightY[DC__NUM_DPP__MAX] = { 0 };
|
||||
int MaximumSwathHeightC[DC__NUM_DPP__MAX] = { 0 };
|
||||
int MinimumSwathHeightY = 0;
|
||||
int MinimumSwathHeightC = 0;
|
||||
unsigned int MaximumSwathHeightY[DC__NUM_DPP__MAX] = { 0 };
|
||||
unsigned int MaximumSwathHeightC[DC__NUM_DPP__MAX] = { 0 };
|
||||
unsigned int MinimumSwathHeightY = 0;
|
||||
unsigned int MinimumSwathHeightC = 0;
|
||||
long RoundedUpMaxSwathSizeBytesY = 0;
|
||||
long RoundedUpMaxSwathSizeBytesC = 0;
|
||||
long RoundedUpMinSwathSizeBytesY = 0;
|
||||
|
|
@ -6049,22 +6049,22 @@ static void CalculateSwathWidth(
|
|||
unsigned int SurfaceHeightY[],
|
||||
unsigned int SurfaceHeightC[],
|
||||
enum odm_combine_mode ODMCombineEnabled[],
|
||||
int BytePerPixY[],
|
||||
int BytePerPixC[],
|
||||
int Read256BytesBlockHeightY[],
|
||||
int Read256BytesBlockHeightC[],
|
||||
int Read256BytesBlockWidthY[],
|
||||
int Read256BytesBlockWidthC[],
|
||||
int BlendingAndTiming[],
|
||||
unsigned int BytePerPixY[],
|
||||
unsigned int BytePerPixC[],
|
||||
unsigned int Read256BytesBlockHeightY[],
|
||||
unsigned int Read256BytesBlockHeightC[],
|
||||
unsigned int Read256BytesBlockWidthY[],
|
||||
unsigned int Read256BytesBlockWidthC[],
|
||||
unsigned int BlendingAndTiming[],
|
||||
unsigned int HActive[],
|
||||
double HRatio[],
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
double SwathWidthSingleDPPY[],
|
||||
double SwathWidthSingleDPPC[],
|
||||
double SwathWidthY[],
|
||||
double SwathWidthC[],
|
||||
int MaximumSwathHeightY[],
|
||||
int MaximumSwathHeightC[],
|
||||
unsigned int MaximumSwathHeightY[],
|
||||
unsigned int MaximumSwathHeightC[],
|
||||
unsigned int swath_width_luma_ub[],
|
||||
unsigned int swath_width_chroma_ub[])
|
||||
{
|
||||
|
|
@ -6157,8 +6157,8 @@ static double CalculateExtraLatency(
|
|||
bool GPUVMEnable,
|
||||
bool HostVMEnable,
|
||||
int NumberOfActivePlanes,
|
||||
int NumberOfDPP[],
|
||||
int dpte_group_bytes[],
|
||||
unsigned int NumberOfDPP[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
|
||||
double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
|
||||
double HostVMMinPageSize,
|
||||
|
|
@ -6193,8 +6193,8 @@ static double CalculateExtraLatencyBytes(
|
|||
bool GPUVMEnable,
|
||||
bool HostVMEnable,
|
||||
unsigned int NumberOfActivePlanes,
|
||||
int NumberOfDPP[],
|
||||
int dpte_group_bytes[],
|
||||
unsigned int NumberOfDPP[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelMixedWithVMData,
|
||||
double PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyVMDataOnly,
|
||||
double HostVMMinPageSize,
|
||||
|
|
@ -6251,7 +6251,7 @@ static double CalculateUrgentLatency(
|
|||
static noinline_for_stack void UseMinimumDCFCLK(
|
||||
struct display_mode_lib *mode_lib,
|
||||
struct vba_vars_st *v,
|
||||
int MaxPrefetchMode,
|
||||
unsigned int MaxPrefetchMode,
|
||||
int ReorderingBytes)
|
||||
{
|
||||
double NormalEfficiency = 0;
|
||||
|
|
@ -6276,7 +6276,7 @@ static noinline_for_stack void UseMinimumDCFCLK(
|
|||
double ExtraLatencyBytes = 0;
|
||||
double ExtraLatencyCycles = 0;
|
||||
double DCFCLKRequiredForPeakBandwidth = 0;
|
||||
int NoOfDPPState[DC__NUM_DPP__MAX] = { 0 };
|
||||
unsigned int NoOfDPPState[DC__NUM_DPP__MAX] = { 0 };
|
||||
double MinimumTvmPlus2Tr0 = 0;
|
||||
|
||||
TotalMaxPrefetchFlipDPTERowBandwidth[i][j] = 0;
|
||||
|
|
|
|||
|
|
@ -298,7 +298,7 @@ static void calculate_wm_set_for_vlevel(int vlevel,
|
|||
{
|
||||
double dram_clock_change_latency_cached = dml->soc.dram_clock_change_latency_us;
|
||||
|
||||
ASSERT(vlevel < dml->soc.num_states);
|
||||
ASSERT(vlevel < (int)dml->soc.num_states);
|
||||
/* only pipe 0 is read for voltage and dcf/soc clocks */
|
||||
pipes[0].clks_cfg.voltage = vlevel;
|
||||
pipes[0].clks_cfg.dcfclk_mhz = dml->soc.clock_limits[vlevel].dcfclk_mhz;
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@ static bool CalculatePrefetchSchedule(
|
|||
double *Tdmdl_vm,
|
||||
double *Tdmdl,
|
||||
double *TSetup,
|
||||
int *VUpdateOffsetPix,
|
||||
unsigned int *VUpdateOffsetPix,
|
||||
double *VUpdateWidthPix,
|
||||
double *VReadyOffsetPix);
|
||||
static double RoundToDFSGranularityUp(double Clock, double VCOSpeed);
|
||||
|
|
@ -218,19 +218,19 @@ static unsigned int CalculateVMAndRowBytes(
|
|||
unsigned int *MetaRowByte,
|
||||
unsigned int *PixelPTEBytesPerRow,
|
||||
bool *PTEBufferSizeNotExceeded,
|
||||
int *dpte_row_width_ub,
|
||||
unsigned int *dpte_row_width_ub,
|
||||
unsigned int *dpte_row_height,
|
||||
unsigned int *MetaRequestWidth,
|
||||
unsigned int *MetaRequestHeight,
|
||||
unsigned int *meta_row_width,
|
||||
unsigned int *meta_row_height,
|
||||
int *vm_group_bytes,
|
||||
unsigned int *vm_group_bytes,
|
||||
unsigned int *dpte_group_bytes,
|
||||
unsigned int *PixelPTEReqWidth,
|
||||
unsigned int *PixelPTEReqHeight,
|
||||
unsigned int *PTERequestSize,
|
||||
int *DPDE0BytesFrame,
|
||||
int *MetaPTEBytesFrame);
|
||||
unsigned int *DPDE0BytesFrame,
|
||||
unsigned int *MetaPTEBytesFrame);
|
||||
static double CalculateTWait(unsigned int PrefetchMode, double DRAMClockChangeLatency, double UrgentLatency, double SREnterPlusExitTime);
|
||||
static void CalculateRowBandwidth(
|
||||
bool GPUVMEnable,
|
||||
|
|
@ -285,7 +285,7 @@ static void CalculateVupdateAndDynamicMetadataParameters(
|
|||
double *Tdmbf,
|
||||
double *Tdmec,
|
||||
double *Tdmsks,
|
||||
int *VUpdateOffsetPix,
|
||||
unsigned int *VUpdateOffsetPix,
|
||||
double *VUpdateWidthPix,
|
||||
double *VReadyOffsetPix);
|
||||
|
||||
|
|
@ -318,8 +318,8 @@ static void CalculateWatermarksAndDRAMSpeedChangeSupport(
|
|||
static void CalculateDCFCLKDeepSleep(
|
||||
struct display_mode_lib *mode_lib,
|
||||
unsigned int NumberOfActivePlanes,
|
||||
int BytePerPixelY[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelY[],
|
||||
unsigned int BytePerPixelC[],
|
||||
double VRatio[],
|
||||
double VRatioChroma[],
|
||||
double SwathWidthY[],
|
||||
|
|
@ -377,7 +377,7 @@ static void CalculatePixelDeliveryTimes(
|
|||
double PSCL_THROUGHPUT[],
|
||||
double PSCL_THROUGHPUT_CHROMA[],
|
||||
double DPPCLK[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelC[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
unsigned int NumberOfCursors[],
|
||||
unsigned int CursorWidth[][DC__NUM_CURSOR__MAX],
|
||||
|
|
@ -402,35 +402,35 @@ static void CalculateMetaAndPTETimes(
|
|||
bool GPUVMEnable,
|
||||
int MetaChunkSize,
|
||||
int MinMetaChunkSizeBytes,
|
||||
int HTotal[],
|
||||
unsigned int HTotal[],
|
||||
double VRatio[],
|
||||
double VRatioChroma[],
|
||||
double DestinationLinesToRequestRowInVBlank[],
|
||||
double DestinationLinesToRequestRowInImmediateFlip[],
|
||||
bool DCCEnable[],
|
||||
double PixelClock[],
|
||||
int BytePerPixelY[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelY[],
|
||||
unsigned int BytePerPixelC[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
int dpte_row_height[],
|
||||
int dpte_row_height_chroma[],
|
||||
int meta_row_width[],
|
||||
int meta_row_width_chroma[],
|
||||
int meta_row_height[],
|
||||
int meta_row_height_chroma[],
|
||||
int meta_req_width[],
|
||||
int meta_req_width_chroma[],
|
||||
int meta_req_height[],
|
||||
int meta_req_height_chroma[],
|
||||
int dpte_group_bytes[],
|
||||
int PTERequestSizeY[],
|
||||
int PTERequestSizeC[],
|
||||
int PixelPTEReqWidthY[],
|
||||
int PixelPTEReqHeightY[],
|
||||
int PixelPTEReqWidthC[],
|
||||
int PixelPTEReqHeightC[],
|
||||
int dpte_row_width_luma_ub[],
|
||||
int dpte_row_width_chroma_ub[],
|
||||
unsigned int dpte_row_height[],
|
||||
unsigned int dpte_row_height_chroma[],
|
||||
unsigned int meta_row_width[],
|
||||
unsigned int meta_row_width_chroma[],
|
||||
unsigned int meta_row_height[],
|
||||
unsigned int meta_row_height_chroma[],
|
||||
unsigned int meta_req_width[],
|
||||
unsigned int meta_req_width_chroma[],
|
||||
unsigned int meta_req_height[],
|
||||
unsigned int meta_req_height_chroma[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
unsigned int PTERequestSizeY[],
|
||||
unsigned int PTERequestSizeC[],
|
||||
unsigned int PixelPTEReqWidthY[],
|
||||
unsigned int PixelPTEReqHeightY[],
|
||||
unsigned int PixelPTEReqWidthC[],
|
||||
unsigned int PixelPTEReqHeightC[],
|
||||
unsigned int dpte_row_width_luma_ub[],
|
||||
unsigned int dpte_row_width_chroma_ub[],
|
||||
double DST_Y_PER_PTE_ROW_NOM_L[],
|
||||
double DST_Y_PER_PTE_ROW_NOM_C[],
|
||||
double DST_Y_PER_META_ROW_NOM_L[],
|
||||
|
|
@ -453,18 +453,18 @@ static void CalculateVMGroupAndRequestTimes(
|
|||
bool GPUVMEnable,
|
||||
unsigned int GPUVMMaxPageTableLevels,
|
||||
unsigned int HTotal[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelC[],
|
||||
double DestinationLinesToRequestVMInVBlank[],
|
||||
double DestinationLinesToRequestVMInImmediateFlip[],
|
||||
bool DCCEnable[],
|
||||
double PixelClock[],
|
||||
int dpte_row_width_luma_ub[],
|
||||
int dpte_row_width_chroma_ub[],
|
||||
int vm_group_bytes[],
|
||||
unsigned int dpte_row_width_luma_ub[],
|
||||
unsigned int dpte_row_width_chroma_ub[],
|
||||
unsigned int vm_group_bytes[],
|
||||
unsigned int dpde0_bytes_per_frame_ub_l[],
|
||||
unsigned int dpde0_bytes_per_frame_ub_c[],
|
||||
int meta_pte_bytes_per_frame_ub_l[],
|
||||
int meta_pte_bytes_per_frame_ub_c[],
|
||||
unsigned int meta_pte_bytes_per_frame_ub_l[],
|
||||
unsigned int meta_pte_bytes_per_frame_ub_c[],
|
||||
double TimePerVMGroupVBlank[],
|
||||
double TimePerVMGroupFlip[],
|
||||
double TimePerVMRequestVBlank[],
|
||||
|
|
@ -492,29 +492,29 @@ static void CalculateStutterEfficiency(
|
|||
bool ProgressiveToInterlaceUnitInOPP,
|
||||
bool Interlace[],
|
||||
double MinTTUVBlank[],
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
unsigned int DETBufferSizeY[],
|
||||
int BytePerPixelY[],
|
||||
unsigned int BytePerPixelY[],
|
||||
double BytePerPixelDETY[],
|
||||
double SwathWidthY[],
|
||||
int SwathHeightY[],
|
||||
int SwathHeightC[],
|
||||
unsigned int SwathHeightY[],
|
||||
unsigned int SwathHeightC[],
|
||||
double NetDCCRateLuma[],
|
||||
double NetDCCRateChroma[],
|
||||
double DCCFractionOfZeroSizeRequestsLuma[],
|
||||
double DCCFractionOfZeroSizeRequestsChroma[],
|
||||
int HTotal[],
|
||||
int VTotal[],
|
||||
unsigned int HTotal[],
|
||||
unsigned int VTotal[],
|
||||
double PixelClock[],
|
||||
double VRatio[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
int BlockHeight256BytesY[],
|
||||
int BlockWidth256BytesY[],
|
||||
int BlockHeight256BytesC[],
|
||||
int BlockWidth256BytesC[],
|
||||
int DCCYMaxUncompressedBlock[],
|
||||
int DCCCMaxUncompressedBlock[],
|
||||
int VActive[],
|
||||
unsigned int BlockHeight256BytesY[],
|
||||
unsigned int BlockWidth256BytesY[],
|
||||
unsigned int BlockHeight256BytesC[],
|
||||
unsigned int BlockWidth256BytesC[],
|
||||
unsigned int DCCYMaxUncompressedBlock[],
|
||||
unsigned int DCCCMaxUncompressedBlock[],
|
||||
unsigned int VActive[],
|
||||
bool DCCEnable[],
|
||||
bool WritebackEnable[],
|
||||
double ReadBandwidthPlaneLuma[],
|
||||
|
|
@ -539,32 +539,32 @@ static void CalculateSwathAndDETConfiguration(
|
|||
enum scan_direction_class SourceScan[],
|
||||
enum source_format_class SourcePixelFormat[],
|
||||
enum dm_swizzle_mode SurfaceTiling[],
|
||||
int ViewportWidth[],
|
||||
int ViewportHeight[],
|
||||
int SurfaceWidthY[],
|
||||
int SurfaceWidthC[],
|
||||
int SurfaceHeightY[],
|
||||
int SurfaceHeightC[],
|
||||
int Read256BytesBlockHeightY[],
|
||||
int Read256BytesBlockHeightC[],
|
||||
int Read256BytesBlockWidthY[],
|
||||
int Read256BytesBlockWidthC[],
|
||||
unsigned int ViewportWidth[],
|
||||
unsigned int ViewportHeight[],
|
||||
unsigned int SurfaceWidthY[],
|
||||
unsigned int SurfaceWidthC[],
|
||||
unsigned int SurfaceHeightY[],
|
||||
unsigned int SurfaceHeightC[],
|
||||
unsigned int Read256BytesBlockHeightY[],
|
||||
unsigned int Read256BytesBlockHeightC[],
|
||||
unsigned int Read256BytesBlockWidthY[],
|
||||
unsigned int Read256BytesBlockWidthC[],
|
||||
enum odm_combine_mode ODMCombineEnabled[],
|
||||
int BlendingAndTiming[],
|
||||
int BytePerPixY[],
|
||||
int BytePerPixC[],
|
||||
unsigned int BlendingAndTiming[],
|
||||
unsigned int BytePerPixY[],
|
||||
unsigned int BytePerPixC[],
|
||||
double BytePerPixDETY[],
|
||||
double BytePerPixDETC[],
|
||||
int HActive[],
|
||||
unsigned int HActive[],
|
||||
double HRatio[],
|
||||
double HRatioChroma[],
|
||||
int DPPPerPlane[],
|
||||
int swath_width_luma_ub[],
|
||||
int swath_width_chroma_ub[],
|
||||
unsigned int DPPPerPlane[],
|
||||
unsigned int swath_width_luma_ub[],
|
||||
unsigned int swath_width_chroma_ub[],
|
||||
double SwathWidth[],
|
||||
double SwathWidthChroma[],
|
||||
int SwathHeightY[],
|
||||
int SwathHeightC[],
|
||||
unsigned int SwathHeightY[],
|
||||
unsigned int SwathHeightC[],
|
||||
unsigned int DETBufferSizeY[],
|
||||
unsigned int DETBufferSizeC[],
|
||||
bool ViewportSizeSupportPerPlane[],
|
||||
|
|
@ -574,31 +574,31 @@ static void CalculateSwathWidth(
|
|||
int NumberOfActivePlanes,
|
||||
enum source_format_class SourcePixelFormat[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
int ViewportWidth[],
|
||||
int ViewportHeight[],
|
||||
int SurfaceWidthY[],
|
||||
int SurfaceWidthC[],
|
||||
int SurfaceHeightY[],
|
||||
int SurfaceHeightC[],
|
||||
unsigned int ViewportWidth[],
|
||||
unsigned int ViewportHeight[],
|
||||
unsigned int SurfaceWidthY[],
|
||||
unsigned int SurfaceWidthC[],
|
||||
unsigned int SurfaceHeightY[],
|
||||
unsigned int SurfaceHeightC[],
|
||||
enum odm_combine_mode ODMCombineEnabled[],
|
||||
int BytePerPixY[],
|
||||
int BytePerPixC[],
|
||||
int Read256BytesBlockHeightY[],
|
||||
int Read256BytesBlockHeightC[],
|
||||
int Read256BytesBlockWidthY[],
|
||||
int Read256BytesBlockWidthC[],
|
||||
int BlendingAndTiming[],
|
||||
int HActive[],
|
||||
unsigned int BytePerPixY[],
|
||||
unsigned int BytePerPixC[],
|
||||
unsigned int Read256BytesBlockHeightY[],
|
||||
unsigned int Read256BytesBlockHeightC[],
|
||||
unsigned int Read256BytesBlockWidthY[],
|
||||
unsigned int Read256BytesBlockWidthC[],
|
||||
unsigned int BlendingAndTiming[],
|
||||
unsigned int HActive[],
|
||||
double HRatio[],
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
double SwathWidthSingleDPPY[],
|
||||
double SwathWidthSingleDPPC[],
|
||||
double SwathWidthY[],
|
||||
double SwathWidthC[],
|
||||
int MaximumSwathHeightY[],
|
||||
int MaximumSwathHeightC[],
|
||||
int swath_width_luma_ub[],
|
||||
int swath_width_chroma_ub[]);
|
||||
unsigned int MaximumSwathHeightY[],
|
||||
unsigned int MaximumSwathHeightC[],
|
||||
unsigned int swath_width_luma_ub[],
|
||||
unsigned int swath_width_chroma_ub[]);
|
||||
|
||||
static double CalculateExtraLatency(
|
||||
int RoundTripPingLatencyCycles,
|
||||
|
|
@ -612,8 +612,8 @@ static double CalculateExtraLatency(
|
|||
bool GPUVMEnable,
|
||||
bool HostVMEnable,
|
||||
int NumberOfActivePlanes,
|
||||
int NumberOfDPP[],
|
||||
int dpte_group_bytes[],
|
||||
unsigned int NumberOfDPP[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
double HostVMInefficiencyFactor,
|
||||
double HostVMMinPageSize,
|
||||
int HostVMMaxNonCachedPageTableLevels);
|
||||
|
|
@ -627,8 +627,8 @@ static double CalculateExtraLatencyBytes(
|
|||
bool GPUVMEnable,
|
||||
bool HostVMEnable,
|
||||
int NumberOfActivePlanes,
|
||||
int NumberOfDPP[],
|
||||
int dpte_group_bytes[],
|
||||
unsigned int NumberOfDPP[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
double HostVMInefficiencyFactor,
|
||||
double HostVMMinPageSize,
|
||||
int HostVMMaxNonCachedPageTableLevels);
|
||||
|
|
@ -652,7 +652,7 @@ static void CalculateUnboundedRequestAndCompressedBufferSize(
|
|||
int CompressedBufferSegmentSizeInkByteFinal,
|
||||
enum output_encoder_class *Output,
|
||||
bool *UnboundedRequestEnabled,
|
||||
int *CompressedBufferSizeInkByte);
|
||||
unsigned int *CompressedBufferSizeInkByte);
|
||||
|
||||
static bool UnboundedRequest(enum unbounded_requesting_policy UseUnboundedRequestingFinal, int TotalNumberOfActiveDPP, bool NoChroma, enum output_encoder_class Output);
|
||||
|
||||
|
|
@ -869,7 +869,7 @@ static bool CalculatePrefetchSchedule(
|
|||
double *Tdmdl_vm,
|
||||
double *Tdmdl,
|
||||
double *TSetup,
|
||||
int *VUpdateOffsetPix,
|
||||
unsigned int *VUpdateOffsetPix,
|
||||
double *VUpdateWidthPix,
|
||||
double *VReadyOffsetPix)
|
||||
{
|
||||
|
|
@ -1818,19 +1818,19 @@ static unsigned int CalculateVMAndRowBytes(
|
|||
unsigned int *MetaRowByte,
|
||||
unsigned int *PixelPTEBytesPerRow,
|
||||
bool *PTEBufferSizeNotExceeded,
|
||||
int *dpte_row_width_ub,
|
||||
unsigned int *dpte_row_width_ub,
|
||||
unsigned int *dpte_row_height,
|
||||
unsigned int *MetaRequestWidth,
|
||||
unsigned int *MetaRequestHeight,
|
||||
unsigned int *meta_row_width,
|
||||
unsigned int *meta_row_height,
|
||||
int *vm_group_bytes,
|
||||
unsigned int *vm_group_bytes,
|
||||
unsigned int *dpte_group_bytes,
|
||||
unsigned int *PixelPTEReqWidth,
|
||||
unsigned int *PixelPTEReqHeight,
|
||||
unsigned int *PTERequestSize,
|
||||
int *DPDE0BytesFrame,
|
||||
int *MetaPTEBytesFrame)
|
||||
unsigned int *DPDE0BytesFrame,
|
||||
unsigned int *MetaPTEBytesFrame)
|
||||
{
|
||||
(void)SourcePixelFormat;
|
||||
struct vba_vars_st *v = &mode_lib->vba;
|
||||
|
|
@ -3278,18 +3278,18 @@ static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib)
|
|||
// Display Pipe Configuration
|
||||
double BytePerPixDETY[DC__NUM_DPP__MAX];
|
||||
double BytePerPixDETC[DC__NUM_DPP__MAX];
|
||||
int BytePerPixY[DC__NUM_DPP__MAX];
|
||||
int BytePerPixC[DC__NUM_DPP__MAX];
|
||||
int Read256BytesBlockHeightY[DC__NUM_DPP__MAX];
|
||||
int Read256BytesBlockHeightC[DC__NUM_DPP__MAX];
|
||||
int Read256BytesBlockWidthY[DC__NUM_DPP__MAX];
|
||||
int Read256BytesBlockWidthC[DC__NUM_DPP__MAX];
|
||||
unsigned int BytePerPixY[DC__NUM_DPP__MAX];
|
||||
unsigned int BytePerPixC[DC__NUM_DPP__MAX];
|
||||
unsigned int Read256BytesBlockHeightY[DC__NUM_DPP__MAX];
|
||||
unsigned int Read256BytesBlockHeightC[DC__NUM_DPP__MAX];
|
||||
unsigned int Read256BytesBlockWidthY[DC__NUM_DPP__MAX];
|
||||
unsigned int Read256BytesBlockWidthC[DC__NUM_DPP__MAX];
|
||||
double dummy1[DC__NUM_DPP__MAX];
|
||||
double dummy2[DC__NUM_DPP__MAX];
|
||||
double dummy3[DC__NUM_DPP__MAX];
|
||||
double dummy4[DC__NUM_DPP__MAX];
|
||||
int dummy5[DC__NUM_DPP__MAX];
|
||||
int dummy6[DC__NUM_DPP__MAX];
|
||||
unsigned int dummy5[DC__NUM_DPP__MAX];
|
||||
unsigned int dummy6[DC__NUM_DPP__MAX];
|
||||
bool dummy7[DC__NUM_DPP__MAX];
|
||||
bool dummysinglestring;
|
||||
|
||||
|
|
@ -3429,7 +3429,7 @@ static void CalculateVupdateAndDynamicMetadataParameters(
|
|||
double *Tdmbf,
|
||||
double *Tdmec,
|
||||
double *Tdmsks,
|
||||
int *VUpdateOffsetPix,
|
||||
unsigned int *VUpdateOffsetPix,
|
||||
double *VUpdateWidthPix,
|
||||
double *VReadyOffsetPix)
|
||||
{
|
||||
|
|
@ -3783,7 +3783,7 @@ static noinline void CalculatePrefetchSchedulePerPlane(
|
|||
&v->VReadyOffsetPix[k]);
|
||||
}
|
||||
|
||||
static void PatchDETBufferSizeInKByte(unsigned int NumberOfActivePlanes, int NoOfDPPThisState[], unsigned int config_return_buffer_size_in_kbytes, unsigned int DETBufferSizeInKByte[])
|
||||
static void PatchDETBufferSizeInKByte(unsigned int NumberOfActivePlanes, unsigned int NoOfDPPThisState[], unsigned int config_return_buffer_size_in_kbytes, unsigned int DETBufferSizeInKByte[])
|
||||
{
|
||||
int total_pipes = 0;
|
||||
unsigned int i;
|
||||
|
|
@ -3804,7 +3804,7 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
|
|||
int idx;
|
||||
unsigned int i, j, k, m;
|
||||
int ReorderingBytes;
|
||||
int MinPrefetchMode = 0, MaxPrefetchMode = 2;
|
||||
unsigned int MinPrefetchMode = 0, MaxPrefetchMode = 2;
|
||||
bool NoChroma = true;
|
||||
bool EnoughWritebackUnits = true;
|
||||
bool P2IWith420 = false;
|
||||
|
|
@ -5119,7 +5119,7 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
|
|||
double HostVMInefficiencyFactor = 1;
|
||||
int NextPrefetchModeState = MinPrefetchMode;
|
||||
bool UnboundedRequestEnabledThisState = false;
|
||||
int CompressedBufferSizeInkByteThisState = 0;
|
||||
unsigned int CompressedBufferSizeInkByteThisState = 0;
|
||||
double dummy;
|
||||
|
||||
v->TimeCalc = 24 / v->ProjectedDCFCLKDeepSleep[i][j];
|
||||
|
|
@ -5774,8 +5774,8 @@ static void CalculateWatermarksAndDRAMSpeedChangeSupport(
|
|||
static void CalculateDCFCLKDeepSleep(
|
||||
struct display_mode_lib *mode_lib,
|
||||
unsigned int NumberOfActivePlanes,
|
||||
int BytePerPixelY[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelY[],
|
||||
unsigned int BytePerPixelC[],
|
||||
double VRatio[],
|
||||
double VRatioChroma[],
|
||||
double SwathWidthY[],
|
||||
|
|
@ -5926,7 +5926,7 @@ static void CalculatePixelDeliveryTimes(
|
|||
double PSCL_THROUGHPUT[],
|
||||
double PSCL_THROUGHPUT_CHROMA[],
|
||||
double DPPCLK[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelC[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
unsigned int NumberOfCursors[],
|
||||
unsigned int CursorWidth[][DC__NUM_CURSOR__MAX],
|
||||
|
|
@ -6050,35 +6050,35 @@ static void CalculateMetaAndPTETimes(
|
|||
bool GPUVMEnable,
|
||||
int MetaChunkSize,
|
||||
int MinMetaChunkSizeBytes,
|
||||
int HTotal[],
|
||||
unsigned int HTotal[],
|
||||
double VRatio[],
|
||||
double VRatioChroma[],
|
||||
double DestinationLinesToRequestRowInVBlank[],
|
||||
double DestinationLinesToRequestRowInImmediateFlip[],
|
||||
bool DCCEnable[],
|
||||
double PixelClock[],
|
||||
int BytePerPixelY[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelY[],
|
||||
unsigned int BytePerPixelC[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
int dpte_row_height[],
|
||||
int dpte_row_height_chroma[],
|
||||
int meta_row_width[],
|
||||
int meta_row_width_chroma[],
|
||||
int meta_row_height[],
|
||||
int meta_row_height_chroma[],
|
||||
int meta_req_width[],
|
||||
int meta_req_width_chroma[],
|
||||
int meta_req_height[],
|
||||
int meta_req_height_chroma[],
|
||||
int dpte_group_bytes[],
|
||||
int PTERequestSizeY[],
|
||||
int PTERequestSizeC[],
|
||||
int PixelPTEReqWidthY[],
|
||||
int PixelPTEReqHeightY[],
|
||||
int PixelPTEReqWidthC[],
|
||||
int PixelPTEReqHeightC[],
|
||||
int dpte_row_width_luma_ub[],
|
||||
int dpte_row_width_chroma_ub[],
|
||||
unsigned int dpte_row_height[],
|
||||
unsigned int dpte_row_height_chroma[],
|
||||
unsigned int meta_row_width[],
|
||||
unsigned int meta_row_width_chroma[],
|
||||
unsigned int meta_row_height[],
|
||||
unsigned int meta_row_height_chroma[],
|
||||
unsigned int meta_req_width[],
|
||||
unsigned int meta_req_width_chroma[],
|
||||
unsigned int meta_req_height[],
|
||||
unsigned int meta_req_height_chroma[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
unsigned int PTERequestSizeY[],
|
||||
unsigned int PTERequestSizeC[],
|
||||
unsigned int PixelPTEReqWidthY[],
|
||||
unsigned int PixelPTEReqHeightY[],
|
||||
unsigned int PixelPTEReqWidthC[],
|
||||
unsigned int PixelPTEReqHeightC[],
|
||||
unsigned int dpte_row_width_luma_ub[],
|
||||
unsigned int dpte_row_width_chroma_ub[],
|
||||
double DST_Y_PER_PTE_ROW_NOM_L[],
|
||||
double DST_Y_PER_PTE_ROW_NOM_C[],
|
||||
double DST_Y_PER_META_ROW_NOM_L[],
|
||||
|
|
@ -6223,18 +6223,18 @@ static void CalculateVMGroupAndRequestTimes(
|
|||
bool GPUVMEnable,
|
||||
unsigned int GPUVMMaxPageTableLevels,
|
||||
unsigned int HTotal[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelC[],
|
||||
double DestinationLinesToRequestVMInVBlank[],
|
||||
double DestinationLinesToRequestVMInImmediateFlip[],
|
||||
bool DCCEnable[],
|
||||
double PixelClock[],
|
||||
int dpte_row_width_luma_ub[],
|
||||
int dpte_row_width_chroma_ub[],
|
||||
int vm_group_bytes[],
|
||||
unsigned int dpte_row_width_luma_ub[],
|
||||
unsigned int dpte_row_width_chroma_ub[],
|
||||
unsigned int vm_group_bytes[],
|
||||
unsigned int dpde0_bytes_per_frame_ub_l[],
|
||||
unsigned int dpde0_bytes_per_frame_ub_c[],
|
||||
int meta_pte_bytes_per_frame_ub_l[],
|
||||
int meta_pte_bytes_per_frame_ub_c[],
|
||||
unsigned int meta_pte_bytes_per_frame_ub_l[],
|
||||
unsigned int meta_pte_bytes_per_frame_ub_c[],
|
||||
double TimePerVMGroupVBlank[],
|
||||
double TimePerVMGroupFlip[],
|
||||
double TimePerVMRequestVBlank[],
|
||||
|
|
@ -6342,29 +6342,29 @@ static void CalculateStutterEfficiency(
|
|||
bool ProgressiveToInterlaceUnitInOPP,
|
||||
bool Interlace[],
|
||||
double MinTTUVBlank[],
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
unsigned int DETBufferSizeY[],
|
||||
int BytePerPixelY[],
|
||||
unsigned int BytePerPixelY[],
|
||||
double BytePerPixelDETY[],
|
||||
double SwathWidthY[],
|
||||
int SwathHeightY[],
|
||||
int SwathHeightC[],
|
||||
unsigned int SwathHeightY[],
|
||||
unsigned int SwathHeightC[],
|
||||
double NetDCCRateLuma[],
|
||||
double NetDCCRateChroma[],
|
||||
double DCCFractionOfZeroSizeRequestsLuma[],
|
||||
double DCCFractionOfZeroSizeRequestsChroma[],
|
||||
int HTotal[],
|
||||
int VTotal[],
|
||||
unsigned int HTotal[],
|
||||
unsigned int VTotal[],
|
||||
double PixelClock[],
|
||||
double VRatio[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
int BlockHeight256BytesY[],
|
||||
int BlockWidth256BytesY[],
|
||||
int BlockHeight256BytesC[],
|
||||
int BlockWidth256BytesC[],
|
||||
int DCCYMaxUncompressedBlock[],
|
||||
int DCCCMaxUncompressedBlock[],
|
||||
int VActive[],
|
||||
unsigned int BlockHeight256BytesY[],
|
||||
unsigned int BlockWidth256BytesY[],
|
||||
unsigned int BlockHeight256BytesC[],
|
||||
unsigned int BlockWidth256BytesC[],
|
||||
unsigned int DCCYMaxUncompressedBlock[],
|
||||
unsigned int DCCCMaxUncompressedBlock[],
|
||||
unsigned int VActive[],
|
||||
bool DCCEnable[],
|
||||
bool WritebackEnable[],
|
||||
double ReadBandwidthPlaneLuma[],
|
||||
|
|
@ -6649,42 +6649,42 @@ static void CalculateSwathAndDETConfiguration(
|
|||
enum scan_direction_class SourceScan[],
|
||||
enum source_format_class SourcePixelFormat[],
|
||||
enum dm_swizzle_mode SurfaceTiling[],
|
||||
int ViewportWidth[],
|
||||
int ViewportHeight[],
|
||||
int SurfaceWidthY[],
|
||||
int SurfaceWidthC[],
|
||||
int SurfaceHeightY[],
|
||||
int SurfaceHeightC[],
|
||||
int Read256BytesBlockHeightY[],
|
||||
int Read256BytesBlockHeightC[],
|
||||
int Read256BytesBlockWidthY[],
|
||||
int Read256BytesBlockWidthC[],
|
||||
unsigned int ViewportWidth[],
|
||||
unsigned int ViewportHeight[],
|
||||
unsigned int SurfaceWidthY[],
|
||||
unsigned int SurfaceWidthC[],
|
||||
unsigned int SurfaceHeightY[],
|
||||
unsigned int SurfaceHeightC[],
|
||||
unsigned int Read256BytesBlockHeightY[],
|
||||
unsigned int Read256BytesBlockHeightC[],
|
||||
unsigned int Read256BytesBlockWidthY[],
|
||||
unsigned int Read256BytesBlockWidthC[],
|
||||
enum odm_combine_mode ODMCombineEnabled[],
|
||||
int BlendingAndTiming[],
|
||||
int BytePerPixY[],
|
||||
int BytePerPixC[],
|
||||
unsigned int BlendingAndTiming[],
|
||||
unsigned int BytePerPixY[],
|
||||
unsigned int BytePerPixC[],
|
||||
double BytePerPixDETY[],
|
||||
double BytePerPixDETC[],
|
||||
int HActive[],
|
||||
unsigned int HActive[],
|
||||
double HRatio[],
|
||||
double HRatioChroma[],
|
||||
int DPPPerPlane[],
|
||||
int swath_width_luma_ub[],
|
||||
int swath_width_chroma_ub[],
|
||||
unsigned int DPPPerPlane[],
|
||||
unsigned int swath_width_luma_ub[],
|
||||
unsigned int swath_width_chroma_ub[],
|
||||
double SwathWidth[],
|
||||
double SwathWidthChroma[],
|
||||
int SwathHeightY[],
|
||||
int SwathHeightC[],
|
||||
unsigned int SwathHeightY[],
|
||||
unsigned int SwathHeightC[],
|
||||
unsigned int DETBufferSizeY[],
|
||||
unsigned int DETBufferSizeC[],
|
||||
bool ViewportSizeSupportPerPlane[],
|
||||
bool *ViewportSizeSupport)
|
||||
{
|
||||
(void)HRatioChroma;
|
||||
int MaximumSwathHeightY[DC__NUM_DPP__MAX];
|
||||
int MaximumSwathHeightC[DC__NUM_DPP__MAX];
|
||||
int MinimumSwathHeightY;
|
||||
int MinimumSwathHeightC;
|
||||
unsigned int MaximumSwathHeightY[DC__NUM_DPP__MAX];
|
||||
unsigned int MaximumSwathHeightC[DC__NUM_DPP__MAX];
|
||||
unsigned int MinimumSwathHeightY;
|
||||
unsigned int MinimumSwathHeightC;
|
||||
unsigned int RoundedUpMaxSwathSizeBytesY;
|
||||
unsigned int RoundedUpMaxSwathSizeBytesC;
|
||||
unsigned int RoundedUpMinSwathSizeBytesY;
|
||||
|
|
@ -6829,31 +6829,31 @@ static void CalculateSwathWidth(
|
|||
int NumberOfActivePlanes,
|
||||
enum source_format_class SourcePixelFormat[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
int ViewportWidth[],
|
||||
int ViewportHeight[],
|
||||
int SurfaceWidthY[],
|
||||
int SurfaceWidthC[],
|
||||
int SurfaceHeightY[],
|
||||
int SurfaceHeightC[],
|
||||
unsigned int ViewportWidth[],
|
||||
unsigned int ViewportHeight[],
|
||||
unsigned int SurfaceWidthY[],
|
||||
unsigned int SurfaceWidthC[],
|
||||
unsigned int SurfaceHeightY[],
|
||||
unsigned int SurfaceHeightC[],
|
||||
enum odm_combine_mode ODMCombineEnabled[],
|
||||
int BytePerPixY[],
|
||||
int BytePerPixC[],
|
||||
int Read256BytesBlockHeightY[],
|
||||
int Read256BytesBlockHeightC[],
|
||||
int Read256BytesBlockWidthY[],
|
||||
int Read256BytesBlockWidthC[],
|
||||
int BlendingAndTiming[],
|
||||
int HActive[],
|
||||
unsigned int BytePerPixY[],
|
||||
unsigned int BytePerPixC[],
|
||||
unsigned int Read256BytesBlockHeightY[],
|
||||
unsigned int Read256BytesBlockHeightC[],
|
||||
unsigned int Read256BytesBlockWidthY[],
|
||||
unsigned int Read256BytesBlockWidthC[],
|
||||
unsigned int BlendingAndTiming[],
|
||||
unsigned int HActive[],
|
||||
double HRatio[],
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
double SwathWidthSingleDPPY[],
|
||||
double SwathWidthSingleDPPC[],
|
||||
double SwathWidthY[],
|
||||
double SwathWidthC[],
|
||||
int MaximumSwathHeightY[],
|
||||
int MaximumSwathHeightC[],
|
||||
int swath_width_luma_ub[],
|
||||
int swath_width_chroma_ub[])
|
||||
unsigned int MaximumSwathHeightY[],
|
||||
unsigned int MaximumSwathHeightC[],
|
||||
unsigned int swath_width_luma_ub[],
|
||||
unsigned int swath_width_chroma_ub[])
|
||||
{
|
||||
(void)BytePerPixY;
|
||||
enum odm_combine_mode MainPlaneODMCombine;
|
||||
|
|
@ -6960,8 +6960,8 @@ static double CalculateExtraLatency(
|
|||
bool GPUVMEnable,
|
||||
bool HostVMEnable,
|
||||
int NumberOfActivePlanes,
|
||||
int NumberOfDPP[],
|
||||
int dpte_group_bytes[],
|
||||
unsigned int NumberOfDPP[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
double HostVMInefficiencyFactor,
|
||||
double HostVMMinPageSize,
|
||||
int HostVMMaxNonCachedPageTableLevels)
|
||||
|
|
@ -7006,8 +7006,8 @@ static double CalculateExtraLatencyBytes(
|
|||
bool GPUVMEnable,
|
||||
bool HostVMEnable,
|
||||
int NumberOfActivePlanes,
|
||||
int NumberOfDPP[],
|
||||
int dpte_group_bytes[],
|
||||
unsigned int NumberOfDPP[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
double HostVMInefficiencyFactor,
|
||||
double HostVMMinPageSize,
|
||||
int HostVMMaxNonCachedPageTableLevels)
|
||||
|
|
@ -7061,7 +7061,7 @@ static noinline_for_stack void UseMinimumDCFCLK(
|
|||
int ReorderingBytes)
|
||||
{
|
||||
struct vba_vars_st *v = &mode_lib->vba;
|
||||
int dummy1;
|
||||
unsigned int dummy1;
|
||||
unsigned int j, k;
|
||||
unsigned int i;
|
||||
double NormalEfficiency, dummy2, dummy3;
|
||||
|
|
@ -7081,7 +7081,7 @@ static noinline_for_stack void UseMinimumDCFCLK(
|
|||
double ExtraLatencyBytes;
|
||||
double ExtraLatencyCycles;
|
||||
double DCFCLKRequiredForPeakBandwidth;
|
||||
int NoOfDPPState[DC__NUM_DPP__MAX];
|
||||
unsigned int NoOfDPPState[DC__NUM_DPP__MAX];
|
||||
double MinimumTvmPlus2Tr0;
|
||||
|
||||
TotalMaxPrefetchFlipDPTERowBandwidth[i][j] = 0;
|
||||
|
|
@ -7226,7 +7226,7 @@ static void CalculateUnboundedRequestAndCompressedBufferSize(
|
|||
int CompressedBufferSegmentSizeInkByteFinal,
|
||||
enum output_encoder_class *Output,
|
||||
bool *UnboundedRequestEnabled,
|
||||
int *CompressedBufferSizeInkByte)
|
||||
unsigned int *CompressedBufferSizeInkByte)
|
||||
{
|
||||
double actDETBufferSizeInKByte = dml_ceil(DETBufferSizeInKByte, 64);
|
||||
|
||||
|
|
@ -7244,7 +7244,7 @@ static void CalculateUnboundedRequestAndCompressedBufferSize(
|
|||
dml_print("DML::%s: UseUnboundedRequestingFinal = %d\n", __func__, UseUnboundedRequestingFinal);
|
||||
dml_print("DML::%s: actDETBufferSizeInKByte = %f\n", __func__, actDETBufferSizeInKByte);
|
||||
dml_print("DML::%s: UnboundedRequestEnabled = %d\n", __func__, *UnboundedRequestEnabled);
|
||||
dml_print("DML::%s: CompressedBufferSizeInkByte = %d\n", __func__, *CompressedBufferSizeInkByte);
|
||||
dml_print("DML::%s: CompressedBufferSizeInkByte = %u\n", __func__, *CompressedBufferSizeInkByte);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -410,15 +410,15 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state *c
|
|||
context->bw_ctx.dml.ip.odm_combine_4to1_supported = true;
|
||||
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
|
||||
struct pipe_ctx *cur_pipe = &context->res_ctx.pipe_ctx[i];
|
||||
|
||||
if (!pipe->stream)
|
||||
if (!cur_pipe->stream)
|
||||
continue;
|
||||
|
||||
if (pipe->stream->signal == SIGNAL_TYPE_EDP && dc->debug.seamless_boot_odm_combine &&
|
||||
pipe->stream->apply_seamless_boot_optimization) {
|
||||
if (cur_pipe->stream->signal == SIGNAL_TYPE_EDP && dc->debug.seamless_boot_odm_combine &&
|
||||
cur_pipe->stream->apply_seamless_boot_optimization) {
|
||||
|
||||
if (pipe->stream->apply_boot_odm_mode == dm_odm_combine_policy_2to1) {
|
||||
if (cur_pipe->stream->apply_boot_odm_mode == dm_odm_combine_policy_2to1) {
|
||||
context->bw_ctx.dml.vba.ODMCombinePolicy = dm_odm_combine_policy_2to1;
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@ static bool CalculatePrefetchSchedule(
|
|||
double *Tdmdl_vm,
|
||||
double *Tdmdl,
|
||||
double *TSetup,
|
||||
int *VUpdateOffsetPix,
|
||||
unsigned int *VUpdateOffsetPix,
|
||||
double *VUpdateWidthPix,
|
||||
double *VReadyOffsetPix);
|
||||
static double RoundToDFSGranularityUp(double Clock, double VCOSpeed);
|
||||
|
|
@ -227,19 +227,19 @@ static unsigned int CalculateVMAndRowBytes(
|
|||
unsigned int *MetaRowByte,
|
||||
unsigned int *PixelPTEBytesPerRow,
|
||||
bool *PTEBufferSizeNotExceeded,
|
||||
int *dpte_row_width_ub,
|
||||
unsigned int *dpte_row_width_ub,
|
||||
unsigned int *dpte_row_height,
|
||||
unsigned int *MetaRequestWidth,
|
||||
unsigned int *MetaRequestHeight,
|
||||
unsigned int *meta_row_width,
|
||||
unsigned int *meta_row_height,
|
||||
int *vm_group_bytes,
|
||||
unsigned int *vm_group_bytes,
|
||||
unsigned int *dpte_group_bytes,
|
||||
unsigned int *PixelPTEReqWidth,
|
||||
unsigned int *PixelPTEReqHeight,
|
||||
unsigned int *PTERequestSize,
|
||||
int *DPDE0BytesFrame,
|
||||
int *MetaPTEBytesFrame);
|
||||
unsigned int *DPDE0BytesFrame,
|
||||
unsigned int *MetaPTEBytesFrame);
|
||||
static double CalculateTWait(unsigned int PrefetchMode, double DRAMClockChangeLatency, double UrgentLatency, double SREnterPlusExitTime);
|
||||
static void CalculateRowBandwidth(
|
||||
bool GPUVMEnable,
|
||||
|
|
@ -294,7 +294,7 @@ static void CalculateVupdateAndDynamicMetadataParameters(
|
|||
double *Tdmbf,
|
||||
double *Tdmec,
|
||||
double *Tdmsks,
|
||||
int *VUpdateOffsetPix,
|
||||
unsigned int *VUpdateOffsetPix,
|
||||
double *VUpdateWidthPix,
|
||||
double *VReadyOffsetPix);
|
||||
|
||||
|
|
@ -327,8 +327,8 @@ static void CalculateWatermarksAndDRAMSpeedChangeSupport(
|
|||
static void CalculateDCFCLKDeepSleep(
|
||||
struct display_mode_lib *mode_lib,
|
||||
unsigned int NumberOfActivePlanes,
|
||||
int BytePerPixelY[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelY[],
|
||||
unsigned int BytePerPixelC[],
|
||||
double VRatio[],
|
||||
double VRatioChroma[],
|
||||
double SwathWidthY[],
|
||||
|
|
@ -386,7 +386,7 @@ static void CalculatePixelDeliveryTimes(
|
|||
double PSCL_THROUGHPUT[],
|
||||
double PSCL_THROUGHPUT_CHROMA[],
|
||||
double DPPCLK[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelC[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
unsigned int NumberOfCursors[],
|
||||
unsigned int CursorWidth[][DC__NUM_CURSOR__MAX],
|
||||
|
|
@ -411,35 +411,35 @@ static void CalculateMetaAndPTETimes(
|
|||
bool GPUVMEnable,
|
||||
int MetaChunkSize,
|
||||
int MinMetaChunkSizeBytes,
|
||||
int HTotal[],
|
||||
unsigned int HTotal[],
|
||||
double VRatio[],
|
||||
double VRatioChroma[],
|
||||
double DestinationLinesToRequestRowInVBlank[],
|
||||
double DestinationLinesToRequestRowInImmediateFlip[],
|
||||
bool DCCEnable[],
|
||||
double PixelClock[],
|
||||
int BytePerPixelY[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelY[],
|
||||
unsigned int BytePerPixelC[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
int dpte_row_height[],
|
||||
int dpte_row_height_chroma[],
|
||||
int meta_row_width[],
|
||||
int meta_row_width_chroma[],
|
||||
int meta_row_height[],
|
||||
int meta_row_height_chroma[],
|
||||
int meta_req_width[],
|
||||
int meta_req_width_chroma[],
|
||||
int meta_req_height[],
|
||||
int meta_req_height_chroma[],
|
||||
int dpte_group_bytes[],
|
||||
int PTERequestSizeY[],
|
||||
int PTERequestSizeC[],
|
||||
int PixelPTEReqWidthY[],
|
||||
int PixelPTEReqHeightY[],
|
||||
int PixelPTEReqWidthC[],
|
||||
int PixelPTEReqHeightC[],
|
||||
int dpte_row_width_luma_ub[],
|
||||
int dpte_row_width_chroma_ub[],
|
||||
unsigned int dpte_row_height[],
|
||||
unsigned int dpte_row_height_chroma[],
|
||||
unsigned int meta_row_width[],
|
||||
unsigned int meta_row_width_chroma[],
|
||||
unsigned int meta_row_height[],
|
||||
unsigned int meta_row_height_chroma[],
|
||||
unsigned int meta_req_width[],
|
||||
unsigned int meta_req_width_chroma[],
|
||||
unsigned int meta_req_height[],
|
||||
unsigned int meta_req_height_chroma[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
unsigned int PTERequestSizeY[],
|
||||
unsigned int PTERequestSizeC[],
|
||||
unsigned int PixelPTEReqWidthY[],
|
||||
unsigned int PixelPTEReqHeightY[],
|
||||
unsigned int PixelPTEReqWidthC[],
|
||||
unsigned int PixelPTEReqHeightC[],
|
||||
unsigned int dpte_row_width_luma_ub[],
|
||||
unsigned int dpte_row_width_chroma_ub[],
|
||||
double DST_Y_PER_PTE_ROW_NOM_L[],
|
||||
double DST_Y_PER_PTE_ROW_NOM_C[],
|
||||
double DST_Y_PER_META_ROW_NOM_L[],
|
||||
|
|
@ -462,18 +462,18 @@ static void CalculateVMGroupAndRequestTimes(
|
|||
bool GPUVMEnable,
|
||||
unsigned int GPUVMMaxPageTableLevels,
|
||||
unsigned int HTotal[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelC[],
|
||||
double DestinationLinesToRequestVMInVBlank[],
|
||||
double DestinationLinesToRequestVMInImmediateFlip[],
|
||||
bool DCCEnable[],
|
||||
double PixelClock[],
|
||||
int dpte_row_width_luma_ub[],
|
||||
int dpte_row_width_chroma_ub[],
|
||||
int vm_group_bytes[],
|
||||
unsigned int dpte_row_width_luma_ub[],
|
||||
unsigned int dpte_row_width_chroma_ub[],
|
||||
unsigned int vm_group_bytes[],
|
||||
unsigned int dpde0_bytes_per_frame_ub_l[],
|
||||
unsigned int dpde0_bytes_per_frame_ub_c[],
|
||||
int meta_pte_bytes_per_frame_ub_l[],
|
||||
int meta_pte_bytes_per_frame_ub_c[],
|
||||
unsigned int meta_pte_bytes_per_frame_ub_l[],
|
||||
unsigned int meta_pte_bytes_per_frame_ub_c[],
|
||||
double TimePerVMGroupVBlank[],
|
||||
double TimePerVMGroupFlip[],
|
||||
double TimePerVMRequestVBlank[],
|
||||
|
|
@ -501,29 +501,29 @@ static void CalculateStutterEfficiency(
|
|||
bool ProgressiveToInterlaceUnitInOPP,
|
||||
bool Interlace[],
|
||||
double MinTTUVBlank[],
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
unsigned int DETBufferSizeY[],
|
||||
int BytePerPixelY[],
|
||||
unsigned int BytePerPixelY[],
|
||||
double BytePerPixelDETY[],
|
||||
double SwathWidthY[],
|
||||
int SwathHeightY[],
|
||||
int SwathHeightC[],
|
||||
unsigned int SwathHeightY[],
|
||||
unsigned int SwathHeightC[],
|
||||
double NetDCCRateLuma[],
|
||||
double NetDCCRateChroma[],
|
||||
double DCCFractionOfZeroSizeRequestsLuma[],
|
||||
double DCCFractionOfZeroSizeRequestsChroma[],
|
||||
int HTotal[],
|
||||
int VTotal[],
|
||||
unsigned int HTotal[],
|
||||
unsigned int VTotal[],
|
||||
double PixelClock[],
|
||||
double VRatio[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
int BlockHeight256BytesY[],
|
||||
int BlockWidth256BytesY[],
|
||||
int BlockHeight256BytesC[],
|
||||
int BlockWidth256BytesC[],
|
||||
int DCCYMaxUncompressedBlock[],
|
||||
int DCCCMaxUncompressedBlock[],
|
||||
int VActive[],
|
||||
unsigned int BlockHeight256BytesY[],
|
||||
unsigned int BlockWidth256BytesY[],
|
||||
unsigned int BlockHeight256BytesC[],
|
||||
unsigned int BlockWidth256BytesC[],
|
||||
unsigned int DCCYMaxUncompressedBlock[],
|
||||
unsigned int DCCCMaxUncompressedBlock[],
|
||||
unsigned int VActive[],
|
||||
bool DCCEnable[],
|
||||
bool WritebackEnable[],
|
||||
double ReadBandwidthPlaneLuma[],
|
||||
|
|
@ -547,32 +547,32 @@ static void CalculateSwathAndDETConfiguration(
|
|||
enum scan_direction_class SourceScan[],
|
||||
enum source_format_class SourcePixelFormat[],
|
||||
enum dm_swizzle_mode SurfaceTiling[],
|
||||
int ViewportWidth[],
|
||||
int ViewportHeight[],
|
||||
int SurfaceWidthY[],
|
||||
int SurfaceWidthC[],
|
||||
int SurfaceHeightY[],
|
||||
int SurfaceHeightC[],
|
||||
int Read256BytesBlockHeightY[],
|
||||
int Read256BytesBlockHeightC[],
|
||||
int Read256BytesBlockWidthY[],
|
||||
int Read256BytesBlockWidthC[],
|
||||
unsigned int ViewportWidth[],
|
||||
unsigned int ViewportHeight[],
|
||||
unsigned int SurfaceWidthY[],
|
||||
unsigned int SurfaceWidthC[],
|
||||
unsigned int SurfaceHeightY[],
|
||||
unsigned int SurfaceHeightC[],
|
||||
unsigned int Read256BytesBlockHeightY[],
|
||||
unsigned int Read256BytesBlockHeightC[],
|
||||
unsigned int Read256BytesBlockWidthY[],
|
||||
unsigned int Read256BytesBlockWidthC[],
|
||||
enum odm_combine_mode ODMCombineEnabled[],
|
||||
int BlendingAndTiming[],
|
||||
int BytePerPixY[],
|
||||
int BytePerPixC[],
|
||||
unsigned int BlendingAndTiming[],
|
||||
unsigned int BytePerPixY[],
|
||||
unsigned int BytePerPixC[],
|
||||
double BytePerPixDETY[],
|
||||
double BytePerPixDETC[],
|
||||
int HActive[],
|
||||
unsigned int HActive[],
|
||||
double HRatio[],
|
||||
double HRatioChroma[],
|
||||
int DPPPerPlane[],
|
||||
int swath_width_luma_ub[],
|
||||
int swath_width_chroma_ub[],
|
||||
unsigned int DPPPerPlane[],
|
||||
unsigned int swath_width_luma_ub[],
|
||||
unsigned int swath_width_chroma_ub[],
|
||||
double SwathWidth[],
|
||||
double SwathWidthChroma[],
|
||||
int SwathHeightY[],
|
||||
int SwathHeightC[],
|
||||
unsigned int SwathHeightY[],
|
||||
unsigned int SwathHeightC[],
|
||||
unsigned int DETBufferSizeY[],
|
||||
unsigned int DETBufferSizeC[],
|
||||
bool ViewportSizeSupportPerPlane[],
|
||||
|
|
@ -582,31 +582,31 @@ static void CalculateSwathWidth(
|
|||
int NumberOfActivePlanes,
|
||||
enum source_format_class SourcePixelFormat[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
int ViewportWidth[],
|
||||
int ViewportHeight[],
|
||||
int SurfaceWidthY[],
|
||||
int SurfaceWidthC[],
|
||||
int SurfaceHeightY[],
|
||||
int SurfaceHeightC[],
|
||||
unsigned int ViewportWidth[],
|
||||
unsigned int ViewportHeight[],
|
||||
unsigned int SurfaceWidthY[],
|
||||
unsigned int SurfaceWidthC[],
|
||||
unsigned int SurfaceHeightY[],
|
||||
unsigned int SurfaceHeightC[],
|
||||
enum odm_combine_mode ODMCombineEnabled[],
|
||||
int BytePerPixY[],
|
||||
int BytePerPixC[],
|
||||
int Read256BytesBlockHeightY[],
|
||||
int Read256BytesBlockHeightC[],
|
||||
int Read256BytesBlockWidthY[],
|
||||
int Read256BytesBlockWidthC[],
|
||||
int BlendingAndTiming[],
|
||||
int HActive[],
|
||||
unsigned int BytePerPixY[],
|
||||
unsigned int BytePerPixC[],
|
||||
unsigned int Read256BytesBlockHeightY[],
|
||||
unsigned int Read256BytesBlockHeightC[],
|
||||
unsigned int Read256BytesBlockWidthY[],
|
||||
unsigned int Read256BytesBlockWidthC[],
|
||||
unsigned int BlendingAndTiming[],
|
||||
unsigned int HActive[],
|
||||
double HRatio[],
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
double SwathWidthSingleDPPY[],
|
||||
double SwathWidthSingleDPPC[],
|
||||
double SwathWidthY[],
|
||||
double SwathWidthC[],
|
||||
int MaximumSwathHeightY[],
|
||||
int MaximumSwathHeightC[],
|
||||
int swath_width_luma_ub[],
|
||||
int swath_width_chroma_ub[]);
|
||||
unsigned int MaximumSwathHeightY[],
|
||||
unsigned int MaximumSwathHeightC[],
|
||||
unsigned int swath_width_luma_ub[],
|
||||
unsigned int swath_width_chroma_ub[]);
|
||||
|
||||
static double CalculateExtraLatency(
|
||||
int RoundTripPingLatencyCycles,
|
||||
|
|
@ -620,8 +620,8 @@ static double CalculateExtraLatency(
|
|||
bool GPUVMEnable,
|
||||
bool HostVMEnable,
|
||||
int NumberOfActivePlanes,
|
||||
int NumberOfDPP[],
|
||||
int dpte_group_bytes[],
|
||||
unsigned int NumberOfDPP[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
double HostVMInefficiencyFactor,
|
||||
double HostVMMinPageSize,
|
||||
int HostVMMaxNonCachedPageTableLevels);
|
||||
|
|
@ -635,8 +635,8 @@ static double CalculateExtraLatencyBytes(
|
|||
bool GPUVMEnable,
|
||||
bool HostVMEnable,
|
||||
int NumberOfActivePlanes,
|
||||
int NumberOfDPP[],
|
||||
int dpte_group_bytes[],
|
||||
unsigned int NumberOfDPP[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
double HostVMInefficiencyFactor,
|
||||
double HostVMMinPageSize,
|
||||
int HostVMMaxNonCachedPageTableLevels);
|
||||
|
|
@ -660,7 +660,7 @@ static void CalculateUnboundedRequestAndCompressedBufferSize(
|
|||
int CompressedBufferSegmentSizeInkByteFinal,
|
||||
enum output_encoder_class *Output,
|
||||
bool *UnboundedRequestEnabled,
|
||||
int *CompressedBufferSizeInkByte);
|
||||
unsigned int *CompressedBufferSizeInkByte);
|
||||
|
||||
static bool UnboundedRequest(enum unbounded_requesting_policy UseUnboundedRequestingFinal, int TotalNumberOfActiveDPP, bool NoChroma, enum output_encoder_class Output);
|
||||
static unsigned int CalculateMaxVStartup(
|
||||
|
|
@ -887,7 +887,7 @@ static bool CalculatePrefetchSchedule(
|
|||
double *Tdmdl_vm,
|
||||
double *Tdmdl,
|
||||
double *TSetup,
|
||||
int *VUpdateOffsetPix,
|
||||
unsigned int *VUpdateOffsetPix,
|
||||
double *VUpdateWidthPix,
|
||||
double *VReadyOffsetPix)
|
||||
{
|
||||
|
|
@ -1835,19 +1835,19 @@ static unsigned int CalculateVMAndRowBytes(
|
|||
unsigned int *MetaRowByte,
|
||||
unsigned int *PixelPTEBytesPerRow,
|
||||
bool *PTEBufferSizeNotExceeded,
|
||||
int *dpte_row_width_ub,
|
||||
unsigned int *dpte_row_width_ub,
|
||||
unsigned int *dpte_row_height,
|
||||
unsigned int *MetaRequestWidth,
|
||||
unsigned int *MetaRequestHeight,
|
||||
unsigned int *meta_row_width,
|
||||
unsigned int *meta_row_height,
|
||||
int *vm_group_bytes,
|
||||
unsigned int *vm_group_bytes,
|
||||
unsigned int *dpte_group_bytes,
|
||||
unsigned int *PixelPTEReqWidth,
|
||||
unsigned int *PixelPTEReqHeight,
|
||||
unsigned int *PTERequestSize,
|
||||
int *DPDE0BytesFrame,
|
||||
int *MetaPTEBytesFrame)
|
||||
unsigned int *DPDE0BytesFrame,
|
||||
unsigned int *MetaPTEBytesFrame)
|
||||
{
|
||||
(void)SourcePixelFormat;
|
||||
struct vba_vars_st *v = &mode_lib->vba;
|
||||
|
|
@ -3297,18 +3297,18 @@ static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib)
|
|||
// Display Pipe Configuration
|
||||
double BytePerPixDETY[DC__NUM_DPP__MAX];
|
||||
double BytePerPixDETC[DC__NUM_DPP__MAX];
|
||||
int BytePerPixY[DC__NUM_DPP__MAX];
|
||||
int BytePerPixC[DC__NUM_DPP__MAX];
|
||||
int Read256BytesBlockHeightY[DC__NUM_DPP__MAX];
|
||||
int Read256BytesBlockHeightC[DC__NUM_DPP__MAX];
|
||||
int Read256BytesBlockWidthY[DC__NUM_DPP__MAX];
|
||||
int Read256BytesBlockWidthC[DC__NUM_DPP__MAX];
|
||||
unsigned int BytePerPixY[DC__NUM_DPP__MAX];
|
||||
unsigned int BytePerPixC[DC__NUM_DPP__MAX];
|
||||
unsigned int Read256BytesBlockHeightY[DC__NUM_DPP__MAX];
|
||||
unsigned int Read256BytesBlockHeightC[DC__NUM_DPP__MAX];
|
||||
unsigned int Read256BytesBlockWidthY[DC__NUM_DPP__MAX];
|
||||
unsigned int Read256BytesBlockWidthC[DC__NUM_DPP__MAX];
|
||||
double dummy1[DC__NUM_DPP__MAX];
|
||||
double dummy2[DC__NUM_DPP__MAX];
|
||||
double dummy3[DC__NUM_DPP__MAX];
|
||||
double dummy4[DC__NUM_DPP__MAX];
|
||||
int dummy5[DC__NUM_DPP__MAX];
|
||||
int dummy6[DC__NUM_DPP__MAX];
|
||||
unsigned int dummy5[DC__NUM_DPP__MAX];
|
||||
unsigned int dummy6[DC__NUM_DPP__MAX];
|
||||
bool dummy7[DC__NUM_DPP__MAX];
|
||||
bool dummysinglestring;
|
||||
|
||||
|
|
@ -3535,7 +3535,7 @@ static void CalculateVupdateAndDynamicMetadataParameters(
|
|||
double *Tdmbf,
|
||||
double *Tdmec,
|
||||
double *Tdmsks,
|
||||
int *VUpdateOffsetPix,
|
||||
unsigned int *VUpdateOffsetPix,
|
||||
double *VUpdateWidthPix,
|
||||
double *VReadyOffsetPix)
|
||||
{
|
||||
|
|
@ -3897,7 +3897,7 @@ void dml314_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_
|
|||
unsigned int i;
|
||||
unsigned int k, m;
|
||||
int ReorderingBytes;
|
||||
int MinPrefetchMode = 0, MaxPrefetchMode = 2;
|
||||
unsigned int MinPrefetchMode = 0, MaxPrefetchMode = 2;
|
||||
bool NoChroma = true;
|
||||
bool EnoughWritebackUnits = true;
|
||||
bool P2IWith420 = false;
|
||||
|
|
@ -5205,7 +5205,7 @@ void dml314_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_
|
|||
double HostVMInefficiencyFactor = 1;
|
||||
int NextPrefetchModeState = MinPrefetchMode;
|
||||
bool UnboundedRequestEnabledThisState = false;
|
||||
int CompressedBufferSizeInkByteThisState = 0;
|
||||
unsigned int CompressedBufferSizeInkByteThisState = 0;
|
||||
double dummy;
|
||||
|
||||
v->TimeCalc = 24 / v->ProjectedDCFCLKDeepSleep[i][j];
|
||||
|
|
@ -5867,8 +5867,8 @@ static void CalculateWatermarksAndDRAMSpeedChangeSupport(
|
|||
static void CalculateDCFCLKDeepSleep(
|
||||
struct display_mode_lib *mode_lib,
|
||||
unsigned int NumberOfActivePlanes,
|
||||
int BytePerPixelY[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelY[],
|
||||
unsigned int BytePerPixelC[],
|
||||
double VRatio[],
|
||||
double VRatioChroma[],
|
||||
double SwathWidthY[],
|
||||
|
|
@ -6019,7 +6019,7 @@ static void CalculatePixelDeliveryTimes(
|
|||
double PSCL_THROUGHPUT[],
|
||||
double PSCL_THROUGHPUT_CHROMA[],
|
||||
double DPPCLK[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelC[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
unsigned int NumberOfCursors[],
|
||||
unsigned int CursorWidth[][DC__NUM_CURSOR__MAX],
|
||||
|
|
@ -6144,35 +6144,35 @@ static void CalculateMetaAndPTETimes(
|
|||
bool GPUVMEnable,
|
||||
int MetaChunkSize,
|
||||
int MinMetaChunkSizeBytes,
|
||||
int HTotal[],
|
||||
unsigned int HTotal[],
|
||||
double VRatio[],
|
||||
double VRatioChroma[],
|
||||
double DestinationLinesToRequestRowInVBlank[],
|
||||
double DestinationLinesToRequestRowInImmediateFlip[],
|
||||
bool DCCEnable[],
|
||||
double PixelClock[],
|
||||
int BytePerPixelY[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelY[],
|
||||
unsigned int BytePerPixelC[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
int dpte_row_height[],
|
||||
int dpte_row_height_chroma[],
|
||||
int meta_row_width[],
|
||||
int meta_row_width_chroma[],
|
||||
int meta_row_height[],
|
||||
int meta_row_height_chroma[],
|
||||
int meta_req_width[],
|
||||
int meta_req_width_chroma[],
|
||||
int meta_req_height[],
|
||||
int meta_req_height_chroma[],
|
||||
int dpte_group_bytes[],
|
||||
int PTERequestSizeY[],
|
||||
int PTERequestSizeC[],
|
||||
int PixelPTEReqWidthY[],
|
||||
int PixelPTEReqHeightY[],
|
||||
int PixelPTEReqWidthC[],
|
||||
int PixelPTEReqHeightC[],
|
||||
int dpte_row_width_luma_ub[],
|
||||
int dpte_row_width_chroma_ub[],
|
||||
unsigned int dpte_row_height[],
|
||||
unsigned int dpte_row_height_chroma[],
|
||||
unsigned int meta_row_width[],
|
||||
unsigned int meta_row_width_chroma[],
|
||||
unsigned int meta_row_height[],
|
||||
unsigned int meta_row_height_chroma[],
|
||||
unsigned int meta_req_width[],
|
||||
unsigned int meta_req_width_chroma[],
|
||||
unsigned int meta_req_height[],
|
||||
unsigned int meta_req_height_chroma[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
unsigned int PTERequestSizeY[],
|
||||
unsigned int PTERequestSizeC[],
|
||||
unsigned int PixelPTEReqWidthY[],
|
||||
unsigned int PixelPTEReqHeightY[],
|
||||
unsigned int PixelPTEReqWidthC[],
|
||||
unsigned int PixelPTEReqHeightC[],
|
||||
unsigned int dpte_row_width_luma_ub[],
|
||||
unsigned int dpte_row_width_chroma_ub[],
|
||||
double DST_Y_PER_PTE_ROW_NOM_L[],
|
||||
double DST_Y_PER_PTE_ROW_NOM_C[],
|
||||
double DST_Y_PER_META_ROW_NOM_L[],
|
||||
|
|
@ -6317,18 +6317,18 @@ static void CalculateVMGroupAndRequestTimes(
|
|||
bool GPUVMEnable,
|
||||
unsigned int GPUVMMaxPageTableLevels,
|
||||
unsigned int HTotal[],
|
||||
int BytePerPixelC[],
|
||||
unsigned int BytePerPixelC[],
|
||||
double DestinationLinesToRequestVMInVBlank[],
|
||||
double DestinationLinesToRequestVMInImmediateFlip[],
|
||||
bool DCCEnable[],
|
||||
double PixelClock[],
|
||||
int dpte_row_width_luma_ub[],
|
||||
int dpte_row_width_chroma_ub[],
|
||||
int vm_group_bytes[],
|
||||
unsigned int dpte_row_width_luma_ub[],
|
||||
unsigned int dpte_row_width_chroma_ub[],
|
||||
unsigned int vm_group_bytes[],
|
||||
unsigned int dpde0_bytes_per_frame_ub_l[],
|
||||
unsigned int dpde0_bytes_per_frame_ub_c[],
|
||||
int meta_pte_bytes_per_frame_ub_l[],
|
||||
int meta_pte_bytes_per_frame_ub_c[],
|
||||
unsigned int meta_pte_bytes_per_frame_ub_l[],
|
||||
unsigned int meta_pte_bytes_per_frame_ub_c[],
|
||||
double TimePerVMGroupVBlank[],
|
||||
double TimePerVMGroupFlip[],
|
||||
double TimePerVMRequestVBlank[],
|
||||
|
|
@ -6436,29 +6436,29 @@ static void CalculateStutterEfficiency(
|
|||
bool ProgressiveToInterlaceUnitInOPP,
|
||||
bool Interlace[],
|
||||
double MinTTUVBlank[],
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
unsigned int DETBufferSizeY[],
|
||||
int BytePerPixelY[],
|
||||
unsigned int BytePerPixelY[],
|
||||
double BytePerPixelDETY[],
|
||||
double SwathWidthY[],
|
||||
int SwathHeightY[],
|
||||
int SwathHeightC[],
|
||||
unsigned int SwathHeightY[],
|
||||
unsigned int SwathHeightC[],
|
||||
double NetDCCRateLuma[],
|
||||
double NetDCCRateChroma[],
|
||||
double DCCFractionOfZeroSizeRequestsLuma[],
|
||||
double DCCFractionOfZeroSizeRequestsChroma[],
|
||||
int HTotal[],
|
||||
int VTotal[],
|
||||
unsigned int HTotal[],
|
||||
unsigned int VTotal[],
|
||||
double PixelClock[],
|
||||
double VRatio[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
int BlockHeight256BytesY[],
|
||||
int BlockWidth256BytesY[],
|
||||
int BlockHeight256BytesC[],
|
||||
int BlockWidth256BytesC[],
|
||||
int DCCYMaxUncompressedBlock[],
|
||||
int DCCCMaxUncompressedBlock[],
|
||||
int VActive[],
|
||||
unsigned int BlockHeight256BytesY[],
|
||||
unsigned int BlockWidth256BytesY[],
|
||||
unsigned int BlockHeight256BytesC[],
|
||||
unsigned int BlockWidth256BytesC[],
|
||||
unsigned int DCCYMaxUncompressedBlock[],
|
||||
unsigned int DCCCMaxUncompressedBlock[],
|
||||
unsigned int VActive[],
|
||||
bool DCCEnable[],
|
||||
bool WritebackEnable[],
|
||||
double ReadBandwidthPlaneLuma[],
|
||||
|
|
@ -6742,40 +6742,40 @@ static void CalculateSwathAndDETConfiguration(
|
|||
enum scan_direction_class SourceScan[],
|
||||
enum source_format_class SourcePixelFormat[],
|
||||
enum dm_swizzle_mode SurfaceTiling[],
|
||||
int ViewportWidth[],
|
||||
int ViewportHeight[],
|
||||
int SurfaceWidthY[],
|
||||
int SurfaceWidthC[],
|
||||
int SurfaceHeightY[],
|
||||
int SurfaceHeightC[],
|
||||
int Read256BytesBlockHeightY[],
|
||||
int Read256BytesBlockHeightC[],
|
||||
int Read256BytesBlockWidthY[],
|
||||
int Read256BytesBlockWidthC[],
|
||||
unsigned int ViewportWidth[],
|
||||
unsigned int ViewportHeight[],
|
||||
unsigned int SurfaceWidthY[],
|
||||
unsigned int SurfaceWidthC[],
|
||||
unsigned int SurfaceHeightY[],
|
||||
unsigned int SurfaceHeightC[],
|
||||
unsigned int Read256BytesBlockHeightY[],
|
||||
unsigned int Read256BytesBlockHeightC[],
|
||||
unsigned int Read256BytesBlockWidthY[],
|
||||
unsigned int Read256BytesBlockWidthC[],
|
||||
enum odm_combine_mode ODMCombineEnabled[],
|
||||
int BlendingAndTiming[],
|
||||
int BytePerPixY[],
|
||||
int BytePerPixC[],
|
||||
unsigned int BlendingAndTiming[],
|
||||
unsigned int BytePerPixY[],
|
||||
unsigned int BytePerPixC[],
|
||||
double BytePerPixDETY[],
|
||||
double BytePerPixDETC[],
|
||||
int HActive[],
|
||||
unsigned int HActive[],
|
||||
double HRatio[],
|
||||
double HRatioChroma[],
|
||||
int DPPPerPlane[],
|
||||
int swath_width_luma_ub[],
|
||||
int swath_width_chroma_ub[],
|
||||
unsigned int DPPPerPlane[],
|
||||
unsigned int swath_width_luma_ub[],
|
||||
unsigned int swath_width_chroma_ub[],
|
||||
double SwathWidth[],
|
||||
double SwathWidthChroma[],
|
||||
int SwathHeightY[],
|
||||
int SwathHeightC[],
|
||||
unsigned int SwathHeightY[],
|
||||
unsigned int SwathHeightC[],
|
||||
unsigned int DETBufferSizeY[],
|
||||
unsigned int DETBufferSizeC[],
|
||||
bool ViewportSizeSupportPerPlane[],
|
||||
bool *ViewportSizeSupport)
|
||||
{
|
||||
(void)HRatioChroma;
|
||||
int MaximumSwathHeightY[DC__NUM_DPP__MAX];
|
||||
int MaximumSwathHeightC[DC__NUM_DPP__MAX];
|
||||
unsigned int MaximumSwathHeightY[DC__NUM_DPP__MAX];
|
||||
unsigned int MaximumSwathHeightC[DC__NUM_DPP__MAX];
|
||||
int MinimumSwathHeightY;
|
||||
int MinimumSwathHeightC;
|
||||
unsigned int RoundedUpMaxSwathSizeBytesY;
|
||||
|
|
@ -6919,31 +6919,31 @@ static void CalculateSwathWidth(
|
|||
int NumberOfActivePlanes,
|
||||
enum source_format_class SourcePixelFormat[],
|
||||
enum scan_direction_class SourceScan[],
|
||||
int ViewportWidth[],
|
||||
int ViewportHeight[],
|
||||
int SurfaceWidthY[],
|
||||
int SurfaceWidthC[],
|
||||
int SurfaceHeightY[],
|
||||
int SurfaceHeightC[],
|
||||
unsigned int ViewportWidth[],
|
||||
unsigned int ViewportHeight[],
|
||||
unsigned int SurfaceWidthY[],
|
||||
unsigned int SurfaceWidthC[],
|
||||
unsigned int SurfaceHeightY[],
|
||||
unsigned int SurfaceHeightC[],
|
||||
enum odm_combine_mode ODMCombineEnabled[],
|
||||
int BytePerPixY[],
|
||||
int BytePerPixC[],
|
||||
int Read256BytesBlockHeightY[],
|
||||
int Read256BytesBlockHeightC[],
|
||||
int Read256BytesBlockWidthY[],
|
||||
int Read256BytesBlockWidthC[],
|
||||
int BlendingAndTiming[],
|
||||
int HActive[],
|
||||
unsigned int BytePerPixY[],
|
||||
unsigned int BytePerPixC[],
|
||||
unsigned int Read256BytesBlockHeightY[],
|
||||
unsigned int Read256BytesBlockHeightC[],
|
||||
unsigned int Read256BytesBlockWidthY[],
|
||||
unsigned int Read256BytesBlockWidthC[],
|
||||
unsigned int BlendingAndTiming[],
|
||||
unsigned int HActive[],
|
||||
double HRatio[],
|
||||
int DPPPerPlane[],
|
||||
unsigned int DPPPerPlane[],
|
||||
double SwathWidthSingleDPPY[],
|
||||
double SwathWidthSingleDPPC[],
|
||||
double SwathWidthY[],
|
||||
double SwathWidthC[],
|
||||
int MaximumSwathHeightY[],
|
||||
int MaximumSwathHeightC[],
|
||||
int swath_width_luma_ub[],
|
||||
int swath_width_chroma_ub[])
|
||||
unsigned int MaximumSwathHeightY[],
|
||||
unsigned int MaximumSwathHeightC[],
|
||||
unsigned int swath_width_luma_ub[],
|
||||
unsigned int swath_width_chroma_ub[])
|
||||
{
|
||||
(void)BytePerPixY;
|
||||
enum odm_combine_mode MainPlaneODMCombine;
|
||||
|
|
@ -7049,8 +7049,8 @@ static double CalculateExtraLatency(
|
|||
bool GPUVMEnable,
|
||||
bool HostVMEnable,
|
||||
int NumberOfActivePlanes,
|
||||
int NumberOfDPP[],
|
||||
int dpte_group_bytes[],
|
||||
unsigned int NumberOfDPP[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
double HostVMInefficiencyFactor,
|
||||
double HostVMMinPageSize,
|
||||
int HostVMMaxNonCachedPageTableLevels)
|
||||
|
|
@ -7095,8 +7095,8 @@ static double CalculateExtraLatencyBytes(
|
|||
bool GPUVMEnable,
|
||||
bool HostVMEnable,
|
||||
int NumberOfActivePlanes,
|
||||
int NumberOfDPP[],
|
||||
int dpte_group_bytes[],
|
||||
unsigned int NumberOfDPP[],
|
||||
unsigned int dpte_group_bytes[],
|
||||
double HostVMInefficiencyFactor,
|
||||
double HostVMMinPageSize,
|
||||
int HostVMMaxNonCachedPageTableLevels)
|
||||
|
|
@ -7147,7 +7147,7 @@ static noinline_for_stack void UseMinimumDCFCLK(
|
|||
int ReorderingBytes)
|
||||
{
|
||||
struct vba_vars_st *v = &mode_lib->vba;
|
||||
int dummy1, j;
|
||||
unsigned int dummy1, j;
|
||||
unsigned int i, k;
|
||||
double NormalEfficiency, dummy2, dummy3;
|
||||
double TotalMaxPrefetchFlipDPTERowBandwidth[DC__VOLTAGE_STATES][2];
|
||||
|
|
@ -7166,7 +7166,7 @@ static noinline_for_stack void UseMinimumDCFCLK(
|
|||
double ExtraLatencyBytes;
|
||||
double ExtraLatencyCycles;
|
||||
double DCFCLKRequiredForPeakBandwidth;
|
||||
int NoOfDPPState[DC__NUM_DPP__MAX];
|
||||
unsigned int NoOfDPPState[DC__NUM_DPP__MAX];
|
||||
double MinimumTvmPlus2Tr0;
|
||||
|
||||
TotalMaxPrefetchFlipDPTERowBandwidth[i][j] = 0;
|
||||
|
|
@ -7314,7 +7314,7 @@ static void CalculateUnboundedRequestAndCompressedBufferSize(
|
|||
int CompressedBufferSegmentSizeInkByteFinal,
|
||||
enum output_encoder_class *Output,
|
||||
bool *UnboundedRequestEnabled,
|
||||
int *CompressedBufferSizeInkByte)
|
||||
unsigned int *CompressedBufferSizeInkByte)
|
||||
{
|
||||
double actDETBufferSizeInKByte = dml_ceil(DETBufferSizeInKByte, 64);
|
||||
|
||||
|
|
|
|||
|
|
@ -1400,7 +1400,7 @@ static void try_odm_power_optimization_and_revalidate(
|
|||
display_e2e_pipe_params_st *pipes,
|
||||
int *split,
|
||||
bool *merge,
|
||||
unsigned int *vlevel,
|
||||
int *vlevel,
|
||||
int pipe_cnt)
|
||||
{
|
||||
int i;
|
||||
|
|
@ -2216,7 +2216,7 @@ bool dcn32_internal_validate_bw(struct dc *dc,
|
|||
if (repopulate_pipes) {
|
||||
int flag_max_mpc_comb = vba->maxMpcComb;
|
||||
int flag_vlevel = vlevel;
|
||||
int i;
|
||||
int j;
|
||||
|
||||
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, validate_mode);
|
||||
if (!dc->config.enable_windowed_mpo_odm)
|
||||
|
|
@ -2231,19 +2231,20 @@ bool dcn32_internal_validate_bw(struct dc *dc,
|
|||
dm_prefetch_support_uclk_fclk_and_stutter_if_possible;
|
||||
|
||||
vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);
|
||||
const int num_states = (int)context->bw_ctx.dml.soc.num_states;
|
||||
|
||||
if (vlevel == context->bw_ctx.dml.soc.num_states) {
|
||||
if (vlevel == num_states) {
|
||||
/* failed after DET size changes */
|
||||
goto validate_fail;
|
||||
} else if (flag_max_mpc_comb == 0 &&
|
||||
flag_max_mpc_comb != context->bw_ctx.dml.vba.maxMpcComb) {
|
||||
/* check the context constructed with pipe split flags is still valid*/
|
||||
bool flags_valid = false;
|
||||
for (i = flag_vlevel; i < (int)context->bw_ctx.dml.soc.num_states; i++) {
|
||||
if (vba->ModeSupport[i][flag_max_mpc_comb]) {
|
||||
for (j = flag_vlevel; j < (int)context->bw_ctx.dml.soc.num_states; j++) {
|
||||
if (vba->ModeSupport[j][flag_max_mpc_comb]) {
|
||||
vba->maxMpcComb = flag_max_mpc_comb;
|
||||
vba->VoltageLevel = i;
|
||||
vlevel = i;
|
||||
vba->VoltageLevel = j;
|
||||
vlevel = j;
|
||||
flags_valid = true;
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2954,7 +2954,7 @@ void dml32_UseMinimumDCFCLK(
|
|||
unsigned int VTotal[],
|
||||
unsigned int VActive[],
|
||||
unsigned int DynamicMetadataTransmittedBytes[],
|
||||
unsigned int DynamicMetadataLinesBeforeActiveRequired[],
|
||||
int DynamicMetadataLinesBeforeActiveRequired[],
|
||||
bool Interlace[],
|
||||
double RequiredDPPCLKPerSurface[][2][DC__NUM_DPP__MAX],
|
||||
double RequiredDISPCLK[][2],
|
||||
|
|
@ -5631,7 +5631,7 @@ void dml32_CalculateStutterEfficiency(
|
|||
bool Interlace[],
|
||||
double MinTTUVBlank[],
|
||||
unsigned int DPPPerSurface[],
|
||||
unsigned int DETBufferSizeY[],
|
||||
unsigned int DETBufferSizeY[],
|
||||
unsigned int BytePerPixelY[],
|
||||
double BytePerPixelDETY[],
|
||||
double SwathWidthY[],
|
||||
|
|
@ -5663,10 +5663,10 @@ void dml32_CalculateStutterEfficiency(
|
|||
/* Output */
|
||||
double *StutterEfficiencyNotIncludingVBlank,
|
||||
double *StutterEfficiency,
|
||||
unsigned int *NumberOfStutterBurstsPerFrame,
|
||||
int *NumberOfStutterBurstsPerFrame,
|
||||
double *Z8StutterEfficiencyNotIncludingVBlank,
|
||||
double *Z8StutterEfficiency,
|
||||
unsigned int *Z8NumberOfStutterBurstsPerFrame,
|
||||
int *Z8NumberOfStutterBurstsPerFrame,
|
||||
double *StutterPeriod,
|
||||
bool *DCHUBBUB_ARB_CSTATE_MAX_CAP_MODE)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -614,7 +614,7 @@ void dml32_UseMinimumDCFCLK(
|
|||
unsigned int VTotal[],
|
||||
unsigned int VActive[],
|
||||
unsigned int DynamicMetadataTransmittedBytes[],
|
||||
unsigned int DynamicMetadataLinesBeforeActiveRequired[],
|
||||
int DynamicMetadataLinesBeforeActiveRequired[],
|
||||
bool Interlace[],
|
||||
double RequiredDPPCLKPerSurface[][2][DC__NUM_DPP__MAX],
|
||||
double RequiredDISPCLK[][2],
|
||||
|
|
@ -1013,7 +1013,7 @@ void dml32_CalculateStutterEfficiency(
|
|||
bool ProgressiveToInterlaceUnitInOPP,
|
||||
bool Interlace[],
|
||||
double MinTTUVBlank[],
|
||||
unsigned int DPPPerSurface[],
|
||||
unsigned int DPPPerSurface[],
|
||||
unsigned int DETBufferSizeY[],
|
||||
unsigned int BytePerPixelY[],
|
||||
double BytePerPixelDETY[],
|
||||
|
|
@ -1046,10 +1046,10 @@ void dml32_CalculateStutterEfficiency(
|
|||
/* Output */
|
||||
double *StutterEfficiencyNotIncludingVBlank,
|
||||
double *StutterEfficiency,
|
||||
unsigned int *NumberOfStutterBurstsPerFrame,
|
||||
int *NumberOfStutterBurstsPerFrame,
|
||||
double *Z8StutterEfficiencyNotIncludingVBlank,
|
||||
double *Z8StutterEfficiency,
|
||||
unsigned int *Z8NumberOfStutterBurstsPerFrame,
|
||||
int *Z8NumberOfStutterBurstsPerFrame,
|
||||
double *StutterPeriod,
|
||||
bool *DCHUBBUB_ARB_CSTATE_MAX_CAP_MODE);
|
||||
|
||||
|
|
|
|||
|
|
@ -551,16 +551,16 @@ int dcn35_populate_dml_pipes_from_context_fpu(struct dc *dc,
|
|||
}
|
||||
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
|
||||
struct pipe_ctx *cur_pipe = &context->res_ctx.pipe_ctx[i];
|
||||
|
||||
if (!pipe->stream)
|
||||
if (!cur_pipe->stream)
|
||||
continue;
|
||||
|
||||
if (pipe->stream->signal == SIGNAL_TYPE_EDP &&
|
||||
if (cur_pipe->stream->signal == SIGNAL_TYPE_EDP &&
|
||||
dc->debug.seamless_boot_odm_combine &&
|
||||
pipe->stream->apply_seamless_boot_optimization) {
|
||||
cur_pipe->stream->apply_seamless_boot_optimization) {
|
||||
|
||||
if (pipe->stream->apply_boot_odm_mode ==
|
||||
if (cur_pipe->stream->apply_boot_odm_mode ==
|
||||
dm_odm_combine_policy_2to1) {
|
||||
context->bw_ctx.dml.vba.ODMCombinePolicy =
|
||||
dm_odm_combine_policy_2to1;
|
||||
|
|
|
|||
|
|
@ -583,16 +583,16 @@ int dcn351_populate_dml_pipes_from_context_fpu(struct dc *dc,
|
|||
}
|
||||
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
|
||||
struct pipe_ctx *cur_pipe = &context->res_ctx.pipe_ctx[i];
|
||||
|
||||
if (!pipe->stream)
|
||||
if (!cur_pipe->stream)
|
||||
continue;
|
||||
|
||||
if (pipe->stream->signal == SIGNAL_TYPE_EDP &&
|
||||
if (cur_pipe->stream->signal == SIGNAL_TYPE_EDP &&
|
||||
dc->debug.seamless_boot_odm_combine &&
|
||||
pipe->stream->apply_seamless_boot_optimization) {
|
||||
cur_pipe->stream->apply_seamless_boot_optimization) {
|
||||
|
||||
if (pipe->stream->apply_boot_odm_mode ==
|
||||
if (cur_pipe->stream->apply_boot_odm_mode ==
|
||||
dm_odm_combine_policy_2to1) {
|
||||
context->bw_ctx.dml.vba.ODMCombinePolicy =
|
||||
dm_odm_combine_policy_2to1;
|
||||
|
|
|
|||
|
|
@ -472,7 +472,7 @@ struct vba_vars_st {
|
|||
unsigned int VTotal[DC__NUM_DPP__MAX];
|
||||
unsigned int VTotal_Max[DC__NUM_DPP__MAX];
|
||||
unsigned int VTotal_Min[DC__NUM_DPP__MAX];
|
||||
int DPPPerPlane[DC__NUM_DPP__MAX];
|
||||
unsigned int DPPPerPlane[DC__NUM_DPP__MAX];
|
||||
double PixelClock[DC__NUM_DPP__MAX];
|
||||
double PixelClockBackEnd[DC__NUM_DPP__MAX];
|
||||
bool DCCEnable[DC__NUM_DPP__MAX];
|
||||
|
|
@ -739,7 +739,7 @@ struct vba_vars_st {
|
|||
/* ms locals */
|
||||
double IdealSDPPortBandwidthPerState[DC__VOLTAGE_STATES][2];
|
||||
unsigned int NoOfDPP[DC__VOLTAGE_STATES][2][DC__NUM_DPP__MAX];
|
||||
int NoOfDPPThisState[DC__NUM_DPP__MAX];
|
||||
unsigned int NoOfDPPThisState[DC__NUM_DPP__MAX];
|
||||
enum odm_combine_mode ODMCombineEnablePerState[DC__VOLTAGE_STATES][DC__NUM_DPP__MAX];
|
||||
double SwathWidthYThisState[DC__NUM_DPP__MAX];
|
||||
unsigned int SwathHeightCPerState[DC__VOLTAGE_STATES][2][DC__NUM_DPP__MAX];
|
||||
|
|
@ -900,7 +900,7 @@ struct vba_vars_st {
|
|||
int PTEBufferSizeInRequestsForChroma;
|
||||
|
||||
// Missing from VBA
|
||||
int dpte_group_bytes_chroma;
|
||||
unsigned int dpte_group_bytes_chroma;
|
||||
unsigned int vm_group_bytes_chroma;
|
||||
double dst_x_after_scaler;
|
||||
double dst_y_after_scaler;
|
||||
|
|
@ -1100,8 +1100,8 @@ struct vba_vars_st {
|
|||
unsigned int DETBufferSizeCThisState[DC__NUM_DPP__MAX];
|
||||
bool NoUrgentLatencyHiding[DC__NUM_DPP__MAX];
|
||||
bool NoUrgentLatencyHidingPre[DC__NUM_DPP__MAX];
|
||||
int swath_width_luma_ub_this_state[DC__NUM_DPP__MAX];
|
||||
int swath_width_chroma_ub_this_state[DC__NUM_DPP__MAX];
|
||||
unsigned int swath_width_luma_ub_this_state[DC__NUM_DPP__MAX];
|
||||
unsigned int swath_width_chroma_ub_this_state[DC__NUM_DPP__MAX];
|
||||
double UrgLatency[DC__VOLTAGE_STATES];
|
||||
double VActiveCursorBandwidth[DC__VOLTAGE_STATES][2][DC__NUM_DPP__MAX];
|
||||
double VActivePixelBandwidth[DC__VOLTAGE_STATES][2][DC__NUM_DPP__MAX];
|
||||
|
|
@ -1172,7 +1172,7 @@ struct vba_vars_st {
|
|||
int ConfigReturnBufferSizeInKByte;
|
||||
enum unbounded_requesting_policy UseUnboundedRequesting;
|
||||
int CompressedBufferSegmentSizeInkByte;
|
||||
int CompressedBufferSizeInkByte;
|
||||
unsigned int CompressedBufferSizeInkByte;
|
||||
int MetaFIFOSizeInKEntries;
|
||||
int ZeroSizeBufferEntries;
|
||||
int COMPBUF_RESERVED_SPACE_64B;
|
||||
|
|
|
|||
|
|
@ -2626,18 +2626,18 @@ static dml_uint_t CalculateVMAndRowBytes(
|
|||
*PixelPTEBytesPerRow_one_row_per_frame = (dml_uint_t)((dml_float_t) *dpte_row_width_ub_one_row_per_frame / (dml_float_t) *PixelPTEReqWidth * *PTERequestSize);
|
||||
|
||||
if (SurfaceTiling == dml_sw_linear) {
|
||||
*dpte_row_height = (dml_uint_t)(dml_min(128, 1 << (dml_uint_t) dml_floor(dml_log2(PTEBufferSizeInRequests * *PixelPTEReqWidth / Pitch), 1)));
|
||||
*dpte_row_height = (dml_uint_t)(dml_min(128, (dml_uint_t)dml_pow(2.0, (int)dml_floor(dml_log2(PTEBufferSizeInRequests * *PixelPTEReqWidth / Pitch), 1))));
|
||||
dml_print("DML::%s: dpte_row_height term 1 = %u\n", __func__, PTEBufferSizeInRequests * *PixelPTEReqWidth / Pitch);
|
||||
dml_print("DML::%s: dpte_row_height term 2 = %f\n", __func__, dml_log2(PTEBufferSizeInRequests * *PixelPTEReqWidth / Pitch));
|
||||
dml_print("DML::%s: dpte_row_height term 3 = %f\n", __func__, dml_floor(dml_log2(PTEBufferSizeInRequests * *PixelPTEReqWidth / Pitch), 1));
|
||||
dml_print("DML::%s: dpte_row_height term 4 = %u\n", __func__, 1 << (dml_uint_t) dml_floor(dml_log2(PTEBufferSizeInRequests * *PixelPTEReqWidth / Pitch), 1));
|
||||
dml_print("DML::%s: dpte_row_height term 4 = %u\n", __func__, (dml_uint_t)dml_pow(2.0, (int)dml_floor(dml_log2(PTEBufferSizeInRequests * *PixelPTEReqWidth / Pitch), 1)));
|
||||
dml_print("DML::%s: dpte_row_height = %u\n", __func__, *dpte_row_height);
|
||||
|
||||
*dpte_row_width_ub = (dml_uint_t)(dml_ceil(((dml_float_t) Pitch * (dml_float_t) *dpte_row_height - 1), (dml_float_t) *PixelPTEReqWidth) + *PixelPTEReqWidth);
|
||||
*PixelPTEBytesPerRow = (dml_uint_t)((dml_float_t) *dpte_row_width_ub / (dml_float_t) *PixelPTEReqWidth * *PTERequestSize);
|
||||
|
||||
// VBA_DELTA, VBA doesn't have programming value for pte row height linear.
|
||||
*dpte_row_height_linear = 1 << (dml_uint_t) dml_floor(dml_log2(PTEBufferSizeInRequests * PixelPTEReqWidth_linear / Pitch), 1);
|
||||
*dpte_row_height_linear = (dml_uint_t)dml_pow(2.0, (int)dml_floor(dml_log2(PTEBufferSizeInRequests * PixelPTEReqWidth_linear / Pitch), 1));
|
||||
if (*dpte_row_height_linear > 128)
|
||||
*dpte_row_height_linear = 128;
|
||||
|
||||
|
|
|
|||
|
|
@ -613,6 +613,7 @@ static void populate_dml21_plane_config_from_plane_state(struct dml2_context *dm
|
|||
|
||||
plane->composition.viewport.stationary = false;
|
||||
|
||||
#ifndef TRIM_CM2
|
||||
if (plane_state->mcm_luts.lut3d_data.lut3d_src == DC_CM2_TRANSFER_FUNC_SOURCE_VIDMEM) {
|
||||
plane->tdlut.setup_for_tdlut = true;
|
||||
|
||||
|
|
@ -643,7 +644,39 @@ static void populate_dml21_plane_config_from_plane_state(struct dml2_context *dm
|
|||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (plane_state->cm.flags.bits.lut3d_dma_enable) {
|
||||
plane->tdlut.setup_for_tdlut = true;
|
||||
|
||||
switch (plane_state->cm.lut3d_dma.swizzle) {
|
||||
case CM_LUT_3D_SWIZZLE_LINEAR_RGB:
|
||||
case CM_LUT_3D_SWIZZLE_LINEAR_BGR:
|
||||
plane->tdlut.tdlut_addressing_mode = dml2_tdlut_sw_linear;
|
||||
break;
|
||||
case CM_LUT_1D_PACKED_LINEAR:
|
||||
plane->tdlut.tdlut_addressing_mode = dml2_tdlut_simple_linear;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (plane_state->cm.lut3d_dma.size) {
|
||||
case CM_LUT_SIZE_171717:
|
||||
plane->tdlut.tdlut_width_mode = dml2_tdlut_width_17_cube;
|
||||
break;
|
||||
case CM_LUT_SIZE_333333:
|
||||
plane->tdlut.tdlut_width_mode = dml2_tdlut_width_33_cube;
|
||||
break;
|
||||
// handling when use case and HW support available
|
||||
case CM_LUT_SIZE_454545:
|
||||
case CM_LUT_SIZE_656565:
|
||||
break;
|
||||
case CM_LUT_SIZE_NONE:
|
||||
case CM_LUT_SIZE_999:
|
||||
default:
|
||||
//plane->tdlut.tdlut_width_mode = dml2_tdlut_width_flatten; // dml2_tdlut_width_flatten undefined
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif // TRIM_CM2
|
||||
plane->tdlut.setup_for_tdlut |= dml_ctx->config.force_tdlut_enable;
|
||||
|
||||
plane->dynamic_meta_data.enable = false;
|
||||
|
|
|
|||
|
|
@ -255,7 +255,7 @@ static void populate_pipe_ctx_dlg_params_from_dml(struct pipe_ctx *pipe_ctx, str
|
|||
pipe_ctx->pipe_dlg_param.vupdate_width = dml_get_vupdate_width(mode_lib, pipe_idx);
|
||||
pipe_ctx->pipe_dlg_param.vready_offset = dml_get_vready_offset(mode_lib, pipe_idx);
|
||||
|
||||
ASSERT(pipe_ctx->stream_res.tg->inst >= 0 && pipe_ctx->stream_res.tg->inst <= 0xFF);
|
||||
ASSERT(pipe_ctx->stream_res.tg->inst <= 0xFF);
|
||||
pipe_ctx->pipe_dlg_param.otg_inst = (unsigned char)pipe_ctx->stream_res.tg->inst;
|
||||
|
||||
pipe_ctx->pipe_dlg_param.hactive = hactive;
|
||||
|
|
|
|||
|
|
@ -307,7 +307,7 @@ void dpp1_cm_set_output_csc_default(
|
|||
{
|
||||
struct dcn10_dpp *dpp = TO_DCN10_DPP(dpp_base);
|
||||
const uint16_t *regval = NULL;
|
||||
int arr_size;
|
||||
uint32_t arr_size;
|
||||
|
||||
regval = find_color_matrix(colorspace, &arr_size);
|
||||
if (regval == NULL) {
|
||||
|
|
|
|||
|
|
@ -548,7 +548,7 @@ bool dpp3_get_optimal_number_of_taps(
|
|||
|
||||
static void dpp3_deferred_update(struct dpp *dpp_base)
|
||||
{
|
||||
int bypass_state;
|
||||
uint32_t bypass_state;
|
||||
struct dcn3_dpp *dpp = TO_DCN30_DPP(dpp_base);
|
||||
|
||||
if (dpp_base->deferred_reg_writes.bits.disable_dscl) {
|
||||
|
|
|
|||
|
|
@ -317,7 +317,7 @@ void dpp3_set_hdr_multiplier(
|
|||
static void program_gamut_remap(
|
||||
struct dcn3_dpp *dpp,
|
||||
const uint16_t *regval,
|
||||
int select)
|
||||
unsigned int select)
|
||||
{
|
||||
uint16_t selection = 0;
|
||||
struct color_matrices_reg gam_regs;
|
||||
|
|
@ -379,7 +379,7 @@ void dpp3_cm_set_gamut_remap(
|
|||
{
|
||||
struct dcn3_dpp *dpp = TO_DCN30_DPP(dpp_base);
|
||||
int i = 0;
|
||||
int gamut_mode;
|
||||
uint32_t gamut_mode;
|
||||
|
||||
if (adjust->gamut_adjust_type != GRAPHICS_GAMUT_ADJUST_TYPE_SW)
|
||||
/* Bypass if type is bypass or hw */
|
||||
|
|
|
|||
|
|
@ -1336,7 +1336,7 @@ uint32_t dc_dsc_stream_bandwidth_in_kbps(const struct dc_crtc_timing *timing,
|
|||
|
||||
uint32_t dc_dsc_stream_bandwidth_overhead_in_kbps(
|
||||
const struct dc_crtc_timing *timing,
|
||||
const int num_slices_h,
|
||||
const uint32_t num_slices_h,
|
||||
const bool is_dp)
|
||||
{
|
||||
struct fixed31_32 max_dsc_overhead;
|
||||
|
|
|
|||
|
|
@ -228,9 +228,9 @@ bool dsc2_get_packed_pps(struct display_stream_compressor *dsc, const struct dsc
|
|||
void dsc2_enable(struct display_stream_compressor *dsc, int opp_pipe)
|
||||
{
|
||||
struct dcn20_dsc *dsc20 = TO_DCN20_DSC(dsc);
|
||||
int dsc_clock_en;
|
||||
int dsc_fw_config;
|
||||
int enabled_opp_pipe;
|
||||
uint32_t dsc_clock_en;
|
||||
uint32_t dsc_fw_config;
|
||||
uint32_t enabled_opp_pipe;
|
||||
|
||||
DC_LOG_DSC("enable DSC %d at opp pipe %d", dsc->inst, opp_pipe);
|
||||
|
||||
|
|
@ -253,7 +253,7 @@ void dsc2_enable(struct display_stream_compressor *dsc, int opp_pipe)
|
|||
void dsc2_disable(struct display_stream_compressor *dsc)
|
||||
{
|
||||
struct dcn20_dsc *dsc20 = TO_DCN20_DSC(dsc);
|
||||
int dsc_clock_en;
|
||||
uint32_t dsc_clock_en;
|
||||
|
||||
DC_LOG_DSC("disable DSC %d", dsc->inst);
|
||||
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user