* [PATCH v3 1/4] i2c: designware: Add quirk for Intel Xe
2025-06-12 13:24 [PATCH v3 0/4] drm/xe: i2c support Heikki Krogerus
@ 2025-06-12 13:24 ` Heikki Krogerus
2025-06-12 13:24 ` [PATCH v3 2/4] drm/xe: Support for I2C attached MCUs Heikki Krogerus
` (6 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Heikki Krogerus @ 2025-06-12 13:24 UTC (permalink / raw)
To: Lucas De Marchi, Thomas Hellström, Rodrigo Vivi,
Jarkko Nikula
Cc: David Airlie, Simona Vetter, Andy Shevchenko, Mika Westerberg,
Jan Dabros, Andi Shyti, Raag Jadav, Tauro, Riana,
Adatrao, Srinivasa, Michael J. Ruhl, intel-xe, linux-i2c,
linux-kernel
The regmap is coming from the parent also in case of Xe
GPUs. Reusing the Wangxun quirk for that.
Originally-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
---
drivers/i2c/busses/i2c-designware-platdrv.c | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
index 879719e91df2..a35e4c64a1d4 100644
--- a/drivers/i2c/busses/i2c-designware-platdrv.c
+++ b/drivers/i2c/busses/i2c-designware-platdrv.c
@@ -101,7 +101,7 @@ static int bt1_i2c_request_regs(struct dw_i2c_dev *dev)
}
#endif
-static int txgbe_i2c_request_regs(struct dw_i2c_dev *dev)
+static int dw_i2c_get_parent_regmap(struct dw_i2c_dev *dev)
{
dev->map = dev_get_regmap(dev->dev->parent, NULL);
if (!dev->map)
@@ -123,12 +123,15 @@ static int dw_i2c_plat_request_regs(struct dw_i2c_dev *dev)
struct platform_device *pdev = to_platform_device(dev->dev);
int ret;
+ if (device_is_compatible(dev->dev, "intel,xe-i2c"))
+ return dw_i2c_get_parent_regmap(dev);
+
switch (dev->flags & MODEL_MASK) {
case MODEL_BAIKAL_BT1:
ret = bt1_i2c_request_regs(dev);
break;
case MODEL_WANGXUN_SP:
- ret = txgbe_i2c_request_regs(dev);
+ ret = dw_i2c_get_parent_regmap(dev);
break;
default:
dev->base = devm_platform_ioremap_resource(pdev, 0);
@@ -205,25 +208,28 @@ static void i2c_dw_remove_lock_support(struct dw_i2c_dev *dev)
static int dw_i2c_plat_probe(struct platform_device *pdev)
{
+ u32 flags = (uintptr_t)device_get_match_data(&pdev->dev);
struct device *device = &pdev->dev;
struct i2c_adapter *adap;
struct dw_i2c_dev *dev;
int irq, ret;
- irq = platform_get_irq(pdev, 0);
- if (irq < 0)
+ irq = platform_get_irq_optional(pdev, 0);
+ if (irq == -ENXIO)
+ flags |= ACCESS_POLLING;
+ else if (irq < 0)
return irq;
dev = devm_kzalloc(device, sizeof(*dev), GFP_KERNEL);
if (!dev)
return -ENOMEM;
- dev->flags = (uintptr_t)device_get_match_data(device);
if (device_property_present(device, "wx,i2c-snps-model"))
- dev->flags = MODEL_WANGXUN_SP | ACCESS_POLLING;
+ flags = MODEL_WANGXUN_SP | ACCESS_POLLING;
dev->dev = device;
dev->irq = irq;
+ dev->flags = flags;
platform_set_drvdata(pdev, dev);
ret = dw_i2c_plat_request_regs(dev);
--
2.47.2
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v3 2/4] drm/xe: Support for I2C attached MCUs
2025-06-12 13:24 [PATCH v3 0/4] drm/xe: i2c support Heikki Krogerus
2025-06-12 13:24 ` [PATCH v3 1/4] i2c: designware: Add quirk for Intel Xe Heikki Krogerus
@ 2025-06-12 13:24 ` Heikki Krogerus
2025-06-16 20:30 ` Rodrigo Vivi
2025-06-12 13:24 ` [PATCH v3 3/4] drm/xe/pm: Wire up suspend/resume for I2C controller Heikki Krogerus
` (5 subsequent siblings)
7 siblings, 1 reply; 13+ messages in thread
From: Heikki Krogerus @ 2025-06-12 13:24 UTC (permalink / raw)
To: Lucas De Marchi, Thomas Hellström, Rodrigo Vivi,
Jarkko Nikula
Cc: David Airlie, Simona Vetter, Andy Shevchenko, Mika Westerberg,
Jan Dabros, Andi Shyti, Raag Jadav, Tauro, Riana,
Adatrao, Srinivasa, Michael J. Ruhl, intel-xe, linux-i2c,
linux-kernel
Adding adaption/glue layer where the I2C host adapter
(Synopsys DesignWare I2C adapter) and the I2C clients (the
microcontroller units) are enumerated.
The microcontroller units (MCU) that are attached to the GPU
depend on the OEM. The initially supported MCU will be the
Add-In Management Controller (AMC).
Originally-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
---
drivers/gpu/drm/xe/Kconfig | 1 +
drivers/gpu/drm/xe/Makefile | 1 +
drivers/gpu/drm/xe/regs/xe_i2c_regs.h | 15 ++
drivers/gpu/drm/xe/regs/xe_irq_regs.h | 1 +
drivers/gpu/drm/xe/regs/xe_pmt.h | 2 +-
drivers/gpu/drm/xe/regs/xe_regs.h | 2 +
drivers/gpu/drm/xe/xe_device.c | 5 +
drivers/gpu/drm/xe/xe_device_types.h | 4 +
drivers/gpu/drm/xe/xe_i2c.c | 270 ++++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_i2c.h | 58 ++++++
drivers/gpu/drm/xe/xe_irq.c | 2 +
11 files changed, 360 insertions(+), 1 deletion(-)
create mode 100644 drivers/gpu/drm/xe/regs/xe_i2c_regs.h
create mode 100644 drivers/gpu/drm/xe/xe_i2c.c
create mode 100644 drivers/gpu/drm/xe/xe_i2c.h
diff --git a/drivers/gpu/drm/xe/Kconfig b/drivers/gpu/drm/xe/Kconfig
index c57f1da0791d..5c162031fc3f 100644
--- a/drivers/gpu/drm/xe/Kconfig
+++ b/drivers/gpu/drm/xe/Kconfig
@@ -44,6 +44,7 @@ config DRM_XE
select WANT_DEV_COREDUMP
select AUXILIARY_BUS
select HMM_MIRROR
+ select REGMAP if I2C
help
Experimental driver for Intel Xe series GPUs
diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
index f5f5775acdc0..293552fc5aaf 100644
--- a/drivers/gpu/drm/xe/Makefile
+++ b/drivers/gpu/drm/xe/Makefile
@@ -124,6 +124,7 @@ xe-y += xe_bb.o \
xe_wait_user_fence.o \
xe_wopcm.o
+xe-$(CONFIG_I2C) += xe_i2c.o
xe-$(CONFIG_HMM_MIRROR) += xe_hmm.o
xe-$(CONFIG_DRM_XE_GPUSVM) += xe_svm.o
diff --git a/drivers/gpu/drm/xe/regs/xe_i2c_regs.h b/drivers/gpu/drm/xe/regs/xe_i2c_regs.h
new file mode 100644
index 000000000000..fa7223e6ce9e
--- /dev/null
+++ b/drivers/gpu/drm/xe/regs/xe_i2c_regs.h
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _XE_I2C_REGS_H_
+#define _XE_I2C_REGS_H_
+
+#include "xe_reg_defs.h"
+#include "xe_regs.h"
+
+#define I2C_CONFIG_SPACE_OFFSET (SOC_BASE + 0xf6000)
+#define I2C_MEM_SPACE_OFFSET (SOC_BASE + 0xf7400)
+#define I2C_BRIDGE_OFFSET (SOC_BASE + 0xd9000)
+
+#define CLIENT_DISC_COOKIE XE_REG(SOC_BASE + 0x0164)
+#define CLIENT_DISC_ADDRESS XE_REG(SOC_BASE + 0x0168)
+
+#endif /* _XE_I2C_REGS_H_ */
diff --git a/drivers/gpu/drm/xe/regs/xe_irq_regs.h b/drivers/gpu/drm/xe/regs/xe_irq_regs.h
index f0ecfcac4003..13635e4331d4 100644
--- a/drivers/gpu/drm/xe/regs/xe_irq_regs.h
+++ b/drivers/gpu/drm/xe/regs/xe_irq_regs.h
@@ -19,6 +19,7 @@
#define MASTER_IRQ REG_BIT(31)
#define GU_MISC_IRQ REG_BIT(29)
#define DISPLAY_IRQ REG_BIT(16)
+#define I2C_IRQ REG_BIT(12)
#define GT_DW_IRQ(x) REG_BIT(x)
/*
diff --git a/drivers/gpu/drm/xe/regs/xe_pmt.h b/drivers/gpu/drm/xe/regs/xe_pmt.h
index b0efd9b48d1e..2995d72c3f78 100644
--- a/drivers/gpu/drm/xe/regs/xe_pmt.h
+++ b/drivers/gpu/drm/xe/regs/xe_pmt.h
@@ -5,7 +5,7 @@
#ifndef _XE_PMT_H_
#define _XE_PMT_H_
-#define SOC_BASE 0x280000
+#include "xe_regs.h"
#define BMG_PMT_BASE_OFFSET 0xDB000
#define BMG_DISCOVERY_OFFSET (SOC_BASE + BMG_PMT_BASE_OFFSET)
diff --git a/drivers/gpu/drm/xe/regs/xe_regs.h b/drivers/gpu/drm/xe/regs/xe_regs.h
index 3abb17d2ca33..1926b4044314 100644
--- a/drivers/gpu/drm/xe/regs/xe_regs.h
+++ b/drivers/gpu/drm/xe/regs/xe_regs.h
@@ -7,6 +7,8 @@
#include "regs/xe_reg_defs.h"
+#define SOC_BASE 0x280000
+
#define GU_CNTL_PROTECTED XE_REG(0x10100C)
#define DRIVERINT_FLR_DIS REG_BIT(31)
diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index 7e87344943cd..ca098ed532b5 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -42,6 +42,7 @@
#include "xe_guc.h"
#include "xe_hw_engine_group.h"
#include "xe_hwmon.h"
+#include "xe_i2c.h"
#include "xe_irq.h"
#include "xe_memirq.h"
#include "xe_mmio.h"
@@ -921,6 +922,10 @@ int xe_device_probe(struct xe_device *xe)
if (err)
goto err_unregister_display;
+ err = xe_i2c_probe(xe);
+ if (err)
+ goto err_unregister_display;
+
for_each_gt(gt, xe, id)
xe_gt_sanitize_freq(gt);
diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
index ac27389ccb8b..8f3c5ea58034 100644
--- a/drivers/gpu/drm/xe/xe_device_types.h
+++ b/drivers/gpu/drm/xe/xe_device_types.h
@@ -33,6 +33,7 @@
struct dram_info;
struct intel_display;
struct xe_ggtt;
+struct xe_i2c;
struct xe_pat_ops;
struct xe_pxp;
@@ -573,6 +574,9 @@ struct xe_device {
/** @pmu: performance monitoring unit */
struct xe_pmu pmu;
+ /** @i2c: I2C host controller */
+ struct xe_i2c *i2c;
+
/** @atomic_svm_timeslice_ms: Atomic SVM fault timeslice MS */
u32 atomic_svm_timeslice_ms;
diff --git a/drivers/gpu/drm/xe/xe_i2c.c b/drivers/gpu/drm/xe/xe_i2c.c
new file mode 100644
index 000000000000..3d649602ede8
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_i2c.c
@@ -0,0 +1,270 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Intel Xe I2C attached Microcontroller Units (MCU)
+ *
+ * Copyright (C) 2025 Intel Corporation.
+ */
+
+#include <linux/array_size.h>
+#include <linux/container_of.h>
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/i2c.h>
+#include <linux/ioport.h>
+#include <linux/irq.h>
+#include <linux/irqdomain.h>
+#include <linux/notifier.h>
+#include <linux/pci.h>
+#include <linux/platform_device.h>
+#include <linux/property.h>
+#include <linux/regmap.h>
+#include <linux/sprintf.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/workqueue.h>
+
+#include "regs/xe_i2c_regs.h"
+#include "regs/xe_irq_regs.h"
+
+#include "xe_device.h"
+#include "xe_device_types.h"
+#include "xe_i2c.h"
+#include "xe_mmio.h"
+#include "xe_platform_types.h"
+
+/* Synopsys DesignWare I2C Host Adapter */
+static const char adapter_name[] = "i2c_designware";
+
+static const struct property_entry xe_i2c_adapter_properties[] = {
+ PROPERTY_ENTRY_STRING("compatible", "intel,xe-i2c"),
+ PROPERTY_ENTRY_U32("clock-frequency", I2C_MAX_FAST_MODE_PLUS_FREQ),
+ { }
+};
+
+static inline void xe_i2c_read_endpoint(struct xe_mmio *mmio, void *ep)
+{
+ u32 *val = ep;
+
+ val[0] = xe_mmio_read32(mmio, CLIENT_DISC_COOKIE);
+ val[1] = xe_mmio_read32(mmio, CLIENT_DISC_ADDRESS);
+}
+
+static void xe_i2c_client_work(struct work_struct *work)
+{
+ struct xe_i2c *i2c = container_of(work, struct xe_i2c, work);
+ struct i2c_board_info info = {
+ .type = "amc",
+ .flags = I2C_CLIENT_HOST_NOTIFY,
+ .addr = i2c->ep.addr[1],
+ };
+
+ i2c->client[0] = i2c_new_client_device(i2c->adapter, &info);
+}
+
+static int xe_i2c_notifier(struct notifier_block *nb, unsigned long action, void *data)
+{
+ struct xe_i2c *i2c = container_of(nb, struct xe_i2c, bus_notifier);
+ struct i2c_adapter *adapter = i2c_verify_adapter(data);
+ struct device *dev = data;
+
+ if (action == BUS_NOTIFY_ADD_DEVICE &&
+ adapter && dev->parent == &i2c->pdev->dev) {
+ i2c->adapter = adapter;
+ schedule_work(&i2c->work);
+ return NOTIFY_OK;
+ }
+
+ return NOTIFY_DONE;
+}
+
+static int xe_i2c_register_adapter(struct xe_i2c *i2c)
+{
+ struct pci_dev *pci = to_pci_dev(i2c->drm_dev);
+ struct platform_device *pdev;
+ struct fwnode_handle *fwnode;
+ int ret;
+
+ fwnode = fwnode_create_software_node(xe_i2c_adapter_properties, NULL);
+ if (!fwnode)
+ return -ENOMEM;
+
+ /*
+ * Not using platform_device_register_full() here because we don't have
+ * a handle to the platform_device before it returns. xe_i2c_notifier()
+ * uses that handle, but it may be called before
+ * platform_device_register_full() is done.
+ */
+ pdev = platform_device_alloc(adapter_name, pci_dev_id(pci));
+ if (!pdev) {
+ ret = -ENOMEM;
+ goto err_fwnode_remove;
+ }
+
+ if (i2c->adapter_irq) {
+ struct resource res = { };
+
+ res.start = i2c->adapter_irq;
+ res.name = "xe_i2c";
+ res.flags = IORESOURCE_IRQ;
+
+ ret = platform_device_add_resources(pdev, &res, 1);
+ if (ret)
+ goto err_pdev_put;
+ }
+
+ pdev->dev.parent = i2c->drm_dev;
+ pdev->dev.fwnode = fwnode;
+ i2c->adapter_node = fwnode;
+ i2c->pdev = pdev;
+
+ ret = platform_device_add(pdev);
+ if (ret)
+ goto err_pdev_put;
+
+ return 0;
+
+err_pdev_put:
+ platform_device_put(pdev);
+err_fwnode_remove:
+ fwnode_remove_software_node(fwnode);
+
+ return ret;
+}
+
+static void xe_i2c_unregister_adapter(struct xe_i2c *i2c)
+{
+ platform_device_unregister(i2c->pdev);
+ fwnode_remove_software_node(i2c->adapter_node);
+}
+
+void xe_i2c_irq_handler(struct xe_device *xe, u32 master_ctl)
+{
+ if (!xe->i2c || !xe->i2c->adapter_irq)
+ return;
+
+ if (master_ctl & I2C_IRQ)
+ generic_handle_irq_safe(xe->i2c->adapter_irq);
+}
+
+static int xe_i2c_irq_map(struct irq_domain *h, unsigned int virq,
+ irq_hw_number_t hw_irq_num)
+{
+ irq_set_chip_and_handler(virq, &dummy_irq_chip, handle_simple_irq);
+ return 0;
+}
+
+static const struct irq_domain_ops xe_i2c_irq_ops = {
+ .map = xe_i2c_irq_map,
+};
+
+static int xe_i2c_create_irq(struct xe_i2c *i2c)
+{
+ struct irq_domain *domain;
+
+ if (!(i2c->ep.capabilities & XE_I2C_EP_CAP_IRQ))
+ return 0;
+
+ domain = irq_domain_create_linear(dev_fwnode(i2c->drm_dev), 1, &xe_i2c_irq_ops, NULL);
+ if (!domain)
+ return -ENOMEM;
+
+ i2c->adapter_irq = irq_create_mapping(domain, 0);
+ i2c->irqdomain = domain;
+
+ return 0;
+}
+
+static void xe_i2c_remove_irq(struct xe_i2c *i2c)
+{
+ if (i2c->irqdomain) {
+ irq_dispose_mapping(i2c->adapter_irq);
+ irq_domain_remove(i2c->irqdomain);
+ }
+}
+
+static int xe_i2c_read(void *context, unsigned int reg, unsigned int *val)
+{
+ struct xe_i2c *i2c = context;
+
+ *val = xe_mmio_read32(i2c->mmio, XE_REG(reg + I2C_MEM_SPACE_OFFSET));
+
+ return 0;
+}
+
+static int xe_i2c_write(void *context, unsigned int reg, unsigned int val)
+{
+ struct xe_i2c *i2c = context;
+
+ xe_mmio_write32(i2c->mmio, XE_REG(reg + I2C_MEM_SPACE_OFFSET), val);
+
+ return 0;
+}
+
+static const struct regmap_config i2c_regmap_config = {
+ .reg_bits = 32,
+ .val_bits = 32,
+ .reg_read = xe_i2c_read,
+ .reg_write = xe_i2c_write,
+ .fast_io = true,
+};
+
+static void xe_i2c_remove(void *data)
+{
+ struct xe_i2c *i2c = data;
+ int i;
+
+ for (i = 0; i < XE_I2C_MAX_CLIENTS; i++)
+ i2c_unregister_device(i2c->client[i]);
+
+ bus_unregister_notifier(&i2c_bus_type, &i2c->bus_notifier);
+ xe_i2c_unregister_adapter(i2c);
+ xe_i2c_remove_irq(i2c);
+}
+
+int xe_i2c_probe(struct xe_device *xe)
+{
+ struct xe_i2c_endpoint ep;
+ struct regmap *regmap;
+ struct xe_i2c *i2c;
+ int ret;
+
+ xe_i2c_read_endpoint(xe_root_tile_mmio(xe), &ep);
+ if (ep.cookie != XE_I2C_EP_COOKIE_DEVICE)
+ return 0;
+
+ i2c = devm_kzalloc(xe->drm.dev, sizeof(*i2c), GFP_KERNEL);
+ if (!i2c)
+ return -ENOMEM;
+
+ INIT_WORK(&i2c->work, xe_i2c_client_work);
+ i2c->mmio = xe_root_tile_mmio(xe);
+ i2c->drm_dev = xe->drm.dev;
+ i2c->ep = ep;
+
+ regmap = devm_regmap_init(i2c->drm_dev, NULL, i2c, &i2c_regmap_config);
+ if (IS_ERR(regmap))
+ return PTR_ERR(regmap);
+
+ i2c->bus_notifier.notifier_call = xe_i2c_notifier;
+ ret = bus_register_notifier(&i2c_bus_type, &i2c->bus_notifier);
+ if (ret)
+ return ret;
+
+ ret = xe_i2c_create_irq(i2c);
+ if (ret)
+ goto err_unregister_notifier;
+
+ ret = xe_i2c_register_adapter(i2c);
+ if (ret)
+ goto err_remove_irq;
+
+ return devm_add_action_or_reset(i2c->drm_dev, xe_i2c_remove, i2c);
+
+err_remove_irq:
+ xe_i2c_remove_irq(i2c);
+
+err_unregister_notifier:
+ bus_unregister_notifier(&i2c_bus_type, &i2c->bus_notifier);
+
+ return ret;
+}
diff --git a/drivers/gpu/drm/xe/xe_i2c.h b/drivers/gpu/drm/xe/xe_i2c.h
new file mode 100644
index 000000000000..e88845be61b4
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_i2c.h
@@ -0,0 +1,58 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _XE_I2C_H_
+#define _XE_I2C_H_
+
+#include <linux/bits.h>
+#include <linux/notifier.h>
+#include <linux/types.h>
+#include <linux/workqueue.h>
+
+struct device;
+struct fwnode_handle;
+struct i2c_adapter;
+struct i2c_client;
+struct irq_domain;
+struct platform_device;
+struct xe_device;
+struct xe_mmio;
+
+#define XE_I2C_MAX_CLIENTS 3
+
+#define XE_I2C_EP_COOKIE_DEVICE 0xde
+
+/* Endpoint Capabilities */
+#define XE_I2C_EP_CAP_IRQ BIT(0)
+
+struct xe_i2c_endpoint {
+ u8 cookie;
+ u8 capabilities;
+ u16 addr[XE_I2C_MAX_CLIENTS];
+};
+
+struct xe_i2c {
+ struct fwnode_handle *adapter_node;
+ struct platform_device *pdev;
+ struct i2c_adapter *adapter;
+ struct i2c_client *client[XE_I2C_MAX_CLIENTS];
+
+ struct notifier_block bus_notifier;
+ struct work_struct work;
+
+ struct irq_domain *irqdomain;
+ int adapter_irq;
+
+ struct xe_i2c_endpoint ep;
+ struct device *drm_dev;
+
+ struct xe_mmio *mmio;
+};
+
+#if IS_ENABLED(CONFIG_I2C)
+int xe_i2c_probe(struct xe_device *xe);
+void xe_i2c_irq_handler(struct xe_device *xe, u32 master_ctl);
+#else
+static inline int xe_i2c_probe(struct xe_device *xe) { return 0; }
+static inline void xe_i2c_irq_handler(struct xe_device *xe, u32 master_ctl) { }
+#endif
+
+#endif
diff --git a/drivers/gpu/drm/xe/xe_irq.c b/drivers/gpu/drm/xe/xe_irq.c
index 5362d3174b06..c43e62dc692e 100644
--- a/drivers/gpu/drm/xe/xe_irq.c
+++ b/drivers/gpu/drm/xe/xe_irq.c
@@ -18,6 +18,7 @@
#include "xe_gt.h"
#include "xe_guc.h"
#include "xe_hw_engine.h"
+#include "xe_i2c.h"
#include "xe_memirq.h"
#include "xe_mmio.h"
#include "xe_pxp.h"
@@ -476,6 +477,7 @@ static irqreturn_t dg1_irq_handler(int irq, void *arg)
if (xe->info.has_heci_cscfi)
xe_heci_csc_irq_handler(xe, master_ctl);
xe_display_irq_handler(xe, master_ctl);
+ xe_i2c_irq_handler(xe, master_ctl);
gu_misc_iir = gu_misc_irq_ack(xe, master_ctl);
}
}
--
2.47.2
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH v3 2/4] drm/xe: Support for I2C attached MCUs
2025-06-12 13:24 ` [PATCH v3 2/4] drm/xe: Support for I2C attached MCUs Heikki Krogerus
@ 2025-06-16 20:30 ` Rodrigo Vivi
2025-06-17 11:27 ` Heikki Krogerus
0 siblings, 1 reply; 13+ messages in thread
From: Rodrigo Vivi @ 2025-06-16 20:30 UTC (permalink / raw)
To: Heikki Krogerus
Cc: Lucas De Marchi, Thomas Hellström, Jarkko Nikula,
David Airlie, Simona Vetter, Andy Shevchenko, Mika Westerberg,
Jan Dabros, Andi Shyti, Raag Jadav, Tauro, Riana,
Adatrao, Srinivasa, Michael J. Ruhl, intel-xe, linux-i2c,
linux-kernel
On Thu, Jun 12, 2025 at 04:24:48PM +0300, Heikki Krogerus wrote:
> Adding adaption/glue layer where the I2C host adapter
> (Synopsys DesignWare I2C adapter) and the I2C clients (the
> microcontroller units) are enumerated.
>
> The microcontroller units (MCU) that are attached to the GPU
> depend on the OEM. The initially supported MCU will be the
> Add-In Management Controller (AMC).
>
> Originally-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
> Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> ---
> drivers/gpu/drm/xe/Kconfig | 1 +
> drivers/gpu/drm/xe/Makefile | 1 +
> drivers/gpu/drm/xe/regs/xe_i2c_regs.h | 15 ++
> drivers/gpu/drm/xe/regs/xe_irq_regs.h | 1 +
> drivers/gpu/drm/xe/regs/xe_pmt.h | 2 +-
> drivers/gpu/drm/xe/regs/xe_regs.h | 2 +
> drivers/gpu/drm/xe/xe_device.c | 5 +
> drivers/gpu/drm/xe/xe_device_types.h | 4 +
> drivers/gpu/drm/xe/xe_i2c.c | 270 ++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_i2c.h | 58 ++++++
> drivers/gpu/drm/xe/xe_irq.c | 2 +
> 11 files changed, 360 insertions(+), 1 deletion(-)
> create mode 100644 drivers/gpu/drm/xe/regs/xe_i2c_regs.h
> create mode 100644 drivers/gpu/drm/xe/xe_i2c.c
> create mode 100644 drivers/gpu/drm/xe/xe_i2c.h
>
> diff --git a/drivers/gpu/drm/xe/Kconfig b/drivers/gpu/drm/xe/Kconfig
> index c57f1da0791d..5c162031fc3f 100644
> --- a/drivers/gpu/drm/xe/Kconfig
> +++ b/drivers/gpu/drm/xe/Kconfig
> @@ -44,6 +44,7 @@ config DRM_XE
> select WANT_DEV_COREDUMP
> select AUXILIARY_BUS
> select HMM_MIRROR
> + select REGMAP if I2C
> help
> Experimental driver for Intel Xe series GPUs
>
> diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
> index f5f5775acdc0..293552fc5aaf 100644
> --- a/drivers/gpu/drm/xe/Makefile
> +++ b/drivers/gpu/drm/xe/Makefile
> @@ -124,6 +124,7 @@ xe-y += xe_bb.o \
> xe_wait_user_fence.o \
> xe_wopcm.o
>
> +xe-$(CONFIG_I2C) += xe_i2c.o
> xe-$(CONFIG_HMM_MIRROR) += xe_hmm.o
> xe-$(CONFIG_DRM_XE_GPUSVM) += xe_svm.o
>
> diff --git a/drivers/gpu/drm/xe/regs/xe_i2c_regs.h b/drivers/gpu/drm/xe/regs/xe_i2c_regs.h
> new file mode 100644
> index 000000000000..fa7223e6ce9e
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/regs/xe_i2c_regs.h
> @@ -0,0 +1,15 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef _XE_I2C_REGS_H_
> +#define _XE_I2C_REGS_H_
> +
> +#include "xe_reg_defs.h"
> +#include "xe_regs.h"
> +
> +#define I2C_CONFIG_SPACE_OFFSET (SOC_BASE + 0xf6000)
> +#define I2C_MEM_SPACE_OFFSET (SOC_BASE + 0xf7400)
> +#define I2C_BRIDGE_OFFSET (SOC_BASE + 0xd9000)
> +
> +#define CLIENT_DISC_COOKIE XE_REG(SOC_BASE + 0x0164)
> +#define CLIENT_DISC_ADDRESS XE_REG(SOC_BASE + 0x0168)
Could you please send me some pointers of the spec for this registers
so I can help on the review here?
> +
> +#endif /* _XE_I2C_REGS_H_ */
> diff --git a/drivers/gpu/drm/xe/regs/xe_irq_regs.h b/drivers/gpu/drm/xe/regs/xe_irq_regs.h
> index f0ecfcac4003..13635e4331d4 100644
> --- a/drivers/gpu/drm/xe/regs/xe_irq_regs.h
> +++ b/drivers/gpu/drm/xe/regs/xe_irq_regs.h
> @@ -19,6 +19,7 @@
> #define MASTER_IRQ REG_BIT(31)
> #define GU_MISC_IRQ REG_BIT(29)
> #define DISPLAY_IRQ REG_BIT(16)
> +#define I2C_IRQ REG_BIT(12)
> #define GT_DW_IRQ(x) REG_BIT(x)
>
> /*
> diff --git a/drivers/gpu/drm/xe/regs/xe_pmt.h b/drivers/gpu/drm/xe/regs/xe_pmt.h
> index b0efd9b48d1e..2995d72c3f78 100644
> --- a/drivers/gpu/drm/xe/regs/xe_pmt.h
> +++ b/drivers/gpu/drm/xe/regs/xe_pmt.h
> @@ -5,7 +5,7 @@
> #ifndef _XE_PMT_H_
> #define _XE_PMT_H_
>
> -#define SOC_BASE 0x280000
> +#include "xe_regs.h"
>
> #define BMG_PMT_BASE_OFFSET 0xDB000
> #define BMG_DISCOVERY_OFFSET (SOC_BASE + BMG_PMT_BASE_OFFSET)
> diff --git a/drivers/gpu/drm/xe/regs/xe_regs.h b/drivers/gpu/drm/xe/regs/xe_regs.h
> index 3abb17d2ca33..1926b4044314 100644
> --- a/drivers/gpu/drm/xe/regs/xe_regs.h
> +++ b/drivers/gpu/drm/xe/regs/xe_regs.h
> @@ -7,6 +7,8 @@
>
> #include "regs/xe_reg_defs.h"
>
> +#define SOC_BASE 0x280000
> +
> #define GU_CNTL_PROTECTED XE_REG(0x10100C)
> #define DRIVERINT_FLR_DIS REG_BIT(31)
>
> diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> index 7e87344943cd..ca098ed532b5 100644
> --- a/drivers/gpu/drm/xe/xe_device.c
> +++ b/drivers/gpu/drm/xe/xe_device.c
> @@ -42,6 +42,7 @@
> #include "xe_guc.h"
> #include "xe_hw_engine_group.h"
> #include "xe_hwmon.h"
> +#include "xe_i2c.h"
> #include "xe_irq.h"
> #include "xe_memirq.h"
> #include "xe_mmio.h"
> @@ -921,6 +922,10 @@ int xe_device_probe(struct xe_device *xe)
> if (err)
> goto err_unregister_display;
>
> + err = xe_i2c_probe(xe);
> + if (err)
> + goto err_unregister_display;
> +
> for_each_gt(gt, xe, id)
> xe_gt_sanitize_freq(gt);
>
> diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
> index ac27389ccb8b..8f3c5ea58034 100644
> --- a/drivers/gpu/drm/xe/xe_device_types.h
> +++ b/drivers/gpu/drm/xe/xe_device_types.h
> @@ -33,6 +33,7 @@
> struct dram_info;
> struct intel_display;
> struct xe_ggtt;
> +struct xe_i2c;
> struct xe_pat_ops;
> struct xe_pxp;
>
> @@ -573,6 +574,9 @@ struct xe_device {
> /** @pmu: performance monitoring unit */
> struct xe_pmu pmu;
>
> + /** @i2c: I2C host controller */
> + struct xe_i2c *i2c;
> +
> /** @atomic_svm_timeslice_ms: Atomic SVM fault timeslice MS */
> u32 atomic_svm_timeslice_ms;
>
> diff --git a/drivers/gpu/drm/xe/xe_i2c.c b/drivers/gpu/drm/xe/xe_i2c.c
> new file mode 100644
> index 000000000000..3d649602ede8
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/xe_i2c.c
> @@ -0,0 +1,270 @@
> +// SPDX-License-Identifier: GPL-2.0
Does it really need to be GPL or could it be MIT?
(If you copied code from other files that are GPL, then it needs
to be GPL)
> +/*
> + * Intel Xe I2C attached Microcontroller Units (MCU)
> + *
> + * Copyright (C) 2025 Intel Corporation.
> + */
> +
> +#include <linux/array_size.h>
> +#include <linux/container_of.h>
> +#include <linux/device.h>
> +#include <linux/err.h>
> +#include <linux/i2c.h>
> +#include <linux/ioport.h>
> +#include <linux/irq.h>
> +#include <linux/irqdomain.h>
> +#include <linux/notifier.h>
> +#include <linux/pci.h>
> +#include <linux/platform_device.h>
> +#include <linux/property.h>
> +#include <linux/regmap.h>
> +#include <linux/sprintf.h>
> +#include <linux/string.h>
> +#include <linux/types.h>
> +#include <linux/workqueue.h>
> +
> +#include "regs/xe_i2c_regs.h"
> +#include "regs/xe_irq_regs.h"
> +
> +#include "xe_device.h"
> +#include "xe_device_types.h"
> +#include "xe_i2c.h"
> +#include "xe_mmio.h"
> +#include "xe_platform_types.h"
> +
> +/* Synopsys DesignWare I2C Host Adapter */
> +static const char adapter_name[] = "i2c_designware";
> +
> +static const struct property_entry xe_i2c_adapter_properties[] = {
> + PROPERTY_ENTRY_STRING("compatible", "intel,xe-i2c"),
> + PROPERTY_ENTRY_U32("clock-frequency", I2C_MAX_FAST_MODE_PLUS_FREQ),
> + { }
> +};
> +
> +static inline void xe_i2c_read_endpoint(struct xe_mmio *mmio, void *ep)
> +{
> + u32 *val = ep;
> +
> + val[0] = xe_mmio_read32(mmio, CLIENT_DISC_COOKIE);
> + val[1] = xe_mmio_read32(mmio, CLIENT_DISC_ADDRESS);
> +}
> +
> +static void xe_i2c_client_work(struct work_struct *work)
> +{
> + struct xe_i2c *i2c = container_of(work, struct xe_i2c, work);
> + struct i2c_board_info info = {
> + .type = "amc",
> + .flags = I2C_CLIENT_HOST_NOTIFY,
> + .addr = i2c->ep.addr[1],
> + };
> +
> + i2c->client[0] = i2c_new_client_device(i2c->adapter, &info);
> +}
> +
> +static int xe_i2c_notifier(struct notifier_block *nb, unsigned long action, void *data)
> +{
> + struct xe_i2c *i2c = container_of(nb, struct xe_i2c, bus_notifier);
> + struct i2c_adapter *adapter = i2c_verify_adapter(data);
> + struct device *dev = data;
> +
> + if (action == BUS_NOTIFY_ADD_DEVICE &&
> + adapter && dev->parent == &i2c->pdev->dev) {
> + i2c->adapter = adapter;
> + schedule_work(&i2c->work);
> + return NOTIFY_OK;
> + }
> +
> + return NOTIFY_DONE;
> +}
> +
> +static int xe_i2c_register_adapter(struct xe_i2c *i2c)
> +{
> + struct pci_dev *pci = to_pci_dev(i2c->drm_dev);
> + struct platform_device *pdev;
> + struct fwnode_handle *fwnode;
> + int ret;
> +
> + fwnode = fwnode_create_software_node(xe_i2c_adapter_properties, NULL);
> + if (!fwnode)
> + return -ENOMEM;
> +
> + /*
> + * Not using platform_device_register_full() here because we don't have
> + * a handle to the platform_device before it returns. xe_i2c_notifier()
> + * uses that handle, but it may be called before
> + * platform_device_register_full() is done.
> + */
> + pdev = platform_device_alloc(adapter_name, pci_dev_id(pci));
> + if (!pdev) {
> + ret = -ENOMEM;
> + goto err_fwnode_remove;
> + }
> +
> + if (i2c->adapter_irq) {
> + struct resource res = { };
> +
> + res.start = i2c->adapter_irq;
> + res.name = "xe_i2c";
> + res.flags = IORESOURCE_IRQ;
> +
> + ret = platform_device_add_resources(pdev, &res, 1);
> + if (ret)
> + goto err_pdev_put;
> + }
> +
> + pdev->dev.parent = i2c->drm_dev;
> + pdev->dev.fwnode = fwnode;
> + i2c->adapter_node = fwnode;
> + i2c->pdev = pdev;
> +
> + ret = platform_device_add(pdev);
> + if (ret)
> + goto err_pdev_put;
> +
> + return 0;
> +
> +err_pdev_put:
> + platform_device_put(pdev);
> +err_fwnode_remove:
> + fwnode_remove_software_node(fwnode);
> +
> + return ret;
> +}
> +
> +static void xe_i2c_unregister_adapter(struct xe_i2c *i2c)
> +{
> + platform_device_unregister(i2c->pdev);
> + fwnode_remove_software_node(i2c->adapter_node);
> +}
> +
> +void xe_i2c_irq_handler(struct xe_device *xe, u32 master_ctl)
> +{
> + if (!xe->i2c || !xe->i2c->adapter_irq)
> + return;
> +
> + if (master_ctl & I2C_IRQ)
> + generic_handle_irq_safe(xe->i2c->adapter_irq);
> +}
> +
> +static int xe_i2c_irq_map(struct irq_domain *h, unsigned int virq,
> + irq_hw_number_t hw_irq_num)
> +{
> + irq_set_chip_and_handler(virq, &dummy_irq_chip, handle_simple_irq);
> + return 0;
> +}
> +
> +static const struct irq_domain_ops xe_i2c_irq_ops = {
> + .map = xe_i2c_irq_map,
> +};
> +
> +static int xe_i2c_create_irq(struct xe_i2c *i2c)
> +{
> + struct irq_domain *domain;
> +
> + if (!(i2c->ep.capabilities & XE_I2C_EP_CAP_IRQ))
> + return 0;
> +
> + domain = irq_domain_create_linear(dev_fwnode(i2c->drm_dev), 1, &xe_i2c_irq_ops, NULL);
> + if (!domain)
> + return -ENOMEM;
> +
> + i2c->adapter_irq = irq_create_mapping(domain, 0);
> + i2c->irqdomain = domain;
> +
> + return 0;
> +}
> +
> +static void xe_i2c_remove_irq(struct xe_i2c *i2c)
> +{
> + if (i2c->irqdomain) {
> + irq_dispose_mapping(i2c->adapter_irq);
> + irq_domain_remove(i2c->irqdomain);
> + }
> +}
> +
> +static int xe_i2c_read(void *context, unsigned int reg, unsigned int *val)
> +{
> + struct xe_i2c *i2c = context;
> +
> + *val = xe_mmio_read32(i2c->mmio, XE_REG(reg + I2C_MEM_SPACE_OFFSET));
> +
> + return 0;
> +}
> +
> +static int xe_i2c_write(void *context, unsigned int reg, unsigned int val)
> +{
> + struct xe_i2c *i2c = context;
> +
> + xe_mmio_write32(i2c->mmio, XE_REG(reg + I2C_MEM_SPACE_OFFSET), val);
> +
> + return 0;
> +}
> +
> +static const struct regmap_config i2c_regmap_config = {
> + .reg_bits = 32,
> + .val_bits = 32,
> + .reg_read = xe_i2c_read,
> + .reg_write = xe_i2c_write,
> + .fast_io = true,
> +};
> +
> +static void xe_i2c_remove(void *data)
> +{
> + struct xe_i2c *i2c = data;
> + int i;
> +
> + for (i = 0; i < XE_I2C_MAX_CLIENTS; i++)
> + i2c_unregister_device(i2c->client[i]);
> +
> + bus_unregister_notifier(&i2c_bus_type, &i2c->bus_notifier);
> + xe_i2c_unregister_adapter(i2c);
> + xe_i2c_remove_irq(i2c);
> +}
> +
> +int xe_i2c_probe(struct xe_device *xe)
could you please add some /** DOC: Xe i2c ... above
and then add some doc to the exported functions?
> +{
> + struct xe_i2c_endpoint ep;
> + struct regmap *regmap;
> + struct xe_i2c *i2c;
> + int ret;
> +
> + xe_i2c_read_endpoint(xe_root_tile_mmio(xe), &ep);
> + if (ep.cookie != XE_I2C_EP_COOKIE_DEVICE)
> + return 0;
> +
> + i2c = devm_kzalloc(xe->drm.dev, sizeof(*i2c), GFP_KERNEL);
> + if (!i2c)
> + return -ENOMEM;
> +
> + INIT_WORK(&i2c->work, xe_i2c_client_work);
> + i2c->mmio = xe_root_tile_mmio(xe);
> + i2c->drm_dev = xe->drm.dev;
> + i2c->ep = ep;
> +
> + regmap = devm_regmap_init(i2c->drm_dev, NULL, i2c, &i2c_regmap_config);
> + if (IS_ERR(regmap))
> + return PTR_ERR(regmap);
> +
> + i2c->bus_notifier.notifier_call = xe_i2c_notifier;
> + ret = bus_register_notifier(&i2c_bus_type, &i2c->bus_notifier);
> + if (ret)
> + return ret;
> +
> + ret = xe_i2c_create_irq(i2c);
> + if (ret)
> + goto err_unregister_notifier;
> +
> + ret = xe_i2c_register_adapter(i2c);
> + if (ret)
> + goto err_remove_irq;
> +
> + return devm_add_action_or_reset(i2c->drm_dev, xe_i2c_remove, i2c);
> +
> +err_remove_irq:
> + xe_i2c_remove_irq(i2c);
> +
> +err_unregister_notifier:
> + bus_unregister_notifier(&i2c_bus_type, &i2c->bus_notifier);
> +
> + return ret;
> +}
> diff --git a/drivers/gpu/drm/xe/xe_i2c.h b/drivers/gpu/drm/xe/xe_i2c.h
> new file mode 100644
> index 000000000000..e88845be61b4
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/xe_i2c.h
> @@ -0,0 +1,58 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
same question here...
> +#ifndef _XE_I2C_H_
> +#define _XE_I2C_H_
> +
> +#include <linux/bits.h>
> +#include <linux/notifier.h>
> +#include <linux/types.h>
> +#include <linux/workqueue.h>
> +
> +struct device;
> +struct fwnode_handle;
> +struct i2c_adapter;
> +struct i2c_client;
> +struct irq_domain;
> +struct platform_device;
> +struct xe_device;
> +struct xe_mmio;
> +
> +#define XE_I2C_MAX_CLIENTS 3
> +
> +#define XE_I2C_EP_COOKIE_DEVICE 0xde
> +
> +/* Endpoint Capabilities */
> +#define XE_I2C_EP_CAP_IRQ BIT(0)
> +
> +struct xe_i2c_endpoint {
> + u8 cookie;
> + u8 capabilities;
> + u16 addr[XE_I2C_MAX_CLIENTS];
> +};
> +
> +struct xe_i2c {
> + struct fwnode_handle *adapter_node;
> + struct platform_device *pdev;
> + struct i2c_adapter *adapter;
> + struct i2c_client *client[XE_I2C_MAX_CLIENTS];
> +
> + struct notifier_block bus_notifier;
> + struct work_struct work;
> +
> + struct irq_domain *irqdomain;
> + int adapter_irq;
> +
> + struct xe_i2c_endpoint ep;
> + struct device *drm_dev;
> +
> + struct xe_mmio *mmio;
> +};
> +
> +#if IS_ENABLED(CONFIG_I2C)
> +int xe_i2c_probe(struct xe_device *xe);
> +void xe_i2c_irq_handler(struct xe_device *xe, u32 master_ctl);
> +#else
> +static inline int xe_i2c_probe(struct xe_device *xe) { return 0; }
> +static inline void xe_i2c_irq_handler(struct xe_device *xe, u32 master_ctl) { }
> +#endif
> +
> +#endif
> diff --git a/drivers/gpu/drm/xe/xe_irq.c b/drivers/gpu/drm/xe/xe_irq.c
> index 5362d3174b06..c43e62dc692e 100644
> --- a/drivers/gpu/drm/xe/xe_irq.c
> +++ b/drivers/gpu/drm/xe/xe_irq.c
> @@ -18,6 +18,7 @@
> #include "xe_gt.h"
> #include "xe_guc.h"
> #include "xe_hw_engine.h"
> +#include "xe_i2c.h"
> #include "xe_memirq.h"
> #include "xe_mmio.h"
> #include "xe_pxp.h"
> @@ -476,6 +477,7 @@ static irqreturn_t dg1_irq_handler(int irq, void *arg)
> if (xe->info.has_heci_cscfi)
> xe_heci_csc_irq_handler(xe, master_ctl);
> xe_display_irq_handler(xe, master_ctl);
> + xe_i2c_irq_handler(xe, master_ctl);
> gu_misc_iir = gu_misc_irq_ack(xe, master_ctl);
> }
> }
> --
> 2.47.2
>
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: [PATCH v3 2/4] drm/xe: Support for I2C attached MCUs
2025-06-16 20:30 ` Rodrigo Vivi
@ 2025-06-17 11:27 ` Heikki Krogerus
2025-06-20 16:21 ` Rodrigo Vivi
0 siblings, 1 reply; 13+ messages in thread
From: Heikki Krogerus @ 2025-06-17 11:27 UTC (permalink / raw)
To: Rodrigo Vivi, Michael J. Ruhl
Cc: Lucas De Marchi, Thomas Hellström, Jarkko Nikula,
David Airlie, Simona Vetter, Andy Shevchenko, Mika Westerberg,
Jan Dabros, Andi Shyti, Raag Jadav, Tauro, Riana,
Adatrao, Srinivasa, Michael J. Ruhl, intel-xe, linux-i2c,
linux-kernel
Hi Rodrigo,
Thank you for the review.
On Mon, Jun 16, 2025 at 04:30:03PM -0400, Rodrigo Vivi wrote:
> On Thu, Jun 12, 2025 at 04:24:48PM +0300, Heikki Krogerus wrote:
> > Adding adaption/glue layer where the I2C host adapter
> > (Synopsys DesignWare I2C adapter) and the I2C clients (the
> > microcontroller units) are enumerated.
> >
> > The microcontroller units (MCU) that are attached to the GPU
> > depend on the OEM. The initially supported MCU will be the
> > Add-In Management Controller (AMC).
> >
> > Originally-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
> > Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> > ---
> > drivers/gpu/drm/xe/Kconfig | 1 +
> > drivers/gpu/drm/xe/Makefile | 1 +
> > drivers/gpu/drm/xe/regs/xe_i2c_regs.h | 15 ++
> > drivers/gpu/drm/xe/regs/xe_irq_regs.h | 1 +
> > drivers/gpu/drm/xe/regs/xe_pmt.h | 2 +-
> > drivers/gpu/drm/xe/regs/xe_regs.h | 2 +
> > drivers/gpu/drm/xe/xe_device.c | 5 +
> > drivers/gpu/drm/xe/xe_device_types.h | 4 +
> > drivers/gpu/drm/xe/xe_i2c.c | 270 ++++++++++++++++++++++++++
> > drivers/gpu/drm/xe/xe_i2c.h | 58 ++++++
> > drivers/gpu/drm/xe/xe_irq.c | 2 +
> > 11 files changed, 360 insertions(+), 1 deletion(-)
> > create mode 100644 drivers/gpu/drm/xe/regs/xe_i2c_regs.h
> > create mode 100644 drivers/gpu/drm/xe/xe_i2c.c
> > create mode 100644 drivers/gpu/drm/xe/xe_i2c.h
> >
> > diff --git a/drivers/gpu/drm/xe/Kconfig b/drivers/gpu/drm/xe/Kconfig
> > index c57f1da0791d..5c162031fc3f 100644
> > --- a/drivers/gpu/drm/xe/Kconfig
> > +++ b/drivers/gpu/drm/xe/Kconfig
> > @@ -44,6 +44,7 @@ config DRM_XE
> > select WANT_DEV_COREDUMP
> > select AUXILIARY_BUS
> > select HMM_MIRROR
> > + select REGMAP if I2C
> > help
> > Experimental driver for Intel Xe series GPUs
> >
> > diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
> > index f5f5775acdc0..293552fc5aaf 100644
> > --- a/drivers/gpu/drm/xe/Makefile
> > +++ b/drivers/gpu/drm/xe/Makefile
> > @@ -124,6 +124,7 @@ xe-y += xe_bb.o \
> > xe_wait_user_fence.o \
> > xe_wopcm.o
> >
> > +xe-$(CONFIG_I2C) += xe_i2c.o
> > xe-$(CONFIG_HMM_MIRROR) += xe_hmm.o
> > xe-$(CONFIG_DRM_XE_GPUSVM) += xe_svm.o
> >
> > diff --git a/drivers/gpu/drm/xe/regs/xe_i2c_regs.h b/drivers/gpu/drm/xe/regs/xe_i2c_regs.h
> > new file mode 100644
> > index 000000000000..fa7223e6ce9e
> > --- /dev/null
> > +++ b/drivers/gpu/drm/xe/regs/xe_i2c_regs.h
> > @@ -0,0 +1,15 @@
> > +/* SPDX-License-Identifier: GPL-2.0 */
> > +#ifndef _XE_I2C_REGS_H_
> > +#define _XE_I2C_REGS_H_
> > +
> > +#include "xe_reg_defs.h"
> > +#include "xe_regs.h"
> > +
> > +#define I2C_CONFIG_SPACE_OFFSET (SOC_BASE + 0xf6000)
> > +#define I2C_MEM_SPACE_OFFSET (SOC_BASE + 0xf7400)
> > +#define I2C_BRIDGE_OFFSET (SOC_BASE + 0xd9000)
> > +
> > +#define CLIENT_DISC_COOKIE XE_REG(SOC_BASE + 0x0164)
> > +#define CLIENT_DISC_ADDRESS XE_REG(SOC_BASE + 0x0168)
>
> Could you please send me some pointers of the spec for this registers
> so I can help on the review here?
Done.
> > +
> > +#endif /* _XE_I2C_REGS_H_ */
> > diff --git a/drivers/gpu/drm/xe/regs/xe_irq_regs.h b/drivers/gpu/drm/xe/regs/xe_irq_regs.h
> > index f0ecfcac4003..13635e4331d4 100644
> > --- a/drivers/gpu/drm/xe/regs/xe_irq_regs.h
> > +++ b/drivers/gpu/drm/xe/regs/xe_irq_regs.h
> > @@ -19,6 +19,7 @@
> > #define MASTER_IRQ REG_BIT(31)
> > #define GU_MISC_IRQ REG_BIT(29)
> > #define DISPLAY_IRQ REG_BIT(16)
> > +#define I2C_IRQ REG_BIT(12)
> > #define GT_DW_IRQ(x) REG_BIT(x)
> >
> > /*
> > diff --git a/drivers/gpu/drm/xe/regs/xe_pmt.h b/drivers/gpu/drm/xe/regs/xe_pmt.h
> > index b0efd9b48d1e..2995d72c3f78 100644
> > --- a/drivers/gpu/drm/xe/regs/xe_pmt.h
> > +++ b/drivers/gpu/drm/xe/regs/xe_pmt.h
> > @@ -5,7 +5,7 @@
> > #ifndef _XE_PMT_H_
> > #define _XE_PMT_H_
> >
> > -#define SOC_BASE 0x280000
> > +#include "xe_regs.h"
> >
> > #define BMG_PMT_BASE_OFFSET 0xDB000
> > #define BMG_DISCOVERY_OFFSET (SOC_BASE + BMG_PMT_BASE_OFFSET)
> > diff --git a/drivers/gpu/drm/xe/regs/xe_regs.h b/drivers/gpu/drm/xe/regs/xe_regs.h
> > index 3abb17d2ca33..1926b4044314 100644
> > --- a/drivers/gpu/drm/xe/regs/xe_regs.h
> > +++ b/drivers/gpu/drm/xe/regs/xe_regs.h
> > @@ -7,6 +7,8 @@
> >
> > #include "regs/xe_reg_defs.h"
> >
> > +#define SOC_BASE 0x280000
> > +
> > #define GU_CNTL_PROTECTED XE_REG(0x10100C)
> > #define DRIVERINT_FLR_DIS REG_BIT(31)
> >
> > diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> > index 7e87344943cd..ca098ed532b5 100644
> > --- a/drivers/gpu/drm/xe/xe_device.c
> > +++ b/drivers/gpu/drm/xe/xe_device.c
> > @@ -42,6 +42,7 @@
> > #include "xe_guc.h"
> > #include "xe_hw_engine_group.h"
> > #include "xe_hwmon.h"
> > +#include "xe_i2c.h"
> > #include "xe_irq.h"
> > #include "xe_memirq.h"
> > #include "xe_mmio.h"
> > @@ -921,6 +922,10 @@ int xe_device_probe(struct xe_device *xe)
> > if (err)
> > goto err_unregister_display;
> >
> > + err = xe_i2c_probe(xe);
> > + if (err)
> > + goto err_unregister_display;
> > +
> > for_each_gt(gt, xe, id)
> > xe_gt_sanitize_freq(gt);
> >
> > diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
> > index ac27389ccb8b..8f3c5ea58034 100644
> > --- a/drivers/gpu/drm/xe/xe_device_types.h
> > +++ b/drivers/gpu/drm/xe/xe_device_types.h
> > @@ -33,6 +33,7 @@
> > struct dram_info;
> > struct intel_display;
> > struct xe_ggtt;
> > +struct xe_i2c;
> > struct xe_pat_ops;
> > struct xe_pxp;
> >
> > @@ -573,6 +574,9 @@ struct xe_device {
> > /** @pmu: performance monitoring unit */
> > struct xe_pmu pmu;
> >
> > + /** @i2c: I2C host controller */
> > + struct xe_i2c *i2c;
> > +
> > /** @atomic_svm_timeslice_ms: Atomic SVM fault timeslice MS */
> > u32 atomic_svm_timeslice_ms;
> >
> > diff --git a/drivers/gpu/drm/xe/xe_i2c.c b/drivers/gpu/drm/xe/xe_i2c.c
> > new file mode 100644
> > index 000000000000..3d649602ede8
> > --- /dev/null
> > +++ b/drivers/gpu/drm/xe/xe_i2c.c
> > @@ -0,0 +1,270 @@
> > +// SPDX-License-Identifier: GPL-2.0
>
> Does it really need to be GPL or could it be MIT?
>
> (If you copied code from other files that are GPL, then it needs
> to be GPL)
Michael, do we need to use GPL here, or is MIT okay?
> > +/*
> > + * Intel Xe I2C attached Microcontroller Units (MCU)
> > + *
> > + * Copyright (C) 2025 Intel Corporation.
> > + */
> > +
> > +#include <linux/array_size.h>
> > +#include <linux/container_of.h>
> > +#include <linux/device.h>
> > +#include <linux/err.h>
> > +#include <linux/i2c.h>
> > +#include <linux/ioport.h>
> > +#include <linux/irq.h>
> > +#include <linux/irqdomain.h>
> > +#include <linux/notifier.h>
> > +#include <linux/pci.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/property.h>
> > +#include <linux/regmap.h>
> > +#include <linux/sprintf.h>
> > +#include <linux/string.h>
> > +#include <linux/types.h>
> > +#include <linux/workqueue.h>
> > +
> > +#include "regs/xe_i2c_regs.h"
> > +#include "regs/xe_irq_regs.h"
> > +
> > +#include "xe_device.h"
> > +#include "xe_device_types.h"
> > +#include "xe_i2c.h"
> > +#include "xe_mmio.h"
> > +#include "xe_platform_types.h"
> > +
> > +/* Synopsys DesignWare I2C Host Adapter */
> > +static const char adapter_name[] = "i2c_designware";
> > +
> > +static const struct property_entry xe_i2c_adapter_properties[] = {
> > + PROPERTY_ENTRY_STRING("compatible", "intel,xe-i2c"),
> > + PROPERTY_ENTRY_U32("clock-frequency", I2C_MAX_FAST_MODE_PLUS_FREQ),
> > + { }
> > +};
> > +
> > +static inline void xe_i2c_read_endpoint(struct xe_mmio *mmio, void *ep)
> > +{
> > + u32 *val = ep;
> > +
> > + val[0] = xe_mmio_read32(mmio, CLIENT_DISC_COOKIE);
> > + val[1] = xe_mmio_read32(mmio, CLIENT_DISC_ADDRESS);
> > +}
> > +
> > +static void xe_i2c_client_work(struct work_struct *work)
> > +{
> > + struct xe_i2c *i2c = container_of(work, struct xe_i2c, work);
> > + struct i2c_board_info info = {
> > + .type = "amc",
> > + .flags = I2C_CLIENT_HOST_NOTIFY,
> > + .addr = i2c->ep.addr[1],
> > + };
> > +
> > + i2c->client[0] = i2c_new_client_device(i2c->adapter, &info);
> > +}
> > +
> > +static int xe_i2c_notifier(struct notifier_block *nb, unsigned long action, void *data)
> > +{
> > + struct xe_i2c *i2c = container_of(nb, struct xe_i2c, bus_notifier);
> > + struct i2c_adapter *adapter = i2c_verify_adapter(data);
> > + struct device *dev = data;
> > +
> > + if (action == BUS_NOTIFY_ADD_DEVICE &&
> > + adapter && dev->parent == &i2c->pdev->dev) {
> > + i2c->adapter = adapter;
> > + schedule_work(&i2c->work);
> > + return NOTIFY_OK;
> > + }
> > +
> > + return NOTIFY_DONE;
> > +}
> > +
> > +static int xe_i2c_register_adapter(struct xe_i2c *i2c)
> > +{
> > + struct pci_dev *pci = to_pci_dev(i2c->drm_dev);
> > + struct platform_device *pdev;
> > + struct fwnode_handle *fwnode;
> > + int ret;
> > +
> > + fwnode = fwnode_create_software_node(xe_i2c_adapter_properties, NULL);
> > + if (!fwnode)
> > + return -ENOMEM;
> > +
> > + /*
> > + * Not using platform_device_register_full() here because we don't have
> > + * a handle to the platform_device before it returns. xe_i2c_notifier()
> > + * uses that handle, but it may be called before
> > + * platform_device_register_full() is done.
> > + */
> > + pdev = platform_device_alloc(adapter_name, pci_dev_id(pci));
> > + if (!pdev) {
> > + ret = -ENOMEM;
> > + goto err_fwnode_remove;
> > + }
> > +
> > + if (i2c->adapter_irq) {
> > + struct resource res = { };
> > +
> > + res.start = i2c->adapter_irq;
> > + res.name = "xe_i2c";
> > + res.flags = IORESOURCE_IRQ;
> > +
> > + ret = platform_device_add_resources(pdev, &res, 1);
> > + if (ret)
> > + goto err_pdev_put;
> > + }
> > +
> > + pdev->dev.parent = i2c->drm_dev;
> > + pdev->dev.fwnode = fwnode;
> > + i2c->adapter_node = fwnode;
> > + i2c->pdev = pdev;
> > +
> > + ret = platform_device_add(pdev);
> > + if (ret)
> > + goto err_pdev_put;
> > +
> > + return 0;
> > +
> > +err_pdev_put:
> > + platform_device_put(pdev);
> > +err_fwnode_remove:
> > + fwnode_remove_software_node(fwnode);
> > +
> > + return ret;
> > +}
> > +
> > +static void xe_i2c_unregister_adapter(struct xe_i2c *i2c)
> > +{
> > + platform_device_unregister(i2c->pdev);
> > + fwnode_remove_software_node(i2c->adapter_node);
> > +}
> > +
> > +void xe_i2c_irq_handler(struct xe_device *xe, u32 master_ctl)
> > +{
> > + if (!xe->i2c || !xe->i2c->adapter_irq)
> > + return;
> > +
> > + if (master_ctl & I2C_IRQ)
> > + generic_handle_irq_safe(xe->i2c->adapter_irq);
> > +}
> > +
> > +static int xe_i2c_irq_map(struct irq_domain *h, unsigned int virq,
> > + irq_hw_number_t hw_irq_num)
> > +{
> > + irq_set_chip_and_handler(virq, &dummy_irq_chip, handle_simple_irq);
> > + return 0;
> > +}
> > +
> > +static const struct irq_domain_ops xe_i2c_irq_ops = {
> > + .map = xe_i2c_irq_map,
> > +};
> > +
> > +static int xe_i2c_create_irq(struct xe_i2c *i2c)
> > +{
> > + struct irq_domain *domain;
> > +
> > + if (!(i2c->ep.capabilities & XE_I2C_EP_CAP_IRQ))
> > + return 0;
> > +
> > + domain = irq_domain_create_linear(dev_fwnode(i2c->drm_dev), 1, &xe_i2c_irq_ops, NULL);
> > + if (!domain)
> > + return -ENOMEM;
> > +
> > + i2c->adapter_irq = irq_create_mapping(domain, 0);
> > + i2c->irqdomain = domain;
> > +
> > + return 0;
> > +}
> > +
> > +static void xe_i2c_remove_irq(struct xe_i2c *i2c)
> > +{
> > + if (i2c->irqdomain) {
> > + irq_dispose_mapping(i2c->adapter_irq);
> > + irq_domain_remove(i2c->irqdomain);
> > + }
> > +}
> > +
> > +static int xe_i2c_read(void *context, unsigned int reg, unsigned int *val)
> > +{
> > + struct xe_i2c *i2c = context;
> > +
> > + *val = xe_mmio_read32(i2c->mmio, XE_REG(reg + I2C_MEM_SPACE_OFFSET));
> > +
> > + return 0;
> > +}
> > +
> > +static int xe_i2c_write(void *context, unsigned int reg, unsigned int val)
> > +{
> > + struct xe_i2c *i2c = context;
> > +
> > + xe_mmio_write32(i2c->mmio, XE_REG(reg + I2C_MEM_SPACE_OFFSET), val);
> > +
> > + return 0;
> > +}
> > +
> > +static const struct regmap_config i2c_regmap_config = {
> > + .reg_bits = 32,
> > + .val_bits = 32,
> > + .reg_read = xe_i2c_read,
> > + .reg_write = xe_i2c_write,
> > + .fast_io = true,
> > +};
> > +
> > +static void xe_i2c_remove(void *data)
> > +{
> > + struct xe_i2c *i2c = data;
> > + int i;
> > +
> > + for (i = 0; i < XE_I2C_MAX_CLIENTS; i++)
> > + i2c_unregister_device(i2c->client[i]);
> > +
> > + bus_unregister_notifier(&i2c_bus_type, &i2c->bus_notifier);
> > + xe_i2c_unregister_adapter(i2c);
> > + xe_i2c_remove_irq(i2c);
> > +}
> > +
> > +int xe_i2c_probe(struct xe_device *xe)
>
> could you please add some /** DOC: Xe i2c ... above
> and then add some doc to the exported functions?
Sure thing. But just to be clear to everyone, there no are exported
functions here (global but not exported).
> > +{
> > + struct xe_i2c_endpoint ep;
> > + struct regmap *regmap;
> > + struct xe_i2c *i2c;
> > + int ret;
> > +
> > + xe_i2c_read_endpoint(xe_root_tile_mmio(xe), &ep);
> > + if (ep.cookie != XE_I2C_EP_COOKIE_DEVICE)
> > + return 0;
> > +
> > + i2c = devm_kzalloc(xe->drm.dev, sizeof(*i2c), GFP_KERNEL);
> > + if (!i2c)
> > + return -ENOMEM;
> > +
> > + INIT_WORK(&i2c->work, xe_i2c_client_work);
> > + i2c->mmio = xe_root_tile_mmio(xe);
> > + i2c->drm_dev = xe->drm.dev;
> > + i2c->ep = ep;
> > +
> > + regmap = devm_regmap_init(i2c->drm_dev, NULL, i2c, &i2c_regmap_config);
> > + if (IS_ERR(regmap))
> > + return PTR_ERR(regmap);
> > +
> > + i2c->bus_notifier.notifier_call = xe_i2c_notifier;
> > + ret = bus_register_notifier(&i2c_bus_type, &i2c->bus_notifier);
> > + if (ret)
> > + return ret;
> > +
> > + ret = xe_i2c_create_irq(i2c);
> > + if (ret)
> > + goto err_unregister_notifier;
> > +
> > + ret = xe_i2c_register_adapter(i2c);
> > + if (ret)
> > + goto err_remove_irq;
> > +
> > + return devm_add_action_or_reset(i2c->drm_dev, xe_i2c_remove, i2c);
> > +
> > +err_remove_irq:
> > + xe_i2c_remove_irq(i2c);
> > +
> > +err_unregister_notifier:
> > + bus_unregister_notifier(&i2c_bus_type, &i2c->bus_notifier);
> > +
> > + return ret;
> > +}
> > diff --git a/drivers/gpu/drm/xe/xe_i2c.h b/drivers/gpu/drm/xe/xe_i2c.h
> > new file mode 100644
> > index 000000000000..e88845be61b4
> > --- /dev/null
> > +++ b/drivers/gpu/drm/xe/xe_i2c.h
> > @@ -0,0 +1,58 @@
> > +/* SPDX-License-Identifier: GPL-2.0 */
>
> same question here...
>
> > +#ifndef _XE_I2C_H_
> > +#define _XE_I2C_H_
> > +
> > +#include <linux/bits.h>
> > +#include <linux/notifier.h>
> > +#include <linux/types.h>
> > +#include <linux/workqueue.h>
> > +
> > +struct device;
> > +struct fwnode_handle;
> > +struct i2c_adapter;
> > +struct i2c_client;
> > +struct irq_domain;
> > +struct platform_device;
> > +struct xe_device;
> > +struct xe_mmio;
> > +
> > +#define XE_I2C_MAX_CLIENTS 3
> > +
> > +#define XE_I2C_EP_COOKIE_DEVICE 0xde
> > +
> > +/* Endpoint Capabilities */
> > +#define XE_I2C_EP_CAP_IRQ BIT(0)
> > +
> > +struct xe_i2c_endpoint {
> > + u8 cookie;
> > + u8 capabilities;
> > + u16 addr[XE_I2C_MAX_CLIENTS];
> > +};
> > +
> > +struct xe_i2c {
> > + struct fwnode_handle *adapter_node;
> > + struct platform_device *pdev;
> > + struct i2c_adapter *adapter;
> > + struct i2c_client *client[XE_I2C_MAX_CLIENTS];
> > +
> > + struct notifier_block bus_notifier;
> > + struct work_struct work;
> > +
> > + struct irq_domain *irqdomain;
> > + int adapter_irq;
> > +
> > + struct xe_i2c_endpoint ep;
> > + struct device *drm_dev;
> > +
> > + struct xe_mmio *mmio;
> > +};
> > +
> > +#if IS_ENABLED(CONFIG_I2C)
> > +int xe_i2c_probe(struct xe_device *xe);
> > +void xe_i2c_irq_handler(struct xe_device *xe, u32 master_ctl);
> > +#else
> > +static inline int xe_i2c_probe(struct xe_device *xe) { return 0; }
> > +static inline void xe_i2c_irq_handler(struct xe_device *xe, u32 master_ctl) { }
> > +#endif
> > +
> > +#endif
> > diff --git a/drivers/gpu/drm/xe/xe_irq.c b/drivers/gpu/drm/xe/xe_irq.c
> > index 5362d3174b06..c43e62dc692e 100644
> > --- a/drivers/gpu/drm/xe/xe_irq.c
> > +++ b/drivers/gpu/drm/xe/xe_irq.c
> > @@ -18,6 +18,7 @@
> > #include "xe_gt.h"
> > #include "xe_guc.h"
> > #include "xe_hw_engine.h"
> > +#include "xe_i2c.h"
> > #include "xe_memirq.h"
> > #include "xe_mmio.h"
> > #include "xe_pxp.h"
> > @@ -476,6 +477,7 @@ static irqreturn_t dg1_irq_handler(int irq, void *arg)
> > if (xe->info.has_heci_cscfi)
> > xe_heci_csc_irq_handler(xe, master_ctl);
> > xe_display_irq_handler(xe, master_ctl);
> > + xe_i2c_irq_handler(xe, master_ctl);
> > gu_misc_iir = gu_misc_irq_ack(xe, master_ctl);
> > }
> > }
> > --
> > 2.47.2
> >
thanks,
--
heikki
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: [PATCH v3 2/4] drm/xe: Support for I2C attached MCUs
2025-06-17 11:27 ` Heikki Krogerus
@ 2025-06-20 16:21 ` Rodrigo Vivi
2025-06-24 13:26 ` Heikki Krogerus
0 siblings, 1 reply; 13+ messages in thread
From: Rodrigo Vivi @ 2025-06-20 16:21 UTC (permalink / raw)
To: Heikki Krogerus, Michael J. Ruhl
Cc: Michael J. Ruhl, Lucas De Marchi, Thomas Hellström,
Jarkko Nikula, David Airlie, Simona Vetter, Andy Shevchenko,
Mika Westerberg, Jan Dabros, Andi Shyti, Raag Jadav, Tauro, Riana,
Adatrao, Srinivasa, intel-xe, linux-i2c, linux-kernel
On Tue, Jun 17, 2025 at 02:27:44PM +0300, Heikki Krogerus wrote:
> Hi Rodrigo,
>
> Thank you for the review.
>
> On Mon, Jun 16, 2025 at 04:30:03PM -0400, Rodrigo Vivi wrote:
> > On Thu, Jun 12, 2025 at 04:24:48PM +0300, Heikki Krogerus wrote:
> > > Adding adaption/glue layer where the I2C host adapter
> > > (Synopsys DesignWare I2C adapter) and the I2C clients (the
> > > microcontroller units) are enumerated.
> > >
> > > The microcontroller units (MCU) that are attached to the GPU
> > > depend on the OEM. The initially supported MCU will be the
> > > Add-In Management Controller (AMC).
> > >
> > > Originally-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
> > > Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> > > ---
> > > drivers/gpu/drm/xe/Kconfig | 1 +
> > > drivers/gpu/drm/xe/Makefile | 1 +
> > > drivers/gpu/drm/xe/regs/xe_i2c_regs.h | 15 ++
> > > drivers/gpu/drm/xe/regs/xe_irq_regs.h | 1 +
> > > drivers/gpu/drm/xe/regs/xe_pmt.h | 2 +-
> > > drivers/gpu/drm/xe/regs/xe_regs.h | 2 +
> > > drivers/gpu/drm/xe/xe_device.c | 5 +
> > > drivers/gpu/drm/xe/xe_device_types.h | 4 +
> > > drivers/gpu/drm/xe/xe_i2c.c | 270 ++++++++++++++++++++++++++
> > > drivers/gpu/drm/xe/xe_i2c.h | 58 ++++++
> > > drivers/gpu/drm/xe/xe_irq.c | 2 +
> > > 11 files changed, 360 insertions(+), 1 deletion(-)
> > > create mode 100644 drivers/gpu/drm/xe/regs/xe_i2c_regs.h
> > > create mode 100644 drivers/gpu/drm/xe/xe_i2c.c
> > > create mode 100644 drivers/gpu/drm/xe/xe_i2c.h
> > >
> > > diff --git a/drivers/gpu/drm/xe/Kconfig b/drivers/gpu/drm/xe/Kconfig
> > > index c57f1da0791d..5c162031fc3f 100644
> > > --- a/drivers/gpu/drm/xe/Kconfig
> > > +++ b/drivers/gpu/drm/xe/Kconfig
> > > @@ -44,6 +44,7 @@ config DRM_XE
> > > select WANT_DEV_COREDUMP
> > > select AUXILIARY_BUS
> > > select HMM_MIRROR
> > > + select REGMAP if I2C
> > > help
> > > Experimental driver for Intel Xe series GPUs
> > >
> > > diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
> > > index f5f5775acdc0..293552fc5aaf 100644
> > > --- a/drivers/gpu/drm/xe/Makefile
> > > +++ b/drivers/gpu/drm/xe/Makefile
> > > @@ -124,6 +124,7 @@ xe-y += xe_bb.o \
> > > xe_wait_user_fence.o \
> > > xe_wopcm.o
> > >
> > > +xe-$(CONFIG_I2C) += xe_i2c.o
> > > xe-$(CONFIG_HMM_MIRROR) += xe_hmm.o
> > > xe-$(CONFIG_DRM_XE_GPUSVM) += xe_svm.o
> > >
> > > diff --git a/drivers/gpu/drm/xe/regs/xe_i2c_regs.h b/drivers/gpu/drm/xe/regs/xe_i2c_regs.h
> > > new file mode 100644
> > > index 000000000000..fa7223e6ce9e
> > > --- /dev/null
> > > +++ b/drivers/gpu/drm/xe/regs/xe_i2c_regs.h
> > > @@ -0,0 +1,15 @@
> > > +/* SPDX-License-Identifier: GPL-2.0 */
> > > +#ifndef _XE_I2C_REGS_H_
> > > +#define _XE_I2C_REGS_H_
> > > +
> > > +#include "xe_reg_defs.h"
> > > +#include "xe_regs.h"
> > > +
> > > +#define I2C_CONFIG_SPACE_OFFSET (SOC_BASE + 0xf6000)
> > > +#define I2C_MEM_SPACE_OFFSET (SOC_BASE + 0xf7400)
> > > +#define I2C_BRIDGE_OFFSET (SOC_BASE + 0xd9000)
nit: could be sorted out starting with lower offset (bridge)
> > > +
> > > +#define CLIENT_DISC_COOKIE XE_REG(SOC_BASE + 0x0164)
> > > +#define CLIENT_DISC_ADDRESS XE_REG(SOC_BASE + 0x0168)
why is this named cookie and address?
Shouldn't it be REG_SG_REMAP_ADDR_PREFIX and REG_SG_REMAP_ADDR_POSTFIX ?
> >
> > Could you please send me some pointers of the spec for this registers
> > so I can help on the review here?
>
> Done.
>
> > > +
> > > +#endif /* _XE_I2C_REGS_H_ */
> > > diff --git a/drivers/gpu/drm/xe/regs/xe_irq_regs.h b/drivers/gpu/drm/xe/regs/xe_irq_regs.h
> > > index f0ecfcac4003..13635e4331d4 100644
> > > --- a/drivers/gpu/drm/xe/regs/xe_irq_regs.h
> > > +++ b/drivers/gpu/drm/xe/regs/xe_irq_regs.h
> > > @@ -19,6 +19,7 @@
> > > #define MASTER_IRQ REG_BIT(31)
> > > #define GU_MISC_IRQ REG_BIT(29)
> > > #define DISPLAY_IRQ REG_BIT(16)
> > > +#define I2C_IRQ REG_BIT(12)
> > > #define GT_DW_IRQ(x) REG_BIT(x)
> > >
> > > /*
> > > diff --git a/drivers/gpu/drm/xe/regs/xe_pmt.h b/drivers/gpu/drm/xe/regs/xe_pmt.h
> > > index b0efd9b48d1e..2995d72c3f78 100644
> > > --- a/drivers/gpu/drm/xe/regs/xe_pmt.h
> > > +++ b/drivers/gpu/drm/xe/regs/xe_pmt.h
> > > @@ -5,7 +5,7 @@
> > > #ifndef _XE_PMT_H_
> > > #define _XE_PMT_H_
> > >
> > > -#define SOC_BASE 0x280000
> > > +#include "xe_regs.h"
> > >
> > > #define BMG_PMT_BASE_OFFSET 0xDB000
> > > #define BMG_DISCOVERY_OFFSET (SOC_BASE + BMG_PMT_BASE_OFFSET)
> > > diff --git a/drivers/gpu/drm/xe/regs/xe_regs.h b/drivers/gpu/drm/xe/regs/xe_regs.h
> > > index 3abb17d2ca33..1926b4044314 100644
> > > --- a/drivers/gpu/drm/xe/regs/xe_regs.h
> > > +++ b/drivers/gpu/drm/xe/regs/xe_regs.h
> > > @@ -7,6 +7,8 @@
> > >
> > > #include "regs/xe_reg_defs.h"
> > >
> > > +#define SOC_BASE 0x280000
> > > +
> > > #define GU_CNTL_PROTECTED XE_REG(0x10100C)
> > > #define DRIVERINT_FLR_DIS REG_BIT(31)
> > >
> > > diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> > > index 7e87344943cd..ca098ed532b5 100644
> > > --- a/drivers/gpu/drm/xe/xe_device.c
> > > +++ b/drivers/gpu/drm/xe/xe_device.c
> > > @@ -42,6 +42,7 @@
> > > #include "xe_guc.h"
> > > #include "xe_hw_engine_group.h"
> > > #include "xe_hwmon.h"
> > > +#include "xe_i2c.h"
> > > #include "xe_irq.h"
> > > #include "xe_memirq.h"
> > > #include "xe_mmio.h"
> > > @@ -921,6 +922,10 @@ int xe_device_probe(struct xe_device *xe)
> > > if (err)
> > > goto err_unregister_display;
> > >
> > > + err = xe_i2c_probe(xe);
> > > + if (err)
> > > + goto err_unregister_display;
> > > +
> > > for_each_gt(gt, xe, id)
> > > xe_gt_sanitize_freq(gt);
> > >
> > > diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
> > > index ac27389ccb8b..8f3c5ea58034 100644
> > > --- a/drivers/gpu/drm/xe/xe_device_types.h
> > > +++ b/drivers/gpu/drm/xe/xe_device_types.h
> > > @@ -33,6 +33,7 @@
> > > struct dram_info;
> > > struct intel_display;
> > > struct xe_ggtt;
> > > +struct xe_i2c;
> > > struct xe_pat_ops;
> > > struct xe_pxp;
> > >
> > > @@ -573,6 +574,9 @@ struct xe_device {
> > > /** @pmu: performance monitoring unit */
> > > struct xe_pmu pmu;
> > >
> > > + /** @i2c: I2C host controller */
> > > + struct xe_i2c *i2c;
> > > +
> > > /** @atomic_svm_timeslice_ms: Atomic SVM fault timeslice MS */
> > > u32 atomic_svm_timeslice_ms;
> > >
> > > diff --git a/drivers/gpu/drm/xe/xe_i2c.c b/drivers/gpu/drm/xe/xe_i2c.c
> > > new file mode 100644
> > > index 000000000000..3d649602ede8
> > > --- /dev/null
> > > +++ b/drivers/gpu/drm/xe/xe_i2c.c
> > > @@ -0,0 +1,270 @@
> > > +// SPDX-License-Identifier: GPL-2.0
> >
> > Does it really need to be GPL or could it be MIT?
> >
> > (If you copied code from other files that are GPL, then it needs
> > to be GPL)
>
> Michael, do we need to use GPL here, or is MIT okay?
Mike?!
>
> > > +/*
> > > + * Intel Xe I2C attached Microcontroller Units (MCU)
> > > + *
> > > + * Copyright (C) 2025 Intel Corporation.
> > > + */
> > > +
> > > +#include <linux/array_size.h>
> > > +#include <linux/container_of.h>
> > > +#include <linux/device.h>
> > > +#include <linux/err.h>
> > > +#include <linux/i2c.h>
> > > +#include <linux/ioport.h>
> > > +#include <linux/irq.h>
> > > +#include <linux/irqdomain.h>
> > > +#include <linux/notifier.h>
> > > +#include <linux/pci.h>
> > > +#include <linux/platform_device.h>
> > > +#include <linux/property.h>
> > > +#include <linux/regmap.h>
> > > +#include <linux/sprintf.h>
> > > +#include <linux/string.h>
> > > +#include <linux/types.h>
> > > +#include <linux/workqueue.h>
> > > +
> > > +#include "regs/xe_i2c_regs.h"
> > > +#include "regs/xe_irq_regs.h"
> > > +
> > > +#include "xe_device.h"
> > > +#include "xe_device_types.h"
> > > +#include "xe_i2c.h"
> > > +#include "xe_mmio.h"
> > > +#include "xe_platform_types.h"
> > > +
> > > +/* Synopsys DesignWare I2C Host Adapter */
> > > +static const char adapter_name[] = "i2c_designware";
> > > +
> > > +static const struct property_entry xe_i2c_adapter_properties[] = {
> > > + PROPERTY_ENTRY_STRING("compatible", "intel,xe-i2c"),
> > > + PROPERTY_ENTRY_U32("clock-frequency", I2C_MAX_FAST_MODE_PLUS_FREQ),
> > > + { }
> > > +};
> > > +
> > > +static inline void xe_i2c_read_endpoint(struct xe_mmio *mmio, void *ep)
> > > +{
> > > + u32 *val = ep;
> > > +
> > > + val[0] = xe_mmio_read32(mmio, CLIENT_DISC_COOKIE);
> > > + val[1] = xe_mmio_read32(mmio, CLIENT_DISC_ADDRESS);
> > > +}
> > > +
> > > +static void xe_i2c_client_work(struct work_struct *work)
> > > +{
> > > + struct xe_i2c *i2c = container_of(work, struct xe_i2c, work);
> > > + struct i2c_board_info info = {
> > > + .type = "amc",
> > > + .flags = I2C_CLIENT_HOST_NOTIFY,
> > > + .addr = i2c->ep.addr[1],
> > > + };
> > > +
> > > + i2c->client[0] = i2c_new_client_device(i2c->adapter, &info);
> > > +}
> > > +
> > > +static int xe_i2c_notifier(struct notifier_block *nb, unsigned long action, void *data)
> > > +{
> > > + struct xe_i2c *i2c = container_of(nb, struct xe_i2c, bus_notifier);
> > > + struct i2c_adapter *adapter = i2c_verify_adapter(data);
> > > + struct device *dev = data;
> > > +
> > > + if (action == BUS_NOTIFY_ADD_DEVICE &&
> > > + adapter && dev->parent == &i2c->pdev->dev) {
> > > + i2c->adapter = adapter;
> > > + schedule_work(&i2c->work);
> > > + return NOTIFY_OK;
> > > + }
> > > +
> > > + return NOTIFY_DONE;
> > > +}
> > > +
> > > +static int xe_i2c_register_adapter(struct xe_i2c *i2c)
> > > +{
> > > + struct pci_dev *pci = to_pci_dev(i2c->drm_dev);
> > > + struct platform_device *pdev;
> > > + struct fwnode_handle *fwnode;
> > > + int ret;
> > > +
> > > + fwnode = fwnode_create_software_node(xe_i2c_adapter_properties, NULL);
> > > + if (!fwnode)
> > > + return -ENOMEM;
> > > +
> > > + /*
> > > + * Not using platform_device_register_full() here because we don't have
> > > + * a handle to the platform_device before it returns. xe_i2c_notifier()
> > > + * uses that handle, but it may be called before
> > > + * platform_device_register_full() is done.
> > > + */
> > > + pdev = platform_device_alloc(adapter_name, pci_dev_id(pci));
> > > + if (!pdev) {
> > > + ret = -ENOMEM;
> > > + goto err_fwnode_remove;
> > > + }
> > > +
> > > + if (i2c->adapter_irq) {
> > > + struct resource res = { };
> > > +
> > > + res.start = i2c->adapter_irq;
> > > + res.name = "xe_i2c";
> > > + res.flags = IORESOURCE_IRQ;
> > > +
> > > + ret = platform_device_add_resources(pdev, &res, 1);
> > > + if (ret)
> > > + goto err_pdev_put;
> > > + }
> > > +
> > > + pdev->dev.parent = i2c->drm_dev;
> > > + pdev->dev.fwnode = fwnode;
> > > + i2c->adapter_node = fwnode;
> > > + i2c->pdev = pdev;
> > > +
> > > + ret = platform_device_add(pdev);
> > > + if (ret)
> > > + goto err_pdev_put;
> > > +
> > > + return 0;
> > > +
> > > +err_pdev_put:
> > > + platform_device_put(pdev);
> > > +err_fwnode_remove:
> > > + fwnode_remove_software_node(fwnode);
> > > +
> > > + return ret;
> > > +}
> > > +
> > > +static void xe_i2c_unregister_adapter(struct xe_i2c *i2c)
> > > +{
> > > + platform_device_unregister(i2c->pdev);
> > > + fwnode_remove_software_node(i2c->adapter_node);
> > > +}
> > > +
> > > +void xe_i2c_irq_handler(struct xe_device *xe, u32 master_ctl)
> > > +{
> > > + if (!xe->i2c || !xe->i2c->adapter_irq)
> > > + return;
> > > +
> > > + if (master_ctl & I2C_IRQ)
> > > + generic_handle_irq_safe(xe->i2c->adapter_irq);
> > > +}
> > > +
> > > +static int xe_i2c_irq_map(struct irq_domain *h, unsigned int virq,
> > > + irq_hw_number_t hw_irq_num)
> > > +{
> > > + irq_set_chip_and_handler(virq, &dummy_irq_chip, handle_simple_irq);
> > > + return 0;
> > > +}
> > > +
> > > +static const struct irq_domain_ops xe_i2c_irq_ops = {
> > > + .map = xe_i2c_irq_map,
> > > +};
> > > +
> > > +static int xe_i2c_create_irq(struct xe_i2c *i2c)
> > > +{
> > > + struct irq_domain *domain;
> > > +
> > > + if (!(i2c->ep.capabilities & XE_I2C_EP_CAP_IRQ))
> > > + return 0;
> > > +
> > > + domain = irq_domain_create_linear(dev_fwnode(i2c->drm_dev), 1, &xe_i2c_irq_ops, NULL);
> > > + if (!domain)
> > > + return -ENOMEM;
> > > +
> > > + i2c->adapter_irq = irq_create_mapping(domain, 0);
> > > + i2c->irqdomain = domain;
> > > +
> > > + return 0;
> > > +}
> > > +
> > > +static void xe_i2c_remove_irq(struct xe_i2c *i2c)
> > > +{
> > > + if (i2c->irqdomain) {
> > > + irq_dispose_mapping(i2c->adapter_irq);
> > > + irq_domain_remove(i2c->irqdomain);
> > > + }
> > > +}
> > > +
> > > +static int xe_i2c_read(void *context, unsigned int reg, unsigned int *val)
> > > +{
> > > + struct xe_i2c *i2c = context;
> > > +
> > > + *val = xe_mmio_read32(i2c->mmio, XE_REG(reg + I2C_MEM_SPACE_OFFSET));
> > > +
> > > + return 0;
> > > +}
> > > +
> > > +static int xe_i2c_write(void *context, unsigned int reg, unsigned int val)
> > > +{
> > > + struct xe_i2c *i2c = context;
> > > +
> > > + xe_mmio_write32(i2c->mmio, XE_REG(reg + I2C_MEM_SPACE_OFFSET), val);
> > > +
> > > + return 0;
> > > +}
> > > +
> > > +static const struct regmap_config i2c_regmap_config = {
> > > + .reg_bits = 32,
> > > + .val_bits = 32,
> > > + .reg_read = xe_i2c_read,
> > > + .reg_write = xe_i2c_write,
> > > + .fast_io = true,
> > > +};
> > > +
> > > +static void xe_i2c_remove(void *data)
> > > +{
> > > + struct xe_i2c *i2c = data;
> > > + int i;
> > > +
> > > + for (i = 0; i < XE_I2C_MAX_CLIENTS; i++)
> > > + i2c_unregister_device(i2c->client[i]);
> > > +
> > > + bus_unregister_notifier(&i2c_bus_type, &i2c->bus_notifier);
> > > + xe_i2c_unregister_adapter(i2c);
> > > + xe_i2c_remove_irq(i2c);
> > > +}
> > > +
> > > +int xe_i2c_probe(struct xe_device *xe)
> >
> > could you please add some /** DOC: Xe i2c ... above
> > and then add some doc to the exported functions?
>
> Sure thing. But just to be clear to everyone, there no are exported
> functions here (global but not exported).
sorry for my terminology confusion, but I meant global. Accessible by
other xe_ components. We try to keep all the internal abi documented
to help future developers touching the same code later.
>
> > > +{
> > > + struct xe_i2c_endpoint ep;
> > > + struct regmap *regmap;
> > > + struct xe_i2c *i2c;
> > > + int ret;
> > > +
> > > + xe_i2c_read_endpoint(xe_root_tile_mmio(xe), &ep);
> > > + if (ep.cookie != XE_I2C_EP_COOKIE_DEVICE)
> > > + return 0;
> > > +
> > > + i2c = devm_kzalloc(xe->drm.dev, sizeof(*i2c), GFP_KERNEL);
> > > + if (!i2c)
> > > + return -ENOMEM;
> > > +
> > > + INIT_WORK(&i2c->work, xe_i2c_client_work);
> > > + i2c->mmio = xe_root_tile_mmio(xe);
> > > + i2c->drm_dev = xe->drm.dev;
> > > + i2c->ep = ep;
> > > +
> > > + regmap = devm_regmap_init(i2c->drm_dev, NULL, i2c, &i2c_regmap_config);
> > > + if (IS_ERR(regmap))
> > > + return PTR_ERR(regmap);
> > > +
> > > + i2c->bus_notifier.notifier_call = xe_i2c_notifier;
> > > + ret = bus_register_notifier(&i2c_bus_type, &i2c->bus_notifier);
> > > + if (ret)
> > > + return ret;
> > > +
> > > + ret = xe_i2c_create_irq(i2c);
> > > + if (ret)
> > > + goto err_unregister_notifier;
> > > +
> > > + ret = xe_i2c_register_adapter(i2c);
> > > + if (ret)
> > > + goto err_remove_irq;
> > > +
> > > + return devm_add_action_or_reset(i2c->drm_dev, xe_i2c_remove, i2c);
> > > +
> > > +err_remove_irq:
> > > + xe_i2c_remove_irq(i2c);
> > > +
> > > +err_unregister_notifier:
> > > + bus_unregister_notifier(&i2c_bus_type, &i2c->bus_notifier);
> > > +
> > > + return ret;
> > > +}
> > > diff --git a/drivers/gpu/drm/xe/xe_i2c.h b/drivers/gpu/drm/xe/xe_i2c.h
> > > new file mode 100644
> > > index 000000000000..e88845be61b4
> > > --- /dev/null
> > > +++ b/drivers/gpu/drm/xe/xe_i2c.h
> > > @@ -0,0 +1,58 @@
> > > +/* SPDX-License-Identifier: GPL-2.0 */
> >
> > same question here...
> >
> > > +#ifndef _XE_I2C_H_
> > > +#define _XE_I2C_H_
> > > +
> > > +#include <linux/bits.h>
> > > +#include <linux/notifier.h>
> > > +#include <linux/types.h>
> > > +#include <linux/workqueue.h>
> > > +
> > > +struct device;
> > > +struct fwnode_handle;
> > > +struct i2c_adapter;
> > > +struct i2c_client;
> > > +struct irq_domain;
> > > +struct platform_device;
> > > +struct xe_device;
> > > +struct xe_mmio;
> > > +
> > > +#define XE_I2C_MAX_CLIENTS 3
> > > +
> > > +#define XE_I2C_EP_COOKIE_DEVICE 0xde
> > > +
> > > +/* Endpoint Capabilities */
> > > +#define XE_I2C_EP_CAP_IRQ BIT(0)
> > > +
> > > +struct xe_i2c_endpoint {
> > > + u8 cookie;
> > > + u8 capabilities;
> > > + u16 addr[XE_I2C_MAX_CLIENTS];
> > > +};
> > > +
> > > +struct xe_i2c {
> > > + struct fwnode_handle *adapter_node;
> > > + struct platform_device *pdev;
> > > + struct i2c_adapter *adapter;
> > > + struct i2c_client *client[XE_I2C_MAX_CLIENTS];
> > > +
> > > + struct notifier_block bus_notifier;
> > > + struct work_struct work;
> > > +
> > > + struct irq_domain *irqdomain;
> > > + int adapter_irq;
> > > +
> > > + struct xe_i2c_endpoint ep;
> > > + struct device *drm_dev;
> > > +
> > > + struct xe_mmio *mmio;
> > > +};
> > > +
> > > +#if IS_ENABLED(CONFIG_I2C)
> > > +int xe_i2c_probe(struct xe_device *xe);
> > > +void xe_i2c_irq_handler(struct xe_device *xe, u32 master_ctl);
> > > +#else
> > > +static inline int xe_i2c_probe(struct xe_device *xe) { return 0; }
> > > +static inline void xe_i2c_irq_handler(struct xe_device *xe, u32 master_ctl) { }
> > > +#endif
> > > +
> > > +#endif
> > > diff --git a/drivers/gpu/drm/xe/xe_irq.c b/drivers/gpu/drm/xe/xe_irq.c
> > > index 5362d3174b06..c43e62dc692e 100644
> > > --- a/drivers/gpu/drm/xe/xe_irq.c
> > > +++ b/drivers/gpu/drm/xe/xe_irq.c
> > > @@ -18,6 +18,7 @@
> > > #include "xe_gt.h"
> > > #include "xe_guc.h"
> > > #include "xe_hw_engine.h"
> > > +#include "xe_i2c.h"
> > > #include "xe_memirq.h"
> > > #include "xe_mmio.h"
> > > #include "xe_pxp.h"
> > > @@ -476,6 +477,7 @@ static irqreturn_t dg1_irq_handler(int irq, void *arg)
> > > if (xe->info.has_heci_cscfi)
> > > xe_heci_csc_irq_handler(xe, master_ctl);
> > > xe_display_irq_handler(xe, master_ctl);
> > > + xe_i2c_irq_handler(xe, master_ctl);
> > > gu_misc_iir = gu_misc_irq_ack(xe, master_ctl);
> > > }
> > > }
> > > --
> > > 2.47.2
> > >
>
> thanks,
>
> --
> heikki
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: [PATCH v3 2/4] drm/xe: Support for I2C attached MCUs
2025-06-20 16:21 ` Rodrigo Vivi
@ 2025-06-24 13:26 ` Heikki Krogerus
0 siblings, 0 replies; 13+ messages in thread
From: Heikki Krogerus @ 2025-06-24 13:26 UTC (permalink / raw)
To: Rodrigo Vivi
Cc: Michael J. Ruhl, Lucas De Marchi, Thomas Hellström,
Jarkko Nikula, David Airlie, Simona Vetter, Andy Shevchenko,
Mika Westerberg, Jan Dabros, Andi Shyti, Raag Jadav, Tauro, Riana,
Adatrao, Srinivasa, intel-xe, linux-i2c, linux-kernel
On Fri, Jun 20, 2025 at 12:21:48PM -0400, Rodrigo Vivi wrote:
> On Tue, Jun 17, 2025 at 02:27:44PM +0300, Heikki Krogerus wrote:
> > Hi Rodrigo,
> >
> > Thank you for the review.
> >
> > On Mon, Jun 16, 2025 at 04:30:03PM -0400, Rodrigo Vivi wrote:
> > > On Thu, Jun 12, 2025 at 04:24:48PM +0300, Heikki Krogerus wrote:
> > > > Adding adaption/glue layer where the I2C host adapter
> > > > (Synopsys DesignWare I2C adapter) and the I2C clients (the
> > > > microcontroller units) are enumerated.
> > > >
> > > > The microcontroller units (MCU) that are attached to the GPU
> > > > depend on the OEM. The initially supported MCU will be the
> > > > Add-In Management Controller (AMC).
> > > >
> > > > Originally-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
> > > > Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> > > > ---
> > > > drivers/gpu/drm/xe/Kconfig | 1 +
> > > > drivers/gpu/drm/xe/Makefile | 1 +
> > > > drivers/gpu/drm/xe/regs/xe_i2c_regs.h | 15 ++
> > > > drivers/gpu/drm/xe/regs/xe_irq_regs.h | 1 +
> > > > drivers/gpu/drm/xe/regs/xe_pmt.h | 2 +-
> > > > drivers/gpu/drm/xe/regs/xe_regs.h | 2 +
> > > > drivers/gpu/drm/xe/xe_device.c | 5 +
> > > > drivers/gpu/drm/xe/xe_device_types.h | 4 +
> > > > drivers/gpu/drm/xe/xe_i2c.c | 270 ++++++++++++++++++++++++++
> > > > drivers/gpu/drm/xe/xe_i2c.h | 58 ++++++
> > > > drivers/gpu/drm/xe/xe_irq.c | 2 +
> > > > 11 files changed, 360 insertions(+), 1 deletion(-)
> > > > create mode 100644 drivers/gpu/drm/xe/regs/xe_i2c_regs.h
> > > > create mode 100644 drivers/gpu/drm/xe/xe_i2c.c
> > > > create mode 100644 drivers/gpu/drm/xe/xe_i2c.h
> > > >
> > > > diff --git a/drivers/gpu/drm/xe/Kconfig b/drivers/gpu/drm/xe/Kconfig
> > > > index c57f1da0791d..5c162031fc3f 100644
> > > > --- a/drivers/gpu/drm/xe/Kconfig
> > > > +++ b/drivers/gpu/drm/xe/Kconfig
> > > > @@ -44,6 +44,7 @@ config DRM_XE
> > > > select WANT_DEV_COREDUMP
> > > > select AUXILIARY_BUS
> > > > select HMM_MIRROR
> > > > + select REGMAP if I2C
> > > > help
> > > > Experimental driver for Intel Xe series GPUs
> > > >
> > > > diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
> > > > index f5f5775acdc0..293552fc5aaf 100644
> > > > --- a/drivers/gpu/drm/xe/Makefile
> > > > +++ b/drivers/gpu/drm/xe/Makefile
> > > > @@ -124,6 +124,7 @@ xe-y += xe_bb.o \
> > > > xe_wait_user_fence.o \
> > > > xe_wopcm.o
> > > >
> > > > +xe-$(CONFIG_I2C) += xe_i2c.o
> > > > xe-$(CONFIG_HMM_MIRROR) += xe_hmm.o
> > > > xe-$(CONFIG_DRM_XE_GPUSVM) += xe_svm.o
> > > >
> > > > diff --git a/drivers/gpu/drm/xe/regs/xe_i2c_regs.h b/drivers/gpu/drm/xe/regs/xe_i2c_regs.h
> > > > new file mode 100644
> > > > index 000000000000..fa7223e6ce9e
> > > > --- /dev/null
> > > > +++ b/drivers/gpu/drm/xe/regs/xe_i2c_regs.h
> > > > @@ -0,0 +1,15 @@
> > > > +/* SPDX-License-Identifier: GPL-2.0 */
> > > > +#ifndef _XE_I2C_REGS_H_
> > > > +#define _XE_I2C_REGS_H_
> > > > +
> > > > +#include "xe_reg_defs.h"
> > > > +#include "xe_regs.h"
> > > > +
> > > > +#define I2C_CONFIG_SPACE_OFFSET (SOC_BASE + 0xf6000)
> > > > +#define I2C_MEM_SPACE_OFFSET (SOC_BASE + 0xf7400)
> > > > +#define I2C_BRIDGE_OFFSET (SOC_BASE + 0xd9000)
>
> nit: could be sorted out starting with lower offset (bridge)
OK.
> > > > +
> > > > +#define CLIENT_DISC_COOKIE XE_REG(SOC_BASE + 0x0164)
> > > > +#define CLIENT_DISC_ADDRESS XE_REG(SOC_BASE + 0x0168)
>
> why is this named cookie and address?
> Shouldn't it be REG_SG_REMAP_ADDR_PREFIX and REG_SG_REMAP_ADDR_POSTFIX ?
Makes sense to me. I'll change it like that.
> > >
> > > Could you please send me some pointers of the spec for this registers
> > > so I can help on the review here?
> >
> > Done.
> >
> > > > +
> > > > +#endif /* _XE_I2C_REGS_H_ */
> > > > diff --git a/drivers/gpu/drm/xe/regs/xe_irq_regs.h b/drivers/gpu/drm/xe/regs/xe_irq_regs.h
> > > > index f0ecfcac4003..13635e4331d4 100644
> > > > --- a/drivers/gpu/drm/xe/regs/xe_irq_regs.h
> > > > +++ b/drivers/gpu/drm/xe/regs/xe_irq_regs.h
> > > > @@ -19,6 +19,7 @@
> > > > #define MASTER_IRQ REG_BIT(31)
> > > > #define GU_MISC_IRQ REG_BIT(29)
> > > > #define DISPLAY_IRQ REG_BIT(16)
> > > > +#define I2C_IRQ REG_BIT(12)
> > > > #define GT_DW_IRQ(x) REG_BIT(x)
> > > >
> > > > /*
> > > > diff --git a/drivers/gpu/drm/xe/regs/xe_pmt.h b/drivers/gpu/drm/xe/regs/xe_pmt.h
> > > > index b0efd9b48d1e..2995d72c3f78 100644
> > > > --- a/drivers/gpu/drm/xe/regs/xe_pmt.h
> > > > +++ b/drivers/gpu/drm/xe/regs/xe_pmt.h
> > > > @@ -5,7 +5,7 @@
> > > > #ifndef _XE_PMT_H_
> > > > #define _XE_PMT_H_
> > > >
> > > > -#define SOC_BASE 0x280000
> > > > +#include "xe_regs.h"
> > > >
> > > > #define BMG_PMT_BASE_OFFSET 0xDB000
> > > > #define BMG_DISCOVERY_OFFSET (SOC_BASE + BMG_PMT_BASE_OFFSET)
> > > > diff --git a/drivers/gpu/drm/xe/regs/xe_regs.h b/drivers/gpu/drm/xe/regs/xe_regs.h
> > > > index 3abb17d2ca33..1926b4044314 100644
> > > > --- a/drivers/gpu/drm/xe/regs/xe_regs.h
> > > > +++ b/drivers/gpu/drm/xe/regs/xe_regs.h
> > > > @@ -7,6 +7,8 @@
> > > >
> > > > #include "regs/xe_reg_defs.h"
> > > >
> > > > +#define SOC_BASE 0x280000
> > > > +
> > > > #define GU_CNTL_PROTECTED XE_REG(0x10100C)
> > > > #define DRIVERINT_FLR_DIS REG_BIT(31)
> > > >
> > > > diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> > > > index 7e87344943cd..ca098ed532b5 100644
> > > > --- a/drivers/gpu/drm/xe/xe_device.c
> > > > +++ b/drivers/gpu/drm/xe/xe_device.c
> > > > @@ -42,6 +42,7 @@
> > > > #include "xe_guc.h"
> > > > #include "xe_hw_engine_group.h"
> > > > #include "xe_hwmon.h"
> > > > +#include "xe_i2c.h"
> > > > #include "xe_irq.h"
> > > > #include "xe_memirq.h"
> > > > #include "xe_mmio.h"
> > > > @@ -921,6 +922,10 @@ int xe_device_probe(struct xe_device *xe)
> > > > if (err)
> > > > goto err_unregister_display;
> > > >
> > > > + err = xe_i2c_probe(xe);
> > > > + if (err)
> > > > + goto err_unregister_display;
> > > > +
> > > > for_each_gt(gt, xe, id)
> > > > xe_gt_sanitize_freq(gt);
> > > >
> > > > diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
> > > > index ac27389ccb8b..8f3c5ea58034 100644
> > > > --- a/drivers/gpu/drm/xe/xe_device_types.h
> > > > +++ b/drivers/gpu/drm/xe/xe_device_types.h
> > > > @@ -33,6 +33,7 @@
> > > > struct dram_info;
> > > > struct intel_display;
> > > > struct xe_ggtt;
> > > > +struct xe_i2c;
> > > > struct xe_pat_ops;
> > > > struct xe_pxp;
> > > >
> > > > @@ -573,6 +574,9 @@ struct xe_device {
> > > > /** @pmu: performance monitoring unit */
> > > > struct xe_pmu pmu;
> > > >
> > > > + /** @i2c: I2C host controller */
> > > > + struct xe_i2c *i2c;
> > > > +
> > > > /** @atomic_svm_timeslice_ms: Atomic SVM fault timeslice MS */
> > > > u32 atomic_svm_timeslice_ms;
> > > >
> > > > diff --git a/drivers/gpu/drm/xe/xe_i2c.c b/drivers/gpu/drm/xe/xe_i2c.c
> > > > new file mode 100644
> > > > index 000000000000..3d649602ede8
> > > > --- /dev/null
> > > > +++ b/drivers/gpu/drm/xe/xe_i2c.c
> > > > @@ -0,0 +1,270 @@
> > > > +// SPDX-License-Identifier: GPL-2.0
> > >
> > > Does it really need to be GPL or could it be MIT?
> > >
> > > (If you copied code from other files that are GPL, then it needs
> > > to be GPL)
> >
> > Michael, do we need to use GPL here, or is MIT okay?
>
> Mike?!
>
> >
> > > > +/*
> > > > + * Intel Xe I2C attached Microcontroller Units (MCU)
> > > > + *
> > > > + * Copyright (C) 2025 Intel Corporation.
> > > > + */
> > > > +
> > > > +#include <linux/array_size.h>
> > > > +#include <linux/container_of.h>
> > > > +#include <linux/device.h>
> > > > +#include <linux/err.h>
> > > > +#include <linux/i2c.h>
> > > > +#include <linux/ioport.h>
> > > > +#include <linux/irq.h>
> > > > +#include <linux/irqdomain.h>
> > > > +#include <linux/notifier.h>
> > > > +#include <linux/pci.h>
> > > > +#include <linux/platform_device.h>
> > > > +#include <linux/property.h>
> > > > +#include <linux/regmap.h>
> > > > +#include <linux/sprintf.h>
> > > > +#include <linux/string.h>
> > > > +#include <linux/types.h>
> > > > +#include <linux/workqueue.h>
> > > > +
> > > > +#include "regs/xe_i2c_regs.h"
> > > > +#include "regs/xe_irq_regs.h"
> > > > +
> > > > +#include "xe_device.h"
> > > > +#include "xe_device_types.h"
> > > > +#include "xe_i2c.h"
> > > > +#include "xe_mmio.h"
> > > > +#include "xe_platform_types.h"
> > > > +
> > > > +/* Synopsys DesignWare I2C Host Adapter */
> > > > +static const char adapter_name[] = "i2c_designware";
> > > > +
> > > > +static const struct property_entry xe_i2c_adapter_properties[] = {
> > > > + PROPERTY_ENTRY_STRING("compatible", "intel,xe-i2c"),
> > > > + PROPERTY_ENTRY_U32("clock-frequency", I2C_MAX_FAST_MODE_PLUS_FREQ),
> > > > + { }
> > > > +};
> > > > +
> > > > +static inline void xe_i2c_read_endpoint(struct xe_mmio *mmio, void *ep)
> > > > +{
> > > > + u32 *val = ep;
> > > > +
> > > > + val[0] = xe_mmio_read32(mmio, CLIENT_DISC_COOKIE);
> > > > + val[1] = xe_mmio_read32(mmio, CLIENT_DISC_ADDRESS);
> > > > +}
> > > > +
> > > > +static void xe_i2c_client_work(struct work_struct *work)
> > > > +{
> > > > + struct xe_i2c *i2c = container_of(work, struct xe_i2c, work);
> > > > + struct i2c_board_info info = {
> > > > + .type = "amc",
> > > > + .flags = I2C_CLIENT_HOST_NOTIFY,
> > > > + .addr = i2c->ep.addr[1],
> > > > + };
> > > > +
> > > > + i2c->client[0] = i2c_new_client_device(i2c->adapter, &info);
> > > > +}
> > > > +
> > > > +static int xe_i2c_notifier(struct notifier_block *nb, unsigned long action, void *data)
> > > > +{
> > > > + struct xe_i2c *i2c = container_of(nb, struct xe_i2c, bus_notifier);
> > > > + struct i2c_adapter *adapter = i2c_verify_adapter(data);
> > > > + struct device *dev = data;
> > > > +
> > > > + if (action == BUS_NOTIFY_ADD_DEVICE &&
> > > > + adapter && dev->parent == &i2c->pdev->dev) {
> > > > + i2c->adapter = adapter;
> > > > + schedule_work(&i2c->work);
> > > > + return NOTIFY_OK;
> > > > + }
> > > > +
> > > > + return NOTIFY_DONE;
> > > > +}
> > > > +
> > > > +static int xe_i2c_register_adapter(struct xe_i2c *i2c)
> > > > +{
> > > > + struct pci_dev *pci = to_pci_dev(i2c->drm_dev);
> > > > + struct platform_device *pdev;
> > > > + struct fwnode_handle *fwnode;
> > > > + int ret;
> > > > +
> > > > + fwnode = fwnode_create_software_node(xe_i2c_adapter_properties, NULL);
> > > > + if (!fwnode)
> > > > + return -ENOMEM;
> > > > +
> > > > + /*
> > > > + * Not using platform_device_register_full() here because we don't have
> > > > + * a handle to the platform_device before it returns. xe_i2c_notifier()
> > > > + * uses that handle, but it may be called before
> > > > + * platform_device_register_full() is done.
> > > > + */
> > > > + pdev = platform_device_alloc(adapter_name, pci_dev_id(pci));
> > > > + if (!pdev) {
> > > > + ret = -ENOMEM;
> > > > + goto err_fwnode_remove;
> > > > + }
> > > > +
> > > > + if (i2c->adapter_irq) {
> > > > + struct resource res = { };
> > > > +
> > > > + res.start = i2c->adapter_irq;
> > > > + res.name = "xe_i2c";
> > > > + res.flags = IORESOURCE_IRQ;
> > > > +
> > > > + ret = platform_device_add_resources(pdev, &res, 1);
> > > > + if (ret)
> > > > + goto err_pdev_put;
> > > > + }
> > > > +
> > > > + pdev->dev.parent = i2c->drm_dev;
> > > > + pdev->dev.fwnode = fwnode;
> > > > + i2c->adapter_node = fwnode;
> > > > + i2c->pdev = pdev;
> > > > +
> > > > + ret = platform_device_add(pdev);
> > > > + if (ret)
> > > > + goto err_pdev_put;
> > > > +
> > > > + return 0;
> > > > +
> > > > +err_pdev_put:
> > > > + platform_device_put(pdev);
> > > > +err_fwnode_remove:
> > > > + fwnode_remove_software_node(fwnode);
> > > > +
> > > > + return ret;
> > > > +}
> > > > +
> > > > +static void xe_i2c_unregister_adapter(struct xe_i2c *i2c)
> > > > +{
> > > > + platform_device_unregister(i2c->pdev);
> > > > + fwnode_remove_software_node(i2c->adapter_node);
> > > > +}
> > > > +
> > > > +void xe_i2c_irq_handler(struct xe_device *xe, u32 master_ctl)
> > > > +{
> > > > + if (!xe->i2c || !xe->i2c->adapter_irq)
> > > > + return;
> > > > +
> > > > + if (master_ctl & I2C_IRQ)
> > > > + generic_handle_irq_safe(xe->i2c->adapter_irq);
> > > > +}
> > > > +
> > > > +static int xe_i2c_irq_map(struct irq_domain *h, unsigned int virq,
> > > > + irq_hw_number_t hw_irq_num)
> > > > +{
> > > > + irq_set_chip_and_handler(virq, &dummy_irq_chip, handle_simple_irq);
> > > > + return 0;
> > > > +}
> > > > +
> > > > +static const struct irq_domain_ops xe_i2c_irq_ops = {
> > > > + .map = xe_i2c_irq_map,
> > > > +};
> > > > +
> > > > +static int xe_i2c_create_irq(struct xe_i2c *i2c)
> > > > +{
> > > > + struct irq_domain *domain;
> > > > +
> > > > + if (!(i2c->ep.capabilities & XE_I2C_EP_CAP_IRQ))
> > > > + return 0;
> > > > +
> > > > + domain = irq_domain_create_linear(dev_fwnode(i2c->drm_dev), 1, &xe_i2c_irq_ops, NULL);
> > > > + if (!domain)
> > > > + return -ENOMEM;
> > > > +
> > > > + i2c->adapter_irq = irq_create_mapping(domain, 0);
> > > > + i2c->irqdomain = domain;
> > > > +
> > > > + return 0;
> > > > +}
> > > > +
> > > > +static void xe_i2c_remove_irq(struct xe_i2c *i2c)
> > > > +{
> > > > + if (i2c->irqdomain) {
> > > > + irq_dispose_mapping(i2c->adapter_irq);
> > > > + irq_domain_remove(i2c->irqdomain);
> > > > + }
> > > > +}
> > > > +
> > > > +static int xe_i2c_read(void *context, unsigned int reg, unsigned int *val)
> > > > +{
> > > > + struct xe_i2c *i2c = context;
> > > > +
> > > > + *val = xe_mmio_read32(i2c->mmio, XE_REG(reg + I2C_MEM_SPACE_OFFSET));
> > > > +
> > > > + return 0;
> > > > +}
> > > > +
> > > > +static int xe_i2c_write(void *context, unsigned int reg, unsigned int val)
> > > > +{
> > > > + struct xe_i2c *i2c = context;
> > > > +
> > > > + xe_mmio_write32(i2c->mmio, XE_REG(reg + I2C_MEM_SPACE_OFFSET), val);
> > > > +
> > > > + return 0;
> > > > +}
> > > > +
> > > > +static const struct regmap_config i2c_regmap_config = {
> > > > + .reg_bits = 32,
> > > > + .val_bits = 32,
> > > > + .reg_read = xe_i2c_read,
> > > > + .reg_write = xe_i2c_write,
> > > > + .fast_io = true,
> > > > +};
> > > > +
> > > > +static void xe_i2c_remove(void *data)
> > > > +{
> > > > + struct xe_i2c *i2c = data;
> > > > + int i;
> > > > +
> > > > + for (i = 0; i < XE_I2C_MAX_CLIENTS; i++)
> > > > + i2c_unregister_device(i2c->client[i]);
> > > > +
> > > > + bus_unregister_notifier(&i2c_bus_type, &i2c->bus_notifier);
> > > > + xe_i2c_unregister_adapter(i2c);
> > > > + xe_i2c_remove_irq(i2c);
> > > > +}
> > > > +
> > > > +int xe_i2c_probe(struct xe_device *xe)
> > >
> > > could you please add some /** DOC: Xe i2c ... above
> > > and then add some doc to the exported functions?
> >
> > Sure thing. But just to be clear to everyone, there no are exported
> > functions here (global but not exported).
>
> sorry for my terminology confusion, but I meant global. Accessible by
> other xe_ components. We try to keep all the internal abi documented
> to help future developers touching the same code later.
Got it. I'll add the documentation.
thanks,
--
heikki
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v3 3/4] drm/xe/pm: Wire up suspend/resume for I2C controller
2025-06-12 13:24 [PATCH v3 0/4] drm/xe: i2c support Heikki Krogerus
2025-06-12 13:24 ` [PATCH v3 1/4] i2c: designware: Add quirk for Intel Xe Heikki Krogerus
2025-06-12 13:24 ` [PATCH v3 2/4] drm/xe: Support for I2C attached MCUs Heikki Krogerus
@ 2025-06-12 13:24 ` Heikki Krogerus
2025-06-12 13:24 ` [PATCH v3 4/4] drm/xe/xe_i2c: Add support for i2c in survivability mode Heikki Krogerus
` (4 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Heikki Krogerus @ 2025-06-12 13:24 UTC (permalink / raw)
To: Lucas De Marchi, Thomas Hellström, Rodrigo Vivi,
Jarkko Nikula
Cc: David Airlie, Simona Vetter, Andy Shevchenko, Mika Westerberg,
Jan Dabros, Andi Shyti, Raag Jadav, Tauro, Riana,
Adatrao, Srinivasa, Michael J. Ruhl, intel-xe, linux-i2c,
linux-kernel, Karthik Poosa
From: Raag Jadav <raag.jadav@intel.com>
Wire up suspend/resume handles for I2C controller to match its power
state with SGUnit.
Signed-off-by: Raag Jadav <raag.jadav@intel.com>
Reviewed-by: Karthik Poosa <karthik.poosa@intel.com>
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
---
drivers/gpu/drm/xe/regs/xe_i2c_regs.h | 5 +++++
drivers/gpu/drm/xe/xe_i2c.c | 29 +++++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_i2c.h | 4 ++++
drivers/gpu/drm/xe/xe_pm.c | 9 +++++++++
4 files changed, 47 insertions(+)
diff --git a/drivers/gpu/drm/xe/regs/xe_i2c_regs.h b/drivers/gpu/drm/xe/regs/xe_i2c_regs.h
index fa7223e6ce9e..27f9935fd8fd 100644
--- a/drivers/gpu/drm/xe/regs/xe_i2c_regs.h
+++ b/drivers/gpu/drm/xe/regs/xe_i2c_regs.h
@@ -2,6 +2,8 @@
#ifndef _XE_I2C_REGS_H_
#define _XE_I2C_REGS_H_
+#include <linux/pci_regs.h>
+
#include "xe_reg_defs.h"
#include "xe_regs.h"
@@ -12,4 +14,7 @@
#define CLIENT_DISC_COOKIE XE_REG(SOC_BASE + 0x0164)
#define CLIENT_DISC_ADDRESS XE_REG(SOC_BASE + 0x0168)
+#define I2C_CONFIG_CMD XE_REG(I2C_CONFIG_SPACE_OFFSET + PCI_COMMAND)
+#define I2C_CONFIG_PMCSR XE_REG(I2C_CONFIG_SPACE_OFFSET + 0x84)
+
#endif /* _XE_I2C_REGS_H_ */
diff --git a/drivers/gpu/drm/xe/xe_i2c.c b/drivers/gpu/drm/xe/xe_i2c.c
index 3d649602ede8..59bdf28717bc 100644
--- a/drivers/gpu/drm/xe/xe_i2c.c
+++ b/drivers/gpu/drm/xe/xe_i2c.c
@@ -208,6 +208,31 @@ static const struct regmap_config i2c_regmap_config = {
.fast_io = true,
};
+void xe_i2c_pm_suspend(struct xe_device *xe)
+{
+ struct xe_mmio *mmio = xe_root_tile_mmio(xe);
+
+ if (!xe->i2c || xe->i2c->ep.cookie != XE_I2C_EP_COOKIE_DEVICE)
+ return;
+
+ xe_mmio_rmw32(mmio, I2C_CONFIG_PMCSR, PCI_PM_CTRL_STATE_MASK, PCI_D3hot);
+ drm_dbg(&xe->drm, "pmcsr: 0x%08x\n", xe_mmio_read32(mmio, I2C_CONFIG_PMCSR));
+}
+
+void xe_i2c_pm_resume(struct xe_device *xe, bool d3cold)
+{
+ struct xe_mmio *mmio = xe_root_tile_mmio(xe);
+
+ if (!xe->i2c || xe->i2c->ep.cookie != XE_I2C_EP_COOKIE_DEVICE)
+ return;
+
+ if (d3cold)
+ xe_mmio_rmw32(mmio, I2C_CONFIG_CMD, 0, PCI_COMMAND_MEMORY);
+
+ xe_mmio_rmw32(mmio, I2C_CONFIG_PMCSR, PCI_PM_CTRL_STATE_MASK, PCI_D0);
+ drm_dbg(&xe->drm, "pmcsr: 0x%08x\n", xe_mmio_read32(mmio, I2C_CONFIG_PMCSR));
+}
+
static void xe_i2c_remove(void *data)
{
struct xe_i2c *i2c = data;
@@ -240,6 +265,10 @@ int xe_i2c_probe(struct xe_device *xe)
i2c->mmio = xe_root_tile_mmio(xe);
i2c->drm_dev = xe->drm.dev;
i2c->ep = ep;
+ xe->i2c = i2c;
+
+ /* PCI PM isn't aware of this device, bring it up and match it with SGUnit state. */
+ xe_i2c_pm_resume(xe, true);
regmap = devm_regmap_init(i2c->drm_dev, NULL, i2c, &i2c_regmap_config);
if (IS_ERR(regmap))
diff --git a/drivers/gpu/drm/xe/xe_i2c.h b/drivers/gpu/drm/xe/xe_i2c.h
index e88845be61b4..3b1208416bde 100644
--- a/drivers/gpu/drm/xe/xe_i2c.h
+++ b/drivers/gpu/drm/xe/xe_i2c.h
@@ -50,9 +50,13 @@ struct xe_i2c {
#if IS_ENABLED(CONFIG_I2C)
int xe_i2c_probe(struct xe_device *xe);
void xe_i2c_irq_handler(struct xe_device *xe, u32 master_ctl);
+void xe_i2c_pm_suspend(struct xe_device *xe);
+void xe_i2c_pm_resume(struct xe_device *xe, bool d3cold);
#else
static inline int xe_i2c_probe(struct xe_device *xe) { return 0; }
static inline void xe_i2c_irq_handler(struct xe_device *xe, u32 master_ctl) { }
+static inline void xe_i2c_pm_suspend(struct xe_device *xe) { }
+static inline void xe_i2c_pm_resume(struct xe_device *xe, bool d3cold) { }
#endif
#endif
diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
index 26e95460af87..46471e166b96 100644
--- a/drivers/gpu/drm/xe/xe_pm.c
+++ b/drivers/gpu/drm/xe/xe_pm.c
@@ -19,6 +19,7 @@
#include "xe_ggtt.h"
#include "xe_gt.h"
#include "xe_guc.h"
+#include "xe_i2c.h"
#include "xe_irq.h"
#include "xe_pcode.h"
#include "xe_pxp.h"
@@ -146,6 +147,8 @@ int xe_pm_suspend(struct xe_device *xe)
xe_display_pm_suspend_late(xe);
+ xe_i2c_pm_suspend(xe);
+
drm_dbg(&xe->drm, "Device suspended\n");
return 0;
@@ -191,6 +194,8 @@ int xe_pm_resume(struct xe_device *xe)
if (err)
goto err;
+ xe_i2c_pm_resume(xe, xe->d3cold.allowed);
+
xe_irq_resume(xe);
for_each_gt(gt, xe, id)
@@ -484,6 +489,8 @@ int xe_pm_runtime_suspend(struct xe_device *xe)
xe_display_pm_runtime_suspend_late(xe);
+ xe_i2c_pm_suspend(xe);
+
xe_rpm_lockmap_release(xe);
xe_pm_write_callback_task(xe, NULL);
return 0;
@@ -531,6 +538,8 @@ int xe_pm_runtime_resume(struct xe_device *xe)
goto out;
}
+ xe_i2c_pm_resume(xe, xe->d3cold.allowed);
+
xe_irq_resume(xe);
for_each_gt(gt, xe, id)
--
2.47.2
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v3 4/4] drm/xe/xe_i2c: Add support for i2c in survivability mode
2025-06-12 13:24 [PATCH v3 0/4] drm/xe: i2c support Heikki Krogerus
` (2 preceding siblings ...)
2025-06-12 13:24 ` [PATCH v3 3/4] drm/xe/pm: Wire up suspend/resume for I2C controller Heikki Krogerus
@ 2025-06-12 13:24 ` Heikki Krogerus
2025-06-12 15:16 ` ✗ CI.checkpatch: warning for drm/xe: i2c support (rev3) Patchwork
` (3 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Heikki Krogerus @ 2025-06-12 13:24 UTC (permalink / raw)
To: Lucas De Marchi, Thomas Hellström, Rodrigo Vivi,
Jarkko Nikula
Cc: David Airlie, Simona Vetter, Andy Shevchenko, Mika Westerberg,
Jan Dabros, Andi Shyti, Raag Jadav, Tauro, Riana,
Adatrao, Srinivasa, Michael J. Ruhl, intel-xe, linux-i2c,
linux-kernel
From: Riana Tauro <riana.tauro@intel.com>
Initialize i2c in survivability mode to allow firmware
update of Add-In Management Controller (AMC) in survivability mode
Signed-off-by: Riana Tauro <riana.tauro@intel.com>
Reviewed-by: Raag Jadav <raag.jadav@intel.com>
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
---
drivers/gpu/drm/xe/xe_survivability_mode.c | 23 ++++++++++++++--------
1 file changed, 15 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_survivability_mode.c b/drivers/gpu/drm/xe/xe_survivability_mode.c
index 1f710b3fc599..3800cc855c22 100644
--- a/drivers/gpu/drm/xe/xe_survivability_mode.c
+++ b/drivers/gpu/drm/xe/xe_survivability_mode.c
@@ -14,6 +14,7 @@
#include "xe_device.h"
#include "xe_gt.h"
#include "xe_heci_gsc.h"
+#include "xe_i2c.h"
#include "xe_mmio.h"
#include "xe_pcode_api.h"
#include "xe_vsec.h"
@@ -173,20 +174,26 @@ static int enable_survivability_mode(struct pci_dev *pdev)
survivability->mode = true;
ret = xe_heci_gsc_init(xe);
- if (ret) {
- /*
- * But if it fails, device can't enter survivability
- * so move it back for correct error handling
- */
- survivability->mode = false;
- return ret;
- }
+ if (ret)
+ goto err;
xe_vsec_init(xe);
+ ret = xe_i2c_probe(xe);
+ if (ret)
+ goto err;
+
dev_err(dev, "In Survivability Mode\n");
return 0;
+
+err:
+ /*
+ * But if it fails, device can't enter survivability
+ * so move it back for correct error handling
+ */
+ survivability->mode = false;
+ return ret;
}
/**
--
2.47.2
^ permalink raw reply related [flat|nested] 13+ messages in thread* ✗ CI.checkpatch: warning for drm/xe: i2c support (rev3)
2025-06-12 13:24 [PATCH v3 0/4] drm/xe: i2c support Heikki Krogerus
` (3 preceding siblings ...)
2025-06-12 13:24 ` [PATCH v3 4/4] drm/xe/xe_i2c: Add support for i2c in survivability mode Heikki Krogerus
@ 2025-06-12 15:16 ` Patchwork
2025-06-12 15:17 ` ✓ CI.KUnit: success " Patchwork
` (2 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Patchwork @ 2025-06-12 15:16 UTC (permalink / raw)
To: Heikki Krogerus; +Cc: intel-xe
== Series Details ==
Series: drm/xe: i2c support (rev3)
URL : https://patchwork.freedesktop.org/series/149699/
State : warning
== Summary ==
+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt
Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master
202708c00696422fd217223bb679a353a5936e23
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 393b7db20f78e15fce71a55bfcc3d1e656203289
Author: Riana Tauro <riana.tauro@intel.com>
Date: Thu Jun 12 16:24:50 2025 +0300
drm/xe/xe_i2c: Add support for i2c in survivability mode
Initialize i2c in survivability mode to allow firmware
update of Add-In Management Controller (AMC) in survivability mode
Signed-off-by: Riana Tauro <riana.tauro@intel.com>
Reviewed-by: Raag Jadav <raag.jadav@intel.com>
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
+ /mt/dim checkpatch b5ef50f5d944d569d6eda26728bffb78c4ef6fa2 drm-intel
321578611b90 i2c: designware: Add quirk for Intel Xe
-:9: WARNING:BAD_SIGN_OFF: Non-standard signature: Originally-by:
#9:
Originally-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
total: 0 errors, 1 warnings, 0 checks, 56 lines checked
84315d32ec99 drm/xe: Support for I2C attached MCUs
-:14: WARNING:BAD_SIGN_OFF: Non-standard signature: Originally-by:
#14:
Originally-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
-:42: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#42:
new file mode 100644
total: 0 errors, 2 warnings, 0 checks, 427 lines checked
20f667ef4078 drm/xe/pm: Wire up suspend/resume for I2C controller
393b7db20f78 drm/xe/xe_i2c: Add support for i2c in survivability mode
^ permalink raw reply [flat|nested] 13+ messages in thread* ✓ CI.KUnit: success for drm/xe: i2c support (rev3)
2025-06-12 13:24 [PATCH v3 0/4] drm/xe: i2c support Heikki Krogerus
` (4 preceding siblings ...)
2025-06-12 15:16 ` ✗ CI.checkpatch: warning for drm/xe: i2c support (rev3) Patchwork
@ 2025-06-12 15:17 ` Patchwork
2025-06-12 16:39 ` ✗ Xe.CI.BAT: failure " Patchwork
2025-06-13 4:47 ` ✗ Xe.CI.Full: " Patchwork
7 siblings, 0 replies; 13+ messages in thread
From: Patchwork @ 2025-06-12 15:17 UTC (permalink / raw)
To: Heikki Krogerus; +Cc: intel-xe
== Series Details ==
Series: drm/xe: i2c support (rev3)
URL : https://patchwork.freedesktop.org/series/149699/
State : success
== Summary ==
+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[15:16:07] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[15:16:11] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[15:16:39] Starting KUnit Kernel (1/1)...
[15:16:39] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[15:16:39] ================== guc_buf (11 subtests) ===================
[15:16:39] [PASSED] test_smallest
[15:16:39] [PASSED] test_largest
[15:16:39] [PASSED] test_granular
[15:16:39] [PASSED] test_unique
[15:16:39] [PASSED] test_overlap
[15:16:39] [PASSED] test_reusable
[15:16:39] [PASSED] test_too_big
[15:16:39] [PASSED] test_flush
[15:16:39] [PASSED] test_lookup
[15:16:39] [PASSED] test_data
[15:16:39] [PASSED] test_class
[15:16:39] ===================== [PASSED] guc_buf =====================
[15:16:39] =================== guc_dbm (7 subtests) ===================
[15:16:39] [PASSED] test_empty
[15:16:39] [PASSED] test_default
[15:16:39] ======================== test_size ========================
[15:16:39] [PASSED] 4
[15:16:39] [PASSED] 8
[15:16:39] [PASSED] 32
[15:16:39] [PASSED] 256
[15:16:39] ==================== [PASSED] test_size ====================
[15:16:39] ======================= test_reuse ========================
[15:16:39] [PASSED] 4
[15:16:39] [PASSED] 8
[15:16:39] [PASSED] 32
[15:16:39] [PASSED] 256
[15:16:39] =================== [PASSED] test_reuse ====================
[15:16:39] =================== test_range_overlap ====================
[15:16:39] [PASSED] 4
[15:16:39] [PASSED] 8
[15:16:39] [PASSED] 32
[15:16:39] [PASSED] 256
[15:16:39] =============== [PASSED] test_range_overlap ================
[15:16:39] =================== test_range_compact ====================
[15:16:39] [PASSED] 4
[15:16:39] [PASSED] 8
[15:16:39] [PASSED] 32
[15:16:39] [PASSED] 256
[15:16:39] =============== [PASSED] test_range_compact ================
[15:16:39] ==================== test_range_spare =====================
[15:16:39] [PASSED] 4
[15:16:39] [PASSED] 8
[15:16:39] [PASSED] 32
[15:16:39] [PASSED] 256
[15:16:39] ================ [PASSED] test_range_spare =================
[15:16:39] ===================== [PASSED] guc_dbm =====================
[15:16:39] =================== guc_idm (6 subtests) ===================
[15:16:39] [PASSED] bad_init
[15:16:39] [PASSED] no_init
[15:16:39] [PASSED] init_fini
[15:16:39] [PASSED] check_used
[15:16:39] [PASSED] check_quota
[15:16:39] [PASSED] check_all
[15:16:39] ===================== [PASSED] guc_idm =====================
[15:16:39] ================== no_relay (3 subtests) ===================
[15:16:39] [PASSED] xe_drops_guc2pf_if_not_ready
[15:16:39] [PASSED] xe_drops_guc2vf_if_not_ready
[15:16:39] [PASSED] xe_rejects_send_if_not_ready
[15:16:39] ==================== [PASSED] no_relay =====================
[15:16:39] ================== pf_relay (14 subtests) ==================
[15:16:39] [PASSED] pf_rejects_guc2pf_too_short
[15:16:39] [PASSED] pf_rejects_guc2pf_too_long
[15:16:39] [PASSED] pf_rejects_guc2pf_no_payload
[15:16:39] [PASSED] pf_fails_no_payload
[15:16:39] [PASSED] pf_fails_bad_origin
[15:16:39] [PASSED] pf_fails_bad_type
[15:16:39] [PASSED] pf_txn_reports_error
[15:16:39] [PASSED] pf_txn_sends_pf2guc
[15:16:39] [PASSED] pf_sends_pf2guc
[15:16:39] [SKIPPED] pf_loopback_nop
[15:16:39] [SKIPPED] pf_loopback_echo
[15:16:39] [SKIPPED] pf_loopback_fail
[15:16:39] [SKIPPED] pf_loopback_busy
[15:16:39] [SKIPPED] pf_loopback_retry
[15:16:39] ==================== [PASSED] pf_relay =====================
[15:16:39] ================== vf_relay (3 subtests) ===================
[15:16:39] [PASSED] vf_rejects_guc2vf_too_short
[15:16:39] [PASSED] vf_rejects_guc2vf_too_long
[15:16:39] [PASSED] vf_rejects_guc2vf_no_payload
[15:16:39] ==================== [PASSED] vf_relay =====================
[15:16:39] ================= pf_service (11 subtests) =================
[15:16:39] [PASSED] pf_negotiate_any
[15:16:39] [PASSED] pf_negotiate_base_match
[15:16:39] [PASSED] pf_negotiate_base_newer
[15:16:39] [PASSED] pf_negotiate_base_next
[15:16:39] [SKIPPED] pf_negotiate_base_older
[15:16:39] [PASSED] pf_negotiate_base_prev
[15:16:39] [PASSED] pf_negotiate_latest_match
[15:16:39] [PASSED] pf_negotiate_latest_newer
[15:16:39] [PASSED] pf_negotiate_latest_next
[15:16:39] [SKIPPED] pf_negotiate_latest_older
[15:16:39] [SKIPPED] pf_negotiate_latest_prev
[15:16:39] =================== [PASSED] pf_service ====================
[15:16:39] ===================== lmtt (1 subtest) =====================
[15:16:39] ======================== test_ops =========================
[15:16:39] [PASSED] 2-level
[15:16:39] [PASSED] multi-level
[15:16:39] ==================== [PASSED] test_ops =====================
[15:16:39] ====================== [PASSED] lmtt =======================
[15:16:39] =================== xe_mocs (2 subtests) ===================
[15:16:39] ================ xe_live_mocs_kernel_kunit ================
[15:16:39] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[15:16:39] ================ xe_live_mocs_reset_kunit =================
[15:16:39] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[15:16:39] ==================== [SKIPPED] xe_mocs =====================
[15:16:39] ================= xe_migrate (2 subtests) ==================
[15:16:39] ================= xe_migrate_sanity_kunit =================
[15:16:39] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[15:16:39] ================== xe_validate_ccs_kunit ==================
[15:16:39] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[15:16:39] =================== [SKIPPED] xe_migrate ===================
[15:16:39] ================== xe_dma_buf (1 subtest) ==================
[15:16:39] ==================== xe_dma_buf_kunit =====================
[15:16:39] ================ [SKIPPED] xe_dma_buf_kunit ================
[15:16:39] =================== [SKIPPED] xe_dma_buf ===================
[15:16:39] ================= xe_bo_shrink (1 subtest) =================
[15:16:39] =================== xe_bo_shrink_kunit ====================
[15:16:39] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[15:16:39] ================== [SKIPPED] xe_bo_shrink ==================
[15:16:39] ==================== xe_bo (2 subtests) ====================
[15:16:39] ================== xe_ccs_migrate_kunit ===================
[15:16:39] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[15:16:39] ==================== xe_bo_evict_kunit ====================
[15:16:39] =============== [SKIPPED] xe_bo_evict_kunit ================
[15:16:39] ===================== [SKIPPED] xe_bo ======================
[15:16:39] ==================== args (11 subtests) ====================
[15:16:39] [PASSED] count_args_test
[15:16:39] [PASSED] call_args_example
[15:16:39] [PASSED] call_args_test
[15:16:39] [PASSED] drop_first_arg_example
[15:16:39] [PASSED] drop_first_arg_test
[15:16:39] [PASSED] first_arg_example
[15:16:39] [PASSED] first_arg_test
[15:16:39] [PASSED] last_arg_example
[15:16:39] [PASSED] last_arg_test
[15:16:39] [PASSED] pick_arg_example
[15:16:39] [PASSED] sep_comma_example
[15:16:39] ====================== [PASSED] args =======================
[15:16:39] =================== xe_pci (2 subtests) ====================
[15:16:39] [PASSED] xe_gmdid_graphics_ip
[15:16:39] [PASSED] xe_gmdid_media_ip
[15:16:39] ===================== [PASSED] xe_pci ======================
[15:16:39] =================== xe_rtp (2 subtests) ====================
[15:16:39] =============== xe_rtp_process_to_sr_tests ================
[15:16:39] [PASSED] coalesce-same-reg
[15:16:39] [PASSED] no-match-no-add
[15:16:39] [PASSED] match-or
[15:16:39] [PASSED] match-or-xfail
[15:16:39] [PASSED] no-match-no-add-multiple-rules
[15:16:39] [PASSED] two-regs-two-entries
[15:16:39] [PASSED] clr-one-set-other
[15:16:39] [PASSED] set-field
[15:16:39] [PASSED] conflict-duplicate
[15:16:39] [PASSED] conflict-not-disjoint
stty: 'standard input': Inappropriate ioctl for device
[15:16:39] [PASSED] conflict-reg-type
[15:16:39] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[15:16:39] ================== xe_rtp_process_tests ===================
[15:16:39] [PASSED] active1
[15:16:39] [PASSED] active2
[15:16:39] [PASSED] active-inactive
[15:16:39] [PASSED] inactive-active
[15:16:39] [PASSED] inactive-1st_or_active-inactive
[15:16:39] [PASSED] inactive-2nd_or_active-inactive
[15:16:39] [PASSED] inactive-last_or_active-inactive
[15:16:39] [PASSED] inactive-no_or_active-inactive
[15:16:39] ============== [PASSED] xe_rtp_process_tests ===============
[15:16:39] ===================== [PASSED] xe_rtp ======================
[15:16:39] ==================== xe_wa (1 subtest) =====================
[15:16:39] ======================== xe_wa_gt =========================
[15:16:39] [PASSED] TIGERLAKE (B0)
[15:16:39] [PASSED] DG1 (A0)
[15:16:39] [PASSED] DG1 (B0)
[15:16:39] [PASSED] ALDERLAKE_S (A0)
[15:16:39] [PASSED] ALDERLAKE_S (B0)
[15:16:39] [PASSED] ALDERLAKE_S (C0)
[15:16:39] [PASSED] ALDERLAKE_S (D0)
[15:16:39] [PASSED] ALDERLAKE_P (A0)
[15:16:39] [PASSED] ALDERLAKE_P (B0)
[15:16:39] [PASSED] ALDERLAKE_P (C0)
[15:16:39] [PASSED] ALDERLAKE_S_RPLS (D0)
[15:16:39] [PASSED] ALDERLAKE_P_RPLU (E0)
[15:16:39] [PASSED] DG2_G10 (C0)
[15:16:39] [PASSED] DG2_G11 (B1)
[15:16:39] [PASSED] DG2_G12 (A1)
[15:16:39] [PASSED] METEORLAKE (g:A0, m:A0)
[15:16:39] [PASSED] METEORLAKE (g:A0, m:A0)
[15:16:39] [PASSED] METEORLAKE (g:A0, m:A0)
[15:16:39] [PASSED] LUNARLAKE (g:A0, m:A0)
[15:16:39] [PASSED] LUNARLAKE (g:B0, m:A0)
[15:16:39] [PASSED] BATTLEMAGE (g:A0, m:A1)
[15:16:39] ==================== [PASSED] xe_wa_gt =====================
[15:16:39] ====================== [PASSED] xe_wa ======================
[15:16:39] ============================================================
[15:16:39] Testing complete. Ran 133 tests: passed: 117, skipped: 16
[15:16:39] Elapsed time: 31.764s total, 4.135s configuring, 27.312s building, 0.295s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[15:16:39] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[15:16:41] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[15:17:02] Starting KUnit Kernel (1/1)...
[15:17:02] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[15:17:02] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[15:17:02] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[15:17:02] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[15:17:02] =========== drm_validate_clone_mode (2 subtests) ===========
[15:17:02] ============== drm_test_check_in_clone_mode ===============
[15:17:02] [PASSED] in_clone_mode
[15:17:02] [PASSED] not_in_clone_mode
[15:17:02] ========== [PASSED] drm_test_check_in_clone_mode ===========
[15:17:02] =============== drm_test_check_valid_clones ===============
[15:17:02] [PASSED] not_in_clone_mode
[15:17:02] [PASSED] valid_clone
[15:17:02] [PASSED] invalid_clone
[15:17:02] =========== [PASSED] drm_test_check_valid_clones ===========
[15:17:02] ============= [PASSED] drm_validate_clone_mode =============
[15:17:02] ============= drm_validate_modeset (1 subtest) =============
[15:17:02] [PASSED] drm_test_check_connector_changed_modeset
[15:17:02] ============== [PASSED] drm_validate_modeset ===============
[15:17:02] ====== drm_test_bridge_get_current_state (2 subtests) ======
[15:17:02] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[15:17:02] [PASSED] drm_test_drm_bridge_get_current_state_legacy
[15:17:02] ======== [PASSED] drm_test_bridge_get_current_state ========
[15:17:02] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[15:17:02] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[15:17:02] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[15:17:02] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy
[15:17:02] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[15:17:02] ============== drm_bridge_alloc (2 subtests) ===============
[15:17:02] [PASSED] drm_test_drm_bridge_alloc_basic
[15:17:02] [PASSED] drm_test_drm_bridge_alloc_get_put
[15:17:02] ================ [PASSED] drm_bridge_alloc =================
[15:17:02] ================== drm_buddy (7 subtests) ==================
[15:17:02] [PASSED] drm_test_buddy_alloc_limit
[15:17:02] [PASSED] drm_test_buddy_alloc_optimistic
[15:17:02] [PASSED] drm_test_buddy_alloc_pessimistic
[15:17:02] [PASSED] drm_test_buddy_alloc_pathological
[15:17:02] [PASSED] drm_test_buddy_alloc_contiguous
[15:17:02] [PASSED] drm_test_buddy_alloc_clear
[15:17:02] [PASSED] drm_test_buddy_alloc_range_bias
[15:17:02] ==================== [PASSED] drm_buddy ====================
[15:17:02] ============= drm_cmdline_parser (40 subtests) =============
[15:17:02] [PASSED] drm_test_cmdline_force_d_only
[15:17:02] [PASSED] drm_test_cmdline_force_D_only_dvi
[15:17:02] [PASSED] drm_test_cmdline_force_D_only_hdmi
[15:17:02] [PASSED] drm_test_cmdline_force_D_only_not_digital
[15:17:02] [PASSED] drm_test_cmdline_force_e_only
[15:17:02] [PASSED] drm_test_cmdline_res
[15:17:02] [PASSED] drm_test_cmdline_res_vesa
[15:17:02] [PASSED] drm_test_cmdline_res_vesa_rblank
[15:17:02] [PASSED] drm_test_cmdline_res_rblank
[15:17:02] [PASSED] drm_test_cmdline_res_bpp
[15:17:02] [PASSED] drm_test_cmdline_res_refresh
[15:17:02] [PASSED] drm_test_cmdline_res_bpp_refresh
[15:17:02] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[15:17:02] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[15:17:02] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[15:17:02] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[15:17:02] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[15:17:02] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[15:17:02] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[15:17:02] [PASSED] drm_test_cmdline_res_margins_force_on
[15:17:02] [PASSED] drm_test_cmdline_res_vesa_margins
[15:17:02] [PASSED] drm_test_cmdline_name
[15:17:02] [PASSED] drm_test_cmdline_name_bpp
[15:17:02] [PASSED] drm_test_cmdline_name_option
[15:17:02] [PASSED] drm_test_cmdline_name_bpp_option
[15:17:02] [PASSED] drm_test_cmdline_rotate_0
[15:17:02] [PASSED] drm_test_cmdline_rotate_90
[15:17:02] [PASSED] drm_test_cmdline_rotate_180
[15:17:02] [PASSED] drm_test_cmdline_rotate_270
[15:17:02] [PASSED] drm_test_cmdline_hmirror
[15:17:02] [PASSED] drm_test_cmdline_vmirror
[15:17:02] [PASSED] drm_test_cmdline_margin_options
[15:17:02] [PASSED] drm_test_cmdline_multiple_options
[15:17:02] [PASSED] drm_test_cmdline_bpp_extra_and_option
[15:17:02] [PASSED] drm_test_cmdline_extra_and_option
[15:17:02] [PASSED] drm_test_cmdline_freestanding_options
[15:17:02] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[15:17:02] [PASSED] drm_test_cmdline_panel_orientation
[15:17:02] ================ drm_test_cmdline_invalid =================
[15:17:02] [PASSED] margin_only
[15:17:02] [PASSED] interlace_only
[15:17:02] [PASSED] res_missing_x
[15:17:02] [PASSED] res_missing_y
[15:17:02] [PASSED] res_bad_y
[15:17:02] [PASSED] res_missing_y_bpp
[15:17:02] [PASSED] res_bad_bpp
[15:17:02] [PASSED] res_bad_refresh
[15:17:02] [PASSED] res_bpp_refresh_force_on_off
[15:17:02] [PASSED] res_invalid_mode
[15:17:02] [PASSED] res_bpp_wrong_place_mode
[15:17:02] [PASSED] name_bpp_refresh
[15:17:02] [PASSED] name_refresh
[15:17:02] [PASSED] name_refresh_wrong_mode
[15:17:02] [PASSED] name_refresh_invalid_mode
[15:17:02] [PASSED] rotate_multiple
[15:17:02] [PASSED] rotate_invalid_val
[15:17:02] [PASSED] rotate_truncated
[15:17:02] [PASSED] invalid_option
[15:17:02] [PASSED] invalid_tv_option
[15:17:02] [PASSED] truncated_tv_option
[15:17:02] ============ [PASSED] drm_test_cmdline_invalid =============
[15:17:02] =============== drm_test_cmdline_tv_options ===============
[15:17:02] [PASSED] NTSC
[15:17:02] [PASSED] NTSC_443
[15:17:02] [PASSED] NTSC_J
[15:17:02] [PASSED] PAL
[15:17:02] [PASSED] PAL_M
[15:17:02] [PASSED] PAL_N
[15:17:02] [PASSED] SECAM
[15:17:02] [PASSED] MONO_525
[15:17:02] [PASSED] MONO_625
[15:17:02] =========== [PASSED] drm_test_cmdline_tv_options ===========
[15:17:02] =============== [PASSED] drm_cmdline_parser ================
[15:17:02] ========== drmm_connector_hdmi_init (20 subtests) ==========
[15:17:02] [PASSED] drm_test_connector_hdmi_init_valid
[15:17:02] [PASSED] drm_test_connector_hdmi_init_bpc_8
[15:17:02] [PASSED] drm_test_connector_hdmi_init_bpc_10
[15:17:02] [PASSED] drm_test_connector_hdmi_init_bpc_12
[15:17:02] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[15:17:02] [PASSED] drm_test_connector_hdmi_init_bpc_null
[15:17:02] [PASSED] drm_test_connector_hdmi_init_formats_empty
[15:17:02] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[15:17:02] === drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[15:17:02] [PASSED] supported_formats=0x9 yuv420_allowed=1
[15:17:02] [PASSED] supported_formats=0x9 yuv420_allowed=0
[15:17:02] [PASSED] supported_formats=0x3 yuv420_allowed=1
[15:17:02] [PASSED] supported_formats=0x3 yuv420_allowed=0
[15:17:02] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[15:17:02] [PASSED] drm_test_connector_hdmi_init_null_ddc
[15:17:02] [PASSED] drm_test_connector_hdmi_init_null_product
[15:17:02] [PASSED] drm_test_connector_hdmi_init_null_vendor
[15:17:02] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[15:17:02] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[15:17:02] [PASSED] drm_test_connector_hdmi_init_product_valid
[15:17:02] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[15:17:02] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[15:17:02] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[15:17:02] ========= drm_test_connector_hdmi_init_type_valid =========
[15:17:02] [PASSED] HDMI-A
[15:17:02] [PASSED] HDMI-B
[15:17:02] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[15:17:02] ======== drm_test_connector_hdmi_init_type_invalid ========
[15:17:02] [PASSED] Unknown
[15:17:02] [PASSED] VGA
[15:17:02] [PASSED] DVI-I
[15:17:02] [PASSED] DVI-D
[15:17:02] [PASSED] DVI-A
[15:17:02] [PASSED] Composite
[15:17:02] [PASSED] SVIDEO
[15:17:02] [PASSED] LVDS
[15:17:02] [PASSED] Component
[15:17:02] [PASSED] DIN
[15:17:02] [PASSED] DP
[15:17:02] [PASSED] TV
[15:17:02] [PASSED] eDP
[15:17:02] [PASSED] Virtual
[15:17:02] [PASSED] DSI
[15:17:02] [PASSED] DPI
[15:17:02] [PASSED] Writeback
[15:17:02] [PASSED] SPI
[15:17:02] [PASSED] USB
[15:17:02] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[15:17:02] ============ [PASSED] drmm_connector_hdmi_init =============
[15:17:02] ============= drmm_connector_init (3 subtests) =============
[15:17:02] [PASSED] drm_test_drmm_connector_init
[15:17:02] [PASSED] drm_test_drmm_connector_init_null_ddc
[15:17:02] ========= drm_test_drmm_connector_init_type_valid =========
[15:17:02] [PASSED] Unknown
[15:17:02] [PASSED] VGA
[15:17:02] [PASSED] DVI-I
[15:17:02] [PASSED] DVI-D
[15:17:02] [PASSED] DVI-A
[15:17:02] [PASSED] Composite
[15:17:02] [PASSED] SVIDEO
[15:17:02] [PASSED] LVDS
[15:17:02] [PASSED] Component
[15:17:02] [PASSED] DIN
[15:17:02] [PASSED] DP
[15:17:02] [PASSED] HDMI-A
[15:17:02] [PASSED] HDMI-B
[15:17:02] [PASSED] TV
[15:17:02] [PASSED] eDP
[15:17:02] [PASSED] Virtual
[15:17:02] [PASSED] DSI
[15:17:02] [PASSED] DPI
[15:17:02] [PASSED] Writeback
[15:17:02] [PASSED] SPI
[15:17:02] [PASSED] USB
[15:17:02] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[15:17:02] =============== [PASSED] drmm_connector_init ===============
[15:17:02] ========= drm_connector_dynamic_init (6 subtests) ==========
[15:17:02] [PASSED] drm_test_drm_connector_dynamic_init
[15:17:02] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[15:17:02] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[15:17:02] [PASSED] drm_test_drm_connector_dynamic_init_properties
[15:17:02] ===== drm_test_drm_connector_dynamic_init_type_valid ======
[15:17:02] [PASSED] Unknown
[15:17:02] [PASSED] VGA
[15:17:02] [PASSED] DVI-I
[15:17:02] [PASSED] DVI-D
[15:17:02] [PASSED] DVI-A
[15:17:02] [PASSED] Composite
[15:17:02] [PASSED] SVIDEO
[15:17:02] [PASSED] LVDS
[15:17:02] [PASSED] Component
[15:17:02] [PASSED] DIN
[15:17:02] [PASSED] DP
[15:17:02] [PASSED] HDMI-A
[15:17:02] [PASSED] HDMI-B
[15:17:02] [PASSED] TV
[15:17:02] [PASSED] eDP
[15:17:02] [PASSED] Virtual
[15:17:02] [PASSED] DSI
[15:17:02] [PASSED] DPI
[15:17:02] [PASSED] Writeback
[15:17:02] [PASSED] SPI
[15:17:02] [PASSED] USB
[15:17:02] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[15:17:02] ======== drm_test_drm_connector_dynamic_init_name =========
[15:17:02] [PASSED] Unknown
[15:17:02] [PASSED] VGA
[15:17:02] [PASSED] DVI-I
[15:17:02] [PASSED] DVI-D
[15:17:02] [PASSED] DVI-A
[15:17:02] [PASSED] Composite
[15:17:02] [PASSED] SVIDEO
[15:17:02] [PASSED] LVDS
[15:17:02] [PASSED] Component
[15:17:02] [PASSED] DIN
[15:17:02] [PASSED] DP
[15:17:02] [PASSED] HDMI-A
[15:17:02] [PASSED] HDMI-B
[15:17:02] [PASSED] TV
[15:17:02] [PASSED] eDP
[15:17:02] [PASSED] Virtual
[15:17:02] [PASSED] DSI
[15:17:02] [PASSED] DPI
[15:17:02] [PASSED] Writeback
[15:17:02] [PASSED] SPI
[15:17:02] [PASSED] USB
[15:17:02] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[15:17:02] =========== [PASSED] drm_connector_dynamic_init ============
[15:17:02] ==== drm_connector_dynamic_register_early (4 subtests) =====
[15:17:02] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[15:17:02] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[15:17:02] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[15:17:02] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[15:17:02] ====== [PASSED] drm_connector_dynamic_register_early =======
[15:17:02] ======= drm_connector_dynamic_register (7 subtests) ========
[15:17:02] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[15:17:02] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[15:17:02] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[15:17:02] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[15:17:02] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[15:17:02] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[15:17:02] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[15:17:02] ========= [PASSED] drm_connector_dynamic_register ==========
[15:17:02] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[15:17:02] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[15:17:02] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[15:17:02] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[15:17:02] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[15:17:02] ========== drm_test_get_tv_mode_from_name_valid ===========
[15:17:02] [PASSED] NTSC
[15:17:02] [PASSED] NTSC-443
[15:17:02] [PASSED] NTSC-J
[15:17:02] [PASSED] PAL
[15:17:02] [PASSED] PAL-M
[15:17:02] [PASSED] PAL-N
[15:17:02] [PASSED] SECAM
[15:17:02] [PASSED] Mono
[15:17:02] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[15:17:02] [PASSED] drm_test_get_tv_mode_from_name_truncated
[15:17:02] ============ [PASSED] drm_get_tv_mode_from_name ============
[15:17:02] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[15:17:02] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[15:17:02] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[15:17:02] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[15:17:02] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[15:17:02] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[15:17:02] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[15:17:02] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[15:17:02] [PASSED] VIC 96
[15:17:02] [PASSED] VIC 97
[15:17:02] [PASSED] VIC 101
[15:17:02] [PASSED] VIC 102
[15:17:02] [PASSED] VIC 106
[15:17:02] [PASSED] VIC 107
[15:17:02] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[15:17:02] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[15:17:02] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[15:17:02] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[15:17:02] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[15:17:02] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[15:17:02] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[15:17:02] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[15:17:02] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[15:17:02] [PASSED] Automatic
[15:17:02] [PASSED] Full
[15:17:02] [PASSED] Limited 16:235
[15:17:02] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[15:17:02] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[15:17:02] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[15:17:02] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[15:17:02] === drm_test_drm_hdmi_connector_get_output_format_name ====
[15:17:02] [PASSED] RGB
[15:17:02] [PASSED] YUV 4:2:0
[15:17:02] [PASSED] YUV 4:2:2
[15:17:02] [PASSED] YUV 4:4:4
[15:17:02] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[15:17:02] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[15:17:02] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[15:17:02] ============= drm_damage_helper (21 subtests) ==============
[15:17:02] [PASSED] drm_test_damage_iter_no_damage
[15:17:02] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[15:17:02] [PASSED] drm_test_damage_iter_no_damage_src_moved
[15:17:02] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[15:17:02] [PASSED] drm_test_damage_iter_no_damage_not_visible
[15:17:02] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[15:17:02] [PASSED] drm_test_damage_iter_no_damage_no_fb
[15:17:02] [PASSED] drm_test_damage_iter_simple_damage
[15:17:02] [PASSED] drm_test_damage_iter_single_damage
[15:17:02] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[15:17:02] [PASSED] drm_test_damage_iter_single_damage_outside_src
[15:17:02] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[15:17:02] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[15:17:02] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[15:17:02] [PASSED] drm_test_damage_iter_single_damage_src_moved
[15:17:02] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[15:17:02] [PASSED] drm_test_damage_iter_damage
[15:17:02] [PASSED] drm_test_damage_iter_damage_one_intersect
[15:17:02] [PASSED] drm_test_damage_iter_damage_one_outside
[15:17:02] [PASSED] drm_test_damage_iter_damage_src_moved
[15:17:02] [PASSED] drm_test_damage_iter_damage_not_visible
[15:17:02] ================ [PASSED] drm_damage_helper ================
[15:17:02] ============== drm_dp_mst_helper (3 subtests) ==============
[15:17:02] ============== drm_test_dp_mst_calc_pbn_mode ==============
[15:17:02] [PASSED] Clock 154000 BPP 30 DSC disabled
[15:17:02] [PASSED] Clock 234000 BPP 30 DSC disabled
[15:17:02] [PASSED] Clock 297000 BPP 24 DSC disabled
[15:17:02] [PASSED] Clock 332880 BPP 24 DSC enabled
[15:17:02] [PASSED] Clock 324540 BPP 24 DSC enabled
[15:17:02] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[15:17:02] ============== drm_test_dp_mst_calc_pbn_div ===============
[15:17:02] [PASSED] Link rate 2000000 lane count 4
[15:17:02] [PASSED] Link rate 2000000 lane count 2
[15:17:02] [PASSED] Link rate 2000000 lane count 1
[15:17:02] [PASSED] Link rate 1350000 lane count 4
[15:17:02] [PASSED] Link rate 1350000 lane count 2
[15:17:02] [PASSED] Link rate 1350000 lane count 1
[15:17:02] [PASSED] Link rate 1000000 lane count 4
[15:17:02] [PASSED] Link rate 1000000 lane count 2
[15:17:02] [PASSED] Link rate 1000000 lane count 1
[15:17:02] [PASSED] Link rate 810000 lane count 4
[15:17:02] [PASSED] Link rate 810000 lane count 2
[15:17:02] [PASSED] Link rate 810000 lane count 1
[15:17:02] [PASSED] Link rate 540000 lane count 4
[15:17:02] [PASSED] Link rate 540000 lane count 2
[15:17:02] [PASSED] Link rate 540000 lane count 1
[15:17:02] [PASSED] Link rate 270000 lane count 4
[15:17:02] [PASSED] Link rate 270000 lane count 2
[15:17:02] [PASSED] Link rate 270000 lane count 1
[15:17:02] [PASSED] Link rate 162000 lane count 4
[15:17:02] [PASSED] Link rate 162000 lane count 2
[15:17:02] [PASSED] Link rate 162000 lane count 1
[15:17:02] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[15:17:02] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[15:17:02] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[15:17:02] [PASSED] DP_POWER_UP_PHY with port number
[15:17:02] [PASSED] DP_POWER_DOWN_PHY with port number
[15:17:02] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[15:17:02] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[15:17:02] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[15:17:02] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[15:17:02] [PASSED] DP_QUERY_PAYLOAD with port number
[15:17:02] [PASSED] DP_QUERY_PAYLOAD with VCPI
[15:17:02] [PASSED] DP_REMOTE_DPCD_READ with port number
[15:17:02] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[15:17:02] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[15:17:02] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[15:17:02] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[15:17:02] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[15:17:02] [PASSED] DP_REMOTE_I2C_READ with port number
[15:17:02] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[15:17:02] [PASSED] DP_REMOTE_I2C_READ with transactions array
[15:17:02] [PASSED] DP_REMOTE_I2C_WRITE with port number
[15:17:02] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[15:17:02] [PASSED] DP_REMOTE_I2C_WRITE with data array
[15:17:02] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[15:17:02] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[15:17:02] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[15:17:02] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[15:17:02] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[15:17:02] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[15:17:02] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[15:17:02] ================ [PASSED] drm_dp_mst_helper ================
[15:17:02] ================== drm_exec (7 subtests) ===================
[15:17:02] [PASSED] sanitycheck
[15:17:02] [PASSED] test_lock
[15:17:02] [PASSED] test_lock_unlock
[15:17:02] [PASSED] test_duplicates
[15:17:02] [PASSED] test_prepare
[15:17:02] [PASSED] test_prepare_array
[15:17:02] [PASSED] test_multiple_loops
[15:17:02] ==================== [PASSED] drm_exec =====================
[15:17:02] =========== drm_format_helper_test (18 subtests) ===========
[15:17:02] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[15:17:02] [PASSED] single_pixel_source_buffer
[15:17:02] [PASSED] single_pixel_clip_rectangle
[15:17:02] [PASSED] well_known_colors
[15:17:02] [PASSED] destination_pitch
[15:17:02] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[15:17:02] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[15:17:02] [PASSED] single_pixel_source_buffer
[15:17:02] [PASSED] single_pixel_clip_rectangle
[15:17:02] [PASSED] well_known_colors
[15:17:02] [PASSED] destination_pitch
[15:17:02] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[15:17:02] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[15:17:02] [PASSED] single_pixel_source_buffer
[15:17:02] [PASSED] single_pixel_clip_rectangle
[15:17:02] [PASSED] well_known_colors
[15:17:02] [PASSED] destination_pitch
[15:17:02] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[15:17:02] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[15:17:02] [PASSED] single_pixel_source_buffer
[15:17:02] [PASSED] single_pixel_clip_rectangle
[15:17:02] [PASSED] well_known_colors
[15:17:02] [PASSED] destination_pitch
[15:17:02] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[15:17:02] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[15:17:02] [PASSED] single_pixel_source_buffer
[15:17:02] [PASSED] single_pixel_clip_rectangle
[15:17:02] [PASSED] well_known_colors
[15:17:02] [PASSED] destination_pitch
[15:17:02] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[15:17:02] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[15:17:02] [PASSED] single_pixel_source_buffer
[15:17:02] [PASSED] single_pixel_clip_rectangle
[15:17:02] [PASSED] well_known_colors
[15:17:02] [PASSED] destination_pitch
[15:17:02] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[15:17:02] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[15:17:02] [PASSED] single_pixel_source_buffer
[15:17:02] [PASSED] single_pixel_clip_rectangle
[15:17:02] [PASSED] well_known_colors
[15:17:02] [PASSED] destination_pitch
[15:17:02] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[15:17:02] ============= drm_test_fb_xrgb8888_to_bgr888 ==============
[15:17:02] [PASSED] single_pixel_source_buffer
[15:17:02] [PASSED] single_pixel_clip_rectangle
[15:17:02] [PASSED] well_known_colors
[15:17:02] [PASSED] destination_pitch
[15:17:02] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[15:17:02] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[15:17:02] [PASSED] single_pixel_source_buffer
[15:17:02] [PASSED] single_pixel_clip_rectangle
[15:17:02] [PASSED] well_known_colors
[15:17:02] [PASSED] destination_pitch
[15:17:02] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[15:17:02] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[15:17:02] [PASSED] single_pixel_source_buffer
[15:17:02] [PASSED] single_pixel_clip_rectangle
[15:17:02] [PASSED] well_known_colors
[15:17:02] [PASSED] destination_pitch
[15:17:02] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[15:17:02] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[15:17:02] [PASSED] single_pixel_source_buffer
[15:17:02] [PASSED] single_pixel_clip_rectangle
[15:17:02] [PASSED] well_known_colors
[15:17:02] [PASSED] destination_pitch
[15:17:02] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[15:17:02] ============== drm_test_fb_xrgb8888_to_mono ===============
[15:17:02] [PASSED] single_pixel_source_buffer
[15:17:02] [PASSED] single_pixel_clip_rectangle
[15:17:02] [PASSED] well_known_colors
[15:17:02] [PASSED] destination_pitch
[15:17:02] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[15:17:02] ==================== drm_test_fb_swab =====================
[15:17:02] [PASSED] single_pixel_source_buffer
[15:17:02] [PASSED] single_pixel_clip_rectangle
[15:17:02] [PASSED] well_known_colors
[15:17:02] [PASSED] destination_pitch
[15:17:02] ================ [PASSED] drm_test_fb_swab =================
[15:17:02] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[15:17:02] [PASSED] single_pixel_source_buffer
[15:17:02] [PASSED] single_pixel_clip_rectangle
[15:17:02] [PASSED] well_known_colors
[15:17:02] [PASSED] destination_pitch
[15:17:02] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[15:17:02] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[15:17:02] [PASSED] single_pixel_source_buffer
[15:17:02] [PASSED] single_pixel_clip_rectangle
[15:17:02] [PASSED] well_known_colors
[15:17:02] [PASSED] destination_pitch
[15:17:02] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[15:17:02] ================= drm_test_fb_clip_offset =================
[15:17:02] [PASSED] pass through
[15:17:02] [PASSED] horizontal offset
[15:17:02] [PASSED] vertical offset
[15:17:02] [PASSED] horizontal and vertical offset
[15:17:02] [PASSED] horizontal offset (custom pitch)
[15:17:02] [PASSED] vertical offset (custom pitch)
[15:17:02] [PASSED] horizontal and vertical offset (custom pitch)
[15:17:02] ============= [PASSED] drm_test_fb_clip_offset =============
[15:17:02] ============== drm_test_fb_build_fourcc_list ==============
[15:17:02] [PASSED] no native formats
[15:17:02] [PASSED] XRGB8888 as native format
[15:17:02] [PASSED] remove duplicates
[15:17:02] [PASSED] convert alpha formats
[15:17:02] [PASSED] random formats
[15:17:02] ========== [PASSED] drm_test_fb_build_fourcc_list ==========
[15:17:02] =================== drm_test_fb_memcpy ====================
[15:17:02] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[15:17:02] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[15:17:02] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[15:17:02] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[15:17:02] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[15:17:02] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[15:17:02] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[15:17:02] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[15:17:02] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[15:17:02] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[15:17:02] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[15:17:02] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[15:17:02] =============== [PASSED] drm_test_fb_memcpy ================
[15:17:02] ============= [PASSED] drm_format_helper_test ==============
[15:17:02] ================= drm_format (18 subtests) =================
[15:17:02] [PASSED] drm_test_format_block_width_invalid
[15:17:02] [PASSED] drm_test_format_block_width_one_plane
[15:17:02] [PASSED] drm_test_format_block_width_two_plane
[15:17:02] [PASSED] drm_test_format_block_width_three_plane
[15:17:02] [PASSED] drm_test_format_block_width_tiled
[15:17:02] [PASSED] drm_test_format_block_height_invalid
[15:17:02] [PASSED] drm_test_format_block_height_one_plane
[15:17:02] [PASSED] drm_test_format_block_height_two_plane
[15:17:02] [PASSED] drm_test_format_block_height_three_plane
[15:17:02] [PASSED] drm_test_format_block_height_tiled
[15:17:02] [PASSED] drm_test_format_min_pitch_invalid
[15:17:02] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[15:17:02] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[15:17:02] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[15:17:02] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[15:17:02] [PASSED] drm_test_format_min_pitch_two_plane
[15:17:02] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[15:17:02] [PASSED] drm_test_format_min_pitch_tiled
[15:17:02] =================== [PASSED] drm_format ====================
[15:17:02] ============== drm_framebuffer (10 subtests) ===============
[15:17:02] ========== drm_test_framebuffer_check_src_coords ==========
[15:17:02] [PASSED] Success: source fits into fb
[15:17:02] [PASSED] Fail: overflowing fb with x-axis coordinate
[15:17:02] [PASSED] Fail: overflowing fb with y-axis coordinate
[15:17:02] [PASSED] Fail: overflowing fb with source width
[15:17:02] [PASSED] Fail: overflowing fb with source height
[15:17:02] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[15:17:02] [PASSED] drm_test_framebuffer_cleanup
[15:17:02] =============== drm_test_framebuffer_create ===============
[15:17:02] [PASSED] ABGR8888 normal sizes
[15:17:02] [PASSED] ABGR8888 max sizes
[15:17:02] [PASSED] ABGR8888 pitch greater than min required
[15:17:02] [PASSED] ABGR8888 pitch less than min required
[15:17:02] [PASSED] ABGR8888 Invalid width
[15:17:02] [PASSED] ABGR8888 Invalid buffer handle
[15:17:02] [PASSED] No pixel format
[15:17:02] [PASSED] ABGR8888 Width 0
[15:17:02] [PASSED] ABGR8888 Height 0
[15:17:02] [PASSED] ABGR8888 Out of bound height * pitch combination
[15:17:02] [PASSED] ABGR8888 Large buffer offset
[15:17:02] [PASSED] ABGR8888 Buffer offset for inexistent plane
[15:17:02] [PASSED] ABGR8888 Invalid flag
[15:17:02] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[15:17:02] [PASSED] ABGR8888 Valid buffer modifier
[15:17:02] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[15:17:02] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[15:17:02] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[15:17:02] [PASSED] NV12 Normal sizes
[15:17:02] [PASSED] NV12 Max sizes
[15:17:02] [PASSED] NV12 Invalid pitch
[15:17:02] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[15:17:02] [PASSED] NV12 different modifier per-plane
[15:17:02] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[15:17:02] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[15:17:02] [PASSED] NV12 Modifier for inexistent plane
[15:17:02] [PASSED] NV12 Handle for inexistent plane
[15:17:02] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[15:17:02] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[15:17:02] [PASSED] YVU420 Normal sizes
[15:17:02] [PASSED] YVU420 Max sizes
[15:17:02] [PASSED] YVU420 Invalid pitch
[15:17:02] [PASSED] YVU420 Different pitches
[15:17:02] [PASSED] YVU420 Different buffer offsets/pitches
[15:17:02] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[15:17:02] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[15:17:02] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[15:17:02] [PASSED] YVU420 Valid modifier
[15:17:02] [PASSED] YVU420 Different modifiers per plane
[15:17:02] [PASSED] YVU420 Modifier for inexistent plane
[15:17:02] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[15:17:02] [PASSED] X0L2 Normal sizes
[15:17:02] [PASSED] X0L2 Max sizes
[15:17:02] [PASSED] X0L2 Invalid pitch
[15:17:02] [PASSED] X0L2 Pitch greater than minimum required
[15:17:02] [PASSED] X0L2 Handle for inexistent plane
[15:17:02] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[15:17:02] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[15:17:02] [PASSED] X0L2 Valid modifier
[15:17:02] [PASSED] X0L2 Modifier for inexistent plane
[15:17:02] =========== [PASSED] drm_test_framebuffer_create ===========
[15:17:02] [PASSED] drm_test_framebuffer_free
[15:17:02] [PASSED] drm_test_framebuffer_init
[15:17:02] [PASSED] drm_test_framebuffer_init_bad_format
[15:17:02] [PASSED] drm_test_framebuffer_init_dev_mismatch
[15:17:02] [PASSED] drm_test_framebuffer_lookup
[15:17:02] [PASSED] drm_test_framebuffer_lookup_inexistent
[15:17:02] [PASSED] drm_test_framebuffer_modifiers_not_supported
[15:17:02] ================= [PASSED] drm_framebuffer =================
[15:17:02] ================ drm_gem_shmem (8 subtests) ================
[15:17:02] [PASSED] drm_gem_shmem_test_obj_create
[15:17:02] [PASSED] drm_gem_shmem_test_obj_create_private
[15:17:02] [PASSED] drm_gem_shmem_test_pin_pages
[15:17:02] [PASSED] drm_gem_shmem_test_vmap
[15:17:02] [PASSED] drm_gem_shmem_test_get_pages_sgt
[15:17:02] [PASSED] drm_gem_shmem_test_get_sg_table
[15:17:02] [PASSED] drm_gem_shmem_test_madvise
[15:17:02] [PASSED] drm_gem_shmem_test_purge
[15:17:02] ================== [PASSED] drm_gem_shmem ==================
[15:17:02] === drm_atomic_helper_connector_hdmi_check (27 subtests) ===
[15:17:02] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[15:17:02] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[15:17:02] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[15:17:02] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[15:17:02] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[15:17:02] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[15:17:02] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 =======
[15:17:02] [PASSED] Automatic
[15:17:02] [PASSED] Full
[15:17:02] [PASSED] Limited 16:235
[15:17:02] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[15:17:02] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[15:17:02] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[15:17:02] [PASSED] drm_test_check_disable_connector
[15:17:02] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[15:17:02] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[15:17:02] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[15:17:02] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[15:17:02] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[15:17:02] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[15:17:02] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[15:17:02] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[15:17:02] [PASSED] drm_test_check_output_bpc_dvi
[15:17:02] [PASSED] drm_test_check_output_bpc_format_vic_1
[15:17:02] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[15:17:02] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[15:17:02] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[15:17:02] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[15:17:02] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[15:17:02] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[15:17:02] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[15:17:02] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[15:17:02] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[15:17:02] [PASSED] drm_test_check_broadcast_rgb_value
[15:17:02] [PASSED] drm_test_check_bpc_8_value
[15:17:02] [PASSED] drm_test_check_bpc_10_value
[15:17:02] [PASSED] drm_test_check_bpc_12_value
[15:17:02] [PASSED] drm_test_check_format_value
[15:17:02] [PASSED] drm_test_check_tmds_char_value
[15:17:02] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[15:17:02] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[15:17:02] [PASSED] drm_test_check_mode_valid
[15:17:02] [PASSED] drm_test_check_mode_valid_reject
[15:17:02] [PASSED] drm_test_check_mode_valid_reject_rate
[15:17:02] [PASSED] drm_test_check_mode_valid_reject_max_clock
[15:17:02] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[15:17:02] ================= drm_managed (2 subtests) =================
[15:17:02] [PASSED] drm_test_managed_release_action
[15:17:02] [PASSED] drm_test_managed_run_action
[15:17:02] =================== [PASSED] drm_managed ===================
[15:17:02] =================== drm_mm (6 subtests) ====================
[15:17:02] [PASSED] drm_test_mm_init
[15:17:02] [PASSED] drm_test_mm_debug
[15:17:02] [PASSED] drm_test_mm_align32
[15:17:02] [PASSED] drm_test_mm_align64
[15:17:02] [PASSED] drm_test_mm_lowest
[15:17:02] [PASSED] drm_test_mm_highest
[15:17:02] ===================== [PASSED] drm_mm ======================
[15:17:02] ============= drm_modes_analog_tv (5 subtests) =============
[15:17:02] [PASSED] drm_test_modes_analog_tv_mono_576i
[15:17:02] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[15:17:02] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[15:17:02] [PASSED] drm_test_modes_analog_tv_pal_576i
[15:17:02] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[15:17:02] =============== [PASSED] drm_modes_analog_tv ===============
[15:17:02] ============== drm_plane_helper (2 subtests) ===============
[15:17:02] =============== drm_test_check_plane_state ================
[15:17:02] [PASSED] clipping_simple
[15:17:02] [PASSED] clipping_rotate_reflect
[15:17:02] [PASSED] positioning_simple
[15:17:02] [PASSED] upscaling
[15:17:02] [PASSED] downscaling
[15:17:02] [PASSED] rounding1
[15:17:02] [PASSED] rounding2
[15:17:02] [PASSED] rounding3
[15:17:02] [PASSED] rounding4
[15:17:02] =========== [PASSED] drm_test_check_plane_state ============
[15:17:02] =========== drm_test_check_invalid_plane_state ============
[15:17:02] [PASSED] positioning_invalid
[15:17:02] [PASSED] upscaling_invalid
[15:17:02] [PASSED] downscaling_invalid
[15:17:02] ======= [PASSED] drm_test_check_invalid_plane_state ========
[15:17:02] ================ [PASSED] drm_plane_helper =================
[15:17:02] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[15:17:02] ====== drm_test_connector_helper_tv_get_modes_check =======
[15:17:02] [PASSED] None
[15:17:02] [PASSED] PAL
[15:17:02] [PASSED] NTSC
[15:17:02] [PASSED] Both, NTSC Default
[15:17:02] [PASSED] Both, PAL Default
[15:17:02] [PASSED] Both, NTSC Default, with PAL on command-line
[15:17:02] [PASSED] Both, PAL Default, with NTSC on command-line
[15:17:02] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[15:17:02] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[15:17:02] ================== drm_rect (9 subtests) ===================
[15:17:02] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[15:17:02] [PASSED] drm_test_rect_clip_scaled_not_clipped
[15:17:02] [PASSED] drm_test_rect_clip_scaled_clipped
[15:17:02] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[15:17:02] ================= drm_test_rect_intersect =================
[15:17:02] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[15:17:02] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[15:17:02] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[15:17:02] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[15:17:02] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[15:17:02] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[15:17:02] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[15:17:02] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[15:17:02] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[15:17:02] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[15:17:02] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[15:17:02] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[15:17:02] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[15:17:02] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[15:17:02] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[15:17:02] ============= [PASSED] drm_test_rect_intersect =============
[15:17:02] ================ drm_test_rect_calc_hscale ================
[15:17:02] [PASSED] normal use
[15:17:02] [PASSED] out of max range
[15:17:02] [PASSED] out of min range
[15:17:02] [PASSED] zero dst
[15:17:02] [PASSED] negative src
[15:17:02] [PASSED] negative dst
[15:17:02] ============ [PASSED] drm_test_rect_calc_hscale ============
[15:17:02] ================ drm_test_rect_calc_vscale ================
[15:17:02] [PASSED] normal use
[15:17:02] [PASSED] out of max range
[15:17:02] [PASSED] out of min range
[15:17:02] [PASSED] zero dst
[15:17:02] [PASSED] negative src
[15:17:02] [PASSED] negative dst
stty: 'standard input': Inappropriate ioctl for device
[15:17:02] ============ [PASSED] drm_test_rect_calc_vscale ============
[15:17:02] ================== drm_test_rect_rotate ===================
[15:17:02] [PASSED] reflect-x
[15:17:02] [PASSED] reflect-y
[15:17:02] [PASSED] rotate-0
[15:17:02] [PASSED] rotate-90
[15:17:02] [PASSED] rotate-180
[15:17:02] [PASSED] rotate-270
[15:17:02] ============== [PASSED] drm_test_rect_rotate ===============
[15:17:02] ================ drm_test_rect_rotate_inv =================
[15:17:02] [PASSED] reflect-x
[15:17:02] [PASSED] reflect-y
[15:17:02] [PASSED] rotate-0
[15:17:02] [PASSED] rotate-90
[15:17:02] [PASSED] rotate-180
[15:17:02] [PASSED] rotate-270
[15:17:02] ============ [PASSED] drm_test_rect_rotate_inv =============
[15:17:02] ==================== [PASSED] drm_rect =====================
[15:17:02] ============================================================
[15:17:02] Testing complete. Ran 616 tests: passed: 616
[15:17:02] Elapsed time: 23.360s total, 1.651s configuring, 21.543s building, 0.145s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[15:17:03] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[15:17:04] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[15:17:12] Starting KUnit Kernel (1/1)...
[15:17:12] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[15:17:12] ================= ttm_device (5 subtests) ==================
[15:17:12] [PASSED] ttm_device_init_basic
[15:17:12] [PASSED] ttm_device_init_multiple
[15:17:12] [PASSED] ttm_device_fini_basic
[15:17:12] [PASSED] ttm_device_init_no_vma_man
[15:17:12] ================== ttm_device_init_pools ==================
[15:17:12] [PASSED] No DMA allocations, no DMA32 required
[15:17:12] [PASSED] DMA allocations, DMA32 required
[15:17:12] [PASSED] No DMA allocations, DMA32 required
[15:17:12] [PASSED] DMA allocations, no DMA32 required
[15:17:12] ============== [PASSED] ttm_device_init_pools ==============
[15:17:12] =================== [PASSED] ttm_device ====================
[15:17:12] ================== ttm_pool (8 subtests) ===================
[15:17:12] ================== ttm_pool_alloc_basic ===================
[15:17:12] [PASSED] One page
[15:17:12] [PASSED] More than one page
[15:17:12] [PASSED] Above the allocation limit
[15:17:12] [PASSED] One page, with coherent DMA mappings enabled
[15:17:12] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[15:17:12] ============== [PASSED] ttm_pool_alloc_basic ===============
[15:17:12] ============== ttm_pool_alloc_basic_dma_addr ==============
[15:17:12] [PASSED] One page
[15:17:12] [PASSED] More than one page
[15:17:12] [PASSED] Above the allocation limit
[15:17:12] [PASSED] One page, with coherent DMA mappings enabled
[15:17:12] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[15:17:12] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[15:17:12] [PASSED] ttm_pool_alloc_order_caching_match
[15:17:12] [PASSED] ttm_pool_alloc_caching_mismatch
[15:17:12] [PASSED] ttm_pool_alloc_order_mismatch
[15:17:12] [PASSED] ttm_pool_free_dma_alloc
[15:17:12] [PASSED] ttm_pool_free_no_dma_alloc
[15:17:12] [PASSED] ttm_pool_fini_basic
[15:17:12] ==================== [PASSED] ttm_pool =====================
[15:17:12] ================ ttm_resource (8 subtests) =================
[15:17:12] ================= ttm_resource_init_basic =================
[15:17:12] [PASSED] Init resource in TTM_PL_SYSTEM
[15:17:12] [PASSED] Init resource in TTM_PL_VRAM
[15:17:12] [PASSED] Init resource in a private placement
[15:17:12] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[15:17:12] ============= [PASSED] ttm_resource_init_basic =============
[15:17:12] [PASSED] ttm_resource_init_pinned
[15:17:12] [PASSED] ttm_resource_fini_basic
[15:17:12] [PASSED] ttm_resource_manager_init_basic
[15:17:12] [PASSED] ttm_resource_manager_usage_basic
[15:17:12] [PASSED] ttm_resource_manager_set_used_basic
[15:17:12] [PASSED] ttm_sys_man_alloc_basic
[15:17:12] [PASSED] ttm_sys_man_free_basic
[15:17:12] ================== [PASSED] ttm_resource ===================
[15:17:12] =================== ttm_tt (15 subtests) ===================
[15:17:12] ==================== ttm_tt_init_basic ====================
[15:17:12] [PASSED] Page-aligned size
[15:17:12] [PASSED] Extra pages requested
[15:17:12] ================ [PASSED] ttm_tt_init_basic ================
[15:17:12] [PASSED] ttm_tt_init_misaligned
[15:17:12] [PASSED] ttm_tt_fini_basic
[15:17:12] [PASSED] ttm_tt_fini_sg
[15:17:12] [PASSED] ttm_tt_fini_shmem
[15:17:12] [PASSED] ttm_tt_create_basic
[15:17:12] [PASSED] ttm_tt_create_invalid_bo_type
[15:17:12] [PASSED] ttm_tt_create_ttm_exists
[15:17:12] [PASSED] ttm_tt_create_failed
[15:17:12] [PASSED] ttm_tt_destroy_basic
[15:17:12] [PASSED] ttm_tt_populate_null_ttm
[15:17:12] [PASSED] ttm_tt_populate_populated_ttm
[15:17:12] [PASSED] ttm_tt_unpopulate_basic
[15:17:12] [PASSED] ttm_tt_unpopulate_empty_ttm
[15:17:12] [PASSED] ttm_tt_swapin_basic
[15:17:12] ===================== [PASSED] ttm_tt ======================
[15:17:12] =================== ttm_bo (14 subtests) ===================
[15:17:12] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[15:17:12] [PASSED] Cannot be interrupted and sleeps
[15:17:12] [PASSED] Cannot be interrupted, locks straight away
[15:17:12] [PASSED] Can be interrupted, sleeps
[15:17:12] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[15:17:12] [PASSED] ttm_bo_reserve_locked_no_sleep
[15:17:12] [PASSED] ttm_bo_reserve_no_wait_ticket
[15:17:12] [PASSED] ttm_bo_reserve_double_resv
[15:17:12] [PASSED] ttm_bo_reserve_interrupted
[15:17:12] [PASSED] ttm_bo_reserve_deadlock
[15:17:12] [PASSED] ttm_bo_unreserve_basic
[15:17:12] [PASSED] ttm_bo_unreserve_pinned
[15:17:12] [PASSED] ttm_bo_unreserve_bulk
[15:17:12] [PASSED] ttm_bo_put_basic
[15:17:12] [PASSED] ttm_bo_put_shared_resv
[15:17:12] [PASSED] ttm_bo_pin_basic
[15:17:12] [PASSED] ttm_bo_pin_unpin_resource
[15:17:12] [PASSED] ttm_bo_multiple_pin_one_unpin
[15:17:12] ===================== [PASSED] ttm_bo ======================
[15:17:12] ============== ttm_bo_validate (22 subtests) ===============
[15:17:12] ============== ttm_bo_init_reserved_sys_man ===============
[15:17:12] [PASSED] Buffer object for userspace
[15:17:12] [PASSED] Kernel buffer object
[15:17:12] [PASSED] Shared buffer object
[15:17:12] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[15:17:12] ============== ttm_bo_init_reserved_mock_man ==============
[15:17:12] [PASSED] Buffer object for userspace
[15:17:12] [PASSED] Kernel buffer object
[15:17:12] [PASSED] Shared buffer object
[15:17:12] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[15:17:12] [PASSED] ttm_bo_init_reserved_resv
[15:17:12] ================== ttm_bo_validate_basic ==================
[15:17:12] [PASSED] Buffer object for userspace
[15:17:12] [PASSED] Kernel buffer object
[15:17:12] [PASSED] Shared buffer object
[15:17:12] ============== [PASSED] ttm_bo_validate_basic ==============
[15:17:12] [PASSED] ttm_bo_validate_invalid_placement
[15:17:12] ============= ttm_bo_validate_same_placement ==============
[15:17:12] [PASSED] System manager
[15:17:12] [PASSED] VRAM manager
[15:17:12] ========= [PASSED] ttm_bo_validate_same_placement ==========
[15:17:12] [PASSED] ttm_bo_validate_failed_alloc
[15:17:12] [PASSED] ttm_bo_validate_pinned
[15:17:12] [PASSED] ttm_bo_validate_busy_placement
[15:17:12] ================ ttm_bo_validate_multihop =================
[15:17:12] [PASSED] Buffer object for userspace
[15:17:12] [PASSED] Kernel buffer object
[15:17:12] [PASSED] Shared buffer object
[15:17:12] ============ [PASSED] ttm_bo_validate_multihop =============
[15:17:12] ========== ttm_bo_validate_no_placement_signaled ==========
[15:17:12] [PASSED] Buffer object in system domain, no page vector
[15:17:12] [PASSED] Buffer object in system domain with an existing page vector
[15:17:12] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[15:17:12] ======== ttm_bo_validate_no_placement_not_signaled ========
[15:17:12] [PASSED] Buffer object for userspace
[15:17:12] [PASSED] Kernel buffer object
[15:17:12] [PASSED] Shared buffer object
[15:17:12] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[15:17:12] [PASSED] ttm_bo_validate_move_fence_signaled
[15:17:12] ========= ttm_bo_validate_move_fence_not_signaled =========
[15:17:12] [PASSED] Waits for GPU
[15:17:12] [PASSED] Tries to lock straight away
[15:17:12] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[15:17:12] [PASSED] ttm_bo_validate_swapout
[15:17:12] [PASSED] ttm_bo_validate_happy_evict
[15:17:12] [PASSED] ttm_bo_validate_all_pinned_evict
[15:17:12] [PASSED] ttm_bo_validate_allowed_only_evict
[15:17:12] [PASSED] ttm_bo_validate_deleted_evict
[15:17:12] [PASSED] ttm_bo_validate_busy_domain_evict
[15:17:12] [PASSED] ttm_bo_validate_evict_gutting
[15:17:12] [PASSED] ttm_bo_validate_recrusive_evict
stty: 'standard input': Inappropriate ioctl for device
[15:17:12] ================= [PASSED] ttm_bo_validate =================
[15:17:12] ============================================================
[15:17:12] Testing complete. Ran 102 tests: passed: 102
[15:17:13] Elapsed time: 10.038s total, 1.618s configuring, 7.802s building, 0.534s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 13+ messages in thread* ✗ Xe.CI.BAT: failure for drm/xe: i2c support (rev3)
2025-06-12 13:24 [PATCH v3 0/4] drm/xe: i2c support Heikki Krogerus
` (5 preceding siblings ...)
2025-06-12 15:17 ` ✓ CI.KUnit: success " Patchwork
@ 2025-06-12 16:39 ` Patchwork
2025-06-13 4:47 ` ✗ Xe.CI.Full: " Patchwork
7 siblings, 0 replies; 13+ messages in thread
From: Patchwork @ 2025-06-12 16:39 UTC (permalink / raw)
To: Heikki Krogerus; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 3135 bytes --]
== Series Details ==
Series: drm/xe: i2c support (rev3)
URL : https://patchwork.freedesktop.org/series/149699/
State : failure
== Summary ==
CI Bug Log - changes from xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e_BAT -> xe-pw-149699v3_BAT
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with xe-pw-149699v3_BAT absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in xe-pw-149699v3_BAT, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
to document this new failure mode, which will reduce false positives in CI.
Participating hosts (7 -> 7)
------------------------------
No changes in participating hosts
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in xe-pw-149699v3_BAT:
### IGT changes ###
#### Possible regressions ####
* igt@xe_prime_self_import@basic-with_one_bo:
- bat-bmg-2: [PASS][1] -> [ABORT][2]
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/bat-bmg-2/igt@xe_prime_self_import@basic-with_one_bo.html
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/bat-bmg-2/igt@xe_prime_self_import@basic-with_one_bo.html
- bat-bmg-1: [PASS][3] -> [ABORT][4]
[3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/bat-bmg-1/igt@xe_prime_self_import@basic-with_one_bo.html
[4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/bat-bmg-1/igt@xe_prime_self_import@basic-with_one_bo.html
- bat-lnl-2: [PASS][5] -> [ABORT][6]
[5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/bat-lnl-2/igt@xe_prime_self_import@basic-with_one_bo.html
[6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/bat-lnl-2/igt@xe_prime_self_import@basic-with_one_bo.html
- bat-lnl-1: [PASS][7] -> [ABORT][8]
[7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/bat-lnl-1/igt@xe_prime_self_import@basic-with_one_bo.html
[8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/bat-lnl-1/igt@xe_prime_self_import@basic-with_one_bo.html
- bat-dg2-oem2: [PASS][9] -> [ABORT][10]
[9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/bat-dg2-oem2/igt@xe_prime_self_import@basic-with_one_bo.html
[10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/bat-dg2-oem2/igt@xe_prime_self_import@basic-with_one_bo.html
Build changes
-------------
* Linux: xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e -> xe-pw-149699v3
IGT_8406: 12d7c99650c85e479571b6db2c392408be474c88 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e: 00d9cf004336a745e36e9f103acf7925f714d97e
xe-pw-149699v3: 149699v3
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/index.html
[-- Attachment #2: Type: text/html, Size: 3750 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread* ✗ Xe.CI.Full: failure for drm/xe: i2c support (rev3)
2025-06-12 13:24 [PATCH v3 0/4] drm/xe: i2c support Heikki Krogerus
` (6 preceding siblings ...)
2025-06-12 16:39 ` ✗ Xe.CI.BAT: failure " Patchwork
@ 2025-06-13 4:47 ` Patchwork
7 siblings, 0 replies; 13+ messages in thread
From: Patchwork @ 2025-06-13 4:47 UTC (permalink / raw)
To: Heikki Krogerus; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 36069 bytes --]
== Series Details ==
Series: drm/xe: i2c support (rev3)
URL : https://patchwork.freedesktop.org/series/149699/
State : failure
== Summary ==
CI Bug Log - changes from xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e_FULL -> xe-pw-149699v3_FULL
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with xe-pw-149699v3_FULL absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in xe-pw-149699v3_FULL, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
to document this new failure mode, which will reduce false positives in CI.
Participating hosts (4 -> 4)
------------------------------
No changes in participating hosts
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in xe-pw-149699v3_FULL:
### IGT changes ###
#### Possible regressions ####
* igt@xe_exec_system_allocator@threads-shared-vm-many-large-execqueues-malloc-bo-unmap:
- shard-bmg: [PASS][1] -> [INCOMPLETE][2]
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-3/igt@xe_exec_system_allocator@threads-shared-vm-many-large-execqueues-malloc-bo-unmap.html
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-6/igt@xe_exec_system_allocator@threads-shared-vm-many-large-execqueues-malloc-bo-unmap.html
* igt@xe_prime_self_import@basic-with_one_bo:
- shard-adlp: [PASS][3] -> [ABORT][4] +1 other test abort
[3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-adlp-8/igt@xe_prime_self_import@basic-with_one_bo.html
[4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-adlp-4/igt@xe_prime_self_import@basic-with_one_bo.html
- shard-bmg: [PASS][5] -> [ABORT][6] +1 other test abort
[5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-4/igt@xe_prime_self_import@basic-with_one_bo.html
[6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-4/igt@xe_prime_self_import@basic-with_one_bo.html
- shard-dg2-set2: [PASS][7] -> [ABORT][8] +1 other test abort
[7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-dg2-436/igt@xe_prime_self_import@basic-with_one_bo.html
[8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-435/igt@xe_prime_self_import@basic-with_one_bo.html
- shard-lnl: [PASS][9] -> [ABORT][10] +1 other test abort
[9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-lnl-8/igt@xe_prime_self_import@basic-with_one_bo.html
[10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-4/igt@xe_prime_self_import@basic-with_one_bo.html
#### Warnings ####
* igt@xe_sriov_scheduling@nonpreempt-engine-resets@numvfs-random:
- shard-adlp: [ABORT][11] ([Intel XE#5214]) -> [DMESG-FAIL][12] +1 other test dmesg-fail
[11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-adlp-3/igt@xe_sriov_scheduling@nonpreempt-engine-resets@numvfs-random.html
[12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-adlp-2/igt@xe_sriov_scheduling@nonpreempt-engine-resets@numvfs-random.html
Known issues
------------
Here are the changes found in xe-pw-149699v3_FULL that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@kms_addfb_basic@addfb25-y-tiled-small-legacy:
- shard-lnl: NOTRUN -> [SKIP][13] ([Intel XE#1466])
[13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@kms_addfb_basic@addfb25-y-tiled-small-legacy.html
* igt@kms_atomic_transition@plane-toggle-modeset-transition:
- shard-adlp: [PASS][14] -> [FAIL][15] ([Intel XE#3908]) +1 other test fail
[14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-adlp-9/igt@kms_atomic_transition@plane-toggle-modeset-transition.html
[15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-adlp-1/igt@kms_atomic_transition@plane-toggle-modeset-transition.html
* igt@kms_big_fb@linear-16bpp-rotate-180:
- shard-adlp: [PASS][16] -> [DMESG-WARN][17] ([Intel XE#2953] / [Intel XE#4173])
[16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-adlp-4/igt@kms_big_fb@linear-16bpp-rotate-180.html
[17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-adlp-8/igt@kms_big_fb@linear-16bpp-rotate-180.html
* igt@kms_big_fb@y-tiled-64bpp-rotate-180:
- shard-dg2-set2: NOTRUN -> [SKIP][18] ([Intel XE#1124]) +1 other test skip
[18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-434/igt@kms_big_fb@y-tiled-64bpp-rotate-180.html
- shard-lnl: NOTRUN -> [SKIP][19] ([Intel XE#1124]) +1 other test skip
[19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@kms_big_fb@y-tiled-64bpp-rotate-180.html
* igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p:
- shard-bmg: [PASS][20] -> [SKIP][21] ([Intel XE#2314] / [Intel XE#2894])
[20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-3/igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p.html
[21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-6/igt@kms_bw@connected-linear-tiling-2-displays-1920x1080p.html
* igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs@pipe-d-dp-4:
- shard-dg2-set2: [PASS][22] -> [INCOMPLETE][23] ([Intel XE#3862]) +1 other test incomplete
[22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-dg2-463/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs@pipe-d-dp-4.html
[23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-435/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs@pipe-d-dp-4.html
* igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc:
- shard-dg2-set2: [PASS][24] -> [INCOMPLETE][25] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#3124])
[24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-dg2-463/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc.html
[25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc.html
* igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-dp-4:
- shard-dg2-set2: [PASS][26] -> [INCOMPLETE][27] ([Intel XE#3124])
[26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-dg2-463/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-dp-4.html
[27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-dp-4.html
* igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-hdmi-a-6:
- shard-dg2-set2: [PASS][28] -> [DMESG-WARN][29] ([Intel XE#1727] / [Intel XE#3113])
[28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-dg2-463/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-hdmi-a-6.html
[29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-hdmi-a-6.html
* igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-d-dp-4:
- shard-dg2-set2: NOTRUN -> [INCOMPLETE][30] ([Intel XE#4212])
[30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-463/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-d-dp-4.html
* igt@kms_chamelium_hpd@dp-hpd-enable-disable-mode:
- shard-dg2-set2: NOTRUN -> [SKIP][31] ([Intel XE#373]) +1 other test skip
[31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-434/igt@kms_chamelium_hpd@dp-hpd-enable-disable-mode.html
* igt@kms_chamelium_hpd@vga-hpd-enable-disable-mode:
- shard-lnl: NOTRUN -> [SKIP][32] ([Intel XE#373]) +2 other tests skip
[32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@kms_chamelium_hpd@vga-hpd-enable-disable-mode.html
* igt@kms_content_protection@lic-type-0@pipe-a-dp-2:
- shard-bmg: NOTRUN -> [FAIL][33] ([Intel XE#1178])
[33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-1/igt@kms_content_protection@lic-type-0@pipe-a-dp-2.html
* igt@kms_cursor_legacy@cursora-vs-flipb-varying-size:
- shard-bmg: [PASS][34] -> [SKIP][35] ([Intel XE#2291]) +5 other tests skip
[34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-2/igt@kms_cursor_legacy@cursora-vs-flipb-varying-size.html
[35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-6/igt@kms_cursor_legacy@cursora-vs-flipb-varying-size.html
* igt@kms_cursor_legacy@cursorb-vs-flipa-atomic:
- shard-lnl: NOTRUN -> [SKIP][36] ([Intel XE#309]) +1 other test skip
[36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic.html
* igt@kms_dither@fb-8bpc-vs-panel-6bpc:
- shard-bmg: [PASS][37] -> [SKIP][38] ([Intel XE#1340])
[37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-7/igt@kms_dither@fb-8bpc-vs-panel-6bpc.html
[38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-6/igt@kms_dither@fb-8bpc-vs-panel-6bpc.html
* igt@kms_dsc@dsc-fractional-bpp:
- shard-dg2-set2: NOTRUN -> [SKIP][39] ([Intel XE#455])
[39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-434/igt@kms_dsc@dsc-fractional-bpp.html
- shard-lnl: NOTRUN -> [SKIP][40] ([Intel XE#2244])
[40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@kms_dsc@dsc-fractional-bpp.html
* igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a6-dp4:
- shard-dg2-set2: [PASS][41] -> [FAIL][42] ([Intel XE#301] / [Intel XE#3321]) +2 other tests fail
[41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-dg2-434/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a6-dp4.html
[42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-464/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a6-dp4.html
* igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@cd-hdmi-a6-dp4:
- shard-dg2-set2: [PASS][43] -> [FAIL][44] ([Intel XE#301]) +16 other tests fail
[43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-dg2-434/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@cd-hdmi-a6-dp4.html
[44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-464/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@cd-hdmi-a6-dp4.html
* igt@kms_flip@2x-plain-flip-fb-recreate-interruptible:
- shard-bmg: [PASS][45] -> [SKIP][46] ([Intel XE#2316]) +3 other tests skip
[45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-7/igt@kms_flip@2x-plain-flip-fb-recreate-interruptible.html
[46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-6/igt@kms_flip@2x-plain-flip-fb-recreate-interruptible.html
* igt@kms_flip@2x-plain-flip-ts-check-interruptible:
- shard-lnl: NOTRUN -> [SKIP][47] ([Intel XE#1421]) +1 other test skip
[47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@kms_flip@2x-plain-flip-ts-check-interruptible.html
* igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-downscaling:
- shard-lnl: NOTRUN -> [SKIP][48] ([Intel XE#1401] / [Intel XE#1745])
[48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-downscaling.html
* igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-downscaling@pipe-a-default-mode:
- shard-lnl: NOTRUN -> [SKIP][49] ([Intel XE#1401])
[49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-downscaling@pipe-a-default-mode.html
* igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-fullscreen:
- shard-lnl: NOTRUN -> [SKIP][50] ([Intel XE#656])
[50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-fullscreen.html
* igt@kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-indfb-draw-blt:
- shard-dg2-set2: NOTRUN -> [SKIP][51] ([Intel XE#651]) +2 other tests skip
[51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-434/igt@kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-indfb-draw-blt.html
- shard-lnl: NOTRUN -> [SKIP][52] ([Intel XE#651]) +3 other tests skip
[52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@kms_frontbuffer_tracking@fbcdrrs-1p-offscren-pri-indfb-draw-blt.html
* igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-plflip-blt:
- shard-dg2-set2: NOTRUN -> [SKIP][53] ([Intel XE#653])
[53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-434/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-plflip-blt.html
* igt@kms_hdr@invalid-hdr:
- shard-dg2-set2: [PASS][54] -> [SKIP][55] ([Intel XE#455])
[54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-dg2-463/igt@kms_hdr@invalid-hdr.html
[55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-436/igt@kms_hdr@invalid-hdr.html
* igt@kms_hdr@static-swap:
- shard-lnl: NOTRUN -> [SKIP][56] ([Intel XE#1503])
[56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@kms_hdr@static-swap.html
* igt@kms_plane_scaling@2x-scaler-multi-pipe:
- shard-bmg: [PASS][57] -> [SKIP][58] ([Intel XE#2571])
[57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-3/igt@kms_plane_scaling@2x-scaler-multi-pipe.html
[58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-6/igt@kms_plane_scaling@2x-scaler-multi-pipe.html
* igt@kms_plane_scaling@planes-downscale-factor-0-75@pipe-b:
- shard-lnl: NOTRUN -> [SKIP][59] ([Intel XE#2763]) +3 other tests skip
[59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@kms_plane_scaling@planes-downscale-factor-0-75@pipe-b.html
* igt@kms_psr@fbc-pr-basic:
- shard-lnl: NOTRUN -> [SKIP][60] ([Intel XE#1406])
[60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@kms_psr@fbc-pr-basic.html
* igt@kms_psr@psr2-primary-page-flip:
- shard-dg2-set2: NOTRUN -> [SKIP][61] ([Intel XE#2850] / [Intel XE#929])
[61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-434/igt@kms_psr@psr2-primary-page-flip.html
* igt@xe_eudebug@basic-client-th:
- shard-lnl: NOTRUN -> [SKIP][62] ([Intel XE#4837])
[62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@xe_eudebug@basic-client-th.html
* igt@xe_evict_ccs@evict-overcommit-parallel-nofree-reopen:
- shard-lnl: NOTRUN -> [SKIP][63] ([Intel XE#688])
[63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@xe_evict_ccs@evict-overcommit-parallel-nofree-reopen.html
* igt@xe_exec_basic@multigpu-no-exec-basic-defer-bind:
- shard-lnl: NOTRUN -> [SKIP][64] ([Intel XE#1392])
[64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@xe_exec_basic@multigpu-no-exec-basic-defer-bind.html
* igt@xe_exec_fault_mode@many-execqueues-userptr-invalidate:
- shard-dg2-set2: NOTRUN -> [SKIP][65] ([Intel XE#288]) +1 other test skip
[65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-434/igt@xe_exec_fault_mode@many-execqueues-userptr-invalidate.html
* igt@xe_exec_reset@parallel-gt-reset:
- shard-bmg: [PASS][66] -> [DMESG-WARN][67] ([Intel XE#3876])
[66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-1/igt@xe_exec_reset@parallel-gt-reset.html
[67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-5/igt@xe_exec_reset@parallel-gt-reset.html
* igt@xe_exec_system_allocator@threads-shared-vm-many-large-new-bo-map-nomemset:
- shard-lnl: [PASS][68] -> [FAIL][69] ([Intel XE#5018])
[68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-lnl-7/igt@xe_exec_system_allocator@threads-shared-vm-many-large-new-bo-map-nomemset.html
[69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-6/igt@xe_exec_system_allocator@threads-shared-vm-many-large-new-bo-map-nomemset.html
* igt@xe_exec_system_allocator@threads-shared-vm-many-large-new-busy-nomemset:
- shard-dg2-set2: NOTRUN -> [SKIP][70] ([Intel XE#4915]) +23 other tests skip
[70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-434/igt@xe_exec_system_allocator@threads-shared-vm-many-large-new-busy-nomemset.html
* igt@xe_exec_system_allocator@twice-mmap-new-huge-nomemset:
- shard-lnl: NOTRUN -> [SKIP][71] ([Intel XE#4943]) +2 other tests skip
[71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@xe_exec_system_allocator@twice-mmap-new-huge-nomemset.html
* igt@xe_oa@invalid-oa-format-id:
- shard-dg2-set2: NOTRUN -> [SKIP][72] ([Intel XE#2541] / [Intel XE#3573])
[72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-434/igt@xe_oa@invalid-oa-format-id.html
* igt@xe_pm@s4-d3hot-basic-exec:
- shard-lnl: [PASS][73] -> [ABORT][74] ([Intel XE#1794])
[73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-lnl-1/igt@xe_pm@s4-d3hot-basic-exec.html
[74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-2/igt@xe_pm@s4-d3hot-basic-exec.html
* igt@xe_pm@s4-multiple-execs:
- shard-adlp: [PASS][75] -> [ABORT][76] ([Intel XE#1794])
[75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-adlp-2/igt@xe_pm@s4-multiple-execs.html
[76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-adlp-9/igt@xe_pm@s4-multiple-execs.html
* igt@xe_pmu@all-fn-engine-activity-load:
- shard-adlp: NOTRUN -> [ABORT][77] ([Intel XE#5214])
[77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-adlp-4/igt@xe_pmu@all-fn-engine-activity-load.html
* igt@xe_sriov_auto_provisioning@selfconfig-reprovision-reduce-numvfs:
- shard-dg2-set2: NOTRUN -> [SKIP][78] ([Intel XE#4130])
[78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-434/igt@xe_sriov_auto_provisioning@selfconfig-reprovision-reduce-numvfs.html
- shard-lnl: NOTRUN -> [SKIP][79] ([Intel XE#4130])
[79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-8/igt@xe_sriov_auto_provisioning@selfconfig-reprovision-reduce-numvfs.html
#### Possible fixes ####
* igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-dp-4:
- shard-dg2-set2: [INCOMPLETE][80] ([Intel XE#1727] / [Intel XE#2705] / [Intel XE#3113] / [Intel XE#4212] / [Intel XE#4522]) -> [PASS][81]
[80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-dp-4.html
[81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-463/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-a-dp-4.html
* igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions-varying-size:
- shard-bmg: [SKIP][82] ([Intel XE#2291]) -> [PASS][83] +2 other tests pass
[82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-6/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions-varying-size.html
[83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-1/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions-varying-size.html
* igt@kms_feature_discovery@display-2x:
- shard-bmg: [SKIP][84] ([Intel XE#2373]) -> [PASS][85]
[84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-6/igt@kms_feature_discovery@display-2x.html
[85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-1/igt@kms_feature_discovery@display-2x.html
* igt@kms_flip@2x-flip-vs-expired-vblank@ab-dp2-hdmi-a3:
- shard-bmg: [FAIL][86] ([Intel XE#3321]) -> [PASS][87] +3 other tests pass
[86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-5/igt@kms_flip@2x-flip-vs-expired-vblank@ab-dp2-hdmi-a3.html
[87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-8/igt@kms_flip@2x-flip-vs-expired-vblank@ab-dp2-hdmi-a3.html
* igt@kms_flip@2x-plain-flip-fb-recreate:
- shard-bmg: [SKIP][88] ([Intel XE#2316]) -> [PASS][89] +4 other tests pass
[88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-6/igt@kms_flip@2x-plain-flip-fb-recreate.html
[89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-1/igt@kms_flip@2x-plain-flip-fb-recreate.html
* igt@kms_flip@flip-vs-expired-vblank@d-dp4:
- shard-dg2-set2: [FAIL][90] ([Intel XE#301] / [Intel XE#3321]) -> [PASS][91]
[90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-dg2-436/igt@kms_flip@flip-vs-expired-vblank@d-dp4.html
[91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-463/igt@kms_flip@flip-vs-expired-vblank@d-dp4.html
* igt@kms_flip@flip-vs-suspend:
- shard-adlp: [DMESG-WARN][92] ([Intel XE#2953] / [Intel XE#4173]) -> [PASS][93] +2 other tests pass
[92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-adlp-9/igt@kms_flip@flip-vs-suspend.html
[93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-adlp-1/igt@kms_flip@flip-vs-suspend.html
* igt@kms_flip@wf_vblank-ts-check-interruptible@a-hdmi-a1:
- shard-adlp: [FAIL][94] ([Intel XE#2882]) -> [PASS][95] +1 other test pass
[94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-adlp-3/igt@kms_flip@wf_vblank-ts-check-interruptible@a-hdmi-a1.html
[95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-adlp-1/igt@kms_flip@wf_vblank-ts-check-interruptible@a-hdmi-a1.html
* igt@kms_hdr@static-toggle:
- shard-bmg: [SKIP][96] ([Intel XE#1503]) -> [PASS][97]
[96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-6/igt@kms_hdr@static-toggle.html
[97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-3/igt@kms_hdr@static-toggle.html
* igt@kms_setmode@invalid-clone-single-crtc-stealing:
- shard-bmg: [SKIP][98] ([Intel XE#1435]) -> [PASS][99] +1 other test pass
[98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-6/igt@kms_setmode@invalid-clone-single-crtc-stealing.html
[99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-1/igt@kms_setmode@invalid-clone-single-crtc-stealing.html
* igt@xe_exec_system_allocator@threads-shared-vm-many-large-execqueues-new-bo-map-nomemset:
- shard-lnl: [FAIL][100] ([Intel XE#5018]) -> [PASS][101]
[100]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-lnl-3/igt@xe_exec_system_allocator@threads-shared-vm-many-large-execqueues-new-bo-map-nomemset.html
[101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-lnl-6/igt@xe_exec_system_allocator@threads-shared-vm-many-large-execqueues-new-bo-map-nomemset.html
#### Warnings ####
* igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs:
- shard-dg2-set2: [INCOMPLETE][102] ([Intel XE#1727] / [Intel XE#2705] / [Intel XE#3113] / [Intel XE#4212] / [Intel XE#4345] / [Intel XE#4522]) -> [INCOMPLETE][103] ([Intel XE#2705] / [Intel XE#4212] / [Intel XE#4345])
[102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs.html
[103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-463/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs.html
* igt@kms_content_protection@lic-type-0:
- shard-bmg: [SKIP][104] ([Intel XE#2341]) -> [FAIL][105] ([Intel XE#1178])
[104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-6/igt@kms_content_protection@lic-type-0.html
[105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-1/igt@kms_content_protection@lic-type-0.html
* igt@kms_flip@2x-flip-vs-expired-vblank-interruptible:
- shard-bmg: [FAIL][106] ([Intel XE#3321]) -> [SKIP][107] ([Intel XE#2316])
[106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-2/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible.html
[107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-6/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible.html
* igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-indfb-pgflip-blt:
- shard-bmg: [SKIP][108] ([Intel XE#2311]) -> [SKIP][109] ([Intel XE#2312]) +7 other tests skip
[108]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-7/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-indfb-pgflip-blt.html
[109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-indfb-pgflip-blt.html
* igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-wc:
- shard-bmg: [SKIP][110] ([Intel XE#2312]) -> [SKIP][111] ([Intel XE#2311]) +16 other tests skip
[110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-wc.html
[111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-4/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-plflip-blt:
- shard-bmg: [SKIP][112] ([Intel XE#4141]) -> [SKIP][113] ([Intel XE#2312]) +3 other tests skip
[112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-3/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-plflip-blt.html
[113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-plflip-blt.html
* igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc:
- shard-bmg: [SKIP][114] ([Intel XE#2312]) -> [SKIP][115] ([Intel XE#4141]) +1 other test skip
[114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc.html
[115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-1/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-indfb-plflip-blt:
- shard-bmg: [SKIP][116] ([Intel XE#2312]) -> [SKIP][117] ([Intel XE#2313]) +13 other tests skip
[116]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-indfb-plflip-blt.html
[117]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-4/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-indfb-plflip-blt.html
* igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-plflip-blt:
- shard-bmg: [SKIP][118] ([Intel XE#2313]) -> [SKIP][119] ([Intel XE#2312]) +10 other tests skip
[118]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-2/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-plflip-blt.html
[119]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-plflip-blt.html
* igt@kms_hdr@brightness-with-hdr:
- shard-bmg: [SKIP][120] ([Intel XE#3374] / [Intel XE#3544]) -> [SKIP][121] ([Intel XE#3544])
[120]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-bmg-8/igt@kms_hdr@brightness-with-hdr.html
[121]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-bmg-1/igt@kms_hdr@brightness-with-hdr.html
* igt@kms_tiled_display@basic-test-pattern-with-chamelium:
- shard-dg2-set2: [SKIP][122] ([Intel XE#362]) -> [SKIP][123] ([Intel XE#1500])
[122]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-dg2-463/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
[123]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-dg2-436/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
* igt@xe_pmu@engine-activity-load:
- shard-adlp: [DMESG-WARN][124] ([Intel XE#5214]) -> [ABORT][125] ([Intel XE#5214]) +3 other tests abort
[124]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-adlp-3/igt@xe_pmu@engine-activity-load.html
[125]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-adlp-6/igt@xe_pmu@engine-activity-load.html
* igt@xe_pmu@gt-frequency:
- shard-adlp: [INCOMPLETE][126] ([Intel XE#5214]) -> [ABORT][127] ([Intel XE#5214]) +1 other test abort
[126]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e/shard-adlp-1/igt@xe_pmu@gt-frequency.html
[127]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/shard-adlp-3/igt@xe_pmu@gt-frequency.html
[Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
[Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
[Intel XE#1340]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1340
[Intel XE#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
[Intel XE#1401]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1401
[Intel XE#1406]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1406
[Intel XE#1421]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1421
[Intel XE#1435]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1435
[Intel XE#1466]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1466
[Intel XE#1500]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1500
[Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
[Intel XE#1727]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1727
[Intel XE#1745]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1745
[Intel XE#1794]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1794
[Intel XE#2244]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2244
[Intel XE#2291]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2291
[Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
[Intel XE#2312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2312
[Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
[Intel XE#2314]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2314
[Intel XE#2316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2316
[Intel XE#2341]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2341
[Intel XE#2373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2373
[Intel XE#2541]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2541
[Intel XE#2571]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2571
[Intel XE#2705]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2705
[Intel XE#2763]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2763
[Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
[Intel XE#288]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/288
[Intel XE#2882]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2882
[Intel XE#2894]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2894
[Intel XE#2953]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2953
[Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
[Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
[Intel XE#3113]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3113
[Intel XE#3124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3124
[Intel XE#3321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3321
[Intel XE#3374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3374
[Intel XE#3544]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3544
[Intel XE#3573]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3573
[Intel XE#362]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/362
[Intel XE#373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/373
[Intel XE#3862]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3862
[Intel XE#3876]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3876
[Intel XE#3908]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3908
[Intel XE#4130]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4130
[Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141
[Intel XE#4173]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4173
[Intel XE#4212]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4212
[Intel XE#4345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4345
[Intel XE#4522]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4522
[Intel XE#455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/455
[Intel XE#4837]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4837
[Intel XE#4915]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4915
[Intel XE#4943]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4943
[Intel XE#5018]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5018
[Intel XE#5214]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5214
[Intel XE#651]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/651
[Intel XE#653]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/653
[Intel XE#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
[Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
[Intel XE#929]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/929
Build changes
-------------
* Linux: xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e -> xe-pw-149699v3
IGT_8406: 12d7c99650c85e479571b6db2c392408be474c88 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
xe-3239-00d9cf004336a745e36e9f103acf7925f714d97e: 00d9cf004336a745e36e9f103acf7925f714d97e
xe-pw-149699v3: 149699v3
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-149699v3/index.html
[-- Attachment #2: Type: text/html, Size: 42068 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread