mirror of
https://github.com/clearlinux/kvmtool.git
synced 2026-09-04 20:51:28 +00:00
Currently we describe every interrupt for each device in the FDT as being edge triggered. Add a parameter to the irq property generation to allow devices to specify their interrupts as level triggered if needed. Signed-off-by: Andre Przywara <andre.przywara@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
80 lines
1.8 KiB
C
80 lines
1.8 KiB
C
#ifndef KVM__IOPORT_H
|
|
#define KVM__IOPORT_H
|
|
|
|
#include "kvm/devices.h"
|
|
#include "kvm/kvm-cpu.h"
|
|
#include "kvm/rbtree-interval.h"
|
|
#include "kvm/fdt.h"
|
|
|
|
#include <stdbool.h>
|
|
#include <limits.h>
|
|
#include <asm/types.h>
|
|
#include <linux/types.h>
|
|
#include <linux/byteorder.h>
|
|
|
|
/* some ports we reserve for own use */
|
|
#define IOPORT_DBG 0xe0
|
|
#define IOPORT_START 0x6200
|
|
#define IOPORT_SIZE 0x400
|
|
|
|
#define IOPORT_EMPTY USHRT_MAX
|
|
|
|
struct kvm;
|
|
|
|
struct ioport {
|
|
struct rb_int_node node;
|
|
struct ioport_operations *ops;
|
|
void *priv;
|
|
struct device_header dev_hdr;
|
|
};
|
|
|
|
struct ioport_operations {
|
|
bool (*io_in)(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size);
|
|
bool (*io_out)(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size);
|
|
void (*generate_fdt_node)(struct ioport *ioport, void *fdt,
|
|
void (*generate_irq_prop)(void *fdt,
|
|
u8 irq,
|
|
enum irq_type));
|
|
};
|
|
|
|
void ioport__setup_arch(struct kvm *kvm);
|
|
void ioport__map_irq(u8 *irq);
|
|
|
|
int ioport__register(struct kvm *kvm, u16 port, struct ioport_operations *ops,
|
|
int count, void *param);
|
|
int ioport__unregister(struct kvm *kvm, u16 port);
|
|
int ioport__init(struct kvm *kvm);
|
|
int ioport__exit(struct kvm *kvm);
|
|
|
|
static inline u8 ioport__read8(u8 *data)
|
|
{
|
|
return *data;
|
|
}
|
|
/* On BE platforms, PCI I/O is byteswapped, i.e. LE, so swap back. */
|
|
static inline u16 ioport__read16(u16 *data)
|
|
{
|
|
return le16_to_cpu(*data);
|
|
}
|
|
|
|
static inline u32 ioport__read32(u32 *data)
|
|
{
|
|
return le32_to_cpu(*data);
|
|
}
|
|
|
|
static inline void ioport__write8(u8 *data, u8 value)
|
|
{
|
|
*data = value;
|
|
}
|
|
|
|
static inline void ioport__write16(u16 *data, u16 value)
|
|
{
|
|
*data = cpu_to_le16(value);
|
|
}
|
|
|
|
static inline void ioport__write32(u32 *data, u32 value)
|
|
{
|
|
*data = cpu_to_le32(value);
|
|
}
|
|
|
|
#endif /* KVM__IOPORT_H */
|