Hi Jeff,

I'm still trying to resolve this issue for clean support of both the
Intel 460GX and the corresponding HP IA64 chipset.

We need either
    (1) an agpgart patch like the attached one,
    (2) a hack in DRM like the one below, or
    (3) some other possibility I haven't thought of.

If we do the agpgart change, we don't need to change DRM,
which in my mind is a big plus.

Do you support putting the attached agpgart patch into the
2.4.x kernel stream (and/or 2.5.x)?  If so, would you like to
push it upstream yourself, or should I continue beating my
head against the wall?

--- linux-2.4.17/drivers/char/drm/drm_vm.h      Thu Nov 22 12:46:37 2001
+++ linux-2.4.17-ia64-011226/drivers/char/drm/drm_vm.h  Mon Mar  4 10:45:04 2002
@@ -115,8 +115,16 @@
                  * Get the page, inc the use count, and return it
                  */
                offset = (baddr - agpmem->bound) >> PAGE_SHIFT;
-               agpmem->memory->memory[offset] &= dev->agp->page_mask;
-               page = virt_to_page(__va(agpmem->memory->memory[offset]));
+
+#if defined(CONFIG_AGP_I460) && defined(__ia64__)
+               if (dev->agp->agp_info.chipset == INTEL_460GX)
+                       paddr = (agpmem->memory->memory[offset] & 0xffffff) << 1
2;
+               else
+                       paddr = agpmem->memory->memory[offset] & dev->agp->page_
mask;
+#else
+               paddr = agpmem->memory->memory[offset] & dev->agp->page_mask;
+#endif
+               page = virt_to_page(__va(paddr));
                get_page(page);
 
                DRM_DEBUG("baddr = 0x%lx page = 0x%p, offset = 0x%lx\n",

-- 
Bjorn Helgaas - [EMAIL PROTECTED]
Linux Systems Operation R&D
Hewlett-Packard

diff -u -r linux-2.4.19-pre2/drivers/char/agp/agp.h 
build/linux-2.4.19-pre2-pagemask/drivers/char/agp/agp.h
--- linux-2.4.19-pre2/drivers/char/agp/agp.h    Mon Feb 25 12:37:57 2002
+++ build/linux-2.4.19-pre2-pagemask/drivers/char/agp/agp.h     Fri Mar  1 17:16:39 
+2002
@@ -99,7 +99,6 @@
        int needs_scratch_page;
        int aperture_size_idx;
        int num_aperture_sizes;
-       int num_of_masks;
        int capndx;
        int cant_use_aperture;
 
diff -u -r linux-2.4.19-pre2/drivers/char/agp/agpgart_be.c 
build/linux-2.4.19-pre2-pagemask/drivers/char/agp/agpgart_be.c
--- linux-2.4.19-pre2/drivers/char/agp/agpgart_be.c     Fri Mar  1 17:15:57 2002
+++ build/linux-2.4.19-pre2-pagemask/drivers/char/agp/agpgart_be.c      Fri Mar  1 
+17:16:39 2002
@@ -207,7 +207,6 @@
        }
        if (curr->page_count != 0) {
                for (i = 0; i < curr->page_count; i++) {
-                       curr->memory[i] &= ~(0x00000fff);
                        agp_bridge.agp_destroy_page((unsigned long)
                                         phys_to_virt(curr->memory[i]));
                }
@@ -260,10 +259,7 @@
                        agp_free_memory(new);
                        return NULL;
                }
-               new->memory[i] =
-                   agp_bridge.mask_memory(
-                                  virt_to_phys((void *) new->memory[i]),
-                                                 type);
+               new->memory[i] = virt_to_phys((void *) new->memory[i]);
                new->page_count++;
        }
 
@@ -307,9 +303,6 @@
 
 void agp_copy_info(agp_kern_info * info)
 {
-       unsigned long page_mask = 0;
-       int i;
-
        memset(info, 0, sizeof(agp_kern_info));
        if (agp_bridge.type == NOT_SUPPORTED) {
                info->chipset = agp_bridge.type;
@@ -325,11 +318,7 @@
        info->max_memory = agp_bridge.max_memory_agp;
        info->current_memory = atomic_read(&agp_bridge.current_memory_agp);
        info->cant_use_aperture = agp_bridge.cant_use_aperture;
-
-       for(i = 0; i < agp_bridge.num_of_masks; i++)
-               page_mask |= agp_bridge.mask_memory(page_mask, i);
-
-       info->page_mask = ~page_mask;
+       info->page_mask = ~0UL;
 }
 
 /* End - Routine to copy over information structure */
@@ -713,7 +702,8 @@
                mem->is_flushed = TRUE;
        }
        for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
-               agp_bridge.gatt_table[j] = mem->memory[i];
+               agp_bridge.gatt_table[j] =
+                       agp_bridge.mask_memory(mem->memory[i], mem->type);
        }
 
        agp_bridge.tlb_flush(mem);
@@ -949,7 +939,8 @@
        CACHE_FLUSH();
        for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
                OUTREG32(intel_i810_private.registers,
-                        I810_PTE_BASE + (j * 4), mem->memory[i]);
+                        I810_PTE_BASE + (j * 4),
+                        agp_bridge.mask_memory(mem->memory[i], mem->type));
        }
        CACHE_FLUSH();
 
@@ -1015,10 +1006,7 @@
                        agp_free_memory(new);
                        return NULL;
                }
-               new->memory[0] =
-                   agp_bridge.mask_memory(
-                                  virt_to_phys((void *) new->memory[0]),
-                                                 type);
+               new->memory[0] = virt_to_phys((void *) new->memory[0]);
                new->page_count = 1;
                new->num_scratch_pages = 1;
                new->type = AGP_PHYS_MEMORY;
@@ -1052,7 +1040,6 @@
        intel_i810_private.i810_dev = i810_dev;
 
        agp_bridge.masks = intel_i810_masks;
-       agp_bridge.num_of_masks = 2;
        agp_bridge.aperture_sizes = (void *) intel_i810_sizes;
        agp_bridge.size_type = FIXED_APER_SIZE;
        agp_bridge.num_aperture_sizes = 2;
@@ -1254,7 +1241,8 @@
        CACHE_FLUSH();
 
        for (i = 0, j = pg_start; i < mem->page_count; i++, j++)
-               OUTREG32(intel_i830_private.registers,I810_PTE_BASE + (j * 
4),mem->memory[i]);
+               OUTREG32(intel_i830_private.registers,I810_PTE_BASE + (j * 4),
+                        agp_bridge.mask_memory(mem->memory[i], mem->type));
 
        CACHE_FLUSH();
 
@@ -1315,7 +1303,7 @@
                        return(NULL);
                }
 
-               nw->memory[0] = agp_bridge.mask_memory(virt_to_phys((void *) 
nw->memory[0]),type);
+               nw->memory[0] = virt_to_phys((void *) nw->memory[0]);
                nw->page_count = 1;
                nw->num_scratch_pages = 1;
                nw->type = AGP_PHYS_MEMORY;
@@ -1331,7 +1319,6 @@
        intel_i830_private.i830_dev = i830_dev;
 
        agp_bridge.masks = intel_i810_masks;
-       agp_bridge.num_of_masks = 3;
        agp_bridge.aperture_sizes = (void *) intel_i830_sizes;
        agp_bridge.size_type = FIXED_APER_SIZE;
        agp_bridge.num_aperture_sizes = 2;
@@ -1757,7 +1744,6 @@
 static int __init intel_generic_setup (struct pci_dev *pdev)
 {
        agp_bridge.masks = intel_generic_masks;
-       agp_bridge.num_of_masks = 1;
        agp_bridge.aperture_sizes = (void *) intel_generic_sizes;
        agp_bridge.size_type = U16_APER_SIZE;
        agp_bridge.num_aperture_sizes = 7;
@@ -1792,7 +1778,6 @@
 static int __init intel_820_setup (struct pci_dev *pdev)
 {
        agp_bridge.masks = intel_generic_masks;
-       agp_bridge.num_of_masks = 1;
        agp_bridge.aperture_sizes = (void *) intel_8xx_sizes;
        agp_bridge.size_type = U8_APER_SIZE;
        agp_bridge.num_aperture_sizes = 7;
@@ -1825,7 +1810,6 @@
 static int __init intel_830mp_setup (struct pci_dev *pdev)
 {
        agp_bridge.masks = intel_generic_masks;
-       agp_bridge.num_of_masks = 1;
        agp_bridge.aperture_sizes = (void *) intel_830mp_sizes;
        agp_bridge.size_type = U8_APER_SIZE;
        agp_bridge.num_aperture_sizes = 4;
@@ -1857,7 +1841,6 @@
 static int __init intel_840_setup (struct pci_dev *pdev)
 {
        agp_bridge.masks = intel_generic_masks;
-       agp_bridge.num_of_masks = 1;
        agp_bridge.aperture_sizes = (void *) intel_8xx_sizes;
        agp_bridge.size_type = U8_APER_SIZE;
        agp_bridge.num_aperture_sizes = 7;
@@ -1890,7 +1873,6 @@
 static int __init intel_845_setup (struct pci_dev *pdev)
 {
        agp_bridge.masks = intel_generic_masks;
-       agp_bridge.num_of_masks = 1;
        agp_bridge.aperture_sizes = (void *) intel_8xx_sizes;
        agp_bridge.size_type = U8_APER_SIZE;
        agp_bridge.num_aperture_sizes = 7;
@@ -1923,7 +1905,6 @@
 static int __init intel_850_setup (struct pci_dev *pdev)
 {
        agp_bridge.masks = intel_generic_masks;
-       agp_bridge.num_of_masks = 1;
        agp_bridge.aperture_sizes = (void *) intel_8xx_sizes;
        agp_bridge.size_type = U8_APER_SIZE;
        agp_bridge.num_aperture_sizes = 7;
@@ -1956,7 +1937,6 @@
 static int __init intel_860_setup (struct pci_dev *pdev)
 {
        agp_bridge.masks = intel_generic_masks;
-       agp_bridge.num_of_masks = 1;
        agp_bridge.aperture_sizes = (void *) intel_8xx_sizes;
        agp_bridge.size_type = U8_APER_SIZE;
        agp_bridge.num_aperture_sizes = 7;
@@ -2076,7 +2056,6 @@
 static int __init via_generic_setup (struct pci_dev *pdev)
 {
        agp_bridge.masks = via_generic_masks;
-       agp_bridge.num_of_masks = 1;
        agp_bridge.aperture_sizes = (void *) via_generic_sizes;
        agp_bridge.size_type = U8_APER_SIZE;
        agp_bridge.num_aperture_sizes = 7;
@@ -2190,7 +2169,6 @@
 static int __init sis_generic_setup (struct pci_dev *pdev)
 {
        agp_bridge.masks = sis_generic_masks;
-       agp_bridge.num_of_masks = 1;
        agp_bridge.aperture_sizes = (void *) sis_generic_sizes;
        agp_bridge.size_type = U8_APER_SIZE;
        agp_bridge.num_aperture_sizes = 7;
@@ -2520,7 +2498,8 @@
        for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
                addr = (j * PAGE_SIZE) + agp_bridge.gart_bus_addr;
                cur_gatt = GET_GATT(addr);
-               cur_gatt[GET_GATT_OFF(addr)] = mem->memory[i];
+               cur_gatt[GET_GATT_OFF(addr)] =
+                       agp_bridge.mask_memory(mem->memory[i], mem->type);
        }
        agp_bridge.tlb_flush(mem);
        return 0;
@@ -2566,7 +2545,6 @@
 static int __init amd_irongate_setup (struct pci_dev *pdev)
 {
        agp_bridge.masks = amd_irongate_masks;
-       agp_bridge.num_of_masks = 1;
        agp_bridge.aperture_sizes = (void *) amd_irongate_sizes;
        agp_bridge.size_type = LVL2_APER_SIZE;
        agp_bridge.num_aperture_sizes = 7;
@@ -2813,7 +2791,6 @@
 static int __init ali_generic_setup (struct pci_dev *pdev)
 {
        agp_bridge.masks = ali_generic_masks;
-       agp_bridge.num_of_masks = 1;
        agp_bridge.aperture_sizes = (void *) ali_generic_sizes;
        agp_bridge.size_type = U32_APER_SIZE;
        agp_bridge.num_aperture_sizes = 7;
@@ -3219,7 +3196,8 @@
        for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
                addr = (j * PAGE_SIZE) + agp_bridge.gart_bus_addr;
                cur_gatt = SVRWRKS_GET_GATT(addr);
-               cur_gatt[GET_GATT_OFF(addr)] = mem->memory[i];
+               cur_gatt[GET_GATT_OFF(addr)] =
+                       agp_bridge.mask_memory(mem->memory[i], mem->type);
        }
        agp_bridge.tlb_flush(mem);
        return 0;
@@ -3376,7 +3354,6 @@
        serverworks_private.svrwrks_dev = pdev;
 
        agp_bridge.masks = serverworks_masks;
-       agp_bridge.num_of_masks = 1;
        agp_bridge.aperture_sizes = (void *) serverworks_sizes;
        agp_bridge.size_type = LVL2_APER_SIZE;
        agp_bridge.num_aperture_sizes = 7;

Reply via email to