1 From 99f60a25458ac553ff609f5bdbf4db7dade46d9a Mon Sep 17 00:00:00 2001
2 From: Yuichi Kusakabe <yuichi.kusakabe@jp.fujitsu.com>
3 Date: Sat, 10 Jun 2017 20:26:26 +0900
4 Subject: [PATCH] Fix for memory corruption during hibernate
6 Signed-off-by: Yuichi Kusakabe <yuichi.kusakabe@jp.fujitsu.com>
8 drv/mmngr_drv.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
9 1 file changed, 106 insertions(+), 3 deletions(-)
11 diff --git a/drv/mmngr_drv.c b/drv/mmngr_drv.c
12 index 797800f..91f6c6e 100755
15 @@ -844,7 +844,7 @@ static struct miscdevice misc = {
16 extern struct cma *rcar_gen2_dma_contiguous;
19 -static int mm_init(void)
20 +static int mmngr_probe(struct platform_device *pdev)
23 struct MM_DRVDATA *p = NULL;
24 @@ -946,16 +946,16 @@ static int mm_init(void)
25 printk(KERN_ERR "MMD reserve area from 0x%08x to 0x%08x at physical\n",
26 (unsigned int)phy_addr,
27 (unsigned int)phy_addr + MM_KERNEL_RESERVE_SIZE - 1);
29 #ifdef MMNGR_IPMMU_ENABLE
30 r8a779x_ipmmu_startup();
31 r8a779x_ipmmu_initialize(IPMMUMX_DOMAIN);
38 -static void mm_exit(void)
39 +static int mmngr_remove(struct platform_device *pdev)
41 #ifdef MMNGR_IPMMU_ENABLE
42 r8a779x_ipmmu_cleanup();
43 @@ -983,6 +983,109 @@ static void mm_exit(void)
49 +static int mmngr_suspend(struct device *dev)
53 +static int mmngr_resume(struct device *dev)
57 +static int mmngr_freeze(struct device *dev)
59 +#if defined(MMNGR_KOELSCH) || defined(MMNGR_LAGER) || \
60 + defined(MMNGR_ALT) || defined(MMNGR_GOSE)
61 + iowrite32((~MM_IMPCTR_VAL) & ioread32(top_impctr), top_impctr);
63 + mm_set_mxi_path(0, 0);
64 + dma_free_coherent(mm_drvdata->mm_dev_reserve,
65 + mm_drvdata->reserve_size,
66 + (void *)mm_drvdata->reserve_kernel_virt_addr,
67 + (dma_addr_t)mm_drvdata->reserve_phy_addr);
70 +static int mmngr_thaw(struct device *dev)
72 + void *pkernel_virt_addr;
73 + mm_set_mxi_path(MM_OMXBUF_MXI_ADDR,
74 + MM_OMXBUF_MXI_ADDR + MM_OMXBUF_SIZE);
75 + pkernel_virt_addr = dma_alloc_coherent(mm_drvdata->mm_dev_reserve,
76 + MM_KERNEL_RESERVE_SIZE,
77 + (dma_addr_t *)&mm_drvdata->reserve_phy_addr,
79 + mm_drvdata->reserve_kernel_virt_addr = (unsigned long)pkernel_virt_addr;
82 +static int mmngr_restore(struct device *dev)
84 + void *pkernel_virt_addr;
85 + mm_set_mxi_path(MM_OMXBUF_MXI_ADDR,
86 + MM_OMXBUF_MXI_ADDR + MM_OMXBUF_SIZE);
89 + if ((MM_PRR_ESMASK & ioread32(top_prr)) >= MM_PRR_ES2) {
91 + mm_set_pmb_area(MM_OMXBUF_ADDR, top_impmba0, top_impmbd0);
92 + mm_enable_vpc_utlb();
96 + if ((MM_PRR_ESMASK & ioread32(top_prr)) >= MM_PRR_ES2) {
98 + mm_set_pmb_area(MM_OMXBUF_ADDR, top_impmba0, top_impmbd0);
99 + mm_set_pmb_area(MM_OMXBUF_ADDR + MM_PMB_SIZE_128M,
100 + top_impmba1, top_impmbd1);
101 + mm_enable_vpc_utlb();
106 + mm_set_pmb_area(MM_OMXBUF_ADDR, top_impmba0, top_impmbd0);
107 + mm_enable_vpc_utlb();
111 + mm_set_pmb_area(MM_OMXBUF_ADDR, top_impmba0, top_impmbd0);
112 + mm_enable_vpc_utlb();
114 + pkernel_virt_addr = dma_alloc_coherent(mm_drvdata->mm_dev_reserve,
115 + MM_KERNEL_RESERVE_SIZE,
116 + (dma_addr_t *)&mm_drvdata->reserve_phy_addr,
118 + mm_drvdata->reserve_kernel_virt_addr = (unsigned long)pkernel_virt_addr;
122 +static const struct dev_pm_ops mmngr_pm_ops = {
123 + SET_SYSTEM_SLEEP_PM_OPS(mmngr_suspend, mmngr_resume)
124 + .freeze = mmngr_freeze,
125 + .thaw = mmngr_thaw,
126 + .restore = mmngr_restore,
128 +struct platform_driver mmngr_driver = {
129 + .probe = mmngr_probe,
130 + .remove = mmngr_remove,
133 + .pm = &mmngr_pm_ops,
136 +struct platform_device mmngr_device = {
140 +static int mm_init(void)
142 + platform_driver_register(&mmngr_driver);
143 + platform_device_register(&mmngr_device);
146 +static void mm_exit(void)
148 + platform_device_unregister(&mmngr_device);
149 + platform_driver_unregister(&mmngr_driver);
152 module_init(mm_init);