diff mbox series

[v1,5/9] firmware: keembay: Add support for Trusted Firmware Service call

Message ID 20210114152700.21916-6-muhammad.husaini.zulkifli@intel.com
State New
Headers show
Series None | expand

Commit Message

Zulkifli, Muhammad Husaini Jan. 14, 2021, 3:26 p.m. UTC
Export inline function to encapsulate AON_CFG1 for controling the I/O Rail
supplied voltage levels which communicate with Trusted Firmware.

Signed-off-by: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com>
Acked-by: Andy Shevchenko <andriy.shevchenko@intel.com>
---
 include/linux/firmware/intel/keembay.h | 82 ++++++++++++++++++++++++++
 1 file changed, 82 insertions(+)
 create mode 100644 include/linux/firmware/intel/keembay.h

Comments

Sudeep Holla Jan. 15, 2021, 6:58 p.m. UTC | #1
On Thu, Jan 14, 2021 at 04:48:11PM +0000, Mark Brown wrote:
> On Thu, Jan 14, 2021 at 11:26:56PM +0800, Muhammad Husaini Zulkifli wrote:
> > Export inline function to encapsulate AON_CFG1 for controling the I/O Rail
> > supplied voltage levels which communicate with Trusted Firmware.
>
> Adding Sudeep for the SMCCC bits, not deleting any context for his
> benefit.
>

Thanks Mark for cc-ing me and joining the dots. I completely forgot about
that fact that this platform was using SCMI using SMC as transport. Sorry
for that and it is my fault. I did review the SCMI/SMC support for this
platform sometime in June/July last year and forgot the fact it is same
platform when voltage/regulator support patches for SD/MMC was posted
sometime later last year. I concentrated on SMCCC conventions and other
details.

[...]

> > +#define ARM_SMCCC_SIP_KEEMBAY_SET_SD_VOLTAGE		\
> > +	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,		\
> > +			   ARM_SMCCC_SMC_32,		\
> > +			   ARM_SMCCC_OWNER_SIP,		\
> > +			   KEEMBAY_SET_SD_VOLTAGE_ID)
> > +
> > +#define ARM_SMCCC_SIP_KEEMBAY_GET_SD_VOLTAGE		\
> > +	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,		\
> > +			   ARM_SMCCC_SMC_32,		\
> > +			   ARM_SMCCC_OWNER_SIP,		\
> > +			   KEEMBAY_GET_SD_VOLTAGE_ID)
> > +
> > +#define KEEMBAY_REG_NUM_CONSUMERS 2
> > +
> > +struct keembay_reg_supply {
> > +	struct regulator *consumer;
> > +};
> > +
> > +#if IS_ENABLED(CONFIG_HAVE_ARM_SMCCC_DISCOVERY)
> > +/*
> > + * Voltage applied on the IO Rail is controlled from the Always On Register using specific
> > + * bits in AON_CGF1 register. This is a secure register. Keem Bay SOC cannot exposed this
> > + * register address to the outside world.
> > + */
> > +static inline int keembay_set_io_rail_supplied_voltage(int volt)
> > +{
> > +	struct arm_smccc_res res;
> > +
> > +	arm_smccc_1_1_invoke(ARM_SMCCC_SIP_KEEMBAY_SET_SD_VOLTAGE, volt, &res);
>
> There is a SCMI voltage domain protocol intended for just this use case
> of controlling regulators managed by the firmware, why are you not using
> that for these systems?  See drivers/firmware/arm_scmi/voltage.c.
>

Indeed. Please switch to using the new voltage protocol added for this without
any extra code. You just need to wire up DT for this.

Just for curiosity, where is SCMI platform firmware implemented ? On Cortex-A,
secure side or external processor. Does this platform run TF-A ?

--
Regards,
Sudeep
Mark Brown Jan. 18, 2021, 11:19 a.m. UTC | #2
On Mon, Jan 18, 2021 at 10:28:33AM +0000, Zulkifli, Muhammad Husaini wrote:

> >> There is a SCMI voltage domain protocol intended for just this use
> >> case of controlling regulators managed by the firmware, why are you
> >> not using that for these systems?  See drivers/firmware/arm_scmi/voltage.c.

> From mmc maintainer's perspective, I should use the common modelling either using 
> regulator framework or pinctrl to perform voltage operation. Not just directly invoke 
> smccc call in the mmc driver. That is why I came up with this regulator driver to perform 
> voltage operation. 

The above is a standard way of controlling regulators via SMCCC which
already has a regulator driver, you're duplicating this functionality.

> >Indeed. Please switch to using the new voltage protocol added for this without
> >any extra code. You just need to wire up DT for this.

> May I know even if I wire up the DT, how should I call this from the mmc driver
> For set/get voltage operation? Any example?

There's one in the binding document for the driver.
Sudeep Holla Jan. 18, 2021, 11:55 a.m. UTC | #3
On Mon, Jan 18, 2021 at 10:28:33AM +0000, Zulkifli, Muhammad Husaini wrote:
> Hi Sudeep and Mark,

> 

> Thanks for the review. I replied inline.

> 

> >-----Original Message-----

> >From: Sudeep Holla <sudeep.holla@arm.com>

> >Sent: Saturday, January 16, 2021 2:58 AM

> >To: Mark Brown <broonie@kernel.org>

> >Cc: Zulkifli, Muhammad Husaini <muhammad.husaini.zulkifli@intel.com>;

> >ulf.hansson@linaro.org; lgirdwood@gmail.com; robh+dt@kernel.org;

> >devicetree@vger.kernel.org; Hunter, Adrian <adrian.hunter@intel.com>;

> >michal.simek@xilinx.com; linux-mmc@vger.kernel.org; linux-

> >kernel@vger.kernel.org; Shevchenko, Andriy

> ><andriy.shevchenko@intel.com>; A, Rashmi <rashmi.a@intel.com>; Vaidya,

> >Mahesh R <mahesh.r.vaidya@intel.com>; Sudeep Holla

> ><sudeep.holla@arm.com>

> >Subject: Re: [PATCH v1 5/9] firmware: keembay: Add support for Trusted

> >Firmware Service call

> >

> >On Thu, Jan 14, 2021 at 04:48:11PM +0000, Mark Brown wrote:

> >> On Thu, Jan 14, 2021 at 11:26:56PM +0800, Muhammad Husaini Zulkifli

> >wrote:

> >> > Export inline function to encapsulate AON_CFG1 for controling the

> >> > I/O Rail supplied voltage levels which communicate with Trusted Firmware.

> >>

> >> Adding Sudeep for the SMCCC bits, not deleting any context for his

> >> benefit.

> >>

> >

> >Thanks Mark for cc-ing me and joining the dots. I completely forgot about that

> >fact that this platform was using SCMI using SMC as transport. Sorry for that and

> >it is my fault. I did review the SCMI/SMC support for this platform sometime in

> >June/July last year and forgot the fact it is same platform when

> >voltage/regulator support patches for SD/MMC was posted sometime later last

> >year. I concentrated on SMCCC conventions and other details.

> 

> Yes Sudeep. I redesigned the way I handle the smccc call. Previously it was handled directly in mmc driver.

> After few discussion, we conclude to create an abstraction using regulator framework to encapsulate this smccc call

> during set voltage operation. Using standard abstraction will make things easier for the maintainer.

> 

> >

> >[...]

> >

> >> > +#define ARM_SMCCC_SIP_KEEMBAY_SET_SD_VOLTAGE		\

> >> > +	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,		\

> >> > +			   ARM_SMCCC_SMC_32,		\

> >> > +			   ARM_SMCCC_OWNER_SIP,		\

> >> > +			   KEEMBAY_SET_SD_VOLTAGE_ID)

> >> > +

> >> > +#define ARM_SMCCC_SIP_KEEMBAY_GET_SD_VOLTAGE		\

> >> > +	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,		\

> >> > +			   ARM_SMCCC_SMC_32,		\

> >> > +			   ARM_SMCCC_OWNER_SIP,		\

> >> > +			   KEEMBAY_GET_SD_VOLTAGE_ID)

> >> > +

> >> > +#define KEEMBAY_REG_NUM_CONSUMERS 2

> >> > +

> >> > +struct keembay_reg_supply {

> >> > +	struct regulator *consumer;

> >> > +};

> >> > +

> >> > +#if IS_ENABLED(CONFIG_HAVE_ARM_SMCCC_DISCOVERY)

> >> > +/*

> >> > + * Voltage applied on the IO Rail is controlled from the Always On

> >> > +Register using specific

> >> > + * bits in AON_CGF1 register. This is a secure register. Keem Bay

> >> > +SOC cannot exposed this

> >> > + * register address to the outside world.

> >> > + */

> >> > +static inline int keembay_set_io_rail_supplied_voltage(int volt) {

> >> > +	struct arm_smccc_res res;

> >> > +

> >> > +

> >	arm_smccc_1_1_invoke(ARM_SMCCC_SIP_KEEMBAY_SET_SD_VOLTA

> >GE, volt,

> >> > +&res);

> >>

> >> There is a SCMI voltage domain protocol intended for just this use

> >> case of controlling regulators managed by the firmware, why are you

> >> not using that for these systems?  See drivers/firmware/arm_scmi/voltage.c.

> 

> From mmc maintainer's perspective, I should use the common modelling either

> using regulator framework or pinctrl to perform voltage operation. Not just

> directly invoke  smccc call in the mmc driver. That is why I came up with

> this regulator driver to perform voltage operation.

>


That's correct. Since the platform uses SCMI and SCMI spec[1] supports Voltage
protocol and there is upstream driver[2] to support it, I see no point in
duplicating the support with another custom/non-standard solution.

> >>

> >

> >Indeed. Please switch to using the new voltage protocol added for this without

> >any extra code. You just need to wire up DT for this.

> 

> May I know even if I wire up the DT, how should I call this from the mmc driver

> For set/get voltage operation? Any example?

>


Mark has already pointed you to the binding document[3]

> >

> >Just for curiosity, where is SCMI platform firmware implemented ? On Cortex-

> >A, secure side or external processor. Does this platform run TF-A ?

> 

> The KMB SCMI framework is implemented in secure runtime firmware (TF-A BL31). 

> Hopefully I am answering your question.

>


Yes, it should be easy to extend the implementation and add support for
voltage protocol.

If you still face any issues, please ask any queries on the list cc-ing
me and Cristian Marussi(cc-ed)

--
Regards,
Sudeep

[1] https://developer.arm.com/documentation/den0056/latest
[2] drivers/firmware/arm_scmi/voltage.c + drivers/regulator/scmi-regulator.c
[3] Documentation/devicetree/bindings/arm/arm,scmi.txt
Cristian Marussi Jan. 18, 2021, 12:01 p.m. UTC | #4
Hi 

sorry I'm a bit late on this.

On Mon, Jan 18, 2021 at 10:28:33AM +0000, Zulkifli, Muhammad Husaini wrote:
> Hi Sudeep and Mark,

> 

> Thanks for the review. I replied inline.

> 

> >-----Original Message-----

> >From: Sudeep Holla <sudeep.holla@arm.com>

> >Sent: Saturday, January 16, 2021 2:58 AM

> >To: Mark Brown <broonie@kernel.org>

> >Cc: Zulkifli, Muhammad Husaini <muhammad.husaini.zulkifli@intel.com>;

> >ulf.hansson@linaro.org; lgirdwood@gmail.com; robh+dt@kernel.org;

> >devicetree@vger.kernel.org; Hunter, Adrian <adrian.hunter@intel.com>;

> >michal.simek@xilinx.com; linux-mmc@vger.kernel.org; linux-

> >kernel@vger.kernel.org; Shevchenko, Andriy

> ><andriy.shevchenko@intel.com>; A, Rashmi <rashmi.a@intel.com>; Vaidya,

> >Mahesh R <mahesh.r.vaidya@intel.com>; Sudeep Holla

> ><sudeep.holla@arm.com>

> >Subject: Re: [PATCH v1 5/9] firmware: keembay: Add support for Trusted

> >Firmware Service call

> >

> >On Thu, Jan 14, 2021 at 04:48:11PM +0000, Mark Brown wrote:

> >> On Thu, Jan 14, 2021 at 11:26:56PM +0800, Muhammad Husaini Zulkifli

> >wrote:

> >> > Export inline function to encapsulate AON_CFG1 for controling the

> >> > I/O Rail supplied voltage levels which communicate with Trusted Firmware.

> >>

> >> Adding Sudeep for the SMCCC bits, not deleting any context for his

> >> benefit.

> >>

> >

> >Thanks Mark for cc-ing me and joining the dots. I completely forgot about that

> >fact that this platform was using SCMI using SMC as transport. Sorry for that and

> >it is my fault. I did review the SCMI/SMC support for this platform sometime in

> >June/July last year and forgot the fact it is same platform when

> >voltage/regulator support patches for SD/MMC was posted sometime later last

> >year. I concentrated on SMCCC conventions and other details.

> 

> Yes Sudeep. I redesigned the way I handle the smccc call. Previously it was handled directly in mmc driver.

> After few discussion, we conclude to create an abstraction using regulator framework to encapsulate this smccc call

> during set voltage operation. Using standard abstraction will make things easier for the maintainer.

> 

> >

> >[...]

> >

> >> > +#define ARM_SMCCC_SIP_KEEMBAY_SET_SD_VOLTAGE		\

> >> > +	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,		\

> >> > +			   ARM_SMCCC_SMC_32,		\

> >> > +			   ARM_SMCCC_OWNER_SIP,		\

> >> > +			   KEEMBAY_SET_SD_VOLTAGE_ID)

> >> > +

> >> > +#define ARM_SMCCC_SIP_KEEMBAY_GET_SD_VOLTAGE		\

> >> > +	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,		\

> >> > +			   ARM_SMCCC_SMC_32,		\

> >> > +			   ARM_SMCCC_OWNER_SIP,		\

> >> > +			   KEEMBAY_GET_SD_VOLTAGE_ID)

> >> > +

> >> > +#define KEEMBAY_REG_NUM_CONSUMERS 2

> >> > +

> >> > +struct keembay_reg_supply {

> >> > +	struct regulator *consumer;

> >> > +};

> >> > +

> >> > +#if IS_ENABLED(CONFIG_HAVE_ARM_SMCCC_DISCOVERY)

> >> > +/*

> >> > + * Voltage applied on the IO Rail is controlled from the Always On

> >> > +Register using specific

> >> > + * bits in AON_CGF1 register. This is a secure register. Keem Bay

> >> > +SOC cannot exposed this

> >> > + * register address to the outside world.

> >> > + */

> >> > +static inline int keembay_set_io_rail_supplied_voltage(int volt) {

> >> > +	struct arm_smccc_res res;

> >> > +

> >> > +

> >	arm_smccc_1_1_invoke(ARM_SMCCC_SIP_KEEMBAY_SET_SD_VOLTA

> >GE, volt,

> >> > +&res);

> >>

> >> There is a SCMI voltage domain protocol intended for just this use

> >> case of controlling regulators managed by the firmware, why are you

> >> not using that for these systems?  See drivers/firmware/arm_scmi/voltage.c.

> 

> From mmc maintainer's perspective, I should use the common modelling either using 

> regulator framework or pinctrl to perform voltage operation. Not just directly invoke 

> smccc call in the mmc driver. That is why I came up with this regulator driver to perform 

> voltage operation. 

> 


There is an SCMI regulator driver built on top of SCMIv3.0 Voltage Domain
Protocol, so as long as your SCMI platform firmware support the new VD
protocol you should be able to wire up a generic SCMI regulator in the DT
(as described in the arm,scmi.txt bindings) and then just use the usual
regulator framework ops with such SCMI regulator without the need to add
a custom regulator using custom SMCCC calls).

Thanks

Cristian

> >>

> >

> >Indeed. Please switch to using the new voltage protocol added for this without

> >any extra code. You just need to wire up DT for this.

> 

> May I know even if I wire up the DT, how should I call this from the mmc driver

> For set/get voltage operation? Any example?

> 

> >

> >Just for curiosity, where is SCMI platform firmware implemented ? On Cortex-

> >A, secure side or external processor. Does this platform run TF-A ?

> 

> The KMB SCMI framework is implemented in secure runtime firmware (TF-A BL31). 

> Hopefully I am answering your question.

> 

> >

> >--

> >Regards,

> >Sudeep
Zulkifli, Muhammad Husaini Jan. 19, 2021, 2:38 a.m. UTC | #5
Hi Cristian, Sudeep and Mark,

>-----Original Message-----

>From: Cristian Marussi <cristian.marussi@arm.com>

>Sent: Monday, January 18, 2021 8:02 PM

>To: Zulkifli, Muhammad Husaini <muhammad.husaini.zulkifli@intel.com>

>Cc: Sudeep Holla <sudeep.holla@arm.com>; Mark Brown

><broonie@kernel.org>; ulf.hansson@linaro.org; lgirdwood@gmail.com;

>robh+dt@kernel.org; devicetree@vger.kernel.org; Hunter, Adrian

><adrian.hunter@intel.com>; michal.simek@xilinx.com; linux-

>mmc@vger.kernel.org; linux-kernel@vger.kernel.org; Shevchenko, Andriy

><andriy.shevchenko@intel.com>; A, Rashmi <rashmi.a@intel.com>; Vaidya,

>Mahesh R <mahesh.r.vaidya@intel.com>

>Subject: Re: [PATCH v1 5/9] firmware: keembay: Add support for Trusted

>Firmware Service call

>

>Hi

>

>sorry I'm a bit late on this.

>

>On Mon, Jan 18, 2021 at 10:28:33AM +0000, Zulkifli, Muhammad Husaini

>wrote:

>> Hi Sudeep and Mark,

>>

>> Thanks for the review. I replied inline.

>>

>> >-----Original Message-----

>> >From: Sudeep Holla <sudeep.holla@arm.com>

>> >Sent: Saturday, January 16, 2021 2:58 AM

>> >To: Mark Brown <broonie@kernel.org>

>> >Cc: Zulkifli, Muhammad Husaini <muhammad.husaini.zulkifli@intel.com>;

>> >ulf.hansson@linaro.org; lgirdwood@gmail.com; robh+dt@kernel.org;

>> >devicetree@vger.kernel.org; Hunter, Adrian <adrian.hunter@intel.com>;

>> >michal.simek@xilinx.com; linux-mmc@vger.kernel.org; linux-

>> >kernel@vger.kernel.org; Shevchenko, Andriy

>> ><andriy.shevchenko@intel.com>; A, Rashmi <rashmi.a@intel.com>;

>> >Vaidya, Mahesh R <mahesh.r.vaidya@intel.com>; Sudeep Holla

>> ><sudeep.holla@arm.com>

>> >Subject: Re: [PATCH v1 5/9] firmware: keembay: Add support for

>> >Trusted Firmware Service call

>> >

>> >On Thu, Jan 14, 2021 at 04:48:11PM +0000, Mark Brown wrote:

>> >> On Thu, Jan 14, 2021 at 11:26:56PM +0800, Muhammad Husaini Zulkifli

>> >wrote:

>> >> > Export inline function to encapsulate AON_CFG1 for controling the

>> >> > I/O Rail supplied voltage levels which communicate with Trusted

>Firmware.

>> >>

>> >> Adding Sudeep for the SMCCC bits, not deleting any context for his

>> >> benefit.

>> >>

>> >

>> >Thanks Mark for cc-ing me and joining the dots. I completely forgot

>> >about that fact that this platform was using SCMI using SMC as

>> >transport. Sorry for that and it is my fault. I did review the

>> >SCMI/SMC support for this platform sometime in June/July last year

>> >and forgot the fact it is same platform when voltage/regulator

>> >support patches for SD/MMC was posted sometime later last year. I

>concentrated on SMCCC conventions and other details.

>>

>> Yes Sudeep. I redesigned the way I handle the smccc call. Previously it was

>handled directly in mmc driver.

>> After few discussion, we conclude to create an abstraction using

>> regulator framework to encapsulate this smccc call during set voltage

>operation. Using standard abstraction will make things easier for the

>maintainer.

>>

>> >

>> >[...]

>> >

>> >> > +#define ARM_SMCCC_SIP_KEEMBAY_SET_SD_VOLTAGE

>	\

>> >> > +	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,

>	\

>> >> > +			   ARM_SMCCC_SMC_32,		\

>> >> > +			   ARM_SMCCC_OWNER_SIP,		\

>> >> > +			   KEEMBAY_SET_SD_VOLTAGE_ID)

>> >> > +

>> >> > +#define ARM_SMCCC_SIP_KEEMBAY_GET_SD_VOLTAGE

>	\

>> >> > +	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,

>	\

>> >> > +			   ARM_SMCCC_SMC_32,		\

>> >> > +			   ARM_SMCCC_OWNER_SIP,		\

>> >> > +			   KEEMBAY_GET_SD_VOLTAGE_ID)

>> >> > +

>> >> > +#define KEEMBAY_REG_NUM_CONSUMERS 2

>> >> > +

>> >> > +struct keembay_reg_supply {

>> >> > +	struct regulator *consumer;

>> >> > +};

>> >> > +

>> >> > +#if IS_ENABLED(CONFIG_HAVE_ARM_SMCCC_DISCOVERY)

>> >> > +/*

>> >> > + * Voltage applied on the IO Rail is controlled from the Always

>> >> > +On Register using specific

>> >> > + * bits in AON_CGF1 register. This is a secure register. Keem

>> >> > +Bay SOC cannot exposed this

>> >> > + * register address to the outside world.

>> >> > + */

>> >> > +static inline int keembay_set_io_rail_supplied_voltage(int volt) {

>> >> > +	struct arm_smccc_res res;

>> >> > +

>> >> > +

>> >	arm_smccc_1_1_invoke(ARM_SMCCC_SIP_KEEMBAY_SET_SD_VOLTA

>> >GE, volt,

>> >> > +&res);

>> >>

>> >> There is a SCMI voltage domain protocol intended for just this use

>> >> case of controlling regulators managed by the firmware, why are you

>> >> not using that for these systems?  See

>drivers/firmware/arm_scmi/voltage.c.

>>

>> From mmc maintainer's perspective, I should use the common modelling

>> either using regulator framework or pinctrl to perform voltage

>> operation. Not just directly invoke smccc call in the mmc driver. That

>> is why I came up with this regulator driver to perform voltage operation.

>>

>

>There is an SCMI regulator driver built on top of SCMIv3.0 Voltage Domain

>Protocol, so as long as your SCMI platform firmware support the new VD

>protocol you should be able to wire up a generic SCMI regulator in the DT

>(as described in the arm,scmi.txt bindings) and then just use the usual

>regulator framework ops with such SCMI regulator without the need to add

>a custom regulator using custom SMCCC calls).


I try to hook up the DT last night. Seems like the SCMI Protocol 17 is not implemented at ATF side.
Double check with ATF Team, currently we don't have SCMI voltage domain control in ARM Trusted Firmware yet
as of now, that is why even if I map the function to scmi, my call will be fail.

[    2.648989] arm-scmi firmware:scmi: SCMI Notifications - Core Enabled.
[    2.656157] arm-scmi firmware:scmi: SCMI Protocol v1.0 'INTEL:KMB' Firmware version 0x1
[    2.664513] arm-scmi firmware:scmi: SCMI protocol 23 not implemented
[    2.675898] arm-scmi firmware:scmi: SCMI protocol 17 not implemented

Any possibilities that for UHS patch we go with my current regulator driver implementation?

>

>Thanks

>

>Cristian

>

>> >>

>> >

>> >Indeed. Please switch to using the new voltage protocol added for this

>without

>> >any extra code. You just need to wire up DT for this.

>>

>> May I know even if I wire up the DT, how should I call this from the mmc

>driver

>> For set/get voltage operation? Any example?

>>

>> >

>> >Just for curiosity, where is SCMI platform firmware implemented ? On

>Cortex-

>> >A, secure side or external processor. Does this platform run TF-A ?

>>

>> The KMB SCMI framework is implemented in secure runtime firmware (TF-A

>BL31).

>> Hopefully I am answering your question.

>>

>> >

>> >--

>> >Regards,

>> >Sudeep
Sudeep Holla Jan. 19, 2021, 5:20 p.m. UTC | #6
On Tue, Jan 19, 2021 at 02:38:32AM +0000, Zulkifli, Muhammad Husaini wrote:

[...]

> 

> I try to hook up the DT last night. Seems like the SCMI Protocol 17 is not

> implemented at ATF side.


I had guessed that.

> Double check with ATF Team, currently we don't have SCMI voltage domain

> control in ARM Trusted Firmware yet as of now, that is why even if I map the

> function to scmi, my call will be fail.


Correct, but if you already have this custom SMCCC for voltage already
implemented in TF-A, I don't see it is a big deal to support voltage
protocol there.

> 

> [    2.648989] arm-scmi firmware:scmi: SCMI Notifications - Core Enabled.

> [    2.656157] arm-scmi firmware:scmi: SCMI Protocol v1.0 'INTEL:KMB' Firmware version 0x1

> [    2.664513] arm-scmi firmware:scmi: SCMI protocol 23 not implemented

> [    2.675898] arm-scmi firmware:scmi: SCMI protocol 17 not implemented

> 

> Any possibilities that for UHS patch we go with my current regulator driver

> implementation?


Sorry absolutely no. If this platform was not using SCMI, I wouldn't have
pushed back hard on this custom SMCCC. Please update TF-A to add this support.
There is no point in having custom interface just for this when everything
else is already using SCMI on this platform.

-- 
Regards,
Sudeep
diff mbox series

Patch

diff --git a/include/linux/firmware/intel/keembay.h b/include/linux/firmware/intel/keembay.h
new file mode 100644
index 000000000000..f5a8dbfdb63b
--- /dev/null
+++ b/include/linux/firmware/intel/keembay.h
@@ -0,0 +1,82 @@ 
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *  Intel Keembay SOC Firmware API Layer
+ *
+ *  Copyright (C) 2020, Intel Corporation
+ *
+ *  Author: Muhammad Husaini Zulkifli <Muhammad.Husaini.Zulkifli@intel.com>
+ */
+
+#ifndef __FIRMWARE_KEEMBAY_SMC_H__
+#define __FIRMWARE_KEEMBAY_SMC_H__
+
+#include <linux/arm-smccc.h>
+
+/*
+ * This file defines an API function that can be called by a device driver in order to
+ * communicate with Trusted Firmware - A profile(TF-A) or Trusted Firmware - M profile (TF-M).
+ */
+
+#define KEEMBAY_SET_1V8_IO_RAIL	1
+#define KEEMBAY_SET_3V3_IO_RAIL	0
+
+#define KEEMBAY_IOV_1_8V_uV	1800000
+#define KEEMBAY_IOV_3_3V_uV	3300000
+
+#define KEEMBAY_SET_SD_VOLTAGE_ID 0xFF26
+#define KEEMBAY_GET_SD_VOLTAGE_ID 0xFF2A
+
+#define ARM_SMCCC_SIP_KEEMBAY_SET_SD_VOLTAGE		\
+	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,		\
+			   ARM_SMCCC_SMC_32,		\
+			   ARM_SMCCC_OWNER_SIP,		\
+			   KEEMBAY_SET_SD_VOLTAGE_ID)
+
+#define ARM_SMCCC_SIP_KEEMBAY_GET_SD_VOLTAGE		\
+	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,		\
+			   ARM_SMCCC_SMC_32,		\
+			   ARM_SMCCC_OWNER_SIP,		\
+			   KEEMBAY_GET_SD_VOLTAGE_ID)
+
+#define KEEMBAY_REG_NUM_CONSUMERS 2
+
+struct keembay_reg_supply {
+	struct regulator *consumer;
+};
+
+#if IS_ENABLED(CONFIG_HAVE_ARM_SMCCC_DISCOVERY)
+/*
+ * Voltage applied on the IO Rail is controlled from the Always On Register using specific
+ * bits in AON_CGF1 register. This is a secure register. Keem Bay SOC cannot exposed this
+ * register address to the outside world.
+ */
+static inline int keembay_set_io_rail_supplied_voltage(int volt)
+{
+	struct arm_smccc_res res;
+
+	arm_smccc_1_1_invoke(ARM_SMCCC_SIP_KEEMBAY_SET_SD_VOLTAGE, volt, &res);
+
+	return res.a0;
+}
+
+static inline int keembay_get_io_rail_supplied_voltage(void)
+{
+	struct arm_smccc_res res;
+
+	arm_smccc_1_1_invoke(ARM_SMCCC_SIP_KEEMBAY_GET_SD_VOLTAGE, &res);
+
+	return res.a1;
+}
+#else
+static inline int keembay_set_io_rail_supplied_voltage(int volt)
+{
+	return -ENODEV;
+}
+
+static inline int keembay_get_io_rail_supplied_voltage(void)
+{
+	return -ENODEV;
+}
+#endif
+
+#endif /* __FIRMWARE_KEEMBAY_SMC_H__ */