Skip to content

Commit 99b2f5f

Browse files
mwajdeczdanvet
authored andcommitted
drm/i915/guc: Only rely on own CTB size
In upcoming GuC firmware, CTB size will be removed from the CTB descriptor so we must keep it locally for any calculations. While around, improve some debug messages and helpers. Signed-off-by: Michal Wajdeczko <[email protected]> Signed-off-by: Matthew Brost <[email protected]> Reviewed-by: Matthew Brost <[email protected]> Signed-off-by: Daniel Vetter <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent d6e9c96 commit 99b2f5f

File tree

2 files changed

+43
-14
lines changed

2 files changed

+43
-14
lines changed

drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,24 @@ static void guc_ct_buffer_desc_init(struct guc_ct_buffer_desc *desc,
9090
desc->owner = CTB_OWNER_HOST;
9191
}
9292

93+
static void guc_ct_buffer_reset(struct intel_guc_ct_buffer *ctb, u32 cmds_addr)
94+
{
95+
guc_ct_buffer_desc_init(ctb->desc, cmds_addr, ctb->size);
96+
}
97+
98+
static void guc_ct_buffer_init(struct intel_guc_ct_buffer *ctb,
99+
struct guc_ct_buffer_desc *desc,
100+
u32 *cmds, u32 size)
101+
{
102+
GEM_BUG_ON(size % 4);
103+
104+
ctb->desc = desc;
105+
ctb->cmds = cmds;
106+
ctb->size = size;
107+
108+
guc_ct_buffer_reset(ctb, 0);
109+
}
110+
93111
static int guc_action_register_ct_buffer(struct intel_guc *guc,
94112
u32 desc_addr,
95113
u32 type)
@@ -148,7 +166,10 @@ static int ct_deregister_buffer(struct intel_guc_ct *ct, u32 type)
148166
int intel_guc_ct_init(struct intel_guc_ct *ct)
149167
{
150168
struct intel_guc *guc = ct_to_guc(ct);
169+
struct guc_ct_buffer_desc *desc;
170+
u32 blob_size;
151171
void *blob;
172+
u32 *cmds;
152173
int err;
153174
int i;
154175

@@ -176,19 +197,24 @@ int intel_guc_ct_init(struct intel_guc_ct *ct)
176197
* other code will need updating as well.
177198
*/
178199

179-
err = intel_guc_allocate_and_map_vma(guc, PAGE_SIZE, &ct->vma, &blob);
200+
blob_size = PAGE_SIZE;
201+
err = intel_guc_allocate_and_map_vma(guc, blob_size, &ct->vma, &blob);
180202
if (unlikely(err)) {
181-
CT_ERROR(ct, "Failed to allocate CT channel (err=%d)\n", err);
203+
CT_PROBE_ERROR(ct, "Failed to allocate %u for CTB data (%pe)\n",
204+
blob_size, ERR_PTR(err));
182205
return err;
183206
}
184207

185-
CT_DEBUG(ct, "vma base=%#x\n", intel_guc_ggtt_offset(guc, ct->vma));
208+
CT_DEBUG(ct, "base=%#x size=%u\n", intel_guc_ggtt_offset(guc, ct->vma), blob_size);
186209

187210
/* store pointers to desc and cmds */
188211
for (i = 0; i < ARRAY_SIZE(ct->ctbs); i++) {
189212
GEM_BUG_ON((i != CTB_SEND) && (i != CTB_RECV));
190-
ct->ctbs[i].desc = blob + PAGE_SIZE/4 * i;
191-
ct->ctbs[i].cmds = blob + PAGE_SIZE/4 * i + PAGE_SIZE/2;
213+
214+
desc = blob + PAGE_SIZE / 4 * i;
215+
cmds = blob + PAGE_SIZE / 4 * i + PAGE_SIZE / 2;
216+
217+
guc_ct_buffer_init(&ct->ctbs[i], desc, cmds, PAGE_SIZE / 4);
192218
}
193219

194220
return 0;
@@ -217,7 +243,7 @@ void intel_guc_ct_fini(struct intel_guc_ct *ct)
217243
int intel_guc_ct_enable(struct intel_guc_ct *ct)
218244
{
219245
struct intel_guc *guc = ct_to_guc(ct);
220-
u32 base, cmds, size;
246+
u32 base, cmds;
221247
int err;
222248
int i;
223249

@@ -232,10 +258,11 @@ int intel_guc_ct_enable(struct intel_guc_ct *ct)
232258
*/
233259
for (i = 0; i < ARRAY_SIZE(ct->ctbs); i++) {
234260
GEM_BUG_ON((i != CTB_SEND) && (i != CTB_RECV));
261+
235262
cmds = base + PAGE_SIZE / 4 * i + PAGE_SIZE / 2;
236-
size = PAGE_SIZE / 4;
237-
CT_DEBUG(ct, "%d: addr=%#x size=%u\n", i, cmds, size);
238-
guc_ct_buffer_desc_init(ct->ctbs[i].desc, cmds, size);
263+
CT_DEBUG(ct, "%d: cmds addr=%#x\n", i, cmds);
264+
265+
guc_ct_buffer_reset(&ct->ctbs[i], cmds);
239266
}
240267

241268
/*
@@ -259,7 +286,7 @@ int intel_guc_ct_enable(struct intel_guc_ct *ct)
259286
err_deregister:
260287
ct_deregister_buffer(ct, INTEL_GUC_CT_BUFFER_TYPE_RECV);
261288
err_out:
262-
CT_PROBE_ERROR(ct, "Failed to open channel (err=%d)\n", err);
289+
CT_PROBE_ERROR(ct, "Failed to enable CTB (%pe)\n", ERR_PTR(err));
263290
return err;
264291
}
265292

@@ -314,7 +341,7 @@ static int ct_write(struct intel_guc_ct *ct,
314341
struct guc_ct_buffer_desc *desc = ctb->desc;
315342
u32 head = desc->head;
316343
u32 tail = desc->tail;
317-
u32 size = desc->size;
344+
u32 size = ctb->size;
318345
u32 used;
319346
u32 header;
320347
u32 *cmds = ctb->cmds;
@@ -323,7 +350,7 @@ static int ct_write(struct intel_guc_ct *ct,
323350
if (unlikely(desc->is_in_error))
324351
return -EPIPE;
325352

326-
if (unlikely(!IS_ALIGNED(head | tail | size, 4) ||
353+
if (unlikely(!IS_ALIGNED(head | tail, 4) ||
327354
(tail | head) >= size))
328355
goto corrupted;
329356

@@ -530,7 +557,7 @@ static int ct_read(struct intel_guc_ct *ct, u32 *data)
530557
struct guc_ct_buffer_desc *desc = ctb->desc;
531558
u32 head = desc->head;
532559
u32 tail = desc->tail;
533-
u32 size = desc->size;
560+
u32 size = ctb->size;
534561
u32 *cmds = ctb->cmds;
535562
s32 available;
536563
unsigned int len;
@@ -539,7 +566,7 @@ static int ct_read(struct intel_guc_ct *ct, u32 *data)
539566
if (unlikely(desc->is_in_error))
540567
return -EPIPE;
541568

542-
if (unlikely(!IS_ALIGNED(head | tail | size, 4) ||
569+
if (unlikely(!IS_ALIGNED(head | tail, 4) ||
543570
(tail | head) >= size))
544571
goto corrupted;
545572

drivers/gpu/drm/i915/gt/uc/intel_guc_ct.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,12 @@ struct intel_guc;
2929
*
3030
* @desc: pointer to the buffer descriptor
3131
* @cmds: pointer to the commands buffer
32+
* @size: size of the commands buffer
3233
*/
3334
struct intel_guc_ct_buffer {
3435
struct guc_ct_buffer_desc *desc;
3536
u32 *cmds;
37+
u32 size;
3638
};
3739

3840

0 commit comments

Comments
 (0)