You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6
* 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: (24 commits) agp/intel: Make intel_i965_mask_memory use dma_addr_t for physical addresses agp: add user mapping support to ATI AGP bridge. drm/i915: enable GEM on PAE. drm/radeon: fix unused variables warning agp: switch AGP to use page array instead of unsigned long array agpgart: detected ALi M???? chipset with M1621 drm/radeon: command stream checker for r3xx-r5xx hardware drm/radeon: Fully initialize LVDS info also when we can't get it from the ROM. radeon: Fix CP byte order on big endian architectures with KMS. agp/uninorth: Handle user memory types. drm/ttm: Add some powerpc cache flush code. radeon: Enable modesetting on non-x86. drm/radeon: Respect AGP cant_use_aperture flag. drm: EDID endianness fixes. drm/radeon: this VRAM vs aperture test is wrong, just remove it. drm/ttm: fix an error path to exit function correctly drm: Apply "Memory fragmentation from lost alignment blocks" ttm: Return -ERESTART when a signal interrupts bo eviction. drm: Remove memory debugging infrastructure. drm/i915: Clear fence register on tiling stride change. ...
This commit is contained in:
@@ -107,7 +107,7 @@ struct agp_bridge_driver {
|
||||
void (*agp_enable)(struct agp_bridge_data *, u32);
|
||||
void (*cleanup)(void);
|
||||
void (*tlb_flush)(struct agp_memory *);
|
||||
unsigned long (*mask_memory)(struct agp_bridge_data *, unsigned long, int);
|
||||
unsigned long (*mask_memory)(struct agp_bridge_data *, struct page *, int);
|
||||
void (*cache_flush)(void);
|
||||
int (*create_gatt_table)(struct agp_bridge_data *);
|
||||
int (*free_gatt_table)(struct agp_bridge_data *);
|
||||
@@ -115,9 +115,9 @@ struct agp_bridge_driver {
|
||||
int (*remove_memory)(struct agp_memory *, off_t, int);
|
||||
struct agp_memory *(*alloc_by_type) (size_t, int);
|
||||
void (*free_by_type)(struct agp_memory *);
|
||||
void *(*agp_alloc_page)(struct agp_bridge_data *);
|
||||
struct page *(*agp_alloc_page)(struct agp_bridge_data *);
|
||||
int (*agp_alloc_pages)(struct agp_bridge_data *, struct agp_memory *, size_t);
|
||||
void (*agp_destroy_page)(void *, int flags);
|
||||
void (*agp_destroy_page)(struct page *, int flags);
|
||||
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 *);
|
||||
@@ -278,10 +278,10 @@ int agp_generic_insert_memory(struct agp_memory *mem, off_t pg_start, int type);
|
||||
int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type);
|
||||
struct agp_memory *agp_generic_alloc_by_type(size_t page_count, int type);
|
||||
void agp_generic_free_by_type(struct agp_memory *curr);
|
||||
void *agp_generic_alloc_page(struct agp_bridge_data *bridge);
|
||||
struct page *agp_generic_alloc_page(struct agp_bridge_data *bridge);
|
||||
int agp_generic_alloc_pages(struct agp_bridge_data *agp_bridge,
|
||||
struct agp_memory *memory, size_t page_count);
|
||||
void agp_generic_destroy_page(void *addr, int flags);
|
||||
void agp_generic_destroy_page(struct page *page, int flags);
|
||||
void agp_generic_destroy_pages(struct agp_memory *memory);
|
||||
void agp_free_key(int key);
|
||||
int agp_num_entries(void);
|
||||
@@ -291,7 +291,7 @@ int agp_3_5_enable(struct agp_bridge_data *bridge);
|
||||
void global_cache_flush(void);
|
||||
void get_agp_version(struct agp_bridge_data *bridge);
|
||||
unsigned long agp_generic_mask_memory(struct agp_bridge_data *bridge,
|
||||
unsigned long addr, int type);
|
||||
struct page *page, int type);
|
||||
int agp_generic_type_to_mask_type(struct agp_bridge_data *bridge,
|
||||
int type);
|
||||
struct agp_bridge_data *agp_generic_find_bridge(struct pci_dev *pdev);
|
||||
|
||||
+14
-14
@@ -141,37 +141,37 @@ static void m1541_cache_flush(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void *m1541_alloc_page(struct agp_bridge_data *bridge)
|
||||
static struct page *m1541_alloc_page(struct agp_bridge_data *bridge)
|
||||
{
|
||||
void *addr = agp_generic_alloc_page(agp_bridge);
|
||||
struct page *page = agp_generic_alloc_page(agp_bridge);
|
||||
u32 temp;
|
||||
|
||||
if (!addr)
|
||||
if (!page)
|
||||
return NULL;
|
||||
|
||||
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_gart(addr)) | ALI_CACHE_FLUSH_EN ));
|
||||
return addr;
|
||||
phys_to_gart(page_to_phys(page))) | ALI_CACHE_FLUSH_EN ));
|
||||
return page;
|
||||
}
|
||||
|
||||
static void ali_destroy_page(void * addr, int flags)
|
||||
static void ali_destroy_page(struct page *page, int flags)
|
||||
{
|
||||
if (addr) {
|
||||
if (page) {
|
||||
if (flags & AGP_PAGE_DESTROY_UNMAP) {
|
||||
global_cache_flush(); /* is this really needed? --hch */
|
||||
agp_generic_destroy_page(addr, flags);
|
||||
agp_generic_destroy_page(page, flags);
|
||||
} else
|
||||
agp_generic_destroy_page(addr, flags);
|
||||
agp_generic_destroy_page(page, flags);
|
||||
}
|
||||
}
|
||||
|
||||
static void m1541_destroy_page(void * addr, int flags)
|
||||
static void m1541_destroy_page(struct page *page, int flags)
|
||||
{
|
||||
u32 temp;
|
||||
|
||||
if (addr == NULL)
|
||||
if (page == NULL)
|
||||
return;
|
||||
|
||||
if (flags & AGP_PAGE_DESTROY_UNMAP) {
|
||||
@@ -180,9 +180,9 @@ static void m1541_destroy_page(void * addr, int flags)
|
||||
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_gart(addr)) | ALI_CACHE_FLUSH_EN));
|
||||
phys_to_gart(page_to_phys(page))) | ALI_CACHE_FLUSH_EN));
|
||||
}
|
||||
agp_generic_destroy_page(addr, flags);
|
||||
agp_generic_destroy_page(page, flags);
|
||||
}
|
||||
|
||||
|
||||
@@ -346,7 +346,7 @@ found:
|
||||
devs[j].chipset_name = "M1641";
|
||||
break;
|
||||
case 0x43:
|
||||
devs[j].chipset_name = "M????";
|
||||
devs[j].chipset_name = "M1621";
|
||||
break;
|
||||
case 0x47:
|
||||
devs[j].chipset_name = "M1647";
|
||||
|
||||
@@ -325,7 +325,7 @@ static int amd_insert_memory(struct agp_memory *mem, off_t pg_start, int type)
|
||||
addr = (j * PAGE_SIZE) + agp_bridge->gart_bus_addr;
|
||||
cur_gatt = GET_GATT(addr);
|
||||
writel(agp_generic_mask_memory(agp_bridge,
|
||||
mem->memory[i], mem->type), cur_gatt+GET_GATT_OFF(addr));
|
||||
mem->pages[i], mem->type), cur_gatt+GET_GATT_OFF(addr));
|
||||
readl(cur_gatt+GET_GATT_OFF(addr)); /* PCI Posting. */
|
||||
}
|
||||
amd_irongate_tlbflush(mem);
|
||||
|
||||
@@ -79,7 +79,7 @@ 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++) {
|
||||
tmp = agp_bridge->driver->mask_memory(agp_bridge,
|
||||
mem->memory[i], mask_type);
|
||||
mem->pages[i], mask_type);
|
||||
|
||||
BUG_ON(tmp & 0xffffff0000000ffcULL);
|
||||
pte = (tmp & 0x000000ff00000000ULL) >> 28;
|
||||
|
||||
@@ -269,12 +269,17 @@ static int ati_insert_memory(struct agp_memory * mem,
|
||||
int i, j, num_entries;
|
||||
unsigned long __iomem *cur_gatt;
|
||||
unsigned long addr;
|
||||
int mask_type;
|
||||
|
||||
num_entries = A_SIZE_LVL2(agp_bridge->current_size)->num_entries;
|
||||
|
||||
if (type != 0 || mem->type != 0)
|
||||
mask_type = agp_generic_type_to_mask_type(mem->bridge, type);
|
||||
if (mask_type != 0 || type != mem->type)
|
||||
return -EINVAL;
|
||||
|
||||
if (mem->page_count == 0)
|
||||
return 0;
|
||||
|
||||
if ((pg_start + mem->page_count) > num_entries)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -296,10 +301,11 @@ static int ati_insert_memory(struct agp_memory * mem,
|
||||
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);
|
||||
writel(agp_bridge->driver->mask_memory(agp_bridge,
|
||||
mem->memory[i], mem->type), cur_gatt+GET_GATT_OFF(addr));
|
||||
readl(cur_gatt+GET_GATT_OFF(addr)); /* PCI Posting. */
|
||||
writel(agp_bridge->driver->mask_memory(agp_bridge,
|
||||
mem->pages[i], mem->type),
|
||||
cur_gatt+GET_GATT_OFF(addr));
|
||||
}
|
||||
readl(GET_GATT(agp_bridge->gart_bus_addr)); /* PCI posting */
|
||||
agp_bridge->driver->tlb_flush(mem);
|
||||
return 0;
|
||||
}
|
||||
@@ -310,17 +316,22 @@ static int ati_remove_memory(struct agp_memory * mem, off_t pg_start,
|
||||
int i;
|
||||
unsigned long __iomem *cur_gatt;
|
||||
unsigned long addr;
|
||||
int mask_type;
|
||||
|
||||
if (type != 0 || mem->type != 0)
|
||||
mask_type = agp_generic_type_to_mask_type(mem->bridge, type);
|
||||
if (mask_type != 0 || type != mem->type)
|
||||
return -EINVAL;
|
||||
|
||||
if (mem->page_count == 0)
|
||||
return 0;
|
||||
|
||||
for (i = pg_start; i < (mem->page_count + pg_start); i++) {
|
||||
addr = (i * PAGE_SIZE) + agp_bridge->gart_bus_addr;
|
||||
cur_gatt = GET_GATT(addr);
|
||||
writel(agp_bridge->scratch_page, cur_gatt+GET_GATT_OFF(addr));
|
||||
readl(cur_gatt+GET_GATT_OFF(addr)); /* PCI Posting. */
|
||||
}
|
||||
|
||||
readl(GET_GATT(agp_bridge->gart_bus_addr)); /* PCI posting */
|
||||
agp_bridge->driver->tlb_flush(mem);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -141,17 +141,17 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
|
||||
bridge->version = &agp_current_version;
|
||||
|
||||
if (bridge->driver->needs_scratch_page) {
|
||||
void *addr = bridge->driver->agp_alloc_page(bridge);
|
||||
struct page *page = bridge->driver->agp_alloc_page(bridge);
|
||||
|
||||
if (!addr) {
|
||||
if (!page) {
|
||||
dev_err(&bridge->dev->dev,
|
||||
"can't get memory for scratch page\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
bridge->scratch_page_real = virt_to_gart(addr);
|
||||
bridge->scratch_page_real = phys_to_gart(page_to_phys(page));
|
||||
bridge->scratch_page =
|
||||
bridge->driver->mask_memory(bridge, bridge->scratch_page_real, 0);
|
||||
bridge->driver->mask_memory(bridge, page, 0);
|
||||
}
|
||||
|
||||
size_value = bridge->driver->fetch_size();
|
||||
|
||||
@@ -65,8 +65,9 @@ static const struct gatt_mask efficeon_generic_masks[] =
|
||||
};
|
||||
|
||||
/* This function does the same thing as mask_memory() for this chipset... */
|
||||
static inline unsigned long efficeon_mask_memory(unsigned long addr)
|
||||
static inline unsigned long efficeon_mask_memory(struct page *page)
|
||||
{
|
||||
unsigned long addr = phys_to_gart(page_to_phys(page));
|
||||
return addr | 0x00000001;
|
||||
}
|
||||
|
||||
@@ -257,7 +258,7 @@ static int efficeon_insert_memory(struct agp_memory * mem, off_t pg_start, int t
|
||||
last_page = NULL;
|
||||
for (i = 0; i < count; i++) {
|
||||
int index = pg_start + i;
|
||||
unsigned long insert = efficeon_mask_memory(mem->memory[i]);
|
||||
unsigned long insert = efficeon_mask_memory(mem->pages[i]);
|
||||
|
||||
page = (unsigned int *) efficeon_private.l1_table[index >> 10];
|
||||
|
||||
|
||||
+28
-41
@@ -95,13 +95,13 @@ EXPORT_SYMBOL(agp_flush_chipset);
|
||||
|
||||
void agp_alloc_page_array(size_t size, struct agp_memory *mem)
|
||||
{
|
||||
mem->memory = NULL;
|
||||
mem->pages = NULL;
|
||||
mem->vmalloc_flag = false;
|
||||
|
||||
if (size <= 2*PAGE_SIZE)
|
||||
mem->memory = kmalloc(size, GFP_KERNEL | __GFP_NORETRY);
|
||||
if (mem->memory == NULL) {
|
||||
mem->memory = vmalloc(size);
|
||||
mem->pages = kmalloc(size, GFP_KERNEL | __GFP_NORETRY);
|
||||
if (mem->pages == NULL) {
|
||||
mem->pages = vmalloc(size);
|
||||
mem->vmalloc_flag = true;
|
||||
}
|
||||
}
|
||||
@@ -110,9 +110,9 @@ EXPORT_SYMBOL(agp_alloc_page_array);
|
||||
void agp_free_page_array(struct agp_memory *mem)
|
||||
{
|
||||
if (mem->vmalloc_flag) {
|
||||
vfree(mem->memory);
|
||||
vfree(mem->pages);
|
||||
} else {
|
||||
kfree(mem->memory);
|
||||
kfree(mem->pages);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(agp_free_page_array);
|
||||
@@ -136,7 +136,7 @@ static struct agp_memory *agp_create_user_memory(unsigned long num_agp_pages)
|
||||
|
||||
agp_alloc_page_array(alloc_size, new);
|
||||
|
||||
if (new->memory == NULL) {
|
||||
if (new->pages == NULL) {
|
||||
agp_free_key(new->key);
|
||||
kfree(new);
|
||||
return NULL;
|
||||
@@ -162,7 +162,7 @@ struct agp_memory *agp_create_memory(int scratch_pages)
|
||||
|
||||
agp_alloc_page_array(PAGE_SIZE * scratch_pages, new);
|
||||
|
||||
if (new->memory == NULL) {
|
||||
if (new->pages == NULL) {
|
||||
agp_free_key(new->key);
|
||||
kfree(new);
|
||||
return NULL;
|
||||
@@ -206,15 +206,13 @@ void agp_free_memory(struct agp_memory *curr)
|
||||
} else {
|
||||
|
||||
for (i = 0; i < curr->page_count; i++) {
|
||||
curr->memory[i] = (unsigned long)gart_to_virt(
|
||||
curr->memory[i]);
|
||||
curr->bridge->driver->agp_destroy_page(
|
||||
(void *)curr->memory[i],
|
||||
curr->pages[i],
|
||||
AGP_PAGE_DESTROY_UNMAP);
|
||||
}
|
||||
for (i = 0; i < curr->page_count; i++) {
|
||||
curr->bridge->driver->agp_destroy_page(
|
||||
(void *)curr->memory[i],
|
||||
curr->pages[i],
|
||||
AGP_PAGE_DESTROY_FREE);
|
||||
}
|
||||
}
|
||||
@@ -282,13 +280,13 @@ struct agp_memory *agp_allocate_memory(struct agp_bridge_data *bridge,
|
||||
}
|
||||
|
||||
for (i = 0; i < page_count; i++) {
|
||||
void *addr = bridge->driver->agp_alloc_page(bridge);
|
||||
struct page *page = bridge->driver->agp_alloc_page(bridge);
|
||||
|
||||
if (addr == NULL) {
|
||||
if (page == NULL) {
|
||||
agp_free_memory(new);
|
||||
return NULL;
|
||||
}
|
||||
new->memory[i] = virt_to_gart(addr);
|
||||
new->pages[i] = page;
|
||||
new->page_count++;
|
||||
}
|
||||
new->bridge = bridge;
|
||||
@@ -1134,7 +1132,7 @@ int agp_generic_insert_memory(struct agp_memory * mem, off_t pg_start, int type)
|
||||
}
|
||||
|
||||
for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
|
||||
writel(bridge->driver->mask_memory(bridge, mem->memory[i], mask_type),
|
||||
writel(bridge->driver->mask_memory(bridge, mem->pages[i], mask_type),
|
||||
bridge->gatt_table+j);
|
||||
}
|
||||
readl(bridge->gatt_table+j-1); /* PCI Posting. */
|
||||
@@ -1204,7 +1202,7 @@ struct agp_memory *agp_generic_alloc_user(size_t page_count, int type)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < page_count; i++)
|
||||
new->memory[i] = 0;
|
||||
new->pages[i] = 0;
|
||||
new->page_count = 0;
|
||||
new->type = type;
|
||||
new->num_scratch_pages = pages;
|
||||
@@ -1237,23 +1235,20 @@ int agp_generic_alloc_pages(struct agp_bridge_data *bridge, struct agp_memory *m
|
||||
get_page(page);
|
||||
atomic_inc(&agp_bridge->current_memory_agp);
|
||||
|
||||
/* set_memory_array_uc() needs virtual address */
|
||||
mem->memory[i] = (unsigned long)page_address(page);
|
||||
mem->pages[i] = page;
|
||||
mem->page_count++;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
set_memory_array_uc(mem->memory, num_pages);
|
||||
set_pages_array_uc(mem->pages, num_pages);
|
||||
#endif
|
||||
ret = 0;
|
||||
out:
|
||||
for (i = 0; i < mem->page_count; i++)
|
||||
mem->memory[i] = virt_to_gart((void *)mem->memory[i]);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(agp_generic_alloc_pages);
|
||||
|
||||
void *agp_generic_alloc_page(struct agp_bridge_data *bridge)
|
||||
struct page *agp_generic_alloc_page(struct agp_bridge_data *bridge)
|
||||
{
|
||||
struct page * page;
|
||||
|
||||
@@ -1265,56 +1260,47 @@ void *agp_generic_alloc_page(struct agp_bridge_data *bridge)
|
||||
|
||||
get_page(page);
|
||||
atomic_inc(&agp_bridge->current_memory_agp);
|
||||
return page_address(page);
|
||||
return page;
|
||||
}
|
||||
EXPORT_SYMBOL(agp_generic_alloc_page);
|
||||
|
||||
void agp_generic_destroy_pages(struct agp_memory *mem)
|
||||
{
|
||||
int i;
|
||||
void *addr;
|
||||
struct page *page;
|
||||
|
||||
if (!mem)
|
||||
return;
|
||||
|
||||
for (i = 0; i < mem->page_count; i++)
|
||||
mem->memory[i] = (unsigned long)gart_to_virt(mem->memory[i]);
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
set_memory_array_wb(mem->memory, mem->page_count);
|
||||
set_pages_array_wb(mem->pages, mem->page_count);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < mem->page_count; i++) {
|
||||
addr = (void *)mem->memory[i];
|
||||
page = virt_to_page(addr);
|
||||
page = mem->pages[i];
|
||||
|
||||
#ifndef CONFIG_X86
|
||||
unmap_page_from_agp(page);
|
||||
#endif
|
||||
|
||||
put_page(page);
|
||||
free_page((unsigned long)addr);
|
||||
__free_page(page);
|
||||
atomic_dec(&agp_bridge->current_memory_agp);
|
||||
mem->memory[i] = 0;
|
||||
mem->pages[i] = NULL;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(agp_generic_destroy_pages);
|
||||
|
||||
void agp_generic_destroy_page(void *addr, int flags)
|
||||
void agp_generic_destroy_page(struct page *page, int flags)
|
||||
{
|
||||
struct page *page;
|
||||
|
||||
if (addr == NULL)
|
||||
if (page == NULL)
|
||||
return;
|
||||
|
||||
page = virt_to_page(addr);
|
||||
if (flags & AGP_PAGE_DESTROY_UNMAP)
|
||||
unmap_page_from_agp(page);
|
||||
|
||||
if (flags & AGP_PAGE_DESTROY_FREE) {
|
||||
put_page(page);
|
||||
free_page((unsigned long)addr);
|
||||
__free_page(page);
|
||||
atomic_dec(&agp_bridge->current_memory_agp);
|
||||
}
|
||||
}
|
||||
@@ -1361,8 +1347,9 @@ void global_cache_flush(void)
|
||||
EXPORT_SYMBOL(global_cache_flush);
|
||||
|
||||
unsigned long agp_generic_mask_memory(struct agp_bridge_data *bridge,
|
||||
unsigned long addr, int type)
|
||||
struct page *page, int type)
|
||||
{
|
||||
unsigned long addr = phys_to_gart(page_to_phys(page));
|
||||
/* memory type is ignored in the generic routine */
|
||||
if (bridge->driver->masks)
|
||||
return addr | bridge->driver->masks[0].mask;
|
||||
|
||||
@@ -361,13 +361,11 @@ hp_zx1_insert_memory (struct agp_memory *mem, off_t pg_start, int type)
|
||||
for (i = 0, j = io_pg_start; i < mem->page_count; i++) {
|
||||
unsigned long paddr;
|
||||
|
||||
paddr = mem->memory[i];
|
||||
paddr = page_to_phys(mem->pages[i]);
|
||||
for (k = 0;
|
||||
k < hp->io_pages_per_kpage;
|
||||
k++, j++, paddr += hp->io_page_size) {
|
||||
hp->gatt[j] =
|
||||
agp_bridge->driver->mask_memory(agp_bridge,
|
||||
paddr, type);
|
||||
hp->gatt[j] = HP_ZX1_PDIR_VALID_BIT | paddr;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -397,8 +395,9 @@ hp_zx1_remove_memory (struct agp_memory *mem, off_t pg_start, int type)
|
||||
|
||||
static unsigned long
|
||||
hp_zx1_mask_memory (struct agp_bridge_data *bridge,
|
||||
unsigned long addr, int type)
|
||||
struct page *page, int type)
|
||||
{
|
||||
unsigned long addr = phys_to_gart(page_to_phys(page));
|
||||
return HP_ZX1_PDIR_VALID_BIT | addr;
|
||||
}
|
||||
|
||||
|
||||
+28
-19
@@ -60,6 +60,9 @@
|
||||
*/
|
||||
#define WR_FLUSH_GATT(index) RD_GATT(index)
|
||||
|
||||
static unsigned long i460_mask_memory (struct agp_bridge_data *bridge,
|
||||
unsigned long addr, int type);
|
||||
|
||||
static struct {
|
||||
void *gatt; /* ioremap'd GATT area */
|
||||
|
||||
@@ -74,6 +77,7 @@ static struct {
|
||||
unsigned long *alloced_map; /* bitmap of kernel-pages in use */
|
||||
int refcount; /* number of kernel pages using the large page */
|
||||
u64 paddr; /* physical address of large page */
|
||||
struct page *page; /* page pointer */
|
||||
} *lp_desc;
|
||||
} i460;
|
||||
|
||||
@@ -294,7 +298,7 @@ static int i460_insert_memory_small_io_page (struct agp_memory *mem,
|
||||
void *temp;
|
||||
|
||||
pr_debug("i460_insert_memory_small_io_page(mem=%p, pg_start=%ld, type=%d, paddr0=0x%lx)\n",
|
||||
mem, pg_start, type, mem->memory[0]);
|
||||
mem, pg_start, type, page_to_phys(mem->pages[0]));
|
||||
|
||||
if (type >= AGP_USER_TYPES || mem->type >= AGP_USER_TYPES)
|
||||
return -EINVAL;
|
||||
@@ -321,10 +325,9 @@ static int i460_insert_memory_small_io_page (struct agp_memory *mem,
|
||||
|
||||
io_page_size = 1UL << I460_IO_PAGE_SHIFT;
|
||||
for (i = 0, j = io_pg_start; i < mem->page_count; i++) {
|
||||
paddr = mem->memory[i];
|
||||
paddr = phys_to_gart(page_to_phys(mem->pages[i]));
|
||||
for (k = 0; k < I460_IOPAGES_PER_KPAGE; k++, j++, paddr += io_page_size)
|
||||
WR_GATT(j, agp_bridge->driver->mask_memory(agp_bridge,
|
||||
paddr, mem->type));
|
||||
WR_GATT(j, i460_mask_memory(agp_bridge, paddr, mem->type));
|
||||
}
|
||||
WR_FLUSH_GATT(j - 1);
|
||||
return 0;
|
||||
@@ -364,10 +367,9 @@ static int i460_alloc_large_page (struct lp_desc *lp)
|
||||
{
|
||||
unsigned long order = I460_IO_PAGE_SHIFT - PAGE_SHIFT;
|
||||
size_t map_size;
|
||||
void *lpage;
|
||||
|
||||
lpage = (void *) __get_free_pages(GFP_KERNEL, order);
|
||||
if (!lpage) {
|
||||
lp->page = alloc_pages(GFP_KERNEL, order);
|
||||
if (!lp->page) {
|
||||
printk(KERN_ERR PFX "Couldn't alloc 4M GART page...\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
@@ -375,12 +377,12 @@ static int i460_alloc_large_page (struct lp_desc *lp)
|
||||
map_size = ((I460_KPAGES_PER_IOPAGE + BITS_PER_LONG - 1) & -BITS_PER_LONG)/8;
|
||||
lp->alloced_map = kzalloc(map_size, GFP_KERNEL);
|
||||
if (!lp->alloced_map) {
|
||||
free_pages((unsigned long) lpage, order);
|
||||
__free_pages(lp->page, order);
|
||||
printk(KERN_ERR PFX "Out of memory, we're in trouble...\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
lp->paddr = virt_to_gart(lpage);
|
||||
lp->paddr = phys_to_gart(page_to_phys(lp->page));
|
||||
lp->refcount = 0;
|
||||
atomic_add(I460_KPAGES_PER_IOPAGE, &agp_bridge->current_memory_agp);
|
||||
return 0;
|
||||
@@ -391,7 +393,7 @@ static void i460_free_large_page (struct lp_desc *lp)
|
||||
kfree(lp->alloced_map);
|
||||
lp->alloced_map = NULL;
|
||||
|
||||
free_pages((unsigned long) gart_to_virt(lp->paddr), I460_IO_PAGE_SHIFT - PAGE_SHIFT);
|
||||
__free_pages(lp->page, I460_IO_PAGE_SHIFT - PAGE_SHIFT);
|
||||
atomic_sub(I460_KPAGES_PER_IOPAGE, &agp_bridge->current_memory_agp);
|
||||
}
|
||||
|
||||
@@ -439,8 +441,8 @@ static int i460_insert_memory_large_io_page (struct agp_memory *mem,
|
||||
if (i460_alloc_large_page(lp) < 0)
|
||||
return -ENOMEM;
|
||||
pg = lp - i460.lp_desc;
|
||||
WR_GATT(pg, agp_bridge->driver->mask_memory(agp_bridge,
|
||||
lp->paddr, 0));
|
||||
WR_GATT(pg, i460_mask_memory(agp_bridge,
|
||||
lp->paddr, 0));
|
||||
WR_FLUSH_GATT(pg);
|
||||
}
|
||||
|
||||
@@ -448,7 +450,7 @@ static int i460_insert_memory_large_io_page (struct agp_memory *mem,
|
||||
idx < ((lp == end) ? (end_offset + 1) : I460_KPAGES_PER_IOPAGE);
|
||||
idx++, i++)
|
||||
{
|
||||
mem->memory[i] = lp->paddr + idx*PAGE_SIZE;
|
||||
mem->pages[i] = lp->page;
|
||||
__set_bit(idx, lp->alloced_map);
|
||||
++lp->refcount;
|
||||
}
|
||||
@@ -463,7 +465,7 @@ static int i460_remove_memory_large_io_page (struct agp_memory *mem,
|
||||
struct lp_desc *start, *end, *lp;
|
||||
void *temp;
|
||||
|
||||
temp = agp_bridge->driver->current_size;
|
||||
temp = agp_bridge->current_size;
|
||||
num_entries = A_SIZE_8(temp)->num_entries;
|
||||
|
||||
/* Figure out what pg_start means in terms of our large GART pages */
|
||||
@@ -477,7 +479,7 @@ static int i460_remove_memory_large_io_page (struct agp_memory *mem,
|
||||
idx < ((lp == end) ? (end_offset + 1) : I460_KPAGES_PER_IOPAGE);
|
||||
idx++, i++)
|
||||
{
|
||||
mem->memory[i] = 0;
|
||||
mem->pages[i] = NULL;
|
||||
__clear_bit(idx, lp->alloced_map);
|
||||
--lp->refcount;
|
||||
}
|
||||
@@ -521,7 +523,7 @@ static int i460_remove_memory (struct agp_memory *mem,
|
||||
* Let's just hope nobody counts on the allocated AGP memory being there before bind time
|
||||
* (I don't think current drivers do)...
|
||||
*/
|
||||
static void *i460_alloc_page (struct agp_bridge_data *bridge)
|
||||
static struct page *i460_alloc_page (struct agp_bridge_data *bridge)
|
||||
{
|
||||
void *page;
|
||||
|
||||
@@ -534,7 +536,7 @@ static void *i460_alloc_page (struct agp_bridge_data *bridge)
|
||||
return page;
|
||||
}
|
||||
|
||||
static void i460_destroy_page (void *page, int flags)
|
||||
static void i460_destroy_page (struct page *page, int flags)
|
||||
{
|
||||
if (I460_IO_PAGE_SHIFT <= PAGE_SHIFT) {
|
||||
agp_generic_destroy_page(page, flags);
|
||||
@@ -544,13 +546,20 @@ static void i460_destroy_page (void *page, int flags)
|
||||
#endif /* I460_LARGE_IO_PAGES */
|
||||
|
||||
static unsigned long i460_mask_memory (struct agp_bridge_data *bridge,
|
||||
unsigned long addr, int type)
|
||||
unsigned long addr, int type)
|
||||
{
|
||||
/* Make sure the returned address is a valid GATT entry */
|
||||
return bridge->driver->masks[0].mask
|
||||
| (((addr & ~((1 << I460_IO_PAGE_SHIFT) - 1)) & 0xfffff000) >> 12);
|
||||
}
|
||||
|
||||
static unsigned long i460_page_mask_memory(struct agp_bridge_data *bridge,
|
||||
struct page *page, int type)
|
||||
{
|
||||
unsigned long addr = phys_to_gart(page_to_phys(page));
|
||||
return i460_mask_memory(bridge, addr, type);
|
||||
}
|
||||
|
||||
const struct agp_bridge_driver intel_i460_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.aperture_sizes = i460_sizes,
|
||||
@@ -560,7 +569,7 @@ const struct agp_bridge_driver intel_i460_driver = {
|
||||
.fetch_size = i460_fetch_size,
|
||||
.cleanup = i460_cleanup,
|
||||
.tlb_flush = i460_tlb_flush,
|
||||
.mask_memory = i460_mask_memory,
|
||||
.mask_memory = i460_page_mask_memory,
|
||||
.masks = i460_masks,
|
||||
.agp_enable = agp_generic_enable,
|
||||
.cache_flush = global_cache_flush,
|
||||
|
||||
@@ -257,7 +257,7 @@ static void intel_i810_agp_enable(struct agp_bridge_data *bridge, u32 mode)
|
||||
}
|
||||
|
||||
/* Exists to support ARGB cursors */
|
||||
static void *i8xx_alloc_pages(void)
|
||||
static struct page *i8xx_alloc_pages(void)
|
||||
{
|
||||
struct page *page;
|
||||
|
||||
@@ -272,17 +272,14 @@ static void *i8xx_alloc_pages(void)
|
||||
}
|
||||
get_page(page);
|
||||
atomic_inc(&agp_bridge->current_memory_agp);
|
||||
return page_address(page);
|
||||
return page;
|
||||
}
|
||||
|
||||
static void i8xx_destroy_pages(void *addr)
|
||||
static void i8xx_destroy_pages(struct page *page)
|
||||
{
|
||||
struct page *page;
|
||||
|
||||
if (addr == NULL)
|
||||
if (page == NULL)
|
||||
return;
|
||||
|
||||
page = virt_to_page(addr);
|
||||
set_pages_wb(page, 4);
|
||||
put_page(page);
|
||||
__free_pages(page, 2);
|
||||
@@ -346,7 +343,7 @@ static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start,
|
||||
global_cache_flush();
|
||||
for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
|
||||
writel(agp_bridge->driver->mask_memory(agp_bridge,
|
||||
mem->memory[i],
|
||||
mem->pages[i],
|
||||
mask_type),
|
||||
intel_private.registers+I810_PTE_BASE+(j*4));
|
||||
}
|
||||
@@ -389,37 +386,37 @@ static int intel_i810_remove_entries(struct agp_memory *mem, off_t pg_start,
|
||||
static struct agp_memory *alloc_agpphysmem_i8xx(size_t pg_count, int type)
|
||||
{
|
||||
struct agp_memory *new;
|
||||
void *addr;
|
||||
struct page *page;
|
||||
|
||||
switch (pg_count) {
|
||||
case 1: addr = agp_bridge->driver->agp_alloc_page(agp_bridge);
|
||||
case 1: page = agp_bridge->driver->agp_alloc_page(agp_bridge);
|
||||
break;
|
||||
case 4:
|
||||
/* kludge to get 4 physical pages for ARGB cursor */
|
||||
addr = i8xx_alloc_pages();
|
||||
page = i8xx_alloc_pages();
|
||||
break;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (addr == NULL)
|
||||
if (page == NULL)
|
||||
return NULL;
|
||||
|
||||
new = agp_create_memory(pg_count);
|
||||
if (new == NULL)
|
||||
return NULL;
|
||||
|
||||
new->memory[0] = virt_to_gart(addr);
|
||||
new->pages[0] = page;
|
||||
if (pg_count == 4) {
|
||||
/* kludge to get 4 physical pages for ARGB cursor */
|
||||
new->memory[1] = new->memory[0] + PAGE_SIZE;
|
||||
new->memory[2] = new->memory[1] + PAGE_SIZE;
|
||||
new->memory[3] = new->memory[2] + PAGE_SIZE;
|
||||
new->pages[1] = new->pages[0] + 1;
|
||||
new->pages[2] = new->pages[1] + 1;
|
||||
new->pages[3] = new->pages[2] + 1;
|
||||
}
|
||||
new->page_count = pg_count;
|
||||
new->num_scratch_pages = pg_count;
|
||||
new->type = AGP_PHYS_MEMORY;
|
||||
new->physical = new->memory[0];
|
||||
new->physical = page_to_phys(new->pages[0]);
|
||||
return new;
|
||||
}
|
||||
|
||||
@@ -451,13 +448,11 @@ static void intel_i810_free_by_type(struct agp_memory *curr)
|
||||
agp_free_key(curr->key);
|
||||
if (curr->type == AGP_PHYS_MEMORY) {
|
||||
if (curr->page_count == 4)
|
||||
i8xx_destroy_pages(gart_to_virt(curr->memory[0]));
|
||||
i8xx_destroy_pages(curr->pages[0]);
|
||||
else {
|
||||
void *va = gart_to_virt(curr->memory[0]);
|
||||
|
||||
agp_bridge->driver->agp_destroy_page(va,
|
||||
agp_bridge->driver->agp_destroy_page(curr->pages[0],
|
||||
AGP_PAGE_DESTROY_UNMAP);
|
||||
agp_bridge->driver->agp_destroy_page(va,
|
||||
agp_bridge->driver->agp_destroy_page(curr->pages[0],
|
||||
AGP_PAGE_DESTROY_FREE);
|
||||
}
|
||||
agp_free_page_array(curr);
|
||||
@@ -466,8 +461,9 @@ static void intel_i810_free_by_type(struct agp_memory *curr)
|
||||
}
|
||||
|
||||
static unsigned long intel_i810_mask_memory(struct agp_bridge_data *bridge,
|
||||
unsigned long addr, int type)
|
||||
struct page *page, int type)
|
||||
{
|
||||
unsigned long addr = phys_to_gart(page_to_phys(page));
|
||||
/* Type checking must be done elsewhere */
|
||||
return addr | bridge->driver->masks[type].mask;
|
||||
}
|
||||
@@ -855,7 +851,7 @@ static int intel_i830_insert_entries(struct agp_memory *mem, off_t pg_start,
|
||||
|
||||
for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
|
||||
writel(agp_bridge->driver->mask_memory(agp_bridge,
|
||||
mem->memory[i], mask_type),
|
||||
mem->pages[i], mask_type),
|
||||
intel_private.registers+I810_PTE_BASE+(j*4));
|
||||
}
|
||||
readl(intel_private.registers+I810_PTE_BASE+((j-1)*4));
|
||||
@@ -1085,7 +1081,7 @@ static int intel_i915_insert_entries(struct agp_memory *mem, off_t pg_start,
|
||||
|
||||
for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
|
||||
writel(agp_bridge->driver->mask_memory(agp_bridge,
|
||||
mem->memory[i], mask_type), intel_private.gtt+j);
|
||||
mem->pages[i], mask_type), intel_private.gtt+j);
|
||||
}
|
||||
|
||||
readl(intel_private.gtt+j-1);
|
||||
@@ -1200,8 +1196,9 @@ static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge)
|
||||
* this conditional.
|
||||
*/
|
||||
static unsigned long intel_i965_mask_memory(struct agp_bridge_data *bridge,
|
||||
unsigned long addr, int type)
|
||||
struct page *page, int type)
|
||||
{
|
||||
dma_addr_t addr = phys_to_gart(page_to_phys(page));
|
||||
/* Shift high bits down */
|
||||
addr |= (addr >> 28) & 0xf0;
|
||||
|
||||
|
||||
@@ -225,7 +225,7 @@ static int nvidia_insert_memory(struct agp_memory *mem, off_t pg_start, int type
|
||||
}
|
||||
for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
|
||||
writel(agp_bridge->driver->mask_memory(agp_bridge,
|
||||
mem->memory[i], mask_type),
|
||||
mem->pages[i], mask_type),
|
||||
agp_bridge->gatt_table+nvidia_private.pg_offset+j);
|
||||
}
|
||||
|
||||
|
||||
@@ -31,6 +31,10 @@
|
||||
#define AGP8X_MODE_BIT 3
|
||||
#define AGP8X_MODE (1 << AGP8X_MODE_BIT)
|
||||
|
||||
static unsigned long
|
||||
parisc_agp_mask_memory(struct agp_bridge_data *bridge, unsigned long addr,
|
||||
int type);
|
||||
|
||||
static struct _parisc_agp_info {
|
||||
void __iomem *ioc_regs;
|
||||
void __iomem *lba_regs;
|
||||
@@ -149,12 +153,12 @@ parisc_agp_insert_memory(struct agp_memory *mem, off_t pg_start, int type)
|
||||
for (i = 0, j = io_pg_start; i < mem->page_count; i++) {
|
||||
unsigned long paddr;
|
||||
|
||||
paddr = mem->memory[i];
|
||||
paddr = page_to_phys(mem->pages[i]);
|
||||
for (k = 0;
|
||||
k < info->io_pages_per_kpage;
|
||||
k++, j++, paddr += info->io_page_size) {
|
||||
info->gatt[j] =
|
||||
agp_bridge->driver->mask_memory(agp_bridge,
|
||||
parisc_agp_mask_memory(agp_bridge,
|
||||
paddr, type);
|
||||
}
|
||||
}
|
||||
@@ -185,12 +189,20 @@ parisc_agp_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
|
||||
}
|
||||
|
||||
static unsigned long
|
||||
parisc_agp_mask_memory(struct agp_bridge_data *bridge,
|
||||
unsigned long addr, int type)
|
||||
parisc_agp_mask_memory(struct agp_bridge_data *bridge, unsigned long addr,
|
||||
int type)
|
||||
{
|
||||
return SBA_PDIR_VALID_BIT | addr;
|
||||
}
|
||||
|
||||
static unsigned long
|
||||
parisc_agp_page_mask_memory(struct agp_bridge_data *bridge, struct page *page,
|
||||
int type)
|
||||
{
|
||||
unsigned long addr = phys_to_gart(page_to_phys(page));
|
||||
return SBA_PDIR_VALID_BIT | addr;
|
||||
}
|
||||
|
||||
static void
|
||||
parisc_agp_enable(struct agp_bridge_data *bridge, u32 mode)
|
||||
{
|
||||
|
||||
@@ -38,7 +38,7 @@ static struct aper_size_info_fixed sgi_tioca_sizes[] = {
|
||||
{0, 0, 0},
|
||||
};
|
||||
|
||||
static void *sgi_tioca_alloc_page(struct agp_bridge_data *bridge)
|
||||
static struct page *sgi_tioca_alloc_page(struct agp_bridge_data *bridge)
|
||||
{
|
||||
struct page *page;
|
||||
int nid;
|
||||
@@ -52,7 +52,7 @@ static void *sgi_tioca_alloc_page(struct agp_bridge_data *bridge)
|
||||
|
||||
get_page(page);
|
||||
atomic_inc(&agp_bridge->current_memory_agp);
|
||||
return page_address(page);
|
||||
return page;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -71,8 +71,9 @@ static void sgi_tioca_tlbflush(struct agp_memory *mem)
|
||||
*/
|
||||
static unsigned long
|
||||
sgi_tioca_mask_memory(struct agp_bridge_data *bridge,
|
||||
unsigned long addr, int type)
|
||||
struct page *page, int type)
|
||||
{
|
||||
unsigned long addr = phys_to_gart(page_to_phys(page));
|
||||
return tioca_physpage_to_gart(addr);
|
||||
}
|
||||
|
||||
@@ -189,7 +190,7 @@ static int sgi_tioca_insert_memory(struct agp_memory *mem, off_t pg_start,
|
||||
|
||||
for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
|
||||
table[j] =
|
||||
bridge->driver->mask_memory(bridge, mem->memory[i],
|
||||
bridge->driver->mask_memory(bridge, mem->pages[i],
|
||||
mem->type);
|
||||
}
|
||||
|
||||
|
||||
@@ -349,7 +349,7 @@ static int serverworks_insert_memory(struct agp_memory *mem,
|
||||
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);
|
||||
writel(agp_bridge->driver->mask_memory(agp_bridge, mem->memory[i], mem->type), cur_gatt+GET_GATT_OFF(addr));
|
||||
writel(agp_bridge->driver->mask_memory(agp_bridge, mem->pages[i], mem->type), cur_gatt+GET_GATT_OFF(addr));
|
||||
}
|
||||
serverworks_tlbflush(mem);
|
||||
return 0;
|
||||
|
||||
@@ -146,13 +146,20 @@ static int uninorth_insert_memory(struct agp_memory *mem, off_t pg_start,
|
||||
{
|
||||
int i, j, num_entries;
|
||||
void *temp;
|
||||
int mask_type;
|
||||
|
||||
temp = agp_bridge->current_size;
|
||||
num_entries = A_SIZE_32(temp)->num_entries;
|
||||
|
||||
if (type != 0 || mem->type != 0)
|
||||
if (type != mem->type)
|
||||
return -EINVAL;
|
||||
|
||||
mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
|
||||
if (mask_type != 0) {
|
||||
/* We know nothing of memory types */
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((pg_start + mem->page_count) > num_entries)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -166,9 +173,9 @@ static int uninorth_insert_memory(struct agp_memory *mem, off_t pg_start,
|
||||
|
||||
for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
|
||||
agp_bridge->gatt_table[j] =
|
||||
cpu_to_le32((mem->memory[i] & 0xFFFFF000UL) | 0x1UL);
|
||||
flush_dcache_range((unsigned long)__va(mem->memory[i]),
|
||||
(unsigned long)__va(mem->memory[i])+0x1000);
|
||||
cpu_to_le32((page_to_phys(mem->pages[i]) & 0xFFFFF000UL) | 0x1UL);
|
||||
flush_dcache_range((unsigned long)__va(page_to_phys(mem->pages[i])),
|
||||
(unsigned long)__va(page_to_phys(mem->pages[i]))+0x1000);
|
||||
}
|
||||
(void)in_le32((volatile u32*)&agp_bridge->gatt_table[pg_start]);
|
||||
mb();
|
||||
@@ -184,13 +191,20 @@ static int u3_insert_memory(struct agp_memory *mem, off_t pg_start, int type)
|
||||
int i, num_entries;
|
||||
void *temp;
|
||||
u32 *gp;
|
||||
int mask_type;
|
||||
|
||||
temp = agp_bridge->current_size;
|
||||
num_entries = A_SIZE_32(temp)->num_entries;
|
||||
|
||||
if (type != 0 || mem->type != 0)
|
||||
if (type != mem->type)
|
||||
return -EINVAL;
|
||||
|
||||
mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
|
||||
if (mask_type != 0) {
|
||||
/* We know nothing of memory types */
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((pg_start + mem->page_count) > num_entries)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -205,9 +219,9 @@ static int u3_insert_memory(struct agp_memory *mem, off_t pg_start, int type)
|
||||
}
|
||||
|
||||
for (i = 0; i < mem->page_count; i++) {
|
||||
gp[i] = (mem->memory[i] >> PAGE_SHIFT) | 0x80000000UL;
|
||||
flush_dcache_range((unsigned long)__va(mem->memory[i]),
|
||||
(unsigned long)__va(mem->memory[i])+0x1000);
|
||||
gp[i] = (page_to_phys(mem->pages[i]) >> PAGE_SHIFT) | 0x80000000UL;
|
||||
flush_dcache_range((unsigned long)__va(page_to_phys(mem->pages[i])),
|
||||
(unsigned long)__va(page_to_phys(mem->pages[i]))+0x1000);
|
||||
}
|
||||
mb();
|
||||
flush_dcache_range((unsigned long)gp, (unsigned long) &gp[i]);
|
||||
|
||||
@@ -203,7 +203,7 @@ int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request)
|
||||
|
||||
if (!dev->agp || !dev->agp->acquired)
|
||||
return -EINVAL;
|
||||
if (!(entry = drm_alloc(sizeof(*entry), DRM_MEM_AGPLISTS)))
|
||||
if (!(entry = kmalloc(sizeof(*entry), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
|
||||
memset(entry, 0, sizeof(*entry));
|
||||
@@ -211,7 +211,7 @@ int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request)
|
||||
pages = (request->size + PAGE_SIZE - 1) / PAGE_SIZE;
|
||||
type = (u32) request->type;
|
||||
if (!(memory = drm_alloc_agp(dev, pages, type))) {
|
||||
drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS);
|
||||
kfree(entry);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -369,7 +369,7 @@ int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request)
|
||||
list_del(&entry->head);
|
||||
|
||||
drm_free_agp(entry->memory, entry->pages);
|
||||
drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS);
|
||||
kfree(entry);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_agp_free);
|
||||
@@ -397,13 +397,13 @@ struct drm_agp_head *drm_agp_init(struct drm_device *dev)
|
||||
{
|
||||
struct drm_agp_head *head = NULL;
|
||||
|
||||
if (!(head = drm_alloc(sizeof(*head), DRM_MEM_AGPLISTS)))
|
||||
if (!(head = kmalloc(sizeof(*head), GFP_KERNEL)))
|
||||
return NULL;
|
||||
memset((void *)head, 0, sizeof(*head));
|
||||
head->bridge = agp_find_bridge(dev->pdev);
|
||||
if (!head->bridge) {
|
||||
if (!(head->bridge = agp_backend_acquire(dev->pdev))) {
|
||||
drm_free(head, sizeof(*head), DRM_MEM_AGPLISTS);
|
||||
kfree(head);
|
||||
return NULL;
|
||||
}
|
||||
agp_copy_info(head->bridge, &head->agp_info);
|
||||
@@ -412,7 +412,7 @@ struct drm_agp_head *drm_agp_init(struct drm_device *dev)
|
||||
agp_copy_info(head->bridge, &head->agp_info);
|
||||
}
|
||||
if (head->agp_info.chipset == NOT_SUPPORTED) {
|
||||
drm_free(head, sizeof(*head), DRM_MEM_AGPLISTS);
|
||||
kfree(head);
|
||||
return NULL;
|
||||
}
|
||||
INIT_LIST_HEAD(&head->memory);
|
||||
@@ -482,7 +482,7 @@ drm_agp_bind_pages(struct drm_device *dev,
|
||||
}
|
||||
|
||||
for (i = 0; i < num_pages; i++)
|
||||
mem->memory[i] = phys_to_gart(page_to_phys(pages[i]));
|
||||
mem->pages[i] = pages[i];
|
||||
mem->page_count = num_pages;
|
||||
|
||||
mem->is_flushed = true;
|
||||
|
||||
@@ -79,7 +79,7 @@ static int drm_add_magic(struct drm_master *master, struct drm_file *priv,
|
||||
struct drm_device *dev = master->minor->dev;
|
||||
DRM_DEBUG("%d\n", magic);
|
||||
|
||||
entry = drm_alloc(sizeof(*entry), DRM_MEM_MAGIC);
|
||||
entry = kmalloc(sizeof(*entry), GFP_KERNEL);
|
||||
if (!entry)
|
||||
return -ENOMEM;
|
||||
memset(entry, 0, sizeof(*entry));
|
||||
@@ -120,7 +120,7 @@ static int drm_remove_magic(struct drm_master *master, drm_magic_t magic)
|
||||
list_del(&pt->head);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
drm_free(pt, sizeof(*pt), DRM_MEM_MAGIC);
|
||||
kfree(pt);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+56
-84
@@ -151,7 +151,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
|
||||
unsigned long user_token;
|
||||
int ret;
|
||||
|
||||
map = drm_alloc(sizeof(*map), DRM_MEM_MAPS);
|
||||
map = kmalloc(sizeof(*map), GFP_KERNEL);
|
||||
if (!map)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -165,7 +165,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
|
||||
* when processes fork.
|
||||
*/
|
||||
if ((map->flags & _DRM_REMOVABLE) && map->type != _DRM_SHM) {
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
kfree(map);
|
||||
return -EINVAL;
|
||||
}
|
||||
DRM_DEBUG("offset = 0x%08llx, size = 0x%08lx, type = %d\n",
|
||||
@@ -179,7 +179,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
|
||||
map->size = PAGE_ALIGN(map->size);
|
||||
|
||||
if ((map->offset & (~(resource_size_t)PAGE_MASK)) || (map->size & (~PAGE_MASK))) {
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
kfree(map);
|
||||
return -EINVAL;
|
||||
}
|
||||
map->mtrr = -1;
|
||||
@@ -191,7 +191,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
|
||||
#if !defined(__sparc__) && !defined(__alpha__) && !defined(__ia64__) && !defined(__powerpc64__) && !defined(__x86_64__)
|
||||
if (map->offset + (map->size-1) < map->offset ||
|
||||
map->offset < virt_to_phys(high_memory)) {
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
kfree(map);
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
@@ -212,7 +212,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
|
||||
list->map->size = map->size;
|
||||
}
|
||||
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
kfree(map);
|
||||
*maplist = list;
|
||||
return 0;
|
||||
}
|
||||
@@ -227,7 +227,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
|
||||
if (map->type == _DRM_REGISTERS) {
|
||||
map->handle = ioremap(map->offset, map->size);
|
||||
if (!map->handle) {
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
kfree(map);
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
@@ -243,7 +243,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
|
||||
list->map->size = map->size;
|
||||
}
|
||||
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
kfree(map);
|
||||
*maplist = list;
|
||||
return 0;
|
||||
}
|
||||
@@ -251,7 +251,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
|
||||
DRM_DEBUG("%lu %d %p\n",
|
||||
map->size, drm_order(map->size), map->handle);
|
||||
if (!map->handle) {
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
kfree(map);
|
||||
return -ENOMEM;
|
||||
}
|
||||
map->offset = (unsigned long)map->handle;
|
||||
@@ -259,7 +259,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
|
||||
/* Prevent a 2nd X Server from creating a 2nd lock */
|
||||
if (dev->primary->master->lock.hw_lock != NULL) {
|
||||
vfree(map->handle);
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
kfree(map);
|
||||
return -EBUSY;
|
||||
}
|
||||
dev->sigdata.lock = dev->primary->master->lock.hw_lock = map->handle; /* Pointer to lock */
|
||||
@@ -270,7 +270,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
|
||||
int valid = 0;
|
||||
|
||||
if (!drm_core_has_AGP(dev)) {
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
kfree(map);
|
||||
return -EINVAL;
|
||||
}
|
||||
#ifdef __alpha__
|
||||
@@ -303,7 +303,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
|
||||
}
|
||||
}
|
||||
if (!list_empty(&dev->agp->memory) && !valid) {
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
kfree(map);
|
||||
return -EPERM;
|
||||
}
|
||||
DRM_DEBUG("AGP offset = 0x%08llx, size = 0x%08lx\n",
|
||||
@@ -316,7 +316,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
|
||||
}
|
||||
case _DRM_SCATTER_GATHER:
|
||||
if (!dev->sg) {
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
kfree(map);
|
||||
return -EINVAL;
|
||||
}
|
||||
map->offset += (unsigned long)dev->sg->virtual;
|
||||
@@ -328,7 +328,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
|
||||
* need to point to a 64bit variable first. */
|
||||
dmah = drm_pci_alloc(dev, map->size, map->size, 0xffffffffUL);
|
||||
if (!dmah) {
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
kfree(map);
|
||||
return -ENOMEM;
|
||||
}
|
||||
map->handle = dmah->vaddr;
|
||||
@@ -336,15 +336,15 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
|
||||
kfree(dmah);
|
||||
break;
|
||||
default:
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
kfree(map);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
list = drm_alloc(sizeof(*list), DRM_MEM_MAPS);
|
||||
list = kmalloc(sizeof(*list), GFP_KERNEL);
|
||||
if (!list) {
|
||||
if (map->type == _DRM_REGISTERS)
|
||||
iounmap(map->handle);
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
kfree(map);
|
||||
return -EINVAL;
|
||||
}
|
||||
memset(list, 0, sizeof(*list));
|
||||
@@ -362,8 +362,8 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
|
||||
if (ret) {
|
||||
if (map->type == _DRM_REGISTERS)
|
||||
iounmap(map->handle);
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
drm_free(list, sizeof(*list), DRM_MEM_MAPS);
|
||||
kfree(map);
|
||||
kfree(list);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
return ret;
|
||||
}
|
||||
@@ -448,7 +448,7 @@ int drm_rmmap_locked(struct drm_device *dev, struct drm_local_map *map)
|
||||
list_del(&r_list->head);
|
||||
drm_ht_remove_key(&dev->map_hash,
|
||||
r_list->user_token >> PAGE_SHIFT);
|
||||
drm_free(r_list, sizeof(*r_list), DRM_MEM_MAPS);
|
||||
kfree(r_list);
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
@@ -491,7 +491,7 @@ int drm_rmmap_locked(struct drm_device *dev, struct drm_local_map *map)
|
||||
DRM_ERROR("tried to rmmap GEM object\n");
|
||||
break;
|
||||
}
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
kfree(map);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -582,24 +582,16 @@ static void drm_cleanup_buf_error(struct drm_device * dev,
|
||||
drm_pci_free(dev, entry->seglist[i]);
|
||||
}
|
||||
}
|
||||
drm_free(entry->seglist,
|
||||
entry->seg_count *
|
||||
sizeof(*entry->seglist), DRM_MEM_SEGS);
|
||||
kfree(entry->seglist);
|
||||
|
||||
entry->seg_count = 0;
|
||||
}
|
||||
|
||||
if (entry->buf_count) {
|
||||
for (i = 0; i < entry->buf_count; i++) {
|
||||
if (entry->buflist[i].dev_private) {
|
||||
drm_free(entry->buflist[i].dev_private,
|
||||
entry->buflist[i].dev_priv_size,
|
||||
DRM_MEM_BUFS);
|
||||
}
|
||||
kfree(entry->buflist[i].dev_private);
|
||||
}
|
||||
drm_free(entry->buflist,
|
||||
entry->buf_count *
|
||||
sizeof(*entry->buflist), DRM_MEM_BUFS);
|
||||
kfree(entry->buflist);
|
||||
|
||||
entry->buf_count = 0;
|
||||
}
|
||||
@@ -698,8 +690,7 @@ int drm_addbufs_agp(struct drm_device * dev, struct drm_buf_desc * request)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
entry->buflist = drm_alloc(count * sizeof(*entry->buflist),
|
||||
DRM_MEM_BUFS);
|
||||
entry->buflist = kmalloc(count * sizeof(*entry->buflist), GFP_KERNEL);
|
||||
if (!entry->buflist) {
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
atomic_dec(&dev->buf_alloc);
|
||||
@@ -729,7 +720,7 @@ int drm_addbufs_agp(struct drm_device * dev, struct drm_buf_desc * request)
|
||||
buf->file_priv = NULL;
|
||||
|
||||
buf->dev_priv_size = dev->driver->dev_priv_size;
|
||||
buf->dev_private = drm_alloc(buf->dev_priv_size, DRM_MEM_BUFS);
|
||||
buf->dev_private = kmalloc(buf->dev_priv_size, GFP_KERNEL);
|
||||
if (!buf->dev_private) {
|
||||
/* Set count correctly so we free the proper amount. */
|
||||
entry->buf_count = count;
|
||||
@@ -749,10 +740,9 @@ int drm_addbufs_agp(struct drm_device * dev, struct drm_buf_desc * request)
|
||||
|
||||
DRM_DEBUG("byte_count: %d\n", byte_count);
|
||||
|
||||
temp_buflist = drm_realloc(dma->buflist,
|
||||
dma->buf_count * sizeof(*dma->buflist),
|
||||
(dma->buf_count + entry->buf_count)
|
||||
* sizeof(*dma->buflist), DRM_MEM_BUFS);
|
||||
temp_buflist = krealloc(dma->buflist,
|
||||
(dma->buf_count + entry->buf_count) *
|
||||
sizeof(*dma->buflist), GFP_KERNEL);
|
||||
if (!temp_buflist) {
|
||||
/* Free the entry because it isn't valid */
|
||||
drm_cleanup_buf_error(dev, entry);
|
||||
@@ -854,8 +844,7 @@ int drm_addbufs_pci(struct drm_device * dev, struct drm_buf_desc * request)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
entry->buflist = drm_alloc(count * sizeof(*entry->buflist),
|
||||
DRM_MEM_BUFS);
|
||||
entry->buflist = kmalloc(count * sizeof(*entry->buflist), GFP_KERNEL);
|
||||
if (!entry->buflist) {
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
atomic_dec(&dev->buf_alloc);
|
||||
@@ -863,11 +852,9 @@ int drm_addbufs_pci(struct drm_device * dev, struct drm_buf_desc * request)
|
||||
}
|
||||
memset(entry->buflist, 0, count * sizeof(*entry->buflist));
|
||||
|
||||
entry->seglist = drm_alloc(count * sizeof(*entry->seglist),
|
||||
DRM_MEM_SEGS);
|
||||
entry->seglist = kmalloc(count * sizeof(*entry->seglist), GFP_KERNEL);
|
||||
if (!entry->seglist) {
|
||||
drm_free(entry->buflist,
|
||||
count * sizeof(*entry->buflist), DRM_MEM_BUFS);
|
||||
kfree(entry->buflist);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
atomic_dec(&dev->buf_alloc);
|
||||
return -ENOMEM;
|
||||
@@ -877,13 +864,11 @@ int drm_addbufs_pci(struct drm_device * dev, struct drm_buf_desc * request)
|
||||
/* Keep the original pagelist until we know all the allocations
|
||||
* have succeeded
|
||||
*/
|
||||
temp_pagelist = drm_alloc((dma->page_count + (count << page_order))
|
||||
* sizeof(*dma->pagelist), DRM_MEM_PAGES);
|
||||
temp_pagelist = kmalloc((dma->page_count + (count << page_order)) *
|
||||
sizeof(*dma->pagelist), GFP_KERNEL);
|
||||
if (!temp_pagelist) {
|
||||
drm_free(entry->buflist,
|
||||
count * sizeof(*entry->buflist), DRM_MEM_BUFS);
|
||||
drm_free(entry->seglist,
|
||||
count * sizeof(*entry->seglist), DRM_MEM_SEGS);
|
||||
kfree(entry->buflist);
|
||||
kfree(entry->seglist);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
atomic_dec(&dev->buf_alloc);
|
||||
return -ENOMEM;
|
||||
@@ -907,9 +892,7 @@ int drm_addbufs_pci(struct drm_device * dev, struct drm_buf_desc * request)
|
||||
entry->buf_count = count;
|
||||
entry->seg_count = count;
|
||||
drm_cleanup_buf_error(dev, entry);
|
||||
drm_free(temp_pagelist,
|
||||
(dma->page_count + (count << page_order))
|
||||
* sizeof(*dma->pagelist), DRM_MEM_PAGES);
|
||||
kfree(temp_pagelist);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
atomic_dec(&dev->buf_alloc);
|
||||
return -ENOMEM;
|
||||
@@ -940,18 +923,14 @@ int drm_addbufs_pci(struct drm_device * dev, struct drm_buf_desc * request)
|
||||
buf->file_priv = NULL;
|
||||
|
||||
buf->dev_priv_size = dev->driver->dev_priv_size;
|
||||
buf->dev_private = drm_alloc(buf->dev_priv_size,
|
||||
DRM_MEM_BUFS);
|
||||
buf->dev_private = kmalloc(buf->dev_priv_size,
|
||||
GFP_KERNEL);
|
||||
if (!buf->dev_private) {
|
||||
/* Set count correctly so we free the proper amount. */
|
||||
entry->buf_count = count;
|
||||
entry->seg_count = count;
|
||||
drm_cleanup_buf_error(dev, entry);
|
||||
drm_free(temp_pagelist,
|
||||
(dma->page_count +
|
||||
(count << page_order))
|
||||
* sizeof(*dma->pagelist),
|
||||
DRM_MEM_PAGES);
|
||||
kfree(temp_pagelist);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
atomic_dec(&dev->buf_alloc);
|
||||
return -ENOMEM;
|
||||
@@ -964,16 +943,13 @@ int drm_addbufs_pci(struct drm_device * dev, struct drm_buf_desc * request)
|
||||
byte_count += PAGE_SIZE << page_order;
|
||||
}
|
||||
|
||||
temp_buflist = drm_realloc(dma->buflist,
|
||||
dma->buf_count * sizeof(*dma->buflist),
|
||||
(dma->buf_count + entry->buf_count)
|
||||
* sizeof(*dma->buflist), DRM_MEM_BUFS);
|
||||
temp_buflist = krealloc(dma->buflist,
|
||||
(dma->buf_count + entry->buf_count) *
|
||||
sizeof(*dma->buflist), GFP_KERNEL);
|
||||
if (!temp_buflist) {
|
||||
/* Free the entry because it isn't valid */
|
||||
drm_cleanup_buf_error(dev, entry);
|
||||
drm_free(temp_pagelist,
|
||||
(dma->page_count + (count << page_order))
|
||||
* sizeof(*dma->pagelist), DRM_MEM_PAGES);
|
||||
kfree(temp_pagelist);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
atomic_dec(&dev->buf_alloc);
|
||||
return -ENOMEM;
|
||||
@@ -988,9 +964,7 @@ int drm_addbufs_pci(struct drm_device * dev, struct drm_buf_desc * request)
|
||||
* with the new one.
|
||||
*/
|
||||
if (dma->page_count) {
|
||||
drm_free(dma->pagelist,
|
||||
dma->page_count * sizeof(*dma->pagelist),
|
||||
DRM_MEM_PAGES);
|
||||
kfree(dma->pagelist);
|
||||
}
|
||||
dma->pagelist = temp_pagelist;
|
||||
|
||||
@@ -1086,8 +1060,8 @@ static int drm_addbufs_sg(struct drm_device * dev, struct drm_buf_desc * request
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
entry->buflist = drm_alloc(count * sizeof(*entry->buflist),
|
||||
DRM_MEM_BUFS);
|
||||
entry->buflist = kmalloc(count * sizeof(*entry->buflist),
|
||||
GFP_KERNEL);
|
||||
if (!entry->buflist) {
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
atomic_dec(&dev->buf_alloc);
|
||||
@@ -1118,7 +1092,7 @@ static int drm_addbufs_sg(struct drm_device * dev, struct drm_buf_desc * request
|
||||
buf->file_priv = NULL;
|
||||
|
||||
buf->dev_priv_size = dev->driver->dev_priv_size;
|
||||
buf->dev_private = drm_alloc(buf->dev_priv_size, DRM_MEM_BUFS);
|
||||
buf->dev_private = kmalloc(buf->dev_priv_size, GFP_KERNEL);
|
||||
if (!buf->dev_private) {
|
||||
/* Set count correctly so we free the proper amount. */
|
||||
entry->buf_count = count;
|
||||
@@ -1139,10 +1113,9 @@ static int drm_addbufs_sg(struct drm_device * dev, struct drm_buf_desc * request
|
||||
|
||||
DRM_DEBUG("byte_count: %d\n", byte_count);
|
||||
|
||||
temp_buflist = drm_realloc(dma->buflist,
|
||||
dma->buf_count * sizeof(*dma->buflist),
|
||||
(dma->buf_count + entry->buf_count)
|
||||
* sizeof(*dma->buflist), DRM_MEM_BUFS);
|
||||
temp_buflist = krealloc(dma->buflist,
|
||||
(dma->buf_count + entry->buf_count) *
|
||||
sizeof(*dma->buflist), GFP_KERNEL);
|
||||
if (!temp_buflist) {
|
||||
/* Free the entry because it isn't valid */
|
||||
drm_cleanup_buf_error(dev, entry);
|
||||
@@ -1248,8 +1221,8 @@ static int drm_addbufs_fb(struct drm_device * dev, struct drm_buf_desc * request
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
entry->buflist = drm_alloc(count * sizeof(*entry->buflist),
|
||||
DRM_MEM_BUFS);
|
||||
entry->buflist = kmalloc(count * sizeof(*entry->buflist),
|
||||
GFP_KERNEL);
|
||||
if (!entry->buflist) {
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
atomic_dec(&dev->buf_alloc);
|
||||
@@ -1279,7 +1252,7 @@ static int drm_addbufs_fb(struct drm_device * dev, struct drm_buf_desc * request
|
||||
buf->file_priv = NULL;
|
||||
|
||||
buf->dev_priv_size = dev->driver->dev_priv_size;
|
||||
buf->dev_private = drm_alloc(buf->dev_priv_size, DRM_MEM_BUFS);
|
||||
buf->dev_private = kmalloc(buf->dev_priv_size, GFP_KERNEL);
|
||||
if (!buf->dev_private) {
|
||||
/* Set count correctly so we free the proper amount. */
|
||||
entry->buf_count = count;
|
||||
@@ -1299,10 +1272,9 @@ static int drm_addbufs_fb(struct drm_device * dev, struct drm_buf_desc * request
|
||||
|
||||
DRM_DEBUG("byte_count: %d\n", byte_count);
|
||||
|
||||
temp_buflist = drm_realloc(dma->buflist,
|
||||
dma->buf_count * sizeof(*dma->buflist),
|
||||
(dma->buf_count + entry->buf_count)
|
||||
* sizeof(*dma->buflist), DRM_MEM_BUFS);
|
||||
temp_buflist = krealloc(dma->buflist,
|
||||
(dma->buf_count + entry->buf_count) *
|
||||
sizeof(*dma->buflist), GFP_KERNEL);
|
||||
if (!temp_buflist) {
|
||||
/* Free the entry because it isn't valid */
|
||||
drm_cleanup_buf_error(dev, entry);
|
||||
|
||||
@@ -341,7 +341,7 @@ int drm_addctx(struct drm_device *dev, void *data,
|
||||
}
|
||||
}
|
||||
|
||||
ctx_entry = drm_alloc(sizeof(*ctx_entry), DRM_MEM_CTXLIST);
|
||||
ctx_entry = kmalloc(sizeof(*ctx_entry), GFP_KERNEL);
|
||||
if (!ctx_entry) {
|
||||
DRM_DEBUG("out of memory\n");
|
||||
return -ENOMEM;
|
||||
@@ -456,7 +456,7 @@ int drm_rmctx(struct drm_device *dev, void *data,
|
||||
list_for_each_entry_safe(pos, n, &dev->ctxlist, head) {
|
||||
if (pos->handle == ctx->handle) {
|
||||
list_del(&pos->head);
|
||||
drm_free(pos, sizeof(*pos), DRM_MEM_CTXLIST);
|
||||
kfree(pos);
|
||||
--dev->ctx_count;
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user