From: "Russell King (Oracle)" <linux@armlinux.org.uk>
To: Sven Peter <sven@svenpeter.dev>
Cc: Arnd Bergmann <arnd@arndb.de>, Lee Jones <lee@kernel.org>,
Linus Walleij <linus.walleij@linaro.org>,
Alyssa Rosenzweig <alyssa@rosenzweig.io>,
asahi@lists.linux.dev, Bartosz Golaszewski <brgl@bgdev.pl>,
Hector Martin <marcan@marcan.st>,
linux-arm-kernel@lists.infradead.org,
"open list:GPIO SUBSYSTEM" <linux-gpio@vger.kernel.org>
Subject: Re: [PATCH 4/6] platform/apple: Add new Apple Mac SMC driver
Date: Mon, 5 Sep 2022 11:55:54 +0100 [thread overview]
Message-ID: <YxXVuvXZIWBDW0/r@shell.armlinux.org.uk> (raw)
In-Reply-To: <1c876ae2-9d8b-4f47-8ca7-797fb484ad03@www.fastmail.com>
On Thu, Sep 01, 2022 at 07:50:31PM +0200, Sven Peter wrote:
> Thanks for trying to upstream this!
> I just have three minor comments:
>
> On Thu, Sep 1, 2022, at 15:54, Russell King wrote:
> > + dev_info(dev, "Initialized (%d keys %p4ch..%p4ch)\n",
> > + smc->key_count, &smc->first_key, &smc->last_key);
>
> I don't think upstream supports %p4ch. marcan added that format in our downstream
> tree iirc.
Before that can be resolved, we need the discussion about how to deal
with SMC keys to be resolved. Andy was suggesting using the endian
conversion macros in the GPIO driver to convert the hex XX value in
the gPXX keys which doesn't sound right.
If we changed the smc_key typedef to something like:
typedef struct { char s[4]; } smc_key;
Then we can safely print them using %.4s. We can also pass:
key.s + 2
to hex2bin() since it will be in the correct order. We may need to
do some fixups when placing the key in the SMC messages.
If I'm reading the smc_rtkit code correctly, then
apple_smc_rtkit_get_key_by_index() swabs the returned key from the
SMC, but when we pass keys to the SMC, we don't swab them? So keys
to the SMC are in reverse byte order compared to the natural string,
but keys returned from the SMC are in conventional byte order for a
string? Is that right, or am I getting confused?
What I mean is that for a key ABCD, it's passed to the SMC as A in
bits 63..56, B in 55..48, C in 47..40, D in 39..32. When we receive
a key, A is in bits 7..0, B in bits 15..8, C in bits 23..16 and D
in 31..24?
> > +static int apple_smc_rtkit_write_key_atomic(void *cookie, smc_key key,
> > void *buf, size_t size)
> > +{
> > + struct apple_smc_rtkit *smc = cookie;
> > + int ret;
> > + u64 msg;
> > + u8 result;
> > +
> > + if (size > SMC_SHMEM_SIZE || size == 0)
> > + return -EINVAL;
> > +
> > + if (!smc->alive)
> > + return -EIO;
> > +
> > + memcpy_toio(smc->shmem.iomem, buf, size);
> > + smc->msg_id = (smc->msg_id + 1) & 0xf;
> > + msg = (FIELD_PREP(SMC_MSG, SMC_MSG_WRITE_KEY) |
> > + FIELD_PREP(SMC_SIZE, size) |
> > + FIELD_PREP(SMC_ID, smc->msg_id) |
> > + FIELD_PREP(SMC_DATA, key));
> > + smc->atomic_pending = true;
> > +
> > + ret = apple_rtkit_send_message(smc->rtk, SMC_ENDPOINT, msg, NULL,
> > true);
> > + if (ret < 0) {
> > + dev_err(smc->dev, "Failed to send command (%d)\n", ret);
> > + return ret;
> > + }
> > +
> > + while (smc->atomic_pending) {
> > + ret = apple_rtkit_poll(smc->rtk);
> > + if (ret < 0) {
> > + dev_err(smc->dev, "RTKit poll failed (%llx)", msg);
> > + return ret;
> > + }
> > + udelay(100);
> > + }
>
> I guess we could use try_wait_for_completion here and get rid of the special
> smc->atomic_pending path. Not sure if it makes the code much simpler though.
Delving into this, it seems this code is buggy.
If apple_smc_rtkit_write_key_atomic() is used from atomic contexts,
what prevents apple_smc_rtkit_write_key_atomic() being called while
apple_smc_rtkit_write_key() is executing?
Both these functions copy data to smc->shmem.iomem, so a call to
the atomic function will overwrite the non-atomic function's data.
Given that there doesn't seem to be a way to specify the offset of
the data in shmem to the SMC, are we sure that we can sensibly
support an atomic write operation?
Using try_wait_for_completion() just ends up destroying more
context in the non-atomic path.
In any case, how can we be sure that the call to
apple_smc_rtkit_recv_early() was really meant to complete the atomic
write as opposed to something else? I guess that would trigger a
"Command sequence mismatch" and an EIO error if it happens. Have
these occurred?
Lastly:
#define SMC_SHMEM_SIZE 0x1000
#define SMC_WSIZE GENMASK(31, 24)
#define SMC_SIZE GENMASK(23, 16)
The size fields are one byte, but we error out if the size is larger
than the shmem size:
if (size > SMC_SHMEM_SIZE || size == 0)
return -EINVAL;
but we still try to squeeze the size into this byte-wide field:
FIELD_PREP(SMC_SIZE, size) |
which isn't goint to work. If the size is limited by the protocol to
255 bytes (or is it 256, where 0 means 256?) then surely we should be
erroring out if size is above that maximum rather than the shmem size.
> > +static int apple_smc_rtkit_probe(struct platform_device *pdev)
> > +{
> > + struct device *dev = &pdev->dev;
> > + struct apple_smc_rtkit *smc;
> > + int ret;
> > +
> > + smc = devm_kzalloc(dev, sizeof(*smc), GFP_KERNEL);
> > + if (!smc)
> > + return -ENOMEM;
> > +
> > + smc->dev = dev;
> > +
> > + smc->sram = platform_get_resource_byname(pdev, IORESOURCE_MEM,
> > "sram");
> > + if (!smc->sram)
> > + return dev_err_probe(dev, EIO,
> > + "No SRAM region");
> > +
> > + smc->sram_base = devm_ioremap_resource(dev, smc->sram);
> > + if (IS_ERR(smc->sram_base))
> > + return dev_err_probe(dev, PTR_ERR(smc->sram_base),
> > + "Failed to map SRAM region");
> > +
> > + smc->rtk =
> > + devm_apple_rtkit_init(dev, smc, NULL, 0, &apple_smc_rtkit_ops);
> > + if (IS_ERR(smc->rtk))
> > + return dev_err_probe(dev, PTR_ERR(smc->rtk),
> > + "Failed to intialize RTKit");
> > +
> > + ret = apple_rtkit_wake(smc->rtk);
> > + if (ret != 0)
> > + return dev_err_probe(dev, ret,
> > + "Failed to wake up SMC");
> > +
> > + ret = apple_rtkit_start_ep(smc->rtk, SMC_ENDPOINT);
> > + if (ret != 0) {
> > + dev_err(dev, "Failed to start endpoint");
> > + goto cleanup;
> > + }
> > +
> > + init_completion(&smc->init_done);
> > + init_completion(&smc->cmd_done);
> > +
> > + ret = apple_rtkit_send_message(smc->rtk, SMC_ENDPOINT,
> > + FIELD_PREP(SMC_MSG, SMC_MSG_INITIALIZE), NULL, false);
> > + if (ret < 0)
> > + return dev_err_probe(dev, ret,
> > + "Failed to send init message");
>
> This should probably also "goto cleanup" here just in case we somehow manage to
> send the shutdown message after this one failed.
Good point, thanks.
--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!
next prev parent reply other threads:[~2022-09-05 10:56 UTC|newest]
Thread overview: 171+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-01 13:54 [PATCH 0/6] Add Apple Mac System Management Controller GPIOs Russell King (Oracle)
2022-09-01 13:54 ` [PATCH 1/6] dt-bindings: mfd: add binding for Apple Mac System Management Controller Russell King (Oracle)
2022-09-01 15:06 ` Krzysztof Kozlowski
2022-09-01 15:12 ` Russell King (Oracle)
2022-09-01 15:15 ` Krzysztof Kozlowski
2022-09-01 15:24 ` Russell King (Oracle)
2022-09-01 15:45 ` Krzysztof Kozlowski
2022-09-01 15:56 ` Russell King (Oracle)
2022-09-01 16:25 ` Krzysztof Kozlowski
2022-09-01 16:47 ` Russell King (Oracle)
2022-09-01 22:33 ` Rob Herring
2022-09-02 15:06 ` Mark Kettenis
2022-09-02 17:28 ` Rob Herring
2022-09-05 10:24 ` Russell King (Oracle)
2022-09-06 9:04 ` Russell King (Oracle)
2022-09-06 9:31 ` Mark Kettenis
2022-09-06 11:22 ` Linus Walleij
2022-09-06 11:36 ` Hector Martin
2022-09-06 11:57 ` Linus Walleij
2022-09-06 13:28 ` Hector Martin
2022-09-06 13:43 ` Russell King (Oracle)
2022-09-06 13:53 ` Hector Martin
2022-09-06 14:25 ` Mark Kettenis
2022-09-06 14:54 ` Russell King (Oracle)
2022-09-06 15:38 ` Mark Kettenis
2022-09-06 15:55 ` Rob Herring
2022-09-06 13:46 ` Linus Walleij
2022-09-06 15:34 ` Rob Herring
2022-09-06 16:10 ` Rob Herring
2022-09-06 17:00 ` Hector Martin
2022-09-06 17:35 ` Rob Herring
2022-09-06 17:40 ` Sven Peter
2022-09-06 18:38 ` Hector Martin
2022-09-07 9:39 ` Mark Kettenis
2022-09-01 22:26 ` Rob Herring
2022-09-02 14:49 ` Mark Kettenis
2022-09-02 17:04 ` Rob Herring
2022-09-01 19:14 ` Rob Herring
2022-09-01 13:54 ` [PATCH 2/6] dt-bindings: gpio: add binding for the GPIO block for Apple Mac SMC Russell King (Oracle)
2022-09-01 15:11 ` Krzysztof Kozlowski
2022-09-01 15:14 ` Russell King (Oracle)
2022-09-01 13:54 ` [PATCH 3/6] soc: apple: rtkit: Add apple_rtkit_poll Russell King
2022-09-01 17:00 ` Sven Peter
2022-09-01 17:25 ` Eric Curtin
2022-09-01 13:54 ` [PATCH 4/6] platform/apple: Add new Apple Mac SMC driver Russell King
2022-09-01 17:50 ` Sven Peter
2022-09-05 10:55 ` Russell King (Oracle) [this message]
2022-09-05 16:53 ` Hector Martin
2022-09-01 19:26 ` Andy Shevchenko
2022-09-02 6:45 ` Sven Peter
2022-09-05 14:45 ` Hector Martin
2022-09-05 15:00 ` Andy Shevchenko
2022-09-08 10:58 ` Lee Jones
2022-09-08 11:28 ` Hector Martin
2022-09-08 12:31 ` Lee Jones
2022-09-08 12:58 ` Hector Martin
2022-09-08 13:29 ` Linus Walleij
2022-09-08 13:36 ` Lee Jones
2022-09-08 13:58 ` Hector Martin
2022-09-09 7:50 ` Lee Jones
2022-09-12 10:03 ` Russell King (Oracle)
2022-09-12 10:55 ` Lee Jones
2022-10-28 15:36 ` Russell King (Oracle)
2022-10-31 8:46 ` Lee Jones
2022-10-31 9:03 ` Hector Martin
2022-10-31 9:44 ` Russell King (Oracle)
2022-10-31 17:24 ` Lee Jones
2022-10-31 19:47 ` Russell King (Oracle)
2022-11-01 9:59 ` Lee Jones
2022-10-29 6:40 ` Hector Martin
2022-10-31 8:48 ` Lee Jones
2022-10-31 8:58 ` Hector Martin
2022-10-31 9:29 ` Lee Jones
2022-10-31 9:44 ` Hector Martin
2022-10-31 17:23 ` Lee Jones
2022-10-31 19:34 ` Russell King (Oracle)
2022-11-02 13:12 ` Lee Jones
2022-11-02 15:54 ` Russell King (Oracle)
2022-09-01 13:54 ` [PATCH 5/6] gpio: Add new gpio-macsmc driver for Apple Macs Russell King
2022-09-01 18:55 ` Andy Shevchenko
2022-09-01 21:51 ` Martin Povišer
2022-09-02 6:31 ` Andy Shevchenko
[not found] ` <3B649A66-8116-432D-B88A-B5CE493EF930@cutebit.org>
[not found] ` <CAHp75VeB3_sZ2vsSxMSsLeJSkyemDh9iOPHXJCN1mhodA13LNQ@mail.gmail.com>
2022-09-02 11:12 ` Martin Povišer
2022-09-02 13:33 ` Andy Shevchenko
2022-09-02 13:36 ` Andy Shevchenko
2022-09-02 13:37 ` Martin Povišer
2022-09-02 14:41 ` Andy Shevchenko
2022-09-02 14:45 ` Russell King (Oracle)
2022-09-02 10:05 ` Russell King (Oracle)
2022-09-02 10:37 ` Andy Shevchenko
2022-09-02 11:32 ` Russell King (Oracle)
2022-09-02 13:39 ` Andy Shevchenko
2022-09-02 14:46 ` Russell King (Oracle)
2022-09-02 14:53 ` Andy Shevchenko
2022-09-02 15:34 ` Russell King (Oracle)
2022-09-02 15:43 ` Andy Shevchenko
2022-09-05 10:20 ` Russell King (Oracle)
2022-09-05 10:32 ` Andy Shevchenko
2022-09-05 13:10 ` Russell King (Oracle)
2022-09-05 13:16 ` Andy Shevchenko
2022-09-05 14:01 ` Russell King (Oracle)
2022-09-05 14:02 ` Russell King (Oracle)
2022-09-05 14:42 ` Andy Shevchenko
2022-09-05 14:53 ` Russell King (Oracle)
2022-09-05 14:50 ` Andy Shevchenko
2022-09-05 15:52 ` Hector Martin
2022-09-05 15:56 ` Russell King (Oracle)
2022-09-05 15:32 ` Russell King (Oracle)
2022-09-05 15:44 ` Martin Povišer
2022-09-05 15:58 ` Hector Martin
2022-09-05 16:13 ` Russell King (Oracle)
2022-09-05 19:10 ` Linus Walleij
2022-09-06 6:51 ` Hector Martin
2022-09-05 15:47 ` Hector Martin
2022-09-05 15:39 ` Hector Martin
2022-09-05 15:16 ` Hector Martin
2022-09-05 15:04 ` Hector Martin
2022-09-02 9:42 ` Linus Walleij
2022-09-01 13:54 ` [PATCH 6/6] gpio: macsmc: Add IRQ support Russell King
2022-09-01 18:03 ` Andy Shevchenko
2022-09-05 11:54 ` Russell King (Oracle)
[not found] ` <CAHp75VeDGCp8J6wnmCqGpV++vs2Zur9Mfp71Dk8dVXcuHFnCrQ@mail.gmail.com>
2022-09-05 13:21 ` Andy Shevchenko
2022-09-02 13:21 ` Linus Walleij
2022-09-05 12:47 ` Russell King (Oracle)
2022-09-05 13:19 ` Fwd: " Andy Shevchenko
2022-09-05 21:43 ` Russell King (Oracle)
2022-09-05 13:27 ` Linus Walleij
2022-09-06 7:00 ` Hector Martin
2022-09-06 7:47 ` Russell King (Oracle)
2022-09-06 8:00 ` Hector Martin
2022-09-01 15:12 ` [PATCH 0/6] Add Apple Mac System Management Controller GPIOs Krzysztof Kozlowski
2022-10-27 15:35 ` Russell King (Oracle)
2022-11-08 16:32 ` [PATCH v3 0/7] " Russell King (Oracle)
2022-11-08 16:33 ` [PATCH v3 1/7] mfd: Add core Apple Mac SMC driver Russell King
2022-11-14 9:52 ` Lee Jones
2022-11-14 10:35 ` Andy Shevchenko
2022-11-08 16:33 ` [PATCH v3 2/7] lib/vsprintf: Add support for generic FOURCCs by extending %p4cc Russell King
2022-11-14 15:34 ` Petr Mladek
2022-11-14 15:46 ` Andy Shevchenko
2022-11-14 16:18 ` Petr Mladek
2022-11-14 16:15 ` Russell King (Oracle)
2022-11-14 16:46 ` Russell King (Oracle)
2022-11-22 12:43 ` Petr Mladek
2022-11-22 14:49 ` Petr Mladek
2022-11-08 16:33 ` [PATCH v3 3/7] dt-bindings: mfd: add binding for Apple Mac System Management Controller Russell King (Oracle)
2022-11-08 20:42 ` Linus Walleij
2022-11-08 20:55 ` Krzysztof Kozlowski
2022-11-08 22:22 ` Russell King (Oracle)
2022-11-09 8:35 ` Krzysztof Kozlowski
2022-11-09 22:17 ` Rob Herring
2022-11-10 11:35 ` Hector Martin
2022-11-10 11:48 ` Russell King (Oracle)
2022-11-10 14:00 ` Krzysztof Kozlowski
2022-11-10 14:14 ` Russell King (Oracle)
2022-11-10 14:21 ` Krzysztof Kozlowski
2022-11-10 14:23 ` Russell King (Oracle)
2022-11-10 14:36 ` Krzysztof Kozlowski
2022-11-10 14:43 ` Russell King (Oracle)
2022-11-14 10:05 ` Lee Jones
2022-11-08 22:30 ` Rob Herring
2022-11-08 16:33 ` [PATCH v3 4/7] platform/apple: Add new Apple Mac SMC driver Russell King
2022-11-08 16:33 ` [PATCH v3 5/7] arm64: dts: apple: Add SMC node to t8103 devicetrees Russell King
2022-11-08 16:33 ` [PATCH v3 6/7] dt-bindings: gpio: add binding for the GPIO block for Apple Mac SMC Russell King (Oracle)
2022-11-08 20:56 ` Krzysztof Kozlowski
2022-11-08 22:09 ` Russell King (Oracle)
2022-11-09 7:31 ` Hector Martin
2022-11-09 8:36 ` Krzysztof Kozlowski
2022-11-09 9:12 ` Russell King (Oracle)
2022-11-09 9:19 ` Krzysztof Kozlowski
2022-11-08 22:30 ` Rob Herring
2022-11-08 16:33 ` [PATCH v3 7/7] gpio: Add new gpio-macsmc driver for Apple Macs Russell King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YxXVuvXZIWBDW0/r@shell.armlinux.org.uk \
--to=linux@armlinux.org.uk \
--cc=alyssa@rosenzweig.io \
--cc=arnd@arndb.de \
--cc=asahi@lists.linux.dev \
--cc=brgl@bgdev.pl \
--cc=lee@kernel.org \
--cc=linus.walleij@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-gpio@vger.kernel.org \
--cc=marcan@marcan.st \
--cc=sven@svenpeter.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).