Skip to content

Commit

Permalink
gma500: Add support for inserting and removing pages from the GART
Browse files Browse the repository at this point in the history
There are two chunks of code we need to do this. The first one is the code
to insert and remove the pages from the GART, the second is the code to build
page table lists from the GEM object. Surprisingly this latter one doesn't seem
to have a nice GEM helper.

While we are at it we can begin dismantling the semi redundant struct pg,
and finish pruning out the old now unused gtt code as well as the last bits
of helper glue from the old driver base.

Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Alan Cox authored and Greg Kroah-Hartman committed Apr 26, 2011
1 parent f20ee24 commit 6a62730
Show file tree
Hide file tree
Showing 10 changed files with 338 additions and 998 deletions.
1 change: 0 additions & 1 deletion drivers/staging/gma500/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ psb_gfx-y += psb_bl.o \
psb_intel_modes.o \
psb_intel_sdvo.o \
psb_lid.o \
psb_pvr_glue.o \
psb_mmu.o \
psb_powermgmt.o \
psb_irq.o \
Expand Down
24 changes: 8 additions & 16 deletions drivers/staging/gma500/psb_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -499,15 +499,15 @@ static int psb_driver_unload(struct drm_device *dev)

down_read(&pg->sem);
psb_mmu_remove_pfn_sequence(
psb_mmu_get_default_pd
(dev_priv->mmu),
pg->mmu_gatt_start,
pg->vram_stolen_size >> PAGE_SHIFT);
psb_mmu_get_default_pd
(dev_priv->mmu),
pg->mmu_gatt_start,
dev_priv->vram_stolen_size >> PAGE_SHIFT);
up_read(&pg->sem);
psb_mmu_driver_takedown(dev_priv->mmu);
dev_priv->mmu = NULL;
}
psb_gtt_takedown(dev_priv->pg, 1);
psb_gtt_takedown(dev);
if (dev_priv->scratch_page) {
__free_page(dev_priv->scratch_page);
dev_priv->scratch_page = NULL;
Expand Down Expand Up @@ -592,15 +592,7 @@ static int psb_driver_load(struct drm_device *dev, unsigned long chipset)

set_pages_uc(dev_priv->scratch_page, 1);

dev_priv->pg = psb_gtt_alloc(dev);
if (!dev_priv->pg)
goto out_err;

ret = psb_gtt_init(dev_priv->pg, 0);
if (ret)
goto out_err;

ret = psb_gtt_mm_init(dev_priv->pg);
ret = psb_gtt_init(dev, 0);
if (ret)
goto out_err;

Expand Down Expand Up @@ -955,8 +947,8 @@ static int psb_stolen_memory_ioctl(struct drm_device *dev, void *data,
struct drm_psb_private *dev_priv = psb_priv(dev);
struct drm_psb_stolen_memory_arg *arg = data;

arg->base = dev_priv->pg->stolen_base;
arg->size = dev_priv->pg->vram_stolen_size;
arg->base = dev_priv->stolen_base;
arg->size = dev_priv->vram_stolen_size;

return 0;
}
Expand Down
7 changes: 7 additions & 0 deletions drivers/staging/gma500/psb_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,13 @@ struct drm_psb_private {
/* GTT Memory manager */
struct psb_gtt_mm *gtt_mm;
struct page *scratch_page;
u32 *gtt_map;
uint32_t stolen_base;
void *vram_addr;
unsigned long vram_stolen_size;
int gtt_initialized;
u16 gmch_ctrl; /* Saved GTT setup */
u32 pge_ctl;

struct mutex gtt_mutex;
struct resource *gtt_mem; /* Our PCI resource */
Expand Down
34 changes: 9 additions & 25 deletions drivers/staging/gma500/psb_fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@
#include "psb_intel_reg.h"
#include "psb_intel_drv.h"
#include "psb_fb.h"
#include "psb_pvr_glue.h"

static void psb_user_framebuffer_destroy(struct drm_framebuffer *fb);
static int psb_user_framebuffer_create_handle(struct drm_framebuffer *fb,
Expand Down Expand Up @@ -191,8 +190,7 @@ static int psbfb_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
struct psb_framebuffer *psbfb = vma->vm_private_data;
struct drm_device *dev = psbfb->base.dev;
struct drm_psb_private *dev_priv = dev->dev_private;
struct psb_gtt *pg = dev_priv->pg;
unsigned long phys_addr = (unsigned long)pg->stolen_base;
unsigned long phys_addr = (unsigned long)dev_priv->stolen_base;

page_num = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;

Expand Down Expand Up @@ -241,7 +239,6 @@ static int psbfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
char *fb_screen_base = NULL;
struct drm_device *dev = psbfb->base.dev;
struct drm_psb_private *dev_priv = dev->dev_private;
struct psb_gtt *pg = dev_priv->pg;

if (vma->vm_pgoff != 0)
return -EINVAL;
Expand All @@ -254,10 +251,11 @@ static int psbfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
fb_screen_base = (char *)info->screen_base;

DRM_DEBUG("vm_pgoff 0x%lx, screen base %p vram_addr %p\n",
vma->vm_pgoff, fb_screen_base, pg->vram_addr);
vma->vm_pgoff, fb_screen_base,
dev_priv->vram_addr);

/* FIXME: ultimately this needs to become 'if entirely stolen memory' */
if (1 || fb_screen_base == pg->vram_addr) {
if (1 || fb_screen_base == dev_priv->vram_addr) {
vma->vm_ops = &psbfb_vm_ops;
vma->vm_private_data = (void *)psbfb;
vma->vm_flags |= VM_RESERVED | VM_IO |
Expand Down Expand Up @@ -349,7 +347,6 @@ static int psbfb_create(struct psb_fbdev *fbdev,
{
struct drm_device *dev = fbdev->psb_fb_helper.dev;
struct drm_psb_private *dev_priv = dev->dev_private;
struct psb_gtt *pg = dev_priv->pg;
struct fb_info *info;
struct drm_framebuffer *fb;
struct psb_framebuffer *psbfb;
Expand Down Expand Up @@ -409,7 +406,7 @@ static int psbfb_create(struct psb_fbdev *fbdev,
/* Accessed via stolen memory directly, This only works for stolem
memory however. Need to address this once we start using gtt
pages we allocate */
info->screen_base = (char *)pg->vram_addr + backing->offset;
info->screen_base = (char *)dev_priv->vram_addr + backing->offset;
info->screen_size = size;
memset(info->screen_base, 0, size);

Expand Down Expand Up @@ -735,32 +732,19 @@ static void psb_setup_outputs(struct drm_device *dev)
}
}

/* FIXME: rewrite these in terms of the gtt_range and GEM objects
rather than faking them as we do now */

static void *psb_bo_from_handle(struct drm_device *dev,
struct drm_file *file_priv,
unsigned int handle)
{
void *psKernelMemInfo = NULL;
void * hKernelMemInfo = (void *)handle;
int ret;

ret = psb_get_meminfo_by_handle(hKernelMemInfo, &psKernelMemInfo);
if (ret) {
DRM_ERROR("Cannot get meminfo for handle 0x%x\n",
(u32)hKernelMemInfo);
return NULL;
}

return (void *)psKernelMemInfo;
return NULL;
}

static size_t psb_bo_size(struct drm_device *dev, void *bof)
{
#if 0
void *psKernelMemInfo = (void *)bof;
return (size_t)psKernelMemInfo->ui32AllocSize;
#else
return 0;
#endif
}

static size_t psb_bo_offset(struct drm_device *dev, void *bof)
Expand Down
Loading

0 comments on commit 6a62730

Please sign in to comment.