mirror of https://github.com/xemu-project/xemu.git
integrator/cp: add support for REFCNT register
Linux kernel from version 3.4 requires CM_REFCNT register for sched timer for Integrator/CP board (integrator_defconfig). See http://infocenter.arm.com/help/topic/com.arm.doc.dui0138e/ch04s06s11.html Signed-off-by: Jan Petrous <jan.petrous@tieto.com> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
8f84271da8
commit
f53977f788
|
@ -36,6 +36,7 @@ typedef struct IntegratorCMState {
|
||||||
uint32_t cm_init;
|
uint32_t cm_init;
|
||||||
uint32_t cm_flags;
|
uint32_t cm_flags;
|
||||||
uint32_t cm_nvflags;
|
uint32_t cm_nvflags;
|
||||||
|
uint32_t cm_refcnt_offset;
|
||||||
uint32_t int_level;
|
uint32_t int_level;
|
||||||
uint32_t irq_enabled;
|
uint32_t irq_enabled;
|
||||||
uint32_t fiq_enabled;
|
uint32_t fiq_enabled;
|
||||||
|
@ -82,9 +83,13 @@ static uint64_t integratorcm_read(void *opaque, hwaddr offset,
|
||||||
return s->cm_sdram;
|
return s->cm_sdram;
|
||||||
case 9: /* CM_INIT */
|
case 9: /* CM_INIT */
|
||||||
return s->cm_init;
|
return s->cm_init;
|
||||||
case 10: /* CM_REFCT */
|
case 10: /* CM_REFCNT */
|
||||||
/* ??? High frequency timer. */
|
/* This register, CM_REFCNT, provides a 32-bit count value.
|
||||||
hw_error("integratorcm_read: CM_REFCT");
|
* The count increments at the fixed reference clock frequency of 24MHz
|
||||||
|
* and can be used as a real-time counter.
|
||||||
|
*/
|
||||||
|
return (uint32_t)muldiv64(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), 24,
|
||||||
|
1000) - s->cm_refcnt_offset;
|
||||||
case 12: /* CM_FLAGS */
|
case 12: /* CM_FLAGS */
|
||||||
return s->cm_flags;
|
return s->cm_flags;
|
||||||
case 14: /* CM_NVFLAGS */
|
case 14: /* CM_NVFLAGS */
|
||||||
|
@ -257,6 +262,8 @@ static int integratorcm_init(SysBusDevice *dev)
|
||||||
}
|
}
|
||||||
memcpy(integrator_spd + 73, "QEMU-MEMORY", 11);
|
memcpy(integrator_spd + 73, "QEMU-MEMORY", 11);
|
||||||
s->cm_init = 0x00000112;
|
s->cm_init = 0x00000112;
|
||||||
|
s->cm_refcnt_offset = muldiv64(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), 24,
|
||||||
|
1000);
|
||||||
memory_region_init_ram(&s->flash, OBJECT(s), "integrator.flash", 0x100000);
|
memory_region_init_ram(&s->flash, OBJECT(s), "integrator.flash", 0x100000);
|
||||||
vmstate_register_ram_global(&s->flash);
|
vmstate_register_ram_global(&s->flash);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue