All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH v2 0/4] PCI Data Object Exchange support + CXL CDAT
@ 2021-04-13 16:01 Jonathan Cameron
  2021-04-13 16:01 ` [RFC PATCH v2 1/4] PCI: Add vendor define ID for the PCI SIG Jonathan Cameron
                   ` (3 more replies)
  0 siblings, 4 replies; 14+ messages in thread
From: Jonathan Cameron @ 2021-04-13 16:01 UTC (permalink / raw)
  To: linux-cxl, linux-pci, Dan Williams, Bjorn Helgaas, Lorenzo Pieralisi
  Cc: Ben Widawsky, Chris Browy, linux-acpi, alison.schofield,
	vishal.l.verma, ira.weiny, linuxarm, Fangjian, Jonathan Cameron

Change logs in individual patches.

There are several options for how to implement the DOE support in the
kernel.  This cover letter will try to assess the main decision to be
made in this series.

sync vs single threaded workqueue vs delayed work
=================================================

The DOE works via single input and output registers + some control
flags. Protocols are of the query/response type with a short standard
header in both followed by protocol specific data. A given DOE
instance can support multiple protocols, though individual protocol
specifications often limit what combinations are allowed.

Constraints on DOE queue handling.
1. Only a single query/response can be in flight at a time (*)
2. Need to handle timeouts on interrupt, or polling otherwise.

* Not strictly true. The DOE ECN allows for interleaving of multiple
  query/response pairs as long as only one is in flight for a given
  protocol at any given time.  However, the DOE may use the BUSY status bit
  to require software to not write a new request to the device.
  As there is no defined way of knowing when the BUSY bit is no longer
  set other than polling, such an operating mode cannot sensibly be
  used in conjunction with interrupts (which indicate response
  ready or error).  Given the current usecases of DOE and restrictions
  protocols specifications place on what other protocols they can share
  a DOE instance with, it seems unlikely that this level of interleaving
  is worth the complexity it would add.

Let us term a query/response sequence an exchange.

Approaches investigated:
1. Serialize using a mutex. This either makes exchange operations
   synchronous or requires a per caller thread. This was the approach in
   RFC v1. Long sleeps are possible as the protocol allows the response
   generation to take up to 1 second.
2. Use a single threaded workqueue to serialise exchanges.
   Each exchange uses a separate work_struct. Long sleeps can
   occur within the work items.  Note that one of the original stated reasons
   for the introduction of single threaded workqueues was to cater for work
   items which can sleep for a long time. This approach is naturally
   asynchronous, but a trival wrapper can be used to provide a convient
   synchronous calling API (I have code doing this, works fine but not posted
   as doesn't avoid long sleeps and discussion around v1 suggested we
   should do avoid them).
3. Use a single delayed work item to implement a state machine. Queuing is
   handled via a list to which query/response pairs are added.  Any delayed
   action or timeout is handled via schedule_delayed_work() with interrupts
   using mod_delayed_work() to immediately advance the state machine.
   There is no reason to use a dedicated work queue, as here serialization
   is handled using the exchange list. The proposal in this patch set.

Note I was unable to find any sensible way to combine 2 and 3, that is
to use both a delayed work approach to avoid timeouts in work items and
a single threaded workqueue to handle ordering + synchronization.
Either such an approach would have ended up with one work item just being
responsible for scheduling items on a different work queue, or it
requires the ability to insert work items at the front of single threaded
work queue (to ensure the next step of the state machine for the current
exchange runs before a step of the next exchange).

Relative complexity
-------------------

1. (mutex) Very simple.
2. (single thread workqueue) Fairly simple.
3. (delayed work) Most complex (particularly around abort handling).

Fairness
--------

Fairness considered to be work done in order of submission.
1. Potentially unfair given simple lock being used to seralize.
2. Fair as first come first seved.
3. Fair as manual list implementation of first come first served.

Sync vs Async
-------------

Whilst it's not clear there will actually be any async usecases, lets
consider how this works.
1. (mutex) Caller implements - either long sleeps in sync, or long sleeps in
   a thread to which sync operation off loaded.
2. (single thread workqueue) Async is natural state, with sync implemented as
   wrapper around async. Effectively same as spinning off to a thread in 1.
3. (delayed work) Async is natural state, with sync implemented as wrapper
   around async.

Decision comes down to trading off complexity against advantages of naturally
async operation that avoids sleeping inside a work item / thread / caller.

Cover letter from v1:
https://lore.kernel.org/linux-pci/20210310180306.1588376-1-Jonathan.Cameron@huawei.com/

Series first introduces generic support for DOE mailboxes as defined
in the ECN to the PCI 5.0 specification available from the PCI SIG [0]

A user is then introduced in the form of the table access protocol defined
in the CXL 2.0 specification [1] used to access the
Coherent Device Attribtue Table (CDAT) defined in [2]

Various open questions in the individual patches.

All testing conducted against QEMU emulation of a CXL type 3 device
in conjunction with DOE mailbox patches [3, 4]

[0] https://pcisig.com/specifications
[1] https://www.computeexpresslink.org/download-the-specification
[2] https://uefi.org/node/4093
[3] https://lore.kernel.org/qemu-devel/20210202005948.241655-1-ben.widawsky@intel.com/
[4] https://lore.kernel.org/qemu-devel/1612900760-7361-1-git-send-email-cbrowy@avery-design.com/

Jonathan Cameron (4):
  PCI: Add vendor define ID for the PCI SIG
  PCI/doe: Initial support PCI Data Object Exchange
  cxl/mem: Add CDAT table reading from DOE
  cxl/mem: Add a debug parser for CDAT commands.

 drivers/cxl/Kconfig           |   1 +
 drivers/cxl/cdat.h            |  79 +++++
 drivers/cxl/cxl.h             |  13 +
 drivers/cxl/mem.c             | 279 ++++++++++++++++
 drivers/pci/pcie/Kconfig      |   8 +
 drivers/pci/pcie/Makefile     |   1 +
 drivers/pci/pcie/doe.c        | 590 ++++++++++++++++++++++++++++++++++
 include/linux/pci.h           |   3 +
 include/linux/pci_ids.h       |   1 +
 include/linux/pcie-doe.h      |  85 +++++
 include/uapi/linux/pci_regs.h |  29 +-
 11 files changed, 1088 insertions(+), 1 deletion(-)
 create mode 100644 drivers/cxl/cdat.h
 create mode 100644 drivers/pci/pcie/doe.c
 create mode 100644 include/linux/pcie-doe.h

-- 
2.19.1


^ permalink raw reply	[flat|nested] 14+ messages in thread
* Re: [RFC PATCH v2 3/4] cxl/mem: Add CDAT table reading from DOE
@ 2021-04-14  4:09 kernel test robot
  0 siblings, 0 replies; 14+ messages in thread
From: kernel test robot @ 2021-04-14  4:09 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 13339 bytes --]

CC: kbuild-all(a)lists.01.org
In-Reply-To: <20210413160159.935663-4-Jonathan.Cameron@huawei.com>
References: <20210413160159.935663-4-Jonathan.Cameron@huawei.com>
TO: Jonathan Cameron <Jonathan.Cameron@huawei.com>

Hi Jonathan,

[FYI, it's a private test report for your RFC patch.]
[auto build test WARNING on pci/next]
[also build test WARNING on linus/master v5.12-rc7]
[cannot apply to next-20210413]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Jonathan-Cameron/PCI-Data-Object-Exchange-support-CXL-CDAT/20210414-000832
base:   https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git next
:::::: branch date: 12 hours ago
:::::: commit date: 12 hours ago
config: x86_64-randconfig-m001-20210413 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

smatch warnings:
drivers/pci/pcie/doe.c:350 doe_statemachine_work() error: uninitialized symbol 'rc'.

vim +/rc +350 drivers/pci/pcie/doe.c

9d119b6670629a Jonathan Cameron 2021-04-14  204  
9d119b6670629a Jonathan Cameron 2021-04-14  205  static void doe_statemachine_work(struct work_struct *work)
9d119b6670629a Jonathan Cameron 2021-04-14  206  {
9d119b6670629a Jonathan Cameron 2021-04-14  207  	struct delayed_work *w = to_delayed_work(work);
9d119b6670629a Jonathan Cameron 2021-04-14  208  	struct pcie_doe *doe = container_of(w, struct pcie_doe, statemachine);
9d119b6670629a Jonathan Cameron 2021-04-14  209  	struct pci_dev *pdev = doe->pdev;
9d119b6670629a Jonathan Cameron 2021-04-14  210  	struct pcie_doe_task *task;
9d119b6670629a Jonathan Cameron 2021-04-14  211  	bool abort;
9d119b6670629a Jonathan Cameron 2021-04-14  212  	u32 val;
9d119b6670629a Jonathan Cameron 2021-04-14  213  	int rc;
9d119b6670629a Jonathan Cameron 2021-04-14  214  
9d119b6670629a Jonathan Cameron 2021-04-14  215  	mutex_lock(&doe->tasks_lock);
9d119b6670629a Jonathan Cameron 2021-04-14  216  	task = list_first_entry_or_null(&doe->tasks, struct pcie_doe_task, h);
9d119b6670629a Jonathan Cameron 2021-04-14  217  	abort = doe->abort;
9d119b6670629a Jonathan Cameron 2021-04-14  218  	doe->abort = false;
9d119b6670629a Jonathan Cameron 2021-04-14  219  	mutex_unlock(&doe->tasks_lock);
9d119b6670629a Jonathan Cameron 2021-04-14  220  
9d119b6670629a Jonathan Cameron 2021-04-14  221  	if (abort) {
9d119b6670629a Jonathan Cameron 2021-04-14  222  		/*
9d119b6670629a Jonathan Cameron 2021-04-14  223  		 * Currently only used during init - care needed if we want to generally
9d119b6670629a Jonathan Cameron 2021-04-14  224  		 * expose pcie_doe_abort() as it would impact queries in flight.
9d119b6670629a Jonathan Cameron 2021-04-14  225  		 */
9d119b6670629a Jonathan Cameron 2021-04-14  226  		WARN_ON(task);
9d119b6670629a Jonathan Cameron 2021-04-14  227  		doe->state = DOE_WAIT_ABORT;
9d119b6670629a Jonathan Cameron 2021-04-14  228  		pcie_doe_abort_start(doe);
9d119b6670629a Jonathan Cameron 2021-04-14  229  		return;
9d119b6670629a Jonathan Cameron 2021-04-14  230  	}
9d119b6670629a Jonathan Cameron 2021-04-14  231  
9d119b6670629a Jonathan Cameron 2021-04-14  232  	switch (doe->state) {
9d119b6670629a Jonathan Cameron 2021-04-14  233  	case DOE_IDLE:
9d119b6670629a Jonathan Cameron 2021-04-14  234  		if (task == NULL)
9d119b6670629a Jonathan Cameron 2021-04-14  235  			return;
9d119b6670629a Jonathan Cameron 2021-04-14  236  
9d119b6670629a Jonathan Cameron 2021-04-14  237  		/* Nothing currently in flight so queue a task */
9d119b6670629a Jonathan Cameron 2021-04-14  238  		rc = pcie_doe_send_req(doe, task->ex);
9d119b6670629a Jonathan Cameron 2021-04-14  239  		/*
9d119b6670629a Jonathan Cameron 2021-04-14  240  		 * The specification does not provide any guidance on how long some other
9d119b6670629a Jonathan Cameron 2021-04-14  241  		 * entity could keep the DOE busy, so try for 1 second then fail.
9d119b6670629a Jonathan Cameron 2021-04-14  242  		 * Busy handling is best effort only, because there is not way of avoiding
9d119b6670629a Jonathan Cameron 2021-04-14  243  		 * racing against another user of the DOE.
9d119b6670629a Jonathan Cameron 2021-04-14  244  		 */
9d119b6670629a Jonathan Cameron 2021-04-14  245  		if (rc == -EBUSY) {
9d119b6670629a Jonathan Cameron 2021-04-14  246  			doe->busy_retries++;
9d119b6670629a Jonathan Cameron 2021-04-14  247  			if (doe->busy_retries == PCI_DOE_BUSY_MAX_RETRIES) {
9d119b6670629a Jonathan Cameron 2021-04-14  248  				/* Long enough, fail this request */
9d119b6670629a Jonathan Cameron 2021-04-14  249  				doe->busy_retries = 0;
9d119b6670629a Jonathan Cameron 2021-04-14  250  				goto busy;
9d119b6670629a Jonathan Cameron 2021-04-14  251  			}
9d119b6670629a Jonathan Cameron 2021-04-14  252  			schedule_delayed_work(w, HZ / PCI_DOE_BUSY_MAX_RETRIES);
9d119b6670629a Jonathan Cameron 2021-04-14  253  			return;
9d119b6670629a Jonathan Cameron 2021-04-14  254  		}
9d119b6670629a Jonathan Cameron 2021-04-14  255  		if (rc)
9d119b6670629a Jonathan Cameron 2021-04-14  256  			goto abort;
9d119b6670629a Jonathan Cameron 2021-04-14  257  		doe->busy_retries = 0;
9d119b6670629a Jonathan Cameron 2021-04-14  258  
9d119b6670629a Jonathan Cameron 2021-04-14  259  		doe->state = DOE_WAIT_RESP;
9d119b6670629a Jonathan Cameron 2021-04-14  260  		doe->timeout_jiffies = jiffies + HZ;
9d119b6670629a Jonathan Cameron 2021-04-14  261  		/* Now poll or wait for IRQ with timeout */
9d119b6670629a Jonathan Cameron 2021-04-14  262  		if (doe->irq > 0)
9d119b6670629a Jonathan Cameron 2021-04-14  263  			schedule_delayed_work(w, PCI_DOE_TIMEOUT);
9d119b6670629a Jonathan Cameron 2021-04-14  264  		else
9d119b6670629a Jonathan Cameron 2021-04-14  265  			schedule_delayed_work(w, PCI_DOE_POLL_INTERVAL);
9d119b6670629a Jonathan Cameron 2021-04-14  266  		return;
9d119b6670629a Jonathan Cameron 2021-04-14  267  
9d119b6670629a Jonathan Cameron 2021-04-14  268  	case DOE_WAIT_RESP:
9d119b6670629a Jonathan Cameron 2021-04-14  269  		/* Not possible to get here with NULL task */
9d119b6670629a Jonathan Cameron 2021-04-14  270  		pci_read_config_dword(pdev, doe->cap + PCI_DOE_STATUS, &val);
9d119b6670629a Jonathan Cameron 2021-04-14  271  		if (FIELD_GET(PCI_DOE_STATUS_ERROR, val)) {
9d119b6670629a Jonathan Cameron 2021-04-14  272  			rc = -EIO;
9d119b6670629a Jonathan Cameron 2021-04-14  273  			goto abort;
9d119b6670629a Jonathan Cameron 2021-04-14  274  		}
9d119b6670629a Jonathan Cameron 2021-04-14  275  
9d119b6670629a Jonathan Cameron 2021-04-14  276  		if (!FIELD_GET(PCI_DOE_STATUS_DATA_OBJECT_READY, val)) {
9d119b6670629a Jonathan Cameron 2021-04-14  277  			/* If not yet at timeout reschedule otherwise abort */
9d119b6670629a Jonathan Cameron 2021-04-14  278  			if (time_after(jiffies, doe->timeout_jiffies)) {
9d119b6670629a Jonathan Cameron 2021-04-14  279  				rc = -ETIMEDOUT;
9d119b6670629a Jonathan Cameron 2021-04-14  280  				goto abort;
9d119b6670629a Jonathan Cameron 2021-04-14  281  			}
9d119b6670629a Jonathan Cameron 2021-04-14  282  			schedule_delayed_work(w, PCI_DOE_POLL_INTERVAL);
9d119b6670629a Jonathan Cameron 2021-04-14  283  			return;
9d119b6670629a Jonathan Cameron 2021-04-14  284  		}
9d119b6670629a Jonathan Cameron 2021-04-14  285  
9d119b6670629a Jonathan Cameron 2021-04-14  286  		rc  = pcie_doe_recv_resp(doe, task->ex);
9d119b6670629a Jonathan Cameron 2021-04-14  287  		if (rc < 0)
9d119b6670629a Jonathan Cameron 2021-04-14  288  			goto abort;
9d119b6670629a Jonathan Cameron 2021-04-14  289  
9d119b6670629a Jonathan Cameron 2021-04-14  290  		doe->state = DOE_IDLE;
9d119b6670629a Jonathan Cameron 2021-04-14  291  
9d119b6670629a Jonathan Cameron 2021-04-14  292  		mutex_lock(&doe->tasks_lock);
9d119b6670629a Jonathan Cameron 2021-04-14  293  		list_del(&task->h);
9d119b6670629a Jonathan Cameron 2021-04-14  294  		if (!list_empty(&doe->tasks))
9d119b6670629a Jonathan Cameron 2021-04-14  295  			schedule_delayed_work(w, 0);
9d119b6670629a Jonathan Cameron 2021-04-14  296  		mutex_unlock(&doe->tasks_lock);
9d119b6670629a Jonathan Cameron 2021-04-14  297  
9d119b6670629a Jonathan Cameron 2021-04-14  298  		/* Set the return value to the length of received payload */
9d119b6670629a Jonathan Cameron 2021-04-14  299  		task->rv = rc;
9d119b6670629a Jonathan Cameron 2021-04-14  300  		task->cb(task->private);
9d119b6670629a Jonathan Cameron 2021-04-14  301  		return;
9d119b6670629a Jonathan Cameron 2021-04-14  302  
9d119b6670629a Jonathan Cameron 2021-04-14  303  	case DOE_WAIT_ABORT:
9d119b6670629a Jonathan Cameron 2021-04-14  304  	case DOE_WAIT_ABORT_ON_ERR:
9d119b6670629a Jonathan Cameron 2021-04-14  305  		pci_read_config_dword(pdev, doe->cap + PCI_DOE_STATUS, &val);
9d119b6670629a Jonathan Cameron 2021-04-14  306  
9d119b6670629a Jonathan Cameron 2021-04-14  307  		if (!FIELD_GET(PCI_DOE_STATUS_ERROR, val) &&
9d119b6670629a Jonathan Cameron 2021-04-14  308  		    !FIELD_GET(PCI_DOE_STATUS_BUSY, val)) {
9d119b6670629a Jonathan Cameron 2021-04-14  309  			/* Back to normal state - carry on */
9d119b6670629a Jonathan Cameron 2021-04-14  310  			mutex_lock(&doe->tasks_lock);
9d119b6670629a Jonathan Cameron 2021-04-14  311  			if (!list_empty(&doe->tasks))
9d119b6670629a Jonathan Cameron 2021-04-14  312  				schedule_delayed_work(w, 0);
9d119b6670629a Jonathan Cameron 2021-04-14  313  			mutex_unlock(&doe->tasks_lock);
9d119b6670629a Jonathan Cameron 2021-04-14  314  
9d119b6670629a Jonathan Cameron 2021-04-14  315  			/* For deliberately triggered abort, someone is waiting */
9d119b6670629a Jonathan Cameron 2021-04-14  316  			if (doe->state == DOE_WAIT_ABORT)
9d119b6670629a Jonathan Cameron 2021-04-14  317  				complete(&doe->abort_c);
9d119b6670629a Jonathan Cameron 2021-04-14  318  			doe->state = DOE_IDLE;
9d119b6670629a Jonathan Cameron 2021-04-14  319  
9d119b6670629a Jonathan Cameron 2021-04-14  320  			return;
9d119b6670629a Jonathan Cameron 2021-04-14  321  		}
9d119b6670629a Jonathan Cameron 2021-04-14  322  		if (time_after(jiffies, doe->timeout_jiffies)) {
9d119b6670629a Jonathan Cameron 2021-04-14  323  			struct pcie_doe_task *t, *n;
9d119b6670629a Jonathan Cameron 2021-04-14  324  
9d119b6670629a Jonathan Cameron 2021-04-14  325  			/* We are dead - abort all queued tasks */
9d119b6670629a Jonathan Cameron 2021-04-14  326  			dev_err(&pdev->dev, "DOE ABORT timed out\n");
9d119b6670629a Jonathan Cameron 2021-04-14  327  			mutex_lock(&doe->tasks_lock);
9d119b6670629a Jonathan Cameron 2021-04-14  328  			doe->dead = true;
9d119b6670629a Jonathan Cameron 2021-04-14  329  			list_for_each_entry_safe(t, n, &doe->tasks, h) {
9d119b6670629a Jonathan Cameron 2021-04-14  330  				t->rv = -EIO;
9d119b6670629a Jonathan Cameron 2021-04-14  331  				t->cb(t->private);
9d119b6670629a Jonathan Cameron 2021-04-14  332  				list_del(&t->h);
9d119b6670629a Jonathan Cameron 2021-04-14  333  			}
9d119b6670629a Jonathan Cameron 2021-04-14  334  
9d119b6670629a Jonathan Cameron 2021-04-14  335  			mutex_unlock(&doe->tasks_lock);
9d119b6670629a Jonathan Cameron 2021-04-14  336  			if (doe->state == DOE_WAIT_ABORT)
9d119b6670629a Jonathan Cameron 2021-04-14  337  				complete(&doe->abort_c);
9d119b6670629a Jonathan Cameron 2021-04-14  338  		}
9d119b6670629a Jonathan Cameron 2021-04-14  339  		return;
9d119b6670629a Jonathan Cameron 2021-04-14  340  	}
9d119b6670629a Jonathan Cameron 2021-04-14  341  
9d119b6670629a Jonathan Cameron 2021-04-14  342  abort:
9d119b6670629a Jonathan Cameron 2021-04-14  343  	pcie_doe_abort_start(doe);
9d119b6670629a Jonathan Cameron 2021-04-14  344  	doe->state = DOE_WAIT_ABORT_ON_ERR;
9d119b6670629a Jonathan Cameron 2021-04-14  345  busy:
9d119b6670629a Jonathan Cameron 2021-04-14  346  	mutex_lock(&doe->tasks_lock);
9d119b6670629a Jonathan Cameron 2021-04-14  347  	list_del(&task->h);
9d119b6670629a Jonathan Cameron 2021-04-14  348  	mutex_unlock(&doe->tasks_lock);
9d119b6670629a Jonathan Cameron 2021-04-14  349  
9d119b6670629a Jonathan Cameron 2021-04-14 @350  	task->rv = rc;
9d119b6670629a Jonathan Cameron 2021-04-14  351  	task->cb(task->private);
9d119b6670629a Jonathan Cameron 2021-04-14  352  	/* If we got here via busy, and the queue isn't empty then we need to go again */
9d119b6670629a Jonathan Cameron 2021-04-14  353  	if (doe->state == DOE_IDLE) {
9d119b6670629a Jonathan Cameron 2021-04-14  354  		mutex_lock(&doe->tasks_lock);
9d119b6670629a Jonathan Cameron 2021-04-14  355  		if (!list_empty(&doe->tasks))
9d119b6670629a Jonathan Cameron 2021-04-14  356  			schedule_delayed_work(w, 0);
9d119b6670629a Jonathan Cameron 2021-04-14  357  		mutex_unlock(&doe->tasks_lock);
9d119b6670629a Jonathan Cameron 2021-04-14  358  	}
9d119b6670629a Jonathan Cameron 2021-04-14  359  }
9d119b6670629a Jonathan Cameron 2021-04-14  360  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 36422 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2021-04-14 18:51 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-13 16:01 [RFC PATCH v2 0/4] PCI Data Object Exchange support + CXL CDAT Jonathan Cameron
2021-04-13 16:01 ` [RFC PATCH v2 1/4] PCI: Add vendor define ID for the PCI SIG Jonathan Cameron
2021-04-13 16:34   ` Bjorn Helgaas
2021-04-13 18:21     ` Jonathan Cameron
2021-04-13 18:38       ` Bjorn Helgaas
2021-04-13 16:01 ` [RFC PATCH v2 2/4] PCI/doe: Initial support PCI Data Object Exchange Jonathan Cameron
2021-04-13 19:49   ` Bjorn Helgaas
2021-04-13 16:01 ` [RFC PATCH v2 3/4] cxl/mem: Add CDAT table reading from DOE Jonathan Cameron
2021-04-13 23:18   ` kernel test robot
2021-04-14  0:30   ` kernel test robot
2021-04-14 18:14   ` Konrad Rzeszutek Wilk
2021-04-14 18:50     ` Ben Widawsky
2021-04-13 16:01 ` [RFC PATCH v2 4/4] cxl/mem: Add a debug parser for CDAT commands Jonathan Cameron
2021-04-14  4:09 [RFC PATCH v2 3/4] cxl/mem: Add CDAT table reading from DOE kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.