Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2a4ceb6d authored by David Woodhouse's avatar David Woodhouse
Browse files

agp: Switch mask_memory() method to take address argument again, not page



In commit 07613ba2 ("agp: switch AGP to use page array instead of
unsigned long array") we switched the mask_memory() method to take a
'struct page *' instead of an address. This is painful, because in some
cases it has to be an IOMMU-mapped virtual bus address (in fact,
shouldn't it _always_ be a dma_addr_t returned from pci_map_xxx(), and
we just happen to get lucky most of the time?)

Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
parent ed680c4a
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -107,7 +107,7 @@ struct agp_bridge_driver {
	void (*agp_enable)(struct agp_bridge_data *, u32);
	void (*agp_enable)(struct agp_bridge_data *, u32);
	void (*cleanup)(void);
	void (*cleanup)(void);
	void (*tlb_flush)(struct agp_memory *);
	void (*tlb_flush)(struct agp_memory *);
	unsigned long (*mask_memory)(struct agp_bridge_data *, struct page *, int);
	unsigned long (*mask_memory)(struct agp_bridge_data *, dma_addr_t, int);
	void (*cache_flush)(void);
	void (*cache_flush)(void);
	int (*create_gatt_table)(struct agp_bridge_data *);
	int (*create_gatt_table)(struct agp_bridge_data *);
	int (*free_gatt_table)(struct agp_bridge_data *);
	int (*free_gatt_table)(struct agp_bridge_data *);
@@ -291,7 +291,7 @@ int agp_3_5_enable(struct agp_bridge_data *bridge);
void global_cache_flush(void);
void global_cache_flush(void);
void get_agp_version(struct agp_bridge_data *bridge);
void get_agp_version(struct agp_bridge_data *bridge);
unsigned long agp_generic_mask_memory(struct agp_bridge_data *bridge,
unsigned long agp_generic_mask_memory(struct agp_bridge_data *bridge,
				      struct page *page, int type);
				      dma_addr_t phys, int type);
int agp_generic_type_to_mask_type(struct agp_bridge_data *bridge,
int agp_generic_type_to_mask_type(struct agp_bridge_data *bridge,
				  int type);
				  int type);
struct agp_bridge_data *agp_generic_find_bridge(struct pci_dev *pdev);
struct agp_bridge_data *agp_generic_find_bridge(struct pci_dev *pdev);
+3 −1
Original line number Original line Diff line number Diff line
@@ -325,7 +325,9 @@ static int amd_insert_memory(struct agp_memory *mem, off_t pg_start, int type)
		addr = (j * PAGE_SIZE) + agp_bridge->gart_bus_addr;
		addr = (j * PAGE_SIZE) + agp_bridge->gart_bus_addr;
		cur_gatt = GET_GATT(addr);
		cur_gatt = GET_GATT(addr);
		writel(agp_generic_mask_memory(agp_bridge,
		writel(agp_generic_mask_memory(agp_bridge,
			mem->pages[i], mem->type), cur_gatt+GET_GATT_OFF(addr));
					       phys_to_gart(page_to_phys(mem->pages[i])),
					       mem->type),
		       cur_gatt+GET_GATT_OFF(addr));
		readl(cur_gatt+GET_GATT_OFF(addr));	/* PCI Posting. */
		readl(cur_gatt+GET_GATT_OFF(addr));	/* PCI Posting. */
	}
	}
	amd_irongate_tlbflush(mem);
	amd_irongate_tlbflush(mem);
+2 −1
Original line number Original line Diff line number Diff line
@@ -79,7 +79,8 @@ static int amd64_insert_memory(struct agp_memory *mem, off_t pg_start, int type)


	for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
	for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
		tmp = agp_bridge->driver->mask_memory(agp_bridge,
		tmp = agp_bridge->driver->mask_memory(agp_bridge,
			mem->pages[i], mask_type);
						      phys_to_gart(page_to_phys(mem->pages[i])),
						      mask_type);


		BUG_ON(tmp & 0xffffff0000000ffcULL);
		BUG_ON(tmp & 0xffffff0000000ffcULL);
		pte = (tmp & 0x000000ff00000000ULL) >> 28;
		pte = (tmp & 0x000000ff00000000ULL) >> 28;
+2 −1
Original line number Original line Diff line number Diff line
@@ -302,7 +302,8 @@ static int ati_insert_memory(struct agp_memory * mem,
		addr = (j * PAGE_SIZE) + agp_bridge->gart_bus_addr;
		addr = (j * PAGE_SIZE) + agp_bridge->gart_bus_addr;
		cur_gatt = GET_GATT(addr);
		cur_gatt = GET_GATT(addr);
		writel(agp_bridge->driver->mask_memory(agp_bridge,	
		writel(agp_bridge->driver->mask_memory(agp_bridge,	
						       mem->pages[i], mem->type),
						       phys_to_gart(page_to_phys(mem->pages[i])),
						       mem->type),
		       cur_gatt+GET_GATT_OFF(addr));
		       cur_gatt+GET_GATT_OFF(addr));
	}
	}
	readl(GET_GATT(agp_bridge->gart_bus_addr)); /* PCI posting */
	readl(GET_GATT(agp_bridge->gart_bus_addr)); /* PCI posting */
+2 −2
Original line number Original line Diff line number Diff line
@@ -150,8 +150,8 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
		}
		}


		bridge->scratch_page_real = phys_to_gart(page_to_phys(page));
		bridge->scratch_page_real = phys_to_gart(page_to_phys(page));
		bridge->scratch_page =
		bridge->scratch_page = bridge->driver->mask_memory(bridge,
		    bridge->driver->mask_memory(bridge, page, 0);
					   phys_to_gart(page_to_phys(page)), 0);
	}
	}


	size_value = bridge->driver->fetch_size();
	size_value = bridge->driver->fetch_size();
Loading