]> git.baikalelectronics.ru Git - kernel.git/commitdiff
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 288398027bfa81f4874290d35b95cf9d794eac81..fbc43f243c54d23721837c0f50477c6bdd6a606a 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 c47e58563d0a208e539a4190a4e6a832e6ce6da8..465ee587bceb2f22b3552f8bb7b01338a74990bf 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 29285dedd124cbca42c5a3d5fc528e13d1c1296e..a2d4ec75b3b3d738885189722412fdd4a2f6b6a2 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 9cd2718079bd6f455801541298c027f9893cc02b..d9df1b45dfa91bab2882cb1edd688f92389b6cfc 100644 (file)
@@ -64,7 +64,7 @@ struct lima_ip {
                bool async_reset;
                /* l2 cache */
                spinlock_t lock;
-               /* pmu */
+               /* pmu/bcast */
                u32 mask;
        } data;
 };
index 8399ceffb94bb8540ee4640ac4114bd652336eea..c1d5ea35daa7aecbea830adf7f946bc644c5166d 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 16f877984466d4eb7849e7b076e8a62075862517..be71daaaee892f46a777995da6bbf387cf657321 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 d8841c870d906ab6dcc8269b23a8f13ddb14ee67..8dd501b7a3d0d8bd3656429c2508e0f937f66e04 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 516e5c1babbb45643bbfd243391fae3b2ab24d0b..02ec9af78a518e8fad9242b754c446d62bb6549f 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 6873a7af5a5ce7a6690079d1900e94c43a7fa01a..c4080a02957ba808307d31190babae70ed116aa1 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 c63fb676ff1412e9163da5a4a46bb2f961758709..1aeeefd53fb9ecd55d253e2489d506f930f02f83 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 c26b751b0f9db4a3ff799bc97be93cdd74cc192c..a1ae6c252dc2b546bad5f12226cad197ff006808 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 4f8ccbebcba147ff023f5f942c7c451caf0658dd..f0c97ac75ea0100b31c81953321a3d99e873800a 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 d476569f20436c0881f3fb3cbe0c6173b48fb88e..e397e1146e96314808b4964576fc419988b11053 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 a2a18775eb07ddcf833723f95d0443fccfa0e1a1..652dc7af30473fff55c8b709083f6bf13907b996 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 8fef224b93c8568fc70bd483739a7cd84d5e49e6..33f01383409c0e80f8f0fd8805ce06f35cb02a77 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 bf60c77b26338f1f181d1fa95437111fe9476f18..16ec96de15a982d6c4f5b4343f6d4a4fcb4a3efe 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);