Re: [PATCH 1/8] dm: soc: Introduce UCLASS_SOC for SOC ID and attribute matching

2020-07-08 Thread Dave Gerlach

Simon,
On 7/2/20 10:50 PM, Simon Glass wrote:

On Mon, 29 Jun 2020 at 22:38, Dave Gerlach  wrote:


Introduce UCLASS_SOC to be used for SOC identification and attribute
matching based on the SoC ID info. This allows drivers to be provided
for SoCs to retrieve SoC identifying information and also for matching
device attributes for selecting SoC specific data.

This is useful for other device drivers that may need different
parameters or quirks enabled depending on the specific device variant in
use.

Signed-off-by: Dave Gerlach 
---
  drivers/soc/Kconfig  |   9 +++
  drivers/soc/Makefile |   1 +
  drivers/soc/soc-uclass.c | 102 ++
  include/dm/uclass-id.h   |   1 +
  include/soc.h| 132 +++
  5 files changed, 245 insertions(+)
  create mode 100644 drivers/soc/soc-uclass.c
  create mode 100644 include/soc.h


Reviewed-by: Simon Glass 

As Tom says, docs please but looks great otherwise.



Yes will add docs in v2.


Nits below. Do you think it might make sense to have an
integer-encoded version? Maybe it would be more hassle than it is
worth.


Well my primary driver for using strings was to be consistent with the 
kernel counterpart, but I also thought it was convenient beacuse it 
allows the identifiers to be descriptive and also to be printed out 
directly once retrieved. Attributes could be added as needed in the future.






diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig
index 7b4e4d613088..e715dfd01712 100644
--- a/drivers/soc/Kconfig
+++ b/drivers/soc/Kconfig
@@ -1,5 +1,14 @@
  menu "SOC (System On Chip) specific Drivers"

+config SOC_DEVICE
+   bool "Enable SoC Device ID drivers using Driver Model"
+   help
+ This allows drivers to be provided for SoCs to help in identifying
+ the SoC in use and matching SoC attributes for selecting SoC
+ specific data. This is useful for other device drivers that may
+ need different parameters or quirks enabled depending on the
+ specific device variant in use.
+
  source "drivers/soc/ti/Kconfig"

  endmenu
diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile
index ce253b7aa886..1c09a8465670 100644
--- a/drivers/soc/Makefile
+++ b/drivers/soc/Makefile
@@ -3,3 +3,4 @@
  # Makefile for the U-Boot SOC specific device drivers.

  obj-$(CONFIG_SOC_TI) += ti/
+obj-$(CONFIG_SOC_DEVICE) += soc-uclass.o
diff --git a/drivers/soc/soc-uclass.c b/drivers/soc/soc-uclass.c
new file mode 100644
index ..22f89514ed7d
--- /dev/null
+++ b/drivers/soc/soc-uclass.c
@@ -0,0 +1,102 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2020 - Texas Instruments Incorporated - http://www.ti.com/
+ * Dave Gerlach 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+int soc_get(struct udevice **devp)
+{
+   return uclass_first_device_err(UCLASS_SOC, devp);
+}
+
+int soc_get_machine(struct udevice *dev, char *buf, int size)
+{
+   struct soc_ops *ops = soc_get_ops(dev);
+
+   if (!ops->get_machine)
+   return -ENOSYS;
+
+   return ops->get_machine(dev, buf, size);
+}
+
+int soc_get_family(struct udevice *dev, char *buf, int size)
+{
+   struct soc_ops *ops = soc_get_ops(dev);
+
+   if (!ops->get_family)
+   return -ENOSYS;
+
+   return ops->get_family(dev, buf, size);
+}
+
+int soc_get_revision(struct udevice *dev, char *buf, int size)
+{
+   struct soc_ops *ops = soc_get_ops(dev);
+
+   if (!ops->get_revision)
+   return -ENOSYS;
+
+   return ops->get_revision(dev, buf, size);
+}
+
+const struct soc_device_attribute *
+soc_device_match(const struct soc_device_attribute *matches)
+{
+   bool match;
+   struct udevice *soc;
+   char str[SOC_MAX_STR_SIZE];
+
+   if (!matches)
+   return NULL;
+
+   if (soc_get())
+   return NULL;
+
+   while (1) {
+   if (!(matches->machine || matches->family ||
+ matches->revision))
+   break;
+
+   match = true;
+
+   if (matches->machine) {
+   if (!soc_get_machine(soc, str, SOC_MAX_STR_SIZE)) {
+   if (strcmp(matches->machine, str))
+   match = false;
+   }
+   }
+
+   if (matches->family) {
+   if (!soc_get_family(soc, str, SOC_MAX_STR_SIZE)) {
+   if (strcmp(matches->family, str))
+   match = false;
+   }
+   }
+
+   if (matches->revision) {
+   if (!soc_get_revision(soc, str, SOC_MAX_STR_SIZE)) {
+   if (strcmp(matches->revision, str))
+   match = false;
+   }
+   }
+
+   if (match)
+ 

Re: [PATCH 1/8] dm: soc: Introduce UCLASS_SOC for SOC ID and attribute matching

2020-07-08 Thread Dave Gerlach

Tom,
On 6/30/20 7:43 AM, Tom Rini wrote:

On Mon, Jun 29, 2020 at 11:38:46PM -0500, Dave Gerlach wrote:


Introduce UCLASS_SOC to be used for SOC identification and attribute
matching based on the SoC ID info. This allows drivers to be provided
for SoCs to retrieve SoC identifying information and also for matching
device attributes for selecting SoC specific data.

This is useful for other device drivers that may need different
parameters or quirks enabled depending on the specific device variant in
use.

Signed-off-by: Dave Gerlach 
---
  drivers/soc/Kconfig  |   9 +++
  drivers/soc/Makefile |   1 +
  drivers/soc/soc-uclass.c | 102 ++
  include/dm/uclass-id.h   |   1 +
  include/soc.h| 132 +++
  5 files changed, 245 insertions(+)
  create mode 100644 drivers/soc/soc-uclass.c
  create mode 100644 include/soc.h


Can we please get a write-up in doc/driver-model/ as well for this?
Thanks!



Yes, will add for v2, thanks for the suggestion.

Regards,
Dave


Re: [PATCH 1/8] dm: soc: Introduce UCLASS_SOC for SOC ID and attribute matching

2020-07-02 Thread Simon Glass
On Mon, 29 Jun 2020 at 22:38, Dave Gerlach  wrote:
>
> Introduce UCLASS_SOC to be used for SOC identification and attribute
> matching based on the SoC ID info. This allows drivers to be provided
> for SoCs to retrieve SoC identifying information and also for matching
> device attributes for selecting SoC specific data.
>
> This is useful for other device drivers that may need different
> parameters or quirks enabled depending on the specific device variant in
> use.
>
> Signed-off-by: Dave Gerlach 
> ---
>  drivers/soc/Kconfig  |   9 +++
>  drivers/soc/Makefile |   1 +
>  drivers/soc/soc-uclass.c | 102 ++
>  include/dm/uclass-id.h   |   1 +
>  include/soc.h| 132 +++
>  5 files changed, 245 insertions(+)
>  create mode 100644 drivers/soc/soc-uclass.c
>  create mode 100644 include/soc.h

Reviewed-by: Simon Glass 

As Tom says, docs please but looks great otherwise.

Nits below. Do you think it might make sense to have an
integer-encoded version? Maybe it would be more hassle than it is
worth.

>
> diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig
> index 7b4e4d613088..e715dfd01712 100644
> --- a/drivers/soc/Kconfig
> +++ b/drivers/soc/Kconfig
> @@ -1,5 +1,14 @@
>  menu "SOC (System On Chip) specific Drivers"
>
> +config SOC_DEVICE
> +   bool "Enable SoC Device ID drivers using Driver Model"
> +   help
> + This allows drivers to be provided for SoCs to help in identifying
> + the SoC in use and matching SoC attributes for selecting SoC
> + specific data. This is useful for other device drivers that may
> + need different parameters or quirks enabled depending on the
> + specific device variant in use.
> +
>  source "drivers/soc/ti/Kconfig"
>
>  endmenu
> diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile
> index ce253b7aa886..1c09a8465670 100644
> --- a/drivers/soc/Makefile
> +++ b/drivers/soc/Makefile
> @@ -3,3 +3,4 @@
>  # Makefile for the U-Boot SOC specific device drivers.
>
>  obj-$(CONFIG_SOC_TI) += ti/
> +obj-$(CONFIG_SOC_DEVICE) += soc-uclass.o
> diff --git a/drivers/soc/soc-uclass.c b/drivers/soc/soc-uclass.c
> new file mode 100644
> index ..22f89514ed7d
> --- /dev/null
> +++ b/drivers/soc/soc-uclass.c
> @@ -0,0 +1,102 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * (C) Copyright 2020 - Texas Instruments Incorporated - http://www.ti.com/
> + * Dave Gerlach 
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +int soc_get(struct udevice **devp)
> +{
> +   return uclass_first_device_err(UCLASS_SOC, devp);
> +}
> +
> +int soc_get_machine(struct udevice *dev, char *buf, int size)
> +{
> +   struct soc_ops *ops = soc_get_ops(dev);
> +
> +   if (!ops->get_machine)
> +   return -ENOSYS;
> +
> +   return ops->get_machine(dev, buf, size);
> +}
> +
> +int soc_get_family(struct udevice *dev, char *buf, int size)
> +{
> +   struct soc_ops *ops = soc_get_ops(dev);
> +
> +   if (!ops->get_family)
> +   return -ENOSYS;
> +
> +   return ops->get_family(dev, buf, size);
> +}
> +
> +int soc_get_revision(struct udevice *dev, char *buf, int size)
> +{
> +   struct soc_ops *ops = soc_get_ops(dev);
> +
> +   if (!ops->get_revision)
> +   return -ENOSYS;
> +
> +   return ops->get_revision(dev, buf, size);
> +}
> +
> +const struct soc_device_attribute *
> +soc_device_match(const struct soc_device_attribute *matches)
> +{
> +   bool match;
> +   struct udevice *soc;
> +   char str[SOC_MAX_STR_SIZE];
> +
> +   if (!matches)
> +   return NULL;
> +
> +   if (soc_get())
> +   return NULL;
> +
> +   while (1) {
> +   if (!(matches->machine || matches->family ||
> + matches->revision))
> +   break;
> +
> +   match = true;
> +
> +   if (matches->machine) {
> +   if (!soc_get_machine(soc, str, SOC_MAX_STR_SIZE)) {
> +   if (strcmp(matches->machine, str))
> +   match = false;
> +   }
> +   }
> +
> +   if (matches->family) {
> +   if (!soc_get_family(soc, str, SOC_MAX_STR_SIZE)) {
> +   if (strcmp(matches->family, str))
> +   match = false;
> +   }
> +   }
> +
> +   if (matches->revision) {
> +   if (!soc_get_revision(soc, str, SOC_MAX_STR_SIZE)) {
> +   if (strcmp(matches->revision, str))
> +   match = false;
> +   }
> +   }
> +
> +   if (match)
> +   return matches;
> +
> +   matches++;
> +   }
> +
> +   return 

Re: [PATCH 1/8] dm: soc: Introduce UCLASS_SOC for SOC ID and attribute matching

2020-06-30 Thread Tom Rini
On Mon, Jun 29, 2020 at 11:38:46PM -0500, Dave Gerlach wrote:

> Introduce UCLASS_SOC to be used for SOC identification and attribute
> matching based on the SoC ID info. This allows drivers to be provided
> for SoCs to retrieve SoC identifying information and also for matching
> device attributes for selecting SoC specific data.
> 
> This is useful for other device drivers that may need different
> parameters or quirks enabled depending on the specific device variant in
> use.
> 
> Signed-off-by: Dave Gerlach 
> ---
>  drivers/soc/Kconfig  |   9 +++
>  drivers/soc/Makefile |   1 +
>  drivers/soc/soc-uclass.c | 102 ++
>  include/dm/uclass-id.h   |   1 +
>  include/soc.h| 132 +++
>  5 files changed, 245 insertions(+)
>  create mode 100644 drivers/soc/soc-uclass.c
>  create mode 100644 include/soc.h

Can we please get a write-up in doc/driver-model/ as well for this?
Thanks!

-- 
Tom


signature.asc
Description: PGP signature