All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Scull <ascull@google.com>
To: u-boot@lists.denx.de
Cc: sjg@chromium.org, bmeng.cn@gmail.com, adelva@google.com,
	keirf@google.com,  ptosi@google.com,
	Andrew Scull <ascull@google.com>
Subject: [PATCH v2 14/18] pci: Match region flags using a mask
Date: Tue, 29 Mar 2022 16:58:56 +0000	[thread overview]
Message-ID: <20220329165900.1139885-15-ascull@google.com> (raw)
In-Reply-To: <20220329165900.1139885-1-ascull@google.com>

When converting addresses, apply a mask to the region flags during
lookup. This allows the caller to specify which flags are important and
which are not, for example to exclude system memory regions.

The behaviour of the function is changed such that they don't
preferentially search for a non-system memory region. However, system
memory regions are added after other regions in decode_regions() leading
to a similar outcome.

Signed-off-by: Andrew Scull <ascull@google.com>
---
 drivers/pci/pci-uclass.c | 110 +++++++++------------------------------
 include/pci.h            |  18 ++++---
 test/dm/pci.c            |  60 +++++++++++----------
 3 files changed, 67 insertions(+), 121 deletions(-)

diff --git a/drivers/pci/pci-uclass.c b/drivers/pci/pci-uclass.c
index 033c52bb4e..5069ada66d 100644
--- a/drivers/pci/pci-uclass.c
+++ b/drivers/pci/pci-uclass.c
@@ -1394,27 +1394,27 @@ void dm_pci_write_bar32(struct udevice *dev, int barnum, u32 addr)
 	dm_pci_write_config32(dev, bar, addr);
 }
 
-static int _dm_pci_bus_to_phys(struct udevice *ctlr, pci_addr_t bus_addr,
-			       size_t len, unsigned long flags,
-			       unsigned long skip_mask, phys_addr_t *pa)
+phys_addr_t dm_pci_bus_to_phys(struct udevice *dev, pci_addr_t bus_addr,
+			       size_t len, unsigned long mask,
+			       unsigned long flags)
 {
-	struct pci_controller *hose = dev_get_uclass_priv(ctlr);
+	struct udevice *ctlr;
+	struct pci_controller *hose;
 	struct pci_region *res;
 	pci_addr_t offset;
 	int i;
 
-	if (hose->region_count == 0) {
-		*pa = bus_addr;
-		return 0;
-	}
+	/* The root controller has the region information */
+	ctlr = pci_get_controller(dev);
+	hose = dev_get_uclass_priv(ctlr);
+
+	if (hose->region_count == 0)
+		return bus_addr;
 
 	for (i = 0; i < hose->region_count; i++) {
 		res = &hose->regions[i];
 
-		if (((res->flags ^ flags) & PCI_REGION_TYPE) != 0)
-			continue;
-
-		if (res->flags & skip_mask)
+		if ((res->flags & mask) != flags)
 			continue;
 
 		if (bus_addr < res->bus_start)
@@ -1427,69 +1427,34 @@ static int _dm_pci_bus_to_phys(struct udevice *ctlr, pci_addr_t bus_addr,
 		if (len > res->size - offset)
 			continue;
 
-		*pa = res->phys_start + offset;
-		return 0;
+		return res->phys_start + offset;
 	}
 
-	return 1;
+	puts("pci_hose_bus_to_phys: invalid physical address\n");
+	return 0;
 }
 
-phys_addr_t dm_pci_bus_to_phys(struct udevice *dev, pci_addr_t bus_addr,
-			       size_t len, unsigned long flags)
+pci_addr_t dm_pci_phys_to_bus(struct udevice *dev, phys_addr_t phys_addr,
+			      size_t len, unsigned long mask,
+			      unsigned long flags)
 {
-	phys_addr_t phys_addr = 0;
 	struct udevice *ctlr;
-	int ret;
-
-	/* The root controller has the region information */
-	ctlr = pci_get_controller(dev);
-
-	/*
-	 * if PCI_REGION_MEM is set we do a two pass search with preference
-	 * on matches that don't have PCI_REGION_SYS_MEMORY set
-	 */
-	if ((flags & PCI_REGION_TYPE) == PCI_REGION_MEM) {
-		ret = _dm_pci_bus_to_phys(ctlr, bus_addr, len,
-					  flags, PCI_REGION_SYS_MEMORY,
-					  &phys_addr);
-		if (!ret)
-			return phys_addr;
-	}
-
-	ret = _dm_pci_bus_to_phys(ctlr, bus_addr, len, flags, 0, &phys_addr);
-
-	if (ret)
-		puts("pci_hose_bus_to_phys: invalid physical address\n");
-
-	return phys_addr;
-}
-
-static int _dm_pci_phys_to_bus(struct udevice *dev, phys_addr_t phys_addr,
-			       size_t len, unsigned long flags,
-			       unsigned long skip_mask, pci_addr_t *ba)
-{
+	struct pci_controller *hose;
 	struct pci_region *res;
-	struct udevice *ctlr;
 	phys_addr_t offset;
 	int i;
-	struct pci_controller *hose;
 
 	/* The root controller has the region information */
 	ctlr = pci_get_controller(dev);
 	hose = dev_get_uclass_priv(ctlr);
 
-	if (hose->region_count == 0) {
-		*ba = phys_addr;
-		return 0;
-	}
+	if (hose->region_count == 0)
+		return phys_addr;
 
 	for (i = 0; i < hose->region_count; i++) {
 		res = &hose->regions[i];
 
-		if (((res->flags ^ flags) & PCI_REGION_TYPE) != 0)
-			continue;
-
-		if (res->flags & skip_mask)
+		if ((res->flags & mask) != flags)
 			continue;
 
 		if (phys_addr < res->phys_start)
@@ -1502,36 +1467,11 @@ static int _dm_pci_phys_to_bus(struct udevice *dev, phys_addr_t phys_addr,
 		if (len > res->size - offset)
 			continue;
 
-		*ba = res->bus_start + offset;
-		return 0;
-	}
-
-	return 1;
-}
-
-pci_addr_t dm_pci_phys_to_bus(struct udevice *dev, phys_addr_t phys_addr,
-			      size_t len, unsigned long flags)
-{
-	pci_addr_t bus_addr = 0;
-	int ret;
-
-	/*
-	 * if PCI_REGION_MEM is set we do a two pass search with preference
-	 * on matches that don't have PCI_REGION_SYS_MEMORY set
-	 */
-	if ((flags & PCI_REGION_TYPE) == PCI_REGION_MEM) {
-		ret = _dm_pci_phys_to_bus(dev, phys_addr, len, flags,
-					  PCI_REGION_SYS_MEMORY, &bus_addr);
-		if (!ret)
-			return bus_addr;
+		return res->bus_start + offset;
 	}
 
-	ret = _dm_pci_phys_to_bus(dev, phys_addr, len, flags, 0, &bus_addr);
-
-	if (ret)
-		puts("pci_hose_phys_to_bus: invalid physical address\n");
-
-	return bus_addr;
+	puts("pci_hose_phys_to_bus: invalid physical address\n");
+	return 0;
 }
 
 static phys_addr_t dm_pci_map_ea_virt(struct udevice *dev, int ea_off,
diff --git a/include/pci.h b/include/pci.h
index d137debb68..8198265269 100644
--- a/include/pci.h
+++ b/include/pci.h
@@ -1441,11 +1441,12 @@ u32 dm_pci_read_bar32(const struct udevice *dev, int barnum);
  * @dev:	Device containing the PCI address
  * @addr:	PCI address to convert
  * @len:	Length of the address range
+ * @mask:       Mask to match flags for the region type
  * @flags:	Flags for the region type (PCI_REGION_...)
  * Return: physical address corresponding to that PCI bus address
  */
 phys_addr_t dm_pci_bus_to_phys(struct udevice *dev, pci_addr_t addr, size_t len,
-			       unsigned long flags);
+			       unsigned long mask, unsigned long flags);
 
 /**
  * dm_pci_phys_to_bus() - convert a physical address to a PCI bus address
@@ -1453,11 +1454,12 @@ phys_addr_t dm_pci_bus_to_phys(struct udevice *dev, pci_addr_t addr, size_t len,
  * @dev:	Device containing the bus address
  * @addr:	Physical address to convert
  * @len:	Length of the address range
+ * @mask:       Mask to match flags for the region type
  * @flags:	Flags for the region type (PCI_REGION_...)
  * Return: PCI bus address corresponding to that physical address
  */
 pci_addr_t dm_pci_phys_to_bus(struct udevice *dev, phys_addr_t addr, size_t len,
-			      unsigned long flags);
+			      unsigned long mask, unsigned long flags);
 
 /**
  * dm_pci_map_bar() - get a virtual address associated with a BAR region
@@ -1581,19 +1583,19 @@ int dm_pci_find_ext_capability(struct udevice *dev, int cap);
 int dm_pci_flr(struct udevice *dev);
 
 #define dm_pci_virt_to_bus(dev, addr, flags) \
-	dm_pci_phys_to_bus(dev, (virt_to_phys(addr)), 0, (flags))
+	dm_pci_phys_to_bus(dev, (virt_to_phys(addr)), 0, PCI_REGION_TYPE, (flags))
 #define dm_pci_bus_to_virt(dev, addr, flags, len, map_flags) \
-	map_physmem(dm_pci_bus_to_phys(dev, (addr), (len), (flags)), \
+	map_physmem(dm_pci_bus_to_phys(dev, (addr), (len), PCI_REGION_TYPE, (flags)), \
 		    (len), (map_flags))
 
 #define dm_pci_phys_to_mem(dev, addr) \
-	dm_pci_phys_to_bus((dev), (addr), 0, PCI_REGION_MEM)
+	dm_pci_phys_to_bus((dev), (addr), 0, PCI_REGION_TYPE, PCI_REGION_MEM)
 #define dm_pci_mem_to_phys(dev, addr) \
-	dm_pci_bus_to_phys((dev), (addr), 0, PCI_REGION_MEM)
+	dm_pci_bus_to_phys((dev), (addr), 0, PCI_REGION_TYPE, PCI_REGION_MEM)
 #define dm_pci_phys_to_io(dev, addr) \
-	dm_pci_phys_to_bus((dev), (addr), 0, PCI_REGION_IO)
+	dm_pci_phys_to_bus((dev), (addr), 0, PCI_REGION_TYPE, PCI_REGION_IO)
 #define dm_pci_io_to_phys(dev, addr) \
-	dm_pci_bus_to_phys((dev), (addr), 0, PCI_REGION_IO)
+	dm_pci_bus_to_phys((dev), (addr), 0, PCI_REGION_TYPE, PCI_REGION_IO)
 
 #define dm_pci_virt_to_mem(dev, addr) \
 	dm_pci_virt_to_bus((dev), (addr), PCI_REGION_MEM)
diff --git a/test/dm/pci.c b/test/dm/pci.c
index c8598e4c17..edc407f9d3 100644
--- a/test/dm/pci.c
+++ b/test/dm/pci.c
@@ -383,45 +383,47 @@ DM_TEST(dm_test_pci_region_multi, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
  */
 static int dm_test_pci_bus_to_phys(struct unit_test_state *uts)
 {
+	unsigned long mask = PCI_REGION_TYPE;
+	unsigned long flags = PCI_REGION_MEM;
 	struct udevice *dev;
 	phys_addr_t phys_addr;
 
 	ut_assertok(dm_pci_bus_find_bdf(PCI_BDF(1, 0x08, 0), &dev));
 
 	/* Before any of the ranges. */
-	phys_addr = dm_pci_bus_to_phys(dev, 0x20000000, 0x400, PCI_REGION_MEM);
+	phys_addr = dm_pci_bus_to_phys(dev, 0x20000000, 0x400, mask, flags);
 	ut_asserteq(0, phys_addr);
 
 	/* Identity range: whole, start, mid, end */
-	phys_addr = dm_pci_bus_to_phys(dev, 0x2fff0000, 0x2000, PCI_REGION_MEM);
+	phys_addr = dm_pci_bus_to_phys(dev, 0x2fff0000, 0x2000, mask, flags);
 	ut_asserteq(0, phys_addr);
-	phys_addr = dm_pci_bus_to_phys(dev, 0x30000000, 0x2000, PCI_REGION_MEM);
+	phys_addr = dm_pci_bus_to_phys(dev, 0x30000000, 0x2000, mask, flags);
 	ut_asserteq(0x30000000, phys_addr);
-	phys_addr = dm_pci_bus_to_phys(dev, 0x30000000, 0x1000, PCI_REGION_MEM);
+	phys_addr = dm_pci_bus_to_phys(dev, 0x30000000, 0x1000, mask, flags);
 	ut_asserteq(0x30000000, phys_addr);
-	phys_addr = dm_pci_bus_to_phys(dev, 0x30000abc, 0x12, PCI_REGION_MEM);
+	phys_addr = dm_pci_bus_to_phys(dev, 0x30000abc, 0x12, mask, flags);
 	ut_asserteq(0x30000abc, phys_addr);
-	phys_addr = dm_pci_bus_to_phys(dev, 0x30000800, 0x1800, PCI_REGION_MEM);
+	phys_addr = dm_pci_bus_to_phys(dev, 0x30000800, 0x1800, mask, flags);
 	ut_asserteq(0x30000800, phys_addr);
-	phys_addr = dm_pci_bus_to_phys(dev, 0x30008000, 0x1801, PCI_REGION_MEM);
+	phys_addr = dm_pci_bus_to_phys(dev, 0x30008000, 0x1801, mask, flags);
 	ut_asserteq(0, phys_addr);
 
 	/* Translated range: whole, start, mid, end */
-	phys_addr = dm_pci_bus_to_phys(dev, 0x30ff0000, 0x2000, PCI_REGION_MEM);
+	phys_addr = dm_pci_bus_to_phys(dev, 0x30ff0000, 0x2000, mask, flags);
 	ut_asserteq(0, phys_addr);
-	phys_addr = dm_pci_bus_to_phys(dev, 0x31000000, 0x2000, PCI_REGION_MEM);
+	phys_addr = dm_pci_bus_to_phys(dev, 0x31000000, 0x2000, mask, flags);
 	ut_asserteq(0x3e000000, phys_addr);
-	phys_addr = dm_pci_bus_to_phys(dev, 0x31000000, 0x1000, PCI_REGION_MEM);
+	phys_addr = dm_pci_bus_to_phys(dev, 0x31000000, 0x1000, mask, flags);
 	ut_asserteq(0x3e000000, phys_addr);
-	phys_addr = dm_pci_bus_to_phys(dev, 0x31000abc, 0x12, PCI_REGION_MEM);
+	phys_addr = dm_pci_bus_to_phys(dev, 0x31000abc, 0x12, mask, flags);
 	ut_asserteq(0x3e000abc, phys_addr);
-	phys_addr = dm_pci_bus_to_phys(dev, 0x31000800, 0x1800, PCI_REGION_MEM);
+	phys_addr = dm_pci_bus_to_phys(dev, 0x31000800, 0x1800, mask, flags);
 	ut_asserteq(0x3e000800, phys_addr);
-	phys_addr = dm_pci_bus_to_phys(dev, 0x31008000, 0x1801, PCI_REGION_MEM);
+	phys_addr = dm_pci_bus_to_phys(dev, 0x31008000, 0x1801, mask, flags);
 	ut_asserteq(0, phys_addr);
 
 	/* Beyond all of the ranges. */
-	phys_addr = dm_pci_bus_to_phys(dev, 0x32000000, 0x400, PCI_REGION_MEM);
+	phys_addr = dm_pci_bus_to_phys(dev, 0x32000000, 0x400, mask, flags);
 	ut_asserteq(0, phys_addr);
 
 	return 0;
@@ -434,45 +436,47 @@ DM_TEST(dm_test_pci_bus_to_phys, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
  */
 static int dm_test_pci_phys_to_bus(struct unit_test_state *uts)
 {
+	unsigned long mask = PCI_REGION_TYPE;
+	unsigned long flags = PCI_REGION_MEM;
 	struct udevice *dev;
 	phys_addr_t phys_addr;
 
 	ut_assertok(dm_pci_bus_find_bdf(PCI_BDF(1, 0x08, 0), &dev));
 
 	/* Before any of the ranges. */
-	phys_addr = dm_pci_phys_to_bus(dev, 0x20000000, 0x400, PCI_REGION_MEM);
+	phys_addr = dm_pci_phys_to_bus(dev, 0x20000000, 0x400, mask, flags);
 	ut_asserteq(0, phys_addr);
 
 	/* Identity range: whole, start, mid, end */
-	phys_addr = dm_pci_phys_to_bus(dev, 0x2fff0000, 0x2000, PCI_REGION_MEM);
+	phys_addr = dm_pci_phys_to_bus(dev, 0x2fff0000, 0x2000, mask, flags);
 	ut_asserteq(0, phys_addr);
-	phys_addr = dm_pci_phys_to_bus(dev, 0x30000000, 0x2000, PCI_REGION_MEM);
+	phys_addr = dm_pci_phys_to_bus(dev, 0x30000000, 0x2000, mask, flags);
 	ut_asserteq(0x30000000, phys_addr);
-	phys_addr = dm_pci_phys_to_bus(dev, 0x30000000, 0x1000, PCI_REGION_MEM);
+	phys_addr = dm_pci_phys_to_bus(dev, 0x30000000, 0x1000, mask, flags);
 	ut_asserteq(0x30000000, phys_addr);
-	phys_addr = dm_pci_phys_to_bus(dev, 0x30000abc, 0x12, PCI_REGION_MEM);
+	phys_addr = dm_pci_phys_to_bus(dev, 0x30000abc, 0x12, mask, flags);
 	ut_asserteq(0x30000abc, phys_addr);
-	phys_addr = dm_pci_phys_to_bus(dev, 0x30000800, 0x1800, PCI_REGION_MEM);
+	phys_addr = dm_pci_phys_to_bus(dev, 0x30000800, 0x1800, mask, flags);
 	ut_asserteq(0x30000800, phys_addr);
-	phys_addr = dm_pci_phys_to_bus(dev, 0x30008000, 0x1801, PCI_REGION_MEM);
+	phys_addr = dm_pci_phys_to_bus(dev, 0x30008000, 0x1801, mask, flags);
 	ut_asserteq(0, phys_addr);
 
 	/* Translated range: whole, start, mid, end */
-	phys_addr = dm_pci_phys_to_bus(dev, 0x3dff0000, 0x2000, PCI_REGION_MEM);
+	phys_addr = dm_pci_phys_to_bus(dev, 0x3dff0000, 0x2000, mask, flags);
 	ut_asserteq(0, phys_addr);
-	phys_addr = dm_pci_phys_to_bus(dev, 0x3e000000, 0x2000, PCI_REGION_MEM);
+	phys_addr = dm_pci_phys_to_bus(dev, 0x3e000000, 0x2000, mask, flags);
 	ut_asserteq(0x31000000, phys_addr);
-	phys_addr = dm_pci_phys_to_bus(dev, 0x3e000000, 0x1000, PCI_REGION_MEM);
+	phys_addr = dm_pci_phys_to_bus(dev, 0x3e000000, 0x1000, mask, flags);
 	ut_asserteq(0x31000000, phys_addr);
-	phys_addr = dm_pci_phys_to_bus(dev, 0x3e000abc, 0x12, PCI_REGION_MEM);
+	phys_addr = dm_pci_phys_to_bus(dev, 0x3e000abc, 0x12, mask, flags);
 	ut_asserteq(0x31000abc, phys_addr);
-	phys_addr = dm_pci_phys_to_bus(dev, 0x3e000800, 0x1800, PCI_REGION_MEM);
+	phys_addr = dm_pci_phys_to_bus(dev, 0x3e000800, 0x1800, mask, flags);
 	ut_asserteq(0x31000800, phys_addr);
-	phys_addr = dm_pci_phys_to_bus(dev, 0x3e008000, 0x1801, PCI_REGION_MEM);
+	phys_addr = dm_pci_phys_to_bus(dev, 0x3e008000, 0x1801, mask, flags);
 	ut_asserteq(0, phys_addr);
 
 	/* Beyond all of the ranges. */
-	phys_addr = dm_pci_phys_to_bus(dev, 0x3f000000, 0x400, PCI_REGION_MEM);
+	phys_addr = dm_pci_phys_to_bus(dev, 0x3f000000, 0x400, mask, flags);
 	ut_asserteq(0, phys_addr);
 
 	return 0;
-- 
2.35.1.1021.g381101b075-goog


  parent reply	other threads:[~2022-03-29 17:02 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-29 16:58 [PATCH v2 00/18] virtio: pci: Add and fix consistency checks Andrew Scull
2022-03-29 16:58 ` [PATCH v2 01/18] virtio: pci: Allow exclusion of legacy driver Andrew Scull
2022-03-29 16:58 ` [PATCH v2 02/18] virtio: pci: Fix discovery of device config length Andrew Scull
2022-03-29 16:58 ` [PATCH v2 03/18] virtio: pci: Bounds check device config access Andrew Scull
2022-03-29 16:58 ` [PATCH v2 04/18] virtio: pci: Bounds check notification writes Andrew Scull
2022-03-29 16:58 ` [PATCH v2 05/18] virtio: pci: Check virtio common config size Andrew Scull
2022-03-29 16:58 ` [PATCH v2 06/18] virtio: pci: Check virtio capability is in bounds Andrew Scull
2022-04-13 13:14   ` Bin Meng
2022-03-29 16:58 ` [PATCH v2 07/18] virtio: pci: Read entire capability into memory Andrew Scull
2022-04-13 13:14   ` Bin Meng
2022-03-29 16:58 ` [PATCH v2 08/18] pci: Fix use of flags in dm_pci_map_bar() Andrew Scull
2022-04-13 13:11   ` Bin Meng
2022-04-13 16:23     ` Andrew Scull
2022-03-29 16:58 ` [PATCH v2 09/18] pci: Add config for Enhanced Allocation Andrew Scull
2022-04-13 13:14   ` Bin Meng
2022-04-13 16:30     ` Andrew Scull
2022-04-14  0:42       ` Bin Meng
2022-04-14  7:58         ` Andrew Scull
2022-04-14  9:39           ` Andrew Scull
2022-04-22  7:44           ` Bin Meng
2022-03-29 16:58 ` [PATCH v2 10/18] pci: Check region ranges are addressable Andrew Scull
2023-04-24 14:06   ` Stefan Agner
2022-03-29 16:58 ` [PATCH v2 11/18] pci: Range check address conversions Andrew Scull
2022-04-13 14:02   ` Bin Meng
2022-03-29 16:58 ` [PATCH v2 12/18] test: pci: Test PCI address conversion functions Andrew Scull
2022-04-13 14:03   ` Bin Meng
2022-04-13 16:44     ` Andrew Scull
2022-03-29 16:58 ` [PATCH v2 13/18] pci: Map bars with offset and length Andrew Scull
2022-04-12 16:42   ` Tom Rini
2022-04-12 22:54     ` Andrew Scull
2022-04-12 23:11       ` Tom Rini
2022-04-13 14:05   ` Bin Meng
2022-04-13 16:48     ` Andrew Scull
2022-03-29 16:58 ` Andrew Scull [this message]
2022-04-13 14:59   ` [PATCH v2 14/18] pci: Match region flags using a mask Bin Meng
2022-03-29 16:58 ` [PATCH v2 15/18] pci: Update dm_pci_bus_to_virt() parameters Andrew Scull
2022-04-13 15:03   ` Bin Meng
2022-04-14  7:44     ` Andrew Scull
2022-03-29 16:58 ` [PATCH v2 16/18] pci: Add mask parameter to dm_pci_map_bar() Andrew Scull
2022-04-13 15:10   ` Bin Meng
2022-04-14  7:46     ` Andrew Scull
2022-03-29 16:58 ` [PATCH v2 17/18] virtio: pci: Check virtio configs are mapped Andrew Scull
2022-04-13 15:12   ` Bin Meng
2022-03-29 16:59 ` [PATCH v2 18/18] virtio: pci: Make use of dm_pci_map_bar() Andrew Scull
2022-04-13 15:14   ` Bin Meng
2022-08-25  8:01     ` Felix Yan
2022-08-28 16:49       ` Xiang W
2022-08-28 17:21         ` Felix Yan
2022-04-13 15:17 ` [PATCH v2 00/18] virtio: pci: Add and fix consistency checks Bin Meng

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=20220329165900.1139885-15-ascull@google.com \
    --to=ascull@google.com \
    --cc=adelva@google.com \
    --cc=bmeng.cn@gmail.com \
    --cc=keirf@google.com \
    --cc=ptosi@google.com \
    --cc=sjg@chromium.org \
    --cc=u-boot@lists.denx.de \
    /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 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.