187 lines
7.1 KiB
Diff
187 lines
7.1 KiB
Diff
From 74b646def907e81b6d4ffdd13873c37ba3c88db9 Mon Sep 17 00:00:00 2001
|
|
From: Michal Schmidt <mschmidt@redhat.com>
|
|
Date: Mon, 22 Jun 2026 17:14:27 +0200
|
|
Subject: [PATCH] dpll: extend pin notifier with notification source ID
|
|
|
|
JIRA: https://redhat.atlassian.net/browse/RHEL-186631
|
|
|
|
commit 0bf47f722fa9e4ecdab7497afc1af64330540bed
|
|
Author: Grzegorz Nitka <grzegorz.nitka@intel.com>
|
|
Date: Sun Jun 7 20:30:40 2026 +0200
|
|
|
|
dpll: extend pin notifier with notification source ID
|
|
|
|
Extend the DPLL pin notification API to include a source identifier
|
|
indicating where the notification originates. This allows notifier
|
|
consumers to distinguish between notifications coming from
|
|
an associated DPLL instance, a parent pin, or the pin itself.
|
|
|
|
A new field, src_clock_id, is added to struct dpll_pin_notifier_info
|
|
and is passed through all pin-related notification paths. Callers of
|
|
dpll_pin_notify() are updated to provide a meaningful source identifier
|
|
based on their context:
|
|
- pin registration/unregistration uses the DPLL's clock_id,
|
|
- pin-on-pin operations use the parent pin's clock_id,
|
|
- pin changes use the pin's own clock_id.
|
|
|
|
As introduced in the commit ("dpll: allow registering FW-identified pin
|
|
with a different DPLL"), it is possible to share the same physical pin
|
|
via firmware description (fwnode) with DPLL objects from different
|
|
kernel modules. This means that a given pin can be registered multiple
|
|
times.
|
|
|
|
Driver such as ICE (E825 devices) rely on this mechanism when listening
|
|
for the event where a shared-fwnode pin appears, while avoiding reacting
|
|
to events triggered by their own registration logic.
|
|
|
|
This change only extends the notification metadata and does not alter
|
|
existing semantics for drivers that do not use the new field.
|
|
|
|
Reviewed-by: Arkadiusz Kubalewski <arkadiusz.kubalewski@intel.com>
|
|
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
|
|
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
|
|
Signed-off-by: Grzegorz Nitka <grzegorz.nitka@intel.com>
|
|
Link: https://patch.msgid.link/20260607183045.1213735-9-grzegorz.nitka@intel.com
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
|
|
Signed-off-by: Michal Schmidt <mschmidt@redhat.com>
|
|
|
|
diff --git a/drivers/dpll/dpll_core.c b/drivers/dpll/dpll_core.c
|
|
index 6020810..2c57527 100644
|
|
--- a/drivers/dpll/dpll_core.c
|
|
+++ b/drivers/dpll/dpll_core.c
|
|
@@ -72,7 +72,8 @@ void dpll_device_notify(struct dpll_device *dpll, unsigned long action)
|
|
call_dpll_notifiers(action, &info);
|
|
}
|
|
|
|
-void dpll_pin_notify(struct dpll_pin *pin, unsigned long action)
|
|
+void dpll_pin_notify(struct dpll_pin *pin, u64 src_clock_id,
|
|
+ unsigned long action)
|
|
{
|
|
struct dpll_pin_notifier_info info = {
|
|
.pin = pin,
|
|
@@ -81,6 +82,7 @@ void dpll_pin_notify(struct dpll_pin *pin, unsigned long action)
|
|
.clock_id = pin->clock_id,
|
|
.fwnode = pin->fwnode,
|
|
.prop = &pin->prop,
|
|
+ .src_clock_id = src_clock_id,
|
|
};
|
|
|
|
call_dpll_notifiers(action, &info);
|
|
@@ -849,7 +851,7 @@ __dpll_pin_register(struct dpll_device *dpll, struct dpll_pin *pin,
|
|
if (ret)
|
|
goto ref_pin_del;
|
|
xa_set_mark(&dpll_pin_xa, pin->id, DPLL_REGISTERED);
|
|
- dpll_pin_create_ntf(pin);
|
|
+ dpll_pin_create_ntf(pin, dpll->clock_id);
|
|
|
|
return ret;
|
|
|
|
@@ -926,7 +928,7 @@ __dpll_pin_unregister(struct dpll_device *dpll, struct dpll_pin *pin,
|
|
const struct dpll_pin_ops *ops, void *priv, void *cookie)
|
|
{
|
|
ASSERT_DPLL_PIN_REGISTERED(pin);
|
|
- dpll_pin_delete_ntf(pin);
|
|
+ dpll_pin_delete_ntf(pin, dpll->clock_id);
|
|
dpll_xa_ref_pin_del(&dpll->pin_refs, pin, ops, priv, cookie);
|
|
dpll_xa_ref_dpll_del(&pin->dpll_refs, dpll, ops, priv, cookie);
|
|
if (xa_empty(&pin->dpll_refs)) {
|
|
@@ -999,7 +1001,7 @@ int dpll_pin_on_pin_register(struct dpll_pin *parent, struct dpll_pin *pin,
|
|
stop = i;
|
|
goto dpll_unregister;
|
|
}
|
|
- dpll_pin_create_ntf(pin);
|
|
+ dpll_pin_create_ntf(pin, parent->clock_id);
|
|
}
|
|
mutex_unlock(&dpll_lock);
|
|
|
|
@@ -1008,7 +1010,7 @@ int dpll_pin_on_pin_register(struct dpll_pin *parent, struct dpll_pin *pin,
|
|
dpll_unregister:
|
|
xa_for_each(&parent->dpll_refs, i, ref)
|
|
if (i < stop) {
|
|
- dpll_pin_delete_ntf(pin);
|
|
+ dpll_pin_delete_ntf(pin, parent->clock_id);
|
|
__dpll_pin_unregister(ref->dpll, pin, ops, priv,
|
|
parent);
|
|
}
|
|
@@ -1041,7 +1043,7 @@ void dpll_pin_on_pin_unregister(struct dpll_pin *parent, struct dpll_pin *pin,
|
|
reg = dpll_pin_registration_find(ref, ops, priv, parent);
|
|
if (!reg)
|
|
continue;
|
|
- dpll_pin_delete_ntf(pin);
|
|
+ dpll_pin_delete_ntf(pin, parent->clock_id);
|
|
__dpll_pin_unregister(ref->dpll, pin, ops, priv, parent);
|
|
}
|
|
dpll_xa_ref_pin_del(&pin->parent_refs, parent, ops, priv, pin);
|
|
diff --git a/drivers/dpll/dpll_core.h b/drivers/dpll/dpll_core.h
|
|
index fcc1564..e4bb4b2 100644
|
|
--- a/drivers/dpll/dpll_core.h
|
|
+++ b/drivers/dpll/dpll_core.h
|
|
@@ -110,6 +110,7 @@ extern struct xarray dpll_pin_xa;
|
|
extern struct mutex dpll_lock;
|
|
|
|
void dpll_device_notify(struct dpll_device *dpll, unsigned long action);
|
|
-void dpll_pin_notify(struct dpll_pin *pin, unsigned long action);
|
|
+void dpll_pin_notify(struct dpll_pin *pin, u64 src_clock_id,
|
|
+ unsigned long action);
|
|
|
|
#endif
|
|
diff --git a/drivers/dpll/dpll_netlink.c b/drivers/dpll/dpll_netlink.c
|
|
index bdd3637..0428da3 100644
|
|
--- a/drivers/dpll/dpll_netlink.c
|
|
+++ b/drivers/dpll/dpll_netlink.c
|
|
@@ -924,15 +924,15 @@ dpll_pin_event_send(enum dpll_cmd event, struct dpll_pin *pin)
|
|
return ret;
|
|
}
|
|
|
|
-int dpll_pin_create_ntf(struct dpll_pin *pin)
|
|
+int dpll_pin_create_ntf(struct dpll_pin *pin, u64 src_clock_id)
|
|
{
|
|
- dpll_pin_notify(pin, DPLL_PIN_CREATED);
|
|
+ dpll_pin_notify(pin, src_clock_id, DPLL_PIN_CREATED);
|
|
return dpll_pin_event_send(DPLL_CMD_PIN_CREATE_NTF, pin);
|
|
}
|
|
|
|
-int dpll_pin_delete_ntf(struct dpll_pin *pin)
|
|
+int dpll_pin_delete_ntf(struct dpll_pin *pin, u64 src_clock_id)
|
|
{
|
|
- dpll_pin_notify(pin, DPLL_PIN_DELETED);
|
|
+ dpll_pin_notify(pin, src_clock_id, DPLL_PIN_DELETED);
|
|
return dpll_pin_event_send(DPLL_CMD_PIN_DELETE_NTF, pin);
|
|
}
|
|
|
|
@@ -947,7 +947,7 @@ int dpll_pin_delete_ntf(struct dpll_pin *pin)
|
|
int __dpll_pin_change_ntf(struct dpll_pin *pin)
|
|
{
|
|
lockdep_assert_held(&dpll_lock);
|
|
- dpll_pin_notify(pin, DPLL_PIN_CHANGED);
|
|
+ dpll_pin_notify(pin, pin->clock_id, DPLL_PIN_CHANGED);
|
|
return dpll_pin_event_send(DPLL_CMD_PIN_CHANGE_NTF, pin);
|
|
}
|
|
EXPORT_SYMBOL_GPL(__dpll_pin_change_ntf);
|
|
diff --git a/drivers/dpll/dpll_netlink.h b/drivers/dpll/dpll_netlink.h
|
|
index a9cfd55..4f63aa5 100644
|
|
--- a/drivers/dpll/dpll_netlink.h
|
|
+++ b/drivers/dpll/dpll_netlink.h
|
|
@@ -8,6 +8,6 @@ int dpll_device_create_ntf(struct dpll_device *dpll);
|
|
|
|
int dpll_device_delete_ntf(struct dpll_device *dpll);
|
|
|
|
-int dpll_pin_create_ntf(struct dpll_pin *pin);
|
|
+int dpll_pin_create_ntf(struct dpll_pin *pin, u64 src_clock_id);
|
|
|
|
-int dpll_pin_delete_ntf(struct dpll_pin *pin);
|
|
+int dpll_pin_delete_ntf(struct dpll_pin *pin, u64 src_clock_id);
|
|
diff --git a/include/linux/dpll.h b/include/linux/dpll.h
|
|
index 5ee402f..6117120 100644
|
|
--- a/include/linux/dpll.h
|
|
+++ b/include/linux/dpll.h
|
|
@@ -265,6 +265,7 @@ struct dpll_pin_notifier_info {
|
|
u64 clock_id;
|
|
const struct fwnode_handle *fwnode;
|
|
const struct dpll_pin_properties *prop;
|
|
+ u64 src_clock_id;
|
|
};
|
|
|
|
#if IS_ENABLED(CONFIG_DPLL)
|