diff --git a/drivers/staging/gma500/psb_fb.c b/drivers/staging/gma500/psb_fb.c index 0bad4e09abad..e06365b0d101 100644 --- a/drivers/staging/gma500/psb_fb.c +++ b/drivers/staging/gma500/psb_fb.c @@ -479,8 +479,8 @@ static int psbfb_create(struct psb_fbdev *fbdev, size = mode_cmd.pitch * mode_cmd.height; aligned_size = ALIGN(size, PAGE_SIZE); - /* Allocate the framebuffer in the GTT */ - backing = psb_gtt_alloc_range(dev, aligned_size, "fb"); + /* Allocate the framebuffer in the GTT with stolen page backing */ + backing = psb_gtt_alloc_range(dev, aligned_size, "fb", 1); if (backing == NULL) return -ENOMEM; diff --git a/drivers/staging/gma500/psb_gtt.c b/drivers/staging/gma500/psb_gtt.c index a97e7beefc17..69323f93dea2 100644 --- a/drivers/staging/gma500/psb_gtt.c +++ b/drivers/staging/gma500/psb_gtt.c @@ -972,6 +972,7 @@ struct gtt_range *psb_gtt_lookup_handle(struct drm_device *dev, int handle) * @dev: Our DRM device * @len: length (bytes) of address space required * @name: resource name + * @backed: resource should be backed by stolen pages * * Ask the kernel core to find us a suitable range of addresses * to use for a GTT mapping. @@ -981,12 +982,23 @@ struct gtt_range *psb_gtt_lookup_handle(struct drm_device *dev, int handle) * as in use. */ struct gtt_range *psb_gtt_alloc_range(struct drm_device *dev, int len, - const char *name) + const char *name, int backed) { struct drm_psb_private *dev_priv = dev->dev_private; struct gtt_range *gt; struct resource *r = dev_priv->gtt_mem; int ret; + unsigned long start, end; + + if (backed) { + /* The start of the GTT is the stolen pages */ + start = r->start; + end = r->start + dev_priv->pg->stolen_size - 1; + } else { + /* The rest we will use for GEM backed objects */ + start = r->start + dev_priv->pg->stolen_size; + end = -1; + } gt = kzalloc(sizeof(struct gtt_range), GFP_KERNEL); if (gt == NULL) @@ -996,8 +1008,7 @@ struct gtt_range *psb_gtt_alloc_range(struct drm_device *dev, int len, kref_init(>->kref); ret = allocate_resource(dev_priv->gtt_mem, >->resource, - len, 0, -1, /*r->start, r->end - 1, */ - PAGE_SIZE, NULL, NULL); + len, start, end, PAGE_SIZE, NULL, NULL); if (ret == 0) { gt->offset = gt->resource.start - r->start; return gt; diff --git a/drivers/staging/gma500/psb_gtt.h b/drivers/staging/gma500/psb_gtt.h index 010ef702c523..dc2259c895e3 100644 --- a/drivers/staging/gma500/psb_gtt.h +++ b/drivers/staging/gma500/psb_gtt.h @@ -105,7 +105,7 @@ extern int psb_gtt_release_handle(struct drm_device *dev, struct gtt_range *gt); extern struct gtt_range *psb_gtt_lookup_handle(struct drm_device *dev, int handle); extern struct gtt_range *psb_gtt_alloc_range(struct drm_device *dev, int len, - const char *name); + const char *name, int backed); extern void psb_gtt_kref_put(struct gtt_range *gt); extern void psb_gtt_free_range(struct drm_device *dev, struct gtt_range *gt);