Skip to content

Commit 2277f01

Browse files
Wyatt Woodalexdeucher
authored andcommitted
drm/amd/display: Allocate scratch space for DMUB CW7
[Why] The scratch space can be used to pass data between x86 and DMCUB. DMCUB will manage the actually mapping of CW7 internally, driver does not program the window. [How] Allocate extra space within the DMUB service's framebuffer for this scratch space and expose them from the service for use in DC. Signed-off-by: Wyatt Wood <[email protected]> Reviewed-by: Nicholas Kazlauskas <[email protected]> Acked-by: Rodrigo Siqueira <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent eb1b457 commit 2277f01

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ enum dmub_window_id {
104104
DMUB_WINDOW_4_MAILBOX,
105105
DMUB_WINDOW_5_TRACEBUFF,
106106
DMUB_WINDOW_6_FW_STATE,
107-
DMUB_WINDOW_7_RESERVED,
107+
DMUB_WINDOW_7_SCRATCH_MEM,
108108
DMUB_WINDOW_TOTAL,
109109
};
110110

@@ -316,6 +316,7 @@ struct dmub_srv {
316316
enum dmub_asic asic;
317317
void *user_ctx;
318318
bool is_virtual;
319+
struct dmub_fb scratch_mem_fb;
319320
volatile const struct dmub_fw_state *fw_state;
320321

321322
/* private: internal use only */

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,11 @@
5252
/* Default tracebuffer size if meta is absent. */
5353
#define DMUB_TRACE_BUFFER_SIZE (1024)
5454

55+
/* Default scratch mem size. */
56+
#define DMUB_SCRATCH_MEM_SIZE (256)
57+
5558
/* Number of windows in use. */
56-
#define DMUB_NUM_WINDOWS (DMUB_WINDOW_6_FW_STATE + 1)
59+
#define DMUB_NUM_WINDOWS (DMUB_WINDOW_TOTAL)
5760
/* Base addresses. */
5861

5962
#define DMUB_CW0_BASE (0x60000000)
@@ -211,9 +214,11 @@ dmub_srv_calc_region_info(struct dmub_srv *dmub,
211214
struct dmub_region *mail = &out->regions[DMUB_WINDOW_4_MAILBOX];
212215
struct dmub_region *trace_buff = &out->regions[DMUB_WINDOW_5_TRACEBUFF];
213216
struct dmub_region *fw_state = &out->regions[DMUB_WINDOW_6_FW_STATE];
217+
struct dmub_region *scratch_mem = &out->regions[DMUB_WINDOW_7_SCRATCH_MEM];
214218
const struct dmub_fw_meta_info *fw_info;
215219
uint32_t fw_state_size = DMUB_FW_STATE_SIZE;
216220
uint32_t trace_buffer_size = DMUB_TRACE_BUFFER_SIZE;
221+
uint32_t scratch_mem_size = DMUB_SCRATCH_MEM_SIZE;
217222

218223
if (!dmub->sw_init)
219224
return DMUB_STATUS_INVALID;
@@ -256,7 +261,10 @@ dmub_srv_calc_region_info(struct dmub_srv *dmub,
256261
fw_state->base = dmub_align(trace_buff->top, 256);
257262
fw_state->top = fw_state->base + dmub_align(fw_state_size, 64);
258263

259-
out->fb_size = dmub_align(fw_state->top, 4096);
264+
scratch_mem->base = dmub_align(fw_state->top, 256);
265+
scratch_mem->top = scratch_mem->base + dmub_align(scratch_mem_size, 64);
266+
267+
out->fb_size = dmub_align(scratch_mem->top, 4096);
260268

261269
return DMUB_STATUS_OK;
262270
}
@@ -334,6 +342,7 @@ enum dmub_status dmub_srv_hw_init(struct dmub_srv *dmub,
334342
struct dmub_fb *mail_fb = params->fb[DMUB_WINDOW_4_MAILBOX];
335343
struct dmub_fb *tracebuff_fb = params->fb[DMUB_WINDOW_5_TRACEBUFF];
336344
struct dmub_fb *fw_state_fb = params->fb[DMUB_WINDOW_6_FW_STATE];
345+
struct dmub_fb *scratch_mem_fb = params->fb[DMUB_WINDOW_7_SCRATCH_MEM];
337346

338347
struct dmub_rb_init_params rb_params;
339348
struct dmub_window cw0, cw1, cw2, cw3, cw4, cw5, cw6;
@@ -370,7 +379,7 @@ enum dmub_status dmub_srv_hw_init(struct dmub_srv *dmub,
370379
dmub->hw_funcs.reset(dmub);
371380

372381
if (inst_fb && data_fb && bios_fb && mail_fb && tracebuff_fb &&
373-
fw_state_fb) {
382+
fw_state_fb && scratch_mem_fb) {
374383
cw2.offset.quad_part = data_fb->gpu_addr;
375384
cw2.region.base = DMUB_CW0_BASE + inst_fb->size;
376385
cw2.region.top = cw2.region.base + data_fb->size;
@@ -396,6 +405,8 @@ enum dmub_status dmub_srv_hw_init(struct dmub_srv *dmub,
396405

397406
dmub->fw_state = fw_state_fb->cpu_addr;
398407

408+
dmub->scratch_mem_fb = *scratch_mem_fb;
409+
399410
if (dmub->hw_funcs.setup_windows)
400411
dmub->hw_funcs.setup_windows(dmub, &cw2, &cw3, &cw4,
401412
&cw5, &cw6);

0 commit comments

Comments
 (0)