Skip to content

Commit 3fcf68d

Browse files
committed
drm/xe: Apply whitelist to engine save-restore
Instead of handling the whitelist directly in the GuC ADS initialization, make it follow the same logic as other engine registers that are save-restored. Main benefit is that then the SW tracking then shows it in debugfs and there's no risk of an engine workaround to write to the same nopriv register that is being passed directly to GuC. This means that xe_reg_whitelist_process_engine() only has to process the RTP and convert them to entries for the hwe. With that all the registers should be covered by xe_reg_sr_apply_mmio() to write to the HW and there's no special handling in GuC ADS to also add these registers to the list of registers that is passed to GuC. Example for DG2: # cat /sys/kernel/debug/dri/0000\:03\:00.0/gt0/register-save-restore ... Engine rcs0 ... REG[0x24d0] clr=0xffffffff set=0x1000dafc masked=no mcr=no REG[0x24d4] clr=0xffffffff set=0x1000db01 masked=no mcr=no REG[0x24d8] clr=0xffffffff set=0x0000db1c masked=no mcr=no ... Whitelist rcs0 REG[0xdafc-0xdaff]: allow read access REG[0xdb00-0xdb1f]: allow read access REG[0xdb1c-0xdb1f]: allow rw access v2: - Use ~0u for clr bits so it's just a write (Matt Roper) - Simplify helpers now that unused slots are not written Reviewed-by: Matt Roper <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Signed-off-by: Lucas De Marchi <[email protected]>
1 parent c115169 commit 3fcf68d

File tree

5 files changed

+38
-56
lines changed

5 files changed

+38
-56
lines changed

drivers/gpu/drm/xe/xe_gt.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -748,10 +748,8 @@ static int do_gt_restart(struct xe_gt *gt)
748748
if (err)
749749
return err;
750750

751-
for_each_hw_engine(hwe, gt, id) {
751+
for_each_hw_engine(hwe, gt, id)
752752
xe_reg_sr_apply_mmio(&hwe->reg_sr, gt);
753-
xe_reg_sr_apply_whitelist(hwe);
754-
}
755753

756754
/* Get CCS mode in sync between sw/hw */
757755
xe_gt_apply_ccs_mode(gt);

drivers/gpu/drm/xe/xe_guc_ads.c

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,6 @@ static size_t calculate_regset_size(struct xe_gt *gt)
243243
xa_for_each(&hwe->reg_sr.xa, sr_idx, sr_entry)
244244
count++;
245245

246-
count += RING_MAX_NONPRIV_SLOTS * XE_NUM_HW_ENGINES;
247-
248246
count += ADS_REGSET_EXTRA_MAX * XE_NUM_HW_ENGINES;
249247

250248
if (XE_WA(gt, 1607983814))
@@ -729,11 +727,6 @@ static unsigned int guc_mmio_regset_write(struct xe_guc_ads *ads,
729727
xa_for_each(&hwe->reg_sr.xa, idx, entry)
730728
guc_mmio_regset_write_one(ads, regset_map, entry->reg, count++);
731729

732-
for (i = 0; i < RING_MAX_NONPRIV_SLOTS; i++)
733-
guc_mmio_regset_write_one(ads, regset_map,
734-
RING_FORCE_TO_NONPRIV(hwe->mmio_base, i),
735-
count++);
736-
737730
for (e = extra_regs; e < extra_regs + ARRAY_SIZE(extra_regs); e++) {
738731
if (e->skip)
739732
continue;

drivers/gpu/drm/xe/xe_hw_engine.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,6 @@ static int hw_engine_init(struct xe_gt *gt, struct xe_hw_engine *hwe,
574574
xe_gt_assert(gt, gt->info.engine_mask & BIT(id));
575575

576576
xe_reg_sr_apply_mmio(&hwe->reg_sr, gt);
577-
xe_reg_sr_apply_whitelist(hwe);
578577

579578
hwe->hwsp = xe_managed_bo_create_pin_map(xe, tile, SZ_4K,
580579
XE_BO_FLAG_VRAM_IF_DGFX(tile) |

drivers/gpu/drm/xe/xe_reg_sr.c

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
#include "xe_hw_engine_types.h"
2525
#include "xe_macros.h"
2626
#include "xe_mmio.h"
27-
#include "xe_reg_whitelist.h"
2827
#include "xe_rtp_types.h"
2928

3029
static void reg_sr_fini(struct drm_device *drm, void *arg)
@@ -192,50 +191,6 @@ void xe_reg_sr_apply_mmio(struct xe_reg_sr *sr, struct xe_gt *gt)
192191
xe_gt_err(gt, "Failed to apply, err=-ETIMEDOUT\n");
193192
}
194193

195-
void xe_reg_sr_apply_whitelist(struct xe_hw_engine *hwe)
196-
{
197-
struct xe_reg_sr *sr = &hwe->reg_whitelist;
198-
struct xe_gt *gt = hwe->gt;
199-
struct xe_reg_sr_entry *entry;
200-
struct drm_printer p;
201-
u32 mmio_base = hwe->mmio_base;
202-
unsigned long reg;
203-
unsigned int slot = 0;
204-
unsigned int fw_ref;
205-
206-
if (xa_empty(&sr->xa))
207-
return;
208-
209-
xe_gt_dbg(gt, "Whitelisting %s registers\n", sr->name);
210-
211-
fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
212-
if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL))
213-
goto err_force_wake;
214-
215-
p = xe_gt_dbg_printer(gt);
216-
xa_for_each(&sr->xa, reg, entry) {
217-
if (slot == RING_MAX_NONPRIV_SLOTS) {
218-
xe_gt_err(gt,
219-
"hwe %s: maximum register whitelist slots (%d) reached, refusing to add more\n",
220-
hwe->name, RING_MAX_NONPRIV_SLOTS);
221-
break;
222-
}
223-
224-
xe_reg_whitelist_print_entry(&p, 0, reg, entry);
225-
xe_mmio_write32(&gt->mmio, RING_FORCE_TO_NONPRIV(mmio_base, slot),
226-
reg | entry->set_bits);
227-
slot++;
228-
}
229-
230-
xe_force_wake_put(gt_to_fw(gt), fw_ref);
231-
232-
return;
233-
234-
err_force_wake:
235-
xe_force_wake_put(gt_to_fw(gt), fw_ref);
236-
xe_gt_err(gt, "Failed to apply, err=-ETIMEDOUT\n");
237-
}
238-
239194
/**
240195
* xe_reg_sr_dump - print all save/restore entries
241196
* @sr: Save/restore entries

drivers/gpu/drm/xe/xe_reg_whitelist.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
#include "regs/xe_oa_regs.h"
1111
#include "regs/xe_regs.h"
1212
#include "xe_gt_types.h"
13+
#include "xe_gt_printk.h"
1314
#include "xe_platform_types.h"
15+
#include "xe_reg_sr.h"
1416
#include "xe_rtp.h"
1517
#include "xe_step.h"
1618

@@ -89,6 +91,40 @@ static const struct xe_rtp_entry_sr register_whitelist[] = {
8991
{}
9092
};
9193

94+
static void whitelist_apply_to_hwe(struct xe_hw_engine *hwe)
95+
{
96+
struct xe_reg_sr *sr = &hwe->reg_whitelist;
97+
struct xe_reg_sr_entry *entry;
98+
struct drm_printer p;
99+
unsigned long reg;
100+
unsigned int slot;
101+
102+
xe_gt_dbg(hwe->gt, "Add %s whitelist to engine\n", sr->name);
103+
p = xe_gt_dbg_printer(hwe->gt);
104+
105+
slot = 0;
106+
xa_for_each(&sr->xa, reg, entry) {
107+
struct xe_reg_sr_entry hwe_entry = {
108+
.reg = RING_FORCE_TO_NONPRIV(hwe->mmio_base, slot),
109+
.set_bits = entry->reg.addr | entry->set_bits,
110+
.clr_bits = ~0u,
111+
.read_mask = entry->read_mask,
112+
};
113+
114+
if (slot == RING_MAX_NONPRIV_SLOTS) {
115+
xe_gt_err(hwe->gt,
116+
"hwe %s: maximum register whitelist slots (%d) reached, refusing to add more\n",
117+
hwe->name, RING_MAX_NONPRIV_SLOTS);
118+
break;
119+
}
120+
121+
xe_reg_whitelist_print_entry(&p, 0, reg, entry);
122+
xe_reg_sr_add(&hwe->reg_sr, &hwe_entry, hwe->gt);
123+
124+
slot++;
125+
}
126+
}
127+
92128
/**
93129
* xe_reg_whitelist_process_engine - process table of registers to whitelist
94130
* @hwe: engine instance to process whitelist for
@@ -102,6 +138,7 @@ void xe_reg_whitelist_process_engine(struct xe_hw_engine *hwe)
102138
struct xe_rtp_process_ctx ctx = XE_RTP_PROCESS_CTX_INITIALIZER(hwe);
103139

104140
xe_rtp_process_to_sr(&ctx, register_whitelist, &hwe->reg_whitelist);
141+
whitelist_apply_to_hwe(hwe);
105142
}
106143

107144
/**

0 commit comments

Comments
 (0)