mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-07 14:32:23 +00:00
Merge tag 'amd-drm-next-5.19-2022-04-22' of https://gitlab.freedesktop.org/agd5f/linux into drm-next
amd-drm-next-5.19-2022-04-22: amdgpu: - SMU message documentation update - Misc code cleanups - Documenation updates - PSP TA updates - Runtime PM regression fix - SR-IOV header cleanup - Misc fixes amdkfd: - TLB flush fixes - GWS fixes - CRIU GWS support radeon: - Misc code cleanups Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexander.deucher@amd.com> Link: https://patchwork.freedesktop.org/patch/msgid/20220422150049.5859-1-alexander.deucher@amd.com
This commit is contained in:
commit
4eaf02db9c
@ -8,12 +8,19 @@ we have a dedicated glossary for Display Core at
|
||||
|
||||
.. glossary::
|
||||
|
||||
active_cu_number
|
||||
The number of CUs that are active on the system. The number of active
|
||||
CUs may be less than SE * SH * CU depending on the board configuration.
|
||||
|
||||
CP
|
||||
Command Processor
|
||||
|
||||
CPLIB
|
||||
Content Protection Library
|
||||
|
||||
CU
|
||||
Compute Unit
|
||||
|
||||
DFS
|
||||
Digital Frequency Synthesizer
|
||||
|
||||
@ -74,6 +81,12 @@ we have a dedicated glossary for Display Core at
|
||||
SDMA
|
||||
System DMA
|
||||
|
||||
SE
|
||||
Shader Engine
|
||||
|
||||
SH
|
||||
SHader array
|
||||
|
||||
SMU
|
||||
System Management Unit
|
||||
|
||||
|
@ -16448,6 +16448,7 @@ S: Supported
|
||||
T: git https://gitlab.freedesktop.org/agd5f/linux.git
|
||||
B: https://gitlab.freedesktop.org/drm/amd/-/issues
|
||||
C: irc://irc.oftc.net/radeon
|
||||
F: Documentation/gpu/amdgpu/
|
||||
F: drivers/gpu/drm/amd/
|
||||
F: drivers/gpu/drm/radeon/
|
||||
F: include/uapi/drm/amdgpu_drm.h
|
||||
|
@ -58,7 +58,7 @@ amdgpu-y += amdgpu_device.o amdgpu_kms.o \
|
||||
amdgpu_vm_sdma.o amdgpu_discovery.o amdgpu_ras_eeprom.o amdgpu_nbio.o \
|
||||
amdgpu_umc.o smu_v11_0_i2c.o amdgpu_fru_eeprom.o amdgpu_rap.o \
|
||||
amdgpu_fw_attestation.o amdgpu_securedisplay.o \
|
||||
amdgpu_eeprom.o amdgpu_mca.o
|
||||
amdgpu_eeprom.o amdgpu_mca.o amdgpu_psp_ta.o
|
||||
|
||||
amdgpu-$(CONFIG_PROC_FS) += amdgpu_fdinfo.o
|
||||
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include "amdgpu_umr.h"
|
||||
|
||||
#include "amdgpu_reset.h"
|
||||
#include "amdgpu_psp_ta.h"
|
||||
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
|
||||
@ -1767,6 +1768,7 @@ int amdgpu_debugfs_init(struct amdgpu_device *adev)
|
||||
DRM_ERROR("registering register debugfs failed (%d).\n", r);
|
||||
|
||||
amdgpu_debugfs_firmware_init(adev);
|
||||
amdgpu_ta_if_debugfs_init(adev);
|
||||
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
if (amdgpu_device_has_dc_support(adev))
|
||||
|
@ -3700,7 +3700,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
|
||||
/* enable PCIE atomic ops */
|
||||
if (amdgpu_sriov_vf(adev))
|
||||
adev->have_atomics_support = ((struct amd_sriov_msg_pf2vf_info *)
|
||||
adev->virt.fw_reserve.p_pf2vf)->pcie_atomic_ops_enabled_flags ==
|
||||
adev->virt.fw_reserve.p_pf2vf)->pcie_atomic_ops_support_flags ==
|
||||
(PCI_EXP_DEVCAP2_ATOMIC_COMP32 | PCI_EXP_DEVCAP2_ATOMIC_COMP64);
|
||||
else
|
||||
adev->have_atomics_support =
|
||||
|
@ -2395,6 +2395,71 @@ static int amdgpu_pmops_restore(struct device *dev)
|
||||
return amdgpu_device_resume(drm_dev, true);
|
||||
}
|
||||
|
||||
static int amdgpu_runtime_idle_check_display(struct device *dev)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
struct drm_device *drm_dev = pci_get_drvdata(pdev);
|
||||
struct amdgpu_device *adev = drm_to_adev(drm_dev);
|
||||
|
||||
if (adev->mode_info.num_crtc) {
|
||||
struct drm_connector *list_connector;
|
||||
struct drm_connector_list_iter iter;
|
||||
int ret = 0;
|
||||
|
||||
/* XXX: Return busy if any displays are connected to avoid
|
||||
* possible display wakeups after runtime resume due to
|
||||
* hotplug events in case any displays were connected while
|
||||
* the GPU was in suspend. Remove this once that is fixed.
|
||||
*/
|
||||
mutex_lock(&drm_dev->mode_config.mutex);
|
||||
drm_connector_list_iter_begin(drm_dev, &iter);
|
||||
drm_for_each_connector_iter(list_connector, &iter) {
|
||||
if (list_connector->status == connector_status_connected) {
|
||||
ret = -EBUSY;
|
||||
break;
|
||||
}
|
||||
}
|
||||
drm_connector_list_iter_end(&iter);
|
||||
mutex_unlock(&drm_dev->mode_config.mutex);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (amdgpu_device_has_dc_support(adev)) {
|
||||
struct drm_crtc *crtc;
|
||||
|
||||
drm_for_each_crtc(crtc, drm_dev) {
|
||||
drm_modeset_lock(&crtc->mutex, NULL);
|
||||
if (crtc->state->active)
|
||||
ret = -EBUSY;
|
||||
drm_modeset_unlock(&crtc->mutex);
|
||||
if (ret < 0)
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
mutex_lock(&drm_dev->mode_config.mutex);
|
||||
drm_modeset_lock(&drm_dev->mode_config.connection_mutex, NULL);
|
||||
|
||||
drm_connector_list_iter_begin(drm_dev, &iter);
|
||||
drm_for_each_connector_iter(list_connector, &iter) {
|
||||
if (list_connector->dpms == DRM_MODE_DPMS_ON) {
|
||||
ret = -EBUSY;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
drm_connector_list_iter_end(&iter);
|
||||
|
||||
drm_modeset_unlock(&drm_dev->mode_config.connection_mutex);
|
||||
mutex_unlock(&drm_dev->mode_config.mutex);
|
||||
}
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amdgpu_pmops_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
@ -2407,6 +2472,10 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
ret = amdgpu_runtime_idle_check_display(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* wait for all rings to drain before suspending */
|
||||
for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
|
||||
struct amdgpu_ring *ring = adev->rings[i];
|
||||
@ -2516,41 +2585,7 @@ static int amdgpu_pmops_runtime_idle(struct device *dev)
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
if (amdgpu_device_has_dc_support(adev)) {
|
||||
struct drm_crtc *crtc;
|
||||
|
||||
drm_for_each_crtc(crtc, drm_dev) {
|
||||
drm_modeset_lock(&crtc->mutex, NULL);
|
||||
if (crtc->state->active)
|
||||
ret = -EBUSY;
|
||||
drm_modeset_unlock(&crtc->mutex);
|
||||
if (ret < 0)
|
||||
break;
|
||||
}
|
||||
|
||||
} else {
|
||||
struct drm_connector *list_connector;
|
||||
struct drm_connector_list_iter iter;
|
||||
|
||||
mutex_lock(&drm_dev->mode_config.mutex);
|
||||
drm_modeset_lock(&drm_dev->mode_config.connection_mutex, NULL);
|
||||
|
||||
drm_connector_list_iter_begin(drm_dev, &iter);
|
||||
drm_for_each_connector_iter(list_connector, &iter) {
|
||||
if (list_connector->dpms == DRM_MODE_DPMS_ON) {
|
||||
ret = -EBUSY;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
drm_connector_list_iter_end(&iter);
|
||||
|
||||
drm_modeset_unlock(&drm_dev->mode_config.connection_mutex);
|
||||
mutex_unlock(&drm_dev->mode_config.mutex);
|
||||
}
|
||||
|
||||
if (ret == -EBUSY)
|
||||
DRM_DEBUG_DRIVER("failing to power off - crtc active\n");
|
||||
ret = amdgpu_runtime_idle_check_display(dev);
|
||||
|
||||
pm_runtime_mark_last_busy(dev);
|
||||
pm_runtime_autosuspend(dev);
|
||||
|
@ -46,8 +46,6 @@ static int psp_sysfs_init(struct amdgpu_device *adev);
|
||||
static void psp_sysfs_fini(struct amdgpu_device *adev);
|
||||
|
||||
static int psp_load_smu_fw(struct psp_context *psp);
|
||||
static int psp_ta_unload(struct psp_context *psp, struct ta_context *context);
|
||||
static int psp_ta_load(struct psp_context *psp, struct ta_context *context);
|
||||
static int psp_rap_terminate(struct psp_context *psp);
|
||||
static int psp_securedisplay_terminate(struct psp_context *psp);
|
||||
|
||||
@ -862,7 +860,7 @@ static void psp_prep_ta_unload_cmd_buf(struct psp_gfx_cmd_resp *cmd,
|
||||
cmd->cmd.cmd_unload_ta.session_id = session_id;
|
||||
}
|
||||
|
||||
static int psp_ta_unload(struct psp_context *psp, struct ta_context *context)
|
||||
int psp_ta_unload(struct psp_context *psp, struct ta_context *context)
|
||||
{
|
||||
int ret;
|
||||
struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp);
|
||||
@ -944,7 +942,7 @@ static void psp_prep_ta_load_cmd_buf(struct psp_gfx_cmd_resp *cmd,
|
||||
cmd->cmd.cmd_load_ta.cmd_buf_len = context->mem_context.shared_mem_size;
|
||||
}
|
||||
|
||||
static int psp_ta_init_shared_buf(struct psp_context *psp,
|
||||
int psp_ta_init_shared_buf(struct psp_context *psp,
|
||||
struct ta_mem_context *mem_ctx)
|
||||
{
|
||||
/*
|
||||
@ -958,7 +956,7 @@ static int psp_ta_init_shared_buf(struct psp_context *psp,
|
||||
&mem_ctx->shared_buf);
|
||||
}
|
||||
|
||||
static void psp_ta_free_shared_buf(struct ta_mem_context *mem_ctx)
|
||||
void psp_ta_free_shared_buf(struct ta_mem_context *mem_ctx)
|
||||
{
|
||||
amdgpu_bo_free_kernel(&mem_ctx->shared_bo, &mem_ctx->shared_mc_addr,
|
||||
&mem_ctx->shared_buf);
|
||||
@ -969,6 +967,42 @@ static int psp_xgmi_init_shared_buf(struct psp_context *psp)
|
||||
return psp_ta_init_shared_buf(psp, &psp->xgmi_context.context.mem_context);
|
||||
}
|
||||
|
||||
static void psp_prep_ta_invoke_indirect_cmd_buf(struct psp_gfx_cmd_resp *cmd,
|
||||
uint32_t ta_cmd_id,
|
||||
struct ta_context *context)
|
||||
{
|
||||
cmd->cmd_id = GFX_CMD_ID_INVOKE_CMD;
|
||||
cmd->cmd.cmd_invoke_cmd.session_id = context->session_id;
|
||||
cmd->cmd.cmd_invoke_cmd.ta_cmd_id = ta_cmd_id;
|
||||
|
||||
cmd->cmd.cmd_invoke_cmd.buf.num_desc = 1;
|
||||
cmd->cmd.cmd_invoke_cmd.buf.total_size = context->mem_context.shared_mem_size;
|
||||
cmd->cmd.cmd_invoke_cmd.buf.buf_desc[0].buf_size = context->mem_context.shared_mem_size;
|
||||
cmd->cmd.cmd_invoke_cmd.buf.buf_desc[0].buf_phy_addr_lo =
|
||||
lower_32_bits(context->mem_context.shared_mc_addr);
|
||||
cmd->cmd.cmd_invoke_cmd.buf.buf_desc[0].buf_phy_addr_hi =
|
||||
upper_32_bits(context->mem_context.shared_mc_addr);
|
||||
}
|
||||
|
||||
int psp_ta_invoke_indirect(struct psp_context *psp,
|
||||
uint32_t ta_cmd_id,
|
||||
struct ta_context *context)
|
||||
{
|
||||
int ret;
|
||||
struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp);
|
||||
|
||||
psp_prep_ta_invoke_indirect_cmd_buf(cmd, ta_cmd_id, context);
|
||||
|
||||
ret = psp_cmd_submit_buf(psp, NULL, cmd,
|
||||
psp->fence_buf_mc_addr);
|
||||
|
||||
context->resp_status = cmd->resp.status;
|
||||
|
||||
release_psp_cmd_buf(psp);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void psp_prep_ta_invoke_cmd_buf(struct psp_gfx_cmd_resp *cmd,
|
||||
uint32_t ta_cmd_id,
|
||||
uint32_t session_id)
|
||||
@ -978,7 +1012,7 @@ static void psp_prep_ta_invoke_cmd_buf(struct psp_gfx_cmd_resp *cmd,
|
||||
cmd->cmd.cmd_invoke_cmd.ta_cmd_id = ta_cmd_id;
|
||||
}
|
||||
|
||||
static int psp_ta_invoke(struct psp_context *psp,
|
||||
int psp_ta_invoke(struct psp_context *psp,
|
||||
uint32_t ta_cmd_id,
|
||||
struct ta_context *context)
|
||||
{
|
||||
@ -990,12 +1024,14 @@ static int psp_ta_invoke(struct psp_context *psp,
|
||||
ret = psp_cmd_submit_buf(psp, NULL, cmd,
|
||||
psp->fence_buf_mc_addr);
|
||||
|
||||
context->resp_status = cmd->resp.status;
|
||||
|
||||
release_psp_cmd_buf(psp);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int psp_ta_load(struct psp_context *psp, struct ta_context *context)
|
||||
int psp_ta_load(struct psp_context *psp, struct ta_context *context)
|
||||
{
|
||||
int ret;
|
||||
struct psp_gfx_cmd_resp *cmd;
|
||||
@ -1010,6 +1046,8 @@ static int psp_ta_load(struct psp_context *psp, struct ta_context *context)
|
||||
ret = psp_cmd_submit_buf(psp, NULL, cmd,
|
||||
psp->fence_buf_mc_addr);
|
||||
|
||||
context->resp_status = cmd->resp.status;
|
||||
|
||||
if (!ret) {
|
||||
context->session_id = cmd->resp.session_id;
|
||||
}
|
||||
@ -1415,7 +1453,7 @@ int psp_ras_enable_features(struct psp_context *psp,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int psp_ras_terminate(struct psp_context *psp)
|
||||
int psp_ras_terminate(struct psp_context *psp)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
@ -48,6 +48,17 @@ enum psp_shared_mem_size {
|
||||
PSP_SECUREDISPLAY_SHARED_MEM_SIZE = 0x4000,
|
||||
};
|
||||
|
||||
enum ta_type_id {
|
||||
TA_TYPE_XGMI = 1,
|
||||
TA_TYPE_RAS,
|
||||
TA_TYPE_HDCP,
|
||||
TA_TYPE_DTM,
|
||||
TA_TYPE_RAP,
|
||||
TA_TYPE_SECUREDISPLAY,
|
||||
|
||||
TA_TYPE_MAX_INDEX,
|
||||
};
|
||||
|
||||
struct psp_context;
|
||||
struct psp_xgmi_node_info;
|
||||
struct psp_xgmi_topology_info;
|
||||
@ -151,9 +162,11 @@ struct ta_mem_context {
|
||||
struct ta_context {
|
||||
bool initialized;
|
||||
uint32_t session_id;
|
||||
uint32_t resp_status;
|
||||
struct ta_mem_context mem_context;
|
||||
struct psp_bin_desc bin_desc;
|
||||
enum psp_gfx_cmd_id ta_load_type;
|
||||
enum ta_type_id ta_type;
|
||||
};
|
||||
|
||||
struct ta_cp_context {
|
||||
@ -407,6 +420,18 @@ int psp_gpu_reset(struct amdgpu_device *adev);
|
||||
int psp_update_vcn_sram(struct amdgpu_device *adev, int inst_idx,
|
||||
uint64_t cmd_gpu_addr, int cmd_size);
|
||||
|
||||
int psp_ta_init_shared_buf(struct psp_context *psp,
|
||||
struct ta_mem_context *mem_ctx);
|
||||
void psp_ta_free_shared_buf(struct ta_mem_context *mem_ctx);
|
||||
int psp_ta_unload(struct psp_context *psp, struct ta_context *context);
|
||||
int psp_ta_load(struct psp_context *psp, struct ta_context *context);
|
||||
int psp_ta_invoke(struct psp_context *psp,
|
||||
uint32_t ta_cmd_id,
|
||||
struct ta_context *context);
|
||||
int psp_ta_invoke_indirect(struct psp_context *psp,
|
||||
uint32_t ta_cmd_id,
|
||||
struct ta_context *context);
|
||||
|
||||
int psp_xgmi_initialize(struct psp_context *psp, bool set_extended_data, bool load_ta);
|
||||
int psp_xgmi_terminate(struct psp_context *psp);
|
||||
int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
|
||||
@ -425,6 +450,7 @@ int psp_ras_enable_features(struct psp_context *psp,
|
||||
union ta_ras_cmd_input *info, bool enable);
|
||||
int psp_ras_trigger_error(struct psp_context *psp,
|
||||
struct ta_ras_trigger_error_input *info);
|
||||
int psp_ras_terminate(struct psp_context *psp);
|
||||
|
||||
int psp_hdcp_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
|
||||
int psp_dtm_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
|
||||
|
308
drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.c
Normal file
308
drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.c
Normal file
@ -0,0 +1,308 @@
|
||||
/*
|
||||
* Copyright 2022 Advanced Micro Devices, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "amdgpu.h"
|
||||
#include "amdgpu_psp_ta.h"
|
||||
|
||||
static const char *TA_IF_FS_NAME = "ta_if";
|
||||
|
||||
struct dentry *dir;
|
||||
static struct dentry *ta_load_debugfs_dentry;
|
||||
static struct dentry *ta_unload_debugfs_dentry;
|
||||
static struct dentry *ta_invoke_debugfs_dentry;
|
||||
|
||||
static ssize_t ta_if_load_debugfs_write(struct file *fp, const char *buf,
|
||||
size_t len, loff_t *off);
|
||||
static ssize_t ta_if_unload_debugfs_write(struct file *fp, const char *buf,
|
||||
size_t len, loff_t *off);
|
||||
static ssize_t ta_if_invoke_debugfs_write(struct file *fp, const char *buf,
|
||||
size_t len, loff_t *off);
|
||||
|
||||
|
||||
static uint32_t get_bin_version(const uint8_t *bin)
|
||||
{
|
||||
const struct common_firmware_header *hdr =
|
||||
(const struct common_firmware_header *)bin;
|
||||
|
||||
return hdr->ucode_version;
|
||||
}
|
||||
|
||||
static void prep_ta_mem_context(struct psp_context *psp,
|
||||
struct ta_context *context,
|
||||
uint8_t *shared_buf,
|
||||
uint32_t shared_buf_len)
|
||||
{
|
||||
context->mem_context.shared_mem_size = PAGE_ALIGN(shared_buf_len);
|
||||
psp_ta_init_shared_buf(psp, &context->mem_context);
|
||||
|
||||
memcpy((void *)context->mem_context.shared_buf, shared_buf, shared_buf_len);
|
||||
}
|
||||
|
||||
static bool is_ta_type_valid(enum ta_type_id ta_type)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
switch (ta_type) {
|
||||
case TA_TYPE_RAS:
|
||||
ret = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct file_operations ta_load_debugfs_fops = {
|
||||
.write = ta_if_load_debugfs_write,
|
||||
.llseek = default_llseek,
|
||||
.owner = THIS_MODULE
|
||||
};
|
||||
|
||||
static const struct file_operations ta_unload_debugfs_fops = {
|
||||
.write = ta_if_unload_debugfs_write,
|
||||
.llseek = default_llseek,
|
||||
.owner = THIS_MODULE
|
||||
};
|
||||
|
||||
static const struct file_operations ta_invoke_debugfs_fops = {
|
||||
.write = ta_if_invoke_debugfs_write,
|
||||
.llseek = default_llseek,
|
||||
.owner = THIS_MODULE
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* DOC: AMDGPU TA debugfs interfaces
|
||||
*
|
||||
* Three debugfs interfaces can be opened by a program to
|
||||
* load/invoke/unload TA,
|
||||
*
|
||||
* - /sys/kernel/debug/dri/<N>/ta_if/ta_load
|
||||
* - /sys/kernel/debug/dri/<N>/ta_if/ta_invoke
|
||||
* - /sys/kernel/debug/dri/<N>/ta_if/ta_unload
|
||||
*
|
||||
* How to use the interfaces in a program?
|
||||
*
|
||||
* A program needs to provide transmit buffer to the interfaces
|
||||
* and will receive buffer from the interfaces below,
|
||||
*
|
||||
* - For TA load debugfs interface:
|
||||
* Transmit buffer:
|
||||
* - TA type (4bytes)
|
||||
* - TA bin length (4bytes)
|
||||
* - TA bin
|
||||
* Receive buffer:
|
||||
* - TA ID (4bytes)
|
||||
*
|
||||
* - For TA invoke debugfs interface:
|
||||
* Transmit buffer:
|
||||
* - TA ID (4bytes)
|
||||
* - TA CMD ID (4bytes)
|
||||
* - TA shard buf length (4bytes)
|
||||
* - TA shared buf
|
||||
* Receive buffer:
|
||||
* - TA shared buf
|
||||
*
|
||||
* - For TA unload debugfs interface:
|
||||
* Transmit buffer:
|
||||
* - TA ID (4bytes)
|
||||
*/
|
||||
|
||||
static ssize_t ta_if_load_debugfs_write(struct file *fp, const char *buf, size_t len, loff_t *off)
|
||||
{
|
||||
uint32_t ta_type = 0;
|
||||
uint32_t ta_bin_len = 0;
|
||||
uint8_t *ta_bin = NULL;
|
||||
uint32_t copy_pos = 0;
|
||||
int ret = 0;
|
||||
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)file_inode(fp)->i_private;
|
||||
struct psp_context *psp = &adev->psp;
|
||||
struct ta_context context = {0};
|
||||
|
||||
if (!buf)
|
||||
return -EINVAL;
|
||||
|
||||
ret = copy_from_user((void *)&ta_type, &buf[copy_pos], sizeof(uint32_t));
|
||||
if (ret || (!is_ta_type_valid(ta_type)))
|
||||
return -EINVAL;
|
||||
|
||||
copy_pos += sizeof(uint32_t);
|
||||
|
||||
ret = copy_from_user((void *)&ta_bin_len, &buf[copy_pos], sizeof(uint32_t));
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
|
||||
copy_pos += sizeof(uint32_t);
|
||||
|
||||
ta_bin = kzalloc(ta_bin_len, GFP_KERNEL);
|
||||
if (!ta_bin)
|
||||
ret = -ENOMEM;
|
||||
ret = copy_from_user((void *)ta_bin, &buf[copy_pos], ta_bin_len);
|
||||
if (ret)
|
||||
goto err_free_bin;
|
||||
|
||||
ret = psp_ras_terminate(psp);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "Failed to unload embedded RAS TA\n");
|
||||
goto err_free_bin;
|
||||
}
|
||||
|
||||
context.ta_type = ta_type;
|
||||
context.ta_load_type = GFX_CMD_ID_LOAD_TA;
|
||||
context.bin_desc.fw_version = get_bin_version(ta_bin);
|
||||
context.bin_desc.size_bytes = ta_bin_len;
|
||||
context.bin_desc.start_addr = ta_bin;
|
||||
|
||||
ret = psp_ta_load(psp, &context);
|
||||
|
||||
if (ret || context.resp_status) {
|
||||
dev_err(adev->dev, "TA load via debugfs failed (%d) status %d\n",
|
||||
ret, context.resp_status);
|
||||
goto err_free_bin;
|
||||
}
|
||||
|
||||
context.initialized = true;
|
||||
ret = copy_to_user((char *)buf, (void *)&context.session_id, sizeof(uint32_t));
|
||||
|
||||
err_free_bin:
|
||||
kfree(ta_bin);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t ta_if_unload_debugfs_write(struct file *fp, const char *buf, size_t len, loff_t *off)
|
||||
{
|
||||
uint32_t ta_id = 0;
|
||||
int ret = 0;
|
||||
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)file_inode(fp)->i_private;
|
||||
struct psp_context *psp = &adev->psp;
|
||||
struct ta_context context = {0};
|
||||
|
||||
if (!buf)
|
||||
return -EINVAL;
|
||||
|
||||
ret = copy_from_user((void *)&ta_id, buf, sizeof(uint32_t));
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
|
||||
context.session_id = ta_id;
|
||||
|
||||
ret = psp_ta_unload(psp, &context);
|
||||
if (!ret)
|
||||
context.initialized = false;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t ta_if_invoke_debugfs_write(struct file *fp, const char *buf, size_t len, loff_t *off)
|
||||
{
|
||||
uint32_t ta_id = 0;
|
||||
uint32_t cmd_id = 0;
|
||||
uint32_t shared_buf_len = 0;
|
||||
uint8_t *shared_buf = NULL;
|
||||
uint32_t copy_pos = 0;
|
||||
int ret = 0;
|
||||
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)file_inode(fp)->i_private;
|
||||
struct psp_context *psp = &adev->psp;
|
||||
struct ta_context context = {0};
|
||||
|
||||
if (!buf)
|
||||
return -EINVAL;
|
||||
|
||||
ret = copy_from_user((void *)&ta_id, &buf[copy_pos], sizeof(uint32_t));
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
copy_pos += sizeof(uint32_t);
|
||||
|
||||
ret = copy_from_user((void *)&cmd_id, &buf[copy_pos], sizeof(uint32_t));
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
copy_pos += sizeof(uint32_t);
|
||||
|
||||
ret = copy_from_user((void *)&shared_buf_len, &buf[copy_pos], sizeof(uint32_t));
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
copy_pos += sizeof(uint32_t);
|
||||
|
||||
shared_buf = kzalloc(shared_buf_len, GFP_KERNEL);
|
||||
if (!shared_buf)
|
||||
ret = -ENOMEM;
|
||||
ret = copy_from_user((void *)shared_buf, &buf[copy_pos], shared_buf_len);
|
||||
if (ret)
|
||||
goto err_free_shared_buf;
|
||||
|
||||
context.session_id = ta_id;
|
||||
|
||||
prep_ta_mem_context(psp, &context, shared_buf, shared_buf_len);
|
||||
|
||||
ret = psp_ta_invoke_indirect(psp, cmd_id, &context);
|
||||
|
||||
if (ret || context.resp_status) {
|
||||
dev_err(adev->dev, "TA invoke via debugfs failed (%d) status %d\n",
|
||||
ret, context.resp_status);
|
||||
goto err_free_ta_shared_buf;
|
||||
}
|
||||
|
||||
ret = copy_to_user((char *)buf, context.mem_context.shared_buf, shared_buf_len);
|
||||
|
||||
err_free_ta_shared_buf:
|
||||
psp_ta_free_shared_buf(&context.mem_context);
|
||||
|
||||
err_free_shared_buf:
|
||||
kfree(shared_buf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct dentry *amdgpu_ta_if_debugfs_create(struct amdgpu_device *adev)
|
||||
{
|
||||
struct drm_minor *minor = adev_to_drm(adev)->primary;
|
||||
|
||||
dir = debugfs_create_dir(TA_IF_FS_NAME, minor->debugfs_root);
|
||||
|
||||
ta_load_debugfs_dentry = debugfs_create_file("ta_load", 0200, dir, adev,
|
||||
&ta_load_debugfs_fops);
|
||||
|
||||
ta_unload_debugfs_dentry = debugfs_create_file("ta_unload", 0200, dir,
|
||||
adev, &ta_unload_debugfs_fops);
|
||||
|
||||
ta_invoke_debugfs_dentry = debugfs_create_file("ta_invoke", 0200, dir,
|
||||
adev, &ta_invoke_debugfs_fops);
|
||||
return dir;
|
||||
}
|
||||
|
||||
void amdgpu_ta_if_debugfs_init(struct amdgpu_device *adev)
|
||||
{
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
dir = amdgpu_ta_if_debugfs_create(adev);
|
||||
#endif
|
||||
}
|
||||
|
||||
void amdgpu_ta_if_debugfs_remove(void)
|
||||
{
|
||||
debugfs_remove_recursive(dir);
|
||||
}
|
30
drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.h
Normal file
30
drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.h
Normal file
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright 2022 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 __AMDGPU_PSP_TA_H__
|
||||
#define __AMDGPU_PSP_TA_H__
|
||||
|
||||
void amdgpu_ta_if_debugfs_init(struct amdgpu_device *adev);
|
||||
void amdgpu_ta_if_debugfs_remove(void);
|
||||
|
||||
#endif
|
@ -1,34 +1,33 @@
|
||||
/*
|
||||
* Copyright 2018-2019 Advanced Micro Devices, Inc.
|
||||
* Copyright (c) 2018-2021 Advanced Micro Devices, Inc. All rights reserved.
|
||||
*
|
||||
* 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:
|
||||
* 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.
|
||||
*
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef AMDGV_SRIOV_MSG__H_
|
||||
#define AMDGV_SRIOV_MSG__H_
|
||||
|
||||
/* unit in kilobytes */
|
||||
#define AMD_SRIOV_MSG_VBIOS_OFFSET 0
|
||||
#define AMD_SRIOV_MSG_VBIOS_SIZE_KB 64
|
||||
#define AMD_SRIOV_MSG_DATAEXCHANGE_OFFSET_KB AMD_SRIOV_MSG_VBIOS_SIZE_KB
|
||||
#define AMD_SRIOV_MSG_DATAEXCHANGE_SIZE_KB 4
|
||||
#define AMD_SRIOV_MSG_VBIOS_OFFSET 0
|
||||
#define AMD_SRIOV_MSG_VBIOS_SIZE_KB 64
|
||||
#define AMD_SRIOV_MSG_DATAEXCHANGE_OFFSET_KB AMD_SRIOV_MSG_VBIOS_SIZE_KB
|
||||
#define AMD_SRIOV_MSG_DATAEXCHANGE_SIZE_KB 4
|
||||
|
||||
/*
|
||||
* layout
|
||||
@ -51,10 +50,10 @@
|
||||
* v2 defined in amdgim
|
||||
* v3 current
|
||||
*/
|
||||
#define AMD_SRIOV_MSG_FW_VRAM_PF2VF_VER 2
|
||||
#define AMD_SRIOV_MSG_FW_VRAM_VF2PF_VER 3
|
||||
#define AMD_SRIOV_MSG_FW_VRAM_PF2VF_VER 2
|
||||
#define AMD_SRIOV_MSG_FW_VRAM_VF2PF_VER 3
|
||||
|
||||
#define AMD_SRIOV_MSG_RESERVE_UCODE 24
|
||||
#define AMD_SRIOV_MSG_RESERVE_UCODE 24
|
||||
|
||||
#define AMD_SRIOV_MSG_RESERVE_VCN_INST 4
|
||||
|
||||
@ -83,19 +82,19 @@ enum amd_sriov_ucode_engine_id {
|
||||
AMD_SRIOV_UCODE_ID__MAX
|
||||
};
|
||||
|
||||
#pragma pack(push, 1) // PF2VF / VF2PF data areas are byte packed
|
||||
#pragma pack(push, 1) // PF2VF / VF2PF data areas are byte packed
|
||||
|
||||
union amd_sriov_msg_feature_flags {
|
||||
struct {
|
||||
uint32_t error_log_collect : 1;
|
||||
uint32_t host_load_ucodes : 1;
|
||||
uint32_t host_flr_vramlost : 1;
|
||||
uint32_t mm_bw_management : 1;
|
||||
uint32_t pp_one_vf_mode : 1;
|
||||
uint32_t reg_indirect_acc : 1;
|
||||
uint32_t reserved : 26;
|
||||
uint32_t error_log_collect : 1;
|
||||
uint32_t host_load_ucodes : 1;
|
||||
uint32_t host_flr_vramlost : 1;
|
||||
uint32_t mm_bw_management : 1;
|
||||
uint32_t pp_one_vf_mode : 1;
|
||||
uint32_t reg_indirect_acc : 1;
|
||||
uint32_t reserved : 26;
|
||||
} flags;
|
||||
uint32_t all;
|
||||
uint32_t all;
|
||||
};
|
||||
|
||||
union amd_sriov_reg_access_flags {
|
||||
@ -110,10 +109,10 @@ union amd_sriov_reg_access_flags {
|
||||
|
||||
union amd_sriov_msg_os_info {
|
||||
struct {
|
||||
uint32_t windows : 1;
|
||||
uint32_t reserved : 31;
|
||||
uint32_t windows : 1;
|
||||
uint32_t reserved : 31;
|
||||
} info;
|
||||
uint32_t all;
|
||||
uint32_t all;
|
||||
};
|
||||
|
||||
struct amd_sriov_msg_uuid_info {
|
||||
@ -156,6 +155,7 @@ struct amd_sriov_msg_pf2vf_info_header {
|
||||
uint32_t reserved[2];
|
||||
};
|
||||
|
||||
#define AMD_SRIOV_MSG_PF2VF_INFO_FILLED_SIZE (48)
|
||||
struct amd_sriov_msg_pf2vf_info {
|
||||
/* header contains size and version */
|
||||
struct amd_sriov_msg_pf2vf_info_header header;
|
||||
@ -204,10 +204,10 @@ struct amd_sriov_msg_pf2vf_info {
|
||||
} mm_bw_management[AMD_SRIOV_MSG_RESERVE_VCN_INST];
|
||||
/* UUID info */
|
||||
struct amd_sriov_msg_uuid_info uuid_info;
|
||||
/* pcie atomic Ops info */
|
||||
uint32_t pcie_atomic_ops_enabled_flags;
|
||||
/* PCIE atomic ops support flag */
|
||||
uint32_t pcie_atomic_ops_support_flags;
|
||||
/* reserved */
|
||||
uint32_t reserved[256 - 48];
|
||||
uint32_t reserved[256 - AMD_SRIOV_MSG_PF2VF_INFO_FILLED_SIZE];
|
||||
};
|
||||
|
||||
struct amd_sriov_msg_vf2pf_info_header {
|
||||
@ -219,12 +219,13 @@ struct amd_sriov_msg_vf2pf_info_header {
|
||||
uint32_t reserved[2];
|
||||
};
|
||||
|
||||
#define AMD_SRIOV_MSG_VF2PF_INFO_FILLED_SIZE (70)
|
||||
struct amd_sriov_msg_vf2pf_info {
|
||||
/* header contains size and version */
|
||||
struct amd_sriov_msg_vf2pf_info_header header;
|
||||
uint32_t checksum;
|
||||
/* driver version */
|
||||
uint8_t driver_version[64];
|
||||
uint8_t driver_version[64];
|
||||
/* driver certification, 1=WHQL, 0=None */
|
||||
uint32_t driver_cert;
|
||||
/* guest OS type and version */
|
||||
@ -258,13 +259,13 @@ struct amd_sriov_msg_vf2pf_info {
|
||||
uint32_t fb_size;
|
||||
/* guest ucode data, each one is 1.25 Dword */
|
||||
struct {
|
||||
uint8_t id;
|
||||
uint8_t id;
|
||||
uint32_t version;
|
||||
} ucode_info[AMD_SRIOV_MSG_RESERVE_UCODE];
|
||||
uint64_t dummy_page_addr;
|
||||
|
||||
/* reserved */
|
||||
uint32_t reserved[256-70];
|
||||
uint32_t reserved[256 - AMD_SRIOV_MSG_VF2PF_INFO_FILLED_SIZE];
|
||||
};
|
||||
|
||||
/* mailbox message send from guest to host */
|
||||
@ -276,7 +277,7 @@ enum amd_sriov_mailbox_request_message {
|
||||
MB_REQ_MSG_REQ_GPU_RESET_ACCESS,
|
||||
MB_REQ_MSG_REQ_GPU_INIT_DATA,
|
||||
|
||||
MB_REQ_MSG_LOG_VF_ERROR = 200,
|
||||
MB_REQ_MSG_LOG_VF_ERROR = 200,
|
||||
};
|
||||
|
||||
/* mailbox message send from host to guest */
|
||||
@ -298,17 +299,15 @@ enum amd_sriov_gpu_init_data_version {
|
||||
GPU_INIT_DATA_READY_V1 = 1,
|
||||
};
|
||||
|
||||
#pragma pack(pop) // Restore previous packing option
|
||||
#pragma pack(pop) // Restore previous packing option
|
||||
|
||||
/* checksum function between host and guest */
|
||||
unsigned int amd_sriov_msg_checksum(void *obj,
|
||||
unsigned long obj_size,
|
||||
unsigned int key,
|
||||
unsigned int checksum);
|
||||
unsigned int amd_sriov_msg_checksum(void *obj, unsigned long obj_size, unsigned int key,
|
||||
unsigned int checksum);
|
||||
|
||||
/* assertion at compile time */
|
||||
#ifdef __linux__
|
||||
#define stringification(s) _stringification(s)
|
||||
#define stringification(s) _stringification(s)
|
||||
#define _stringification(s) #s
|
||||
|
||||
_Static_assert(
|
||||
@ -319,13 +318,11 @@ _Static_assert(
|
||||
sizeof(struct amd_sriov_msg_pf2vf_info) == AMD_SRIOV_MSG_SIZE_KB << 10,
|
||||
"amd_sriov_msg_pf2vf_info must be " stringification(AMD_SRIOV_MSG_SIZE_KB) " KB");
|
||||
|
||||
_Static_assert(
|
||||
AMD_SRIOV_MSG_RESERVE_UCODE % 4 == 0,
|
||||
"AMD_SRIOV_MSG_RESERVE_UCODE must be multiple of 4");
|
||||
_Static_assert(AMD_SRIOV_MSG_RESERVE_UCODE % 4 == 0,
|
||||
"AMD_SRIOV_MSG_RESERVE_UCODE must be multiple of 4");
|
||||
|
||||
_Static_assert(
|
||||
AMD_SRIOV_MSG_RESERVE_UCODE > AMD_SRIOV_UCODE_ID__MAX,
|
||||
"AMD_SRIOV_MSG_RESERVE_UCODE must be bigger than AMD_SRIOV_UCODE_ID__MAX");
|
||||
_Static_assert(AMD_SRIOV_MSG_RESERVE_UCODE > AMD_SRIOV_UCODE_ID__MAX,
|
||||
"AMD_SRIOV_MSG_RESERVE_UCODE must be bigger than AMD_SRIOV_UCODE_ID__MAX");
|
||||
|
||||
#undef _stringification
|
||||
#undef stringification
|
||||
|
@ -1128,14 +1128,6 @@ static int kfd_ioctl_free_memory_of_gpu(struct file *filep,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool kfd_flush_tlb_after_unmap(struct kfd_dev *dev)
|
||||
{
|
||||
return KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 2) ||
|
||||
(KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 1) &&
|
||||
dev->adev->sdma.instance[0].fw_version >= 18) ||
|
||||
KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 0);
|
||||
}
|
||||
|
||||
static int kfd_ioctl_map_memory_to_gpu(struct file *filep,
|
||||
struct kfd_process *p, void *data)
|
||||
{
|
||||
|
@ -130,19 +130,33 @@ void program_sh_mem_settings(struct device_queue_manager *dqm,
|
||||
}
|
||||
|
||||
static void increment_queue_count(struct device_queue_manager *dqm,
|
||||
enum kfd_queue_type type)
|
||||
struct qcm_process_device *qpd,
|
||||
struct queue *q)
|
||||
{
|
||||
dqm->active_queue_count++;
|
||||
if (type == KFD_QUEUE_TYPE_COMPUTE || type == KFD_QUEUE_TYPE_DIQ)
|
||||
if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE ||
|
||||
q->properties.type == KFD_QUEUE_TYPE_DIQ)
|
||||
dqm->active_cp_queue_count++;
|
||||
|
||||
if (q->properties.is_gws) {
|
||||
dqm->gws_queue_count++;
|
||||
qpd->mapped_gws_queue = true;
|
||||
}
|
||||
}
|
||||
|
||||
static void decrement_queue_count(struct device_queue_manager *dqm,
|
||||
enum kfd_queue_type type)
|
||||
struct qcm_process_device *qpd,
|
||||
struct queue *q)
|
||||
{
|
||||
dqm->active_queue_count--;
|
||||
if (type == KFD_QUEUE_TYPE_COMPUTE || type == KFD_QUEUE_TYPE_DIQ)
|
||||
if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE ||
|
||||
q->properties.type == KFD_QUEUE_TYPE_DIQ)
|
||||
dqm->active_cp_queue_count--;
|
||||
|
||||
if (q->properties.is_gws) {
|
||||
dqm->gws_queue_count--;
|
||||
qpd->mapped_gws_queue = false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -412,7 +426,7 @@ static int create_queue_nocpsch(struct device_queue_manager *dqm,
|
||||
list_add(&q->list, &qpd->queues_list);
|
||||
qpd->queue_count++;
|
||||
if (q->properties.is_active)
|
||||
increment_queue_count(dqm, q->properties.type);
|
||||
increment_queue_count(dqm, qpd, q);
|
||||
|
||||
/*
|
||||
* Unconditionally increment this counter, regardless of the queue's
|
||||
@ -601,13 +615,8 @@ static int destroy_queue_nocpsch_locked(struct device_queue_manager *dqm,
|
||||
deallocate_vmid(dqm, qpd, q);
|
||||
}
|
||||
qpd->queue_count--;
|
||||
if (q->properties.is_active) {
|
||||
decrement_queue_count(dqm, q->properties.type);
|
||||
if (q->properties.is_gws) {
|
||||
dqm->gws_queue_count--;
|
||||
qpd->mapped_gws_queue = false;
|
||||
}
|
||||
}
|
||||
if (q->properties.is_active)
|
||||
decrement_queue_count(dqm, qpd, q);
|
||||
|
||||
return retval;
|
||||
}
|
||||
@ -700,12 +709,11 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q,
|
||||
* dqm->active_queue_count to determine whether a new runlist must be
|
||||
* uploaded.
|
||||
*/
|
||||
if (q->properties.is_active && !prev_active)
|
||||
increment_queue_count(dqm, q->properties.type);
|
||||
else if (!q->properties.is_active && prev_active)
|
||||
decrement_queue_count(dqm, q->properties.type);
|
||||
|
||||
if (q->gws && !q->properties.is_gws) {
|
||||
if (q->properties.is_active && !prev_active) {
|
||||
increment_queue_count(dqm, &pdd->qpd, q);
|
||||
} else if (!q->properties.is_active && prev_active) {
|
||||
decrement_queue_count(dqm, &pdd->qpd, q);
|
||||
} else if (q->gws && !q->properties.is_gws) {
|
||||
if (q->properties.is_active) {
|
||||
dqm->gws_queue_count++;
|
||||
pdd->qpd.mapped_gws_queue = true;
|
||||
@ -767,11 +775,7 @@ static int evict_process_queues_nocpsch(struct device_queue_manager *dqm,
|
||||
mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type(
|
||||
q->properties.type)];
|
||||
q->properties.is_active = false;
|
||||
decrement_queue_count(dqm, q->properties.type);
|
||||
if (q->properties.is_gws) {
|
||||
dqm->gws_queue_count--;
|
||||
qpd->mapped_gws_queue = false;
|
||||
}
|
||||
decrement_queue_count(dqm, qpd, q);
|
||||
|
||||
if (WARN_ONCE(!dqm->sched_running, "Evict when stopped\n"))
|
||||
continue;
|
||||
@ -817,7 +821,7 @@ static int evict_process_queues_cpsch(struct device_queue_manager *dqm,
|
||||
continue;
|
||||
|
||||
q->properties.is_active = false;
|
||||
decrement_queue_count(dqm, q->properties.type);
|
||||
decrement_queue_count(dqm, qpd, q);
|
||||
}
|
||||
pdd->last_evict_timestamp = get_jiffies_64();
|
||||
retval = execute_queues_cpsch(dqm,
|
||||
@ -888,11 +892,7 @@ static int restore_process_queues_nocpsch(struct device_queue_manager *dqm,
|
||||
mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type(
|
||||
q->properties.type)];
|
||||
q->properties.is_active = true;
|
||||
increment_queue_count(dqm, q->properties.type);
|
||||
if (q->properties.is_gws) {
|
||||
dqm->gws_queue_count++;
|
||||
qpd->mapped_gws_queue = true;
|
||||
}
|
||||
increment_queue_count(dqm, qpd, q);
|
||||
|
||||
if (WARN_ONCE(!dqm->sched_running, "Restore when stopped\n"))
|
||||
continue;
|
||||
@ -950,7 +950,7 @@ static int restore_process_queues_cpsch(struct device_queue_manager *dqm,
|
||||
continue;
|
||||
|
||||
q->properties.is_active = true;
|
||||
increment_queue_count(dqm, q->properties.type);
|
||||
increment_queue_count(dqm, &pdd->qpd, q);
|
||||
}
|
||||
retval = execute_queues_cpsch(dqm,
|
||||
KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0);
|
||||
@ -1378,7 +1378,7 @@ static int create_kernel_queue_cpsch(struct device_queue_manager *dqm,
|
||||
dqm->total_queue_count);
|
||||
|
||||
list_add(&kq->list, &qpd->priv_queue_list);
|
||||
increment_queue_count(dqm, kq->queue->properties.type);
|
||||
increment_queue_count(dqm, qpd, kq->queue);
|
||||
qpd->is_debug = true;
|
||||
execute_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0);
|
||||
dqm_unlock(dqm);
|
||||
@ -1392,7 +1392,7 @@ static void destroy_kernel_queue_cpsch(struct device_queue_manager *dqm,
|
||||
{
|
||||
dqm_lock(dqm);
|
||||
list_del(&kq->list);
|
||||
decrement_queue_count(dqm, kq->queue->properties.type);
|
||||
decrement_queue_count(dqm, qpd, kq->queue);
|
||||
qpd->is_debug = false;
|
||||
execute_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0);
|
||||
/*
|
||||
@ -1467,7 +1467,7 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q,
|
||||
qpd->queue_count++;
|
||||
|
||||
if (q->properties.is_active) {
|
||||
increment_queue_count(dqm, q->properties.type);
|
||||
increment_queue_count(dqm, qpd, q);
|
||||
|
||||
execute_queues_cpsch(dqm,
|
||||
KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0);
|
||||
@ -1683,15 +1683,11 @@ static int destroy_queue_cpsch(struct device_queue_manager *dqm,
|
||||
list_del(&q->list);
|
||||
qpd->queue_count--;
|
||||
if (q->properties.is_active) {
|
||||
decrement_queue_count(dqm, q->properties.type);
|
||||
decrement_queue_count(dqm, qpd, q);
|
||||
retval = execute_queues_cpsch(dqm,
|
||||
KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0);
|
||||
if (retval == -ETIME)
|
||||
qpd->reset_wavefronts = true;
|
||||
if (q->properties.is_gws) {
|
||||
dqm->gws_queue_count--;
|
||||
qpd->mapped_gws_queue = false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1932,7 +1928,7 @@ static int process_termination_cpsch(struct device_queue_manager *dqm,
|
||||
/* Clean all kernel queues */
|
||||
list_for_each_entry_safe(kq, kq_next, &qpd->priv_queue_list, list) {
|
||||
list_del(&kq->list);
|
||||
decrement_queue_count(dqm, kq->queue->properties.type);
|
||||
decrement_queue_count(dqm, qpd, kq->queue);
|
||||
qpd->is_debug = false;
|
||||
dqm->total_queue_count--;
|
||||
filter = KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES;
|
||||
@ -1945,13 +1941,8 @@ static int process_termination_cpsch(struct device_queue_manager *dqm,
|
||||
else if (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)
|
||||
deallocate_sdma_queue(dqm, q);
|
||||
|
||||
if (q->properties.is_active) {
|
||||
decrement_queue_count(dqm, q->properties.type);
|
||||
if (q->properties.is_gws) {
|
||||
dqm->gws_queue_count--;
|
||||
qpd->mapped_gws_queue = false;
|
||||
}
|
||||
}
|
||||
if (q->properties.is_active)
|
||||
decrement_queue_count(dqm, qpd, q);
|
||||
|
||||
dqm->total_queue_count--;
|
||||
}
|
||||
|
@ -1106,7 +1106,7 @@ struct kfd_criu_queue_priv_data {
|
||||
uint32_t priority;
|
||||
uint32_t q_percent;
|
||||
uint32_t doorbell_id;
|
||||
uint32_t is_gws;
|
||||
uint32_t gws;
|
||||
uint32_t sdma_id;
|
||||
uint32_t eop_ring_buffer_size;
|
||||
uint32_t ctx_save_restore_area_size;
|
||||
@ -1329,6 +1329,14 @@ void kfd_signal_poison_consumed_event(struct kfd_dev *dev, u32 pasid);
|
||||
|
||||
void kfd_flush_tlb(struct kfd_process_device *pdd, enum TLB_FLUSH_TYPE type);
|
||||
|
||||
static inline bool kfd_flush_tlb_after_unmap(struct kfd_dev *dev)
|
||||
{
|
||||
return KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 2) ||
|
||||
(KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 1) &&
|
||||
dev->adev->sdma.instance[0].fw_version >= 18) ||
|
||||
KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 0);
|
||||
}
|
||||
|
||||
bool kfd_is_locked(void);
|
||||
|
||||
/* Compute profile */
|
||||
|
@ -636,6 +636,8 @@ static int criu_checkpoint_queue(struct kfd_process_device *pdd,
|
||||
q_data->ctx_save_restore_area_size =
|
||||
q->properties.ctx_save_restore_area_size;
|
||||
|
||||
q_data->gws = !!q->gws;
|
||||
|
||||
ret = pqm_checkpoint_mqd(&pdd->process->pqm, q->properties.queue_id, mqd, ctl_stack);
|
||||
if (ret) {
|
||||
pr_err("Failed checkpoint queue_mqd (%d)\n", ret);
|
||||
@ -743,7 +745,6 @@ static void set_queue_properties_from_criu(struct queue_properties *qp,
|
||||
struct kfd_criu_queue_priv_data *q_data)
|
||||
{
|
||||
qp->is_interop = false;
|
||||
qp->is_gws = q_data->is_gws;
|
||||
qp->queue_percent = q_data->q_percent;
|
||||
qp->priority = q_data->priority;
|
||||
qp->queue_address = q_data->q_address;
|
||||
@ -826,12 +827,15 @@ int kfd_criu_restore_queue(struct kfd_process *p,
|
||||
NULL);
|
||||
if (ret) {
|
||||
pr_err("Failed to create new queue err:%d\n", ret);
|
||||
ret = -EINVAL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (q_data->gws)
|
||||
ret = pqm_set_gws(&p->pqm, q_data->q_id, pdd->dev->gws);
|
||||
|
||||
exit:
|
||||
if (ret)
|
||||
pr_err("Failed to create queue (%d)\n", ret);
|
||||
pr_err("Failed to restore queue (%d)\n", ret);
|
||||
else
|
||||
pr_debug("Queue id %d was restored successfully\n", queue_id);
|
||||
|
||||
|
@ -565,13 +565,11 @@ int dce_aux_transfer_raw(struct ddc_service *ddc,
|
||||
struct ddc *ddc_pin = ddc->ddc_pin;
|
||||
struct dce_aux *aux_engine;
|
||||
struct aux_request_transaction_data aux_req;
|
||||
struct aux_reply_transaction_data aux_rep;
|
||||
uint8_t returned_bytes = 0;
|
||||
int res = -1;
|
||||
uint32_t status;
|
||||
|
||||
memset(&aux_req, 0, sizeof(aux_req));
|
||||
memset(&aux_rep, 0, sizeof(aux_rep));
|
||||
|
||||
aux_engine = ddc->ctx->dc->res_pool->engines[ddc_pin->pin_data->en];
|
||||
if (!acquire(aux_engine, ddc_pin)) {
|
||||
|
@ -1316,7 +1316,7 @@ void hubp1_set_flip_int(struct hubp *hubp)
|
||||
*
|
||||
* @hubp: hubp struct reference.
|
||||
*/
|
||||
void hubp1_wait_pipe_read_start(struct hubp *hubp)
|
||||
static void hubp1_wait_pipe_read_start(struct hubp *hubp)
|
||||
{
|
||||
struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp);
|
||||
|
||||
|
@ -790,6 +790,5 @@ bool hubp1_in_blank(struct hubp *hubp);
|
||||
void hubp1_soft_reset(struct hubp *hubp, bool reset);
|
||||
|
||||
void hubp1_set_flip_int(struct hubp *hubp);
|
||||
void hubp1_wait_pipe_read_start(struct hubp *hubp);
|
||||
|
||||
#endif
|
||||
|
@ -997,6 +997,7 @@ static struct clock_source *dcn21_clock_source_create(
|
||||
return &clk_src->base;
|
||||
}
|
||||
|
||||
kfree(clk_src);
|
||||
BREAK_TO_DEBUGGER();
|
||||
return NULL;
|
||||
}
|
||||
|
@ -54,7 +54,8 @@ void hubp31_soft_reset(struct hubp *hubp, bool reset)
|
||||
REG_UPDATE(DCHUBP_CNTL, HUBP_SOFT_RESET, reset);
|
||||
}
|
||||
|
||||
void hubp31_program_extended_blank(struct hubp *hubp, unsigned int min_dst_y_next_start_optimized)
|
||||
static void hubp31_program_extended_blank(struct hubp *hubp,
|
||||
unsigned int min_dst_y_next_start_optimized)
|
||||
{
|
||||
struct dcn20_hubp *hubp2 = TO_DCN20_HUBP(hubp);
|
||||
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "core_types.h"
|
||||
|
||||
void virtual_setup_stream_encoder(struct pipe_ctx *pipe_ctx);
|
||||
void virtual_setup_stream_attribute(struct pipe_ctx *pipe_ctx);
|
||||
void virtual_reset_stream_encoder(struct pipe_ctx *pipe_ctx);
|
||||
const struct link_hwss *get_virtual_link_hwss(void);
|
||||
|
||||
|
@ -751,7 +751,7 @@ int amdgpu_dpm_force_performance_level(struct amdgpu_device *adev,
|
||||
AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK |
|
||||
AMD_DPM_FORCED_LEVEL_PROFILE_PEAK;
|
||||
|
||||
if (!pp_funcs->force_performance_level)
|
||||
if (!pp_funcs || !pp_funcs->force_performance_level)
|
||||
return 0;
|
||||
|
||||
if (adev->pm.dpm.thermal_active)
|
||||
|
@ -7331,17 +7331,15 @@ static int si_parse_power_table(struct amdgpu_device *adev)
|
||||
if (!adev->pm.dpm.ps)
|
||||
return -ENOMEM;
|
||||
power_state_offset = (u8 *)state_array->states;
|
||||
for (i = 0; i < state_array->ucNumEntries; i++) {
|
||||
for (adev->pm.dpm.num_ps = 0, i = 0; i < state_array->ucNumEntries; i++) {
|
||||
u8 *idx;
|
||||
power_state = (union pplib_power_state *)power_state_offset;
|
||||
non_clock_array_index = power_state->v2.nonClockInfoIndex;
|
||||
non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
|
||||
&non_clock_info_array->nonClockInfo[non_clock_array_index];
|
||||
ps = kzalloc(sizeof(struct si_ps), GFP_KERNEL);
|
||||
if (ps == NULL) {
|
||||
kfree(adev->pm.dpm.ps);
|
||||
if (ps == NULL)
|
||||
return -ENOMEM;
|
||||
}
|
||||
adev->pm.dpm.ps[i].ps_priv = ps;
|
||||
si_parse_pplib_non_clock_info(adev, &adev->pm.dpm.ps[i],
|
||||
non_clock_info,
|
||||
@ -7363,8 +7361,8 @@ static int si_parse_power_table(struct amdgpu_device *adev)
|
||||
k++;
|
||||
}
|
||||
power_state_offset += 2 + power_state->v2.ucNumDPMLevels;
|
||||
adev->pm.dpm.num_ps++;
|
||||
}
|
||||
adev->pm.dpm.num_ps = state_array->ucNumEntries;
|
||||
|
||||
/* fill in the vce power states */
|
||||
for (i = 0; i < adev->pm.dpm.num_of_vce_states; i++) {
|
||||
|
@ -356,9 +356,11 @@ int smu_cmn_wait_for_response(struct smu_context *smu)
|
||||
* completion of the command, and return back a value from the SMU in
|
||||
* @read_arg pointer.
|
||||
*
|
||||
* Return 0 on success, -errno on error, if we weren't able to send
|
||||
* the message or if the message completed with some kind of
|
||||
* error. See __smu_cmn_reg2errno() for details of the -errno.
|
||||
* Return 0 on success, -errno when a problem is encountered sending
|
||||
* message or receiving reply. If there is a PCI bus recovery or
|
||||
* the destination is a virtual GPU which does not allow this message
|
||||
* type, the message is simply dropped and success is also returned.
|
||||
* See __smu_cmn_reg2errno() for details of the -errno.
|
||||
*
|
||||
* If we weren't able to send the message to the SMU, we also print
|
||||
* the error to the standard log.
|
||||
|
@ -41,7 +41,7 @@ radeon-y += radeon_device.o radeon_asic.o radeon_kms.o \
|
||||
rs400.o rs600.o rs690.o rv515.o r520.o r600.o rv770.o radeon_test.o \
|
||||
r200.o radeon_legacy_tv.o r600_cs.o \
|
||||
radeon_pm.o atombios_dp.o r600_hdmi.o dce3_1_afmt.o \
|
||||
evergreen.o evergreen_cs.o evergreen_blit_shaders.o \
|
||||
evergreen.o evergreen_cs.o \
|
||||
evergreen_hdmi.o radeon_trace_points.o ni.o \
|
||||
atombios_encoders.o radeon_semaphore.o radeon_sa.o atombios_i2c.o si.o \
|
||||
radeon_prime.o cik.o cik_blit_shaders.o \
|
||||
|
@ -1,303 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010 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 (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors:
|
||||
* Alex Deucher <alexander.deucher@amd.com>
|
||||
*/
|
||||
|
||||
#include <linux/bug.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
/*
|
||||
* evergreen cards need to use the 3D engine to blit data which requires
|
||||
* quite a bit of hw state setup. Rather than pull the whole 3D driver
|
||||
* (which normally generates the 3D state) into the DRM, we opt to use
|
||||
* statically generated state tables. The register state and shaders
|
||||
* were hand generated to support blitting functionality. See the 3D
|
||||
* driver or documentation for descriptions of the registers and
|
||||
* shader instructions.
|
||||
*/
|
||||
|
||||
const u32 evergreen_default_state[] =
|
||||
{
|
||||
0xc0016900,
|
||||
0x0000023b,
|
||||
0x00000000, /* SQ_LDS_ALLOC_PS */
|
||||
|
||||
0xc0066900,
|
||||
0x00000240,
|
||||
0x00000000, /* SQ_ESGS_RING_ITEMSIZE */
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
|
||||
0xc0046900,
|
||||
0x00000247,
|
||||
0x00000000, /* SQ_GS_VERT_ITEMSIZE */
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
|
||||
0xc0026900,
|
||||
0x00000010,
|
||||
0x00000000, /* DB_Z_INFO */
|
||||
0x00000000, /* DB_STENCIL_INFO */
|
||||
|
||||
0xc0016900,
|
||||
0x00000200,
|
||||
0x00000000, /* DB_DEPTH_CONTROL */
|
||||
|
||||
0xc0066900,
|
||||
0x00000000,
|
||||
0x00000060, /* DB_RENDER_CONTROL */
|
||||
0x00000000, /* DB_COUNT_CONTROL */
|
||||
0x00000000, /* DB_DEPTH_VIEW */
|
||||
0x0000002a, /* DB_RENDER_OVERRIDE */
|
||||
0x00000000, /* DB_RENDER_OVERRIDE2 */
|
||||
0x00000000, /* DB_HTILE_DATA_BASE */
|
||||
|
||||
0xc0026900,
|
||||
0x0000000a,
|
||||
0x00000000, /* DB_STENCIL_CLEAR */
|
||||
0x00000000, /* DB_DEPTH_CLEAR */
|
||||
|
||||
0xc0016900,
|
||||
0x000002dc,
|
||||
0x0000aa00, /* DB_ALPHA_TO_MASK */
|
||||
|
||||
0xc0016900,
|
||||
0x00000080,
|
||||
0x00000000, /* PA_SC_WINDOW_OFFSET */
|
||||
|
||||
0xc00d6900,
|
||||
0x00000083,
|
||||
0x0000ffff, /* PA_SC_CLIPRECT_RULE */
|
||||
0x00000000, /* PA_SC_CLIPRECT_0_TL */
|
||||
0x20002000, /* PA_SC_CLIPRECT_0_BR */
|
||||
0x00000000,
|
||||
0x20002000,
|
||||
0x00000000,
|
||||
0x20002000,
|
||||
0x00000000,
|
||||
0x20002000,
|
||||
0xaaaaaaaa, /* PA_SC_EDGERULE */
|
||||
0x00000000, /* PA_SU_HARDWARE_SCREEN_OFFSET */
|
||||
0x0000000f, /* CB_TARGET_MASK */
|
||||
0x0000000f, /* CB_SHADER_MASK */
|
||||
|
||||
0xc0226900,
|
||||
0x00000094,
|
||||
0x80000000, /* PA_SC_VPORT_SCISSOR_0_TL */
|
||||
0x20002000, /* PA_SC_VPORT_SCISSOR_0_BR */
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x00000000, /* PA_SC_VPORT_ZMIN_0 */
|
||||
0x3f800000, /* PA_SC_VPORT_ZMAX_0 */
|
||||
|
||||
0xc0016900,
|
||||
0x000000d4,
|
||||
0x00000000, /* SX_MISC */
|
||||
|
||||
0xc0026900,
|
||||
0x00000292,
|
||||
0x00000000, /* PA_SC_MODE_CNTL_0 */
|
||||
0x00000000, /* PA_SC_MODE_CNTL_1 */
|
||||
|
||||
0xc0106900,
|
||||
0x00000300,
|
||||
0x00000000, /* PA_SC_LINE_CNTL */
|
||||
0x00000000, /* PA_SC_AA_CONFIG */
|
||||
0x00000005, /* PA_SU_VTX_CNTL */
|
||||
0x3f800000, /* PA_CL_GB_VERT_CLIP_ADJ */
|
||||
0x3f800000, /* PA_CL_GB_VERT_DISC_ADJ */
|
||||
0x3f800000, /* PA_CL_GB_HORZ_CLIP_ADJ */
|
||||
0x3f800000, /* PA_CL_GB_HORZ_DISC_ADJ */
|
||||
0x00000000, /* PA_SC_AA_SAMPLE_LOCS_0 */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* PA_SC_AA_SAMPLE_LOCS_7 */
|
||||
0xffffffff, /* PA_SC_AA_MASK */
|
||||
|
||||
0xc00d6900,
|
||||
0x00000202,
|
||||
0x00cc0010, /* CB_COLOR_CONTROL */
|
||||
0x00000210, /* DB_SHADER_CONTROL */
|
||||
0x00010000, /* PA_CL_CLIP_CNTL */
|
||||
0x00000004, /* PA_SU_SC_MODE_CNTL */
|
||||
0x00000100, /* PA_CL_VTE_CNTL */
|
||||
0x00000000, /* PA_CL_VS_OUT_CNTL */
|
||||
0x00000000, /* PA_CL_NANINF_CNTL */
|
||||
0x00000000, /* PA_SU_LINE_STIPPLE_CNTL */
|
||||
0x00000000, /* PA_SU_LINE_STIPPLE_SCALE */
|
||||
0x00000000, /* PA_SU_PRIM_FILTER_CNTL */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* SQ_DYN_GPR_RESOURCE_LIMIT_1 */
|
||||
|
||||
0xc0066900,
|
||||
0x000002de,
|
||||
0x00000000, /* PA_SU_POLY_OFFSET_DB_FMT_CNTL */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
|
||||
0xc0016900,
|
||||
0x00000229,
|
||||
0x00000000, /* SQ_PGM_START_FS */
|
||||
|
||||
0xc0016900,
|
||||
0x0000022a,
|
||||
0x00000000, /* SQ_PGM_RESOURCES_FS */
|
||||
|
||||
0xc0096900,
|
||||
0x00000100,
|
||||
0x00ffffff, /* VGT_MAX_VTX_INDX */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* SX_ALPHA_TEST_CONTROL */
|
||||
0x00000000, /* CB_BLEND_RED */
|
||||
0x00000000, /* CB_BLEND_GREEN */
|
||||
0x00000000, /* CB_BLEND_BLUE */
|
||||
0x00000000, /* CB_BLEND_ALPHA */
|
||||
|
||||
0xc0026900,
|
||||
0x000002a8,
|
||||
0x00000000, /* VGT_INSTANCE_STEP_RATE_0 */
|
||||
0x00000000, /* */
|
||||
|
||||
0xc0026900,
|
||||
0x000002ad,
|
||||
0x00000000, /* VGT_REUSE_OFF */
|
||||
0x00000000, /* */
|
||||
|
||||
0xc0116900,
|
||||
0x00000280,
|
||||
0x00000000, /* PA_SU_POINT_SIZE */
|
||||
0x00000000, /* PA_SU_POINT_MINMAX */
|
||||
0x00000008, /* PA_SU_LINE_CNTL */
|
||||
0x00000000, /* PA_SC_LINE_STIPPLE */
|
||||
0x00000000, /* VGT_OUTPUT_PATH_CNTL */
|
||||
0x00000000, /* VGT_HOS_CNTL */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* VGT_GS_MODE */
|
||||
|
||||
0xc0016900,
|
||||
0x000002a1,
|
||||
0x00000000, /* VGT_PRIMITIVEID_EN */
|
||||
|
||||
0xc0016900,
|
||||
0x000002a5,
|
||||
0x00000000, /* VGT_MULTI_PRIM_IB_RESET_EN */
|
||||
|
||||
0xc0016900,
|
||||
0x000002d5,
|
||||
0x00000000, /* VGT_SHADER_STAGES_EN */
|
||||
|
||||
0xc0026900,
|
||||
0x000002e5,
|
||||
0x00000000, /* VGT_STRMOUT_CONFIG */
|
||||
0x00000000, /* */
|
||||
|
||||
0xc0016900,
|
||||
0x000001e0,
|
||||
0x00000000, /* CB_BLEND0_CONTROL */
|
||||
|
||||
0xc0016900,
|
||||
0x000001b1,
|
||||
0x00000000, /* SPI_VS_OUT_CONFIG */
|
||||
|
||||
0xc0016900,
|
||||
0x00000187,
|
||||
0x00000000, /* SPI_VS_OUT_ID_0 */
|
||||
|
||||
0xc0016900,
|
||||
0x00000191,
|
||||
0x00000100, /* SPI_PS_INPUT_CNTL_0 */
|
||||
|
||||
0xc00b6900,
|
||||
0x000001b3,
|
||||
0x20000001, /* SPI_PS_IN_CONTROL_0 */
|
||||
0x00000000, /* SPI_PS_IN_CONTROL_1 */
|
||||
0x00000000, /* SPI_INTERP_CONTROL_0 */
|
||||
0x00000000, /* SPI_INPUT_Z */
|
||||
0x00000000, /* SPI_FOG_CNTL */
|
||||
0x00100000, /* SPI_BARYC_CNTL */
|
||||
0x00000000, /* SPI_PS_IN_CONTROL_2 */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
|
||||
0xc0026900,
|
||||
0x00000316,
|
||||
0x0000000e, /* VGT_VERTEX_REUSE_BLOCK_CNTL */
|
||||
0x00000010, /* */
|
||||
};
|
||||
|
||||
const u32 evergreen_default_size = ARRAY_SIZE(evergreen_default_state);
|
@ -20,16 +20,284 @@
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors:
|
||||
* Alex Deucher <alexander.deucher@amd.com>
|
||||
*/
|
||||
|
||||
#ifndef EVERGREEN_BLIT_SHADERS_H
|
||||
#define EVERGREEN_BLIT_SHADERS_H
|
||||
|
||||
extern const u32 evergreen_ps[];
|
||||
extern const u32 evergreen_vs[];
|
||||
extern const u32 evergreen_default_state[];
|
||||
/*
|
||||
* evergreen cards need to use the 3D engine to blit data which requires
|
||||
* quite a bit of hw state setup. Rather than pull the whole 3D driver
|
||||
* (which normally generates the 3D state) into the DRM, we opt to use
|
||||
* statically generated state tables. The register state and shaders
|
||||
* were hand generated to support blitting functionality. See the 3D
|
||||
* driver or documentation for descriptions of the registers and
|
||||
* shader instructions.
|
||||
*/
|
||||
|
||||
extern const u32 evergreen_ps_size, evergreen_vs_size;
|
||||
extern const u32 evergreen_default_size;
|
||||
static const u32 evergreen_default_state[] = {
|
||||
0xc0016900,
|
||||
0x0000023b,
|
||||
0x00000000, /* SQ_LDS_ALLOC_PS */
|
||||
|
||||
0xc0066900,
|
||||
0x00000240,
|
||||
0x00000000, /* SQ_ESGS_RING_ITEMSIZE */
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
|
||||
0xc0046900,
|
||||
0x00000247,
|
||||
0x00000000, /* SQ_GS_VERT_ITEMSIZE */
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
|
||||
0xc0026900,
|
||||
0x00000010,
|
||||
0x00000000, /* DB_Z_INFO */
|
||||
0x00000000, /* DB_STENCIL_INFO */
|
||||
|
||||
0xc0016900,
|
||||
0x00000200,
|
||||
0x00000000, /* DB_DEPTH_CONTROL */
|
||||
|
||||
0xc0066900,
|
||||
0x00000000,
|
||||
0x00000060, /* DB_RENDER_CONTROL */
|
||||
0x00000000, /* DB_COUNT_CONTROL */
|
||||
0x00000000, /* DB_DEPTH_VIEW */
|
||||
0x0000002a, /* DB_RENDER_OVERRIDE */
|
||||
0x00000000, /* DB_RENDER_OVERRIDE2 */
|
||||
0x00000000, /* DB_HTILE_DATA_BASE */
|
||||
|
||||
0xc0026900,
|
||||
0x0000000a,
|
||||
0x00000000, /* DB_STENCIL_CLEAR */
|
||||
0x00000000, /* DB_DEPTH_CLEAR */
|
||||
|
||||
0xc0016900,
|
||||
0x000002dc,
|
||||
0x0000aa00, /* DB_ALPHA_TO_MASK */
|
||||
|
||||
0xc0016900,
|
||||
0x00000080,
|
||||
0x00000000, /* PA_SC_WINDOW_OFFSET */
|
||||
|
||||
0xc00d6900,
|
||||
0x00000083,
|
||||
0x0000ffff, /* PA_SC_CLIPRECT_RULE */
|
||||
0x00000000, /* PA_SC_CLIPRECT_0_TL */
|
||||
0x20002000, /* PA_SC_CLIPRECT_0_BR */
|
||||
0x00000000,
|
||||
0x20002000,
|
||||
0x00000000,
|
||||
0x20002000,
|
||||
0x00000000,
|
||||
0x20002000,
|
||||
0xaaaaaaaa, /* PA_SC_EDGERULE */
|
||||
0x00000000, /* PA_SU_HARDWARE_SCREEN_OFFSET */
|
||||
0x0000000f, /* CB_TARGET_MASK */
|
||||
0x0000000f, /* CB_SHADER_MASK */
|
||||
|
||||
0xc0226900,
|
||||
0x00000094,
|
||||
0x80000000, /* PA_SC_VPORT_SCISSOR_0_TL */
|
||||
0x20002000, /* PA_SC_VPORT_SCISSOR_0_BR */
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x80000000,
|
||||
0x20002000,
|
||||
0x00000000, /* PA_SC_VPORT_ZMIN_0 */
|
||||
0x3f800000, /* PA_SC_VPORT_ZMAX_0 */
|
||||
|
||||
0xc0016900,
|
||||
0x000000d4,
|
||||
0x00000000, /* SX_MISC */
|
||||
|
||||
0xc0026900,
|
||||
0x00000292,
|
||||
0x00000000, /* PA_SC_MODE_CNTL_0 */
|
||||
0x00000000, /* PA_SC_MODE_CNTL_1 */
|
||||
|
||||
0xc0106900,
|
||||
0x00000300,
|
||||
0x00000000, /* PA_SC_LINE_CNTL */
|
||||
0x00000000, /* PA_SC_AA_CONFIG */
|
||||
0x00000005, /* PA_SU_VTX_CNTL */
|
||||
0x3f800000, /* PA_CL_GB_VERT_CLIP_ADJ */
|
||||
0x3f800000, /* PA_CL_GB_VERT_DISC_ADJ */
|
||||
0x3f800000, /* PA_CL_GB_HORZ_CLIP_ADJ */
|
||||
0x3f800000, /* PA_CL_GB_HORZ_DISC_ADJ */
|
||||
0x00000000, /* PA_SC_AA_SAMPLE_LOCS_0 */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* PA_SC_AA_SAMPLE_LOCS_7 */
|
||||
0xffffffff, /* PA_SC_AA_MASK */
|
||||
|
||||
0xc00d6900,
|
||||
0x00000202,
|
||||
0x00cc0010, /* CB_COLOR_CONTROL */
|
||||
0x00000210, /* DB_SHADER_CONTROL */
|
||||
0x00010000, /* PA_CL_CLIP_CNTL */
|
||||
0x00000004, /* PA_SU_SC_MODE_CNTL */
|
||||
0x00000100, /* PA_CL_VTE_CNTL */
|
||||
0x00000000, /* PA_CL_VS_OUT_CNTL */
|
||||
0x00000000, /* PA_CL_NANINF_CNTL */
|
||||
0x00000000, /* PA_SU_LINE_STIPPLE_CNTL */
|
||||
0x00000000, /* PA_SU_LINE_STIPPLE_SCALE */
|
||||
0x00000000, /* PA_SU_PRIM_FILTER_CNTL */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* SQ_DYN_GPR_RESOURCE_LIMIT_1 */
|
||||
|
||||
0xc0066900,
|
||||
0x000002de,
|
||||
0x00000000, /* PA_SU_POLY_OFFSET_DB_FMT_CNTL */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
|
||||
0xc0016900,
|
||||
0x00000229,
|
||||
0x00000000, /* SQ_PGM_START_FS */
|
||||
|
||||
0xc0016900,
|
||||
0x0000022a,
|
||||
0x00000000, /* SQ_PGM_RESOURCES_FS */
|
||||
|
||||
0xc0096900,
|
||||
0x00000100,
|
||||
0x00ffffff, /* VGT_MAX_VTX_INDX */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* SX_ALPHA_TEST_CONTROL */
|
||||
0x00000000, /* CB_BLEND_RED */
|
||||
0x00000000, /* CB_BLEND_GREEN */
|
||||
0x00000000, /* CB_BLEND_BLUE */
|
||||
0x00000000, /* CB_BLEND_ALPHA */
|
||||
|
||||
0xc0026900,
|
||||
0x000002a8,
|
||||
0x00000000, /* VGT_INSTANCE_STEP_RATE_0 */
|
||||
0x00000000, /* */
|
||||
|
||||
0xc0026900,
|
||||
0x000002ad,
|
||||
0x00000000, /* VGT_REUSE_OFF */
|
||||
0x00000000, /* */
|
||||
|
||||
0xc0116900,
|
||||
0x00000280,
|
||||
0x00000000, /* PA_SU_POINT_SIZE */
|
||||
0x00000000, /* PA_SU_POINT_MINMAX */
|
||||
0x00000008, /* PA_SU_LINE_CNTL */
|
||||
0x00000000, /* PA_SC_LINE_STIPPLE */
|
||||
0x00000000, /* VGT_OUTPUT_PATH_CNTL */
|
||||
0x00000000, /* VGT_HOS_CNTL */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* VGT_GS_MODE */
|
||||
|
||||
0xc0016900,
|
||||
0x000002a1,
|
||||
0x00000000, /* VGT_PRIMITIVEID_EN */
|
||||
|
||||
0xc0016900,
|
||||
0x000002a5,
|
||||
0x00000000, /* VGT_MULTI_PRIM_IB_RESET_EN */
|
||||
|
||||
0xc0016900,
|
||||
0x000002d5,
|
||||
0x00000000, /* VGT_SHADER_STAGES_EN */
|
||||
|
||||
0xc0026900,
|
||||
0x000002e5,
|
||||
0x00000000, /* VGT_STRMOUT_CONFIG */
|
||||
0x00000000, /* */
|
||||
|
||||
0xc0016900,
|
||||
0x000001e0,
|
||||
0x00000000, /* CB_BLEND0_CONTROL */
|
||||
|
||||
0xc0016900,
|
||||
0x000001b1,
|
||||
0x00000000, /* SPI_VS_OUT_CONFIG */
|
||||
|
||||
0xc0016900,
|
||||
0x00000187,
|
||||
0x00000000, /* SPI_VS_OUT_ID_0 */
|
||||
|
||||
0xc0016900,
|
||||
0x00000191,
|
||||
0x00000100, /* SPI_PS_INPUT_CNTL_0 */
|
||||
|
||||
0xc00b6900,
|
||||
0x000001b3,
|
||||
0x20000001, /* SPI_PS_IN_CONTROL_0 */
|
||||
0x00000000, /* SPI_PS_IN_CONTROL_1 */
|
||||
0x00000000, /* SPI_INTERP_CONTROL_0 */
|
||||
0x00000000, /* SPI_INPUT_Z */
|
||||
0x00000000, /* SPI_FOG_CNTL */
|
||||
0x00100000, /* SPI_BARYC_CNTL */
|
||||
0x00000000, /* SPI_PS_IN_CONTROL_2 */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
0x00000000, /* */
|
||||
|
||||
0xc0026900,
|
||||
0x00000316,
|
||||
0x0000000e, /* VGT_VERTEX_REUSE_BLOCK_CNTL */
|
||||
0x00000010, /* */
|
||||
};
|
||||
|
||||
static const u32 evergreen_default_size = ARRAY_SIZE(evergreen_default_state);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user