From: Krzysztof Kozlowski <krzk@kernel.org>
To: Vikash Garodia <quic_vgarodia@quicinc.com>,
stanimir.k.varbanov@gmail.com, agross@kernel.org,
andersson@kernel.org, konrad.dybcio@linaro.org,
mchehab@kernel.org, hans.verkuil@cisco.com,
linux-kernel@vger.kernel.org, linux-media@vger.kernel.org,
linux-arm-msm@vger.kernel.org
Cc: quic_dikshita@quicinc.com
Subject: Re: [PATCH 02/33] iris: vidc: add core functions
Date: Mon, 31 Jul 2023 23:16:46 +0200 [thread overview]
Message-ID: <0149fcd0-e64b-f155-05d8-f32a78d7e83b@kernel.org> (raw)
In-Reply-To: <1690550624-14642-3-git-send-email-quic_vgarodia@quicinc.com>
On 28/07/2023 15:23, Vikash Garodia wrote:
> From: Dikshita Agarwal <quic_dikshita@quicinc.com>
>
> This implements the platform driver methods, file
> operations and v4l2 registration.
>
> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
> Signed-off-by: Vikash Garodia <quic_vgarodia@quicinc.com>
> ---
> .../platform/qcom/iris/vidc/src/msm_vidc_probe.c | 660 +++++++++++++++++++++
> 1 file changed, 660 insertions(+)
> create mode 100644 drivers/media/platform/qcom/iris/vidc/src/msm_vidc_probe.c
>
> diff --git a/drivers/media/platform/qcom/iris/vidc/src/msm_vidc_probe.c b/drivers/media/platform/qcom/iris/vidc/src/msm_vidc_probe.c
> new file mode 100644
> index 0000000..43439cb
> --- /dev/null
> +++ b/drivers/media/platform/qcom/iris/vidc/src/msm_vidc_probe.c
> @@ -0,0 +1,660 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (c) 2020-2022, The Linux Foundation. All rights reserved.
> + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
> + */
> +
> +#include <linux/interrupt.h>
> +#include <linux/io.h>
> +#include <linux/iommu.h>
> +#include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/of_platform.h>
> +#include <linux/stringify.h>
> +#include <linux/version.h>
> +#include <linux/workqueue.h>
> +
> +#include "msm_vidc_core.h"
> +#include "msm_vidc_debug.h"
> +#include "msm_vidc_driver.h"
> +#include "msm_vidc_internal.h"
> +#include "msm_vidc_memory.h"
> +#include "msm_vidc_platform.h"
> +#include "msm_vidc_state.h"
> +#include "venus_hfi.h"
> +
> +#define BASE_DEVICE_NUMBER 32
> +
> +struct msm_vidc_core *g_core;
> +
> +static inline bool is_video_device(struct device *dev)
> +{
> + return !!(of_device_is_compatible(dev->of_node, "qcom,sm8550-vidc"));
Where is it documented? Are you 100% sure that checkpatch does not complain?
I is also a bit surprising to see of_device_is_compatible inside the
code in some random place. How does it scale? Any driver data and
variant checks should be done via helpers and driver data, not putting
compatibles in multiple places.
> +}
> +
> +static inline bool is_video_context_bank_device(struct device *dev)
> +{
> + return !!(of_device_is_compatible(dev->of_node, "qcom,vidc,cb-ns"));
> +}
> +
> +static int msm_vidc_init_resources(struct msm_vidc_core *core)
> +{
> + struct msm_vidc_resource *res = NULL;
> + int rc = 0;
> +
> + res = devm_kzalloc(&core->pdev->dev, sizeof(*res), GFP_KERNEL);
> + if (!res) {
> + d_vpr_e("%s: failed to alloc memory for resource\n", __func__);
> + return -ENOMEM;
> + }
> + core->resource = res;
> +
> + rc = call_res_op(core, init, core);
> + if (rc) {
> + d_vpr_e("%s: Failed to init resources: %d\n", __func__, rc);
> + return rc;
> + }
> +
> + return 0;
> +}
> +
> +static const struct of_device_id msm_vidc_dt_match[] = {
> + {.compatible = "qcom,sm8550-vidc"},
> + {.compatible = "qcom,vidc,cb-ns"},
No, srsly, where did you document it?
If this is not suitable for upstreaming (as it looks like) mark it as
RFC, so we will know it that you did not run checkpatch...
> + MSM_VIDC_EMPTY_BRACE
> +};
> +MODULE_DEVICE_TABLE(of, msm_vidc_dt_match);
> +
> +static void msm_vidc_release_video_device(struct video_device *vdev)
> +{
> + d_vpr_e("%s: video device released\n", __func__);
And why would you ever print anything here? What's wrong with tracing?
> +}
...
> +
> +static int msm_vidc_probe_video_device(struct platform_device *pdev)
> +{
> + int rc = 0;
> + struct msm_vidc_core *core = NULL;
> + int nr = BASE_DEVICE_NUMBER;
> +
> + d_vpr_h("%s: %s\n", __func__, dev_name(&pdev->dev));
No debug prints reinventing tracing.
> +
> + core = devm_kzalloc(&pdev->dev, sizeof(struct msm_vidc_core), GFP_KERNEL);
> + if (!core) {
> + d_vpr_e("%s: failed to alloc memory for core\n", __func__);
Ooops, this for sure did not pass any checks by tools. Sorry, please run
basic checks like coccinelle, smatch, sparse, W=1 builds.
> + return -ENOMEM;
> + }
> + g_core = core;
> +
> + core->pdev = pdev;
> + dev_set_drvdata(&pdev->dev, core);
> +
> + core->debugfs_parent = msm_vidc_devm_debugfs_get(&pdev->dev);
> + if (!core->debugfs_parent)
> + d_vpr_h("Failed to create debugfs for msm_vidc\n");
> +
> + rc = msm_vidc_devm_init_core(&pdev->dev, core);
> + if (rc) {
> + d_vpr_e("%s: init core failed with %d\n", __func__, rc);
> + goto init_core_failed;
> + }
> +
> + rc = msm_vidc_init_platform(core);
> + if (rc) {
> + d_vpr_e("%s: init platform failed with %d\n", __func__, rc);
> + rc = -EINVAL;
> + goto init_plat_failed;
> + }
> +
> + rc = msm_vidc_init_resources(core);
> + if (rc) {
> + d_vpr_e("%s: init resource failed with %d\n", __func__, rc);
> + goto init_res_failed;
> + }
> +
> + rc = msm_vidc_init_core_caps(core);
> + if (rc) {
> + d_vpr_e("%s: init core caps failed with %d\n", __func__, rc);
> + goto init_res_failed;
> + }
> +
> + rc = msm_vidc_init_instance_caps(core);
> + if (rc) {
> + d_vpr_e("%s: init inst cap failed with %d\n", __func__, rc);
> + goto init_inst_caps_fail;
> + }
> +
> + core->debugfs_root = msm_vidc_debugfs_init_core(core);
> + if (!core->debugfs_root)
> + d_vpr_h("Failed to init debugfs core\n");
> +
> + d_vpr_h("populating sub devices\n");
> + /*
> + * Trigger probe for each sub-device i.e. qcom,msm-vidc,context-bank.
> + * When msm_vidc_probe is called for each sub-device, parse the
> + * context-bank details.
> + */
> + rc = of_platform_populate(pdev->dev.of_node, msm_vidc_dt_match, NULL,
> + &pdev->dev);
> + if (rc) {
> + d_vpr_e("Failed to trigger probe for sub-devices\n");
> + goto sub_dev_failed;
> + }
> +
> + rc = v4l2_device_register(&pdev->dev, &core->v4l2_dev);
> + if (rc) {
> + d_vpr_e("Failed to register v4l2 device\n");
> + goto v4l2_reg_failed;
> + }
> +
> + /* setup the decoder device */
> + rc = msm_vidc_register_video_device(core, MSM_VIDC_DECODER, nr);
> + if (rc) {
> + d_vpr_e("Failed to register video decoder\n");
> + goto dec_reg_failed;
> + }
> +
> + /* setup the encoder device */
> + rc = msm_vidc_register_video_device(core, MSM_VIDC_ENCODER, nr + 1);
> + if (rc) {
> + d_vpr_e("Failed to register video encoder\n");
> + goto enc_reg_failed;
> + }
> +
> + rc = venus_hfi_queue_init(core);
> + if (rc) {
> + d_vpr_e("%s: interface queues init failed\n", __func__);
> + goto queues_init_failed;
> + }
> +
> + rc = msm_vidc_core_init(core);
> + if (rc) {
> + d_vpr_e("%s: sys init failed\n", __func__);
> + goto core_init_failed;
> + }
> +
> + d_vpr_h("%s(): succssful\n", __func__);
> +
> + return rc;
> +
> +core_init_failed:
> + venus_hfi_queue_deinit(core);
> +queues_init_failed:
> + of_platform_depopulate(&pdev->dev);
> +sub_dev_failed:
> + msm_vidc_unregister_video_device(core, MSM_VIDC_ENCODER);
> +enc_reg_failed:
> + msm_vidc_unregister_video_device(core, MSM_VIDC_DECODER);
> +dec_reg_failed:
> + v4l2_device_unregister(&core->v4l2_dev);
> +v4l2_reg_failed:
> +init_inst_caps_fail:
> +init_res_failed:
> +init_plat_failed:
> +init_core_failed:
> + dev_set_drvdata(&pdev->dev, NULL);
> + g_core = NULL;
> +
> + return rc;
> +}
> +
> +static int msm_vidc_probe_context_bank(struct platform_device *pdev)
> +{
> + struct msm_vidc_core *core = NULL;
> + int rc = 0;
> +
> + if (!pdev) {
> + d_vpr_e("%s: Invalid platform device %pK", __func__, pdev);
> + return -EINVAL;
> + } else if (!pdev->dev.parent) {
> + d_vpr_e("%s: Failed to find a parent for %s\n",
> + __func__, dev_name(&pdev->dev));
> + return -ENODEV;
> + }
> +
> + d_vpr_h("%s(): %s\n", __func__, dev_name(&pdev->dev));
> +
> + core = dev_get_drvdata(pdev->dev.parent);
> + if (!core) {
> + d_vpr_e("%s: core not found in device %s",
> + __func__, dev_name(pdev->dev.parent));
> + return -EINVAL;
> + }
> +
> + rc = msm_vidc_setup_context_bank(core, &pdev->dev);
> + if (rc) {
> + d_vpr_e("%s: Failed to probe context bank %s\n",
> + __func__, dev_name(&pdev->dev));
> + return rc;
> + }
> +
> + return rc;
> +}
> +
> +static int msm_vidc_probe(struct platform_device *pdev)
> +{
> + if (!pdev) {
> + d_vpr_e("%s: invalid params\n", __func__);
> + return -EINVAL;
> + }
> +
> + /*
> + * Sub devices probe will be triggered by of_platform_populate() towards
> + * the end of the probe function after msm-vidc device probe is
> + * completed. Return immediately after completing sub-device probe.
> + */
> + if (is_video_device(&pdev->dev))
> + return msm_vidc_probe_video_device(pdev);
> + else if (is_video_context_bank_device(&pdev->dev))
> + return msm_vidc_probe_context_bank(pdev);
> +
> + /* How did we end up here? */
> + WARN_ON(1);
> + return -EINVAL;
> +}
> +
> +static int msm_vidc_pm_suspend(struct device *dev)
> +{
> + int rc = 0;
> + struct msm_vidc_core *core;
> + enum msm_vidc_allow allow = MSM_VIDC_DISALLOW;
> +
> + /*
> + * Bail out if
> + * - driver possibly not probed yet
> + * - not the main device. We don't support power management on
> + * subdevices (e.g. context banks)
> + */
> + if (!dev || !dev->driver || !is_video_device(dev))
> + return 0;
> +
> + core = dev_get_drvdata(dev);
> + if (!core) {
> + d_vpr_e("%s: invalid core\n", __func__);
How core can be invalid?
> + return -EINVAL;
> + }
> +
> + core_lock(core, __func__);
What's this? Why do you use some custom locking (it's almost never a
good idea)?
> + allow = msm_vidc_allow_pm_suspend(core);
> +
> + if (allow == MSM_VIDC_IGNORE) {
> + d_vpr_h("%s: pm already suspended\n", __func__);
So you have bug in PM runtime code? Runtime PM does not suspend devices
twice.
> + msm_vidc_change_core_sub_state(core, 0, CORE_SUBSTATE_PM_SUSPEND, __func__);
> + rc = 0;
> + goto unlock;
> + } else if (allow != MSM_VIDC_ALLOW) {
> + d_vpr_h("%s: pm suspend not allowed\n", __func__);
> + rc = 0;
> + goto unlock;
> + }
> +
> + rc = msm_vidc_suspend(core);
> + if (rc == -EOPNOTSUPP)
> + rc = 0;
> + else if (rc)
> + d_vpr_e("Failed to suspend: %d\n", rc);
> + else
> + msm_vidc_change_core_sub_state(core, 0, CORE_SUBSTATE_PM_SUSPEND, __func__);
> +
> +unlock:
> + core_unlock(core, __func__);
> + return rc;
> +}
> +
Best regards,
Krzysztof
next prev parent reply other threads:[~2023-07-31 21:17 UTC|newest]
Thread overview: 108+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-28 13:23 [PATCH 00/33] Qualcomm video decoder/encoder driver Vikash Garodia
2023-07-28 13:23 ` [PATCH 01/33] MAINTAINERS: Add Qualcomm Iris video accelerator driver Vikash Garodia
2023-07-28 22:48 ` Randy Dunlap
2023-08-14 18:44 ` Dikshita Agarwal
2023-08-16 12:00 ` Bryan O'Donoghue
2023-08-16 13:14 ` Dmitry Baryshkov
2023-07-28 13:23 ` [PATCH 02/33] iris: vidc: add core functions Vikash Garodia
2023-07-28 13:45 ` Konrad Dybcio
2023-08-14 18:49 ` Dikshita Agarwal
2023-07-28 13:47 ` Konrad Dybcio
2023-07-28 13:49 ` Dmitry Baryshkov
2023-08-14 18:58 ` Dikshita Agarwal
2023-08-14 21:03 ` Dmitry Baryshkov
2023-08-24 15:32 ` Vikash Garodia
2023-07-31 21:16 ` Krzysztof Kozlowski [this message]
2023-08-14 18:54 ` Dikshita Agarwal
2023-08-14 20:04 ` Krzysztof Kozlowski
2023-07-31 21:23 ` Krzysztof Kozlowski
2023-08-14 18:51 ` Dikshita Agarwal
2023-07-28 13:23 ` [PATCH 03/33] iris: vidc: add v4l2 wrapper file Vikash Garodia
2023-07-28 13:34 ` Dmitry Baryshkov
2023-08-14 18:59 ` Dikshita Agarwal
2023-08-14 21:19 ` Dmitry Baryshkov
2023-07-28 16:23 ` Bjorn Andersson
2023-07-28 17:50 ` Nicolas Dufresne
2023-08-14 19:14 ` Dikshita Agarwal
2023-07-31 21:23 ` Krzysztof Kozlowski
2023-08-14 19:00 ` Dikshita Agarwal
2023-07-28 13:23 ` [PATCH 04/33] iris: add vidc " Vikash Garodia
2023-07-28 13:23 ` [PATCH 05/33] iris: vidc: add vb2 ops Vikash Garodia
2023-07-28 18:03 ` Nicolas Dufresne
2023-08-14 19:03 ` Dikshita Agarwal
2023-07-28 13:23 ` [PATCH 06/33] iris: vidc: define video core and instance context Vikash Garodia
2023-07-28 15:47 ` Bryan O'Donoghue
2023-08-14 19:04 ` Dikshita Agarwal
2023-07-28 13:23 ` [PATCH 07/33] iris: iris: add video encoder files Vikash Garodia
2023-07-28 13:23 ` [PATCH 08/33] iris: vidc: add video decoder files Vikash Garodia
2023-07-28 17:21 ` Konrad Dybcio
2023-08-14 19:13 ` Dikshita Agarwal
2023-07-28 13:23 ` [PATCH 09/33] iris: vidc: add control files Vikash Garodia
2023-07-28 13:23 ` [PATCH 10/33] iris: vidc: add helper functions Vikash Garodia
2023-07-28 17:41 ` Konrad Dybcio
2023-08-14 19:15 ` Dikshita Agarwal
2023-08-16 11:46 ` Konrad Dybcio
2023-07-28 13:23 ` [PATCH 11/33] iris: vidc: add helpers for memory management Vikash Garodia
2023-07-28 16:28 ` Bjorn Andersson
2023-07-28 17:22 ` Konrad Dybcio
2023-08-14 19:06 ` Dikshita Agarwal
2023-08-25 18:38 ` Konrad Dybcio
2023-08-14 19:05 ` Dikshita Agarwal
2023-07-28 13:23 ` [PATCH 12/33] iris: vidc: add helper functions for resource management Vikash Garodia
2023-07-28 17:30 ` Konrad Dybcio
2023-08-14 19:07 ` Dikshita Agarwal
2023-07-28 13:23 ` [PATCH 13/33] iris: vidc: add helper functions for power management Vikash Garodia
2023-07-28 17:46 ` Konrad Dybcio
2023-08-14 19:10 ` Dikshita Agarwal
2023-07-28 13:23 ` [PATCH 14/33] iris: vidc: add helpers for state management Vikash Garodia
2023-07-28 17:52 ` Konrad Dybcio
2023-08-14 19:17 ` Dikshita Agarwal
2023-07-28 13:23 ` [PATCH 15/33] iris: add vidc buffer files Vikash Garodia
2023-07-28 13:23 ` [PATCH 16/33] iris: add helpers for media format Vikash Garodia
2023-07-28 17:55 ` Konrad Dybcio
2023-08-14 19:18 ` Dikshita Agarwal
2023-07-28 13:23 ` [PATCH 17/33] iris: vidc: define various structures and enum Vikash Garodia
2023-07-28 13:23 ` [PATCH 18/33] iris: vidc: hfi: add Host Firmware Interface (HFI) Vikash Garodia
2023-07-28 15:58 ` Bryan O'Donoghue
2023-08-14 19:11 ` Dikshita Agarwal
2023-07-31 9:02 ` Bryan O'Donoghue
2023-08-14 19:11 ` Dikshita Agarwal
2023-07-28 13:23 ` [PATCH 19/33] iris: vidc: hfi: add Host Firmware Interface (HFI) response handling Vikash Garodia
2023-07-28 13:23 ` [PATCH 20/33] iris: vidc: hfi: add helpers for handling shared queues Vikash Garodia
2023-07-28 17:58 ` Konrad Dybcio
2023-08-14 19:19 ` Dikshita Agarwal
2023-07-28 13:23 ` [PATCH 21/33] iris: vidc: hfi: Add packetization layer Vikash Garodia
2023-07-28 13:23 ` [PATCH 22/33] iris: vidc: hfi: defines HFI properties and enums Vikash Garodia
2023-07-28 13:23 ` [PATCH 23/33] iris: vidc: add PIL functionality for video firmware Vikash Garodia
2023-07-28 13:23 ` [PATCH 24/33] iris: vidc: add debug files Vikash Garodia
2023-07-31 21:31 ` Krzysztof Kozlowski
2023-08-14 19:12 ` Dikshita Agarwal
2023-07-28 13:23 ` [PATCH 25/33] iris: platform: add platform files Vikash Garodia
2023-07-28 13:23 ` [PATCH 26/33] iris: platform: sm8550: add capability file for sm8550 Vikash Garodia
2023-07-28 14:13 ` Dmitry Baryshkov
2023-08-14 19:35 ` Dikshita Agarwal
2023-08-14 21:17 ` Dmitry Baryshkov
2023-07-28 13:23 ` [PATCH 27/33] iris: variant: add helper functions for register handling Vikash Garodia
2023-07-28 13:23 ` [PATCH 28/33] iris: variant: iris3: add iris3 specific ops Vikash Garodia
2023-07-28 13:23 ` [PATCH 29/33] iris: variant: iris3: add helpers for buffer size calculations Vikash Garodia
2023-07-28 14:19 ` Dmitry Baryshkov
2023-08-14 20:00 ` Dikshita Agarwal
2023-08-14 20:59 ` Dmitry Baryshkov
2023-07-28 13:23 ` [PATCH 30/33] iris: variant: iris3: add helper for bus and clock calculation Vikash Garodia
2023-07-28 13:23 ` [PATCH 31/33] iris: variant: iris: implement the logic to compute bus bandwidth Vikash Garodia
2023-07-28 18:09 ` Konrad Dybcio
2023-08-14 19:21 ` Dikshita Agarwal
2023-07-28 13:23 ` [PATCH 32/33] iris: variant: iris3: implement logic to compute clock frequency Vikash Garodia
2023-07-28 18:13 ` Konrad Dybcio
2023-08-14 19:25 ` Dikshita Agarwal
2023-07-28 13:23 ` [PATCH 33/33] iris: enable building of iris video driver Vikash Garodia
2023-07-28 14:40 ` Dmitry Baryshkov
2023-07-28 15:25 ` Bryan O'Donoghue
2023-07-28 15:51 ` Dmitry Baryshkov
2023-07-28 13:32 ` [PATCH 00/33] Qualcomm video decoder/encoder driver Dmitry Baryshkov
2023-07-28 17:38 ` Nicolas Dufresne
2023-07-28 14:01 ` Dmitry Baryshkov
2023-08-14 12:58 ` Stanimir Varbanov
2023-08-14 15:00 ` Dmitry Baryshkov
2023-08-24 15:23 ` Vikash Garodia
2023-07-28 14:34 ` Bryan O'Donoghue
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0149fcd0-e64b-f155-05d8-f32a78d7e83b@kernel.org \
--to=krzk@kernel.org \
--cc=agross@kernel.org \
--cc=andersson@kernel.org \
--cc=hans.verkuil@cisco.com \
--cc=konrad.dybcio@linaro.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=quic_dikshita@quicinc.com \
--cc=quic_vgarodia@quicinc.com \
--cc=stanimir.k.varbanov@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox