Wire the resource-group, scheduler, and partition-control blocks together. Resource-group messages now feed request and idle events into the scheduler, while partition RESET_DONE from a YIELD_DONE reports the active access window as stopped.
Add the arbiter-to-window callbacks used by the scheduler to grant, yield, and close partition windows. Signed-off-by: Karunika Choo <[email protected]> --- .../panthor/arbitration/panthor_arbitration.h | 12 ++++++ .../arbitration/panthor_arbitration_drv.c | 38 +++++++++++++++++++ .../arbitration/panthor_partition_control.c | 9 +++++ .../arbitration/panthor_resource_group.c | 4 +- 4 files changed, 61 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/panthor/arbitration/panthor_arbitration.h b/drivers/gpu/drm/panthor/arbitration/panthor_arbitration.h index 0bc683e6a71d..fca1a2325b16 100644 --- a/drivers/gpu/drm/panthor/arbitration/panthor_arbitration.h +++ b/drivers/gpu/drm/panthor/arbitration/panthor_arbitration.h @@ -4,6 +4,8 @@ #ifndef __PANTHOR_ARBITRATION_H__ #define __PANTHOR_ARBITRATION_H__ +#include <linux/types.h> + struct device; struct panthor_arbitration_sched; struct panthor_partition_control; @@ -30,4 +32,14 @@ struct panthor_arbitration { struct panthor_arbitration_sched *sched[AM_ARB_MAX_PC_COUNT]; }; +/* AW to Arbiter events */ +int panthor_arbitration_on_request(struct panthor_arbitration *adev, u8 aw_id); +int panthor_arbitration_on_idle(struct panthor_arbitration *adev, u8 aw_id); +int panthor_arbitration_on_stopped(struct panthor_arbitration *adev, u8 aw_id); + +/* Arbiter to AW events */ +int panthor_arbitration_on_grant(struct panthor_arbitration *adev, u8 aw_id); +int panthor_arbitration_on_stop(struct panthor_arbitration *adev, u8 aw_id); +int panthor_arbitration_on_close(struct panthor_arbitration *adev, u8 aw_id); + #endif diff --git a/drivers/gpu/drm/panthor/arbitration/panthor_arbitration_drv.c b/drivers/gpu/drm/panthor/arbitration/panthor_arbitration_drv.c index 5cdefd9ed5c9..edbda1845068 100644 --- a/drivers/gpu/drm/panthor/arbitration/panthor_arbitration_drv.c +++ b/drivers/gpu/drm/panthor/arbitration/panthor_arbitration_drv.c @@ -55,6 +55,44 @@ static int panthor_arbitration_runtime_resume(struct device *dev) return 0; } +/* AW to Arbiter events */ +int panthor_arbitration_on_request(struct panthor_arbitration *adev, u8 aw_id) +{ + /* TODO: AW to PC assignment */ + return panthor_arbitration_sched_on_request(adev->sched[0], aw_id); +} + +int panthor_arbitration_on_idle(struct panthor_arbitration *adev, u8 aw_id) +{ + /* TODO: AW to PC assignment */ + return panthor_arbitration_sched_on_idle(adev->sched[0], aw_id); +} + +int panthor_arbitration_on_stopped(struct panthor_arbitration *adev, u8 aw_id) +{ + /* TODO: AW to PC assignment */ + return panthor_arbitration_sched_on_stopped(adev->sched[0], aw_id); +} + +/* Arbiter to AW events */ +int panthor_arbitration_on_grant(struct panthor_arbitration *adev, u8 aw_id) +{ + /* TODO: AW to PC assignment */ + return panthor_partition_control_open_window(adev->pc[0], aw_id); +} + +int panthor_arbitration_on_stop(struct panthor_arbitration *adev, u8 aw_id) +{ + /* TODO: AW to PC assignment */ + return panthor_partition_control_yield_now(adev->pc[0]); +} + +int panthor_arbitration_on_close(struct panthor_arbitration *adev, u8 aw_id) +{ + /* TODO: AW to PC assignment */ + return panthor_partition_control_close_window(adev->pc[0]); +} + static int panthor_arbitration_probe(struct platform_device *pdev) { struct panthor_arbitration *adev; diff --git a/drivers/gpu/drm/panthor/arbitration/panthor_partition_control.c b/drivers/gpu/drm/panthor/arbitration/panthor_partition_control.c index f4bad839610d..095e19c8d4c5 100644 --- a/drivers/gpu/drm/panthor/arbitration/panthor_partition_control.c +++ b/drivers/gpu/drm/panthor/arbitration/panthor_partition_control.c @@ -220,15 +220,24 @@ static int window_open(struct panthor_partition_control *pc, u8 aw_id) static void partition_handle_reset_done(struct panthor_partition_control *pc) { + bool notify_stopped = false; + int aw_id; + scoped_guard(spinlock_irqsave, &pc->lock) { + aw_id = pc->current_aw; pc->current_aw = -1; /* RESET_DONE from CLOSE_WINDOW */ if (pc->closing) pc->closing = false; + else if (aw_id >= 0) + notify_stopped = true; } wake_up_all(&pc->waitqueue); + + if (notify_stopped) + panthor_arbitration_on_stopped(dev_get_drvdata(pc->dev), aw_id); } static irqreturn_t partition_irq_raw_handler(int irq, void *data) diff --git a/drivers/gpu/drm/panthor/arbitration/panthor_resource_group.c b/drivers/gpu/drm/panthor/arbitration/panthor_resource_group.c index cd1ad0532766..6264efc2e29a 100644 --- a/drivers/gpu/drm/panthor/arbitration/panthor_resource_group.c +++ b/drivers/gpu/drm/panthor/arbitration/panthor_resource_group.c @@ -127,10 +127,10 @@ static void rg_handle_message(struct panthor_resource_group *rg, u8 aw_id, rg_respond_to_handshake(rg, aw_id, message); break; case VM_ARB_GPU_REQUEST: - /* TODO: on_request */ + panthor_arbitration_on_request(dev_get_drvdata(rg->dev), aw_id); break; case VM_ARB_GPU_STOPPED: - /* TODO: on_idle */ + panthor_arbitration_on_idle(dev_get_drvdata(rg->dev), aw_id); break; default: dev_warn(rg->dev, "Invalid message (0x%llx)", message); -- 2.43.0
