Message ID | 1489408613-26915-7-git-send-email-adrian.hunter@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Mar 13, 2017 at 1:36 PM, Adrian Hunter <adrian.hunter@intel.com> wrote: > Add helper functions to enable or disable the Command Queue. > > Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Yours, Linus Walleij -- 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
On 13 March 2017 at 13:36, Adrian Hunter <adrian.hunter@intel.com> wrote: > Add helper functions to enable or disable the Command Queue. > > Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> > --- > Documentation/mmc/mmc-dev-attrs.txt | 1 + > drivers/mmc/core/mmc.c | 2 ++ > drivers/mmc/core/mmc_ops.c | 28 ++++++++++++++++++++++++++++ > drivers/mmc/core/mmc_ops.h | 2 ++ > include/linux/mmc/card.h | 1 + > 5 files changed, 34 insertions(+) > > diff --git a/Documentation/mmc/mmc-dev-attrs.txt b/Documentation/mmc/mmc-dev-attrs.txt > index 404a0e9e92b0..dcd1252877fb 100644 > --- a/Documentation/mmc/mmc-dev-attrs.txt > +++ b/Documentation/mmc/mmc-dev-attrs.txt > @@ -30,6 +30,7 @@ All attributes are read-only. > rel_sectors Reliable write sector count > ocr Operation Conditions Register > dsr Driver Stage Register > + cmdq_en Command Queue enabled: 1 => enabled, 0 => not enabled > > Note on Erase Size and Preferred Erase Size: > > diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c > index 7fd722868875..5727a0842a59 100644 > --- a/drivers/mmc/core/mmc.c > +++ b/drivers/mmc/core/mmc.c > @@ -790,6 +790,7 @@ static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width) > MMC_DEV_ATTR(raw_rpmb_size_mult, "%#x\n", card->ext_csd.raw_rpmb_size_mult); > MMC_DEV_ATTR(rel_sectors, "%#x\n", card->ext_csd.rel_sectors); > MMC_DEV_ATTR(ocr, "%08x\n", card->ocr); > +MMC_DEV_ATTR(cmdq_en, "%d\n", card->ext_csd.cmdq_en); Why do we need to be able to change this from userspace? [...] 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
On 10/04/17 14:01, Ulf Hansson wrote: > On 13 March 2017 at 13:36, Adrian Hunter <adrian.hunter@intel.com> wrote: >> Add helper functions to enable or disable the Command Queue. >> >> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> >> --- >> Documentation/mmc/mmc-dev-attrs.txt | 1 + >> drivers/mmc/core/mmc.c | 2 ++ >> drivers/mmc/core/mmc_ops.c | 28 ++++++++++++++++++++++++++++ >> drivers/mmc/core/mmc_ops.h | 2 ++ >> include/linux/mmc/card.h | 1 + >> 5 files changed, 34 insertions(+) >> >> diff --git a/Documentation/mmc/mmc-dev-attrs.txt b/Documentation/mmc/mmc-dev-attrs.txt >> index 404a0e9e92b0..dcd1252877fb 100644 >> --- a/Documentation/mmc/mmc-dev-attrs.txt >> +++ b/Documentation/mmc/mmc-dev-attrs.txt >> @@ -30,6 +30,7 @@ All attributes are read-only. >> rel_sectors Reliable write sector count >> ocr Operation Conditions Register >> dsr Driver Stage Register >> + cmdq_en Command Queue enabled: 1 => enabled, 0 => not enabled >> >> Note on Erase Size and Preferred Erase Size: >> >> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c >> index 7fd722868875..5727a0842a59 100644 >> --- a/drivers/mmc/core/mmc.c >> +++ b/drivers/mmc/core/mmc.c >> @@ -790,6 +790,7 @@ static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width) >> MMC_DEV_ATTR(raw_rpmb_size_mult, "%#x\n", card->ext_csd.raw_rpmb_size_mult); >> MMC_DEV_ATTR(rel_sectors, "%#x\n", card->ext_csd.rel_sectors); >> MMC_DEV_ATTR(ocr, "%08x\n", card->ocr); >> +MMC_DEV_ATTR(cmdq_en, "%d\n", card->ext_csd.cmdq_en); > > Why do we need to be able to change this from userspace? MMC_DEV_ATTR makes it read-only, so it is just a way for userspace to see if command queue is enabled. -- 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
On 10 April 2017 at 13:11, Adrian Hunter <adrian.hunter@intel.com> wrote: > On 10/04/17 14:01, Ulf Hansson wrote: >> On 13 March 2017 at 13:36, Adrian Hunter <adrian.hunter@intel.com> wrote: >>> Add helper functions to enable or disable the Command Queue. >>> >>> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> >>> --- >>> Documentation/mmc/mmc-dev-attrs.txt | 1 + >>> drivers/mmc/core/mmc.c | 2 ++ >>> drivers/mmc/core/mmc_ops.c | 28 ++++++++++++++++++++++++++++ >>> drivers/mmc/core/mmc_ops.h | 2 ++ >>> include/linux/mmc/card.h | 1 + >>> 5 files changed, 34 insertions(+) >>> >>> diff --git a/Documentation/mmc/mmc-dev-attrs.txt b/Documentation/mmc/mmc-dev-attrs.txt >>> index 404a0e9e92b0..dcd1252877fb 100644 >>> --- a/Documentation/mmc/mmc-dev-attrs.txt >>> +++ b/Documentation/mmc/mmc-dev-attrs.txt >>> @@ -30,6 +30,7 @@ All attributes are read-only. >>> rel_sectors Reliable write sector count >>> ocr Operation Conditions Register >>> dsr Driver Stage Register >>> + cmdq_en Command Queue enabled: 1 => enabled, 0 => not enabled >>> >>> Note on Erase Size and Preferred Erase Size: >>> >>> diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c >>> index 7fd722868875..5727a0842a59 100644 >>> --- a/drivers/mmc/core/mmc.c >>> +++ b/drivers/mmc/core/mmc.c >>> @@ -790,6 +790,7 @@ static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width) >>> MMC_DEV_ATTR(raw_rpmb_size_mult, "%#x\n", card->ext_csd.raw_rpmb_size_mult); >>> MMC_DEV_ATTR(rel_sectors, "%#x\n", card->ext_csd.rel_sectors); >>> MMC_DEV_ATTR(ocr, "%08x\n", card->ocr); >>> +MMC_DEV_ATTR(cmdq_en, "%d\n", card->ext_csd.cmdq_en); >> >> Why do we need to be able to change this from userspace? > > MMC_DEV_ATTR makes it read-only, so it is just a way for userspace to see if > command queue is enabled. Of course! Thanks for the clarification - and yes, that makes sense! 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 --git a/Documentation/mmc/mmc-dev-attrs.txt b/Documentation/mmc/mmc-dev-attrs.txt index 404a0e9e92b0..dcd1252877fb 100644 --- a/Documentation/mmc/mmc-dev-attrs.txt +++ b/Documentation/mmc/mmc-dev-attrs.txt @@ -30,6 +30,7 @@ All attributes are read-only. rel_sectors Reliable write sector count ocr Operation Conditions Register dsr Driver Stage Register + cmdq_en Command Queue enabled: 1 => enabled, 0 => not enabled Note on Erase Size and Preferred Erase Size: diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 7fd722868875..5727a0842a59 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -790,6 +790,7 @@ static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width) MMC_DEV_ATTR(raw_rpmb_size_mult, "%#x\n", card->ext_csd.raw_rpmb_size_mult); MMC_DEV_ATTR(rel_sectors, "%#x\n", card->ext_csd.rel_sectors); MMC_DEV_ATTR(ocr, "%08x\n", card->ocr); +MMC_DEV_ATTR(cmdq_en, "%d\n", card->ext_csd.cmdq_en); static ssize_t mmc_fwrev_show(struct device *dev, struct device_attribute *attr, @@ -845,6 +846,7 @@ static ssize_t mmc_dsr_show(struct device *dev, &dev_attr_rel_sectors.attr, &dev_attr_ocr.attr, &dev_attr_dsr.attr, + &dev_attr_cmdq_en.attr, NULL, }; ATTRIBUTE_GROUPS(mmc_std); diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c index fe80f26d6971..24c58d24c19a 100644 --- a/drivers/mmc/core/mmc_ops.c +++ b/drivers/mmc/core/mmc_ops.c @@ -838,3 +838,31 @@ int mmc_can_ext_csd(struct mmc_card *card) { return (card && card->csd.mmca_vsn > CSD_SPEC_VER_3); } + +static int mmc_cmdq_switch(struct mmc_card *card, bool enable) +{ + u8 val = enable ? EXT_CSD_CMDQ_MODE_ENABLED : 0; + int err; + + if (!card->ext_csd.cmdq_support) + return -EOPNOTSUPP; + + err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_CMDQ_MODE_EN, + val, card->ext_csd.generic_cmd6_time); + if (!err) + card->ext_csd.cmdq_en = enable; + + return err; +} + +int mmc_cmdq_enable(struct mmc_card *card) +{ + return mmc_cmdq_switch(card, true); +} +EXPORT_SYMBOL_GPL(mmc_cmdq_enable); + +int mmc_cmdq_disable(struct mmc_card *card) +{ + return mmc_cmdq_switch(card, false); +} +EXPORT_SYMBOL_GPL(mmc_cmdq_disable); diff --git a/drivers/mmc/core/mmc_ops.h b/drivers/mmc/core/mmc_ops.h index 74beea8a9c7e..978bd2e60f8a 100644 --- a/drivers/mmc/core/mmc_ops.h +++ b/drivers/mmc/core/mmc_ops.h @@ -46,6 +46,8 @@ int mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value, void mmc_start_bkops(struct mmc_card *card, bool from_exception); int mmc_can_reset(struct mmc_card *card); int mmc_flush_cache(struct mmc_card *card); +int mmc_cmdq_enable(struct mmc_card *card); +int mmc_cmdq_disable(struct mmc_card *card); #endif diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 119ef8f0155c..94637796b99c 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -89,6 +89,7 @@ struct mmc_ext_csd { unsigned int boot_ro_lock; /* ro lock support */ bool boot_ro_lockable; bool ffu_capable; /* Firmware upgrade support */ + bool cmdq_en; /* Command Queue enabled */ bool cmdq_support; /* Command Queue supported */ unsigned int cmdq_depth; /* Command Queue depth */ #define MMC_FIRMWARE_LEN 8
Add helper functions to enable or disable the Command Queue. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> --- Documentation/mmc/mmc-dev-attrs.txt | 1 + drivers/mmc/core/mmc.c | 2 ++ drivers/mmc/core/mmc_ops.c | 28 ++++++++++++++++++++++++++++ drivers/mmc/core/mmc_ops.h | 2 ++ include/linux/mmc/card.h | 1 + 5 files changed, 34 insertions(+)