1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
From 7504f92483407233d9093e164d8f001db5c374e5 Mon Sep 17 00:00:00 2001
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
Date: Fri, 8 May 2020 22:05:29 +0100
Subject: [PATCH] staging: vc04_services: isp: Rework lens shading to
take a dmabuf
This removes the need for the client to use vcsm at all.
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
---
.../bcm2835-isp/bcm2835-v4l2-isp.c | 36 +++++++++++++++++--
include/uapi/linux/bcm2835-isp.h | 4 +--
2 files changed, 35 insertions(+), 5 deletions(-)
--- a/drivers/staging/vc04_services/bcm2835-isp/bcm2835-v4l2-isp.c
+++ b/drivers/staging/vc04_services/bcm2835-isp/bcm2835-v4l2-isp.c
@@ -21,6 +21,8 @@
#include "vchiq-mmal/mmal-parameters.h"
#include "vchiq-mmal/mmal-vchiq.h"
+#include "vc-sm-cma/vc_sm_knl.h"
+
#include "bcm2835_isp_ctrls.h"
#include "bcm2835_isp_fmts.h"
@@ -722,10 +724,38 @@ static int bcm2835_isp_s_ctrl(struct v4l
sizeof(struct bcm2835_isp_custom_ccm));
break;
case V4L2_CID_USER_BCM2835_ISP_LENS_SHADING:
- ret = set_isp_param(node, MMAL_PARAMETER_LENS_SHADING_OVERRIDE,
- ctrl->p_new.p_u8,
- sizeof(struct bcm2835_isp_lens_shading));
+ {
+ struct bcm2835_isp_lens_shading ls;
+ struct dma_buf *dmabuf;
+ void *vcsm_handle;
+
+ memcpy(&ls, ctrl->p_new.p_u8,
+ sizeof(struct bcm2835_isp_lens_shading));
+
+ dmabuf = dma_buf_get(ls.dmabuf);
+ if (!dmabuf)
+ return -EINVAL;
+
+ ret = vc_sm_cma_import_dmabuf(dmabuf,
+ &vcsm_handle);
+ if (ret) {
+ dma_buf_put(dmabuf);
+ return -EINVAL;
+ }
+
+ ls.dmabuf = vc_sm_cma_int_handle(vcsm_handle);
+ if (ls.dmabuf)
+ ret = set_isp_param(node,
+ MMAL_PARAMETER_LENS_SHADING_OVERRIDE,
+ &ls,
+ sizeof(struct bcm2835_isp_lens_shading));
+ else
+ ret = -EINVAL;
+
+ vc_sm_cma_free(vcsm_handle);
+ dma_buf_put(dmabuf);
break;
+ }
case V4L2_CID_USER_BCM2835_ISP_BLACK_LEVEL:
ret = set_isp_param(node, MMAL_PARAMETER_BLACK_LEVEL,
ctrl->p_new.p_u8,
--- a/include/uapi/linux/bcm2835-isp.h
+++ b/include/uapi/linux/bcm2835-isp.h
@@ -108,7 +108,7 @@ enum bcm2835_isp_gain_format {
* @grid_stride: Row to row distance (in grid cells) between grid cells
* in the same horizontal location.
* @grid_height: Height of lens shading tables in grid cells.
- * @mem_handle_table: Memory handle to the tables.
+ * @dmabuf: dmabuf file handle containing the table.
* @ref_transform: Reference transform - unsupported, please pass zero.
* @corner_sampled: Whether the gains are sampled at the corner points
* of the grid cells or in the cell centres.
@@ -120,7 +120,7 @@ struct bcm2835_isp_lens_shading {
__u32 grid_width;
__u32 grid_stride;
__u32 grid_height;
- __u32 mem_handle_table;
+ __s32 dmabuf;
__u32 ref_transform;
__u32 corner_sampled;
__u32 gain_format;
|