[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Fbdev graphics broken in xen/next dom0
> > The serial output is attached. > > The patch I used to instrument the fb_mmap function and the output it > produced for a couple of runs are also attached. > > And I tossed in my kernel .config for good measure. > > What else is needed? It looks that I confused your email with another person. You don't seem to run the nvidia fb, but rather the radeon one. .. snip .. > Non-volatile memory driver v1.3 > Linux agpgart interface v0.103 > agpgart-intel 0000:00:00.0: Intel Q45/Q43 Chipset > agpgart-intel 0000:00:00.0: detected 32764K stolen memory > agpgart-intel 0000:00:00.0: AGP aperture is 256M @ 0xd0000000 > tpm_tis 00:08: 1.2 TPM (device-id 0x4A10, rev-id 78) > [drm] Initialized drm 1.1.0 20060810 > [drm] radeon defaulting to kernel modesetting. > [drm] radeon kernel modesetting enabled. > xen_allocate_pirq: returning irq 16 for gsi 16 > Already setup the GSI :16 > i915 0000:00:02.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16 > [drm] set up 31M of stolen space > [drm] TMDS-8: set mode 1280x1024 17 > Console: switching to colour frame buffer device 160x64 > fb0: inteldrmfb frame buffer device > registered panic notifier > [drm] Initialized i915 1.6.0 20080730 for 0000:00:02.0 on minor 0 You look to have a i915 framebuffer on your box. I *think* that the i915 is not using KMS and the TTM stuff, so the patch that Arvind posted would probably not help you. http://www.mail-archive.com/dri-devel@xxxxxxxxxxxxxxxxxxxxx/msg48668.html So, lets boot your kernel with these command line parameters to get more data: debug initcall_debug drm.debug=255 That should spew out some more details. Next thing I would suggest is to instrument i915_gem_fault. Attached is a patch that does it (thought it is not compile tested nor actually booted so it might need some hand crafting - sorry). And the other thing is to read through the steps that Arvind took in the e-mail thread titled: "Nouveau on dom0". It covers the gamma of things to troubleshoot this. diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index fba37e9..cfcaafd 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -33,6 +33,8 @@ #include "intel_drv.h" #include <linux/swap.h> #include <linux/pci.h> +#include <xen/xen.h> +#include <asm/xen/page.h> #define I915_GEM_GPU_DOMAINS (~(I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT)) @@ -1145,6 +1147,143 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data, return 0; } +void print_pte(struct vm_area_struct *vma, char *what, struct page *page, unsigned int pfn, unsigned long address) +{ + static const char * const level_name[] = + { "NONE", "4K", "2M", "1G", "NUM" }; + unsigned long addr = 0; + pte_t *pte = NULL; + pteval_t val = (pteval_t)0; + unsigned int level = 0; + unsigned offset; + unsigned long phys; + pgprotval_t prot; + char buf[90]; + char *str; + + str = buf; + // Figure out if the address is pagetable. + if (address == 0 && !page && pfn>0) { + page = pfn_to_page(pfn); + } + if (address == 0 && page) + addr = (u64)page_address(page); + + if (address && !page) + addr = address; + + if (address && page) { + addr = (u64)page_address(page); + if (address != addr) { + if (addr == 0) { + str += sprintf(str, "addr(page)==0"); + addr = address; + } + } + } + + if (pfn != 0 && page) { + if (pfn != page_to_pfn(page)) // Gosh!? + str += sprintf(str, "pfn!=pfn(page)"); + } + if (pfn != 0 && addr != 0) { + if (pfn != virt_to_pfn(addr)) + str += sprintf(str,"pfn(addr)!=pfn"); + } + pte = lookup_address(addr, &level); + if (!pte) { + str += sprintf(str,"!pte(addr)"); + goto print; + } + offset = addr & ~PAGE_MASK; + + if (xen_domain()) { + phys = (pte_mfn(*pte) << PAGE_SHIFT) + offset; + val = pte_val_ma(*pte); + + if (pfn > 0) { + if (pte_mfn(*pte) == pfn) { + if (vma->vm_flags && VM_IO) + str += sprintf(str,"PHYS"); + else + str += sprintf(str,"BUG: VM_IO not set!"); + } + /* It is a pseudo page ... and the VM_IO flag is set */ + if (pte_mfn(*pte) != pfn) { + if (vma->vm_flags && VM_IO) + str += sprintf(str,"BUG: VM_IO flag set!"); + else + str += sprintf(str, "PSEUDO"); + } + } else { + str += sprintf(str,"pfn==0"); + } + + } else { + phys = (pte_pfn(*pte) << PAGE_SHIFT) + offset; + val = pte_val(*pte); + } + prot = pgprot_val(pte_pgprot(*pte)); + + if (!prot) + str += sprintf(str, "Not present."); + else { + if (prot & _PAGE_USER) + str += sprintf(str, "USR "); + else + str += sprintf(str, " "); + if (prot & _PAGE_RW) + str += sprintf(str, "RW "); + else + str += sprintf(str, "ro "); + if (prot & _PAGE_PWT) + str += sprintf(str, "PWT "); + else + str += sprintf(str, " "); + if (prot & _PAGE_PCD) + str += sprintf(str, "PCD "); + else + str += sprintf(str, " "); + + /* Bit 9 has a different meaning on level 3 vs 4 */ + if (level <= 3) { + if (prot & _PAGE_PSE) + str += sprintf(str, "PSE "); + else + str += sprintf(str, " "); + } else { + if (prot & _PAGE_PAT) + str += sprintf(str, "pat "); + else + str += sprintf(str, " "); + } + if (prot & _PAGE_GLOBAL) + str += sprintf(str, "GLB "); + else + str += sprintf(str, " "); + if (prot & _PAGE_NX) + str += sprintf(str, "NX "); + else + str += sprintf(str, "x "); +#ifdef _PAGE_IOMEM + if (prot & _PAGE_IOMEM) + str += sprintf(str, "IO "); + else + str += sprintf(str, " "); +#endif + + } + +print: + printk(KERN_INFO "[%16s]PFN: 0x%lx PTE: 0x%lx (val:%lx): [%s] [%s]\n", + what, + (unsigned long)pfn, + (pte) ? (unsigned long)(pte->pte) : 0, + (unsigned long)val, + buf, + level_name[level]); +} + /** * i915_gem_fault - fault a page into the GTT * vma: VMA in question @@ -1200,8 +1339,10 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) pfn = ((dev->agp->base + obj_priv->gtt_offset) >> PAGE_SHIFT) + page_offset; + print_pte(vma,"before", NULL, pfn, 0); /* Finally, remap it using the new GTT offset */ ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn); + print_pte(vma, "after", NULL, pfn, (unsigned long) vmf->virtual_address); unlock: mutex_unlock(&dev->struct_mutex); Attachment:
debug-print-pte-i915.patch _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |