dm: Add documentation for host command and implementation

Document the 'host' command and also the internals of how it is
implemented.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2022-10-29 19:47:18 -06:00
parent 952018117a
commit 2851cc94f3
6 changed files with 175 additions and 4 deletions

View file

@ -11,7 +11,7 @@ Architecture-specific doc
m68k m68k
mips mips
nios2 nios2
sandbox sandbox/index
sh sh
x86 x86
xtensa xtensa

View file

@ -0,0 +1,39 @@
.. SPDX-License-Identifier: GPL-2.0+ */
.. Copyright (c) 2014 The Chromium OS Authors.
.. sectionauthor:: Simon Glass <sjg@chromium.org>
Sandbox block devices (implementation)
======================================
(See :ref:`sandbox_blk` for operation)
Sandbox block devices are implemented using the `UCLASS_HOST` uclass. Only one
driver is provided (`host_sb_drv`) so all devices in the uclass use the same
driver.
The uclass has a simple API allowing files to be attached and detached.
Attaching a file results in it appearing as a block device in sandbox. This
allows filesystems and whole disk images to be accessed from U-Boot. This is
particularly useful for tests.
Devices are created using `host_create_device()`. This sets up a new
`UCLASS_HOST`.
The device can then be attached to a file with `host_attach_file()`. This
creates the child block device (and bootdev device).
The host device's block device must be probed before use, as normal.
To destroy a device, call host_destroy_device(). This removes the device (and
its children of course), then closes any attached file, then unbinds the device.
There is no arbitrary limit to the number of host devices that can be created.
Uclass API
----------
This is incomplete as it isn't clear how to make Sphinx do the right thing for
struct host_ops. See `include/sandbox_host.h` for full details.
.. kernel-doc:: include/sandbox_host.h

View file

@ -0,0 +1,12 @@
.. SPDX-License-Identifier: GPL-2.0+ */
.. Copyright 2022 Google LLC
.. sectionauthor:: Simon Glass <sjg@chromium.org>
Sandbox
=======
.. toctree::
:maxdepth: 2
sandbox
block_impl

View file

@ -43,7 +43,7 @@ Note that standalone/API support is not available at present.
Prerequisites Prerequisites
------------- -------------
Install the dependencies noted in :doc:`../build/gcc`. Install the dependencies noted in :doc:`../../build/gcc`.
Basic Operation Basic Operation
@ -374,6 +374,7 @@ also use low-level SPI commands::
This is issuing a READ_ID command and getting back 20 (ST Micro) part This is issuing a READ_ID command and getting back 20 (ST Micro) part
0x2015 (the M25P16). 0x2015 (the M25P16).
.. _sandbox_blk:
Block Device Emulation Block Device Emulation
---------------------- ----------------------
@ -401,6 +402,8 @@ or utilize the device described in test/py/make_test_disk.py::
import make_test_disk import make_test_disk
make_test_disk.makeDisk() make_test_disk.makeDisk()
For more technical details, see :doc:`block_impl`.
Writing Sandbox Drivers Writing Sandbox Drivers
----------------------- -----------------------
@ -600,8 +603,8 @@ Testing
U-Boot sandbox can be used to run various tests, mostly in the test/ U-Boot sandbox can be used to run various tests, mostly in the test/
directory. directory.
See :doc:`../develop/tests_sandbox` for more information and See :doc:`../../develop/tests_sandbox` for more information and
:doc:`../develop/testing` for information about testing generally. :doc:`../../develop/testing` for information about testing generally.
Memory Map Memory Map

116
doc/usage/cmd/host.rst Normal file
View file

@ -0,0 +1,116 @@
.. SPDX-License-Identifier: GPL-2.0+
host command
============
Synopis
-------
::
host bind [-r] <label> [<filename>]
host unbind <label|seq>
host info [<label|seq>]
host dev [<label|seq>]
Description
-----------
The host command provides a way to attach disk images on the host to U-Boot
sandbox. This can be useful for testing U-Boot's filesystem implementations.
Common arguments:
<label|seq>
This is used to specify a host device. It can either be a label (a string)
or the sequence number of the device. An invalid value causes the command
to fail.
host bind
~~~~~~~~~
This creates a new host device and binds a file to it.
Arguments:
label
Label to use to identify this binding. This can be any string.
filename:
Host filename to bind to
Flags:
-r
Mark the device as removable
host unbind
~~~~~~~~~~~
This unbinds a host device that was previously bound. The sequence numbers of
other devices remain unchanged.
host info
~~~~~~~~~
Provides information about a particular host binding, or all of them.
host dev
~~~~~~~~
Allowing selecting a particular device, or (with no arguments) seeing which one
is selected.
Example
-------
Initially there are no devices::
=> host info
dev blocks label path
Bind a device::
=> host bind -r test2 2MB.ext2.img
=> host bind fat 1MB.fat32.img
=> host info
dev blocks label path
0 4096 test2 2MB.ext2.img
1 2048 fat 1MB.fat32.img
Select a device by label or sequence number::
=> host dev fat
Current host device: 1: fat
=> host dev 0
Current host device: 0: test2
Write a file::
=> ext4write host 0 0 /dump 1e00
File System is consistent
7680 bytes written in 3 ms (2.4 MiB/s)
=> ext4ls host 0
<DIR> 4096 .
<DIR> 4096 ..
<DIR> 16384 lost+found
4096 testing
7680 dump
Unbind a device::
=> host unbind test2
=> host info
dev blocks label path
1 2048 fat 1MB.fat32.img
Return value
------------
The return value $? indicates whether the command succeeded.

View file

@ -52,6 +52,7 @@ Shell commands
cmd/for cmd/for
cmd/fwu_mdata cmd/fwu_mdata
cmd/gpio cmd/gpio
cmd/host
cmd/load cmd/load
cmd/loadm cmd/loadm
cmd/loady cmd/loady