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

Reply via email to