summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCe Sun <cesun102@amd.com>2026-04-03 10:07:22 +0800
committerAlex Deucher <alexander.deucher@amd.com>2026-07-01 11:47:39 -0400
commitaf1ae7d0beafb5459cfde633049a485daf76fb84 (patch)
treef783f4f93ed629ff537c71fa31b06985c6bd5b21
parent98cad4bd1443975d972f4c7f705980da03722a22 (diff)
downloadlinux-next-af1ae7d0beafb5459cfde633049a485daf76fb84.tar.gz
linux-next-af1ae7d0beafb5459cfde633049a485daf76fb84.zip
drm/amdgpu: retire legacy ACA support
retire legacy ACA support Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com> Signed-off-by: Ce Sun <cesun102@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/Makefile2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c450
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_aca.h229
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c170
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h14
7 files changed, 13 insertions, 861 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile
index ba80542ead9d..5100e35027ec 100644
--- a/drivers/gpu/drm/amd/amdgpu/Makefile
+++ b/drivers/gpu/drm/amd/amdgpu/Makefile
@@ -70,7 +70,7 @@ amdgpu-y += amdgpu_device.o amdgpu_reg_access.o amdgpu_doorbell_mgr.o amdgpu_kms
amdgpu_umc.o smu_v11_0_i2c.o amdgpu_fru_eeprom.o amdgpu_rap.o \
amdgpu_fw_attestation.o amdgpu_securedisplay.o \
amdgpu_eeprom.o amdgpu_mca.o amdgpu_psp_ta.o amdgpu_lsdma.o amdgpu_lockdep.o \
- amdgpu_ring_mux.o amdgpu_xcp.o amdgpu_seq64.o amdgpu_aca.o amdgpu_dev_coredump.o \
+ amdgpu_ring_mux.o amdgpu_xcp.o amdgpu_seq64.o amdgpu_dev_coredump.o \
amdgpu_cper.o amdgpu_userq_fence.o amdgpu_eviction_fence.o amdgpu_ip.o
amdgpu-$(CONFIG_PROC_FS) += amdgpu_fdinfo.o
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 4c3e933ff6d5..13d6f31344c4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -104,7 +104,6 @@
#include "amdgpu_smuio.h"
#include "amdgpu_fdinfo.h"
#include "amdgpu_mca.h"
-#include "amdgpu_aca.h"
#include "amdgpu_ras.h"
#include "amdgpu_lockdep.h"
#include "amdgpu_cper.h"
@@ -990,9 +989,6 @@ struct amdgpu_device {
/* MCA */
struct amdgpu_mca mca;
- /* ACA */
- struct amdgpu_aca aca;
-
/* CPER */
struct amdgpu_cper cper;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c
deleted file mode 100644
index 4c78de1bdb79..000000000000
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c
+++ /dev/null
@@ -1,450 +0,0 @@
-/*
- * Copyright 2023 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-#include <linux/list.h>
-#include "amdgpu.h"
-#include "amdgpu_aca.h"
-#include "amdgpu_ras.h"
-
-static struct aca_bank_error *new_bank_error(struct aca_error *aerr, struct aca_bank_info *info)
-{
- struct aca_bank_error *bank_error;
-
- bank_error = kvzalloc_obj(*bank_error);
- if (!bank_error)
- return NULL;
-
- INIT_LIST_HEAD(&bank_error->node);
- memcpy(&bank_error->info, info, sizeof(*info));
-
- mutex_lock(&aerr->lock);
- list_add_tail(&bank_error->node, &aerr->list);
- aerr->nr_errors++;
- mutex_unlock(&aerr->lock);
-
- return bank_error;
-}
-
-static struct aca_bank_error *find_bank_error(struct aca_error *aerr, struct aca_bank_info *info)
-{
- struct aca_bank_error *bank_error = NULL;
- struct aca_bank_info *tmp_info;
- bool found = false;
-
- mutex_lock(&aerr->lock);
- list_for_each_entry(bank_error, &aerr->list, node) {
- tmp_info = &bank_error->info;
- if (tmp_info->socket_id == info->socket_id &&
- tmp_info->die_id == info->die_id) {
- found = true;
- goto out_unlock;
- }
- }
-
-out_unlock:
- mutex_unlock(&aerr->lock);
-
- return found ? bank_error : NULL;
-}
-
-static void aca_bank_error_remove(struct aca_error *aerr, struct aca_bank_error *bank_error)
-{
- if (!aerr || !bank_error)
- return;
-
- list_del(&bank_error->node);
- aerr->nr_errors--;
-
- kvfree(bank_error);
-}
-
-static struct aca_bank_error *get_bank_error(struct aca_error *aerr, struct aca_bank_info *info)
-{
- struct aca_bank_error *bank_error;
-
- if (!aerr || !info)
- return NULL;
-
- bank_error = find_bank_error(aerr, info);
- if (bank_error)
- return bank_error;
-
- return new_bank_error(aerr, info);
-}
-
-int aca_error_cache_log_bank_error(struct aca_handle *handle, struct aca_bank_info *info,
- enum aca_error_type type, u64 count)
-{
- struct aca_error_cache *error_cache = &handle->error_cache;
- struct aca_bank_error *bank_error;
- struct aca_error *aerr;
-
- if (!handle || !info || type >= ACA_ERROR_TYPE_COUNT)
- return -EINVAL;
-
- if (!count)
- return 0;
-
- aerr = &error_cache->errors[type];
- bank_error = get_bank_error(aerr, info);
- if (!bank_error)
- return -ENOMEM;
-
- bank_error->count += count;
-
- return 0;
-}
-
-static void aca_error_init(struct aca_error *aerr, enum aca_error_type type)
-{
- mutex_init(&aerr->lock);
- INIT_LIST_HEAD(&aerr->list);
- aerr->type = type;
- aerr->nr_errors = 0;
-}
-
-static void aca_init_error_cache(struct aca_handle *handle)
-{
- struct aca_error_cache *error_cache = &handle->error_cache;
- int type;
-
- for (type = ACA_ERROR_TYPE_UE; type < ACA_ERROR_TYPE_COUNT; type++)
- aca_error_init(&error_cache->errors[type], type);
-}
-
-static void aca_error_fini(struct aca_error *aerr)
-{
- struct aca_bank_error *bank_error, *tmp;
-
- mutex_lock(&aerr->lock);
- if (list_empty(&aerr->list))
- goto out_unlock;
-
- list_for_each_entry_safe(bank_error, tmp, &aerr->list, node)
- aca_bank_error_remove(aerr, bank_error);
-
-out_unlock:
- mutex_unlock(&aerr->lock);
- mutex_destroy(&aerr->lock);
-}
-
-static void aca_fini_error_cache(struct aca_handle *handle)
-{
- struct aca_error_cache *error_cache = &handle->error_cache;
- int type;
-
- for (type = ACA_ERROR_TYPE_UE; type < ACA_ERROR_TYPE_COUNT; type++)
- aca_error_fini(&error_cache->errors[type]);
-}
-
-static int add_aca_handle(struct amdgpu_device *adev, struct aca_handle_manager *mgr, struct aca_handle *handle,
- const char *name, const struct aca_info *ras_info, void *data)
-{
- memset(handle, 0, sizeof(*handle));
-
- handle->adev = adev;
- handle->mgr = mgr;
- handle->name = name;
- handle->hwip = ras_info->hwip;
- handle->mask = ras_info->mask;
- handle->bank_ops = ras_info->bank_ops;
- handle->data = data;
- aca_init_error_cache(handle);
-
- INIT_LIST_HEAD(&handle->node);
- list_add_tail(&handle->node, &mgr->list);
- mgr->nr_handles++;
-
- return 0;
-}
-
-static ssize_t aca_sysfs_read(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct aca_handle *handle = container_of(attr, struct aca_handle, aca_attr);
-
- /* NOTE: the aca cache will be auto cleared once read,
- * So the driver should unify the query entry point, forward request to ras query interface directly */
- return amdgpu_ras_aca_sysfs_read(dev, attr, handle, buf, handle->data);
-}
-
-static int add_aca_sysfs(struct amdgpu_device *adev, struct aca_handle *handle)
-{
- struct device_attribute *aca_attr = &handle->aca_attr;
-
- snprintf(handle->attr_name, sizeof(handle->attr_name) - 1, "aca_%s", handle->name);
- aca_attr->show = aca_sysfs_read;
- aca_attr->attr.name = handle->attr_name;
- aca_attr->attr.mode = S_IRUGO;
- sysfs_attr_init(&aca_attr->attr);
-
- return sysfs_add_file_to_group(&adev->dev->kobj,
- &aca_attr->attr,
- "ras");
-}
-
-int amdgpu_aca_add_handle(struct amdgpu_device *adev, struct aca_handle *handle,
- const char *name, const struct aca_info *ras_info, void *data)
-{
- struct amdgpu_aca *aca = &adev->aca;
- int ret;
-
- if (!amdgpu_aca_is_enabled(adev))
- return 0;
-
- ret = add_aca_handle(adev, &aca->mgr, handle, name, ras_info, data);
- if (ret)
- return ret;
-
- return add_aca_sysfs(adev, handle);
-}
-
-static void remove_aca_handle(struct aca_handle *handle)
-{
- struct aca_handle_manager *mgr = handle->mgr;
-
- aca_fini_error_cache(handle);
- list_del(&handle->node);
- mgr->nr_handles--;
-}
-
-static void remove_aca_sysfs(struct aca_handle *handle)
-{
- struct amdgpu_device *adev = handle->adev;
- struct device_attribute *aca_attr = &handle->aca_attr;
-
- if (adev->dev->kobj.sd)
- sysfs_remove_file_from_group(&adev->dev->kobj,
- &aca_attr->attr,
- "ras");
-}
-
-void amdgpu_aca_remove_handle(struct aca_handle *handle)
-{
- if (!handle || list_empty(&handle->node))
- return;
-
- remove_aca_sysfs(handle);
- remove_aca_handle(handle);
-}
-
-static int aca_manager_init(struct aca_handle_manager *mgr)
-{
- INIT_LIST_HEAD(&mgr->list);
- mgr->nr_handles = 0;
-
- return 0;
-}
-
-static void aca_manager_fini(struct aca_handle_manager *mgr)
-{
- struct aca_handle *handle, *tmp;
-
- if (list_empty(&mgr->list))
- return;
-
- list_for_each_entry_safe(handle, tmp, &mgr->list, node)
- amdgpu_aca_remove_handle(handle);
-}
-
-bool amdgpu_aca_is_enabled(struct amdgpu_device *adev)
-{
- return (adev->aca.is_enabled ||
- adev->debug_enable_ras_aca);
-}
-
-int amdgpu_aca_init(struct amdgpu_device *adev)
-{
- struct amdgpu_aca *aca = &adev->aca;
- int ret;
-
- atomic_set(&aca->ue_update_flag, 0);
-
- ret = aca_manager_init(&aca->mgr);
- if (ret)
- return ret;
-
- return 0;
-}
-
-void amdgpu_aca_fini(struct amdgpu_device *adev)
-{
- struct amdgpu_aca *aca = &adev->aca;
-
- aca_manager_fini(&aca->mgr);
-
- atomic_set(&aca->ue_update_flag, 0);
-}
-
-int amdgpu_aca_reset(struct amdgpu_device *adev)
-{
- struct amdgpu_aca *aca = &adev->aca;
-
- atomic_set(&aca->ue_update_flag, 0);
-
- return 0;
-}
-
-void amdgpu_aca_set_smu_funcs(struct amdgpu_device *adev, const struct aca_smu_funcs *smu_funcs)
-{
- struct amdgpu_aca *aca = &adev->aca;
-
- WARN_ON(aca->smu_funcs);
- aca->smu_funcs = smu_funcs;
-}
-
-int aca_bank_info_decode(struct aca_bank *bank, struct aca_bank_info *info)
-{
- u64 ipid;
- u32 instidhi, instidlo;
-
- if (!bank || !info)
- return -EINVAL;
-
- ipid = bank->regs[ACA_REG_IDX_IPID];
- info->hwid = ACA_REG__IPID__HARDWAREID(ipid);
- info->mcatype = ACA_REG__IPID__MCATYPE(ipid);
- /*
- * Unfied DieID Format: SAASS. A:AID, S:Socket.
- * Unfied DieID[4:4] = InstanceId[0:0]
- * Unfied DieID[0:3] = InstanceIdHi[0:3]
- */
- instidhi = ACA_REG__IPID__INSTANCEIDHI(ipid);
- instidlo = ACA_REG__IPID__INSTANCEIDLO(ipid);
- info->die_id = ((instidhi >> 2) & 0x03);
- info->socket_id = ((instidlo & 0x1) << 2) | (instidhi & 0x03);
-
- return 0;
-}
-
-static int aca_bank_get_error_code(struct amdgpu_device *adev, struct aca_bank *bank)
-{
- struct amdgpu_aca *aca = &adev->aca;
- const struct aca_smu_funcs *smu_funcs = aca->smu_funcs;
-
- if (!smu_funcs || !smu_funcs->parse_error_code)
- return -EOPNOTSUPP;
-
- return smu_funcs->parse_error_code(adev, bank);
-}
-
-int aca_bank_check_error_codes(struct amdgpu_device *adev, struct aca_bank *bank, int *err_codes, int size)
-{
- int i, error_code;
-
- if (!bank || !err_codes)
- return -EINVAL;
-
- error_code = aca_bank_get_error_code(adev, bank);
- if (error_code < 0)
- return error_code;
-
- for (i = 0; i < size; i++) {
- if (err_codes[i] == error_code)
- return 0;
- }
-
- return -EINVAL;
-}
-
-int amdgpu_aca_smu_set_debug_mode(struct amdgpu_device *adev, bool en)
-{
- struct amdgpu_aca *aca = &adev->aca;
- const struct aca_smu_funcs *smu_funcs = aca->smu_funcs;
-
- if (!smu_funcs || !smu_funcs->set_debug_mode)
- return -EOPNOTSUPP;
-
- return smu_funcs->set_debug_mode(adev, en);
-}
-
-#if defined(CONFIG_DEBUG_FS)
-static int amdgpu_aca_smu_debug_mode_set(void *data, u64 val)
-{
- struct amdgpu_device *adev = (struct amdgpu_device *)data;
- int ret;
-
- ret = amdgpu_ras_set_aca_debug_mode(adev, val ? true : false);
- if (ret)
- return ret;
-
- dev_info(adev->dev, "amdgpu set smu aca debug mode %s success\n", val ? "on" : "off");
-
- return 0;
-}
-
-static int aca_dump_show(struct seq_file *m, enum aca_smu_type type)
-{
- return 0;
-}
-
-static int aca_dump_ce_show(struct seq_file *m, void *unused)
-{
- return aca_dump_show(m, ACA_SMU_TYPE_CE);
-}
-
-static int aca_dump_ce_open(struct inode *inode, struct file *file)
-{
- return single_open(file, aca_dump_ce_show, inode->i_private);
-}
-
-static const struct file_operations aca_ce_dump_debug_fops = {
- .owner = THIS_MODULE,
- .open = aca_dump_ce_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = single_release,
-};
-
-static int aca_dump_ue_show(struct seq_file *m, void *unused)
-{
- return aca_dump_show(m, ACA_SMU_TYPE_UE);
-}
-
-static int aca_dump_ue_open(struct inode *inode, struct file *file)
-{
- return single_open(file, aca_dump_ue_show, inode->i_private);
-}
-
-static const struct file_operations aca_ue_dump_debug_fops = {
- .owner = THIS_MODULE,
- .open = aca_dump_ue_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = single_release,
-};
-
-DEFINE_DEBUGFS_ATTRIBUTE(aca_debug_mode_fops, NULL, amdgpu_aca_smu_debug_mode_set, "%llu\n");
-#endif
-
-void amdgpu_aca_smu_debugfs_init(struct amdgpu_device *adev, struct dentry *root)
-{
-#if defined(CONFIG_DEBUG_FS)
- if (!root)
- return;
-
- debugfs_create_file("aca_debug_mode", 0200, root, adev, &aca_debug_mode_fops);
- debugfs_create_file("aca_ue_dump", 0400, root, adev, &aca_ue_dump_debug_fops);
- debugfs_create_file("aca_ce_dump", 0400, root, adev, &aca_ce_dump_debug_fops);
-#endif
-}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_aca.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_aca.h
deleted file mode 100644
index 93a70a350f34..000000000000
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_aca.h
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Copyright 2023 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-#ifndef __AMDGPU_ACA_H__
-#define __AMDGPU_ACA_H__
-
-#include <linux/list.h>
-
-struct ras_err_data;
-struct ras_query_context;
-
-#define ACA_MAX_REGS_COUNT (16)
-
-#define ACA_REG_FIELD(x, h, l) (((x) & GENMASK_ULL(h, l)) >> l)
-#define ACA_REG__STATUS__VAL(x) ACA_REG_FIELD(x, 63, 63)
-#define ACA_REG__STATUS__OVERFLOW(x) ACA_REG_FIELD(x, 62, 62)
-#define ACA_REG__STATUS__UC(x) ACA_REG_FIELD(x, 61, 61)
-#define ACA_REG__STATUS__EN(x) ACA_REG_FIELD(x, 60, 60)
-#define ACA_REG__STATUS__MISCV(x) ACA_REG_FIELD(x, 59, 59)
-#define ACA_REG__STATUS__ADDRV(x) ACA_REG_FIELD(x, 58, 58)
-#define ACA_REG__STATUS__PCC(x) ACA_REG_FIELD(x, 57, 57)
-#define ACA_REG__STATUS__ERRCOREIDVAL(x) ACA_REG_FIELD(x, 56, 56)
-#define ACA_REG__STATUS__TCC(x) ACA_REG_FIELD(x, 55, 55)
-#define ACA_REG__STATUS__SYNDV(x) ACA_REG_FIELD(x, 53, 53)
-#define ACA_REG__STATUS__CECC(x) ACA_REG_FIELD(x, 46, 46)
-#define ACA_REG__STATUS__UECC(x) ACA_REG_FIELD(x, 45, 45)
-#define ACA_REG__STATUS__DEFERRED(x) ACA_REG_FIELD(x, 44, 44)
-#define ACA_REG__STATUS__POISON(x) ACA_REG_FIELD(x, 43, 43)
-#define ACA_REG__STATUS__SCRUB(x) ACA_REG_FIELD(x, 40, 40)
-#define ACA_REG__STATUS__ERRCOREID(x) ACA_REG_FIELD(x, 37, 32)
-#define ACA_REG__STATUS__ADDRLSB(x) ACA_REG_FIELD(x, 29, 24)
-#define ACA_REG__STATUS__ERRORCODEEXT(x) ACA_REG_FIELD(x, 21, 16)
-#define ACA_REG__STATUS__ERRORCODE(x) ACA_REG_FIELD(x, 15, 0)
-
-#define ACA_REG__IPID__MCATYPE(x) ACA_REG_FIELD(x, 63, 48)
-#define ACA_REG__IPID__INSTANCEIDHI(x) ACA_REG_FIELD(x, 47, 44)
-#define ACA_REG__IPID__HARDWAREID(x) ACA_REG_FIELD(x, 43, 32)
-#define ACA_REG__IPID__INSTANCEIDLO(x) ACA_REG_FIELD(x, 31, 0)
-
-#define ACA_REG__MISC0__VALID(x) ACA_REG_FIELD(x, 63, 63)
-#define ACA_REG__MISC0__OVRFLW(x) ACA_REG_FIELD(x, 48, 48)
-#define ACA_REG__MISC0__ERRCNT(x) ACA_REG_FIELD(x, 43, 32)
-
-#define ACA_REG__SYND__ERRORINFORMATION(x) ACA_REG_FIELD(x, 17, 0)
-
-/* NOTE: The following codes refers to the smu header file */
-#define ACA_EXTERROR_CODE_CE 0x3a
-#define ACA_EXTERROR_CODE_FAULT 0x3b
-
-#define ACA_ERROR_UE_MASK BIT_MASK(ACA_ERROR_TYPE_UE)
-#define ACA_ERROR_CE_MASK BIT_MASK(ACA_ERROR_TYPE_CE)
-#define ACA_ERROR_DEFERRED_MASK BIT_MASK(ACA_ERROR_TYPE_DEFERRED)
-
-#define mmSMNAID_AID0_MCA_SMU 0x03b30400 /* SMN AID AID0 */
-#define mmSMNAID_XCD0_MCA_SMU 0x36430400 /* SMN AID XCD0 */
-#define mmSMNAID_XCD1_MCA_SMU 0x38430400 /* SMN AID XCD1 */
-#define mmSMNXCD_XCD0_MCA_SMU 0x40430400 /* SMN XCD XCD0 */
-
-#define ACA_BANK_ERR_IS_DEFFERED(bank) \
- (ACA_REG__STATUS__POISON((bank)->regs[ACA_REG_IDX_STATUS]) || \
- ACA_REG__STATUS__DEFERRED((bank)->regs[ACA_REG_IDX_STATUS]))
-
-enum aca_reg_idx {
- ACA_REG_IDX_CTL = 0,
- ACA_REG_IDX_STATUS = 1,
- ACA_REG_IDX_ADDR = 2,
- ACA_REG_IDX_MISC0 = 3,
- ACA_REG_IDX_CONFIG = 4,
- ACA_REG_IDX_IPID = 5,
- ACA_REG_IDX_SYND = 6,
- ACA_REG_IDX_DESTAT = 8,
- ACA_REG_IDX_DEADDR = 9,
- ACA_REG_IDX_CTL_MASK = 10,
- ACA_REG_IDX_COUNT = 16,
-};
-
-enum aca_hwip_type {
- ACA_HWIP_TYPE_UNKNOW = -1,
- ACA_HWIP_TYPE_PSP = 0,
- ACA_HWIP_TYPE_UMC,
- ACA_HWIP_TYPE_SMU,
- ACA_HWIP_TYPE_PCS_XGMI,
- ACA_HWIP_TYPE_COUNT,
-};
-
-enum aca_error_type {
- ACA_ERROR_TYPE_INVALID = -1,
- ACA_ERROR_TYPE_UE = 0,
- ACA_ERROR_TYPE_CE,
- ACA_ERROR_TYPE_DEFERRED,
- ACA_ERROR_TYPE_COUNT
-};
-
-enum aca_smu_type {
- ACA_SMU_TYPE_INVALID = -1,
- ACA_SMU_TYPE_UE = 0,
- ACA_SMU_TYPE_CE,
- ACA_SMU_TYPE_COUNT,
-};
-
-struct aca_hwip {
- int hwid;
- int mcatype;
-};
-
-struct aca_bank {
- enum aca_error_type aca_err_type;
- enum aca_smu_type smu_err_type;
- u64 regs[ACA_MAX_REGS_COUNT];
-};
-
-struct aca_bank_node {
- struct aca_bank bank;
- struct list_head node;
-};
-
-struct aca_banks {
- int nr_banks;
- struct list_head list;
-};
-
-struct aca_bank_info {
- int die_id;
- int socket_id;
- int hwid;
- int mcatype;
-};
-
-struct aca_bank_error {
- struct list_head node;
- struct aca_bank_info info;
- u64 count;
-};
-
-struct aca_error {
- struct list_head list;
- struct mutex lock;
- enum aca_error_type type;
- int nr_errors;
-};
-
-struct aca_handle_manager {
- struct list_head list;
- int nr_handles;
-};
-
-struct aca_error_cache {
- struct aca_error errors[ACA_ERROR_TYPE_COUNT];
-};
-
-struct aca_handle {
- struct list_head node;
- enum aca_hwip_type hwip;
- struct amdgpu_device *adev;
- struct aca_handle_manager *mgr;
- struct aca_error_cache error_cache;
- const struct aca_bank_ops *bank_ops;
- struct device_attribute aca_attr;
- char attr_name[64];
- const char *name;
- u32 mask;
- void *data;
-};
-
-struct aca_bank_ops {
- int (*aca_bank_parser)(struct aca_handle *handle, struct aca_bank *bank, enum aca_smu_type type, void *data);
- bool (*aca_bank_is_valid)(struct aca_handle *handle, struct aca_bank *bank, enum aca_smu_type type,
- void *data);
-};
-
-struct aca_smu_funcs {
- int max_ue_bank_count;
- int max_ce_bank_count;
- int (*set_debug_mode)(struct amdgpu_device *adev, bool enable);
- int (*get_valid_aca_count)(struct amdgpu_device *adev, enum aca_smu_type type, u32 *count);
- int (*get_valid_aca_bank)(struct amdgpu_device *adev, enum aca_smu_type type, int idx, struct aca_bank *bank);
- int (*parse_error_code)(struct amdgpu_device *adev, struct aca_bank *bank);
-};
-
-struct amdgpu_aca {
- struct aca_handle_manager mgr;
- const struct aca_smu_funcs *smu_funcs;
- atomic_t ue_update_flag;
- bool is_enabled;
-};
-
-struct aca_info {
- enum aca_hwip_type hwip;
- const struct aca_bank_ops *bank_ops;
- u32 mask;
-};
-
-int amdgpu_aca_init(struct amdgpu_device *adev);
-void amdgpu_aca_fini(struct amdgpu_device *adev);
-int amdgpu_aca_reset(struct amdgpu_device *adev);
-void amdgpu_aca_set_smu_funcs(struct amdgpu_device *adev, const struct aca_smu_funcs *smu_funcs);
-bool amdgpu_aca_is_enabled(struct amdgpu_device *adev);
-
-int aca_bank_info_decode(struct aca_bank *bank, struct aca_bank_info *info);
-int aca_bank_check_error_codes(struct amdgpu_device *adev, struct aca_bank *bank, int *err_codes, int size);
-
-int amdgpu_aca_add_handle(struct amdgpu_device *adev, struct aca_handle *handle,
- const char *name, const struct aca_info *aca_info, void *data);
-void amdgpu_aca_remove_handle(struct aca_handle *handle);
-int amdgpu_aca_smu_set_debug_mode(struct amdgpu_device *adev, bool en);
-void amdgpu_aca_smu_debugfs_init(struct amdgpu_device *adev, struct dentry *root);
-int aca_error_cache_log_bank_error(struct aca_handle *handle, struct aca_bank_info *info,
- enum aca_error_type type, u64 count);
-#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c
index 34a70e479f60..6fb129025761 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c
@@ -481,8 +481,7 @@ int amdgpu_cper_init(struct amdgpu_device *adev)
if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_ras_cper_en(adev))
return 0;
- else if (!amdgpu_sriov_vf(adev) && !amdgpu_uniras_enabled(adev) &&
- !amdgpu_aca_is_enabled(adev))
+ else if (!amdgpu_sriov_vf(adev) && !amdgpu_uniras_enabled(adev))
return 0;
r = amdgpu_cper_ring_init(adev);
@@ -501,7 +500,7 @@ int amdgpu_cper_init(struct amdgpu_device *adev)
int amdgpu_cper_fini(struct amdgpu_device *adev)
{
- if (!amdgpu_aca_is_enabled(adev) && !amdgpu_sriov_ras_cper_en(adev))
+ if (amdgpu_sriov_vf(adev))
return 0;
adev->cper.enabled = false;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
index 4ab6eccb5691..afa48b8986ff 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
@@ -1375,63 +1375,6 @@ static void amdgpu_ras_mgr_virt_error_data_statistics_update(struct ras_manager
obj->err_data.de_count = err_data->de_count;
}
-static struct ras_manager *get_ras_manager(struct amdgpu_device *adev, enum amdgpu_ras_block blk)
-{
- struct ras_common_if head;
-
- memset(&head, 0, sizeof(head));
- head.block = blk;
-
- return amdgpu_ras_find_obj(adev, &head);
-}
-
-int amdgpu_ras_bind_aca(struct amdgpu_device *adev, enum amdgpu_ras_block blk,
- const struct aca_info *aca_info, void *data)
-{
- struct ras_manager *obj;
-
- /* in resume phase, no need to create aca fs node */
- if (adev->in_suspend || amdgpu_reset_in_recovery(adev))
- return 0;
-
- obj = get_ras_manager(adev, blk);
- if (!obj)
- return -EINVAL;
-
- return amdgpu_aca_add_handle(adev, &obj->aca_handle, ras_block_str(blk), aca_info, data);
-}
-
-int amdgpu_ras_unbind_aca(struct amdgpu_device *adev, enum amdgpu_ras_block blk)
-{
- struct ras_manager *obj;
-
- obj = get_ras_manager(adev, blk);
- if (!obj)
- return -EINVAL;
-
- amdgpu_aca_remove_handle(&obj->aca_handle);
-
- return 0;
-}
-
-ssize_t amdgpu_ras_aca_sysfs_read(struct device *dev, struct device_attribute *attr,
- struct aca_handle *handle, char *buf, void *data)
-{
- struct ras_manager *obj = container_of(handle, struct ras_manager, aca_handle);
- struct ras_query_if info = {
- .head = obj->head,
- };
-
- if (!amdgpu_ras_get_error_query_ready(obj->adev))
- return sysfs_emit(buf, "Query currently inaccessible\n");
-
- if (amdgpu_ras_query_error_status(obj->adev, &info))
- return -EINVAL;
-
- return sysfs_emit(buf, "%s: %lu\n%s: %lu\n%s: %lu\n", "ue", info.ue_count,
- "ce", info.ce_count, "de", info.de_count);
-}
-
static int amdgpu_ras_query_error_status_helper(struct amdgpu_device *adev,
struct ras_query_if *info,
struct ras_err_data *err_data,
@@ -1591,7 +1534,6 @@ int amdgpu_ras_reset_error_count(struct amdgpu_device *adev,
{
struct amdgpu_ras_block_object *block_obj = amdgpu_ras_get_ras_block(adev, block, 0);
const struct amdgpu_mca_smu_funcs *mca_funcs = adev->mca.mca_funcs;
- const struct aca_smu_funcs *smu_funcs = adev->aca.smu_funcs;
if (!block_obj || !block_obj->hw_ops) {
dev_dbg_once(adev->dev, "%s doesn't config RAS function\n",
@@ -1600,7 +1542,7 @@ int amdgpu_ras_reset_error_count(struct amdgpu_device *adev,
}
if (!amdgpu_ras_is_supported(adev, block) ||
- !amdgpu_ras_get_aca_debug_mode(adev))
+ !amdgpu_ras_get_mca_debug_mode(adev))
return -EOPNOTSUPP;
if (amdgpu_sriov_vf(adev))
@@ -1608,8 +1550,7 @@ int amdgpu_ras_reset_error_count(struct amdgpu_device *adev,
/* skip ras error reset in gpu reset */
if ((amdgpu_in_reset(adev) || amdgpu_ras_in_recovery(adev)) &&
- ((smu_funcs && smu_funcs->set_debug_mode) ||
- (mca_funcs && mca_funcs->mca_set_debug_mode)))
+ mca_funcs && mca_funcs->mca_set_debug_mode)
return -EOPNOTSUPP;
if (block_obj->hw_ops->reset_ras_error_count)
@@ -2056,9 +1997,6 @@ int amdgpu_ras_sysfs_create(struct amdgpu_device *adev,
{
struct ras_manager *obj = amdgpu_ras_find_obj(adev, head);
- if (amdgpu_aca_is_enabled(adev))
- return 0;
-
if (!obj || obj->attr_inuse)
return -EINVAL;
@@ -2096,9 +2034,6 @@ int amdgpu_ras_sysfs_remove(struct amdgpu_device *adev,
{
struct ras_manager *obj = amdgpu_ras_find_obj(adev, head);
- if (amdgpu_aca_is_enabled(adev))
- return 0;
-
if (!obj || !obj->attr_inuse)
return -EINVAL;
@@ -2211,25 +2146,6 @@ static void amdgpu_ras_debugfs_create(struct amdgpu_device *adev,
obj, &amdgpu_ras_debugfs_ops);
}
-static bool amdgpu_ras_aca_is_supported(struct amdgpu_device *adev)
-{
- bool ret;
-
- switch (amdgpu_ip_version(adev, MP0_HWIP, 0)) {
- case IP_VERSION(13, 0, 6):
- case IP_VERSION(13, 0, 12):
- case IP_VERSION(13, 0, 14):
- case IP_VERSION(13, 0, 15):
- ret = true;
- break;
- default:
- ret = false;
- break;
- }
-
- return ret;
-}
-
void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev)
{
struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
@@ -2256,13 +2172,6 @@ void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev)
amdgpu_ras_debugfs_create(adev, &fs_info, dir);
}
}
-
- if (amdgpu_ras_aca_is_supported(adev)) {
- if (amdgpu_aca_is_enabled(adev))
- amdgpu_aca_smu_debugfs_init(adev, dir);
- else
- amdgpu_mca_smu_debugfs_init(adev, dir);
- }
}
/* debugfs end */
@@ -3883,15 +3792,6 @@ init_ras_enabled_flag:
adev->ras_enabled = amdgpu_ras_enable == 0 ? 0 :
adev->ras_hw_enabled & amdgpu_ras_mask;
- /* aca is disabled by default except for psp v13_0_6/v13_0_12/v13_0_14 */
- if (!amdgpu_sriov_vf(adev)) {
- adev->aca.is_enabled =
- (amdgpu_ip_version(adev, MP0_HWIP, 0) == IP_VERSION(13, 0, 6) ||
- amdgpu_ip_version(adev, MP0_HWIP, 0) == IP_VERSION(13, 0, 12) ||
- amdgpu_ip_version(adev, MP0_HWIP, 0) == IP_VERSION(13, 0, 14) ||
- amdgpu_ip_version(adev, MP0_HWIP, 0) == IP_VERSION(13, 0, 15));
- }
-
/* bad page feature is not applicable to specific app platform */
if (adev->gmc.is_app_apu &&
amdgpu_ip_version(adev, UMC_HWIP, 0) == IP_VERSION(12, 0, 0))
@@ -4112,15 +4012,6 @@ int amdgpu_ras_init(struct amdgpu_device *adev)
goto release_con;
}
- if (amdgpu_ras_aca_is_supported(adev)) {
- if (amdgpu_aca_is_enabled(adev))
- r = amdgpu_aca_init(adev);
- else
- r = amdgpu_mca_init(adev);
- if (r)
- goto release_con;
- }
-
con->init_task_pid = task_pid_nr(current);
get_task_comm(con->init_task_comm, current);
@@ -4348,24 +4239,6 @@ int amdgpu_ras_late_init(struct amdgpu_device *adev)
amdgpu_ras_event_mgr_init(adev);
- if (amdgpu_ras_aca_is_supported(adev)) {
- if (amdgpu_reset_in_recovery(adev)) {
- if (amdgpu_aca_is_enabled(adev))
- r = amdgpu_aca_reset(adev);
- else
- r = amdgpu_mca_reset(adev);
- if (r)
- return r;
- }
-
- if (!amdgpu_sriov_vf(adev)) {
- if (amdgpu_aca_is_enabled(adev))
- amdgpu_ras_set_aca_debug_mode(adev, false);
- else
- amdgpu_ras_set_mca_debug_mode(adev, false);
- }
- }
-
/* Guest side doesn't need init ras feature */
if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_ras_telemetry_en(adev))
return 0;
@@ -4453,13 +4326,6 @@ int amdgpu_ras_fini(struct amdgpu_device *adev)
amdgpu_ras_fs_fini(adev);
amdgpu_ras_interrupt_remove_all(adev);
- if (amdgpu_ras_aca_is_supported(adev)) {
- if (amdgpu_aca_is_enabled(adev))
- amdgpu_aca_fini(adev);
- else
- amdgpu_mca_fini(adev);
- }
-
WARN(AMDGPU_RAS_GET_FEATURES(con->features), "Feature mask is not cleared");
if (AMDGPU_RAS_GET_FEATURES(con->features))
@@ -4876,41 +4742,22 @@ int amdgpu_ras_set_mca_debug_mode(struct amdgpu_device *adev, bool enable)
if (con) {
ret = amdgpu_mca_smu_set_debug_mode(adev, enable);
if (!ret)
- con->is_aca_debug_mode = enable;
- }
-
- return ret;
-}
-
-int amdgpu_ras_set_aca_debug_mode(struct amdgpu_device *adev, bool enable)
-{
- struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
- int ret = 0;
-
- if (con) {
- if (amdgpu_aca_is_enabled(adev))
- ret = amdgpu_aca_smu_set_debug_mode(adev, enable);
- else
- ret = amdgpu_mca_smu_set_debug_mode(adev, enable);
- if (!ret)
- con->is_aca_debug_mode = enable;
+ con->is_mca_debug_mode = enable;
}
return ret;
}
-bool amdgpu_ras_get_aca_debug_mode(struct amdgpu_device *adev)
+bool amdgpu_ras_get_mca_debug_mode(struct amdgpu_device *adev)
{
struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
- const struct aca_smu_funcs *smu_funcs = adev->aca.smu_funcs;
const struct amdgpu_mca_smu_funcs *mca_funcs = adev->mca.mca_funcs;
if (!con)
return false;
- if ((amdgpu_aca_is_enabled(adev) && smu_funcs && smu_funcs->set_debug_mode) ||
- (!amdgpu_aca_is_enabled(adev) && mca_funcs && mca_funcs->mca_set_debug_mode))
- return con->is_aca_debug_mode;
+ if (mca_funcs && mca_funcs->mca_set_debug_mode)
+ return con->is_mca_debug_mode;
else
return true;
}
@@ -4920,7 +4767,6 @@ bool amdgpu_ras_get_error_query_mode(struct amdgpu_device *adev,
{
struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
const struct amdgpu_mca_smu_funcs *mca_funcs = adev->mca.mca_funcs;
- const struct aca_smu_funcs *smu_funcs = adev->aca.smu_funcs;
if (!con) {
*error_query_mode = AMDGPU_RAS_INVALID_ERROR_QUERY;
@@ -4929,9 +4775,9 @@ bool amdgpu_ras_get_error_query_mode(struct amdgpu_device *adev,
if (amdgpu_sriov_vf(adev)) {
*error_query_mode = AMDGPU_RAS_VIRT_ERROR_COUNT_QUERY;
- } else if ((smu_funcs && smu_funcs->set_debug_mode) || (mca_funcs && mca_funcs->mca_set_debug_mode)) {
+ } else if (mca_funcs && mca_funcs->mca_set_debug_mode) {
*error_query_mode =
- (con->is_aca_debug_mode) ? AMDGPU_RAS_DIRECT_ERROR_QUERY : AMDGPU_RAS_FIRMWARE_ERROR_QUERY;
+ (con->is_mca_debug_mode) ? AMDGPU_RAS_DIRECT_ERROR_QUERY : AMDGPU_RAS_FIRMWARE_ERROR_QUERY;
} else {
*error_query_mode = AMDGPU_RAS_DIRECT_ERROR_QUERY;
}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h
index f511af205af6..255ce167d1cd 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h
@@ -31,7 +31,6 @@
#include "ta_ras_if.h"
#include "amdgpu_ras_eeprom.h"
#include "amdgpu_smuio.h"
-#include "amdgpu_aca.h"
struct amdgpu_iv_entry;
@@ -572,7 +571,7 @@ struct amdgpu_ras {
/* Indicates smu whether need update bad channel info */
bool update_channel_flag;
/* Record status of smu mca debug mode */
- bool is_aca_debug_mode;
+ bool is_mca_debug_mode;
bool is_rma;
/* Record special requirements of gpu reset caller */
@@ -683,8 +682,6 @@ struct ras_manager {
struct ras_ih_data ih_data;
struct ras_err_data err_data;
-
- struct aca_handle aca_handle;
};
struct ras_badpage {
@@ -945,8 +942,7 @@ struct amdgpu_ras* amdgpu_ras_get_context(struct amdgpu_device *adev);
int amdgpu_ras_set_context(struct amdgpu_device *adev, struct amdgpu_ras *ras_con);
int amdgpu_ras_set_mca_debug_mode(struct amdgpu_device *adev, bool enable);
-int amdgpu_ras_set_aca_debug_mode(struct amdgpu_device *adev, bool enable);
-bool amdgpu_ras_get_aca_debug_mode(struct amdgpu_device *adev);
+bool amdgpu_ras_get_mca_debug_mode(struct amdgpu_device *adev);
bool amdgpu_ras_get_error_query_mode(struct amdgpu_device *adev,
unsigned int *mode);
@@ -987,12 +983,6 @@ int amdgpu_ras_error_statistic_de_count(struct ras_err_data *err_data,
struct amdgpu_smuio_mcm_config_info *mcm_info,
u64 count);
void amdgpu_ras_query_boot_status(struct amdgpu_device *adev, u32 num_instances);
-int amdgpu_ras_bind_aca(struct amdgpu_device *adev, enum amdgpu_ras_block blk,
- const struct aca_info *aca_info, void *data);
-int amdgpu_ras_unbind_aca(struct amdgpu_device *adev, enum amdgpu_ras_block blk);
-
-ssize_t amdgpu_ras_aca_sysfs_read(struct device *dev, struct device_attribute *attr,
- struct aca_handle *handle, char *buf, void *data);
void amdgpu_ras_set_fed(struct amdgpu_device *adev, bool status);
bool amdgpu_ras_get_fed_status(struct amdgpu_device *adev);