On Thu, Oct 16, 2008 at 06:59:33PM +0800, Xu, Anthony wrote:
> Isaku Yamahata wrote:
> > On Wed, Oct 15, 2008 at 05:44:41PM +0800, Xu, Anthony wrote:
> >> add structure and helper function for interrupt sharing
> >>
> >> Sign-off-by; Anthony Xu < anthony.xu@xxxxxxxxx >
> >>
> >>
> >> Anthony
> >
> > Hi.
> > Some comments below.
> >
> >
> >> add structure and helper function for interrupt sharing
> >>
> >> Sign-off-by; Anthony Xu < anthony.xu@xxxxxxxxx >
> > ^ ^ no space around email address.
> > not semicolon, but colon.
> >
> >
> :-)
>
> >>
> >>
> >> diff -r 9b227eb09263 xen/arch/ia64/linux-xen/irq_ia64.c
> >> --- a/xen/arch/ia64/linux-xen/irq_ia64.c Tue Oct 14 19:19:48
> >> 2008 +0100 +++ b/xen/arch/ia64/linux-xen/irq_ia64.c Wed Oct 15
> >> 17:18:25 2008 +0800 @@ -334,3 +334,62 @@
> >>
> >> writeq(ipi_data, ipi_addr);
> >> }
> >> +
> >> +
> >> +static void __hvm_pci_intx_assert(
> >> + struct domain *d, unsigned int device, unsigned int
> >> intx) +{ + struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq; +
> >> unsigned int gsi; +
> >> + ASSERT((device <= 31) && (intx <= 3));
> >> +
> >> + if ( __test_and_set_bit(device*4 + intx, &hvm_irq->pci_intx.i)
> >> ) + return; + gsi = hvm_pci_intx_gsi(device, intx);
> >> + if ( ++hvm_irq->gsi_assert_count[gsi] == 1 )
> >> + viosapic_set_irq(d, gsi, 1);
> >> +}
> >> +
> >> +
> >> +void hvm_pci_intx_assert(
> >> + struct domain *d, unsigned int device, unsigned int
> >> intx) +{ + __hvm_pci_intx_assert(d, device, intx);
> >> +}
> >> +
> >
> > Why are the two version (with and without __) defined?
> > Looking x86 version, a lock will be added in future. doesn't it?
> >
> In x86 side, vpic and vioapci use a big lock, so it is needed to get the lock
> first before call __hvm_pci_intx_assert.
> In ia65 side, there is a dedicated lock for viosapic, there is no need to get
> a lock here.
> I'll merge the two version
>
>
> >
> >> +static void __hvm_pci_intx_deassert(
> >> + struct domain *d, unsigned int device, unsigned int
> >> intx) +{ + struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq; +
> >> unsigned int gsi; +
> >> + ASSERT((device <= 31) && (intx <= 3));
> >> +
> >> + if ( !__test_and_clear_bit(device*4 + intx,
> >> &hvm_irq->pci_intx.i) ) + return; +
> >> + gsi = hvm_pci_intx_gsi(device, intx);
> >> +
> >> + if (--hvm_irq->gsi_assert_count[gsi] == 0)
> >> + viosapic_set_irq(d, gsi, 0);
> >> +}
> >> +
> >> +void hvm_pci_intx_deassert(
> >> + struct domain *d, unsigned int device, unsigned int
> >> intx) +{ + __hvm_pci_intx_deassert(d, device, intx); +}
> >> +
> >> +void hvm_isa_irq_assert(
> >> + struct domain *d, unsigned int isa_irq) +{
> >> +}
> >> +
> >> +
> >> +void hvm_isa_irq_deassert(
> >> + struct domain *d, unsigned int isa_irq) +{
> >> +}
> >> +
> >> +
> >
> > Those are for HVM domain, so please move them under
> > the directory, xen/arch/ia64/vmx.
>
> Agree
> >
> >> diff -r 9b227eb09263 xen/arch/ia64/vmx/viosapic.c
> >> --- a/xen/arch/ia64/vmx/viosapic.c Tue Oct 14 19:19:48 2008 +0100
> >> +++ b/xen/arch/ia64/vmx/viosapic.c Wed Oct 15 17:18:25 2008 +0800
> >> @@ -314,10 +314,6 @@ out:
> >> spin_unlock(&viosapic->lock);
> >> }
> >> -
> >> -#define hvm_pci_intx_gsi(dev, intx) \
> >> - (((((dev) << 2) + ((dev) >> 3) + (intx)) & 31) + 16) -
> >>
> >> void viosapic_set_pci_irq(struct domain *d, int device, int intx,
> >> int level) {
> >> diff -r 9b227eb09263 xen/arch/ia64/xen/domain.c
> >> --- a/xen/arch/ia64/xen/domain.c Tue Oct 14 19:19:48 2008 +0100
> >> +++ b/xen/arch/ia64/xen/domain.c Wed Oct 15 17:18:25 2008 +0800
> >> @@ -568,6 +568,8 @@
> >>
> >> if (is_idle_domain(d))
> >> return 0;
> >> +
> >> + INIT_LIST_HEAD(&d->arch.pdev_list);
> >>
> >> foreign_p2m_init(d);
> >> #ifdef CONFIG_XEN_IA64_PERVCPU_VHPT
> >> diff -r 9b227eb09263 xen/include/asm-ia64/domain.h
> >> --- a/xen/include/asm-ia64/domain.h Tue Oct 14 19:19:48 2008 +0100
> >> +++ b/xen/include/asm-ia64/domain.h Wed Oct 15 17:18:25 2008 +0800
> >> @@ -129,6 +129,8 @@ /* Set an optimization feature in the struct
> >> arch_domain. */ extern int domain_opt_feature(struct domain *,
> >> struct xen_ia64_opt_feature*);
> >>
> >> +#define has_arch_pdevs(d) (!list_empty(&(d)->arch.pdev_list)) +
> >> struct arch_domain {
> >> struct mm_struct mm;
> >>
> >> @@ -166,6 +168,7 @@
> >> unsigned char rid_bits; /* number of virtual rid bits
> >> (default: 18) */ int breakimm; /* The imm value
> >> for hypercalls. */
> >>
> >> + struct list_head pdev_list;
> >> struct virtual_platform_def vmx_platform;
> >> #define hvm_domain vmx_platform /* platform defs are not vmx
> >> specific */
> >>
> >> diff -r 9b227eb09263 xen/include/asm-ia64/hvm/irq.h
> >> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> >> +++ b/xen/include/asm-ia64/hvm/irq.h Wed Oct 15 17:18:25 2008 +0800
> >> @@ -0,0 +1,178 @@
> >> +/******************************************************************************
> >> + * irq.h + * + * Interrupt distribution and delivery logic.
> >> + *
> >> + * Copyright (c) 2006, K A Fraser, XenSource Inc.
> >> + *
> >> + * This program is free software; you can redistribute it and/or
> >> modify it + * under the terms and conditions of the GNU General
> >> Public License, + * version 2, as published by the Free Software
> >> Foundation. + * + * This program is distributed in the hope it will
> >> be useful, but WITHOUT + * ANY WARRANTY; without even the implied
> >> warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.
> >> See the GNU General Public License for + * more details. + *
> >> + * You should have received a copy of the GNU General Public
> >> License along with + * this program; if not, write to the Free
> >> Software Foundation, Inc., 59 Temple + * Place - Suite 330, Boston,
> >> MA 02111-1307 USA. + */
> >> +
> >> +#ifndef __ASM_IA64_HVM_IRQ_H__
> >> +#define __ASM_IA64_HVM_IRQ_H__
> >> +
> >> +#include <xen/types.h>
> >> +#include <xen/spinlock.h>
> >> +#include <asm/irq.h>
> >> +#include <public/hvm/save.h>
> >> +#include <xen/irq.h>
> >> +
> >> +#define NR_VECTORS 256
> >> +#define VIOAPIC_NUM_PINS 48
> >> +
> >> +
> >> +
> >> +struct dev_intx_gsi_link {
> >> + struct list_head list;
> >> + uint8_t device;
> >> + uint8_t intx;
> >> + uint8_t gsi;
> >> + uint8_t link;
> >> +};
> >> +
> >> +struct hvm_hw_pci_irqs {
> >> + /*
> >> + * Virtual interrupt wires for a single PCI bus.
> >> + * Indexed by: device*4 + INTx#.
> >> + */
> >> + union {
> >> + DECLARE_BITMAP(i, 32*4);
> >> + uint64_t pad[2];
> >> + };
> >> +};
> >
> > In the x86 case, they are defined in public/arch-x86/hvm/save.h.
> > Although I'm not sure, aren't they needed for save/restore?
>
> I am not sure, I guess they are not needed for save/restore.
> VTD save/restore is not supported directly
> It is supported by using teaming driver.
>
> For example
> There are two NICs, one is a NIC assigned through VTD
> The other is a qemu e1000,
> In normal time, VTD NIC is used by guest through teaming driver
> When you want to save/restore guest, hotunplug VTD NIC, then only qemu e1000
> works, then save.
Okay, then let's keep the definition xen private.
If we found it necessary for save/resotre, we can move the definition.
thanks,
>
>
>
>
>
>
>
> >
> >> +
> >> +#define HVM_IRQ_DPCI_VALID 0x1
> >> +#define HVM_IRQ_DPCI_MSI 0x2
> >> +#define _HVM_IRQ_DPCI_MSI 0x1
> >> +
> >> +
> >> +struct hvm_gmsi_info {
> >> + uint32_t gvec;
> >> + uint32_t gflags;
> >> +};
> >> +
> >> +struct hvm_mirq_dpci_mapping {
> >> + uint32_t flags;
> >> + int pending;
> >> + struct list_head digl_list;
> >> + struct domain *dom;
> >> + struct hvm_gmsi_info gmsi;
> >> +};
> >> +
> >> +struct hvm_girq_dpci_mapping {
> >> + uint8_t valid;
> >> + uint8_t device;
> >> + uint8_t intx;
> >> + uint8_t machine_gsi;
> >> +};
> >> +
> >> +#define NR_ISAIRQS 16
> >> +#define NR_LINK 4
> >> +struct hvm_irq_dpci {
> >> + spinlock_t dirq_lock;
> >> + /* Machine IRQ to guest device/intx mapping. */
> >> + struct hvm_mirq_dpci_mapping mirq[NR_IRQS];
> >> + /* Guest IRQ to guest device/intx mapping. */
> >> + struct hvm_girq_dpci_mapping girq[NR_IRQS];
> >> + uint8_t msi_gvec_pirq[NR_VECTORS];
> >> + DECLARE_BITMAP(dirq_mask, NR_IRQS);
> >> + /* Record of mapped ISA IRQs */
> >> + DECLARE_BITMAP(isairq_map, NR_ISAIRQS);
> >> + /* Record of mapped Links */
> >> + uint8_t link_cnt[NR_LINK];
> >> + struct timer hvm_timer[NR_IRQS];
> >> +};
> >> +
> >> +struct hvm_irq {
> >> + /*
> >> + * Virtual interrupt wires for a single PCI bus.
> >> + * Indexed by: device*4 + INTx#.
> >> + */
> >> + struct hvm_hw_pci_irqs pci_intx;
> >> +
> >> + /* Virtual interrupt and via-link for paravirtual platform
> >> driver. */ + uint32_t callback_via_asserted;
> >> + union {
> >> + enum {
> >> + HVMIRQ_callback_none,
> >> + HVMIRQ_callback_gsi,
> >> + HVMIRQ_callback_pci_intx
> >> + } callback_via_type;
> >> + };
> >> + union {
> >> + uint32_t gsi;
> >> + struct { uint8_t dev, intx; } pci;
> >> + } callback_via;
> >> +
> >> + /*
> >> + * Number of wires asserting each GSI.
> >> + *
> >> + * GSIs 0-15 are the ISA IRQs. ISA devices map directly into
> >> this space + * except ISA IRQ 0, which is connected to GSI 2.
> >> + * PCI links map into this space via the PCI-ISA bridge. + *
> >> + * GSIs 16+ are used only be PCI devices. The mapping from PCI
> >> device to + * GSI is as follows: ((device*4 + device/8 + INTx#)
> >> & 31) + 16 + */ + u8 gsi_assert_count[VIOAPIC_NUM_PINS];
> >> +
> >> + /*
> >> + * GSIs map onto PIC/IO-APIC in the usual way:
> >> + * 0-7: Master 8259 PIC, IO-APIC pins 0-7
> >> + * 8-15: Slave 8259 PIC, IO-APIC pins 8-15
> >> + * 16+ : IO-APIC pins 16+
> >> + */
> >> +
> >> + /* Last VCPU that was delivered a LowestPrio interrupt. */
> >> + u8 round_robin_prev_vcpu;
> >> +
> >> + struct hvm_irq_dpci *dpci;
> >> +};
> >> +
> >> +#define hvm_pci_intx_gsi(dev, intx) \
> >> + (((((dev)<<2) + ((dev)>>3) + (intx)) & 31) + 16)
> >> +#define hvm_pci_intx_link(dev, intx) \
> >> + (((dev) + (intx)) & 3)
> >> +
> >> +
> >> +extern u8 irq_vector[NR_IRQ_VECTORS];
> >> +extern int vector_irq[NR_VECTORS];
> >> +
> >> +/* Extract the IA-64 vector that corresponds to IRQ. */ +static
> >> inline int +irq_to_vector (int irq)
> >> +{
> >> + return irq;
> >> +}
> >> +
> >> +/* Modify state of a PCI INTx wire. */
> >> +void hvm_pci_intx_assert(
> >> + struct domain *d, unsigned int device, unsigned int intx);
> >> +void hvm_pci_intx_deassert( + struct domain *d, unsigned int
> >> device, unsigned int intx); + +/* Modify state of an ISA device's
> >> IRQ wire. */ +void hvm_isa_irq_assert(
> >> + struct domain *d, unsigned int isa_irq);
> >> +void hvm_isa_irq_deassert(
> >> + struct domain *d, unsigned int isa_irq);
> >> +
> >> +void hvm_set_pci_link_route(struct domain *d, u8 link, u8 isa_irq);
> >> + +void hvm_maybe_deassert_evtchn_irq(void);
> >> +void hvm_assert_evtchn_irq(struct vcpu *v);
> >> +void hvm_set_callback_via(struct domain *d, uint64_t via); +
> >> +
> >> +#endif /* __ASM_IA64_HVM_IRQ_H__ */
> >
> > This file looks like almost same to xen/include/asm-x86/hvm/irq.h
> > I suppose those are arch generic because they are pci stuff.
> > So can those definitions be shared by x86 and ia64 with
> > the file. E.g. xen/include/xen/hvm/irq.h or something like that?
> > Or are you expecting future divergence?
>
> I'll extract common code out to common head file.
>
>
>
> >
> >
> >> diff -r 9b227eb09263 xen/include/asm-ia64/linux/asm/hw_irq.h
> >> --- a/xen/include/asm-ia64/linux/asm/hw_irq.h Tue Oct 14 19:19:48
> >> 2008 +0100 +++ b/xen/include/asm-ia64/linux/asm/hw_irq.h Wed Oct 15
> >> 17:18:25 2008 +0800 @@ -14,6 +14,7 @@ #include <asm/machvec.h>
> >> #include <asm/ptrace.h>
> >> #include <asm/smp.h>
> >> +#include <asm/hvm/irq.h>
> >>
> >> typedef u8 ia64_vector;
> >>
> >> @@ -124,13 +125,6 @@
> >> return irq_desc + irq;
> >> }
> >>
> >> -/* Extract the IA-64 vector that corresponds to IRQ. */
> >> -static inline ia64_vector
> >> -irq_to_vector (int irq)
> >> -{
> >> - return (ia64_vector) irq;
> >> -}
> >> -
> >> /*
> >> * Convert the local IA-64 vector to the corresponding irq number.
> >> This translation is
> >> * done in the context of the interrupt domain that the currently
> >> executing CPU belongs
> >
> > Please move the file under xen/include/asm-ia64/linux-xen/asm/,
> > and don't forget update README.origin. Then comment out by #ifndef
> > XEN.
> >
> Okay
>
>
>
> Thanks,
> Anthony
>
>
> >
> >> diff -r 9b227eb09263 xen/include/asm-ia64/vmx_platform.h
> >> --- a/xen/include/asm-ia64/vmx_platform.h Tue Oct 14 19:19:48
> >> 2008 +0100 +++ b/xen/include/asm-ia64/vmx_platform.h Wed Oct 15
> >> 17:18:25 2008 +0800 @@ -21,8 +21,10 @@
> >>
> >> #include <public/xen.h>
> >> #include <public/hvm/params.h>
> >> +#include <asm/hvm/irq.h>
> >> #include <asm/viosapic.h>
> >> #include <asm/hvm/vacpi.h>
> >> +#include <xen/hvm/iommu.h>
> >>
> >> struct vmx_ioreq_page {
> >> spinlock_t lock;
> >> @@ -41,6 +43,9 @@
> >> /* One IOSAPIC now... */
> >> struct viosapic viosapic;
> >> struct vacpi vacpi;
> >> + /* Pass-throgh VT-d */
> >> + struct hvm_irq irq;
> >> + struct hvm_iommu hvm_iommu;
> >> } vir_plat_t;
> >>
> >> static inline int __fls(uint32_t word)
>
--
yamahata
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|