Lines Matching +full:bank +full:- +full:name

31 typedef int bank_handler_t(struct aca_handle *handle, struct aca_bank *bank, enum aca_smu_type type…
55 INIT_LIST_HEAD(&banks->list); in aca_banks_init()
58 static int aca_banks_add_bank(struct aca_banks *banks, struct aca_bank *bank) in aca_banks_add_bank() argument
62 if (!bank) in aca_banks_add_bank()
63 return -EINVAL; in aca_banks_add_bank()
67 return -ENOMEM; in aca_banks_add_bank()
69 memcpy(&node->bank, bank, sizeof(*bank)); in aca_banks_add_bank()
71 INIT_LIST_HEAD(&node->node); in aca_banks_add_bank()
72 list_add_tail(&node->node, &banks->list); in aca_banks_add_bank()
74 banks->nr_banks++; in aca_banks_add_bank()
83 if (list_empty(&banks->list)) in aca_banks_release()
86 list_for_each_entry_safe(node, tmp, &banks->list, node) { in aca_banks_release()
87 list_del(&node->node); in aca_banks_release()
94 struct amdgpu_aca *aca = &adev->aca; in aca_smu_get_valid_aca_count()
95 const struct aca_smu_funcs *smu_funcs = aca->smu_funcs; in aca_smu_get_valid_aca_count()
98 return -EINVAL; in aca_smu_get_valid_aca_count()
100 if (!smu_funcs || !smu_funcs->get_valid_aca_count) in aca_smu_get_valid_aca_count()
101 return -EOPNOTSUPP; in aca_smu_get_valid_aca_count()
103 return smu_funcs->get_valid_aca_count(adev, type, count); in aca_smu_get_valid_aca_count()
107 const char *name; member
122 static void aca_smu_bank_dump(struct amdgpu_device *adev, int idx, int total, struct aca_bank *bank, in aca_smu_bank_dump() argument
125 u64 event_id = qctx ? qctx->evid.event_id : RAS_EVENT_INVALID_ID; in aca_smu_bank_dump()
132 idx + 1, total, aca_regs[i].name, bank->regs[aca_regs[i].reg_idx]); in aca_smu_bank_dump()
139 struct amdgpu_aca *aca = &adev->aca; in aca_smu_get_valid_aca_banks()
140 const struct aca_smu_funcs *smu_funcs = aca->smu_funcs; in aca_smu_get_valid_aca_banks()
141 struct aca_bank bank; in aca_smu_get_valid_aca_banks() local
147 if (!smu_funcs || !smu_funcs->get_valid_aca_bank) in aca_smu_get_valid_aca_banks()
148 return -EOPNOTSUPP; in aca_smu_get_valid_aca_banks()
152 max_count = smu_funcs->max_ue_bank_count; in aca_smu_get_valid_aca_banks()
155 max_count = smu_funcs->max_ce_bank_count; in aca_smu_get_valid_aca_banks()
158 return -EINVAL; in aca_smu_get_valid_aca_banks()
162 return -EINVAL; in aca_smu_get_valid_aca_banks()
166 memset(&bank, 0, sizeof(bank)); in aca_smu_get_valid_aca_banks()
167 ret = smu_funcs->get_valid_aca_bank(adev, type, start + i, &bank); in aca_smu_get_valid_aca_banks()
171 bank.type = type; in aca_smu_get_valid_aca_banks()
173 aca_smu_bank_dump(adev, i, count, &bank, qctx); in aca_smu_get_valid_aca_banks()
175 ret = aca_banks_add_bank(banks, &bank); in aca_smu_get_valid_aca_banks()
183 static bool aca_bank_hwip_is_matched(struct aca_bank *bank, enum aca_hwip_type type) in aca_bank_hwip_is_matched() argument
190 if (!bank || type == ACA_HWIP_TYPE_UNKNOW) in aca_bank_hwip_is_matched()
194 if (!hwip->hwid) in aca_bank_hwip_is_matched()
197 ipid = bank->regs[ACA_REG_IDX_IPID]; in aca_bank_hwip_is_matched()
201 return hwip->hwid == hwid && hwip->mcatype == mcatype; in aca_bank_hwip_is_matched()
204 static bool aca_bank_is_valid(struct aca_handle *handle, struct aca_bank *bank, enum aca_smu_type t… in aca_bank_is_valid() argument
206 const struct aca_bank_ops *bank_ops = handle->bank_ops; in aca_bank_is_valid()
208 if (!aca_bank_hwip_is_matched(bank, handle->hwip)) in aca_bank_is_valid()
211 if (!bank_ops->aca_bank_is_valid) in aca_bank_is_valid()
214 return bank_ops->aca_bank_is_valid(handle, bank, type, handle->data); in aca_bank_is_valid()
225 INIT_LIST_HEAD(&bank_error->node); in new_bank_error()
226 memcpy(&bank_error->info, info, sizeof(*info)); in new_bank_error()
228 mutex_lock(&aerr->lock); in new_bank_error()
229 list_add_tail(&bank_error->node, &aerr->list); in new_bank_error()
230 mutex_unlock(&aerr->lock); in new_bank_error()
241 mutex_lock(&aerr->lock); in find_bank_error()
242 list_for_each_entry(bank_error, &aerr->list, node) { in find_bank_error()
243 tmp_info = &bank_error->info; in find_bank_error()
244 if (tmp_info->socket_id == info->socket_id && in find_bank_error()
245 tmp_info->die_id == info->die_id) { in find_bank_error()
252 mutex_unlock(&aerr->lock); in find_bank_error()
262 list_del(&bank_error->node); in aca_bank_error_remove()
263 aerr->nr_errors--; in aca_bank_error_remove()
285 struct aca_error_cache *error_cache = &handle->error_cache; in aca_error_cache_log_bank_error()
290 return -EINVAL; in aca_error_cache_log_bank_error()
295 aerr = &error_cache->errors[type]; in aca_error_cache_log_bank_error()
298 return -ENOMEM; in aca_error_cache_log_bank_error()
300 bank_error->count += count; in aca_error_cache_log_bank_error()
305 static int aca_bank_parser(struct aca_handle *handle, struct aca_bank *bank, enum aca_smu_type type) in aca_bank_parser() argument
307 const struct aca_bank_ops *bank_ops = handle->bank_ops; in aca_bank_parser()
309 if (!bank) in aca_bank_parser()
310 return -EINVAL; in aca_bank_parser()
312 if (!bank_ops->aca_bank_parser) in aca_bank_parser()
313 return -EOPNOTSUPP; in aca_bank_parser()
315 return bank_ops->aca_bank_parser(handle, bank, type, in aca_bank_parser()
316 handle->data); in aca_bank_parser()
319 static int handler_aca_log_bank_error(struct aca_handle *handle, struct aca_bank *bank, in handler_aca_log_bank_error() argument
324 ret = aca_bank_parser(handle, bank, type); in handler_aca_log_bank_error()
331 static int aca_dispatch_bank(struct aca_handle_manager *mgr, struct aca_bank *bank, in aca_dispatch_bank() argument
337 if (list_empty(&mgr->list)) in aca_dispatch_bank()
340 list_for_each_entry(handle, &mgr->list, node) { in aca_dispatch_bank()
341 if (!aca_bank_is_valid(handle, bank, type)) in aca_dispatch_bank()
344 ret = handler(handle, bank, type, data); in aca_dispatch_bank()
356 struct aca_bank *bank; in aca_dispatch_banks() local
360 return -EINVAL; in aca_dispatch_banks()
363 if (list_empty(&mgr->list) || list_empty(&banks->list)) in aca_dispatch_banks()
366 list_for_each_entry(node, &banks->list, node) { in aca_dispatch_banks()
367 bank = &node->bank; in aca_dispatch_banks()
369 ret = aca_dispatch_bank(mgr, bank, type, handler, data); in aca_dispatch_banks()
379 struct amdgpu_aca *aca = &adev->aca; in aca_bank_should_update()
385 * the aca bank is only updated once during the gpu recovery stage. in aca_bank_should_update()
389 ret = atomic_cmpxchg(&aca->ue_update_flag, 0, 1) == 0; in aca_bank_should_update()
391 atomic_set(&aca->ue_update_flag, 0); in aca_bank_should_update()
400 struct amdgpu_aca *aca = &adev->aca; in aca_banks_update()
405 if (list_empty(&aca->mgr.list)) in aca_banks_update()
429 ret = aca_dispatch_banks(&aca->mgr, &banks, type, in aca_banks_update()
447 return -EINVAL; in aca_log_aca_error_data()
449 count = bank_error->count; in aca_log_aca_error_data()
453 info = &bank_error->info; in aca_log_aca_error_data()
454 mcm_info.die_id = info->die_id; in aca_log_aca_error_data()
455 mcm_info.socket_id = info->socket_id; in aca_log_aca_error_data()
476 struct aca_error_cache *error_cache = &handle->error_cache; in aca_log_aca_error()
477 struct aca_error *aerr = &error_cache->errors[type]; in aca_log_aca_error()
480 mutex_lock(&aerr->lock); in aca_log_aca_error()
482 if (list_empty(&aerr->list)) in aca_log_aca_error()
485 list_for_each_entry_safe(bank_error, tmp, &aerr->list, node) { in aca_log_aca_error()
491 mutex_unlock(&aerr->lock); in aca_log_aca_error()
511 return -EINVAL; in __aca_get_error_data()
514 /* update aca bank to aca source error_cache first */ in __aca_get_error_data()
524 if (!handle->mask || !list_empty(&handle->node)) in aca_handle_is_valid()
535 return -EINVAL; in amdgpu_aca_get_error_data()
538 return -EOPNOTSUPP; in amdgpu_aca_get_error_data()
540 if ((type < 0) || (!(BIT(type) & handle->mask))) in amdgpu_aca_get_error_data()
548 mutex_init(&aerr->lock); in aca_error_init()
549 INIT_LIST_HEAD(&aerr->list); in aca_error_init()
550 aerr->type = type; in aca_error_init()
551 aerr->nr_errors = 0; in aca_error_init()
556 struct aca_error_cache *error_cache = &handle->error_cache; in aca_init_error_cache()
560 aca_error_init(&error_cache->errors[type], type); in aca_init_error_cache()
567 mutex_lock(&aerr->lock); in aca_error_fini()
568 if (list_empty(&aerr->list)) in aca_error_fini()
571 list_for_each_entry_safe(bank_error, tmp, &aerr->list, node) in aca_error_fini()
575 mutex_destroy(&aerr->lock); in aca_error_fini()
580 struct aca_error_cache *error_cache = &handle->error_cache; in aca_fini_error_cache()
584 aca_error_fini(&error_cache->errors[type]); in aca_fini_error_cache()
588 const char *name, const struct aca_info *ras_info, void *data) in add_aca_handle() argument
592 handle->adev = adev; in add_aca_handle()
593 handle->mgr = mgr; in add_aca_handle()
594 handle->name = name; in add_aca_handle()
595 handle->hwip = ras_info->hwip; in add_aca_handle()
596 handle->mask = ras_info->mask; in add_aca_handle()
597 handle->bank_ops = ras_info->bank_ops; in add_aca_handle()
598 handle->data = data; in add_aca_handle()
601 INIT_LIST_HEAD(&handle->node); in add_aca_handle()
602 list_add_tail(&handle->node, &mgr->list); in add_aca_handle()
603 mgr->nr_handles++; in add_aca_handle()
615 return amdgpu_ras_aca_sysfs_read(dev, attr, handle, buf, handle->data); in aca_sysfs_read()
620 struct device_attribute *aca_attr = &handle->aca_attr; in add_aca_sysfs()
622 snprintf(handle->attr_name, sizeof(handle->attr_name) - 1, "aca_%s", handle->name); in add_aca_sysfs()
623 aca_attr->show = aca_sysfs_read; in add_aca_sysfs()
624 aca_attr->attr.name = handle->attr_name; in add_aca_sysfs()
625 aca_attr->attr.mode = S_IRUGO; in add_aca_sysfs()
626 sysfs_attr_init(&aca_attr->attr); in add_aca_sysfs()
628 return sysfs_add_file_to_group(&adev->dev->kobj, in add_aca_sysfs()
629 &aca_attr->attr, in add_aca_sysfs()
634 const char *name, const struct aca_info *ras_info, void *data) in amdgpu_aca_add_handle() argument
636 struct amdgpu_aca *aca = &adev->aca; in amdgpu_aca_add_handle()
642 ret = add_aca_handle(adev, &aca->mgr, handle, name, ras_info, data); in amdgpu_aca_add_handle()
651 struct aca_handle_manager *mgr = handle->mgr; in remove_aca_handle()
654 list_del(&handle->node); in remove_aca_handle()
655 mgr->nr_handles--; in remove_aca_handle()
660 struct amdgpu_device *adev = handle->adev; in remove_aca_sysfs()
661 struct device_attribute *aca_attr = &handle->aca_attr; in remove_aca_sysfs()
663 if (adev->dev->kobj.sd) in remove_aca_sysfs()
664 sysfs_remove_file_from_group(&adev->dev->kobj, in remove_aca_sysfs()
665 &aca_attr->attr, in remove_aca_sysfs()
671 if (!handle || list_empty(&handle->node)) in amdgpu_aca_remove_handle()
680 INIT_LIST_HEAD(&mgr->list); in aca_manager_init()
681 mgr->nr_handles = 0; in aca_manager_init()
690 if (list_empty(&mgr->list)) in aca_manager_fini()
693 list_for_each_entry_safe(handle, tmp, &mgr->list, node) in aca_manager_fini()
699 return (adev->aca.is_enabled || in amdgpu_aca_is_enabled()
700 adev->debug_enable_ras_aca); in amdgpu_aca_is_enabled()
705 struct amdgpu_aca *aca = &adev->aca; in amdgpu_aca_init()
708 atomic_set(&aca->ue_update_flag, 0); in amdgpu_aca_init()
710 ret = aca_manager_init(&aca->mgr); in amdgpu_aca_init()
719 struct amdgpu_aca *aca = &adev->aca; in amdgpu_aca_fini()
721 aca_manager_fini(&aca->mgr); in amdgpu_aca_fini()
723 atomic_set(&aca->ue_update_flag, 0); in amdgpu_aca_fini()
728 struct amdgpu_aca *aca = &adev->aca; in amdgpu_aca_reset()
730 atomic_set(&aca->ue_update_flag, 0); in amdgpu_aca_reset()
737 struct amdgpu_aca *aca = &adev->aca; in amdgpu_aca_set_smu_funcs()
739 WARN_ON(aca->smu_funcs); in amdgpu_aca_set_smu_funcs()
740 aca->smu_funcs = smu_funcs; in amdgpu_aca_set_smu_funcs()
743 int aca_bank_info_decode(struct aca_bank *bank, struct aca_bank_info *info) in aca_bank_info_decode() argument
748 if (!bank || !info) in aca_bank_info_decode()
749 return -EINVAL; in aca_bank_info_decode()
751 ipid = bank->regs[ACA_REG_IDX_IPID]; in aca_bank_info_decode()
752 info->hwid = ACA_REG__IPID__HARDWAREID(ipid); in aca_bank_info_decode()
753 info->mcatype = ACA_REG__IPID__MCATYPE(ipid); in aca_bank_info_decode()
761 info->die_id = ((instidhi >> 2) & 0x03); in aca_bank_info_decode()
762 info->socket_id = ((instidlo & 0x1) << 2) | (instidhi & 0x03); in aca_bank_info_decode()
767 static int aca_bank_get_error_code(struct amdgpu_device *adev, struct aca_bank *bank) in aca_bank_get_error_code() argument
769 struct amdgpu_aca *aca = &adev->aca; in aca_bank_get_error_code()
770 const struct aca_smu_funcs *smu_funcs = aca->smu_funcs; in aca_bank_get_error_code()
772 if (!smu_funcs || !smu_funcs->parse_error_code) in aca_bank_get_error_code()
773 return -EOPNOTSUPP; in aca_bank_get_error_code()
775 return smu_funcs->parse_error_code(adev, bank); in aca_bank_get_error_code()
778 int aca_bank_check_error_codes(struct amdgpu_device *adev, struct aca_bank *bank, int *err_codes, i… in aca_bank_check_error_codes() argument
782 if (!bank || !err_codes) in aca_bank_check_error_codes()
783 return -EINVAL; in aca_bank_check_error_codes()
785 error_code = aca_bank_get_error_code(adev, bank); in aca_bank_check_error_codes()
794 return -EINVAL; in aca_bank_check_error_codes()
799 struct amdgpu_aca *aca = &adev->aca; in amdgpu_aca_smu_set_debug_mode()
800 const struct aca_smu_funcs *smu_funcs = aca->smu_funcs; in amdgpu_aca_smu_set_debug_mode()
802 if (!smu_funcs || !smu_funcs->set_debug_mode) in amdgpu_aca_smu_set_debug_mode()
803 return -EOPNOTSUPP; in amdgpu_aca_smu_set_debug_mode()
805 return smu_funcs->set_debug_mode(adev, en); in amdgpu_aca_smu_set_debug_mode()
818 dev_info(adev->dev, "amdgpu set smu aca debug mode %s success\n", val ? "on" : "off"); in amdgpu_aca_smu_debug_mode_set()
823 static void aca_dump_entry(struct seq_file *m, struct aca_bank *bank, enum aca_smu_type type, int i… in aca_dump_entry() argument
828 ret = aca_bank_info_decode(bank, &info); in aca_dump_entry()
837 …seq_printf(m, "aca entry[%d].regs[%d]: 0x%016llx\n", idx, aca_regs[i].reg_idx, bank->regs[aca_regs… in aca_dump_entry()
845 static int handler_aca_bank_dump(struct aca_handle *handle, struct aca_bank *bank, in handler_aca_bank_dump() argument
850 aca_dump_entry(ctx->m, bank, type, ctx->idx++); in handler_aca_bank_dump()
852 return handler_aca_log_bank_error(handle, bank, type, NULL); in handler_aca_bank_dump()
857 struct amdgpu_device *adev = (struct amdgpu_device *)m->private; in aca_dump_show()
873 return single_open(file, aca_dump_ce_show, inode->i_private); in aca_dump_ce_open()
891 return single_open(file, aca_dump_ue_show, inode->i_private); in aca_dump_ue_open()