diff options
author | Francisco Jerez <currojerez@riseup.net> | 2010-10-10 00:07:32 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2010-11-17 23:38:31 -0500 |
commit | 699ddfd98061b725c52fd34ff1c4346e5b4824d4 (patch) | |
tree | c30678adaba718c40eae3ad7d3802d7a06546160 /drivers/gpu/drm/nouveau/nouveau_bo.c | |
parent | f13b32630dda7e583a84a8c535880cff7e4a9bdd (diff) |
drm/nv10: Balance RTs expected to be accessed simultaneously by the 3d engine.
Signed-off-by: Francisco Jerez <currojerez@riseup.net>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_bo.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_bo.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c index f55dd9145b7..c41e1c200ef 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bo.c +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c | |||
@@ -143,6 +143,7 @@ nouveau_bo_new(struct drm_device *dev, struct nouveau_channel *chan, | |||
143 | nvbo->no_vm = no_vm; | 143 | nvbo->no_vm = no_vm; |
144 | nvbo->tile_mode = tile_mode; | 144 | nvbo->tile_mode = tile_mode; |
145 | nvbo->tile_flags = tile_flags; | 145 | nvbo->tile_flags = tile_flags; |
146 | nvbo->bo.bdev = &dev_priv->ttm.bdev; | ||
146 | 147 | ||
147 | nouveau_bo_fixup_align(dev, tile_mode, nouveau_bo_tile_layout(nvbo), | 148 | nouveau_bo_fixup_align(dev, tile_mode, nouveau_bo_tile_layout(nvbo), |
148 | &align, &size); | 149 | &align, &size); |
@@ -177,6 +178,31 @@ set_placement_list(uint32_t *pl, unsigned *n, uint32_t type, uint32_t flags) | |||
177 | pl[(*n)++] = TTM_PL_FLAG_SYSTEM | flags; | 178 | pl[(*n)++] = TTM_PL_FLAG_SYSTEM | flags; |
178 | } | 179 | } |
179 | 180 | ||
181 | static void | ||
182 | set_placement_range(struct nouveau_bo *nvbo, uint32_t type) | ||
183 | { | ||
184 | struct drm_nouveau_private *dev_priv = nouveau_bdev(nvbo->bo.bdev); | ||
185 | |||
186 | if (dev_priv->card_type == NV_10 && | ||
187 | nvbo->tile_mode && (type & TTM_PL_FLAG_VRAM)) { | ||
188 | /* | ||
189 | * Make sure that the color and depth buffers are handled | ||
190 | * by independent memory controller units. Up to a 9x | ||
191 | * speed up when alpha-blending and depth-test are enabled | ||
192 | * at the same time. | ||
193 | */ | ||
194 | int vram_pages = dev_priv->vram_size >> PAGE_SHIFT; | ||
195 | |||
196 | if (nvbo->tile_flags & NOUVEAU_GEM_TILE_ZETA) { | ||
197 | nvbo->placement.fpfn = vram_pages / 2; | ||
198 | nvbo->placement.lpfn = ~0; | ||
199 | } else { | ||
200 | nvbo->placement.fpfn = 0; | ||
201 | nvbo->placement.lpfn = vram_pages / 2; | ||
202 | } | ||
203 | } | ||
204 | } | ||
205 | |||
180 | void | 206 | void |
181 | nouveau_bo_placement_set(struct nouveau_bo *nvbo, uint32_t type, uint32_t busy) | 207 | nouveau_bo_placement_set(struct nouveau_bo *nvbo, uint32_t type, uint32_t busy) |
182 | { | 208 | { |
@@ -191,6 +217,8 @@ nouveau_bo_placement_set(struct nouveau_bo *nvbo, uint32_t type, uint32_t busy) | |||
191 | pl->busy_placement = nvbo->busy_placements; | 217 | pl->busy_placement = nvbo->busy_placements; |
192 | set_placement_list(nvbo->busy_placements, &pl->num_busy_placement, | 218 | set_placement_list(nvbo->busy_placements, &pl->num_busy_placement, |
193 | type | busy, flags); | 219 | type | busy, flags); |
220 | |||
221 | set_placement_range(nvbo, type); | ||
194 | } | 222 | } |
195 | 223 | ||
196 | int | 224 | int |