hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/video/rockchip/rga3/rga_mm.c
....@@ -455,6 +455,7 @@
455455 phys_addr = sg_phys(buffer->sgt->sgl);
456456 if (phys_addr == 0) {
457457 pr_err("%s get physical address error!", __func__);
458
+ ret = -EFAULT;
458459 goto unmap_buffer;
459460 }
460461
....@@ -571,6 +572,7 @@
571572 phys_addr = sg_phys(sgt->sgl);
572573 if (phys_addr == 0) {
573574 pr_err("%s get physical address error!", __func__);
575
+ ret = -EFAULT;
574576 goto free_sgt;
575577 }
576578
....@@ -621,8 +623,9 @@
621623 if (mm_flag & RGA_MEM_PHYSICAL_CONTIGUOUS)
622624 break;
623625
624
- pr_err("Current %s[%d] cannot support virtual address!\n",
626
+ pr_err("Current %s[%d] cannot support physically discontinuous virtual address!\n",
625627 rga_get_mmu_type_str(scheduler->data->mmu), scheduler->data->mmu);
628
+ ret = -EOPNOTSUPP;
626629 goto free_dma_buffer;
627630 }
628631
....@@ -840,9 +843,15 @@
840843 return 0;
841844 }
842845
846
+static void rga_mm_buffer_destroy(struct rga_internal_buffer *buffer)
847
+{
848
+ rga_mm_kref_release_buffer(&buffer->refcount);
849
+}
850
+
843851 static struct rga_internal_buffer *
844852 rga_mm_lookup_external(struct rga_mm *mm_session,
845
- struct rga_external_buffer *external_buffer)
853
+ struct rga_external_buffer *external_buffer,
854
+ struct mm_struct *current_mm)
846855 {
847856 int id;
848857 struct dma_buf *dma_buf = NULL;
....@@ -875,8 +884,12 @@
875884 continue;
876885
877886 if (temp_buffer->virt_addr->addr == external_buffer->memory) {
878
- output_buffer = temp_buffer;
879
- break;
887
+ if (temp_buffer->current_mm == current_mm) {
888
+ output_buffer = temp_buffer;
889
+ break;
890
+ }
891
+
892
+ continue;
880893 }
881894 }
882895
....@@ -1309,7 +1322,8 @@
13091322 return -EFAULT;
13101323 }
13111324
1312
- if (buffer->mm_flag & RGA_MEM_PHYSICAL_CONTIGUOUS) {
1325
+ if (buffer->mm_flag & RGA_MEM_PHYSICAL_CONTIGUOUS &&
1326
+ scheduler->data->mmu != RGA_IOMMU) {
13131327 dma_sync_single_for_device(scheduler->dev, buffer->phys_addr, buffer->size, dir);
13141328 } else {
13151329 sgt = rga_mm_lookup_sgt(buffer);
....@@ -1339,7 +1353,8 @@
13391353 return -EFAULT;
13401354 }
13411355
1342
- if (buffer->mm_flag & RGA_MEM_PHYSICAL_CONTIGUOUS) {
1356
+ if (buffer->mm_flag & RGA_MEM_PHYSICAL_CONTIGUOUS &&
1357
+ scheduler->data->mmu != RGA_IOMMU) {
13431358 dma_sync_single_for_cpu(scheduler->dev, buffer->phys_addr, buffer->size, dir);
13441359 } else {
13451360 sgt = rga_mm_lookup_sgt(buffer);
....@@ -1481,6 +1496,11 @@
14811496 if (internal_buffer->mm_flag & RGA_MEM_FORCE_FLUSH_CACHE && dir != DMA_NONE)
14821497 if (rga_mm_sync_dma_sg_for_cpu(internal_buffer, job, dir))
14831498 pr_err("sync sgt for cpu error!\n");
1499
+
1500
+ if (DEBUGGER_EN(MM)) {
1501
+ pr_info("handle[%d] put info:\n", (int)internal_buffer->handle);
1502
+ rga_mm_dump_buffer(internal_buffer);
1503
+ }
14841504
14851505 mutex_lock(&mm->lock);
14861506 kref_put(&internal_buffer->refcount, rga_mm_kref_release_buffer);
....@@ -1981,6 +2001,7 @@
19812001 int rga_mm_map_job_info(struct rga_job *job)
19822002 {
19832003 int ret;
2004
+ ktime_t timestamp = ktime_get();
19842005
19852006 if (job->flags & RGA_JOB_USE_HANDLE) {
19862007 ret = rga_mm_get_handle_info(job);
....@@ -1988,12 +2009,20 @@
19882009 pr_err("failed to get buffer from handle\n");
19892010 return ret;
19902011 }
2012
+
2013
+ if (DEBUGGER_EN(TIME))
2014
+ pr_info("request[%d], get buffer_handle info cost %lld us\n",
2015
+ job->request_id, ktime_us_delta(ktime_get(), timestamp));
19912016 } else {
19922017 ret = rga_mm_map_buffer_info(job);
19932018 if (ret < 0) {
19942019 pr_err("failed to map buffer\n");
19952020 return ret;
19962021 }
2022
+
2023
+ if (DEBUGGER_EN(TIME))
2024
+ pr_info("request[%d], map buffer cost %lld us\n",
2025
+ job->request_id, ktime_us_delta(ktime_get(), timestamp));
19972026 }
19982027
19992028 return 0;
....@@ -2001,14 +2030,35 @@
20012030
20022031 void rga_mm_unmap_job_info(struct rga_job *job)
20032032 {
2004
- if (job->flags & RGA_JOB_USE_HANDLE)
2033
+ ktime_t timestamp = ktime_get();
2034
+
2035
+ if (job->flags & RGA_JOB_USE_HANDLE) {
20052036 rga_mm_put_handle_info(job);
2006
- else
2037
+
2038
+ if (DEBUGGER_EN(TIME))
2039
+ pr_info("request[%d], put buffer_handle info cost %lld us\n",
2040
+ job->request_id, ktime_us_delta(ktime_get(), timestamp));
2041
+ } else {
20072042 rga_mm_unmap_buffer_info(job);
2043
+
2044
+ if (DEBUGGER_EN(TIME))
2045
+ pr_info("request[%d], unmap buffer cost %lld us\n",
2046
+ job->request_id, ktime_us_delta(ktime_get(), timestamp));
2047
+ }
20082048 }
20092049
2010
-uint32_t rga_mm_import_buffer(struct rga_external_buffer *external_buffer,
2011
- struct rga_session *session)
2050
+/*
2051
+ * rga_mm_import_buffer - Importing external buffer into the RGA driver
2052
+ *
2053
+ * @external_buffer: [in] Parameters of external buffer
2054
+ * @session: [in] Session of the current process
2055
+ *
2056
+ * returns:
2057
+ * if return value > 0, the buffer import is successful and is the generated
2058
+ * buffer-handle, negative error code on failure.
2059
+ */
2060
+int rga_mm_import_buffer(struct rga_external_buffer *external_buffer,
2061
+ struct rga_session *session)
20122062 {
20132063 int ret = 0, new_id;
20142064 struct rga_mm *mm;
....@@ -2017,17 +2067,23 @@
20172067 mm = rga_drvdata->mm;
20182068 if (mm == NULL) {
20192069 pr_err("rga mm is null!\n");
2020
- return 0;
2070
+ return -EFAULT;
20212071 }
20222072
20232073 mutex_lock(&mm->lock);
20242074
20252075 /* first, Check whether to rga_mm */
2026
- internal_buffer = rga_mm_lookup_external(mm, external_buffer);
2076
+ internal_buffer = rga_mm_lookup_external(mm, external_buffer, current->mm);
20272077 if (!IS_ERR_OR_NULL(internal_buffer)) {
20282078 kref_get(&internal_buffer->refcount);
20292079
20302080 mutex_unlock(&mm->lock);
2081
+
2082
+ if (DEBUGGER_EN(MM)) {
2083
+ pr_info("import existing buffer:\n");
2084
+ rga_mm_dump_buffer(internal_buffer);
2085
+ }
2086
+
20312087 return internal_buffer->handle;
20322088 }
20332089
....@@ -2037,7 +2093,7 @@
20372093 pr_err("%s alloc internal_buffer error!\n", __func__);
20382094
20392095 mutex_unlock(&mm->lock);
2040
- return 0;
2096
+ return -ENOMEM;
20412097 }
20422098
20432099 ret = rga_mm_map_buffer(external_buffer, internal_buffer, NULL, true);
....@@ -2056,6 +2112,7 @@
20562112 idr_preload_end();
20572113 if (new_id < 0) {
20582114 pr_err("internal_buffer alloc id failed!\n");
2115
+ ret = new_id;
20592116 goto FREE_INTERNAL_BUFFER;
20602117 }
20612118
....@@ -2074,7 +2131,7 @@
20742131 mutex_unlock(&mm->lock);
20752132 kfree(internal_buffer);
20762133
2077
- return 0;
2134
+ return ret;
20782135 }
20792136
20802137 int rga_mm_release_buffer(uint32_t handle)
....@@ -2126,9 +2183,9 @@
21262183
21272184 idr_for_each_entry(&mm->memory_idr, buffer, i) {
21282185 if (session == buffer->session) {
2129
- pr_err("[tgid:%d] Decrement the reference of handle[%d] when the user exits\n",
2186
+ pr_err("[tgid:%d] Destroy handle[%d] when the user exits\n",
21302187 session->tgid, buffer->handle);
2131
- kref_put(&buffer->refcount, rga_mm_kref_release_buffer);
2188
+ rga_mm_buffer_destroy(buffer);
21322189 }
21332190 }
21342191