提交 fd3a5225 编写于 作者: B Ben Skeggs

drm/nv20/fb: fixup compression tag allocation size

Signed-off-by: NBen Skeggs <bskeggs@redhat.com>
上级 fafa0cb3
...@@ -69,7 +69,9 @@ struct nouveau_fb { ...@@ -69,7 +69,9 @@ struct nouveau_fb {
} type; } type;
u64 stolen; u64 stolen;
u64 size; u64 size;
int ranks; int ranks;
int parts;
int (*init)(struct nouveau_fb *); int (*init)(struct nouveau_fb *);
int (*get)(struct nouveau_fb *, u64 size, u32 align, int (*get)(struct nouveau_fb *, u64 size, u32 align,
......
...@@ -41,7 +41,8 @@ nv20_fb_vram_init(struct nouveau_fb *pfb) ...@@ -41,7 +41,8 @@ nv20_fb_vram_init(struct nouveau_fb *pfb)
case 0x00000200: pfb->ram.type = NV_MEM_TYPE_GDDR3; break; case 0x00000200: pfb->ram.type = NV_MEM_TYPE_GDDR3; break;
case 0x00000300: pfb->ram.type = NV_MEM_TYPE_GDDR2; break; case 0x00000300: pfb->ram.type = NV_MEM_TYPE_GDDR2; break;
} }
pfb->ram.size = nv_rd32(pfb, 0x10020c) & 0xff000000; pfb->ram.size = (nv_rd32(pfb, 0x10020c) & 0xff000000);
pfb->ram.parts = (nv_rd32(pfb, 0x100200) & 0x00000003) + 1;
return nv_rd32(pfb, 0x100320); return nv_rd32(pfb, 0x100320);
} }
...@@ -63,20 +64,13 @@ static void ...@@ -63,20 +64,13 @@ static void
nv20_fb_tile_comp(struct nouveau_fb *pfb, int i, u32 size, u32 flags, nv20_fb_tile_comp(struct nouveau_fb *pfb, int i, u32 size, u32 flags,
struct nouveau_fb_tile *tile) struct nouveau_fb_tile *tile)
{ {
int bpp = (flags & 2) ? 32 : 16; u32 tiles = DIV_ROUND_UP(size, 0x40);
u32 tags = round_up(tiles / pfb->ram.parts, 0x40);
/* Allocate some of the on-die tag memory, used to store Z if (!nouveau_mm_head(&pfb->tags, 1, tags, tags, 1, &tile->tag)) {
* compression meta-data (most likely just a bitmap determining if (!(flags & 2)) tile->zcomp = 0x00000000; /* Z16 */
* if a given tile is compressed or not). else tile->zcomp = 0x04000000; /* Z24S8 */
*/ tile->zcomp |= tile->tag->offset;
size /= 256; tile->zcomp |= 0x80000000; /* enable */
if (!nouveau_mm_head(&pfb->tags, 1, size, size, 1, &tile->tag)) {
/* Enable Z compression */
tile->zcomp = tile->tag->offset;
tile->zcomp |= 0x80000000;
if (bpp != 16)
tile->zcomp |= 0x04000000;
#ifdef __BIG_ENDIAN #ifdef __BIG_ENDIAN
tile->zcomp |= 0x08000000; tile->zcomp |= 0x08000000;
#endif #endif
......
...@@ -34,21 +34,12 @@ static void ...@@ -34,21 +34,12 @@ static void
nv25_fb_tile_comp(struct nouveau_fb *pfb, int i, u32 size, u32 flags, nv25_fb_tile_comp(struct nouveau_fb *pfb, int i, u32 size, u32 flags,
struct nouveau_fb_tile *tile) struct nouveau_fb_tile *tile)
{ {
int bpp = (flags & 2) ? 32 : 16; u32 tiles = DIV_ROUND_UP(size, 0x40);
u32 tags = round_up(tiles / pfb->ram.parts, 0x40);
/* Allocate some of the on-die tag memory, used to store Z if (!nouveau_mm_head(&pfb->tags, 1, tags, tags, 1, &tile->tag)) {
* compression meta-data (most likely just a bitmap determining if (!(flags & 2)) tile->zcomp = 0x00100000; /* Z16 */
* if a given tile is compressed or not). else tile->zcomp = 0x00200000; /* Z24S8 */
*/ tile->zcomp |= tile->tag->offset;
size /= 256;
if (!nouveau_mm_head(&pfb->tags, 1, size, size, 1, &tile->tag)) {
/* Enable Z compression */
tile->zcomp = tile->tag->offset;
if (bpp == 16)
tile->zcomp |= 0x00100000;
else
tile->zcomp |= 0x00200000;
#ifdef __BIG_ENDIAN #ifdef __BIG_ENDIAN
tile->zcomp |= 0x01000000; tile->zcomp |= 0x01000000;
#endif #endif
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册