Skip to content

Commit 5911d02

Browse files
Lewis Huangalexdeucher
authored andcommitted
drm/amd/display: Change the DMCUB mailbox memory location from FB to inbox
[WHY] Flush command sent to DMCUB spends more time for execution on a dGPU than on an APU. This causes cursor lag when using high refresh rate mouses. [HOW] 1. Change the DMCUB mailbox memory location from FB to inbox. 2. Only change windows memory to inbox. Cc: Mario Limonciello <mario.limonciello@amd.com> Cc: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> Acked-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Lewis Huang <lewis.huang@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 9ddea8c commit 5911d02

3 files changed

Lines changed: 45 additions & 22 deletions

File tree

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2079,7 +2079,7 @@ static int dm_dmub_sw_init(struct amdgpu_device *adev)
20792079
struct dmub_srv_create_params create_params;
20802080
struct dmub_srv_region_params region_params;
20812081
struct dmub_srv_region_info region_info;
2082-
struct dmub_srv_fb_params fb_params;
2082+
struct dmub_srv_memory_params memory_params;
20832083
struct dmub_srv_fb_info *fb_info;
20842084
struct dmub_srv *dmub_srv;
20852085
const struct dmcub_firmware_header_v1_0 *hdr;
@@ -2182,6 +2182,7 @@ static int dm_dmub_sw_init(struct amdgpu_device *adev)
21822182
adev->dm.dmub_fw->data +
21832183
le32_to_cpu(hdr->header.ucode_array_offset_bytes) +
21842184
PSP_HEADER_BYTES;
2185+
region_params.is_mailbox_in_inbox = false;
21852186

21862187
status = dmub_srv_calc_region_info(dmub_srv, &region_params,
21872188
&region_info);
@@ -2205,10 +2206,10 @@ static int dm_dmub_sw_init(struct amdgpu_device *adev)
22052206
return r;
22062207

22072208
/* Rebase the regions on the framebuffer address. */
2208-
memset(&fb_params, 0, sizeof(fb_params));
2209-
fb_params.cpu_addr = adev->dm.dmub_bo_cpu_addr;
2210-
fb_params.gpu_addr = adev->dm.dmub_bo_gpu_addr;
2211-
fb_params.region_info = &region_info;
2209+
memset(&memory_params, 0, sizeof(memory_params));
2210+
memory_params.cpu_fb_addr = adev->dm.dmub_bo_cpu_addr;
2211+
memory_params.gpu_fb_addr = adev->dm.dmub_bo_gpu_addr;
2212+
memory_params.region_info = &region_info;
22122213

22132214
adev->dm.dmub_fb_info =
22142215
kzalloc(sizeof(*adev->dm.dmub_fb_info), GFP_KERNEL);
@@ -2220,7 +2221,7 @@ static int dm_dmub_sw_init(struct amdgpu_device *adev)
22202221
return -ENOMEM;
22212222
}
22222223

2223-
status = dmub_srv_calc_fb_info(dmub_srv, &fb_params, fb_info);
2224+
status = dmub_srv_calc_mem_info(dmub_srv, &memory_params, fb_info);
22242225
if (status != DMUB_STATUS_OK) {
22252226
DRM_ERROR("Error calculating DMUB FB info: %d\n", status);
22262227
return -EINVAL;

drivers/gpu/drm/amd/display/dmub/dmub_srv.h

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ struct dmub_srv_region_params {
195195
uint32_t vbios_size;
196196
const uint8_t *fw_inst_const;
197197
const uint8_t *fw_bss_data;
198+
bool is_mailbox_in_inbox;
198199
};
199200

200201
/**
@@ -214,20 +215,25 @@ struct dmub_srv_region_params {
214215
*/
215216
struct dmub_srv_region_info {
216217
uint32_t fb_size;
218+
uint32_t inbox_size;
217219
uint8_t num_regions;
218220
struct dmub_region regions[DMUB_WINDOW_TOTAL];
219221
};
220222

221223
/**
222-
* struct dmub_srv_fb_params - parameters used for driver fb setup
224+
* struct dmub_srv_memory_params - parameters used for driver fb setup
223225
* @region_info: region info calculated by dmub service
224-
* @cpu_addr: base cpu address for the framebuffer
225-
* @gpu_addr: base gpu virtual address for the framebuffer
226+
* @cpu_fb_addr: base cpu address for the framebuffer
227+
* @cpu_inbox_addr: base cpu address for the gart
228+
* @gpu_fb_addr: base gpu virtual address for the framebuffer
229+
* @gpu_inbox_addr: base gpu virtual address for the gart
226230
*/
227-
struct dmub_srv_fb_params {
231+
struct dmub_srv_memory_params {
228232
const struct dmub_srv_region_info *region_info;
229-
void *cpu_addr;
230-
uint64_t gpu_addr;
233+
void *cpu_fb_addr;
234+
void *cpu_inbox_addr;
235+
uint64_t gpu_fb_addr;
236+
uint64_t gpu_inbox_addr;
231237
};
232238

233239
/**
@@ -563,8 +569,8 @@ dmub_srv_calc_region_info(struct dmub_srv *dmub,
563569
* DMUB_STATUS_OK - success
564570
* DMUB_STATUS_INVALID - unspecified error
565571
*/
566-
enum dmub_status dmub_srv_calc_fb_info(struct dmub_srv *dmub,
567-
const struct dmub_srv_fb_params *params,
572+
enum dmub_status dmub_srv_calc_mem_info(struct dmub_srv *dmub,
573+
const struct dmub_srv_memory_params *params,
568574
struct dmub_srv_fb_info *out);
569575

570576
/**

drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ dmub_srv_calc_region_info(struct dmub_srv *dmub,
434434
uint32_t fw_state_size = DMUB_FW_STATE_SIZE;
435435
uint32_t trace_buffer_size = DMUB_TRACE_BUFFER_SIZE;
436436
uint32_t scratch_mem_size = DMUB_SCRATCH_MEM_SIZE;
437-
437+
uint32_t previous_top = 0;
438438
if (!dmub->sw_init)
439439
return DMUB_STATUS_INVALID;
440440

@@ -459,8 +459,15 @@ dmub_srv_calc_region_info(struct dmub_srv *dmub,
459459
bios->base = dmub_align(stack->top, 256);
460460
bios->top = bios->base + params->vbios_size;
461461

462-
mail->base = dmub_align(bios->top, 256);
463-
mail->top = mail->base + DMUB_MAILBOX_SIZE;
462+
if (params->is_mailbox_in_inbox) {
463+
mail->base = 0;
464+
mail->top = mail->base + DMUB_MAILBOX_SIZE;
465+
previous_top = bios->top;
466+
} else {
467+
mail->base = dmub_align(bios->top, 256);
468+
mail->top = mail->base + DMUB_MAILBOX_SIZE;
469+
previous_top = mail->top;
470+
}
464471

465472
fw_info = dmub_get_fw_meta_info(params);
466473

@@ -479,7 +486,7 @@ dmub_srv_calc_region_info(struct dmub_srv *dmub,
479486
dmub->fw_version = fw_info->fw_version;
480487
}
481488

482-
trace_buff->base = dmub_align(mail->top, 256);
489+
trace_buff->base = dmub_align(previous_top, 256);
483490
trace_buff->top = trace_buff->base + dmub_align(trace_buffer_size, 64);
484491

485492
fw_state->base = dmub_align(trace_buff->top, 256);
@@ -490,11 +497,14 @@ dmub_srv_calc_region_info(struct dmub_srv *dmub,
490497

491498
out->fb_size = dmub_align(scratch_mem->top, 4096);
492499

500+
if (params->is_mailbox_in_inbox)
501+
out->inbox_size = dmub_align(mail->top, 4096);
502+
493503
return DMUB_STATUS_OK;
494504
}
495505

496-
enum dmub_status dmub_srv_calc_fb_info(struct dmub_srv *dmub,
497-
const struct dmub_srv_fb_params *params,
506+
enum dmub_status dmub_srv_calc_mem_info(struct dmub_srv *dmub,
507+
const struct dmub_srv_memory_params *params,
498508
struct dmub_srv_fb_info *out)
499509
{
500510
uint8_t *cpu_base;
@@ -509,15 +519,21 @@ enum dmub_status dmub_srv_calc_fb_info(struct dmub_srv *dmub,
509519
if (params->region_info->num_regions != DMUB_NUM_WINDOWS)
510520
return DMUB_STATUS_INVALID;
511521

512-
cpu_base = (uint8_t *)params->cpu_addr;
513-
gpu_base = params->gpu_addr;
522+
cpu_base = (uint8_t *)params->cpu_fb_addr;
523+
gpu_base = params->gpu_fb_addr;
514524

515525
for (i = 0; i < DMUB_NUM_WINDOWS; ++i) {
516526
const struct dmub_region *reg =
517527
&params->region_info->regions[i];
518528

519529
out->fb[i].cpu_addr = cpu_base + reg->base;
520530
out->fb[i].gpu_addr = gpu_base + reg->base;
531+
532+
if (i == DMUB_WINDOW_4_MAILBOX && params->cpu_inbox_addr != 0) {
533+
out->fb[i].cpu_addr = (uint8_t *)params->cpu_inbox_addr + reg->base;
534+
out->fb[i].gpu_addr = params->gpu_inbox_addr + reg->base;
535+
}
536+
521537
out->fb[i].size = reg->top - reg->base;
522538
}
523539

0 commit comments

Comments
 (0)