On Friday 08 January 2010 01:06:07 pm Émeric Maschino wrote: > Sure. Please find below the entire dmesg log with drm.debug=1 (BTW, is > this the right way to post such a huge output to the list?): This is perfect. > [ 0.705195] ioc_iova_init() IOV page size 16K pdir e000004080e80000 size 80000 > [ 0.707381] IOC: reserving 512Mb of IOVA space at 0x60000000 for agpgart > [ 0.707417] put cookie at 0xe000004080ec0000: 0xbadbadc0ffee > [ 0.707453] ioc_resource_init() res_size 0x1000 > [ 0.707488] ioc_resource_init() res_map 1000 e000004080e2c000 > [ 0.707525] IOC: zx1 2.3 HPA 0xfed01000 IOVA space 1024Mb at 0x40000000 > [ 13.930385] Linux agpgart interface v0.103 > [ 14.036636] agpgart: HP ZX1 IOC: IOPDIR shared with sba_iommu > [ 14.036674] GART at 0xe000004080ec0000 > [ 14.036706] read cookie at 0xe000004080ec0000: 0xbadbadc0ffee > [ 14.037359] (null): AGP aperture is 512M @ 0x60000000 Perfectly normal so far. We called hp_zx1_setup() and agp_add_bridge(), which clears the GATT (in .create_gatt_table), which blows away the cookie at gatt[0]. > [ 14.037394] agpgart: HP ZX1 IOC: IOPDIR shared with sba_iommu > [ 14.037429] GART at 0xe000004080ec0000 > [ 14.037460] read cookie at 0xe000004080ec0000: 0x0 > [ 14.037492] agpgart: No reserved IO PDIR entry found; GART disabled Then for some reason we must be calling hp_zx1_setup() again, and this time it failed because the cookie is gone. This could happen if agp_add_bridge() failed, but I don't see a way it could fail after printing the "AGP aperture is 512M" message. Can you try the attached patch, please? Bjorn commit 7beeef993b8b5c66084f5b025419914992101595 Author: Bjorn Helgaas <bjorn.helgaas@xxxxxx> Date: Thu Jan 7 16:23:45 2010 -0700 diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c index e14c492..8f205d8 100644 --- a/arch/ia64/hp/common/sba_iommu.c +++ b/arch/ia64/hp/common/sba_iommu.c @@ -95,7 +95,7 @@ extern int swiotlb_late_init_with_default_size (size_t size); ** longer guaranteed to stay in sync. The sanity checking code isn't going to ** like that. */ -#undef DEBUG_SBA_INIT +#define DEBUG_SBA_INIT #undef DEBUG_SBA_RUN #undef DEBUG_SBA_RUN_SG #undef DEBUG_SBA_RESOURCE @@ -1656,11 +1656,15 @@ ioc_iova_init(struct ioc *ioc) for_each_pci_dev(device) agp_found |= pci_find_capability(device, PCI_CAP_ID_AGP); + agp_found = 1; if (agp_found && reserve_sba_gart) { printk(KERN_INFO PFX "reserving %dMb of IOVA space at 0x%lx for agpgart\n", ioc->iov_size/2 >> 20, ioc->ibase + ioc->iov_size/2); ioc->pdir_size /= 2; ((u64 *)ioc->pdir_base)[PDIR_INDEX(ioc->iov_size/2)] = ZX1_SBA_IOMMU_COOKIE; + printk("put cookie at 0x%p: 0x%llx\n", + &((u64 *)ioc->pdir_base)[PDIR_INDEX(ioc->iov_size/2)], + ((u64 *)ioc->pdir_base)[PDIR_INDEX(ioc->iov_size/2)]); } #ifdef FULL_VALID_PDIR /* diff --git a/drivers/char/agp/backend.c b/drivers/char/agp/backend.c index a56ca08..5a7a529 100644 --- a/drivers/char/agp/backend.c +++ b/drivers/char/agp/backend.c @@ -320,6 +320,7 @@ int agp_add_bridge(struct agp_bridge_data *bridge) } list_add(&bridge->list, &agp_bridges); + printk("%s: returning 0 (success)\n", __func__); return 0; frontend_err: @@ -327,6 +328,7 @@ frontend_err: err_out: module_put(bridge->driver->owner); agp_put_bridge(bridge); + printk("%s: returning %d (failure)\n", __func__, error); return error; } EXPORT_SYMBOL_GPL(agp_add_bridge); diff --git a/drivers/char/agp/hp-agp.c b/drivers/char/agp/hp-agp.c index 58752b7..3a02bdb 100644 --- a/drivers/char/agp/hp-agp.c +++ b/drivers/char/agp/hp-agp.c @@ -110,6 +110,8 @@ static int __init hp_zx1_ioc_shared(void) hp->io_pdir = phys_to_virt(readq(hp->ioc_regs+HP_ZX1_PDIR_BASE)); hp->gatt = &hp->io_pdir[HP_ZX1_IOVA_TO_PDIR(hp->gart_base)]; + printk("GART at 0x%p\n", hp->gatt); + printk("read cookie at 0x%p: 0x%llx\n", &hp->gatt[0], hp->gatt[0]); if (hp->gatt[0] != HP_ZX1_SBA_IOMMU_COOKIE) { /* Normal case when no AGP device in system */ hp->gatt = NULL; @@ -266,6 +268,7 @@ hp_zx1_cleanup (void) { struct _hp_private *hp = &hp_private; + printk("%s\n", __func__); if (hp->ioc_regs) { if (hp->io_pdir_owner) { writeq(0, hp->ioc_regs+HP_ZX1_IBASE); @@ -292,6 +295,7 @@ hp_zx1_create_gatt_table (struct agp_bridge_data *bridge) struct _hp_private *hp = &hp_private; int i; + printk("%s\n", __func__); if (hp->io_pdir_owner) { hp->io_pdir = (u64 *) __get_free_pages(GFP_KERNEL, get_order(hp->io_pdir_size)); @@ -319,6 +323,7 @@ hp_zx1_free_gatt_table (struct agp_bridge_data *bridge) { struct _hp_private *hp = &hp_private; + printk("%s\n", __func__); if (hp->io_pdir_owner) free_pages((unsigned long) hp->io_pdir, get_order(hp->io_pdir_size)); @@ -465,6 +470,7 @@ hp_zx1_setup (u64 ioc_hpa, u64 lba_hpa) bridge->dev = &fake_bridge_dev; error = agp_add_bridge(bridge); + printk("%s: agp_add_bridge returned %d\n", __func__, error); fail: if (error) hp_zx1_cleanup(); @@ -479,6 +485,7 @@ zx1_gart_probe (acpi_handle obj, u32 depth, void *context, void **ret) struct acpi_device_info *info; u64 lba_hpa, sba_hpa, length; int match; + int error; status = hp_acpi_csr_space(obj, &lba_hpa, &length); if (ACPI_FAILURE(status)) @@ -511,7 +518,9 @@ zx1_gart_probe (acpi_handle obj, u32 depth, void *context, void **ret) if (ACPI_FAILURE(status)) return AE_OK; /* found no enclosing IOC */ - if (hp_zx1_setup(sba_hpa + HP_ZX1_IOC_OFFSET, lba_hpa)) + error = hp_zx1_setup(sba_hpa + HP_ZX1_IOC_OFFSET, lba_hpa); + printk("%s: hp_zx1_setup returned %d\n", __func__, error); + if (error) return AE_OK; printk(KERN_INFO PFX "Detected HP ZX1 %s AGP chipset " @@ -525,6 +534,7 @@ zx1_gart_probe (acpi_handle obj, u32 depth, void *context, void **ret) static int __init agp_hp_init (void) { + printk("%s\n", __func__); if (agp_off) return -EINVAL; -- To unsubscribe from this list: send the line "unsubscribe linux-ia64" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
![]() |