mc146818rtc: embrace all x86 specific code
Introduce a function, rtc_policy_slew_deliver_irq(), which delivers irq if LOST_TICK_POLICY_SLEW is used, as which is only supported on x86, other platforms call it will trigger a assert After that, we can move the x86 specific code to the common place Signed-off-by: Xiao Guangrong <xiaoguangrong@tencent.com> Message-Id: <20170510083259.3900-6-xiaoguangrong@tencent.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									388ad5d296
								
							
						
					
					
						commit
						e0c8b950d1
					
				@ -125,17 +125,34 @@ static void rtc_coalesced_timer_update(RTCState *s)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static QLIST_HEAD(, RTCState) rtc_devices =
 | 
				
			||||||
 | 
					    QLIST_HEAD_INITIALIZER(rtc_devices);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef TARGET_I386
 | 
					#ifdef TARGET_I386
 | 
				
			||||||
 | 
					void qmp_rtc_reset_reinjection(Error **errp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    RTCState *s;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    QLIST_FOREACH(s, &rtc_devices, link) {
 | 
				
			||||||
 | 
					        s->irq_coalesced = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool rtc_policy_slew_deliver_irq(RTCState *s)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    apic_reset_irq_delivered();
 | 
				
			||||||
 | 
					    qemu_irq_raise(s->irq);
 | 
				
			||||||
 | 
					    return apic_get_irq_delivered();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void rtc_coalesced_timer(void *opaque)
 | 
					static void rtc_coalesced_timer(void *opaque)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    RTCState *s = opaque;
 | 
					    RTCState *s = opaque;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (s->irq_coalesced != 0) {
 | 
					    if (s->irq_coalesced != 0) {
 | 
				
			||||||
        apic_reset_irq_delivered();
 | 
					 | 
				
			||||||
        s->cmos_data[RTC_REG_C] |= 0xc0;
 | 
					        s->cmos_data[RTC_REG_C] |= 0xc0;
 | 
				
			||||||
        DPRINTF_C("cmos: injecting from timer\n");
 | 
					        DPRINTF_C("cmos: injecting from timer\n");
 | 
				
			||||||
        qemu_irq_raise(s->irq);
 | 
					        if (rtc_policy_slew_deliver_irq(s)) {
 | 
				
			||||||
        if (apic_get_irq_delivered()) {
 | 
					 | 
				
			||||||
            s->irq_coalesced--;
 | 
					            s->irq_coalesced--;
 | 
				
			||||||
            DPRINTF_C("cmos: coalesced irqs decreased to %d\n",
 | 
					            DPRINTF_C("cmos: coalesced irqs decreased to %d\n",
 | 
				
			||||||
                      s->irq_coalesced);
 | 
					                      s->irq_coalesced);
 | 
				
			||||||
@ -144,6 +161,12 @@ static void rtc_coalesced_timer(void *opaque)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    rtc_coalesced_timer_update(s);
 | 
					    rtc_coalesced_timer_update(s);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					static bool rtc_policy_slew_deliver_irq(RTCState *s)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    assert(0);
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static uint32_t rtc_periodic_clock_ticks(RTCState *s)
 | 
					static uint32_t rtc_periodic_clock_ticks(RTCState *s)
 | 
				
			||||||
@ -254,21 +277,17 @@ static void rtc_periodic_timer(void *opaque)
 | 
				
			|||||||
    s->cmos_data[RTC_REG_C] |= REG_C_PF;
 | 
					    s->cmos_data[RTC_REG_C] |= REG_C_PF;
 | 
				
			||||||
    if (s->cmos_data[RTC_REG_B] & REG_B_PIE) {
 | 
					    if (s->cmos_data[RTC_REG_B] & REG_B_PIE) {
 | 
				
			||||||
        s->cmos_data[RTC_REG_C] |= REG_C_IRQF;
 | 
					        s->cmos_data[RTC_REG_C] |= REG_C_IRQF;
 | 
				
			||||||
#ifdef TARGET_I386
 | 
					 | 
				
			||||||
        if (s->lost_tick_policy == LOST_TICK_POLICY_SLEW) {
 | 
					        if (s->lost_tick_policy == LOST_TICK_POLICY_SLEW) {
 | 
				
			||||||
            if (s->irq_reinject_on_ack_count >= RTC_REINJECT_ON_ACK_COUNT)
 | 
					            if (s->irq_reinject_on_ack_count >= RTC_REINJECT_ON_ACK_COUNT)
 | 
				
			||||||
                s->irq_reinject_on_ack_count = 0;
 | 
					                s->irq_reinject_on_ack_count = 0;
 | 
				
			||||||
            apic_reset_irq_delivered();
 | 
					            if (!rtc_policy_slew_deliver_irq(s)) {
 | 
				
			||||||
            qemu_irq_raise(s->irq);
 | 
					 | 
				
			||||||
            if (!apic_get_irq_delivered()) {
 | 
					 | 
				
			||||||
                s->irq_coalesced++;
 | 
					                s->irq_coalesced++;
 | 
				
			||||||
                rtc_coalesced_timer_update(s);
 | 
					                rtc_coalesced_timer_update(s);
 | 
				
			||||||
                DPRINTF_C("cmos: coalesced irqs increased to %d\n",
 | 
					                DPRINTF_C("cmos: coalesced irqs increased to %d\n",
 | 
				
			||||||
                          s->irq_coalesced);
 | 
					                          s->irq_coalesced);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else
 | 
					        } else
 | 
				
			||||||
#endif
 | 
					            qemu_irq_raise(s->irq);
 | 
				
			||||||
        qemu_irq_raise(s->irq);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -612,20 +631,6 @@ static void rtc_get_time(RTCState *s, struct tm *tm)
 | 
				
			|||||||
        rtc_from_bcd(s, s->cmos_data[RTC_CENTURY]) * 100 - 1900;
 | 
					        rtc_from_bcd(s, s->cmos_data[RTC_CENTURY]) * 100 - 1900;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static QLIST_HEAD(, RTCState) rtc_devices =
 | 
					 | 
				
			||||||
    QLIST_HEAD_INITIALIZER(rtc_devices);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef TARGET_I386
 | 
					 | 
				
			||||||
void qmp_rtc_reset_reinjection(Error **errp)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    RTCState *s;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    QLIST_FOREACH(s, &rtc_devices, link) {
 | 
					 | 
				
			||||||
        s->irq_coalesced = 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void rtc_set_time(RTCState *s)
 | 
					static void rtc_set_time(RTCState *s)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    struct tm tm;
 | 
					    struct tm tm;
 | 
				
			||||||
@ -745,22 +750,19 @@ static uint64_t cmos_ioport_read(void *opaque, hwaddr addr,
 | 
				
			|||||||
            if (ret & (REG_C_UF | REG_C_AF)) {
 | 
					            if (ret & (REG_C_UF | REG_C_AF)) {
 | 
				
			||||||
                check_update_timer(s);
 | 
					                check_update_timer(s);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
#ifdef TARGET_I386
 | 
					
 | 
				
			||||||
            if(s->irq_coalesced &&
 | 
					            if(s->irq_coalesced &&
 | 
				
			||||||
                    (s->cmos_data[RTC_REG_B] & REG_B_PIE) &&
 | 
					                    (s->cmos_data[RTC_REG_B] & REG_B_PIE) &&
 | 
				
			||||||
                    s->irq_reinject_on_ack_count < RTC_REINJECT_ON_ACK_COUNT) {
 | 
					                    s->irq_reinject_on_ack_count < RTC_REINJECT_ON_ACK_COUNT) {
 | 
				
			||||||
                s->irq_reinject_on_ack_count++;
 | 
					                s->irq_reinject_on_ack_count++;
 | 
				
			||||||
                s->cmos_data[RTC_REG_C] |= REG_C_IRQF | REG_C_PF;
 | 
					                s->cmos_data[RTC_REG_C] |= REG_C_IRQF | REG_C_PF;
 | 
				
			||||||
                apic_reset_irq_delivered();
 | 
					 | 
				
			||||||
                DPRINTF_C("cmos: injecting on ack\n");
 | 
					                DPRINTF_C("cmos: injecting on ack\n");
 | 
				
			||||||
                qemu_irq_raise(s->irq);
 | 
					                if (rtc_policy_slew_deliver_irq(s)) {
 | 
				
			||||||
                if (apic_get_irq_delivered()) {
 | 
					 | 
				
			||||||
                    s->irq_coalesced--;
 | 
					                    s->irq_coalesced--;
 | 
				
			||||||
                    DPRINTF_C("cmos: coalesced irqs decreased to %d\n",
 | 
					                    DPRINTF_C("cmos: coalesced irqs decreased to %d\n",
 | 
				
			||||||
                              s->irq_coalesced);
 | 
					                              s->irq_coalesced);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        default:
 | 
					        default:
 | 
				
			||||||
            ret = s->cmos_data[s->cmos_index];
 | 
					            ret = s->cmos_data[s->cmos_index];
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user