On Feb 16, 2015, at 5:39 PM, Arend van Spriel <ar...@broadcom.com> wrote:
> On 02/16/15 15:25, Adrian Hunter wrote: >> I am in the process of adding an ACPI Device Property to specify >> the driver strength (aka drive strength, driver type) for use >> with eMMC/SD/SDIO cards, however the ACPI Specification Workgroup >> requires that Device Properties be sufficiently generic. This >> raises several questions as to what is sufficiently generic. That >> is covered in a Questions section below and is followed by a draft >> ACPI Device Property Definition. Any comments would be greatly >> appreciated. >> >> First some background: >> >> What are ACPI Device Properties and how do they relate to Device Tree >> --------------------------------------------------------------------- >> >> ACPI Device Properties are key / value pairs that can be recorded >> in the ACPI DSDT using a _DSD object with a specific UUID. Refer: >> The ACPI specification and >> >> http://www.uefi.org/sites/default/files/resources/_DSD-device-properties-UUID.pdf >> http://www.uefi.org/sites/default/files/resources/web-page-v2.pdf >> >> Linux provides a common API to read ACPI Device Properties and >> Device Tree properties. Refer: >> >> https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/base/property.c >> http://marc.info/?l=linux-kernel&m=141354745011569&w=4 >> >> Obviously, the common API only works when the same property name >> is not defined differently for the same device or class >> of devices. >> >> What is Driver Strength >> ----------------------- >> >> Both the JEDEC eMMC Specification and the SD Association Physical >> Layer Specification define Driver Strength. The specifications >> also use the terms Drive Strength and Driver Type for the same >> thing. While the specifications deal with cards, the Host >> Controller can also have a Driver Strength value, for example as >> specified in the SD Host Controller Specification. >> >> For eMMC, Driver Strength is an optional setting for the HS200 and >> HS400 transfer modes. >> >> Currently JEDEC defines: >> >> Value Nominal Impedance Approx. capability >> relative to type 0 >> >> 0 50 ohm x1 >> 1 33 ohm x1.5 >> 2 66 ohm x0.75 >> 3 100 ohm x0.5 >> 4 40 ohm x1.2 >> >> For SD/SDIO, Driver Strength is an optional setting for the >> UHS-I transfer modes. >> >> The SD Association defines: >> >> Driver Value Nominal Impedance Approx. capability >> Type relative to type 0 >> >> A 1 33 ohm x1.5 >> B 0 50 ohm x1 >> C 2 66 ohm x0.75 >> D 3 100 ohm x0.5 >> >> So the values are the same with the exception that eMMCs have the >> additional value 4 (40 ohm). It is assumed that the values will >> anyway not conflict because eMMC is not removable. >> >> The specifications state that support for Driver Strength 0 >> (Driver Type B) is both mandatory and the default value. >> In addition, cards supply a mask of supported Driver Strength >> values. Therefore the Driver Strength value is validated against >> the supported values. >> >> Questions >> --------- >> >> Question 1. Should there be separate Driver Strength values for >> cards and host controllers? >> >> There is no indication from the specifications that cards and >> host controllers need have the same value for Driver Strength. >> That suggests that separate properties for the card and host >> controller should be provided for. >> >> Originally, I was just proposing "driver-strength" for the >> Driver Strength of the card, but now will separate this into >> "card-driver-strength" and "host-driver-strength". > > Hi Adrian, > > I am not sure if it makes sense to have a 'card-driver-strength' > specification for the host controller. I have been under the impression that > the proper value for this is strongly depending on the card used in the slot. > For this reason and the fact that it is programmed in our device we added > brcm,drive-strength property in our device-tree bindings [1]. > > Regards, > Arend > > [1] > https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree/bindings/net/wireless/brcm,bcm43xx-fmac.txt Adrian, Arend, My experience is that the value also depends very much on the board design as well as the eMMC/sdio chip being used. eMMC chips have some variation. A DT entry does make sense for eMMC and other wired in devices but in this case the value is a property of the hardware and "burnt in" as a property of the board design. regards, Philip >> Question 2. To what devices should the Driver Strength properties >> bind? >> >> A Driver Strength property for the host controller obviously >> binds to the host controller device. >> >> Additionally it can be assumed that Driver Strength is a property >> of the board (e.g. a stronger Driver Strength needed because the >> eMMC is located further from the host controller), consequently >> even the Driver Strength property for the card should bind against >> the host controller. >> >> Question 3. Should there be separate Driver Strength values for >> different transfer modes? >> >> Different transfer modes can have different timing requirements >> which implies that there can be different Driver Strength values >> for each transfer mode. To support that, there would need to be >> either separate properties for each mode, or more simply two >> properties that list associated transfer modes and Driver >> Strengths. Transfer modes are not codified but have standard >> names that could be used e.g. "HS400" or "SDR104" >> >> Question 4. Should there be separate Driver Strength values for >> different frequencies? >> >> To be generic, another property would be needed to specify the >> frequency from which the Driver Strength is needed. >> >> Question 5. Should there be separate Driver Strength values for >> different voltages? >> >> UHS-I modes all have the same signal voltage (1.8V) however HS200 >> and HS400 support both 1.2V and 1.8V. >> That could be handled by having having different mode strings for >> the variants. i.e. "HS200", "HS200-1.2V", "HS200-1.8V", "HS400", >> "HS400-1.2V", 'HS400-1.8V" >> >> Question 6. Should there be separate Driver Strength values for >> different slots? >> >> In order to support multiple slots, the slot number can be appended >> to the property names to define a separate set of properties for >> each slot. >> >> Question 7. Should the possibility of multiple cards in the same >> slot be supported? >> >> Linux does not support having multiple cards in the same slot. >> Presumably, the Driver Strength for each card would bind to the >> card device, which would require defining how card devices are >> identified. That might be possible, but it is out of scope. >> >> ACPI Device Property definitions: >> --------------------------------- >> >> Based on my answers to the questions, the ACPI Device Property >> definitions would look like this: >> >> The following Device Properties are for general use with >> any eMMC, SD card, or SDIO host controller. >> >> --------------------------------------------------------------------------- >> Property: card-driver-strength-0 >> Value: Package of Integers >> Description: >> If present, defines a list of the driver strength values >> for a card in slot 0. The driver strength is an optional >> setting defined by the JEDEC eMMC specification or the >> SD Association Physical Layer specification, for use with >> HS200/HS400 or UHS-I transfer modes. In absence of this >> property, the default value of 0 is used. >> >> Example values: >> >> Value Nominal Impedance Approx. capability >> relative to type 0 >> >> 0 50 ohm x1 >> 1 33 ohm x1.5 >> 2 66 ohm x0.75 >> 3 100 ohm x0.5 >> 4 40 ohm x1.2 >> >> The driver strength values associate one-to-one >> with the values of properties card-driver-strength-mode-0 and >> card-driver-strength-freq-0. Transfer modes or frequencies not >> specified will have the default driver strength of 0. >> Neither card-driver-strength-mode-0 nor card-driver-strength-freq-0 >> need be present in which case there must be only one driver >> strength value which will be used with all relevant transfer >> modes and frequencies. >> >> For host controllers that define multiple slots, >> the value applies to the first slot (slot 0), and >> each subsequent slot requires another property of >> the form card-driver-strength-n when n is the slot >> number (e.g. for the 2nd slot card-driver-strength-1) >> >> Example for a single slot host controller with a single value: >> Package (2) { "card-driver-strength-0", >> Package (1) { 1 } >> } >> >> Example for a multiple slot host controller with 3 slots all with >> a single value: >> Package (2) { "card-driver-strength-0", >> Package (1) { 1 } >> } >> Package (2) { "card-driver-strength-1", >> Package (1) { 3 } >> } >> Package (2) { "card-driver-strength-2", >> Package (1) { 0 } >> } >> >> --------------------------------------------------------------------------- >> Property: card-driver-strength-mode-0 >> Value: Package of Strings >> Description: >> If present, defines the transfer modes to which the values >> of card-driver-strength-0 apply. The transfer modes are >> identified by name and where necessary voltage. i.e. >> >> eMMC transfer modes: >> >> "HS200", >> "HS200-1.2V", >> "HS200-1.8V", >> "HS400", >> "HS400-1.2V", >> "HS400-1.8V", >> >> UHS-I transfer modes: >> >> "SDR12", >> "SDR25", >> "SDR50", >> "SDR104", >> "DDR50", >> >> The empty string ("") can be used to mean all modes not >> otherwise specified. The names of new modes should be >> inferred from the relevant specifications. >> >> Example for a single slot host controller with a single value for >> HS400 mode: >> Package (2) { "card-driver-strength-0", >> Package (1) { 1 } >> } >> Package (2) { "card-driver-strength-mode-0", >> Package (1) { "HS400" } >> } >> >> --------------------------------------------------------------------------- >> Property: card-driver-strength-freq-0 >> Value: Package of Integers >> Description: >> If present, defines the starting frequencies to which the values >> of card-driver-strength-0 apply. The frequency is in Hz. >> >> Example for a single slot host controller with Driver Strength 4 >> for HS400 starting at 50MHz changing to Driver Strength 1 at 100MHz. >> Package (2) { "card-driver-strength-0", >> Package (1) { 4, 1 } >> } >> Package (2) { "card-driver-strength-mode-0", >> Package (1) { "HS400", "HS400" } >> } >> Package (2) { "card-driver-strength-freq-0", >> Package (1) { 50000000, 100000000 } >> } >> >> --------------------------------------------------------------------------- >> Property: host-driver-strength-0 >> Value: Package of Integers >> Description: >> Same as card-driver-strength-0 but values are used for the >> host controller not the card. >> >> --------------------------------------------------------------------------- >> Property: host-driver-strength-mode-0 >> Value: Package of Strings >> Description: >> Same as card-driver-strength-mode-0 but values are used for the >> host controller not the card. >> >> --------------------------------------------------------------------------- >> Property: host-driver-strength-freq-0 >> Value: Package of Integers >> Same as card-driver-strength-freq-0 but values are used for the >> host controller not the card. >> >> >> >> Regards >> Adrian >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in >> the body of a message to majord...@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> Please read the FAQ at http://www.tux.org/lkml/ > -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html