drm/lima: add resume/suspend callback for each ip
authorQiang Yu <yuq825@gmail.com>
Tue, 21 Apr 2020 13:35:48 +0000 (21:35 +0800)
committerQiang Yu <yuq825@gmail.com>
Fri, 24 Apr 2020 12:51:10 +0000 (20:51 +0800)
For called when PM do resume/suspend.

Tested-by: Bhushan Shah <bshah@kde.org>
Reviewed-by: Vasily Khoruzhick <anarsoul@gmail.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200421133551.31481-8-yuq825@gmail.com
16 files changed:
drivers/gpu/drm/lima/lima_bcast.c
drivers/gpu/drm/lima/lima_bcast.h
drivers/gpu/drm/lima/lima_device.c
drivers/gpu/drm/lima/lima_device.h
drivers/gpu/drm/lima/lima_dlbu.c
drivers/gpu/drm/lima/lima_dlbu.h
drivers/gpu/drm/lima/lima_gp.c
drivers/gpu/drm/lima/lima_gp.h
drivers/gpu/drm/lima/lima_l2_cache.c
drivers/gpu/drm/lima/lima_l2_cache.h
drivers/gpu/drm/lima/lima_mmu.c
drivers/gpu/drm/lima/lima_mmu.h
drivers/gpu/drm/lima/lima_pmu.c
drivers/gpu/drm/lima/lima_pmu.h
drivers/gpu/drm/lima/lima_pp.c
drivers/gpu/drm/lima/lima_pp.h

index 2883980..fbc43f2 100644 (file)
@@ -26,18 +26,33 @@ void lima_bcast_enable(struct lima_device *dev, int num_pp)
        bcast_write(LIMA_BCAST_BROADCAST_MASK, mask);
 }
 
+static int lima_bcast_hw_init(struct lima_ip *ip)
+{
+       bcast_write(LIMA_BCAST_BROADCAST_MASK, ip->data.mask << 16);
+       bcast_write(LIMA_BCAST_INTERRUPT_MASK, ip->data.mask);
+       return 0;
+}
+
+int lima_bcast_resume(struct lima_ip *ip)
+{
+       return lima_bcast_hw_init(ip);
+}
+
+void lima_bcast_suspend(struct lima_ip *ip)
+{
+
+}
+
 int lima_bcast_init(struct lima_ip *ip)
 {
-       int i, mask = 0;
+       int i;
 
        for (i = lima_ip_pp0; i <= lima_ip_pp7; i++) {
                if (ip->dev->ip[i].present)
-                       mask |= 1 << (i - lima_ip_pp0);
+                       ip->data.mask |= 1 << (i - lima_ip_pp0);
        }
 
-       bcast_write(LIMA_BCAST_BROADCAST_MASK, mask << 16);
-       bcast_write(LIMA_BCAST_INTERRUPT_MASK, mask);
-       return 0;
+       return lima_bcast_hw_init(ip);
 }
 
 void lima_bcast_fini(struct lima_ip *ip)
index c47e585..465ee58 100644 (file)
@@ -6,6 +6,8 @@
 
 struct lima_ip;
 
+int lima_bcast_resume(struct lima_ip *ip);
+void lima_bcast_suspend(struct lima_ip *ip);
 int lima_bcast_init(struct lima_ip *ip);
 void lima_bcast_fini(struct lima_ip *ip);
 
index 29285de..a2d4ec7 100644 (file)
@@ -25,6 +25,8 @@ struct lima_ip_desc {
 
        int (*init)(struct lima_ip *ip);
        void (*fini)(struct lima_ip *ip);
+       int (*resume)(struct lima_ip *ip);
+       void (*suspend)(struct lima_ip *ip);
 };
 
 #define LIMA_IP_DESC(ipname, mst0, mst1, off0, off1, func, irq) \
@@ -41,6 +43,8 @@ struct lima_ip_desc {
                }, \
                .init = lima_##func##_init, \
                .fini = lima_##func##_fini, \
+               .resume = lima_##func##_resume, \
+               .suspend = lima_##func##_suspend, \
        }
 
 static struct lima_ip_desc lima_ip_desc[lima_ip_num] = {
index 9cd2718..d9df1b4 100644 (file)
@@ -64,7 +64,7 @@ struct lima_ip {
                bool async_reset;
                /* l2 cache */
                spinlock_t lock;
-               /* pmu */
+               /* pmu/bcast */
                u32 mask;
        } data;
 };
index 8399cef..c1d5ea3 100644 (file)
@@ -42,7 +42,7 @@ void lima_dlbu_set_reg(struct lima_ip *ip, u32 *reg)
        dlbu_write(LIMA_DLBU_START_TILE_POS, reg[3]);
 }
 
-int lima_dlbu_init(struct lima_ip *ip)
+static int lima_dlbu_hw_init(struct lima_ip *ip)
 {
        struct lima_device *dev = ip->dev;
 
@@ -52,6 +52,21 @@ int lima_dlbu_init(struct lima_ip *ip)
        return 0;
 }
 
+int lima_dlbu_resume(struct lima_ip *ip)
+{
+       return lima_dlbu_hw_init(ip);
+}
+
+void lima_dlbu_suspend(struct lima_ip *ip)
+{
+
+}
+
+int lima_dlbu_init(struct lima_ip *ip)
+{
+       return lima_dlbu_hw_init(ip);
+}
+
 void lima_dlbu_fini(struct lima_ip *ip)
 {
 
index 16f8779..be71daa 100644 (file)
@@ -12,6 +12,8 @@ void lima_dlbu_disable(struct lima_device *dev);
 
 void lima_dlbu_set_reg(struct lima_ip *ip, u32 *reg);
 
+int lima_dlbu_resume(struct lima_ip *ip);
+void lima_dlbu_suspend(struct lima_ip *ip);
 int lima_dlbu_init(struct lima_ip *ip);
 void lima_dlbu_fini(struct lima_ip *ip);
 
index d8841c8..8dd501b 100644 (file)
@@ -274,6 +274,23 @@ static void lima_gp_print_version(struct lima_ip *ip)
 static struct kmem_cache *lima_gp_task_slab;
 static int lima_gp_task_slab_refcnt;
 
+static int lima_gp_hw_init(struct lima_ip *ip)
+{
+       ip->data.async_reset = false;
+       lima_gp_soft_reset_async(ip);
+       return lima_gp_soft_reset_async_wait(ip);
+}
+
+int lima_gp_resume(struct lima_ip *ip)
+{
+       return lima_gp_hw_init(ip);
+}
+
+void lima_gp_suspend(struct lima_ip *ip)
+{
+
+}
+
 int lima_gp_init(struct lima_ip *ip)
 {
        struct lima_device *dev = ip->dev;
@@ -281,9 +298,7 @@ int lima_gp_init(struct lima_ip *ip)
 
        lima_gp_print_version(ip);
 
-       ip->data.async_reset = false;
-       lima_gp_soft_reset_async(ip);
-       err = lima_gp_soft_reset_async_wait(ip);
+       err = lima_gp_hw_init(ip);
        if (err)
                return err;
 
index 516e5c1..02ec9af 100644 (file)
@@ -7,6 +7,8 @@
 struct lima_ip;
 struct lima_device;
 
+int lima_gp_resume(struct lima_ip *ip);
+void lima_gp_suspend(struct lima_ip *ip);
 int lima_gp_init(struct lima_ip *ip);
 void lima_gp_fini(struct lima_ip *ip);
 
index 6873a7a..c4080a0 100644 (file)
@@ -38,9 +38,35 @@ int lima_l2_cache_flush(struct lima_ip *ip)
        return ret;
 }
 
+static int lima_l2_cache_hw_init(struct lima_ip *ip)
+{
+       int err;
+
+       err = lima_l2_cache_flush(ip);
+       if (err)
+               return err;
+
+       l2_cache_write(LIMA_L2_CACHE_ENABLE,
+                      LIMA_L2_CACHE_ENABLE_ACCESS |
+                      LIMA_L2_CACHE_ENABLE_READ_ALLOCATE);
+       l2_cache_write(LIMA_L2_CACHE_MAX_READS, 0x1c);
+
+       return 0;
+}
+
+int lima_l2_cache_resume(struct lima_ip *ip)
+{
+       return lima_l2_cache_hw_init(ip);
+}
+
+void lima_l2_cache_suspend(struct lima_ip *ip)
+{
+
+}
+
 int lima_l2_cache_init(struct lima_ip *ip)
 {
-       int i, err;
+       int i;
        u32 size;
        struct lima_device *dev = ip->dev;
 
@@ -63,15 +89,7 @@ int lima_l2_cache_init(struct lima_ip *ip)
                 1 << (size & 0xff),
                 1 << ((size >> 24) & 0xff));
 
-       err = lima_l2_cache_flush(ip);
-       if (err)
-               return err;
-
-       l2_cache_write(LIMA_L2_CACHE_ENABLE,
-                      LIMA_L2_CACHE_ENABLE_ACCESS|LIMA_L2_CACHE_ENABLE_READ_ALLOCATE);
-       l2_cache_write(LIMA_L2_CACHE_MAX_READS, 0x1c);
-
-       return 0;
+       return lima_l2_cache_hw_init(ip);
 }
 
 void lima_l2_cache_fini(struct lima_ip *ip)
index c63fb67..1aeeefd 100644 (file)
@@ -6,6 +6,8 @@
 
 struct lima_ip;
 
+int lima_l2_cache_resume(struct lima_ip *ip);
+void lima_l2_cache_suspend(struct lima_ip *ip);
 int lima_l2_cache_init(struct lima_ip *ip);
 void lima_l2_cache_fini(struct lima_ip *ip);
 
index c26b751..a1ae6c2 100644 (file)
@@ -59,12 +59,44 @@ static irqreturn_t lima_mmu_irq_handler(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-int lima_mmu_init(struct lima_ip *ip)
+static int lima_mmu_hw_init(struct lima_ip *ip)
 {
        struct lima_device *dev = ip->dev;
        int err;
        u32 v;
 
+       mmu_write(LIMA_MMU_COMMAND, LIMA_MMU_COMMAND_HARD_RESET);
+       err = lima_mmu_send_command(LIMA_MMU_COMMAND_HARD_RESET,
+                                   LIMA_MMU_DTE_ADDR, v, v == 0);
+       if (err)
+               return err;
+
+       mmu_write(LIMA_MMU_INT_MASK,
+                 LIMA_MMU_INT_PAGE_FAULT | LIMA_MMU_INT_READ_BUS_ERROR);
+       mmu_write(LIMA_MMU_DTE_ADDR, dev->empty_vm->pd.dma);
+       return lima_mmu_send_command(LIMA_MMU_COMMAND_ENABLE_PAGING,
+                                    LIMA_MMU_STATUS, v,
+                                    v & LIMA_MMU_STATUS_PAGING_ENABLED);
+}
+
+int lima_mmu_resume(struct lima_ip *ip)
+{
+       if (ip->id == lima_ip_ppmmu_bcast)
+               return 0;
+
+       return lima_mmu_hw_init(ip);
+}
+
+void lima_mmu_suspend(struct lima_ip *ip)
+{
+
+}
+
+int lima_mmu_init(struct lima_ip *ip)
+{
+       struct lima_device *dev = ip->dev;
+       int err;
+
        if (ip->id == lima_ip_ppmmu_bcast)
                return 0;
 
@@ -74,12 +106,6 @@ int lima_mmu_init(struct lima_ip *ip)
                return -EIO;
        }
 
-       mmu_write(LIMA_MMU_COMMAND, LIMA_MMU_COMMAND_HARD_RESET);
-       err = lima_mmu_send_command(LIMA_MMU_COMMAND_HARD_RESET,
-                                   LIMA_MMU_DTE_ADDR, v, v == 0);
-       if (err)
-               return err;
-
        err = devm_request_irq(dev->dev, ip->irq, lima_mmu_irq_handler,
                               IRQF_SHARED, lima_ip_name(ip), ip);
        if (err) {
@@ -87,11 +113,7 @@ int lima_mmu_init(struct lima_ip *ip)
                return err;
        }
 
-       mmu_write(LIMA_MMU_INT_MASK, LIMA_MMU_INT_PAGE_FAULT | LIMA_MMU_INT_READ_BUS_ERROR);
-       mmu_write(LIMA_MMU_DTE_ADDR, dev->empty_vm->pd.dma);
-       return lima_mmu_send_command(LIMA_MMU_COMMAND_ENABLE_PAGING,
-                                    LIMA_MMU_STATUS, v,
-                                    v & LIMA_MMU_STATUS_PAGING_ENABLED);
+       return lima_mmu_hw_init(ip);
 }
 
 void lima_mmu_fini(struct lima_ip *ip)
index 4f8ccbe..f0c97ac 100644 (file)
@@ -7,6 +7,8 @@
 struct lima_ip;
 struct lima_vm;
 
+int lima_mmu_resume(struct lima_ip *ip);
+void lima_mmu_suspend(struct lima_ip *ip);
 int lima_mmu_init(struct lima_ip *ip);
 void lima_mmu_fini(struct lima_ip *ip);
 
index d476569..e397e11 100644 (file)
@@ -63,7 +63,7 @@ static u32 lima_pmu_get_ip_mask(struct lima_ip *ip)
        return ret;
 }
 
-int lima_pmu_init(struct lima_ip *ip)
+static int lima_pmu_hw_init(struct lima_ip *ip)
 {
        int err;
        u32 stat;
@@ -88,7 +88,7 @@ int lima_pmu_init(struct lima_ip *ip)
        return 0;
 }
 
-void lima_pmu_fini(struct lima_ip *ip)
+static void lima_pmu_hw_fini(struct lima_ip *ip)
 {
        u32 stat;
 
@@ -109,3 +109,23 @@ void lima_pmu_fini(struct lima_ip *ip)
                        lima_pmu_wait_cmd(ip);
        }
 }
+
+int lima_pmu_resume(struct lima_ip *ip)
+{
+       return lima_pmu_hw_init(ip);
+}
+
+void lima_pmu_suspend(struct lima_ip *ip)
+{
+       lima_pmu_hw_fini(ip);
+}
+
+int lima_pmu_init(struct lima_ip *ip)
+{
+       return lima_pmu_hw_init(ip);
+}
+
+void lima_pmu_fini(struct lima_ip *ip)
+{
+       lima_pmu_hw_fini(ip);
+}
index a2a1877..652dc7a 100644 (file)
@@ -6,6 +6,8 @@
 
 struct lima_ip;
 
+int lima_pmu_resume(struct lima_ip *ip);
+void lima_pmu_suspend(struct lima_ip *ip);
 int lima_pmu_init(struct lima_ip *ip);
 void lima_pmu_fini(struct lima_ip *ip);
 
index 8fef224..33f0138 100644 (file)
@@ -223,6 +223,23 @@ static void lima_pp_print_version(struct lima_ip *ip)
                 lima_ip_name(ip), name, major, minor);
 }
 
+static int lima_pp_hw_init(struct lima_ip *ip)
+{
+       ip->data.async_reset = false;
+       lima_pp_soft_reset_async(ip);
+       return lima_pp_soft_reset_async_wait(ip);
+}
+
+int lima_pp_resume(struct lima_ip *ip)
+{
+       return lima_pp_hw_init(ip);
+}
+
+void lima_pp_suspend(struct lima_ip *ip)
+{
+
+}
+
 int lima_pp_init(struct lima_ip *ip)
 {
        struct lima_device *dev = ip->dev;
@@ -230,9 +247,7 @@ int lima_pp_init(struct lima_ip *ip)
 
        lima_pp_print_version(ip);
 
-       ip->data.async_reset = false;
-       lima_pp_soft_reset_async(ip);
-       err = lima_pp_soft_reset_async_wait(ip);
+       err = lima_pp_hw_init(ip);
        if (err)
                return err;
 
@@ -254,6 +269,16 @@ void lima_pp_fini(struct lima_ip *ip)
 
 }
 
+int lima_pp_bcast_resume(struct lima_ip *ip)
+{
+       return 0;
+}
+
+void lima_pp_bcast_suspend(struct lima_ip *ip)
+{
+
+}
+
 int lima_pp_bcast_init(struct lima_ip *ip)
 {
        struct lima_device *dev = ip->dev;
index bf60c77..16ec96d 100644 (file)
@@ -7,9 +7,13 @@
 struct lima_ip;
 struct lima_device;
 
+int lima_pp_resume(struct lima_ip *ip);
+void lima_pp_suspend(struct lima_ip *ip);
 int lima_pp_init(struct lima_ip *ip);
 void lima_pp_fini(struct lima_ip *ip);
 
+int lima_pp_bcast_resume(struct lima_ip *ip);
+void lima_pp_bcast_suspend(struct lima_ip *ip);
 int lima_pp_bcast_init(struct lima_ip *ip);
 void lima_pp_bcast_fini(struct lima_ip *ip);