* [Qemu-devel] [7031] mc146818: add square wave output support
@ 2009-04-07 22:28 Aurelien Jarno
2009-04-09 13:48 ` Avi Kivity
0 siblings, 1 reply; 3+ messages in thread
From: Aurelien Jarno @ 2009-04-07 22:28 UTC (permalink / raw)
To: qemu-devel
Revision: 7031
http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=7031
Author: aurel32
Date: 2009-04-07 22:28:50 +0000 (Tue, 07 Apr 2009)
Log Message:
-----------
mc146818: add square wave output support
This is necessary for es40 as the sqw output is directly connected to the
core chipset.
Signed-off-by: Tristan Gingold <gingold@adacore.com>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
Modified Paths:
--------------
trunk/hw/mc146818rtc.c
trunk/hw/pc.h
Modified: trunk/hw/mc146818rtc.c
===================================================================
--- trunk/hw/mc146818rtc.c 2009-04-07 22:03:44 UTC (rev 7030)
+++ trunk/hw/mc146818rtc.c 2009-04-07 22:28:50 UTC (rev 7031)
@@ -50,11 +50,12 @@
#define REG_A_UIP 0x80
-#define REG_B_SET 0x80
-#define REG_B_PIE 0x40
-#define REG_B_AIE 0x20
-#define REG_B_UIE 0x10
-#define REG_B_DM 0x04
+#define REG_B_SET 0x80
+#define REG_B_PIE 0x40
+#define REG_B_AIE 0x20
+#define REG_B_UIE 0x10
+#define REG_B_SQWE 0x08
+#define REG_B_DM 0x04
struct RTCState {
uint8_t cmos_data[128];
@@ -62,6 +63,7 @@
struct tm current_tm;
int base_year;
qemu_irq irq;
+ qemu_irq sqw_irq;
int it_shift;
/* periodic timer */
QEMUTimer *periodic_timer;
@@ -95,16 +97,20 @@
{
int period_code, period;
int64_t cur_clock, next_irq_clock;
+ int enable_pie;
period_code = s->cmos_data[RTC_REG_A] & 0x0f;
#if defined TARGET_I386 || defined TARGET_X86_64
/* disable periodic timer if hpet is in legacy mode, since interrupts are
* disabled anyway.
*/
- if (period_code != 0 && (s->cmos_data[RTC_REG_B] & REG_B_PIE) && !hpet_in_legacy_mode()) {
+ enable_pie = hpet_in_legacy_mode();
#else
- if (period_code != 0 && (s->cmos_data[RTC_REG_B] & REG_B_PIE)) {
+ enable_pie = 1;
#endif
+ if (period_code != 0
+ && (((s->cmos_data[RTC_REG_B] & REG_B_PIE) && enable_pie)
+ || ((s->cmos_data[RTC_REG_B] & REG_B_SQWE) && s->sqw_irq))) {
if (period_code <= 2)
period_code += 7;
/* period in 32 Khz cycles */
@@ -138,8 +144,15 @@
return;
}
#endif
- s->cmos_data[RTC_REG_C] |= 0xc0;
- rtc_irq_raise(s->irq);
+ if (s->cmos_data[RTC_REG_B] & REG_B_PIE) {
+ s->cmos_data[RTC_REG_C] |= 0xc0;
+ rtc_irq_raise(s->irq);
+ }
+ if (s->cmos_data[RTC_REG_B] & REG_B_SQWE) {
+ /* Not square wave at all but we don't want 2048Hz interrupts!
+ Must be seen as a pulse. */
+ qemu_irq_raise(s->sqw_irq);
+ }
}
static void cmos_ioport_write(void *opaque, uint32_t addr, uint32_t data)
@@ -527,13 +540,14 @@
}
#endif
-RTCState *rtc_init(int base, qemu_irq irq, int base_year)
+RTCState *rtc_init_sqw(int base, qemu_irq irq, qemu_irq sqw_irq, int base_year)
{
RTCState *s;
s = qemu_mallocz(sizeof(RTCState));
s->irq = irq;
+ s->sqw_irq = sqw_irq;
s->cmos_data[RTC_REG_A] = 0x26;
s->cmos_data[RTC_REG_B] = 0x02;
s->cmos_data[RTC_REG_C] = 0x00;
@@ -563,6 +577,11 @@
return s;
}
+RTCState *rtc_init(int base, qemu_irq irq, int base_year)
+{
+ return rtc_init_sqw(base, irq, NULL, base_year);
+}
+
/* Memory mapped interface */
static uint32_t cmos_mm_readb (void *opaque, target_phys_addr_t addr)
{
Modified: trunk/hw/pc.h
===================================================================
--- trunk/hw/pc.h 2009-04-07 22:03:44 UTC (rev 7030)
+++ trunk/hw/pc.h 2009-04-07 22:28:50 UTC (rev 7031)
@@ -90,6 +90,7 @@
typedef struct RTCState RTCState;
RTCState *rtc_init(int base, qemu_irq irq, int base_year);
+RTCState *rtc_init_sqw(int base, qemu_irq irq, qemu_irq sqw_irq, int base_year);
RTCState *rtc_mm_init(target_phys_addr_t base, int it_shift, qemu_irq irq,
int base_year);
void rtc_set_memory(RTCState *s, int addr, int val);
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [7031] mc146818: add square wave output support
2009-04-07 22:28 [Qemu-devel] [7031] mc146818: add square wave output support Aurelien Jarno
@ 2009-04-09 13:48 ` Avi Kivity
2009-04-09 14:12 ` Tristan Gingold
0 siblings, 1 reply; 3+ messages in thread
From: Avi Kivity @ 2009-04-09 13:48 UTC (permalink / raw)
To: qemu-devel
Aurelien Jarno wrote:
> Revision: 7031
> http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=7031
> Author: aurel32
> Date: 2009-04-07 22:28:50 +0000 (Tue, 07 Apr 2009)
> Log Message:
> -----------
> mc146818: add square wave output support
>
> This is necessary for es40 as the sqw output is directly connected to the
> core chipset.
>
> Signed-off-by: Tristan Gingold <gingold@adacore.com>
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
>
>
This broke Windows XP (checked with -enable-kvm).
--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [7031] mc146818: add square wave output support
2009-04-09 13:48 ` Avi Kivity
@ 2009-04-09 14:12 ` Tristan Gingold
0 siblings, 0 replies; 3+ messages in thread
From: Tristan Gingold @ 2009-04-09 14:12 UTC (permalink / raw)
To: qemu-devel
On Apr 9, 2009, at 3:48 PM, Avi Kivity wrote:
> This broke Windows XP (checked with -enable-kvm).
Can you try to add a guard at mc146816rtc.c:154 so that qemu_irq_raise
is not called if sqw_irq is null ?
Tristan.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2009-04-09 14:13 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-04-07 22:28 [Qemu-devel] [7031] mc146818: add square wave output support Aurelien Jarno
2009-04-09 13:48 ` Avi Kivity
2009-04-09 14:12 ` Tristan Gingold
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.