From: Jonathan Corbet <corbet@lwn.net>
To: Chen Yu <yu.c.chen@intel.com>, linux-acpi@vger.kernel.org
Cc: linux-kernel@vger.kernel.org,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
Len Brown <len.brown@intel.com>,
Dan Williams <dan.j.williams@intel.com>,
Andy Shevchenko <andriy.shevchenko@intel.com>,
Aubrey Li <aubrey.li@intel.com>, Ashok Raj <ashok.raj@intel.com>,
Chen Yu <yu.c.chen@intel.com>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
"H. Peter Anvin" <hpa@zytor.com>,
linux-doc@vger.kernel.org, x86@kernel.org
Subject: Re: [PATCH 1/5][RFC] Documentation: Introduce Platform Firmware Runtime Update documentation
Date: Tue, 07 Sep 2021 09:23:53 -0600 [thread overview]
Message-ID: <87sfygtnna.fsf@meer.lwn.net> (raw)
In-Reply-To: <c135a9bf742f3c2181650914f40ce563d7a3dc48.1631025237.git.yu.c.chen@intel.com>
Thanks for adding to the documentation. I have a few nits for you...
Chen Yu <yu.c.chen@intel.com> writes:
> Add the Platform Firmware Runtime Update/Telemetry documentation.
>
> Signed-off-by: Chen Yu <yu.c.chen@intel.com>
> ---
> Documentation/x86/pfru.rst | 98 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 98 insertions(+)
> create mode 100644 Documentation/x86/pfru.rst
When you add a new RST file, you also need to find a spot for it in
index.rst so it becomes part of the docs build.
> diff --git a/Documentation/x86/pfru.rst b/Documentation/x86/pfru.rst
> new file mode 100644
> index 000000000000..321729f46737
> --- /dev/null
> +++ b/Documentation/x86/pfru.rst
> @@ -0,0 +1,98 @@
> +.. SPDX-License-Identifier: GPL-2.0
> +
> +========================================================
> +The Linux Platform Firmware Runtime Update and Telemetry
> +========================================================
> +
> +According to the specification of <Management Mode Firmware Runtime Update>[1],
> +certain computing systems require high Service Level Agreements (SLAs) where
> +system reboot fewer firmware updates are required to deploy firmware changes
> +to address bug fixes, security updates and to debug and root cause issues. This
> +technology is called Intel Seamless Update. The management mode (MM),
> +UEFI runtime services and ACPI services handle most of the system runtime
> +functions. Changing the MM code execution during runtime is called MM Runtime
> +Update. Since the "MM" acronyms might be misunderstood as "Memory Management",
> +this driver uses "Platform Firmware Runtime Update"(PFRU)
> +
> +PFRU provides the following facilities: Performs a runtime firmware driver update
> +and activate. Ability to inject firmware code at runtime, for dynamic instrumentation.
> +PFRU Telemetry is a service which allows Runtime Update handler to produce telemetry
> +data to upper layer OS consumer at runtime. The OS provides interfaces to let the
> +users query the telemetry data via read operations. The specification specifies the
> +interface and recommended policy to extract the data, the format and use are left to
> +individual OEM's and BIOS implementations on what that data represents.
Sticking to the 80-column limit is preferable; it keeps the text
readable.
> +PFRU interfaces
> +=====================
Underline lengths should match the title text, or Sphinx will get grumpy
with you.
> +The user space tool manipulates on /dev/pfru/update for code injection and
> +driver update. PFRU stands for Platform Firmware Runtime Update, and the /dev/pfru
> +directory might be reserved for future usage.
> +
> + 1. mmap the capsule file
> + fd_capsule = open("capsule.cap", O_RDONLY);
> + fstat(fd_capsule, &stat);
> + addr = mmap(0, stat.st_size, PROT_READ, fd_capsule);
These will not render the way you would like; you'll want to use literal
blocks for the code samples.
> + 2. Get the capability information(version control, etc) from BIOS via
> + read() and do sanity check in user space.
> + fd_update = open("/dev/pfru/update", O_RDWR);
> + read(fd_update, &cap, sizeof(cap));
> + sanity_check(&cap);
> +
> + 3. Write the capsule file to runtime update communication buffer
> + //kernel might return error if capsule file size is longer than
> + //communication buffer
> + write(fd_update, addr, stat.st_size);
> +
> + 4. Stage the code injection
> + ioctl(fd_update, PFRU_IOC_STATGE);
> +
> + 5. Activate the code injection
> + ioctl(fd_update, PFRU_IOC_ACTIVATE);
> +
> + 6. Stage and activate the code injection
> + ioctl(fd_update, PFRU_IOC_STAGE_ACTIVATE);
> +
> + PFRU_IOC_STATGE: Stage a capsule image from communication buffer
> + and perform authentication.
> + PFRU_IOC_ACTIVATE: Activate a previous staged capsule image.
> + PFRU_IOC_STAGE_ACTIVATE: Perform both stage and activation actions.
> +
> +PFRU Telemetry
> +=============
> +
> +The user space tool manipulates on /dev/pfru/telemetry for PFRU telemetry log.
> +Sample code:
> +
> + 1. Open telemetry device
> + fd_log = open("/dev/pfru/telemetry", O_RDWR);
> +
> + 2. Get log level, log type, revision_id via one ioctl invoke
> + ioctl(fd_log, PFRU_IOC_GET_LOG_INFO, &info);
> +
> + 3. Set log level, log type, revision_id
> + ioctl(fd_log, PFRU_IOC_SET_LOG_INFO, &info);
> +
> + 4. ioctl(fd_log, PFRU_IOC_GET_DATA_INFO, &data_info);
> + Query the information of PFRU telemetry log buffer. The user is
> + responsible for parsing the result per the specification.
> +
> + 5. Read the telemetry data:
> + read(fd_log, buf, data_info.size);
> +
> +Please refer to tools/testing/selftests/pfru/pfru_test.c for detail.
> +
> +According to <Management Mode Firmware Runtime Update>[1], the telemetry
> +buffer is a wrap around buffer. If the telemetry buffer gets full, most recent
> +log data will overwrite old log data. Besides, it is required in the spec that
> +the read of telemetry should support both full data retrieval and delta telemetry
> +data retrieval. Since this requirement is more likely a policy we leave this
> +implementation in user space. That is to say, it is recommended for the user
> +to double-read the telemetry parameters such as chunk1_size, chunk2_size,
> +rollover_cnt in data_info structure to make sure that there is no more data appended
> +while the user is reading the buffer. Besides, only after the runtime update has
> +been run at least once, the telemetry log would have valid data, otherwise errno code
> +of EBUSY would be returned.
> +
> +[1] https://uefi.org/sites/default/files/resources/Intel_MM_OS_Interface_Spec_Rev100.pdf
> --
> 2.25.1
Thanks,
jon
next prev parent reply other threads:[~2021-09-07 15:23 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <cover.1631025237.git.yu.c.chen@intel.com>
2021-09-07 15:15 ` [PATCH 1/5][RFC] Documentation: Introduce Platform Firmware Runtime Update documentation Chen Yu
2021-09-07 15:23 ` Jonathan Corbet [this message]
2021-09-07 15:48 ` Chen Yu
2021-09-07 15:27 ` [PATCH 3/5][RFC] drivers/acpi: Introduce Platform Firmware Runtime Update device driver Chen Yu
2021-09-08 9:04 ` Mike Rapoport
2021-09-14 5:54 ` Chen Yu
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=87sfygtnna.fsf@meer.lwn.net \
--to=corbet@lwn.net \
--cc=andriy.shevchenko@intel.com \
--cc=ashok.raj@intel.com \
--cc=aubrey.li@intel.com \
--cc=bp@alien8.de \
--cc=dan.j.williams@intel.com \
--cc=hpa@zytor.com \
--cc=len.brown@intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=rjw@rjwysocki.net \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
--cc=yu.c.chen@intel.com \
/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).