diff options
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen_cs.c | 59 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_drv.c | 3 |
2 files changed, 54 insertions, 8 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c index 0f32ea4d608b..2ceab2b52d69 100644 --- a/drivers/gpu/drm/radeon/evergreen_cs.c +++ b/drivers/gpu/drm/radeon/evergreen_cs.c | |||
@@ -846,6 +846,16 @@ static int evergreen_cs_track_validate_texture(struct radeon_cs_parser *p, | |||
846 | return -EINVAL; | 846 | return -EINVAL; |
847 | } | 847 | } |
848 | 848 | ||
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 | |||
849 | /* check mipmap size */ | 859 | /* check mipmap size */ |
850 | for (i = 1; i <= llevel; i++) { | 860 | for (i = 1; i <= llevel; i++) { |
851 | unsigned w, h, d; | 861 | unsigned w, h, d; |
@@ -1081,6 +1091,27 @@ static int evergreen_cs_packet_next_reloc(struct radeon_cs_parser *p, | |||
1081 | } | 1091 | } |
1082 | 1092 | ||
1083 | /** | 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 | |||
1114 | /** | ||
1084 | * evergreen_cs_packet_next_vline() - parse userspace VLINE packet | 1115 | * evergreen_cs_packet_next_vline() - parse userspace VLINE packet |
1085 | * @parser: parser structure holding parsing context. | 1116 | * @parser: parser structure holding parsing context. |
1086 | * | 1117 | * |
@@ -2330,7 +2361,7 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p, | |||
2330 | for (i = 0; i < (pkt->count / 8); i++) { | 2361 | for (i = 0; i < (pkt->count / 8); i++) { |
2331 | struct radeon_bo *texture, *mipmap; | 2362 | struct radeon_bo *texture, *mipmap; |
2332 | u32 toffset, moffset; | 2363 | u32 toffset, moffset; |
2333 | u32 size, offset; | 2364 | u32 size, offset, mip_address, tex_dim; |
2334 | 2365 | ||
2335 | switch (G__SQ_CONSTANT_TYPE(radeon_get_ib_value(p, idx+1+(i*8)+7))) { | 2366 | switch (G__SQ_CONSTANT_TYPE(radeon_get_ib_value(p, idx+1+(i*8)+7))) { |
2336 | case SQ_TEX_VTX_VALID_TEXTURE: | 2367 | case SQ_TEX_VTX_VALID_TEXTURE: |
@@ -2359,14 +2390,28 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p, | |||
2359 | } | 2390 | } |
2360 | texture = reloc->robj; | 2391 | texture = reloc->robj; |
2361 | toffset = (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); | 2392 | toffset = (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); |
2393 | |||
2362 | /* tex mip base */ | 2394 | /* tex mip base */ |
2363 | r = evergreen_cs_packet_next_reloc(p, &reloc); | 2395 | tex_dim = ib[idx+1+(i*8)+0] & 0x7; |
2364 | if (r) { | 2396 | mip_address = ib[idx+1+(i*8)+3]; |
2365 | DRM_ERROR("bad SET_RESOURCE (tex)\n"); | 2397 | |
2366 | return -EINVAL; | 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; | ||
2367 | } | 2413 | } |
2368 | moffset = (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); | 2414 | |
2369 | mipmap = reloc->robj; | ||
2370 | r = evergreen_cs_track_validate_texture(p, texture, mipmap, idx+1+(i*8)); | 2415 | r = evergreen_cs_track_validate_texture(p, texture, mipmap, idx+1+(i*8)); |
2371 | if (r) | 2416 | if (r) |
2372 | return r; | 2417 | return r; |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index 2c8b0f849e36..27ece75b4789 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c | |||
@@ -65,9 +65,10 @@ | |||
65 | * 2.21.0 - r600-r700: FMASK and CMASK | 65 | * 2.21.0 - r600-r700: FMASK and CMASK |
66 | * 2.22.0 - r600 only: RESOLVE_BOX allowed | 66 | * 2.22.0 - r600 only: RESOLVE_BOX allowed |
67 | * 2.23.0 - allow STRMOUT_BASE_UPDATE on RS780 and RS880 | 67 | * 2.23.0 - allow STRMOUT_BASE_UPDATE on RS780 and RS880 |
68 | * 2.24.0 - eg only: allow MIP_ADDRESS=0 for MSAA textures | ||
68 | */ | 69 | */ |
69 | #define KMS_DRIVER_MAJOR 2 | 70 | #define KMS_DRIVER_MAJOR 2 |
70 | #define KMS_DRIVER_MINOR 23 | 71 | #define KMS_DRIVER_MINOR 24 |
71 | #define KMS_DRIVER_PATCHLEVEL 0 | 72 | #define KMS_DRIVER_PATCHLEVEL 0 |
72 | int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); | 73 | int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); |
73 | int radeon_driver_unload_kms(struct drm_device *dev); | 74 | int radeon_driver_unload_kms(struct drm_device *dev); |