pan/cs: Add cs_exception_handler_ctx

This allows us to modify the exception handler start arguments without
having to modify the function declaration.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Lars-Ivar Hesselberg Simonsen <lars-ivar.simonsen@arm.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31941>
This commit is contained in:
Boris Brezillon
2024-11-07 09:29:38 +01:00
committed by Lars-Ivar Hesselberg Simonsen
parent 2941a44b69
commit 0ae8e69810
2 changed files with 18 additions and 10 deletions
+7 -2
View File
@@ -110,14 +110,19 @@ csf_oom_handler_init(struct panfrost_context *ctx)
.capacity = panfrost_bo_size(cs_bo) / sizeof(uint64_t),
};
struct cs_builder b;
struct cs_exception_handler handler;
const struct cs_builder_conf conf = {
.nr_registers = 96,
.nr_kernel_registers = 4,
.reg_perm = (dev->debug & PAN_DBG_CS) ? csf_reg_perm_cb : NULL,
};
cs_builder_init(&b, &conf, queue);
cs_exception_handler_start(&b, &handler, reg_save_bo->ptr.gpu, 0);
struct cs_exception_handler_ctx handler_ctx = {
.addr = reg_save_bo->ptr.gpu,
.sb_slot = 0,
};
struct cs_exception_handler handler;
cs_exception_handler_start(&b, &handler, handler_ctx);
struct cs_index tiler_oom_ctx = cs_reg64(&b, TILER_OOM_CTX_REG);
struct cs_index counter = cs_reg32(&b, 47);
+11 -8
View File
@@ -1672,24 +1672,27 @@ cs_nop(struct cs_builder *b)
cs_emit(b, NOP, I) {};
}
struct cs_exception_handler_ctx {
uint64_t addr;
uint8_t sb_slot;
};
struct cs_exception_handler {
struct cs_block block;
struct cs_dirty_tracker dirty;
uint64_t backup_addr;
uint8_t sb_slot;
struct cs_exception_handler_ctx ctx;
};
static inline struct cs_exception_handler *
cs_exception_handler_start(struct cs_builder *b,
struct cs_exception_handler *handler,
uint64_t backup_addr, uint8_t sb_slot)
struct cs_exception_handler_ctx ctx)
{
assert(cs_cur_block(b) == NULL);
assert(b->conf.dirty_tracker == NULL);
*handler = (struct cs_exception_handler){
.backup_addr = backup_addr,
.sb_slot = sb_slot,
.ctx = ctx,
};
cs_block_start(b, &handler->block);
@@ -1761,7 +1764,7 @@ cs_exception_handler_end(struct cs_builder *b,
if (num_ranges > 0) {
unsigned offset = 0;
cs_move64_to(b, addr_reg, handler->backup_addr);
cs_move64_to(b, addr_reg, handler->ctx.addr);
for (unsigned i = 0; i < num_ranges; ++i) {
unsigned reg_count = util_bitcount(masks[i]);
@@ -1770,7 +1773,7 @@ cs_exception_handler_end(struct cs_builder *b,
offset += reg_count * 4;
}
cs_wait_slot(b, handler->sb_slot, false);
cs_wait_slot(b, handler->ctx.sb_slot, false);
}
/* Now that the preamble is emitted, we can flush the instructions we have in
@@ -1788,6 +1791,6 @@ cs_exception_handler_end(struct cs_builder *b,
offset += reg_count * 4;
}
cs_wait_slot(b, handler->sb_slot, false);
cs_wait_slot(b, handler->ctx.sb_slot, false);
}
}