Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

mmc: core: Allow mmc erase to carry large addresses

Preparing for SDUC, Allow the erase address to be larger beyond a 32 bit
address.

Tested-by: Ricky WU <ricky_wu@realtek.com>
Reviewed-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Avri Altman <avri.altman@wdc.com>
Link: https://lore.kernel.org/r/20241006051148.160278-6-avri.altman@wdc.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>

authored by

Avri Altman and committed by
Ulf Hansson
9b9c665a 403a0293

+34 -21
+4 -2
drivers/mmc/core/block.c
··· 1199 1199 { 1200 1200 struct mmc_blk_data *md = mq->blkdata; 1201 1201 struct mmc_card *card = md->queue.card; 1202 - unsigned int from, nr; 1202 + unsigned int nr; 1203 + sector_t from; 1203 1204 int err = 0; 1204 1205 blk_status_t status = BLK_STS_OK; 1205 1206 ··· 1255 1254 { 1256 1255 struct mmc_blk_data *md = mq->blkdata; 1257 1256 struct mmc_card *card = md->queue.card; 1258 - unsigned int from, nr, arg; 1257 + unsigned int nr, arg; 1258 + sector_t from; 1259 1259 int err = 0, type = MMC_BLK_SECDISCARD; 1260 1260 blk_status_t status = BLK_STS_OK; 1261 1261
+18 -15
drivers/mmc/core/core.c
··· 1601 1601 return mmc_mmc_erase_timeout(card, arg, qty); 1602 1602 } 1603 1603 1604 - static int mmc_do_erase(struct mmc_card *card, unsigned int from, 1605 - unsigned int to, unsigned int arg) 1604 + static int mmc_do_erase(struct mmc_card *card, sector_t from, 1605 + sector_t to, unsigned int arg) 1606 1606 { 1607 1607 struct mmc_command cmd = {}; 1608 1608 unsigned int qty = 0, busy_timeout = 0; ··· 1633 1633 else if (mmc_card_sd(card)) 1634 1634 qty += to - from + 1; 1635 1635 else 1636 - qty += ((to / card->erase_size) - 1637 - (from / card->erase_size)) + 1; 1636 + qty += (mmc_sector_div(to, card->erase_size) - 1637 + mmc_sector_div(from, card->erase_size)) + 1; 1638 1638 1639 1639 if (!mmc_card_blockaddr(card)) { 1640 1640 from <<= 9; ··· 1703 1703 } 1704 1704 1705 1705 static unsigned int mmc_align_erase_size(struct mmc_card *card, 1706 - unsigned int *from, 1707 - unsigned int *to, 1706 + sector_t *from, 1707 + sector_t *to, 1708 1708 unsigned int nr) 1709 1709 { 1710 - unsigned int from_new = *from, nr_new = nr, rem; 1710 + sector_t from_new = *from; 1711 + unsigned int nr_new = nr, rem; 1711 1712 1712 1713 /* 1713 1714 * When the 'card->erase_size' is power of 2, we can use round_up/down() 1714 1715 * to align the erase size efficiently. 1715 1716 */ 1716 1717 if (is_power_of_2(card->erase_size)) { 1717 - unsigned int temp = from_new; 1718 + sector_t temp = from_new; 1718 1719 1719 1720 from_new = round_up(temp, card->erase_size); 1720 1721 rem = from_new - temp; ··· 1727 1726 1728 1727 nr_new = round_down(nr_new, card->erase_size); 1729 1728 } else { 1730 - rem = from_new % card->erase_size; 1729 + rem = mmc_sector_mod(from_new, card->erase_size); 1731 1730 if (rem) { 1732 1731 rem = card->erase_size - rem; 1733 1732 from_new += rem; ··· 1760 1759 * 1761 1760 * Caller must claim host before calling this function. 1762 1761 */ 1763 - int mmc_erase(struct mmc_card *card, unsigned int from, unsigned int nr, 1762 + int mmc_erase(struct mmc_card *card, sector_t from, unsigned int nr, 1764 1763 unsigned int arg) 1765 1764 { 1766 - unsigned int rem, to = from + nr; 1765 + unsigned int rem; 1766 + sector_t to = from + nr; 1767 + 1767 1768 int err; 1768 1769 1769 1770 if (!(card->csd.cmdclass & CCC_ERASE)) ··· 1786 1783 return -EOPNOTSUPP; 1787 1784 1788 1785 if (arg == MMC_SECURE_ERASE_ARG) { 1789 - if (from % card->erase_size || nr % card->erase_size) 1786 + if (mmc_sector_mod(from, card->erase_size) || nr % card->erase_size) 1790 1787 return -EINVAL; 1791 1788 } 1792 1789 ··· 1810 1807 * and call mmc_do_erase() twice if necessary. This special case is 1811 1808 * identified by the card->eg_boundary flag. 1812 1809 */ 1813 - rem = card->erase_size - (from % card->erase_size); 1810 + rem = card->erase_size - mmc_sector_mod(from, card->erase_size); 1814 1811 if ((arg & MMC_TRIM_OR_DISCARD_ARGS) && card->eg_boundary && nr > rem) { 1815 1812 err = mmc_do_erase(card, from, from + rem - 1, arg); 1816 1813 from += rem; ··· 1869 1866 } 1870 1867 EXPORT_SYMBOL(mmc_can_secure_erase_trim); 1871 1868 1872 - int mmc_erase_group_aligned(struct mmc_card *card, unsigned int from, 1869 + int mmc_erase_group_aligned(struct mmc_card *card, sector_t from, 1873 1870 unsigned int nr) 1874 1871 { 1875 1872 if (!card->erase_size) 1876 1873 return 0; 1877 - if (from % card->erase_size || nr % card->erase_size) 1874 + if (mmc_sector_mod(from, card->erase_size) || nr % card->erase_size) 1878 1875 return 0; 1879 1876 return 1; 1880 1877 }
+12 -4
drivers/mmc/core/core.h
··· 116 116 117 117 int mmc_start_request(struct mmc_host *host, struct mmc_request *mrq); 118 118 119 - int mmc_erase(struct mmc_card *card, unsigned int from, unsigned int nr, 120 - unsigned int arg); 119 + int mmc_erase(struct mmc_card *card, sector_t from, unsigned int nr, unsigned int arg); 121 120 int mmc_can_erase(struct mmc_card *card); 122 121 int mmc_can_trim(struct mmc_card *card); 123 122 int mmc_can_discard(struct mmc_card *card); 124 123 int mmc_can_sanitize(struct mmc_card *card); 125 124 int mmc_can_secure_erase_trim(struct mmc_card *card); 126 - int mmc_erase_group_aligned(struct mmc_card *card, unsigned int from, 127 - unsigned int nr); 125 + int mmc_erase_group_aligned(struct mmc_card *card, sector_t from, unsigned int nr); 128 126 unsigned int mmc_calc_max_discard(struct mmc_card *card); 129 127 130 128 int mmc_set_blocklen(struct mmc_card *card, unsigned int blocklen); ··· 195 197 return host->bus_ops->flush_cache(host); 196 198 197 199 return 0; 200 + } 201 + 202 + static inline unsigned int mmc_sector_div(sector_t dividend, u32 divisor) 203 + { 204 + return div_u64(dividend, divisor); 205 + } 206 + 207 + static inline unsigned int mmc_sector_mod(sector_t dividend, u32 divisor) 208 + { 209 + return sector_div(dividend, divisor); 198 210 } 199 211 200 212 #endif