mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-05 08:38:28 -04:00
media: atomisp: remove atomisp_acc.c
With the ACC ioctls removed sd->acc.fw is always empty turning the atomisp_acc.c code into no-ops, remove it. Link: https://lore.kernel.org/linux-media/20220615205037.16549-20-hdegoede@redhat.com Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
4bbca788b6
commit
868088a061
@@ -13,7 +13,6 @@ atomisp = $(srctree)/drivers/staging/media/atomisp/
|
||||
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
atomisp-objs += \
|
||||
pci/atomisp_acc.o \
|
||||
pci/atomisp_cmd.o \
|
||||
pci/atomisp_compat_css20.o \
|
||||
pci/atomisp_csi2.o \
|
||||
|
||||
@@ -1,231 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Support for Clovertrail PNW Camera Imaging ISP subsystem.
|
||||
*
|
||||
* Copyright (c) 2012 Intel Corporation. All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version
|
||||
* 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file implements loadable acceleration firmware API,
|
||||
* including ioctls to map and unmap acceleration parameters and buffers.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <media/v4l2-event.h>
|
||||
|
||||
#include "hmm.h"
|
||||
|
||||
#include "atomisp_acc.h"
|
||||
#include "atomisp_internal.h"
|
||||
#include "atomisp_compat.h"
|
||||
#include "atomisp_cmd.h"
|
||||
|
||||
#include "ia_css.h"
|
||||
|
||||
static const struct {
|
||||
unsigned int flag;
|
||||
enum ia_css_pipe_id pipe_id;
|
||||
} acc_flag_to_pipe[] = {
|
||||
{ ATOMISP_ACC_FW_LOAD_FL_PREVIEW, IA_CSS_PIPE_ID_PREVIEW },
|
||||
{ ATOMISP_ACC_FW_LOAD_FL_COPY, IA_CSS_PIPE_ID_COPY },
|
||||
{ ATOMISP_ACC_FW_LOAD_FL_VIDEO, IA_CSS_PIPE_ID_VIDEO },
|
||||
{ ATOMISP_ACC_FW_LOAD_FL_CAPTURE, IA_CSS_PIPE_ID_CAPTURE },
|
||||
{ ATOMISP_ACC_FW_LOAD_FL_ACC, IA_CSS_PIPE_ID_ACC }
|
||||
};
|
||||
|
||||
static void acc_free_fw(struct atomisp_acc_fw *acc_fw)
|
||||
{
|
||||
vfree(acc_fw->fw);
|
||||
kfree(acc_fw);
|
||||
}
|
||||
|
||||
static int acc_stop_acceleration(struct atomisp_sub_device *asd)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = atomisp_css_stop_acc_pipe(asd);
|
||||
atomisp_css_destroy_acc_pipe(asd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void atomisp_acc_cleanup(struct atomisp_device *isp)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < isp->num_of_streams; i++)
|
||||
ida_destroy(&isp->asd[i].acc.ida);
|
||||
}
|
||||
|
||||
void atomisp_acc_release(struct atomisp_sub_device *asd)
|
||||
{
|
||||
struct atomisp_acc_fw *acc_fw, *ta;
|
||||
struct atomisp_map *atomisp_map, *tm;
|
||||
|
||||
/* Stop acceleration if already running */
|
||||
if (asd->acc.pipeline)
|
||||
acc_stop_acceleration(asd);
|
||||
|
||||
/* Unload all loaded acceleration binaries */
|
||||
list_for_each_entry_safe(acc_fw, ta, &asd->acc.fw, list) {
|
||||
list_del(&acc_fw->list);
|
||||
ida_free(&asd->acc.ida, acc_fw->handle);
|
||||
acc_free_fw(acc_fw);
|
||||
}
|
||||
|
||||
/* Free all mapped memory blocks */
|
||||
list_for_each_entry_safe(atomisp_map, tm, &asd->acc.memory_maps, list) {
|
||||
list_del(&atomisp_map->list);
|
||||
hmm_free(atomisp_map->ptr);
|
||||
kfree(atomisp_map);
|
||||
}
|
||||
}
|
||||
|
||||
void atomisp_acc_done(struct atomisp_sub_device *asd, unsigned int handle)
|
||||
{
|
||||
struct v4l2_event event = { 0 };
|
||||
|
||||
event.type = V4L2_EVENT_ATOMISP_ACC_COMPLETE;
|
||||
event.u.frame_sync.frame_sequence = atomic_read(&asd->sequence);
|
||||
event.id = handle;
|
||||
|
||||
v4l2_event_queue(asd->subdev.devnode, &event);
|
||||
}
|
||||
|
||||
static void atomisp_acc_unload_some_extensions(struct atomisp_sub_device *asd,
|
||||
int i,
|
||||
struct atomisp_acc_fw *acc_fw)
|
||||
{
|
||||
while (--i >= 0) {
|
||||
if (acc_fw->flags & acc_flag_to_pipe[i].flag) {
|
||||
atomisp_css_unload_acc_extension(asd, acc_fw->fw,
|
||||
acc_flag_to_pipe[i].pipe_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Appends the loaded acceleration binary extensions to the
|
||||
* current ISP mode. Must be called just before sh_css_start().
|
||||
*/
|
||||
int atomisp_acc_load_extensions(struct atomisp_sub_device *asd)
|
||||
{
|
||||
struct atomisp_acc_fw *acc_fw;
|
||||
bool ext_loaded = false;
|
||||
bool continuous = asd->continuous_mode->val &&
|
||||
asd->run_mode->val == ATOMISP_RUN_MODE_PREVIEW;
|
||||
int ret = 0, i = -1;
|
||||
struct atomisp_device *isp = asd->isp;
|
||||
|
||||
if (asd->acc.pipeline || asd->acc.extension_mode)
|
||||
return -EBUSY;
|
||||
|
||||
/* Invalidate caches. FIXME: should flush only necessary buffers */
|
||||
wbinvd();
|
||||
|
||||
list_for_each_entry(acc_fw, &asd->acc.fw, list) {
|
||||
if (acc_fw->type != ATOMISP_ACC_FW_LOAD_TYPE_OUTPUT &&
|
||||
acc_fw->type != ATOMISP_ACC_FW_LOAD_TYPE_VIEWFINDER)
|
||||
continue;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(acc_flag_to_pipe); i++) {
|
||||
/*
|
||||
* QoS (ACC pipe) acceleration stages are
|
||||
* currently allowed only in continuous mode.
|
||||
* Skip them for all other modes.
|
||||
*/
|
||||
if (!continuous &&
|
||||
acc_flag_to_pipe[i].flag ==
|
||||
ATOMISP_ACC_FW_LOAD_FL_ACC)
|
||||
continue;
|
||||
|
||||
if (acc_fw->flags & acc_flag_to_pipe[i].flag) {
|
||||
ret = atomisp_css_load_acc_extension(asd,
|
||||
acc_fw->fw,
|
||||
acc_flag_to_pipe[i].pipe_id,
|
||||
acc_fw->type);
|
||||
if (ret) {
|
||||
atomisp_acc_unload_some_extensions(asd, i, acc_fw);
|
||||
goto error;
|
||||
}
|
||||
|
||||
ext_loaded = true;
|
||||
}
|
||||
}
|
||||
|
||||
ret = atomisp_css_set_acc_parameters(acc_fw);
|
||||
if (ret < 0) {
|
||||
atomisp_acc_unload_some_extensions(asd, i, acc_fw);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
if (!ext_loaded)
|
||||
return ret;
|
||||
|
||||
ret = atomisp_css_update_stream(asd);
|
||||
if (ret) {
|
||||
dev_err(isp->dev, "%s: update stream failed.\n", __func__);
|
||||
atomisp_acc_unload_extensions(asd);
|
||||
goto error;
|
||||
}
|
||||
|
||||
asd->acc.extension_mode = true;
|
||||
return 0;
|
||||
|
||||
error:
|
||||
list_for_each_entry_continue_reverse(acc_fw, &asd->acc.fw, list) {
|
||||
if (acc_fw->type != ATOMISP_ACC_FW_LOAD_TYPE_OUTPUT &&
|
||||
acc_fw->type != ATOMISP_ACC_FW_LOAD_TYPE_VIEWFINDER)
|
||||
continue;
|
||||
|
||||
for (i = ARRAY_SIZE(acc_flag_to_pipe) - 1; i >= 0; i--) {
|
||||
if (!continuous &&
|
||||
acc_flag_to_pipe[i].flag ==
|
||||
ATOMISP_ACC_FW_LOAD_FL_ACC)
|
||||
continue;
|
||||
if (acc_fw->flags & acc_flag_to_pipe[i].flag) {
|
||||
atomisp_css_unload_acc_extension(asd,
|
||||
acc_fw->fw,
|
||||
acc_flag_to_pipe[i].pipe_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void atomisp_acc_unload_extensions(struct atomisp_sub_device *asd)
|
||||
{
|
||||
struct atomisp_acc_fw *acc_fw;
|
||||
int i;
|
||||
|
||||
if (!asd->acc.extension_mode)
|
||||
return;
|
||||
|
||||
list_for_each_entry_reverse(acc_fw, &asd->acc.fw, list) {
|
||||
if (acc_fw->type != ATOMISP_ACC_FW_LOAD_TYPE_OUTPUT &&
|
||||
acc_fw->type != ATOMISP_ACC_FW_LOAD_TYPE_VIEWFINDER)
|
||||
continue;
|
||||
|
||||
for (i = ARRAY_SIZE(acc_flag_to_pipe) - 1; i >= 0; i--) {
|
||||
if (acc_fw->flags & acc_flag_to_pipe[i].flag) {
|
||||
atomisp_css_unload_acc_extension(asd,
|
||||
acc_fw->fw,
|
||||
acc_flag_to_pipe[i].pipe_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
asd->acc.extension_mode = false;
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Support for Clovertrail PNW Camera Imaging ISP subsystem.
|
||||
*
|
||||
* Copyright (c) 2012 Intel Corporation. All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version
|
||||
* 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ATOMISP_ACC_H__
|
||||
#define __ATOMISP_ACC_H__
|
||||
|
||||
#include "../../include/linux/atomisp.h"
|
||||
#include "atomisp_internal.h"
|
||||
|
||||
#include "ia_css_types.h"
|
||||
|
||||
/*
|
||||
* Interface functions for AtomISP driver acceleration API implementation.
|
||||
*/
|
||||
|
||||
struct atomisp_sub_device;
|
||||
|
||||
void atomisp_acc_cleanup(struct atomisp_device *isp);
|
||||
|
||||
/*
|
||||
* Free up any allocated resources.
|
||||
* Must be called each time when the device is closed.
|
||||
* Note that there isn't corresponding open() call;
|
||||
* this function may be called sequentially multiple times.
|
||||
* Must be called to free up resources before driver is unloaded.
|
||||
*/
|
||||
void atomisp_acc_release(struct atomisp_sub_device *asd);
|
||||
|
||||
/*
|
||||
* Used by ISR to notify ACC stage finished.
|
||||
* This is internally used and does not export as IOCTL.
|
||||
*/
|
||||
void atomisp_acc_done(struct atomisp_sub_device *asd, unsigned int handle);
|
||||
|
||||
/*
|
||||
* Appends the loaded acceleration binary extensions to the
|
||||
* current ISP mode. Must be called just before atomisp_css_start().
|
||||
*/
|
||||
int atomisp_acc_load_extensions(struct atomisp_sub_device *asd);
|
||||
|
||||
/*
|
||||
* Must be called after streaming is stopped:
|
||||
* unloads any loaded acceleration extensions.
|
||||
*/
|
||||
void atomisp_acc_unload_extensions(struct atomisp_sub_device *asd);
|
||||
|
||||
#endif /* __ATOMISP_ACC_H__ */
|
||||
@@ -42,7 +42,6 @@
|
||||
#include "atomisp_ioctl.h"
|
||||
#include "atomisp-regs.h"
|
||||
#include "atomisp_tables.h"
|
||||
#include "atomisp_acc.h"
|
||||
#include "atomisp_compat.h"
|
||||
#include "atomisp_subdev.h"
|
||||
#include "atomisp_dfs_tables.h"
|
||||
@@ -1302,34 +1301,11 @@ static void __atomisp_css_recover(struct atomisp_device *isp, bool isp_timeout)
|
||||
|
||||
for (i = 0; i < isp->num_of_streams; i++) {
|
||||
struct atomisp_sub_device *asd = &isp->asd[i];
|
||||
struct ia_css_pipeline *acc_pipeline;
|
||||
struct ia_css_pipe *acc_pipe = NULL;
|
||||
|
||||
if (asd->streaming != ATOMISP_DEVICE_STREAMING_ENABLED &&
|
||||
!asd->stream_prepared)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* AtomISP::waitStageUpdate is blocked when WDT happens.
|
||||
* By calling acc_done() for all loaded fw_handles,
|
||||
* HAL will be unblocked.
|
||||
*/
|
||||
acc_pipe = asd->stream_env[i].pipes[IA_CSS_PIPE_ID_ACC];
|
||||
if (acc_pipe) {
|
||||
acc_pipeline = ia_css_pipe_get_pipeline(acc_pipe);
|
||||
if (acc_pipeline) {
|
||||
struct ia_css_pipeline_stage *stage;
|
||||
|
||||
for (stage = acc_pipeline->stages; stage;
|
||||
stage = stage->next) {
|
||||
const struct ia_css_fw_info *fw;
|
||||
|
||||
fw = stage->firmware;
|
||||
atomisp_acc_done(asd, fw->handle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
depth_cnt++;
|
||||
|
||||
if (asd->delayed_init == ATOMISP_DELAYED_INIT_QUEUED)
|
||||
@@ -1350,8 +1326,6 @@ static void __atomisp_css_recover(struct atomisp_device *isp, bool isp_timeout)
|
||||
dev_warn(isp->dev,
|
||||
"can't stop streaming on sensor!\n");
|
||||
|
||||
atomisp_acc_unload_extensions(asd);
|
||||
|
||||
atomisp_clear_css_buffer_counters(asd);
|
||||
|
||||
css_pipe_id = atomisp_get_css_pipe_id(asd);
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
#include "atomisp-regs.h"
|
||||
#include "atomisp_fops.h"
|
||||
#include "atomisp_ioctl.h"
|
||||
#include "atomisp_acc.h"
|
||||
|
||||
#include "ia_css_debug.h"
|
||||
#include "ia_css_isp_param.h"
|
||||
@@ -1118,8 +1117,8 @@ int atomisp_css_start(struct atomisp_sub_device *asd,
|
||||
ret = -EINVAL;
|
||||
goto stream_err;
|
||||
}
|
||||
/* in_reset == true, extension firmwares are reloaded after the recovery */
|
||||
atomisp_acc_load_extensions(asd);
|
||||
/* Invalidate caches. FIXME: should flush only necessary buffers */
|
||||
wbinvd();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -4211,8 +4210,7 @@ int atomisp_css_isr_thread(struct atomisp_device *isp,
|
||||
css_pipe_done[asd->index] = true;
|
||||
break;
|
||||
case IA_CSS_EVENT_TYPE_ACC_STAGE_COMPLETE:
|
||||
dev_dbg(isp->dev, "event: acc stage done");
|
||||
atomisp_acc_done(asd, current_event.event.fw_handle);
|
||||
dev_warn(isp->dev, "unexpected event: acc stage done");
|
||||
break;
|
||||
default:
|
||||
dev_dbg(isp->dev, "unhandled css stored event: 0x%x\n",
|
||||
|
||||
@@ -38,8 +38,6 @@
|
||||
#include "type_support.h"
|
||||
#include "device_access/device_access.h"
|
||||
|
||||
#include "atomisp_acc.h"
|
||||
|
||||
#define ISP_LEFT_PAD 128 /* equal to 2*NWAY */
|
||||
|
||||
/*
|
||||
@@ -1014,8 +1012,6 @@ static int atomisp_release(struct file *file)
|
||||
if (atomisp_dev_users(isp))
|
||||
goto done;
|
||||
|
||||
atomisp_acc_release(asd);
|
||||
|
||||
atomisp_destroy_pipes_stream_force(asd);
|
||||
atomisp_css_uninit(isp);
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
#include <media/v4l2-event.h>
|
||||
#include <media/videobuf-vmalloc.h>
|
||||
|
||||
#include "atomisp_acc.h"
|
||||
#include "atomisp_cmd.h"
|
||||
#include "atomisp_common.h"
|
||||
#include "atomisp_fops.h"
|
||||
@@ -1913,11 +1912,8 @@ static int atomisp_streamon(struct file *file, void *fh,
|
||||
|
||||
css_pipe_id = atomisp_get_css_pipe_id(asd);
|
||||
|
||||
ret = atomisp_acc_load_extensions(asd);
|
||||
if (ret < 0) {
|
||||
dev_err(isp->dev, "acc extension failed to load\n");
|
||||
goto out;
|
||||
}
|
||||
/* Invalidate caches. FIXME: should flush only necessary buffers */
|
||||
wbinvd();
|
||||
|
||||
if (asd->params.css_update_params_needed) {
|
||||
atomisp_apply_css_parameters(asd, &asd->params.css_param);
|
||||
@@ -2154,7 +2150,6 @@ int __atomisp_streamoff(struct file *file, void *fh, enum v4l2_buf_type type)
|
||||
video, s_stream, 0);
|
||||
|
||||
rt_mutex_lock(&isp->mutex);
|
||||
atomisp_acc_unload_extensions(asd);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&isp->lock, flags);
|
||||
|
||||
@@ -1081,9 +1081,6 @@ static void atomisp_init_acc_pipe(struct atomisp_sub_device *asd,
|
||||
{
|
||||
pipe->asd = asd;
|
||||
pipe->isp = asd->isp;
|
||||
INIT_LIST_HEAD(&asd->acc.fw);
|
||||
INIT_LIST_HEAD(&asd->acc.memory_maps);
|
||||
ida_init(&asd->acc.ida);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -323,11 +323,7 @@ struct atomisp_sub_device {
|
||||
struct v4l2_ctrl *disable_dz;
|
||||
|
||||
struct {
|
||||
struct list_head fw;
|
||||
struct list_head memory_maps;
|
||||
struct ia_css_pipe *pipeline;
|
||||
bool extension_mode;
|
||||
struct ida ida;
|
||||
struct completion acc_done;
|
||||
void *acc_stages;
|
||||
} acc;
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
#include "atomisp_file.h"
|
||||
#include "atomisp_ioctl.h"
|
||||
#include "atomisp_internal.h"
|
||||
#include "atomisp_acc.h"
|
||||
#include "atomisp-regs.h"
|
||||
#include "atomisp_dfs_tables.h"
|
||||
#include "atomisp_drvfs.h"
|
||||
@@ -1792,7 +1791,6 @@ static int atomisp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *i
|
||||
pm_runtime_get_noresume(&pdev->dev);
|
||||
destroy_workqueue(isp->wdt_work_queue);
|
||||
wdt_work_queue_fail:
|
||||
atomisp_acc_cleanup(isp);
|
||||
atomisp_unregister_entities(isp);
|
||||
register_entities_fail:
|
||||
atomisp_uninitialize_modules(isp);
|
||||
@@ -1843,8 +1841,6 @@ static void atomisp_pci_remove(struct pci_dev *pdev)
|
||||
|
||||
atomisp_drvfs_exit();
|
||||
|
||||
atomisp_acc_cleanup(isp);
|
||||
|
||||
ia_css_unload_firmware();
|
||||
hmm_cleanup();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user