> [PATCH] cxl: Don't fail initialization if PSL timebase can't be
synced

Nice double negative.. How about:

  cxl: Allow initialization on timebase sync failures

> Failure to synchronize the PSL timebase currently prevents the
> initialization of the cxl card, thus rendering the card useless. This
> is too extreme for a feature which is rarely used, if at all.

I'd probably mention that no hardware AFUs or software currently use
timebase at all.

> This patch still tries to synchronize the PSL timebase when the card
> is initialized, but doesn't fail if it can't. Instead, it reports a
> status via /sys.

"...doesn't fail if it can't".. triple negative, awesome! :-P

Other than these minor nits..

Acked-by: Michael Neuling <mi...@neuling.org>

> Signed-off-by: Frederic Barrat <fbar...@linux.vnet.ibm.com>
> ---
> 
> Patch will need a small update for next, due to the powerVM patchset.
Will send that as soon as this one is agreed upon.
> 
>  Documentation/ABI/testing/sysfs-class-cxl |  8 ++++++++
>  drivers/misc/cxl/cxl.h                    |  1 +
>  drivers/misc/cxl/pci.c                    | 21 ++++++++++++---------
>  drivers/misc/cxl/sysfs.c                  | 10 ++++++++++
>  4 files changed, 31 insertions(+), 9 deletions(-)
> 
> diff --git a/Documentation/ABI/testing/sysfs-class-cxl
b/Documentation/ABI/testing/sysfs-class-cxl
> index b07e86d..ba33cdf 100644
> --- a/Documentation/ABI/testing/sysfs-class-cxl
> +++ b/Documentation/ABI/testing/sysfs-class-cxl
> @@ -233,3 +233,11 @@ Description:>      read/write
>                 0 = don't trust, the image may be different
(default)
>                 1 = trust that the image will not change.
>  Users:>              https://github.com/ibm-capi/libcxl
> +
> +What:           /sys/class/cxl/<card>/psl_timebase_synced
> +Date:           March 2016
> +Contact:        linuxppc-dev@lists.ozlabs.org
> +Description:    read only
> +                Returns 1 if the psl timebase register is
synchronized
> +                with the core timebase register, 0 otherwise.

Thinking forward, for libcxl we'll want a cxl_tb_synced() call which
will need to return true, false and unknown.  "unknown" is when this
file doesn't exists, when a new libcxl is run on an older kernel.

Do we want to same interface here?  Probably not, but something to
consider.

> +Users:          https://github.com/ibm-capi/libcxl
> \ No newline at end of file
> diff --git a/drivers/misc/cxl/cxl.h b/drivers/misc/cxl/cxl.h
> index a521bc7..baa5052 100644
> --- a/drivers/misc/cxl/cxl.h
> +++ b/drivers/misc/cxl/cxl.h
> @@ -517,6 +517,7 @@ struct cxl {
>         bool perst_loads_image;
>         bool perst_select_user;
>         bool perst_same_image;
> +       bool psl_timebase_synced;
>  };
>  
>  int cxl_alloc_one_irq(struct cxl *adapter);
> diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c
> index 0c6c17a1..625df03 100644
> --- a/drivers/misc/cxl/pci.c
> +++ b/drivers/misc/cxl/pci.c
> @@ -374,22 +374,24 @@ static int
init_implementation_adapter_regs(struct cxl *adapter, struct pci_dev
>  #define TBSYNC_CNT(n) (((u64)n & 0x7) << (63-6))
>  #define _2048_250MHZ_CYCLES 1
>  
> -static int cxl_setup_psl_timebase(struct cxl *adapter, struct
pci_dev *dev)
> +static void cxl_setup_psl_timebase(struct cxl *adapter, struct
pci_dev *dev)
>  {
>         u64 psl_tb;
>         int delta;
>         unsigned int retry = 0;
>         struct device_node *np;
>  
> +       adapter->psl_timebase_synced = false;
> +
>         if (!(np = pnv_pci_get_phb_node(dev)))
> -               return -ENODEV;
> +               return;
>  
>         /* Do not fail when CAPP timebase sync is not supported
by OPAL */
>         of_node_get(np);
>         if (! of_get_property(np, "ibm,capp-timebase-sync",
NULL)) {
>                 of_node_put(np);
> -               pr_err("PSL: Timebase sync: OPAL support
missing\n");
> -               return 0;
> +               dev_info(&dev->dev, "PSL timebase inactive:
OPAL support missing\n");
> +               return;
>         }
>         of_node_put(np);
>  
> @@ -408,8 +410,8 @@ static int cxl_setup_psl_timebase(struct cxl
*adapter, struct pci_dev *dev)
>         do {
>                 msleep(1);
>                 if (retry++ > 5) {
> -                       pr_err("PSL: Timebase sync: giving
up!\n");
> -                       return -EIO;
> +                       dev_info(&dev->dev, "PSL timebase
can't synchronize\n");
> +                       return;
>                 }
>                 psl_tb = cxl_p1_read(adapter,
CXL_PSL_Timebase);
>                 delta = mftb() - psl_tb;
> @@ -417,7 +419,8 @@ static int cxl_setup_psl_timebase(struct cxl
*adapter, struct pci_dev *dev)
>                         delta = -delta;
>         } while (tb_to_ns(delta) > 16000);
>  
> -       return 0;
> +       adapter->psl_timebase_synced = true;
> +       return;
>  }
>  
>  static int init_implementation_afu_regs(struct cxl_afu *afu)
> @@ -1189,8 +1192,8 @@ static int cxl_configure_adapter(struct cxl
*adapter, struct pci_dev *dev)
>         if ((rc = pnv_phb_to_cxl_mode(dev,
OPAL_PHB_CAPI_MODE_SNOOP_ON)))
>                 goto err;
>  
> -       if ((rc = cxl_setup_psl_timebase(adapter, dev)))
> -               goto err;
> +       /* psl timebase not syncing shouldn't prevent device
init */

/* Adapter init is not dependant on timebase sync */

> +       cxl_setup_psl_timebase(adapter, dev);
>  
>         if ((rc = cxl_register_psl_err_irq(adapter)))
>                 goto err;
> diff --git a/drivers/misc/cxl/sysfs.c b/drivers/misc/cxl/sysfs.c
> index 02006f71..b4bb9b2 100644
> --- a/drivers/misc/cxl/sysfs.c
> +++ b/drivers/misc/cxl/sysfs.c
> @@ -57,6 +57,15 @@ static ssize_t image_loaded_show(struct device
*device,
>         return scnprintf(buf, PAGE_SIZE, "factory\n");
>  }
>  
> +static ssize_t psl_timebase_synced_show(struct device *device,
> +                                       struct
device_attribute *attr,
> +                                       char *buf)
> +{
> +       struct cxl *adapter = to_cxl_adapter(device);
> +
> +       return scnprintf(buf, PAGE_SIZE, "%i\n", adapter
->psl_timebase_synced);
> +}
> +
>  static ssize_t reset_adapter_store(struct device *device,
>                                    struct device_attribute
*attr,
>                                    const char *buf, size_t
count)
> @@ -142,6 +151,7 @@ static struct device_attribute adapter_attrs[] =
{
>         __ATTR_RO(psl_revision),
>         __ATTR_RO(base_image),
>         __ATTR_RO(image_loaded),
> +       __ATTR_RO(psl_timebase_synced),
>         __ATTR_RW(load_image_on_perst),
>         __ATTR_RW(perst_reloads_same_image),
>         __ATTR(reset, S_IWUSR, NULL, reset_adapter_store),
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to