mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 04:01:48 -04:00
Linux 4.20-rc7
-----BEGIN PGP SIGNATURE----- iQFSBAABCAA8FiEEq68RxlopcLEwq+PEeb4+QwBBGIYFAlwW4/oeHHRvcnZhbGRz QGxpbnV4LWZvdW5kYXRpb24ub3JnAAoJEHm+PkMAQRiG2QMH/Rl6iMpTUX23tMHe eXQzAOSvQXaWlFoX25j1Jvt8nhS7Uy8vkdpYTCOI/7DF0Jg4O/6uxcZkErlwWxb8 MW1rMgpfO+OpDLSLXAO2GKxaKI3ArqF2BcOQA2mji1/jR2VUTqmIvBoudn5d+GYz 19aCyfdzmVTC38G9sBhhcqJ10EkxLiHe2K74bf4JxVuSf2EnTI4LYt5xJPDoT0/C 6fOeUNwVhvv5a4svvzJmortq7x7BwyxBQArc7PbO0MPhabLU4wyFUOTRszgsGd76 o5JuOFwgdIIHlSSacGla6rKq10nmkwR07fHfRFFwbvrfBOEHsXOP2hvzMZX+FLBK IXOzdtc= =XlMc -----END PGP SIGNATURE----- Merge tag 'v4.20-rc7' into patchwork Linux 4.20-rc7 * tag 'v4.20-rc7': (403 commits) Linux 4.20-rc7 scripts/spdxcheck.py: always open files in binary mode checkstack.pl: fix for aarch64 userfaultfd: check VM_MAYWRITE was set after verifying the uffd is registered fs/iomap.c: get/put the page in iomap_page_create/release() hugetlbfs: call VM_BUG_ON_PAGE earlier in free_huge_page() memblock: annotate memblock_is_reserved() with __init_memblock psi: fix reference to kernel commandline enable arch/sh/include/asm/io.h: provide prototypes for PCI I/O mapping in asm/io.h mm/sparse: add common helper to mark all memblocks present mm: introduce common STRUCT_PAGE_MAX_SHIFT define alpha: fix hang caused by the bootmem removal XArray: Fix xa_alloc when id exceeds max drm/vmwgfx: Protect from excessive execbuf kernel memory allocations v3 MAINTAINERS: Daniel for drm co-maintainer drm/amdgpu: drop fclk/gfxclk ratio setting IB/core: Fix oops in netdev_next_upper_dev_rcu() dm thin: bump target version drm/vmwgfx: remove redundant return ret statement drm/i915: Flush GPU relocs harder for gen3 ...
This commit is contained in:
commit
4bd257d884
415 changed files with 4599 additions and 1992 deletions
|
|
@ -110,6 +110,19 @@ config MEDIA_CONTROLLER_DVB
|
|||
|
||||
This is currently experimental.
|
||||
|
||||
config MEDIA_CONTROLLER_REQUEST_API
|
||||
bool "Enable Media controller Request API (EXPERIMENTAL)"
|
||||
depends on MEDIA_CONTROLLER && STAGING_MEDIA
|
||||
default n
|
||||
---help---
|
||||
DO NOT ENABLE THIS OPTION UNLESS YOU KNOW WHAT YOU'RE DOING.
|
||||
|
||||
This option enables the Request API for the Media controller and V4L2
|
||||
interfaces. It is currently needed by a few stateless codec drivers.
|
||||
|
||||
There is currently no intention to provide API or ABI stability for
|
||||
this new API as of yet.
|
||||
|
||||
#
|
||||
# Video4Linux support
|
||||
# Only enables if one of the V4L2 types (ATV, webcam, radio) is selected
|
||||
|
|
|
|||
|
|
@ -948,7 +948,7 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
|
|||
}
|
||||
atomic_dec(&q->owned_by_drv_count);
|
||||
|
||||
if (vb->req_obj.req) {
|
||||
if (state != VB2_BUF_STATE_QUEUED && vb->req_obj.req) {
|
||||
/* This is not supported at the moment */
|
||||
WARN_ON(state == VB2_BUF_STATE_REQUEUEING);
|
||||
media_request_object_unbind(&vb->req_obj);
|
||||
|
|
@ -1360,8 +1360,12 @@ static void vb2_req_release(struct media_request_object *obj)
|
|||
{
|
||||
struct vb2_buffer *vb = container_of(obj, struct vb2_buffer, req_obj);
|
||||
|
||||
if (vb->state == VB2_BUF_STATE_IN_REQUEST)
|
||||
if (vb->state == VB2_BUF_STATE_IN_REQUEST) {
|
||||
vb->state = VB2_BUF_STATE_DEQUEUED;
|
||||
if (vb->request)
|
||||
media_request_put(vb->request);
|
||||
vb->request = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct media_request_object_ops vb2_core_req_ops = {
|
||||
|
|
@ -1529,6 +1533,18 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb,
|
|||
return ret;
|
||||
|
||||
vb->state = VB2_BUF_STATE_IN_REQUEST;
|
||||
|
||||
/*
|
||||
* Increment the refcount and store the request.
|
||||
* The request refcount is decremented again when the
|
||||
* buffer is dequeued. This is to prevent vb2_buffer_done()
|
||||
* from freeing the request from interrupt context, which can
|
||||
* happen if the application closed the request fd after
|
||||
* queueing the request.
|
||||
*/
|
||||
media_request_get(req);
|
||||
vb->request = req;
|
||||
|
||||
/* Fill buffer information for the userspace */
|
||||
if (pb) {
|
||||
call_void_bufop(q, copy_timestamp, vb, pb);
|
||||
|
|
@ -1750,10 +1766,6 @@ static void __vb2_dqbuf(struct vb2_buffer *vb)
|
|||
call_void_memop(vb, unmap_dmabuf, vb->planes[i].mem_priv);
|
||||
vb->planes[i].dbuf_mapped = 0;
|
||||
}
|
||||
if (vb->req_obj.req) {
|
||||
media_request_object_unbind(&vb->req_obj);
|
||||
media_request_object_put(&vb->req_obj);
|
||||
}
|
||||
call_void_bufop(q, init_buffer, vb);
|
||||
}
|
||||
|
||||
|
|
@ -1798,6 +1810,14 @@ int vb2_core_dqbuf(struct vb2_queue *q, unsigned int *pindex, void *pb,
|
|||
/* go back to dequeued state */
|
||||
__vb2_dqbuf(vb);
|
||||
|
||||
if (WARN_ON(vb->req_obj.req)) {
|
||||
media_request_object_unbind(&vb->req_obj);
|
||||
media_request_object_put(&vb->req_obj);
|
||||
}
|
||||
if (vb->request)
|
||||
media_request_put(vb->request);
|
||||
vb->request = NULL;
|
||||
|
||||
dprintk(2, "dqbuf of buffer %d, with state %d\n",
|
||||
vb->index, vb->state);
|
||||
|
||||
|
|
@ -1904,6 +1924,14 @@ static void __vb2_queue_cancel(struct vb2_queue *q)
|
|||
vb->prepared = false;
|
||||
}
|
||||
__vb2_dqbuf(vb);
|
||||
|
||||
if (vb->req_obj.req) {
|
||||
media_request_object_unbind(&vb->req_obj);
|
||||
media_request_object_put(&vb->req_obj);
|
||||
}
|
||||
if (vb->request)
|
||||
media_request_put(vb->request);
|
||||
vb->request = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1941,10 +1969,8 @@ int vb2_core_streamon(struct vb2_queue *q, unsigned int type)
|
|||
if (ret)
|
||||
return ret;
|
||||
ret = vb2_start_streaming(q);
|
||||
if (ret) {
|
||||
__vb2_queue_cancel(q);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
q->streaming = 1;
|
||||
|
|
|
|||
|
|
@ -332,10 +332,10 @@ static int vb2_fill_vb2_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b
|
|||
}
|
||||
|
||||
static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *mdev,
|
||||
struct v4l2_buffer *b,
|
||||
const char *opname,
|
||||
struct v4l2_buffer *b, bool is_prepare,
|
||||
struct media_request **p_req)
|
||||
{
|
||||
const char *opname = is_prepare ? "prepare_buf" : "qbuf";
|
||||
struct media_request *req;
|
||||
struct vb2_v4l2_buffer *vbuf;
|
||||
struct vb2_buffer *vb;
|
||||
|
|
@ -377,6 +377,9 @@ static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *md
|
|||
return ret;
|
||||
}
|
||||
|
||||
if (is_prepare)
|
||||
return 0;
|
||||
|
||||
if (!(b->flags & V4L2_BUF_FLAG_REQUEST_FD)) {
|
||||
if (q->uses_requests) {
|
||||
dprintk(1, "%s: queue uses requests\n", opname);
|
||||
|
|
@ -630,8 +633,10 @@ static void fill_buf_caps(struct vb2_queue *q, u32 *caps)
|
|||
*caps |= V4L2_BUF_CAP_SUPPORTS_USERPTR;
|
||||
if (q->io_modes & VB2_DMABUF)
|
||||
*caps |= V4L2_BUF_CAP_SUPPORTS_DMABUF;
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER_REQUEST_API
|
||||
if (q->supports_requests)
|
||||
*caps |= V4L2_BUF_CAP_SUPPORTS_REQUESTS;
|
||||
#endif
|
||||
}
|
||||
|
||||
int vb2_reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req)
|
||||
|
|
@ -656,7 +661,7 @@ int vb2_prepare_buf(struct vb2_queue *q, struct media_device *mdev,
|
|||
if (b->flags & V4L2_BUF_FLAG_REQUEST_FD)
|
||||
return -EINVAL;
|
||||
|
||||
ret = vb2_queue_or_prepare_buf(q, mdev, b, "prepare_buf", NULL);
|
||||
ret = vb2_queue_or_prepare_buf(q, mdev, b, true, NULL);
|
||||
|
||||
return ret ? ret : vb2_core_prepare_buf(q, b->index, b);
|
||||
}
|
||||
|
|
@ -728,7 +733,7 @@ int vb2_qbuf(struct vb2_queue *q, struct media_device *mdev,
|
|||
return -EBUSY;
|
||||
}
|
||||
|
||||
ret = vb2_queue_or_prepare_buf(q, mdev, b, "qbuf", &req);
|
||||
ret = vb2_queue_or_prepare_buf(q, mdev, b, false, &req);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = vb2_core_qbuf(q, b->index, b, req);
|
||||
|
|
|
|||
|
|
@ -381,10 +381,14 @@ static long media_device_get_topology(struct media_device *mdev, void *arg)
|
|||
static long media_device_request_alloc(struct media_device *mdev,
|
||||
int *alloc_fd)
|
||||
{
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER_REQUEST_API
|
||||
if (!mdev->ops || !mdev->ops->req_validate || !mdev->ops->req_queue)
|
||||
return -ENOTTY;
|
||||
|
||||
return media_request_alloc(mdev, alloc_fd);
|
||||
#else
|
||||
return -ENOTTY;
|
||||
#endif
|
||||
}
|
||||
|
||||
static long copy_arg_from_user(void *karg, void __user *uarg, unsigned int cmd)
|
||||
|
|
|
|||
|
|
@ -1006,11 +1006,18 @@ static int vicodec_start_streaming(struct vb2_queue *q,
|
|||
|
||||
q_data->sequence = 0;
|
||||
|
||||
if (!V4L2_TYPE_IS_OUTPUT(q->type))
|
||||
if (!V4L2_TYPE_IS_OUTPUT(q->type)) {
|
||||
if (!ctx->is_enc) {
|
||||
state->width = q_data->width;
|
||||
state->height = q_data->height;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
state->width = q_data->width;
|
||||
state->height = q_data->height;
|
||||
if (ctx->is_enc) {
|
||||
state->width = q_data->width;
|
||||
state->height = q_data->height;
|
||||
}
|
||||
state->ref_frame.width = state->ref_frame.height = 0;
|
||||
state->ref_frame.luma = kvmalloc(total_planes_size, GFP_KERNEL);
|
||||
ctx->comp_max_size = total_planes_size + sizeof(struct fwht_cframe_hdr);
|
||||
|
|
|
|||
|
|
@ -276,8 +276,6 @@ static int sdr_cap_start_streaming(struct vb2_queue *vq, unsigned count)
|
|||
|
||||
list_for_each_entry_safe(buf, tmp, &dev->sdr_cap_active, list) {
|
||||
list_del(&buf->list);
|
||||
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
|
||||
&dev->ctrl_hdl_sdr_cap);
|
||||
vb2_buffer_done(&buf->vb.vb2_buf,
|
||||
VB2_BUF_STATE_QUEUED);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -200,8 +200,6 @@ static int vbi_cap_start_streaming(struct vb2_queue *vq, unsigned count)
|
|||
|
||||
list_for_each_entry_safe(buf, tmp, &dev->vbi_cap_active, list) {
|
||||
list_del(&buf->list);
|
||||
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
|
||||
&dev->ctrl_hdl_vbi_cap);
|
||||
vb2_buffer_done(&buf->vb.vb2_buf,
|
||||
VB2_BUF_STATE_QUEUED);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -96,8 +96,6 @@ static int vbi_out_start_streaming(struct vb2_queue *vq, unsigned count)
|
|||
|
||||
list_for_each_entry_safe(buf, tmp, &dev->vbi_out_active, list) {
|
||||
list_del(&buf->list);
|
||||
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
|
||||
&dev->ctrl_hdl_vbi_out);
|
||||
vb2_buffer_done(&buf->vb.vb2_buf,
|
||||
VB2_BUF_STATE_QUEUED);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -243,8 +243,6 @@ static int vid_cap_start_streaming(struct vb2_queue *vq, unsigned count)
|
|||
|
||||
list_for_each_entry_safe(buf, tmp, &dev->vid_cap_active, list) {
|
||||
list_del(&buf->list);
|
||||
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
|
||||
&dev->ctrl_hdl_vid_cap);
|
||||
vb2_buffer_done(&buf->vb.vb2_buf,
|
||||
VB2_BUF_STATE_QUEUED);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -162,8 +162,6 @@ static int vid_out_start_streaming(struct vb2_queue *vq, unsigned count)
|
|||
|
||||
list_for_each_entry_safe(buf, tmp, &dev->vid_out_active, list) {
|
||||
list_del(&buf->list);
|
||||
v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
|
||||
&dev->ctrl_hdl_vid_out);
|
||||
vb2_buffer_done(&buf->vb.vb2_buf,
|
||||
VB2_BUF_STATE_QUEUED);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ static void lif_configure_stream(struct vsp1_entity *entity,
|
|||
format = vsp1_entity_get_pad_format(&lif->entity, lif->entity.config,
|
||||
LIF_PAD_SOURCE);
|
||||
|
||||
switch (entity->vsp1->version & VI6_IP_VERSION_SOC_MASK) {
|
||||
switch (entity->vsp1->version & VI6_IP_VERSION_MODEL_MASK) {
|
||||
case VI6_IP_VERSION_MODEL_VSPD_GEN2:
|
||||
case VI6_IP_VERSION_MODEL_VSPD_V2H:
|
||||
hbth = 1536;
|
||||
|
|
|
|||
|
|
@ -1563,7 +1563,7 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx,
|
|||
u64 offset;
|
||||
s64 val;
|
||||
|
||||
switch (ctrl->type) {
|
||||
switch ((u32)ctrl->type) {
|
||||
case V4L2_CTRL_TYPE_INTEGER:
|
||||
return ROUND_TO_RANGE(ptr.p_s32[idx], u32, ctrl);
|
||||
case V4L2_CTRL_TYPE_INTEGER64:
|
||||
|
|
@ -2233,7 +2233,7 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
|
|||
is_array = nr_of_dims > 0;
|
||||
|
||||
/* Prefill elem_size for all types handled by std_type_ops */
|
||||
switch (type) {
|
||||
switch ((u32)type) {
|
||||
case V4L2_CTRL_TYPE_INTEGER64:
|
||||
elem_size = sizeof(s64);
|
||||
break;
|
||||
|
|
|
|||
Loading…
Reference in a new issue