Skip to content

Commit 4b9a37d

Browse files
marekolsakgregkh
authored andcommitted
drm/radeon: allow MIP_ADDRESS=0 for MSAA textures on Evergreen
commit 61051af upstream. MIP_ADDRESS should point to the resolved FMASK for an MSAA texture. Setting MIP_ADDRESS to 0 means the FMASK pointer is invalid (the GPU won't read the memory then). The userspace has to set MIP_ADDRESS to 0 and *not* emit any relocation for it. Signed-off-by: Marek Olšák <maraeo@gmail.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent bfe6102 commit 4b9a37d

File tree

2 files changed

+54
-8
lines changed

2 files changed

+54
-8
lines changed

drivers/gpu/drm/radeon/evergreen_cs.c

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -846,6 +846,16 @@ static int evergreen_cs_track_validate_texture(struct radeon_cs_parser *p,
846846
return -EINVAL;
847847
}
848848

849+
if (!mipmap) {
850+
if (llevel) {
851+
dev_warn(p->dev, "%s:%i got NULL MIP_ADDRESS relocation\n",
852+
__func__, __LINE__);
853+
return -EINVAL;
854+
} else {
855+
return 0; /* everything's ok */
856+
}
857+
}
858+
849859
/* check mipmap size */
850860
for (i = 1; i <= llevel; i++) {
851861
unsigned w, h, d;
@@ -1080,6 +1090,27 @@ static int evergreen_cs_packet_next_reloc(struct radeon_cs_parser *p,
10801090
return 0;
10811091
}
10821092

1093+
/**
1094+
* evergreen_cs_packet_next_is_pkt3_nop() - test if the next packet is NOP
1095+
* @p: structure holding the parser context.
1096+
*
1097+
* Check if the next packet is a relocation packet3.
1098+
**/
1099+
static bool evergreen_cs_packet_next_is_pkt3_nop(struct radeon_cs_parser *p)
1100+
{
1101+
struct radeon_cs_packet p3reloc;
1102+
int r;
1103+
1104+
r = evergreen_cs_packet_parse(p, &p3reloc, p->idx);
1105+
if (r) {
1106+
return false;
1107+
}
1108+
if (p3reloc.type != PACKET_TYPE3 || p3reloc.opcode != PACKET3_NOP) {
1109+
return false;
1110+
}
1111+
return true;
1112+
}
1113+
10831114
/**
10841115
* evergreen_cs_packet_next_vline() - parse userspace VLINE packet
10851116
* @parser: parser structure holding parsing context.
@@ -2330,7 +2361,7 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
23302361
for (i = 0; i < (pkt->count / 8); i++) {
23312362
struct radeon_bo *texture, *mipmap;
23322363
u32 toffset, moffset;
2333-
u32 size, offset;
2364+
u32 size, offset, mip_address, tex_dim;
23342365

23352366
switch (G__SQ_CONSTANT_TYPE(radeon_get_ib_value(p, idx+1+(i*8)+7))) {
23362367
case SQ_TEX_VTX_VALID_TEXTURE:
@@ -2359,14 +2390,28 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
23592390
}
23602391
texture = reloc->robj;
23612392
toffset = (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
2393+
23622394
/* tex mip base */
2363-
r = evergreen_cs_packet_next_reloc(p, &reloc);
2364-
if (r) {
2365-
DRM_ERROR("bad SET_RESOURCE (tex)\n");
2366-
return -EINVAL;
2395+
tex_dim = ib[idx+1+(i*8)+0] & 0x7;
2396+
mip_address = ib[idx+1+(i*8)+3];
2397+
2398+
if ((tex_dim == SQ_TEX_DIM_2D_MSAA || tex_dim == SQ_TEX_DIM_2D_ARRAY_MSAA) &&
2399+
!mip_address &&
2400+
!evergreen_cs_packet_next_is_pkt3_nop(p)) {
2401+
/* MIP_ADDRESS should point to FMASK for an MSAA texture.
2402+
* It should be 0 if FMASK is disabled. */
2403+
moffset = 0;
2404+
mipmap = NULL;
2405+
} else {
2406+
r = evergreen_cs_packet_next_reloc(p, &reloc);
2407+
if (r) {
2408+
DRM_ERROR("bad SET_RESOURCE (tex)\n");
2409+
return -EINVAL;
2410+
}
2411+
moffset = (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
2412+
mipmap = reloc->robj;
23672413
}
2368-
moffset = (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
2369-
mipmap = reloc->robj;
2414+
23702415
r = evergreen_cs_track_validate_texture(p, texture, mipmap, idx+1+(i*8));
23712416
if (r)
23722417
return r;

drivers/gpu/drm/radeon/radeon_drv.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,10 @@
6565
* 2.21.0 - r600-r700: FMASK and CMASK
6666
* 2.22.0 - r600 only: RESOLVE_BOX allowed
6767
* 2.23.0 - allow STRMOUT_BASE_UPDATE on RS780 and RS880
68+
* 2.24.0 - eg only: allow MIP_ADDRESS=0 for MSAA textures
6869
*/
6970
#define KMS_DRIVER_MAJOR 2
70-
#define KMS_DRIVER_MINOR 23
71+
#define KMS_DRIVER_MINOR 24
7172
#define KMS_DRIVER_PATCHLEVEL 0
7273
int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
7374
int radeon_driver_unload_kms(struct drm_device *dev);

0 commit comments

Comments
 (0)