From patchwork Thu Apr 30 21:49:14 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Sullivan X-Patchwork-Id: 466745 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id E2CE714076C for ; Fri, 1 May 2015 07:54:31 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="verification failed; unprotected key" header.d=gmail.com header.i=@gmail.com header.b=qVGdbagP; dkim-adsp=none (unprotected policy); dkim-atps=neutral Received: from localhost ([::1]:46023 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YnwPd-0005SG-TL for incoming@patchwork.ozlabs.org; Thu, 30 Apr 2015 17:54:29 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53905) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YnwNT-00012M-Lb for qemu-devel@nongnu.org; Thu, 30 Apr 2015 17:52:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YnwNS-0002hj-Kz for qemu-devel@nongnu.org; Thu, 30 Apr 2015 17:52:15 -0400 Received: from mail-pd0-x22d.google.com ([2607:f8b0:400e:c02::22d]:33602) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YnwNS-0002hV-9l for qemu-devel@nongnu.org; Thu, 30 Apr 2015 17:52:14 -0400 Received: by pdbnk13 with SMTP id nk13so73279365pdb.0 for ; Thu, 30 Apr 2015 14:52:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ngPvBq9WgO2updJuEEMZZIAqoN446tbmVfjcnALRjok=; b=qVGdbagPgmyLRu2ogyxFe4rEerkU7xBb6HUoIccVGQwyDfsmS87xBkxFtirrhCO3Q4 4OWnecSlRifTqIFi9YtWtG8gi6FnJmtrOoefYySd8UW7C6+RNvR5vYJNPOZRQVDmGEZf lnr2GGu6/K7kcRhzQvLY5TVt+XT1+aDLnhyGyk1mc4uwOosSI5O17fVPhqZgl92hp/HI do9stc2V9FQVzAxlY2oA1PHYBZKc2tZxC1lxwzLwVPlJYnTSnbJbCkeGcyZY2oV3ZBCd 1dvFTc4A8AsyvJJPs00ngeS8zYeUErybXsILLRAHP0WujhlXGW90WK1vi/g4bBGuBAem dnwg== X-Received: by 10.66.141.171 with SMTP id rp11mr12124971pab.44.1430430733594; Thu, 30 Apr 2015 14:52:13 -0700 (PDT) Received: from proto.localdomain (S01063085a96dad29.cg.shawcable.net. [70.72.170.31]) by mx.google.com with ESMTPSA id iz2sm3076947pbc.37.2015.04.30.14.52.12 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 30 Apr 2015 14:52:13 -0700 (PDT) From: James Sullivan To: qemu-devel@nongnu.org Date: Thu, 30 Apr 2015 15:49:14 -0600 Message-Id: <1430430556-21869-3-git-send-email-sullivan.james.f@gmail.com> X-Mailer: git-send-email 2.3.5 In-Reply-To: <1430430556-21869-1-git-send-email-sullivan.james.f@gmail.com> References: <1430430556-21869-1-git-send-email-sullivan.james.f@gmail.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:400e:c02::22d Cc: pbonzini@redhat.com, James Sullivan , jan.kiszka@siemens.com Subject: [Qemu-devel] [PATCH v3 2/4] apic: Set and pass in RH bit for MSI interrupts X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org In apic_send_msi(), set msi_redir_hint to 0x1 when RH=1 in the MSI Address Register. Added an argument for msi_redir_hint to apic_deliver_irq(), and changed calls to the function accordingly (using 0 as a default value for non-MSI interrupts). Signed-off-by: James Sullivan --- Changes in v2: * Corrected use of MSI data register => addr register when setting msi_redir_hint in apic_send_msi(). hw/intc/apic.c | 10 ++++++---- hw/intc/ioapic.c | 2 +- include/hw/i386/apic.h | 3 ++- trace-events | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/hw/intc/apic.c b/hw/intc/apic.c index 8f6cdd2..a25efa1 100644 --- a/hw/intc/apic.c +++ b/hw/intc/apic.c @@ -287,12 +287,13 @@ static void apic_bus_deliver(const uint32_t *deliver_bitmask, } void apic_deliver_irq(uint8_t dest, uint8_t dest_mode, uint8_t delivery_mode, - uint8_t vector_num, uint8_t trigger_mode) + uint8_t vector_num, uint8_t trigger_mode, + uint8_t msi_redir_hint) { uint32_t deliver_bitmask[MAX_APIC_WORDS]; trace_apic_deliver_irq(dest, dest_mode, delivery_mode, vector_num, - trigger_mode); + trigger_mode, msi_redir_hint); apic_get_delivery_bitmask(deliver_bitmask, dest, dest_mode); apic_bus_deliver(deliver_bitmask, delivery_mode, vector_num, trigger_mode); @@ -777,8 +778,9 @@ static void apic_send_msi(hwaddr addr, uint32_t data) uint8_t dest_mode = (addr >> MSI_ADDR_DEST_MODE_SHIFT) & 0x1; uint8_t trigger_mode = (data >> MSI_DATA_TRIGGER_SHIFT) & 0x1; uint8_t delivery = (data >> MSI_DATA_DELIVERY_MODE_SHIFT) & 0x7; - /* XXX: Ignore redirection hint. */ - apic_deliver_irq(dest, dest_mode, delivery, vector, trigger_mode); + uint8_t msi_redir_hint = (addr >> MSI_ADDR_REDIRECTION_SHIFT) & 0x1; + apic_deliver_irq(dest, dest_mode, delivery, vector, trigger_mode, + msi_redir_hint); } static void apic_mem_writel(void *opaque, hwaddr addr, uint32_t val) diff --git a/hw/intc/ioapic.c b/hw/intc/ioapic.c index b527932..e69aa18 100644 --- a/hw/intc/ioapic.c +++ b/hw/intc/ioapic.c @@ -71,7 +71,7 @@ static void ioapic_service(IOAPICCommonState *s) vector = entry & IOAPIC_VECTOR_MASK; } apic_deliver_irq(dest, dest_mode, delivery_mode, - vector, trig_mode); + vector, trig_mode, 0); } } } diff --git a/include/hw/i386/apic.h b/include/hw/i386/apic.h index 51eb6d3..9d7c0a4 100644 --- a/include/hw/i386/apic.h +++ b/include/hw/i386/apic.h @@ -5,7 +5,8 @@ /* apic.c */ void apic_deliver_irq(uint8_t dest, uint8_t dest_mode, uint8_t delivery_mode, - uint8_t vector_num, uint8_t trigger_mode); + uint8_t vector_num, uint8_t trigger_mode, + uint8_t msi_redir_hint); int apic_accept_pic_intr(DeviceState *s); void apic_deliver_pic_intr(DeviceState *s, int level); void apic_deliver_nmi(DeviceState *d); diff --git a/trace-events b/trace-events index 30eba92..b430cf9 100644 --- a/trace-events +++ b/trace-events @@ -158,7 +158,7 @@ apic_get_irq_delivered(int apic_irq_delivered) "returning coalescing %d" # hw/intc/apic.c apic_local_deliver(int vector, uint32_t lvt) "vector %d delivery mode %d" -apic_deliver_irq(uint8_t dest, uint8_t dest_mode, uint8_t delivery_mode, uint8_t vector_num, uint8_t trigger_mode) "dest %d dest_mode %d delivery_mode %d vector %d trigger_mode %d" +apic_deliver_irq(uint8_t dest, uint8_t dest_mode, uint8_t delivery_mode, uint8_t vector_num, uint8_t trigger_mode, uint8_t msi_redir_hint) "dest %d dest_mode %d delivery_mode %d vector %d trigger_mode %d msi_redir_hint %d" apic_mem_readl(uint64_t addr, uint32_t val) "%"PRIx64" = %08x" apic_mem_writel(uint64_t addr, uint32_t val) "%"PRIx64" = %08x"