From: BitKeeper B. <ri...@su...> - 2004-09-05 06:00:35
|
ChangeSet 1.1296, 2004/09/05 06:19:12+01:00, ka...@fr... Patch AGP and DRM video drivers to be (hopefully) safe for Xen. These patches must be applied manually for now: cd linux-2.6.8.1-xen0 ; patch -p1 <../linux-2.6.8.1-patches/*.patch agpgart.patch | 275 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ drm.patch | 9 + 2 files changed, 284 insertions(+) diff -Nru a/linux-2.6.8.1-patches/agpgart.patch b/linux-2.6.8.1-patches/agpgart.patch --- /dev/null Wed Dec 31 16:00:00 196900 +++ b/linux-2.6.8.1-patches/agpgart.patch 2004-09-05 02:00:28 -04:00 @@ -0,0 +1,328 @@ +--- linux-2.6.8.1/drivers/char/agp/ali-agp.c 2004-08-14 11:55:35.000000000 +0100 ++++ linux-2.6.8.1-xen0/drivers/char/agp/ali-agp.c 2004-09-05 05:55:58.876495340 +0100 +@@ -150,7 +150,7 @@ + pci_read_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, &temp); + pci_write_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, + (((temp & ALI_CACHE_FLUSH_ADDR_MASK) | +- virt_to_phys(addr)) | ALI_CACHE_FLUSH_EN )); ++ virt_to_bus(addr)) | ALI_CACHE_FLUSH_EN )); + return addr; + } + +@@ -174,7 +174,7 @@ + pci_read_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, &temp); + pci_write_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, + (((temp & ALI_CACHE_FLUSH_ADDR_MASK) | +- virt_to_phys(addr)) | ALI_CACHE_FLUSH_EN)); ++ virt_to_bus(addr)) | ALI_CACHE_FLUSH_EN)); + agp_generic_destroy_page(addr); + } + +--- linux-2.6.8.1/drivers/char/agp/amd-k7-agp.c 2004-08-14 11:56:24.000000000 +0100 ++++ linux-2.6.8.1-xen0/drivers/char/agp/amd-k7-agp.c 2004-09-05 05:55:58.877495108 +0100 +@@ -43,7 +43,7 @@ + + SetPageReserved(virt_to_page(page_map->real)); + global_cache_flush(); +- page_map->remapped = ioremap_nocache(virt_to_phys(page_map->real), ++ page_map->remapped = ioremap_nocache(virt_to_bus(page_map->real), + PAGE_SIZE); + if (page_map->remapped == NULL) { + ClearPageReserved(virt_to_page(page_map->real)); +@@ -152,7 +152,7 @@ + + agp_bridge->gatt_table_real = (u32 *)page_dir.real; + agp_bridge->gatt_table = (u32 *)page_dir.remapped; +- agp_bridge->gatt_bus_addr = virt_to_phys(page_dir.real); ++ agp_bridge->gatt_bus_addr = virt_to_bus(page_dir.real); + + /* Get the address for the gart region. + * This is a bus address even on the alpha, b/c its +@@ -166,7 +166,7 @@ + /* Calculate the agp offset */ + for (i = 0; i < value->num_entries / 1024; i++, addr += 0x00400000) { + page_dir.remapped[GET_PAGE_DIR_OFF(addr)] = +- virt_to_phys(amd_irongate_private.gatt_pages[i]->real); ++ virt_to_bus(amd_irongate_private.gatt_pages[i]->real); + page_dir.remapped[GET_PAGE_DIR_OFF(addr)] |= 0x00000001; + } + +--- linux-2.6.8.1/drivers/char/agp/amd64-agp.c 2004-08-14 11:55:47.000000000 +0100 ++++ linux-2.6.8.1-xen0/drivers/char/agp/amd64-agp.c 2004-09-05 05:55:58.877495108 +0100 +@@ -212,7 +212,7 @@ + + static int amd_8151_configure(void) + { +- unsigned long gatt_bus = virt_to_phys(agp_bridge->gatt_table_real); ++ unsigned long gatt_bus = virt_to_bus(agp_bridge->gatt_table_real); + + /* Configure AGP regs in each x86-64 host bridge. */ + for_each_nb() { +@@ -521,7 +521,7 @@ + { + struct agp_bridge_data *bridge = pci_get_drvdata(pdev); + +- release_mem_region(virt_to_phys(bridge->gatt_table_real), ++ release_mem_region(virt_to_bus(bridge->gatt_table_real), + amd64_aperture_sizes[bridge->aperture_size_idx].size); + agp_remove_bridge(bridge); + agp_put_bridge(bridge); +--- linux-2.6.8.1/drivers/char/agp/ati-agp.c 2004-08-14 11:55:48.000000000 +0100 ++++ linux-2.6.8.1-xen0/drivers/char/agp/ati-agp.c 2004-09-05 05:55:58.877495108 +0100 +@@ -64,7 +64,7 @@ + + /* CACHE_FLUSH(); */ + global_cache_flush(); +- page_map->remapped = ioremap_nocache(virt_to_phys(page_map->real), ++ page_map->remapped = ioremap_nocache(virt_to_bus(page_map->real), + PAGE_SIZE); + if (page_map->remapped == NULL || err) { + ClearPageReserved(virt_to_page(page_map->real)); +--- linux-2.6.8.1/drivers/char/agp/backend.c 2004-08-14 11:55:47.000000000 +0100 ++++ linux-2.6.8.1-xen0/drivers/char/agp/backend.c 2004-09-05 05:55:58.878494876 +0100 +@@ -142,7 +142,7 @@ + return -ENOMEM; + } + +- bridge->scratch_page_real = virt_to_phys(addr); ++ bridge->scratch_page_real = virt_to_bus(addr); + bridge->scratch_page = + bridge->driver->mask_memory(bridge->scratch_page_real, 0); + } +@@ -186,7 +186,7 @@ + err_out: + if (bridge->driver->needs_scratch_page) + bridge->driver->agp_destroy_page( +- phys_to_virt(bridge->scratch_page_real)); ++ bus_to_virt(bridge->scratch_page_real)); + if (got_gatt) + bridge->driver->free_gatt_table(); + if (got_keylist) { +@@ -211,7 +211,7 @@ + if (bridge->driver->agp_destroy_page && + bridge->driver->needs_scratch_page) + bridge->driver->agp_destroy_page( +- phys_to_virt(bridge->scratch_page_real)); ++ bus_to_virt(bridge->scratch_page_real)); + } + + static const drm_agp_t drm_agp = { +--- linux-2.6.8.1/drivers/char/agp/generic.c 2004-08-14 11:55:10.000000000 +0100 ++++ linux-2.6.8.1-xen0/drivers/char/agp/generic.c 2004-09-05 05:55:58.879494644 +0100 +@@ -127,7 +127,7 @@ + } + if (curr->page_count != 0) { + for (i = 0; i < curr->page_count; i++) { +- agp_bridge->driver->agp_destroy_page(phys_to_virt(curr->memory[i])); ++ agp_bridge->driver->agp_destroy_page(bus_to_virt(curr->memory[i])); + } + } + agp_free_key(curr->key); +@@ -181,7 +181,7 @@ + return NULL; + } + new->memory[i] = +- agp_bridge->driver->mask_memory(virt_to_phys(addr), type); ++ agp_bridge->driver->mask_memory(virt_to_bus(addr), type); + new->page_count++; + } + +@@ -636,6 +636,7 @@ + int i; + void *temp; + struct page *page; ++ dma_addr_t dma; + + /* The generic routines can't handle 2 level gatt's */ + if (agp_bridge->driver->size_type == LVL2_APER_SIZE) +@@ -674,8 +675,10 @@ + break; + } + +- table = (char *) __get_free_pages(GFP_KERNEL, +- page_order); ++ table = dma_alloc_coherent( ++ &agp_bridge->dev->dev, ++ PAGE_SIZE << page_order, &dma, ++ GFP_KERNEL); + + if (table == NULL) { + i++; +@@ -706,7 +709,9 @@ + size = ((struct aper_size_info_fixed *) temp)->size; + page_order = ((struct aper_size_info_fixed *) temp)->page_order; + num_entries = ((struct aper_size_info_fixed *) temp)->num_entries; +- table = (char *) __get_free_pages(GFP_KERNEL, page_order); ++ table = dma_alloc_coherent( ++ &agp_bridge->dev->dev, ++ PAGE_SIZE << page_order, &dma, GFP_KERNEL); + } + + if (table == NULL) +@@ -721,7 +726,7 @@ + agp_gatt_table = (void *)table; + + agp_bridge->driver->cache_flush(); +- agp_bridge->gatt_table = ioremap_nocache(virt_to_phys(table), ++ agp_bridge->gatt_table = ioremap_nocache(virt_to_bus(table), + (PAGE_SIZE * (1 << page_order))); + agp_bridge->driver->cache_flush(); + +@@ -729,11 +734,12 @@ + for (page = virt_to_page(table); page <= virt_to_page(table_end); page++) + ClearPageReserved(page); + +- free_pages((unsigned long) table, page_order); ++ dma_free_coherent(&agp_bridge->dev->dev, PAGE_SIZE<<page_order, ++ table, dma); + + return -ENOMEM; + } +- agp_bridge->gatt_bus_addr = virt_to_phys(agp_bridge->gatt_table_real); ++ agp_bridge->gatt_bus_addr = virt_to_bus(table); + + /* AK: bogus, should encode addresses > 4GB */ + for (i = 0; i < num_entries; i++) +@@ -785,7 +791,8 @@ + for (page = virt_to_page(table); page <= virt_to_page(table_end); page++) + ClearPageReserved(page); + +- free_pages((unsigned long) agp_bridge->gatt_table_real, page_order); ++ dma_free_coherent(&agp_bridge->dev->dev, PAGE_SIZE<<page_order, ++ agp_bridge->gatt_table_real, agp_bridge->gatt_bus_addr); + + agp_gatt_table = NULL; + agp_bridge->gatt_table = NULL; +--- linux-2.6.8.1/drivers/char/agp/hp-agp.c 2004-08-14 11:55:59.000000000 +0100 ++++ linux-2.6.8.1-xen0/drivers/char/agp/hp-agp.c 2004-09-05 05:55:58.879494644 +0100 +@@ -110,7 +110,7 @@ + hp->gart_size = HP_ZX1_GART_SIZE; + hp->gatt_entries = hp->gart_size / hp->io_page_size; + +- hp->io_pdir = phys_to_virt(INREG64(hp->ioc_regs, HP_ZX1_PDIR_BASE)); ++ hp->io_pdir = bus_to_virt(INREG64(hp->ioc_regs, HP_ZX1_PDIR_BASE)); + hp->gatt = &hp->io_pdir[HP_ZX1_IOVA_TO_PDIR(hp->gart_base)]; + + if (hp->gatt[0] != HP_ZX1_SBA_IOMMU_COOKIE) { +@@ -248,7 +248,7 @@ + agp_bridge->mode = INREG32(hp->lba_regs, hp->lba_cap_offset + PCI_AGP_STATUS); + + if (hp->io_pdir_owner) { +- OUTREG64(hp->ioc_regs, HP_ZX1_PDIR_BASE, virt_to_phys(hp->io_pdir)); ++ OUTREG64(hp->ioc_regs, HP_ZX1_PDIR_BASE, virt_to_bus(hp->io_pdir)); + OUTREG64(hp->ioc_regs, HP_ZX1_TCNFG, hp->io_tlb_ps); + OUTREG64(hp->ioc_regs, HP_ZX1_IMASK, ~(HP_ZX1_IOVA_SIZE - 1)); + OUTREG64(hp->ioc_regs, HP_ZX1_IBASE, hp->iova_base | 0x1); +--- linux-2.6.8.1/drivers/char/agp/i460-agp.c 2004-08-14 11:55:34.000000000 +0100 ++++ linux-2.6.8.1-xen0/drivers/char/agp/i460-agp.c 2004-09-05 05:55:58.879494644 +0100 +@@ -371,7 +371,7 @@ + } + memset(lp->alloced_map, 0, map_size); + +- lp->paddr = virt_to_phys(lpage); ++ lp->paddr = virt_to_bus(lpage); + lp->refcount = 0; + atomic_add(I460_KPAGES_PER_IOPAGE, &agp_bridge->current_memory_agp); + return 0; +@@ -382,7 +382,7 @@ + kfree(lp->alloced_map); + lp->alloced_map = NULL; + +- free_pages((unsigned long) phys_to_virt(lp->paddr), I460_IO_PAGE_SHIFT - PAGE_SHIFT); ++ free_pages((unsigned long) bus_to_virt(lp->paddr), I460_IO_PAGE_SHIFT - PAGE_SHIFT); + atomic_sub(I460_KPAGES_PER_IOPAGE, &agp_bridge->current_memory_agp); + } + +--- linux-2.6.8.1/drivers/char/agp/intel-agp.c 2004-08-14 11:55:32.000000000 +0100 ++++ linux-2.6.8.1-xen0/drivers/char/agp/intel-agp.c 2004-09-05 05:55:58.880494412 +0100 +@@ -285,7 +285,7 @@ + if (new == NULL) + return NULL; + +- new->memory[0] = virt_to_phys(addr); ++ new->memory[0] = virt_to_bus(addr); + if (pg_count == 4) { + /* kludge to get 4 physical pages for ARGB cursor */ + new->memory[1] = new->memory[0] + PAGE_SIZE; |