Hi,
> From: Arun Kumar K [mailto:[email protected]] On Behalf Of Arun
> Kumar K
> Sent: Tuesday, March 11, 2014 10:16 AM
>
> From: avnd kiran <[email protected]>
>
> Latest MFC v6 firmware requires tile mode and loop filter setting to be
> done as part of Init buffer command, in sync with v7. Since there are
> two versions of v6 firmware with different interfaces, it is
> differenciated using the version number read back from firmware which
> is a hexadecimal value based on the firmware date.
>
> Signed-off-by: avnd kiran <[email protected]>
> Signed-off-by: Arun Kumar K <[email protected]>
> ---
> Changes from v1
> ---------------
> - Check for v6 firmware date for differenciating old and new firmware
> as per comments from Kamil and Sylwester.
> ---
> drivers/media/platform/s5p-mfc/regs-mfc-v6.h | 1 +
> drivers/media/platform/s5p-mfc/regs-mfc-v7.h | 2 --
> drivers/media/platform/s5p-mfc/s5p_mfc_common.h | 2 ++
> drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c | 8 +++---
> drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c | 30
> ++++++++++++++++++++---
> 5 files changed, 34 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/media/platform/s5p-mfc/regs-mfc-v6.h
> b/drivers/media/platform/s5p-mfc/regs-mfc-v6.h
> index 8d0b686..b47567c 100644
> --- a/drivers/media/platform/s5p-mfc/regs-mfc-v6.h
> +++ b/drivers/media/platform/s5p-mfc/regs-mfc-v6.h
> @@ -132,6 +132,7 @@
> #define S5P_FIMV_D_METADATA_BUFFER_ADDR_V6 0xf448
> #define S5P_FIMV_D_METADATA_BUFFER_SIZE_V6 0xf44c
> #define S5P_FIMV_D_NUM_MV_V6 0xf478
> +#define S5P_FIMV_D_INIT_BUFFER_OPTIONS_V6 0xf47c
> #define S5P_FIMV_D_CPB_BUFFER_ADDR_V6 0xf4b0
> #define S5P_FIMV_D_CPB_BUFFER_SIZE_V6 0xf4b4
>
> diff --git a/drivers/media/platform/s5p-mfc/regs-mfc-v7.h
> b/drivers/media/platform/s5p-mfc/regs-mfc-v7.h
> index ea5ec2a..82c96fa 100644
> --- a/drivers/media/platform/s5p-mfc/regs-mfc-v7.h
> +++ b/drivers/media/platform/s5p-mfc/regs-mfc-v7.h
> @@ -18,8 +18,6 @@
> #define S5P_FIMV_CODEC_VP8_ENC_V7 25
>
> /* Additional registers for v7 */
> -#define S5P_FIMV_D_INIT_BUFFER_OPTIONS_V7 0xf47c
> -
> #define S5P_FIMV_E_SOURCE_FIRST_ADDR_V7 0xf9e0
> #define S5P_FIMV_E_SOURCE_SECOND_ADDR_V7 0xf9e4
> #define S5P_FIMV_E_SOURCE_THIRD_ADDR_V7 0xf9e8
> diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_common.h
> b/drivers/media/platform/s5p-mfc/s5p_mfc_common.h
> index 4d17df9..f5404a6 100644
> --- a/drivers/media/platform/s5p-mfc/s5p_mfc_common.h
> +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_common.h
> @@ -287,6 +287,7 @@ struct s5p_mfc_priv_buf {
> * @warn_start: hardware error code from which warnings
start
> * @mfc_ops: ops structure holding HW operation function
> pointers
> * @mfc_cmds: cmd structure holding HW commands function
> pointers
> + * @ver: firmware sub version
> *
> */
> struct s5p_mfc_dev {
> @@ -330,6 +331,7 @@ struct s5p_mfc_dev {
> int warn_start;
> struct s5p_mfc_hw_ops *mfc_ops;
> struct s5p_mfc_hw_cmds *mfc_cmds;
> + int ver;
> };
>
> /**
> diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c
> b/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c
> index 2475a3c..ba1d302 100644
> --- a/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c
> +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_ctrl.c
> @@ -240,7 +240,6 @@ static inline void s5p_mfc_clear_cmds(struct
> s5p_mfc_dev *dev)
> /* Initialize hardware */
> int s5p_mfc_init_hw(struct s5p_mfc_dev *dev) {
> - unsigned int ver;
> int ret;
>
> mfc_debug_enter();
> @@ -302,12 +301,13 @@ int s5p_mfc_init_hw(struct s5p_mfc_dev *dev)
> return -EIO;
> }
> if (IS_MFCV6_PLUS(dev))
> - ver = mfc_read(dev, S5P_FIMV_FW_VERSION_V6);
> + dev->ver = mfc_read(dev, S5P_FIMV_FW_VERSION_V6);
> else
> - ver = mfc_read(dev, S5P_FIMV_FW_VERSION);
> + dev->ver = mfc_read(dev, S5P_FIMV_FW_VERSION);
>
> mfc_debug(2, "MFC F/W version : %02xyy, %02xmm, %02xdd\n",
> - (ver >> 16) & 0xFF, (ver >> 8) & 0xFF, ver & 0xFF);
> + (dev->ver >> 16) & 0xFF, (dev->ver >> 8) & 0xFF,
> + dev->ver & 0xFF);
> s5p_mfc_clock_off();
> mfc_debug_leave();
> return 0;
> diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c
> b/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c
> index 90edb19..356cfe5 100644
> --- a/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c
> +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c
> @@ -14,6 +14,7 @@
>
> #undef DEBUG
>
> +#include <linux/bcd.h>
> #include <linux/delay.h>
> #include <linux/mm.h>
> #include <linux/io.h>
> @@ -1269,6 +1270,29 @@ static int s5p_mfc_set_enc_params_vp8(struct
> s5p_mfc_ctx *ctx)
> return 0;
> }
>
> +/* Check if newer v6 firmware with changed init buffer interface */
> +static bool s5p_mfc_is_v6_new(struct s5p_mfc_dev *dev) {
> + unsigned long cur_fw, v6_new_fw;
> + unsigned int y, m, d;
> +
> + if (IS_MFCV7(dev))
> + return false;
> +
> + y = bcd2bin((dev->ver >> 16) & 0xFF) + 2000;
> + m = bcd2bin((dev->ver >> 8) & 0xFF);
> + d = bcd2bin(dev->ver & 0xFF);
> +
> + cur_fw = mktime(y, m, d, 0, 0, 0);
> + /*
> + * Firmware versions from date 29/06/2012 are coming with new
> interface
> + * for init buffer
> + */
> + v6_new_fw = mktime(2012, 6, 29, 0, 0, 0);
> +
> + return cur_fw >= v6_new_fw;
> +}
Hold on for a minute. The firmware date is an integer in the format YYMMDD,
there is no firmware
prior to 2000. So a simple greater-than check should be sufficient.
return dev->ver >= 120629;
or better
return dev->ver >= MFC_V6_NEW_FIRMWARE;
with
#define MFC_V6_NEW_FIRMWARE
Also, maybe some versioning should be added? We don't want to have "new"
firmware
and "newer" firmware.
return dev->ver >= MFC_V6_FIRMWARE_INTERFACE_V2; ?
Year 2100 problem? Firmware only supplies two digits anyway, so any firmware
released after 2100 will require changes to the kernel.
> +
> /* Initialize decoding */
> static int s5p_mfc_init_decode_v6(struct s5p_mfc_ctx *ctx) { @@ -
> 1296,7 +1320,7 @@ static int s5p_mfc_init_decode_v6(struct s5p_mfc_ctx
> *ctx)
> WRITEL(ctx->display_delay, S5P_FIMV_D_DISPLAY_DELAY_V6);
> }
>
> - if (IS_MFCV7(dev)) {
> + if (IS_MFCV7(dev) || s5p_mfc_is_v6_new(dev)) {
> WRITEL(reg, S5P_FIMV_D_DEC_OPTIONS_V6);
> reg = 0;
> }
> @@ -1311,8 +1335,8 @@ static int s5p_mfc_init_decode_v6(struct
> s5p_mfc_ctx *ctx)
> if (ctx->dst_fmt->fourcc == V4L2_PIX_FMT_NV12MT_16X16)
> reg |= (0x1 << S5P_FIMV_D_OPT_TILE_MODE_SHIFT_V6);
>
> - if (IS_MFCV7(dev))
> - WRITEL(reg, S5P_FIMV_D_INIT_BUFFER_OPTIONS_V7);
> + if (IS_MFCV7(dev) || s5p_mfc_is_v6_new(dev))
> + WRITEL(reg, S5P_FIMV_D_INIT_BUFFER_OPTIONS_V6);
> else
> WRITEL(reg, S5P_FIMV_D_DEC_OPTIONS_V6);
>
> --
> 1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html