linux/drivers/media/usb/go7007/go7007-fw.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (C) 2005-2006 Micronas USA Inc.
   4 */
   5
   6/*
   7 * This file contains code to generate a firmware image for the GO7007SB
   8 * encoder.  Much of the firmware is read verbatim from a file, but some of
   9 * it concerning bitrate control and other things that can be configured at
  10 * run-time are generated dynamically.  Note that the format headers
  11 * generated here do not affect the functioning of the encoder; they are
  12 * merely parroted back to the host at the start of each frame.
  13 */
  14
  15#include <linux/module.h>
  16#include <linux/time.h>
  17#include <linux/mm.h>
  18#include <linux/device.h>
  19#include <linux/i2c.h>
  20#include <linux/firmware.h>
  21#include <linux/slab.h>
  22#include <asm/byteorder.h>
  23
  24#include "go7007-priv.h"
  25
  26#define GO7007_FW_NAME "go7007/go7007tv.bin"
  27
  28/* Constants used in the source firmware image to describe code segments */
  29
  30#define FLAG_MODE_MJPEG         (1)
  31#define FLAG_MODE_MPEG1         (1<<1)
  32#define FLAG_MODE_MPEG2         (1<<2)
  33#define FLAG_MODE_MPEG4         (1<<3)
  34#define FLAG_MODE_H263          (1<<4)
  35#define FLAG_MODE_ALL           (FLAG_MODE_MJPEG | FLAG_MODE_MPEG1 | \
  36                                        FLAG_MODE_MPEG2 | FLAG_MODE_MPEG4 | \
  37                                        FLAG_MODE_H263)
  38#define FLAG_SPECIAL            (1<<8)
  39
  40#define SPECIAL_FRM_HEAD        0
  41#define SPECIAL_BRC_CTRL        1
  42#define SPECIAL_CONFIG          2
  43#define SPECIAL_SEQHEAD         3
  44#define SPECIAL_AV_SYNC         4
  45#define SPECIAL_FINAL           5
  46#define SPECIAL_AUDIO           6
  47#define SPECIAL_MODET           7
  48
  49/* Little data class for creating MPEG headers bit-by-bit */
  50
  51struct code_gen {
  52        unsigned char *p; /* destination */
  53        u32 a; /* collects bits at the top of the variable */
  54        int b; /* bit position of most recently-written bit */
  55        int len; /* written out so far */
  56};
  57
  58#define CODE_GEN(name, dest) struct code_gen name = { dest, 0, 32, 0 }
  59
  60#define CODE_ADD(name, val, length) do { \
  61        name.b -= (length); \
  62        name.a |= (val) << name.b; \
  63        while (name.b <= 24) { \
  64                *name.p = name.a >> 24; \
  65                ++name.p; \
  66                name.a <<= 8; \
  67                name.b += 8; \
  68                name.len += 8; \
  69        } \
  70} while (0)
  71
  72#define CODE_LENGTH(name) (name.len + (32 - name.b))
  73
  74/* Tables for creating the bitrate control data */
  75
  76static const s16 converge_speed_ip[101] = {
  77        1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  78        1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  79        1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  80        1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
  81        2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
  82        3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
  83        5, 5, 5, 6, 6, 6, 7, 7, 8, 8,
  84        9, 10, 10, 11, 12, 13, 14, 15, 16, 17,
  85        19, 20, 22, 23, 25, 27, 30, 32, 35, 38,
  86        41, 45, 49, 53, 58, 63, 69, 76, 83, 91,
  87        100
  88};
  89
  90static const s16 converge_speed_ipb[101] = {
  91        3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  92        3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  93        3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
  94        4, 4, 4, 4, 5, 5, 5, 5, 5, 6,
  95        6, 6, 6, 7, 7, 7, 7, 8, 8, 9,
  96        9, 9, 10, 10, 11, 12, 12, 13, 14, 14,
  97        15, 16, 17, 18, 19, 20, 22, 23, 25, 26,
  98        28, 30, 32, 34, 37, 40, 42, 46, 49, 53,
  99        57, 61, 66, 71, 77, 83, 90, 97, 106, 115,
 100        125, 135, 147, 161, 175, 191, 209, 228, 249, 273,
 101        300
 102};
 103
 104static const s16 LAMBDA_table[4][101] = {
 105        {       16, 16, 16, 16, 17, 17, 17, 18, 18, 18,
 106                19, 19, 19, 20, 20, 20, 21, 21, 22, 22,
 107                22, 23, 23, 24, 24, 25, 25, 25, 26, 26,
 108                27, 27, 28, 28, 29, 29, 30, 31, 31, 32,
 109                32, 33, 33, 34, 35, 35, 36, 37, 37, 38,
 110                39, 39, 40, 41, 42, 42, 43, 44, 45, 46,
 111                46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
 112                56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
 113                67, 68, 69, 70, 72, 73, 74, 76, 77, 78,
 114                80, 81, 83, 84, 86, 87, 89, 90, 92, 94,
 115                96
 116        },
 117        {
 118                20, 20, 20, 21, 21, 21, 22, 22, 23, 23,
 119                23, 24, 24, 25, 25, 26, 26, 27, 27, 28,
 120                28, 29, 29, 30, 30, 31, 31, 32, 33, 33,
 121                34, 34, 35, 36, 36, 37, 38, 38, 39, 40,
 122                40, 41, 42, 43, 43, 44, 45, 46, 47, 48,
 123                48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
 124                58, 59, 60, 61, 62, 64, 65, 66, 67, 68,
 125                70, 71, 72, 73, 75, 76, 78, 79, 80, 82,
 126                83, 85, 86, 88, 90, 91, 93, 95, 96, 98,
 127                100, 102, 103, 105, 107, 109, 111, 113, 115, 117,
 128                120
 129        },
 130        {
 131                24, 24, 24, 25, 25, 26, 26, 27, 27, 28,
 132                28, 29, 29, 30, 30, 31, 31, 32, 33, 33,
 133                34, 34, 35, 36, 36, 37, 38, 38, 39, 40,
 134                41, 41, 42, 43, 44, 44, 45, 46, 47, 48,
 135                49, 50, 50, 51, 52, 53, 54, 55, 56, 57,
 136                58, 59, 60, 62, 63, 64, 65, 66, 67, 69,
 137                70, 71, 72, 74, 75, 76, 78, 79, 81, 82,
 138                84, 85, 87, 88, 90, 92, 93, 95, 97, 98,
 139                100, 102, 104, 106, 108, 110, 112, 114, 116, 118,
 140                120, 122, 124, 127, 129, 131, 134, 136, 138, 141,
 141                144
 142        },
 143        {
 144                32, 32, 33, 33, 34, 34, 35, 36, 36, 37,
 145                38, 38, 39, 40, 41, 41, 42, 43, 44, 44,
 146                45, 46, 47, 48, 49, 50, 50, 51, 52, 53,
 147                54, 55, 56, 57, 58, 59, 60, 62, 63, 64,
 148                65, 66, 67, 69, 70, 71, 72, 74, 75, 76,
 149                78, 79, 81, 82, 84, 85, 87, 88, 90, 92,
 150                93, 95, 97, 98, 100, 102, 104, 106, 108, 110,
 151                112, 114, 116, 118, 120, 122, 124, 127, 129, 131,
 152                134, 136, 139, 141, 144, 146, 149, 152, 154, 157,
 153                160, 163, 166, 169, 172, 175, 178, 181, 185, 188,
 154                192
 155        }
 156};
 157
 158/* MPEG blank frame generation tables */
 159
 160enum mpeg_frame_type {
 161        PFRAME,
 162        BFRAME_PRE,
 163        BFRAME_POST,
 164        BFRAME_BIDIR,
 165        BFRAME_EMPTY
 166};
 167
 168static const u32 addrinctab[33][2] = {
 169        { 0x01, 1 },    { 0x03, 3 },    { 0x02, 3 },    { 0x03, 4 },
 170        { 0x02, 4 },    { 0x03, 5 },    { 0x02, 5 },    { 0x07, 7 },
 171        { 0x06, 7 },    { 0x0b, 8 },    { 0x0a, 8 },    { 0x09, 8 },
 172        { 0x08, 8 },    { 0x07, 8 },    { 0x06, 8 },    { 0x17, 10 },
 173        { 0x16, 10 },   { 0x15, 10 },   { 0x14, 10 },   { 0x13, 10 },
 174        { 0x12, 10 },   { 0x23, 11 },   { 0x22, 11 },   { 0x21, 11 },
 175        { 0x20, 11 },   { 0x1f, 11 },   { 0x1e, 11 },   { 0x1d, 11 },
 176        { 0x1c, 11 },   { 0x1b, 11 },   { 0x1a, 11 },   { 0x19, 11 },
 177        { 0x18, 11 }
 178};
 179
 180/* Standard JPEG tables */
 181
 182static const u8 default_intra_quant_table[] = {
 183         8, 16, 19, 22, 26, 27, 29, 34,
 184        16, 16, 22, 24, 27, 29, 34, 37,
 185        19, 22, 26, 27, 29, 34, 34, 38,
 186        22, 22, 26, 27, 29, 34, 37, 40,
 187        22, 26, 27, 29, 32, 35, 40, 48,
 188        26, 27, 29, 32, 35, 40, 48, 58,
 189        26, 27, 29, 34, 38, 46, 56, 69,
 190        27, 29, 35, 38, 46, 56, 69, 83
 191};
 192
 193static const u8 bits_dc_luminance[] = {
 194        0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0
 195};
 196
 197static const u8 val_dc_luminance[] = {
 198        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
 199};
 200
 201static const u8 bits_dc_chrominance[] = {
 202        0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
 203};
 204
 205static const u8 val_dc_chrominance[] = {
 206        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
 207};
 208
 209static const u8 bits_ac_luminance[] = {
 210        0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d
 211};
 212
 213static const u8 val_ac_luminance[] = {
 214        0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
 215        0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
 216        0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
 217        0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
 218        0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
 219        0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
 220        0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
 221        0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
 222        0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
 223        0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
 224        0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
 225        0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
 226        0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
 227        0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
 228        0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
 229        0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
 230        0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
 231        0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
 232        0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
 233        0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
 234        0xf9, 0xfa
 235};
 236
 237static const u8 bits_ac_chrominance[] = {
 238        0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77
 239};
 240
 241static const u8 val_ac_chrominance[] = {
 242        0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
 243        0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
 244        0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
 245        0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
 246        0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
 247        0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
 248        0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
 249        0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
 250        0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
 251        0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
 252        0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
 253        0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
 254        0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
 255        0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
 256        0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
 257        0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
 258        0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
 259        0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
 260        0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
 261        0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
 262        0xf9, 0xfa
 263};
 264
 265/* Zig-zag mapping for quant table
 266 *
 267 * OK, let's do this mapping on the actual table above so it doesn't have
 268 * to be done on the fly.
 269 */
 270static const int zz[64] = {
 271        0,   1,  8, 16,  9,  2,  3, 10, 17, 24, 32, 25, 18, 11,  4,  5,
 272        12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13,  6,  7, 14, 21, 28,
 273        35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
 274        58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63
 275};
 276
 277static int copy_packages(__le16 *dest, u16 *src, int pkg_cnt, int space)
 278{
 279        int i, cnt = pkg_cnt * 32;
 280
 281        if (space < cnt)
 282                return -1;
 283
 284        for (i = 0; i < cnt; ++i)
 285                dest[i] = cpu_to_le16p(src + i);
 286
 287        return cnt;
 288}
 289
 290static int mjpeg_frame_header(struct go7007 *go, unsigned char *buf, int q)
 291{
 292        int i, p = 0;
 293
 294        buf[p++] = 0xff;
 295        buf[p++] = 0xd8;
 296        buf[p++] = 0xff;
 297        buf[p++] = 0xdb;
 298        buf[p++] = 0;
 299        buf[p++] = 2 + 65;
 300        buf[p++] = 0;
 301        buf[p++] = default_intra_quant_table[0];
 302        for (i = 1; i < 64; ++i)
 303                /* buf[p++] = (default_intra_quant_table[i] * q) >> 3; */
 304                buf[p++] = (default_intra_quant_table[zz[i]] * q) >> 3;
 305        buf[p++] = 0xff;
 306        buf[p++] = 0xc0;
 307        buf[p++] = 0;
 308        buf[p++] = 17;
 309        buf[p++] = 8;
 310        buf[p++] = go->height >> 8;
 311        buf[p++] = go->height & 0xff;
 312        buf[p++] = go->width >> 8;
 313        buf[p++] = go->width & 0xff;
 314        buf[p++] = 3;
 315        buf[p++] = 1;
 316        buf[p++] = 0x22;
 317        buf[p++] = 0;
 318        buf[p++] = 2;
 319        buf[p++] = 0x11;
 320        buf[p++] = 0;
 321        buf[p++] = 3;
 322        buf[p++] = 0x11;
 323        buf[p++] = 0;
 324        buf[p++] = 0xff;
 325        buf[p++] = 0xc4;
 326        buf[p++] = 418 >> 8;
 327        buf[p++] = 418 & 0xff;
 328        buf[p++] = 0x00;
 329        memcpy(buf + p, bits_dc_luminance + 1, 16);
 330        p += 16;
 331        memcpy(buf + p, val_dc_luminance, sizeof(val_dc_luminance));
 332        p += sizeof(val_dc_luminance);
 333        buf[p++] = 0x01;
 334        memcpy(buf + p, bits_dc_chrominance + 1, 16);
 335        p += 16;
 336        memcpy(buf + p, val_dc_chrominance, sizeof(val_dc_chrominance));
 337        p += sizeof(val_dc_chrominance);
 338        buf[p++] = 0x10;
 339        memcpy(buf + p, bits_ac_luminance + 1, 16);
 340        p += 16;
 341        memcpy(buf + p, val_ac_luminance, sizeof(val_ac_luminance));
 342        p += sizeof(val_ac_luminance);
 343        buf[p++] = 0x11;
 344        memcpy(buf + p, bits_ac_chrominance + 1, 16);
 345        p += 16;
 346        memcpy(buf + p, val_ac_chrominance, sizeof(val_ac_chrominance));
 347        p += sizeof(val_ac_chrominance);
 348        buf[p++] = 0xff;
 349        buf[p++] = 0xda;
 350        buf[p++] = 0;
 351        buf[p++] = 12;
 352        buf[p++] = 3;
 353        buf[p++] = 1;
 354        buf[p++] = 0x00;
 355        buf[p++] = 2;
 356        buf[p++] = 0x11;
 357        buf[p++] = 3;
 358        buf[p++] = 0x11;
 359        buf[p++] = 0;
 360        buf[p++] = 63;
 361        buf[p++] = 0;
 362        return p;
 363}
 364
 365static int gen_mjpeghdr_to_package(struct go7007 *go, __le16 *code, int space)
 366{
 367        u8 *buf;
 368        u16 mem = 0x3e00;
 369        unsigned int addr = 0x19;
 370        int size = 0, i, off = 0, chunk;
 371
 372        buf = kzalloc(4096, GFP_KERNEL);
 373        if (buf == NULL)
 374                return -ENOMEM;
 375
 376        for (i = 1; i < 32; ++i) {
 377                mjpeg_frame_header(go, buf + size, i);
 378                size += 80;
 379        }
 380        chunk = mjpeg_frame_header(go, buf + size, 1);
 381        memmove(buf + size, buf + size + 80, chunk - 80);
 382        size += chunk - 80;
 383
 384        for (i = 0; i < size; i += chunk * 2) {
 385                if (space - off < 32) {
 386                        off = -1;
 387                        goto done;
 388                }
 389
 390                code[off + 1] = __cpu_to_le16(0x8000 | mem);
 391
 392                chunk = 28;
 393                if (mem + chunk > 0x4000)
 394                        chunk = 0x4000 - mem;
 395                if (i + 2 * chunk > size)
 396                        chunk = (size - i) / 2;
 397
 398                if (chunk < 28) {
 399                        code[off] = __cpu_to_le16(0x4000 | chunk);
 400                        code[off + 31] = __cpu_to_le16(addr++);
 401                        mem = 0x3e00;
 402                } else {
 403                        code[off] = __cpu_to_le16(0x1000 | 28);
 404                        code[off + 31] = 0;
 405                        mem += 28;
 406                }
 407
 408                memcpy(&code[off + 2], buf + i, chunk * 2);
 409                off += 32;
 410        }
 411done:
 412        kfree(buf);
 413        return off;
 414}
 415
 416static int mpeg1_frame_header(struct go7007 *go, unsigned char *buf,
 417                int modulo, int pict_struct, enum mpeg_frame_type frame)
 418{
 419        int i, j, mb_code, mb_len;
 420        int rows = go->interlace_coding ? go->height / 32 : go->height / 16;
 421        CODE_GEN(c, buf + 6);
 422
 423        switch (frame) {
 424        case PFRAME:
 425                mb_code = 0x1;
 426                mb_len = 3;
 427                break;
 428        case BFRAME_PRE:
 429                mb_code = 0x2;
 430                mb_len = 4;
 431                break;
 432        case BFRAME_POST:
 433                mb_code = 0x2;
 434                mb_len = 3;
 435                break;
 436        case BFRAME_BIDIR:
 437                mb_code = 0x2;
 438                mb_len = 2;
 439                break;
 440        default: /* keep the compiler happy */
 441                mb_code = mb_len = 0;
 442                break;
 443        }
 444
 445        CODE_ADD(c, frame == PFRAME ? 0x2 : 0x3, 13);
 446        CODE_ADD(c, 0xffff, 16);
 447        CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 0x7 : 0x4, 4);
 448        if (frame != PFRAME)
 449                CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 0x7 : 0x4, 4);
 450        else
 451                CODE_ADD(c, 0, 4); /* Is this supposed to be here?? */
 452        CODE_ADD(c, 0, 3); /* What is this?? */
 453        /* Byte-align with zeros */
 454        j = 8 - (CODE_LENGTH(c) % 8);
 455        if (j != 8)
 456                CODE_ADD(c, 0, j);
 457
 458        if (go->format == V4L2_PIX_FMT_MPEG2) {
 459                CODE_ADD(c, 0x1, 24);
 460                CODE_ADD(c, 0xb5, 8);
 461                CODE_ADD(c, 0x844, 12);
 462                CODE_ADD(c, frame == PFRAME ? 0xff : 0x44, 8);
 463                if (go->interlace_coding) {
 464                        CODE_ADD(c, pict_struct, 4);
 465                        if (go->dvd_mode)
 466                                CODE_ADD(c, 0x000, 11);
 467                        else
 468                                CODE_ADD(c, 0x200, 11);
 469                } else {
 470                        CODE_ADD(c, 0x3, 4);
 471                        CODE_ADD(c, 0x20c, 11);
 472                }
 473                /* Byte-align with zeros */
 474                j = 8 - (CODE_LENGTH(c) % 8);
 475                if (j != 8)
 476                        CODE_ADD(c, 0, j);
 477        }
 478
 479        for (i = 0; i < rows; ++i) {
 480                CODE_ADD(c, 1, 24);
 481                CODE_ADD(c, i + 1, 8);
 482                CODE_ADD(c, 0x2, 6);
 483                CODE_ADD(c, 0x1, 1);
 484                CODE_ADD(c, mb_code, mb_len);
 485                if (go->interlace_coding) {
 486                        CODE_ADD(c, 0x1, 2);
 487                        CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
 488                }
 489                if (frame == BFRAME_BIDIR) {
 490                        CODE_ADD(c, 0x3, 2);
 491                        if (go->interlace_coding)
 492                                CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
 493                }
 494                CODE_ADD(c, 0x3, 2);
 495                for (j = (go->width >> 4) - 2; j >= 33; j -= 33)
 496                        CODE_ADD(c, 0x8, 11);
 497                CODE_ADD(c, addrinctab[j][0], addrinctab[j][1]);
 498                CODE_ADD(c, mb_code, mb_len);
 499                if (go->interlace_coding) {
 500                        CODE_ADD(c, 0x1, 2);
 501                        CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
 502                }
 503                if (frame == BFRAME_BIDIR) {
 504                        CODE_ADD(c, 0x3, 2);
 505                        if (go->interlace_coding)
 506                                CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
 507                }
 508                CODE_ADD(c, 0x3, 2);
 509
 510                /* Byte-align with zeros */
 511                j = 8 - (CODE_LENGTH(c) % 8);
 512                if (j != 8)
 513                        CODE_ADD(c, 0, j);
 514        }
 515
 516        i = CODE_LENGTH(c) + 4 * 8;
 517        buf[2] = 0x00;
 518        buf[3] = 0x00;
 519        buf[4] = 0x01;
 520        buf[5] = 0x00;
 521        return i;
 522}
 523
 524static int mpeg1_sequence_header(struct go7007 *go, unsigned char *buf, int ext)
 525{
 526        int i, aspect_ratio, picture_rate;
 527        CODE_GEN(c, buf + 6);
 528
 529        if (go->format == V4L2_PIX_FMT_MPEG1) {
 530                switch (go->aspect_ratio) {
 531                case GO7007_RATIO_4_3:
 532                        aspect_ratio = go->standard == GO7007_STD_NTSC ? 3 : 2;
 533                        break;
 534                case GO7007_RATIO_16_9:
 535                        aspect_ratio = go->standard == GO7007_STD_NTSC ? 5 : 4;
 536                        break;
 537                default:
 538                        aspect_ratio = 1;
 539                        break;
 540                }
 541        } else {
 542                switch (go->aspect_ratio) {
 543                case GO7007_RATIO_4_3:
 544                        aspect_ratio = 2;
 545                        break;
 546                case GO7007_RATIO_16_9:
 547                        aspect_ratio = 3;
 548                        break;
 549                default:
 550                        aspect_ratio = 1;
 551                        break;
 552                }
 553        }
 554        switch (go->sensor_framerate) {
 555        case 24000:
 556                picture_rate = 1;
 557                break;
 558        case 24024:
 559                picture_rate = 2;
 560                break;
 561        case 25025:
 562                picture_rate = go->interlace_coding ? 6 : 3;
 563                break;
 564        case 30000:
 565                picture_rate = go->interlace_coding ? 7 : 4;
 566                break;
 567        case 30030:
 568                picture_rate = go->interlace_coding ? 8 : 5;
 569                break;
 570        default:
 571                picture_rate = 5; /* 30 fps seems like a reasonable default */
 572                break;
 573        }
 574
 575        CODE_ADD(c, go->width, 12);
 576        CODE_ADD(c, go->height, 12);
 577        CODE_ADD(c, aspect_ratio, 4);
 578        CODE_ADD(c, picture_rate, 4);
 579        CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 20000 : 0x3ffff, 18);
 580        CODE_ADD(c, 1, 1);
 581        CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 112 : 20, 10);
 582        CODE_ADD(c, 0, 3);
 583
 584        /* Byte-align with zeros */
 585        i = 8 - (CODE_LENGTH(c) % 8);
 586        if (i != 8)
 587                CODE_ADD(c, 0, i);
 588
 589        if (go->format == V4L2_PIX_FMT_MPEG2) {
 590                CODE_ADD(c, 0x1, 24);
 591                CODE_ADD(c, 0xb5, 8);
 592                CODE_ADD(c, 0x148, 12);
 593                if (go->interlace_coding)
 594                        CODE_ADD(c, 0x20001, 20);
 595                else
 596                        CODE_ADD(c, 0xa0001, 20);
 597                CODE_ADD(c, 0, 16);
 598
 599                /* Byte-align with zeros */
 600                i = 8 - (CODE_LENGTH(c) % 8);
 601                if (i != 8)
 602                        CODE_ADD(c, 0, i);
 603
 604                if (ext) {
 605                        CODE_ADD(c, 0x1, 24);
 606                        CODE_ADD(c, 0xb52, 12);
 607                        CODE_ADD(c, go->standard == GO7007_STD_NTSC ? 2 : 1, 3);
 608                        CODE_ADD(c, 0x105, 9);
 609                        CODE_ADD(c, 0x505, 16);
 610                        CODE_ADD(c, go->width, 14);
 611                        CODE_ADD(c, 1, 1);
 612                        CODE_ADD(c, go->height, 14);
 613
 614                        /* Byte-align with zeros */
 615                        i = 8 - (CODE_LENGTH(c) % 8);
 616                        if (i != 8)
 617                                CODE_ADD(c, 0, i);
 618                }
 619        }
 620
 621        i = CODE_LENGTH(c) + 4 * 8;
 622        buf[0] = i & 0xff;
 623        buf[1] = i >> 8;
 624        buf[2] = 0x00;
 625        buf[3] = 0x00;
 626        buf[4] = 0x01;
 627        buf[5] = 0xb3;
 628        return i;
 629}
 630
 631static int gen_mpeg1hdr_to_package(struct go7007 *go,
 632                                        __le16 *code, int space, int *framelen)
 633{
 634        u8 *buf;
 635        u16 mem = 0x3e00;
 636        unsigned int addr = 0x19;
 637        int i, off = 0, chunk;
 638
 639        buf = kzalloc(5120, GFP_KERNEL);
 640        if (buf == NULL)
 641                return -ENOMEM;
 642
 643        framelen[0] = mpeg1_frame_header(go, buf, 0, 1, PFRAME);
 644        if (go->interlace_coding)
 645                framelen[0] += mpeg1_frame_header(go, buf + framelen[0] / 8,
 646                                                        0, 2, PFRAME);
 647        buf[0] = framelen[0] & 0xff;
 648        buf[1] = framelen[0] >> 8;
 649        i = 368;
 650        framelen[1] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_PRE);
 651        if (go->interlace_coding)
 652                framelen[1] += mpeg1_frame_header(go, buf + i + framelen[1] / 8,
 653                                                        0, 2, BFRAME_PRE);
 654        buf[i] = framelen[1] & 0xff;
 655        buf[i + 1] = framelen[1] >> 8;
 656        i += 1632;
 657        framelen[2] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_POST);
 658        if (go->interlace_coding)
 659                framelen[2] += mpeg1_frame_header(go, buf + i + framelen[2] / 8,
 660                                                        0, 2, BFRAME_POST);
 661        buf[i] = framelen[2] & 0xff;
 662        buf[i + 1] = framelen[2] >> 8;
 663        i += 1432;
 664        framelen[3] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_BIDIR);
 665        if (go->interlace_coding)
 666                framelen[3] += mpeg1_frame_header(go, buf + i + framelen[3] / 8,
 667                                                        0, 2, BFRAME_BIDIR);
 668        buf[i] = framelen[3] & 0xff;
 669        buf[i + 1] = framelen[3] >> 8;
 670        i += 1632 + 16;
 671        mpeg1_sequence_header(go, buf + i, 0);
 672        i += 40;
 673        for (i = 0; i < 5120; i += chunk * 2) {
 674                if (space - off < 32) {
 675                        off = -1;
 676                        goto done;
 677                }
 678
 679                code[off + 1] = __cpu_to_le16(0x8000 | mem);
 680
 681                chunk = 28;
 682                if (mem + chunk > 0x4000)
 683                        chunk = 0x4000 - mem;
 684                if (i + 2 * chunk > 5120)
 685                        chunk = (5120 - i) / 2;
 686
 687                if (chunk < 28) {
 688                        code[off] = __cpu_to_le16(0x4000 | chunk);
 689                        code[off + 31] = __cpu_to_le16(addr);
 690                        if (mem + chunk == 0x4000) {
 691                                mem = 0x3e00;
 692                                ++addr;
 693                        }
 694                } else {
 695                        code[off] = __cpu_to_le16(0x1000 | 28);
 696                        code[off + 31] = 0;
 697                        mem += 28;
 698                }
 699
 700                memcpy(&code[off + 2], buf + i, chunk * 2);
 701                off += 32;
 702        }
 703done:
 704        kfree(buf);
 705        return off;
 706}
 707
 708static int vti_bitlen(struct go7007 *go)
 709{
 710        unsigned int i, max_time_incr = go->sensor_framerate / go->fps_scale;
 711
 712        for (i = 31; (max_time_incr & ((1 << i) - 1)) == max_time_incr; --i)
 713                ;
 714        return i + 1;
 715}
 716
 717static int mpeg4_frame_header(struct go7007 *go, unsigned char *buf,
 718                int modulo, enum mpeg_frame_type frame)
 719{
 720        int i;
 721        CODE_GEN(c, buf + 6);
 722        int mb_count = (go->width >> 4) * (go->height >> 4);
 723
 724        CODE_ADD(c, frame == PFRAME ? 0x1 : 0x2, 2);
 725        if (modulo)
 726                CODE_ADD(c, 0x1, 1);
 727        CODE_ADD(c, 0x1, 2);
 728        CODE_ADD(c, 0, vti_bitlen(go));
 729        CODE_ADD(c, 0x3, 2);
 730        if (frame == PFRAME)
 731                CODE_ADD(c, 0, 1);
 732        CODE_ADD(c, 0xc, 11);
 733        if (frame != PFRAME)
 734                CODE_ADD(c, 0x4, 3);
 735        if (frame != BFRAME_EMPTY) {
 736                for (i = 0; i < mb_count; ++i) {
 737                        switch (frame) {
 738                        case PFRAME:
 739                                CODE_ADD(c, 0x1, 1);
 740                                break;
 741                        case BFRAME_PRE:
 742                                CODE_ADD(c, 0x47, 8);
 743                                break;
 744                        case BFRAME_POST:
 745                                CODE_ADD(c, 0x27, 7);
 746                                break;
 747                        case BFRAME_BIDIR:
 748                                CODE_ADD(c, 0x5f, 8);
 749                                break;
 750                        case BFRAME_EMPTY: /* keep compiler quiet */
 751                                break;
 752                        }
 753                }
 754        }
 755
 756        /* Byte-align with a zero followed by ones */
 757        i = 8 - (CODE_LENGTH(c) % 8);
 758        CODE_ADD(c, 0, 1);
 759        CODE_ADD(c, (1 << (i - 1)) - 1, i - 1);
 760
 761        i = CODE_LENGTH(c) + 4 * 8;
 762        buf[0] = i & 0xff;
 763        buf[1] = i >> 8;
 764        buf[2] = 0x00;
 765        buf[3] = 0x00;
 766        buf[4] = 0x01;
 767        buf[5] = 0xb6;
 768        return i;
 769}
 770
 771static int mpeg4_sequence_header(struct go7007 *go, unsigned char *buf, int ext)
 772{
 773        const unsigned char head[] = { 0x00, 0x00, 0x01, 0xb0, go->pali,
 774                0x00, 0x00, 0x01, 0xb5, 0x09,
 775                0x00, 0x00, 0x01, 0x00,
 776                0x00, 0x00, 0x01, 0x20, };
 777        int i, aspect_ratio;
 778        int fps = go->sensor_framerate / go->fps_scale;
 779        CODE_GEN(c, buf + 2 + sizeof(head));
 780
 781        switch (go->aspect_ratio) {
 782        case GO7007_RATIO_4_3:
 783                aspect_ratio = go->standard == GO7007_STD_NTSC ? 3 : 2;
 784                break;
 785        case GO7007_RATIO_16_9:
 786                aspect_ratio = go->standard == GO7007_STD_NTSC ? 5 : 4;
 787                break;
 788        default:
 789                aspect_ratio = 1;
 790                break;
 791        }
 792
 793        memcpy(buf + 2, head, sizeof(head));
 794        CODE_ADD(c, 0x191, 17);
 795        CODE_ADD(c, aspect_ratio, 4);
 796        CODE_ADD(c, 0x1, 4);
 797        CODE_ADD(c, fps, 16);
 798        CODE_ADD(c, 0x3, 2);
 799        CODE_ADD(c, 1001, vti_bitlen(go));
 800        CODE_ADD(c, 1, 1);
 801        CODE_ADD(c, go->width, 13);
 802        CODE_ADD(c, 1, 1);
 803        CODE_ADD(c, go->height, 13);
 804        CODE_ADD(c, 0x2830, 14);
 805
 806        /* Byte-align */
 807        i = 8 - (CODE_LENGTH(c) % 8);
 808        CODE_ADD(c, 0, 1);
 809        CODE_ADD(c, (1 << (i - 1)) - 1, i - 1);
 810
 811        i = CODE_LENGTH(c) + sizeof(head) * 8;
 812        buf[0] = i & 0xff;
 813        buf[1] = i >> 8;
 814        return i;
 815}
 816
 817static int gen_mpeg4hdr_to_package(struct go7007 *go,
 818                                        __le16 *code, int space, int *framelen)
 819{
 820        u8 *buf;
 821        u16 mem = 0x3e00;
 822        unsigned int addr = 0x19;
 823        int i, off = 0, chunk;
 824
 825        buf = kzalloc(5120, GFP_KERNEL);
 826        if (buf == NULL)
 827                return -ENOMEM;
 828
 829        framelen[0] = mpeg4_frame_header(go, buf, 0, PFRAME);
 830        i = 368;
 831        framelen[1] = mpeg4_frame_header(go, buf + i, 0, BFRAME_PRE);
 832        i += 1632;
 833        framelen[2] = mpeg4_frame_header(go, buf + i, 0, BFRAME_POST);
 834        i += 1432;
 835        framelen[3] = mpeg4_frame_header(go, buf + i, 0, BFRAME_BIDIR);
 836        i += 1632;
 837        mpeg4_frame_header(go, buf + i, 0, BFRAME_EMPTY);
 838        i += 16;
 839        mpeg4_sequence_header(go, buf + i, 0);
 840        i += 40;
 841        for (i = 0; i < 5120; i += chunk * 2) {
 842                if (space - off < 32) {
 843                        off = -1;
 844                        goto done;
 845                }
 846
 847                code[off + 1] = __cpu_to_le16(0x8000 | mem);
 848
 849                chunk = 28;
 850                if (mem + chunk > 0x4000)
 851                        chunk = 0x4000 - mem;
 852                if (i + 2 * chunk > 5120)
 853                        chunk = (5120 - i) / 2;
 854
 855                if (chunk < 28) {
 856                        code[off] = __cpu_to_le16(0x4000 | chunk);
 857                        code[off + 31] = __cpu_to_le16(addr);
 858                        if (mem + chunk == 0x4000) {
 859                                mem = 0x3e00;
 860                                ++addr;
 861                        }
 862                } else {
 863                        code[off] = __cpu_to_le16(0x1000 | 28);
 864                        code[off + 31] = 0;
 865                        mem += 28;
 866                }
 867
 868                memcpy(&code[off + 2], buf + i, chunk * 2);
 869                off += 32;
 870        }
 871        mem = 0x3e00;
 872        addr = go->ipb ? 0x14f9 : 0x0af9;
 873        memset(buf, 0, 5120);
 874        framelen[4] = mpeg4_frame_header(go, buf, 1, PFRAME);
 875        i = 368;
 876        framelen[5] = mpeg4_frame_header(go, buf + i, 1, BFRAME_PRE);
 877        i += 1632;
 878        framelen[6] = mpeg4_frame_header(go, buf + i, 1, BFRAME_POST);
 879        i += 1432;
 880        framelen[7] = mpeg4_frame_header(go, buf + i, 1, BFRAME_BIDIR);
 881        i += 1632;
 882        mpeg4_frame_header(go, buf + i, 1, BFRAME_EMPTY);
 883        i += 16;
 884        for (i = 0; i < 5120; i += chunk * 2) {
 885                if (space - off < 32) {
 886                        off = -1;
 887                        goto done;
 888                }
 889
 890                code[off + 1] = __cpu_to_le16(0x8000 | mem);
 891
 892                chunk = 28;
 893                if (mem + chunk > 0x4000)
 894                        chunk = 0x4000 - mem;
 895                if (i + 2 * chunk > 5120)
 896                        chunk = (5120 - i) / 2;
 897
 898                if (chunk < 28) {
 899                        code[off] = __cpu_to_le16(0x4000 | chunk);
 900                        code[off + 31] = __cpu_to_le16(addr);
 901                        if (mem + chunk == 0x4000) {
 902                                mem = 0x3e00;
 903                                ++addr;
 904                        }
 905                } else {
 906                        code[off] = __cpu_to_le16(0x1000 | 28);
 907                        code[off + 31] = 0;
 908                        mem += 28;
 909                }
 910
 911                memcpy(&code[off + 2], buf + i, chunk * 2);
 912                off += 32;
 913        }
 914done:
 915        kfree(buf);
 916        return off;
 917}
 918
 919static int brctrl_to_package(struct go7007 *go,
 920                                        __le16 *code, int space, int *framelen)
 921{
 922        int converge_speed = 0;
 923        int lambda = (go->format == V4L2_PIX_FMT_MJPEG || go->dvd_mode) ?
 924                                100 : 0;
 925        int peak_rate = 6 * go->bitrate / 5;
 926        int vbv_buffer = go->format == V4L2_PIX_FMT_MJPEG ?
 927                                go->bitrate :
 928                                (go->dvd_mode ? 900000 : peak_rate);
 929        int fps = go->sensor_framerate / go->fps_scale;
 930        int q = 0;
 931        /* Bizarre math below depends on rounding errors in division */
 932        u32 sgop_expt_addr = go->bitrate / 32 * (go->ipb ? 3 : 1) * 1001 / fps;
 933        u32 sgop_peak_addr = peak_rate / 32 * 1001 / fps;
 934        u32 total_expt_addr = go->bitrate / 32 * 1000 / fps * (fps / 1000);
 935        u32 vbv_alert_addr = vbv_buffer * 3 / (4 * 32);
 936        u32 cplx[] = {
 937                q > 0 ? sgop_expt_addr * q :
 938                        2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
 939                q > 0 ? sgop_expt_addr * q :
 940                        2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
 941                q > 0 ? sgop_expt_addr * q :
 942                        2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
 943                q > 0 ? sgop_expt_addr * q :
 944                        2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
 945        };
 946        u32 calc_q = q > 0 ? q : cplx[0] / sgop_expt_addr;
 947        u16 pack[] = {
 948                0x200e,         0x0000,
 949                0xBF20,         go->ipb ? converge_speed_ipb[converge_speed]
 950                                        : converge_speed_ip[converge_speed],
 951                0xBF21,         go->ipb ? 2 : 0,
 952                0xBF22,         go->ipb ? LAMBDA_table[0][lambda / 2 + 50]
 953                                        : 32767,
 954                0xBF23,         go->ipb ? LAMBDA_table[1][lambda] : 32767,
 955                0xBF24,         32767,
 956                0xBF25,         lambda > 99 ? 32767 : LAMBDA_table[3][lambda],
 957                0xBF26,         sgop_expt_addr & 0x0000FFFF,
 958                0xBF27,         sgop_expt_addr >> 16,
 959                0xBF28,         sgop_peak_addr & 0x0000FFFF,
 960                0xBF29,         sgop_peak_addr >> 16,
 961                0xBF2A,         vbv_alert_addr & 0x0000FFFF,
 962                0xBF2B,         vbv_alert_addr >> 16,
 963                0xBF2C,         0,
 964                0xBF2D,         0,
 965                0,              0,
 966
 967                0x200e,         0x0000,
 968                0xBF2E,         vbv_alert_addr & 0x0000FFFF,
 969                0xBF2F,         vbv_alert_addr >> 16,
 970                0xBF30,         cplx[0] & 0x0000FFFF,
 971                0xBF31,         cplx[0] >> 16,
 972                0xBF32,         cplx[1] & 0x0000FFFF,
 973                0xBF33,         cplx[1] >> 16,
 974                0xBF34,         cplx[2] & 0x0000FFFF,
 975                0xBF35,         cplx[2] >> 16,
 976                0xBF36,         cplx[3] & 0x0000FFFF,
 977                0xBF37,         cplx[3] >> 16,
 978                0xBF38,         0,
 979                0xBF39,         0,
 980                0xBF3A,         total_expt_addr & 0x0000FFFF,
 981                0xBF3B,         total_expt_addr >> 16,
 982                0,              0,
 983
 984                0x200e,         0x0000,
 985                0xBF3C,         total_expt_addr & 0x0000FFFF,
 986                0xBF3D,         total_expt_addr >> 16,
 987                0xBF3E,         0,
 988                0xBF3F,         0,
 989                0xBF48,         0,
 990                0xBF49,         0,
 991                0xBF4A,         calc_q < 4 ? 4 : (calc_q > 124 ? 124 : calc_q),
 992                0xBF4B,         4,
 993                0xBF4C,         0,
 994                0xBF4D,         0,
 995                0xBF4E,         0,
 996                0xBF4F,         0,
 997                0xBF50,         0,
 998                0xBF51,         0,
 999                0,              0,
1000
1001                0x200e,         0x0000,
1002                0xBF40,         sgop_expt_addr & 0x0000FFFF,
1003                0xBF41,         sgop_expt_addr >> 16,
1004                0xBF42,         0,
1005                0xBF43,         0,
1006                0xBF44,         0,
1007                0xBF45,         0,
1008                0xBF46,         (go->width >> 4) * (go->height >> 4),
1009                0xBF47,         0,
1010                0xBF64,         0,
1011                0xBF65,         0,
1012                0xBF18,         framelen[4],
1013                0xBF19,         framelen[5],
1014                0xBF1A,         framelen[6],
1015                0xBF1B,         framelen[7],
1016                0,              0,
1017
1018#if 0
1019                /* Remove once we don't care about matching */
1020                0x200e,         0x0000,
1021                0xBF56,         4,
1022                0xBF57,         0,
1023                0xBF58,         5,
1024                0xBF59,         0,
1025                0xBF5A,         6,
1026                0xBF5B,         0,
1027                0xBF5C,         8,
1028                0xBF5D,         0,
1029                0xBF5E,         1,
1030                0xBF5F,         0,
1031                0xBF60,         1,
1032                0xBF61,         0,
1033                0xBF62,         0,
1034                0xBF63,         0,
1035                0,              0,
1036#else
1037                0x2008,         0x0000,
1038                0xBF56,         4,
1039                0xBF57,         0,
1040                0xBF58,         5,
1041                0xBF59,         0,
1042                0xBF5A,         6,
1043                0xBF5B,         0,
1044                0xBF5C,         8,
1045                0xBF5D,         0,
1046                0,              0,
1047                0,              0,
1048                0,              0,
1049                0,              0,
1050                0,              0,
1051                0,              0,
1052                0,              0,
1053#endif
1054
1055                0x200e,         0x0000,
1056                0xBF10,         0,
1057                0xBF11,         0,
1058                0xBF12,         0,
1059                0xBF13,         0,
1060                0xBF14,         0,
1061                0xBF15,         0,
1062                0xBF16,         0,
1063                0xBF17,         0,
1064                0xBF7E,         0,
1065                0xBF7F,         1,
1066                0xBF52,         framelen[0],
1067                0xBF53,         framelen[1],
1068                0xBF54,         framelen[2],
1069                0xBF55,         framelen[3],
1070                0,              0,
1071        };
1072
1073        return copy_packages(code, pack, 6, space);
1074}
1075
1076static int config_package(struct go7007 *go, __le16 *code, int space)
1077{
1078        int fps = go->sensor_framerate / go->fps_scale / 1000;
1079        int rows = go->interlace_coding ? go->height / 32 : go->height / 16;
1080        int brc_window_size = fps;
1081        int q_min = 2, q_max = 31;
1082        int THACCoeffSet0 = 0;
1083        u16 pack[] = {
1084                0x200e,         0x0000,
1085                0xc002,         0x14b4,
1086                0xc003,         0x28b4,
1087                0xc004,         0x3c5a,
1088                0xdc05,         0x2a77,
1089                0xc6c3,         go->format == V4L2_PIX_FMT_MPEG4 ? 0 :
1090                                (go->format == V4L2_PIX_FMT_H263 ? 0 : 1),
1091                0xc680,         go->format == V4L2_PIX_FMT_MPEG4 ? 0xf1 :
1092                                (go->format == V4L2_PIX_FMT_H263 ? 0x61 :
1093                                                                        0xd3),
1094                0xc780,         0x0140,
1095                0xe009,         0x0001,
1096                0xc60f,         0x0008,
1097                0xd4ff,         0x0002,
1098                0xe403,         2340,
1099                0xe406,         75,
1100                0xd411,         0x0001,
1101                0xd410,         0xa1d6,
1102                0x0001,         0x2801,
1103
1104                0x200d,         0x0000,
1105                0xe402,         0x018b,
1106                0xe401,         0x8b01,
1107                0xd472,         (go->board_info->sensor_flags &
1108                                                        GO7007_SENSOR_TV) &&
1109                                                (!go->interlace_coding) ?
1110                                        0x01b0 : 0x0170,
1111                0xd475,         (go->board_info->sensor_flags &
1112                                                        GO7007_SENSOR_TV) &&
1113                                                (!go->interlace_coding) ?
1114                                        0x0008 : 0x0009,
1115                0xc404,         go->interlace_coding ? 0x44 :
1116                                (go->format == V4L2_PIX_FMT_MPEG4 ? 0x11 :
1117                                (go->format == V4L2_PIX_FMT_MPEG1 ? 0x02 :
1118                                (go->format == V4L2_PIX_FMT_MPEG2 ? 0x04 :
1119                                (go->format == V4L2_PIX_FMT_H263  ? 0x08 :
1120                                                                     0x20)))),
1121                0xbf0a,         (go->format == V4L2_PIX_FMT_MPEG4 ? 8 :
1122                                (go->format == V4L2_PIX_FMT_MPEG1 ? 1 :
1123                                (go->format == V4L2_PIX_FMT_MPEG2 ? 2 :
1124                                (go->format == V4L2_PIX_FMT_H263 ? 4 : 16)))) |
1125                                ((go->repeat_seqhead ? 1 : 0) << 6) |
1126                                ((go->dvd_mode ? 1 : 0) << 9) |
1127                                ((go->gop_header_enable ? 1 : 0) << 10),
1128                0xbf0b,         0,
1129                0xdd5a,         go->ipb ? 0x14 : 0x0a,
1130                0xbf0c,         0,
1131                0xbf0d,         0,
1132                0xc683,         THACCoeffSet0,
1133                0xc40a,         (go->width << 4) | rows,
1134                0xe01a,         go->board_info->hpi_buffer_cap,
1135                0,              0,
1136                0,              0,
1137
1138                0x2008,         0,
1139                0xe402,         0x88,
1140                0xe401,         0x8f01,
1141                0xbf6a,         0,
1142                0xbf6b,         0,
1143                0xbf6c,         0,
1144                0xbf6d,         0,
1145                0xbf6e,         0,
1146                0xbf6f,         0,
1147                0,              0,
1148                0,              0,
1149                0,              0,
1150                0,              0,
1151                0,              0,
1152                0,              0,
1153                0,              0,
1154
1155                0x200e,         0,
1156                0xbf66,         brc_window_size,
1157                0xbf67,         0,
1158                0xbf68,         q_min,
1159                0xbf69,         q_max,
1160                0xbfe0,         0,
1161                0xbfe1,         0,
1162                0xbfe2,         0,
1163                0xbfe3,         go->ipb ? 3 : 1,
1164                0xc031,         go->board_info->sensor_flags &
1165                                        GO7007_SENSOR_VBI ? 1 : 0,
1166                0xc01c,         0x1f,
1167                0xdd8c,         0x15,
1168                0xdd94,         0x15,
1169                0xdd88,         go->ipb ? 0x1401 : 0x0a01,
1170                0xdd90,         go->ipb ? 0x1401 : 0x0a01,
1171                0,              0,
1172
1173                0x200e,         0,
1174                0xbfe4,         0,
1175                0xbfe5,         0,
1176                0xbfe6,         0,
1177                0xbfe7,         fps << 8,
1178                0xbfe8,         0x3a00,
1179                0xbfe9,         0,
1180                0xbfea,         0,
1181                0xbfeb,         0,
1182                0xbfec,         (go->interlace_coding ? 1 << 15 : 0) |
1183                                        (go->modet_enable ? 0xa : 0) |
1184                                        (go->board_info->sensor_flags &
1185                                                GO7007_SENSOR_VBI ? 1 : 0),
1186                0xbfed,         0,
1187                0xbfee,         0,
1188                0xbfef,         0,
1189                0xbff0,         go->board_info->sensor_flags &
1190                                        GO7007_SENSOR_TV ? 0xf060 : 0xb060,
1191                0xbff1,         0,
1192                0,              0,
1193        };
1194
1195        return copy_packages(code, pack, 5, space);
1196}
1197
1198static int seqhead_to_package(struct go7007 *go, __le16 *code, int space,
1199        int (*sequence_header_func)(struct go7007 *go,
1200                unsigned char *buf, int ext))
1201{
1202        int vop_time_increment_bitlength = vti_bitlen(go);
1203        int fps = go->sensor_framerate / go->fps_scale *
1204                                        (go->interlace_coding ? 2 : 1);
1205        unsigned char buf[40] = { };
1206        int len = sequence_header_func(go, buf, 1);
1207        u16 pack[] = {
1208                0x2006,         0,
1209                0xbf08,         fps,
1210                0xbf09,         0,
1211                0xbff2,         vop_time_increment_bitlength,
1212                0xbff3,         (1 << vop_time_increment_bitlength) - 1,
1213                0xbfe6,         0,
1214                0xbfe7,         (fps / 1000) << 8,
1215                0,              0,
1216                0,              0,
1217                0,              0,
1218                0,              0,
1219                0,              0,
1220                0,              0,
1221                0,              0,
1222                0,              0,
1223                0,              0,
1224
1225                0x2007,         0,
1226                0xc800,         buf[2] << 8 | buf[3],
1227                0xc801,         buf[4] << 8 | buf[5],
1228                0xc802,         buf[6] << 8 | buf[7],
1229                0xc803,         buf[8] << 8 | buf[9],
1230                0xc406,         64,
1231                0xc407,         len - 64,
1232                0xc61b,         1,
1233                0,              0,
1234                0,              0,
1235                0,              0,
1236                0,              0,
1237                0,              0,
1238                0,              0,
1239                0,              0,
1240                0,              0,
1241
1242                0x200e,         0,
1243                0xc808,         buf[10] << 8 | buf[11],
1244                0xc809,         buf[12] << 8 | buf[13],
1245                0xc80a,         buf[14] << 8 | buf[15],
1246                0xc80b,         buf[16] << 8 | buf[17],
1247                0xc80c,         buf[18] << 8 | buf[19],
1248                0xc80d,         buf[20] << 8 | buf[21],
1249                0xc80e,         buf[22] << 8 | buf[23],
1250                0xc80f,         buf[24] << 8 | buf[25],
1251                0xc810,         buf[26] << 8 | buf[27],
1252                0xc811,         buf[28] << 8 | buf[29],
1253                0xc812,         buf[30] << 8 | buf[31],
1254                0xc813,         buf[32] << 8 | buf[33],
1255                0xc814,         buf[34] << 8 | buf[35],
1256                0xc815,         buf[36] << 8 | buf[37],
1257                0,              0,
1258                0,              0,
1259                0,              0,
1260        };
1261
1262        return copy_packages(code, pack, 3, space);
1263}
1264
1265static int relative_prime(int big, int little)
1266{
1267        int remainder;
1268
1269        while (little != 0) {
1270                remainder = big % little;
1271                big = little;
1272                little = remainder;
1273        }
1274        return big;
1275}
1276
1277static int avsync_to_package(struct go7007 *go, __le16 *code, int space)
1278{
1279        int arate = go->board_info->audio_rate * 1001 * go->fps_scale;
1280        int ratio = arate / go->sensor_framerate;
1281        int adjratio = ratio * 215 / 100;
1282        int rprime = relative_prime(go->sensor_framerate,
1283                                        arate % go->sensor_framerate);
1284        int f1 = (arate % go->sensor_framerate) / rprime;
1285        int f2 = (go->sensor_framerate - arate % go->sensor_framerate) / rprime;
1286        u16 pack[] = {
1287                0x200e,         0,
1288                0xbf98,         (u16)((-adjratio) & 0xffff),
1289                0xbf99,         (u16)((-adjratio) >> 16),
1290                0xbf92,         0,
1291                0xbf93,         0,
1292                0xbff4,         f1 > f2 ? f1 : f2,
1293                0xbff5,         f1 < f2 ? f1 : f2,
1294                0xbff6,         f1 < f2 ? ratio : ratio + 1,
1295                0xbff7,         f1 > f2 ? ratio : ratio + 1,
1296                0xbff8,         0,
1297                0xbff9,         0,
1298                0xbffa,         adjratio & 0xffff,
1299                0xbffb,         adjratio >> 16,
1300                0xbf94,         0,
1301                0xbf95,         0,
1302                0,              0,
1303        };
1304
1305        return copy_packages(code, pack, 1, space);
1306}
1307
1308static int final_package(struct go7007 *go, __le16 *code, int space)
1309{
1310        int rows = go->interlace_coding ? go->height / 32 : go->height / 16;
1311        u16 pack[] = {
1312                0x8000,
1313                0,
1314                0,
1315                0,
1316                0,
1317                0,
1318                0,
1319                2,
1320                ((go->board_info->sensor_flags & GO7007_SENSOR_TV) &&
1321                                                (!go->interlace_coding) ?
1322                                        (1 << 14) | (1 << 9) : 0) |
1323                        ((go->encoder_subsample ? 1 : 0) << 8) |
1324                        (go->board_info->sensor_flags &
1325                                GO7007_SENSOR_CONFIG_MASK),
1326                ((go->encoder_v_halve ? 1 : 0) << 14) |
1327                        (go->encoder_v_halve ? rows << 9 : rows << 8) |
1328                        (go->encoder_h_halve ? 1 << 6 : 0) |
1329                        (go->encoder_h_halve ? go->width >> 3 : go->width >> 4),
1330                (1 << 15) | (go->encoder_v_offset << 6) |
1331                        (1 << 7) | (go->encoder_h_offset >> 2),
1332                (1 << 6),
1333                0,
1334                0,
1335                ((go->fps_scale - 1) << 8) |
1336                        (go->board_info->sensor_flags & GO7007_SENSOR_TV ?
1337                                                (1 << 7) : 0) |
1338                        0x41,
1339                go->ipb ? 0xd4c : 0x36b,
1340                (rows << 8) | (go->width >> 4),
1341                go->format == V4L2_PIX_FMT_MPEG4 ? 0x0404 : 0,
1342                (1 << 15) | ((go->interlace_coding ? 1 : 0) << 13) |
1343                        ((go->closed_gop ? 1 : 0) << 12) |
1344                        ((go->format == V4L2_PIX_FMT_MPEG4 ? 1 : 0) << 11) |
1345                /*      (1 << 9) |   */
1346                        ((go->ipb ? 3 : 0) << 7) |
1347                        ((go->modet_enable ? 1 : 0) << 2) |
1348                        ((go->dvd_mode ? 1 : 0) << 1) | 1,
1349                (go->format == V4L2_PIX_FMT_MPEG1 ? 0x89a0 :
1350                        (go->format == V4L2_PIX_FMT_MPEG2 ? 0x89a0 :
1351                        (go->format == V4L2_PIX_FMT_MJPEG ? 0x89a0 :
1352                        (go->format == V4L2_PIX_FMT_MPEG4 ? 0x8920 :
1353                        (go->format == V4L2_PIX_FMT_H263 ? 0x8920 : 0))))),
1354                go->ipb ? 0x1f15 : 0x1f0b,
1355                go->ipb ? 0x0015 : 0x000b,
1356                go->ipb ? 0xa800 : 0x5800,
1357                0xffff,
1358                0x0020 + 0x034b * 0,
1359                0x0020 + 0x034b * 1,
1360                0x0020 + 0x034b * 2,
1361                0x0020 + 0x034b * 3,
1362                0x0020 + 0x034b * 4,
1363                0x0020 + 0x034b * 5,
1364                go->ipb ? (go->gop_size / 3) : go->gop_size,
1365                (go->height >> 4) * (go->width >> 4) * 110 / 100,
1366        };
1367
1368        return copy_packages(code, pack, 1, space);
1369}
1370
1371static int audio_to_package(struct go7007 *go, __le16 *code, int space)
1372{
1373        int clock_config = ((go->board_info->audio_flags &
1374                                GO7007_AUDIO_I2S_MASTER ? 1 : 0) << 11) |
1375                        ((go->board_info->audio_flags &
1376                                GO7007_AUDIO_OKI_MODE ? 1 : 0) << 8) |
1377                        (((go->board_info->audio_bclk_div / 4) - 1) << 4) |
1378                        (go->board_info->audio_main_div - 1);
1379        u16 pack[] = {
1380                0x200d,         0,
1381                0x9002,         0,
1382                0x9002,         0,
1383                0x9031,         0,
1384                0x9032,         0,
1385                0x9033,         0,
1386                0x9034,         0,
1387                0x9035,         0,
1388                0x9036,         0,
1389                0x9037,         0,
1390                0x9040,         0,
1391                0x9000,         clock_config,
1392                0x9001,         (go->board_info->audio_flags & 0xffff) |
1393                                        (1 << 9),
1394                0x9000,         ((go->board_info->audio_flags &
1395                                                GO7007_AUDIO_I2S_MASTER ?
1396                                                1 : 0) << 10) |
1397                                        clock_config,
1398                0,              0,
1399                0,              0,
1400                0x2005,         0,
1401                0x9041,         0,
1402                0x9042,         256,
1403                0x9043,         0,
1404                0x9044,         16,
1405                0x9045,         16,
1406                0,              0,
1407                0,              0,
1408                0,              0,
1409                0,              0,
1410                0,              0,
1411                0,              0,
1412                0,              0,
1413                0,              0,
1414                0,              0,
1415                0,              0,
1416        };
1417
1418        return copy_packages(code, pack, 2, space);
1419}
1420
1421static int modet_to_package(struct go7007 *go, __le16 *code, int space)
1422{
1423        bool has_modet0 = go->modet[0].enable;
1424        bool has_modet1 = go->modet[1].enable;
1425        bool has_modet2 = go->modet[2].enable;
1426        bool has_modet3 = go->modet[3].enable;
1427        int ret, mb, i, addr, cnt = 0;
1428        u16 pack[32];
1429        u16 thresholds[] = {
1430                0x200e,         0,
1431                0xbf82,         has_modet0 ? go->modet[0].pixel_threshold : 32767,
1432                0xbf83,         has_modet1 ? go->modet[1].pixel_threshold : 32767,
1433                0xbf84,         has_modet2 ? go->modet[2].pixel_threshold : 32767,
1434                0xbf85,         has_modet3 ? go->modet[3].pixel_threshold : 32767,
1435                0xbf86,         has_modet0 ? go->modet[0].motion_threshold : 32767,
1436                0xbf87,         has_modet1 ? go->modet[1].motion_threshold : 32767,
1437                0xbf88,         has_modet2 ? go->modet[2].motion_threshold : 32767,
1438                0xbf89,         has_modet3 ? go->modet[3].motion_threshold : 32767,
1439                0xbf8a,         has_modet0 ? go->modet[0].mb_threshold : 32767,
1440                0xbf8b,         has_modet1 ? go->modet[1].mb_threshold : 32767,
1441                0xbf8c,         has_modet2 ? go->modet[2].mb_threshold : 32767,
1442                0xbf8d,         has_modet3 ? go->modet[3].mb_threshold : 32767,
1443                0xbf8e,         0,
1444                0xbf8f,         0,
1445                0,              0,
1446        };
1447
1448        ret = copy_packages(code, thresholds, 1, space);
1449        if (ret < 0)
1450                return -1;
1451        cnt += ret;
1452
1453        addr = 0xbac0;
1454        memset(pack, 0, 64);
1455        i = 0;
1456        for (mb = 0; mb < 1624; ++mb) {
1457                pack[i * 2 + 3] <<= 2;
1458                pack[i * 2 + 3] |= go->modet_map[mb];
1459                if (mb % 8 != 7)
1460                        continue;
1461                pack[i * 2 + 2] = addr++;
1462                ++i;
1463                if (i == 10 || mb == 1623) {
1464                        pack[0] = 0x2000 | i;
1465                        ret = copy_packages(code + cnt, pack, 1, space - cnt);
1466                        if (ret < 0)
1467                                return -1;
1468                        cnt += ret;
1469                        i = 0;
1470                        memset(pack, 0, 64);
1471                }
1472                pack[i * 2 + 3] = 0;
1473        }
1474
1475        memset(pack, 0, 64);
1476        i = 0;
1477        for (addr = 0xbb90; addr < 0xbbfa; ++addr) {
1478                pack[i * 2 + 2] = addr;
1479                pack[i * 2 + 3] = 0;
1480                ++i;
1481                if (i == 10 || addr == 0xbbf9) {
1482                        pack[0] = 0x2000 | i;
1483                        ret = copy_packages(code + cnt, pack, 1, space - cnt);
1484                        if (ret < 0)
1485                                return -1;
1486                        cnt += ret;
1487                        i = 0;
1488                        memset(pack, 0, 64);
1489                }
1490        }
1491        return cnt;
1492}
1493
1494static noinline_for_stack int do_special(struct go7007 *go, u16 type,
1495                                         __le16 *code, int space, int *framelen)
1496{
1497        switch (type) {
1498        case SPECIAL_FRM_HEAD:
1499                switch (go->format) {
1500                case V4L2_PIX_FMT_MJPEG:
1501                        return gen_mjpeghdr_to_package(go, code, space);
1502                case V4L2_PIX_FMT_MPEG1:
1503                case V4L2_PIX_FMT_MPEG2:
1504                        return gen_mpeg1hdr_to_package(go, code, space,
1505                                                                framelen);
1506                case V4L2_PIX_FMT_MPEG4:
1507                        return gen_mpeg4hdr_to_package(go, code, space,
1508                                                                framelen);
1509                default:
1510                        break;
1511                }
1512                break;
1513        case SPECIAL_BRC_CTRL:
1514                return brctrl_to_package(go, code, space, framelen);
1515        case SPECIAL_CONFIG:
1516                return config_package(go, code, space);
1517        case SPECIAL_SEQHEAD:
1518                switch (go->format) {
1519                case V4L2_PIX_FMT_MPEG1:
1520                case V4L2_PIX_FMT_MPEG2:
1521                        return seqhead_to_package(go, code, space,
1522                                        mpeg1_sequence_header);
1523                case V4L2_PIX_FMT_MPEG4:
1524                        return seqhead_to_package(go, code, space,
1525                                        mpeg4_sequence_header);
1526                default:
1527                        return 0;
1528                }
1529        case SPECIAL_AV_SYNC:
1530                return avsync_to_package(go, code, space);
1531        case SPECIAL_FINAL:
1532                return final_package(go, code, space);
1533        case SPECIAL_AUDIO:
1534                return audio_to_package(go, code, space);
1535        case SPECIAL_MODET:
1536                return modet_to_package(go, code, space);
1537        }
1538        dev_err(go->dev,
1539                "firmware file contains unsupported feature %04x\n", type);
1540        return -1;
1541}
1542
1543int go7007_construct_fw_image(struct go7007 *go, u8 **fw, int *fwlen)
1544{
1545        const struct firmware *fw_entry;
1546        __le16 *code, *src;
1547        int framelen[8] = { }; /* holds the lengths of empty frame templates */
1548        int codespace = 64 * 1024, i = 0, srclen, chunk_len, chunk_flags;
1549        int mode_flag;
1550        int ret;
1551
1552        switch (go->format) {
1553        case V4L2_PIX_FMT_MJPEG:
1554                mode_flag = FLAG_MODE_MJPEG;
1555                break;
1556        case V4L2_PIX_FMT_MPEG1:
1557                mode_flag = FLAG_MODE_MPEG1;
1558                break;
1559        case V4L2_PIX_FMT_MPEG2:
1560                mode_flag = FLAG_MODE_MPEG2;
1561                break;
1562        case V4L2_PIX_FMT_MPEG4:
1563                mode_flag = FLAG_MODE_MPEG4;
1564                break;
1565        default:
1566                return -1;
1567        }
1568        if (request_firmware(&fw_entry, GO7007_FW_NAME, go->dev)) {
1569                dev_err(go->dev,
1570                        "unable to load firmware from file \"%s\"\n",
1571                        GO7007_FW_NAME);
1572                return -1;
1573        }
1574        code = kcalloc(codespace, 2, GFP_KERNEL);
1575        if (code == NULL)
1576                goto fw_failed;
1577
1578        src = (__le16 *)fw_entry->data;
1579        srclen = fw_entry->size / 2;
1580        while (srclen >= 2) {
1581                chunk_flags = __le16_to_cpu(src[0]);
1582                chunk_len = __le16_to_cpu(src[1]);
1583                if (chunk_len + 2 > srclen) {
1584                        dev_err(go->dev,
1585                                "firmware file \"%s\" appears to be corrupted\n",
1586                                GO7007_FW_NAME);
1587                        goto fw_failed;
1588                }
1589                if (chunk_flags & mode_flag) {
1590                        if (chunk_flags & FLAG_SPECIAL) {
1591                                ret = do_special(go, __le16_to_cpu(src[2]),
1592                                        &code[i], codespace - i, framelen);
1593                                if (ret < 0) {
1594                                        dev_err(go->dev,
1595                                                "insufficient memory for firmware construction\n");
1596                                        goto fw_failed;
1597                                }
1598                                i += ret;
1599                        } else {
1600                                if (codespace - i < chunk_len) {
1601                                        dev_err(go->dev,
1602                                                "insufficient memory for firmware construction\n");
1603                                        goto fw_failed;
1604                                }
1605                                memcpy(&code[i], &src[2], chunk_len * 2);
1606                                i += chunk_len;
1607                        }
1608                }
1609                srclen -= chunk_len + 2;
1610                src += chunk_len + 2;
1611        }
1612        release_firmware(fw_entry);
1613        *fw = (u8 *)code;
1614        *fwlen = i * 2;
1615        return 0;
1616
1617fw_failed:
1618        kfree(code);
1619        release_firmware(fw_entry);
1620        return -1;
1621}
1622
1623MODULE_FIRMWARE(GO7007_FW_NAME);
1624