This change adds the use of devfreq to MMC.
Both eMMC and SD card will use it.
For some workloads, such as video playback, it isn't
necessary for these cards to run at high speed.
Running at lower frequency, for example 52MHz, in such
cases can still meet the deadlines for data transfers.
Scaling down the clock frequency dynamically has power
savings not only because the bus is running at lower frequency
but also has an advantage of scaling down the system core
voltage, if supported.
Provide an ondemand clock scaling support similar to the
cpufreq ondemand governor having two thresholds,
up_threshold and down_threshold to decide whether to
increase the frequency or scale it down respectively.
The sampling interval is in the order of milliseconds.
If sampling interval is too low, frequent switching of
frequencies can lead to high power consumption and if
sampling interval is too high, the clock scaling logic
would take long time to realize that the underlying
hardware (controller and card) is busy and scale up
the clocks.
Change-Id: I58ddbd93648ded82b304411956e035fb353cd97e
Signed-off-by: Talel Shenhar <tatias@codeaurora.org>
[subhashj@codeaurora.org: fixed trivial merge conflicts & compilation
errors]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
In order to boost mmc performance on various platforms,
add support for configuring whether set_wake_up_idle()
should be called on the mmc queue thread (mmcqd).
The decision will be set in each individual platform's
dts file.
CRs-Fixed: 787554
Change-Id: I3989d3f5b8228785e6d3bc49c7eb01ebf2fa2f38
Signed-off-by: Dov Levenglick <dovl@codeaurora.org>
[subhashj@codeaurora.org: fixed trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
MSM8996-V2 and MSM8996-V3 has different sdcc minor
number compared to MSM8996-v1.
Include these minor numbers as well for fixing
clk-gating logic.
Change-Id: Ie9c797589151bcfc17c7ddee33dd93d9ea683822
Signed-off-by: Ritesh Harjani <riteshh@codeaurora.org>
Signed-off-by: Talel Shenhar <tatias@codeaurora.org>
eMMC cards with EXT_CSD version >= 7, optionally support command
queuing feature as defined by JEDEC eMMC5.1. Add support for probing
command queue feature for such type of cards.
Change-Id: I9454d0d6997ccbd1778a147354859467f4a9a7d3
Signed-off-by: Sujit Reddy Thumma <sthumma@codeaurora.org>
Signed-off-by: Asutosh Das <asutoshd@codeaurora.org>
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
[subhashj@codeaurora.org: fixed trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
This is needed by ICE (Inline Crypto Engine) driver to get
the ICE configuration data from the request.
Change-Id: Ie69c64f4dc0c31290dec50d905e8b3d436c86d62
Signed-off-by: Sahitya Tummala <stummala@codeaurora.org>
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
This change fixes the sequence for runtime suspend.
Before this change, clock scaling logic was initialized
during runtime suspend instead of calling
destruction API of clock scaling.
This change fixes this issue by calling the right clock scaling
API during SD runtime suspend/resume.
Change-Id: I6044f65de55f3eb683747a09b1e20322342222c2
Signed-off-by: Talel Shenhar <tatias@codeaurora.org>
[subhashj@codeaurora.org: fixed trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
SDHC core with new 14lpp tech DLL should not enable
PWRSAVE_DLL since such controller's internal gating
cannot meet following MCLK requirement:
when MCLK is gated OFF, it is not gated for less than 0.5us
and MCLK must be switched on for at-least 1us before DATA
starts coming.
Add support for this new requirement.
Change-Id: Ief03926e0b9c6ff2f6335a422c576dd489fba9d5
Signed-off-by: Ritesh Harjani <riteshh@codeaurora.org>
sdhci_set_clock() has been turned into a generic library function,
all calls to change clock rate needs to call the platform specific
set_clock which will call into the generic library after performing
platform specific operations. Fix this when disabling clocks.
Change-Id: Ib01b1984291682dad709a3e38500ad31e2d3e4bc
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
Prevent null pointer dereference when accessing ocr stored in the card
structure in case mmc_sd_init_card() had failed before allocating the
card structure and we are retrying the init.
Change-Id: I15365804e0986e01339ccaefdffdfaf9fd319160
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
Instrument the sdhci-msm platform driver with tracepoints to aid in
debugging issues and identifying latencies in the following
paths:
* System suspend/resume
* Runtime suspend/resume
Change-Id: I4fed1c2ccba7d5d7f978f161e7985c98e869d1d8
Signed-off-by: Konstantin Dorfman <kdorfman@codeaurora.org>
Instrument the mmc core layer with tracepoints to aid in
debugging issues and identifying latencies in the following
paths:
* System suspend/resume
* Runtime suspend/resume
Change-Id: I1e0fa7d3f8b54c102b4055f910b58a42412748da
Signed-off-by: Konstantin Dorfman <kdorfman@codeaurora.org>
[subhashj@codeaurora.org: fixed trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
The SDHC controller capability was limited to 32-bit ADMA if
the system on chip supported only 32-bit address bus width,
eventhough the controller was 64-bit ADMA capable for potential
memory savings. Remove this limitation on systems that support
larger address bus width.
Change-Id: I79b296bc4dff015dac76036c231d197748aa03cb
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
Only 1.8V is used on IO pad lines for eMMCs' on msm platforms. So this
means for any SDHC core on msm platforms used with eMMCs' should have
PAD_PWR_SWITCH bit set indicating that 1.8V is used for IO lines. So far
this did not matter as all eMMCs' SDHC pads were single voltage and the
PAD_PWR_SWTICH bit did not make a difference.
But when a SDHC core that supports dual voltage pad is used for
initializing eMMC, the BUS_ON pwr_irq generated would cause the pad
to be set at a logical HIGH in the driver (as it should since the
bus is being turned ON) but then the driver does not set or clear
the PAD_PWR_SWITCH for eMMCs which causes the communication between
the host and card to break down. So even though the IO pad is driven
at 1.8V, the host is not told that it should switch to 1.8V IO from
3.0V (default).
This does not matter for SD cards for when they are turned ON, they always
start with 3.0V on IO pad. But for eMMC instead of not setting or clearing
the PAD_PWR_SWITCH bit when the bus is turned ON, check the voltage being
supplied on the IO pad and based on that set or clear the PAD_PWR_SWITCH.
Change-Id: I7756731760298c6766d00a22160c6328faaaf4a7
Signed-off-by: Krishna Konda <kkonda@codeaurora.org>
The platform specific set_clock must be called even if the clock
rates are same but the timing modes are different as there may be
some platform specific handling required for different timing modes.
Change-Id: Ia7102b29a8979ad88820c60ed5874d4b2dab71a0
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
Disable clock scaling only when clock scaling was properly initialized.
Change-Id: I7ec45e49c5ce18ea6aef0e272e79325fa8952c5b
Signed-off-by: Konstantin Dorfman <kdorfman@codeaurora.org>
Add registration and initialization of platform driver to pm core for
system suspend/resume and runtime suspend/resume.
Platform device runtime power management uses the autosuspend pm core
feature with MSM_AUTOSUSPEND_DELAY (100ms).
MMC core power management is configured to aggressively suspend the card on
runtime suspend (and full initialization on runtime resume).
Change-Id: I45f0b2f1709361f41f7c38c57b95f692f8a0e486
Signed-off-by: Konstantin Dorfman <kdorfman@codeaurora.org>
Keep pwr_irq as field in sdhci_msm_host struct instead of local
sdhci_msm_probe variable. It will be used later in power management
callbacks.
Change-Id: I7b3629b958e953bab66c32e6131b7fd577c7c9f2
Signed-off-by: Konstantin Dorfman <kdorfman@codeaurora.org>
[subhashj@codeaurora.org: fixed trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
During mmc_power_off in sdhci_do_set_ios clock to the card needs
to be turned off as a last step after the power is turned off.
The existing check turns off the clock first and thereby never
turns off the power.
Change-Id: I961b090c814d9182aff11da7a3b090d9a84fc299
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
Switch to using pr_err_ratelimited in order to avoid
flooding the logs in case of error function gets
called repeatedly.
Change-Id: I636dc933915127a43ad4da87a565f8f585e6df90
Signed-off-by: Talel Shenhar <tatias@codeaurora.org>
On kernel-3.14 mmc_claim_host is replaced by mmc_get_card to also
call pm_runtime_get_sync.
mmc_blk_ioctl_rpmb_cmd has asymmetric claim and release as mmc_claim_host
was used to get the lock, but mmc_put_card was used for the release.
To fix this and prevent bad counter of runtime PM, mmc_claim_host
should be replaced with mmc_get_card.
Change-Id: I7c2218623fddfbeed0489aed330c9fe6e8bc5338
Signed-off-by: Maya Erez <merez@codeaurora.org>
This change prevents enabling cache for cards with
product name MMC16G.
This change is workaround the problem of long timeouts for cache
operations.
Change-Id: Ib683809faed8afc74bf0faff8636ead210013e6f
Signed-off-by: Talel Shenhar <tatias@codeaurora.org>
This change allows us to prevent cache enable for certain
cards that have broken cache functionality.
Change-Id: Iea3f8c8f4e5498a8742fa408a19e3e169d1fa8cb
Signed-off-by: Talel Shenhar <tatias@codeaurora.org>
[subhashj@codeaurora.org: fixed trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
Certain cards might get broken when HPI feature is used.
This patch uses the HPI quirk to avoid the usage
of HPI on Kingston MMC16G cards that have
EXT_CSD_REV = 5 (mmc version 4.41)
Change-Id: I4572eb9e71a281b56e25e5b4864d5777b16e2bc2
Signed-off-by: Talel Shenhar <tatias@codeaurora.org>
Certain cards might get broken when HPI feature is used.
This patch allows host to avoid using HPI for such
buggy cards by adding new quirk.
As some of the other features like BKOPs/Cache are
dependent on HPI feature, those features would also
get disabled if HPI is disabled.
Change-Id: I93a8810e4031eafcd44b5152296e065dc3330b63
Signed-off-by: Talel Shenhar <tatias@codeaurora.org>
In case of a flush request timeout, an error is returned
to the block layer.
The problem with this is that the eMMC card is left in
programming state and while the device is in the
programming state it cannot serve any request.
This commit moves the card out of the programming state,
in case of timeout, by issuing HPI, thereby allowing the
device to continue serving requests.
Some filesystems, such as EXT4, remount the partition as
read-only after receiving an error from the block layer, thus
this change will allow the remounted partition to work as the
card can serve read request thanks to the HPI.
In case where the card doesn't even respond to HPI it
cannot serve any request, thereby, this commit reset the
card in such catastrophic cases.
Change-Id: Idbca6ff3a420a954c61cf4fb79c9094542888d89
Signed-off-by: Talel Shenhar <tatias@codeaurora.org>
This change allows the usage of quirks based on
the register value of EXT_CSD_REV. It was seen for several
eMMC cards that same issues, such as data corruption
while using cache, were relevant for all eMMC cards
having the same EXT_CSD_REV value.
This change allows us to distinguish between cards based
on this register.
Change-Id: I1663891c367a59b520bc505641c6c4ddad56fd1a
Signed-off-by: Talel Shenhar <tatias@codeaurora.org>
The latest version of the SDCC core requires a change in the reset
sequence for DLL tuning. Make necessary changes as needed.
Change-Id: I69e972c08e89efebff9822de6d0e59692784652e
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
During MMC_POWER_UP the clocks are turned off when enabling power
to the card. Make sure the controller clocks are enabled for
normal register access.
Change-Id: Iad6fc4dfc6e44d0a609b66432b0985d589c3e5b9
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
Disable the following pm functionalities till they are functional:
* clk scaling (need to verify full functionality)
* clk gating (crashes when ungating the clock)
Change-Id: I0962d46d85415e77b978e1f7dd9f2f49446655bb
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
[subhashj@codeaurora.org: fixed trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
A new timing mode has been introduced to differentiate SD/MMC
DDR timing modes. Use the MMC specific DDR timing mode in addition
to the SD specific one when checking for timing modes.
Change-Id: Id151c0fd0dc8eccdec8f842a5ee13af415b7ffe6
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
The reset functionality has been converted to a library function.
Update the sdhci_ops function table to use the generic
sdhci_reset() library function.
Change-Id: I6c535cd5a641e23399bad284e9a1f89ac8811e62
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
The generic bus width setup has been converted to a library function.
Update the sdhci_ops function table to use the generic
sdhci_set_bus_width() library function.
Change-Id: I0fb1345cab1055ed2f5f2e36debf5ea273241628
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
As part of 3.14 kernel upgrade some capabilities have been removed,
added and renamed. Make those adjusments in the sdhci-msm platform
driver.
Change-Id: Icb14a3e997875e3ab094ef51a2307972d0788a89
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
The function signature changed for sdhci_pltfm_init as part of 3.14
kernel upgrade. Make changes to reflect that.
Change-Id: I6ac6fbd9703253d31a14c07399423b1c8a0b3301
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
Add missing register defines that were removed as part of dropping
stop transmission support.
Rearrange the defines as part of 3.14 kernel upgrade.
Change-Id: Ie7c38721b4f96d066260e7aeb01043a5a909ed01
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
sdhci_update_clock() has been removed and host ops set_clock() is called
directly in various places. Release the host spinlock before calling
host ops set_clock().
Change-Id: Ia12917286a7d791e6a6ad826c0b7edd71c8694ae
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
The array values are readonly and initialized during declaration.
Change-Id: I3abbf15a441300af9828ac907ea67975302d5352
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
Add a capability to identify hosts that need additional tuning for HS400
and perform a post tuning process that maybe needed for proper HS400
functionality.
Change-Id: I3895aabddce4dbecb208e3c522957e656f37e30d
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
[subhashj@codeaurora.org: fixed trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
There is no need to prepare anything additional before tuning for HS400
other than updating the HS400 timing mode, so just do that.
Change-Id: Ib7a72a4bb9b901e32413acf440c925c4cd50a73d
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
[subhashj@codeaurora.org: fixed trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
With some bad SD cards, it is possible that the error recovery
procedure goes into a state where it retries the failed command
infinitely leading to CPU hog.
Fix inifinite retries when the bad SD card isn't responding to
a command even when the SD card reset mechanism is successful.
CRs-Fixed: 671153
Change-Id: Ic6db66b571aa425aec32c82d52789c68fe0cb0e9
Signed-off-by: Sujit Reddy Thumma <sthumma@codeaurora.org>
[merez@codeaurora.org: fix conflicts due to removal of sanitize
from block.c in 3.14]
Signed-off-by: Maya Erez <merez@codeaurora.org>
[subhashj@codeaurora.org: fixed trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
When handling a DISCARD operation, the MMC request data structure may be
freed in memory. Therefore, it can't be used to retrieve the cmd_flags
for checking if MMC_REQ_NOREINSERT_MASK is set:
(!(mq->mqrq_cur->req->cmd_flags & MMC_REQ_NOREINSERT_MASK)))).
To prevent the issue we should use the local variable of cmd_flags.
Change-Id: Idef53d5bd66fa6f1faaf79644c8efb5177c75e89
Signed-off-by: Maya Erez <merez@codeaurora.org>
Signed-off-by: Konstantin Dorfman <kdorfman@codeaurora.org>
[merez@codeaurora.org: fix conflicts due to removal of stop transmission]
Signed-off-by: Maya Erez <merez@codeaurora.org>
Enhance the error handling/recovery path during eMMC resume by
adding retry mechanism and by adding additional error messages
to failure cases. This may help some of the bad parts which fail
to resume sporadically.
Change-Id: I895068edb487e6a44205e0769342b2ec2c89c876
Signed-off-by: Sahitya Tummala <stummala@codeaurora.org>
[merez@codeaurora.org: fix conflicts due to addition of __mmc_resume
in 3.14 and different bus speed implementation]
Signed-off-by: Maya Erez <merez@codeaurora.org>
[venkatg@codeaurora.org: Fix args for mmc_power_up and
mmc_select_voltage to use with 3.14 kernel]
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
[subhashj@codeaurora.org: fixed trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
Fix a race condition that can lead to null pointer dereference
while the MMC transfers are going on.
1) mmc_request_done() -> mmc_wait_for_data_done ->
step1: update is_done_rcv
step2: wake_up sleeping thread (mmcqd) waiting for is_done_rcv
2) mmcqd -> mmc_wait_for_data_req_done
step4: wait for is_done_rcv or is_new_req
step5: is_new_req set from block layer context and mmcqd
is woken up
step6: let's say step1 is done, so complete the current request
step7: fetch new request and issue to host layer
step8: fetch one more request and wait for previous request to
complete
In the above execution contexts, if step4-step8 happens between step1 and
step2 a null pointer dereference is observed -
[ 29.483302] Unable to handle kernel NULL pointer dereference
at virtual address 00000488
[ 29.490366] pgd = c0004000
[ 29.493054] [00000488] *pgd=00000000
[ 29.518937] PC is at do_raw_spin_lock+0x8/0x13c
[ 29.523445] LR is at _raw_spin_lock_irqsave+0x20/0x28
[ 30.108789] [<c0339cd4>] (do_raw_spin_lock+0x8/0x13c) from
[ 30.118418] [<c095d178>] (_raw_spin_lock_irqsave+0x20/0x28) from
[ 30.127445] [<c0142ef4>] (__wake_up+0x20/0x50) from
[ 30.136124] [<c0663f70>] (mmc_request_done+0x30c/0x368) from
[ 30.145932] [<c067bd98>] (sdhci_tasklet_finish+0x130/0x13c) from
Change-Id: I9a21431b5fd9bb9bbcb5c18a9895096fe845e64b
Signed-off-by: Sujit Reddy Thumma <sthumma@codeaurora.org>
[merez@codeaurora.org: fixed conflicts due to missing stop transmission]
Signed-off-by: Maya Erez <merez@codeaurora.org>
[subhashj@codeaurora.org: fixed trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
Fix race condition between mmcqd thread and the mmc_queue_suspend
updating a shared variable mq->flags, which can lead to potential
null pointer dereference as following-
Unable to handle kernel NULL pointer dereference at
virtual address 00000020
pgd = c0004000
[00000020] *pgd=00000000
mmcqd/0: 186] Internal error: Oops: 5 [#1] PREEMPT SMP ARM
CPU: 0 Tainted: G W (3.4.0-1251694-eng #1)
PC is at mmc_blk_err_check+0x20c/0x3b8
LR is at mmc_start_req+0x198/0x718
cpu0 | cpu1
x |= 1 | x |= 2
final value of x can be x = 1 or x = 2
Change-Id: Ie0fff6d6dba5aebb3584cba9fb98de24515c4cd8
Signed-off-by: Sujit Reddy Thumma <sthumma@codeaurora.org>
[merez@codeaurora.org: fix conflicts due to missing stop transmission
and changes in new request implementation in 3.14]
Signed-off-by: Maya Erez <merez@codeaurora.org>
[venkatg@codeaurora.org: Fix conflicts due to changes in 3.14 kernel]
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
[subhashj@codeaurora.org: fixed trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
If the mmc_hw_reset() fails, then host->card might be NULL in some
cases. Hence, check for reset errors and report it to the caller so
that the current request can be aborted and also check for host->card
before accessing it so as to prevent NULL pointer dereference issue.
Change-Id: Iba0f0be314474e607a40383bc0b28eef66a31d63
Signed-off-by: Sahitya Tummala <stummala@codeaurora.org>
[subhashj@codeaurora.org: fixed trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
eMMC and SD card specifications restrict the usage of a class of
commands while commands in other class are in progress. For example,
during erase operations the SD/eMMC spec. allows only CMD35, CMD36,
CMD38. If clock scaling is enabled and decide to scale up the clocks
it may be possible that CMD19/21 tuning commands are sent in between
erase commands, which is illegal as per specification.
Fix such illegal transactions to the card and also make clock scaling
statistics accountable only for read/write commands instead of time
consuming commands, like CMD38 erase, where transactions are independent
of bus frequency.
Change-Id: Iffba175787837e7f95bde8970f19d0f0f9d7d67d
Signed-off-by: Sujit Reddy Thumma <sthumma@codeaurora.org>
[merez@codeaurora.org: fix conflicts as mmc_update_clk_scaling is missing on 3.14]
Signed-off-by: Maya Erez <merez@codeaurora.org>