RE: [PATCH v1] fpga: dfl: fme: adding reserved bits for revision of FME/Port error

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



 
> > -----Original Message-----
> > From: Xu, Yilun <yilun.xu@xxxxxxxxx>
> > Sent: Saturday, April 16, 2022 11:53 PM
> > To: Zhang, Tianfei <tianfei.zhang@xxxxxxxxx>
> > Cc: Wu, Hao <hao.wu@xxxxxxxxx>; trix@xxxxxxxxxx; mdf@xxxxxxxxxx; linux-
> > fpga@xxxxxxxxxxxxxxx
> > Subject: Re: [PATCH v1] fpga: dfl: fme: adding reserved bits for revision of
> > FME/Port error
> >
> > On Tue, Apr 12, 2022 at 02:35:23AM -0400, Tianfei Zhang wrote:
> > > From: Tianfei zhang <tianfei.zhang@xxxxxxxxx>
> > >
> > > There are 2 different register layouts for FME/Port error registers.
> > > This patch introduces 4 reserved bits (Bit[59:56]) to indicate the
> > > revision of register layout for userland application.

Please provide more detailed background information to explain why we need
this.

> >
> > Please specify that the 4 bits are reserved by HW so that SW appends revision
> > info on these bits for the attr readout value.
> 
> Yes, correct, I will make the git log message clear. How about this git commit
> message:
> 
> There are 2 different register layouts for FME/Port error registers.
> This patch introduces 4 reserved bits (Bit[59:56]) which are reserved by HW, dfl
> driver appends the
> FME/Port error revision info on those bits for attribute on the readout value.

We need more clear information, why we have 2 different register layouts, and
why 2 different register layouts requires 4 bits in HW, or even 4 bits will that
be enough?

> 
> >
> > >
> > > Signed-off-by: Tianfei zhang <tianfei.zhang@xxxxxxxxx>
> > > ---
> > >  drivers/fpga/dfl-fme-error.c | 36
> > > ++++++++++++++++++++++++++++++------
> > >  1 file changed, 30 insertions(+), 6 deletions(-)
> > >
> > > diff --git a/drivers/fpga/dfl-fme-error.c
> > > b/drivers/fpga/dfl-fme-error.c index 51c2892ec06d..3b54470f56ca 100644
> > > --- a/drivers/fpga/dfl-fme-error.c
> > > +++ b/drivers/fpga/dfl-fme-error.c
> > > @@ -39,6 +39,22 @@
> > >
> > >  #define ERROR_MASK		GENMASK_ULL(63, 0)
> > >
> > > +/* Bit[59:56] was reserved by software for error revision */ #define
> > > +ERROR_SW_REVISION_MASK GENMASK_ULL(59, 56)
> >
> > This will change the user behavior for the error interfaces. Now they need to
> > recognize the revision bits and discard them before clearing the errors, is it?
> 
> Yes, the end-user write to those error register without this revision info.
> 
> >
> > How users know the revision fields in output values? Maybe it still involves
> > change in Documentation/ABI/testing/sysfs-platform-dfl-fme,
> > which should be reconsidered carefully.
> 
> I will add those info in sysfs node documentation.
> 
> >
> > > +
> > > +static u64 set_error_revision(struct device *dev, u64 value) {
> > > +	void __iomem *base;
> > > +	u64 dfh;
> > > +	u64 revision;
> >
> > Better we follow the reverse xmas tree declaration, so reverse the 2 lines
> > please.
> Yes, I will fix it on next version.
> >
> > Thanks,
> > Yilun
> >
> > > +
> > > +	base = dfl_get_feature_ioaddr_by_id(dev,
> > FME_FEATURE_ID_GLOBAL_ERR);
> > > +	dfh = readq(base);
> > > +	revision = FIELD_GET(DFH_REVISION, dfh);
> > > +
> > > +	return value | FIELD_PREP(ERROR_SW_REVISION_MASK, revision); }
> > > +
> > >  static ssize_t pcie0_errors_show(struct device *dev,
> > >  				 struct device_attribute *attr, char *buf)  { @@
> > -52,7 +68,8 @@
> > > static ssize_t pcie0_errors_show(struct device *dev,
> > >  	value = readq(base + PCIE0_ERROR);
> > >  	mutex_unlock(&pdata->lock);
> > >
> > > -	return sprintf(buf, "0x%llx\n", (unsigned long long)value);
> > > +	return sprintf(buf, "0x%llx\n",
> > > +		       (unsigned long long)set_error_revision(dev, value));
> > >  }
> > >
> > >  static ssize_t pcie0_errors_store(struct device *dev, @@ -97,7 +114,8
> > > @@ static ssize_t pcie1_errors_show(struct device *dev,
> > >  	value = readq(base + PCIE1_ERROR);
> > >  	mutex_unlock(&pdata->lock);
> > >
> > > -	return sprintf(buf, "0x%llx\n", (unsigned long long)value);
> > > +	return sprintf(buf, "0x%llx\n",
> > > +		       (unsigned long long)set_error_revision(dev, value));
> > >  }
> > >
> > >  static ssize_t pcie1_errors_store(struct device *dev, @@ -133,11
> > > +151,13 @@ static ssize_t nonfatal_errors_show(struct device *dev,
> > >  				    struct device_attribute *attr, char *buf)  {
> > >  	void __iomem *base;
> > > +	u64 value;
> > >
> > >  	base = dfl_get_feature_ioaddr_by_id(dev,
> > FME_FEATURE_ID_GLOBAL_ERR);
> > > +	value = readq(base + RAS_NONFAT_ERROR);
> > >
> > >  	return sprintf(buf, "0x%llx\n",
> > > -		       (unsigned long long)readq(base + RAS_NONFAT_ERROR));
> > > +		       (unsigned long long)set_error_revision(dev, value));
> > >  }
> > >  static DEVICE_ATTR_RO(nonfatal_errors);
> > >
> > > @@ -145,11 +165,13 @@ static ssize_t catfatal_errors_show(struct device
> > *dev,
> > >  				    struct device_attribute *attr, char *buf)  {
> > >  	void __iomem *base;
> > > +	u64 value;
> > >
> > >  	base = dfl_get_feature_ioaddr_by_id(dev,
> > FME_FEATURE_ID_GLOBAL_ERR);
> > > +	value = readq(base + RAS_CATFAT_ERROR);
> > >
> > >  	return sprintf(buf, "0x%llx\n",
> > > -		       (unsigned long long)readq(base + RAS_CATFAT_ERROR));
> > > +		       (unsigned long long)set_error_revision(dev, value));
> > >  }
> > >  static DEVICE_ATTR_RO(catfatal_errors);
> > >
> > > @@ -165,9 +187,10 @@ static ssize_t inject_errors_show(struct device *dev,
> > >  	mutex_lock(&pdata->lock);
> > >  	v = readq(base + RAS_ERROR_INJECT);
> > >  	mutex_unlock(&pdata->lock);
> > > +	v = FIELD_GET(INJECT_ERROR_MASK, v);
> > >
> > >  	return sprintf(buf, "0x%llx\n",
> > > -		       (unsigned long long)FIELD_GET(INJECT_ERROR_MASK, v));
> > > +		       (unsigned long long)set_error_revision(dev, v));
> > >  }
> > >
> > >  static ssize_t inject_errors_store(struct device *dev, @@ -211,7
> > > +234,8 @@ static ssize_t fme_errors_show(struct device *dev,
> > >  	value = readq(base + FME_ERROR);
> > >  	mutex_unlock(&pdata->lock);
> > >
> > > -	return sprintf(buf, "0x%llx\n", (unsigned long long)value);
> > > +	return sprintf(buf, "0x%llx\n",
> > > +		       (unsigned long long)set_error_revision(dev, value));
> > >  }
> > >
> > >  static ssize_t fme_errors_store(struct device *dev,
> > > --
> > > 2.26.2




[Index of Archives]     [LM Sensors]     [Linux Sound]     [ALSA Users]     [ALSA Devel]     [Linux Audio Users]     [Linux Media]     [Kernel]     [Gimp]     [Yosemite News]     [Linux Media]

  Powered by Linux