From: Nathan Fontenot <nfont@linux.vnet.ibm.com>
To: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
Cc: linuxppc-dev@lists.ozlabs.org
Subject: Re: [PATCH 6/8] powerpc/pseries: make dlpar_configure_connector parent node aware
Date: Mon, 19 Aug 2013 08:53:45 -0500 [thread overview]
Message-ID: <52122369.2030903@linux.vnet.ibm.com> (raw)
In-Reply-To: <1376544232-24936-7-git-send-email-tyreld@linux.vnet.ibm.com>
On 08/15/2013 12:23 AM, Tyrel Datwyler wrote:
> Currently the device nodes created in the device subtree returned by a call to
> dlpar_configure_connector are all named in the root node. This is because the
> the node name in the work area returned by ibm,configure-connector rtas call
> only contains the node name and not the entire node path. Passing the parent
> node where the new subtree will be created to dlpar_configure_connector allows
> the correct node path to be prefixed in the full_name field.
>
> Signed-off-by: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
Acked-by: Nathan Fontenot <nfont@linux.vnet.ibm.com>
> ---
> arch/powerpc/platforms/pseries/dlpar.c | 55 ++++++++++++++++---------------
> arch/powerpc/platforms/pseries/mobility.c | 11 +++----
> arch/powerpc/platforms/pseries/pseries.h | 2 +-
> 3 files changed, 34 insertions(+), 34 deletions(-)
>
> diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c
> index c855233..4ea667d 100644
> --- a/arch/powerpc/platforms/pseries/dlpar.c
> +++ b/arch/powerpc/platforms/pseries/dlpar.c
> @@ -63,21 +63,24 @@ static struct property *dlpar_parse_cc_property(struct cc_workarea *ccwa)
> return prop;
> }
>
> -static struct device_node *dlpar_parse_cc_node(struct cc_workarea *ccwa)
> +static struct device_node *dlpar_parse_cc_node(struct cc_workarea *ccwa,
> + const char *path)
> {
> struct device_node *dn;
> char *name;
>
> + /* If parent node path is "/" advance path to NULL terminator to
> + * prevent double leading slashs in full_name.
> + */
> + if (!path[1])
> + path++;
> +
> dn = kzalloc(sizeof(*dn), GFP_KERNEL);
> if (!dn)
> return NULL;
>
> - /* The configure connector reported name does not contain a
> - * preceding '/', so we allocate a buffer large enough to
> - * prepend this to the full_name.
> - */
> name = (char *)ccwa + ccwa->name_offset;
> - dn->full_name = kasprintf(GFP_KERNEL, "/%s", name);
> + dn->full_name = kasprintf(GFP_KERNEL, "%s/%s", path, name);
> if (!dn->full_name) {
> kfree(dn);
> return NULL;
> @@ -123,7 +126,8 @@ void dlpar_free_cc_nodes(struct device_node *dn)
> #define CALL_AGAIN -2
> #define ERR_CFG_USE -9003
>
> -struct device_node *dlpar_configure_connector(u32 drc_index)
> +struct device_node *dlpar_configure_connector(u32 drc_index,
> + struct device_node *parent)
> {
> struct device_node *dn;
> struct device_node *first_dn = NULL;
> @@ -132,6 +136,7 @@ struct device_node *dlpar_configure_connector(u32 drc_index)
> struct property *last_property = NULL;
> struct cc_workarea *ccwa;
> char *data_buf;
> + const char *parent_path = parent->full_name;
> int cc_token;
> int rc = -1;
>
> @@ -165,7 +170,7 @@ struct device_node *dlpar_configure_connector(u32 drc_index)
> break;
>
> case NEXT_SIBLING:
> - dn = dlpar_parse_cc_node(ccwa);
> + dn = dlpar_parse_cc_node(ccwa, parent_path);
> if (!dn)
> goto cc_error;
>
> @@ -175,13 +180,17 @@ struct device_node *dlpar_configure_connector(u32 drc_index)
> break;
>
> case NEXT_CHILD:
> - dn = dlpar_parse_cc_node(ccwa);
> + if (first_dn)
> + parent_path = last_dn->full_name;
> +
> + dn = dlpar_parse_cc_node(ccwa, parent_path);
> if (!dn)
> goto cc_error;
>
> - if (!first_dn)
> + if (!first_dn) {
> + dn->parent = parent;
> first_dn = dn;
> - else {
> + } else {
> dn->parent = last_dn;
> if (last_dn)
> last_dn->child = dn;
> @@ -205,6 +214,7 @@ struct device_node *dlpar_configure_connector(u32 drc_index)
>
> case PREV_PARENT:
> last_dn = last_dn->parent;
> + parent_path = last_dn->parent->full_name;
> break;
>
> case CALL_AGAIN:
> @@ -383,9 +393,8 @@ out:
>
> static ssize_t dlpar_cpu_probe(const char *buf, size_t count)
> {
> - struct device_node *dn;
> + struct device_node *dn, *parent;
> unsigned long drc_index;
> - char *cpu_name;
> int rc;
>
> cpu_hotplug_driver_lock();
> @@ -395,25 +404,19 @@ static ssize_t dlpar_cpu_probe(const char *buf, size_t count)
> goto out;
> }
>
> - dn = dlpar_configure_connector(drc_index);
> - if (!dn) {
> - rc = -EINVAL;
> + parent = of_find_node_by_path("/cpus");
> + if (!parent) {
> + rc = -ENODEV;
> goto out;
> }
>
> - /* configure-connector reports cpus as living in the base
> - * directory of the device tree. CPUs actually live in the
> - * cpus directory so we need to fixup the full_name.
> - */
> - cpu_name = kasprintf(GFP_KERNEL, "/cpus%s", dn->full_name);
> - if (!cpu_name) {
> - dlpar_free_cc_nodes(dn);
> - rc = -ENOMEM;
> + dn = dlpar_configure_connector(drc_index, parent);
> + if (!dn) {
> + rc = -EINVAL;
> goto out;
> }
>
> - kfree(dn->full_name);
> - dn->full_name = cpu_name;
> + of_node_put(parent);
>
> rc = dlpar_acquire_drc(drc_index);
> if (rc) {
> diff --git a/arch/powerpc/platforms/pseries/mobility.c b/arch/powerpc/platforms/pseries/mobility.c
> index ed5426f..ff102e2 100644
> --- a/arch/powerpc/platforms/pseries/mobility.c
> +++ b/arch/powerpc/platforms/pseries/mobility.c
> @@ -216,17 +216,14 @@ static int add_dt_node(u32 parent_phandle, u32 drc_index)
> struct device_node *parent_dn;
> int rc;
>
> - dn = dlpar_configure_connector(drc_index);
> - if (!dn)
> + parent_dn = of_find_node_by_phandle(parent_phandle);
> + if (!parent_dn)
> return -ENOENT;
>
> - parent_dn = of_find_node_by_phandle(parent_phandle);
> - if (!parent_dn) {
> - dlpar_free_cc_nodes(dn);
> + dn = dlpar_configure_connector(drc_index, parent_dn);
> + if (!dn)
> return -ENOENT;
> - }
>
> - dn->parent = parent_dn;
> rc = dlpar_attach_node(dn);
> if (rc)
> dlpar_free_cc_nodes(dn);
> diff --git a/arch/powerpc/platforms/pseries/pseries.h b/arch/powerpc/platforms/pseries/pseries.h
> index c2a3a25..defb3c9 100644
> --- a/arch/powerpc/platforms/pseries/pseries.h
> +++ b/arch/powerpc/platforms/pseries/pseries.h
> @@ -56,7 +56,7 @@ extern void hvc_vio_init_early(void);
> /* Dynamic logical Partitioning/Mobility */
> extern void dlpar_free_cc_nodes(struct device_node *);
> extern void dlpar_free_cc_property(struct property *);
> -extern struct device_node *dlpar_configure_connector(u32);
> +extern struct device_node *dlpar_configure_connector(u32, struct device_node *);
> extern int dlpar_attach_node(struct device_node *);
> extern int dlpar_detach_node(struct device_node *);
>
>
next prev parent reply other threads:[~2013-08-19 13:53 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-15 5:23 [PATCH 0/8] powerpc/pseries: fix/cleanup broken mobility device-tree update code Tyrel Datwyler
2013-08-15 5:23 ` [PATCH 1/8] powerpc/pseries: fix creation of loop in device node property list Tyrel Datwyler
2013-08-19 13:43 ` Nathan Fontenot
2013-08-15 5:23 ` [PATCH 2/8] powerpc/pseries: fix over writing of rtas return code in update_dt_node Tyrel Datwyler
2013-08-19 13:44 ` Nathan Fontenot
2013-08-15 5:23 ` [PATCH 3/8] powerpc/pseries: pack update_props_workarea to map correctly to rtas buffer header Tyrel Datwyler
2013-08-19 13:46 ` Nathan Fontenot
2013-08-15 5:23 ` [PATCH 4/8] powerpc/pseries: fix parsing of initial node path in update_dt_node Tyrel Datwyler
2013-08-19 13:48 ` Nathan Fontenot
2013-08-15 5:23 ` [PATCH 5/8] powerpc/pseries: do all node initialization in dlpar_parse_cc_node Tyrel Datwyler
2013-08-19 13:49 ` Nathan Fontenot
2013-08-15 5:23 ` [PATCH 6/8] powerpc/pseries: make dlpar_configure_connector parent node aware Tyrel Datwyler
2013-08-19 13:53 ` Nathan Fontenot [this message]
2013-08-15 5:23 ` [PATCH 7/8] powerpc/pseries: add mising of_node_put in delete_dt_node Tyrel Datwyler
2013-08-19 13:54 ` Nathan Fontenot
2013-08-15 5:23 ` [PATCH 8/8] powerpc/pseries: child nodes are not detached by dlpar_detach_node Tyrel Datwyler
2013-08-19 13:56 ` Nathan Fontenot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52122369.2030903@linux.vnet.ibm.com \
--to=nfont@linux.vnet.ibm.com \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=tyreld@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).