@@ -14,8 +14,8 @@
* +-------+----+-------+-------+--------+-----+---------+---......
* | PCI |////| plat | | | | |
* | I/O |////| MMIO: | Flash | virtio | GIC | PCI | DRAM
- * | space |////| UART | | MMIO | | (AXI) |
- * | |////| | | | | |
+ * | space |////| UART, | | MMIO | | (AXI) |
+ * | |////| RTC | | | | |
* +-------+----+-------+-------+--------+-----+---------+---......
*/
@@ -31,6 +31,9 @@
#define ARM_UART_MMIO_BASE ARM_MMIO_AREA
#define ARM_UART_MMIO_SIZE 0x10000
+#define ARM_RTC_MMIO_BASE (ARM_UART_MMIO_BASE + ARM_UART_MMIO_SIZE)
+#define ARM_RTC_MMIO_SIZE 0x10000
+
#define KVM_FLASH_MMIO_BASE (ARM_MMIO_AREA + 0x1000000)
#define KVM_FLASH_MAX_SIZE 0x1000000
@@ -5,6 +5,15 @@
#include <time.h>
+#if defined(CONFIG_ARM) || defined(CONFIG_ARM64)
+#define RTC_BUS_TYPE DEVICE_BUS_MMIO
+#define RTC_BASE_ADDRESS ARM_RTC_MMIO_BASE
+#else
+/* PORT 0070-007F - CMOS RAM/RTC (REAL TIME CLOCK) */
+#define RTC_BUS_TYPE DEVICE_BUS_IOPORT
+#define RTC_BASE_ADDRESS 0x70
+#endif
+
/*
* MC146818 RTC registers
*/
@@ -49,7 +58,7 @@ static void cmos_ram_io(struct kvm_cpu *vcpu, u64 addr, u8 *data,
time_t ti;
if (is_write) {
- if (addr == 0x70) { /* index register */
+ if (addr == RTC_BASE_ADDRESS) { /* index register */
u8 value = ioport__read8(data);
vcpu->kvm->nmi_disabled = value & (1UL << 7);
@@ -70,7 +79,7 @@ static void cmos_ram_io(struct kvm_cpu *vcpu, u64 addr, u8 *data,
return;
}
- if (addr == 0x70)
+ if (addr == RTC_BASE_ADDRESS) /* index register is write-only */
return;
time(&ti);
@@ -127,7 +136,7 @@ static void generate_rtc_fdt_node(void *fdt,
u8 irq,
enum irq_type))
{
- u64 reg_prop[2] = { cpu_to_fdt64(0x70), cpu_to_fdt64(2) };
+ u64 reg_prop[2] = { cpu_to_fdt64(RTC_BASE_ADDRESS), cpu_to_fdt64(2) };
_FDT(fdt_begin_node(fdt, "rtc"));
_FDT(fdt_property_string(fdt, "compatible", "motorola,mc146818"));
@@ -139,7 +148,7 @@ static void generate_rtc_fdt_node(void *fdt,
#endif
struct device_header rtc_dev_hdr = {
- .bus_type = DEVICE_BUS_IOPORT,
+ .bus_type = RTC_BUS_TYPE,
.data = generate_rtc_fdt_node,
};
@@ -151,8 +160,8 @@ int rtc__init(struct kvm *kvm)
if (r < 0)
return r;
- /* PORT 0070-007F - CMOS RAM/RTC (REAL TIME CLOCK) */
- r = kvm__register_pio(kvm, 0x0070, 2, cmos_ram_io, NULL);
+ r = kvm__register_iotrap(kvm, RTC_BASE_ADDRESS, 2, cmos_ram_io, NULL,
+ RTC_BUS_TYPE);
if (r < 0)
goto out_device;
@@ -170,8 +179,7 @@ dev_init(rtc__init);
int rtc__exit(struct kvm *kvm)
{
- /* PORT 0070-007F - CMOS RAM/RTC (REAL TIME CLOCK) */
- kvm__deregister_pio(kvm, 0x0070);
+ kvm__deregister_iotrap(kvm, RTC_BASE_ADDRESS, RTC_BUS_TYPE);
return 0;
}