diff mbox

mmc: card: not access RPMB partition for normal read and write

Message ID 1407816090-7671-1-git-send-email-yunpeng.gao@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Gao, Yunpeng Aug. 12, 2014, 4:01 a.m. UTC
From: Chuanxiao Dong <chuanxiao.dong@intel.com>

During kernel boot, it will try to read some logical sectors
of each block device node for the possible partition table.

But since RPMB partition is special and can not be accessed
by normal eMMC read / write CMDs, it will cause below error
messages during kernel boot:
...
<3>[    4.890052] mmc0: Got data interrupt 0x00000002 even though no data operation was in progress.
<3>[    4.892160] mmcblk0rpmb: error -110 transferring data, sector 0, nr 32, cmd response 0x900, card status 0xb00
<4>[    4.892165] mmcblk0rpmb: retrying using single block read
<3>[    4.895727] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
<3>[    4.899269] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
<3>[    4.901466] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
<3>[    4.905106] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
<3>[    4.907166] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
<3>[    4.909235] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
<3>[    4.909241] end_request: I/O error, dev mmcblk0rpmb, sector 0
<3>[    4.909247] Buffer I/O error on device mmcblk0rpmb, logical block 0
<3>[    4.909263] end_request: I/O error, dev mmcblk0rpmb, sector 8
<3>[    4.909267] Buffer I/O error on device mmcblk0rpmb, logical block 1
<3>[    4.909272] end_request: I/O error, dev mmcblk0rpmb, sector 16
<3>[    4.909275] Buffer I/O error on device mmcblk0rpmb, logical block 2
<3>[    4.909280] end_request: I/O error, dev mmcblk0rpmb, sector 24
<3>[    4.909283] Buffer I/O error on device mmcblk0rpmb, logical block 3
...

This patch will discard the access request in eMMC queue if
it is RPMB partition access request. By this way, it avoids
trigger above error messages.

Signed-off-by: Yunpeng Gao <yunpeng.gao@intel.com>
Signed-off-by: Chuanxiao Dong <chuanxiao.dong@intel.com>
---
 drivers/mmc/card/block.c |   13 +++++++++++++
 drivers/mmc/card/queue.c |    2 +-
 drivers/mmc/card/queue.h |    2 ++
 3 files changed, 16 insertions(+), 1 deletion(-)

Comments

Ulf Hansson Aug. 12, 2014, 8:36 a.m. UTC | #1
On 12 August 2014 06:01, Yunpeng Gao <yunpeng.gao@intel.com> wrote:
> From: Chuanxiao Dong <chuanxiao.dong@intel.com>
>
> During kernel boot, it will try to read some logical sectors
> of each block device node for the possible partition table.
>
> But since RPMB partition is special and can not be accessed
> by normal eMMC read / write CMDs, it will cause below error
> messages during kernel boot:

The following patch were included in 3.8, does this solve your issue?

53d8f97 mmc: card: Do not scan RPMB partitions

Kind regards
Uffe

> ...
> <3>[    4.890052] mmc0: Got data interrupt 0x00000002 even though no data operation was in progress.
> <3>[    4.892160] mmcblk0rpmb: error -110 transferring data, sector 0, nr 32, cmd response 0x900, card status 0xb00
> <4>[    4.892165] mmcblk0rpmb: retrying using single block read
> <3>[    4.895727] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
> <3>[    4.899269] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
> <3>[    4.901466] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
> <3>[    4.905106] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
> <3>[    4.907166] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
> <3>[    4.909235] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
> <3>[    4.909241] end_request: I/O error, dev mmcblk0rpmb, sector 0
> <3>[    4.909247] Buffer I/O error on device mmcblk0rpmb, logical block 0
> <3>[    4.909263] end_request: I/O error, dev mmcblk0rpmb, sector 8
> <3>[    4.909267] Buffer I/O error on device mmcblk0rpmb, logical block 1
> <3>[    4.909272] end_request: I/O error, dev mmcblk0rpmb, sector 16
> <3>[    4.909275] Buffer I/O error on device mmcblk0rpmb, logical block 2
> <3>[    4.909280] end_request: I/O error, dev mmcblk0rpmb, sector 24
> <3>[    4.909283] Buffer I/O error on device mmcblk0rpmb, logical block 3
> ...
>
> This patch will discard the access request in eMMC queue if
> it is RPMB partition access request. By this way, it avoids
> trigger above error messages.
>
> Signed-off-by: Yunpeng Gao <yunpeng.gao@intel.com>
> Signed-off-by: Chuanxiao Dong <chuanxiao.dong@intel.com>
> ---
>  drivers/mmc/card/block.c |   13 +++++++++++++
>  drivers/mmc/card/queue.c |    2 +-
>  drivers/mmc/card/queue.h |    2 ++
>  3 files changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
> index 452782b..4b79592 100644
> --- a/drivers/mmc/card/block.c
> +++ b/drivers/mmc/card/block.c
> @@ -1025,6 +1025,19 @@ static inline void mmc_blk_reset_success(struct mmc_blk_data *md, int type)
>         md->reset_done &= ~type;
>  }
>
> +int mmc_access_rpmb(struct mmc_queue *mq)
> +{
> +       struct mmc_blk_data *md = mq->data;
> +       /*
> +        * If this is a RPMB partition access, return ture
> +        */
> +       if (md && md->part_type == EXT_CSD_PART_CONFIG_ACC_RPMB)
> +               return true;
> +
> +       return false;
> +}
> +EXPORT_SYMBOL_GPL(mmc_access_rpmb);
> +
>  static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req)
>  {
>         struct mmc_blk_data *md = mq->data;
> diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c
> index 3e049c1..6ceede0 100644
> --- a/drivers/mmc/card/queue.c
> +++ b/drivers/mmc/card/queue.c
> @@ -38,7 +38,7 @@ static int mmc_prep_request(struct request_queue *q, struct request *req)
>                 return BLKPREP_KILL;
>         }
>
> -       if (mq && mmc_card_removed(mq->card))
> +       if (mq && (mmc_card_removed(mq->card) || mmc_access_rpmb(mq)))
>                 return BLKPREP_KILL;
>
>         req->cmd_flags |= REQ_DONTPREP;
> diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h
> index 5752d50..99e6521 100644
> --- a/drivers/mmc/card/queue.h
> +++ b/drivers/mmc/card/queue.h
> @@ -73,4 +73,6 @@ extern void mmc_queue_bounce_post(struct mmc_queue_req *);
>  extern int mmc_packed_init(struct mmc_queue *, struct mmc_card *);
>  extern void mmc_packed_clean(struct mmc_queue *);
>
> +extern int mmc_access_rpmb(struct mmc_queue *);
> +
>  #endif
> --
> 1.7.9.5
>
> --
> 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
Gao, Yunpeng Aug. 12, 2014, 10:54 a.m. UTC | #2
Thanks for the reminder.

I confirmed patch 53d8f97462b0bbb51150f4d6bc2fd45336a008b9 - ' mmc: card: Do not scan RPMB partitions' has already been in the kernel mmc driver I’m using.
But seems it does not fix this issue.

Actually, after adding debug output for 'md->disk->flags' when error happened, below error message captured:
...
<3>[    5.068249] mmcblk0rpmb: error -110 transferring data, sector 0, nr 32, cmd response 0x900, card status 0xb00
<4>[    5.068255] mmcblk0rpmb: retrying using single block read. md->disk->flags: 0x210
...

md->disk->flags value is '0x210', which means ' GENHD_FL_NO_PART_SCAN' (bit 9) has already been set.
So, I'm not sure why it does not work.

I observed this issue on my Merrifield VV board.
Did anyone else observed the similar issue on other platform? Thanks.

Regards,
Yunpeng

-----Original Message-----
From: linux-mmc-owner@vger.kernel.org [mailto:linux-mmc-owner@vger.kernel.org] On Behalf Of Ulf Hansson

Sent: Tuesday, August 12, 2014 4:37 PM
To: Gao, Yunpeng
Cc: linux-mmc; Dong, Chuanxiao
Subject: Re: [PATCH] mmc: card: not access RPMB partition for normal read and write

On 12 August 2014 06:01, Yunpeng Gao <yunpeng.gao@intel.com> wrote:
> From: Chuanxiao Dong <chuanxiao.dong@intel.com>

>

> During kernel boot, it will try to read some logical sectors of each 

> block device node for the possible partition table.

>

> But since RPMB partition is special and can not be accessed by normal 

> eMMC read / write CMDs, it will cause below error messages during 

> kernel boot:


The following patch were included in 3.8, does this solve your issue?

53d8f97 mmc: card: Do not scan RPMB partitions

Kind regards
Uffe

> ...

> <3>[    4.890052] mmc0: Got data interrupt 0x00000002 even though no data operation was in progress.

> <3>[    4.892160] mmcblk0rpmb: error -110 transferring data, sector 0, nr 32, cmd response 0x900, card status 0xb00

> <4>[    4.892165] mmcblk0rpmb: retrying using single block read

> <3>[    4.895727] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900

> <3>[    4.899269] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900

> <3>[    4.901466] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900

> <3>[    4.905106] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900

> <3>[    4.907166] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900

> <3>[    4.909235] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900

> <3>[    4.909241] end_request: I/O error, dev mmcblk0rpmb, sector 0

> <3>[    4.909247] Buffer I/O error on device mmcblk0rpmb, logical block 0

> <3>[    4.909263] end_request: I/O error, dev mmcblk0rpmb, sector 8

> <3>[    4.909267] Buffer I/O error on device mmcblk0rpmb, logical block 1

> <3>[    4.909272] end_request: I/O error, dev mmcblk0rpmb, sector 16

> <3>[    4.909275] Buffer I/O error on device mmcblk0rpmb, logical block 2

> <3>[    4.909280] end_request: I/O error, dev mmcblk0rpmb, sector 24

> <3>[    4.909283] Buffer I/O error on device mmcblk0rpmb, logical block 3

> ...

>

> This patch will discard the access request in eMMC queue if it is RPMB 

> partition access request. By this way, it avoids trigger above error 

> messages.

>

> Signed-off-by: Yunpeng Gao <yunpeng.gao@intel.com>

> Signed-off-by: Chuanxiao Dong <chuanxiao.dong@intel.com>

> ---

>  drivers/mmc/card/block.c |   13 +++++++++++++

>  drivers/mmc/card/queue.c |    2 +-

>  drivers/mmc/card/queue.h |    2 ++

>  3 files changed, 16 insertions(+), 1 deletion(-)

>

> diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 

> 452782b..4b79592 100644

> --- a/drivers/mmc/card/block.c

> +++ b/drivers/mmc/card/block.c

> @@ -1025,6 +1025,19 @@ static inline void mmc_blk_reset_success(struct mmc_blk_data *md, int type)

>         md->reset_done &= ~type;

>  }

>

> +int mmc_access_rpmb(struct mmc_queue *mq) {

> +       struct mmc_blk_data *md = mq->data;

> +       /*

> +        * If this is a RPMB partition access, return ture

> +        */

> +       if (md && md->part_type == EXT_CSD_PART_CONFIG_ACC_RPMB)

> +               return true;

> +

> +       return false;

> +}

> +EXPORT_SYMBOL_GPL(mmc_access_rpmb);

> +

>  static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct 

> request *req)  {

>         struct mmc_blk_data *md = mq->data; diff --git 

> a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c index 

> 3e049c1..6ceede0 100644

> --- a/drivers/mmc/card/queue.c

> +++ b/drivers/mmc/card/queue.c

> @@ -38,7 +38,7 @@ static int mmc_prep_request(struct request_queue *q, struct request *req)

>                 return BLKPREP_KILL;

>         }

>

> -       if (mq && mmc_card_removed(mq->card))

> +       if (mq && (mmc_card_removed(mq->card) || mmc_access_rpmb(mq)))

>                 return BLKPREP_KILL;

>

>         req->cmd_flags |= REQ_DONTPREP; diff --git 

> a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h index 

> 5752d50..99e6521 100644

> --- a/drivers/mmc/card/queue.h

> +++ b/drivers/mmc/card/queue.h

> @@ -73,4 +73,6 @@ extern void mmc_queue_bounce_post(struct 

> mmc_queue_req *);  extern int mmc_packed_init(struct mmc_queue *, 

> struct mmc_card *);  extern void mmc_packed_clean(struct mmc_queue *);

>

> +extern int mmc_access_rpmb(struct mmc_queue *);

> +

>  #endif

> --

> 1.7.9.5

>

> --

> 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
Michael Shigorin Oct. 1, 2014, 1:53 p.m. UTC | #3
Hello,
what is the status of this patch to cope with MMC RPMB?
http://permalink.gmane.org/gmane.linux.kernel.mmc/28281

I had to use this workaround having run into timeouts:
https://dev-nell.com/rpmb-emmc-errors-under-linux.html

Here's some arch/arm work by Ulf:
https://patches.linaro.org/17128/

TIA :)
Ulf Hansson May 6, 2015, 1:06 p.m. UTC | #4
On 12 August 2014 at 06:01, Yunpeng Gao <yunpeng.gao@intel.com> wrote:
> From: Chuanxiao Dong <chuanxiao.dong@intel.com>
>
> During kernel boot, it will try to read some logical sectors
> of each block device node for the possible partition table.
>
> But since RPMB partition is special and can not be accessed
> by normal eMMC read / write CMDs, it will cause below error
> messages during kernel boot:
> ...
> <3>[    4.890052] mmc0: Got data interrupt 0x00000002 even though no data operation was in progress.
> <3>[    4.892160] mmcblk0rpmb: error -110 transferring data, sector 0, nr 32, cmd response 0x900, card status 0xb00
> <4>[    4.892165] mmcblk0rpmb: retrying using single block read
> <3>[    4.895727] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
> <3>[    4.899269] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
> <3>[    4.901466] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
> <3>[    4.905106] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
> <3>[    4.907166] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
> <3>[    4.909235] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900
> <3>[    4.909241] end_request: I/O error, dev mmcblk0rpmb, sector 0
> <3>[    4.909247] Buffer I/O error on device mmcblk0rpmb, logical block 0
> <3>[    4.909263] end_request: I/O error, dev mmcblk0rpmb, sector 8
> <3>[    4.909267] Buffer I/O error on device mmcblk0rpmb, logical block 1
> <3>[    4.909272] end_request: I/O error, dev mmcblk0rpmb, sector 16
> <3>[    4.909275] Buffer I/O error on device mmcblk0rpmb, logical block 2
> <3>[    4.909280] end_request: I/O error, dev mmcblk0rpmb, sector 24
> <3>[    4.909283] Buffer I/O error on device mmcblk0rpmb, logical block 3
> ...
>
> This patch will discard the access request in eMMC queue if
> it is RPMB partition access request. By this way, it avoids
> trigger above error messages.
>
> Signed-off-by: Yunpeng Gao <yunpeng.gao@intel.com>
> Signed-off-by: Chuanxiao Dong <chuanxiao.dong@intel.com>

This patch has been completely forgotten, sorry about that. It fixes a
old issue for RPMB partitions.

With a minor change to the commit message (adding a Fixes tag) and
also removing "EXPORT_SYMBOL_GPL(mmc_access_rpmb);" since it not
needed, this patch applied smoothly to my fixes branch.

Sorry for the delay and thanks!

Kind regards
Uffe

> ---
>  drivers/mmc/card/block.c |   13 +++++++++++++
>  drivers/mmc/card/queue.c |    2 +-
>  drivers/mmc/card/queue.h |    2 ++
>  3 files changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
> index 452782b..4b79592 100644
> --- a/drivers/mmc/card/block.c
> +++ b/drivers/mmc/card/block.c
> @@ -1025,6 +1025,19 @@ static inline void mmc_blk_reset_success(struct mmc_blk_data *md, int type)
>         md->reset_done &= ~type;
>  }
>
> +int mmc_access_rpmb(struct mmc_queue *mq)
> +{
> +       struct mmc_blk_data *md = mq->data;
> +       /*
> +        * If this is a RPMB partition access, return ture
> +        */
> +       if (md && md->part_type == EXT_CSD_PART_CONFIG_ACC_RPMB)
> +               return true;
> +
> +       return false;
> +}
> +EXPORT_SYMBOL_GPL(mmc_access_rpmb);
> +
>  static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req)
>  {
>         struct mmc_blk_data *md = mq->data;
> diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c
> index 3e049c1..6ceede0 100644
> --- a/drivers/mmc/card/queue.c
> +++ b/drivers/mmc/card/queue.c
> @@ -38,7 +38,7 @@ static int mmc_prep_request(struct request_queue *q, struct request *req)
>                 return BLKPREP_KILL;
>         }
>
> -       if (mq && mmc_card_removed(mq->card))
> +       if (mq && (mmc_card_removed(mq->card) || mmc_access_rpmb(mq)))
>                 return BLKPREP_KILL;
>
>         req->cmd_flags |= REQ_DONTPREP;
> diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h
> index 5752d50..99e6521 100644
> --- a/drivers/mmc/card/queue.h
> +++ b/drivers/mmc/card/queue.h
> @@ -73,4 +73,6 @@ extern void mmc_queue_bounce_post(struct mmc_queue_req *);
>  extern int mmc_packed_init(struct mmc_queue *, struct mmc_card *);
>  extern void mmc_packed_clean(struct mmc_queue *);
>
> +extern int mmc_access_rpmb(struct mmc_queue *);
> +
>  #endif
> --
> 1.7.9.5
>
> --
> 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
Sebastian Andrzej Siewior May 6, 2015, 1:09 p.m. UTC | #5
On 05/06/2015 03:06 PM, Ulf Hansson wrote:
> On 12 August 2014 at 06:01, Yunpeng Gao <yunpeng.gao@intel.com> wrote:
>> From: Chuanxiao Dong <chuanxiao.dong@intel.com>
> Sorry for the delay and thanks!

ah thanks. Is it likely you go via my patches for mmc-utils in the new
few days?

> Kind regards
> Uffe

Sebastian

--
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
Ulf Hansson May 6, 2015, 1:26 p.m. UTC | #6
- Decreased cc-list

On 6 May 2015 at 15:09, Sebastian Andrzej Siewior <bigeasy@linutronix.de> wrote:
> On 05/06/2015 03:06 PM, Ulf Hansson wrote:
>> On 12 August 2014 at 06:01, Yunpeng Gao <yunpeng.gao@intel.com> wrote:
>>> From: Chuanxiao Dong <chuanxiao.dong@intel.com>
>> Sorry for the delay and thanks!
>
> ah thanks. Is it likely you go via my patches for mmc-utils in the new
> few days?

Nope, that's handled by Chris Ball.

Kind regards
Uffe
--
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
diff mbox

Patch

diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 452782b..4b79592 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -1025,6 +1025,19 @@  static inline void mmc_blk_reset_success(struct mmc_blk_data *md, int type)
 	md->reset_done &= ~type;
 }
 
+int mmc_access_rpmb(struct mmc_queue *mq)
+{
+	struct mmc_blk_data *md = mq->data;
+	/*
+	 * If this is a RPMB partition access, return ture
+	 */
+	if (md && md->part_type == EXT_CSD_PART_CONFIG_ACC_RPMB)
+		return true;
+
+	return false;
+}
+EXPORT_SYMBOL_GPL(mmc_access_rpmb);
+
 static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req)
 {
 	struct mmc_blk_data *md = mq->data;
diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c
index 3e049c1..6ceede0 100644
--- a/drivers/mmc/card/queue.c
+++ b/drivers/mmc/card/queue.c
@@ -38,7 +38,7 @@  static int mmc_prep_request(struct request_queue *q, struct request *req)
 		return BLKPREP_KILL;
 	}
 
-	if (mq && mmc_card_removed(mq->card))
+	if (mq && (mmc_card_removed(mq->card) || mmc_access_rpmb(mq)))
 		return BLKPREP_KILL;
 
 	req->cmd_flags |= REQ_DONTPREP;
diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h
index 5752d50..99e6521 100644
--- a/drivers/mmc/card/queue.h
+++ b/drivers/mmc/card/queue.h
@@ -73,4 +73,6 @@  extern void mmc_queue_bounce_post(struct mmc_queue_req *);
 extern int mmc_packed_init(struct mmc_queue *, struct mmc_card *);
 extern void mmc_packed_clean(struct mmc_queue *);
 
+extern int mmc_access_rpmb(struct mmc_queue *);
+
 #endif