ipa: mali-c55: Update header file and adjust IPA
Update Mali C55 header file to the version merged in Linux v6.19-rc1 at
revision 08a99369f44e ("media: uapi: Add parameters structs to
mali-c55-config.h") with applied on top the in-review patch:
https://lore.kernel.org/all/20251215-mali-c55-header-update-for-v6-19-rc1-v1-3-69f56dee3c71@ideasonboard.com/
Adjust the IPA module to use the new header version which uses the
v4l2-isp framework.
Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Tested-by: Antoine Bouyer <antoine.bouyer@nxp.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
This commit is contained in:
@@ -253,7 +253,7 @@ size_t Agc::fillGainParamBlock(IPAContext &context, IPAFrameContext &frameContex
|
||||
gain = activeState.agc.manual.ispGain;
|
||||
|
||||
block.header->type = MALI_C55_PARAM_BLOCK_DIGITAL_GAIN;
|
||||
block.header->flags = MALI_C55_PARAM_BLOCK_FL_NONE;
|
||||
block.header->flags = 0;
|
||||
block.header->size = sizeof(struct mali_c55_params_digital_gain);
|
||||
|
||||
block.digital_gain->gain = floatingToFixedPoint<5, 8, uint16_t, double>(gain);
|
||||
@@ -266,7 +266,7 @@ size_t Agc::fillParamsBuffer(mali_c55_params_block block,
|
||||
enum mali_c55_param_block_type type)
|
||||
{
|
||||
block.header->type = type;
|
||||
block.header->flags = MALI_C55_PARAM_BLOCK_FL_NONE;
|
||||
block.header->flags = 0;
|
||||
block.header->size = sizeof(struct mali_c55_params_aexp_hist);
|
||||
|
||||
/* Collect every 3rd pixel horizontally */
|
||||
@@ -292,7 +292,7 @@ size_t Agc::fillWeightsArrayBuffer(mali_c55_params_block block,
|
||||
enum mali_c55_param_block_type type)
|
||||
{
|
||||
block.header->type = type;
|
||||
block.header->flags = MALI_C55_PARAM_BLOCK_FL_NONE;
|
||||
block.header->flags = 0;
|
||||
block.header->size = sizeof(struct mali_c55_params_aexp_weights);
|
||||
|
||||
/* We use every zone - a 15x15 grid */
|
||||
@@ -314,30 +314,30 @@ size_t Agc::fillWeightsArrayBuffer(mali_c55_params_block block,
|
||||
}
|
||||
|
||||
void Agc::prepare(IPAContext &context, const uint32_t frame,
|
||||
IPAFrameContext &frameContext, mali_c55_params_buffer *params)
|
||||
IPAFrameContext &frameContext, v4l2_isp_params_buffer *params)
|
||||
{
|
||||
mali_c55_params_block block;
|
||||
|
||||
block.data = ¶ms->data[params->total_size];
|
||||
params->total_size += fillGainParamBlock(context, frameContext, block);
|
||||
block.data = ¶ms->data[params->data_size];
|
||||
params->data_size += fillGainParamBlock(context, frameContext, block);
|
||||
|
||||
if (frame > 0)
|
||||
return;
|
||||
|
||||
block.data = ¶ms->data[params->total_size];
|
||||
params->total_size += fillParamsBuffer(block,
|
||||
block.data = ¶ms->data[params->data_size];
|
||||
params->data_size += fillParamsBuffer(block,
|
||||
MALI_C55_PARAM_BLOCK_AEXP_HIST);
|
||||
|
||||
block.data = ¶ms->data[params->total_size];
|
||||
params->total_size += fillWeightsArrayBuffer(block,
|
||||
block.data = ¶ms->data[params->data_size];
|
||||
params->data_size += fillWeightsArrayBuffer(block,
|
||||
MALI_C55_PARAM_BLOCK_AEXP_HIST_WEIGHTS);
|
||||
|
||||
block.data = ¶ms->data[params->total_size];
|
||||
params->total_size += fillParamsBuffer(block,
|
||||
block.data = ¶ms->data[params->data_size];
|
||||
params->data_size += fillParamsBuffer(block,
|
||||
MALI_C55_PARAM_BLOCK_AEXP_IHIST);
|
||||
|
||||
block.data = ¶ms->data[params->total_size];
|
||||
params->total_size += fillWeightsArrayBuffer(block,
|
||||
block.data = ¶ms->data[params->data_size];
|
||||
params->data_size += fillWeightsArrayBuffer(block,
|
||||
MALI_C55_PARAM_BLOCK_AEXP_IHIST_WEIGHTS);
|
||||
}
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ public:
|
||||
const ControlList &controls) override;
|
||||
void prepare(IPAContext &context, const uint32_t frame,
|
||||
IPAFrameContext &frameContext,
|
||||
mali_c55_params_buffer *params) override;
|
||||
v4l2_isp_params_buffer *params) override;
|
||||
void process(IPAContext &context, const uint32_t frame,
|
||||
IPAFrameContext &frameContext,
|
||||
const mali_c55_stats_buffer *stats,
|
||||
|
||||
@@ -22,7 +22,7 @@ class Algorithm : public libcamera::ipa::Algorithm<Module>
|
||||
};
|
||||
|
||||
union mali_c55_params_block {
|
||||
struct mali_c55_params_block_header *header;
|
||||
struct v4l2_isp_params_block_header *header;
|
||||
struct mali_c55_params_sensor_off_preshading *sensor_offs;
|
||||
struct mali_c55_params_aexp_hist *aexp_hist;
|
||||
struct mali_c55_params_aexp_weights *aexp_weights;
|
||||
|
||||
@@ -47,7 +47,7 @@ size_t Awb::fillGainsParamBlock(mali_c55_params_block block, IPAContext &context
|
||||
IPAFrameContext &frameContext)
|
||||
{
|
||||
block.header->type = MALI_C55_PARAM_BLOCK_AWB_GAINS;
|
||||
block.header->flags = MALI_C55_PARAM_BLOCK_FL_NONE;
|
||||
block.header->flags = 0;
|
||||
block.header->size = sizeof(struct mali_c55_params_awb_gains);
|
||||
|
||||
double rGain = context.activeState.awb.rGain;
|
||||
@@ -77,7 +77,7 @@ size_t Awb::fillGainsParamBlock(mali_c55_params_block block, IPAContext &context
|
||||
size_t Awb::fillConfigParamBlock(mali_c55_params_block block)
|
||||
{
|
||||
block.header->type = MALI_C55_PARAM_BLOCK_AWB_CONFIG;
|
||||
block.header->flags = MALI_C55_PARAM_BLOCK_FL_NONE;
|
||||
block.header->flags = 0;
|
||||
block.header->size = sizeof(struct mali_c55_params_awb_config);
|
||||
|
||||
/* Tap the stats after the purple fringe block */
|
||||
@@ -126,18 +126,18 @@ size_t Awb::fillConfigParamBlock(mali_c55_params_block block)
|
||||
}
|
||||
|
||||
void Awb::prepare(IPAContext &context, const uint32_t frame,
|
||||
IPAFrameContext &frameContext, mali_c55_params_buffer *params)
|
||||
IPAFrameContext &frameContext, v4l2_isp_params_buffer *params)
|
||||
{
|
||||
mali_c55_params_block block;
|
||||
block.data = ¶ms->data[params->total_size];
|
||||
block.data = ¶ms->data[params->data_size];
|
||||
|
||||
params->total_size += fillGainsParamBlock(block, context, frameContext);
|
||||
params->data_size += fillGainsParamBlock(block, context, frameContext);
|
||||
|
||||
if (frame > 0)
|
||||
return;
|
||||
|
||||
block.data = ¶ms->data[params->total_size];
|
||||
params->total_size += fillConfigParamBlock(block);
|
||||
block.data = ¶ms->data[params->data_size];
|
||||
params->data_size += fillConfigParamBlock(block);
|
||||
}
|
||||
|
||||
void Awb::process(IPAContext &context, const uint32_t frame,
|
||||
|
||||
@@ -22,7 +22,7 @@ public:
|
||||
const IPACameraSensorInfo &configInfo) override;
|
||||
void prepare(IPAContext &context, const uint32_t frame,
|
||||
IPAFrameContext &frameContext,
|
||||
mali_c55_params_buffer *params) override;
|
||||
v4l2_isp_params_buffer *params) override;
|
||||
void process(IPAContext &context, const uint32_t frame,
|
||||
IPAFrameContext &frameContext,
|
||||
const mali_c55_stats_buffer *stats,
|
||||
|
||||
@@ -85,10 +85,10 @@ int BlackLevelCorrection::configure(IPAContext &context,
|
||||
void BlackLevelCorrection::prepare([[maybe_unused]] IPAContext &context,
|
||||
const uint32_t frame,
|
||||
[[maybe_unused]] IPAFrameContext &frameContext,
|
||||
mali_c55_params_buffer *params)
|
||||
v4l2_isp_params_buffer *params)
|
||||
{
|
||||
mali_c55_params_block block;
|
||||
block.data = ¶ms->data[params->total_size];
|
||||
block.data = ¶ms->data[params->data_size];
|
||||
|
||||
if (frame > 0)
|
||||
return;
|
||||
@@ -97,7 +97,7 @@ void BlackLevelCorrection::prepare([[maybe_unused]] IPAContext &context,
|
||||
return;
|
||||
|
||||
block.header->type = MALI_C55_PARAM_BLOCK_SENSOR_OFFS;
|
||||
block.header->flags = MALI_C55_PARAM_BLOCK_FL_NONE;
|
||||
block.header->flags = 0;
|
||||
block.header->size = sizeof(mali_c55_params_sensor_off_preshading);
|
||||
|
||||
block.sensor_offs->chan00 = offset00;
|
||||
@@ -105,7 +105,7 @@ void BlackLevelCorrection::prepare([[maybe_unused]] IPAContext &context,
|
||||
block.sensor_offs->chan10 = offset10;
|
||||
block.sensor_offs->chan11 = offset11;
|
||||
|
||||
params->total_size += block.header->size;
|
||||
params->data_size += block.header->size;
|
||||
}
|
||||
|
||||
void BlackLevelCorrection::process([[maybe_unused]] IPAContext &context,
|
||||
|
||||
@@ -22,7 +22,7 @@ public:
|
||||
const IPACameraSensorInfo &configInfo) override;
|
||||
void prepare(IPAContext &context, const uint32_t frame,
|
||||
IPAFrameContext &frameContext,
|
||||
mali_c55_params_buffer *params) override;
|
||||
v4l2_isp_params_buffer *params) override;
|
||||
void process(IPAContext &context, const uint32_t frame,
|
||||
IPAFrameContext &frameContext,
|
||||
const mali_c55_stats_buffer *stats,
|
||||
|
||||
@@ -111,7 +111,7 @@ int Lsc::init([[maybe_unused]] IPAContext &context, const YamlObject &tuningData
|
||||
size_t Lsc::fillConfigParamsBlock(mali_c55_params_block block) const
|
||||
{
|
||||
block.header->type = MALI_C55_PARAM_MESH_SHADING_CONFIG;
|
||||
block.header->flags = MALI_C55_PARAM_BLOCK_FL_NONE;
|
||||
block.header->flags = 0;
|
||||
block.header->size = sizeof(struct mali_c55_params_mesh_shading_config);
|
||||
|
||||
block.shading_config->mesh_show = false;
|
||||
@@ -131,7 +131,7 @@ size_t Lsc::fillSelectionParamsBlock(mali_c55_params_block block, uint8_t bank,
|
||||
uint8_t alpha) const
|
||||
{
|
||||
block.header->type = MALI_C55_PARAM_MESH_SHADING_SELECTION;
|
||||
block.header->flags = MALI_C55_PARAM_BLOCK_FL_NONE;
|
||||
block.header->flags = 0;
|
||||
block.header->size = sizeof(struct mali_c55_params_mesh_shading_selection);
|
||||
|
||||
block.shading_selection->mesh_alpha_bank_r = bank;
|
||||
@@ -170,7 +170,7 @@ std::tuple<uint8_t, uint8_t> Lsc::findBankAndAlpha(uint32_t ct) const
|
||||
|
||||
void Lsc::prepare(IPAContext &context, [[maybe_unused]] const uint32_t frame,
|
||||
[[maybe_unused]] IPAFrameContext &frameContext,
|
||||
mali_c55_params_buffer *params)
|
||||
v4l2_isp_params_buffer *params)
|
||||
{
|
||||
/*
|
||||
* For each frame we assess the colour temperature of the **last** frame
|
||||
@@ -194,9 +194,9 @@ void Lsc::prepare(IPAContext &context, [[maybe_unused]] const uint32_t frame,
|
||||
}
|
||||
|
||||
mali_c55_params_block block;
|
||||
block.data = ¶ms->data[params->total_size];
|
||||
block.data = ¶ms->data[params->data_size];
|
||||
|
||||
params->total_size += fillSelectionParamsBlock(block, bank, alpha);
|
||||
params->data_size += fillSelectionParamsBlock(block, bank, alpha);
|
||||
|
||||
if (frame > 0)
|
||||
return;
|
||||
@@ -205,8 +205,8 @@ void Lsc::prepare(IPAContext &context, [[maybe_unused]] const uint32_t frame,
|
||||
* If this is the first frame, we need to load the parsed coefficient
|
||||
* tables from tuning data to the ISP.
|
||||
*/
|
||||
block.data = ¶ms->data[params->total_size];
|
||||
params->total_size += fillConfigParamsBlock(block);
|
||||
block.data = ¶ms->data[params->data_size];
|
||||
params->data_size += fillConfigParamsBlock(block);
|
||||
}
|
||||
|
||||
REGISTER_IPA_ALGORITHM(Lsc, "Lsc")
|
||||
|
||||
@@ -23,7 +23,7 @@ public:
|
||||
int init(IPAContext &context, const YamlObject &tuningData) override;
|
||||
void prepare(IPAContext &context, const uint32_t frame,
|
||||
IPAFrameContext &frameContext,
|
||||
mali_c55_params_buffer *params) override;
|
||||
v4l2_isp_params_buffer *params) override;
|
||||
private:
|
||||
static constexpr unsigned int kRedOffset = 0;
|
||||
static constexpr unsigned int kGreenOffset = 1024;
|
||||
|
||||
@@ -333,22 +333,23 @@ void IPAMaliC55::queueRequest(const uint32_t request, const ControlList &control
|
||||
void IPAMaliC55::fillParams(unsigned int request,
|
||||
[[maybe_unused]] uint32_t bufferId)
|
||||
{
|
||||
struct mali_c55_params_buffer *params;
|
||||
struct v4l2_isp_params_buffer *params;
|
||||
IPAFrameContext &frameContext = context_.frameContexts.get(request);
|
||||
|
||||
params = reinterpret_cast<mali_c55_params_buffer *>(
|
||||
params = reinterpret_cast<v4l2_isp_params_buffer *>(
|
||||
buffers_.at(bufferId).planes()[0].data());
|
||||
memset(params, 0, sizeof(mali_c55_params_buffer));
|
||||
memset(params, 0,
|
||||
buffers_.at(bufferId).planes()[0].size());
|
||||
|
||||
params->version = MALI_C55_PARAM_BUFFER_V1;
|
||||
params->version = V4L2_ISP_PARAMS_VERSION_V1;
|
||||
|
||||
for (auto const &algo : algorithms()) {
|
||||
algo->prepare(context_, request, frameContext, params);
|
||||
|
||||
ASSERT(params->total_size <= MALI_C55_PARAMS_MAX_SIZE);
|
||||
ASSERT(params->data_size <= MALI_C55_PARAMS_MAX_SIZE);
|
||||
}
|
||||
|
||||
size_t bytesused = offsetof(struct mali_c55_params_buffer, data) + params->total_size;
|
||||
size_t bytesused = offsetof(struct v4l2_isp_params_buffer, data) + params->data_size;
|
||||
paramsComputed.emit(request, bytesused);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace libcamera {
|
||||
namespace ipa::mali_c55 {
|
||||
|
||||
using Module = ipa::Module<IPAContext, IPAFrameContext, IPACameraSensorInfo,
|
||||
mali_c55_params_buffer, mali_c55_stats_buffer>;
|
||||
v4l2_isp_params_buffer, mali_c55_stats_buffer>;
|
||||
|
||||
} /* namespace ipa::mali_c55 */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user