Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package powerpc-utils for openSUSE:Factory 
checked in at 2024-09-22 11:05:41
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/powerpc-utils (Old)
 and      /work/SRC/openSUSE:Factory/.powerpc-utils.new.29891 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "powerpc-utils"

Sun Sep 22 11:05:41 2024 rev:145 rq:1202241 version:1.3.12

Changes:
--------
--- /work/SRC/openSUSE:Factory/powerpc-utils/powerpc-utils.changes      
2024-08-01 22:04:10.115821248 +0200
+++ /work/SRC/openSUSE:Factory/.powerpc-utils.new.29891/powerpc-utils.changes   
2024-09-22 11:05:55.468365036 +0200
@@ -1,0 +2,9 @@
+Fri Sep 20 06:15:46 UTC 2024 - Michal Suchanek <[email protected]>
+
+- dlpar: move key portions of I/O hotplug into kernel (jsc#PED-10566, 
jsc#PED-9919).
+  * 0001-drmgr-pci-Enable-in-kernel-functionality-to-update-d.patch
+  * 0002-drmgr-SLOT-Add-kernel-interface-support-for-device-t.patch
+  * 0003-drmgr-pci-Add-kernel-interface-support-for-device-tr.patch
+  * 0004-drmgr-phb-Add-kernel-interface-support-for-device-tr.patch
+
+-------------------------------------------------------------------

New:
----
  0001-drmgr-pci-Enable-in-kernel-functionality-to-update-d.patch
  0002-drmgr-SLOT-Add-kernel-interface-support-for-device-t.patch
  0003-drmgr-pci-Add-kernel-interface-support-for-device-tr.patch
  0004-drmgr-phb-Add-kernel-interface-support-for-device-tr.patch

BETA DEBUG BEGIN:
  New:- dlpar: move key portions of I/O hotplug into kernel (jsc#PED-10566, 
jsc#PED-9919).
  * 0001-drmgr-pci-Enable-in-kernel-functionality-to-update-d.patch
  * 0002-drmgr-SLOT-Add-kernel-interface-support-for-device-t.patch
  New:  * 0001-drmgr-pci-Enable-in-kernel-functionality-to-update-d.patch
  * 0002-drmgr-SLOT-Add-kernel-interface-support-for-device-t.patch
  * 0003-drmgr-pci-Add-kernel-interface-support-for-device-tr.patch
  New:  * 0002-drmgr-SLOT-Add-kernel-interface-support-for-device-t.patch
  * 0003-drmgr-pci-Add-kernel-interface-support-for-device-tr.patch
  * 0004-drmgr-phb-Add-kernel-interface-support-for-device-tr.patch
  New:  * 0003-drmgr-pci-Add-kernel-interface-support-for-device-tr.patch
  * 0004-drmgr-phb-Add-kernel-interface-support-for-device-tr.patch
BETA DEBUG END:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ powerpc-utils.spec ++++++
--- /var/tmp/diff_new_pack.wlL6yW/_old  2024-09-22 11:05:56.148393123 +0200
+++ /var/tmp/diff_new_pack.wlL6yW/_new  2024-09-22 11:05:56.148393123 +0200
@@ -37,6 +37,10 @@
 Patch10:        0002-lparstat-Fix-Idle-and-busy-PURR-SPURR.patch
 Patch11:        0003-lparstat-app-Use-pic-value-at-boot-for-accurate-boot.patch
 Patch12:        0004-lparstat-Use-CLOCK_BOOTTIME-for-get_time-interface-a.patch
+Patch13:        0001-drmgr-pci-Enable-in-kernel-functionality-to-update-d.patch
+Patch14:        0002-drmgr-SLOT-Add-kernel-interface-support-for-device-t.patch
+Patch15:        0003-drmgr-pci-Add-kernel-interface-support-for-device-tr.patch
+Patch16:        0004-drmgr-phb-Add-kernel-interface-support-for-device-tr.patch
 BuildRequires:  autoconf
 BuildRequires:  automake
 BuildRequires:  libnuma-devel

++++++ 0001-drmgr-pci-Enable-in-kernel-functionality-to-update-d.patch ++++++
>From a6a7d375d38823a08d358b50866a95f6f326907e Mon Sep 17 00:00:00 2001
From: Haren Myneni <[email protected]>
Date: Tue, 13 Aug 2024 14:40:23 -0700
Subject: [PATCH 1/4] drmgr/pci: Enable in-kernel functionality to update
 device tree

drmgr updates the device tree by writing to /proc/ppc64/ofdt. Also
invokes configure_connector RTAS call to retrieve new device nodes
for IO ADD. But this functionality need /dev/mem access which is
restricted under system lockdown.

The kernel updates provided a sysfs file (/sys/kernel/dlpar) that
will allow drmgr command invoke the following interfaces to update
the device tree.

dt add index <DRC index> ---> To add new device nodes to the device
tree which is used for IO ADD.

dt remove index <DRC index> ---> To remove device nodes for IO
REMOVE

This patch checks the kernel interface for the availability of
device tree update feature and adds do_dt_kernel_dlpar() to invoke
the above kernel interfaces.

Signed-off-by: Haren Myneni <[email protected]>
---
 src/drmgr/common.c     |  6 ++++++
 src/drmgr/common_pci.c | 29 +++++++++++++++++++++++++++++
 src/drmgr/dr.h         |  1 +
 3 files changed, 36 insertions(+)

diff --git a/src/drmgr/common.c b/src/drmgr/common.c
index bfec0b9bb966..70f4dfda92a5 100644
--- a/src/drmgr/common.c
+++ b/src/drmgr/common.c
@@ -1504,6 +1504,12 @@ int kernel_dlpar_exists(void)
                        if (strstr(buf, "cpu"))
                                return 1;
                        break;
+               case DRC_TYPE_PCI:
+               case DRC_TYPE_PHB:
+               case DRC_TYPE_SLOT:
+                       if (strstr(buf, "dt"))
+                               return 1;
+                       break;
                default:
                        return 0;
                }
diff --git a/src/drmgr/common_pci.c b/src/drmgr/common_pci.c
index 1ef4ec9653b0..374129cf33e0 100644
--- a/src/drmgr/common_pci.c
+++ b/src/drmgr/common_pci.c
@@ -1619,3 +1619,32 @@ int disable_hp_children(char *drc_name)
        }
        return 0;
 }
+
+/*
+ * kernel interface to update device tree nodes.
+ * dlpar dt [add|remove] index <#drc index>
+ */
+int do_dt_kernel_dlpar(uint32_t index, int action)
+{
+       char cmdbuf[256];
+       int offset;
+
+       offset = sprintf(cmdbuf, "%s ", "dt");
+
+       switch (action) {
+       case ADD:
+               offset += sprintf(cmdbuf + offset, "add ");
+               break;
+       case REMOVE:
+               offset += sprintf(cmdbuf + offset, "remove ");
+               break;
+       default:
+               /* Should not happen */
+               say(ERROR, "Invalid action type specified\n");
+               return -EINVAL;
+       }
+
+       offset += sprintf(cmdbuf + offset, "index 0x%x", index);
+
+       return do_kernel_dlpar(cmdbuf, offset);
+}
diff --git a/src/drmgr/dr.h b/src/drmgr/dr.h
index 60c31c44b7e3..72ede55547a3 100644
--- a/src/drmgr/dr.h
+++ b/src/drmgr/dr.h
@@ -188,4 +188,5 @@ static inline int do_kernel_dlpar(const char *cmd, int len)
 {
        return do_kernel_dlpar_common(cmd, len, 0);
 }
+int do_dt_kernel_dlpar(uint32_t, int);
 #endif
-- 
2.46.0


++++++ 0002-drmgr-SLOT-Add-kernel-interface-support-for-device-t.patch ++++++
>From e2388681df4aec97ab9a3f883baf37f51a710a00 Mon Sep 17 00:00:00 2001
From: Haren Myneni <[email protected]>
Date: Tue, 13 Aug 2024 14:40:26 -0700
Subject: [PATCH 2/4] drmgr/SLOT: Add kernel interface support for device tree
 update

Use the following kernel interfaces for SLOT device type to update
the device tree if this feature is enabled in the kernel.

dt add index <DRC index>  --> for IO add
dt remove index <DRC index> --> for IO remove

Signed-off-by: Haren Myneni <[email protected]>
---
 src/drmgr/drslot_chrp_slot.c | 25 +++++++++++++++++--------
 1 file changed, 17 insertions(+), 8 deletions(-)

diff --git a/src/drmgr/drslot_chrp_slot.c b/src/drmgr/drslot_chrp_slot.c
index 0966c256aa01..180b10857add 100644
--- a/src/drmgr/drslot_chrp_slot.c
+++ b/src/drmgr/drslot_chrp_slot.c
@@ -71,7 +71,10 @@ release_slot(struct dr_node *slot)
        if (rc)
                return rc;
 
-       rc = remove_device_tree_nodes(slot->ofdt_path);
+       if (kernel_dlpar_exists())
+               rc = do_dt_kernel_dlpar(slot->drc_index, REMOVE);
+       else
+               rc = remove_device_tree_nodes(slot->ofdt_path);
        if (rc) {
                acquire_drc(slot->drc_index);
                return rc;
@@ -160,7 +163,6 @@ static int
 acquire_slot(char *drc_name, struct dr_node **slot)
 {
        struct dr_connector drc;
-       struct of_node *of_nodes;
        char path[DR_PATH_MAX];
        int rc;
 
@@ -180,14 +182,21 @@ acquire_slot(char *drc_name, struct dr_node **slot)
        if (rc)
                return rc;
 
-       of_nodes = configure_connector(drc.index);
-       if (of_nodes == NULL) {
-               release_drc(drc.index, PCI_DLPAR_DEV);
-               return -1;
+       if (kernel_dlpar_exists()) {
+               rc = do_dt_kernel_dlpar(drc.index, ADD);
+       } else {
+               struct of_node *of_nodes;
+
+               of_nodes = configure_connector(drc.index);
+               if (of_nodes == NULL) {
+                       release_drc(drc.index, PCI_DLPAR_DEV);
+                       return -1;
+               }
+
+               rc = add_device_tree_nodes(path, of_nodes);
+               free_of_node(of_nodes);
        }
 
-       rc = add_device_tree_nodes(path, of_nodes);
-       free_of_node(of_nodes);
        if (rc) {
                say(ERROR, "add_device_tree_nodes failed at %s\n", path);
                release_drc(drc.index, PCI_DLPAR_DEV);
-- 
2.46.0


++++++ 0003-drmgr-pci-Add-kernel-interface-support-for-device-tr.patch ++++++
>From 7038756642711fa53143906b3b3f29900eb4a4ea Mon Sep 17 00:00:00 2001
From: Haren Myneni <[email protected]>
Date: Tue, 13 Aug 2024 14:40:25 -0700
Subject: [PATCH 3/4] drmgr/pci: Add kernel interface support for device tree
 update

Use the following kernel interfaces for PCI device type to update
the device tree if this feature is enabled in the kernel.

dt add index <DRC index>  --> for IO add
dt remove index <DRC index> --> for IO remove

Signed-off-by: Haren Myneni <[email protected]>
---
 src/drmgr/drslot_chrp_pci.c | 32 ++++++++++++++++++++++----------
 1 file changed, 22 insertions(+), 10 deletions(-)

diff --git a/src/drmgr/drslot_chrp_pci.c b/src/drmgr/drslot_chrp_pci.c
index 3b48de30be66..56f8bb397e67 100644
--- a/src/drmgr/drslot_chrp_pci.c
+++ b/src/drmgr/drslot_chrp_pci.c
@@ -366,7 +366,6 @@ static int add_work(struct dr_node *node)
        int pow_state;  /* Tells us if power was turned on when  */
        int iso_state;  /* Tells us isolation state after        */
        int rc;
-       struct of_node *new_nodes;/* nodes returned from configure_connector */
 
        /* if we're continuing, set LED_ON and see if a card is really there. */
        if (process_led(node, LED_ON))
@@ -425,16 +424,26 @@ static int add_work(struct dr_node *node)
         * the return status requires a message, print it out
         * and exit, otherwise, add the nodes to the OF tree.
         */
-       new_nodes = configure_connector(node->drc_index);
-       if (new_nodes == NULL) {
-               rtas_set_indicator(ISOLATION_STATE, node->drc_index, ISOLATE);
-               set_power(node->drc_power, POWER_OFF);
-               return -1;
+       if (kernel_dlpar_exists()) {
+               rc = do_dt_kernel_dlpar(node->drc_index, ADD);
+       } else {
+               struct of_node *new_nodes; /* nodes returned from */
+                                          /* configure_connector */
+
+               new_nodes = configure_connector(node->drc_index);
+               if (new_nodes == NULL) {
+                       rtas_set_indicator(ISOLATION_STATE, node->drc_index,
+                                       ISOLATE);
+                       set_power(node->drc_power, POWER_OFF);
+                       return -1;
+               }
+
+               say(DEBUG, "Adding %s to %s\n", new_nodes->name,
+                               node->ofdt_path);
+               rc = add_device_tree_nodes(node->ofdt_path, new_nodes);
+               free_of_node(new_nodes);
        }
 
-       say(DEBUG, "Adding %s to %s\n", new_nodes->name, node->ofdt_path);
-       rc = add_device_tree_nodes(node->ofdt_path, new_nodes);
-       free_of_node(new_nodes);
        if (rc) {
                say(DEBUG, "add_device_tree_nodes failed at %s\n",
                    node->ofdt_path);
@@ -692,7 +701,10 @@ static struct dr_node *remove_work(struct dr_node 
*all_nodes)
         * the device tree.
         */
        for (child = node->children; child; child = child->next) {
-               rc = remove_device_tree_nodes(child->ofdt_path);
+               if (kernel_dlpar_exists())
+                       rc = do_dt_kernel_dlpar(child->drc_index, REMOVE);
+               else
+                       rc = remove_device_tree_nodes(child->ofdt_path);
                if (rc) {
                        say(ERROR, "%s", sw_error);
                        rtas_set_indicator(ISOLATION_STATE, node->drc_index,
-- 
2.46.0


++++++ 0004-drmgr-phb-Add-kernel-interface-support-for-device-tr.patch ++++++
>From b8ab373035984dd8aba29f1a0c03dcef6546f004 Mon Sep 17 00:00:00 2001
From: Haren Myneni <[email protected]>
Date: Tue, 13 Aug 2024 14:40:24 -0700
Subject: [PATCH 4/4] drmgr/phb: Add kernel interface support for device tree
 update

Use the following kernel interfaces for PHB device type to update
the device tree if this feature is enabled in the kernel.

dt add index <DRC index>  --> for IO add
dt remove index <DRC index> --> for IO remove

Signed-off-by: Haren Myneni <[email protected]>
---
 src/drmgr/common_pci.c      | 29 +++++++++++++++++++++-------
 src/drmgr/drslot_chrp_phb.c | 38 ++++++++++++++++++++-----------------
 2 files changed, 43 insertions(+), 24 deletions(-)

diff --git a/src/drmgr/common_pci.c b/src/drmgr/common_pci.c
index 374129cf33e0..540864574569 100644
--- a/src/drmgr/common_pci.c
+++ b/src/drmgr/common_pci.c
@@ -1390,7 +1390,6 @@ print_node_list(struct dr_node *first_node)
 static int
 acquire_hp_resource(struct dr_connector *drc, char *of_path)
 {
-       struct of_node *new_nodes;
        int state;
        int rc;
 
@@ -1429,12 +1428,21 @@ acquire_hp_resource(struct dr_connector *drc, char 
*of_path)
        }
 
        if (state == PRESENT) {
-               new_nodes = configure_connector(drc->index);
-               if (new_nodes == NULL)
-                       return -1;
+               /*
+                * Use kernel DLPAR interface if it is enabled
+                */
+               if (kernel_dlpar_exists()) {
+                       rc = do_dt_kernel_dlpar(drc->index, ADD);
+               } else {
+                       struct of_node *new_nodes;
+
+                       new_nodes = configure_connector(drc->index);
+                       if (new_nodes == NULL)
+                               return -1;
 
-               rc = add_device_tree_nodes(of_path, new_nodes);
-               free_of_node(new_nodes);
+                       rc = add_device_tree_nodes(of_path, new_nodes);
+                       free_of_node(new_nodes);
+               }
                if (rc) {
                        say(ERROR, "add nodes failed for 0x%x\n", drc->index);
                        return rc;
@@ -1490,7 +1498,14 @@ release_hp_resource(struct dr_node *node)
 {
        int rc;
 
-       rc = remove_device_tree_nodes(node->ofdt_path);
+       /*
+        * Use kernel DLPAR interface if it is enabled
+        */
+       if (kernel_dlpar_exists())
+               rc = do_dt_kernel_dlpar(node->drc_index, REMOVE);
+       else
+               rc = remove_device_tree_nodes(node->ofdt_path);
+
        if (rc) {
                say(ERROR, "failed to remove kernel nodes for index 0x%x\n",
                    node->drc_index);
diff --git a/src/drmgr/drslot_chrp_phb.c b/src/drmgr/drslot_chrp_phb.c
index f59baa4f9e27..ffa17d8f6b7d 100644
--- a/src/drmgr/drslot_chrp_phb.c
+++ b/src/drmgr/drslot_chrp_phb.c
@@ -108,17 +108,16 @@ release_phb(struct dr_node *phb)
 {
        int rc;
 
-       rc = remove_device_tree_nodes(phb->ofdt_path);
-       if (rc)
-               return rc;
-
-       if (phb->phb_ic_ofdt_path[0] != '\0') {
-               rc = remove_device_tree_nodes(phb->phb_ic_ofdt_path);
-               if (rc)
-                       return rc;
+       if (kernel_dlpar_exists())
+               rc = do_dt_kernel_dlpar(phb->drc_index, REMOVE);
+       else {
+               rc = remove_device_tree_nodes(phb->ofdt_path);
+               if (!rc && (phb->phb_ic_ofdt_path[0] != '\0'))
+                       rc = remove_device_tree_nodes(phb->phb_ic_ofdt_path);
        }
 
-       rc = release_drc(phb->drc_index, PHB_DEV);
+       if (!rc)
+               rc = release_drc(phb->drc_index, PHB_DEV);
 
        return rc;
 }
@@ -371,7 +370,6 @@ phb_remove_error:
 static int acquire_phb(char *drc_name, struct dr_node **phb)
 {
        struct dr_connector drc;
-       struct of_node *of_nodes;
        char path[DR_PATH_MAX];
        int rc;
 
@@ -386,14 +384,20 @@ static int acquire_phb(char *drc_name, struct dr_node 
**phb)
        if (rc)
                return rc;
 
-       of_nodes = configure_connector(drc.index);
-       if (of_nodes == NULL) {
-               release_drc(drc.index, PHB_DEV);
-               return -1;
-       }
+       if (kernel_dlpar_exists()) {
+               rc = do_dt_kernel_dlpar(drc.index, ADD);
+       } else {
+               struct of_node *of_nodes;
 
-       rc = add_device_tree_nodes(path, of_nodes);
-       free_of_node(of_nodes);
+               of_nodes = configure_connector(drc.index);
+               if (of_nodes == NULL) {
+                       release_drc(drc.index, PHB_DEV);
+                       return -1;
+               }
+
+               rc = add_device_tree_nodes(path, of_nodes);
+               free_of_node(of_nodes);
+       }
        if (rc) {
                say(ERROR, "add_device_tree_nodes failed at %s\n", path);
                release_drc(drc.index, PHB_DEV);
-- 
2.46.0

Reply via email to