Message ID | 1537314192-26892-2-git-send-email-vgarodia@codeaurora.org (mailing list archive) |
---|---|
State | Not Applicable, archived |
Delegated to: | Andy Gross |
Headers | show |
Series | Venus updates - PIL | expand |
On Wed, Sep 19, 2018 at 8:43 AM Vikash Garodia <vgarodia@codeaurora.org> wrote: > > Add routine to reset the ARM9 and brings it out of reset. Also > abstract the Venus CPU state handling with a new function. This > is in preparation to add PIL functionality in venus driver. > > Signed-off-by: Vikash Garodia <vgarodia@codeaurora.org> > --- > drivers/media/platform/qcom/venus/core.h | 2 ++ > drivers/media/platform/qcom/venus/firmware.c | 33 ++++++++++++++++++++++++ > drivers/media/platform/qcom/venus/firmware.h | 11 ++++++++ > drivers/media/platform/qcom/venus/hfi_venus.c | 13 +++------- > drivers/media/platform/qcom/venus/hfi_venus_io.h | 7 +++++ > 5 files changed, 57 insertions(+), 9 deletions(-) > > diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h > index 2f02365..dfd5c10 100644 > --- a/drivers/media/platform/qcom/venus/core.h > +++ b/drivers/media/platform/qcom/venus/core.h > @@ -98,6 +98,7 @@ struct venus_caps { > * @dev: convenience struct device pointer > * @dev_dec: convenience struct device pointer for decoder device > * @dev_enc: convenience struct device pointer for encoder device > + * @no_tz: a flag that suggests presence of trustzone Looks like it suggests the absence of trustzone? Actually I would rename it as use_tz and set it if TrustZone is used. This would avoid double-negative statements like what we see below. > * @lock: a lock for this strucure > * @instances: a list_head of all instances > * @insts_count: num of instances > @@ -129,6 +130,7 @@ struct venus_core { > struct device *dev; > struct device *dev_dec; > struct device *dev_enc; > + bool no_tz; > struct mutex lock; > struct list_head instances; > atomic_t insts_count; > diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c > index c4a5778..f2ae2f0 100644 > --- a/drivers/media/platform/qcom/venus/firmware.c > +++ b/drivers/media/platform/qcom/venus/firmware.c > @@ -22,10 +22,43 @@ > #include <linux/sizes.h> > #include <linux/soc/qcom/mdt_loader.h> > > +#include "core.h" > #include "firmware.h" > +#include "hfi_venus_io.h" > > #define VENUS_PAS_ID 9 > #define VENUS_FW_MEM_SIZE (6 * SZ_1M) > +#define VENUS_FW_START_ADDR 0x0 > + > +static void venus_reset_cpu(struct venus_core *core) > +{ > + void __iomem *base = core->base; > + > + writel(0, base + WRAPPER_FW_START_ADDR); > + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_FW_END_ADDR); > + writel(0, base + WRAPPER_CPA_START_ADDR); > + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_CPA_END_ADDR); > + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_NONPIX_START_ADDR); > + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_NONPIX_END_ADDR); > + writel(0x0, base + WRAPPER_CPU_CGC_DIS); > + writel(0x0, base + WRAPPER_CPU_CLOCK_CONFIG); > + > + /* Bring ARM9 out of reset */ > + writel(0, base + WRAPPER_A9SS_SW_RESET); > +} > + > +int venus_set_hw_state(struct venus_core *core, bool resume) > +{ > + if (!core->no_tz) This is the kind of double negative statement I was referring do above: "if we do not not have TrustZone". Turning it into if (core->use_tz) would save the reader a few neurons. :) > + return qcom_scm_set_remote_state(resume, 0); > + > + if (resume) > + venus_reset_cpu(core); > + else > + writel(1, core->base + WRAPPER_A9SS_SW_RESET); > + > + return 0; > +} > > int venus_boot(struct device *dev, const char *fwname) > { > diff --git a/drivers/media/platform/qcom/venus/firmware.h b/drivers/media/platform/qcom/venus/firmware.h > index 428efb5..397570c 100644 > --- a/drivers/media/platform/qcom/venus/firmware.h > +++ b/drivers/media/platform/qcom/venus/firmware.h > @@ -18,5 +18,16 @@ > > int venus_boot(struct device *dev, const char *fwname); > int venus_shutdown(struct device *dev); > +int venus_set_hw_state(struct venus_core *core, bool suspend); > + > +static inline int venus_set_hw_state_suspend(struct venus_core *core) > +{ > + return venus_set_hw_state(core, false); > +} > + > +static inline int venus_set_hw_state_resume(struct venus_core *core) > +{ > + return venus_set_hw_state(core, true); > +} I think these two venus_set_hw_state_suspend() and venus_set_hw_state_resume() are superfluous, if you want to make the state explicit you can also define an enum { SUSPEND, RESUME } to use as argument of venus_set_hw_state() and call it directly. > > #endif > diff --git a/drivers/media/platform/qcom/venus/hfi_venus.c b/drivers/media/platform/qcom/venus/hfi_venus.c > index 1240855..074837e 100644 > --- a/drivers/media/platform/qcom/venus/hfi_venus.c > +++ b/drivers/media/platform/qcom/venus/hfi_venus.c > @@ -19,7 +19,6 @@ > #include <linux/interrupt.h> > #include <linux/iopoll.h> > #include <linux/kernel.h> > -#include <linux/qcom_scm.h> > #include <linux/slab.h> > > #include "core.h" > @@ -27,6 +26,7 @@ > #include "hfi_msgs.h" > #include "hfi_venus.h" > #include "hfi_venus_io.h" > +#include "firmware.h" > > #define HFI_MASK_QHDR_TX_TYPE 0xff000000 > #define HFI_MASK_QHDR_RX_TYPE 0x00ff0000 > @@ -55,11 +55,6 @@ > #define IFACEQ_VAR_LARGE_PKT_SIZE 512 > #define IFACEQ_VAR_HUGE_PKT_SIZE (1024 * 12) > > -enum tzbsp_video_state { > - TZBSP_VIDEO_STATE_SUSPEND = 0, > - TZBSP_VIDEO_STATE_RESUME > -}; > - > struct hfi_queue_table_header { > u32 version; > u32 size; > @@ -575,7 +570,7 @@ static int venus_power_off(struct venus_hfi_device *hdev) > if (!hdev->power_enabled) > return 0; > > - ret = qcom_scm_set_remote_state(TZBSP_VIDEO_STATE_SUSPEND, 0); > + ret = venus_set_hw_state_suspend(hdev->core); > if (ret) > return ret; > > @@ -595,7 +590,7 @@ static int venus_power_on(struct venus_hfi_device *hdev) > if (hdev->power_enabled) > return 0; > > - ret = qcom_scm_set_remote_state(TZBSP_VIDEO_STATE_RESUME, 0); > + ret = venus_set_hw_state_resume(hdev->core); > if (ret) > goto err; > > @@ -608,7 +603,7 @@ static int venus_power_on(struct venus_hfi_device *hdev) > return 0; > > err_suspend: > - qcom_scm_set_remote_state(TZBSP_VIDEO_STATE_SUSPEND, 0); > + venus_set_hw_state_suspend(hdev->core); > err: > hdev->power_enabled = false; > return ret; > diff --git a/drivers/media/platform/qcom/venus/hfi_venus_io.h b/drivers/media/platform/qcom/venus/hfi_venus_io.h > index def0926..d69f51b 100644 > --- a/drivers/media/platform/qcom/venus/hfi_venus_io.h > +++ b/drivers/media/platform/qcom/venus/hfi_venus_io.h > @@ -112,6 +112,13 @@ > #define WRAPPER_CPU_STATUS (WRAPPER_BASE + 0x2014) > #define WRAPPER_CPU_STATUS_WFI BIT(0) > #define WRAPPER_SW_RESET (WRAPPER_BASE + 0x3000) > +#define WRAPPER_CPA_START_ADDR (WRAPPER_BASE + 0x1020) > +#define WRAPPER_CPA_END_ADDR (WRAPPER_BASE + 0x1024) > +#define WRAPPER_FW_START_ADDR (WRAPPER_BASE + 0x1028) > +#define WRAPPER_FW_END_ADDR (WRAPPER_BASE + 0x102C) > +#define WRAPPER_NONPIX_START_ADDR (WRAPPER_BASE + 0x1030) > +#define WRAPPER_NONPIX_END_ADDR (WRAPPER_BASE + 0x1034) > +#define WRAPPER_A9SS_SW_RESET (WRAPPER_BASE + 0x3000) > > /* Venus 4xx */ > #define WRAPPER_VCODEC0_MMCC_POWER_STATUS (WRAPPER_BASE + 0x90) > -- > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > a Linux Foundation Collaborative Project >
Hi Alex, On 09/19/2018 10:32 AM, Alexandre Courbot wrote: > On Wed, Sep 19, 2018 at 8:43 AM Vikash Garodia <vgarodia@codeaurora.org> wrote: >> >> Add routine to reset the ARM9 and brings it out of reset. Also >> abstract the Venus CPU state handling with a new function. This >> is in preparation to add PIL functionality in venus driver. >> >> Signed-off-by: Vikash Garodia <vgarodia@codeaurora.org> >> --- >> drivers/media/platform/qcom/venus/core.h | 2 ++ >> drivers/media/platform/qcom/venus/firmware.c | 33 ++++++++++++++++++++++++ >> drivers/media/platform/qcom/venus/firmware.h | 11 ++++++++ >> drivers/media/platform/qcom/venus/hfi_venus.c | 13 +++------- >> drivers/media/platform/qcom/venus/hfi_venus_io.h | 7 +++++ >> 5 files changed, 57 insertions(+), 9 deletions(-) >> >> diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h >> index 2f02365..dfd5c10 100644 >> --- a/drivers/media/platform/qcom/venus/core.h >> +++ b/drivers/media/platform/qcom/venus/core.h >> @@ -98,6 +98,7 @@ struct venus_caps { >> * @dev: convenience struct device pointer >> * @dev_dec: convenience struct device pointer for decoder device >> * @dev_enc: convenience struct device pointer for encoder device >> + * @no_tz: a flag that suggests presence of trustzone > > Looks like it suggests the absence of trustzone? > > Actually I would rename it as use_tz and set it if TrustZone is used. > This would avoid double-negative statements like what we see below. I find this suggestion reasonable. > >> * @lock: a lock for this strucure >> * @instances: a list_head of all instances >> * @insts_count: num of instances >> @@ -129,6 +130,7 @@ struct venus_core { >> struct device *dev; >> struct device *dev_dec; >> struct device *dev_enc; >> + bool no_tz; >> struct mutex lock; >> struct list_head instances; >> atomic_t insts_count; >> diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c >> index c4a5778..f2ae2f0 100644 >> --- a/drivers/media/platform/qcom/venus/firmware.c >> +++ b/drivers/media/platform/qcom/venus/firmware.c >> @@ -22,10 +22,43 @@ >> #include <linux/sizes.h> >> #include <linux/soc/qcom/mdt_loader.h> >> >> +#include "core.h" >> #include "firmware.h" >> +#include "hfi_venus_io.h" >> >> #define VENUS_PAS_ID 9 >> #define VENUS_FW_MEM_SIZE (6 * SZ_1M) >> +#define VENUS_FW_START_ADDR 0x0 >> + >> +static void venus_reset_cpu(struct venus_core *core) >> +{ >> + void __iomem *base = core->base; >> + >> + writel(0, base + WRAPPER_FW_START_ADDR); >> + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_FW_END_ADDR); >> + writel(0, base + WRAPPER_CPA_START_ADDR); >> + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_CPA_END_ADDR); >> + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_NONPIX_START_ADDR); >> + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_NONPIX_END_ADDR); >> + writel(0x0, base + WRAPPER_CPU_CGC_DIS); >> + writel(0x0, base + WRAPPER_CPU_CLOCK_CONFIG); >> + >> + /* Bring ARM9 out of reset */ >> + writel(0, base + WRAPPER_A9SS_SW_RESET); >> +} >> + >> +int venus_set_hw_state(struct venus_core *core, bool resume) >> +{ >> + if (!core->no_tz) > > This is the kind of double negative statement I was referring do > above: "if we do not not have TrustZone". Turning it into > > if (core->use_tz) > > would save the reader a few neurons. :) > >> + return qcom_scm_set_remote_state(resume, 0); >> + >> + if (resume) >> + venus_reset_cpu(core); >> + else >> + writel(1, core->base + WRAPPER_A9SS_SW_RESET); >> + >> + return 0; >> +} >> >> int venus_boot(struct device *dev, const char *fwname) >> { >> diff --git a/drivers/media/platform/qcom/venus/firmware.h b/drivers/media/platform/qcom/venus/firmware.h >> index 428efb5..397570c 100644 >> --- a/drivers/media/platform/qcom/venus/firmware.h >> +++ b/drivers/media/platform/qcom/venus/firmware.h >> @@ -18,5 +18,16 @@ >> >> int venus_boot(struct device *dev, const char *fwname); >> int venus_shutdown(struct device *dev); >> +int venus_set_hw_state(struct venus_core *core, bool suspend); >> + >> +static inline int venus_set_hw_state_suspend(struct venus_core *core) >> +{ >> + return venus_set_hw_state(core, false); >> +} >> + >> +static inline int venus_set_hw_state_resume(struct venus_core *core) >> +{ >> + return venus_set_hw_state(core, true); >> +} > > I think these two venus_set_hw_state_suspend() and > venus_set_hw_state_resume() are superfluous, if you want to make the > state explicit you can also define an enum { SUSPEND, RESUME } to use > as argument of venus_set_hw_state() and call it directly. Infact this was by my request, and I wanted to avoid enum and have the type of the action in the function name and also avoid one extra function argument. Of course it is a matter of taste.
On 2018-09-19 20:30, Stanimir Varbanov wrote: > Hi Alex, > > On 09/19/2018 10:32 AM, Alexandre Courbot wrote: >> On Wed, Sep 19, 2018 at 8:43 AM Vikash Garodia >> <vgarodia@codeaurora.org> wrote: >>> >>> Add routine to reset the ARM9 and brings it out of reset. Also >>> abstract the Venus CPU state handling with a new function. This >>> is in preparation to add PIL functionality in venus driver. >>> >>> Signed-off-by: Vikash Garodia <vgarodia@codeaurora.org> >>> --- >>> drivers/media/platform/qcom/venus/core.h | 2 ++ >>> drivers/media/platform/qcom/venus/firmware.c | 33 >>> ++++++++++++++++++++++++ >>> drivers/media/platform/qcom/venus/firmware.h | 11 ++++++++ >>> drivers/media/platform/qcom/venus/hfi_venus.c | 13 +++------- >>> drivers/media/platform/qcom/venus/hfi_venus_io.h | 7 +++++ >>> 5 files changed, 57 insertions(+), 9 deletions(-) >>> >>> diff --git a/drivers/media/platform/qcom/venus/core.h >>> b/drivers/media/platform/qcom/venus/core.h >>> index 2f02365..dfd5c10 100644 >>> --- a/drivers/media/platform/qcom/venus/core.h >>> +++ b/drivers/media/platform/qcom/venus/core.h >>> @@ -98,6 +98,7 @@ struct venus_caps { >>> * @dev: convenience struct device pointer >>> * @dev_dec: convenience struct device pointer for decoder device >>> * @dev_enc: convenience struct device pointer for encoder device >>> + * @no_tz: a flag that suggests presence of trustzone >> >> Looks like it suggests the absence of trustzone? >> >> Actually I would rename it as use_tz and set it if TrustZone is used. >> This would avoid double-negative statements like what we see below. > > I find this suggestion reasonable. Initially i planned to keep it as a positive flag. The reason behind keeping it as no_tz was to keep the default value of this flag to 0 indicating tz is present by default. I can switch it to use_tz though and set it in firmware_init after the presence of firmware node is checked. >> >>> * @lock: a lock for this strucure >>> * @instances: a list_head of all instances >>> * @insts_count: num of instances >>> @@ -129,6 +130,7 @@ struct venus_core { >>> struct device *dev; >>> struct device *dev_dec; >>> struct device *dev_enc; >>> + bool no_tz; >>> struct mutex lock; >>> struct list_head instances; >>> atomic_t insts_count; >>> diff --git a/drivers/media/platform/qcom/venus/firmware.c >>> b/drivers/media/platform/qcom/venus/firmware.c >>> index c4a5778..f2ae2f0 100644 >>> --- a/drivers/media/platform/qcom/venus/firmware.c >>> +++ b/drivers/media/platform/qcom/venus/firmware.c >>> @@ -22,10 +22,43 @@ >>> #include <linux/sizes.h> >>> #include <linux/soc/qcom/mdt_loader.h> >>> >>> +#include "core.h" >>> #include "firmware.h" >>> +#include "hfi_venus_io.h" >>> >>> #define VENUS_PAS_ID 9 >>> #define VENUS_FW_MEM_SIZE (6 * SZ_1M) >>> +#define VENUS_FW_START_ADDR 0x0 >>> + >>> +static void venus_reset_cpu(struct venus_core *core) >>> +{ >>> + void __iomem *base = core->base; >>> + >>> + writel(0, base + WRAPPER_FW_START_ADDR); >>> + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_FW_END_ADDR); >>> + writel(0, base + WRAPPER_CPA_START_ADDR); >>> + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_CPA_END_ADDR); >>> + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_NONPIX_START_ADDR); >>> + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_NONPIX_END_ADDR); >>> + writel(0x0, base + WRAPPER_CPU_CGC_DIS); >>> + writel(0x0, base + WRAPPER_CPU_CLOCK_CONFIG); >>> + >>> + /* Bring ARM9 out of reset */ >>> + writel(0, base + WRAPPER_A9SS_SW_RESET); >>> +} >>> + >>> +int venus_set_hw_state(struct venus_core *core, bool resume) >>> +{ >>> + if (!core->no_tz) >> >> This is the kind of double negative statement I was referring do >> above: "if we do not not have TrustZone". Turning it into >> >> if (core->use_tz) >> >> would save the reader a few neurons. :) >> >>> + return qcom_scm_set_remote_state(resume, 0); >>> + >>> + if (resume) >>> + venus_reset_cpu(core); >>> + else >>> + writel(1, core->base + WRAPPER_A9SS_SW_RESET); >>> + >>> + return 0; >>> +} >>> >>> int venus_boot(struct device *dev, const char *fwname) >>> { >>> diff --git a/drivers/media/platform/qcom/venus/firmware.h >>> b/drivers/media/platform/qcom/venus/firmware.h >>> index 428efb5..397570c 100644 >>> --- a/drivers/media/platform/qcom/venus/firmware.h >>> +++ b/drivers/media/platform/qcom/venus/firmware.h >>> @@ -18,5 +18,16 @@ >>> >>> int venus_boot(struct device *dev, const char *fwname); >>> int venus_shutdown(struct device *dev); >>> +int venus_set_hw_state(struct venus_core *core, bool suspend); >>> + >>> +static inline int venus_set_hw_state_suspend(struct venus_core >>> *core) >>> +{ >>> + return venus_set_hw_state(core, false); >>> +} >>> + >>> +static inline int venus_set_hw_state_resume(struct venus_core *core) >>> +{ >>> + return venus_set_hw_state(core, true); >>> +} >> >> I think these two venus_set_hw_state_suspend() and >> venus_set_hw_state_resume() are superfluous, if you want to make the >> state explicit you can also define an enum { SUSPEND, RESUME } to use >> as argument of venus_set_hw_state() and call it directly. > > Infact this was by my request, and I wanted to avoid enum and have the > type of the action in the function name and also avoid one extra > function argument. Of course it is a matter of taste.
On Thu, Sep 20, 2018 at 2:55 AM Vikash Garodia <vgarodia@codeaurora.org> wrote: > > On 2018-09-19 20:30, Stanimir Varbanov wrote: > > Hi Alex, > > > > On 09/19/2018 10:32 AM, Alexandre Courbot wrote: > >> On Wed, Sep 19, 2018 at 8:43 AM Vikash Garodia > >> <vgarodia@codeaurora.org> wrote: > >>> > >>> Add routine to reset the ARM9 and brings it out of reset. Also > >>> abstract the Venus CPU state handling with a new function. This > >>> is in preparation to add PIL functionality in venus driver. > >>> > >>> Signed-off-by: Vikash Garodia <vgarodia@codeaurora.org> > >>> --- > >>> drivers/media/platform/qcom/venus/core.h | 2 ++ > >>> drivers/media/platform/qcom/venus/firmware.c | 33 > >>> ++++++++++++++++++++++++ > >>> drivers/media/platform/qcom/venus/firmware.h | 11 ++++++++ > >>> drivers/media/platform/qcom/venus/hfi_venus.c | 13 +++------- > >>> drivers/media/platform/qcom/venus/hfi_venus_io.h | 7 +++++ > >>> 5 files changed, 57 insertions(+), 9 deletions(-) > >>> > >>> diff --git a/drivers/media/platform/qcom/venus/core.h > >>> b/drivers/media/platform/qcom/venus/core.h > >>> index 2f02365..dfd5c10 100644 > >>> --- a/drivers/media/platform/qcom/venus/core.h > >>> +++ b/drivers/media/platform/qcom/venus/core.h > >>> @@ -98,6 +98,7 @@ struct venus_caps { > >>> * @dev: convenience struct device pointer > >>> * @dev_dec: convenience struct device pointer for decoder device > >>> * @dev_enc: convenience struct device pointer for encoder device > >>> + * @no_tz: a flag that suggests presence of trustzone > >> > >> Looks like it suggests the absence of trustzone? > >> > >> Actually I would rename it as use_tz and set it if TrustZone is used. > >> This would avoid double-negative statements like what we see below. > > > > I find this suggestion reasonable. > > Initially i planned to keep it as a positive flag. The reason behind > keeping it > as no_tz was to keep the default value of this flag to 0 indicating tz > is present > by default. > I can switch it to use_tz though and set it in firmware_init after the > presence of > firmware node is checked. Making sure the flag is explicitly initialized instead of relying on default initialization is another good reason to have that change IMHO. :) > > >> > >>> * @lock: a lock for this strucure > >>> * @instances: a list_head of all instances > >>> * @insts_count: num of instances > >>> @@ -129,6 +130,7 @@ struct venus_core { > >>> struct device *dev; > >>> struct device *dev_dec; > >>> struct device *dev_enc; > >>> + bool no_tz; > >>> struct mutex lock; > >>> struct list_head instances; > >>> atomic_t insts_count; > >>> diff --git a/drivers/media/platform/qcom/venus/firmware.c > >>> b/drivers/media/platform/qcom/venus/firmware.c > >>> index c4a5778..f2ae2f0 100644 > >>> --- a/drivers/media/platform/qcom/venus/firmware.c > >>> +++ b/drivers/media/platform/qcom/venus/firmware.c > >>> @@ -22,10 +22,43 @@ > >>> #include <linux/sizes.h> > >>> #include <linux/soc/qcom/mdt_loader.h> > >>> > >>> +#include "core.h" > >>> #include "firmware.h" > >>> +#include "hfi_venus_io.h" > >>> > >>> #define VENUS_PAS_ID 9 > >>> #define VENUS_FW_MEM_SIZE (6 * SZ_1M) > >>> +#define VENUS_FW_START_ADDR 0x0 > >>> + > >>> +static void venus_reset_cpu(struct venus_core *core) > >>> +{ > >>> + void __iomem *base = core->base; > >>> + > >>> + writel(0, base + WRAPPER_FW_START_ADDR); > >>> + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_FW_END_ADDR); > >>> + writel(0, base + WRAPPER_CPA_START_ADDR); > >>> + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_CPA_END_ADDR); > >>> + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_NONPIX_START_ADDR); > >>> + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_NONPIX_END_ADDR); > >>> + writel(0x0, base + WRAPPER_CPU_CGC_DIS); > >>> + writel(0x0, base + WRAPPER_CPU_CLOCK_CONFIG); > >>> + > >>> + /* Bring ARM9 out of reset */ > >>> + writel(0, base + WRAPPER_A9SS_SW_RESET); > >>> +} > >>> + > >>> +int venus_set_hw_state(struct venus_core *core, bool resume) > >>> +{ > >>> + if (!core->no_tz) > >> > >> This is the kind of double negative statement I was referring do > >> above: "if we do not not have TrustZone". Turning it into > >> > >> if (core->use_tz) > >> > >> would save the reader a few neurons. :) > >> > >>> + return qcom_scm_set_remote_state(resume, 0); > >>> + > >>> + if (resume) > >>> + venus_reset_cpu(core); > >>> + else > >>> + writel(1, core->base + WRAPPER_A9SS_SW_RESET); > >>> + > >>> + return 0; > >>> +} > >>> > >>> int venus_boot(struct device *dev, const char *fwname) > >>> { > >>> diff --git a/drivers/media/platform/qcom/venus/firmware.h > >>> b/drivers/media/platform/qcom/venus/firmware.h > >>> index 428efb5..397570c 100644 > >>> --- a/drivers/media/platform/qcom/venus/firmware.h > >>> +++ b/drivers/media/platform/qcom/venus/firmware.h > >>> @@ -18,5 +18,16 @@ > >>> > >>> int venus_boot(struct device *dev, const char *fwname); > >>> int venus_shutdown(struct device *dev); > >>> +int venus_set_hw_state(struct venus_core *core, bool suspend); > >>> + > >>> +static inline int venus_set_hw_state_suspend(struct venus_core > >>> *core) > >>> +{ > >>> + return venus_set_hw_state(core, false); > >>> +} > >>> + > >>> +static inline int venus_set_hw_state_resume(struct venus_core *core) > >>> +{ > >>> + return venus_set_hw_state(core, true); > >>> +} > >> > >> I think these two venus_set_hw_state_suspend() and > >> venus_set_hw_state_resume() are superfluous, if you want to make the > >> state explicit you can also define an enum { SUSPEND, RESUME } to use > >> as argument of venus_set_hw_state() and call it directly. > > > > Infact this was by my request, and I wanted to avoid enum and have the > > type of the action in the function name and also avoid one extra > > function argument. Of course it is a matter of taste. That's reasonable as well. I really don't feel strongly about this, so please feel free to keep it as it is.
Hi, On 09/20/2018 06:31 AM, Alexandre Courbot wrote: > On Thu, Sep 20, 2018 at 2:55 AM Vikash Garodia <vgarodia@codeaurora.org> wrote: >> >> On 2018-09-19 20:30, Stanimir Varbanov wrote: >>> Hi Alex, >>> >>> On 09/19/2018 10:32 AM, Alexandre Courbot wrote: >>>> On Wed, Sep 19, 2018 at 8:43 AM Vikash Garodia >>>> <vgarodia@codeaurora.org> wrote: >>>>> >>>>> Add routine to reset the ARM9 and brings it out of reset. Also >>>>> abstract the Venus CPU state handling with a new function. This >>>>> is in preparation to add PIL functionality in venus driver. >>>>> >>>>> Signed-off-by: Vikash Garodia <vgarodia@codeaurora.org> >>>>> --- >>>>> drivers/media/platform/qcom/venus/core.h | 2 ++ >>>>> drivers/media/platform/qcom/venus/firmware.c | 33 >>>>> ++++++++++++++++++++++++ >>>>> drivers/media/platform/qcom/venus/firmware.h | 11 ++++++++ >>>>> drivers/media/platform/qcom/venus/hfi_venus.c | 13 +++------- >>>>> drivers/media/platform/qcom/venus/hfi_venus_io.h | 7 +++++ >>>>> 5 files changed, 57 insertions(+), 9 deletions(-) >>>>> >>>>> diff --git a/drivers/media/platform/qcom/venus/core.h >>>>> b/drivers/media/platform/qcom/venus/core.h >>>>> index 2f02365..dfd5c10 100644 >>>>> --- a/drivers/media/platform/qcom/venus/core.h >>>>> +++ b/drivers/media/platform/qcom/venus/core.h >>>>> @@ -98,6 +98,7 @@ struct venus_caps { >>>>> * @dev: convenience struct device pointer >>>>> * @dev_dec: convenience struct device pointer for decoder device >>>>> * @dev_enc: convenience struct device pointer for encoder device >>>>> + * @no_tz: a flag that suggests presence of trustzone >>>> >>>> Looks like it suggests the absence of trustzone? >>>> >>>> Actually I would rename it as use_tz and set it if TrustZone is used. >>>> This would avoid double-negative statements like what we see below. >>> >>> I find this suggestion reasonable. >> >> Initially i planned to keep it as a positive flag. The reason behind >> keeping it >> as no_tz was to keep the default value of this flag to 0 indicating tz >> is present >> by default. >> I can switch it to use_tz though and set it in firmware_init after the >> presence of >> firmware node is checked. > > Making sure the flag is explicitly initialized instead of relying on > default initialization is another good reason to have that change > IMHO. :) Vikash, care to send a new version, or will fix that with follow up patches?
Hi Stanimir, On 2018-10-01 20:00, Stanimir Varbanov wrote: > Hi, > > On 09/20/2018 06:31 AM, Alexandre Courbot wrote: >> On Thu, Sep 20, 2018 at 2:55 AM Vikash Garodia >> <vgarodia@codeaurora.org> wrote: >>> >>> On 2018-09-19 20:30, Stanimir Varbanov wrote: >>>> Hi Alex, >>>> >>>> On 09/19/2018 10:32 AM, Alexandre Courbot wrote: >>>>> On Wed, Sep 19, 2018 at 8:43 AM Vikash Garodia >>>>> <vgarodia@codeaurora.org> wrote: >>>>>> >>>>>> Add routine to reset the ARM9 and brings it out of reset. Also >>>>>> abstract the Venus CPU state handling with a new function. This >>>>>> is in preparation to add PIL functionality in venus driver. >>>>>> >>>>>> Signed-off-by: Vikash Garodia <vgarodia@codeaurora.org> >>>>>> --- >>>>>> drivers/media/platform/qcom/venus/core.h | 2 ++ >>>>>> drivers/media/platform/qcom/venus/firmware.c | 33 >>>>>> ++++++++++++++++++++++++ >>>>>> drivers/media/platform/qcom/venus/firmware.h | 11 ++++++++ >>>>>> drivers/media/platform/qcom/venus/hfi_venus.c | 13 +++------- >>>>>> drivers/media/platform/qcom/venus/hfi_venus_io.h | 7 +++++ >>>>>> 5 files changed, 57 insertions(+), 9 deletions(-) >>>>>> >>>>>> diff --git a/drivers/media/platform/qcom/venus/core.h >>>>>> b/drivers/media/platform/qcom/venus/core.h >>>>>> index 2f02365..dfd5c10 100644 >>>>>> --- a/drivers/media/platform/qcom/venus/core.h >>>>>> +++ b/drivers/media/platform/qcom/venus/core.h >>>>>> @@ -98,6 +98,7 @@ struct venus_caps { >>>>>> * @dev: convenience struct device pointer >>>>>> * @dev_dec: convenience struct device pointer for decoder >>>>>> device >>>>>> * @dev_enc: convenience struct device pointer for encoder >>>>>> device >>>>>> + * @no_tz: a flag that suggests presence of trustzone >>>>> >>>>> Looks like it suggests the absence of trustzone? >>>>> >>>>> Actually I would rename it as use_tz and set it if TrustZone is >>>>> used. >>>>> This would avoid double-negative statements like what we see below. >>>> >>>> I find this suggestion reasonable. >>> >>> Initially i planned to keep it as a positive flag. The reason behind >>> keeping it >>> as no_tz was to keep the default value of this flag to 0 indicating >>> tz >>> is present >>> by default. >>> I can switch it to use_tz though and set it in firmware_init after >>> the >>> presence of >>> firmware node is checked. >> >> Making sure the flag is explicitly initialized instead of relying on >> default initialization is another good reason to have that change >> IMHO. :) > > Vikash, care to send a new version, or will fix that with follow up > patches? I will provide a new series with the suggested change. Thanks, Vikash
diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h index 2f02365..dfd5c10 100644 --- a/drivers/media/platform/qcom/venus/core.h +++ b/drivers/media/platform/qcom/venus/core.h @@ -98,6 +98,7 @@ struct venus_caps { * @dev: convenience struct device pointer * @dev_dec: convenience struct device pointer for decoder device * @dev_enc: convenience struct device pointer for encoder device + * @no_tz: a flag that suggests presence of trustzone * @lock: a lock for this strucure * @instances: a list_head of all instances * @insts_count: num of instances @@ -129,6 +130,7 @@ struct venus_core { struct device *dev; struct device *dev_dec; struct device *dev_enc; + bool no_tz; struct mutex lock; struct list_head instances; atomic_t insts_count; diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c index c4a5778..f2ae2f0 100644 --- a/drivers/media/platform/qcom/venus/firmware.c +++ b/drivers/media/platform/qcom/venus/firmware.c @@ -22,10 +22,43 @@ #include <linux/sizes.h> #include <linux/soc/qcom/mdt_loader.h> +#include "core.h" #include "firmware.h" +#include "hfi_venus_io.h" #define VENUS_PAS_ID 9 #define VENUS_FW_MEM_SIZE (6 * SZ_1M) +#define VENUS_FW_START_ADDR 0x0 + +static void venus_reset_cpu(struct venus_core *core) +{ + void __iomem *base = core->base; + + writel(0, base + WRAPPER_FW_START_ADDR); + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_FW_END_ADDR); + writel(0, base + WRAPPER_CPA_START_ADDR); + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_CPA_END_ADDR); + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_NONPIX_START_ADDR); + writel(VENUS_FW_MEM_SIZE, base + WRAPPER_NONPIX_END_ADDR); + writel(0x0, base + WRAPPER_CPU_CGC_DIS); + writel(0x0, base + WRAPPER_CPU_CLOCK_CONFIG); + + /* Bring ARM9 out of reset */ + writel(0, base + WRAPPER_A9SS_SW_RESET); +} + +int venus_set_hw_state(struct venus_core *core, bool resume) +{ + if (!core->no_tz) + return qcom_scm_set_remote_state(resume, 0); + + if (resume) + venus_reset_cpu(core); + else + writel(1, core->base + WRAPPER_A9SS_SW_RESET); + + return 0; +} int venus_boot(struct device *dev, const char *fwname) { diff --git a/drivers/media/platform/qcom/venus/firmware.h b/drivers/media/platform/qcom/venus/firmware.h index 428efb5..397570c 100644 --- a/drivers/media/platform/qcom/venus/firmware.h +++ b/drivers/media/platform/qcom/venus/firmware.h @@ -18,5 +18,16 @@ int venus_boot(struct device *dev, const char *fwname); int venus_shutdown(struct device *dev); +int venus_set_hw_state(struct venus_core *core, bool suspend); + +static inline int venus_set_hw_state_suspend(struct venus_core *core) +{ + return venus_set_hw_state(core, false); +} + +static inline int venus_set_hw_state_resume(struct venus_core *core) +{ + return venus_set_hw_state(core, true); +} #endif diff --git a/drivers/media/platform/qcom/venus/hfi_venus.c b/drivers/media/platform/qcom/venus/hfi_venus.c index 1240855..074837e 100644 --- a/drivers/media/platform/qcom/venus/hfi_venus.c +++ b/drivers/media/platform/qcom/venus/hfi_venus.c @@ -19,7 +19,6 @@ #include <linux/interrupt.h> #include <linux/iopoll.h> #include <linux/kernel.h> -#include <linux/qcom_scm.h> #include <linux/slab.h> #include "core.h" @@ -27,6 +26,7 @@ #include "hfi_msgs.h" #include "hfi_venus.h" #include "hfi_venus_io.h" +#include "firmware.h" #define HFI_MASK_QHDR_TX_TYPE 0xff000000 #define HFI_MASK_QHDR_RX_TYPE 0x00ff0000 @@ -55,11 +55,6 @@ #define IFACEQ_VAR_LARGE_PKT_SIZE 512 #define IFACEQ_VAR_HUGE_PKT_SIZE (1024 * 12) -enum tzbsp_video_state { - TZBSP_VIDEO_STATE_SUSPEND = 0, - TZBSP_VIDEO_STATE_RESUME -}; - struct hfi_queue_table_header { u32 version; u32 size; @@ -575,7 +570,7 @@ static int venus_power_off(struct venus_hfi_device *hdev) if (!hdev->power_enabled) return 0; - ret = qcom_scm_set_remote_state(TZBSP_VIDEO_STATE_SUSPEND, 0); + ret = venus_set_hw_state_suspend(hdev->core); if (ret) return ret; @@ -595,7 +590,7 @@ static int venus_power_on(struct venus_hfi_device *hdev) if (hdev->power_enabled) return 0; - ret = qcom_scm_set_remote_state(TZBSP_VIDEO_STATE_RESUME, 0); + ret = venus_set_hw_state_resume(hdev->core); if (ret) goto err; @@ -608,7 +603,7 @@ static int venus_power_on(struct venus_hfi_device *hdev) return 0; err_suspend: - qcom_scm_set_remote_state(TZBSP_VIDEO_STATE_SUSPEND, 0); + venus_set_hw_state_suspend(hdev->core); err: hdev->power_enabled = false; return ret; diff --git a/drivers/media/platform/qcom/venus/hfi_venus_io.h b/drivers/media/platform/qcom/venus/hfi_venus_io.h index def0926..d69f51b 100644 --- a/drivers/media/platform/qcom/venus/hfi_venus_io.h +++ b/drivers/media/platform/qcom/venus/hfi_venus_io.h @@ -112,6 +112,13 @@ #define WRAPPER_CPU_STATUS (WRAPPER_BASE + 0x2014) #define WRAPPER_CPU_STATUS_WFI BIT(0) #define WRAPPER_SW_RESET (WRAPPER_BASE + 0x3000) +#define WRAPPER_CPA_START_ADDR (WRAPPER_BASE + 0x1020) +#define WRAPPER_CPA_END_ADDR (WRAPPER_BASE + 0x1024) +#define WRAPPER_FW_START_ADDR (WRAPPER_BASE + 0x1028) +#define WRAPPER_FW_END_ADDR (WRAPPER_BASE + 0x102C) +#define WRAPPER_NONPIX_START_ADDR (WRAPPER_BASE + 0x1030) +#define WRAPPER_NONPIX_END_ADDR (WRAPPER_BASE + 0x1034) +#define WRAPPER_A9SS_SW_RESET (WRAPPER_BASE + 0x3000) /* Venus 4xx */ #define WRAPPER_VCODEC0_MMCC_POWER_STATUS (WRAPPER_BASE + 0x90)
Add routine to reset the ARM9 and brings it out of reset. Also abstract the Venus CPU state handling with a new function. This is in preparation to add PIL functionality in venus driver. Signed-off-by: Vikash Garodia <vgarodia@codeaurora.org> --- drivers/media/platform/qcom/venus/core.h | 2 ++ drivers/media/platform/qcom/venus/firmware.c | 33 ++++++++++++++++++++++++ drivers/media/platform/qcom/venus/firmware.h | 11 ++++++++ drivers/media/platform/qcom/venus/hfi_venus.c | 13 +++------- drivers/media/platform/qcom/venus/hfi_venus_io.h | 7 +++++ 5 files changed, 57 insertions(+), 9 deletions(-)