forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-31 f70575805708cabdedea7498aaa3f710fde4d920
kernel/drivers/soc/rockchip/rockchip_decompress.c
....@@ -93,32 +93,67 @@
9393
9494 static struct rk_decom *g_decom;
9595
96
-static DECLARE_WAIT_QUEUE_HEAD(initrd_decom_done);
97
-static bool initrd_continue;
96
+static DECLARE_WAIT_QUEUE_HEAD(g_decom_wait);
97
+static bool g_decom_complete;
98
+static bool g_decom_noblocking;
99
+static u64 g_decom_data_len;
98100
99101 void __init wait_initrd_hw_decom_done(void)
100102 {
101
- wait_event(initrd_decom_done, initrd_continue);
103
+ wait_event(g_decom_wait, g_decom_complete);
102104 }
105
+
106
+int rk_decom_wait_done(u32 timeout, u64 *decom_len)
107
+{
108
+ int ret;
109
+
110
+ if (!decom_len)
111
+ return -EINVAL;
112
+
113
+ ret = wait_event_timeout(g_decom_wait, g_decom_complete, timeout * HZ);
114
+ if (!ret) {
115
+ if (g_decom)
116
+ clk_bulk_disable_unprepare(g_decom->num_clocks, g_decom->clocks);
117
+
118
+ return -ETIMEDOUT;
119
+ }
120
+
121
+ *decom_len = g_decom_data_len;
122
+
123
+ return 0;
124
+}
125
+EXPORT_SYMBOL(rk_decom_wait_done);
103126
104127 static DECLARE_WAIT_QUEUE_HEAD(decom_init_done);
105128
106129 int rk_decom_start(u32 mode, phys_addr_t src, phys_addr_t dst, u32 dst_max_size)
107130 {
131
+ int ret;
108132 u32 irq_status;
109133 u32 decom_enr;
110
-
111
- pr_info("%s: mode %u src %pa dst %pa max_size %u\n",
112
- __func__, mode, &src, &dst, dst_max_size);
134
+ u32 decom_mode = rk_get_decom_mode(mode);
113135
114136 wait_event_timeout(decom_init_done, g_decom, HZ);
115137 if (!g_decom)
116138 return -EINVAL;
117139
140
+ if (g_decom->mem_start)
141
+ pr_info("%s: mode %u src %pa dst %pa max_size %u\n",
142
+ __func__, mode, &src, &dst, dst_max_size);
143
+
144
+ ret = clk_bulk_prepare_enable(g_decom->num_clocks, g_decom->clocks);
145
+ if (ret)
146
+ return ret;
147
+
148
+ g_decom_complete = false;
149
+ g_decom_data_len = 0;
150
+ g_decom_noblocking = rk_get_noblocking_flag(mode);
151
+
118152 decom_enr = readl(g_decom->regs + DECOM_ENR);
119153 if (decom_enr & 0x1) {
120154 pr_err("decompress busy\n");
121
- return -EBUSY;
155
+ ret = -EBUSY;
156
+ goto error;
122157 }
123158
124159 if (g_decom->reset) {
....@@ -132,7 +167,7 @@
132167 if (irq_status)
133168 writel(irq_status, g_decom->regs + DECOM_ISR);
134169
135
- switch (mode) {
170
+ switch (decom_mode) {
136171 case LZ4_MOD:
137172 writel(LZ4_CONT_CSUM_CHECK_EN |
138173 LZ4_HEAD_CSUM_CHECK_EN |
....@@ -148,8 +183,9 @@
148183 g_decom->regs + DECOM_CTRL);
149184 break;
150185 default:
151
- pr_err("undefined mode : %d\n", mode);
152
- return -EINVAL;
186
+ pr_err("undefined mode : %d\n", decom_mode);
187
+ ret = -EINVAL;
188
+ goto error;
153189 }
154190
155191 writel(src, g_decom->regs + DECOM_RADDR);
....@@ -161,9 +197,11 @@
161197 writel(DECOM_INT_MASK, g_decom->regs + DECOM_IEN);
162198 writel(DECOM_ENABLE, g_decom->regs + DECOM_ENR);
163199
164
- pr_info("%s: started\n", __func__);
165
-
166200 return 0;
201
+error:
202
+ clk_bulk_disable_unprepare(g_decom->num_clocks, g_decom->clocks);
203
+
204
+ return ret;
167205 }
168206 EXPORT_SYMBOL(rk_decom_start);
169207
....@@ -179,9 +217,15 @@
179217 if (irq_status & DECOM_STOP) {
180218 decom_status = readl(rk_dec->regs + DECOM_STAT);
181219 if (decom_status & DECOM_COMPLETE) {
182
- initrd_continue = true;
183
- wake_up(&initrd_decom_done);
184
- dev_info(rk_dec->dev, "decom completed\n");
220
+ g_decom_complete = true;
221
+ g_decom_data_len = readl(rk_dec->regs + DECOM_TSIZEH);
222
+ g_decom_data_len = (g_decom_data_len << 32) |
223
+ readl(rk_dec->regs + DECOM_TSIZEL);
224
+ wake_up(&g_decom_wait);
225
+ if (rk_dec->mem_start)
226
+ dev_info(rk_dec->dev,
227
+ "decom completed, decom_data_len = %llu\n",
228
+ g_decom_data_len);
185229 } else {
186230 dev_info(rk_dec->dev,
187231 "decom failed, irq_status = 0x%x, decom_status = 0x%x, try again !\n",
....@@ -190,7 +234,18 @@
190234 print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET,
191235 32, 4, rk_dec->regs, 0x128, false);
192236
193
- writel(DECOM_ENABLE, rk_dec->regs + DECOM_ENR);
237
+ if (g_decom_noblocking) {
238
+ dev_info(rk_dec->dev, "decom failed and exit in noblocking mode.");
239
+ writel(DECOM_DISABLE, rk_dec->regs + DECOM_ENR);
240
+ writel(0, g_decom->regs + DECOM_IEN);
241
+
242
+ g_decom_complete = true;
243
+ g_decom_data_len = 0;
244
+ g_decom_noblocking = false;
245
+ wake_up(&g_decom_wait);
246
+ } else {
247
+ writel(DECOM_ENABLE, rk_dec->regs + DECOM_ENR);
248
+ }
194249 }
195250 }
196251
....@@ -201,16 +256,20 @@
201256 {
202257 struct rk_decom *rk_dec = priv;
203258
204
- if (initrd_continue) {
259
+ if (g_decom_complete) {
205260 void *start, *end;
206261
207
- /*
208
- * Now it is safe to free reserve memory that
209
- * store the origin ramdisk file
210
- */
211
- start = phys_to_virt(rk_dec->mem_start);
212
- end = start + rk_dec->mem_size;
213
- free_reserved_area(start, end, -1, "ramdisk gzip archive");
262
+ if (rk_dec->mem_start) {
263
+ /*
264
+ * Now it is safe to free reserve memory that
265
+ * store the origin ramdisk file
266
+ */
267
+ start = phys_to_virt(rk_dec->mem_start);
268
+ end = start + rk_dec->mem_size;
269
+ free_reserved_area(start, end, -1, "ramdisk gzip archive");
270
+ rk_dec->mem_start = 0;
271
+ }
272
+
214273 clk_bulk_disable_unprepare(rk_dec->num_clocks, rk_dec->clocks);
215274 }
216275
....@@ -259,10 +318,6 @@
259318 dev_err(dev, "failed to get decompress clock\n");
260319 return -ENODEV;
261320 }
262
-
263
- ret = clk_bulk_prepare_enable(rk_dec->num_clocks, rk_dec->clocks);
264
- if (ret)
265
- return ret;
266321
267322 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
268323 rk_dec->regs = devm_ioremap_resource(dev, res);