| @@ -129,6 +129,13 @@ struct allegro_mbox { · 128 unmodified lines |
| 129 | 129 | struct mutex lock; |
| 130 | 130 | }; |
| 131 | 131 | |
| 132 | +struct allegro_encoder_buffer { |
| 133 | + unsigned int size; |
| 134 | + unsigned int color_depth; |
| 135 | + unsigned int num_cores; |
| 136 | + unsigned int clk_rate; |
| 137 | +}; |
| 138 | + |
| 132 | 139 | struct allegro_dev { |
| 133 | 140 | struct v4l2_device v4l2_dev; |
| 134 | 141 | struct video_device video_dev; |
| @@ -148,6 +155,8 @@ struct allegro_dev { · 13 unmodified lines |
| 148 | 155 | const struct fw_info *fw_info; |
| 149 | 156 | struct allegro_buffer firmware; |
| 150 | 157 | struct allegro_buffer suballocator; |
| 158 | + bool has_encoder_buffer; |
| 159 | + struct allegro_encoder_buffer encoder_buffer; |
| 151 | 160 | |
| 152 | 161 | struct completion init_complete; |
| 153 | 162 | bool initialized; |
| @@ -930,6 +939,52 @@ out: · 776 unmodified lines |
| 930 | 939 | kfree(msg); |
| 931 | 940 | } |
| 932 | 941 | |
| 942 | +static int allegro_encoder_buffer_init(struct allegro_dev *dev, |
| 943 | + struct allegro_encoder_buffer *buffer) |
| 944 | +{ |
| 945 | + int err; |
| 946 | + struct regmap *settings = dev->settings; |
| 947 | + unsigned int supports_10_bit; |
| 948 | + unsigned int memory_depth; |
| 949 | + unsigned int num_cores; |
| 950 | + unsigned int color_depth; |
| 951 | + unsigned long clk_rate; |
| 952 | + |
| 953 | + /* We don't support the encoder buffer pre Firmware version 2019.2 */ |
| 954 | + if (dev->fw_info->mailbox_version < MCU_MSG_VERSION_2019_2) |
| 955 | + return -ENODEV; |
| 956 | + |
| 957 | + if (!settings) |
| 958 | + return -EINVAL; |
| 959 | + |
| 960 | + err = regmap_read(settings, VCU_ENC_COLOR_DEPTH, &supports_10_bit); |
| 961 | + if (err < 0) |
| 962 | + return err; |
| 963 | + err = regmap_read(settings, VCU_MEMORY_DEPTH, &memory_depth); |
| 964 | + if (err < 0) |
| 965 | + return err; |
| 966 | + err = regmap_read(settings, VCU_NUM_CORE, &num_cores); |
| 967 | + if (err < 0) |
| 968 | + return err; |
| 969 | + |
| 970 | + clk_rate = clk_get_rate(dev->clk_core); |
| 971 | + if (clk_rate == 0) |
| 972 | + return -EINVAL; |
| 973 | + |
| 974 | + color_depth = supports_10_bit ? 10 : 8; |
| 975 | + /* The firmware expects the encoder buffer size in bits. */ |
| 976 | + buffer->size = color_depth * 32 * memory_depth; |
| 977 | + buffer->color_depth = color_depth; |
| 978 | + buffer->num_cores = num_cores; |
| 979 | + buffer->clk_rate = clk_rate; |
| 980 | + |
| 981 | + v4l2_dbg(1, debug, &dev->v4l2_dev, |
| 982 | + "using %d bits encoder buffer with %d-bit color depth\n", |
| 983 | + buffer->size, color_depth); |
| 984 | + |
| 985 | + return 0; |
| 986 | +} |
| 987 | + |
| 933 | 988 | static void allegro_mcu_send_init(struct allegro_dev *dev, |
| 934 | 989 | dma_addr_t suballoc_dma, size_t suballoc_size) |
| 935 | 990 | { |
| @@ -943,10 +998,17 @@ static void allegro_mcu_send_init(struct allegro_dev *dev, · 7 unmodified lines |
| 943 | 998 | msg.suballoc_dma = to_mcu_addr(dev, suballoc_dma); |
| 944 | 999 | msg.suballoc_size = to_mcu_size(dev, suballoc_size); |
| 945 | 1000 | |
| 946 | | − /* disable L2 cache */ |
| 947 | | − msg.l2_cache[0] = -1; |
| 948 | | − msg.l2_cache[1] = -1; |
| 949 | | − msg.l2_cache[2] = -1; |
| 1001 | + if (dev->has_encoder_buffer) { |
| 1002 | + msg.encoder_buffer_size = dev->encoder_buffer.size; |
| 1003 | + msg.encoder_buffer_color_depth = dev->encoder_buffer.color_depth; |
| 1004 | + msg.num_cores = dev->encoder_buffer.num_cores; |
| 1005 | + msg.clk_rate = dev->encoder_buffer.clk_rate; |
| 1006 | + } else { |
| 1007 | + msg.encoder_buffer_size = -1; |
| 1008 | + msg.encoder_buffer_color_depth = -1; |
| 1009 | + msg.num_cores = -1; |
| 1010 | + msg.clk_rate = -1; |
| 1011 | + } |
| 950 | 1012 | |
| 951 | 1013 | allegro_mbox_send(dev->mbox_command, &msg); |
| 952 | 1014 | } |
| @@ -1193,9 +1255,8 @@ static int fill_create_channel_param(struct allegro_channel *channel, · 240 unmodified lines |
| 1193 | 1255 | param->max_transfo_depth_intra = channel->max_transfo_depth_intra; |
| 1194 | 1256 | param->max_transfo_depth_inter = channel->max_transfo_depth_inter; |
| 1195 | 1257 | |
| 1196 | | − param->prefetch_auto = 0; |
| 1197 | | − param->prefetch_mem_offset = 0; |
| 1198 | | − param->prefetch_mem_size = 0; |
| 1258 | + param->encoder_buffer_enabled = channel->dev->has_encoder_buffer; |
| 1259 | + param->encoder_buffer_offset = 0; |
| 1199 | 1260 | |
| 1200 | 1261 | param->rate_control_mode = channel->frame_rc_enable ? |
| 1201 | 1262 | v4l2_bitrate_mode_to_mcu_mode(bitrate_mode) : 0; |
| @@ -1320,6 +1381,7 @@ static int allegro_mcu_send_encode_frame(struct allegro_dev *dev, · 118 unmodified lines |
| 1320 | 1381 | u64 src_handle) |
| 1321 | 1382 | { |
| 1322 | 1383 | struct mcu_msg_encode_frame msg; |
| 1384 | + bool use_encoder_buffer = channel->dev->has_encoder_buffer; |
| 1323 | 1385 | |
| 1324 | 1386 | memset(&msg, 0, sizeof(msg)); |
| 1325 | 1387 | |
| @@ -1328,6 +1390,8 @@ static int allegro_mcu_send_encode_frame(struct allegro_dev *dev, · 2 unmodified lines |
| 1328 | 1390 | |
| 1329 | 1391 | msg.channel_id = channel->mcu_channel_id; |
| 1330 | 1392 | msg.encoding_options = AL_OPT_FORCE_LOAD; |
| 1393 | + if (use_encoder_buffer) |
| 1394 | + msg.encoding_options |= AL_OPT_USE_L2; |
| 1331 | 1395 | msg.pps_qp = 26; /* qp are relative to 26 */ |
| 1332 | 1396 | msg.user_param = 0; /* copied to mcu_msg_encode_frame_response */ |
| 1333 | 1397 | /* src_handle is copied to mcu_msg_encode_frame_response */ |
| @@ -3522,6 +3586,11 @@ static int allegro_mcu_hw_init(struct allegro_dev *dev, · 2188 unmodified lines |
| 3522 | 3586 | return -EIO; |
| 3523 | 3587 | } |
| 3524 | 3588 | |
| 3589 | + err = allegro_encoder_buffer_init(dev, &dev->encoder_buffer); |
| 3590 | + dev->has_encoder_buffer = (err == 0); |
| 3591 | + if (!dev->has_encoder_buffer) |
| 3592 | + v4l2_info(&dev->v4l2_dev, "encoder buffer not available\n"); |
| 3593 | + |
| 3525 | 3594 | allegro_mcu_enable_interrupts(dev); |
| 3526 | 3595 | |
| 3527 | 3596 | /* The mcu sends INIT after reset. */ |