1 /* SPDX-License-Identifier: MIT */
2 #ifndef __NV50_TILE_H__
3 #define __NV50_TILE_H__
4
5 #include <linux/types.h>
6 #include <linux/math.h>
7
8 /*
9 * Tiling parameters for NV50+.
10 * GOB = Group of bytes, the main unit for tiling blocks.
11 * Tiling blocks are a power of 2 number of GOB.
12 * All GOBs and blocks have the same width: 64 bytes (so 16 pixels in 32bits).
13 * tile_mode is the log2 of the number of GOB per block.
14 */
15
16 #define NV_TILE_GOB_HEIGHT_TESLA 4 /* 4 x 64 bytes = 256 bytes for a GOB on Tesla*/
17 #define NV_TILE_GOB_HEIGHT 8 /* 8 x 64 bytes = 512 bytes for a GOB on Fermi and later */
18 #define NV_TILE_GOB_WIDTH_BYTES 64
19
20 /* Number of blocks to cover the width of the framebuffer */
nouveau_get_width_in_blocks(u32 stride)21 static inline u32 nouveau_get_width_in_blocks(u32 stride)
22 {
23 return DIV_ROUND_UP(stride, NV_TILE_GOB_WIDTH_BYTES);
24 }
25
26 /* Return the height in pixel of one GOB */
nouveau_get_gob_height(u16 family)27 static inline u32 nouveau_get_gob_height(u16 family)
28 {
29 if (family == NV_DEVICE_INFO_V0_TESLA)
30 return NV_TILE_GOB_HEIGHT_TESLA;
31 else
32 return NV_TILE_GOB_HEIGHT;
33 }
34
35 /* Number of blocks to cover the heigth of the framebuffer */
nouveau_get_height_in_blocks(u32 height,u32 gobs_in_block,u16 family)36 static inline u32 nouveau_get_height_in_blocks(u32 height, u32 gobs_in_block, u16 family)
37 {
38 return DIV_ROUND_UP(height, nouveau_get_gob_height(family) * gobs_in_block);
39 }
40
41 /* Return the GOB size in bytes */
nouveau_get_gob_size(u16 family)42 static inline u32 nouveau_get_gob_size(u16 family)
43 {
44 return nouveau_get_gob_height(family) * NV_TILE_GOB_WIDTH_BYTES;
45 }
46
47 /* Return the number of GOB in a block */
nouveau_get_gobs_in_block(u32 tile_mode,u16 chipset)48 static inline int nouveau_get_gobs_in_block(u32 tile_mode, u16 chipset)
49 {
50 if (chipset >= 0xc0)
51 return 1 << (tile_mode >> 4);
52 return 1 << tile_mode;
53 }
54
55 /* Return true if tile_mode is invalid */
nouveau_check_tile_mode(u32 tile_mode,u16 chipset)56 static inline bool nouveau_check_tile_mode(u32 tile_mode, u16 chipset)
57 {
58 if (chipset >= 0xc0)
59 return (tile_mode & 0xfffff0f);
60 return (tile_mode & 0xfffffff0);
61 }
62
63 #endif
64