aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorSeungwon Jeon <tgih.jun@samsung.com>2013-02-06 03:02:46 -0500
committerChris Ball <cjb@laptop.org>2013-02-24 14:37:16 -0500
commitce39f9d17c14e56ea6772aa84393e6e0cc8499c4 (patch)
tree7b641a7f89614e3cc3f6ec2f81ee32f64ead4f0d /include
parentabd9ac144947d9a604beb763339e2f77ce8bec79 (diff)
mmc: support packed write command for eMMC4.5 devices
This patch supports packed write command of eMMC4.5 devices. Several writes can be grouped in packed command and all data of the individual commands can be sent in a single transfer on the bus. Large amounts of data in one transfer rather than several data of small size are effective for eMMC write internally. As a result, packed command help write throughput be improved. The following tables show the results of packed write. Type A: test none | packed iozone 25.8 | 31 tiotest 27.6 | 31.2 lmdd 31.2 | 35.4 Type B: test none | packed iozone 44.1 | 51.1 tiotest 47.9 | 52.5 lmdd 51.6 | 59.2 Type C: test none | packed iozone 19.5 | 32 tiotest 19.9 | 34.5 lmdd 22.8 | 40.7 Signed-off-by: Seungwon Jeon <tgih.jun@samsung.com> Reviewed-by: Maya Erez <merez@codeaurora.org> Reviewed-by: Namjae Jeon <linkinjeon@gmail.com> Signed-off-by: Chris Ball <cjb@laptop.org>
Diffstat (limited to 'include')
-rw-r--r--include/linux/mmc/card.h5
-rw-r--r--include/linux/mmc/core.h4
-rw-r--r--include/linux/mmc/host.h5
3 files changed, 14 insertions, 0 deletions
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h
index 237f253f2fe0..61b2c30c903b 100644
--- a/include/linux/mmc/card.h
+++ b/include/linux/mmc/card.h
@@ -310,6 +310,11 @@ static inline void mmc_part_add(struct mmc_card *card, unsigned int size,
310 card->nr_parts++; 310 card->nr_parts++;
311} 311}
312 312
313static inline bool mmc_large_sector(struct mmc_card *card)
314{
315 return card->ext_csd.data_sector_size == 4096;
316}
317
313/* 318/*
314 * The world is not perfect and supplies us with broken mmc/sdio devices. 319 * The world is not perfect and supplies us with broken mmc/sdio devices.
315 * For at least some of these bugs we need a work-around. 320 * For at least some of these bugs we need a work-around.
diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h
index 495d1336149c..39613b9a6fc5 100644
--- a/include/linux/mmc/core.h
+++ b/include/linux/mmc/core.h
@@ -18,6 +18,9 @@ struct mmc_request;
18struct mmc_command { 18struct mmc_command {
19 u32 opcode; 19 u32 opcode;
20 u32 arg; 20 u32 arg;
21#define MMC_CMD23_ARG_REL_WR (1 << 31)
22#define MMC_CMD23_ARG_PACKED ((0 << 31) | (1 << 30))
23#define MMC_CMD23_ARG_TAG_REQ (1 << 29)
21 u32 resp[4]; 24 u32 resp[4];
22 unsigned int flags; /* expected response type */ 25 unsigned int flags; /* expected response type */
23#define MMC_RSP_PRESENT (1 << 0) 26#define MMC_RSP_PRESENT (1 << 0)
@@ -148,6 +151,7 @@ extern int mmc_wait_for_app_cmd(struct mmc_host *, struct mmc_card *,
148extern void mmc_start_bkops(struct mmc_card *card, bool from_exception); 151extern void mmc_start_bkops(struct mmc_card *card, bool from_exception);
149extern int __mmc_switch(struct mmc_card *, u8, u8, u8, unsigned int, bool); 152extern int __mmc_switch(struct mmc_card *, u8, u8, u8, unsigned int, bool);
150extern int mmc_switch(struct mmc_card *, u8, u8, u8, unsigned int); 153extern int mmc_switch(struct mmc_card *, u8, u8, u8, unsigned int);
154extern int mmc_send_ext_csd(struct mmc_card *card, u8 *ext_csd);
151 155
152#define MMC_ERASE_ARG 0x00000000 156#define MMC_ERASE_ARG 0x00000000
153#define MMC_SECURE_ERASE_ARG 0x80000000 157#define MMC_SECURE_ERASE_ARG 0x80000000
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index a0466c03f5e1..fd5fd5a6026f 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -465,6 +465,11 @@ static inline int mmc_host_uhs(struct mmc_host *host)
465 MMC_CAP_UHS_DDR50); 465 MMC_CAP_UHS_DDR50);
466} 466}
467 467
468static inline int mmc_host_packed_wr(struct mmc_host *host)
469{
470 return host->caps2 & MMC_CAP2_PACKED_WR;
471}
472
468#ifdef CONFIG_MMC_CLKGATE 473#ifdef CONFIG_MMC_CLKGATE
469void mmc_host_clk_hold(struct mmc_host *host); 474void mmc_host_clk_hold(struct mmc_host *host);
470void mmc_host_clk_release(struct mmc_host *host); 475void mmc_host_clk_release(struct mmc_host *host);