Merge tag 'amd-drm-next-5.8-2020-05-12' of git://people.freedesktop.org/~agd5f/linux into drm-next
amd-drm-next-5.8-2020-05-12: amdgpu: - Misc cleanups - RAS fixes - Expose FP16 for modesetting - DP 1.4 compliance test fixes - Clockgating fixes - MAINTAINERS update - Soft recovery for gfx10 - Runtime PM cleanups - PSP code cleanups amdkfd: - Track GPU memory utilization per process - Report PCI domain in topology Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexdeucher@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200512213703.4039-1-alexander.deucher@amd.com
This commit is contained in:
@@ -765,7 +765,6 @@ struct amdgpu_device {
|
||||
uint8_t *bios;
|
||||
uint32_t bios_size;
|
||||
struct amdgpu_bo *stolen_vga_memory;
|
||||
struct amdgpu_bo *discovery_memory;
|
||||
uint32_t bios_scratch_reg_offset;
|
||||
uint32_t bios_scratch[AMDGPU_BIOS_NUM_SCRATCH];
|
||||
|
||||
@@ -918,7 +917,9 @@ struct amdgpu_device {
|
||||
struct amdgpu_display_manager dm;
|
||||
|
||||
/* discovery */
|
||||
uint8_t *discovery;
|
||||
uint8_t *discovery_bin;
|
||||
uint32_t discovery_tmr_size;
|
||||
struct amdgpu_bo *discovery_memory;
|
||||
|
||||
/* mes */
|
||||
bool enable_mes;
|
||||
@@ -957,6 +958,7 @@ struct amdgpu_device {
|
||||
|
||||
/* s3/s4 mask */
|
||||
bool in_suspend;
|
||||
bool in_hibernate;
|
||||
|
||||
bool in_gpu_reset;
|
||||
enum pp_mp1_state mp1_state;
|
||||
|
@@ -444,7 +444,6 @@ static int amdgpu_atif_handler(struct amdgpu_device *adev,
|
||||
|
||||
DRM_DEBUG_DRIVER("ATIF: %d pending SBIOS requests\n", count);
|
||||
|
||||
/* todo: add DC handling */
|
||||
if ((req.pending & ATIF_PANEL_BRIGHTNESS_CHANGE_REQUEST) &&
|
||||
!amdgpu_device_has_dc_support(adev)) {
|
||||
struct amdgpu_encoder *enc = atif->encoder_for_bl;
|
||||
@@ -463,6 +462,27 @@ static int amdgpu_atif_handler(struct amdgpu_device *adev,
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
|
||||
if ((req.pending & ATIF_PANEL_BRIGHTNESS_CHANGE_REQUEST) &&
|
||||
amdgpu_device_has_dc_support(adev)) {
|
||||
struct amdgpu_display_manager *dm = &adev->dm;
|
||||
struct backlight_device *bd = dm->backlight_dev;
|
||||
|
||||
if (bd) {
|
||||
DRM_DEBUG_DRIVER("Changing brightness to %d\n",
|
||||
req.backlight_level);
|
||||
|
||||
/*
|
||||
* XXX backlight_device_set_brightness() is
|
||||
* hardwired to post BACKLIGHT_UPDATE_SYSFS.
|
||||
* It probably should accept 'reason' parameter.
|
||||
*/
|
||||
backlight_device_set_brightness(bd, req.backlight_level);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
if (req.pending & ATIF_DGPU_DISPLAY_EVENT) {
|
||||
if (adev->flags & AMD_IS_PX) {
|
||||
pm_runtime_get_sync(adev->ddev->dev);
|
||||
|
@@ -65,6 +65,7 @@ struct kgd_mem {
|
||||
struct amdgpu_sync sync;
|
||||
|
||||
bool aql_queue;
|
||||
bool is_imported;
|
||||
};
|
||||
|
||||
/* KFD Memory Eviction */
|
||||
@@ -148,6 +149,9 @@ int amdgpu_amdkfd_post_reset(struct amdgpu_device *adev);
|
||||
|
||||
void amdgpu_amdkfd_gpu_reset(struct kgd_dev *kgd);
|
||||
|
||||
int amdgpu_queue_mask_bit_to_set_resource_bit(struct amdgpu_device *adev,
|
||||
int queue_bit);
|
||||
|
||||
/* Shared API */
|
||||
int amdgpu_amdkfd_alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
|
||||
void **mem_obj, uint64_t *gpu_addr,
|
||||
@@ -219,7 +223,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
|
||||
void *vm, struct kgd_mem **mem,
|
||||
uint64_t *offset, uint32_t flags);
|
||||
int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
|
||||
struct kgd_dev *kgd, struct kgd_mem *mem);
|
||||
struct kgd_dev *kgd, struct kgd_mem *mem, uint64_t *size);
|
||||
int amdgpu_amdkfd_gpuvm_map_memory_to_gpu(
|
||||
struct kgd_dev *kgd, struct kgd_mem *mem, void *vm);
|
||||
int amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(
|
||||
|
@@ -1277,7 +1277,7 @@ err:
|
||||
}
|
||||
|
||||
int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
|
||||
struct kgd_dev *kgd, struct kgd_mem *mem)
|
||||
struct kgd_dev *kgd, struct kgd_mem *mem, uint64_t *size)
|
||||
{
|
||||
struct amdkfd_process_info *process_info = mem->process_info;
|
||||
unsigned long bo_size = mem->bo->tbo.mem.size;
|
||||
@@ -1286,9 +1286,11 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
|
||||
struct ttm_validate_buffer *bo_list_entry;
|
||||
unsigned int mapped_to_gpu_memory;
|
||||
int ret;
|
||||
bool is_imported = 0;
|
||||
|
||||
mutex_lock(&mem->lock);
|
||||
mapped_to_gpu_memory = mem->mapped_to_gpu_memory;
|
||||
is_imported = mem->is_imported;
|
||||
mutex_unlock(&mem->lock);
|
||||
/* lock is not needed after this, since mem is unused and will
|
||||
* be freed anyway
|
||||
@@ -1340,8 +1342,19 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
|
||||
kfree(mem->bo->tbo.sg);
|
||||
}
|
||||
|
||||
/* Update the size of the BO being freed if it was allocated from
|
||||
* VRAM and is not imported.
|
||||
*/
|
||||
if (size) {
|
||||
if ((mem->bo->preferred_domains == AMDGPU_GEM_DOMAIN_VRAM) &&
|
||||
(!is_imported))
|
||||
*size = bo_size;
|
||||
else
|
||||
*size = 0;
|
||||
}
|
||||
|
||||
/* Free the BO*/
|
||||
amdgpu_bo_unref(&mem->bo);
|
||||
drm_gem_object_put_unlocked(&mem->bo->tbo.base);
|
||||
mutex_destroy(&mem->lock);
|
||||
kfree(mem);
|
||||
|
||||
@@ -1686,7 +1699,8 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd,
|
||||
| KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE
|
||||
| KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE;
|
||||
|
||||
(*mem)->bo = amdgpu_bo_ref(bo);
|
||||
drm_gem_object_get(&bo->tbo.base);
|
||||
(*mem)->bo = bo;
|
||||
(*mem)->va = va;
|
||||
(*mem)->domain = (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) ?
|
||||
AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT;
|
||||
@@ -1694,6 +1708,7 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd,
|
||||
(*mem)->process_info = avm->process_info;
|
||||
add_kgd_mem_to_kfd_bo_list(*mem, avm->process_info, false);
|
||||
amdgpu_sync_create(&(*mem)->sync);
|
||||
(*mem)->is_imported = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -1208,7 +1208,6 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
|
||||
{
|
||||
struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
|
||||
struct drm_sched_entity *entity = p->entity;
|
||||
enum drm_sched_priority priority;
|
||||
struct amdgpu_bo_list_entry *e;
|
||||
struct amdgpu_job *job;
|
||||
uint64_t seq;
|
||||
@@ -1258,7 +1257,6 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
|
||||
|
||||
trace_amdgpu_cs_ioctl(job);
|
||||
amdgpu_vm_bo_trace_cs(&fpriv->vm, &p->ticket);
|
||||
priority = job->base.s_priority;
|
||||
drm_sched_entity_push_job(&job->base, entity);
|
||||
|
||||
amdgpu_vm_move_to_lru_tail(p->adev, &fpriv->vm);
|
||||
|
@@ -68,6 +68,7 @@
|
||||
|
||||
#include <linux/suspend.h>
|
||||
#include <drm/task_barrier.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
MODULE_FIRMWARE("amdgpu/vega10_gpu_info.bin");
|
||||
MODULE_FIRMWARE("amdgpu/vega12_gpu_info.bin");
|
||||
@@ -254,6 +255,32 @@ void amdgpu_device_vram_access(struct amdgpu_device *adev, loff_t pos,
|
||||
uint32_t hi = ~0;
|
||||
uint64_t last;
|
||||
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
last = min(pos + size, adev->gmc.visible_vram_size);
|
||||
if (last > pos) {
|
||||
void __iomem *addr = adev->mman.aper_base_kaddr + pos;
|
||||
size_t count = last - pos;
|
||||
|
||||
if (write) {
|
||||
memcpy_toio(addr, buf, count);
|
||||
mb();
|
||||
amdgpu_asic_flush_hdp(adev, NULL);
|
||||
} else {
|
||||
amdgpu_asic_invalidate_hdp(adev, NULL);
|
||||
mb();
|
||||
memcpy_fromio(buf, addr, count);
|
||||
}
|
||||
|
||||
if (count == size)
|
||||
return;
|
||||
|
||||
pos += count;
|
||||
buf += count / 4;
|
||||
size -= count;
|
||||
}
|
||||
#endif
|
||||
|
||||
spin_lock_irqsave(&adev->mmio_idx_lock, flags);
|
||||
for (last = pos + size; pos < last; pos += 4) {
|
||||
uint32_t tmp = pos >> 31;
|
||||
@@ -2891,6 +2918,14 @@ static int amdgpu_device_get_job_timeout_settings(struct amdgpu_device *adev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct attribute *amdgpu_dev_attributes[] = {
|
||||
&dev_attr_product_name.attr,
|
||||
&dev_attr_product_number.attr,
|
||||
&dev_attr_serial_number.attr,
|
||||
&dev_attr_pcie_replay_count.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
/**
|
||||
* amdgpu_device_init - initialize the driver
|
||||
*
|
||||
@@ -3240,27 +3275,9 @@ fence_driver_init:
|
||||
queue_delayed_work(system_wq, &adev->delayed_init_work,
|
||||
msecs_to_jiffies(AMDGPU_RESUME_MS));
|
||||
|
||||
r = device_create_file(adev->dev, &dev_attr_pcie_replay_count);
|
||||
r = sysfs_create_files(&adev->dev->kobj, amdgpu_dev_attributes);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "Could not create pcie_replay_count");
|
||||
return r;
|
||||
}
|
||||
|
||||
r = device_create_file(adev->dev, &dev_attr_product_name);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "Could not create product_name");
|
||||
return r;
|
||||
}
|
||||
|
||||
r = device_create_file(adev->dev, &dev_attr_product_number);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "Could not create product_number");
|
||||
return r;
|
||||
}
|
||||
|
||||
r = device_create_file(adev->dev, &dev_attr_serial_number);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "Could not create serial_number");
|
||||
dev_err(adev->dev, "Could not create amdgpu device attr\n");
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -3343,12 +3360,10 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
|
||||
adev->rmmio = NULL;
|
||||
amdgpu_device_doorbell_fini(adev);
|
||||
|
||||
device_remove_file(adev->dev, &dev_attr_pcie_replay_count);
|
||||
if (adev->ucode_sysfs_en)
|
||||
amdgpu_ucode_sysfs_fini(adev);
|
||||
device_remove_file(adev->dev, &dev_attr_product_name);
|
||||
device_remove_file(adev->dev, &dev_attr_product_number);
|
||||
device_remove_file(adev->dev, &dev_attr_serial_number);
|
||||
|
||||
sysfs_remove_files(&adev->dev->kobj, amdgpu_dev_attributes);
|
||||
if (IS_ENABLED(CONFIG_PERF_EVENTS))
|
||||
amdgpu_pmu_fini(adev);
|
||||
if (amdgpu_discovery && adev->asic_type >= CHIP_NAVI10)
|
||||
@@ -4116,6 +4131,64 @@ static void amdgpu_device_unlock_adev(struct amdgpu_device *adev)
|
||||
mutex_unlock(&adev->lock_reset);
|
||||
}
|
||||
|
||||
static void amdgpu_device_resume_display_audio(struct amdgpu_device *adev)
|
||||
{
|
||||
struct pci_dev *p = NULL;
|
||||
|
||||
p = pci_get_domain_bus_and_slot(pci_domain_nr(adev->pdev->bus),
|
||||
adev->pdev->bus->number, 1);
|
||||
if (p) {
|
||||
pm_runtime_enable(&(p->dev));
|
||||
pm_runtime_resume(&(p->dev));
|
||||
}
|
||||
}
|
||||
|
||||
static int amdgpu_device_suspend_display_audio(struct amdgpu_device *adev)
|
||||
{
|
||||
enum amd_reset_method reset_method;
|
||||
struct pci_dev *p = NULL;
|
||||
u64 expires;
|
||||
|
||||
/*
|
||||
* For now, only BACO and mode1 reset are confirmed
|
||||
* to suffer the audio issue without proper suspended.
|
||||
*/
|
||||
reset_method = amdgpu_asic_reset_method(adev);
|
||||
if ((reset_method != AMD_RESET_METHOD_BACO) &&
|
||||
(reset_method != AMD_RESET_METHOD_MODE1))
|
||||
return -EINVAL;
|
||||
|
||||
p = pci_get_domain_bus_and_slot(pci_domain_nr(adev->pdev->bus),
|
||||
adev->pdev->bus->number, 1);
|
||||
if (!p)
|
||||
return -ENODEV;
|
||||
|
||||
expires = pm_runtime_autosuspend_expiration(&(p->dev));
|
||||
if (!expires)
|
||||
/*
|
||||
* If we cannot get the audio device autosuspend delay,
|
||||
* a fixed 4S interval will be used. Considering 3S is
|
||||
* the audio controller default autosuspend delay setting.
|
||||
* 4S used here is guaranteed to cover that.
|
||||
*/
|
||||
expires = ktime_get_mono_fast_ns() + NSEC_PER_SEC * 4ULL;
|
||||
|
||||
while (!pm_runtime_status_suspended(&(p->dev))) {
|
||||
if (!pm_runtime_suspend(&(p->dev)))
|
||||
break;
|
||||
|
||||
if (expires < ktime_get_mono_fast_ns()) {
|
||||
dev_warn(adev->dev, "failed to suspend display audio\n");
|
||||
/* TODO: abort the succeeding gpu reset? */
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
}
|
||||
|
||||
pm_runtime_disable(&(p->dev));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_device_gpu_recover - reset the asic and recover scheduler
|
||||
*
|
||||
@@ -4140,6 +4213,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
|
||||
bool use_baco =
|
||||
(amdgpu_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) ?
|
||||
true : false;
|
||||
bool audio_suspended = false;
|
||||
|
||||
/*
|
||||
* Flush RAM to disk so that after reboot
|
||||
@@ -4197,6 +4271,19 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to put the audio codec into suspend state
|
||||
* before gpu reset started.
|
||||
*
|
||||
* Due to the power domain of the graphics device
|
||||
* is shared with AZ power domain. Without this,
|
||||
* we may change the audio hardware from behind
|
||||
* the audio driver's back. That will trigger
|
||||
* some audio codec errors.
|
||||
*/
|
||||
if (!amdgpu_device_suspend_display_audio(tmp_adev))
|
||||
audio_suspended = true;
|
||||
|
||||
amdgpu_ras_set_error_query_ready(tmp_adev, false);
|
||||
|
||||
cancel_delayed_work_sync(&tmp_adev->delayed_init_work);
|
||||
@@ -4309,6 +4396,8 @@ skip_sched_resume:
|
||||
/*unlock kfd: SRIOV would do it separately */
|
||||
if (!(in_ras_intr && !use_baco) && !amdgpu_sriov_vf(tmp_adev))
|
||||
amdgpu_amdkfd_post_reset(tmp_adev);
|
||||
if (audio_suspended)
|
||||
amdgpu_device_resume_display_audio(tmp_adev);
|
||||
amdgpu_device_unlock_adev(tmp_adev);
|
||||
}
|
||||
|
||||
|
@@ -52,9 +52,6 @@ struct amdgpu_df_funcs {
|
||||
uint64_t (*get_fica)(struct amdgpu_device *adev, uint32_t ficaa_val);
|
||||
void (*set_fica)(struct amdgpu_device *adev, uint32_t ficaa_val,
|
||||
uint32_t ficadl_val, uint32_t ficadh_val);
|
||||
uint64_t (*get_dram_base_addr)(struct amdgpu_device *adev,
|
||||
uint32_t df_inst);
|
||||
uint32_t (*get_df_inst_id)(struct amdgpu_device *adev);
|
||||
};
|
||||
|
||||
struct amdgpu_df {
|
||||
|
@@ -133,9 +133,10 @@ static int hw_id_map[MAX_HWIP] = {
|
||||
static int amdgpu_discovery_read_binary(struct amdgpu_device *adev, uint8_t *binary)
|
||||
{
|
||||
uint64_t vram_size = (uint64_t)RREG32(mmRCC_CONFIG_MEMSIZE) << 20;
|
||||
uint64_t pos = vram_size - DISCOVERY_TMR_SIZE;
|
||||
uint64_t pos = vram_size - adev->discovery_tmr_size;
|
||||
|
||||
amdgpu_device_vram_access(adev, pos, (uint32_t *)binary, DISCOVERY_TMR_SIZE, false);
|
||||
amdgpu_device_vram_access(adev, pos, (uint32_t *)binary,
|
||||
adev->discovery_tmr_size, false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -167,17 +168,18 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)
|
||||
uint16_t checksum;
|
||||
int r;
|
||||
|
||||
adev->discovery = kzalloc(DISCOVERY_TMR_SIZE, GFP_KERNEL);
|
||||
if (!adev->discovery)
|
||||
adev->discovery_tmr_size = DISCOVERY_TMR_SIZE;
|
||||
adev->discovery_bin = kzalloc(adev->discovery_tmr_size, GFP_KERNEL);
|
||||
if (!adev->discovery_bin)
|
||||
return -ENOMEM;
|
||||
|
||||
r = amdgpu_discovery_read_binary(adev, adev->discovery);
|
||||
r = amdgpu_discovery_read_binary(adev, adev->discovery_bin);
|
||||
if (r) {
|
||||
DRM_ERROR("failed to read ip discovery binary\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
bhdr = (struct binary_header *)adev->discovery;
|
||||
bhdr = (struct binary_header *)adev->discovery_bin;
|
||||
|
||||
if (le32_to_cpu(bhdr->binary_signature) != BINARY_SIGNATURE) {
|
||||
DRM_ERROR("invalid ip discovery binary signature\n");
|
||||
@@ -190,7 +192,7 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)
|
||||
size = bhdr->binary_size - offset;
|
||||
checksum = bhdr->binary_checksum;
|
||||
|
||||
if (!amdgpu_discovery_verify_checksum(adev->discovery + offset,
|
||||
if (!amdgpu_discovery_verify_checksum(adev->discovery_bin + offset,
|
||||
size, checksum)) {
|
||||
DRM_ERROR("invalid ip discovery binary checksum\n");
|
||||
r = -EINVAL;
|
||||
@@ -200,7 +202,7 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)
|
||||
info = &bhdr->table_list[IP_DISCOVERY];
|
||||
offset = le16_to_cpu(info->offset);
|
||||
checksum = le16_to_cpu(info->checksum);
|
||||
ihdr = (struct ip_discovery_header *)(adev->discovery + offset);
|
||||
ihdr = (struct ip_discovery_header *)(adev->discovery_bin + offset);
|
||||
|
||||
if (le32_to_cpu(ihdr->signature) != DISCOVERY_TABLE_SIGNATURE) {
|
||||
DRM_ERROR("invalid ip discovery data table signature\n");
|
||||
@@ -208,7 +210,7 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!amdgpu_discovery_verify_checksum(adev->discovery + offset,
|
||||
if (!amdgpu_discovery_verify_checksum(adev->discovery_bin + offset,
|
||||
ihdr->size, checksum)) {
|
||||
DRM_ERROR("invalid ip discovery data table checksum\n");
|
||||
r = -EINVAL;
|
||||
@@ -218,9 +220,9 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)
|
||||
info = &bhdr->table_list[GC];
|
||||
offset = le16_to_cpu(info->offset);
|
||||
checksum = le16_to_cpu(info->checksum);
|
||||
ghdr = (struct gpu_info_header *)(adev->discovery + offset);
|
||||
ghdr = (struct gpu_info_header *)(adev->discovery_bin + offset);
|
||||
|
||||
if (!amdgpu_discovery_verify_checksum(adev->discovery + offset,
|
||||
if (!amdgpu_discovery_verify_checksum(adev->discovery_bin + offset,
|
||||
ghdr->size, checksum)) {
|
||||
DRM_ERROR("invalid gc data table checksum\n");
|
||||
r = -EINVAL;
|
||||
@@ -230,16 +232,16 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)
|
||||
return 0;
|
||||
|
||||
out:
|
||||
kfree(adev->discovery);
|
||||
adev->discovery = NULL;
|
||||
kfree(adev->discovery_bin);
|
||||
adev->discovery_bin = NULL;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
void amdgpu_discovery_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
kfree(adev->discovery);
|
||||
adev->discovery = NULL;
|
||||
kfree(adev->discovery_bin);
|
||||
adev->discovery_bin = NULL;
|
||||
}
|
||||
|
||||
int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev)
|
||||
@@ -263,8 +265,8 @@ int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev)
|
||||
return r;
|
||||
}
|
||||
|
||||
bhdr = (struct binary_header *)adev->discovery;
|
||||
ihdr = (struct ip_discovery_header *)(adev->discovery +
|
||||
bhdr = (struct binary_header *)adev->discovery_bin;
|
||||
ihdr = (struct ip_discovery_header *)(adev->discovery_bin +
|
||||
le16_to_cpu(bhdr->table_list[IP_DISCOVERY].offset));
|
||||
num_dies = le16_to_cpu(ihdr->num_dies);
|
||||
|
||||
@@ -272,7 +274,7 @@ int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev)
|
||||
|
||||
for (i = 0; i < num_dies; i++) {
|
||||
die_offset = le16_to_cpu(ihdr->die_info[i].die_offset);
|
||||
dhdr = (struct die_header *)(adev->discovery + die_offset);
|
||||
dhdr = (struct die_header *)(adev->discovery_bin + die_offset);
|
||||
num_ips = le16_to_cpu(dhdr->num_ips);
|
||||
ip_offset = die_offset + sizeof(*dhdr);
|
||||
|
||||
@@ -286,7 +288,7 @@ int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev)
|
||||
le16_to_cpu(dhdr->die_id), num_ips);
|
||||
|
||||
for (j = 0; j < num_ips; j++) {
|
||||
ip = (struct ip *)(adev->discovery + ip_offset);
|
||||
ip = (struct ip *)(adev->discovery_bin + ip_offset);
|
||||
num_base_address = ip->num_base_address;
|
||||
|
||||
DRM_DEBUG("%s(%d) #%d v%d.%d.%d:\n",
|
||||
@@ -335,24 +337,24 @@ int amdgpu_discovery_get_ip_version(struct amdgpu_device *adev, int hw_id,
|
||||
uint16_t num_ips;
|
||||
int i, j;
|
||||
|
||||
if (!adev->discovery) {
|
||||
if (!adev->discovery_bin) {
|
||||
DRM_ERROR("ip discovery uninitialized\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bhdr = (struct binary_header *)adev->discovery;
|
||||
ihdr = (struct ip_discovery_header *)(adev->discovery +
|
||||
bhdr = (struct binary_header *)adev->discovery_bin;
|
||||
ihdr = (struct ip_discovery_header *)(adev->discovery_bin +
|
||||
le16_to_cpu(bhdr->table_list[IP_DISCOVERY].offset));
|
||||
num_dies = le16_to_cpu(ihdr->num_dies);
|
||||
|
||||
for (i = 0; i < num_dies; i++) {
|
||||
die_offset = le16_to_cpu(ihdr->die_info[i].die_offset);
|
||||
dhdr = (struct die_header *)(adev->discovery + die_offset);
|
||||
dhdr = (struct die_header *)(adev->discovery_bin + die_offset);
|
||||
num_ips = le16_to_cpu(dhdr->num_ips);
|
||||
ip_offset = die_offset + sizeof(*dhdr);
|
||||
|
||||
for (j = 0; j < num_ips; j++) {
|
||||
ip = (struct ip *)(adev->discovery + ip_offset);
|
||||
ip = (struct ip *)(adev->discovery_bin + ip_offset);
|
||||
|
||||
if (le16_to_cpu(ip->hw_id) == hw_id) {
|
||||
if (major)
|
||||
@@ -375,13 +377,13 @@ int amdgpu_discovery_get_gfx_info(struct amdgpu_device *adev)
|
||||
struct binary_header *bhdr;
|
||||
struct gc_info_v1_0 *gc_info;
|
||||
|
||||
if (!adev->discovery) {
|
||||
if (!adev->discovery_bin) {
|
||||
DRM_ERROR("ip discovery uninitialized\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bhdr = (struct binary_header *)adev->discovery;
|
||||
gc_info = (struct gc_info_v1_0 *)(adev->discovery +
|
||||
bhdr = (struct binary_header *)adev->discovery_bin;
|
||||
gc_info = (struct gc_info_v1_0 *)(adev->discovery_bin +
|
||||
le16_to_cpu(bhdr->table_list[GC].offset));
|
||||
|
||||
adev->gfx.config.max_shader_engines = le32_to_cpu(gc_info->gc_num_se);
|
||||
|
@@ -1174,14 +1174,6 @@ static int amdgpu_pmops_resume(struct device *dev)
|
||||
{
|
||||
struct drm_device *drm_dev = dev_get_drvdata(dev);
|
||||
|
||||
/* GPU comes up enabled by the bios on resume */
|
||||
if (amdgpu_device_supports_boco(drm_dev) ||
|
||||
amdgpu_device_supports_baco(drm_dev)) {
|
||||
pm_runtime_disable(dev);
|
||||
pm_runtime_set_active(dev);
|
||||
pm_runtime_enable(dev);
|
||||
}
|
||||
|
||||
return amdgpu_device_resume(drm_dev, true);
|
||||
}
|
||||
|
||||
@@ -1191,7 +1183,9 @@ static int amdgpu_pmops_freeze(struct device *dev)
|
||||
struct amdgpu_device *adev = drm_dev->dev_private;
|
||||
int r;
|
||||
|
||||
adev->in_hibernate = true;
|
||||
r = amdgpu_device_suspend(drm_dev, true);
|
||||
adev->in_hibernate = false;
|
||||
if (r)
|
||||
return r;
|
||||
return amdgpu_asic_reset(adev);
|
||||
|
@@ -133,8 +133,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
|
||||
u32 cpp;
|
||||
u64 flags = AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
|
||||
AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS |
|
||||
AMDGPU_GEM_CREATE_VRAM_CLEARED |
|
||||
AMDGPU_GEM_CREATE_CPU_GTT_USWC;
|
||||
AMDGPU_GEM_CREATE_VRAM_CLEARED;
|
||||
|
||||
info = drm_get_format_info(adev->ddev, mode_cmd);
|
||||
cpp = info->cpp[0];
|
||||
|
@@ -48,7 +48,7 @@ int amdgpu_gfx_mec_queue_to_bit(struct amdgpu_device *adev, int mec,
|
||||
return bit;
|
||||
}
|
||||
|
||||
void amdgpu_gfx_bit_to_mec_queue(struct amdgpu_device *adev, int bit,
|
||||
void amdgpu_queue_mask_bit_to_mec_queue(struct amdgpu_device *adev, int bit,
|
||||
int *mec, int *pipe, int *queue)
|
||||
{
|
||||
*queue = bit % adev->gfx.mec.num_queue_per_pipe;
|
||||
@@ -274,7 +274,7 @@ static int amdgpu_gfx_kiq_acquire(struct amdgpu_device *adev,
|
||||
if (test_bit(queue_bit, adev->gfx.mec.queue_bitmap))
|
||||
continue;
|
||||
|
||||
amdgpu_gfx_bit_to_mec_queue(adev, queue_bit, &mec, &pipe, &queue);
|
||||
amdgpu_queue_mask_bit_to_mec_queue(adev, queue_bit, &mec, &pipe, &queue);
|
||||
|
||||
/*
|
||||
* 1. Using pipes 2/3 from MEC 2 seems cause problems.
|
||||
@@ -485,6 +485,19 @@ int amdgpu_gfx_disable_kcq(struct amdgpu_device *adev)
|
||||
return amdgpu_ring_test_helper(kiq_ring);
|
||||
}
|
||||
|
||||
int amdgpu_queue_mask_bit_to_set_resource_bit(struct amdgpu_device *adev,
|
||||
int queue_bit)
|
||||
{
|
||||
int mec, pipe, queue;
|
||||
int set_resource_bit = 0;
|
||||
|
||||
amdgpu_queue_mask_bit_to_mec_queue(adev, queue_bit, &mec, &pipe, &queue);
|
||||
|
||||
set_resource_bit = mec * 4 * 8 + pipe * 8 + queue;
|
||||
|
||||
return set_resource_bit;
|
||||
}
|
||||
|
||||
int amdgpu_gfx_enable_kcq(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_kiq *kiq = &adev->gfx.kiq;
|
||||
@@ -507,7 +520,7 @@ int amdgpu_gfx_enable_kcq(struct amdgpu_device *adev)
|
||||
break;
|
||||
}
|
||||
|
||||
queue_mask |= (1ull << i);
|
||||
queue_mask |= (1ull << amdgpu_queue_mask_bit_to_set_resource_bit(adev, i));
|
||||
}
|
||||
|
||||
DRM_INFO("kiq ring mec %d pipe %d q %d\n", kiq_ring->me, kiq_ring->pipe,
|
||||
|
@@ -364,7 +364,7 @@ void amdgpu_gfx_graphics_queue_acquire(struct amdgpu_device *adev);
|
||||
|
||||
int amdgpu_gfx_mec_queue_to_bit(struct amdgpu_device *adev, int mec,
|
||||
int pipe, int queue);
|
||||
void amdgpu_gfx_bit_to_mec_queue(struct amdgpu_device *adev, int bit,
|
||||
void amdgpu_queue_mask_bit_to_mec_queue(struct amdgpu_device *adev, int bit,
|
||||
int *mec, int *pipe, int *queue);
|
||||
bool amdgpu_gfx_is_mec_queue_enabled(struct amdgpu_device *adev, int mec,
|
||||
int pipe, int queue);
|
||||
|
@@ -189,10 +189,12 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)
|
||||
dev_dbg(&dev->pdev->dev, "Error during ACPI methods call\n");
|
||||
|
||||
if (adev->runpm) {
|
||||
dev_pm_set_driver_flags(dev->dev, DPM_FLAG_NEVER_SKIP);
|
||||
/* only need to skip on ATPX */
|
||||
if (amdgpu_device_supports_boco(dev) &&
|
||||
!amdgpu_is_atpx_hybrid())
|
||||
dev_pm_set_driver_flags(dev->dev, DPM_FLAG_NEVER_SKIP);
|
||||
pm_runtime_use_autosuspend(dev->dev);
|
||||
pm_runtime_set_autosuspend_delay(dev->dev, 5000);
|
||||
pm_runtime_set_active(dev->dev);
|
||||
pm_runtime_allow(dev->dev);
|
||||
pm_runtime_mark_last_busy(dev->dev);
|
||||
pm_runtime_put_autosuspend(dev->dev);
|
||||
|
@@ -664,6 +664,121 @@ int psp_xgmi_initialize(struct psp_context *psp)
|
||||
return ret;
|
||||
}
|
||||
|
||||
int psp_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id)
|
||||
{
|
||||
struct ta_xgmi_shared_memory *xgmi_cmd;
|
||||
int ret;
|
||||
|
||||
xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
|
||||
memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
|
||||
|
||||
xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_HIVE_ID;
|
||||
|
||||
/* Invoke xgmi ta to get hive id */
|
||||
ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
*hive_id = xgmi_cmd->xgmi_out_message.get_hive_id.hive_id;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int psp_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id)
|
||||
{
|
||||
struct ta_xgmi_shared_memory *xgmi_cmd;
|
||||
int ret;
|
||||
|
||||
xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
|
||||
memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
|
||||
|
||||
xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_NODE_ID;
|
||||
|
||||
/* Invoke xgmi ta to get the node id */
|
||||
ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
*node_id = xgmi_cmd->xgmi_out_message.get_node_id.node_id;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int psp_xgmi_get_topology_info(struct psp_context *psp,
|
||||
int number_devices,
|
||||
struct psp_xgmi_topology_info *topology)
|
||||
{
|
||||
struct ta_xgmi_shared_memory *xgmi_cmd;
|
||||
struct ta_xgmi_cmd_get_topology_info_input *topology_info_input;
|
||||
struct ta_xgmi_cmd_get_topology_info_output *topology_info_output;
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
|
||||
return -EINVAL;
|
||||
|
||||
xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
|
||||
memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
|
||||
|
||||
/* Fill in the shared memory with topology information as input */
|
||||
topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
|
||||
xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO;
|
||||
topology_info_input->num_nodes = number_devices;
|
||||
|
||||
for (i = 0; i < topology_info_input->num_nodes; i++) {
|
||||
topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
|
||||
topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
|
||||
topology_info_input->nodes[i].is_sharing_enabled = topology->nodes[i].is_sharing_enabled;
|
||||
topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
|
||||
}
|
||||
|
||||
/* Invoke xgmi ta to get the topology information */
|
||||
ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Read the output topology information from the shared memory */
|
||||
topology_info_output = &xgmi_cmd->xgmi_out_message.get_topology_info;
|
||||
topology->num_nodes = xgmi_cmd->xgmi_out_message.get_topology_info.num_nodes;
|
||||
for (i = 0; i < topology->num_nodes; i++) {
|
||||
topology->nodes[i].node_id = topology_info_output->nodes[i].node_id;
|
||||
topology->nodes[i].num_hops = topology_info_output->nodes[i].num_hops;
|
||||
topology->nodes[i].is_sharing_enabled = topology_info_output->nodes[i].is_sharing_enabled;
|
||||
topology->nodes[i].sdma_engine = topology_info_output->nodes[i].sdma_engine;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int psp_xgmi_set_topology_info(struct psp_context *psp,
|
||||
int number_devices,
|
||||
struct psp_xgmi_topology_info *topology)
|
||||
{
|
||||
struct ta_xgmi_shared_memory *xgmi_cmd;
|
||||
struct ta_xgmi_cmd_get_topology_info_input *topology_info_input;
|
||||
int i;
|
||||
|
||||
if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
|
||||
return -EINVAL;
|
||||
|
||||
xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
|
||||
memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
|
||||
|
||||
topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
|
||||
xgmi_cmd->cmd_id = TA_COMMAND_XGMI__SET_TOPOLOGY_INFO;
|
||||
topology_info_input->num_nodes = number_devices;
|
||||
|
||||
for (i = 0; i < topology_info_input->num_nodes; i++) {
|
||||
topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
|
||||
topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
|
||||
topology_info_input->nodes[i].is_sharing_enabled = 1;
|
||||
topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
|
||||
}
|
||||
|
||||
/* Invoke xgmi ta to set topology information */
|
||||
return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO);
|
||||
}
|
||||
|
||||
// ras begin
|
||||
static int psp_ras_init_shared_buf(struct psp_context *psp)
|
||||
{
|
||||
@@ -746,13 +861,40 @@ static int psp_ras_unload(struct psp_context *psp)
|
||||
|
||||
int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
|
||||
{
|
||||
struct ta_ras_shared_memory *ras_cmd;
|
||||
int ret;
|
||||
|
||||
ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf;
|
||||
|
||||
/*
|
||||
* TODO: bypass the loading in sriov for now
|
||||
*/
|
||||
if (amdgpu_sriov_vf(psp->adev))
|
||||
return 0;
|
||||
|
||||
return psp_ta_invoke(psp, ta_cmd_id, psp->ras.session_id);
|
||||
ret = psp_ta_invoke(psp, ta_cmd_id, psp->ras.session_id);
|
||||
|
||||
if (amdgpu_ras_intr_triggered())
|
||||
return ret;
|
||||
|
||||
if (ras_cmd->if_version > RAS_TA_HOST_IF_VER)
|
||||
{
|
||||
DRM_WARN("RAS: Unsupported Interface");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!ret) {
|
||||
if (ras_cmd->ras_out_message.flags.err_inject_switch_disable_flag) {
|
||||
dev_warn(psp->adev->dev, "ECC switch disabled\n");
|
||||
|
||||
ras_cmd->ras_status = TA_RAS_STATUS__ERROR_RAS_NOT_AVAILABLE;
|
||||
}
|
||||
else if (ras_cmd->ras_out_message.flags.reg_access_failure_flag)
|
||||
dev_warn(psp->adev->dev,
|
||||
"RAS internal register access blocked\n");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int psp_ras_enable_features(struct psp_context *psp,
|
||||
@@ -836,6 +978,33 @@ static int psp_ras_initialize(struct psp_context *psp)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int psp_ras_trigger_error(struct psp_context *psp,
|
||||
struct ta_ras_trigger_error_input *info)
|
||||
{
|
||||
struct ta_ras_shared_memory *ras_cmd;
|
||||
int ret;
|
||||
|
||||
if (!psp->ras.ras_initialized)
|
||||
return -EINVAL;
|
||||
|
||||
ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf;
|
||||
memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory));
|
||||
|
||||
ras_cmd->cmd_id = TA_RAS_COMMAND__TRIGGER_ERROR;
|
||||
ras_cmd->ras_in_message.trigger_error = *info;
|
||||
|
||||
ret = psp_ras_invoke(psp, ras_cmd->cmd_id);
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
|
||||
/* If err_event_athub occurs error inject was successful, however
|
||||
return status from TA is no long reliable */
|
||||
if (amdgpu_ras_intr_triggered())
|
||||
return 0;
|
||||
|
||||
return ras_cmd->ras_status;
|
||||
}
|
||||
// ras end
|
||||
|
||||
// HDCP start
|
||||
@@ -1477,7 +1646,7 @@ static int psp_np_fw_load(struct psp_context *psp)
|
||||
/* Start rlc autoload after psp recieved all the gfx firmware */
|
||||
if (psp->autoload_supported && ucode->ucode_id == (amdgpu_sriov_vf(adev) ?
|
||||
AMDGPU_UCODE_ID_CP_MEC2 : AMDGPU_UCODE_ID_RLC_G)) {
|
||||
ret = psp_rlc_autoload(psp);
|
||||
ret = psp_rlc_autoload_start(psp);
|
||||
if (ret) {
|
||||
DRM_ERROR("Failed to start rlc autoload\n");
|
||||
return ret;
|
||||
|
@@ -95,16 +95,6 @@ struct psp_funcs
|
||||
enum psp_ring_type ring_type);
|
||||
bool (*smu_reload_quirk)(struct psp_context *psp);
|
||||
int (*mode1_reset)(struct psp_context *psp);
|
||||
int (*xgmi_get_node_id)(struct psp_context *psp, uint64_t *node_id);
|
||||
int (*xgmi_get_hive_id)(struct psp_context *psp, uint64_t *hive_id);
|
||||
int (*xgmi_get_topology_info)(struct psp_context *psp, int number_devices,
|
||||
struct psp_xgmi_topology_info *topology);
|
||||
int (*xgmi_set_topology_info)(struct psp_context *psp, int number_devices,
|
||||
struct psp_xgmi_topology_info *topology);
|
||||
int (*ras_trigger_error)(struct psp_context *psp,
|
||||
struct ta_ras_trigger_error_input *info);
|
||||
int (*ras_cure_posion)(struct psp_context *psp, uint64_t *mode_ptr);
|
||||
int (*rlc_autoload_start)(struct psp_context *psp);
|
||||
int (*mem_training_init)(struct psp_context *psp);
|
||||
void (*mem_training_fini)(struct psp_context *psp);
|
||||
int (*mem_training)(struct psp_context *psp, uint32_t ops);
|
||||
@@ -316,18 +306,6 @@ struct amdgpu_psp_funcs {
|
||||
((psp)->funcs->smu_reload_quirk ? (psp)->funcs->smu_reload_quirk((psp)) : false)
|
||||
#define psp_mode1_reset(psp) \
|
||||
((psp)->funcs->mode1_reset ? (psp)->funcs->mode1_reset((psp)) : false)
|
||||
#define psp_xgmi_get_node_id(psp, node_id) \
|
||||
((psp)->funcs->xgmi_get_node_id ? (psp)->funcs->xgmi_get_node_id((psp), (node_id)) : -EINVAL)
|
||||
#define psp_xgmi_get_hive_id(psp, hive_id) \
|
||||
((psp)->funcs->xgmi_get_hive_id ? (psp)->funcs->xgmi_get_hive_id((psp), (hive_id)) : -EINVAL)
|
||||
#define psp_xgmi_get_topology_info(psp, num_device, topology) \
|
||||
((psp)->funcs->xgmi_get_topology_info ? \
|
||||
(psp)->funcs->xgmi_get_topology_info((psp), (num_device), (topology)) : -EINVAL)
|
||||
#define psp_xgmi_set_topology_info(psp, num_device, topology) \
|
||||
((psp)->funcs->xgmi_set_topology_info ? \
|
||||
(psp)->funcs->xgmi_set_topology_info((psp), (num_device), (topology)) : -EINVAL)
|
||||
#define psp_rlc_autoload(psp) \
|
||||
((psp)->funcs->rlc_autoload_start ? (psp)->funcs->rlc_autoload_start((psp)) : 0)
|
||||
#define psp_mem_training_init(psp) \
|
||||
((psp)->funcs->mem_training_init ? (psp)->funcs->mem_training_init((psp)) : 0)
|
||||
#define psp_mem_training_fini(psp) \
|
||||
@@ -335,13 +313,6 @@ struct amdgpu_psp_funcs {
|
||||
#define psp_mem_training(psp, ops) \
|
||||
((psp)->funcs->mem_training ? (psp)->funcs->mem_training((psp), (ops)) : 0)
|
||||
|
||||
#define psp_ras_trigger_error(psp, info) \
|
||||
((psp)->funcs->ras_trigger_error ? \
|
||||
(psp)->funcs->ras_trigger_error((psp), (info)) : -EINVAL)
|
||||
#define psp_ras_cure_posion(psp, addr) \
|
||||
((psp)->funcs->ras_cure_posion ? \
|
||||
(psp)->funcs->ras_cure_posion(psp, (addr)) : -EINVAL)
|
||||
|
||||
#define psp_ring_get_wptr(psp) (psp)->funcs->ring_get_wptr((psp))
|
||||
#define psp_ring_set_wptr(psp, value) (psp)->funcs->ring_set_wptr((psp), (value))
|
||||
|
||||
@@ -369,10 +340,21 @@ int psp_update_vcn_sram(struct amdgpu_device *adev, int inst_idx,
|
||||
int psp_xgmi_initialize(struct psp_context *psp);
|
||||
int psp_xgmi_terminate(struct psp_context *psp);
|
||||
int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
|
||||
int psp_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id);
|
||||
int psp_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id);
|
||||
int psp_xgmi_get_topology_info(struct psp_context *psp,
|
||||
int number_devices,
|
||||
struct psp_xgmi_topology_info *topology);
|
||||
int psp_xgmi_set_topology_info(struct psp_context *psp,
|
||||
int number_devices,
|
||||
struct psp_xgmi_topology_info *topology);
|
||||
|
||||
int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
|
||||
int psp_ras_enable_features(struct psp_context *psp,
|
||||
union ta_ras_cmd_input *info, bool enable);
|
||||
int psp_ras_trigger_error(struct psp_context *psp,
|
||||
struct ta_ras_trigger_error_input *info);
|
||||
|
||||
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);
|
||||
|
||||
|
@@ -502,6 +502,29 @@ struct ras_manager *amdgpu_ras_find_obj(struct amdgpu_device *adev,
|
||||
}
|
||||
/* obj end */
|
||||
|
||||
void amdgpu_ras_parse_status_code(struct amdgpu_device* adev,
|
||||
const char* invoke_type,
|
||||
const char* block_name,
|
||||
enum ta_ras_status ret)
|
||||
{
|
||||
switch (ret) {
|
||||
case TA_RAS_STATUS__SUCCESS:
|
||||
return;
|
||||
case TA_RAS_STATUS__ERROR_RAS_NOT_AVAILABLE:
|
||||
dev_warn(adev->dev,
|
||||
"RAS WARN: %s %s currently unavailable\n",
|
||||
invoke_type,
|
||||
block_name);
|
||||
break;
|
||||
default:
|
||||
dev_err(adev->dev,
|
||||
"RAS ERROR: %s %s error failed ret 0x%X\n",
|
||||
invoke_type,
|
||||
block_name,
|
||||
ret);
|
||||
}
|
||||
}
|
||||
|
||||
/* feature ctl begin */
|
||||
static int amdgpu_ras_is_feature_allowed(struct amdgpu_device *adev,
|
||||
struct ras_common_if *head)
|
||||
@@ -565,19 +588,23 @@ int amdgpu_ras_feature_enable(struct amdgpu_device *adev,
|
||||
struct ras_common_if *head, bool enable)
|
||||
{
|
||||
struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
|
||||
union ta_ras_cmd_input info;
|
||||
union ta_ras_cmd_input *info;
|
||||
int ret;
|
||||
|
||||
if (!con)
|
||||
return -EINVAL;
|
||||
|
||||
info = kzalloc(sizeof(union ta_ras_cmd_input), GFP_KERNEL);
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!enable) {
|
||||
info.disable_features = (struct ta_ras_disable_features_input) {
|
||||
info->disable_features = (struct ta_ras_disable_features_input) {
|
||||
.block_id = amdgpu_ras_block_to_ta(head->block),
|
||||
.error_type = amdgpu_ras_error_to_ta(head->type),
|
||||
};
|
||||
} else {
|
||||
info.enable_features = (struct ta_ras_enable_features_input) {
|
||||
info->enable_features = (struct ta_ras_enable_features_input) {
|
||||
.block_id = amdgpu_ras_block_to_ta(head->block),
|
||||
.error_type = amdgpu_ras_error_to_ta(head->type),
|
||||
};
|
||||
@@ -586,27 +613,33 @@ int amdgpu_ras_feature_enable(struct amdgpu_device *adev,
|
||||
/* Do not enable if it is not allowed. */
|
||||
WARN_ON(enable && !amdgpu_ras_is_feature_allowed(adev, head));
|
||||
/* Are we alerady in that state we are going to set? */
|
||||
if (!(!!enable ^ !!amdgpu_ras_is_feature_enabled(adev, head)))
|
||||
return 0;
|
||||
if (!(!!enable ^ !!amdgpu_ras_is_feature_enabled(adev, head))) {
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!amdgpu_ras_intr_triggered()) {
|
||||
ret = psp_ras_enable_features(&adev->psp, &info, enable);
|
||||
ret = psp_ras_enable_features(&adev->psp, info, enable);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "RAS ERROR: %s %s feature "
|
||||
"failed ret %d\n",
|
||||
enable ? "enable":"disable",
|
||||
ras_block_str(head->block),
|
||||
ret);
|
||||
amdgpu_ras_parse_status_code(adev,
|
||||
enable ? "enable":"disable",
|
||||
ras_block_str(head->block),
|
||||
(enum ta_ras_status)ret);
|
||||
if (ret == TA_RAS_STATUS__RESET_NEEDED)
|
||||
return -EAGAIN;
|
||||
return -EINVAL;
|
||||
ret = -EAGAIN;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
/* setup the obj */
|
||||
__amdgpu_ras_feature_enable(adev, head, enable);
|
||||
|
||||
return 0;
|
||||
ret = 0;
|
||||
out:
|
||||
kfree(info);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Only used in device probe stage and called only once. */
|
||||
@@ -821,10 +854,10 @@ int amdgpu_ras_error_inject(struct amdgpu_device *adev,
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
if (ret)
|
||||
dev_err(adev->dev, "RAS ERROR: inject %s error failed ret %d\n",
|
||||
ras_block_str(info->head.block),
|
||||
ret);
|
||||
amdgpu_ras_parse_status_code(adev,
|
||||
"inject",
|
||||
ras_block_str(info->head.block),
|
||||
(enum ta_ras_status)ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@@ -1957,17 +1957,19 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
|
||||
return r;
|
||||
|
||||
/*
|
||||
* reserve one TMR (64K) memory at the top of VRAM which holds
|
||||
* reserve TMR memory at the top of VRAM which holds
|
||||
* IP Discovery data and is protected by PSP.
|
||||
*/
|
||||
r = amdgpu_bo_create_kernel_at(adev,
|
||||
adev->gmc.real_vram_size - DISCOVERY_TMR_SIZE,
|
||||
DISCOVERY_TMR_SIZE,
|
||||
AMDGPU_GEM_DOMAIN_VRAM,
|
||||
&adev->discovery_memory,
|
||||
NULL);
|
||||
if (r)
|
||||
return r;
|
||||
if (adev->discovery_tmr_size > 0) {
|
||||
r = amdgpu_bo_create_kernel_at(adev,
|
||||
adev->gmc.real_vram_size - adev->discovery_tmr_size,
|
||||
adev->discovery_tmr_size,
|
||||
AMDGPU_GEM_DOMAIN_VRAM,
|
||||
&adev->discovery_memory,
|
||||
NULL);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
|
||||
DRM_INFO("amdgpu: %uM of VRAM memory ready\n",
|
||||
(unsigned) (adev->gmc.real_vram_size / (1024 * 1024)));
|
||||
|
@@ -149,6 +149,15 @@ static DEVICE_ATTR(mem_info_vis_vram_used, S_IRUGO,
|
||||
static DEVICE_ATTR(mem_info_vram_vendor, S_IRUGO,
|
||||
amdgpu_mem_info_vram_vendor, NULL);
|
||||
|
||||
static const struct attribute *amdgpu_vram_mgr_attributes[] = {
|
||||
&dev_attr_mem_info_vram_total.attr,
|
||||
&dev_attr_mem_info_vis_vram_total.attr,
|
||||
&dev_attr_mem_info_vram_used.attr,
|
||||
&dev_attr_mem_info_vis_vram_used.attr,
|
||||
&dev_attr_mem_info_vram_vendor.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
/**
|
||||
* amdgpu_vram_mgr_init - init VRAM manager and DRM MM
|
||||
*
|
||||
@@ -173,31 +182,9 @@ static int amdgpu_vram_mgr_init(struct ttm_mem_type_manager *man,
|
||||
man->priv = mgr;
|
||||
|
||||
/* Add the two VRAM-related sysfs files */
|
||||
ret = device_create_file(adev->dev, &dev_attr_mem_info_vram_total);
|
||||
if (ret) {
|
||||
DRM_ERROR("Failed to create device file mem_info_vram_total\n");
|
||||
return ret;
|
||||
}
|
||||
ret = device_create_file(adev->dev, &dev_attr_mem_info_vis_vram_total);
|
||||
if (ret) {
|
||||
DRM_ERROR("Failed to create device file mem_info_vis_vram_total\n");
|
||||
return ret;
|
||||
}
|
||||
ret = device_create_file(adev->dev, &dev_attr_mem_info_vram_used);
|
||||
if (ret) {
|
||||
DRM_ERROR("Failed to create device file mem_info_vram_used\n");
|
||||
return ret;
|
||||
}
|
||||
ret = device_create_file(adev->dev, &dev_attr_mem_info_vis_vram_used);
|
||||
if (ret) {
|
||||
DRM_ERROR("Failed to create device file mem_info_vis_vram_used\n");
|
||||
return ret;
|
||||
}
|
||||
ret = device_create_file(adev->dev, &dev_attr_mem_info_vram_vendor);
|
||||
if (ret) {
|
||||
DRM_ERROR("Failed to create device file mem_info_vram_vendor\n");
|
||||
return ret;
|
||||
}
|
||||
ret = sysfs_create_files(&adev->dev->kobj, amdgpu_vram_mgr_attributes);
|
||||
if (ret)
|
||||
DRM_ERROR("Failed to register sysfs\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -220,11 +207,7 @@ static int amdgpu_vram_mgr_fini(struct ttm_mem_type_manager *man)
|
||||
spin_unlock(&mgr->lock);
|
||||
kfree(mgr);
|
||||
man->priv = NULL;
|
||||
device_remove_file(adev->dev, &dev_attr_mem_info_vram_total);
|
||||
device_remove_file(adev->dev, &dev_attr_mem_info_vis_vram_total);
|
||||
device_remove_file(adev->dev, &dev_attr_mem_info_vram_used);
|
||||
device_remove_file(adev->dev, &dev_attr_mem_info_vis_vram_used);
|
||||
device_remove_file(adev->dev, &dev_attr_mem_info_vram_vendor);
|
||||
sysfs_remove_files(&adev->dev->kobj, amdgpu_vram_mgr_attributes);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -649,31 +649,8 @@ void amdgpu_xgmi_ras_fini(struct amdgpu_device *adev)
|
||||
uint64_t amdgpu_xgmi_get_relative_phy_addr(struct amdgpu_device *adev,
|
||||
uint64_t addr)
|
||||
{
|
||||
uint32_t df_inst_id;
|
||||
uint64_t dram_base_addr = 0;
|
||||
const struct amdgpu_df_funcs *df_funcs = adev->df.funcs;
|
||||
|
||||
if ((!df_funcs) ||
|
||||
(!df_funcs->get_df_inst_id) ||
|
||||
(!df_funcs->get_dram_base_addr)) {
|
||||
dev_warn(adev->dev,
|
||||
"XGMI: relative phy_addr algorithm is not supported\n");
|
||||
return addr;
|
||||
}
|
||||
|
||||
if (amdgpu_dpm_set_df_cstate(adev, DF_CSTATE_DISALLOW)) {
|
||||
dev_warn(adev->dev,
|
||||
"failed to disable DF-Cstate, DF register may not be accessible\n");
|
||||
return addr;
|
||||
}
|
||||
|
||||
df_inst_id = df_funcs->get_df_inst_id(adev);
|
||||
dram_base_addr = df_funcs->get_dram_base_addr(adev, df_inst_id);
|
||||
|
||||
if (amdgpu_dpm_set_df_cstate(adev, DF_CSTATE_ALLOW))
|
||||
dev_warn(adev->dev, "failed to enable DF-Cstate\n");
|
||||
|
||||
return addr + dram_base_addr;
|
||||
struct amdgpu_xgmi *xgmi = &adev->gmc.xgmi;
|
||||
return (addr + xgmi->physical_node_id * xgmi->node_segment_size);
|
||||
}
|
||||
|
||||
static void pcs_clear_status(struct amdgpu_device *adev, uint32_t pcs_status_reg)
|
||||
|
@@ -686,58 +686,6 @@ static void df_v3_6_pmc_get_count(struct amdgpu_device *adev,
|
||||
}
|
||||
}
|
||||
|
||||
static uint64_t df_v3_6_get_dram_base_addr(struct amdgpu_device *adev,
|
||||
uint32_t df_inst)
|
||||
{
|
||||
uint32_t base_addr_reg_val = 0;
|
||||
uint64_t base_addr = 0;
|
||||
|
||||
base_addr_reg_val = RREG32_PCIE(smnDF_CS_UMC_AON0_DramBaseAddress0 +
|
||||
df_inst * DF_3_6_SMN_REG_INST_DIST);
|
||||
|
||||
if (REG_GET_FIELD(base_addr_reg_val,
|
||||
DF_CS_UMC_AON0_DramBaseAddress0,
|
||||
AddrRngVal) == 0) {
|
||||
DRM_WARN("address range not valid");
|
||||
return 0;
|
||||
}
|
||||
|
||||
base_addr = REG_GET_FIELD(base_addr_reg_val,
|
||||
DF_CS_UMC_AON0_DramBaseAddress0,
|
||||
DramBaseAddr);
|
||||
|
||||
return base_addr << 28;
|
||||
}
|
||||
|
||||
static uint32_t df_v3_6_get_df_inst_id(struct amdgpu_device *adev)
|
||||
{
|
||||
uint32_t xgmi_node_id = 0;
|
||||
uint32_t df_inst_id = 0;
|
||||
|
||||
/* Walk through DF dst nodes to find current XGMI node */
|
||||
for (df_inst_id = 0; df_inst_id < DF_3_6_INST_CNT; df_inst_id++) {
|
||||
|
||||
xgmi_node_id = RREG32_PCIE(smnDF_CS_UMC_AON0_DramLimitAddress0 +
|
||||
df_inst_id * DF_3_6_SMN_REG_INST_DIST);
|
||||
xgmi_node_id = REG_GET_FIELD(xgmi_node_id,
|
||||
DF_CS_UMC_AON0_DramLimitAddress0,
|
||||
DstFabricID);
|
||||
|
||||
/* TODO: establish reason dest fabric id is offset by 7 */
|
||||
xgmi_node_id = xgmi_node_id >> 7;
|
||||
|
||||
if (adev->gmc.xgmi.physical_node_id == xgmi_node_id)
|
||||
break;
|
||||
}
|
||||
|
||||
if (df_inst_id == DF_3_6_INST_CNT) {
|
||||
DRM_WARN("cant match df dst id with gpu node");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return df_inst_id;
|
||||
}
|
||||
|
||||
const struct amdgpu_df_funcs df_v3_6_funcs = {
|
||||
.sw_init = df_v3_6_sw_init,
|
||||
.sw_fini = df_v3_6_sw_fini,
|
||||
@@ -752,6 +700,4 @@ const struct amdgpu_df_funcs df_v3_6_funcs = {
|
||||
.pmc_get_count = df_v3_6_pmc_get_count,
|
||||
.get_fica = df_v3_6_get_fica,
|
||||
.set_fica = df_v3_6_set_fica,
|
||||
.get_dram_base_addr = df_v3_6_get_dram_base_addr,
|
||||
.get_df_inst_id = df_v3_6_get_df_inst_id
|
||||
};
|
||||
|
@@ -4577,11 +4577,13 @@ static int gfx_v10_0_init_csb(struct amdgpu_device *adev)
|
||||
adev->gfx.rlc.funcs->get_csb_buffer(adev, adev->gfx.rlc.cs_ptr);
|
||||
|
||||
/* csib */
|
||||
WREG32_SOC15_RLC(GC, 0, mmRLC_CSIB_ADDR_HI,
|
||||
adev->gfx.rlc.clear_state_gpu_addr >> 32);
|
||||
WREG32_SOC15_RLC(GC, 0, mmRLC_CSIB_ADDR_LO,
|
||||
adev->gfx.rlc.clear_state_gpu_addr & 0xfffffffc);
|
||||
WREG32_SOC15_RLC(GC, 0, mmRLC_CSIB_LENGTH, adev->gfx.rlc.clear_state_size);
|
||||
/* amdgpu_mm_wreg_mmio_rlc will fall back to mmio if doesn't support rlcg_write */
|
||||
amdgpu_mm_wreg_mmio_rlc(adev, SOC15_REG_OFFSET(GC, 0, mmRLC_CSIB_ADDR_HI),
|
||||
adev->gfx.rlc.clear_state_gpu_addr >> 32, 0);
|
||||
amdgpu_mm_wreg_mmio_rlc(adev, SOC15_REG_OFFSET(GC, 0, mmRLC_CSIB_ADDR_LO),
|
||||
adev->gfx.rlc.clear_state_gpu_addr & 0xfffffffc, 0);
|
||||
amdgpu_mm_wreg_mmio_rlc(adev, SOC15_REG_OFFSET(GC, 0, mmRLC_CSIB_LENGTH),
|
||||
adev->gfx.rlc.clear_state_size, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -5190,7 +5192,7 @@ static int gfx_v10_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)
|
||||
tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, ME_HALT, enable ? 0 : 1);
|
||||
tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, PFP_HALT, enable ? 0 : 1);
|
||||
tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, CE_HALT, enable ? 0 : 1);
|
||||
WREG32_SOC15_RLC(GC, 0, mmCP_ME_CNTL, tmp);
|
||||
amdgpu_mm_wreg_mmio_rlc(adev, SOC15_REG_OFFSET(GC, 0, mmCP_ME_CNTL), tmp, 0);
|
||||
|
||||
for (i = 0; i < adev->usec_timeout; i++) {
|
||||
if (RREG32_SOC15(GC, 0, mmCP_STAT) == 0)
|
||||
@@ -6540,14 +6542,16 @@ static int gfx_v10_0_hw_init(void *handle)
|
||||
* loaded firstly, so in direct type, it has to load smc ucode
|
||||
* here before rlc.
|
||||
*/
|
||||
r = smu_load_microcode(&adev->smu);
|
||||
if (r)
|
||||
return r;
|
||||
if (adev->smu.ppt_funcs != NULL) {
|
||||
r = smu_load_microcode(&adev->smu);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
r = smu_check_fw_status(&adev->smu);
|
||||
if (r) {
|
||||
pr_err("SMC firmware status is not correct\n");
|
||||
return r;
|
||||
r = smu_check_fw_status(&adev->smu);
|
||||
if (r) {
|
||||
pr_err("SMC firmware status is not correct\n");
|
||||
return r;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7011,7 +7015,7 @@ static int gfx_v10_0_update_gfx_clock_gating(struct amdgpu_device *adev,
|
||||
/* === CGCG /CGLS for GFX 3D Only === */
|
||||
gfx_v10_0_update_3d_clock_gating(adev, enable);
|
||||
/* === MGCG + MGLS === */
|
||||
/* gfx_v10_0_update_medium_grain_clock_gating(adev, enable); */
|
||||
gfx_v10_0_update_medium_grain_clock_gating(adev, enable);
|
||||
}
|
||||
|
||||
if (adev->cg_flags &
|
||||
@@ -7086,6 +7090,20 @@ static const struct amdgpu_rlc_funcs gfx_v10_0_rlc_funcs = {
|
||||
.reset = gfx_v10_0_rlc_reset,
|
||||
.start = gfx_v10_0_rlc_start,
|
||||
.update_spm_vmid = gfx_v10_0_update_spm_vmid,
|
||||
};
|
||||
|
||||
static const struct amdgpu_rlc_funcs gfx_v10_0_rlc_funcs_sriov = {
|
||||
.is_rlc_enabled = gfx_v10_0_is_rlc_enabled,
|
||||
.set_safe_mode = gfx_v10_0_set_safe_mode,
|
||||
.unset_safe_mode = gfx_v10_0_unset_safe_mode,
|
||||
.init = gfx_v10_0_rlc_init,
|
||||
.get_csb_size = gfx_v10_0_get_csb_size,
|
||||
.get_csb_buffer = gfx_v10_0_get_csb_buffer,
|
||||
.resume = gfx_v10_0_rlc_resume,
|
||||
.stop = gfx_v10_0_rlc_stop,
|
||||
.reset = gfx_v10_0_rlc_reset,
|
||||
.start = gfx_v10_0_rlc_start,
|
||||
.update_spm_vmid = gfx_v10_0_update_spm_vmid,
|
||||
.rlcg_wreg = gfx_v10_rlcg_wreg,
|
||||
.is_rlcg_access_range = gfx_v10_0_is_rlcg_access_range,
|
||||
};
|
||||
@@ -7102,11 +7120,7 @@ static int gfx_v10_0_set_powergating_state(void *handle,
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_NAVI10:
|
||||
case CHIP_NAVI14:
|
||||
if (!enable) {
|
||||
amdgpu_gfx_off_ctrl(adev, false);
|
||||
cancel_delayed_work_sync(&adev->gfx.gfx_off_delay_work);
|
||||
} else
|
||||
amdgpu_gfx_off_ctrl(adev, true);
|
||||
amdgpu_gfx_off_ctrl(adev, enable);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -7672,6 +7686,19 @@ static void gfx_v10_0_ring_emit_reg_write_reg_wait(struct amdgpu_ring *ring,
|
||||
ref, mask);
|
||||
}
|
||||
|
||||
static void gfx_v10_0_ring_soft_recovery(struct amdgpu_ring *ring,
|
||||
unsigned vmid)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
uint32_t value = 0;
|
||||
|
||||
value = REG_SET_FIELD(value, SQ_CMD, CMD, 0x03);
|
||||
value = REG_SET_FIELD(value, SQ_CMD, MODE, 0x01);
|
||||
value = REG_SET_FIELD(value, SQ_CMD, CHECK_VMID, 1);
|
||||
value = REG_SET_FIELD(value, SQ_CMD, VM_ID, vmid);
|
||||
WREG32_SOC15(GC, 0, mmSQ_CMD, value);
|
||||
}
|
||||
|
||||
static void
|
||||
gfx_v10_0_set_gfx_eop_interrupt_state(struct amdgpu_device *adev,
|
||||
uint32_t me, uint32_t pipe,
|
||||
@@ -8063,6 +8090,7 @@ static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_gfx = {
|
||||
.emit_wreg = gfx_v10_0_ring_emit_wreg,
|
||||
.emit_reg_wait = gfx_v10_0_ring_emit_reg_wait,
|
||||
.emit_reg_write_reg_wait = gfx_v10_0_ring_emit_reg_write_reg_wait,
|
||||
.soft_recovery = gfx_v10_0_ring_soft_recovery,
|
||||
};
|
||||
|
||||
static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_compute = {
|
||||
@@ -8183,9 +8211,11 @@ static void gfx_v10_0_set_rlc_funcs(struct amdgpu_device *adev)
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_NAVI10:
|
||||
case CHIP_NAVI14:
|
||||
case CHIP_NAVI12:
|
||||
adev->gfx.rlc.funcs = &gfx_v10_0_rlc_funcs;
|
||||
break;
|
||||
case CHIP_NAVI12:
|
||||
adev->gfx.rlc.funcs = &gfx_v10_0_rlc_funcs_sriov;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@@ -507,8 +507,8 @@ static const struct soc15_reg_golden golden_settings_gc_9_0[] =
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSH_MEM_CONFIG, 0x00001000, 0x00001000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_CU_0, 0x0007ffff, 0x00000800),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_CU_1, 0x0007ffff, 0x00000800),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_0, 0x01ffffff, 0x0000ff87),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_1, 0x01ffffff, 0x0000ff8f),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_0, 0x01ffffff, 0x00ffff87),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_1, 0x01ffffff, 0x00ffff8f),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQC_CONFIG, 0x03000000, 0x020a2000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfffffeef, 0x010b0000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x4a2c0e68),
|
||||
@@ -1233,6 +1233,8 @@ static const struct amdgpu_gfxoff_quirk amdgpu_gfxoff_quirk_list[] = {
|
||||
{ 0x1002, 0x15dd, 0x1002, 0x15dd, 0xc8 },
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=207171 */
|
||||
{ 0x1002, 0x15dd, 0x103c, 0x83e7, 0xd3 },
|
||||
/* GFXOFF is unstable on C6 parts with a VBIOS 113-RAVEN-114 */
|
||||
{ 0x1002, 0x15dd, 0x1002, 0x15dd, 0xc6 },
|
||||
{ 0, 0, 0, 0, 0 },
|
||||
};
|
||||
|
||||
@@ -5039,10 +5041,9 @@ static int gfx_v9_0_set_powergating_state(void *handle,
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_RAVEN:
|
||||
case CHIP_RENOIR:
|
||||
if (!enable) {
|
||||
if (!enable)
|
||||
amdgpu_gfx_off_ctrl(adev, false);
|
||||
cancel_delayed_work_sync(&adev->gfx.gfx_off_delay_work);
|
||||
}
|
||||
|
||||
if (adev->pg_flags & AMD_PG_SUPPORT_RLC_SMU_HS) {
|
||||
gfx_v9_0_enable_sck_slow_down_on_power_up(adev, true);
|
||||
gfx_v9_0_enable_sck_slow_down_on_power_down(adev, true);
|
||||
@@ -5066,12 +5067,7 @@ static int gfx_v9_0_set_powergating_state(void *handle,
|
||||
amdgpu_gfx_off_ctrl(adev, true);
|
||||
break;
|
||||
case CHIP_VEGA12:
|
||||
if (!enable) {
|
||||
amdgpu_gfx_off_ctrl(adev, false);
|
||||
cancel_delayed_work_sync(&adev->gfx.gfx_off_delay_work);
|
||||
} else {
|
||||
amdgpu_gfx_off_ctrl(adev, true);
|
||||
}
|
||||
amdgpu_gfx_off_ctrl(adev, enable);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@@ -61,17 +61,6 @@ MODULE_FIRMWARE("amdgpu/si58_mc.bin");
|
||||
#define MC_SEQ_MISC0__MT__HBM 0x60000000
|
||||
#define MC_SEQ_MISC0__MT__DDR3 0xB0000000
|
||||
|
||||
|
||||
static const u32 crtc_offsets[6] =
|
||||
{
|
||||
SI_CRTC0_REGISTER_OFFSET,
|
||||
SI_CRTC1_REGISTER_OFFSET,
|
||||
SI_CRTC2_REGISTER_OFFSET,
|
||||
SI_CRTC3_REGISTER_OFFSET,
|
||||
SI_CRTC4_REGISTER_OFFSET,
|
||||
SI_CRTC5_REGISTER_OFFSET
|
||||
};
|
||||
|
||||
static void gmc_v6_0_mc_stop(struct amdgpu_device *adev)
|
||||
{
|
||||
u32 blackout;
|
||||
|
@@ -762,6 +762,7 @@ static void gmc_v7_0_gart_disable(struct amdgpu_device *adev)
|
||||
* @adev: amdgpu_device pointer
|
||||
* @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
|
||||
* @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
|
||||
* @mc_client: VM_CONTEXT1_PROTECTION_FAULT_MCCLIENT register value
|
||||
*
|
||||
* Print human readable fault information (CIK).
|
||||
*/
|
||||
|
@@ -1005,6 +1005,7 @@ static void gmc_v8_0_gart_disable(struct amdgpu_device *adev)
|
||||
* @adev: amdgpu_device pointer
|
||||
* @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
|
||||
* @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
|
||||
* @mc_client: VM_CONTEXT1_PROTECTION_FAULT_MCCLIENT register value
|
||||
*
|
||||
* Print human readable fault information (VI).
|
||||
*/
|
||||
|
@@ -524,181 +524,6 @@ static int psp_v11_0_mode1_reset(struct psp_context *psp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* TODO: Fill in follow functions once PSP firmware interface for XGMI is ready.
|
||||
* For now, return success and hack the hive_id so high level code can
|
||||
* start testing
|
||||
*/
|
||||
static int psp_v11_0_xgmi_get_topology_info(struct psp_context *psp,
|
||||
int number_devices, struct psp_xgmi_topology_info *topology)
|
||||
{
|
||||
struct ta_xgmi_shared_memory *xgmi_cmd;
|
||||
struct ta_xgmi_cmd_get_topology_info_input *topology_info_input;
|
||||
struct ta_xgmi_cmd_get_topology_info_output *topology_info_output;
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
|
||||
return -EINVAL;
|
||||
|
||||
xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
|
||||
memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
|
||||
|
||||
/* Fill in the shared memory with topology information as input */
|
||||
topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
|
||||
xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO;
|
||||
topology_info_input->num_nodes = number_devices;
|
||||
|
||||
for (i = 0; i < topology_info_input->num_nodes; i++) {
|
||||
topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
|
||||
topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
|
||||
topology_info_input->nodes[i].is_sharing_enabled = topology->nodes[i].is_sharing_enabled;
|
||||
topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
|
||||
}
|
||||
|
||||
/* Invoke xgmi ta to get the topology information */
|
||||
ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Read the output topology information from the shared memory */
|
||||
topology_info_output = &xgmi_cmd->xgmi_out_message.get_topology_info;
|
||||
topology->num_nodes = xgmi_cmd->xgmi_out_message.get_topology_info.num_nodes;
|
||||
for (i = 0; i < topology->num_nodes; i++) {
|
||||
topology->nodes[i].node_id = topology_info_output->nodes[i].node_id;
|
||||
topology->nodes[i].num_hops = topology_info_output->nodes[i].num_hops;
|
||||
topology->nodes[i].is_sharing_enabled = topology_info_output->nodes[i].is_sharing_enabled;
|
||||
topology->nodes[i].sdma_engine = topology_info_output->nodes[i].sdma_engine;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int psp_v11_0_xgmi_set_topology_info(struct psp_context *psp,
|
||||
int number_devices, struct psp_xgmi_topology_info *topology)
|
||||
{
|
||||
struct ta_xgmi_shared_memory *xgmi_cmd;
|
||||
struct ta_xgmi_cmd_get_topology_info_input *topology_info_input;
|
||||
int i;
|
||||
|
||||
if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
|
||||
return -EINVAL;
|
||||
|
||||
xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
|
||||
memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
|
||||
|
||||
topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
|
||||
xgmi_cmd->cmd_id = TA_COMMAND_XGMI__SET_TOPOLOGY_INFO;
|
||||
topology_info_input->num_nodes = number_devices;
|
||||
|
||||
for (i = 0; i < topology_info_input->num_nodes; i++) {
|
||||
topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
|
||||
topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
|
||||
topology_info_input->nodes[i].is_sharing_enabled = 1;
|
||||
topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
|
||||
}
|
||||
|
||||
/* Invoke xgmi ta to set topology information */
|
||||
return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO);
|
||||
}
|
||||
|
||||
static int psp_v11_0_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id)
|
||||
{
|
||||
struct ta_xgmi_shared_memory *xgmi_cmd;
|
||||
int ret;
|
||||
|
||||
xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
|
||||
memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
|
||||
|
||||
xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_HIVE_ID;
|
||||
|
||||
/* Invoke xgmi ta to get hive id */
|
||||
ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
*hive_id = xgmi_cmd->xgmi_out_message.get_hive_id.hive_id;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int psp_v11_0_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id)
|
||||
{
|
||||
struct ta_xgmi_shared_memory *xgmi_cmd;
|
||||
int ret;
|
||||
|
||||
xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
|
||||
memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
|
||||
|
||||
xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_NODE_ID;
|
||||
|
||||
/* Invoke xgmi ta to get the node id */
|
||||
ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
*node_id = xgmi_cmd->xgmi_out_message.get_node_id.node_id;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int psp_v11_0_ras_trigger_error(struct psp_context *psp,
|
||||
struct ta_ras_trigger_error_input *info)
|
||||
{
|
||||
struct ta_ras_shared_memory *ras_cmd;
|
||||
int ret;
|
||||
|
||||
if (!psp->ras.ras_initialized)
|
||||
return -EINVAL;
|
||||
|
||||
ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf;
|
||||
memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory));
|
||||
|
||||
ras_cmd->cmd_id = TA_RAS_COMMAND__TRIGGER_ERROR;
|
||||
ras_cmd->ras_in_message.trigger_error = *info;
|
||||
|
||||
ret = psp_ras_invoke(psp, ras_cmd->cmd_id);
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
|
||||
/* If err_event_athub occurs error inject was successful, however
|
||||
return status from TA is no long reliable */
|
||||
if (amdgpu_ras_intr_triggered())
|
||||
return 0;
|
||||
|
||||
return ras_cmd->ras_status;
|
||||
}
|
||||
|
||||
static int psp_v11_0_ras_cure_posion(struct psp_context *psp, uint64_t *mode_ptr)
|
||||
{
|
||||
#if 0
|
||||
// not support yet.
|
||||
struct ta_ras_shared_memory *ras_cmd;
|
||||
int ret;
|
||||
|
||||
if (!psp->ras.ras_initialized)
|
||||
return -EINVAL;
|
||||
|
||||
ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf;
|
||||
memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory));
|
||||
|
||||
ras_cmd->cmd_id = TA_RAS_COMMAND__CURE_POISON;
|
||||
ras_cmd->ras_in_message.cure_poison.mode_ptr = mode_ptr;
|
||||
|
||||
ret = psp_ras_invoke(psp, ras_cmd->cmd_id);
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
|
||||
return ras_cmd->ras_status;
|
||||
#else
|
||||
return -EINVAL;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int psp_v11_0_rlc_autoload_start(struct psp_context *psp)
|
||||
{
|
||||
return psp_rlc_autoload_start(psp);
|
||||
}
|
||||
|
||||
static int psp_v11_0_memory_training_send_msg(struct psp_context *psp, int msg)
|
||||
{
|
||||
int ret;
|
||||
@@ -995,13 +820,6 @@ static const struct psp_funcs psp_v11_0_funcs = {
|
||||
.ring_stop = psp_v11_0_ring_stop,
|
||||
.ring_destroy = psp_v11_0_ring_destroy,
|
||||
.mode1_reset = psp_v11_0_mode1_reset,
|
||||
.xgmi_get_topology_info = psp_v11_0_xgmi_get_topology_info,
|
||||
.xgmi_set_topology_info = psp_v11_0_xgmi_set_topology_info,
|
||||
.xgmi_get_hive_id = psp_v11_0_xgmi_get_hive_id,
|
||||
.xgmi_get_node_id = psp_v11_0_xgmi_get_node_id,
|
||||
.ras_trigger_error = psp_v11_0_ras_trigger_error,
|
||||
.ras_cure_posion = psp_v11_0_ras_cure_posion,
|
||||
.rlc_autoload_start = psp_v11_0_rlc_autoload_start,
|
||||
.mem_training_init = psp_v11_0_memory_training_init,
|
||||
.mem_training_fini = psp_v11_0_memory_training_fini,
|
||||
.mem_training = psp_v11_0_memory_training,
|
||||
|
@@ -24,6 +24,8 @@
|
||||
#ifndef _TA_RAS_IF_H
|
||||
#define _TA_RAS_IF_H
|
||||
|
||||
#define RAS_TA_HOST_IF_VER 0
|
||||
|
||||
/* Responses have bit 31 set */
|
||||
#define RSP_ID_MASK (1U << 31)
|
||||
#define RSP_ID(cmdId) (((uint32_t)(cmdId)) | RSP_ID_MASK)
|
||||
@@ -36,18 +38,24 @@ enum ras_command {
|
||||
TA_RAS_COMMAND__TRIGGER_ERROR,
|
||||
};
|
||||
|
||||
enum ta_ras_status {
|
||||
TA_RAS_STATUS__SUCCESS = 0x00,
|
||||
TA_RAS_STATUS__RESET_NEEDED = 0x01,
|
||||
TA_RAS_STATUS__ERROR_INVALID_PARAMETER = 0x02,
|
||||
TA_RAS_STATUS__ERROR_RAS_NOT_AVAILABLE = 0x03,
|
||||
TA_RAS_STATUS__ERROR_RAS_DUPLICATE_CMD = 0x04,
|
||||
TA_RAS_STATUS__ERROR_INJECTION_FAILED = 0x05,
|
||||
TA_RAS_STATUS__ERROR_ASD_READ_WRITE = 0x06,
|
||||
TA_RAS_STATUS__ERROR_TOGGLE_DF_CSTATE = 0x07,
|
||||
TA_RAS_STATUS__ERROR_TIMEOUT = 0x08,
|
||||
TA_RAS_STATUS__ERROR_BLOCK_DISABLED = 0x09,
|
||||
TA_RAS_STATUS__ERROR_GENERIC = 0x10,
|
||||
enum ta_ras_status
|
||||
{
|
||||
TA_RAS_STATUS__SUCCESS = 0x00,
|
||||
TA_RAS_STATUS__RESET_NEEDED = 0xA001,
|
||||
TA_RAS_STATUS__ERROR_INVALID_PARAMETER = 0xA002,
|
||||
TA_RAS_STATUS__ERROR_RAS_NOT_AVAILABLE = 0xA003,
|
||||
TA_RAS_STATUS__ERROR_RAS_DUPLICATE_CMD = 0xA004,
|
||||
TA_RAS_STATUS__ERROR_INJECTION_FAILED = 0xA005,
|
||||
TA_RAS_STATUS__ERROR_ASD_READ_WRITE = 0xA006,
|
||||
TA_RAS_STATUS__ERROR_TOGGLE_DF_CSTATE = 0xA007,
|
||||
TA_RAS_STATUS__ERROR_TIMEOUT = 0xA008,
|
||||
TA_RAS_STATUS__ERROR_BLOCK_DISABLED = 0XA009,
|
||||
TA_RAS_STATUS__ERROR_GENERIC = 0xA00A,
|
||||
TA_RAS_STATUS__ERROR_RAS_MMHUB_INIT = 0xA00B,
|
||||
TA_RAS_STATUS__ERROR_GET_DEV_INFO = 0xA00C,
|
||||
TA_RAS_STATUS__ERROR_UNSUPPORTED_DEV = 0xA00D,
|
||||
TA_RAS_STATUS__ERROR_NOT_INITIALIZED = 0xA00E,
|
||||
TA_RAS_STATUS__ERROR_TEE_INTERNAL = 0xA00F
|
||||
};
|
||||
|
||||
enum ta_ras_block {
|
||||
@@ -97,22 +105,39 @@ struct ta_ras_trigger_error_input {
|
||||
uint64_t value; // method if error injection. i.e persistent, coherent etc.
|
||||
};
|
||||
|
||||
struct ta_ras_output_flags
|
||||
{
|
||||
uint8_t ras_init_success_flag;
|
||||
uint8_t err_inject_switch_disable_flag;
|
||||
uint8_t reg_access_failure_flag;
|
||||
};
|
||||
|
||||
/* Common input structure for RAS callbacks */
|
||||
/**********************************************************/
|
||||
union ta_ras_cmd_input {
|
||||
struct ta_ras_enable_features_input enable_features;
|
||||
struct ta_ras_disable_features_input disable_features;
|
||||
struct ta_ras_trigger_error_input trigger_error;
|
||||
|
||||
uint32_t reserve_pad[256];
|
||||
};
|
||||
|
||||
union ta_ras_cmd_output
|
||||
{
|
||||
struct ta_ras_output_flags flags;
|
||||
|
||||
uint32_t reserve_pad[256];
|
||||
};
|
||||
|
||||
/* Shared Memory structures */
|
||||
/**********************************************************/
|
||||
struct ta_ras_shared_memory {
|
||||
uint32_t cmd_id;
|
||||
uint32_t resp_id;
|
||||
enum ta_ras_status ras_status;
|
||||
uint32_t reserved;
|
||||
union ta_ras_cmd_input ras_in_message;
|
||||
uint32_t cmd_id;
|
||||
uint32_t resp_id;
|
||||
uint32_t ras_status;
|
||||
uint32_t if_version;
|
||||
union ta_ras_cmd_input ras_in_message;
|
||||
union ta_ras_cmd_output ras_out_message;
|
||||
};
|
||||
|
||||
#endif // TL_RAS_IF_H_
|
||||
|
@@ -1845,7 +1845,6 @@ static int vcn_v2_0_start_sriov(struct amdgpu_device *adev)
|
||||
uint32_t table_size = 0;
|
||||
struct mmsch_v2_0_cmd_direct_write direct_wt = { {0} };
|
||||
struct mmsch_v2_0_cmd_direct_read_modify_write direct_rd_mod_wt = { {0} };
|
||||
struct mmsch_v2_0_cmd_direct_polling direct_poll = { {0} };
|
||||
struct mmsch_v2_0_cmd_end end = { {0} };
|
||||
struct mmsch_v2_0_init_header *header;
|
||||
uint32_t *init_table = adev->virt.mm_table.cpu_addr;
|
||||
@@ -1855,8 +1854,6 @@ static int vcn_v2_0_start_sriov(struct amdgpu_device *adev)
|
||||
direct_wt.cmd_header.command_type = MMSCH_COMMAND__DIRECT_REG_WRITE;
|
||||
direct_rd_mod_wt.cmd_header.command_type =
|
||||
MMSCH_COMMAND__DIRECT_REG_READ_MODIFY_WRITE;
|
||||
direct_poll.cmd_header.command_type =
|
||||
MMSCH_COMMAND__DIRECT_REG_POLLING;
|
||||
end.cmd_header.command_type = MMSCH_COMMAND__END;
|
||||
|
||||
if (header->vcn_table_offset == 0 && header->vcn_table_size == 0) {
|
||||
|
@@ -86,7 +86,7 @@ static int vcn_v2_5_early_init(void *handle)
|
||||
|
||||
adev->vcn.num_vcn_inst = VCN25_MAX_HW_INSTANCES_ARCTURUS;
|
||||
for (i = 0; i < adev->vcn.num_vcn_inst; i++) {
|
||||
harvest = RREG32_SOC15(UVD, i, mmCC_UVD_HARVESTING);
|
||||
harvest = RREG32_SOC15(VCN, i, mmCC_UVD_HARVESTING);
|
||||
if (harvest & CC_UVD_HARVESTING__UVD_DISABLE_MASK)
|
||||
adev->vcn.harvest_config |= 1 << i;
|
||||
}
|
||||
@@ -177,15 +177,15 @@ static int vcn_v2_5_sw_init(void *handle)
|
||||
adev->vcn.internal.gp_scratch8 = mmUVD_GP_SCRATCH8_INTERNAL_OFFSET;
|
||||
|
||||
adev->vcn.internal.scratch9 = mmUVD_SCRATCH9_INTERNAL_OFFSET;
|
||||
adev->vcn.inst[j].external.scratch9 = SOC15_REG_OFFSET(UVD, j, mmUVD_SCRATCH9);
|
||||
adev->vcn.inst[j].external.scratch9 = SOC15_REG_OFFSET(VCN, j, mmUVD_SCRATCH9);
|
||||
adev->vcn.internal.data0 = mmUVD_GPCOM_VCPU_DATA0_INTERNAL_OFFSET;
|
||||
adev->vcn.inst[j].external.data0 = SOC15_REG_OFFSET(UVD, j, mmUVD_GPCOM_VCPU_DATA0);
|
||||
adev->vcn.inst[j].external.data0 = SOC15_REG_OFFSET(VCN, j, mmUVD_GPCOM_VCPU_DATA0);
|
||||
adev->vcn.internal.data1 = mmUVD_GPCOM_VCPU_DATA1_INTERNAL_OFFSET;
|
||||
adev->vcn.inst[j].external.data1 = SOC15_REG_OFFSET(UVD, j, mmUVD_GPCOM_VCPU_DATA1);
|
||||
adev->vcn.inst[j].external.data1 = SOC15_REG_OFFSET(VCN, j, mmUVD_GPCOM_VCPU_DATA1);
|
||||
adev->vcn.internal.cmd = mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET;
|
||||
adev->vcn.inst[j].external.cmd = SOC15_REG_OFFSET(UVD, j, mmUVD_GPCOM_VCPU_CMD);
|
||||
adev->vcn.inst[j].external.cmd = SOC15_REG_OFFSET(VCN, j, mmUVD_GPCOM_VCPU_CMD);
|
||||
adev->vcn.internal.nop = mmUVD_NO_OP_INTERNAL_OFFSET;
|
||||
adev->vcn.inst[j].external.nop = SOC15_REG_OFFSET(UVD, j, mmUVD_NO_OP);
|
||||
adev->vcn.inst[j].external.nop = SOC15_REG_OFFSET(VCN, j, mmUVD_NO_OP);
|
||||
|
||||
ring = &adev->vcn.inst[j].ring_dec;
|
||||
ring->use_doorbell = true;
|
||||
@@ -399,46 +399,46 @@ static void vcn_v2_5_mc_resume(struct amdgpu_device *adev)
|
||||
continue;
|
||||
/* cache window 0: fw */
|
||||
if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
|
||||
WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,
|
||||
WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,
|
||||
(adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + i].tmr_mc_addr_lo));
|
||||
WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,
|
||||
WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,
|
||||
(adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + i].tmr_mc_addr_hi));
|
||||
WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_OFFSET0, 0);
|
||||
WREG32_SOC15(VCN, i, mmUVD_VCPU_CACHE_OFFSET0, 0);
|
||||
offset = 0;
|
||||
} else {
|
||||
WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,
|
||||
WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,
|
||||
lower_32_bits(adev->vcn.inst[i].gpu_addr));
|
||||
WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,
|
||||
WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,
|
||||
upper_32_bits(adev->vcn.inst[i].gpu_addr));
|
||||
offset = size;
|
||||
WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_OFFSET0,
|
||||
WREG32_SOC15(VCN, i, mmUVD_VCPU_CACHE_OFFSET0,
|
||||
AMDGPU_UVD_FIRMWARE_OFFSET >> 3);
|
||||
}
|
||||
WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_SIZE0, size);
|
||||
WREG32_SOC15(VCN, i, mmUVD_VCPU_CACHE_SIZE0, size);
|
||||
|
||||
/* cache window 1: stack */
|
||||
WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW,
|
||||
WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW,
|
||||
lower_32_bits(adev->vcn.inst[i].gpu_addr + offset));
|
||||
WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH,
|
||||
WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH,
|
||||
upper_32_bits(adev->vcn.inst[i].gpu_addr + offset));
|
||||
WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_OFFSET1, 0);
|
||||
WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_SIZE1, AMDGPU_VCN_STACK_SIZE);
|
||||
WREG32_SOC15(VCN, i, mmUVD_VCPU_CACHE_OFFSET1, 0);
|
||||
WREG32_SOC15(VCN, i, mmUVD_VCPU_CACHE_SIZE1, AMDGPU_VCN_STACK_SIZE);
|
||||
|
||||
/* cache window 2: context */
|
||||
WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW,
|
||||
WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW,
|
||||
lower_32_bits(adev->vcn.inst[i].gpu_addr + offset + AMDGPU_VCN_STACK_SIZE));
|
||||
WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH,
|
||||
WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH,
|
||||
upper_32_bits(adev->vcn.inst[i].gpu_addr + offset + AMDGPU_VCN_STACK_SIZE));
|
||||
WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_OFFSET2, 0);
|
||||
WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_SIZE2, AMDGPU_VCN_CONTEXT_SIZE);
|
||||
WREG32_SOC15(VCN, i, mmUVD_VCPU_CACHE_OFFSET2, 0);
|
||||
WREG32_SOC15(VCN, i, mmUVD_VCPU_CACHE_SIZE2, AMDGPU_VCN_CONTEXT_SIZE);
|
||||
|
||||
/* non-cache window */
|
||||
WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_NC0_64BIT_BAR_LOW,
|
||||
WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_NC0_64BIT_BAR_LOW,
|
||||
lower_32_bits(adev->vcn.inst[i].fw_shared_gpu_addr));
|
||||
WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH,
|
||||
WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH,
|
||||
upper_32_bits(adev->vcn.inst[i].fw_shared_gpu_addr));
|
||||
WREG32_SOC15(UVD, i, mmUVD_VCPU_NONCACHE_OFFSET0, 0);
|
||||
WREG32_SOC15(UVD, i, mmUVD_VCPU_NONCACHE_SIZE0,
|
||||
WREG32_SOC15(VCN, i, mmUVD_VCPU_NONCACHE_OFFSET0, 0);
|
||||
WREG32_SOC15(VCN, i, mmUVD_VCPU_NONCACHE_SIZE0,
|
||||
AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_fw_shared)));
|
||||
}
|
||||
}
|
||||
@@ -452,91 +452,91 @@ static void vcn_v2_5_mc_resume_dpg_mode(struct amdgpu_device *adev, int inst_idx
|
||||
if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
|
||||
if (!indirect) {
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),
|
||||
VCN, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),
|
||||
(adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + inst_idx].tmr_mc_addr_lo), 0, indirect);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),
|
||||
VCN, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),
|
||||
(adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + inst_idx].tmr_mc_addr_hi), 0, indirect);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_VCPU_CACHE_OFFSET0), 0, 0, indirect);
|
||||
VCN, 0, mmUVD_VCPU_CACHE_OFFSET0), 0, 0, indirect);
|
||||
} else {
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), 0, 0, indirect);
|
||||
VCN, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), 0, 0, indirect);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), 0, 0, indirect);
|
||||
VCN, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), 0, 0, indirect);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_VCPU_CACHE_OFFSET0), 0, 0, indirect);
|
||||
VCN, 0, mmUVD_VCPU_CACHE_OFFSET0), 0, 0, indirect);
|
||||
}
|
||||
offset = 0;
|
||||
} else {
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),
|
||||
VCN, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),
|
||||
lower_32_bits(adev->vcn.inst[inst_idx].gpu_addr), 0, indirect);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),
|
||||
VCN, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),
|
||||
upper_32_bits(adev->vcn.inst[inst_idx].gpu_addr), 0, indirect);
|
||||
offset = size;
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_VCPU_CACHE_OFFSET0),
|
||||
VCN, 0, mmUVD_VCPU_CACHE_OFFSET0),
|
||||
AMDGPU_UVD_FIRMWARE_OFFSET >> 3, 0, indirect);
|
||||
}
|
||||
|
||||
if (!indirect)
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_VCPU_CACHE_SIZE0), size, 0, indirect);
|
||||
VCN, 0, mmUVD_VCPU_CACHE_SIZE0), size, 0, indirect);
|
||||
else
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_VCPU_CACHE_SIZE0), 0, 0, indirect);
|
||||
VCN, 0, mmUVD_VCPU_CACHE_SIZE0), 0, 0, indirect);
|
||||
|
||||
/* cache window 1: stack */
|
||||
if (!indirect) {
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW),
|
||||
VCN, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW),
|
||||
lower_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset), 0, indirect);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH),
|
||||
VCN, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH),
|
||||
upper_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset), 0, indirect);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_VCPU_CACHE_OFFSET1), 0, 0, indirect);
|
||||
VCN, 0, mmUVD_VCPU_CACHE_OFFSET1), 0, 0, indirect);
|
||||
} else {
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW), 0, 0, indirect);
|
||||
VCN, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW), 0, 0, indirect);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH), 0, 0, indirect);
|
||||
VCN, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH), 0, 0, indirect);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_VCPU_CACHE_OFFSET1), 0, 0, indirect);
|
||||
VCN, 0, mmUVD_VCPU_CACHE_OFFSET1), 0, 0, indirect);
|
||||
}
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_VCPU_CACHE_SIZE1), AMDGPU_VCN_STACK_SIZE, 0, indirect);
|
||||
VCN, 0, mmUVD_VCPU_CACHE_SIZE1), AMDGPU_VCN_STACK_SIZE, 0, indirect);
|
||||
|
||||
/* cache window 2: context */
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW),
|
||||
VCN, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW),
|
||||
lower_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset + AMDGPU_VCN_STACK_SIZE), 0, indirect);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH),
|
||||
VCN, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH),
|
||||
upper_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset + AMDGPU_VCN_STACK_SIZE), 0, indirect);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_VCPU_CACHE_OFFSET2), 0, 0, indirect);
|
||||
VCN, 0, mmUVD_VCPU_CACHE_OFFSET2), 0, 0, indirect);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_VCPU_CACHE_SIZE2), AMDGPU_VCN_CONTEXT_SIZE, 0, indirect);
|
||||
VCN, 0, mmUVD_VCPU_CACHE_SIZE2), AMDGPU_VCN_CONTEXT_SIZE, 0, indirect);
|
||||
|
||||
/* non-cache window */
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_LMI_VCPU_NC0_64BIT_BAR_LOW),
|
||||
VCN, 0, mmUVD_LMI_VCPU_NC0_64BIT_BAR_LOW),
|
||||
lower_32_bits(adev->vcn.inst[inst_idx].fw_shared_gpu_addr), 0, indirect);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH),
|
||||
VCN, 0, mmUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH),
|
||||
upper_32_bits(adev->vcn.inst[inst_idx].fw_shared_gpu_addr), 0, indirect);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_VCPU_NONCACHE_OFFSET0), 0, 0, indirect);
|
||||
VCN, 0, mmUVD_VCPU_NONCACHE_OFFSET0), 0, 0, indirect);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_VCPU_NONCACHE_SIZE0),
|
||||
VCN, 0, mmUVD_VCPU_NONCACHE_SIZE0),
|
||||
AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_fw_shared)), 0, indirect);
|
||||
|
||||
/* VCN global tiling registers */
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_GFX8_ADDR_CONFIG), adev->gfx.config.gb_addr_config, 0, indirect);
|
||||
VCN, 0, mmUVD_GFX8_ADDR_CONFIG), adev->gfx.config.gb_addr_config, 0, indirect);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -690,19 +690,19 @@ static void vcn_v2_5_clock_gating_dpg_mode(struct amdgpu_device *adev,
|
||||
UVD_CGC_CTRL__VCPU_MODE_MASK |
|
||||
UVD_CGC_CTRL__MMSCH_MODE_MASK);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_CGC_CTRL), reg_data, sram_sel, indirect);
|
||||
VCN, 0, mmUVD_CGC_CTRL), reg_data, sram_sel, indirect);
|
||||
|
||||
/* turn off clock gating */
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_CGC_GATE), 0, sram_sel, indirect);
|
||||
VCN, 0, mmUVD_CGC_GATE), 0, sram_sel, indirect);
|
||||
|
||||
/* turn on SUVD clock gating */
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_SUVD_CGC_GATE), 1, sram_sel, indirect);
|
||||
VCN, 0, mmUVD_SUVD_CGC_GATE), 1, sram_sel, indirect);
|
||||
|
||||
/* turn on sw mode in UVD_SUVD_CGC_CTRL */
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_SUVD_CGC_CTRL), 0, sram_sel, indirect);
|
||||
VCN, 0, mmUVD_SUVD_CGC_CTRL), 0, sram_sel, indirect);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -774,13 +774,13 @@ static int vcn_v2_5_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boo
|
||||
uint32_t rb_bufsz, tmp;
|
||||
|
||||
/* disable register anti-hang mechanism */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, inst_idx, mmUVD_POWER_STATUS), 1,
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS), 1,
|
||||
~UVD_POWER_STATUS__UVD_POWER_STATUS_MASK);
|
||||
/* enable dynamic power gating mode */
|
||||
tmp = RREG32_SOC15(UVD, inst_idx, mmUVD_POWER_STATUS);
|
||||
tmp = RREG32_SOC15(VCN, inst_idx, mmUVD_POWER_STATUS);
|
||||
tmp |= UVD_POWER_STATUS__UVD_PG_MODE_MASK;
|
||||
tmp |= UVD_POWER_STATUS__UVD_PG_EN_MASK;
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_POWER_STATUS, tmp);
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_POWER_STATUS, tmp);
|
||||
|
||||
if (indirect)
|
||||
adev->vcn.inst[inst_idx].dpg_sram_curr_addr = (uint32_t*)adev->vcn.inst[inst_idx].dpg_sram_cpu_addr;
|
||||
@@ -793,11 +793,11 @@ static int vcn_v2_5_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boo
|
||||
tmp |= UVD_VCPU_CNTL__CLK_EN_MASK;
|
||||
tmp |= UVD_VCPU_CNTL__BLK_RST_MASK;
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_VCPU_CNTL), tmp, 0, indirect);
|
||||
VCN, 0, mmUVD_VCPU_CNTL), tmp, 0, indirect);
|
||||
|
||||
/* disable master interupt */
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_MASTINT_EN), 0, 0, indirect);
|
||||
VCN, 0, mmUVD_MASTINT_EN), 0, 0, indirect);
|
||||
|
||||
/* setup mmUVD_LMI_CTRL */
|
||||
tmp = (0x8 | UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK |
|
||||
@@ -809,28 +809,28 @@ static int vcn_v2_5_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boo
|
||||
(8 << UVD_LMI_CTRL__WRITE_CLEAN_TIMER__SHIFT) |
|
||||
0x00100000L);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_LMI_CTRL), tmp, 0, indirect);
|
||||
VCN, 0, mmUVD_LMI_CTRL), tmp, 0, indirect);
|
||||
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_MPC_CNTL),
|
||||
VCN, 0, mmUVD_MPC_CNTL),
|
||||
0x2 << UVD_MPC_CNTL__REPLACEMENT_MODE__SHIFT, 0, indirect);
|
||||
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_MPC_SET_MUXA0),
|
||||
VCN, 0, mmUVD_MPC_SET_MUXA0),
|
||||
((0x1 << UVD_MPC_SET_MUXA0__VARA_1__SHIFT) |
|
||||
(0x2 << UVD_MPC_SET_MUXA0__VARA_2__SHIFT) |
|
||||
(0x3 << UVD_MPC_SET_MUXA0__VARA_3__SHIFT) |
|
||||
(0x4 << UVD_MPC_SET_MUXA0__VARA_4__SHIFT)), 0, indirect);
|
||||
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_MPC_SET_MUXB0),
|
||||
VCN, 0, mmUVD_MPC_SET_MUXB0),
|
||||
((0x1 << UVD_MPC_SET_MUXB0__VARB_1__SHIFT) |
|
||||
(0x2 << UVD_MPC_SET_MUXB0__VARB_2__SHIFT) |
|
||||
(0x3 << UVD_MPC_SET_MUXB0__VARB_3__SHIFT) |
|
||||
(0x4 << UVD_MPC_SET_MUXB0__VARB_4__SHIFT)), 0, indirect);
|
||||
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_MPC_SET_MUX),
|
||||
VCN, 0, mmUVD_MPC_SET_MUX),
|
||||
((0x0 << UVD_MPC_SET_MUX__SET_0__SHIFT) |
|
||||
(0x1 << UVD_MPC_SET_MUX__SET_1__SHIFT) |
|
||||
(0x2 << UVD_MPC_SET_MUX__SET_2__SHIFT)), 0, indirect);
|
||||
@@ -838,26 +838,26 @@ static int vcn_v2_5_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boo
|
||||
vcn_v2_5_mc_resume_dpg_mode(adev, inst_idx, indirect);
|
||||
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_REG_XX_MASK), 0x10, 0, indirect);
|
||||
VCN, 0, mmUVD_REG_XX_MASK), 0x10, 0, indirect);
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_RBC_XX_IB_REG_CHECK), 0x3, 0, indirect);
|
||||
VCN, 0, mmUVD_RBC_XX_IB_REG_CHECK), 0x3, 0, indirect);
|
||||
|
||||
/* enable LMI MC and UMC channels */
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_LMI_CTRL2), 0, 0, indirect);
|
||||
VCN, 0, mmUVD_LMI_CTRL2), 0, 0, indirect);
|
||||
|
||||
/* unblock VCPU register access */
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_RB_ARB_CTRL), 0, 0, indirect);
|
||||
VCN, 0, mmUVD_RB_ARB_CTRL), 0, 0, indirect);
|
||||
|
||||
tmp = (0xFF << UVD_VCPU_CNTL__PRB_TIMEOUT_VAL__SHIFT);
|
||||
tmp |= UVD_VCPU_CNTL__CLK_EN_MASK;
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_VCPU_CNTL), tmp, 0, indirect);
|
||||
VCN, 0, mmUVD_VCPU_CNTL), tmp, 0, indirect);
|
||||
|
||||
/* enable master interrupt */
|
||||
WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0(
|
||||
UVD, 0, mmUVD_MASTINT_EN),
|
||||
VCN, 0, mmUVD_MASTINT_EN),
|
||||
UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect);
|
||||
|
||||
if (indirect)
|
||||
@@ -873,39 +873,39 @@ static int vcn_v2_5_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boo
|
||||
tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_FETCH, 1);
|
||||
tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_UPDATE, 1);
|
||||
tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1);
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_RBC_RB_CNTL, tmp);
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_CNTL, tmp);
|
||||
|
||||
/* Stall DPG before WPTR/RPTR reset */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, inst_idx, mmUVD_POWER_STATUS),
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS),
|
||||
UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK,
|
||||
~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK);
|
||||
fw_shared->multi_queue.decode_queue_mode |= FW_QUEUE_RING_RESET;
|
||||
|
||||
/* set the write pointer delay */
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_RBC_RB_WPTR_CNTL, 0);
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_WPTR_CNTL, 0);
|
||||
|
||||
/* set the wb address */
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_RBC_RB_RPTR_ADDR,
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_RPTR_ADDR,
|
||||
(upper_32_bits(ring->gpu_addr) >> 2));
|
||||
|
||||
/* programm the RB_BASE for ring buffer */
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_LMI_RBC_RB_64BIT_BAR_LOW,
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_LMI_RBC_RB_64BIT_BAR_LOW,
|
||||
lower_32_bits(ring->gpu_addr));
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH,
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH,
|
||||
upper_32_bits(ring->gpu_addr));
|
||||
|
||||
/* Initialize the ring buffer's read and write pointers */
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_RBC_RB_RPTR, 0);
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_RPTR, 0);
|
||||
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_SCRATCH2, 0);
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_SCRATCH2, 0);
|
||||
|
||||
ring->wptr = RREG32_SOC15(UVD, inst_idx, mmUVD_RBC_RB_RPTR);
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_RBC_RB_WPTR,
|
||||
ring->wptr = RREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_RPTR);
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_WPTR,
|
||||
lower_32_bits(ring->wptr));
|
||||
|
||||
fw_shared->multi_queue.decode_queue_mode &= ~FW_QUEUE_RING_RESET;
|
||||
/* Unstall DPG */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, inst_idx, mmUVD_POWER_STATUS),
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS),
|
||||
0, ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK);
|
||||
|
||||
return 0;
|
||||
@@ -929,12 +929,12 @@ static int vcn_v2_5_start(struct amdgpu_device *adev)
|
||||
}
|
||||
|
||||
/* disable register anti-hang mechanism */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_POWER_STATUS), 0,
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_POWER_STATUS), 0,
|
||||
~UVD_POWER_STATUS__UVD_POWER_STATUS_MASK);
|
||||
|
||||
/* set uvd status busy */
|
||||
tmp = RREG32_SOC15(UVD, i, mmUVD_STATUS) | UVD_STATUS__UVD_BUSY;
|
||||
WREG32_SOC15(UVD, i, mmUVD_STATUS, tmp);
|
||||
tmp = RREG32_SOC15(VCN, i, mmUVD_STATUS) | UVD_STATUS__UVD_BUSY;
|
||||
WREG32_SOC15(VCN, i, mmUVD_STATUS, tmp);
|
||||
}
|
||||
|
||||
if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)
|
||||
@@ -947,44 +947,44 @@ static int vcn_v2_5_start(struct amdgpu_device *adev)
|
||||
if (adev->vcn.harvest_config & (1 << i))
|
||||
continue;
|
||||
/* enable VCPU clock */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CNTL),
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CNTL),
|
||||
UVD_VCPU_CNTL__CLK_EN_MASK, ~UVD_VCPU_CNTL__CLK_EN_MASK);
|
||||
|
||||
/* disable master interrupt */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_MASTINT_EN), 0,
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_MASTINT_EN), 0,
|
||||
~UVD_MASTINT_EN__VCPU_EN_MASK);
|
||||
|
||||
/* setup mmUVD_LMI_CTRL */
|
||||
tmp = RREG32_SOC15(UVD, i, mmUVD_LMI_CTRL);
|
||||
tmp = RREG32_SOC15(VCN, i, mmUVD_LMI_CTRL);
|
||||
tmp &= ~0xff;
|
||||
WREG32_SOC15(UVD, i, mmUVD_LMI_CTRL, tmp | 0x8|
|
||||
WREG32_SOC15(VCN, i, mmUVD_LMI_CTRL, tmp | 0x8|
|
||||
UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK |
|
||||
UVD_LMI_CTRL__MASK_MC_URGENT_MASK |
|
||||
UVD_LMI_CTRL__DATA_COHERENCY_EN_MASK |
|
||||
UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN_MASK);
|
||||
|
||||
/* setup mmUVD_MPC_CNTL */
|
||||
tmp = RREG32_SOC15(UVD, i, mmUVD_MPC_CNTL);
|
||||
tmp = RREG32_SOC15(VCN, i, mmUVD_MPC_CNTL);
|
||||
tmp &= ~UVD_MPC_CNTL__REPLACEMENT_MODE_MASK;
|
||||
tmp |= 0x2 << UVD_MPC_CNTL__REPLACEMENT_MODE__SHIFT;
|
||||
WREG32_SOC15(VCN, i, mmUVD_MPC_CNTL, tmp);
|
||||
|
||||
/* setup UVD_MPC_SET_MUXA0 */
|
||||
WREG32_SOC15(UVD, i, mmUVD_MPC_SET_MUXA0,
|
||||
WREG32_SOC15(VCN, i, mmUVD_MPC_SET_MUXA0,
|
||||
((0x1 << UVD_MPC_SET_MUXA0__VARA_1__SHIFT) |
|
||||
(0x2 << UVD_MPC_SET_MUXA0__VARA_2__SHIFT) |
|
||||
(0x3 << UVD_MPC_SET_MUXA0__VARA_3__SHIFT) |
|
||||
(0x4 << UVD_MPC_SET_MUXA0__VARA_4__SHIFT)));
|
||||
|
||||
/* setup UVD_MPC_SET_MUXB0 */
|
||||
WREG32_SOC15(UVD, i, mmUVD_MPC_SET_MUXB0,
|
||||
WREG32_SOC15(VCN, i, mmUVD_MPC_SET_MUXB0,
|
||||
((0x1 << UVD_MPC_SET_MUXB0__VARB_1__SHIFT) |
|
||||
(0x2 << UVD_MPC_SET_MUXB0__VARB_2__SHIFT) |
|
||||
(0x3 << UVD_MPC_SET_MUXB0__VARB_3__SHIFT) |
|
||||
(0x4 << UVD_MPC_SET_MUXB0__VARB_4__SHIFT)));
|
||||
|
||||
/* setup mmUVD_MPC_SET_MUX */
|
||||
WREG32_SOC15(UVD, i, mmUVD_MPC_SET_MUX,
|
||||
WREG32_SOC15(VCN, i, mmUVD_MPC_SET_MUX,
|
||||
((0x0 << UVD_MPC_SET_MUX__SET_0__SHIFT) |
|
||||
(0x1 << UVD_MPC_SET_MUX__SET_1__SHIFT) |
|
||||
(0x2 << UVD_MPC_SET_MUX__SET_2__SHIFT)));
|
||||
@@ -997,27 +997,27 @@ static int vcn_v2_5_start(struct amdgpu_device *adev)
|
||||
if (adev->vcn.harvest_config & (1 << i))
|
||||
continue;
|
||||
/* VCN global tiling registers */
|
||||
WREG32_SOC15(UVD, i, mmUVD_GFX8_ADDR_CONFIG,
|
||||
WREG32_SOC15(VCN, i, mmUVD_GFX8_ADDR_CONFIG,
|
||||
adev->gfx.config.gb_addr_config);
|
||||
WREG32_SOC15(UVD, i, mmUVD_GFX8_ADDR_CONFIG,
|
||||
WREG32_SOC15(VCN, i, mmUVD_GFX8_ADDR_CONFIG,
|
||||
adev->gfx.config.gb_addr_config);
|
||||
|
||||
/* enable LMI MC and UMC channels */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_LMI_CTRL2), 0,
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_LMI_CTRL2), 0,
|
||||
~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK);
|
||||
|
||||
/* unblock VCPU register access */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_RB_ARB_CTRL), 0,
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_RB_ARB_CTRL), 0,
|
||||
~UVD_RB_ARB_CTRL__VCPU_DIS_MASK);
|
||||
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CNTL), 0,
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CNTL), 0,
|
||||
~UVD_VCPU_CNTL__BLK_RST_MASK);
|
||||
|
||||
for (k = 0; k < 10; ++k) {
|
||||
uint32_t status;
|
||||
|
||||
for (j = 0; j < 100; ++j) {
|
||||
status = RREG32_SOC15(UVD, i, mmUVD_STATUS);
|
||||
status = RREG32_SOC15(VCN, i, mmUVD_STATUS);
|
||||
if (status & 2)
|
||||
break;
|
||||
if (amdgpu_emu_mode == 1)
|
||||
@@ -1030,11 +1030,11 @@ static int vcn_v2_5_start(struct amdgpu_device *adev)
|
||||
break;
|
||||
|
||||
DRM_ERROR("VCN decode not responding, trying to reset the VCPU!!!\n");
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CNTL),
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CNTL),
|
||||
UVD_VCPU_CNTL__BLK_RST_MASK,
|
||||
~UVD_VCPU_CNTL__BLK_RST_MASK);
|
||||
mdelay(10);
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CNTL), 0,
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CNTL), 0,
|
||||
~UVD_VCPU_CNTL__BLK_RST_MASK);
|
||||
|
||||
mdelay(10);
|
||||
@@ -1047,15 +1047,15 @@ static int vcn_v2_5_start(struct amdgpu_device *adev)
|
||||
}
|
||||
|
||||
/* enable master interrupt */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_MASTINT_EN),
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_MASTINT_EN),
|
||||
UVD_MASTINT_EN__VCPU_EN_MASK,
|
||||
~UVD_MASTINT_EN__VCPU_EN_MASK);
|
||||
|
||||
/* clear the busy bit of VCN_STATUS */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_STATUS), 0,
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_STATUS), 0,
|
||||
~(2 << UVD_STATUS__VCPU_REPORT__SHIFT));
|
||||
|
||||
WREG32_SOC15(UVD, i, mmUVD_LMI_RBC_RB_VMID, 0);
|
||||
WREG32_SOC15(VCN, i, mmUVD_LMI_RBC_RB_VMID, 0);
|
||||
|
||||
ring = &adev->vcn.inst[i].ring_dec;
|
||||
/* force RBC into idle state */
|
||||
@@ -1065,39 +1065,39 @@ static int vcn_v2_5_start(struct amdgpu_device *adev)
|
||||
tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_FETCH, 1);
|
||||
tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_UPDATE, 1);
|
||||
tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1);
|
||||
WREG32_SOC15(UVD, i, mmUVD_RBC_RB_CNTL, tmp);
|
||||
WREG32_SOC15(VCN, i, mmUVD_RBC_RB_CNTL, tmp);
|
||||
|
||||
fw_shared->multi_queue.decode_queue_mode |= FW_QUEUE_RING_RESET;
|
||||
/* programm the RB_BASE for ring buffer */
|
||||
WREG32_SOC15(UVD, i, mmUVD_LMI_RBC_RB_64BIT_BAR_LOW,
|
||||
WREG32_SOC15(VCN, i, mmUVD_LMI_RBC_RB_64BIT_BAR_LOW,
|
||||
lower_32_bits(ring->gpu_addr));
|
||||
WREG32_SOC15(UVD, i, mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH,
|
||||
WREG32_SOC15(VCN, i, mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH,
|
||||
upper_32_bits(ring->gpu_addr));
|
||||
|
||||
/* Initialize the ring buffer's read and write pointers */
|
||||
WREG32_SOC15(UVD, i, mmUVD_RBC_RB_RPTR, 0);
|
||||
WREG32_SOC15(VCN, i, mmUVD_RBC_RB_RPTR, 0);
|
||||
|
||||
ring->wptr = RREG32_SOC15(UVD, i, mmUVD_RBC_RB_RPTR);
|
||||
WREG32_SOC15(UVD, i, mmUVD_RBC_RB_WPTR,
|
||||
ring->wptr = RREG32_SOC15(VCN, i, mmUVD_RBC_RB_RPTR);
|
||||
WREG32_SOC15(VCN, i, mmUVD_RBC_RB_WPTR,
|
||||
lower_32_bits(ring->wptr));
|
||||
fw_shared->multi_queue.decode_queue_mode &= ~FW_QUEUE_RING_RESET;
|
||||
|
||||
fw_shared->multi_queue.encode_generalpurpose_queue_mode |= FW_QUEUE_RING_RESET;
|
||||
ring = &adev->vcn.inst[i].ring_enc[0];
|
||||
WREG32_SOC15(UVD, i, mmUVD_RB_RPTR, lower_32_bits(ring->wptr));
|
||||
WREG32_SOC15(UVD, i, mmUVD_RB_WPTR, lower_32_bits(ring->wptr));
|
||||
WREG32_SOC15(UVD, i, mmUVD_RB_BASE_LO, ring->gpu_addr);
|
||||
WREG32_SOC15(UVD, i, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr));
|
||||
WREG32_SOC15(UVD, i, mmUVD_RB_SIZE, ring->ring_size / 4);
|
||||
WREG32_SOC15(VCN, i, mmUVD_RB_RPTR, lower_32_bits(ring->wptr));
|
||||
WREG32_SOC15(VCN, i, mmUVD_RB_WPTR, lower_32_bits(ring->wptr));
|
||||
WREG32_SOC15(VCN, i, mmUVD_RB_BASE_LO, ring->gpu_addr);
|
||||
WREG32_SOC15(VCN, i, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr));
|
||||
WREG32_SOC15(VCN, i, mmUVD_RB_SIZE, ring->ring_size / 4);
|
||||
fw_shared->multi_queue.encode_generalpurpose_queue_mode &= ~FW_QUEUE_RING_RESET;
|
||||
|
||||
fw_shared->multi_queue.encode_lowlatency_queue_mode |= FW_QUEUE_RING_RESET;
|
||||
ring = &adev->vcn.inst[i].ring_enc[1];
|
||||
WREG32_SOC15(UVD, i, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr));
|
||||
WREG32_SOC15(UVD, i, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr));
|
||||
WREG32_SOC15(UVD, i, mmUVD_RB_BASE_LO2, ring->gpu_addr);
|
||||
WREG32_SOC15(UVD, i, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));
|
||||
WREG32_SOC15(UVD, i, mmUVD_RB_SIZE2, ring->ring_size / 4);
|
||||
WREG32_SOC15(VCN, i, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr));
|
||||
WREG32_SOC15(VCN, i, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr));
|
||||
WREG32_SOC15(VCN, i, mmUVD_RB_BASE_LO2, ring->gpu_addr);
|
||||
WREG32_SOC15(VCN, i, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));
|
||||
WREG32_SOC15(VCN, i, mmUVD_RB_SIZE2, ring->ring_size / 4);
|
||||
fw_shared->multi_queue.encode_lowlatency_queue_mode &= ~FW_QUEUE_RING_RESET;
|
||||
}
|
||||
|
||||
@@ -1118,33 +1118,33 @@ static int vcn_v2_5_mmsch_start(struct amdgpu_device *adev,
|
||||
* 1, write to vce_mmsch_vf_ctx_addr_lo/hi register with GPU mc addr of
|
||||
* memory descriptor location
|
||||
*/
|
||||
WREG32_SOC15(UVD, 0, mmMMSCH_VF_CTX_ADDR_LO, lower_32_bits(addr));
|
||||
WREG32_SOC15(UVD, 0, mmMMSCH_VF_CTX_ADDR_HI, upper_32_bits(addr));
|
||||
WREG32_SOC15(VCN, 0, mmMMSCH_VF_CTX_ADDR_LO, lower_32_bits(addr));
|
||||
WREG32_SOC15(VCN, 0, mmMMSCH_VF_CTX_ADDR_HI, upper_32_bits(addr));
|
||||
|
||||
/* 2, update vmid of descriptor */
|
||||
data = RREG32_SOC15(UVD, 0, mmMMSCH_VF_VMID);
|
||||
data = RREG32_SOC15(VCN, 0, mmMMSCH_VF_VMID);
|
||||
data &= ~MMSCH_VF_VMID__VF_CTX_VMID_MASK;
|
||||
/* use domain0 for MM scheduler */
|
||||
data |= (0 << MMSCH_VF_VMID__VF_CTX_VMID__SHIFT);
|
||||
WREG32_SOC15(UVD, 0, mmMMSCH_VF_VMID, data);
|
||||
WREG32_SOC15(VCN, 0, mmMMSCH_VF_VMID, data);
|
||||
|
||||
/* 3, notify mmsch about the size of this descriptor */
|
||||
WREG32_SOC15(UVD, 0, mmMMSCH_VF_CTX_SIZE, size);
|
||||
WREG32_SOC15(VCN, 0, mmMMSCH_VF_CTX_SIZE, size);
|
||||
|
||||
/* 4, set resp to zero */
|
||||
WREG32_SOC15(UVD, 0, mmMMSCH_VF_MAILBOX_RESP, 0);
|
||||
WREG32_SOC15(VCN, 0, mmMMSCH_VF_MAILBOX_RESP, 0);
|
||||
|
||||
/*
|
||||
* 5, kick off the initialization and wait until
|
||||
* VCE_MMSCH_VF_MAILBOX_RESP becomes non-zero
|
||||
*/
|
||||
WREG32_SOC15(UVD, 0, mmMMSCH_VF_MAILBOX_HOST, 0x10000001);
|
||||
WREG32_SOC15(VCN, 0, mmMMSCH_VF_MAILBOX_HOST, 0x10000001);
|
||||
|
||||
data = RREG32_SOC15(UVD, 0, mmMMSCH_VF_MAILBOX_RESP);
|
||||
data = RREG32_SOC15(VCN, 0, mmMMSCH_VF_MAILBOX_RESP);
|
||||
loop = 10;
|
||||
while ((data & 0x10000002) != 0x10000002) {
|
||||
udelay(100);
|
||||
data = RREG32_SOC15(UVD, 0, mmMMSCH_VF_MAILBOX_RESP);
|
||||
data = RREG32_SOC15(VCN, 0, mmMMSCH_VF_MAILBOX_RESP);
|
||||
loop--;
|
||||
if (!loop)
|
||||
break;
|
||||
@@ -1167,14 +1167,12 @@ static int vcn_v2_5_sriov_start(struct amdgpu_device *adev)
|
||||
uint32_t table_size = 0;
|
||||
struct mmsch_v1_0_cmd_direct_write direct_wt = { { 0 } };
|
||||
struct mmsch_v1_0_cmd_direct_read_modify_write direct_rd_mod_wt = { { 0 } };
|
||||
struct mmsch_v1_0_cmd_direct_polling direct_poll = { { 0 } };
|
||||
struct mmsch_v1_0_cmd_end end = { { 0 } };
|
||||
uint32_t *init_table = adev->virt.mm_table.cpu_addr;
|
||||
struct mmsch_v1_1_init_header *header = (struct mmsch_v1_1_init_header *)init_table;
|
||||
|
||||
direct_wt.cmd_header.command_type = MMSCH_COMMAND__DIRECT_REG_WRITE;
|
||||
direct_rd_mod_wt.cmd_header.command_type = MMSCH_COMMAND__DIRECT_REG_READ_MODIFY_WRITE;
|
||||
direct_poll.cmd_header.command_type = MMSCH_COMMAND__DIRECT_REG_POLLING;
|
||||
end.cmd_header.command_type = MMSCH_COMMAND__END;
|
||||
|
||||
header->version = MMSCH_VERSION;
|
||||
@@ -1189,93 +1187,93 @@ static int vcn_v2_5_sriov_start(struct amdgpu_device *adev)
|
||||
table_size = 0;
|
||||
|
||||
MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(
|
||||
SOC15_REG_OFFSET(UVD, i, mmUVD_STATUS),
|
||||
SOC15_REG_OFFSET(VCN, i, mmUVD_STATUS),
|
||||
~UVD_STATUS__UVD_BUSY, UVD_STATUS__UVD_BUSY);
|
||||
|
||||
size = AMDGPU_GPU_PAGE_ALIGN(adev->vcn.fw->size + 4);
|
||||
/* mc resume*/
|
||||
if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i,
|
||||
SOC15_REG_OFFSET(VCN, i,
|
||||
mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),
|
||||
adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + i].tmr_mc_addr_lo);
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i,
|
||||
SOC15_REG_OFFSET(VCN, i,
|
||||
mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),
|
||||
adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + i].tmr_mc_addr_hi);
|
||||
offset = 0;
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CACHE_OFFSET0), 0);
|
||||
SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CACHE_OFFSET0), 0);
|
||||
} else {
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i,
|
||||
SOC15_REG_OFFSET(VCN, i,
|
||||
mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),
|
||||
lower_32_bits(adev->vcn.inst[i].gpu_addr));
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i,
|
||||
SOC15_REG_OFFSET(VCN, i,
|
||||
mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),
|
||||
upper_32_bits(adev->vcn.inst[i].gpu_addr));
|
||||
offset = size;
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CACHE_OFFSET0),
|
||||
SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CACHE_OFFSET0),
|
||||
AMDGPU_UVD_FIRMWARE_OFFSET >> 3);
|
||||
}
|
||||
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CACHE_SIZE0),
|
||||
SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CACHE_SIZE0),
|
||||
size);
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i,
|
||||
SOC15_REG_OFFSET(VCN, i,
|
||||
mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW),
|
||||
lower_32_bits(adev->vcn.inst[i].gpu_addr + offset));
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i,
|
||||
SOC15_REG_OFFSET(VCN, i,
|
||||
mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH),
|
||||
upper_32_bits(adev->vcn.inst[i].gpu_addr + offset));
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CACHE_OFFSET1),
|
||||
SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CACHE_OFFSET1),
|
||||
0);
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CACHE_SIZE1),
|
||||
SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CACHE_SIZE1),
|
||||
AMDGPU_VCN_STACK_SIZE);
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i,
|
||||
SOC15_REG_OFFSET(VCN, i,
|
||||
mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW),
|
||||
lower_32_bits(adev->vcn.inst[i].gpu_addr + offset +
|
||||
AMDGPU_VCN_STACK_SIZE));
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i,
|
||||
SOC15_REG_OFFSET(VCN, i,
|
||||
mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH),
|
||||
upper_32_bits(adev->vcn.inst[i].gpu_addr + offset +
|
||||
AMDGPU_VCN_STACK_SIZE));
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CACHE_OFFSET2),
|
||||
SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CACHE_OFFSET2),
|
||||
0);
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CACHE_SIZE2),
|
||||
SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CACHE_SIZE2),
|
||||
AMDGPU_VCN_CONTEXT_SIZE);
|
||||
|
||||
ring = &adev->vcn.inst[i].ring_enc[0];
|
||||
ring->wptr = 0;
|
||||
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i, mmUVD_RB_BASE_LO),
|
||||
SOC15_REG_OFFSET(VCN, i, mmUVD_RB_BASE_LO),
|
||||
lower_32_bits(ring->gpu_addr));
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i, mmUVD_RB_BASE_HI),
|
||||
SOC15_REG_OFFSET(VCN, i, mmUVD_RB_BASE_HI),
|
||||
upper_32_bits(ring->gpu_addr));
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i, mmUVD_RB_SIZE),
|
||||
SOC15_REG_OFFSET(VCN, i, mmUVD_RB_SIZE),
|
||||
ring->ring_size / 4);
|
||||
|
||||
ring = &adev->vcn.inst[i].ring_dec;
|
||||
ring->wptr = 0;
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i,
|
||||
SOC15_REG_OFFSET(VCN, i,
|
||||
mmUVD_LMI_RBC_RB_64BIT_BAR_LOW),
|
||||
lower_32_bits(ring->gpu_addr));
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i,
|
||||
SOC15_REG_OFFSET(VCN, i,
|
||||
mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH),
|
||||
upper_32_bits(ring->gpu_addr));
|
||||
|
||||
@@ -1287,7 +1285,7 @@ static int vcn_v2_5_sriov_start(struct amdgpu_device *adev)
|
||||
tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_UPDATE, 1);
|
||||
tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1);
|
||||
MMSCH_V1_0_INSERT_DIRECT_WT(
|
||||
SOC15_REG_OFFSET(UVD, i, mmUVD_RBC_RB_CNTL), tmp);
|
||||
SOC15_REG_OFFSET(VCN, i, mmUVD_RBC_RB_CNTL), tmp);
|
||||
|
||||
/* add end packet */
|
||||
memcpy((void *)init_table, &end, sizeof(struct mmsch_v1_0_cmd_end));
|
||||
@@ -1308,24 +1306,24 @@ static int vcn_v2_5_stop_dpg_mode(struct amdgpu_device *adev, int inst_idx)
|
||||
uint32_t tmp;
|
||||
|
||||
/* Wait for power status to be 1 */
|
||||
SOC15_WAIT_ON_RREG(UVD, inst_idx, mmUVD_POWER_STATUS, 1,
|
||||
SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_POWER_STATUS, 1,
|
||||
UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code);
|
||||
|
||||
/* wait for read ptr to be equal to write ptr */
|
||||
tmp = RREG32_SOC15(UVD, inst_idx, mmUVD_RB_WPTR);
|
||||
SOC15_WAIT_ON_RREG(UVD, inst_idx, mmUVD_RB_RPTR, tmp, 0xFFFFFFFF, ret_code);
|
||||
tmp = RREG32_SOC15(VCN, inst_idx, mmUVD_RB_WPTR);
|
||||
SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_RB_RPTR, tmp, 0xFFFFFFFF, ret_code);
|
||||
|
||||
tmp = RREG32_SOC15(UVD, inst_idx, mmUVD_RB_WPTR2);
|
||||
SOC15_WAIT_ON_RREG(UVD, inst_idx, mmUVD_RB_RPTR2, tmp, 0xFFFFFFFF, ret_code);
|
||||
tmp = RREG32_SOC15(VCN, inst_idx, mmUVD_RB_WPTR2);
|
||||
SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_RB_RPTR2, tmp, 0xFFFFFFFF, ret_code);
|
||||
|
||||
tmp = RREG32_SOC15(UVD, inst_idx, mmUVD_RBC_RB_WPTR) & 0x7FFFFFFF;
|
||||
SOC15_WAIT_ON_RREG(UVD, inst_idx, mmUVD_RBC_RB_RPTR, tmp, 0xFFFFFFFF, ret_code);
|
||||
tmp = RREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_WPTR) & 0x7FFFFFFF;
|
||||
SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_RBC_RB_RPTR, tmp, 0xFFFFFFFF, ret_code);
|
||||
|
||||
SOC15_WAIT_ON_RREG(UVD, inst_idx, mmUVD_POWER_STATUS, 1,
|
||||
SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_POWER_STATUS, 1,
|
||||
UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code);
|
||||
|
||||
/* disable dynamic power gating mode */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, inst_idx, mmUVD_POWER_STATUS), 0,
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS), 0,
|
||||
~UVD_POWER_STATUS__UVD_PG_MODE_MASK);
|
||||
|
||||
return 0;
|
||||
@@ -1369,17 +1367,17 @@ static int vcn_v2_5_stop(struct amdgpu_device *adev)
|
||||
return r;
|
||||
|
||||
/* block VCPU register access */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_RB_ARB_CTRL),
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_RB_ARB_CTRL),
|
||||
UVD_RB_ARB_CTRL__VCPU_DIS_MASK,
|
||||
~UVD_RB_ARB_CTRL__VCPU_DIS_MASK);
|
||||
|
||||
/* reset VCPU */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CNTL),
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CNTL),
|
||||
UVD_VCPU_CNTL__BLK_RST_MASK,
|
||||
~UVD_VCPU_CNTL__BLK_RST_MASK);
|
||||
|
||||
/* disable VCPU clock */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CNTL), 0,
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CNTL), 0,
|
||||
~(UVD_VCPU_CNTL__CLK_EN_MASK));
|
||||
|
||||
/* clear status */
|
||||
@@ -1388,7 +1386,7 @@ static int vcn_v2_5_stop(struct amdgpu_device *adev)
|
||||
vcn_v2_5_enable_clock_gating(adev);
|
||||
|
||||
/* enable register anti-hang mechanism */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_POWER_STATUS),
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_POWER_STATUS),
|
||||
UVD_POWER_STATUS__UVD_POWER_STATUS_MASK,
|
||||
~UVD_POWER_STATUS__UVD_POWER_STATUS_MASK);
|
||||
}
|
||||
@@ -1410,11 +1408,11 @@ static int vcn_v2_5_pause_dpg_mode(struct amdgpu_device *adev,
|
||||
if (adev->vcn.inst[inst_idx].pause_state.fw_based != new_state->fw_based) {
|
||||
DRM_DEBUG("dpg pause state changed %d -> %d",
|
||||
adev->vcn.inst[inst_idx].pause_state.fw_based, new_state->fw_based);
|
||||
reg_data = RREG32_SOC15(UVD, inst_idx, mmUVD_DPG_PAUSE) &
|
||||
reg_data = RREG32_SOC15(VCN, inst_idx, mmUVD_DPG_PAUSE) &
|
||||
(~UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK);
|
||||
|
||||
if (new_state->fw_based == VCN_DPG_STATE__PAUSE) {
|
||||
SOC15_WAIT_ON_RREG(UVD, inst_idx, mmUVD_POWER_STATUS, 0x1,
|
||||
SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_POWER_STATUS, 0x1,
|
||||
UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code);
|
||||
|
||||
if (!ret_code) {
|
||||
@@ -1422,15 +1420,15 @@ static int vcn_v2_5_pause_dpg_mode(struct amdgpu_device *adev,
|
||||
|
||||
/* pause DPG */
|
||||
reg_data |= UVD_DPG_PAUSE__NJ_PAUSE_DPG_REQ_MASK;
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_DPG_PAUSE, reg_data);
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_DPG_PAUSE, reg_data);
|
||||
|
||||
/* wait for ACK */
|
||||
SOC15_WAIT_ON_RREG(UVD, inst_idx, mmUVD_DPG_PAUSE,
|
||||
SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_DPG_PAUSE,
|
||||
UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK,
|
||||
UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK, ret_code);
|
||||
|
||||
/* Stall DPG before WPTR/RPTR reset */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, inst_idx, mmUVD_POWER_STATUS),
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS),
|
||||
UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK,
|
||||
~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK);
|
||||
|
||||
@@ -1438,39 +1436,39 @@ static int vcn_v2_5_pause_dpg_mode(struct amdgpu_device *adev,
|
||||
fw_shared->multi_queue.encode_generalpurpose_queue_mode |= FW_QUEUE_RING_RESET;
|
||||
ring = &adev->vcn.inst[inst_idx].ring_enc[0];
|
||||
ring->wptr = 0;
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_RB_BASE_LO, ring->gpu_addr);
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr));
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_RB_SIZE, ring->ring_size / 4);
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_RB_RPTR, lower_32_bits(ring->wptr));
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_RB_WPTR, lower_32_bits(ring->wptr));
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_BASE_LO, ring->gpu_addr);
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr));
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_SIZE, ring->ring_size / 4);
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_RPTR, lower_32_bits(ring->wptr));
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_WPTR, lower_32_bits(ring->wptr));
|
||||
fw_shared->multi_queue.encode_generalpurpose_queue_mode &= ~FW_QUEUE_RING_RESET;
|
||||
|
||||
fw_shared->multi_queue.encode_lowlatency_queue_mode |= FW_QUEUE_RING_RESET;
|
||||
ring = &adev->vcn.inst[inst_idx].ring_enc[1];
|
||||
ring->wptr = 0;
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_RB_BASE_LO2, ring->gpu_addr);
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_RB_SIZE2, ring->ring_size / 4);
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr));
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr));
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_BASE_LO2, ring->gpu_addr);
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_SIZE2, ring->ring_size / 4);
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr));
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr));
|
||||
fw_shared->multi_queue.encode_lowlatency_queue_mode &= ~FW_QUEUE_RING_RESET;
|
||||
|
||||
fw_shared->multi_queue.decode_queue_mode |= FW_QUEUE_RING_RESET;
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_RBC_RB_WPTR,
|
||||
RREG32_SOC15(UVD, inst_idx, mmUVD_SCRATCH2) & 0x7FFFFFFF);
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_WPTR,
|
||||
RREG32_SOC15(VCN, inst_idx, mmUVD_SCRATCH2) & 0x7FFFFFFF);
|
||||
fw_shared->multi_queue.decode_queue_mode &= ~FW_QUEUE_RING_RESET;
|
||||
|
||||
/* Unstall DPG */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, inst_idx, mmUVD_POWER_STATUS),
|
||||
WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS),
|
||||
0, ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK);
|
||||
|
||||
SOC15_WAIT_ON_RREG(UVD, inst_idx, mmUVD_POWER_STATUS,
|
||||
SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_POWER_STATUS,
|
||||
UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON, UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code);
|
||||
}
|
||||
} else {
|
||||
reg_data &= ~UVD_DPG_PAUSE__NJ_PAUSE_DPG_REQ_MASK;
|
||||
WREG32_SOC15(UVD, inst_idx, mmUVD_DPG_PAUSE, reg_data);
|
||||
SOC15_WAIT_ON_RREG(UVD, inst_idx, mmUVD_POWER_STATUS, 0x1,
|
||||
WREG32_SOC15(VCN, inst_idx, mmUVD_DPG_PAUSE, reg_data);
|
||||
SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_POWER_STATUS, 0x1,
|
||||
UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code);
|
||||
}
|
||||
adev->vcn.inst[inst_idx].pause_state.fw_based = new_state->fw_based;
|
||||
@@ -1490,7 +1488,7 @@ static uint64_t vcn_v2_5_dec_ring_get_rptr(struct amdgpu_ring *ring)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
return RREG32_SOC15(UVD, ring->me, mmUVD_RBC_RB_RPTR);
|
||||
return RREG32_SOC15(VCN, ring->me, mmUVD_RBC_RB_RPTR);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1507,7 +1505,7 @@ static uint64_t vcn_v2_5_dec_ring_get_wptr(struct amdgpu_ring *ring)
|
||||
if (ring->use_doorbell)
|
||||
return adev->wb.wb[ring->wptr_offs];
|
||||
else
|
||||
return RREG32_SOC15(UVD, ring->me, mmUVD_RBC_RB_WPTR);
|
||||
return RREG32_SOC15(VCN, ring->me, mmUVD_RBC_RB_WPTR);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1522,14 +1520,14 @@ static void vcn_v2_5_dec_ring_set_wptr(struct amdgpu_ring *ring)
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)
|
||||
WREG32_SOC15(UVD, ring->me, mmUVD_SCRATCH2,
|
||||
WREG32_SOC15(VCN, ring->me, mmUVD_SCRATCH2,
|
||||
lower_32_bits(ring->wptr) | 0x80000000);
|
||||
|
||||
if (ring->use_doorbell) {
|
||||
adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr);
|
||||
WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr));
|
||||
} else {
|
||||
WREG32_SOC15(UVD, ring->me, mmUVD_RBC_RB_WPTR, lower_32_bits(ring->wptr));
|
||||
WREG32_SOC15(VCN, ring->me, mmUVD_RBC_RB_WPTR, lower_32_bits(ring->wptr));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1575,9 +1573,9 @@ static uint64_t vcn_v2_5_enc_ring_get_rptr(struct amdgpu_ring *ring)
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
if (ring == &adev->vcn.inst[ring->me].ring_enc[0])
|
||||
return RREG32_SOC15(UVD, ring->me, mmUVD_RB_RPTR);
|
||||
return RREG32_SOC15(VCN, ring->me, mmUVD_RB_RPTR);
|
||||
else
|
||||
return RREG32_SOC15(UVD, ring->me, mmUVD_RB_RPTR2);
|
||||
return RREG32_SOC15(VCN, ring->me, mmUVD_RB_RPTR2);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1595,12 +1593,12 @@ static uint64_t vcn_v2_5_enc_ring_get_wptr(struct amdgpu_ring *ring)
|
||||
if (ring->use_doorbell)
|
||||
return adev->wb.wb[ring->wptr_offs];
|
||||
else
|
||||
return RREG32_SOC15(UVD, ring->me, mmUVD_RB_WPTR);
|
||||
return RREG32_SOC15(VCN, ring->me, mmUVD_RB_WPTR);
|
||||
} else {
|
||||
if (ring->use_doorbell)
|
||||
return adev->wb.wb[ring->wptr_offs];
|
||||
else
|
||||
return RREG32_SOC15(UVD, ring->me, mmUVD_RB_WPTR2);
|
||||
return RREG32_SOC15(VCN, ring->me, mmUVD_RB_WPTR2);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1620,14 +1618,14 @@ static void vcn_v2_5_enc_ring_set_wptr(struct amdgpu_ring *ring)
|
||||
adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr);
|
||||
WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr));
|
||||
} else {
|
||||
WREG32_SOC15(UVD, ring->me, mmUVD_RB_WPTR, lower_32_bits(ring->wptr));
|
||||
WREG32_SOC15(VCN, ring->me, mmUVD_RB_WPTR, lower_32_bits(ring->wptr));
|
||||
}
|
||||
} else {
|
||||
if (ring->use_doorbell) {
|
||||
adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr);
|
||||
WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr));
|
||||
} else {
|
||||
WREG32_SOC15(UVD, ring->me, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr));
|
||||
WREG32_SOC15(VCN, ring->me, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user