From: "Subhash Jadavani" <subhashj@codeaurora.org>
To: 'Girish K S' <girish.shivananjappa@linaro.org>
Cc: 'Saugata Das' <saugata.das@linaro.org>,
linux-mmc@vger.kernel.org, patches@linaro.org,
linux-samsung-soc@vger.kernel.org, 'Chris Ball' <cjb@laptop.org>
Subject: RE: [PATCH V2] mmc: core: Add host capability check for power class
Date: Fri, 30 Mar 2012 11:16:04 +0530 [thread overview]
Message-ID: <000401cd0e38$67c7fed0$3757fc70$@codeaurora.org> (raw)
In-Reply-To: <CAGxe1ZHF4LVm8g09y3smMOrUU8xJw4URf4gt38isDZEKRQKKpA@mail.gmail.com>
> -----Original Message-----
> From: linux-mmc-owner@vger.kernel.org [mailto:linux-mmc-
> owner@vger.kernel.org] On Behalf Of Girish K S
> Sent: Friday, March 30, 2012 10:29 AM
> To: Subhash Jadavani
> Cc: Saugata Das; linux-mmc@vger.kernel.org; patches@linaro.org; linux-
> samsung-soc@vger.kernel.org; Chris Ball
> Subject: Re: [PATCH V2] mmc: core: Add host capability check for power
class
>
> On 29 March 2012 11:17, Girish K S <girish.shivananjappa@linaro.org>
wrote:
> > On 28 March 2012 16:39, Subhash Jadavani <subhashj@codeaurora.org>
> wrote:
> >>
> >>
> >>> -----Original Message-----
> >>> From: linux-mmc-owner@vger.kernel.org [mailto:linux-mmc-
> >>> owner@vger.kernel.org] On Behalf Of Saugata Das
> >>> Sent: Thursday, December 15, 2011 6:35 PM
> >>> To: Girish K S
> >>> Cc: linux-mmc@vger.kernel.org; patches@linaro.org; linux-samsung-
> >>> soc@vger.kernel.org; subhashj@codeaurora.org; Chris Ball
> >>> Subject: Re: [PATCH V2] mmc: core: Add host capability check for
> >>> power
> >> class
> >>>
> >>> On 15 December 2011 16:22, Girish K S
> >>> <girish.shivananjappa@linaro.org>
> >>> wrote:
> >>> > On 15 December 2011 15:34, Saugata Das <saugata.das@linaro.org>
> wrote:
> >>> >> On 15 December 2011 09:28, Girish K S
> >>> >> <girish.shivananjappa@linaro.org>
> >>> wrote:
> >>> >>> This patch adds a check whether the host supports maximum
> >>> >>> current value obtained from the device's extended csd register
> >>> >>> for a selected interface voltage and frequency.
> >>> >>>
> >>> >>> cc: Chris Ball <cjb@laptop.org>
> >>> >>> Signed-off-by: Girish K S <girish.shivananjappa@linaro.org>
> >>> >>> ---
> >>> >>> Changes in v2:
> >>> >>> deleted a unnecessary if else condition identified by
> >>> >>> subhash J Changes in v1:
> >>> >>> reduced the number of comparisons as per Hein's suggestion
> >>> >>>
> >>> >>> drivers/mmc/core/mmc.c | 19 +++++++++++++++++++
> >>> >>> include/linux/mmc/card.h | 4 ++++
> >>> >>> 2 files changed, 23 insertions(+), 0 deletions(-)
> >>> >>>
> >>> >>> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
> >>> >>> index
> >>> >>> 006e932..b9ef777 100644
> >>> >>> --- a/drivers/mmc/core/mmc.c
> >>> >>> +++ b/drivers/mmc/core/mmc.c
> >>> >>> @@ -688,6 +688,25 @@ static int mmc_select_powerclass(struct
> >>> >>> mmc_card *card,
> >>> >>> pwrclass_val = (pwrclass_val &
> >>> >>> EXT_CSD_PWR_CL_4BIT_MASK) >>
> >>> >>> EXT_CSD_PWR_CL_4BIT_SHIFT;
> >>> >>>
> >>> >>> + if (pwrclass_val >= MMC_MAX_CURRENT_800)
> >>> >>> + pwrclass_val = MMC_MAX_CURRENT_800;
> >>> >>> + else if (pwrclass_val >= MMC_MAX_CURRENT_600)
> >>> >>> + pwrclass_val = MMC_MAX_CURRENT_600;
> >>> >>> + else if (pwrclass_val >= MMC_MAX_CURRENT_400)
> >>> >>> + pwrclass_val = MMC_MAX_CURRENT_400;
> >>> >>> + else
> >>> >>> + pwrclass_val = MMC_MAX_CURRENT_200;
> >>> >>> +
> >>> >>> + if ((pwrclass_val == MMC_MAX_CURRENT_800) &&
> >>> >>> + !(card->host->caps & MMC_CAP_MAX_CURRENT_800))
> >>> >>> + pwrclass_val = MMC_MAX_CURRENT_600;
> >>> >>> + if ((pwrclass_val == MMC_MAX_CURRENT_600) &&
> >>> >>> + !(card->host->caps & MMC_CAP_MAX_CURRENT_600))
> >>> >>> + pwrclass_val = MMC_MAX_CURRENT_400;
> >>> >>> + if ((pwrclass_val == MMC_MAX_CURRENT_400) &&
> >>> >>> + !(card->host->caps & MMC_CAP_MAX_CURRENT_400))
> >>> >>> + pwrclass_val = MMC_MAX_CURRENT_200;
> >>> >>> +
> >>> >>> /* If the power class is different from the default value
> >>> >>> */
> >>> >>> if (pwrclass_val > 0) {
> >>> >>> err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
> >>> >>
> >>> >> It is not allowed to set the POWER_CLASS with any value other
> >>> >> than what is mentioned in the PWR_CL_ff_vvv or
> PWR_CL_DDR_ff_vvv
> >>> >> for
> >>> the
> >>> >> corresponding frequency, voltage. That is, if PWR_CL_200_195 is
> >>> >> 14 and we want to operate at HS200 then the only value allowed
> >>> >> for POWER_CLASS is 14. So, we need to check the PWR_CL numbers
> >>> >> and
> >>> choose
> >>> >> the operating mode (HS200/DDR50/..) based on the platform
> >>> >> capability to support the current consumption and set the
> >>> >> corresponding POWER_CLASS value.
> >>> >>
> >>> >> Please refer to section 6.6.5 of the 4.5 spec.
> >>> >
> >>> > The upstreamed code reads the extended csd value based on the
> >>> > already set voltage level and frequency of host. So it will get
> >>> > the required power class value which can be set directly. Is my
> >>> > understanding correct?
> >>> >
> >>>
> >>> It is not enough to just check the voltage level and frequency.
> >>> Consider this example, host has capability to support
> >>> MMC_CAP_MAX_CURRENT_400, the PWR_CL_DDR_52_360 has the
> value 9
> >>> (400mA) and PWR_CL_200_360 has the value 14 (800mA). Then even
> >>> though the host might be capable to run 200MHz clock and 3.6V, it
> >>> can only enable DDR at 52MHz and set 9 in POWER_CLASS.
> >>>
> >>> I think, in mmc_select_powerclass, we need to loop through the power
> >>> classes of all supported modes of transfer (HS200, DDR52, ... ) and
> >>> choose
> >> the
> >>> mode which gives maximum bandwidth but falls within host capability
> >>> of current consumption. Then set this to POWER_CLASS byte and also
> >>> use the same information when setting HS_TIMING in mmc_init_card.
> >>
> >> Hi Saugata,
> >>
> >> Does the spec mandates you to set the power class to what is needed
> >> by frequency/voltage combination? I can't see that mentioned anywhere
> >> explicitly in eMMC4.5 spec (if it is mentioned in spec, please let me
> >> know section and line number). It may be still possible to set the
> >> power class lower than what is needed by frequency/voltage
> >> combination. Say for example, 8-bit HS200 (200MHz) with high voltage
> >> cards may specify power class
> >> (PWR_CL_200_3_6) value of 14 (800 mA) but that doesn't mean if you
> >> want the card to work in 8-bit HS200 mode, its POWER_CLASS value must
> be 14 (800mA).
> >> If host's VDD regulator is only capable of say 600mA then it may
> >> still set the POWER_CLASS to 12 (600 mA) which should be the
> >> indication to card that host power supply is capable of sourcing only
> >> 600mA and I would assume card will make sure that it doesn't draw
> anything more than that.
> >>
> >> Hi Girish,
> >>
> >> I see couple of other issues with your original power_class selection
> patch.
> >> 1. mmc_select_powerclass() function considers 2.7v to 3.2v VDD range
> >> as invalid. That's not correct. Valid high voltage range is from 2.7v
to 3.6v.
> >> Is there a specific reason you have skipped the 2.7v to 3.2v VDD
> >> range? If not, I should post following change:
> >
> > can post a patch for this
> >
> >>
> >> --- a/drivers/mmc/core/mmc.c
> >> +++ b/drivers/mmc/core/mmc.c
> >> @@ -626,6 +626,11 @@ static int mmc_select_powerclass(struct
> mmc_card
> >> *card,
> >> else if (host->ios.clock <= 200000000)
> >> index = EXT_CSD_PWR_CL_200_195;
> >> break;
> >> + case MMC_VDD_27_28:
> >> + case MMC_VDD_28_29:
> >> + case MMC_VDD_29_30:
> >> + case MMC_VDD_30_31:
> >> + case MMC_VDD_31_32:
> >> case MMC_VDD_32_33:
> >> case MMC_VDD_33_34:
> >> case MMC_VDD_34_35:
> >>
> >> 2. Currently in mmc_init_card(), power class selection is done if
> >> it's normal (DS or HS) or DDR or HS200 card.
> >> If power class selection fails (mmc_select_powerclass() returns
> >> error) for DS/HS/DDR cards, we are just printing the error and going
> >> ahead with the rest of the initialization where as if power class
> >> selection fails for HS200 cards, we are simply aborting the
> >> initialization and mark it as failed.
> >>
> >> There are my points:
> >> 1. Power class failure must be treated in same manner for
> >> DS/HS/DDR/HS200 cards
> > good find.
> > Yes will modify and repost for the HS200 case.
> >
> >> 2. If you agree on first point then we need to decide whether
> >> power class selection failure is fatal enough to abort the MMC
> >> initialization? or we can just print the warning and go ahead with
> >> rest of the initialization in same bus speed mode?
> >
> > Should not be treated as fatal, should continue the initialization
> > with default power class
> Instead of making 2 different patches, can you add this modification in
your
> above patch. "you need to remove only the return err; statement"
No issues. I will do that.
> >
> >>
> >> Regards,
> >> Subhash
> >>
> >>>
> >>> >>
> >>> >>
> >>> >>> diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h
> >>> >>> index 9478a6b..c5e031a 100644
> >>> >>> --- a/include/linux/mmc/card.h
> >>> >>> +++ b/include/linux/mmc/card.h
> >>> >>> @@ -195,6 +195,10 @@ struct mmc_part {
> >>> >>> #define MMC_BLK_DATA_AREA_GP (1<<2)
> >>> >>> };
> >>> >>>
> >>> >>> +#define MMC_MAX_CURRENT_200 (0) #define
> MMC_MAX_CURRENT_400
> >>> >>> +(7) #define MMC_MAX_CURRENT_600 (11) #define
> >>> MMC_MAX_CURRENT_800
> >>> >>> +(13)
> >>> >>> /*
> >>> >>> * MMC device
> >>> >>> */
> >>> >>> --
> >>> >>> 1.7.1
> >>> >>>
> >>> >>> --
> >>> >>> To unsubscribe from this list: send the line "unsubscribe
linux-mmc"
> >>> >>> in the body of a message to majordomo@vger.kernel.org More
> >>> majordomo
> >>> >>> info at http://vger.kernel.org/majordomo-info.html
> >>> --
> >>> To unsubscribe from this list: send the line "unsubscribe linux-mmc"
> >>> in
> >> the
> >>> body of a message to majordomo@vger.kernel.org More majordomo
> info
> >>> at http://vger.kernel.org/majordomo-info.html
> >>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the
> body of a message to majordomo@vger.kernel.org More majordomo info at
> http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2012-03-30 5:46 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-15 3:58 [PATCH V2] mmc: core: Add host capability check for power class Girish K S
2011-12-15 6:03 ` amit kachhap
2011-12-15 6:16 ` Girish K S
2011-12-15 9:57 ` Hein_Tibosch
2011-12-15 10:04 ` Saugata Das
2011-12-15 10:52 ` Girish K S
2011-12-15 13:05 ` Saugata Das
2012-03-28 11:09 ` Subhash Jadavani
2012-03-29 5:47 ` Girish K S
2012-03-30 4:58 ` Girish K S
2012-03-30 5:46 ` Subhash Jadavani [this message]
2012-04-02 7:49 ` Saugata Das
2012-04-02 10:54 ` Subhash Jadavani
2012-04-03 10:42 ` Saugata Das
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='000401cd0e38$67c7fed0$3757fc70$@codeaurora.org' \
--to=subhashj@codeaurora.org \
--cc=cjb@laptop.org \
--cc=girish.shivananjappa@linaro.org \
--cc=linux-mmc@vger.kernel.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=patches@linaro.org \
--cc=saugata.das@linaro.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.