--- a/drivers/gpu/drm/v3d/v3d_drv.h
+++ b/drivers/gpu/drm/v3d/v3d_drv.h
-@@ -121,6 +121,12 @@ struct v3d_dev {
+@@ -124,6 +124,12 @@ struct v3d_dev {
void __iomem *bridge_regs;
void __iomem *gca_regs;
struct clk *clk;
struct reset_control *reset;
/* Virtual and DMA addresses of the single shared page table. */
-@@ -597,3 +603,4 @@ int v3d_perfmon_get_counter_ioctl(struct
+@@ -596,3 +602,4 @@ int v3d_perfmon_get_counter_ioctl(struct
/* v3d_sysfs.c */
int v3d_sysfs_init(struct device *dev);
void v3d_sysfs_destroy(struct device *dev);
--- a/drivers/gpu/drm/v3d/v3d_irq.c
+++ b/drivers/gpu/drm/v3d/v3d_irq.c
-@@ -197,6 +197,7 @@ v3d_hub_irq(int irq, void *arg)
+@@ -183,6 +183,7 @@ v3d_hub_irq(int irq, void *arg)
"GMP",
};
const char *client = "?";
V3D_WRITE(V3D_MMU_CTL, V3D_READ(V3D_MMU_CTL));
-@@ -206,6 +207,7 @@ v3d_hub_irq(int irq, void *arg)
+@@ -192,6 +193,7 @@ v3d_hub_irq(int irq, void *arg)
client = v3d41_axi_ids[axi_id];
}
dev_err(v3d->drm.dev, "MMU error from client %s (%d) at 0x%llx%s%s%s\n",
client, axi_id, (long long)vio_addr,
((intsts & V3D_HUB_INT_MMU_WRV) ?
-@@ -214,6 +216,7 @@ v3d_hub_irq(int irq, void *arg)
+@@ -200,6 +202,7 @@ v3d_hub_irq(int irq, void *arg)
", pte invalid" : ""),
((intsts & V3D_HUB_INT_MMU_CAP) ?
", cap exceeded" : ""));
/* Device and char device-related information */
static DEFINE_IDA(gpio_ida);
static dev_t gpio_devt;
-@@ -2813,8 +2815,8 @@ int gpiod_direction_output(struct gpio_d
+@@ -2815,8 +2817,8 @@ int gpiod_direction_output(struct gpio_d
value = !!value;
/* GPIOs used for enabled IRQs shall not be set as output */
gpiod_err(desc,
"%s: tried to set a GPIO tied to an IRQ as output\n",
__func__);
-@@ -3765,8 +3767,8 @@ int gpiochip_lock_as_irq(struct gpio_chi
+@@ -3767,8 +3769,8 @@ int gpiochip_lock_as_irq(struct gpio_chi
}
/* To be valid for IRQ the line needs to be input or open drain */
const char *gpiod_get_label(struct gpio_desc *desc)
{
-@@ -927,6 +928,7 @@ int gpiochip_add_data_with_key(struct gp
+@@ -946,6 +947,7 @@ int gpiochip_add_data_with_key(struct gp
unsigned int desc_index;
int base = 0;
- int ret = 0;
+ int ret;
+ int id;
- /*
- * First: allocate and populate the internal stat container, and
+ gdev = kzalloc(sizeof(*gdev), GFP_KERNEL);
+ if (!gdev)
@@ -953,7 +955,16 @@ int gpiochip_add_data_with_key(struct gp
- else if (gc->parent)
- device_set_node(&gdev->dev, dev_fwnode(gc->parent));
+ gc->gpiodev = gdev;
+ gpiochip_set_data(gc, data);
-- gdev->id = ida_alloc(&gpio_ida, GFP_KERNEL);
+- ret = ida_alloc(&gpio_ida, GFP_KERNEL);
+ if (first_dynamic_gpiochip_num < 0) {
+ id = of_alias_get_highest_id("gpiochip");
+ first_dynamic_gpiochip_num = (id >= 0) ? (id + 1) : 0;
+ if (id < 0)
+ id = first_dynamic_gpiochip_num;
+
-+ gdev->id = ida_alloc_range(&gpio_ida, id, ~0, GFP_KERNEL);
- if (gdev->id < 0) {
- ret = gdev->id;
++ ret = ida_alloc_range(&gpio_ida, id, ~0, GFP_KERNEL);
+ if (ret < 0)
goto err_free_gdev;
+ gdev->id = ret;
--- a/drivers/gpu/drm/v3d/v3d_drv.h
+++ b/drivers/gpu/drm/v3d/v3d_drv.h
-@@ -151,6 +151,11 @@ struct v3d_dev {
+@@ -154,6 +154,11 @@ struct v3d_dev {
struct drm_mm mm;
spinlock_t mm_lock;
+
struct work_struct overflow_mem_work;
- struct v3d_bin_job *bin_job;
-@@ -548,6 +553,10 @@ void v3d_reset(struct v3d_dev *v3d);
+ struct v3d_cpu_job *cpu_job;
+@@ -547,6 +552,10 @@ void v3d_reset(struct v3d_dev *v3d);
void v3d_invalidate_caches(struct v3d_dev *v3d);
void v3d_clean_caches(struct v3d_dev *v3d);
ret = v3d_sched_init(v3d);
if (ret) {
drm_mm_takedown(&v3d->mm);
-@@ -310,6 +312,7 @@ v3d_gem_destroy(struct drm_device *dev)
- struct v3d_dev *v3d = to_v3d_dev(dev);
+@@ -311,6 +313,7 @@ v3d_gem_destroy(struct drm_device *dev)
+ enum v3d_queue q;
v3d_sched_fini(v3d);
+ v3d_gemfs_fini(v3d);
{
--- a/drivers/gpu/drm/v3d/v3d_drv.h
+++ b/drivers/gpu/drm/v3d/v3d_drv.h
-@@ -553,6 +553,7 @@ void v3d_invalidate_caches(struct v3d_de
+@@ -552,6 +552,7 @@ void v3d_invalidate_caches(struct v3d_de
void v3d_clean_caches(struct v3d_dev *v3d);
/* v3d_gemfs.c */
static const struct drm_driver v3d_drm_driver = {
--- a/drivers/gpu/drm/v3d/v3d_drv.h
+++ b/drivers/gpu/drm/v3d/v3d_drv.h
-@@ -197,6 +197,12 @@ struct v3d_dev {
+@@ -196,6 +196,12 @@ struct v3d_dev {
u32 num_allocated;
u32 pages_allocated;
} bo_stats;
};
static inline struct v3d_dev *
-@@ -608,6 +614,8 @@ int v3d_perfmon_get_values_ioctl(struct
+@@ -607,6 +613,8 @@ int v3d_perfmon_get_values_ioctl(struct
struct drm_file *file_priv);
int v3d_perfmon_get_counter_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv);
--- a/drivers/gpu/drm/v3d/v3d_drv.h
+++ b/drivers/gpu/drm/v3d/v3d_drv.h
-@@ -161,7 +161,6 @@ struct v3d_dev {
- struct v3d_render_job *render_job;
- struct v3d_tfu_job *tfu_job;
- struct v3d_csd_job *csd_job;
+@@ -160,7 +160,6 @@ struct v3d_dev {
+
+ struct work_struct overflow_mem_work;
+
- struct v3d_cpu_job *cpu_job;
struct v3d_queue_state queue[V3D_MAX_QUEUES];
--- a/drivers/gpu/drm/v3d/v3d_sched.c
+++ b/drivers/gpu/drm/v3d/v3d_sched.c
-@@ -664,8 +664,6 @@ v3d_cpu_job_run(struct drm_sched_job *sc
+@@ -684,8 +684,6 @@ v3d_cpu_job_run(struct drm_sched_job *sc
struct v3d_cpu_job *job = to_cpu_job(sched_job);
struct v3d_dev *v3d = job->base.v3d;
+++ /dev/null
-From 23f61178926efa5b4b75c91a45fd315217bcb6c6 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ma=C3=ADra=20Canal?= <mcanal@igalia.com>
-Date: Tue, 11 Mar 2025 15:13:44 -0300
-Subject: [PATCH] drm/v3d: Set job pointer to NULL when the job's fence has an
- error
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Similar to commit e4b5ccd392b9 ("drm/v3d: Ensure job pointer is set to
-NULL after job completion"), ensure the job pointer is set to `NULL` when
-a job's fence has an error. Failing to do so can trigger kernel warnings
-in specific scenarios, such as:
-
-1. v3d_csd_job_run() assigns `v3d->csd_job = job`
-2. CSD job exceeds hang limit, causing a timeout → v3d_gpu_reset_for_timeout()
-3. GPU reset
-4. drm_sched_resubmit_jobs() sets the job's fence to `-ECANCELED`.
-5. v3d_csd_job_run() detects the fence error and returns NULL, not
- submitting the job to the GPU
-6. User-space runs `modprobe -r v3d`
-7. v3d_gem_destroy()
-
-v3d_gem_destroy() triggers a warning indicating that the CSD job never
-ended, as we didn't set `v3d->csd_job` to NULL after the timeout. The same
-can also happen to BIN, RENDER, and TFU jobs.
-
-Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
-Signed-off-by: Maíra Canal <mcanal@igalia.com>
----
- drivers/gpu/drm/v3d/v3d_sched.c | 18 ++++++++++++++----
- 1 file changed, 14 insertions(+), 4 deletions(-)
-
---- a/drivers/gpu/drm/v3d/v3d_sched.c
-+++ b/drivers/gpu/drm/v3d/v3d_sched.c
-@@ -216,8 +216,12 @@ static struct dma_fence *v3d_bin_job_run
- struct dma_fence *fence;
- unsigned long irqflags;
-
-- if (unlikely(job->base.base.s_fence->finished.error))
-+ if (unlikely(job->base.base.s_fence->finished.error)) {
-+ spin_lock_irqsave(&v3d->job_lock, irqflags);
-+ v3d->bin_job = NULL;
-+ spin_unlock_irqrestore(&v3d->job_lock, irqflags);
- return NULL;
-+ }
-
- /* Lock required around bin_job update vs
- * v3d_overflow_mem_work().
-@@ -271,8 +275,10 @@ static struct dma_fence *v3d_render_job_
- struct drm_device *dev = &v3d->drm;
- struct dma_fence *fence;
-
-- if (unlikely(job->base.base.s_fence->finished.error))
-+ if (unlikely(job->base.base.s_fence->finished.error)) {
-+ v3d->render_job = NULL;
- return NULL;
-+ }
-
- v3d->render_job = job;
-
-@@ -317,8 +323,10 @@ v3d_tfu_job_run(struct drm_sched_job *sc
- struct drm_device *dev = &v3d->drm;
- struct dma_fence *fence;
-
-- if (unlikely(job->base.base.s_fence->finished.error))
-+ if (unlikely(job->base.base.s_fence->finished.error)) {
-+ v3d->tfu_job = NULL;
- return NULL;
-+ }
-
- v3d->tfu_job = job;
-
-@@ -363,8 +371,10 @@ v3d_csd_job_run(struct drm_sched_job *sc
- struct dma_fence *fence;
- int i, csd_cfg0_reg;
-
-- if (unlikely(job->base.base.s_fence->finished.error))
-+ if (unlikely(job->base.base.s_fence->finished.error)) {
-+ v3d->csd_job = NULL;
- return NULL;
-+ }
-
- v3d->csd_job = job;
-
goto clk_disable;
--- a/drivers/gpu/drm/v3d/v3d_drv.h
+++ b/drivers/gpu/drm/v3d/v3d_drv.h
-@@ -100,11 +100,18 @@ enum v3d_irq {
+@@ -103,11 +103,18 @@ enum v3d_irq {
V3D_MAX_IRQS,
};
/* Short representation (e.g. 5, 6) of the V3D tech revision */
int rev;
-@@ -213,7 +220,7 @@ to_v3d_dev(struct drm_device *dev)
+@@ -212,7 +219,7 @@ to_v3d_dev(struct drm_device *dev)
static inline bool
v3d_has_csd(struct v3d_dev *v3d)
{
V3D_CORE_WRITE(core, V3D_CTL_L2CACTL,
--- a/drivers/gpu/drm/v3d/v3d_irq.c
+++ b/drivers/gpu/drm/v3d/v3d_irq.c
-@@ -143,7 +143,7 @@ v3d_irq(int irq, void *arg)
+@@ -137,7 +137,7 @@ v3d_irq(int irq, void *arg)
/* We shouldn't be triggering these if we have GMP in
* always-allowed mode.
*/
dev_err(v3d->drm.dev, "GMP violation\n");
/* V3D 4.2 wires the hub and core IRQs together, so if we &
-@@ -201,7 +201,7 @@ v3d_hub_irq(int irq, void *arg)
+@@ -187,7 +187,7 @@ v3d_hub_irq(int irq, void *arg)
V3D_WRITE(V3D_MMU_CTL, V3D_READ(V3D_MMU_CTL));
axi_id = axi_id >> 5;
if (axi_id < ARRAY_SIZE(v3d41_axi_ids))
client = v3d41_axi_ids[axi_id];
-@@ -220,7 +220,7 @@ v3d_hub_irq(int irq, void *arg)
+@@ -206,7 +206,7 @@ v3d_hub_irq(int irq, void *arg)
status = IRQ_HANDLED;
}
V3D_WRITE(V3D_TFU_COEF1(v3d->ver), job->args.coef[1]);
V3D_WRITE(V3D_TFU_COEF2(v3d->ver), job->args.coef[2]);
V3D_WRITE(V3D_TFU_COEF3(v3d->ver), job->args.coef[3]);
-@@ -402,7 +402,7 @@ v3d_csd_job_run(struct drm_sched_job *sc
+@@ -412,7 +412,7 @@ v3d_csd_job_run(struct drm_sched_job *sc
*
* XXX: Set the CFG7 register
*/
--- a/drivers/gpu/drm/v3d/v3d_drv.h
+++ b/drivers/gpu/drm/v3d/v3d_drv.h
-@@ -126,6 +126,7 @@ struct v3d_dev {
+@@ -129,6 +129,7 @@ struct v3d_dev {
void __iomem *core_regs[3];
void __iomem *bridge_regs;
void __iomem *gca_regs;
struct clk *clk;
struct delayed_work clk_down_work;
unsigned long clk_up_rate, clk_down_rate;
-@@ -282,6 +283,15 @@ to_v3d_fence(struct dma_fence *fence)
+@@ -281,6 +282,15 @@ to_v3d_fence(struct dma_fence *fence)
#define V3D_GCA_READ(offset) readl(v3d->gca_regs + offset)
#define V3D_GCA_WRITE(offset, val) writel(val, v3d->gca_regs + offset)
#define V3D_CORE_READ(core, offset) readl(v3d->core_regs[core] + offset)
#define V3D_CORE_WRITE(core, offset, val) writel(val, v3d->core_regs[core] + offset)
-@@ -560,6 +570,7 @@ struct dma_fence *v3d_fence_create(struc
+@@ -559,6 +569,7 @@ struct dma_fence *v3d_fence_create(struc
/* v3d_gem.c */
int v3d_gem_init(struct drm_device *dev);
void v3d_gem_destroy(struct drm_device *dev);
print_constraints(rdev);
return 0;
}
-@@ -4651,6 +4678,87 @@ int regulator_get_current_limit(struct r
+@@ -4659,6 +4686,87 @@ int regulator_get_current_limit(struct r
EXPORT_SYMBOL_GPL(regulator_get_current_limit);
/**
* regulator_set_mode - set regulator operating mode
* @regulator: regulator source
* @mode: operating mode - one of the REGULATOR_MODE constants
-@@ -5288,6 +5396,8 @@ static struct attribute *regulator_dev_a
+@@ -5296,6 +5404,8 @@ static struct attribute *regulator_dev_a
&dev_attr_suspend_standby_mode.attr,
&dev_attr_suspend_mem_mode.attr,
&dev_attr_suspend_disk_mode.attr,
NULL
};
-@@ -5369,6 +5479,10 @@ static umode_t regulator_attr_is_visible
+@@ -5377,6 +5487,10 @@ static umode_t regulator_attr_is_visible
attr == &dev_attr_suspend_disk_mode.attr)
return ops->set_suspend_mode ? mode : 0;
-LINUX_VERSION-6.12 = .94
-LINUX_KERNEL_HASH-6.12.94 = e998a232b9418db3301cb58468e291a4f41d6ab8306029b30d991f56251dc8d2
+LINUX_VERSION-6.12 = .95
+LINUX_KERNEL_HASH-6.12.95 = a9e8c51fcb1e695d1d35dde5886cba579cb6f29c9646c5889f39d63841d4b9f6
+device_initcall(blk_notifications_init);
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
-@@ -1753,4 +1753,12 @@ static inline bool bdev_can_atomic_write
+@@ -1749,4 +1749,12 @@ static inline bool bdev_can_atomic_write
#define DEFINE_IO_COMP_BATCH(name) struct io_comp_batch name = { }
struct rtnl_link {
rtnl_doit_func doit;
-@@ -5013,7 +5013,9 @@ int ndo_dflt_bridge_getlink(struct sk_bu
+@@ -5021,7 +5021,9 @@ int ndo_dflt_bridge_getlink(struct sk_bu
brport_nla_put_flag(skb, flags, mask,
IFLA_BRPORT_MCAST_FLOOD, BR_MCAST_FLOOD) ||
brport_nla_put_flag(skb, flags, mask,
--- a/include/linux/err.h
+++ b/include/linux/err.h
-@@ -41,6 +41,14 @@ static inline void * __must_check ERR_PT
+@@ -41,6 +41,14 @@ static __always_inline void * __must_che
return (void *) error;
}
--- a/drivers/pci/controller/dwc/pcie-qcom.c
+++ b/drivers/pci/controller/dwc/pcie-qcom.c
-@@ -1832,6 +1832,7 @@ static const struct of_device_id qcom_pc
+@@ -1827,6 +1827,7 @@ static const struct of_device_id qcom_pc
{ .compatible = "qcom,pcie-apq8064", .data = &cfg_2_1_0 },
{ .compatible = "qcom,pcie-apq8084", .data = &cfg_1_0_0 },
{ .compatible = "qcom,pcie-ipq4019", .data = &cfg_2_4_0 },