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? thanks, > 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