Re: [PATCH V2] soc: tegra: pmc: Ensure GPU partition can be toggled on/off by PMC

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 26 February 2016 at 09:43, Jon Hunter <jonathanh@xxxxxxxxxx> wrote:
>
> On 26/02/16 16:06, Mathieu Poirier wrote:
>> On 15 February 2016 at 05:38, Jon Hunter <jonathanh@xxxxxxxxxx> wrote:
>>> For Tegra124 and Tegra210, the GPU partition cannot be toggled on and
>>> off via the APBDEV_PMC_PWRGATE_TOGGLE_0 register. For these devices, the
>>> partition is simply powered up and down via an external regulator.
>>> For these devices, there is a separate register for controlling the
>>> signal clamping of the partition and this is described in the PMC SoC
>>> data by the "has_gpu_clamp" variable. Use this variable to determine if
>>> the GPU partition can be controlled via the APBDEV_PMC_PWRGATE_TOGGLE_0
>>> register and ensure that no one can incorrectly try to toggle the GPU
>>> partition via the APBDEV_PMC_PWRGATE_TOGGLE_0 register.
>>>
>>> Furthermore, we cannot use the APBDEV_PMC_PWRGATE_STATUS_0 register to
>>> determine if the GPU partition is powered for Tegra124 and Tegra210.
>>> However, if the GPU partition is powered, then the signal clamp for the
>>> GPU partition should be removed and so use bit 0 of the
>>> APBDEV_PMC_GPU_RG_CNTRL_0 register to determine if the clamp has been
>>> removed (bit[0] = 0) and the GPU partition is powered.
>>>
>>> Signed-off-by: Jon Hunter <jonathanh@xxxxxxxxxx>
>>> ---
>>>
>>> Changes v1-v2:
>>> - Drop the has_gpu_toggle and use has_gpu_clamps as it is not necessary
>>>   to have two variables.
>>> - Correct the register used for reading the clamps status for the GPU
>>>   partition
>>>
>>>  drivers/soc/tegra/pmc.c | 8 +++++++-
>>>  1 file changed, 7 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c
>>> index 8e358dbffaed..e4fd40fa27e8 100644
>>> --- a/drivers/soc/tegra/pmc.c
>>> +++ b/drivers/soc/tegra/pmc.c
>>> @@ -176,7 +176,10 @@ static void tegra_pmc_writel(u32 value, unsigned long offset)
>>>
>>>  static inline bool tegra_powergate_state(int id)
>>>  {
>>> -       return (tegra_pmc_readl(PWRGATE_STATUS) & BIT(id)) != 0;
>>> +       if (id == TEGRA_POWERGATE_3D && pmc->soc->has_gpu_clamps)
>>> +               return (tegra_pmc_readl(GPU_RG_CNTRL) & 0x1) == 0;
>>> +       else
>>> +               return (tegra_pmc_readl(PWRGATE_STATUS) & BIT(id)) != 0;
>>
>> From what I deduce power is on if bit 0 of register GPU_RG_CNTRL is
>> equal to 0.  In the other case power is on if bit 'id' of register
>> PWRGATE_STATUS is equal to 1.  If I'm right this is highly confusing
>> and some comments  would be appreciated.  Changing
>>
>> "return (tegra_pmc_readl(PWRGATE_STATUS) & BIT(id)) != 0;"
>>
>> for
>>
>> "return (tegra_pmc_readl(PWRGATE_STATUS) & BIT(id)) == 1;"
>
> Yes, it is a bit confusing, but the above does not work. You are
> comparing a bit with 1. What you need is:
>
> "return (tegra_pmc_readl(PWRGATE_STATUS) & BIT(id)) == BIT(id);"

Ah yes, of course.

>
>> would also help.
>>
>>>  }
>>>
>>>  static inline bool tegra_powergate_is_valid(int id)
>>> @@ -191,6 +194,9 @@ static inline bool tegra_powergate_is_valid(int id)
>>>   */
>>>  static int tegra_powergate_set(unsigned int id, bool new_state)
>>>  {
>>> +       if (id == TEGRA_POWERGATE_3D && pmc->soc->has_gpu_clamps)
>>> +               return -EINVAL;
>>> +
>>>         mutex_lock(&pmc->powergates_lock);
>>>
>>>         if (tegra_powergate_state(id) == new_state) {
>>> --
>>> 2.1.4
>>
>> With the above in mind:
>>
>> Reviewed-by: Mathieu Poirier <mathieu.poirier@xxxxxxxxxx>
>
> Thanks. Thierry has queued this version and so if you feel strongly we
> could update in a follow-up.

The decision is for Thierry to make - I'm fine with the current code.

>
> Jon
>
--
To unsubscribe from this list: send the line "unsubscribe linux-tegra" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [ARM Kernel]     [Linux ARM]     [Linux ARM MSM]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux