18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include <linux/debugfs.h>
78c2ecf20Sopenharmony_ci#include <linux/kvm_host.h>
88c2ecf20Sopenharmony_ci#include <linux/seq_file.h>
98c2ecf20Sopenharmony_ci#include "kvmcpu.h"
108c2ecf20Sopenharmony_ci#include "ls3a_ext_irq.h"
118c2ecf20Sopenharmony_ci#include "ls7a_irq.h"
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#ifdef CONFIG_DEBUG_FS
148c2ecf20Sopenharmony_cistatic int irqchip_state_show(struct seq_file *m, void *v)
158c2ecf20Sopenharmony_ci{
168c2ecf20Sopenharmony_ci	struct kvm *kvm = m->private;
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci	kvm_get_kvm(kvm);
198c2ecf20Sopenharmony_ci	kvm_dump_ls3a_extirq_state(m, kvm->arch.v_extirq);
208c2ecf20Sopenharmony_ci	kvm_dump_ls7a_ioapic_state(m, kvm->arch.v_ioapic);
218c2ecf20Sopenharmony_ci	kvm_put_kvm(kvm);
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci	return 0;
248c2ecf20Sopenharmony_ci}
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cistatic int irqchip_debug_open(struct inode *inode, struct file *file)
278c2ecf20Sopenharmony_ci{
288c2ecf20Sopenharmony_ci	return single_open(file, irqchip_state_show, inode->i_private);
298c2ecf20Sopenharmony_ci}
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistatic const struct file_operations irqchip_debug_fops = {
328c2ecf20Sopenharmony_ci	.open       = irqchip_debug_open,
338c2ecf20Sopenharmony_ci	.read       = seq_read,
348c2ecf20Sopenharmony_ci	.llseek     = seq_lseek,
358c2ecf20Sopenharmony_ci	.release    = single_release,
368c2ecf20Sopenharmony_ci};
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_civoid irqchip_debug_init(struct kvm *kvm)
398c2ecf20Sopenharmony_ci{
408c2ecf20Sopenharmony_ci	debugfs_create_file("irqchip-state", 0444, kvm->debugfs_dentry, kvm,
418c2ecf20Sopenharmony_ci			    &irqchip_debug_fops);
428c2ecf20Sopenharmony_ci}
438c2ecf20Sopenharmony_ci#else
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_civoid irqchip_debug_init(struct kvm *kvm) {}
468c2ecf20Sopenharmony_ci#endif
478c2ecf20Sopenharmony_civoid irqchip_debug_destroy(struct kvm *kvm)
488c2ecf20Sopenharmony_ci{
498c2ecf20Sopenharmony_ci}
50