forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'media/v4.20-2' of git://git.kernel.org/pub/scm/linux/kerne…
…l/git/mchehab/linux-media Pull new experimental media request API from Mauro Carvalho Chehab: "A new media request API This API is needed to support device drivers that can dynamically change their parameters for each new frame. The latest versions of Google camera and codec HAL depends on such feature. At this stage, it supports only stateless codecs. It has been discussed for a long time (at least over the last 3-4 years), and we finally reached to something that seem to work. This series contain both the API and core changes required to support it and a new m2m decoder driver (cedrus). As the current API is still experimental, the only real driver using it (cedrus) was added at staging[1]. We intend to keep it there for a while, in order to test the API. Only when we're sure that this API works for other cases (like encoders), we'll move this driver out of staging and set the API into a stone. [1] We added support for the vivid virtual driver (used only for testing) to it too, as it makes easier to test the API for the ones that don't have the cedrus hardware" * tag 'media/v4.20-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (53 commits) media: dt-bindings: Document the Rockchip VPU bindings media: platform: Add Cedrus VPU decoder driver media: dt-bindings: media: Document bindings for the Cedrus VPU driver media: v4l: Add definition for the Sunxi tiled NV12 format media: v4l: Add definitions for MPEG-2 slice format and metadata media: videobuf2-core: Rework and rename helper for request buffer count media: v4l2-ctrls.c: initialize an error return code with zero media: v4l2-compat-ioctl32.c: add missing documentation for a field media: media-request: update documentation media: media-request: EPERM -> EACCES/EBUSY media: v4l2-ctrls: improve media_request_(un)lock_for_update media: v4l2-ctrls: use media_request_(un)lock_for_access media: media-request: add media_request_(un)lock_for_access media: vb2: set reqbufs/create_bufs capabilities media: videodev2.h: add new capabilities for buffer types media: buffer.rst: only set V4L2_BUF_FLAG_REQUEST_FD for QBUF media: v4l2-ctrls: return -EACCES if request wasn't completed media: media-request: return -EINVAL for invalid request_fds media: vivid: add request support media: vivid: add mc ...
- Loading branch information
Showing
102 changed files
with
6,166 additions
and
385 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
Device-tree bindings for the VPU found in Allwinner SoCs, referred to as the | ||
Video Engine (VE) in Allwinner literature. | ||
|
||
The VPU can only access the first 256 MiB of DRAM, that are DMA-mapped starting | ||
from the DRAM base. This requires specific memory allocation and handling. | ||
|
||
Required properties: | ||
- compatible : must be one of the following compatibles: | ||
- "allwinner,sun4i-a10-video-engine" | ||
- "allwinner,sun5i-a13-video-engine" | ||
- "allwinner,sun7i-a20-video-engine" | ||
- "allwinner,sun8i-a33-video-engine" | ||
- "allwinner,sun8i-h3-video-engine" | ||
- reg : register base and length of VE; | ||
- clocks : list of clock specifiers, corresponding to entries in | ||
the clock-names property; | ||
- clock-names : should contain "ahb", "mod" and "ram" entries; | ||
- resets : phandle for reset; | ||
- interrupts : VE interrupt number; | ||
- allwinner,sram : SRAM region to use with the VE. | ||
|
||
Optional properties: | ||
- memory-region : CMA pool to use for buffers allocation instead of the | ||
default CMA pool. | ||
|
||
Example: | ||
|
||
reserved-memory { | ||
#address-cells = <1>; | ||
#size-cells = <1>; | ||
ranges; | ||
|
||
/* Address must be kept in the lower 256 MiBs of DRAM for VE. */ | ||
cma_pool: cma@4a000000 { | ||
compatible = "shared-dma-pool"; | ||
size = <0x6000000>; | ||
alloc-ranges = <0x4a000000 0x6000000>; | ||
reusable; | ||
linux,cma-default; | ||
}; | ||
}; | ||
|
||
video-codec@1c0e000 { | ||
compatible = "allwinner,sun7i-a20-video-engine"; | ||
reg = <0x01c0e000 0x1000>; | ||
|
||
clocks = <&ccu CLK_AHB_VE>, <&ccu CLK_VE>, | ||
<&ccu CLK_DRAM_VE>; | ||
clock-names = "ahb", "mod", "ram"; | ||
|
||
resets = <&ccu RST_VE>; | ||
interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>; | ||
allwinner,sram = <&ve_sram 1>; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
device-tree bindings for rockchip VPU codec | ||
|
||
Rockchip (Video Processing Unit) present in various Rockchip platforms, | ||
such as RK3288 and RK3399. | ||
|
||
Required properties: | ||
- compatible: value should be one of the following | ||
"rockchip,rk3288-vpu"; | ||
"rockchip,rk3399-vpu"; | ||
- interrupts: encoding and decoding interrupt specifiers | ||
- interrupt-names: should be "vepu" and "vdpu" | ||
- clocks: phandle to VPU aclk, hclk clocks | ||
- clock-names: should be "aclk" and "hclk" | ||
- power-domains: phandle to power domain node | ||
- iommus: phandle to a iommu node | ||
|
||
Example: | ||
SoC-specific DT entry: | ||
vpu: video-codec@ff9a0000 { | ||
compatible = "rockchip,rk3288-vpu"; | ||
reg = <0x0 0xff9a0000 0x0 0x800>; | ||
interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>, | ||
<GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>; | ||
interrupt-names = "vepu", "vdpu"; | ||
clocks = <&cru ACLK_VCODEC>, <&cru HCLK_VCODEC>; | ||
clock-names = "aclk", "hclk"; | ||
power-domains = <&power RK3288_PD_VIDEO>; | ||
iommus = <&vpu_mmu>; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
66 changes: 66 additions & 0 deletions
66
Documentation/media/uapi/mediactl/media-ioc-request-alloc.rst
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
.. SPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-or-later WITH no-invariant-sections | ||
.. _media_ioc_request_alloc: | ||
|
||
***************************** | ||
ioctl MEDIA_IOC_REQUEST_ALLOC | ||
***************************** | ||
|
||
Name | ||
==== | ||
|
||
MEDIA_IOC_REQUEST_ALLOC - Allocate a request | ||
|
||
|
||
Synopsis | ||
======== | ||
|
||
.. c:function:: int ioctl( int fd, MEDIA_IOC_REQUEST_ALLOC, int *argp ) | ||
:name: MEDIA_IOC_REQUEST_ALLOC | ||
Arguments | ||
========= | ||
``fd`` | ||
File descriptor returned by :ref:`open() <media-func-open>`. | ||
``argp`` | ||
Pointer to an integer. | ||
Description | ||
=========== | ||
If the media device supports :ref:`requests <media-request-api>`, then | ||
this ioctl can be used to allocate a request. If it is not supported, then | ||
``errno`` is set to ``ENOTTY``. A request is accessed through a file descriptor | ||
that is returned in ``*argp``. | ||
If the request was successfully allocated, then the request file descriptor | ||
can be passed to the :ref:`VIDIOC_QBUF <VIDIOC_QBUF>`, | ||
:ref:`VIDIOC_G_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>`, | ||
:ref:`VIDIOC_S_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>` and | ||
:ref:`VIDIOC_TRY_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>` ioctls. | ||
In addition, the request can be queued by calling | ||
:ref:`MEDIA_REQUEST_IOC_QUEUE` and re-initialized by calling | ||
:ref:`MEDIA_REQUEST_IOC_REINIT`. | ||
Finally, the file descriptor can be :ref:`polled <request-func-poll>` to wait | ||
for the request to complete. | ||
The request will remain allocated until all the file descriptors associated | ||
with it are closed by :ref:`close() <request-func-close>` and the driver no | ||
longer uses the request internally. See also | ||
:ref:`here <media-request-life-time>` for more information. | ||
Return Value | ||
============ | ||
On success 0 is returned, on error -1 and the ``errno`` variable is set | ||
appropriately. The generic error codes are described at the | ||
:ref:`Generic Error Codes <gen-errors>` chapter. | ||
ENOTTY | ||
The driver has no support for requests. |
78 changes: 78 additions & 0 deletions
78
Documentation/media/uapi/mediactl/media-request-ioc-queue.rst
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
.. SPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-or-later WITH no-invariant-sections | ||
.. _media_request_ioc_queue: | ||
|
||
***************************** | ||
ioctl MEDIA_REQUEST_IOC_QUEUE | ||
***************************** | ||
|
||
Name | ||
==== | ||
|
||
MEDIA_REQUEST_IOC_QUEUE - Queue a request | ||
|
||
|
||
Synopsis | ||
======== | ||
|
||
.. c:function:: int ioctl( int request_fd, MEDIA_REQUEST_IOC_QUEUE ) | ||
:name: MEDIA_REQUEST_IOC_QUEUE | ||
Arguments | ||
========= | ||
``request_fd`` | ||
File descriptor returned by :ref:`MEDIA_IOC_REQUEST_ALLOC`. | ||
Description | ||
=========== | ||
If the media device supports :ref:`requests <media-request-api>`, then | ||
this request ioctl can be used to queue a previously allocated request. | ||
If the request was successfully queued, then the file descriptor can be | ||
:ref:`polled <request-func-poll>` to wait for the request to complete. | ||
If the request was already queued before, then ``EBUSY`` is returned. | ||
Other errors can be returned if the contents of the request contained | ||
invalid or inconsistent data, see the next section for a list of | ||
common error codes. On error both the request and driver state are unchanged. | ||
Once a request is queued, then the driver is required to gracefully handle | ||
errors that occur when the request is applied to the hardware. The | ||
exception is the ``EIO`` error which signals a fatal error that requires | ||
the application to stop streaming to reset the hardware state. | ||
It is not allowed to mix queuing requests with queuing buffers directly | ||
(without a request). ``EBUSY`` will be returned if the first buffer was | ||
queued directly and you next try to queue a request, or vice versa. | ||
A request must contain at least one buffer, otherwise this ioctl will | ||
return an ``ENOENT`` error. | ||
Return Value | ||
============ | ||
On success 0 is returned, on error -1 and the ``errno`` variable is set | ||
appropriately. The generic error codes are described at the | ||
:ref:`Generic Error Codes <gen-errors>` chapter. | ||
EBUSY | ||
The request was already queued or the application queued the first | ||
buffer directly, but later attempted to use a request. It is not permitted | ||
to mix the two APIs. | ||
ENOENT | ||
The request did not contain any buffers. All requests are required | ||
to have at least one buffer. This can also be returned if some required | ||
configuration is missing in the request. | ||
ENOMEM | ||
Out of memory when allocating internal data structures for this | ||
request. | ||
EINVAL | ||
The request has invalid data. | ||
EIO | ||
The hardware is in a bad state. To recover, the application needs to | ||
stop streaming to reset the hardware state and then try to restart | ||
streaming. |
51 changes: 51 additions & 0 deletions
51
Documentation/media/uapi/mediactl/media-request-ioc-reinit.rst
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
.. SPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-or-later WITH no-invariant-sections | ||
.. _media_request_ioc_reinit: | ||
|
||
****************************** | ||
ioctl MEDIA_REQUEST_IOC_REINIT | ||
****************************** | ||
|
||
Name | ||
==== | ||
|
||
MEDIA_REQUEST_IOC_REINIT - Re-initialize a request | ||
|
||
|
||
Synopsis | ||
======== | ||
|
||
.. c:function:: int ioctl( int request_fd, MEDIA_REQUEST_IOC_REINIT ) | ||
:name: MEDIA_REQUEST_IOC_REINIT | ||
Arguments | ||
========= | ||
``request_fd`` | ||
File descriptor returned by :ref:`MEDIA_IOC_REQUEST_ALLOC`. | ||
Description | ||
=========== | ||
If the media device supports :ref:`requests <media-request-api>`, then | ||
this request ioctl can be used to re-initialize a previously allocated | ||
request. | ||
Re-initializing a request will clear any existing data from the request. | ||
This avoids having to :ref:`close() <request-func-close>` a completed | ||
request and allocate a new request. Instead the completed request can just | ||
be re-initialized and it is ready to be used again. | ||
A request can only be re-initialized if it either has not been queued | ||
yet, or if it was queued and completed. Otherwise it will set ``errno`` | ||
to ``EBUSY``. No other error codes can be returned. | ||
Return Value | ||
============ | ||
On success 0 is returned, on error -1 and the ``errno`` variable is set | ||
appropriately. | ||
EBUSY | ||
The request is queued but not yet completed. |
Oops, something went wrong.