1b562e72bSNiklas Söderlund // SPDX-License-Identifier: GPL-2.0 2b562e72bSNiklas Söderlund /* 3b562e72bSNiklas Söderlund * Copyright (C) 2026 Renesas Electronics Corp. 4b562e72bSNiklas Söderlund * Copyright (C) 2026 Ideas on Board Oy 5b562e72bSNiklas Söderlund * Copyright (C) 2026 Ragnatech AB 6b562e72bSNiklas Söderlund */ 7b562e72bSNiklas Söderlund 8b562e72bSNiklas Söderlund #include <media/v4l2-isp.h> 9b562e72bSNiklas Söderlund #include <media/videobuf2-v4l2.h> 10b562e72bSNiklas Söderlund 11b562e72bSNiklas Söderlund #include "rppx1.h" 12b562e72bSNiklas Söderlund 13b562e72bSNiklas Söderlund #define RPPX1_PARAMS_BLOCK_INFO(block, data) \ 14b562e72bSNiklas Söderlund [RPPX1_PARAMS_BLOCK_TYPE_ ## block] = { \ 15b562e72bSNiklas Söderlund .size = sizeof(struct rppx1_ ## data ## _params), \ 16b562e72bSNiklas Söderlund } 17b562e72bSNiklas Söderlund 18b562e72bSNiklas Söderlund static const struct v4l2_isp_params_block_type_info 19b562e72bSNiklas Söderlund rppx1_ext_params_blocks_info[] = { 203f8a2a88SNiklas Söderlund RPPX1_PARAMS_BLOCK_INFO(BLS_PRE1, bls), 213f8a2a88SNiklas Söderlund RPPX1_PARAMS_BLOCK_INFO(BLS_PRE2, bls), 22*46542592SJai Luthra RPPX1_PARAMS_BLOCK_INFO(LIN_PRE1, lin), 23*46542592SJai Luthra RPPX1_PARAMS_BLOCK_INFO(LIN_PRE2, lin), 24b39656efSNiklas Söderlund RPPX1_PARAMS_BLOCK_INFO(LSC_PRE1, lsc), 25b39656efSNiklas Söderlund RPPX1_PARAMS_BLOCK_INFO(LSC_PRE2, lsc), 269ebf5001SNiklas Söderlund RPPX1_PARAMS_BLOCK_INFO(AWBG_PRE1, awbg), 279ebf5001SNiklas Söderlund RPPX1_PARAMS_BLOCK_INFO(AWBG_PRE2, awbg), 28aaeee9b7SNiklas Söderlund RPPX1_PARAMS_BLOCK_INFO(CCOR_POST, ccor), 299a52f7deSNiklas Söderlund RPPX1_PARAMS_BLOCK_INFO(HIST_PRE1, hist), 309a52f7deSNiklas Söderlund RPPX1_PARAMS_BLOCK_INFO(HIST_PRE2, hist), 319a52f7deSNiklas Söderlund RPPX1_PARAMS_BLOCK_INFO(HIST_POST, hist), 32b020bec4SNiklas Söderlund RPPX1_PARAMS_BLOCK_INFO(EXM_PRE1, exm), 33b020bec4SNiklas Söderlund RPPX1_PARAMS_BLOCK_INFO(EXM_PRE2, exm), 34884d6794SNiklas Söderlund RPPX1_PARAMS_BLOCK_INFO(WBMEAS_POST, wbmeas), 35d011daefSNiklas Söderlund RPPX1_PARAMS_BLOCK_INFO(GA_HV, ga), 36d011daefSNiklas Söderlund RPPX1_PARAMS_BLOCK_INFO(GA_MV, ga), 37b562e72bSNiklas Söderlund }; 38b562e72bSNiklas Söderlund 39b562e72bSNiklas Söderlund int rppx1_params(struct rppx1 *rpp, struct vb2_buffer *vb, size_t max_size, 40b562e72bSNiklas Söderlund rppx1_reg_write write, void *priv) 41b562e72bSNiklas Söderlund { 42b562e72bSNiklas Söderlund struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); 43b562e72bSNiklas Söderlund struct v4l2_isp_buffer *cfg; 44b562e72bSNiklas Söderlund size_t block_offset; 45b562e72bSNiklas Söderlund int ret; 46b562e72bSNiklas Söderlund 47b562e72bSNiklas Söderlund ret = v4l2_isp_params_validate_buffer_size(rpp->dev, vb, max_size); 48b562e72bSNiklas Söderlund if (ret) 49b562e72bSNiklas Söderlund return ret; 50b562e72bSNiklas Söderlund 51b562e72bSNiklas Söderlund cfg = vb2_plane_vaddr(&vbuf->vb2_buf, 0); 52b562e72bSNiklas Söderlund 53b562e72bSNiklas Söderlund ret = v4l2_isp_params_validate_buffer(rpp->dev, vb, cfg, 54b562e72bSNiklas Söderlund rppx1_ext_params_blocks_info, 55b562e72bSNiklas Söderlund ARRAY_SIZE(rppx1_ext_params_blocks_info)); 56b562e72bSNiklas Söderlund if (ret) 57b562e72bSNiklas Söderlund return ret; 58b562e72bSNiklas Söderlund 59b562e72bSNiklas Söderlund /* Walk the list of parameter blocks and process them. */ 60b562e72bSNiklas Söderlund block_offset = 0; 61b562e72bSNiklas Söderlund while (block_offset < cfg->data_size) { 62b562e72bSNiklas Söderlund const union rppx1_params_block *block = 63b562e72bSNiklas Söderlund (const union rppx1_params_block *)&cfg->data[block_offset]; 64b562e72bSNiklas Söderlund struct rpp_module *module; 65b562e72bSNiklas Söderlund int ret; 66b562e72bSNiklas Söderlund 67b562e72bSNiklas Söderlund block_offset += block->header.size; 68b562e72bSNiklas Söderlund 69b562e72bSNiklas Söderlund switch (block->header.type) { 703f8a2a88SNiklas Söderlund case RPPX1_PARAMS_BLOCK_TYPE_BLS_PRE1: 713f8a2a88SNiklas Söderlund module = &rpp->pre1.bls; 723f8a2a88SNiklas Söderlund break; 73*46542592SJai Luthra case RPPX1_PARAMS_BLOCK_TYPE_LIN_PRE1: 74*46542592SJai Luthra module = &rpp->pre1.lin; 75*46542592SJai Luthra break; 76b39656efSNiklas Söderlund case RPPX1_PARAMS_BLOCK_TYPE_LSC_PRE1: 77b39656efSNiklas Söderlund module = &rpp->pre1.lsc; 78b39656efSNiklas Söderlund break; 799ebf5001SNiklas Söderlund case RPPX1_PARAMS_BLOCK_TYPE_AWBG_PRE1: 809ebf5001SNiklas Söderlund module = &rpp->pre1.awbg; 819ebf5001SNiklas Söderlund break; 82aaeee9b7SNiklas Söderlund case RPPX1_PARAMS_BLOCK_TYPE_CCOR_POST: 83aaeee9b7SNiklas Söderlund module = &rpp->post.ccor; 84aaeee9b7SNiklas Söderlund break; 859a52f7deSNiklas Söderlund case RPPX1_PARAMS_BLOCK_TYPE_HIST_POST: 869a52f7deSNiklas Söderlund module = &rpp->post.hist; 879a52f7deSNiklas Söderlund break; 88b020bec4SNiklas Söderlund case RPPX1_PARAMS_BLOCK_TYPE_EXM_PRE1: 89b020bec4SNiklas Söderlund module = &rpp->pre1.exm; 90b020bec4SNiklas Söderlund break; 91884d6794SNiklas Söderlund case RPPX1_PARAMS_BLOCK_TYPE_WBMEAS_POST: 92884d6794SNiklas Söderlund module = &rpp->post.wbmeas; 93884d6794SNiklas Söderlund break; 94d011daefSNiklas Söderlund case RPPX1_PARAMS_BLOCK_TYPE_GA_HV: 95d011daefSNiklas Söderlund module = &rpp->hv.ga; 96d011daefSNiklas Söderlund break; 97b562e72bSNiklas Söderlund default: 98b562e72bSNiklas Söderlund dev_warn(rpp->dev, 99b562e72bSNiklas Söderlund "Not handled RPPX1 block type: 0x%04x\n", 100b562e72bSNiklas Söderlund block->header.type); 101b562e72bSNiklas Söderlund continue; 102b562e72bSNiklas Söderlund } 103b562e72bSNiklas Söderlund 104b562e72bSNiklas Söderlund ret = rpp_module_call(module, fill_params, block, write, priv); 105b562e72bSNiklas Söderlund if (ret) { 106b562e72bSNiklas Söderlund dev_err(rpp->dev, 107b562e72bSNiklas Söderlund "Error processing RPPX1 block type: 0x%04x\n", 108b562e72bSNiklas Söderlund block->header.type); 109b562e72bSNiklas Söderlund return ret; 110b562e72bSNiklas Söderlund } 111b562e72bSNiklas Söderlund } 112b562e72bSNiklas Söderlund 113b562e72bSNiklas Söderlund return 0; 114b562e72bSNiklas Söderlund } 115b562e72bSNiklas Söderlund EXPORT_SYMBOL_GPL(rppx1_params); 116