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.
>
>> +
>> +#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)
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|