linux/drivers/staging/media/meson/vdec/codec_vp9.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (C) 2018 Maxime Jourdan <mjourdan@baylibre.com>
   4 * Copyright (C) 2015 Amlogic, Inc. All rights reserved.
   5 */
   6
   7#include <media/v4l2-mem2mem.h>
   8#include <media/videobuf2-dma-contig.h>
   9
  10#include "dos_regs.h"
  11#include "hevc_regs.h"
  12#include "codec_vp9.h"
  13#include "vdec_helpers.h"
  14#include "codec_hevc_common.h"
  15
  16/* HEVC reg mapping */
  17#define VP9_DEC_STATUS_REG      HEVC_ASSIST_SCRATCH_0
  18        #define VP9_10B_DECODE_SLICE    5
  19        #define VP9_HEAD_PARSER_DONE    0xf0
  20#define VP9_RPM_BUFFER          HEVC_ASSIST_SCRATCH_1
  21#define VP9_SHORT_TERM_RPS      HEVC_ASSIST_SCRATCH_2
  22#define VP9_ADAPT_PROB_REG      HEVC_ASSIST_SCRATCH_3
  23#define VP9_MMU_MAP_BUFFER      HEVC_ASSIST_SCRATCH_4
  24#define VP9_PPS_BUFFER          HEVC_ASSIST_SCRATCH_5
  25#define VP9_SAO_UP              HEVC_ASSIST_SCRATCH_6
  26#define VP9_STREAM_SWAP_BUFFER  HEVC_ASSIST_SCRATCH_7
  27#define VP9_STREAM_SWAP_BUFFER2 HEVC_ASSIST_SCRATCH_8
  28#define VP9_PROB_SWAP_BUFFER    HEVC_ASSIST_SCRATCH_9
  29#define VP9_COUNT_SWAP_BUFFER   HEVC_ASSIST_SCRATCH_A
  30#define VP9_SEG_MAP_BUFFER      HEVC_ASSIST_SCRATCH_B
  31#define VP9_SCALELUT            HEVC_ASSIST_SCRATCH_D
  32#define VP9_WAIT_FLAG           HEVC_ASSIST_SCRATCH_E
  33#define LMEM_DUMP_ADR           HEVC_ASSIST_SCRATCH_F
  34#define NAL_SEARCH_CTL          HEVC_ASSIST_SCRATCH_I
  35#define VP9_DECODE_MODE         HEVC_ASSIST_SCRATCH_J
  36        #define DECODE_MODE_SINGLE 0
  37#define DECODE_STOP_POS         HEVC_ASSIST_SCRATCH_K
  38#define HEVC_DECODE_COUNT       HEVC_ASSIST_SCRATCH_M
  39#define HEVC_DECODE_SIZE        HEVC_ASSIST_SCRATCH_N
  40
  41/* VP9 Constants */
  42#define LCU_SIZE                64
  43#define MAX_REF_PIC_NUM         24
  44#define REFS_PER_FRAME          3
  45#define REF_FRAMES              8
  46#define MV_MEM_UNIT             0x240
  47#define ADAPT_PROB_SIZE         0xf80
  48
  49enum FRAME_TYPE {
  50        KEY_FRAME = 0,
  51        INTER_FRAME = 1,
  52        FRAME_TYPES,
  53};
  54
  55/* VP9 Workspace layout */
  56#define MPRED_MV_BUF_SIZE 0x120000
  57
  58#define IPP_SIZE        0x4000
  59#define SAO_ABV_SIZE    0x30000
  60#define SAO_VB_SIZE     0x30000
  61#define SH_TM_RPS_SIZE  0x800
  62#define VPS_SIZE        0x800
  63#define SPS_SIZE        0x800
  64#define PPS_SIZE        0x2000
  65#define SAO_UP_SIZE     0x2800
  66#define SWAP_BUF_SIZE   0x800
  67#define SWAP_BUF2_SIZE  0x800
  68#define SCALELUT_SIZE   0x8000
  69#define DBLK_PARA_SIZE  0x80000
  70#define DBLK_DATA_SIZE  0x80000
  71#define SEG_MAP_SIZE    0xd800
  72#define PROB_SIZE       0x5000
  73#define COUNT_SIZE      0x3000
  74#define MMU_VBH_SIZE    0x5000
  75#define MPRED_ABV_SIZE  0x10000
  76#define MPRED_MV_SIZE   (MPRED_MV_BUF_SIZE * MAX_REF_PIC_NUM)
  77#define RPM_BUF_SIZE    0x100
  78#define LMEM_SIZE       0x800
  79
  80#define IPP_OFFSET       0x00
  81#define SAO_ABV_OFFSET   (IPP_OFFSET + IPP_SIZE)
  82#define SAO_VB_OFFSET    (SAO_ABV_OFFSET + SAO_ABV_SIZE)
  83#define SH_TM_RPS_OFFSET (SAO_VB_OFFSET + SAO_VB_SIZE)
  84#define VPS_OFFSET       (SH_TM_RPS_OFFSET + SH_TM_RPS_SIZE)
  85#define SPS_OFFSET       (VPS_OFFSET + VPS_SIZE)
  86#define PPS_OFFSET       (SPS_OFFSET + SPS_SIZE)
  87#define SAO_UP_OFFSET    (PPS_OFFSET + PPS_SIZE)
  88#define SWAP_BUF_OFFSET  (SAO_UP_OFFSET + SAO_UP_SIZE)
  89#define SWAP_BUF2_OFFSET (SWAP_BUF_OFFSET + SWAP_BUF_SIZE)
  90#define SCALELUT_OFFSET  (SWAP_BUF2_OFFSET + SWAP_BUF2_SIZE)
  91#define DBLK_PARA_OFFSET (SCALELUT_OFFSET + SCALELUT_SIZE)
  92#define DBLK_DATA_OFFSET (DBLK_PARA_OFFSET + DBLK_PARA_SIZE)
  93#define SEG_MAP_OFFSET   (DBLK_DATA_OFFSET + DBLK_DATA_SIZE)
  94#define PROB_OFFSET      (SEG_MAP_OFFSET + SEG_MAP_SIZE)
  95#define COUNT_OFFSET     (PROB_OFFSET + PROB_SIZE)
  96#define MMU_VBH_OFFSET   (COUNT_OFFSET + COUNT_SIZE)
  97#define MPRED_ABV_OFFSET (MMU_VBH_OFFSET + MMU_VBH_SIZE)
  98#define MPRED_MV_OFFSET  (MPRED_ABV_OFFSET + MPRED_ABV_SIZE)
  99#define RPM_OFFSET       (MPRED_MV_OFFSET + MPRED_MV_SIZE)
 100#define LMEM_OFFSET      (RPM_OFFSET + RPM_BUF_SIZE)
 101
 102#define SIZE_WORKSPACE  ALIGN(LMEM_OFFSET + LMEM_SIZE, 64 * SZ_1K)
 103
 104#define NONE           -1
 105#define INTRA_FRAME     0
 106#define LAST_FRAME      1
 107#define GOLDEN_FRAME    2
 108#define ALTREF_FRAME    3
 109#define MAX_REF_FRAMES  4
 110
 111/*
 112 * Defines, declarations, sub-functions for vp9 de-block loop
 113        filter Thr/Lvl table update
 114 * - struct segmentation is for loop filter only (removed something)
 115 * - function "vp9_loop_filter_init" and "vp9_loop_filter_frame_init" will
 116        be instantiated in C_Entry
 117 * - vp9_loop_filter_init run once before decoding start
 118 * - vp9_loop_filter_frame_init run before every frame decoding start
 119 * - set video format to VP9 is in vp9_loop_filter_init
 120 */
 121#define MAX_LOOP_FILTER         63
 122#define MAX_REF_LF_DELTAS       4
 123#define MAX_MODE_LF_DELTAS      2
 124#define SEGMENT_DELTADATA       0
 125#define SEGMENT_ABSDATA         1
 126#define MAX_SEGMENTS            8
 127
 128/* VP9 PROB processing defines */
 129#define VP9_PARTITION_START      0
 130#define VP9_PARTITION_SIZE_STEP  (3 * 4)
 131#define VP9_PARTITION_ONE_SIZE   (4 * VP9_PARTITION_SIZE_STEP)
 132#define VP9_PARTITION_KEY_START  0
 133#define VP9_PARTITION_P_START    VP9_PARTITION_ONE_SIZE
 134#define VP9_PARTITION_SIZE       (2 * VP9_PARTITION_ONE_SIZE)
 135#define VP9_SKIP_START           (VP9_PARTITION_START + VP9_PARTITION_SIZE)
 136#define VP9_SKIP_SIZE            4 /* only use 3*/
 137#define VP9_TX_MODE_START        (VP9_SKIP_START + VP9_SKIP_SIZE)
 138#define VP9_TX_MODE_8_0_OFFSET   0
 139#define VP9_TX_MODE_8_1_OFFSET   1
 140#define VP9_TX_MODE_16_0_OFFSET  2
 141#define VP9_TX_MODE_16_1_OFFSET  4
 142#define VP9_TX_MODE_32_0_OFFSET  6
 143#define VP9_TX_MODE_32_1_OFFSET  9
 144#define VP9_TX_MODE_SIZE         12
 145#define VP9_COEF_START           (VP9_TX_MODE_START + VP9_TX_MODE_SIZE)
 146#define VP9_COEF_BAND_0_OFFSET   0
 147#define VP9_COEF_BAND_1_OFFSET   (VP9_COEF_BAND_0_OFFSET + 3 * 3 + 1)
 148#define VP9_COEF_BAND_2_OFFSET   (VP9_COEF_BAND_1_OFFSET + 6 * 3)
 149#define VP9_COEF_BAND_3_OFFSET   (VP9_COEF_BAND_2_OFFSET + 6 * 3)
 150#define VP9_COEF_BAND_4_OFFSET   (VP9_COEF_BAND_3_OFFSET + 6 * 3)
 151#define VP9_COEF_BAND_5_OFFSET   (VP9_COEF_BAND_4_OFFSET + 6 * 3)
 152#define VP9_COEF_SIZE_ONE_SET    100 /* ((3 + 5 * 6) * 3 + 1 padding)*/
 153#define VP9_COEF_4X4_START       (VP9_COEF_START + 0 * VP9_COEF_SIZE_ONE_SET)
 154#define VP9_COEF_8X8_START       (VP9_COEF_START + 4 * VP9_COEF_SIZE_ONE_SET)
 155#define VP9_COEF_16X16_START     (VP9_COEF_START + 8 * VP9_COEF_SIZE_ONE_SET)
 156#define VP9_COEF_32X32_START     (VP9_COEF_START + 12 * VP9_COEF_SIZE_ONE_SET)
 157#define VP9_COEF_SIZE_PLANE      (2 * VP9_COEF_SIZE_ONE_SET)
 158#define VP9_COEF_SIZE            (4 * 2 * 2 * VP9_COEF_SIZE_ONE_SET)
 159#define VP9_INTER_MODE_START     (VP9_COEF_START + VP9_COEF_SIZE)
 160#define VP9_INTER_MODE_SIZE      24 /* only use 21 (# * 7)*/
 161#define VP9_INTERP_START         (VP9_INTER_MODE_START + VP9_INTER_MODE_SIZE)
 162#define VP9_INTERP_SIZE          8
 163#define VP9_INTRA_INTER_START    (VP9_INTERP_START + VP9_INTERP_SIZE)
 164#define VP9_INTRA_INTER_SIZE     4
 165#define VP9_INTERP_INTRA_INTER_START  VP9_INTERP_START
 166#define VP9_INTERP_INTRA_INTER_SIZE   (VP9_INTERP_SIZE + VP9_INTRA_INTER_SIZE)
 167#define VP9_COMP_INTER_START     \
 168                (VP9_INTERP_INTRA_INTER_START + VP9_INTERP_INTRA_INTER_SIZE)
 169#define VP9_COMP_INTER_SIZE      5
 170#define VP9_COMP_REF_START       (VP9_COMP_INTER_START + VP9_COMP_INTER_SIZE)
 171#define VP9_COMP_REF_SIZE        5
 172#define VP9_SINGLE_REF_START     (VP9_COMP_REF_START + VP9_COMP_REF_SIZE)
 173#define VP9_SINGLE_REF_SIZE      10
 174#define VP9_REF_MODE_START       VP9_COMP_INTER_START
 175#define VP9_REF_MODE_SIZE        \
 176                (VP9_COMP_INTER_SIZE + VP9_COMP_REF_SIZE + VP9_SINGLE_REF_SIZE)
 177#define VP9_IF_Y_MODE_START      (VP9_REF_MODE_START + VP9_REF_MODE_SIZE)
 178#define VP9_IF_Y_MODE_SIZE       36
 179#define VP9_IF_UV_MODE_START     (VP9_IF_Y_MODE_START + VP9_IF_Y_MODE_SIZE)
 180#define VP9_IF_UV_MODE_SIZE      92 /* only use 90*/
 181#define VP9_MV_JOINTS_START      (VP9_IF_UV_MODE_START + VP9_IF_UV_MODE_SIZE)
 182#define VP9_MV_JOINTS_SIZE       3
 183#define VP9_MV_SIGN_0_START      (VP9_MV_JOINTS_START + VP9_MV_JOINTS_SIZE)
 184#define VP9_MV_SIGN_0_SIZE       1
 185#define VP9_MV_CLASSES_0_START   (VP9_MV_SIGN_0_START + VP9_MV_SIGN_0_SIZE)
 186#define VP9_MV_CLASSES_0_SIZE    10
 187#define VP9_MV_CLASS0_0_START    \
 188                (VP9_MV_CLASSES_0_START + VP9_MV_CLASSES_0_SIZE)
 189#define VP9_MV_CLASS0_0_SIZE     1
 190#define VP9_MV_BITS_0_START      (VP9_MV_CLASS0_0_START + VP9_MV_CLASS0_0_SIZE)
 191#define VP9_MV_BITS_0_SIZE       10
 192#define VP9_MV_SIGN_1_START      (VP9_MV_BITS_0_START + VP9_MV_BITS_0_SIZE)
 193#define VP9_MV_SIGN_1_SIZE       1
 194#define VP9_MV_CLASSES_1_START   \
 195                        (VP9_MV_SIGN_1_START + VP9_MV_SIGN_1_SIZE)
 196#define VP9_MV_CLASSES_1_SIZE    10
 197#define VP9_MV_CLASS0_1_START    \
 198                        (VP9_MV_CLASSES_1_START + VP9_MV_CLASSES_1_SIZE)
 199#define VP9_MV_CLASS0_1_SIZE     1
 200#define VP9_MV_BITS_1_START      \
 201                        (VP9_MV_CLASS0_1_START + VP9_MV_CLASS0_1_SIZE)
 202#define VP9_MV_BITS_1_SIZE       10
 203#define VP9_MV_CLASS0_FP_0_START \
 204                        (VP9_MV_BITS_1_START + VP9_MV_BITS_1_SIZE)
 205#define VP9_MV_CLASS0_FP_0_SIZE  9
 206#define VP9_MV_CLASS0_FP_1_START \
 207                        (VP9_MV_CLASS0_FP_0_START + VP9_MV_CLASS0_FP_0_SIZE)
 208#define VP9_MV_CLASS0_FP_1_SIZE  9
 209#define VP9_MV_CLASS0_HP_0_START \
 210                        (VP9_MV_CLASS0_FP_1_START + VP9_MV_CLASS0_FP_1_SIZE)
 211#define VP9_MV_CLASS0_HP_0_SIZE  2
 212#define VP9_MV_CLASS0_HP_1_START \
 213                        (VP9_MV_CLASS0_HP_0_START + VP9_MV_CLASS0_HP_0_SIZE)
 214#define VP9_MV_CLASS0_HP_1_SIZE  2
 215#define VP9_MV_START             VP9_MV_JOINTS_START
 216#define VP9_MV_SIZE              72 /*only use 69*/
 217
 218#define VP9_TOTAL_SIZE           (VP9_MV_START + VP9_MV_SIZE)
 219
 220/* VP9 COUNT mem processing defines */
 221#define VP9_COEF_COUNT_START           0
 222#define VP9_COEF_COUNT_BAND_0_OFFSET   0
 223#define VP9_COEF_COUNT_BAND_1_OFFSET   \
 224                        (VP9_COEF_COUNT_BAND_0_OFFSET + 3 * 5)
 225#define VP9_COEF_COUNT_BAND_2_OFFSET   \
 226                        (VP9_COEF_COUNT_BAND_1_OFFSET + 6 * 5)
 227#define VP9_COEF_COUNT_BAND_3_OFFSET   \
 228                        (VP9_COEF_COUNT_BAND_2_OFFSET + 6 * 5)
 229#define VP9_COEF_COUNT_BAND_4_OFFSET   \
 230                        (VP9_COEF_COUNT_BAND_3_OFFSET + 6 * 5)
 231#define VP9_COEF_COUNT_BAND_5_OFFSET   \
 232                        (VP9_COEF_COUNT_BAND_4_OFFSET + 6 * 5)
 233#define VP9_COEF_COUNT_SIZE_ONE_SET    165 /* ((3 + 5 * 6) * 5 */
 234#define VP9_COEF_COUNT_4X4_START       \
 235                (VP9_COEF_COUNT_START + 0 * VP9_COEF_COUNT_SIZE_ONE_SET)
 236#define VP9_COEF_COUNT_8X8_START       \
 237                (VP9_COEF_COUNT_START + 4 * VP9_COEF_COUNT_SIZE_ONE_SET)
 238#define VP9_COEF_COUNT_16X16_START     \
 239                (VP9_COEF_COUNT_START + 8 * VP9_COEF_COUNT_SIZE_ONE_SET)
 240#define VP9_COEF_COUNT_32X32_START     \
 241                (VP9_COEF_COUNT_START + 12 * VP9_COEF_COUNT_SIZE_ONE_SET)
 242#define VP9_COEF_COUNT_SIZE_PLANE      (2 * VP9_COEF_COUNT_SIZE_ONE_SET)
 243#define VP9_COEF_COUNT_SIZE            (4 * 2 * 2 * VP9_COEF_COUNT_SIZE_ONE_SET)
 244
 245#define VP9_INTRA_INTER_COUNT_START    \
 246                (VP9_COEF_COUNT_START + VP9_COEF_COUNT_SIZE)
 247#define VP9_INTRA_INTER_COUNT_SIZE     (4 * 2)
 248#define VP9_COMP_INTER_COUNT_START     \
 249                (VP9_INTRA_INTER_COUNT_START + VP9_INTRA_INTER_COUNT_SIZE)
 250#define VP9_COMP_INTER_COUNT_SIZE      (5 * 2)
 251#define VP9_COMP_REF_COUNT_START       \
 252                (VP9_COMP_INTER_COUNT_START + VP9_COMP_INTER_COUNT_SIZE)
 253#define VP9_COMP_REF_COUNT_SIZE        (5 * 2)
 254#define VP9_SINGLE_REF_COUNT_START     \
 255                (VP9_COMP_REF_COUNT_START + VP9_COMP_REF_COUNT_SIZE)
 256#define VP9_SINGLE_REF_COUNT_SIZE      (10 * 2)
 257#define VP9_TX_MODE_COUNT_START        \
 258                (VP9_SINGLE_REF_COUNT_START + VP9_SINGLE_REF_COUNT_SIZE)
 259#define VP9_TX_MODE_COUNT_SIZE         (12 * 2)
 260#define VP9_SKIP_COUNT_START           \
 261                (VP9_TX_MODE_COUNT_START + VP9_TX_MODE_COUNT_SIZE)
 262#define VP9_SKIP_COUNT_SIZE            (3 * 2)
 263#define VP9_MV_SIGN_0_COUNT_START      \
 264                (VP9_SKIP_COUNT_START + VP9_SKIP_COUNT_SIZE)
 265#define VP9_MV_SIGN_0_COUNT_SIZE       (1 * 2)
 266#define VP9_MV_SIGN_1_COUNT_START      \
 267                (VP9_MV_SIGN_0_COUNT_START + VP9_MV_SIGN_0_COUNT_SIZE)
 268#define VP9_MV_SIGN_1_COUNT_SIZE       (1 * 2)
 269#define VP9_MV_BITS_0_COUNT_START      \
 270                (VP9_MV_SIGN_1_COUNT_START + VP9_MV_SIGN_1_COUNT_SIZE)
 271#define VP9_MV_BITS_0_COUNT_SIZE       (10 * 2)
 272#define VP9_MV_BITS_1_COUNT_START      \
 273                (VP9_MV_BITS_0_COUNT_START + VP9_MV_BITS_0_COUNT_SIZE)
 274#define VP9_MV_BITS_1_COUNT_SIZE       (10 * 2)
 275#define VP9_MV_CLASS0_HP_0_COUNT_START \
 276                (VP9_MV_BITS_1_COUNT_START + VP9_MV_BITS_1_COUNT_SIZE)
 277#define VP9_MV_CLASS0_HP_0_COUNT_SIZE  (2 * 2)
 278#define VP9_MV_CLASS0_HP_1_COUNT_START \
 279                (VP9_MV_CLASS0_HP_0_COUNT_START + VP9_MV_CLASS0_HP_0_COUNT_SIZE)
 280#define VP9_MV_CLASS0_HP_1_COUNT_SIZE  (2 * 2)
 281
 282/* Start merge_tree */
 283#define VP9_INTER_MODE_COUNT_START     \
 284                (VP9_MV_CLASS0_HP_1_COUNT_START + VP9_MV_CLASS0_HP_1_COUNT_SIZE)
 285#define VP9_INTER_MODE_COUNT_SIZE      (7 * 4)
 286#define VP9_IF_Y_MODE_COUNT_START      \
 287                (VP9_INTER_MODE_COUNT_START + VP9_INTER_MODE_COUNT_SIZE)
 288#define VP9_IF_Y_MODE_COUNT_SIZE       (10 * 4)
 289#define VP9_IF_UV_MODE_COUNT_START     \
 290                (VP9_IF_Y_MODE_COUNT_START + VP9_IF_Y_MODE_COUNT_SIZE)
 291#define VP9_IF_UV_MODE_COUNT_SIZE      (10 * 10)
 292#define VP9_PARTITION_P_COUNT_START    \
 293                (VP9_IF_UV_MODE_COUNT_START + VP9_IF_UV_MODE_COUNT_SIZE)
 294#define VP9_PARTITION_P_COUNT_SIZE     (4 * 4 * 4)
 295#define VP9_INTERP_COUNT_START         \
 296                (VP9_PARTITION_P_COUNT_START + VP9_PARTITION_P_COUNT_SIZE)
 297#define VP9_INTERP_COUNT_SIZE          (4 * 3)
 298#define VP9_MV_JOINTS_COUNT_START      \
 299                (VP9_INTERP_COUNT_START + VP9_INTERP_COUNT_SIZE)
 300#define VP9_MV_JOINTS_COUNT_SIZE       (1 * 4)
 301#define VP9_MV_CLASSES_0_COUNT_START   \
 302                (VP9_MV_JOINTS_COUNT_START + VP9_MV_JOINTS_COUNT_SIZE)
 303#define VP9_MV_CLASSES_0_COUNT_SIZE    (1 * 11)
 304#define VP9_MV_CLASS0_0_COUNT_START    \
 305                (VP9_MV_CLASSES_0_COUNT_START + VP9_MV_CLASSES_0_COUNT_SIZE)
 306#define VP9_MV_CLASS0_0_COUNT_SIZE     (1 * 2)
 307#define VP9_MV_CLASSES_1_COUNT_START   \
 308                (VP9_MV_CLASS0_0_COUNT_START + VP9_MV_CLASS0_0_COUNT_SIZE)
 309#define VP9_MV_CLASSES_1_COUNT_SIZE    (1 * 11)
 310#define VP9_MV_CLASS0_1_COUNT_START    \
 311                (VP9_MV_CLASSES_1_COUNT_START + VP9_MV_CLASSES_1_COUNT_SIZE)
 312#define VP9_MV_CLASS0_1_COUNT_SIZE     (1 * 2)
 313#define VP9_MV_CLASS0_FP_0_COUNT_START \
 314                (VP9_MV_CLASS0_1_COUNT_START + VP9_MV_CLASS0_1_COUNT_SIZE)
 315#define VP9_MV_CLASS0_FP_0_COUNT_SIZE  (3 * 4)
 316#define VP9_MV_CLASS0_FP_1_COUNT_START \
 317                (VP9_MV_CLASS0_FP_0_COUNT_START + VP9_MV_CLASS0_FP_0_COUNT_SIZE)
 318#define VP9_MV_CLASS0_FP_1_COUNT_SIZE  (3 * 4)
 319
 320#define DC_PRED    0    /* Average of above and left pixels */
 321#define V_PRED     1    /* Vertical */
 322#define H_PRED     2    /* Horizontal */
 323#define D45_PRED   3    /* Directional 45 deg = round(arctan(1/1) * 180/pi) */
 324#define D135_PRED  4    /* Directional 135 deg = 180 - 45 */
 325#define D117_PRED  5    /* Directional 117 deg = 180 - 63 */
 326#define D153_PRED  6    /* Directional 153 deg = 180 - 27 */
 327#define D207_PRED  7    /* Directional 207 deg = 180 + 27 */
 328#define D63_PRED   8    /* Directional 63 deg = round(arctan(2/1) * 180/pi) */
 329#define TM_PRED    9    /* True-motion */
 330
 331/* Use a static inline to avoid possible side effect from num being reused */
 332static inline int round_power_of_two(int value, int num)
 333{
 334        return (value + (1 << (num - 1))) >> num;
 335}
 336
 337#define MODE_MV_COUNT_SAT 20
 338static const int count_to_update_factor[MODE_MV_COUNT_SAT + 1] = {
 339        0, 6, 12, 19, 25, 32, 38, 44, 51, 57, 64,
 340        70, 76, 83, 89, 96, 102, 108, 115, 121, 128
 341};
 342
 343union rpm_param {
 344        struct {
 345                u16 data[RPM_BUF_SIZE];
 346        } l;
 347        struct {
 348                u16 profile;
 349                u16 show_existing_frame;
 350                u16 frame_to_show_idx;
 351                u16 frame_type; /*1 bit*/
 352                u16 show_frame; /*1 bit*/
 353                u16 error_resilient_mode; /*1 bit*/
 354                u16 intra_only; /*1 bit*/
 355                u16 display_size_present; /*1 bit*/
 356                u16 reset_frame_context;
 357                u16 refresh_frame_flags;
 358                u16 width;
 359                u16 height;
 360                u16 display_width;
 361                u16 display_height;
 362                u16 ref_info;
 363                u16 same_frame_size;
 364                u16 mode_ref_delta_enabled;
 365                u16 ref_deltas[4];
 366                u16 mode_deltas[2];
 367                u16 filter_level;
 368                u16 sharpness_level;
 369                u16 bit_depth;
 370                u16 seg_quant_info[8];
 371                u16 seg_enabled;
 372                u16 seg_abs_delta;
 373                /* bit 15: feature enabled; bit 8, sign; bit[5:0], data */
 374                u16 seg_lf_info[8];
 375        } p;
 376};
 377
 378enum SEG_LVL_FEATURES {
 379        SEG_LVL_ALT_Q = 0,      /* Use alternate Quantizer */
 380        SEG_LVL_ALT_LF = 1,     /* Use alternate loop filter value */
 381        SEG_LVL_REF_FRAME = 2,  /* Optional Segment reference frame */
 382        SEG_LVL_SKIP = 3,       /* Optional Segment (0,0) + skip mode */
 383        SEG_LVL_MAX = 4         /* Number of features supported */
 384};
 385
 386struct segmentation {
 387        u8 enabled;
 388        u8 update_map;
 389        u8 update_data;
 390        u8 abs_delta;
 391        u8 temporal_update;
 392        s16 feature_data[MAX_SEGMENTS][SEG_LVL_MAX];
 393        unsigned int feature_mask[MAX_SEGMENTS];
 394};
 395
 396struct loop_filter_thresh {
 397        u8 mblim;
 398        u8 lim;
 399        u8 hev_thr;
 400};
 401
 402struct loop_filter_info_n {
 403        struct loop_filter_thresh lfthr[MAX_LOOP_FILTER + 1];
 404        u8 lvl[MAX_SEGMENTS][MAX_REF_FRAMES][MAX_MODE_LF_DELTAS];
 405};
 406
 407struct loopfilter {
 408        int filter_level;
 409
 410        int sharpness_level;
 411        int last_sharpness_level;
 412
 413        u8 mode_ref_delta_enabled;
 414        u8 mode_ref_delta_update;
 415
 416        /*0 = Intra, Last, GF, ARF*/
 417        signed char ref_deltas[MAX_REF_LF_DELTAS];
 418        signed char last_ref_deltas[MAX_REF_LF_DELTAS];
 419
 420        /*0 = ZERO_MV, MV*/
 421        signed char mode_deltas[MAX_MODE_LF_DELTAS];
 422        signed char last_mode_deltas[MAX_MODE_LF_DELTAS];
 423};
 424
 425struct vp9_frame {
 426        struct list_head list;
 427        struct vb2_v4l2_buffer *vbuf;
 428        int index;
 429        int intra_only;
 430        int show;
 431        int type;
 432        int done;
 433        unsigned int width;
 434        unsigned int height;
 435};
 436
 437struct codec_vp9 {
 438        /* VP9 context lock */
 439        struct mutex lock;
 440
 441        /* Common part with the HEVC decoder */
 442        struct codec_hevc_common common;
 443
 444        /* Buffer for the VP9 Workspace */
 445        void      *workspace_vaddr;
 446        dma_addr_t workspace_paddr;
 447
 448        /* Contains many information parsed from the bitstream */
 449        union rpm_param rpm_param;
 450
 451        /* Whether we detected the bitstream as 10-bit */
 452        int is_10bit;
 453
 454        /* Coded resolution reported by the hardware */
 455        u32 width, height;
 456
 457        /* All ref frames used by the HW at a given time */
 458        struct list_head ref_frames_list;
 459        u32 frames_num;
 460
 461        /* In case of downsampling (decoding with FBC but outputting in NV12M),
 462         * we need to allocate additional buffers for FBC.
 463         */
 464        void      *fbc_buffer_vaddr[MAX_REF_PIC_NUM];
 465        dma_addr_t fbc_buffer_paddr[MAX_REF_PIC_NUM];
 466
 467        int ref_frame_map[REF_FRAMES];
 468        int next_ref_frame_map[REF_FRAMES];
 469        struct vp9_frame *frame_refs[REFS_PER_FRAME];
 470
 471        u32 lcu_total;
 472
 473        /* loop filter */
 474        int default_filt_lvl;
 475        struct loop_filter_info_n lfi;
 476        struct loopfilter lf;
 477        struct segmentation seg_4lf;
 478
 479        struct vp9_frame *cur_frame;
 480        struct vp9_frame *prev_frame;
 481};
 482
 483static int div_r32(s64 m, int n)
 484{
 485        s64 qu = div_s64(m, n);
 486
 487        return (int)qu;
 488}
 489
 490static int clip_prob(int p)
 491{
 492        return clamp_val(p, 1, 255);
 493}
 494
 495static int segfeature_active(struct segmentation *seg, int segment_id,
 496                             enum SEG_LVL_FEATURES feature_id)
 497{
 498        return seg->enabled &&
 499                (seg->feature_mask[segment_id] & (1 << feature_id));
 500}
 501
 502static int get_segdata(struct segmentation *seg, int segment_id,
 503                       enum SEG_LVL_FEATURES feature_id)
 504{
 505        return seg->feature_data[segment_id][feature_id];
 506}
 507
 508static void vp9_update_sharpness(struct loop_filter_info_n *lfi,
 509                                 int sharpness_lvl)
 510{
 511        int lvl;
 512
 513        /* For each possible value for the loop filter fill out limits*/
 514        for (lvl = 0; lvl <= MAX_LOOP_FILTER; lvl++) {
 515                /* Set loop filter parameters that control sharpness.*/
 516                int block_inside_limit = lvl >> ((sharpness_lvl > 0) +
 517                                        (sharpness_lvl > 4));
 518
 519                if (sharpness_lvl > 0) {
 520                        if (block_inside_limit > (9 - sharpness_lvl))
 521                                block_inside_limit = (9 - sharpness_lvl);
 522                }
 523
 524                if (block_inside_limit < 1)
 525                        block_inside_limit = 1;
 526
 527                lfi->lfthr[lvl].lim = (u8)block_inside_limit;
 528                lfi->lfthr[lvl].mblim = (u8)(2 * (lvl + 2) +
 529                                block_inside_limit);
 530        }
 531}
 532
 533/* Instantiate this function once when decode is started */
 534static void
 535vp9_loop_filter_init(struct amvdec_core *core, struct codec_vp9 *vp9)
 536{
 537        struct loop_filter_info_n *lfi = &vp9->lfi;
 538        struct loopfilter *lf = &vp9->lf;
 539        struct segmentation *seg_4lf = &vp9->seg_4lf;
 540        int i;
 541
 542        memset(lfi, 0, sizeof(struct loop_filter_info_n));
 543        memset(lf, 0, sizeof(struct loopfilter));
 544        memset(seg_4lf, 0, sizeof(struct segmentation));
 545        lf->sharpness_level = 0;
 546        vp9_update_sharpness(lfi, lf->sharpness_level);
 547        lf->last_sharpness_level = lf->sharpness_level;
 548
 549        for (i = 0; i < 32; i++) {
 550                unsigned int thr;
 551
 552                thr = ((lfi->lfthr[i * 2 + 1].lim & 0x3f) << 8) |
 553                        (lfi->lfthr[i * 2 + 1].mblim & 0xff);
 554                thr = (thr << 16) | ((lfi->lfthr[i * 2].lim & 0x3f) << 8) |
 555                        (lfi->lfthr[i * 2].mblim & 0xff);
 556
 557                amvdec_write_dos(core, HEVC_DBLK_CFG9, thr);
 558        }
 559
 560        if (core->platform->revision >= VDEC_REVISION_SM1)
 561                amvdec_write_dos(core, HEVC_DBLK_CFGB,
 562                                 (0x3 << 14) | /* dw fifo thres r and b */
 563                                 (0x3 << 12) | /* dw fifo thres r or b */
 564                                 (0x3 << 10) | /* dw fifo thres not r/b */
 565                                 BIT(0)); /* VP9 video format */
 566        else if (core->platform->revision >= VDEC_REVISION_G12A)
 567                /* VP9 video format */
 568                amvdec_write_dos(core, HEVC_DBLK_CFGB, (0x54 << 8) | BIT(0));
 569        else
 570                amvdec_write_dos(core, HEVC_DBLK_CFGB, 0x40400001);
 571}
 572
 573static void
 574vp9_loop_filter_frame_init(struct amvdec_core *core, struct segmentation *seg,
 575                           struct loop_filter_info_n *lfi,
 576                           struct loopfilter *lf, int default_filt_lvl)
 577{
 578        int i;
 579        int seg_id;
 580
 581        /*
 582         * n_shift is the multiplier for lf_deltas
 583         * the multiplier is:
 584         * - 1 for when filter_lvl is between 0 and 31
 585         * - 2 when filter_lvl is between 32 and 63
 586         */
 587        const int scale = 1 << (default_filt_lvl >> 5);
 588
 589        /* update limits if sharpness has changed */
 590        if (lf->last_sharpness_level != lf->sharpness_level) {
 591                vp9_update_sharpness(lfi, lf->sharpness_level);
 592                lf->last_sharpness_level = lf->sharpness_level;
 593
 594                /* Write to register */
 595                for (i = 0; i < 32; i++) {
 596                        unsigned int thr;
 597
 598                        thr = ((lfi->lfthr[i * 2 + 1].lim & 0x3f) << 8) |
 599                              (lfi->lfthr[i * 2 + 1].mblim & 0xff);
 600                        thr = (thr << 16) |
 601                              ((lfi->lfthr[i * 2].lim & 0x3f) << 8) |
 602                              (lfi->lfthr[i * 2].mblim & 0xff);
 603
 604                        amvdec_write_dos(core, HEVC_DBLK_CFG9, thr);
 605                }
 606        }
 607
 608        for (seg_id = 0; seg_id < MAX_SEGMENTS; seg_id++) {
 609                int lvl_seg = default_filt_lvl;
 610
 611                if (segfeature_active(seg, seg_id, SEG_LVL_ALT_LF)) {
 612                        const int data = get_segdata(seg, seg_id,
 613                                                SEG_LVL_ALT_LF);
 614                        lvl_seg = clamp_t(int,
 615                                          seg->abs_delta == SEGMENT_ABSDATA ?
 616                                                data : default_filt_lvl + data,
 617                                          0, MAX_LOOP_FILTER);
 618                }
 619
 620                if (!lf->mode_ref_delta_enabled) {
 621                        /*
 622                         * We could get rid of this if we assume that deltas
 623                         * are set to zero when not in use.
 624                         * encoder always uses deltas
 625                         */
 626                        memset(lfi->lvl[seg_id], lvl_seg,
 627                               sizeof(lfi->lvl[seg_id]));
 628                } else {
 629                        int ref, mode;
 630                        const int intra_lvl =
 631                                lvl_seg + lf->ref_deltas[INTRA_FRAME] * scale;
 632                        lfi->lvl[seg_id][INTRA_FRAME][0] =
 633                                clamp_val(intra_lvl, 0, MAX_LOOP_FILTER);
 634
 635                        for (ref = LAST_FRAME; ref < MAX_REF_FRAMES; ++ref) {
 636                                for (mode = 0; mode < MAX_MODE_LF_DELTAS;
 637                                     ++mode) {
 638                                        const int inter_lvl =
 639                                                lvl_seg +
 640                                                lf->ref_deltas[ref] * scale +
 641                                                lf->mode_deltas[mode] * scale;
 642                                        lfi->lvl[seg_id][ref][mode] =
 643                                                clamp_val(inter_lvl, 0,
 644                                                          MAX_LOOP_FILTER);
 645                                }
 646                        }
 647                }
 648        }
 649
 650        for (i = 0; i < 16; i++) {
 651                unsigned int level;
 652
 653                level = ((lfi->lvl[i >> 1][3][i & 1] & 0x3f) << 24) |
 654                        ((lfi->lvl[i >> 1][2][i & 1] & 0x3f) << 16) |
 655                        ((lfi->lvl[i >> 1][1][i & 1] & 0x3f) << 8) |
 656                        (lfi->lvl[i >> 1][0][i & 1] & 0x3f);
 657                if (!default_filt_lvl)
 658                        level = 0;
 659
 660                amvdec_write_dos(core, HEVC_DBLK_CFGA, level);
 661        }
 662}
 663
 664static void codec_vp9_flush_output(struct amvdec_session *sess)
 665{
 666        struct codec_vp9 *vp9 = sess->priv;
 667        struct vp9_frame *tmp, *n;
 668
 669        mutex_lock(&vp9->lock);
 670        list_for_each_entry_safe(tmp, n, &vp9->ref_frames_list, list) {
 671                if (!tmp->done) {
 672                        if (tmp->show)
 673                                amvdec_dst_buf_done(sess, tmp->vbuf,
 674                                                    V4L2_FIELD_NONE);
 675                        else
 676                                v4l2_m2m_buf_queue(sess->m2m_ctx, tmp->vbuf);
 677
 678                        vp9->frames_num--;
 679                }
 680
 681                list_del(&tmp->list);
 682                kfree(tmp);
 683        }
 684        mutex_unlock(&vp9->lock);
 685}
 686
 687static u32 codec_vp9_num_pending_bufs(struct amvdec_session *sess)
 688{
 689        struct codec_vp9 *vp9 = sess->priv;
 690
 691        if (!vp9)
 692                return 0;
 693
 694        return vp9->frames_num;
 695}
 696
 697static int codec_vp9_alloc_workspace(struct amvdec_core *core,
 698                                     struct codec_vp9 *vp9)
 699{
 700        /* Allocate some memory for the VP9 decoder's state */
 701        vp9->workspace_vaddr = dma_alloc_coherent(core->dev, SIZE_WORKSPACE,
 702                                                  &vp9->workspace_paddr,
 703                                                  GFP_KERNEL);
 704        if (!vp9->workspace_vaddr) {
 705                dev_err(core->dev, "Failed to allocate VP9 Workspace\n");
 706                return -ENOMEM;
 707        }
 708
 709        return 0;
 710}
 711
 712static void codec_vp9_setup_workspace(struct amvdec_session *sess,
 713                                      struct codec_vp9 *vp9)
 714{
 715        struct amvdec_core *core = sess->core;
 716        u32 revision = core->platform->revision;
 717        dma_addr_t wkaddr = vp9->workspace_paddr;
 718
 719        amvdec_write_dos(core, HEVCD_IPP_LINEBUFF_BASE, wkaddr + IPP_OFFSET);
 720        amvdec_write_dos(core, VP9_RPM_BUFFER, wkaddr + RPM_OFFSET);
 721        amvdec_write_dos(core, VP9_SHORT_TERM_RPS, wkaddr + SH_TM_RPS_OFFSET);
 722        amvdec_write_dos(core, VP9_PPS_BUFFER, wkaddr + PPS_OFFSET);
 723        amvdec_write_dos(core, VP9_SAO_UP, wkaddr + SAO_UP_OFFSET);
 724
 725        amvdec_write_dos(core, VP9_STREAM_SWAP_BUFFER,
 726                         wkaddr + SWAP_BUF_OFFSET);
 727        amvdec_write_dos(core, VP9_STREAM_SWAP_BUFFER2,
 728                         wkaddr + SWAP_BUF2_OFFSET);
 729        amvdec_write_dos(core, VP9_SCALELUT, wkaddr + SCALELUT_OFFSET);
 730
 731        if (core->platform->revision >= VDEC_REVISION_G12A)
 732                amvdec_write_dos(core, HEVC_DBLK_CFGE,
 733                                 wkaddr + DBLK_PARA_OFFSET);
 734
 735        amvdec_write_dos(core, HEVC_DBLK_CFG4, wkaddr + DBLK_PARA_OFFSET);
 736        amvdec_write_dos(core, HEVC_DBLK_CFG5, wkaddr + DBLK_DATA_OFFSET);
 737        amvdec_write_dos(core, VP9_SEG_MAP_BUFFER, wkaddr + SEG_MAP_OFFSET);
 738        amvdec_write_dos(core, VP9_PROB_SWAP_BUFFER, wkaddr + PROB_OFFSET);
 739        amvdec_write_dos(core, VP9_COUNT_SWAP_BUFFER, wkaddr + COUNT_OFFSET);
 740        amvdec_write_dos(core, LMEM_DUMP_ADR, wkaddr + LMEM_OFFSET);
 741
 742        if (codec_hevc_use_mmu(revision, sess->pixfmt_cap, vp9->is_10bit)) {
 743                amvdec_write_dos(core, HEVC_SAO_MMU_VH0_ADDR,
 744                                 wkaddr + MMU_VBH_OFFSET);
 745                amvdec_write_dos(core, HEVC_SAO_MMU_VH1_ADDR,
 746                                 wkaddr + MMU_VBH_OFFSET + (MMU_VBH_SIZE / 2));
 747
 748                if (revision >= VDEC_REVISION_G12A)
 749                        amvdec_write_dos(core, HEVC_ASSIST_MMU_MAP_ADDR,
 750                                         vp9->common.mmu_map_paddr);
 751                else
 752                        amvdec_write_dos(core, VP9_MMU_MAP_BUFFER,
 753                                         vp9->common.mmu_map_paddr);
 754        }
 755}
 756
 757static int codec_vp9_start(struct amvdec_session *sess)
 758{
 759        struct amvdec_core *core = sess->core;
 760        struct codec_vp9 *vp9;
 761        u32 val;
 762        int i;
 763        int ret;
 764
 765        vp9 = kzalloc(sizeof(*vp9), GFP_KERNEL);
 766        if (!vp9)
 767                return -ENOMEM;
 768
 769        ret = codec_vp9_alloc_workspace(core, vp9);
 770        if (ret)
 771                goto free_vp9;
 772
 773        codec_vp9_setup_workspace(sess, vp9);
 774        amvdec_write_dos_bits(core, HEVC_STREAM_CONTROL, BIT(0));
 775        /* stream_fifo_hole */
 776        if (core->platform->revision >= VDEC_REVISION_G12A)
 777                amvdec_write_dos_bits(core, HEVC_STREAM_FIFO_CTL, BIT(29));
 778
 779        val = amvdec_read_dos(core, HEVC_PARSER_INT_CONTROL) & 0x7fffffff;
 780        val |= (3 << 29) | BIT(24) | BIT(22) | BIT(7) | BIT(4) | BIT(0);
 781        amvdec_write_dos(core, HEVC_PARSER_INT_CONTROL, val);
 782        amvdec_write_dos_bits(core, HEVC_SHIFT_STATUS, BIT(0));
 783        amvdec_write_dos(core, HEVC_SHIFT_CONTROL, BIT(10) | BIT(9) |
 784                         (3 << 6) | BIT(5) | BIT(2) | BIT(1) | BIT(0));
 785        amvdec_write_dos(core, HEVC_CABAC_CONTROL, BIT(0));
 786        amvdec_write_dos(core, HEVC_PARSER_CORE_CONTROL, BIT(0));
 787        amvdec_write_dos(core, HEVC_SHIFT_STARTCODE, 0x00000001);
 788
 789        amvdec_write_dos(core, VP9_DEC_STATUS_REG, 0);
 790
 791        amvdec_write_dos(core, HEVC_PARSER_CMD_WRITE, BIT(16));
 792        for (i = 0; i < ARRAY_SIZE(vdec_hevc_parser_cmd); ++i)
 793                amvdec_write_dos(core, HEVC_PARSER_CMD_WRITE,
 794                                 vdec_hevc_parser_cmd[i]);
 795
 796        amvdec_write_dos(core, HEVC_PARSER_CMD_SKIP_0, PARSER_CMD_SKIP_CFG_0);
 797        amvdec_write_dos(core, HEVC_PARSER_CMD_SKIP_1, PARSER_CMD_SKIP_CFG_1);
 798        amvdec_write_dos(core, HEVC_PARSER_CMD_SKIP_2, PARSER_CMD_SKIP_CFG_2);
 799        amvdec_write_dos(core, HEVC_PARSER_IF_CONTROL,
 800                         BIT(5) | BIT(2) | BIT(0));
 801
 802        amvdec_write_dos(core, HEVCD_IPP_TOP_CNTL, BIT(0));
 803        amvdec_write_dos(core, HEVCD_IPP_TOP_CNTL, BIT(1));
 804
 805        amvdec_write_dos(core, VP9_WAIT_FLAG, 1);
 806
 807        /* clear mailbox interrupt */
 808        amvdec_write_dos(core, HEVC_ASSIST_MBOX1_CLR_REG, 1);
 809        /* enable mailbox interrupt */
 810        amvdec_write_dos(core, HEVC_ASSIST_MBOX1_MASK, 1);
 811        /* disable PSCALE for hardware sharing */
 812        amvdec_write_dos(core, HEVC_PSCALE_CTRL, 0);
 813        /* Let the uCode do all the parsing */
 814        amvdec_write_dos(core, NAL_SEARCH_CTL, 0x8);
 815
 816        amvdec_write_dos(core, DECODE_STOP_POS, 0);
 817        amvdec_write_dos(core, VP9_DECODE_MODE, DECODE_MODE_SINGLE);
 818
 819        pr_debug("decode_count: %u; decode_size: %u\n",
 820                 amvdec_read_dos(core, HEVC_DECODE_COUNT),
 821                 amvdec_read_dos(core, HEVC_DECODE_SIZE));
 822
 823        vp9_loop_filter_init(core, vp9);
 824
 825        INIT_LIST_HEAD(&vp9->ref_frames_list);
 826        mutex_init(&vp9->lock);
 827        memset(&vp9->ref_frame_map, -1, sizeof(vp9->ref_frame_map));
 828        memset(&vp9->next_ref_frame_map, -1, sizeof(vp9->next_ref_frame_map));
 829        for (i = 0; i < REFS_PER_FRAME; ++i)
 830                vp9->frame_refs[i] = NULL;
 831        sess->priv = vp9;
 832
 833        return 0;
 834
 835free_vp9:
 836        kfree(vp9);
 837        return ret;
 838}
 839
 840static int codec_vp9_stop(struct amvdec_session *sess)
 841{
 842        struct amvdec_core *core = sess->core;
 843        struct codec_vp9 *vp9 = sess->priv;
 844
 845        mutex_lock(&vp9->lock);
 846        if (vp9->workspace_vaddr)
 847                dma_free_coherent(core->dev, SIZE_WORKSPACE,
 848                                  vp9->workspace_vaddr,
 849                                  vp9->workspace_paddr);
 850
 851        codec_hevc_free_fbc_buffers(sess, &vp9->common);
 852        mutex_unlock(&vp9->lock);
 853
 854        return 0;
 855}
 856
 857/*
 858 * Program LAST & GOLDEN frames into the motion compensation reference cache
 859 * controller
 860 */
 861static void codec_vp9_set_mcrcc(struct amvdec_session *sess)
 862{
 863        struct amvdec_core *core = sess->core;
 864        struct codec_vp9 *vp9 = sess->priv;
 865        u32 val;
 866
 867        /* Reset mcrcc */
 868        amvdec_write_dos(core, HEVCD_MCRCC_CTL1, 0x2);
 869        /* Disable on I-frame */
 870        if (vp9->cur_frame->type == KEY_FRAME || vp9->cur_frame->intra_only) {
 871                amvdec_write_dos(core, HEVCD_MCRCC_CTL1, 0x0);
 872                return;
 873        }
 874
 875        amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_ACCCONFIG_ADDR, BIT(1));
 876        val = amvdec_read_dos(core, HEVCD_MPP_ANC_CANVAS_DATA_ADDR) & 0xffff;
 877        val |= (val << 16);
 878        amvdec_write_dos(core, HEVCD_MCRCC_CTL2, val);
 879        val = amvdec_read_dos(core, HEVCD_MPP_ANC_CANVAS_DATA_ADDR) & 0xffff;
 880        val |= (val << 16);
 881        amvdec_write_dos(core, HEVCD_MCRCC_CTL3, val);
 882
 883        /* Enable mcrcc progressive-mode */
 884        amvdec_write_dos(core, HEVCD_MCRCC_CTL1, 0xff0);
 885}
 886
 887static void codec_vp9_set_sao(struct amvdec_session *sess,
 888                              struct vb2_buffer *vb)
 889{
 890        struct amvdec_core *core = sess->core;
 891        struct codec_vp9 *vp9 = sess->priv;
 892
 893        dma_addr_t buf_y_paddr;
 894        dma_addr_t buf_u_v_paddr;
 895        u32 val;
 896
 897        if (codec_hevc_use_downsample(sess->pixfmt_cap, vp9->is_10bit))
 898                buf_y_paddr =
 899                        vp9->common.fbc_buffer_paddr[vb->index];
 900        else
 901                buf_y_paddr =
 902                       vb2_dma_contig_plane_dma_addr(vb, 0);
 903
 904        if (codec_hevc_use_fbc(sess->pixfmt_cap, vp9->is_10bit)) {
 905                val = amvdec_read_dos(core, HEVC_SAO_CTRL5) & ~0xff0200;
 906                amvdec_write_dos(core, HEVC_SAO_CTRL5, val);
 907                amvdec_write_dos(core, HEVC_CM_BODY_START_ADDR, buf_y_paddr);
 908        }
 909
 910        if (sess->pixfmt_cap == V4L2_PIX_FMT_NV12M) {
 911                buf_y_paddr =
 912                       vb2_dma_contig_plane_dma_addr(vb, 0);
 913                buf_u_v_paddr =
 914                       vb2_dma_contig_plane_dma_addr(vb, 1);
 915                amvdec_write_dos(core, HEVC_SAO_Y_START_ADDR, buf_y_paddr);
 916                amvdec_write_dos(core, HEVC_SAO_C_START_ADDR, buf_u_v_paddr);
 917                amvdec_write_dos(core, HEVC_SAO_Y_WPTR, buf_y_paddr);
 918                amvdec_write_dos(core, HEVC_SAO_C_WPTR, buf_u_v_paddr);
 919        }
 920
 921        if (codec_hevc_use_mmu(core->platform->revision, sess->pixfmt_cap,
 922                               vp9->is_10bit)) {
 923                amvdec_write_dos(core, HEVC_CM_HEADER_START_ADDR,
 924                                 vp9->common.mmu_header_paddr[vb->index]);
 925                /* use HEVC_CM_HEADER_START_ADDR */
 926                amvdec_write_dos_bits(core, HEVC_SAO_CTRL5, BIT(10));
 927        }
 928
 929        amvdec_write_dos(core, HEVC_SAO_Y_LENGTH,
 930                         amvdec_get_output_size(sess));
 931        amvdec_write_dos(core, HEVC_SAO_C_LENGTH,
 932                         (amvdec_get_output_size(sess) / 2));
 933
 934        if (core->platform->revision >= VDEC_REVISION_G12A) {
 935                amvdec_clear_dos_bits(core, HEVC_DBLK_CFGB,
 936                                      BIT(4) | BIT(5) | BIT(8) | BIT(9));
 937                /* enable first, compressed write */
 938                if (codec_hevc_use_fbc(sess->pixfmt_cap, vp9->is_10bit))
 939                        amvdec_write_dos_bits(core, HEVC_DBLK_CFGB, BIT(8));
 940
 941                /* enable second, uncompressed write */
 942                if (sess->pixfmt_cap == V4L2_PIX_FMT_NV12M)
 943                        amvdec_write_dos_bits(core, HEVC_DBLK_CFGB, BIT(9));
 944
 945                /* dblk pipeline mode=1 for performance */
 946                if (sess->width >= 1280)
 947                        amvdec_write_dos_bits(core, HEVC_DBLK_CFGB, BIT(4));
 948
 949                pr_debug("HEVC_DBLK_CFGB: %08X\n",
 950                         amvdec_read_dos(core, HEVC_DBLK_CFGB));
 951        }
 952
 953        val = amvdec_read_dos(core, HEVC_SAO_CTRL1) & ~0x3ff0;
 954        val |= 0xff0; /* Set endianness for 2-bytes swaps (nv12) */
 955        if (core->platform->revision < VDEC_REVISION_G12A) {
 956                val &= ~0x3;
 957                if (!codec_hevc_use_fbc(sess->pixfmt_cap, vp9->is_10bit))
 958                        val |= BIT(0); /* disable cm compression */
 959                /* TOFIX: Handle Amlogic Framebuffer compression */
 960        }
 961
 962        amvdec_write_dos(core, HEVC_SAO_CTRL1, val);
 963        pr_debug("HEVC_SAO_CTRL1: %08X\n", val);
 964
 965        /* no downscale for NV12 */
 966        val = amvdec_read_dos(core, HEVC_SAO_CTRL5) & ~0xff0000;
 967        amvdec_write_dos(core, HEVC_SAO_CTRL5, val);
 968
 969        val = amvdec_read_dos(core, HEVCD_IPP_AXIIF_CONFIG) & ~0x30;
 970        val |= 0xf;
 971        val &= ~BIT(12); /* NV12 */
 972        amvdec_write_dos(core, HEVCD_IPP_AXIIF_CONFIG, val);
 973}
 974
 975static dma_addr_t codec_vp9_get_frame_mv_paddr(struct codec_vp9 *vp9,
 976                                               struct vp9_frame *frame)
 977{
 978        return vp9->workspace_paddr + MPRED_MV_OFFSET +
 979               (frame->index * MPRED_MV_BUF_SIZE);
 980}
 981
 982static void codec_vp9_set_mpred_mv(struct amvdec_core *core,
 983                                   struct codec_vp9 *vp9)
 984{
 985        int mpred_mv_rd_end_addr;
 986        int use_prev_frame_mvs = vp9->prev_frame->width ==
 987                                        vp9->cur_frame->width &&
 988                                 vp9->prev_frame->height ==
 989                                        vp9->cur_frame->height &&
 990                                 !vp9->prev_frame->intra_only &&
 991                                 vp9->prev_frame->show &&
 992                                 vp9->prev_frame->type != KEY_FRAME;
 993
 994        amvdec_write_dos(core, HEVC_MPRED_CTRL3, 0x24122412);
 995        amvdec_write_dos(core, HEVC_MPRED_ABV_START_ADDR,
 996                         vp9->workspace_paddr + MPRED_ABV_OFFSET);
 997
 998        amvdec_clear_dos_bits(core, HEVC_MPRED_CTRL4, BIT(6));
 999        if (use_prev_frame_mvs)
1000                amvdec_write_dos_bits(core, HEVC_MPRED_CTRL4, BIT(6));
1001
1002        amvdec_write_dos(core, HEVC_MPRED_MV_WR_START_ADDR,
1003                         codec_vp9_get_frame_mv_paddr(vp9, vp9->cur_frame));
1004        amvdec_write_dos(core, HEVC_MPRED_MV_WPTR,
1005                         codec_vp9_get_frame_mv_paddr(vp9, vp9->cur_frame));
1006
1007        amvdec_write_dos(core, HEVC_MPRED_MV_RD_START_ADDR,
1008                         codec_vp9_get_frame_mv_paddr(vp9, vp9->prev_frame));
1009        amvdec_write_dos(core, HEVC_MPRED_MV_RPTR,
1010                         codec_vp9_get_frame_mv_paddr(vp9, vp9->prev_frame));
1011
1012        mpred_mv_rd_end_addr =
1013                        codec_vp9_get_frame_mv_paddr(vp9, vp9->prev_frame) +
1014                        (vp9->lcu_total * MV_MEM_UNIT);
1015        amvdec_write_dos(core, HEVC_MPRED_MV_RD_END_ADDR, mpred_mv_rd_end_addr);
1016}
1017
1018static void codec_vp9_update_next_ref(struct codec_vp9 *vp9)
1019{
1020        union rpm_param *param = &vp9->rpm_param;
1021        u32 buf_idx = vp9->cur_frame->index;
1022        int ref_index = 0;
1023        int refresh_frame_flags;
1024        int mask;
1025
1026        refresh_frame_flags = vp9->cur_frame->type == KEY_FRAME ?
1027                                0xff : param->p.refresh_frame_flags;
1028
1029        for (mask = refresh_frame_flags; mask; mask >>= 1) {
1030                pr_debug("mask=%08X; ref_index=%d\n", mask, ref_index);
1031                if (mask & 1)
1032                        vp9->next_ref_frame_map[ref_index] = buf_idx;
1033                else
1034                        vp9->next_ref_frame_map[ref_index] =
1035                                vp9->ref_frame_map[ref_index];
1036
1037                ++ref_index;
1038        }
1039
1040        for (; ref_index < REF_FRAMES; ++ref_index)
1041                vp9->next_ref_frame_map[ref_index] =
1042                        vp9->ref_frame_map[ref_index];
1043}
1044
1045static void codec_vp9_save_refs(struct codec_vp9 *vp9)
1046{
1047        union rpm_param *param = &vp9->rpm_param;
1048        int i;
1049
1050        for (i = 0; i < REFS_PER_FRAME; ++i) {
1051                const int ref = (param->p.ref_info >>
1052                                 (((REFS_PER_FRAME - i - 1) * 4) + 1)) & 0x7;
1053
1054                if (vp9->ref_frame_map[ref] < 0)
1055                        continue;
1056
1057                pr_warn("%s: FIXME, would need to save ref %d\n",
1058                        __func__, vp9->ref_frame_map[ref]);
1059        }
1060}
1061
1062static void codec_vp9_update_ref(struct codec_vp9 *vp9)
1063{
1064        union rpm_param *param = &vp9->rpm_param;
1065        int ref_index = 0;
1066        int mask;
1067        int refresh_frame_flags;
1068
1069        if (!vp9->cur_frame)
1070                return;
1071
1072        refresh_frame_flags = vp9->cur_frame->type == KEY_FRAME ?
1073                                0xff : param->p.refresh_frame_flags;
1074
1075        for (mask = refresh_frame_flags; mask; mask >>= 1) {
1076                vp9->ref_frame_map[ref_index] =
1077                        vp9->next_ref_frame_map[ref_index];
1078                ++ref_index;
1079        }
1080
1081        if (param->p.show_existing_frame)
1082                return;
1083
1084        for (; ref_index < REF_FRAMES; ++ref_index)
1085                vp9->ref_frame_map[ref_index] =
1086                        vp9->next_ref_frame_map[ref_index];
1087}
1088
1089static struct vp9_frame *codec_vp9_get_frame_by_idx(struct codec_vp9 *vp9,
1090                                                    int idx)
1091{
1092        struct vp9_frame *frame;
1093
1094        list_for_each_entry(frame, &vp9->ref_frames_list, list) {
1095                if (frame->index == idx)
1096                        return frame;
1097        }
1098
1099        return NULL;
1100}
1101
1102static void codec_vp9_sync_ref(struct codec_vp9 *vp9)
1103{
1104        union rpm_param *param = &vp9->rpm_param;
1105        int i;
1106
1107        for (i = 0; i < REFS_PER_FRAME; ++i) {
1108                const int ref = (param->p.ref_info >>
1109                                 (((REFS_PER_FRAME - i - 1) * 4) + 1)) & 0x7;
1110                const int idx = vp9->ref_frame_map[ref];
1111
1112                vp9->frame_refs[i] = codec_vp9_get_frame_by_idx(vp9, idx);
1113                if (!vp9->frame_refs[i])
1114                        pr_warn("%s: couldn't find VP9 ref %d\n", __func__,
1115                                idx);
1116        }
1117}
1118
1119static void codec_vp9_set_refs(struct amvdec_session *sess,
1120                               struct codec_vp9 *vp9)
1121{
1122        struct amvdec_core *core = sess->core;
1123        int i;
1124
1125        for (i = 0; i < REFS_PER_FRAME; ++i) {
1126                struct vp9_frame *frame = vp9->frame_refs[i];
1127                int id_y;
1128                int id_u_v;
1129
1130                if (!frame)
1131                        continue;
1132
1133                if (codec_hevc_use_fbc(sess->pixfmt_cap, vp9->is_10bit)) {
1134                        id_y = frame->index;
1135                        id_u_v = id_y;
1136                } else {
1137                        id_y = frame->index * 2;
1138                        id_u_v = id_y + 1;
1139                }
1140
1141                amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_DATA_ADDR,
1142                                 (id_u_v << 16) | (id_u_v << 8) | id_y);
1143        }
1144}
1145
1146static void codec_vp9_set_mc(struct amvdec_session *sess,
1147                             struct codec_vp9 *vp9)
1148{
1149        struct amvdec_core *core = sess->core;
1150        u32 scale = 0;
1151        u32 sz;
1152        int i;
1153
1154        amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_ACCCONFIG_ADDR, 1);
1155        codec_vp9_set_refs(sess, vp9);
1156        amvdec_write_dos(core, HEVCD_MPP_ANC_CANVAS_ACCCONFIG_ADDR,
1157                         (16 << 8) | 1);
1158        codec_vp9_set_refs(sess, vp9);
1159
1160        amvdec_write_dos(core, VP9D_MPP_REFINFO_TBL_ACCCONFIG, BIT(2));
1161        for (i = 0; i < REFS_PER_FRAME; ++i) {
1162                if (!vp9->frame_refs[i])
1163                        continue;
1164
1165                if (vp9->frame_refs[i]->width != vp9->width ||
1166                    vp9->frame_refs[i]->height != vp9->height)
1167                        scale = 1;
1168
1169                sz = amvdec_am21c_body_size(vp9->frame_refs[i]->width,
1170                                            vp9->frame_refs[i]->height);
1171
1172                amvdec_write_dos(core, VP9D_MPP_REFINFO_DATA,
1173                                 vp9->frame_refs[i]->width);
1174                amvdec_write_dos(core, VP9D_MPP_REFINFO_DATA,
1175                                 vp9->frame_refs[i]->height);
1176                amvdec_write_dos(core, VP9D_MPP_REFINFO_DATA,
1177                                 (vp9->frame_refs[i]->width << 14) /
1178                                 vp9->width);
1179                amvdec_write_dos(core, VP9D_MPP_REFINFO_DATA,
1180                                 (vp9->frame_refs[i]->height << 14) /
1181                                 vp9->height);
1182                amvdec_write_dos(core, VP9D_MPP_REFINFO_DATA, sz >> 5);
1183        }
1184
1185        amvdec_write_dos(core, VP9D_MPP_REF_SCALE_ENBL, scale);
1186}
1187
1188static struct vp9_frame *codec_vp9_get_new_frame(struct amvdec_session *sess)
1189{
1190        struct codec_vp9 *vp9 = sess->priv;
1191        union rpm_param *param = &vp9->rpm_param;
1192        struct vb2_v4l2_buffer *vbuf;
1193        struct vp9_frame *new_frame;
1194
1195        new_frame = kzalloc(sizeof(*new_frame), GFP_KERNEL);
1196        if (!new_frame)
1197                return NULL;
1198
1199        vbuf = v4l2_m2m_dst_buf_remove(sess->m2m_ctx);
1200        if (!vbuf) {
1201                dev_err(sess->core->dev, "No dst buffer available\n");
1202                kfree(new_frame);
1203                return NULL;
1204        }
1205
1206        while (codec_vp9_get_frame_by_idx(vp9, vbuf->vb2_buf.index)) {
1207                struct vb2_v4l2_buffer *old_vbuf = vbuf;
1208
1209                vbuf = v4l2_m2m_dst_buf_remove(sess->m2m_ctx);
1210                v4l2_m2m_buf_queue(sess->m2m_ctx, old_vbuf);
1211                if (!vbuf) {
1212                        dev_err(sess->core->dev, "No dst buffer available\n");
1213                        kfree(new_frame);
1214                        return NULL;
1215                }
1216        }
1217
1218        new_frame->vbuf = vbuf;
1219        new_frame->index = vbuf->vb2_buf.index;
1220        new_frame->intra_only = param->p.intra_only;
1221        new_frame->show = param->p.show_frame;
1222        new_frame->type = param->p.frame_type;
1223        new_frame->width = vp9->width;
1224        new_frame->height = vp9->height;
1225        list_add_tail(&new_frame->list, &vp9->ref_frames_list);
1226        vp9->frames_num++;
1227
1228        return new_frame;
1229}
1230
1231static void codec_vp9_show_existing_frame(struct codec_vp9 *vp9)
1232{
1233        union rpm_param *param = &vp9->rpm_param;
1234
1235        if (!param->p.show_existing_frame)
1236                return;
1237
1238        pr_debug("showing frame %u\n", param->p.frame_to_show_idx);
1239}
1240
1241static void codec_vp9_rm_noshow_frame(struct amvdec_session *sess)
1242{
1243        struct codec_vp9 *vp9 = sess->priv;
1244        struct vp9_frame *tmp;
1245
1246        list_for_each_entry(tmp, &vp9->ref_frames_list, list) {
1247                if (tmp->show)
1248                        continue;
1249
1250                pr_debug("rm noshow: %u\n", tmp->index);
1251                v4l2_m2m_buf_queue(sess->m2m_ctx, tmp->vbuf);
1252                list_del(&tmp->list);
1253                kfree(tmp);
1254                vp9->frames_num--;
1255                return;
1256        }
1257}
1258
1259static void codec_vp9_process_frame(struct amvdec_session *sess)
1260{
1261        struct amvdec_core *core = sess->core;
1262        struct codec_vp9 *vp9 = sess->priv;
1263        union rpm_param *param = &vp9->rpm_param;
1264        int intra_only;
1265
1266        if (!param->p.show_frame)
1267                codec_vp9_rm_noshow_frame(sess);
1268
1269        vp9->cur_frame = codec_vp9_get_new_frame(sess);
1270        if (!vp9->cur_frame)
1271                return;
1272
1273        pr_debug("frame %d: type: %08X; show_exist: %u; show: %u, intra_only: %u\n",
1274                 vp9->cur_frame->index,
1275                 param->p.frame_type, param->p.show_existing_frame,
1276                 param->p.show_frame, param->p.intra_only);
1277
1278        if (param->p.frame_type != KEY_FRAME)
1279                codec_vp9_sync_ref(vp9);
1280        codec_vp9_update_next_ref(vp9);
1281        codec_vp9_show_existing_frame(vp9);
1282
1283        if (codec_hevc_use_mmu(core->platform->revision, sess->pixfmt_cap,
1284                               vp9->is_10bit))
1285                codec_hevc_fill_mmu_map(sess, &vp9->common,
1286                                        &vp9->cur_frame->vbuf->vb2_buf);
1287
1288        intra_only = param->p.show_frame ? 0 : param->p.intra_only;
1289
1290        /* clear mpred (for keyframe only) */
1291        if (param->p.frame_type != KEY_FRAME && !intra_only) {
1292                codec_vp9_set_mc(sess, vp9);
1293                codec_vp9_set_mpred_mv(core, vp9);
1294        } else {
1295                amvdec_clear_dos_bits(core, HEVC_MPRED_CTRL4, BIT(6));
1296        }
1297
1298        amvdec_write_dos(core, HEVC_PARSER_PICTURE_SIZE,
1299                         (vp9->height << 16) | vp9->width);
1300        codec_vp9_set_mcrcc(sess);
1301        codec_vp9_set_sao(sess, &vp9->cur_frame->vbuf->vb2_buf);
1302
1303        vp9_loop_filter_frame_init(core, &vp9->seg_4lf,
1304                                   &vp9->lfi, &vp9->lf,
1305                                   vp9->default_filt_lvl);
1306
1307        /* ask uCode to start decoding */
1308        amvdec_write_dos(core, VP9_DEC_STATUS_REG, VP9_10B_DECODE_SLICE);
1309}
1310
1311static void codec_vp9_process_lf(struct codec_vp9 *vp9)
1312{
1313        union rpm_param *param = &vp9->rpm_param;
1314        int i;
1315
1316        vp9->lf.mode_ref_delta_enabled = param->p.mode_ref_delta_enabled;
1317        vp9->lf.sharpness_level = param->p.sharpness_level;
1318        vp9->default_filt_lvl = param->p.filter_level;
1319        vp9->seg_4lf.enabled = param->p.seg_enabled;
1320        vp9->seg_4lf.abs_delta = param->p.seg_abs_delta;
1321
1322        for (i = 0; i < 4; i++)
1323                vp9->lf.ref_deltas[i] = param->p.ref_deltas[i];
1324
1325        for (i = 0; i < 2; i++)
1326                vp9->lf.mode_deltas[i] = param->p.mode_deltas[i];
1327
1328        for (i = 0; i < MAX_SEGMENTS; i++)
1329                vp9->seg_4lf.feature_mask[i] =
1330                        (param->p.seg_lf_info[i] & 0x8000) ?
1331                                (1 << SEG_LVL_ALT_LF) : 0;
1332
1333        for (i = 0; i < MAX_SEGMENTS; i++)
1334                vp9->seg_4lf.feature_data[i][SEG_LVL_ALT_LF] =
1335                        (param->p.seg_lf_info[i] & 0x100) ?
1336                                -(param->p.seg_lf_info[i] & 0x3f)
1337                                : (param->p.seg_lf_info[i] & 0x3f);
1338}
1339
1340static void codec_vp9_resume(struct amvdec_session *sess)
1341{
1342        struct codec_vp9 *vp9 = sess->priv;
1343
1344        mutex_lock(&vp9->lock);
1345        if (codec_hevc_setup_buffers(sess, &vp9->common, vp9->is_10bit)) {
1346                mutex_unlock(&vp9->lock);
1347                amvdec_abort(sess);
1348                return;
1349        }
1350
1351        codec_vp9_setup_workspace(sess, vp9);
1352        codec_hevc_setup_decode_head(sess, vp9->is_10bit);
1353        codec_vp9_process_lf(vp9);
1354        codec_vp9_process_frame(sess);
1355
1356        mutex_unlock(&vp9->lock);
1357}
1358
1359/*
1360 * The RPM section within the workspace contains
1361 * many information regarding the parsed bitstream
1362 */
1363static void codec_vp9_fetch_rpm(struct amvdec_session *sess)
1364{
1365        struct codec_vp9 *vp9 = sess->priv;
1366        u16 *rpm_vaddr = vp9->workspace_vaddr + RPM_OFFSET;
1367        int i, j;
1368
1369        for (i = 0; i < RPM_BUF_SIZE; i += 4)
1370                for (j = 0; j < 4; j++)
1371                        vp9->rpm_param.l.data[i + j] = rpm_vaddr[i + 3 - j];
1372}
1373
1374static int codec_vp9_process_rpm(struct codec_vp9 *vp9)
1375{
1376        union rpm_param *param = &vp9->rpm_param;
1377        int src_changed = 0;
1378        int is_10bit = 0;
1379        int pic_width_64 = ALIGN(param->p.width, 64);
1380        int pic_height_32 = ALIGN(param->p.height, 32);
1381        int pic_width_lcu  = (pic_width_64 % LCU_SIZE) ?
1382                                pic_width_64 / LCU_SIZE  + 1
1383                                : pic_width_64 / LCU_SIZE;
1384        int pic_height_lcu = (pic_height_32 % LCU_SIZE) ?
1385                                pic_height_32 / LCU_SIZE + 1
1386                                : pic_height_32 / LCU_SIZE;
1387        vp9->lcu_total = pic_width_lcu * pic_height_lcu;
1388
1389        if (param->p.bit_depth == 10)
1390                is_10bit = 1;
1391
1392        if (vp9->width != param->p.width || vp9->height != param->p.height ||
1393            vp9->is_10bit != is_10bit)
1394                src_changed = 1;
1395
1396        vp9->width = param->p.width;
1397        vp9->height = param->p.height;
1398        vp9->is_10bit = is_10bit;
1399
1400        pr_debug("width: %u; height: %u; is_10bit: %d; src_changed: %d\n",
1401                 vp9->width, vp9->height, is_10bit, src_changed);
1402
1403        return src_changed;
1404}
1405
1406static bool codec_vp9_is_ref(struct codec_vp9 *vp9, struct vp9_frame *frame)
1407{
1408        int i;
1409
1410        for (i = 0; i < REF_FRAMES; ++i)
1411                if (vp9->ref_frame_map[i] == frame->index)
1412                        return true;
1413
1414        return false;
1415}
1416
1417static void codec_vp9_show_frame(struct amvdec_session *sess)
1418{
1419        struct codec_vp9 *vp9 = sess->priv;
1420        struct vp9_frame *tmp, *n;
1421
1422        list_for_each_entry_safe(tmp, n, &vp9->ref_frames_list, list) {
1423                if (!tmp->show || tmp == vp9->cur_frame)
1424                        continue;
1425
1426                if (!tmp->done) {
1427                        pr_debug("Doning %u\n", tmp->index);
1428                        amvdec_dst_buf_done(sess, tmp->vbuf, V4L2_FIELD_NONE);
1429                        tmp->done = 1;
1430                        vp9->frames_num--;
1431                }
1432
1433                if (codec_vp9_is_ref(vp9, tmp) || tmp == vp9->prev_frame)
1434                        continue;
1435
1436                pr_debug("deleting %d\n", tmp->index);
1437                list_del(&tmp->list);
1438                kfree(tmp);
1439        }
1440}
1441
1442static void vp9_tree_merge_probs(unsigned int *prev_prob,
1443                                 unsigned int *cur_prob,
1444                                 int coef_node_start, int tree_left,
1445                                 int tree_right,
1446                                 int tree_i, int node)
1447{
1448        int prob_32, prob_res, prob_shift;
1449        int pre_prob, new_prob;
1450        int den, m_count, get_prob, factor;
1451
1452        prob_32 = prev_prob[coef_node_start / 4 * 2];
1453        prob_res = coef_node_start & 3;
1454        prob_shift = prob_res * 8;
1455        pre_prob = (prob_32 >> prob_shift) & 0xff;
1456
1457        den = tree_left + tree_right;
1458
1459        if (den == 0) {
1460                new_prob = pre_prob;
1461        } else {
1462                m_count = den < MODE_MV_COUNT_SAT ? den : MODE_MV_COUNT_SAT;
1463                get_prob =
1464                        clip_prob(div_r32(((int64_t)tree_left * 256 +
1465                                           (den >> 1)),
1466                                          den));
1467
1468                /* weighted_prob */
1469                factor = count_to_update_factor[m_count];
1470                new_prob = round_power_of_two(pre_prob * (256 - factor) +
1471                                              get_prob * factor, 8);
1472        }
1473
1474        cur_prob[coef_node_start / 4 * 2] =
1475                (cur_prob[coef_node_start / 4 * 2] & (~(0xff << prob_shift))) |
1476                (new_prob << prob_shift);
1477}
1478
1479static void adapt_coef_probs_cxt(unsigned int *prev_prob,
1480                                 unsigned int *cur_prob,
1481                                 unsigned int *count,
1482                                 int update_factor,
1483                                 int cxt_num,
1484                                 int coef_cxt_start,
1485                                 int coef_count_cxt_start)
1486{
1487        int prob_32, prob_res, prob_shift;
1488        int pre_prob, new_prob;
1489        int num, den, m_count, get_prob, factor;
1490        int node, coef_node_start;
1491        int count_sat = 24;
1492        int cxt;
1493
1494        for (cxt = 0; cxt < cxt_num; cxt++) {
1495                const int n0 = count[coef_count_cxt_start];
1496                const int n1 = count[coef_count_cxt_start + 1];
1497                const int n2 = count[coef_count_cxt_start + 2];
1498                const int neob = count[coef_count_cxt_start + 3];
1499                const int nneob = count[coef_count_cxt_start + 4];
1500                const unsigned int branch_ct[3][2] = {
1501                        { neob, nneob },
1502                        { n0, n1 + n2 },
1503                        { n1, n2 }
1504                };
1505
1506                coef_node_start = coef_cxt_start;
1507                for (node = 0 ; node < 3 ; node++) {
1508                        prob_32 = prev_prob[coef_node_start / 4 * 2];
1509                        prob_res = coef_node_start & 3;
1510                        prob_shift = prob_res * 8;
1511                        pre_prob = (prob_32 >> prob_shift) & 0xff;
1512
1513                        /* get binary prob */
1514                        num = branch_ct[node][0];
1515                        den = branch_ct[node][0] + branch_ct[node][1];
1516                        m_count = den < count_sat ? den : count_sat;
1517
1518                        get_prob = (den == 0) ?
1519                                        128u :
1520                                        clip_prob(div_r32(((int64_t)num * 256 +
1521                                                          (den >> 1)), den));
1522
1523                        factor = update_factor * m_count / count_sat;
1524                        new_prob =
1525                                round_power_of_two(pre_prob * (256 - factor) +
1526                                                   get_prob * factor, 8);
1527
1528                        cur_prob[coef_node_start / 4 * 2] =
1529                                (cur_prob[coef_node_start / 4 * 2] &
1530                                 (~(0xff << prob_shift))) |
1531                                (new_prob << prob_shift);
1532
1533                        coef_node_start += 1;
1534                }
1535
1536                coef_cxt_start = coef_cxt_start + 3;
1537                coef_count_cxt_start = coef_count_cxt_start + 5;
1538        }
1539}
1540
1541static void adapt_coef_probs(int prev_kf, int cur_kf, int pre_fc,
1542                             unsigned int *prev_prob, unsigned int *cur_prob,
1543                             unsigned int *count)
1544{
1545        int tx_size, coef_tx_size_start, coef_count_tx_size_start;
1546        int plane, coef_plane_start, coef_count_plane_start;
1547        int type, coef_type_start, coef_count_type_start;
1548        int band, coef_band_start, coef_count_band_start;
1549        int cxt_num;
1550        int coef_cxt_start, coef_count_cxt_start;
1551        int node, coef_node_start, coef_count_node_start;
1552
1553        int tree_i, tree_left, tree_right;
1554        int mvd_i;
1555
1556        int update_factor = cur_kf ? 112 : (prev_kf ? 128 : 112);
1557
1558        int prob_32;
1559        int prob_res;
1560        int prob_shift;
1561        int pre_prob;
1562
1563        int den;
1564        int get_prob;
1565        int m_count;
1566        int factor;
1567
1568        int new_prob;
1569
1570        for (tx_size = 0 ; tx_size < 4 ; tx_size++) {
1571                coef_tx_size_start = VP9_COEF_START +
1572                                tx_size * 4 * VP9_COEF_SIZE_ONE_SET;
1573                coef_count_tx_size_start = VP9_COEF_COUNT_START +
1574                                tx_size * 4 * VP9_COEF_COUNT_SIZE_ONE_SET;
1575                coef_plane_start = coef_tx_size_start;
1576                coef_count_plane_start = coef_count_tx_size_start;
1577
1578                for (plane = 0 ; plane < 2 ; plane++) {
1579                        coef_type_start = coef_plane_start;
1580                        coef_count_type_start = coef_count_plane_start;
1581
1582                        for (type = 0 ; type < 2 ; type++) {
1583                                coef_band_start = coef_type_start;
1584                                coef_count_band_start = coef_count_type_start;
1585
1586                                for (band = 0 ; band < 6 ; band++) {
1587                                        if (band == 0)
1588                                                cxt_num = 3;
1589                                        else
1590                                                cxt_num = 6;
1591                                        coef_cxt_start = coef_band_start;
1592                                        coef_count_cxt_start =
1593                                                coef_count_band_start;
1594
1595                                        adapt_coef_probs_cxt(prev_prob,
1596                                                             cur_prob,
1597                                                             count,
1598                                                             update_factor,
1599                                                             cxt_num,
1600                                                             coef_cxt_start,
1601                                                        coef_count_cxt_start);
1602
1603                                        if (band == 0) {
1604                                                coef_band_start += 10;
1605                                                coef_count_band_start += 15;
1606                                        } else {
1607                                                coef_band_start += 18;
1608                                                coef_count_band_start += 30;
1609                                        }
1610                                }
1611                                coef_type_start += VP9_COEF_SIZE_ONE_SET;
1612                                coef_count_type_start +=
1613                                        VP9_COEF_COUNT_SIZE_ONE_SET;
1614                        }
1615
1616                        coef_plane_start += 2 * VP9_COEF_SIZE_ONE_SET;
1617                        coef_count_plane_start +=
1618                                2 * VP9_COEF_COUNT_SIZE_ONE_SET;
1619                }
1620        }
1621
1622        if (cur_kf == 0) {
1623                /* mode_mv_merge_probs - merge_intra_inter_prob */
1624                for (coef_count_node_start = VP9_INTRA_INTER_COUNT_START;
1625                     coef_count_node_start < (VP9_MV_CLASS0_HP_1_COUNT_START +
1626                                              VP9_MV_CLASS0_HP_1_COUNT_SIZE);
1627                     coef_count_node_start += 2) {
1628                        if (coef_count_node_start ==
1629                                        VP9_INTRA_INTER_COUNT_START)
1630                                coef_node_start = VP9_INTRA_INTER_START;
1631                        else if (coef_count_node_start ==
1632                                        VP9_COMP_INTER_COUNT_START)
1633                                coef_node_start = VP9_COMP_INTER_START;
1634                        else if (coef_count_node_start ==
1635                                        VP9_TX_MODE_COUNT_START)
1636                                coef_node_start = VP9_TX_MODE_START;
1637                        else if (coef_count_node_start ==
1638                                        VP9_SKIP_COUNT_START)
1639                                coef_node_start = VP9_SKIP_START;
1640                        else if (coef_count_node_start ==
1641                                        VP9_MV_SIGN_0_COUNT_START)
1642                                coef_node_start = VP9_MV_SIGN_0_START;
1643                        else if (coef_count_node_start ==
1644                                        VP9_MV_SIGN_1_COUNT_START)
1645                                coef_node_start = VP9_MV_SIGN_1_START;
1646                        else if (coef_count_node_start ==
1647                                        VP9_MV_BITS_0_COUNT_START)
1648                                coef_node_start = VP9_MV_BITS_0_START;
1649                        else if (coef_count_node_start ==
1650                                        VP9_MV_BITS_1_COUNT_START)
1651                                coef_node_start = VP9_MV_BITS_1_START;
1652                        else if (coef_count_node_start ==
1653                                        VP9_MV_CLASS0_HP_0_COUNT_START)
1654                                coef_node_start = VP9_MV_CLASS0_HP_0_START;
1655
1656                        den = count[coef_count_node_start] +
1657                              count[coef_count_node_start + 1];
1658
1659                        prob_32 = prev_prob[coef_node_start / 4 * 2];
1660                        prob_res = coef_node_start & 3;
1661                        prob_shift = prob_res * 8;
1662                        pre_prob = (prob_32 >> prob_shift) & 0xff;
1663
1664                        if (den == 0) {
1665                                new_prob = pre_prob;
1666                        } else {
1667                                m_count = den < MODE_MV_COUNT_SAT ?
1668                                                den : MODE_MV_COUNT_SAT;
1669                                get_prob =
1670                                clip_prob(div_r32(((int64_t)
1671                                        count[coef_count_node_start] * 256 +
1672                                        (den >> 1)),
1673                                        den));
1674
1675                                /* weighted prob */
1676                                factor = count_to_update_factor[m_count];
1677                                new_prob =
1678                                        round_power_of_two(pre_prob *
1679                                                           (256 - factor) +
1680                                                           get_prob * factor,
1681                                                           8);
1682                        }
1683
1684                        cur_prob[coef_node_start / 4 * 2] =
1685                                (cur_prob[coef_node_start / 4 * 2] &
1686                                 (~(0xff << prob_shift))) |
1687                                (new_prob << prob_shift);
1688
1689                        coef_node_start = coef_node_start + 1;
1690                }
1691
1692                coef_node_start = VP9_INTER_MODE_START;
1693                coef_count_node_start = VP9_INTER_MODE_COUNT_START;
1694                for (tree_i = 0 ; tree_i < 7 ; tree_i++) {
1695                        for (node = 0 ; node < 3 ; node++) {
1696                                unsigned int start = coef_count_node_start;
1697
1698                                switch (node) {
1699                                case 2:
1700                                        tree_left = count[start + 1];
1701                                        tree_right = count[start + 3];
1702                                        break;
1703                                case 1:
1704                                        tree_left = count[start + 0];
1705                                        tree_right = count[start + 1] +
1706                                                     count[start + 3];
1707                                        break;
1708                                default:
1709                                        tree_left = count[start + 2];
1710                                        tree_right = count[start + 0] +
1711                                                     count[start + 1] +
1712                                                     count[start + 3];
1713                                        break;
1714                                }
1715
1716                                vp9_tree_merge_probs(prev_prob, cur_prob,
1717                                                     coef_node_start,
1718                                                     tree_left, tree_right,
1719                                                     tree_i, node);
1720
1721                                coef_node_start = coef_node_start + 1;
1722                        }
1723
1724                        coef_count_node_start = coef_count_node_start + 4;
1725                }
1726
1727                coef_node_start = VP9_IF_Y_MODE_START;
1728                coef_count_node_start = VP9_IF_Y_MODE_COUNT_START;
1729                for (tree_i = 0 ; tree_i < 14 ; tree_i++) {
1730                        for (node = 0 ; node < 9 ; node++) {
1731                                unsigned int start = coef_count_node_start;
1732
1733                                switch (node) {
1734                                case 8:
1735                                        tree_left =
1736                                                count[start + D153_PRED];
1737                                        tree_right =
1738                                                count[start + D207_PRED];
1739                                        break;
1740                                case 7:
1741                                        tree_left =
1742                                                count[start + D63_PRED];
1743                                        tree_right =
1744                                                count[start + D207_PRED] +
1745                                                count[start + D153_PRED];
1746                                        break;
1747                                case 6:
1748                                        tree_left =
1749                                                count[start + D45_PRED];
1750                                        tree_right =
1751                                                count[start + D207_PRED] +
1752                                                count[start + D153_PRED] +
1753                                                count[start + D63_PRED];
1754                                        break;
1755                                case 5:
1756                                        tree_left =
1757                                                count[start + D135_PRED];
1758                                        tree_right =
1759                                                count[start + D117_PRED];
1760                                        break;
1761                                case 4:
1762                                        tree_left =
1763                                                count[start + H_PRED];
1764                                        tree_right =
1765                                                count[start + D117_PRED] +
1766                                                count[start + D135_PRED];
1767                                        break;
1768                                case 3:
1769                                        tree_left =
1770                                                count[start + H_PRED] +
1771                                                count[start + D117_PRED] +
1772                                                count[start + D135_PRED];
1773                                        tree_right =
1774                                                count[start + D45_PRED] +
1775                                                count[start + D207_PRED] +
1776                                                count[start + D153_PRED] +
1777                                                count[start + D63_PRED];
1778                                        break;
1779                                case 2:
1780                                        tree_left =
1781                                                count[start + V_PRED];
1782                                        tree_right =
1783                                                count[start + H_PRED] +
1784                                                count[start + D117_PRED] +
1785                                                count[start + D135_PRED] +
1786                                                count[start + D45_PRED] +
1787                                                count[start + D207_PRED] +
1788                                                count[start + D153_PRED] +
1789                                                count[start + D63_PRED];
1790                                        break;
1791                                case 1:
1792                                        tree_left =
1793                                                count[start + TM_PRED];
1794                                        tree_right =
1795                                                count[start + V_PRED] +
1796                                                count[start + H_PRED] +
1797                                                count[start + D117_PRED] +
1798                                                count[start + D135_PRED] +
1799                                                count[start + D45_PRED] +
1800                                                count[start + D207_PRED] +
1801                                                count[start + D153_PRED] +
1802                                                count[start + D63_PRED];
1803                                        break;
1804                                default:
1805                                        tree_left =
1806                                                count[start + DC_PRED];
1807                                        tree_right =
1808                                                count[start + TM_PRED] +
1809                                                count[start + V_PRED] +
1810                                                count[start + H_PRED] +
1811                                                count[start + D117_PRED] +
1812                                                count[start + D135_PRED] +
1813                                                count[start + D45_PRED] +
1814                                                count[start + D207_PRED] +
1815                                                count[start + D153_PRED] +
1816                                                count[start + D63_PRED];
1817                                        break;
1818                                }
1819
1820                                vp9_tree_merge_probs(prev_prob, cur_prob,
1821                                                     coef_node_start,
1822                                                     tree_left, tree_right,
1823                                                     tree_i, node);
1824
1825                                coef_node_start = coef_node_start + 1;
1826                        }
1827                        coef_count_node_start = coef_count_node_start + 10;
1828                }
1829
1830                coef_node_start = VP9_PARTITION_P_START;
1831                coef_count_node_start = VP9_PARTITION_P_COUNT_START;
1832                for (tree_i = 0 ; tree_i < 16 ; tree_i++) {
1833                        for (node = 0 ; node < 3 ; node++) {
1834                                unsigned int start = coef_count_node_start;
1835
1836                                switch (node) {
1837                                case 2:
1838                                        tree_left = count[start + 2];
1839                                        tree_right = count[start + 3];
1840                                        break;
1841                                case 1:
1842                                        tree_left = count[start + 1];
1843                                        tree_right = count[start + 2] +
1844                                                     count[start + 3];
1845                                        break;
1846                                default:
1847                                        tree_left = count[start + 0];
1848                                        tree_right = count[start + 1] +
1849                                                     count[start + 2] +
1850                                                     count[start + 3];
1851                                        break;
1852                                }
1853
1854                                vp9_tree_merge_probs(prev_prob, cur_prob,
1855                                                     coef_node_start,
1856                                                     tree_left, tree_right,
1857                                                     tree_i, node);
1858
1859                                coef_node_start = coef_node_start + 1;
1860                        }
1861
1862                        coef_count_node_start = coef_count_node_start + 4;
1863                }
1864
1865                coef_node_start = VP9_INTERP_START;
1866                coef_count_node_start = VP9_INTERP_COUNT_START;
1867                for (tree_i = 0 ; tree_i < 4 ; tree_i++) {
1868                        for (node = 0 ; node < 2 ; node++) {
1869                                unsigned int start = coef_count_node_start;
1870
1871                                switch (node) {
1872                                case 1:
1873                                        tree_left = count[start + 1];
1874                                        tree_right = count[start + 2];
1875                                        break;
1876                                default:
1877                                        tree_left = count[start + 0];
1878                                        tree_right = count[start + 1] +
1879                                                     count[start + 2];
1880                                        break;
1881                                }
1882
1883                                vp9_tree_merge_probs(prev_prob, cur_prob,
1884                                                     coef_node_start,
1885                                                     tree_left, tree_right,
1886                                                     tree_i, node);
1887
1888                                coef_node_start = coef_node_start + 1;
1889                        }
1890                        coef_count_node_start = coef_count_node_start + 3;
1891                }
1892
1893                coef_node_start = VP9_MV_JOINTS_START;
1894                coef_count_node_start = VP9_MV_JOINTS_COUNT_START;
1895                for (tree_i = 0 ; tree_i < 1 ; tree_i++) {
1896                        for (node = 0 ; node < 3 ; node++) {
1897                                unsigned int start = coef_count_node_start;
1898
1899                                switch (node) {
1900                                case 2:
1901                                        tree_left = count[start + 2];
1902                                        tree_right = count[start + 3];
1903                                        break;
1904                                case 1:
1905                                        tree_left = count[start + 1];
1906                                        tree_right = count[start + 2] +
1907                                                     count[start + 3];
1908                                        break;
1909                                default:
1910                                        tree_left = count[start + 0];
1911                                        tree_right = count[start + 1] +
1912                                                     count[start + 2] +
1913                                                     count[start + 3];
1914                                        break;
1915                                }
1916
1917                                vp9_tree_merge_probs(prev_prob, cur_prob,
1918                                                     coef_node_start,
1919                                                     tree_left, tree_right,
1920                                                     tree_i, node);
1921
1922                                coef_node_start = coef_node_start + 1;
1923                        }
1924                        coef_count_node_start = coef_count_node_start + 4;
1925                }
1926
1927                for (mvd_i = 0 ; mvd_i < 2 ; mvd_i++) {
1928                        coef_node_start = mvd_i ? VP9_MV_CLASSES_1_START :
1929                                                  VP9_MV_CLASSES_0_START;
1930                        coef_count_node_start = mvd_i ?
1931                                        VP9_MV_CLASSES_1_COUNT_START :
1932                                        VP9_MV_CLASSES_0_COUNT_START;
1933                        tree_i = 0;
1934                        for (node = 0; node < 10; node++) {
1935                                unsigned int start = coef_count_node_start;
1936
1937                                switch (node) {
1938                                case 9:
1939                                        tree_left = count[start + 9];
1940                                        tree_right = count[start + 10];
1941                                        break;
1942                                case 8:
1943                                        tree_left = count[start + 7];
1944                                        tree_right = count[start + 8];
1945                                        break;
1946                                case 7:
1947                                        tree_left = count[start + 7] +
1948                                                     count[start + 8];
1949                                        tree_right = count[start + 9] +
1950                                                     count[start + 10];
1951                                        break;
1952                                case 6:
1953                                        tree_left = count[start + 6];
1954                                        tree_right = count[start + 7] +
1955                                                     count[start + 8] +
1956                                                     count[start + 9] +
1957                                                     count[start + 10];
1958                                        break;
1959                                case 5:
1960                                        tree_left = count[start + 4];
1961                                        tree_right = count[start + 5];
1962                                        break;
1963                                case 4:
1964                                        tree_left = count[start + 4] +
1965                                                    count[start + 5];
1966                                        tree_right = count[start + 6] +
1967                                                     count[start + 7] +
1968                                                     count[start + 8] +
1969                                                     count[start + 9] +
1970                                                     count[start + 10];
1971                                        break;
1972                                case 3:
1973                                        tree_left = count[start + 2];
1974                                        tree_right = count[start + 3];
1975                                        break;
1976                                case 2:
1977                                        tree_left = count[start + 2] +
1978                                                    count[start + 3];
1979                                        tree_right = count[start + 4] +
1980                                                     count[start + 5] +
1981                                                     count[start + 6] +
1982                                                     count[start + 7] +
1983                                                     count[start + 8] +
1984                                                     count[start + 9] +
1985                                                     count[start + 10];
1986                                        break;
1987                                case 1:
1988                                        tree_left = count[start + 1];
1989                                        tree_right = count[start + 2] +
1990                                                     count[start + 3] +
1991                                                     count[start + 4] +
1992                                                     count[start + 5] +
1993                                                     count[start + 6] +
1994                                                     count[start + 7] +
1995                                                     count[start + 8] +
1996                                                     count[start + 9] +
1997                                                     count[start + 10];
1998                                        break;
1999                                default:
2000                                        tree_left = count[start + 0];
2001                                        tree_right = count[start + 1] +
2002                                                     count[start + 2] +
2003                                                     count[start + 3] +
2004                                                     count[start + 4] +
2005                                                     count[start + 5] +
2006                                                     count[start + 6] +
2007                                                     count[start + 7] +
2008                                                     count[start + 8] +
2009                                                     count[start + 9] +
2010                                                     count[start + 10];
2011                                        break;
2012                                }
2013
2014                                vp9_tree_merge_probs(prev_prob, cur_prob,
2015                                                     coef_node_start,
2016                                                     tree_left, tree_right,
2017                                                     tree_i, node);
2018
2019                                coef_node_start = coef_node_start + 1;
2020                        }
2021
2022                        coef_node_start = mvd_i ? VP9_MV_CLASS0_1_START :
2023                                                  VP9_MV_CLASS0_0_START;
2024                        coef_count_node_start = mvd_i ?
2025                                                VP9_MV_CLASS0_1_COUNT_START :
2026                                                VP9_MV_CLASS0_0_COUNT_START;
2027                        tree_i = 0;
2028                        node = 0;
2029                        tree_left = count[coef_count_node_start + 0];
2030                        tree_right = count[coef_count_node_start + 1];
2031
2032                        vp9_tree_merge_probs(prev_prob, cur_prob,
2033                                             coef_node_start,
2034                                             tree_left, tree_right,
2035                                             tree_i, node);
2036                        coef_node_start = mvd_i ? VP9_MV_CLASS0_FP_1_START :
2037                                                  VP9_MV_CLASS0_FP_0_START;
2038                        coef_count_node_start = mvd_i ?
2039                                        VP9_MV_CLASS0_FP_1_COUNT_START :
2040                                        VP9_MV_CLASS0_FP_0_COUNT_START;
2041
2042                        for (tree_i = 0; tree_i < 3; tree_i++) {
2043                                for (node = 0; node < 3; node++) {
2044                                        unsigned int start =
2045                                                coef_count_node_start;
2046                                        switch (node) {
2047                                        case 2:
2048                                                tree_left = count[start + 2];
2049                                                tree_right = count[start + 3];
2050                                                break;
2051                                        case 1:
2052                                                tree_left = count[start + 1];
2053                                                tree_right = count[start + 2] +
2054                                                             count[start + 3];
2055                                                break;
2056                                        default:
2057                                                tree_left = count[start + 0];
2058                                                tree_right = count[start + 1] +
2059                                                             count[start + 2] +
2060                                                             count[start + 3];
2061                                                break;
2062                                        }
2063
2064                                        vp9_tree_merge_probs(prev_prob,
2065                                                             cur_prob,
2066                                                             coef_node_start,
2067                                                             tree_left,
2068                                                             tree_right,
2069                                                             tree_i, node);
2070
2071                                        coef_node_start = coef_node_start + 1;
2072                                }
2073                                coef_count_node_start =
2074                                        coef_count_node_start + 4;
2075                        }
2076                }
2077        }
2078}
2079
2080static irqreturn_t codec_vp9_threaded_isr(struct amvdec_session *sess)
2081{
2082        struct amvdec_core *core = sess->core;
2083        struct codec_vp9 *vp9 = sess->priv;
2084        u32 dec_status = amvdec_read_dos(core, VP9_DEC_STATUS_REG);
2085        u32 prob_status = amvdec_read_dos(core, VP9_ADAPT_PROB_REG);
2086        int i;
2087
2088        if (!vp9)
2089                return IRQ_HANDLED;
2090
2091        mutex_lock(&vp9->lock);
2092        if (dec_status != VP9_HEAD_PARSER_DONE) {
2093                dev_err(core->dev_dec, "Unrecognized dec_status: %08X\n",
2094                        dec_status);
2095                amvdec_abort(sess);
2096                goto unlock;
2097        }
2098
2099        pr_debug("ISR: %08X;%08X\n", dec_status, prob_status);
2100        sess->keyframe_found = 1;
2101
2102        if ((prob_status & 0xff) == 0xfd && vp9->cur_frame) {
2103                /* VP9_REQ_ADAPT_PROB */
2104                u8 *prev_prob_b = ((u8 *)vp9->workspace_vaddr +
2105                                         PROB_OFFSET) +
2106                                        ((prob_status >> 8) * 0x1000);
2107                u8 *cur_prob_b = ((u8 *)vp9->workspace_vaddr +
2108                                         PROB_OFFSET) + 0x4000;
2109                u8 *count_b = (u8 *)vp9->workspace_vaddr +
2110                                   COUNT_OFFSET;
2111                int last_frame_type = vp9->prev_frame ?
2112                                                vp9->prev_frame->type :
2113                                                KEY_FRAME;
2114
2115                adapt_coef_probs(last_frame_type == KEY_FRAME,
2116                                 vp9->cur_frame->type == KEY_FRAME ? 1 : 0,
2117                                 prob_status >> 8,
2118                                 (unsigned int *)prev_prob_b,
2119                                 (unsigned int *)cur_prob_b,
2120                                 (unsigned int *)count_b);
2121
2122                memcpy(prev_prob_b, cur_prob_b, ADAPT_PROB_SIZE);
2123                amvdec_write_dos(core, VP9_ADAPT_PROB_REG, 0);
2124        }
2125
2126        /* Invalidate first 3 refs */
2127        for (i = 0; i < REFS_PER_FRAME ; ++i)
2128                vp9->frame_refs[i] = NULL;
2129
2130        vp9->prev_frame = vp9->cur_frame;
2131        codec_vp9_update_ref(vp9);
2132
2133        codec_vp9_fetch_rpm(sess);
2134        if (codec_vp9_process_rpm(vp9)) {
2135                amvdec_src_change(sess, vp9->width, vp9->height, 16);
2136
2137                /* No frame is actually processed */
2138                vp9->cur_frame = NULL;
2139
2140                /* Show the remaining frame */
2141                codec_vp9_show_frame(sess);
2142
2143                /* FIXME: Save refs for resized frame */
2144                if (vp9->frames_num)
2145                        codec_vp9_save_refs(vp9);
2146
2147                goto unlock;
2148        }
2149
2150        codec_vp9_process_lf(vp9);
2151        codec_vp9_process_frame(sess);
2152        codec_vp9_show_frame(sess);
2153
2154unlock:
2155        mutex_unlock(&vp9->lock);
2156        return IRQ_HANDLED;
2157}
2158
2159static irqreturn_t codec_vp9_isr(struct amvdec_session *sess)
2160{
2161        return IRQ_WAKE_THREAD;
2162}
2163
2164struct amvdec_codec_ops codec_vp9_ops = {
2165        .start = codec_vp9_start,
2166        .stop = codec_vp9_stop,
2167        .isr = codec_vp9_isr,
2168        .threaded_isr = codec_vp9_threaded_isr,
2169        .num_pending_bufs = codec_vp9_num_pending_bufs,
2170        .drain = codec_vp9_flush_output,
2171        .resume = codec_vp9_resume,
2172};
2173