Linux MultiMedia Card development
 help / color / mirror / Atom feed
From: Jaehoon Chung <jh80.chung@samsung.com>
To: "George G. Davis" <george_davis@mentor.com>,
	Chris Ball <chris@printf.net>,
	Ulf Hansson <ulf.hansson@linaro.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Vladimir Zapolskiy <vladimir_zapolskiy@mentor.com>,
	Luca Porzio <lporzio@micron.com>,
	Harish Jenny K N <harish_kandiga@mentor.com>,
	Tomas Winkler <tomas.winkler@intel.com>,
	Ding Wang <justin.wang@spreadtrum.com>,
	Matt Gumbel <matthew.k.gumbel@intel.com>,
	Pratibhasagar V <pratibha@codeaurora.org>,
	Balasubramani Vivekanandan
	<balasubramani_vivekanandan@mentor.com>,
	Dirk Behme <dirk.behme@de.bosch.com>,
	Subhash Jadavani <subhashj@codeaurora.org>,
	"open list:MULTIMEDIA CARD (...),
	linux-kernel@vger.kernel.org (open list)"
	<linux-mmc@vger.kernel.org>, CPGS <cpgs@samsung.com>
Subject: Re: [RFC][PATCH] mmc: core: Disable HPI for certain Hynix eMMC cards
Date: Fri, 10 Jun 2016 11:14:46 +0900	[thread overview]
Message-ID: <575A2296.5010906@samsung.com> (raw)
In-Reply-To: <1465510172-11314-1-git-send-email-george_davis@mentor.com>

On 06/10/2016 07:09 AM, George G. Davis wrote:
> From: Pratibhasagar V <pratibha@codeaurora.org>
> 
> Certain Hynix eMMC 4.41 cards might get broken when HPI feature is used
> and hence this patch disables the HPI feature for such buggy cards.

Did you use the property of "broken-hpi"?

> 
> As some of the other features like BKOPs/Cache/Sanitize are dependent on
> HPI feature, those features would also get disabled if HPI is disabled.

If HPI feature doesn't enable, then BKOPs/Cache/Sanitize should be waiting for completing, not stop during running, doesn't?
As my understanding, it's not mandatory. (I didn't check the latest TRM.)

Best Regards,
Jaehoon Chung

> 
> Signed-off-by: Pratibhasagar V <pratibha@codeaurora.org>
> Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
> [gdavis: Forward port and cleanup https://gitlab.com/k2wl/g2_kernel/commit/84af3731019921a28d595dbf6cbf00539706a42c]
> Signed-off-by: George G. Davis <george_davis@mentor.com>
> ---
>  drivers/mmc/card/block.c  |  6 ------
>  drivers/mmc/core/mmc.c    | 23 ++++++++++++++++++++---
>  drivers/mmc/core/quirks.c |  2 ++
>  include/linux/mmc/card.h  | 35 ++++++++++++++++++++++++++++++-----
>  4 files changed, 52 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
> index e62fde3..bb6e525 100644
> --- a/drivers/mmc/card/block.c
> +++ b/drivers/mmc/card/block.c
> @@ -2497,12 +2497,6 @@ force_ro_fail:
>  	return ret;
>  }
>  
> -#define CID_MANFID_SANDISK	0x2
> -#define CID_MANFID_TOSHIBA	0x11
> -#define CID_MANFID_MICRON	0x13
> -#define CID_MANFID_SAMSUNG	0x15
> -#define CID_MANFID_KINGSTON	0x70
> -
>  static const struct mmc_fixup blk_fixups[] =
>  {
>  	MMC_FIXUP("SEM02G", CID_MANFID_SANDISK, 0x100, add_quirk,
> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
> index 5d438ad..aede5a5 100644
> --- a/drivers/mmc/core/mmc.c
> +++ b/drivers/mmc/core/mmc.c
> @@ -45,6 +45,17 @@ static const unsigned int tacc_mant[] = {
>  	35,	40,	45,	50,	55,	60,	70,	80,
>  };
>  
> +static const struct mmc_fixup mmc_ext_csd_fixups[] = {
> +	/*
> +	 * Certain Hynix eMMC 4.41 cards might get broken when HPI feature
> +	 * is used so disable the HPI feature for such buggy cards.
> +	 */
> +	MMC_FIXUP_EXT_CSD_REV(CID_NAME_ANY, CID_MANFID_HYNIX,
> +			      0x014a, add_quirk, MMC_QUIRK_BROKEN_HPI, 5),
> +
> +	END_FIXUP
> +};
> +
>  #define UNSTUFF_BITS(resp,start,size)					\
>  	({								\
>  		const int __size = size;				\
> @@ -370,6 +381,9 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd)
>  	 */
>  	card->ext_csd.rev = ext_csd[EXT_CSD_REV];
>  
> +	/* fixup device after ext_csd revision field is updated */
> +	mmc_fixup_device(card, mmc_ext_csd_fixups);
> +
>  	card->ext_csd.raw_sectors[0] = ext_csd[EXT_CSD_SEC_CNT + 0];
>  	card->ext_csd.raw_sectors[1] = ext_csd[EXT_CSD_SEC_CNT + 1];
>  	card->ext_csd.raw_sectors[2] = ext_csd[EXT_CSD_SEC_CNT + 2];
> @@ -500,7 +514,8 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd)
>  			card->cid.year += 16;
>  
>  		/* check whether the eMMC card supports BKOPS */
> -		if (ext_csd[EXT_CSD_BKOPS_SUPPORT] & 0x1) {
> +		if (!mmc_card_broken_hpi(card) &&
> +		    ext_csd[EXT_CSD_BKOPS_SUPPORT] & 0x1) {
>  			card->ext_csd.bkops = 1;
>  			card->ext_csd.man_bkops_en =
>  					(ext_csd[EXT_CSD_BKOPS_EN] &
> @@ -513,7 +528,8 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd)
>  		}
>  
>  		/* check whether the eMMC card supports HPI */
> -		if (!broken_hpi && (ext_csd[EXT_CSD_HPI_FEATURES] & 0x1)) {
> +		if (!mmc_card_broken_hpi(card) &&
> +		    !broken_hpi && (ext_csd[EXT_CSD_HPI_FEATURES] & 0x1)) {
>  			card->ext_csd.hpi = 1;
>  			if (ext_csd[EXT_CSD_HPI_FEATURES] & 0x2)
>  				card->ext_csd.hpi_cmd =	MMC_STOP_TRANSMISSION;
> @@ -1616,7 +1632,8 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
>  	 * If cache size is higher than 0, this indicates
>  	 * the existence of cache and it can be turned on.
>  	 */
> -	if (card->ext_csd.cache_size > 0) {
> +	if (!mmc_card_broken_hpi(card) &&
> +	    card->ext_csd.cache_size > 0) {
>  		err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
>  				EXT_CSD_CACHE_CTRL, 1,
>  				card->ext_csd.generic_cmd6_time);
> diff --git a/drivers/mmc/core/quirks.c b/drivers/mmc/core/quirks.c
> index fad660b..ca9cade 100644
> --- a/drivers/mmc/core/quirks.c
> +++ b/drivers/mmc/core/quirks.c
> @@ -72,6 +72,8 @@ void mmc_fixup_device(struct mmc_card *card, const struct mmc_fixup *table)
>  		     f->cis_vendor == (u16) SDIO_ANY_ID) &&
>  		    (f->cis_device == card->cis.device ||
>  		     f->cis_device == (u16) SDIO_ANY_ID) &&
> +		    (f->ext_csd_rev == EXT_CSD_REV_ANY ||
> +		     f->ext_csd_rev == card->ext_csd.rev) &&
>  		    rev >= f->rev_start && rev <= f->rev_end) {
>  			dev_dbg(&card->dev, "calling %pf\n", f->vendor_fixup);
>  			f->vendor_fixup(card, f->data);
> diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h
> index eb0151b..5a2db5e 100644
> --- a/include/linux/mmc/card.h
> +++ b/include/linux/mmc/card.h
> @@ -279,6 +279,7 @@ struct mmc_card {
>  #define MMC_QUIRK_SEC_ERASE_TRIM_BROKEN (1<<10)	/* Skip secure for erase/trim */
>  #define MMC_QUIRK_BROKEN_IRQ_POLLING	(1<<11)	/* Polling SDIO_CCCR_INTx could create a fake interrupt */
>  #define MMC_QUIRK_TRIM_BROKEN	(1<<12)		/* Skip trim */
> +#define MMC_QUIRK_BROKEN_HPI	(1<<13)		/* Disable broken HPI support */
>  
>  
>  	unsigned int		erase_size;	/* erase size in sectors */
> @@ -353,6 +354,9 @@ struct mmc_fixup {
>  	/* SDIO-specfic fields. You can use SDIO_ANY_ID here of course */
>  	u16 cis_vendor, cis_device;
>  
> +	/* for MMC cards */
> +	unsigned int ext_csd_rev;
> +
>  	void (*vendor_fixup)(struct mmc_card *card, int data);
>  	int data;
>  };
> @@ -361,11 +365,20 @@ struct mmc_fixup {
>  #define CID_OEMID_ANY ((unsigned short) -1)
>  #define CID_NAME_ANY (NULL)
>  
> +#define EXT_CSD_REV_ANY (-1u)
> +
> +#define CID_MANFID_SANDISK      0x2
> +#define CID_MANFID_TOSHIBA      0x11
> +#define CID_MANFID_MICRON       0x13
> +#define CID_MANFID_SAMSUNG      0x15
> +#define CID_MANFID_KINGSTON     0x70
> +#define CID_MANFID_HYNIX	0x90
> +
>  #define END_FIXUP { NULL }
>  
>  #define _FIXUP_EXT(_name, _manfid, _oemid, _rev_start, _rev_end,	\
>  		   _cis_vendor, _cis_device,				\
> -		   _fixup, _data)					\
> +		   _fixup, _data, _ext_csd_rev)				\
>  	{						   \
>  		.name = (_name),			   \
>  		.manfid = (_manfid),			   \
> @@ -376,23 +389,30 @@ struct mmc_fixup {
>  		.cis_device = (_cis_device),		   \
>  		.vendor_fixup = (_fixup),		   \
>  		.data = (_data),			   \
> +		.ext_csd_rev = (_ext_csd_rev),		   \
>  	 }
>  
>  #define MMC_FIXUP_REV(_name, _manfid, _oemid, _rev_start, _rev_end,	\
> -		      _fixup, _data)					\
> +		      _fixup, _data, _ext_csd_rev)			\
>  	_FIXUP_EXT(_name, _manfid,					\
>  		   _oemid, _rev_start, _rev_end,			\
>  		   SDIO_ANY_ID, SDIO_ANY_ID,				\
> -		   _fixup, _data)					\
> +		   _fixup, _data, _ext_csd_rev)				\
>  
>  #define MMC_FIXUP(_name, _manfid, _oemid, _fixup, _data) \
> -	MMC_FIXUP_REV(_name, _manfid, _oemid, 0, -1ull, _fixup, _data)
> +	MMC_FIXUP_REV(_name, _manfid, _oemid, 0, -1ull, _fixup, _data,	\
> +		      EXT_CSD_REV_ANY)
> +
> +#define MMC_FIXUP_EXT_CSD_REV(_name, _manfid, _oemid, _fixup, _data,	\
> +			      _ext_csd_rev)				\
> +	MMC_FIXUP_REV(_name, _manfid, _oemid, 0, -1ull, _fixup, _data,	\
> +		      _ext_csd_rev)
>  
>  #define SDIO_FIXUP(_vendor, _device, _fixup, _data)			\
>  	_FIXUP_EXT(CID_NAME_ANY, CID_MANFID_ANY,			\
>  		    CID_OEMID_ANY, 0, -1ull,				\
>  		   _vendor, _device,					\
> -		   _fixup, _data)					\
> +		   _fixup, _data, EXT_CSD_REV_ANY)			\
>  
>  #define cid_rev(hwrev, fwrev, year, month)	\
>  	(((u64) hwrev) << 40 |                  \
> @@ -511,6 +531,11 @@ static inline int mmc_card_broken_irq_polling(const struct mmc_card *c)
>  	return c->quirks & MMC_QUIRK_BROKEN_IRQ_POLLING;
>  }
>  
> +static inline int mmc_card_broken_hpi(const struct mmc_card *c)
> +{
> +	return c->quirks & MMC_QUIRK_BROKEN_HPI;
> +}
> +
>  #define mmc_card_name(c)	((c)->cid.prod_name)
>  #define mmc_card_id(c)		(dev_name(&(c)->dev))
>  
> 


  reply	other threads:[~2016-06-10  2:14 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20160609221315epcas1p3cb83b247228b3f86df2c2f5469fb7ba3@epcas1p3.samsung.com>
2016-06-09 22:09 ` [RFC][PATCH] mmc: core: Disable HPI for certain Hynix eMMC cards George G. Davis
2016-06-10  2:14   ` Jaehoon Chung [this message]
2016-06-10  5:37     ` Dirk Behme
2016-06-22 15:23   ` Ulf Hansson

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=575A2296.5010906@samsung.com \
    --to=jh80.chung@samsung.com \
    --cc=adrian.hunter@intel.com \
    --cc=balasubramani_vivekanandan@mentor.com \
    --cc=chris@printf.net \
    --cc=cpgs@samsung.com \
    --cc=dirk.behme@de.bosch.com \
    --cc=george_davis@mentor.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=harish_kandiga@mentor.com \
    --cc=justin.wang@spreadtrum.com \
    --cc=linux-mmc@vger.kernel.org \
    --cc=lporzio@micron.com \
    --cc=matthew.k.gumbel@intel.com \
    --cc=pratibha@codeaurora.org \
    --cc=subhashj@codeaurora.org \
    --cc=tomas.winkler@intel.com \
    --cc=ulf.hansson@linaro.org \
    --cc=vladimir_zapolskiy@mentor.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