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
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 109e0d2..683d72d 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 220d844..5bf3030 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;
}
@@ -390,7 +389,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;
@@ -405,14 +403,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.43.5