-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
LoongArch: KVM: Add PCHPIC device support
Add device model for PCHPIC interrupt controller, implemente basic create & destroy interface, and register device model to kvm device table. Signed-off-by: Tianrui Zhao <zhaotianrui@loongson.cn> Signed-off-by: Xianglai Li <lixianglai@loongson.cn> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
- Loading branch information
Xianglai Li
authored and
Huacai Chen
committed
Nov 13, 2024
1 parent
1ad7efa
commit e785dfa
Showing
6 changed files
with
130 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* | ||
* Copyright (C) 2024 Loongson Technology Corporation Limited | ||
*/ | ||
|
||
#ifndef __ASM_KVM_PCH_PIC_H | ||
#define __ASM_KVM_PCH_PIC_H | ||
|
||
#include <kvm/iodev.h> | ||
|
||
struct loongarch_pch_pic { | ||
spinlock_t lock; | ||
struct kvm *kvm; | ||
struct kvm_io_device device; | ||
uint64_t mask; /* 1:disable irq, 0:enable irq */ | ||
uint64_t htmsi_en; /* 1:msi */ | ||
uint64_t edge; /* 1:edge triggered, 0:level triggered */ | ||
uint64_t auto_ctrl0; /* only use default value 00b */ | ||
uint64_t auto_ctrl1; /* only use default value 00b */ | ||
uint64_t last_intirr; /* edge detection */ | ||
uint64_t irr; /* interrupt request register */ | ||
uint64_t isr; /* interrupt service register */ | ||
uint64_t polarity; /* 0: high level trigger, 1: low level trigger */ | ||
uint8_t route_entry[64]; /* default value 0, route to int0: eiointc */ | ||
uint8_t htmsi_vector[64]; /* irq route table for routing to eiointc */ | ||
uint64_t pch_pic_base; | ||
}; | ||
|
||
int kvm_loongarch_register_pch_pic_device(void); | ||
|
||
#endif /* __ASM_KVM_PCH_PIC_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* | ||
* Copyright (C) 2024 Loongson Technology Corporation Limited | ||
*/ | ||
|
||
#include <asm/kvm_eiointc.h> | ||
#include <asm/kvm_pch_pic.h> | ||
#include <asm/kvm_vcpu.h> | ||
#include <linux/count_zeros.h> | ||
|
||
static int kvm_pch_pic_read(struct kvm_vcpu *vcpu, | ||
struct kvm_io_device *dev, | ||
gpa_t addr, int len, void *val) | ||
{ | ||
return 0; | ||
} | ||
|
||
static int kvm_pch_pic_write(struct kvm_vcpu *vcpu, | ||
struct kvm_io_device *dev, | ||
gpa_t addr, int len, const void *val) | ||
{ | ||
return 0; | ||
} | ||
|
||
static const struct kvm_io_device_ops kvm_pch_pic_ops = { | ||
.read = kvm_pch_pic_read, | ||
.write = kvm_pch_pic_write, | ||
}; | ||
|
||
static int kvm_pch_pic_get_attr(struct kvm_device *dev, | ||
struct kvm_device_attr *attr) | ||
{ | ||
return 0; | ||
} | ||
|
||
static int kvm_pch_pic_set_attr(struct kvm_device *dev, | ||
struct kvm_device_attr *attr) | ||
{ | ||
return 0; | ||
} | ||
|
||
static int kvm_pch_pic_create(struct kvm_device *dev, u32 type) | ||
{ | ||
struct kvm *kvm = dev->kvm; | ||
struct loongarch_pch_pic *s; | ||
|
||
/* pch pic should not has been created */ | ||
if (kvm->arch.pch_pic) | ||
return -EINVAL; | ||
|
||
s = kzalloc(sizeof(struct loongarch_pch_pic), GFP_KERNEL); | ||
if (!s) | ||
return -ENOMEM; | ||
|
||
spin_lock_init(&s->lock); | ||
s->kvm = kvm; | ||
kvm->arch.pch_pic = s; | ||
|
||
return 0; | ||
} | ||
|
||
static void kvm_pch_pic_destroy(struct kvm_device *dev) | ||
{ | ||
struct kvm *kvm; | ||
struct loongarch_pch_pic *s; | ||
|
||
if (!dev || !dev->kvm || !dev->kvm->arch.pch_pic) | ||
return; | ||
|
||
kvm = dev->kvm; | ||
s = kvm->arch.pch_pic; | ||
/* unregister pch pic device and free it's memory */ | ||
kvm_io_bus_unregister_dev(kvm, KVM_MMIO_BUS, &s->device); | ||
kfree(s); | ||
} | ||
|
||
static struct kvm_device_ops kvm_pch_pic_dev_ops = { | ||
.name = "kvm-loongarch-pch-pic", | ||
.create = kvm_pch_pic_create, | ||
.destroy = kvm_pch_pic_destroy, | ||
.set_attr = kvm_pch_pic_set_attr, | ||
.get_attr = kvm_pch_pic_get_attr, | ||
}; | ||
|
||
int kvm_loongarch_register_pch_pic_device(void) | ||
{ | ||
return kvm_register_device_ops(&kvm_pch_pic_dev_ops, KVM_DEV_TYPE_LOONGARCH_PCHPIC); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters