On Tue, Feb 17, 2009 at 09:42:05AM +0800, Zhang, Xiantao wrote:
> Isaku Yamahata wrote:
> > On Mon, Feb 16, 2009 at 06:33:45PM +0800, Zhang, Xiantao wrote:
> >> Hi, Isaku
> >>    This patch targets for enhancing vt-d support for ia64, could you
> >> help to review? 
> > 
> > It looks mostly good.
> > How about moving arch independent MSI related definitions
> > into a common header file instead of duplicating with
> > xen/include/asm-ia64/msi.h?
> 
> Good suggestion!  But ia64 has different value for one macro with x86 side, 
> so maybe not proper to move them into common header file. You know, in linux 
> kernel, ia64 and X86 also duplicate them to solve the differences. :)

Oh I see. Sounds reasonable.

> Xiantao  
> 
> > 
> > 
> >> Xiantao
> >> 
> >> # HG changeset patch
> >> # User xian...@vti-build.sh.intel.com
> >> # Date 1234244822 -28800
> >> # Node ID 67f2e14613efc0a18924fd60f2561999b9f59a43
> >> # Parent  4fd4dcf2f8916ab4656911a76e52fc6b1ad42c2f
> >> [IA64] Enhance vt-d support for ia64
> >> 
> >> Signed-off-by: Xiantao Zhang <xiantao.zh...@intel.com>
> >> 
> >> diff -r 4fd4dcf2f891 -r 67f2e14613ef xen/arch/ia64/xen/domain.c
> >> --- a/xen/arch/ia64/xen/domain.c   Wed Jan 28 12:22:58 2009 +0900
> >> +++ b/xen/arch/ia64/xen/domain.c   Tue Feb 10 13:47:02 2009 +0800
> >> @@ -1999,6 +1999,7 @@ static void __init calc_dom0_size(void) 
> >>    unsigned long p2m_pages; unsigned long spare_hv_pages;
> >>    unsigned long max_dom0_size;
> >> +  unsigned long iommu_pg_table_pages = 0;
> >> 
> >>    /* Estimate maximum memory we can safely allocate for dom0
> >>     * by subtracting the p2m table allocation and a chunk of memory
> >> @@ -2009,8 +2010,13 @@ static void __init calc_dom0_size(void)
> >>    domheap_pages = avail_domheap_pages();
> >>    p2m_pages = domheap_pages / PTRS_PER_PTE;
> >>    spare_hv_pages = 8192 + (domheap_pages / 4096);
> >> -  max_dom0_size = (domheap_pages - (p2m_pages + spare_hv_pages))
> >> -                   * PAGE_SIZE;
> >> +
> >> +  if (iommu_enabled)
> >> +          iommu_pg_table_pages = domheap_pages * 4 / 512;
> >> +          /* There are 512 ptes in one 4K vtd page. */
> >> +
> >> +  max_dom0_size = (domheap_pages - (p2m_pages + spare_hv_pages) -
> >> +                  iommu_pg_table_pages) * PAGE_SIZE;
> >>    printk("Maximum permitted dom0 size: %luMB\n",
> >>           max_dom0_size / (1024*1024));
> >> 
> >> diff -r 4fd4dcf2f891 -r 67f2e14613ef
> >> xen/drivers/passthrough/vtd/ia64/vtd.c ---
> >> a/xen/drivers/passthrough/vtd/ia64/vtd.c   Wed Jan 28 12:22:58 2009
> >> +0900 +++ b/xen/drivers/passthrough/vtd/ia64/vtd.c Tue Feb 10
> >>      13:47:02 2009 +0800 @@ -111,3 +111,34 @@ void
> >>  hvm_dpci_isairq_eoi(struct domain *  { /* dummy */ }
> >> +
> >> +static int dom0_set_iommu_mapping(unsigned long start, unsigned
> >> long end, +                                void *arg) +{
> >> +    unsigned long tmp, pfn, j, page_addr = start;
> >> +    struct domain *d = (struct domain *)arg;
> >> +
> >> +    /*
> >> +     * Set up 1:1 page table for dom0 except the critical segments
> >> +     * like Xen and tboot. +     */
> >> +
> >> +    while (page_addr < end)
> >> +    {
> >> +  if (xen_in_range(page_addr, page_addr + PAGE_SIZE)) +           
> >> continue; +
> >> +        pfn = page_addr >> PAGE_SHIFT;
> >> +        tmp = 1 << (PAGE_SHIFT - PAGE_SHIFT_4K);
> >> +        for ( j = 0; j < tmp; j++ )
> >> +            iommu_map_page(d, (pfn*tmp+j), (pfn*tmp+j)); +
> >> +  page_addr += PAGE_SIZE;
> >> +    }
> >> +}
> >> +
> >> +void iommu_dom0_do_mapping(struct domain *d)
> >> +{
> >> +  BUG_ON(d != dom0);
> >> +  efi_memmap_walk(dom0_set_iommu_mapping, d);
> >> +}
> >> diff -r 4fd4dcf2f891 -r 67f2e14613ef
> >> xen/drivers/passthrough/vtd/iommu.c ---
> >> a/xen/drivers/passthrough/vtd/iommu.c      Wed Jan 28 12:22:58 2009 +0900
> >> +++ b/xen/drivers/passthrough/vtd/iommu.c  Tue Feb 10 13:47:02 2009
> >>      +0800 @@ -829,7 +829,6 @@ static void dma_msi_data_init(struct
> >> iom spin_unlock_irqrestore(&iommu->register_lock, flags);  } 
> >> 
> >> -#ifdef SUPPORT_MSI_REMAPPING
> >>  static void dma_msi_addr_init(struct iommu *iommu, int phy_cpu)  {
> >>      u64 msi_address;
> >> @@ -846,12 +845,6 @@ static void dma_msi_addr_init(struct iom
> >>      dmar_writel(iommu->reg, DMAR_FEUADDR_REG, (u32)(msi_address >>
> >>      32)); spin_unlock_irqrestore(&iommu->register_lock, flags);  }
> >> -#else
> >> -static void dma_msi_addr_init(struct iommu *iommu, int phy_cpu) -{
> >> -    /* ia64: TODO */
> >> -}
> >> -#endif
> >> 
> >>  static void dma_msi_set_affinity(unsigned int vector, cpumask_t
> >> dest)  { @@ -993,24 +986,7 @@ static int
> >> intel_iommu_domain_init(struc 
> >> 
> >>      if ( d->domain_id == 0 )
> >>      {
> >> -        extern int xen_in_range(paddr_t start, paddr_t end);
> >> -        extern int tboot_in_range(paddr_t start, paddr_t end); -
> >> -        /*
> >> -         * Set up 1:1 page table for dom0 except the critical
> >> segments 
> >> -         * like Xen and tboot.
> >> -         */
> >> -        for ( i = 0; i < max_page; i++ )
> >> -        {
> >> -            if ( xen_in_range(i << PAGE_SHIFT, (i + 1) <<
> >> PAGE_SHIFT) || 
> >> -                 tboot_in_range(i << PAGE_SHIFT, (i + 1) <<
> >> PAGE_SHIFT) ) 
> >> -                continue;
> >> -
> >> -            tmp = 1 << (PAGE_SHIFT - PAGE_SHIFT_4K);
> >> -            for ( j = 0; j < tmp; j++ )
> >> -                iommu_map_page(d, (i*tmp+j), (i*tmp+j));
> >> -        }
> >> -
> >> +  iommu_dom0_do_mapping(d);
> >>          setup_dom0_devices(d);
> >>          setup_dom0_rmrr(d);
> >> 
> >> diff -r 4fd4dcf2f891 -r 67f2e14613ef
> >> xen/drivers/passthrough/vtd/x86/vtd.c ---
> >> a/xen/drivers/passthrough/vtd/x86/vtd.c    Wed Jan 28 12:22:58 2009
> >> +0900 +++ b/xen/drivers/passthrough/vtd/x86/vtd.c  Tue Feb 10
> >>      13:47:02 2009 +0800 @@ -142,3 +142,25 @@ void
> >>  hvm_dpci_isairq_eoi(struct domain *      }
> >> spin_unlock(&d->event_lock); } +
> >> +void iommu_dom0_do_mapping(struct domain *d)
> >> +{
> >> +    extern int xen_in_range(paddr_t start, paddr_t end);
> >> +    extern int tboot_in_range(paddr_t start, paddr_t end); +
> >> +    BUG_ON(d != dom0);
> >> +    /*
> >> +     * Set up 1:1 page table for dom0 except the critical segments
> >> +     * like Xen and tboot. +     */
> >> +    for ( i = 0; i < max_page; i++ )
> >> +    {
> >> +        if ( xen_in_range(i << PAGE_SHIFT, (i + 1) << PAGE_SHIFT) ||
> >> +            tboot_in_range(i << PAGE_SHIFT, (i + 1) << PAGE_SHIFT)
> >> ) +            continue; +
> >> +        tmp = 1 << (PAGE_SHIFT - PAGE_SHIFT_4K);
> >> +        for ( j = 0; j < tmp; j++ )
> >> +            iommu_map_page(d, (i*tmp+j), (i*tmp+j)); +    }
> >> +}
> >> diff -r 4fd4dcf2f891 -r 67f2e14613ef xen/include/asm-ia64/msi.h
> >> --- /dev/null      Thu Jan 01 00:00:00 1970 +0000
> >> +++ b/xen/include/asm-ia64/msi.h   Tue Feb 10 13:47:02 2009 +0800 @@
> >> -0,0 +1,20 @@ +#ifndef __ASM_MSI_H
> >> +#define __ASM_MSI_H
> >> +
> >> +/*
> >> + * MSI Defined Data Structures
> >> + */
> >> +#define MSI_ADDRESS_HEADER                0xfee
> >> +#define MSI_ADDRESS_HEADER_SHIFT  12
> >> +#define MSI_ADDRESS_HEADER_MASK           0xfff000
> >> +#define MSI_ADDRESS_DEST_ID_MASK  0xfff0000f
> >> +#define MSI_TARGET_CPU_MASK               0xff
> >> +#define MSI_TARGET_CPU_SHIFT              4
> >> +#define MSI_DELIVERY_MODE         0
> >> +#define MSI_LEVEL_MODE                    1       /* Edge always assert */
> >> +#define MSI_TRIGGER_MODE          0       /* MSI is edge sensitive */ 
> >> +#define
> >> MSI_PHYSICAL_MODE          0 +#define MSI_LOGICAL_MODE             1
> >> +#define MSI_REDIRECTION_HINT_MODE 0
> >> +
> >> +#endif /* __ASM_MSI_H */
> >> diff -r 4fd4dcf2f891 -r 67f2e14613ef xen/include/xen/iommu.h
> >> --- a/xen/include/xen/iommu.h      Wed Jan 28 12:22:58 2009 +0900
> >> +++ b/xen/include/xen/iommu.h      Tue Feb 10 13:47:02 2009 +0800 @@
> >> -19,6 +19,8 @@ 
> >> 
> >>  #ifndef _IOMMU_H_
> >>  #define _IOMMU_H_
> >> +
> >> +#include <asm/msi.h>
> >> 
> >>  #include <xen/init.h>
> >>  #include <xen/spinlock.h>
> >> @@ -113,4 +115,6 @@ void iommu_suspend(void);
> >>  void iommu_suspend(void);
> >>  void iommu_resume(void);
> >> 
> >> +void iommu_dom0_do_mapping(struct domain *d);
> >> +
> >>  #endif /* _IOMMU_H_ */
> 
> 

-- 
yamahata

_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@lists.xensource.com
http://lists.xensource.com/xen-ia64-devel

Reply via email to