diff --git a/Documentation/index.rst b/Documentation/index.rst
index 5db7e87..33b1c4c 100644
--- a/Documentation/index.rst
+++ b/Documentation/index.rst
@@ -68,6 +68,7 @@
    kernel-hacking/index
    trace/index
    maintainer/index
+   test/index
 
 Kernel API documentation
 ------------------------
diff --git a/Documentation/test/api/class-and-function-mocking.rst b/Documentation/test/api/class-and-function-mocking.rst
new file mode 100644
index 0000000..013004f
--- /dev/null
+++ b/Documentation/test/api/class-and-function-mocking.rst
@@ -0,0 +1,66 @@
+==========================
+Class and Function Mocking
+==========================
+
+This file documents class and function mocking features.
+
+.. note::
+   If possible, prefer class mocking over arbitrary function mocking. Class
+   mocking has a much more limited scope and provides more control.
+   This file documents class mocking and most mocking features that do not
+   depend on function or platform mocking.
+
+Readability Macros
+------------------
+When defining and declaring mock stubs, use these readability macros.
+
+.. code-block:: c
+
+        #define CLASS(struct_name) struct_name
+        #define HANDLE_INDEX(index) index
+        #define METHOD(method_name) method_name
+        #define RETURNS(return_type) return_type
+        #define PARAMS(...) __VA_ARGS__
+
+Consider a ``struct Foo`` with a member function
+``int add(struct Foo*, int a, int b);``
+
+When generating a mock stub with :c:func:`DEFINE_STRUCT_CLASS_MOCK`, which
+takes a method name, struct name, return type, and method parameters, the
+arguments should be passed in with the readability macros.
+
+.. code-block:: c
+
+        DEFINE_STRUCT_CLASS_MOCK(
+                METHOD(add),
+                CLASS(Foo),
+                RETURNS(int),
+                PARAMS(struct Foo *, int, int)
+        );
+
+For a more detailed example of this, take a look at the example in
+:doc:`../start`
+
+These macros should only be used in the context of the mock stub generators.
+
+
+Built in Matchers
+-----------------
+
+.. kernel-doc:: include/test/mock.h
+   :doc: Built In Matchers
+
+Mock Returns
+------------
+These functions can be used to specify a value to be returned (``ret``) when a
+mocked function is intercepted via :c:func:`EXPECT_CALL`.
+
+.. code-block:: c
+
+        struct mock_action *int_return(struct test *test, int ret);
+        struct mock_action *u32_return(struct test *test, u32 ret);
+
+API
+---
+.. kernel-doc:: include/test/mock.h
+   :internal:
diff --git a/Documentation/test/api/index.rst b/Documentation/test/api/index.rst
new file mode 100644
index 0000000..a032f94
--- /dev/null
+++ b/Documentation/test/api/index.rst
@@ -0,0 +1,19 @@
+=============
+API Reference
+=============
+.. toctree::
+
+	test
+	class-and-function-mocking
+	platform-mocking
+
+This section documents the KUnit kernel testing API. It is divided into 3
+sections:
+
+================================= ==============================================
+:doc:`test`                       documents all of the standard testing API
+                                  excluding mocking or mocking related features.
+:doc:`class-and-function-mocking` documents class and function mocking features.
+:doc:`platform-mocking`           documents mocking libraries that mock out
+                                  platform specific features.
+================================= ==============================================
diff --git a/Documentation/test/api/platform-mocking.rst b/Documentation/test/api/platform-mocking.rst
new file mode 100644
index 0000000..219f9e1
--- /dev/null
+++ b/Documentation/test/api/platform-mocking.rst
@@ -0,0 +1,34 @@
+================
+Platform Mocking
+================
+
+This file documents *platform mocking*, mocking libraries that mock out platform
+specific features and aid in writing mocks for platform drivers and other low
+level kernel code.
+
+Enable Platform Mocking
+-----------------------
+``CONFIG_PLATFORM_MOCK`` needs to be added to the .config (or kunitconfig) to
+enable platform mocking.
+
+Mocked IO Functions
+-------------------
+The following functions have been mocked for convenience.
+
+.. code-block:: c
+
+	u8 readb(const volatile void __iomem *);
+	u16 readw(const volatile void __iomem *);
+	u32 readl(const volatile void __iomem *);
+	u64 readq(const volatile void __iomem *);
+	void writeb(u8, const volatile void __iomem *);
+	void writew(u16, const volatile void __iomem *);
+	void writel(u32, const volatile void __iomem *);
+	void writeq(u64, const volatile void __iomem *);
+
+.. note:: These functions do not have any non-mocked behaviour in UML.
+
+API
+---
+.. kernel-doc:: include/linux/platform_device_mock.h
+   :internal:
\ No newline at end of file
diff --git a/Documentation/test/api/test.rst b/Documentation/test/api/test.rst
new file mode 100644
index 0000000..b3ef4d1
--- /dev/null
+++ b/Documentation/test/api/test.rst
@@ -0,0 +1,13 @@
+========
+Test API
+========
+
+This file documents all of the standard testing API excluding mocking or mocking
+related features.
+
+.. kernel-doc:: include/test/test.h
+   :internal:
+
+.. kernel-doc:: include/test/test-stream.h
+   :internal:
+
diff --git a/Documentation/test/index.rst b/Documentation/test/index.rst
new file mode 100644
index 0000000..4ef0a8d
--- /dev/null
+++ b/Documentation/test/index.rst
@@ -0,0 +1,81 @@
+=========================================
+KUnit - Unit Testing for the Linux Kernel
+=========================================
+
+.. toctree::
+	:maxdepth: 2
+
+	start
+	usage
+	api/index
+
+What is KUnit?
+==============
+
+KUnit is a lightweight unit testing and mocking framework for the Linux kernel.
+These tests are able to be run locally on a developer’s workstation without a VM
+or special hardware.
+
+KUnit is heavily inspired by JUnit, Python's ``unittest.mock``, and
+Googletest/Googlemock for C++. They have the same structure for defining test
+suites and test cases. KUnit defines a way to mock out C style classes and
+functions and create expectations on methods called within the code under test.
+
+Get started now: :doc:`start`
+
+Why KUnit?
+==========
+
+Aside from KUnit there is no true unit testing framework for the Linux kernel.
+Autotest and kselftest are sometimes cited as unit testing frameworks; however,
+they are not by most reasonable definitions of unit tests.
+
+A unit test is supposed to test a single unit of code in isolation, hence the
+name. A unit test should be the finest granularity of testing and as such should
+allow all possible code paths to be tested in the code under test; this is only
+possible if the code under test is very small and does not have any external
+dependencies outside of the test's control like hardware.
+
+Outside of KUnit, there are no testing frameworks currently
+available for the kernel that do not require installing the kernel on a test
+machine or in a VM and all require tests to be written in userspace running on
+the kernel; this is true for Autotest, and kselftest, disqualifying
+any of them from being considered unit testing frameworks.
+
+KUnit addresses the problem of being able to run tests without needing a virtual
+machine or actual hardware with User Mode Linux. User Mode Linux is a Linux
+architecture, like ARM or x86; however, unlike other architectures it compiles
+to a standalone program that can be run like any other program directly inside
+of a host operating system; to be clear, it does not require any virtualization
+support; it is just a regular program.
+
+KUnit is fast. Excluding build time, from invocation to completion KUnit can run
+several dozen tests in only 10 to 20 seconds; this might not sound like a big
+deal to some people, but having such fast and easy to run tests fundamentally
+changes the way you go about testing and even writing code in the first place.
+Linus himself said in his `git talk at Google
+<https://gist.github.com/lorn/1272686/revisions#diff-53c65572127855f1b003db4064a94573R874>`_:
+
+	"... a lot of people seem to think that performance is about doing the
+	same thing, just doing it faster, and that is not true. That is not what
+	performance is all about. If you can do something really fast, really
+	well, people will start using it differently."
+
+In this context Linus was talking about branching and merging,
+but this point also applies to testing. If your tests are slow, unreliable, are
+difficult to write, and require a special setup or special hardware to run,
+then you wait a lot longer to write tests, and you wait a lot longer to run
+tests; this means that tests are likely to break, unlikely to test a lot of
+things, and are unlikely to be rerun once they pass. If your tests are really
+fast, you run them all the time, everytime you make a change, and everytime
+someone sends you some code. Why trust that someone ran all their tests
+correctly on every change when you can just run them yourself in less time than
+it takes to read his / her test log?
+
+How do I use it?
+===================
+
+*   :doc:`start` - for new users of KUnit
+*   :doc:`usage` - for a more detailed explanation of KUnit features
+*   :doc:`api/index` - for the list of KUnit APIs used for testing
+
diff --git a/Documentation/test/start.rst b/Documentation/test/start.rst
new file mode 100644
index 0000000..fe3fdee
--- /dev/null
+++ b/Documentation/test/start.rst
@@ -0,0 +1,234 @@
+===============
+Getting Started
+===============
+
+Installing dependencies
+=======================
+KUnit has the same dependencies as the Linux kernel. As long as you can build
+the kernel, you can run KUnit.
+
+KUnit Wrapper
+=============
+Included with KUnit is a simple Python wrapper that helps format the output to
+easily use and read KUnit output. It handles building and running the kernel, as
+well as formatting the output.
+
+The wrapper can be run with:
+
+.. code-block:: bash
+
+   ./tools/testing/kunit/kunit.py
+
+Creating a kunitconfig
+======================
+The Python script is a thin wrapper around Kbuild as such, it needs to be
+configured with a ``kunitconfig`` file. This file essentially contains the
+regular Kernel config, with the specific test targets as well.
+
+.. TODO(brendanhiggins@google.com): I guess we need to release a kunitconfig
+   when we release KUnit. We need to create a repo and then link it here.
+
+.. code-block:: bash
+
+	PLACEHOLDER_COMMAND_TO_GET_RELEASED_KUNITCONFIG
+
+You may want to add kunitconfig to your local gitignore.
+
+Verifying KUnit Works
+-------------------------
+
+To make sure that everything is set up correctly, simply invoke the Python
+wrapper from your kernel repo:
+
+.. code-block:: bash
+
+	./tools/testing/kunit/kunit.py
+
+.. note::
+   You may want to run ``make mrproper`` first.
+
+If everything worked correctly, you should see the following:
+
+.. code-block:: bash
+
+	Generating .config ...
+	Building KUnit Kernel ...
+	Starting KUnit Kernel ...
+
+followed by a list of tests that are run. All of them should be passing.
+
+.. note::
+   Because it is building a lot of sources for the first time, the ``Building
+   kunit kernel`` step may take a while.
+
+Writing your first test
+==========================
+
+In your kernel repo let's add some code that we can test. Create a file
+``drivers/misc/example.h`` with the contents:
+
+.. code-block:: c
+
+	struct misc_example {
+		int (*misc_example_foo)(struct misc_example *, int);
+	};
+
+	int misc_example_bar(struct misc_example *example);
+
+create a file ``drivers/misc/example.c``:
+
+.. code-block:: c
+
+	#include <linux/errno.h>
+
+	#include "example.h"
+
+	int misc_example_bar(struct misc_example *example)
+	{
+		if (example->misc_example_foo(example, 5))
+			return -EIO;
+		else
+			return 0;
+	}
+
+Now add the following lines to ``drivers/misc/Kconfig``:
+
+.. code-block:: kconfig
+
+	config MISC_EXAMPLE
+		bool "My example"
+
+and the following lines to ``drivers/misc/Makefile``:
+
+.. code-block:: make
+
+	obj-$(CONFIG_MISC_EXAMPLE) += example.o
+
+Now we are ready to write the test. The test will be in
+``drivers/misc/example-test.c``:
+
+.. code-block:: c
+
+	#include <linux/test.h>
+	#include <linux/mock.h>
+	#include "example.h"
+
+	/* Define the mock. */
+
+	DECLARE_STRUCT_CLASS_MOCK_PREREQS(misc_example);
+
+	DEFINE_STRUCT_CLASS_MOCK(METHOD(misc_example_foo), CLASS(misc_example),
+				 RETURNS(int),
+				 PARAMS(struct misc_example *, int));
+
+	static int misc_example_init(struct MOCK(misc_example) *mock_example)
+	{
+		struct misc_example *example = mock_get_trgt(mock_example);
+
+		example->misc_example_foo = misc_example_foo;
+		return 0;
+	}
+
+	DEFINE_STRUCT_CLASS_MOCK_INIT(misc_example, misc_example_init);
+
+	/* Define the test cases. */
+
+	static void misc_example_bar_test_success(struct test *test)
+	{
+		struct MOCK(misc_example) *mock_example = test->priv;
+		struct misc_example *example = mock_get_trgt(mock_example);
+		struct mock_expectation *handle;
+
+		handle = EXPECT_CALL(misc_example_foo(mock_get_ctrl(mock_example),
+						      int_eq(test, 5)));
+		handle->action = int_return(test, 0);
+
+		EXPECT_EQ(test, 0, misc_example_bar(example));
+	}
+
+	static void misc_example_bar_test_failure(struct test *test)
+	{
+		struct MOCK(misc_example) *mock_example = test->priv;
+		struct misc_example *example = mock_get_trgt(mock_example);
+		struct mock_expectation *handle;
+
+		handle = EXPECT_CALL(misc_example_foo(mock_get_ctrl(mock_example),
+						      int_eq(test, 5)));
+		handle->action = int_return(test, -EINVAL);
+
+		EXPECT_EQ(test, -EINVAL, misc_example_bar(example));
+	}
+
+	static int misc_example_test_init(struct test *test)
+	{
+		test->priv = CONSTRUCT_MOCK(misc_example, test);
+		if (!test->priv)
+			return -EINVAL;
+
+		return 0;
+	}
+
+	static void misc_example_test_exit(struct test *test)
+	{
+	}
+
+	static struct test_case misc_example_test_cases[] = {
+		TEST_CASE(misc_example_bar_test_success),
+		TEST_CASE(misc_example_bar_test_failure),
+		{},
+	};
+
+	static struct test_module misc_example_test_module = {
+		.name = "misc-example",
+		.init = misc_example_test_init,
+		.exit = misc_example_test_exit,
+		.test_cases = misc_example_test_cases,
+	};
+	module_test(misc_example_test_module);
+
+Now add the following to ``drivers/misc/Kconfig``:
+
+.. code-block:: kconfig
+
+	config MISC_EXAMPLE_TEST
+		bool "Test for my example"
+		depends on MISC_EXAMPLE && TEST
+
+and the following to ``drivers/misc/Makefile``:
+
+.. code-block:: make
+
+	obj-$(CONFIG_MISC_EXAMPLE_TEST) += example-test.o
+
+Now add it to your ``kunitconfig``:
+
+.. code-block:: none
+
+	CONFIG_MISC_EXAMPLE=y
+	CONFIG_MISC_EXAMPLE_TEST=y
+
+Now you can run the test:
+
+.. code-block:: bash
+
+	./tools/testing/kunit/kunit.py
+
+You should see the following failure:
+
+.. code-block:: none
+
+	...
+	kunit misc-example: misc_example_bar_test_success passed
+	kunit misc-example: EXPECTATION FAILED at drivers/misc/example-test.c:48
+		Expected -22 == misc_example_bar(example), but
+			-22 == -22
+			misc_example_bar(example) == -5
+	kunit misc-example: misc_example_bar_test_failure failed
+	kunit misc-example: one or more tests failed
+
+Congrats! You just wrote your first KUnit test!
+
+Next Steps
+=============
+*   Check out the :doc:`usage` page for a more
+    in-depth explanation of KUnit.
\ No newline at end of file
diff --git a/Documentation/test/usage.rst b/Documentation/test/usage.rst
new file mode 100644
index 0000000..f833b84c
--- /dev/null
+++ b/Documentation/test/usage.rst
@@ -0,0 +1,644 @@
+=============
+Using KUnit
+=============
+
+The purpose of this document is to describe what KUnit is, how it works, how it
+is intended to be used, and all the concepts and terminology that are needed to
+understand it. This guide assumes a working knowledge of the Linux kernel and
+some basic knowledge of testing.
+
+For a high level introduction to KUnit, including setting up KUnit for your
+project, see :doc:`start`.
+
+Organization of this document
+=================================
+
+This document is organized into two main sections: Testing and Mocking. The
+first covers what a unit test is and how to use KUnit to write them. The second
+covers how to use KUnit to mock out dependencies and make it possible to unit
+test code that was otherwise un-unit-testable.
+
+Testing
+==========
+
+What is KUnit?
+------------------
+
+"K" is short for "kernel" so "KUnit" is the "(Linux) Kernel Unit Testing
+Framework." KUnit is intended first and foremost for writing unit tests; it is
+general enough that it can be used to write integration tests; however, this is
+a secondary goal. KUnit has no ambition of being the only testing framework for
+the kernel; for example, it does not intend to be an end-to-end testing
+framework.
+
+What is Unit Testing?
+-------------------------
+
+A *unit test* is a test that tests code at the smallest possible scope, a
+*unit* of code. For the C programming language, defining a unit is easy: it is
+the compilation unit; however, that does not mean compilation units cannot be
+too large and should not be broken down to get more coverage or just because
+they are hard to reason about.
+
+A unit test should test all the publicly exposed functions in a unit; so that is
+all the functions that are exported in either a *class* (defined below) or all
+functions which are **not** static.
+
+Writing Tests
+-------------
+
+Test Cases
+~~~~~~~~~~
+
+The fundamental unit in KUnit is the test case. A test case is a function with
+the signature ``void (*)(struct test *test)``. It calls a function to be tested
+and then sets *expectations* for what should happen. For example:
+
+.. code-block:: c
+
+	void example_test_success(struct test *test)
+	{
+	}
+
+	void example_test_failure(struct test *test)
+	{
+		FAIL(test, "This test never passes.");
+	}
+
+In the above example ``example_test_success`` always passes because it does
+nothing; no expectations are set, so all expectations pass. On the other hand
+``example_test_failure`` always fails because it calls ``FAIL``, which is a
+special expectation that logs a message and causes the test case to fail.
+
+Preferably, a single test case will be pretty short, it should be pretty easy to
+understand, and it should really only try to test at most a handful of very
+closely relating things.
+
+Expectations
+~~~~~~~~~~~~
+An *expectation* is a way to make an assertion about what a piece of code should
+do in a test. An expectation is called like a function. A test is made by
+setting expectations about the behavior of a piece of code under test; when one
+or more of the expectations fail, the test case fails and information about the
+failure is logged. For example:
+
+.. code-block:: c
+
+	void add_test_basic(struct test *test)
+	{
+		EXPECT_EQ(test, 1, add(1, 0));
+		EXPECT_EQ(test, 2, add(1, 1));
+		EXPECT_EQ(test, 0, add(-1, 1));
+		EXPECT_EQ(test, INT_MAX, add(0, INT_MAX));
+		EXPECT_EQ(test, -1, add(INT_MAX, INT_MIN));
+	}
+
+In the above example ``add_test_basic`` makes a number of assertions about the
+behavior of a function called ``add``; the first parameter is always of type
+``struct test *``, which contains information about the current test context; the
+second parameter, in this case, is what the value is expected to be; the last
+value is what the value actually is. If ``add`` passes all of these expectations,
+the test case, ``add_test_basic`` will pass; if any one of these expectations
+fail, the test case will fail.
+
+To learn about more expectations supported by KUnit, see :doc:`api/test`.
+
+Assertions
+~~~~~~~~~~
+
+KUnit also has the concept of an *assertion*. An assertion is just like an
+expectation except the assertion immediately terminates the test case if it is
+not satisfied.
+
+For example:
+
+.. code-block:: c
+
+	static void mock_test_do_expect_default_return(struct test *test)
+	{
+		struct mock_test_context *ctx = test->priv;
+		struct mock *mock = ctx->mock;
+		int param0 = 5, param1 = -5;
+		const char *two_param_types[] = {"int", "int"};
+		const void *two_params[] = {&param0, &param1};
+		const void *ret;
+
+		ret = mock->do_expect(mock,
+				      "test_printk", test_printk,
+				      two_param_types, two_params,
+				      ARRAY_SIZE(two_params));
+		ASSERT_NOT_ERR_OR_NULL(test, ret);
+		EXPECT_EQ(test, -4, *((int *) ret));
+	}
+
+In this example, the method under test should return a pointer to a value, so if
+the pointer returned by the method is null or an errno, we don't want to bother
+continuing the test since the following expectation could crash the test case
+if the pointer is null. `ASSERT_NOT_ERR_OR_NULL(...)` allows us to bail out of
+the test case if the appropriate conditions have not been satisfied to complete
+the test.
+
+Modules / Test Suites
+~~~~~~~~~~~~~~~~~~~~~
+
+Because test cases are supposed to test just a single function and then only
+test a set of closely related concepts about that function, multiple test cases
+are usually needed to fully test a unit. This is where the concept of a *test
+suite* or a *module* comes in; it is just a collection of test cases for a unit
+of code. In addition to specifying a set of test cases, a test suite also
+supports specifying setup and tear down functions which allow functions to be
+specified to run before and after each test case, respectively; this is useful
+when the procedure to setup a unit for testing requires several steps and needs
+to be done in every test case.
+
+Example:
+
+.. code-block:: c
+
+	static struct test_case example_test_cases[] = {
+		TEST_CASE(example_test_foo),
+		TEST_CASE(example_test_bar),
+		TEST_CASE(example_test_baz),
+		{},
+	};
+
+	static struct test_module example_test_module[] = {
+		.name = "example",
+		.init = example_test_init,
+		.exit = example_test_exit,
+		.test_cases = example_test_cases,
+	};
+	module_test(example_test_module);
+
+In the above example the test suite, ``example_test_module``, would run the test
+cases ``example_test_foo``, ``example_test_bar``, and ``example_test_baz``, each
+would have ``example_test_init`` called immediately before it and would have
+``example_test_exit`` called immediately after it.
+``module_test(example_test_module)`` registers the test suite with the KUnit
+test framework.
+
+.. note::
+   A test case will only be run if it is associated with a test suite.
+
+For a more information on these types of things see the :doc:`api/test`.
+
+Mocking
+=======
+
+The most important aspect of unit testing that other forms of testing do not
+provide is the ability to limit the amount of code under test to a single unit.
+In practice, this is only possible by being able to control what code gets run
+when the unit under test calls a function and this is usually accomplished
+through some sort of indirection where a function is exposed as part of an API
+such that the definition of that function can be changed without affecting the
+rest of the code base. In the kernel this primarily comes from two constructs,
+classes, structs that contain function pointers that are provided by the
+implementer, and architecture specific functions which have definitions selected
+at compile time.
+
+Classes
+-------
+
+Classes are not a construct that is built into the C programming language;
+however, it is an easily derived concept. Accordingly, pretty much every project
+that does not use a standardized object oriented library (like GNOME's GObject)
+has their own slightly different way of doing object oriented programming; the
+Linux kernel is no exception.
+
+The central concept in the kernel object oriented programming is the class. In
+the kernel, a *class* is a struct that contains function pointers. This creates
+a contract between *implementers* and *users* since it forces them to use the
+same function signature without having to call the function directly. In order
+for it to truly be a class, the function pointers must specify that a pointer to
+the class, known as a *class handle*, be one of the parameters; this makes it
+possible for the member functions (also known as *methods*) to have access to
+member variables (more commonly known as *fields*) allowing the same
+implementation to have multiple *instances*.
+
+Typically a class can be *overridden* by *child classes* by embedding the
+*parent class* in the child class. Then when a method provided by the child
+class is called, the child implementation knows that the pointer passed to it is
+of a parent contained within the child; because of this, the child can compute
+the pointer to itself because the pointer to the parent is always a fixed offset
+from the pointer to the child; this offset is the offset of the parent contained
+in the child struct. For example:
+
+.. code-block:: c
+
+	struct shape {
+		int (*area)(struct shape *this);
+	};
+
+	struct rectangle {
+		struct shape parent;
+		int length;
+		int width;
+	};
+
+	int rectangle_area(struct shape *this)
+	{
+		struct rectangle *self = container_of(this, struct shape, parent);
+
+		return self->length * self->width;
+	};
+
+	void rectangle_new(struct rectangle *self, int length, int width)
+	{
+		self->parent.area = rectangle_area;
+		self->length = length;
+		self->width = width;
+	}
+
+In this example (as in most kernel code) the operation of computing the pointer
+to the child from the pointer to the parent is done by ``container_of``.
+
+Mocking Classes
+~~~~~~~~~~~~~~~
+
+In order to unit test a piece of code that calls a method in a class, the
+behavior of the method must be controllable, otherwise the test ceases to be a
+unit test and becomes an integration test. KUnit allows classes to be *mocked*
+which means that it generates subclasses whose behavior can be specified in a
+test case. KUnit accomplishes this with two sets of macros: the mock generation
+macros and the ``EXPECT_CALL`` macro.
+
+For example, let's say you have a file named ``drivers/foo/example.c`` and it
+contains the following code you would like to test:
+
+.. code-block:: c
+
+	int example_bar(struct example *example)
+	{
+		if (example->foo(example, 5))
+			return -EIO;
+		else
+			return 0;
+	}
+
+For the purposes of this example, assume ``struct example`` is defined as such:
+
+.. code-block:: c
+
+	struct example {
+		int (*foo)(struct example *, int);
+	};
+
+You would create a test file named ``drivers/foo/example-test.c`` and it would
+contain the following code:
+
+.. code-block:: c
+
+	/* Define the mock. */
+
+	DECLARE_STRUCT_CLASS_MOCK_PREREQS(example);
+
+	DEFINE_STRUCT_CLASS_MOCK(METHOD(foo), CLASS(example),
+				 RETURNS(int),
+				 PARAMS(struct example *, int));
+
+	static int example_init(struct MOCK(example) *mock_example)
+	{
+		struct example *example = mock_get_trgt(mock_example);
+
+		example->foo = foo;
+		return 0;
+	}
+
+	DEFINE_STRUCT_CLASS_MOCK_INIT(example, example_init);
+
+	/* Define the test cases. */
+
+	static void foo_example_test_success(struct test *test)
+	{
+		struct MOCK(example) *mock_example = test->priv;
+		struct example *example = mock_get_trgt(mock_example);
+		struct mock_expectation *handle;
+
+		handle = EXPECT_CALL(foo(mock_get_ctrl(mock_example), int_eq(test, 5)));
+		handle->action = int_return(test, 0);
+
+		EXPECT_EQ(test, 0, example_bar(example));
+	}
+
+	static void foo_example_test_failure(struct test *test)
+	{
+		struct MOCK(example) *mock_example = test->priv;
+		struct example *example = mock_get_trgt(mock_example);
+		struct mock_expectation *handle;
+
+		handle = EXPECT_CALL(foo(mock_get_ctrl(mock_example), int_eq(test, 5)));
+		handle->action = int_return(test, -EINVAL);
+		EXPECT_EQ(test, -EINVAL, example_bar(example));
+	}
+
+	static int example_test_init(struct test *test)
+	{
+		test->priv = CONSTRUCT_MOCK(example, test);
+		if (!test->priv)
+			return -EINVAL;
+
+		return 0;
+	}
+
+	static void example_test_exit(struct test *test)
+	{
+	}
+
+	static struct test_case foo_example_test_cases[] = {
+		TEST_CASE(foo_example_test_success),
+		TEST_CASE(foo_example_test_failure),
+		{},
+	};
+
+	static struct test_module foo_example_test_module = {
+		.name = "example",
+		.init = example_test_init,
+		.exit = example_test_exit,
+		.test_cases = foo_example_test_cases,
+	};
+	module_test(foo_example_test_module);
+
+``foo_example_test_success`` uses the mock allocated in init. It asserts that
+``example.foo`` will get called with ``5`` as a parameter with the ``int_eq``
+parameter matcher. ``EXPECT_CALL`` the returns a handle that a user can use to
+specify additional behavior on the mock; it must always specify a return value
+using an *action*. Finally, it calls the function under test.
+
+For more information on class mocking see :doc:`api/class-and-function-mocking`.
+
+Mocking Arbitrary Functions
+---------------------------
+
+.. important::
+   Always prefer class mocking over arbitrary function mocking where possible.
+   Class mocking has a much more limited scope and provides more control.
+
+Sometimes it is necessary to mock a function that does not use any class style
+indirection. First and foremost, if you encounter this in your own code, please
+rewrite it so that uses class style indirection discussed above, but if this is
+in some code that is outside of your control you may use KUnit's function
+mocking features.
+
+KUnit provides macros to allow arbitrary functions to be overridden so that the
+original definition is replaced with a mock stub. For most functions, all you
+have to do is label the function ``__mockable``:
+
+.. code-block:: c
+
+	int __mockable example(int arg) {...}
+
+If a function is ``__mockable`` and a mock is defined:
+
+.. code-block:: c
+
+	DEFINE_FUNCTION_MOCK(example, RETURNS(int), PARAMS(int));
+
+When the function is called, the mock stub will actually be called.
+
+.. note::
+   There is no performance penalty or potential side effects from doing this.
+   When not compiling for testing, ``__mockable`` compiles away.
+
+.. note::
+   ``__mockable`` does not work on inlined functions.
+
+Redirect-mockable
+~~~~~~~~~~~~~~~~~
+
+Sometimes it is desirable to have a mock function that delegates to the original
+definition in some or all circumstances. This is possible by making the function
+*redirect-mockable*:
+
+.. code-block:: c
+
+	DEFINE_REDIRECT_MOCKABLE(i2c_add_adapter, RETURNS(int), PARAMS(struct i2c_adapter *));
+	int REAL_ID(i2c_add_adapter)(struct i2c_adapter *adapter)
+	{
+		...
+	}
+
+This allows the function to be overridden by a mock as with ``__mockable``;
+however, it associates the original definition of the function with alternate
+symbol that KUnit can still reference. This makes it possible to mock the
+function and then have the mock delegate to the original function definition
+with the ``INVOKE_REAL(...)`` action:
+
+.. code-block:: c
+
+	static int aspeed_i2c_test_init(struct test *test)
+	{
+		struct mock_param_capturer *adap_capturer;
+		struct mock_expectation *handle;
+		struct aspeed_i2c_test *ctx;
+		int ret;
+
+		ctx = test_kzalloc(test, sizeof(*ctx), GFP_KERNEL);
+		if (!ctx)
+			return -ENOMEM;
+		test->priv = ctx;
+
+		handle = EXPECT_CALL(
+				i2c_add_adapter(capturer_to_matcher(adap_capturer)));
+		handle->action = INVOKE_REAL(test, i2c_add_adapter);
+		ret = of_fake_probe_platform_by_name(test,
+						     "aspeed-i2c-bus",
+						     "test-i2c-bus");
+		if (ret < 0)
+			return ret;
+
+		ASSERT_PARAM_CAPTURED(test, adap_capturer);
+		ctx->adap = mock_capturer_get(adap_capturer, struct i2c_adapter *);
+
+		return 0;
+	}
+
+For more information on function mocking see
+:doc:`api/class-and-function-mocking`.
+
+Platform Mocking
+----------------
+The Linux kernel generally forbids normal code from accessing architecture
+specific features. Instead, low level hardware features are usually abstracted
+so that architecture specific code can live in the ``arch/`` directory and all
+other code relies on APIs exposed by it.
+
+KUnit provides a mock architecture that currently allows mocking basic IO memory
+accessors and in the future will provide even more. A major use case for
+platform mocking is unit testing platform drivers, so KUnit also provides
+helpers for this as well.
+
+In order to use platform mocking, ``CONFIG_PLATFORM_MOCK`` must be enabled in
+your ``kunitconfig``.
+
+For more information on platform mocking see :doc:`api/platform-mocking`.
+
+Method Call Expectations
+========================
+Once we have classes and methods mocked, we can place more advanced
+expectations. Previously, we could only place expectations on simple return
+values. With the :c:func:`EXPECT_CALL` macro, which allows you to make
+assertions that a certain mocked function is called with specific arguments
+given some code to be run.
+
+Basic Usage
+-----------
+Imagine we had some kind of dependency like this:
+
+.. code-block:: c
+
+	struct Printer {
+		void (*print)(int arg);
+	};
+
+	// Printer's print
+	void printer_print(int arg)
+	{
+		do_something_to_print_to_screen(arg);
+	}
+
+	struct Foo {
+		struct Printer *internal_printer;
+		void (*print_add_two)(struct Foo*, int);
+	};
+
+	// Foo's print_add_two:
+	void foo_print_add_two(struct Foo *this, int arg)
+	{
+		internal_printer->print(arg + 2);
+	}
+
+and we wanted to test ``struct Foo``'s behaviour, that ``foo->print_add_two``
+actually adds 2 to the argument passed. To properly unit test this, we create
+mocks for all of ``struct Foo``'s dependencies, like ``struct Printer``.
+We first setup stubs for ``MOCK(Printer)`` and its ``print`` function.
+
+In the real code, we'd assign a real ``struct Printer`` to the
+``internal_printer`` variable in our ``struct Foo`` object, but in the
+test, we'd construct a ``struct Foo`` with our ``MOCK(Printer)``.
+
+Finally, we can place expectations on the ``MOCK(Printer)``.
+
+For example:
+
+.. code-block:: c
+
+	static int test_foo_add_two(struct test *test)
+	{
+		struct MOCK(Printer) *mock_printer = get_mocked_printer();
+		struct Foo *foo = initialize_foo(mock_printer);
+
+		// print() is a mocked method stub
+		EXPECT_CALL(print(any(test), int_eq(12)));
+
+		foo->print_add_two(foo, 10);
+	}
+
+Here, we expect that the printer's print function will be called (by default,
+once), and that it will be called with the argument ``12``. Once we've placed
+expectations, we can call the function we want to test to see that it behaves
+as we expected.
+
+Matchers
+--------
+Above, we see ``any`` and ``int_eq``, which are matchers. A matcher simply
+asserts that the argument passed to that function call fulfills some condition.
+In this case, ``any()`` matches any argument, and ``int_eq(12)`` asserts that
+the argument passed to that function must equal 12. If we had called:
+``foo->print_add_two(foo, 9)`` instead, the expectation would not have been
+fulfilled. There are a variety of built-in matchers:
+:doc:`api/class-and-function-mocking` has a section about these matchers.
+
+.. note::
+	:c:func:`EXPECT_CALL` only works with mocked functions and methods.
+	Matchers may only be used within the function inside the
+	:c:func:`EXPECT_CALL`.
+
+Additional :c:func:`EXPECT_CALL` Properties
+-------------------------------------------
+
+The return value of :c:func:`EXPECT_CALL` is a
+:c:func:`struct mock_expectation`. We can capture the value and add extra
+properties to it as defined by the :c:func:`struct mock_expectation` interface.
+
+Times Called
+~~~~~~~~~~~~
+In the previous example, if we wanted assert that the method is never called,
+we could write:
+
+.. code-block:: c
+
+	...
+	struct mock_expectation* handle = EXPECT_CALL(...);
+	handle->min_calls_expected = 0;
+	handle->max_calls_expected = 0;
+	...
+
+Both those fields are set to 1 by default and can be changed to assert a range
+of times that the method or function is called.
+
+Mocked Actions
+~~~~~~~~~~~~~~
+Because ``mock_printer`` is a mock, it doesn't actually perform any task. If
+the function had some side effect that ``struct Foo`` requires to have been
+done, such as modifying some state, we could mock that as well.
+
+Each expectation has an associated :c:func:`struct mock_action` which can be
+set with ``handle->action``. By default, there are two actions that mock return
+values. Those can also be found in :doc:`api/class-and-function-mocking`.
+
+Custom actions can be defined by simply creating a :c:func:`struct mock_action`
+and assigning the appropriate function to ``do_action``. Mocked actions have
+access to the parameters passed to the mocked function, as well as have the
+ability to change / set the return value.
+
+
+The Nice, the Strict, and the Naggy
+===================================
+KUnit has three different mock types that can be set on a mocked class: nice
+mocks, strict mocks, and naggy mocks. These are set via the corresponding macros
+:c:func:`NICE_MOCK`, :c:func:`STRICT_MOCK`, and :c:func:`NAGGY_MOCK`, with naggy
+mocks being the default.
+
+The type of mock simply dictates the behaviour the mock exhibits when
+expectations are placed on it.
+
++-----------------------+------------+--------------------+--------------------+
+|                       | **Nice**   | **Naggy (default)**| **Strict**         |
++-----------------------+------------+--------------------+--------------------+
+| Method called with no | Do nothing | Prints warning for | Fails test, prints |
+| expectations on it    |            | uninteresting call | warning            |
+|                       |            |                    | uninteresting call |
++-----------------------+------------+--------------------+--------------------+
+| Method called with no | Fails test, prints warnings, prints tried            |
+| matching expectations | expectations                                         |
+| on it                 |                                                      |
++-----------------------+------------------------------------------------------+
+| Test ends with an     | Fail test, print warning                             |
+| unfulfilled           |                                                      |
+| expectation           |                                                      |
++-----------------------+------------------------------------------------------+
+
+These macros take a ``MOCK(struct_name)`` and so should be used when retrieving
+the mocked object. Following the example in :doc:`start`, there was this test
+case:
+
+.. code-block:: c
+
+	static void misc_example_bar_test_success(struct test *test)
+	{
+		struct MOCK(misc_example) *mock_example = test->priv;
+		struct misc_example *example = mock_get_trgt(mock_example);
+		struct mock_expectation *handle;
+
+		handle = EXPECT_CALL(misc_example_foo(mock_get_ctrl(mock_example),
+						      int_eq(test, 5)));
+		handle->action = int_return(test, 0);
+
+		EXPECT_EQ(test, 0, misc_example_bar(example));
+	}
+
+If we wanted ``mock_example`` to be a nice mock instead, we would simply write:
+
+.. code-block:: c
+
+	struct MOCK(misc_example) *mock_example = NICE_MOCK(test->priv);
\ No newline at end of file
