diff options
Diffstat (limited to 'drivers/gpu')
34 files changed, 305 insertions, 80 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c index 9b384a94d2f3..3e35a8f2c5e5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c | |||
@@ -574,6 +574,7 @@ static const struct amdgpu_px_quirk amdgpu_px_quirk_list[] = { | |||
574 | { 0x1002, 0x6900, 0x1002, 0x0124, AMDGPU_PX_QUIRK_FORCE_ATPX }, | 574 | { 0x1002, 0x6900, 0x1002, 0x0124, AMDGPU_PX_QUIRK_FORCE_ATPX }, |
575 | { 0x1002, 0x6900, 0x1028, 0x0812, AMDGPU_PX_QUIRK_FORCE_ATPX }, | 575 | { 0x1002, 0x6900, 0x1028, 0x0812, AMDGPU_PX_QUIRK_FORCE_ATPX }, |
576 | { 0x1002, 0x6900, 0x1028, 0x0813, AMDGPU_PX_QUIRK_FORCE_ATPX }, | 576 | { 0x1002, 0x6900, 0x1028, 0x0813, AMDGPU_PX_QUIRK_FORCE_ATPX }, |
577 | { 0x1002, 0x699f, 0x1028, 0x0814, AMDGPU_PX_QUIRK_FORCE_ATPX }, | ||
577 | { 0x1002, 0x6900, 0x1025, 0x125A, AMDGPU_PX_QUIRK_FORCE_ATPX }, | 578 | { 0x1002, 0x6900, 0x1025, 0x125A, AMDGPU_PX_QUIRK_FORCE_ATPX }, |
578 | { 0x1002, 0x6900, 0x17AA, 0x3806, AMDGPU_PX_QUIRK_FORCE_ATPX }, | 579 | { 0x1002, 0x6900, 0x17AA, 0x3806, AMDGPU_PX_QUIRK_FORCE_ATPX }, |
579 | { 0, 0, 0, 0, 0 }, | 580 | { 0, 0, 0, 0, 0 }, |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 4e4094f842e7..8b26c970a3cb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
@@ -1143,6 +1143,9 @@ static int amdgpu_cs_process_syncobj_out_dep(struct amdgpu_cs_parser *p, | |||
1143 | num_deps = chunk->length_dw * 4 / | 1143 | num_deps = chunk->length_dw * 4 / |
1144 | sizeof(struct drm_amdgpu_cs_chunk_sem); | 1144 | sizeof(struct drm_amdgpu_cs_chunk_sem); |
1145 | 1145 | ||
1146 | if (p->post_deps) | ||
1147 | return -EINVAL; | ||
1148 | |||
1146 | p->post_deps = kmalloc_array(num_deps, sizeof(*p->post_deps), | 1149 | p->post_deps = kmalloc_array(num_deps, sizeof(*p->post_deps), |
1147 | GFP_KERNEL); | 1150 | GFP_KERNEL); |
1148 | p->num_post_deps = 0; | 1151 | p->num_post_deps = 0; |
@@ -1166,8 +1169,7 @@ static int amdgpu_cs_process_syncobj_out_dep(struct amdgpu_cs_parser *p, | |||
1166 | 1169 | ||
1167 | 1170 | ||
1168 | static int amdgpu_cs_process_syncobj_timeline_out_dep(struct amdgpu_cs_parser *p, | 1171 | static int amdgpu_cs_process_syncobj_timeline_out_dep(struct amdgpu_cs_parser *p, |
1169 | struct amdgpu_cs_chunk | 1172 | struct amdgpu_cs_chunk *chunk) |
1170 | *chunk) | ||
1171 | { | 1173 | { |
1172 | struct drm_amdgpu_cs_chunk_syncobj *syncobj_deps; | 1174 | struct drm_amdgpu_cs_chunk_syncobj *syncobj_deps; |
1173 | unsigned num_deps; | 1175 | unsigned num_deps; |
@@ -1177,6 +1179,9 @@ static int amdgpu_cs_process_syncobj_timeline_out_dep(struct amdgpu_cs_parser *p | |||
1177 | num_deps = chunk->length_dw * 4 / | 1179 | num_deps = chunk->length_dw * 4 / |
1178 | sizeof(struct drm_amdgpu_cs_chunk_syncobj); | 1180 | sizeof(struct drm_amdgpu_cs_chunk_syncobj); |
1179 | 1181 | ||
1182 | if (p->post_deps) | ||
1183 | return -EINVAL; | ||
1184 | |||
1180 | p->post_deps = kmalloc_array(num_deps, sizeof(*p->post_deps), | 1185 | p->post_deps = kmalloc_array(num_deps, sizeof(*p->post_deps), |
1181 | GFP_KERNEL); | 1186 | GFP_KERNEL); |
1182 | p->num_post_deps = 0; | 1187 | p->num_post_deps = 0; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c index f539a2a92774..7398b4850649 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | |||
@@ -534,21 +534,24 @@ int amdgpu_ctx_wait_prev_fence(struct amdgpu_ctx *ctx, | |||
534 | struct drm_sched_entity *entity) | 534 | struct drm_sched_entity *entity) |
535 | { | 535 | { |
536 | struct amdgpu_ctx_entity *centity = to_amdgpu_ctx_entity(entity); | 536 | struct amdgpu_ctx_entity *centity = to_amdgpu_ctx_entity(entity); |
537 | unsigned idx = centity->sequence & (amdgpu_sched_jobs - 1); | 537 | struct dma_fence *other; |
538 | struct dma_fence *other = centity->fences[idx]; | 538 | unsigned idx; |
539 | long r; | ||
539 | 540 | ||
540 | if (other) { | 541 | spin_lock(&ctx->ring_lock); |
541 | signed long r; | 542 | idx = centity->sequence & (amdgpu_sched_jobs - 1); |
542 | r = dma_fence_wait(other, true); | 543 | other = dma_fence_get(centity->fences[idx]); |
543 | if (r < 0) { | 544 | spin_unlock(&ctx->ring_lock); |
544 | if (r != -ERESTARTSYS) | ||
545 | DRM_ERROR("Error (%ld) waiting for fence!\n", r); | ||
546 | 545 | ||
547 | return r; | 546 | if (!other) |
548 | } | 547 | return 0; |
549 | } | ||
550 | 548 | ||
551 | return 0; | 549 | r = dma_fence_wait(other, true); |
550 | if (r < 0 && r != -ERESTARTSYS) | ||
551 | DRM_ERROR("Error (%ld) waiting for fence!\n", r); | ||
552 | |||
553 | dma_fence_put(other); | ||
554 | return r; | ||
552 | } | 555 | } |
553 | 556 | ||
554 | void amdgpu_ctx_mgr_init(struct amdgpu_ctx_mgr *mgr) | 557 | void amdgpu_ctx_mgr_init(struct amdgpu_ctx_mgr *mgr) |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index 04b8ac4432c7..c066e1d3f981 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | |||
@@ -596,14 +596,18 @@ static void gfx_v9_0_check_if_need_gfxoff(struct amdgpu_device *adev) | |||
596 | case CHIP_VEGA20: | 596 | case CHIP_VEGA20: |
597 | break; | 597 | break; |
598 | case CHIP_RAVEN: | 598 | case CHIP_RAVEN: |
599 | if (adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8) | 599 | if (!(adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8) |
600 | break; | 600 | &&((adev->gfx.rlc_fw_version != 106 && |
601 | if ((adev->gfx.rlc_fw_version != 106 && | 601 | adev->gfx.rlc_fw_version < 531) || |
602 | adev->gfx.rlc_fw_version < 531) || | 602 | (adev->gfx.rlc_fw_version == 53815) || |
603 | (adev->gfx.rlc_fw_version == 53815) || | 603 | (adev->gfx.rlc_feature_version < 1) || |
604 | (adev->gfx.rlc_feature_version < 1) || | 604 | !adev->gfx.rlc.is_rlc_v2_1)) |
605 | !adev->gfx.rlc.is_rlc_v2_1) | ||
606 | adev->pm.pp_feature &= ~PP_GFXOFF_MASK; | 605 | adev->pm.pp_feature &= ~PP_GFXOFF_MASK; |
606 | |||
607 | if (adev->pm.pp_feature & PP_GFXOFF_MASK) | ||
608 | adev->pg_flags |= AMD_PG_SUPPORT_GFX_PG | | ||
609 | AMD_PG_SUPPORT_CP | | ||
610 | AMD_PG_SUPPORT_RLC_SMU_HS; | ||
607 | break; | 611 | break; |
608 | default: | 612 | default: |
609 | break; | 613 | break; |
diff --git a/drivers/gpu/drm/amd/amdgpu/nv.c b/drivers/gpu/drm/amd/amdgpu/nv.c index 662612f89c70..9922bce3fd89 100644 --- a/drivers/gpu/drm/amd/amdgpu/nv.c +++ b/drivers/gpu/drm/amd/amdgpu/nv.c | |||
@@ -552,7 +552,6 @@ static int nv_common_early_init(void *handle) | |||
552 | AMD_CG_SUPPORT_BIF_LS; | 552 | AMD_CG_SUPPORT_BIF_LS; |
553 | adev->pg_flags = AMD_PG_SUPPORT_VCN | | 553 | adev->pg_flags = AMD_PG_SUPPORT_VCN | |
554 | AMD_PG_SUPPORT_VCN_DPG | | 554 | AMD_PG_SUPPORT_VCN_DPG | |
555 | AMD_PG_SUPPORT_MMHUB | | ||
556 | AMD_PG_SUPPORT_ATHUB; | 555 | AMD_PG_SUPPORT_ATHUB; |
557 | adev->external_rev_id = adev->rev_id + 0x1; | 556 | adev->external_rev_id = adev->rev_id + 0x1; |
558 | break; | 557 | break; |
diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c index 23265414d448..04fbf05d7176 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.c +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c | |||
@@ -992,11 +992,6 @@ static int soc15_common_early_init(void *handle) | |||
992 | 992 | ||
993 | adev->pg_flags = AMD_PG_SUPPORT_SDMA | AMD_PG_SUPPORT_VCN; | 993 | adev->pg_flags = AMD_PG_SUPPORT_SDMA | AMD_PG_SUPPORT_VCN; |
994 | } | 994 | } |
995 | |||
996 | if (adev->pm.pp_feature & PP_GFXOFF_MASK) | ||
997 | adev->pg_flags |= AMD_PG_SUPPORT_GFX_PG | | ||
998 | AMD_PG_SUPPORT_CP | | ||
999 | AMD_PG_SUPPORT_RLC_SMU_HS; | ||
1000 | break; | 995 | break; |
1001 | default: | 996 | default: |
1002 | /* FIXME: not supported yet */ | 997 | /* FIXME: not supported yet */ |
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 4a29f72334d0..45be7a2132bb 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | |||
@@ -3131,13 +3131,25 @@ static enum dc_color_depth | |||
3131 | convert_color_depth_from_display_info(const struct drm_connector *connector, | 3131 | convert_color_depth_from_display_info(const struct drm_connector *connector, |
3132 | const struct drm_connector_state *state) | 3132 | const struct drm_connector_state *state) |
3133 | { | 3133 | { |
3134 | uint32_t bpc = connector->display_info.bpc; | 3134 | uint8_t bpc = (uint8_t)connector->display_info.bpc; |
3135 | |||
3136 | /* Assume 8 bpc by default if no bpc is specified. */ | ||
3137 | bpc = bpc ? bpc : 8; | ||
3135 | 3138 | ||
3136 | if (!state) | 3139 | if (!state) |
3137 | state = connector->state; | 3140 | state = connector->state; |
3138 | 3141 | ||
3139 | if (state) { | 3142 | if (state) { |
3140 | bpc = state->max_bpc; | 3143 | /* |
3144 | * Cap display bpc based on the user requested value. | ||
3145 | * | ||
3146 | * The value for state->max_bpc may not correctly updated | ||
3147 | * depending on when the connector gets added to the state | ||
3148 | * or if this was called outside of atomic check, so it | ||
3149 | * can't be used directly. | ||
3150 | */ | ||
3151 | bpc = min(bpc, state->max_requested_bpc); | ||
3152 | |||
3141 | /* Round down to the nearest even number. */ | 3153 | /* Round down to the nearest even number. */ |
3142 | bpc = bpc - (bpc & 1); | 3154 | bpc = bpc - (bpc & 1); |
3143 | } | 3155 | } |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c index f27c6fbb192e..90c4e87ac5ad 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c | |||
@@ -2101,7 +2101,11 @@ static int vega20_get_gpu_power(struct pp_hwmgr *hwmgr, | |||
2101 | if (ret) | 2101 | if (ret) |
2102 | return ret; | 2102 | return ret; |
2103 | 2103 | ||
2104 | *query = metrics_table.CurrSocketPower << 8; | 2104 | /* For the 40.46 release, they changed the value name */ |
2105 | if (hwmgr->smu_version == 0x282e00) | ||
2106 | *query = metrics_table.AverageSocketPower << 8; | ||
2107 | else | ||
2108 | *query = metrics_table.CurrSocketPower << 8; | ||
2105 | 2109 | ||
2106 | return ret; | 2110 | return ret; |
2107 | } | 2111 | } |
@@ -2349,12 +2353,16 @@ static int vega20_force_dpm_highest(struct pp_hwmgr *hwmgr) | |||
2349 | data->dpm_table.soc_table.dpm_state.soft_max_level = | 2353 | data->dpm_table.soc_table.dpm_state.soft_max_level = |
2350 | data->dpm_table.soc_table.dpm_levels[soft_level].value; | 2354 | data->dpm_table.soc_table.dpm_levels[soft_level].value; |
2351 | 2355 | ||
2352 | ret = vega20_upload_dpm_min_level(hwmgr, 0xFFFFFFFF); | 2356 | ret = vega20_upload_dpm_min_level(hwmgr, FEATURE_DPM_GFXCLK_MASK | |
2357 | FEATURE_DPM_UCLK_MASK | | ||
2358 | FEATURE_DPM_SOCCLK_MASK); | ||
2353 | PP_ASSERT_WITH_CODE(!ret, | 2359 | PP_ASSERT_WITH_CODE(!ret, |
2354 | "Failed to upload boot level to highest!", | 2360 | "Failed to upload boot level to highest!", |
2355 | return ret); | 2361 | return ret); |
2356 | 2362 | ||
2357 | ret = vega20_upload_dpm_max_level(hwmgr, 0xFFFFFFFF); | 2363 | ret = vega20_upload_dpm_max_level(hwmgr, FEATURE_DPM_GFXCLK_MASK | |
2364 | FEATURE_DPM_UCLK_MASK | | ||
2365 | FEATURE_DPM_SOCCLK_MASK); | ||
2358 | PP_ASSERT_WITH_CODE(!ret, | 2366 | PP_ASSERT_WITH_CODE(!ret, |
2359 | "Failed to upload dpm max level to highest!", | 2367 | "Failed to upload dpm max level to highest!", |
2360 | return ret); | 2368 | return ret); |
@@ -2387,12 +2395,16 @@ static int vega20_force_dpm_lowest(struct pp_hwmgr *hwmgr) | |||
2387 | data->dpm_table.soc_table.dpm_state.soft_max_level = | 2395 | data->dpm_table.soc_table.dpm_state.soft_max_level = |
2388 | data->dpm_table.soc_table.dpm_levels[soft_level].value; | 2396 | data->dpm_table.soc_table.dpm_levels[soft_level].value; |
2389 | 2397 | ||
2390 | ret = vega20_upload_dpm_min_level(hwmgr, 0xFFFFFFFF); | 2398 | ret = vega20_upload_dpm_min_level(hwmgr, FEATURE_DPM_GFXCLK_MASK | |
2399 | FEATURE_DPM_UCLK_MASK | | ||
2400 | FEATURE_DPM_SOCCLK_MASK); | ||
2391 | PP_ASSERT_WITH_CODE(!ret, | 2401 | PP_ASSERT_WITH_CODE(!ret, |
2392 | "Failed to upload boot level to highest!", | 2402 | "Failed to upload boot level to highest!", |
2393 | return ret); | 2403 | return ret); |
2394 | 2404 | ||
2395 | ret = vega20_upload_dpm_max_level(hwmgr, 0xFFFFFFFF); | 2405 | ret = vega20_upload_dpm_max_level(hwmgr, FEATURE_DPM_GFXCLK_MASK | |
2406 | FEATURE_DPM_UCLK_MASK | | ||
2407 | FEATURE_DPM_SOCCLK_MASK); | ||
2396 | PP_ASSERT_WITH_CODE(!ret, | 2408 | PP_ASSERT_WITH_CODE(!ret, |
2397 | "Failed to upload dpm max level to highest!", | 2409 | "Failed to upload dpm max level to highest!", |
2398 | return ret); | 2410 | return ret); |
@@ -2403,14 +2415,54 @@ static int vega20_force_dpm_lowest(struct pp_hwmgr *hwmgr) | |||
2403 | 2415 | ||
2404 | static int vega20_unforce_dpm_levels(struct pp_hwmgr *hwmgr) | 2416 | static int vega20_unforce_dpm_levels(struct pp_hwmgr *hwmgr) |
2405 | { | 2417 | { |
2418 | struct vega20_hwmgr *data = | ||
2419 | (struct vega20_hwmgr *)(hwmgr->backend); | ||
2420 | uint32_t soft_min_level, soft_max_level; | ||
2406 | int ret = 0; | 2421 | int ret = 0; |
2407 | 2422 | ||
2408 | ret = vega20_upload_dpm_min_level(hwmgr, 0xFFFFFFFF); | 2423 | /* gfxclk soft min/max settings */ |
2424 | soft_min_level = | ||
2425 | vega20_find_lowest_dpm_level(&(data->dpm_table.gfx_table)); | ||
2426 | soft_max_level = | ||
2427 | vega20_find_highest_dpm_level(&(data->dpm_table.gfx_table)); | ||
2428 | |||
2429 | data->dpm_table.gfx_table.dpm_state.soft_min_level = | ||
2430 | data->dpm_table.gfx_table.dpm_levels[soft_min_level].value; | ||
2431 | data->dpm_table.gfx_table.dpm_state.soft_max_level = | ||
2432 | data->dpm_table.gfx_table.dpm_levels[soft_max_level].value; | ||
2433 | |||
2434 | /* uclk soft min/max settings */ | ||
2435 | soft_min_level = | ||
2436 | vega20_find_lowest_dpm_level(&(data->dpm_table.mem_table)); | ||
2437 | soft_max_level = | ||
2438 | vega20_find_highest_dpm_level(&(data->dpm_table.mem_table)); | ||
2439 | |||
2440 | data->dpm_table.mem_table.dpm_state.soft_min_level = | ||
2441 | data->dpm_table.mem_table.dpm_levels[soft_min_level].value; | ||
2442 | data->dpm_table.mem_table.dpm_state.soft_max_level = | ||
2443 | data->dpm_table.mem_table.dpm_levels[soft_max_level].value; | ||
2444 | |||
2445 | /* socclk soft min/max settings */ | ||
2446 | soft_min_level = | ||
2447 | vega20_find_lowest_dpm_level(&(data->dpm_table.soc_table)); | ||
2448 | soft_max_level = | ||
2449 | vega20_find_highest_dpm_level(&(data->dpm_table.soc_table)); | ||
2450 | |||
2451 | data->dpm_table.soc_table.dpm_state.soft_min_level = | ||
2452 | data->dpm_table.soc_table.dpm_levels[soft_min_level].value; | ||
2453 | data->dpm_table.soc_table.dpm_state.soft_max_level = | ||
2454 | data->dpm_table.soc_table.dpm_levels[soft_max_level].value; | ||
2455 | |||
2456 | ret = vega20_upload_dpm_min_level(hwmgr, FEATURE_DPM_GFXCLK_MASK | | ||
2457 | FEATURE_DPM_UCLK_MASK | | ||
2458 | FEATURE_DPM_SOCCLK_MASK); | ||
2409 | PP_ASSERT_WITH_CODE(!ret, | 2459 | PP_ASSERT_WITH_CODE(!ret, |
2410 | "Failed to upload DPM Bootup Levels!", | 2460 | "Failed to upload DPM Bootup Levels!", |
2411 | return ret); | 2461 | return ret); |
2412 | 2462 | ||
2413 | ret = vega20_upload_dpm_max_level(hwmgr, 0xFFFFFFFF); | 2463 | ret = vega20_upload_dpm_max_level(hwmgr, FEATURE_DPM_GFXCLK_MASK | |
2464 | FEATURE_DPM_UCLK_MASK | | ||
2465 | FEATURE_DPM_SOCCLK_MASK); | ||
2414 | PP_ASSERT_WITH_CODE(!ret, | 2466 | PP_ASSERT_WITH_CODE(!ret, |
2415 | "Failed to upload DPM Max Levels!", | 2467 | "Failed to upload DPM Max Levels!", |
2416 | return ret); | 2468 | return ret); |
diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h index a0f52c86d8c7..a78b2e295895 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h +++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h | |||
@@ -907,8 +907,6 @@ struct smu_funcs | |||
907 | ((smu)->funcs->register_irq_handler ? (smu)->funcs->register_irq_handler(smu) : 0) | 907 | ((smu)->funcs->register_irq_handler ? (smu)->funcs->register_irq_handler(smu) : 0) |
908 | #define smu_set_azalia_d3_pme(smu) \ | 908 | #define smu_set_azalia_d3_pme(smu) \ |
909 | ((smu)->funcs->set_azalia_d3_pme ? (smu)->funcs->set_azalia_d3_pme((smu)) : 0) | 909 | ((smu)->funcs->set_azalia_d3_pme ? (smu)->funcs->set_azalia_d3_pme((smu)) : 0) |
910 | #define smu_get_uclk_dpm_states(smu, clocks_in_khz, num_states) \ | ||
911 | ((smu)->ppt_funcs->get_uclk_dpm_states ? (smu)->ppt_funcs->get_uclk_dpm_states((smu), (clocks_in_khz), (num_states)) : 0) | ||
912 | #define smu_get_max_sustainable_clocks_by_dc(smu, max_clocks) \ | 910 | #define smu_get_max_sustainable_clocks_by_dc(smu, max_clocks) \ |
913 | ((smu)->funcs->get_max_sustainable_clocks_by_dc ? (smu)->funcs->get_max_sustainable_clocks_by_dc((smu), (max_clocks)) : 0) | 911 | ((smu)->funcs->get_max_sustainable_clocks_by_dc ? (smu)->funcs->get_max_sustainable_clocks_by_dc((smu), (max_clocks)) : 0) |
914 | #define smu_get_uclk_dpm_states(smu, clocks_in_khz, num_states) \ | 912 | #define smu_get_uclk_dpm_states(smu, clocks_in_khz, num_states) \ |
diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c index 5fde5cf65b42..53097961bf2b 100644 --- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c +++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c | |||
@@ -326,7 +326,8 @@ static int smu_v11_0_setup_pptable(struct smu_context *smu) | |||
326 | struct amdgpu_device *adev = smu->adev; | 326 | struct amdgpu_device *adev = smu->adev; |
327 | const struct smc_firmware_header_v1_0 *hdr; | 327 | const struct smc_firmware_header_v1_0 *hdr; |
328 | int ret, index; | 328 | int ret, index; |
329 | uint32_t size; | 329 | uint32_t size = 0; |
330 | uint16_t atom_table_size; | ||
330 | uint8_t frev, crev; | 331 | uint8_t frev, crev; |
331 | void *table; | 332 | void *table; |
332 | uint16_t version_major, version_minor; | 333 | uint16_t version_major, version_minor; |
@@ -354,10 +355,11 @@ static int smu_v11_0_setup_pptable(struct smu_context *smu) | |||
354 | index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1, | 355 | index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1, |
355 | powerplayinfo); | 356 | powerplayinfo); |
356 | 357 | ||
357 | ret = smu_get_atom_data_table(smu, index, (uint16_t *)&size, &frev, &crev, | 358 | ret = smu_get_atom_data_table(smu, index, &atom_table_size, &frev, &crev, |
358 | (uint8_t **)&table); | 359 | (uint8_t **)&table); |
359 | if (ret) | 360 | if (ret) |
360 | return ret; | 361 | return ret; |
362 | size = atom_table_size; | ||
361 | } | 363 | } |
362 | 364 | ||
363 | if (!smu->smu_table.power_play_table) | 365 | if (!smu->smu_table.power_play_table) |
diff --git a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c index dd6fd1c8bf24..6a14497257e4 100644 --- a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c +++ b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c | |||
@@ -3050,6 +3050,7 @@ static int vega20_get_fan_speed_percent(struct smu_context *smu, | |||
3050 | 3050 | ||
3051 | static int vega20_get_gpu_power(struct smu_context *smu, uint32_t *value) | 3051 | static int vega20_get_gpu_power(struct smu_context *smu, uint32_t *value) |
3052 | { | 3052 | { |
3053 | uint32_t smu_version; | ||
3053 | int ret = 0; | 3054 | int ret = 0; |
3054 | SmuMetrics_t metrics; | 3055 | SmuMetrics_t metrics; |
3055 | 3056 | ||
@@ -3060,7 +3061,15 @@ static int vega20_get_gpu_power(struct smu_context *smu, uint32_t *value) | |||
3060 | if (ret) | 3061 | if (ret) |
3061 | return ret; | 3062 | return ret; |
3062 | 3063 | ||
3063 | *value = metrics.CurrSocketPower << 8; | 3064 | ret = smu_get_smc_version(smu, NULL, &smu_version); |
3065 | if (ret) | ||
3066 | return ret; | ||
3067 | |||
3068 | /* For the 40.46 release, they changed the value name */ | ||
3069 | if (smu_version == 0x282e00) | ||
3070 | *value = metrics.AverageSocketPower << 8; | ||
3071 | else | ||
3072 | *value = metrics.CurrSocketPower << 8; | ||
3064 | 3073 | ||
3065 | return 0; | 3074 | return 0; |
3066 | } | 3075 | } |
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_dev.c b/drivers/gpu/drm/arm/display/komeda/komeda_dev.c index 5a118984de33..9d4d5075cc64 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_dev.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_dev.c | |||
@@ -8,6 +8,7 @@ | |||
8 | #include <linux/iommu.h> | 8 | #include <linux/iommu.h> |
9 | #include <linux/of_device.h> | 9 | #include <linux/of_device.h> |
10 | #include <linux/of_graph.h> | 10 | #include <linux/of_graph.h> |
11 | #include <linux/of_reserved_mem.h> | ||
11 | #include <linux/platform_device.h> | 12 | #include <linux/platform_device.h> |
12 | #include <linux/dma-mapping.h> | 13 | #include <linux/dma-mapping.h> |
13 | #ifdef CONFIG_DEBUG_FS | 14 | #ifdef CONFIG_DEBUG_FS |
@@ -126,7 +127,7 @@ static int komeda_parse_pipe_dt(struct komeda_dev *mdev, struct device_node *np) | |||
126 | pipe->of_output_port = | 127 | pipe->of_output_port = |
127 | of_graph_get_port_by_id(np, KOMEDA_OF_PORT_OUTPUT); | 128 | of_graph_get_port_by_id(np, KOMEDA_OF_PORT_OUTPUT); |
128 | 129 | ||
129 | pipe->of_node = np; | 130 | pipe->of_node = of_node_get(np); |
130 | 131 | ||
131 | return 0; | 132 | return 0; |
132 | } | 133 | } |
@@ -143,6 +144,12 @@ static int komeda_parse_dt(struct device *dev, struct komeda_dev *mdev) | |||
143 | return mdev->irq; | 144 | return mdev->irq; |
144 | } | 145 | } |
145 | 146 | ||
147 | /* Get the optional framebuffer memory resource */ | ||
148 | ret = of_reserved_mem_device_init(dev); | ||
149 | if (ret && ret != -ENODEV) | ||
150 | return ret; | ||
151 | ret = 0; | ||
152 | |||
146 | for_each_available_child_of_node(np, child) { | 153 | for_each_available_child_of_node(np, child) { |
147 | if (of_node_cmp(child->name, "pipeline") == 0) { | 154 | if (of_node_cmp(child->name, "pipeline") == 0) { |
148 | ret = komeda_parse_pipe_dt(mdev, child); | 155 | ret = komeda_parse_pipe_dt(mdev, child); |
@@ -289,6 +296,8 @@ void komeda_dev_destroy(struct komeda_dev *mdev) | |||
289 | 296 | ||
290 | mdev->n_pipelines = 0; | 297 | mdev->n_pipelines = 0; |
291 | 298 | ||
299 | of_reserved_mem_device_release(dev); | ||
300 | |||
292 | if (funcs && funcs->cleanup) | 301 | if (funcs && funcs->cleanup) |
293 | funcs->cleanup(mdev); | 302 | funcs->cleanup(mdev); |
294 | 303 | ||
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_format_caps.c b/drivers/gpu/drm/arm/display/komeda/komeda_format_caps.c index cd4d9f53ddef..c9a1edb9a000 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_format_caps.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_format_caps.c | |||
@@ -35,6 +35,25 @@ komeda_get_format_caps(struct komeda_format_caps_table *table, | |||
35 | return NULL; | 35 | return NULL; |
36 | } | 36 | } |
37 | 37 | ||
38 | u32 komeda_get_afbc_format_bpp(const struct drm_format_info *info, u64 modifier) | ||
39 | { | ||
40 | u32 bpp; | ||
41 | |||
42 | switch (info->format) { | ||
43 | case DRM_FORMAT_YUV420_8BIT: | ||
44 | bpp = 12; | ||
45 | break; | ||
46 | case DRM_FORMAT_YUV420_10BIT: | ||
47 | bpp = 15; | ||
48 | break; | ||
49 | default: | ||
50 | bpp = info->cpp[0] * 8; | ||
51 | break; | ||
52 | } | ||
53 | |||
54 | return bpp; | ||
55 | } | ||
56 | |||
38 | /* Two assumptions | 57 | /* Two assumptions |
39 | * 1. RGB always has YTR | 58 | * 1. RGB always has YTR |
40 | * 2. Tiled RGB always has SC | 59 | * 2. Tiled RGB always has SC |
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_format_caps.h b/drivers/gpu/drm/arm/display/komeda/komeda_format_caps.h index 3631910d33b5..32273cf18f7c 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_format_caps.h +++ b/drivers/gpu/drm/arm/display/komeda/komeda_format_caps.h | |||
@@ -97,6 +97,9 @@ const struct komeda_format_caps * | |||
97 | komeda_get_format_caps(struct komeda_format_caps_table *table, | 97 | komeda_get_format_caps(struct komeda_format_caps_table *table, |
98 | u32 fourcc, u64 modifier); | 98 | u32 fourcc, u64 modifier); |
99 | 99 | ||
100 | u32 komeda_get_afbc_format_bpp(const struct drm_format_info *info, | ||
101 | u64 modifier); | ||
102 | |||
100 | u32 *komeda_get_layer_fourcc_list(struct komeda_format_caps_table *table, | 103 | u32 *komeda_get_layer_fourcc_list(struct komeda_format_caps_table *table, |
101 | u32 layer_type, u32 *n_fmts); | 104 | u32 layer_type, u32 *n_fmts); |
102 | 105 | ||
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.c b/drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.c index 3b0a70ed6aa0..1b01a625f40e 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.c | |||
@@ -43,7 +43,7 @@ komeda_fb_afbc_size_check(struct komeda_fb *kfb, struct drm_file *file, | |||
43 | struct drm_framebuffer *fb = &kfb->base; | 43 | struct drm_framebuffer *fb = &kfb->base; |
44 | const struct drm_format_info *info = fb->format; | 44 | const struct drm_format_info *info = fb->format; |
45 | struct drm_gem_object *obj; | 45 | struct drm_gem_object *obj; |
46 | u32 alignment_w = 0, alignment_h = 0, alignment_header, n_blocks; | 46 | u32 alignment_w = 0, alignment_h = 0, alignment_header, n_blocks, bpp; |
47 | u64 min_size; | 47 | u64 min_size; |
48 | 48 | ||
49 | obj = drm_gem_object_lookup(file, mode_cmd->handles[0]); | 49 | obj = drm_gem_object_lookup(file, mode_cmd->handles[0]); |
@@ -88,8 +88,9 @@ komeda_fb_afbc_size_check(struct komeda_fb *kfb, struct drm_file *file, | |||
88 | kfb->offset_payload = ALIGN(n_blocks * AFBC_HEADER_SIZE, | 88 | kfb->offset_payload = ALIGN(n_blocks * AFBC_HEADER_SIZE, |
89 | alignment_header); | 89 | alignment_header); |
90 | 90 | ||
91 | bpp = komeda_get_afbc_format_bpp(info, fb->modifier); | ||
91 | kfb->afbc_size = kfb->offset_payload + n_blocks * | 92 | kfb->afbc_size = kfb->offset_payload + n_blocks * |
92 | ALIGN(info->cpp[0] * AFBC_SUPERBLK_PIXELS, | 93 | ALIGN(bpp * AFBC_SUPERBLK_PIXELS / 8, |
93 | AFBC_SUPERBLK_ALIGNMENT); | 94 | AFBC_SUPERBLK_ALIGNMENT); |
94 | min_size = kfb->afbc_size + fb->offsets[0]; | 95 | min_size = kfb->afbc_size + fb->offsets[0]; |
95 | if (min_size > obj->size) { | 96 | if (min_size > obj->size) { |
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c index 419a8b0e5de8..69d9e26c60c8 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <drm/drm_gem_cma_helper.h> | 14 | #include <drm/drm_gem_cma_helper.h> |
15 | #include <drm/drm_gem_framebuffer_helper.h> | 15 | #include <drm/drm_gem_framebuffer_helper.h> |
16 | #include <drm/drm_irq.h> | 16 | #include <drm/drm_irq.h> |
17 | #include <drm/drm_probe_helper.h> | ||
17 | #include <drm/drm_vblank.h> | 18 | #include <drm/drm_vblank.h> |
18 | 19 | ||
19 | #include "komeda_dev.h" | 20 | #include "komeda_dev.h" |
@@ -146,7 +147,6 @@ static int komeda_crtc_normalize_zpos(struct drm_crtc *crtc, | |||
146 | struct komeda_crtc_state *kcrtc_st = to_kcrtc_st(crtc_st); | 147 | struct komeda_crtc_state *kcrtc_st = to_kcrtc_st(crtc_st); |
147 | struct komeda_plane_state *kplane_st; | 148 | struct komeda_plane_state *kplane_st; |
148 | struct drm_plane_state *plane_st; | 149 | struct drm_plane_state *plane_st; |
149 | struct drm_framebuffer *fb; | ||
150 | struct drm_plane *plane; | 150 | struct drm_plane *plane; |
151 | struct list_head zorder_list; | 151 | struct list_head zorder_list; |
152 | int order = 0, err; | 152 | int order = 0, err; |
@@ -172,7 +172,6 @@ static int komeda_crtc_normalize_zpos(struct drm_crtc *crtc, | |||
172 | 172 | ||
173 | list_for_each_entry(kplane_st, &zorder_list, zlist_node) { | 173 | list_for_each_entry(kplane_st, &zorder_list, zlist_node) { |
174 | plane_st = &kplane_st->base; | 174 | plane_st = &kplane_st->base; |
175 | fb = plane_st->fb; | ||
176 | plane = plane_st->plane; | 175 | plane = plane_st->plane; |
177 | 176 | ||
178 | plane_st->normalized_zpos = order++; | 177 | plane_st->normalized_zpos = order++; |
@@ -205,7 +204,7 @@ static int komeda_kms_check(struct drm_device *dev, | |||
205 | struct drm_atomic_state *state) | 204 | struct drm_atomic_state *state) |
206 | { | 205 | { |
207 | struct drm_crtc *crtc; | 206 | struct drm_crtc *crtc; |
208 | struct drm_crtc_state *old_crtc_st, *new_crtc_st; | 207 | struct drm_crtc_state *new_crtc_st; |
209 | int i, err; | 208 | int i, err; |
210 | 209 | ||
211 | err = drm_atomic_helper_check_modeset(dev, state); | 210 | err = drm_atomic_helper_check_modeset(dev, state); |
@@ -216,7 +215,7 @@ static int komeda_kms_check(struct drm_device *dev, | |||
216 | * so need to add all affected_planes (even unchanged) to | 215 | * so need to add all affected_planes (even unchanged) to |
217 | * drm_atomic_state. | 216 | * drm_atomic_state. |
218 | */ | 217 | */ |
219 | for_each_oldnew_crtc_in_state(state, crtc, old_crtc_st, new_crtc_st, i) { | 218 | for_each_new_crtc_in_state(state, crtc, new_crtc_st, i) { |
220 | err = drm_atomic_add_affected_planes(state, crtc); | 219 | err = drm_atomic_add_affected_planes(state, crtc); |
221 | if (err) | 220 | if (err) |
222 | return err; | 221 | return err; |
@@ -307,24 +306,33 @@ struct komeda_kms_dev *komeda_kms_attach(struct komeda_dev *mdev) | |||
307 | komeda_kms_irq_handler, IRQF_SHARED, | 306 | komeda_kms_irq_handler, IRQF_SHARED, |
308 | drm->driver->name, drm); | 307 | drm->driver->name, drm); |
309 | if (err) | 308 | if (err) |
310 | goto cleanup_mode_config; | 309 | goto free_component_binding; |
311 | 310 | ||
312 | err = mdev->funcs->enable_irq(mdev); | 311 | err = mdev->funcs->enable_irq(mdev); |
313 | if (err) | 312 | if (err) |
314 | goto cleanup_mode_config; | 313 | goto free_component_binding; |
315 | 314 | ||
316 | drm->irq_enabled = true; | 315 | drm->irq_enabled = true; |
317 | 316 | ||
317 | drm_kms_helper_poll_init(drm); | ||
318 | |||
318 | err = drm_dev_register(drm, 0); | 319 | err = drm_dev_register(drm, 0); |
319 | if (err) | 320 | if (err) |
320 | goto cleanup_mode_config; | 321 | goto free_interrupts; |
321 | 322 | ||
322 | return kms; | 323 | return kms; |
323 | 324 | ||
324 | cleanup_mode_config: | 325 | free_interrupts: |
326 | drm_kms_helper_poll_fini(drm); | ||
325 | drm->irq_enabled = false; | 327 | drm->irq_enabled = false; |
328 | mdev->funcs->disable_irq(mdev); | ||
329 | free_component_binding: | ||
330 | component_unbind_all(mdev->dev, drm); | ||
331 | cleanup_mode_config: | ||
326 | drm_mode_config_cleanup(drm); | 332 | drm_mode_config_cleanup(drm); |
327 | komeda_kms_cleanup_private_objs(kms); | 333 | komeda_kms_cleanup_private_objs(kms); |
334 | drm->dev_private = NULL; | ||
335 | drm_dev_put(drm); | ||
328 | free_kms: | 336 | free_kms: |
329 | kfree(kms); | 337 | kfree(kms); |
330 | return ERR_PTR(err); | 338 | return ERR_PTR(err); |
@@ -335,12 +343,14 @@ void komeda_kms_detach(struct komeda_kms_dev *kms) | |||
335 | struct drm_device *drm = &kms->base; | 343 | struct drm_device *drm = &kms->base; |
336 | struct komeda_dev *mdev = drm->dev_private; | 344 | struct komeda_dev *mdev = drm->dev_private; |
337 | 345 | ||
346 | drm_dev_unregister(drm); | ||
347 | drm_kms_helper_poll_fini(drm); | ||
348 | drm_atomic_helper_shutdown(drm); | ||
338 | drm->irq_enabled = false; | 349 | drm->irq_enabled = false; |
339 | mdev->funcs->disable_irq(mdev); | 350 | mdev->funcs->disable_irq(mdev); |
340 | drm_dev_unregister(drm); | ||
341 | component_unbind_all(mdev->dev, drm); | 351 | component_unbind_all(mdev->dev, drm); |
342 | komeda_kms_cleanup_private_objs(kms); | ||
343 | drm_mode_config_cleanup(drm); | 352 | drm_mode_config_cleanup(drm); |
353 | komeda_kms_cleanup_private_objs(kms); | ||
344 | drm->dev_private = NULL; | 354 | drm->dev_private = NULL; |
345 | drm_dev_put(drm); | 355 | drm_dev_put(drm); |
346 | } | 356 | } |
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h index a90bcbb3cb23..14b683164544 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h +++ b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h | |||
@@ -480,6 +480,7 @@ void komeda_pipeline_dump_register(struct komeda_pipeline *pipe, | |||
480 | struct seq_file *sf); | 480 | struct seq_file *sf); |
481 | 481 | ||
482 | /* component APIs */ | 482 | /* component APIs */ |
483 | extern __printf(10, 11) | ||
483 | struct komeda_component * | 484 | struct komeda_component * |
484 | komeda_component_add(struct komeda_pipeline *pipe, | 485 | komeda_component_add(struct komeda_pipeline *pipe, |
485 | size_t comp_sz, u32 id, u32 hw_id, | 486 | size_t comp_sz, u32 id, u32 hw_id, |
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c index 617e1f7b8472..2851cac94d86 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c | |||
@@ -148,7 +148,7 @@ static int komeda_wb_connector_add(struct komeda_kms_dev *kms, | |||
148 | if (!kcrtc->master->wb_layer) | 148 | if (!kcrtc->master->wb_layer) |
149 | return 0; | 149 | return 0; |
150 | 150 | ||
151 | kwb_conn = kzalloc(sizeof(*wb_conn), GFP_KERNEL); | 151 | kwb_conn = kzalloc(sizeof(*kwb_conn), GFP_KERNEL); |
152 | if (!kwb_conn) | 152 | if (!kwb_conn) |
153 | return -ENOMEM; | 153 | return -ENOMEM; |
154 | 154 | ||
diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index 7925a176f900..1cb1fa74cfbc 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c | |||
@@ -1465,8 +1465,8 @@ static void ddi_dotclock_get(struct intel_crtc_state *pipe_config) | |||
1465 | else if (intel_crtc_has_dp_encoder(pipe_config)) | 1465 | else if (intel_crtc_has_dp_encoder(pipe_config)) |
1466 | dotclock = intel_dotclock_calculate(pipe_config->port_clock, | 1466 | dotclock = intel_dotclock_calculate(pipe_config->port_clock, |
1467 | &pipe_config->dp_m_n); | 1467 | &pipe_config->dp_m_n); |
1468 | else if (pipe_config->has_hdmi_sink && pipe_config->pipe_bpp == 36) | 1468 | else if (pipe_config->has_hdmi_sink && pipe_config->pipe_bpp > 24) |
1469 | dotclock = pipe_config->port_clock * 2 / 3; | 1469 | dotclock = pipe_config->port_clock * 24 / pipe_config->pipe_bpp; |
1470 | else | 1470 | else |
1471 | dotclock = pipe_config->port_clock; | 1471 | dotclock = pipe_config->port_clock; |
1472 | 1472 | ||
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c index 60652ebbdf61..18e4cba76720 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c | |||
@@ -539,7 +539,15 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo | |||
539 | 539 | ||
540 | intel_attach_force_audio_property(connector); | 540 | intel_attach_force_audio_property(connector); |
541 | intel_attach_broadcast_rgb_property(connector); | 541 | intel_attach_broadcast_rgb_property(connector); |
542 | drm_connector_attach_max_bpc_property(connector, 6, 12); | 542 | |
543 | /* | ||
544 | * Reuse the prop from the SST connector because we're | ||
545 | * not allowed to create new props after device registration. | ||
546 | */ | ||
547 | connector->max_bpc_property = | ||
548 | intel_dp->attached_connector->base.max_bpc_property; | ||
549 | if (connector->max_bpc_property) | ||
550 | drm_connector_attach_max_bpc_property(connector, 6, 12); | ||
543 | 551 | ||
544 | return connector; | 552 | return connector; |
545 | 553 | ||
diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c b/drivers/gpu/drm/i915/display/intel_vdsc.c index ffec807b8960..f413904a3e96 100644 --- a/drivers/gpu/drm/i915/display/intel_vdsc.c +++ b/drivers/gpu/drm/i915/display/intel_vdsc.c | |||
@@ -541,7 +541,7 @@ static void intel_configure_pps_for_dsc_encoder(struct intel_encoder *encoder, | |||
541 | pps_val |= DSC_PIC_HEIGHT(vdsc_cfg->pic_height) | | 541 | pps_val |= DSC_PIC_HEIGHT(vdsc_cfg->pic_height) | |
542 | DSC_PIC_WIDTH(vdsc_cfg->pic_width / num_vdsc_instances); | 542 | DSC_PIC_WIDTH(vdsc_cfg->pic_width / num_vdsc_instances); |
543 | DRM_INFO("PPS2 = 0x%08x\n", pps_val); | 543 | DRM_INFO("PPS2 = 0x%08x\n", pps_val); |
544 | if (encoder->type == INTEL_OUTPUT_EDP) { | 544 | if (cpu_transcoder == TRANSCODER_EDP) { |
545 | I915_WRITE(DSCA_PICTURE_PARAMETER_SET_2, pps_val); | 545 | I915_WRITE(DSCA_PICTURE_PARAMETER_SET_2, pps_val); |
546 | /* | 546 | /* |
547 | * If 2 VDSC instances are needed, configure PPS for second | 547 | * If 2 VDSC instances are needed, configure PPS for second |
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index f62e3397d936..bac1ee94f63f 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -1598,6 +1598,12 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv) | |||
1598 | 1598 | ||
1599 | pci_set_master(pdev); | 1599 | pci_set_master(pdev); |
1600 | 1600 | ||
1601 | /* | ||
1602 | * We don't have a max segment size, so set it to the max so sg's | ||
1603 | * debugging layer doesn't complain | ||
1604 | */ | ||
1605 | dma_set_max_seg_size(&pdev->dev, UINT_MAX); | ||
1606 | |||
1601 | /* overlay on gen2 is broken and can't address above 1G */ | 1607 | /* overlay on gen2 is broken and can't address above 1G */ |
1602 | if (IS_GEN(dev_priv, 2)) { | 1608 | if (IS_GEN(dev_priv, 2)) { |
1603 | ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(30)); | 1609 | ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(30)); |
diff --git a/drivers/gpu/drm/i915/i915_vgpu.c b/drivers/gpu/drm/i915/i915_vgpu.c index 94d3992b599d..724627afdedc 100644 --- a/drivers/gpu/drm/i915/i915_vgpu.c +++ b/drivers/gpu/drm/i915/i915_vgpu.c | |||
@@ -101,6 +101,9 @@ static struct _balloon_info_ bl_info; | |||
101 | static void vgt_deballoon_space(struct i915_ggtt *ggtt, | 101 | static void vgt_deballoon_space(struct i915_ggtt *ggtt, |
102 | struct drm_mm_node *node) | 102 | struct drm_mm_node *node) |
103 | { | 103 | { |
104 | if (!drm_mm_node_allocated(node)) | ||
105 | return; | ||
106 | |||
104 | DRM_DEBUG_DRIVER("deballoon space: range [0x%llx - 0x%llx] %llu KiB.\n", | 107 | DRM_DEBUG_DRIVER("deballoon space: range [0x%llx - 0x%llx] %llu KiB.\n", |
105 | node->start, | 108 | node->start, |
106 | node->start + node->size, | 109 | node->start + node->size, |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 1d58f7ec5d84..f11979879e7b 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -829,7 +829,7 @@ struct intel_crtc_state { | |||
829 | 829 | ||
830 | /* | 830 | /* |
831 | * Frequence the dpll for the port should run at. Differs from the | 831 | * Frequence the dpll for the port should run at. Differs from the |
832 | * adjusted dotclock e.g. for DP or 12bpc hdmi mode. This is also | 832 | * adjusted dotclock e.g. for DP or 10/12bpc hdmi mode. This is also |
833 | * already multiplied by pixel_multiplier. | 833 | * already multiplied by pixel_multiplier. |
834 | */ | 834 | */ |
835 | int port_clock; | 835 | int port_clock; |
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c index 95fdbd0fbcac..945bc20f1d33 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/of_address.h> | 17 | #include <linux/of_address.h> |
18 | #include <linux/of_platform.h> | 18 | #include <linux/of_platform.h> |
19 | #include <linux/pm_runtime.h> | 19 | #include <linux/pm_runtime.h> |
20 | #include <linux/dma-mapping.h> | ||
20 | 21 | ||
21 | #include "mtk_drm_crtc.h" | 22 | #include "mtk_drm_crtc.h" |
22 | #include "mtk_drm_ddp.h" | 23 | #include "mtk_drm_ddp.h" |
@@ -213,6 +214,7 @@ static int mtk_drm_kms_init(struct drm_device *drm) | |||
213 | struct mtk_drm_private *private = drm->dev_private; | 214 | struct mtk_drm_private *private = drm->dev_private; |
214 | struct platform_device *pdev; | 215 | struct platform_device *pdev; |
215 | struct device_node *np; | 216 | struct device_node *np; |
217 | struct device *dma_dev; | ||
216 | int ret; | 218 | int ret; |
217 | 219 | ||
218 | if (!iommu_present(&platform_bus_type)) | 220 | if (!iommu_present(&platform_bus_type)) |
@@ -275,7 +277,29 @@ static int mtk_drm_kms_init(struct drm_device *drm) | |||
275 | goto err_component_unbind; | 277 | goto err_component_unbind; |
276 | } | 278 | } |
277 | 279 | ||
278 | private->dma_dev = &pdev->dev; | 280 | dma_dev = &pdev->dev; |
281 | private->dma_dev = dma_dev; | ||
282 | |||
283 | /* | ||
284 | * Configure the DMA segment size to make sure we get contiguous IOVA | ||
285 | * when importing PRIME buffers. | ||
286 | */ | ||
287 | if (!dma_dev->dma_parms) { | ||
288 | private->dma_parms_allocated = true; | ||
289 | dma_dev->dma_parms = | ||
290 | devm_kzalloc(drm->dev, sizeof(*dma_dev->dma_parms), | ||
291 | GFP_KERNEL); | ||
292 | } | ||
293 | if (!dma_dev->dma_parms) { | ||
294 | ret = -ENOMEM; | ||
295 | goto err_component_unbind; | ||
296 | } | ||
297 | |||
298 | ret = dma_set_max_seg_size(dma_dev, (unsigned int)DMA_BIT_MASK(32)); | ||
299 | if (ret) { | ||
300 | dev_err(dma_dev, "Failed to set DMA segment size\n"); | ||
301 | goto err_unset_dma_parms; | ||
302 | } | ||
279 | 303 | ||
280 | /* | 304 | /* |
281 | * We don't use the drm_irq_install() helpers provided by the DRM | 305 | * We don't use the drm_irq_install() helpers provided by the DRM |
@@ -285,13 +309,16 @@ static int mtk_drm_kms_init(struct drm_device *drm) | |||
285 | drm->irq_enabled = true; | 309 | drm->irq_enabled = true; |
286 | ret = drm_vblank_init(drm, MAX_CRTC); | 310 | ret = drm_vblank_init(drm, MAX_CRTC); |
287 | if (ret < 0) | 311 | if (ret < 0) |
288 | goto err_component_unbind; | 312 | goto err_unset_dma_parms; |
289 | 313 | ||
290 | drm_kms_helper_poll_init(drm); | 314 | drm_kms_helper_poll_init(drm); |
291 | drm_mode_config_reset(drm); | 315 | drm_mode_config_reset(drm); |
292 | 316 | ||
293 | return 0; | 317 | return 0; |
294 | 318 | ||
319 | err_unset_dma_parms: | ||
320 | if (private->dma_parms_allocated) | ||
321 | dma_dev->dma_parms = NULL; | ||
295 | err_component_unbind: | 322 | err_component_unbind: |
296 | component_unbind_all(drm->dev, drm); | 323 | component_unbind_all(drm->dev, drm); |
297 | err_config_cleanup: | 324 | err_config_cleanup: |
@@ -302,9 +329,14 @@ err_config_cleanup: | |||
302 | 329 | ||
303 | static void mtk_drm_kms_deinit(struct drm_device *drm) | 330 | static void mtk_drm_kms_deinit(struct drm_device *drm) |
304 | { | 331 | { |
332 | struct mtk_drm_private *private = drm->dev_private; | ||
333 | |||
305 | drm_kms_helper_poll_fini(drm); | 334 | drm_kms_helper_poll_fini(drm); |
306 | drm_atomic_helper_shutdown(drm); | 335 | drm_atomic_helper_shutdown(drm); |
307 | 336 | ||
337 | if (private->dma_parms_allocated) | ||
338 | private->dma_dev->dma_parms = NULL; | ||
339 | |||
308 | component_unbind_all(drm->dev, drm); | 340 | component_unbind_all(drm->dev, drm); |
309 | drm_mode_config_cleanup(drm); | 341 | drm_mode_config_cleanup(drm); |
310 | } | 342 | } |
@@ -320,6 +352,18 @@ static const struct file_operations mtk_drm_fops = { | |||
320 | .compat_ioctl = drm_compat_ioctl, | 352 | .compat_ioctl = drm_compat_ioctl, |
321 | }; | 353 | }; |
322 | 354 | ||
355 | /* | ||
356 | * We need to override this because the device used to import the memory is | ||
357 | * not dev->dev, as drm_gem_prime_import() expects. | ||
358 | */ | ||
359 | struct drm_gem_object *mtk_drm_gem_prime_import(struct drm_device *dev, | ||
360 | struct dma_buf *dma_buf) | ||
361 | { | ||
362 | struct mtk_drm_private *private = dev->dev_private; | ||
363 | |||
364 | return drm_gem_prime_import_dev(dev, dma_buf, private->dma_dev); | ||
365 | } | ||
366 | |||
323 | static struct drm_driver mtk_drm_driver = { | 367 | static struct drm_driver mtk_drm_driver = { |
324 | .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | | 368 | .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | |
325 | DRIVER_ATOMIC, | 369 | DRIVER_ATOMIC, |
@@ -331,7 +375,7 @@ static struct drm_driver mtk_drm_driver = { | |||
331 | .prime_handle_to_fd = drm_gem_prime_handle_to_fd, | 375 | .prime_handle_to_fd = drm_gem_prime_handle_to_fd, |
332 | .prime_fd_to_handle = drm_gem_prime_fd_to_handle, | 376 | .prime_fd_to_handle = drm_gem_prime_fd_to_handle, |
333 | .gem_prime_export = drm_gem_prime_export, | 377 | .gem_prime_export = drm_gem_prime_export, |
334 | .gem_prime_import = drm_gem_prime_import, | 378 | .gem_prime_import = mtk_drm_gem_prime_import, |
335 | .gem_prime_get_sg_table = mtk_gem_prime_get_sg_table, | 379 | .gem_prime_get_sg_table = mtk_gem_prime_get_sg_table, |
336 | .gem_prime_import_sg_table = mtk_gem_prime_import_sg_table, | 380 | .gem_prime_import_sg_table = mtk_gem_prime_import_sg_table, |
337 | .gem_prime_mmap = mtk_drm_gem_mmap_buf, | 381 | .gem_prime_mmap = mtk_drm_gem_mmap_buf, |
@@ -524,12 +568,15 @@ static int mtk_drm_probe(struct platform_device *pdev) | |||
524 | comp = devm_kzalloc(dev, sizeof(*comp), GFP_KERNEL); | 568 | comp = devm_kzalloc(dev, sizeof(*comp), GFP_KERNEL); |
525 | if (!comp) { | 569 | if (!comp) { |
526 | ret = -ENOMEM; | 570 | ret = -ENOMEM; |
571 | of_node_put(node); | ||
527 | goto err_node; | 572 | goto err_node; |
528 | } | 573 | } |
529 | 574 | ||
530 | ret = mtk_ddp_comp_init(dev, node, comp, comp_id, NULL); | 575 | ret = mtk_ddp_comp_init(dev, node, comp, comp_id, NULL); |
531 | if (ret) | 576 | if (ret) { |
577 | of_node_put(node); | ||
532 | goto err_node; | 578 | goto err_node; |
579 | } | ||
533 | 580 | ||
534 | private->ddp_comp[comp_id] = comp; | 581 | private->ddp_comp[comp_id] = comp; |
535 | } | 582 | } |
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h b/drivers/gpu/drm/mediatek/mtk_drm_drv.h index 598ff3e70446..e03fea12ff59 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h | |||
@@ -51,6 +51,8 @@ struct mtk_drm_private { | |||
51 | } commit; | 51 | } commit; |
52 | 52 | ||
53 | struct drm_atomic_state *suspend_state; | 53 | struct drm_atomic_state *suspend_state; |
54 | |||
55 | bool dma_parms_allocated; | ||
54 | }; | 56 | }; |
55 | 57 | ||
56 | extern struct platform_driver mtk_ddp_driver; | 58 | extern struct platform_driver mtk_ddp_driver; |
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.c b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.c index b4e7404fe660..a11637b0f6cc 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.c | |||
@@ -40,8 +40,7 @@ nvkm_i2c_aux_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) | |||
40 | u8 *ptr = msg->buf; | 40 | u8 *ptr = msg->buf; |
41 | 41 | ||
42 | while (remaining) { | 42 | while (remaining) { |
43 | u8 cnt = (remaining > 16) ? 16 : remaining; | 43 | u8 cnt, retries, cmd; |
44 | u8 cmd; | ||
45 | 44 | ||
46 | if (msg->flags & I2C_M_RD) | 45 | if (msg->flags & I2C_M_RD) |
47 | cmd = 1; | 46 | cmd = 1; |
@@ -51,10 +50,19 @@ nvkm_i2c_aux_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) | |||
51 | if (mcnt || remaining > 16) | 50 | if (mcnt || remaining > 16) |
52 | cmd |= 4; /* MOT */ | 51 | cmd |= 4; /* MOT */ |
53 | 52 | ||
54 | ret = aux->func->xfer(aux, true, cmd, msg->addr, ptr, &cnt); | 53 | for (retries = 0, cnt = 0; |
55 | if (ret < 0) { | 54 | retries < 32 && !cnt; |
56 | nvkm_i2c_aux_release(aux); | 55 | retries++) { |
57 | return ret; | 56 | cnt = min_t(u8, remaining, 16); |
57 | ret = aux->func->xfer(aux, true, cmd, | ||
58 | msg->addr, ptr, &cnt); | ||
59 | if (ret < 0) | ||
60 | goto out; | ||
61 | } | ||
62 | if (!cnt) { | ||
63 | AUX_TRACE(aux, "no data after 32 retries"); | ||
64 | ret = -EIO; | ||
65 | goto out; | ||
58 | } | 66 | } |
59 | 67 | ||
60 | ptr += cnt; | 68 | ptr += cnt; |
@@ -64,8 +72,10 @@ nvkm_i2c_aux_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) | |||
64 | msg++; | 72 | msg++; |
65 | } | 73 | } |
66 | 74 | ||
75 | ret = num; | ||
76 | out: | ||
67 | nvkm_i2c_aux_release(aux); | 77 | nvkm_i2c_aux_release(aux); |
68 | return num; | 78 | return ret; |
69 | } | 79 | } |
70 | 80 | ||
71 | static u32 | 81 | static u32 |
diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c index de0f882f0f7b..14b41de44ebc 100644 --- a/drivers/gpu/drm/omapdrm/dss/output.c +++ b/drivers/gpu/drm/omapdrm/dss/output.c | |||
@@ -4,6 +4,7 @@ | |||
4 | * Author: Archit Taneja <archit@ti.com> | 4 | * Author: Archit Taneja <archit@ti.com> |
5 | */ | 5 | */ |
6 | 6 | ||
7 | #include <linux/bitops.h> | ||
7 | #include <linux/kernel.h> | 8 | #include <linux/kernel.h> |
8 | #include <linux/module.h> | 9 | #include <linux/module.h> |
9 | #include <linux/platform_device.h> | 10 | #include <linux/platform_device.h> |
@@ -20,7 +21,8 @@ int omapdss_device_init_output(struct omap_dss_device *out) | |||
20 | { | 21 | { |
21 | struct device_node *remote_node; | 22 | struct device_node *remote_node; |
22 | 23 | ||
23 | remote_node = of_graph_get_remote_node(out->dev->of_node, 0, 0); | 24 | remote_node = of_graph_get_remote_node(out->dev->of_node, |
25 | ffs(out->of_ports) - 1, 0); | ||
24 | if (!remote_node) { | 26 | if (!remote_node) { |
25 | dev_dbg(out->dev, "failed to find video sink\n"); | 27 | dev_dbg(out->dev, "failed to find video sink\n"); |
26 | return 0; | 28 | return 0; |
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index 288c59dae56a..1bad0a2cc5c6 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c | |||
@@ -669,7 +669,7 @@ static int pdev_probe(struct platform_device *pdev) | |||
669 | if (omapdss_is_initialized() == false) | 669 | if (omapdss_is_initialized() == false) |
670 | return -EPROBE_DEFER; | 670 | return -EPROBE_DEFER; |
671 | 671 | ||
672 | ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); | 672 | ret = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); |
673 | if (ret) { | 673 | if (ret) { |
674 | dev_err(&pdev->dev, "Failed to set the DMA mask\n"); | 674 | dev_err(&pdev->dev, "Failed to set the DMA mask\n"); |
675 | return ret; | 675 | return ret; |
diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c index f33e349c4ec5..952201c6d821 100644 --- a/drivers/gpu/drm/qxl/qxl_drv.c +++ b/drivers/gpu/drm/qxl/qxl_drv.c | |||
@@ -59,6 +59,11 @@ module_param_named(num_heads, qxl_num_crtc, int, 0400); | |||
59 | static struct drm_driver qxl_driver; | 59 | static struct drm_driver qxl_driver; |
60 | static struct pci_driver qxl_pci_driver; | 60 | static struct pci_driver qxl_pci_driver; |
61 | 61 | ||
62 | static bool is_vga(struct pci_dev *pdev) | ||
63 | { | ||
64 | return pdev->class == PCI_CLASS_DISPLAY_VGA << 8; | ||
65 | } | ||
66 | |||
62 | static int | 67 | static int |
63 | qxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | 68 | qxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
64 | { | 69 | { |
@@ -83,9 +88,17 @@ qxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
83 | if (ret) | 88 | if (ret) |
84 | goto disable_pci; | 89 | goto disable_pci; |
85 | 90 | ||
91 | if (is_vga(pdev)) { | ||
92 | ret = vga_get_interruptible(pdev, VGA_RSRC_LEGACY_IO); | ||
93 | if (ret) { | ||
94 | DRM_ERROR("can't get legacy vga ioports\n"); | ||
95 | goto disable_pci; | ||
96 | } | ||
97 | } | ||
98 | |||
86 | ret = qxl_device_init(qdev, &qxl_driver, pdev); | 99 | ret = qxl_device_init(qdev, &qxl_driver, pdev); |
87 | if (ret) | 100 | if (ret) |
88 | goto disable_pci; | 101 | goto put_vga; |
89 | 102 | ||
90 | ret = qxl_modeset_init(qdev); | 103 | ret = qxl_modeset_init(qdev); |
91 | if (ret) | 104 | if (ret) |
@@ -105,6 +118,9 @@ modeset_cleanup: | |||
105 | qxl_modeset_fini(qdev); | 118 | qxl_modeset_fini(qdev); |
106 | unload: | 119 | unload: |
107 | qxl_device_fini(qdev); | 120 | qxl_device_fini(qdev); |
121 | put_vga: | ||
122 | if (is_vga(pdev)) | ||
123 | vga_put(pdev, VGA_RSRC_LEGACY_IO); | ||
108 | disable_pci: | 124 | disable_pci: |
109 | pci_disable_device(pdev); | 125 | pci_disable_device(pdev); |
110 | free_dev: | 126 | free_dev: |
@@ -122,6 +138,8 @@ qxl_pci_remove(struct pci_dev *pdev) | |||
122 | 138 | ||
123 | qxl_modeset_fini(qdev); | 139 | qxl_modeset_fini(qdev); |
124 | qxl_device_fini(qdev); | 140 | qxl_device_fini(qdev); |
141 | if (is_vga(pdev)) | ||
142 | vga_put(pdev, VGA_RSRC_LEGACY_IO); | ||
125 | 143 | ||
126 | dev->dev_private = NULL; | 144 | dev->dev_private = NULL; |
127 | kfree(qdev); | 145 | kfree(qdev); |
diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.c b/drivers/gpu/drm/rcar-du/rcar_lvds.c index 1c62578590f4..082d02c84024 100644 --- a/drivers/gpu/drm/rcar-du/rcar_lvds.c +++ b/drivers/gpu/drm/rcar-du/rcar_lvds.c | |||
@@ -673,10 +673,8 @@ static int rcar_lvds_parse_dt_companion(struct rcar_lvds *lvds) | |||
673 | 673 | ||
674 | /* Locate the companion LVDS encoder for dual-link operation, if any. */ | 674 | /* Locate the companion LVDS encoder for dual-link operation, if any. */ |
675 | companion = of_parse_phandle(dev->of_node, "renesas,companion", 0); | 675 | companion = of_parse_phandle(dev->of_node, "renesas,companion", 0); |
676 | if (!companion) { | 676 | if (!companion) |
677 | dev_err(dev, "Companion LVDS encoder not found\n"); | 677 | return 0; |
678 | return -ENXIO; | ||
679 | } | ||
680 | 678 | ||
681 | /* | 679 | /* |
682 | * Sanity check: the companion encoder must have the same compatible | 680 | * Sanity check: the companion encoder must have the same compatible |
diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c index 64c43ee6bd92..df0cc8f46d7b 100644 --- a/drivers/gpu/drm/sun4i/sun4i_tcon.c +++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c | |||
@@ -314,6 +314,7 @@ static void sun4i_tcon0_mode_set_dithering(struct sun4i_tcon *tcon, | |||
314 | /* R and B components are only 5 bits deep */ | 314 | /* R and B components are only 5 bits deep */ |
315 | val |= SUN4I_TCON0_FRM_CTL_MODE_R; | 315 | val |= SUN4I_TCON0_FRM_CTL_MODE_R; |
316 | val |= SUN4I_TCON0_FRM_CTL_MODE_B; | 316 | val |= SUN4I_TCON0_FRM_CTL_MODE_B; |
317 | /* Fall through */ | ||
317 | case MEDIA_BUS_FMT_RGB666_1X18: | 318 | case MEDIA_BUS_FMT_RGB666_1X18: |
318 | case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: | 319 | case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: |
319 | /* Fall through: enable dithering */ | 320 | /* Fall through: enable dithering */ |
diff --git a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c index a1fc8b520985..b889ad3e86e1 100644 --- a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c +++ b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c | |||
@@ -993,6 +993,7 @@ static ssize_t sun6i_dsi_transfer(struct mipi_dsi_host *host, | |||
993 | ret = sun6i_dsi_dcs_read(dsi, msg); | 993 | ret = sun6i_dsi_dcs_read(dsi, msg); |
994 | break; | 994 | break; |
995 | } | 995 | } |
996 | /* Else, fall through */ | ||
996 | 997 | ||
997 | default: | 998 | default: |
998 | ret = -EINVAL; | 999 | ret = -EINVAL; |
diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c index b2da31310d24..09b526518f5a 100644 --- a/drivers/gpu/drm/virtio/virtgpu_object.c +++ b/drivers/gpu/drm/virtio/virtgpu_object.c | |||
@@ -204,6 +204,7 @@ int virtio_gpu_object_get_sg_table(struct virtio_gpu_device *qdev, | |||
204 | .interruptible = false, | 204 | .interruptible = false, |
205 | .no_wait_gpu = false | 205 | .no_wait_gpu = false |
206 | }; | 206 | }; |
207 | size_t max_segment; | ||
207 | 208 | ||
208 | /* wtf swapping */ | 209 | /* wtf swapping */ |
209 | if (bo->pages) | 210 | if (bo->pages) |
@@ -215,8 +216,13 @@ int virtio_gpu_object_get_sg_table(struct virtio_gpu_device *qdev, | |||
215 | if (!bo->pages) | 216 | if (!bo->pages) |
216 | goto out; | 217 | goto out; |
217 | 218 | ||
218 | ret = sg_alloc_table_from_pages(bo->pages, pages, nr_pages, 0, | 219 | max_segment = virtio_max_dma_size(qdev->vdev); |
219 | nr_pages << PAGE_SHIFT, GFP_KERNEL); | 220 | max_segment &= PAGE_MASK; |
221 | if (max_segment > SCATTERLIST_MAX_SEGMENT) | ||
222 | max_segment = SCATTERLIST_MAX_SEGMENT; | ||
223 | ret = __sg_alloc_table_from_pages(bo->pages, pages, nr_pages, 0, | ||
224 | nr_pages << PAGE_SHIFT, | ||
225 | max_segment, GFP_KERNEL); | ||
220 | if (ret) | 226 | if (ret) |
221 | goto out; | 227 | goto out; |
222 | return 0; | 228 | return 0; |