Commit f4302747 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Tomi Valkeinen

drm: omapdrm: gem: Move global usergart variable to omap_drm_private

The structure contains data related to a device instance, it shouldn't
be a global variable.

While at it rename the usergart structures with an omap_drm_ prefix.
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
parent 7ef93b0a
...@@ -36,6 +36,8 @@ ...@@ -36,6 +36,8 @@
#define MODULE_NAME "omapdrm" #define MODULE_NAME "omapdrm"
struct omap_drm_usergart;
/* max # of mapper-id's that can be assigned.. todo, come up with a better /* max # of mapper-id's that can be assigned.. todo, come up with a better
* (but still inexpensive) way to store/access per-buffer mapper private * (but still inexpensive) way to store/access per-buffer mapper private
* data.. * data..
...@@ -97,6 +99,7 @@ struct omap_drm_private { ...@@ -97,6 +99,7 @@ struct omap_drm_private {
/* list of GEM objects: */ /* list of GEM objects: */
struct list_head obj_list; struct list_head obj_list;
struct omap_drm_usergart *usergart;
bool has_dmm; bool has_dmm;
/* properties: */ /* properties: */
......
...@@ -124,21 +124,22 @@ struct omap_gem_object { ...@@ -124,21 +124,22 @@ struct omap_gem_object {
* for later.. * for later..
*/ */
#define NUM_USERGART_ENTRIES 2 #define NUM_USERGART_ENTRIES 2
struct usergart_entry { struct omap_drm_usergart_entry {
struct tiler_block *block; /* the reserved tiler block */ struct tiler_block *block; /* the reserved tiler block */
dma_addr_t paddr; dma_addr_t paddr;
struct drm_gem_object *obj; /* the current pinned obj */ struct drm_gem_object *obj; /* the current pinned obj */
pgoff_t obj_pgoff; /* page offset of obj currently pgoff_t obj_pgoff; /* page offset of obj currently
mapped in */ mapped in */
}; };
static struct {
struct usergart_entry entry[NUM_USERGART_ENTRIES]; struct omap_drm_usergart {
struct omap_drm_usergart_entry entry[NUM_USERGART_ENTRIES];
int height; /* height in rows */ int height; /* height in rows */
int height_shift; /* ilog2(height in rows) */ int height_shift; /* ilog2(height in rows) */
int slot_shift; /* ilog2(width per slot) */ int slot_shift; /* ilog2(width per slot) */
int stride_pfn; /* stride in pages */ int stride_pfn; /* stride in pages */
int last; /* index of last used entry */ int last; /* index of last used entry */
} *usergart; };
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* Helpers * Helpers
...@@ -181,10 +182,11 @@ static inline bool is_shmem(struct drm_gem_object *obj) ...@@ -181,10 +182,11 @@ static inline bool is_shmem(struct drm_gem_object *obj)
*/ */
static void evict_entry(struct drm_gem_object *obj, static void evict_entry(struct drm_gem_object *obj,
enum tiler_fmt fmt, struct usergart_entry *entry) enum tiler_fmt fmt, struct omap_drm_usergart_entry *entry)
{ {
struct omap_gem_object *omap_obj = to_omap_bo(obj); struct omap_gem_object *omap_obj = to_omap_bo(obj);
int n = usergart[fmt].height; struct omap_drm_private *priv = obj->dev->dev_private;
int n = priv->usergart[fmt].height;
size_t size = PAGE_SIZE * n; size_t size = PAGE_SIZE * n;
loff_t off = mmap_offset(obj) + loff_t off = mmap_offset(obj) +
(entry->obj_pgoff << PAGE_SHIFT); (entry->obj_pgoff << PAGE_SHIFT);
...@@ -210,16 +212,19 @@ static void evict_entry(struct drm_gem_object *obj, ...@@ -210,16 +212,19 @@ static void evict_entry(struct drm_gem_object *obj,
static void evict(struct drm_gem_object *obj) static void evict(struct drm_gem_object *obj)
{ {
struct omap_gem_object *omap_obj = to_omap_bo(obj); struct omap_gem_object *omap_obj = to_omap_bo(obj);
struct omap_drm_private *priv = obj->dev->dev_private;
if (omap_obj->flags & OMAP_BO_TILED) { if (omap_obj->flags & OMAP_BO_TILED) {
enum tiler_fmt fmt = gem2fmt(omap_obj->flags); enum tiler_fmt fmt = gem2fmt(omap_obj->flags);
int i; int i;
if (!usergart) if (!priv->usergart)
return; return;
for (i = 0; i < NUM_USERGART_ENTRIES; i++) { for (i = 0; i < NUM_USERGART_ENTRIES; i++) {
struct usergart_entry *entry = &usergart[fmt].entry[i]; struct omap_drm_usergart_entry *entry =
&priv->usergart[fmt].entry[i];
if (entry->obj == obj) if (entry->obj == obj)
evict_entry(obj, fmt, entry); evict_entry(obj, fmt, entry);
} }
...@@ -408,7 +413,8 @@ static int fault_2d(struct drm_gem_object *obj, ...@@ -408,7 +413,8 @@ static int fault_2d(struct drm_gem_object *obj,
struct vm_area_struct *vma, struct vm_fault *vmf) struct vm_area_struct *vma, struct vm_fault *vmf)
{ {
struct omap_gem_object *omap_obj = to_omap_bo(obj); struct omap_gem_object *omap_obj = to_omap_bo(obj);
struct usergart_entry *entry; struct omap_drm_private *priv = obj->dev->dev_private;
struct omap_drm_usergart_entry *entry;
enum tiler_fmt fmt = gem2fmt(omap_obj->flags); enum tiler_fmt fmt = gem2fmt(omap_obj->flags);
struct page *pages[64]; /* XXX is this too much to have on stack? */ struct page *pages[64]; /* XXX is this too much to have on stack? */
unsigned long pfn; unsigned long pfn;
...@@ -421,8 +427,8 @@ static int fault_2d(struct drm_gem_object *obj, ...@@ -421,8 +427,8 @@ static int fault_2d(struct drm_gem_object *obj,
* that need to be mapped in to fill 4kb wide CPU page. If the slot * that need to be mapped in to fill 4kb wide CPU page. If the slot
* height is 64, then 64 pages fill a 4kb wide by 64 row region. * height is 64, then 64 pages fill a 4kb wide by 64 row region.
*/ */
const int n = usergart[fmt].height; const int n = priv->usergart[fmt].height;
const int n_shift = usergart[fmt].height_shift; const int n_shift = priv->usergart[fmt].height_shift;
/* /*
* If buffer width in bytes > PAGE_SIZE then the virtual stride is * If buffer width in bytes > PAGE_SIZE then the virtual stride is
...@@ -443,11 +449,11 @@ static int fault_2d(struct drm_gem_object *obj, ...@@ -443,11 +449,11 @@ static int fault_2d(struct drm_gem_object *obj,
base_pgoff = round_down(pgoff, m << n_shift); base_pgoff = round_down(pgoff, m << n_shift);
/* figure out buffer width in slots */ /* figure out buffer width in slots */
slots = omap_obj->width >> usergart[fmt].slot_shift; slots = omap_obj->width >> priv->usergart[fmt].slot_shift;
vaddr = vmf->virtual_address - ((pgoff - base_pgoff) << PAGE_SHIFT); vaddr = vmf->virtual_address - ((pgoff - base_pgoff) << PAGE_SHIFT);
entry = &usergart[fmt].entry[usergart[fmt].last]; entry = &priv->usergart[fmt].entry[priv->usergart[fmt].last];
/* evict previous buffer using this usergart entry, if any: */ /* evict previous buffer using this usergart entry, if any: */
if (entry->obj) if (entry->obj)
...@@ -494,12 +500,13 @@ static int fault_2d(struct drm_gem_object *obj, ...@@ -494,12 +500,13 @@ static int fault_2d(struct drm_gem_object *obj,
for (i = n; i > 0; i--) { for (i = n; i > 0; i--) {
vm_insert_mixed(vma, (unsigned long)vaddr, pfn); vm_insert_mixed(vma, (unsigned long)vaddr, pfn);
pfn += usergart[fmt].stride_pfn; pfn += priv->usergart[fmt].stride_pfn;
vaddr += PAGE_SIZE * m; vaddr += PAGE_SIZE * m;
} }
/* simple round-robin: */ /* simple round-robin: */
usergart[fmt].last = (usergart[fmt].last + 1) % NUM_USERGART_ENTRIES; priv->usergart[fmt].last = (priv->usergart[fmt].last + 1)
% NUM_USERGART_ENTRIES;
return 0; return 0;
} }
...@@ -1353,7 +1360,7 @@ struct drm_gem_object *omap_gem_new(struct drm_device *dev, ...@@ -1353,7 +1360,7 @@ struct drm_gem_object *omap_gem_new(struct drm_device *dev,
int ret; int ret;
if (flags & OMAP_BO_TILED) { if (flags & OMAP_BO_TILED) {
if (!usergart) { if (!priv->usergart) {
dev_err(dev->dev, "Tiled buffers require DMM\n"); dev_err(dev->dev, "Tiled buffers require DMM\n");
goto fail; goto fail;
} }
...@@ -1464,6 +1471,7 @@ int omap_gem_new_handle(struct drm_device *dev, struct drm_file *file, ...@@ -1464,6 +1471,7 @@ int omap_gem_new_handle(struct drm_device *dev, struct drm_file *file,
void omap_gem_init(struct drm_device *dev) void omap_gem_init(struct drm_device *dev)
{ {
struct omap_drm_private *priv = dev->dev_private; struct omap_drm_private *priv = dev->dev_private;
struct omap_drm_usergart *usergart;
const enum tiler_fmt fmts[] = { const enum tiler_fmt fmts[] = {
TILFMT_8BIT, TILFMT_16BIT, TILFMT_32BIT TILFMT_8BIT, TILFMT_16BIT, TILFMT_32BIT
}; };
...@@ -1492,10 +1500,11 @@ void omap_gem_init(struct drm_device *dev) ...@@ -1492,10 +1500,11 @@ void omap_gem_init(struct drm_device *dev)
usergart[i].stride_pfn = tiler_stride(fmts[i], 0) >> PAGE_SHIFT; usergart[i].stride_pfn = tiler_stride(fmts[i], 0) >> PAGE_SHIFT;
usergart[i].slot_shift = ilog2((PAGE_SIZE / h) >> i); usergart[i].slot_shift = ilog2((PAGE_SIZE / h) >> i);
for (j = 0; j < NUM_USERGART_ENTRIES; j++) { for (j = 0; j < NUM_USERGART_ENTRIES; j++) {
struct usergart_entry *entry = &usergart[i].entry[j]; struct omap_drm_usergart_entry *entry;
struct tiler_block *block = struct tiler_block *block;
tiler_reserve_2d(fmts[i], w, h,
PAGE_SIZE); entry = &usergart[i].entry[j];
block = tiler_reserve_2d(fmts[i], w, h, PAGE_SIZE);
if (IS_ERR(block)) { if (IS_ERR(block)) {
dev_err(dev->dev, dev_err(dev->dev,
"reserve failed: %d, %d, %ld\n", "reserve failed: %d, %d, %ld\n",
...@@ -1511,13 +1520,16 @@ void omap_gem_init(struct drm_device *dev) ...@@ -1511,13 +1520,16 @@ void omap_gem_init(struct drm_device *dev)
} }
} }
priv->usergart = usergart;
priv->has_dmm = true; priv->has_dmm = true;
} }
void omap_gem_deinit(struct drm_device *dev) void omap_gem_deinit(struct drm_device *dev)
{ {
struct omap_drm_private *priv = dev->dev_private;
/* I believe we can rely on there being no more outstanding GEM /* I believe we can rely on there being no more outstanding GEM
* objects which could depend on usergart/dmm at this point. * objects which could depend on usergart/dmm at this point.
*/ */
kfree(usergart); kfree(priv->usergart);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment