Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 161366
b: refs/heads/master
c: ff663cf
h: refs/heads/master
v: v3
  • Loading branch information
Zhenyu Wang authored and David Woodhouse committed Aug 3, 2009
1 parent b492925 commit 136d121
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 2a4ceb6d3e6a566cb4a9dc8f974177f031d27cd7
refs/heads/master: ff663cf8705bea101d5f73cf471855c85242575e
6 changes: 6 additions & 0 deletions trunk/drivers/char/agp/agp.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,11 @@ struct agp_bridge_driver {
void (*agp_destroy_pages)(struct agp_memory *);
int (*agp_type_to_mask_type) (struct agp_bridge_data *, int);
void (*chipset_flush)(struct agp_bridge_data *);

int (*agp_map_page)(void *addr, dma_addr_t *ret);
void (*agp_unmap_page)(void *addr, dma_addr_t dma);
int (*agp_map_memory)(struct agp_memory *mem);
void (*agp_unmap_memory)(struct agp_memory *mem);
};

struct agp_bridge_data {
Expand All @@ -135,6 +140,7 @@ struct agp_bridge_data {
u32 *gatt_table_real;
unsigned long scratch_page;
unsigned long scratch_page_real;
dma_addr_t scratch_page_dma;
unsigned long gart_bus_addr;
unsigned long gatt_bus_addr;
u32 mode;
Expand Down
20 changes: 20 additions & 0 deletions trunk/drivers/char/agp/backend.c
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,15 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
bridge->scratch_page_real = phys_to_gart(page_to_phys(page));
bridge->scratch_page = bridge->driver->mask_memory(bridge,
phys_to_gart(page_to_phys(page)), 0);

if (bridge->driver->agp_map_page &&
bridge->driver->agp_map_page(phys_to_virt(page_to_phys(page)),
&bridge->scratch_page_dma)) {
dev_err(&bridge->dev->dev,
"unable to dma-map scratch page\n");
rc = -ENOMEM;
goto err_out_nounmap;
}
}

size_value = bridge->driver->fetch_size();
Expand Down Expand Up @@ -191,6 +200,13 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
return 0;

err_out:
if (bridge->driver->needs_scratch_page &&
bridge->driver->agp_unmap_page) {
void *va = gart_to_virt(bridge->scratch_page_real);

bridge->driver->agp_unmap_page(va, bridge->scratch_page_dma);
}
err_out_nounmap:
if (bridge->driver->needs_scratch_page) {
void *va = gart_to_virt(bridge->scratch_page_real);

Expand Down Expand Up @@ -221,6 +237,10 @@ static void agp_backend_cleanup(struct agp_bridge_data *bridge)
bridge->driver->needs_scratch_page) {
void *va = gart_to_virt(bridge->scratch_page_real);

if (bridge->driver->agp_unmap_page)
bridge->driver->agp_unmap_page(va,
bridge->scratch_page_dma);

bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_UNMAP);
bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_FREE);
}
Expand Down
9 changes: 9 additions & 0 deletions trunk/drivers/char/agp/generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,12 @@ int agp_bind_memory(struct agp_memory *curr, off_t pg_start)
curr->bridge->driver->cache_flush();
curr->is_flushed = true;
}

if (curr->bridge->driver->agp_map_memory) {
ret_val = curr->bridge->driver->agp_map_memory(curr);
if (ret_val)
return ret_val;
}
ret_val = curr->bridge->driver->insert_memory(curr, pg_start, curr->type);

if (ret_val != 0)
Expand Down Expand Up @@ -478,6 +484,9 @@ int agp_unbind_memory(struct agp_memory *curr)
if (ret_val != 0)
return ret_val;

if (curr->bridge->driver->agp_unmap_memory)
curr->bridge->driver->agp_unmap_memory(curr);

curr->is_bound = false;
curr->pg_start = 0;
spin_lock(&curr->bridge->mapped_lock);
Expand Down
6 changes: 5 additions & 1 deletion trunk/include/linux/agp_backend.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,13 @@ struct agp_memory {
u32 physical;
bool is_bound;
bool is_flushed;
bool vmalloc_flag;
bool vmalloc_flag;
bool sg_vmalloc_flag;
/* list of agp_memory mapped to the aperture */
struct list_head mapped_list;
/* DMA-mapped addresses */
struct scatterlist *sg_list;
int num_sg;
};

#define AGP_NORMAL_MEMORY 0
Expand Down

0 comments on commit 136d121

Please sign in to comment.