* [PATCH v4 0/8] soc/tegra: fuse: Add ACPI support
@ 2023-10-11 9:34 Kartik
2023-10-11 9:34 ` [PATCH v4 1/8] mm/util: Introduce kmemdup_array() to duplicate an array Kartik
` (7 more replies)
0 siblings, 8 replies; 12+ messages in thread
From: Kartik @ 2023-10-11 9:34 UTC (permalink / raw)
To: thierry.reding, jonathanh, keescook, andy, akpm, arnd, petlozup,
pshete, kkartik, ulf.hansson, frank.li, robh, stefank,
pdeschrijver, linux-tegra, linux-kernel, linux-hardening,
linux-mm
This series of patches add ACPI support for Tegra194 and Tegra234 in
Tegra fuse and apbmisc drivers. It also adds support for Tegra241
which uses ACPI boot.
Kartik (8):
mm/util: Introduce kmemdup_array() to duplicate an array
soc/tegra: fuse: Use dev_err_probe for probe failures
soc/tegra: fuse: Refactor resource mapping
soc/tegra: fuse: Add tegra_acpi_init_apbmisc()
soc/tegra: fuse: Add function to add lookups
soc/tegra: fuse: Add function to print SKU info
soc/tegra: fuse: Add ACPI support for Tegra194 and Tegra234
soc/tegra: fuse: Add support for Tegra241
drivers/soc/tegra/Kconfig | 5 ++
drivers/soc/tegra/fuse/fuse-tegra.c | 117 +++++++++++++++++++------
drivers/soc/tegra/fuse/fuse-tegra30.c | 20 +++++
drivers/soc/tegra/fuse/fuse.h | 5 ++
drivers/soc/tegra/fuse/tegra-apbmisc.c | 110 +++++++++++++++++++----
include/linux/string.h | 2 +
include/soc/tegra/fuse.h | 1 +
mm/util.c | 34 +++++++
8 files changed, 249 insertions(+), 45 deletions(-)
---
v3 -> v4:
* Added following patch to introduce kmemdup_array:
"mm/util: Introduce kmemdup_array() to duplicate an array"
* Add "soc/tegra: fuse: Use dev_err_probe for probe failures".
v2 -> v3:
* Minor changes in following patches:
soc/tegra: fuse: Add tegra_acpi_init_apbmisc()
soc/tegra: fuse: Add ACPI support for Tegra194 and Tegra234
v1 -> v2:
* Used '--patience' while formatting patches.
* Added "soc/tegra: fuse: Refactor resource mapping" to share
the common code between tegra_init_apbmisc() and
tegra_acpi_init_apbmisc() functions.
* Dropped "soc/tegra: fuse: Add function to register nvmem"
as ACPI and device-tree boot are sharing the same probe.
So, no need to refactor the code here.
---
--
2.34.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 1/8] mm/util: Introduce kmemdup_array() to duplicate an array
2023-10-11 9:34 [PATCH v4 0/8] soc/tegra: fuse: Add ACPI support Kartik
@ 2023-10-11 9:34 ` Kartik
2023-10-11 15:36 ` Andy Shevchenko
2023-10-11 9:34 ` [PATCH v4 2/8] soc/tegra: fuse: Use dev_err_probe for probe failures Kartik
` (6 subsequent siblings)
7 siblings, 1 reply; 12+ messages in thread
From: Kartik @ 2023-10-11 9:34 UTC (permalink / raw)
To: thierry.reding, jonathanh, keescook, andy, akpm, arnd, petlozup,
pshete, kkartik, ulf.hansson, frank.li, robh, stefank,
pdeschrijver, linux-tegra, linux-kernel, linux-hardening,
linux-mm
Introduce function kmemdup_array(), that will copy `n` number of
elements from a given array `src` to `dst`.
On success, kmemdup_array() returns 0 and copy the elements from `src`
to newly allocated array `dst`, it also stores number of elements
copied from `src` array to `dst_count` parameter. On failure, this
returns a negative integer value containing the error value.
Signed-off-by: Kartik <kkartik@nvidia.com>
---
include/linux/string.h | 2 ++
mm/util.c | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 36 insertions(+)
diff --git a/include/linux/string.h b/include/linux/string.h
index dbfc66400050..6245a7918b05 100644
--- a/include/linux/string.h
+++ b/include/linux/string.h
@@ -179,6 +179,8 @@ extern char *kstrndup(const char *s, size_t len, gfp_t gfp);
extern void *kmemdup(const void *src, size_t len, gfp_t gfp) __realloc_size(2);
extern void *kvmemdup(const void *src, size_t len, gfp_t gfp) __realloc_size(2);
extern char *kmemdup_nul(const char *s, size_t len, gfp_t gfp);
+extern int kmemdup_array(void **dst, size_t *dst_count, const void *src, size_t element_size,
+ size_t count, gfp_t gfp);
extern char **argv_split(gfp_t gfp, const char *str, int *argcp);
extern void argv_free(char **argv);
diff --git a/mm/util.c b/mm/util.c
index 6eddd891198e..a7c87a119be1 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -135,6 +135,40 @@ void *kmemdup(const void *src, size_t len, gfp_t gfp)
}
EXPORT_SYMBOL(kmemdup);
+/**
+ * kmemdup_array - duplicate a given array.
+ *
+ * @dst: reference to the pointer to store address of duplicated array.
+ * @dst_count: number of elements in the duplicated array.
+ * @src: array to duplicate.
+ * @element_size: size of each element of array.
+ * @count: number of elements to duplicate from array.
+ * @gfp: GFP mask to use.
+ *
+ * Return: Returns 0 on success, on failure this returns a negative error value.
+ */
+int kmemdup_array(void **dst, size_t *dst_count, const void *src, size_t element_size, size_t count,
+ gfp_t gfp)
+{
+ size_t size;
+
+ *dst_count = 0;
+
+ if (!src || !element_size || !count)
+ return -EINVAL;
+
+ size = size_mul(element_size, count);
+
+ *dst = kmemdup(src, size, gfp);
+ if (*dst)
+ return -ENOMEM;
+
+ *dst_count = size / element_size;
+
+ return 0;
+}
+EXPORT_SYMBOL(kmemdup_array);
+
/**
* kvmemdup - duplicate region of memory
*
--
2.34.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 2/8] soc/tegra: fuse: Use dev_err_probe for probe failures
2023-10-11 9:34 [PATCH v4 0/8] soc/tegra: fuse: Add ACPI support Kartik
2023-10-11 9:34 ` [PATCH v4 1/8] mm/util: Introduce kmemdup_array() to duplicate an array Kartik
@ 2023-10-11 9:34 ` Kartik
2023-10-11 9:34 ` [PATCH v4 3/8] soc/tegra: fuse: Refactor resource mapping Kartik
` (5 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Kartik @ 2023-10-11 9:34 UTC (permalink / raw)
To: thierry.reding, jonathanh, keescook, andy, akpm, arnd, petlozup,
pshete, kkartik, ulf.hansson, frank.li, robh, stefank,
pdeschrijver, linux-tegra, linux-kernel, linux-hardening,
linux-mm
Currently, in tegra_fuse_probe() if clock/reset get fails, then the
driver prints an error if the error is not caused by -EPROBE_DEFER.
This can be improved by using dev_err_probe() instead.
So, return dev_err_probe() if clock/reset get fails.
Signed-off-by: Kartik <kkartik@nvidia.com>
---
drivers/soc/tegra/fuse/fuse-tegra.c | 17 ++++-------------
1 file changed, 4 insertions(+), 13 deletions(-)
diff --git a/drivers/soc/tegra/fuse/fuse-tegra.c b/drivers/soc/tegra/fuse/fuse-tegra.c
index a2c28f493a75..98805885158e 100644
--- a/drivers/soc/tegra/fuse/fuse-tegra.c
+++ b/drivers/soc/tegra/fuse/fuse-tegra.c
@@ -131,13 +131,8 @@ static int tegra_fuse_probe(struct platform_device *pdev)
fuse->phys = res->start;
fuse->clk = devm_clk_get(&pdev->dev, "fuse");
- if (IS_ERR(fuse->clk)) {
- if (PTR_ERR(fuse->clk) != -EPROBE_DEFER)
- dev_err(&pdev->dev, "failed to get FUSE clock: %ld",
- PTR_ERR(fuse->clk));
-
- return PTR_ERR(fuse->clk);
- }
+ if (IS_ERR(fuse->clk))
+ return dev_err_probe(&pdev->dev, PTR_ERR(fuse->clk), "failed to get FUSE clock\n");
platform_set_drvdata(pdev, fuse);
fuse->dev = &pdev->dev;
@@ -179,12 +174,8 @@ static int tegra_fuse_probe(struct platform_device *pdev)
}
fuse->rst = devm_reset_control_get_optional(&pdev->dev, "fuse");
- if (IS_ERR(fuse->rst)) {
- err = PTR_ERR(fuse->rst);
- dev_err(&pdev->dev, "failed to get FUSE reset: %pe\n",
- fuse->rst);
- return err;
- }
+ if (IS_ERR(fuse->rst))
+ return dev_err_probe(&pdev->dev, PTR_ERR(fuse->rst), "failed to get FUSE reset\n");
/*
* FUSE clock is enabled at a boot time, hence this resume/suspend
--
2.34.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 3/8] soc/tegra: fuse: Refactor resource mapping
2023-10-11 9:34 [PATCH v4 0/8] soc/tegra: fuse: Add ACPI support Kartik
2023-10-11 9:34 ` [PATCH v4 1/8] mm/util: Introduce kmemdup_array() to duplicate an array Kartik
2023-10-11 9:34 ` [PATCH v4 2/8] soc/tegra: fuse: Use dev_err_probe for probe failures Kartik
@ 2023-10-11 9:34 ` Kartik
2023-10-11 9:34 ` [PATCH v4 4/8] soc/tegra: fuse: Add tegra_acpi_init_apbmisc() Kartik
` (4 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Kartik @ 2023-10-11 9:34 UTC (permalink / raw)
To: thierry.reding, jonathanh, keescook, andy, akpm, arnd, petlozup,
pshete, kkartik, ulf.hansson, frank.li, robh, stefank,
pdeschrijver, linux-tegra, linux-kernel, linux-hardening,
linux-mm
To prepare for adding ACPI support to the tegra-apbmisc driver,
relocate the code responsible for mapping memory resources from
the function ‘tegra_init_apbmisc’ to the function
‘tegra_init_apbmisc_resources.’ This adjustment will allow the
code to be shared between ‘tegra_init_apbmisc’ and the upcoming
‘tegra_acpi_init_apbmisc’ function.
Signed-off-by: Kartik <kkartik@nvidia.com>
---
drivers/soc/tegra/fuse/tegra-apbmisc.c | 37 +++++++++++++++-----------
1 file changed, 21 insertions(+), 16 deletions(-)
diff --git a/drivers/soc/tegra/fuse/tegra-apbmisc.c b/drivers/soc/tegra/fuse/tegra-apbmisc.c
index da970f3dbf35..06c1b3a2c7ec 100644
--- a/drivers/soc/tegra/fuse/tegra-apbmisc.c
+++ b/drivers/soc/tegra/fuse/tegra-apbmisc.c
@@ -160,9 +160,28 @@ void __init tegra_init_revision(void)
tegra_sku_info.platform = tegra_get_platform();
}
-void __init tegra_init_apbmisc(void)
+static void tegra_init_apbmisc_resources(struct resource *apbmisc,
+ struct resource *straps)
{
void __iomem *strapping_base;
+
+ apbmisc_base = ioremap(apbmisc->start, resource_size(apbmisc));
+ if (apbmisc_base)
+ chipid = readl_relaxed(apbmisc_base + 4);
+ else
+ pr_err("failed to map APBMISC registers\n");
+
+ strapping_base = ioremap(straps->start, resource_size(straps));
+ if (strapping_base) {
+ strapping = readl_relaxed(strapping_base);
+ iounmap(strapping_base);
+ } else {
+ pr_err("failed to map strapping options registers\n");
+ }
+}
+
+void __init tegra_init_apbmisc(void)
+{
struct resource apbmisc, straps;
struct device_node *np;
@@ -219,21 +238,7 @@ void __init tegra_init_apbmisc(void)
}
}
- apbmisc_base = ioremap(apbmisc.start, resource_size(&apbmisc));
- if (!apbmisc_base) {
- pr_err("failed to map APBMISC registers\n");
- } else {
- chipid = readl_relaxed(apbmisc_base + 4);
- }
-
- strapping_base = ioremap(straps.start, resource_size(&straps));
- if (!strapping_base) {
- pr_err("failed to map strapping options registers\n");
- } else {
- strapping = readl_relaxed(strapping_base);
- iounmap(strapping_base);
- }
-
+ tegra_init_apbmisc_resources(&apbmisc, &straps);
long_ram_code = of_property_read_bool(np, "nvidia,long-ram-code");
put:
--
2.34.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 4/8] soc/tegra: fuse: Add tegra_acpi_init_apbmisc()
2023-10-11 9:34 [PATCH v4 0/8] soc/tegra: fuse: Add ACPI support Kartik
` (2 preceding siblings ...)
2023-10-11 9:34 ` [PATCH v4 3/8] soc/tegra: fuse: Refactor resource mapping Kartik
@ 2023-10-11 9:34 ` Kartik
2023-10-11 9:34 ` [PATCH v4 5/8] soc/tegra: fuse: Add function to add lookups Kartik
` (3 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Kartik @ 2023-10-11 9:34 UTC (permalink / raw)
To: thierry.reding, jonathanh, keescook, andy, akpm, arnd, petlozup,
pshete, kkartik, ulf.hansson, frank.li, robh, stefank,
pdeschrijver, linux-tegra, linux-kernel, linux-hardening,
linux-mm
In preparation to ACPI support in Tegra fuse driver add function
tegra_acpi_init_apbmisc() to initialize tegra-apbmisc driver.
Also, document the reason of calling tegra_init_apbmisc() at early init.
Note that function tegra_acpi_init_apbmisc() is not placed in the __init
section, because it will be called during probe.
Signed-off-by: Kartik <kkartik@nvidia.com>
---
v2 -> v3:
* Fix build warnings seen when CONFIG_ACPI is disabled by moving
tegra_init_apbmisc table inside #ifdef CONFIG_ACPI block.
v1 -> v2:
* Update ACPI ID table 'tegra_init_apbmisc'.
* Add comment to document the reason to call tegra_init_apbmisc
at early init.
* Fix an issue where acpi_dev_free_resource_list() and
* acpi_dev_put() were not called if
acpi_dev_get_memory_resources() returned 1.
* Update logic to fetch memory resources in
tegra_acpi_init_apbmisc().
* Fix build errors seen when CONFIG_ACPI is disabled.
---
drivers/soc/tegra/fuse/fuse.h | 1 +
drivers/soc/tegra/fuse/tegra-apbmisc.c | 72 ++++++++++++++++++++++++++
2 files changed, 73 insertions(+)
diff --git a/drivers/soc/tegra/fuse/fuse.h b/drivers/soc/tegra/fuse/fuse.h
index 90f23be73894..a41e9f85281a 100644
--- a/drivers/soc/tegra/fuse/fuse.h
+++ b/drivers/soc/tegra/fuse/fuse.h
@@ -69,6 +69,7 @@ struct tegra_fuse {
void tegra_init_revision(void);
void tegra_init_apbmisc(void);
+void tegra_acpi_init_apbmisc(void);
u32 __init tegra_fuse_read_spare(unsigned int spare);
u32 __init tegra_fuse_read_early(unsigned int offset);
diff --git a/drivers/soc/tegra/fuse/tegra-apbmisc.c b/drivers/soc/tegra/fuse/tegra-apbmisc.c
index 06c1b3a2c7ec..e2ca93de6c1f 100644
--- a/drivers/soc/tegra/fuse/tegra-apbmisc.c
+++ b/drivers/soc/tegra/fuse/tegra-apbmisc.c
@@ -3,9 +3,11 @@
* Copyright (c) 2014-2023, NVIDIA CORPORATION. All rights reserved.
*/
+#include <linux/acpi.h>
#include <linux/export.h>
#include <linux/io.h>
#include <linux/kernel.h>
+#include <linux/mod_devicetable.h>
#include <linux/of.h>
#include <linux/of_address.h>
@@ -180,6 +182,12 @@ static void tegra_init_apbmisc_resources(struct resource *apbmisc,
}
}
+/**
+ * tegra_init_apbmisc - Initializes Tegra APBMISC and Strapping registers.
+ *
+ * This is called during early init as some of the old 32-bit ARM code needs
+ * information from the APBMISC registers very early during boot.
+ */
void __init tegra_init_apbmisc(void)
{
struct resource apbmisc, straps;
@@ -244,3 +252,67 @@ void __init tegra_init_apbmisc(void)
put:
of_node_put(np);
}
+
+#ifdef CONFIG_ACPI
+static const struct acpi_device_id apbmisc_acpi_match[] = {
+ { "NVDA2010" },
+ { /* sentinel */ }
+};
+
+void tegra_acpi_init_apbmisc(void)
+{
+ struct resource *resources[2] = { NULL };
+ struct resource_entry *rentry, *tmp;
+ struct acpi_device *adev = NULL;
+ struct list_head resource_list;
+ int rcount = 0;
+ int ret;
+
+ adev = acpi_dev_get_first_match_dev(apbmisc_acpi_match[0].id, NULL, -1);
+ if (!adev)
+ return;
+
+ INIT_LIST_HEAD(&resource_list);
+
+ ret = acpi_dev_get_memory_resources(adev, &resource_list);
+ if (ret < 0) {
+ pr_err("failed to get APBMISC memory resources");
+ goto out_put_acpi_dev;
+ }
+
+ /*
+ * Get required memory resources.
+ *
+ * resources[0]: apbmisc.
+ * resources[1]: straps.
+ */
+ resource_list_for_each_entry_safe(rentry, tmp, &resource_list) {
+ if (rcount >= ARRAY_SIZE(resources))
+ break;
+
+ resources[rcount++] = rentry->res;
+ }
+
+ if (!resources[0]) {
+ pr_err("failed to get APBMISC registers\n");
+ goto out_free_resource_list;
+ }
+
+ if (!resources[1]) {
+ pr_err("failed to get strapping options registers\n");
+ goto out_free_resource_list;
+ }
+
+ tegra_init_apbmisc_resources(resources[0], resources[1]);
+
+out_free_resource_list:
+ acpi_dev_free_resource_list(&resource_list);
+
+out_put_acpi_dev:
+ acpi_dev_put(adev);
+}
+#else
+void tegra_acpi_init_apbmisc(void)
+{
+}
+#endif
--
2.34.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 5/8] soc/tegra: fuse: Add function to add lookups
2023-10-11 9:34 [PATCH v4 0/8] soc/tegra: fuse: Add ACPI support Kartik
` (3 preceding siblings ...)
2023-10-11 9:34 ` [PATCH v4 4/8] soc/tegra: fuse: Add tegra_acpi_init_apbmisc() Kartik
@ 2023-10-11 9:34 ` Kartik
2023-10-11 9:34 ` [PATCH v4 6/8] soc/tegra: fuse: Add function to print SKU info Kartik
` (2 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Kartik @ 2023-10-11 9:34 UTC (permalink / raw)
To: thierry.reding, jonathanh, keescook, andy, akpm, arnd, petlozup,
pshete, kkartik, ulf.hansson, frank.li, robh, stefank,
pdeschrijver, linux-tegra, linux-kernel, linux-hardening,
linux-mm
Add helper function tegra_fuse_add_lookups() to register Tegra fuse
nvmem lookups. So, this can be shared between tegra_fuse_init() and
ACPI probe, which is to be introduced later.
Use kmemdup_array to duplicate fuse->soc->lookups.
Signed-off-by: Kartik <kkartik@nvidia.com>
---
v3 -> v4:
* Use kmemdup_array to duplicate fuse->soc->lookups.
* Return err at the end of tegra_fuse_probe to remove
redundant code.
v1 -> v2:
* Use size_mul to calculate lookups array size.
---
drivers/soc/tegra/fuse/fuse-tegra.c | 28 ++++++++++++++++++++--------
1 file changed, 20 insertions(+), 8 deletions(-)
diff --git a/drivers/soc/tegra/fuse/fuse-tegra.c b/drivers/soc/tegra/fuse/fuse-tegra.c
index 98805885158e..ddf25a1bb19d 100644
--- a/drivers/soc/tegra/fuse/fuse-tegra.c
+++ b/drivers/soc/tegra/fuse/fuse-tegra.c
@@ -113,6 +113,21 @@ static void tegra_fuse_restore(void *base)
fuse->clk = NULL;
}
+static int tegra_fuse_add_lookups(struct tegra_fuse *fuse)
+{
+ size_t size;
+ int ret;
+
+ ret = kmemdup_array((void *)&fuse->lookups, &size, fuse->soc->lookups,
+ sizeof(*fuse->lookups), fuse->soc->num_lookups, GFP_KERNEL);
+ if (ret)
+ return ret;
+
+ nvmem_add_cell_lookups(fuse->lookups, size);
+
+ return 0;
+}
+
static int tegra_fuse_probe(struct platform_device *pdev)
{
void __iomem *base = fuse->base;
@@ -398,6 +413,7 @@ static int __init tegra_init_fuse(void)
const struct of_device_id *match;
struct device_node *np;
struct resource regs;
+ int err;
tegra_init_apbmisc();
@@ -495,15 +511,11 @@ static int __init tegra_init_fuse(void)
pr_debug("Tegra CPU Speedo ID %d, SoC Speedo ID %d\n",
tegra_sku_info.cpu_speedo_id, tegra_sku_info.soc_speedo_id);
- if (fuse->soc->lookups) {
- size_t size = sizeof(*fuse->lookups) * fuse->soc->num_lookups;
+ err = tegra_fuse_add_lookups(fuse);
+ if (err)
+ pr_err("failed to add FUSE lookups\n");
- fuse->lookups = kmemdup(fuse->soc->lookups, size, GFP_KERNEL);
- if (fuse->lookups)
- nvmem_add_cell_lookups(fuse->lookups, fuse->soc->num_lookups);
- }
-
- return 0;
+ return err;
}
early_initcall(tegra_init_fuse);
--
2.34.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 6/8] soc/tegra: fuse: Add function to print SKU info
2023-10-11 9:34 [PATCH v4 0/8] soc/tegra: fuse: Add ACPI support Kartik
` (4 preceding siblings ...)
2023-10-11 9:34 ` [PATCH v4 5/8] soc/tegra: fuse: Add function to add lookups Kartik
@ 2023-10-11 9:34 ` Kartik
2023-10-11 9:34 ` [PATCH v4 7/8] soc/tegra: fuse: Add ACPI support for Tegra194 and Tegra234 Kartik
2023-10-11 9:34 ` [PATCH v4 8/8] soc/tegra: fuse: Add support for Tegra241 Kartik
7 siblings, 0 replies; 12+ messages in thread
From: Kartik @ 2023-10-11 9:34 UTC (permalink / raw)
To: thierry.reding, jonathanh, keescook, andy, akpm, arnd, petlozup,
pshete, kkartik, ulf.hansson, frank.li, robh, stefank,
pdeschrijver, linux-tegra, linux-kernel, linux-hardening,
linux-mm
Add helper function tegra_fuse_print_sku_info() to print Tegra SKU
information. So, it can be shared between tegra_fuse_init() and
ACPI probe which is to be introduced later.
Signed-off-by: Kartik <kkartik@nvidia.com>
---
v1 -> v2:
* Renamed tegra_fuse_pr_sku_info() as
tegra_fuse_print_sku_info().
---
drivers/soc/tegra/fuse/fuse-tegra.c | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/drivers/soc/tegra/fuse/fuse-tegra.c b/drivers/soc/tegra/fuse/fuse-tegra.c
index ddf25a1bb19d..2ac9e7a03d05 100644
--- a/drivers/soc/tegra/fuse/fuse-tegra.c
+++ b/drivers/soc/tegra/fuse/fuse-tegra.c
@@ -113,6 +113,16 @@ static void tegra_fuse_restore(void *base)
fuse->clk = NULL;
}
+static void tegra_fuse_print_sku_info(struct tegra_sku_info *tegra_sku_info)
+{
+ pr_info("Tegra Revision: %s SKU: %d CPU Process: %d SoC Process: %d\n",
+ tegra_revision_name[tegra_sku_info->revision],
+ tegra_sku_info->sku_id, tegra_sku_info->cpu_process_id,
+ tegra_sku_info->soc_process_id);
+ pr_debug("Tegra CPU Speedo ID %d, SoC Speedo ID %d\n",
+ tegra_sku_info->cpu_speedo_id, tegra_sku_info->soc_speedo_id);
+}
+
static int tegra_fuse_add_lookups(struct tegra_fuse *fuse)
{
size_t size;
@@ -504,12 +514,7 @@ static int __init tegra_init_fuse(void)
fuse->soc->init(fuse);
- pr_info("Tegra Revision: %s SKU: %d CPU Process: %d SoC Process: %d\n",
- tegra_revision_name[tegra_sku_info.revision],
- tegra_sku_info.sku_id, tegra_sku_info.cpu_process_id,
- tegra_sku_info.soc_process_id);
- pr_debug("Tegra CPU Speedo ID %d, SoC Speedo ID %d\n",
- tegra_sku_info.cpu_speedo_id, tegra_sku_info.soc_speedo_id);
+ tegra_fuse_print_sku_info(&tegra_sku_info);
err = tegra_fuse_add_lookups(fuse);
if (err)
--
2.34.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 7/8] soc/tegra: fuse: Add ACPI support for Tegra194 and Tegra234
2023-10-11 9:34 [PATCH v4 0/8] soc/tegra: fuse: Add ACPI support Kartik
` (5 preceding siblings ...)
2023-10-11 9:34 ` [PATCH v4 6/8] soc/tegra: fuse: Add function to print SKU info Kartik
@ 2023-10-11 9:34 ` Kartik
2023-10-12 18:59 ` kernel test robot
2023-10-11 9:34 ` [PATCH v4 8/8] soc/tegra: fuse: Add support for Tegra241 Kartik
7 siblings, 1 reply; 12+ messages in thread
From: Kartik @ 2023-10-11 9:34 UTC (permalink / raw)
To: thierry.reding, jonathanh, keescook, andy, akpm, arnd, petlozup,
pshete, kkartik, ulf.hansson, frank.li, robh, stefank,
pdeschrijver, linux-tegra, linux-kernel, linux-hardening,
linux-mm
Add ACPI support for Tegra194 & Tegra243 SoC's. This requires
following modifications to the probe when ACPI boot is used:
- Initialize soc data.
- Add nvmem lookups.
- Register soc device.
- use devm_clk_get_optional() instead of devm_clk_get() to get
fuse->clk, as fuse clocks are not required when using ACPI boot.
Also, drop '__init' keyword for tegra_soc_device_register() as this is also
used by tegra_fuse_probe() and use dev_err_probe() wherever applicable.
Signed-off-by: Kartik <kkartik@nvidia.com>
---
v3 -> v4:
* Use dev_fwnode() to dereference the fwnode.
* Add MODULE_DEVICE_TABLE for tegra_fuse_acpi_match.
* Moved tegra_fuse_acpi_match above tegra_fuse_driver i.e.,
close to the user of tegra_fuse_acpi_match.
* Moved the improvements made to fuse clk/rst get error handling
to separate patch.
* Moved ACPI related initialization after fuse->base is
initialized in tegra_fuse_probe(), as this triggers a warning
in tegra_fuse_read_early() which is called from
fuse->soc->init().
v2 -> v3:
* Updated commit message to specify changes related to inclusion
of dev_err_probe().
v1 -> v2:
* Updated ACPI ID table 'tegra_fuse_acpi_match'.
* Removed ',' after "{ /* sentinel */ }" in
'tegra_fuse_acpi_match'.
* Using same probe for ACPI and device-tree boot.
* Added code for required initialization when ACPI boot is used.
* Make clocks optional for ACPI.
* Use dev_err_probe() wherever applicable.
* Check if clock has been initialized only when device-tree
boot is used.
---
drivers/soc/tegra/fuse/fuse-tegra.c | 50 +++++++++++++++++++++++++++--
1 file changed, 48 insertions(+), 2 deletions(-)
diff --git a/drivers/soc/tegra/fuse/fuse-tegra.c b/drivers/soc/tegra/fuse/fuse-tegra.c
index 2ac9e7a03d05..167a6fe6c43d 100644
--- a/drivers/soc/tegra/fuse/fuse-tegra.c
+++ b/drivers/soc/tegra/fuse/fuse-tegra.c
@@ -3,11 +3,13 @@
* Copyright (c) 2013-2023, NVIDIA CORPORATION. All rights reserved.
*/
+#include <linux/acpi.h>
#include <linux/clk.h>
#include <linux/device.h>
#include <linux/kobject.h>
#include <linux/init.h>
#include <linux/io.h>
+#include <linux/mod_devicetable.h>
#include <linux/nvmem-consumer.h>
#include <linux/nvmem-provider.h>
#include <linux/of.h>
@@ -155,6 +157,37 @@ static int tegra_fuse_probe(struct platform_device *pdev)
return PTR_ERR(fuse->base);
fuse->phys = res->start;
+ /* Initialize the soc data and lookups if using ACPI boot. */
+ if (is_acpi_node(dev_fwnode(&pdev->dev)) && !fuse->soc) {
+ u8 chip;
+
+ tegra_acpi_init_apbmisc();
+
+ chip = tegra_get_chip_id();
+ switch (chip) {
+#if defined(CONFIG_ARCH_TEGRA_194_SOC)
+ case TEGRA194:
+ fuse->soc = &tegra194_fuse_soc;
+ break;
+#endif
+#if defined(CONFIG_ARCH_TEGRA_234_SOC)
+ case TEGRA234:
+ fuse->soc = &tegra234_fuse_soc;
+ break;
+#endif
+ default:
+ return dev_err_probe(&pdev->dev, -EINVAL, "Unsupported SoC: %02x\n", chip);
+ }
+
+ fuse->soc->init(fuse);
+ tegra_fuse_print_sku_info(&tegra_sku_info);
+ tegra_soc_device_register();
+
+ err = tegra_fuse_add_lookups(fuse);
+ if (err)
+ return dev_err_probe(&pdev->dev, err, "failed to add FUSE lookups\n");
+ }
+
fuse->clk = devm_clk_get(&pdev->dev, "fuse");
if (IS_ERR(fuse->clk))
return dev_err_probe(&pdev->dev, PTR_ERR(fuse->clk), "failed to get FUSE clock\n");
@@ -278,10 +311,17 @@ static const struct dev_pm_ops tegra_fuse_pm = {
SET_SYSTEM_SLEEP_PM_OPS(tegra_fuse_suspend, tegra_fuse_resume)
};
+static const struct acpi_device_id tegra_fuse_acpi_match[] = {
+ { "NVDA200F" },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(acpi, tegra_fuse_acpi_match);
+
static struct platform_driver tegra_fuse_driver = {
.driver = {
.name = "tegra-fuse",
.of_match_table = tegra_fuse_match,
+ .acpi_match_table = ACPI_PTR(tegra_fuse_acpi_match),
.pm = &tegra_fuse_pm,
.suppress_bind_attrs = true,
},
@@ -303,7 +343,13 @@ u32 __init tegra_fuse_read_early(unsigned int offset)
int tegra_fuse_readl(unsigned long offset, u32 *value)
{
- if (!fuse->read || !fuse->clk)
+ /*
+ * Wait for fuse->clk to be initialized if device-tree boot is used.
+ */
+ if (is_of_node(dev_fwnode(fuse->dev)) && !fuse->clk)
+ return -EPROBE_DEFER;
+
+ if (!fuse->read)
return -EPROBE_DEFER;
if (IS_ERR(fuse->clk))
@@ -386,7 +432,7 @@ const struct attribute_group tegra194_soc_attr_group = {
};
#endif
-struct device * __init tegra_soc_device_register(void)
+struct device *tegra_soc_device_register(void)
{
struct soc_device_attribute *attr;
struct soc_device *dev;
--
2.34.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 8/8] soc/tegra: fuse: Add support for Tegra241
2023-10-11 9:34 [PATCH v4 0/8] soc/tegra: fuse: Add ACPI support Kartik
` (6 preceding siblings ...)
2023-10-11 9:34 ` [PATCH v4 7/8] soc/tegra: fuse: Add ACPI support for Tegra194 and Tegra234 Kartik
@ 2023-10-11 9:34 ` Kartik
7 siblings, 0 replies; 12+ messages in thread
From: Kartik @ 2023-10-11 9:34 UTC (permalink / raw)
To: thierry.reding, jonathanh, keescook, andy, akpm, arnd, petlozup,
pshete, kkartik, ulf.hansson, frank.li, robh, stefank,
pdeschrijver, linux-tegra, linux-kernel, linux-hardening,
linux-mm
Add support for Tegra241 which use ACPI boot.
Signed-off-by: Kartik <kkartik@nvidia.com>
---
v1 -> v2:
* Removed few entries from tegra241_fuse_soc which were
initilized as NULL or 0.
---
drivers/soc/tegra/Kconfig | 5 +++++
drivers/soc/tegra/fuse/fuse-tegra.c | 5 +++++
drivers/soc/tegra/fuse/fuse-tegra30.c | 20 ++++++++++++++++++++
drivers/soc/tegra/fuse/fuse.h | 4 ++++
drivers/soc/tegra/fuse/tegra-apbmisc.c | 1 +
include/soc/tegra/fuse.h | 1 +
6 files changed, 36 insertions(+)
diff --git a/drivers/soc/tegra/Kconfig b/drivers/soc/tegra/Kconfig
index f16beeabaa92..33512558af9f 100644
--- a/drivers/soc/tegra/Kconfig
+++ b/drivers/soc/tegra/Kconfig
@@ -133,6 +133,11 @@ config ARCH_TEGRA_234_SOC
help
Enable support for the NVIDIA Tegra234 SoC.
+config ARCH_TEGRA_241_SOC
+ bool "NVIDIA Tegra241 SoC"
+ help
+ Enable support for the NVIDIA Tegra241 SoC.
+
endif
endif
diff --git a/drivers/soc/tegra/fuse/fuse-tegra.c b/drivers/soc/tegra/fuse/fuse-tegra.c
index 167a6fe6c43d..94bfccd719de 100644
--- a/drivers/soc/tegra/fuse/fuse-tegra.c
+++ b/drivers/soc/tegra/fuse/fuse-tegra.c
@@ -174,6 +174,11 @@ static int tegra_fuse_probe(struct platform_device *pdev)
case TEGRA234:
fuse->soc = &tegra234_fuse_soc;
break;
+#endif
+#if defined(CONFIG_ARCH_TEGRA_241_SOC)
+ case TEGRA241:
+ fuse->soc = &tegra241_fuse_soc;
+ break;
#endif
default:
return dev_err_probe(&pdev->dev, -EINVAL, "Unsupported SoC: %02x\n", chip);
diff --git a/drivers/soc/tegra/fuse/fuse-tegra30.c b/drivers/soc/tegra/fuse/fuse-tegra30.c
index e94d46372a63..2070d36c510d 100644
--- a/drivers/soc/tegra/fuse/fuse-tegra30.c
+++ b/drivers/soc/tegra/fuse/fuse-tegra30.c
@@ -678,3 +678,23 @@ const struct tegra_fuse_soc tegra234_fuse_soc = {
.clk_suspend_on = false,
};
#endif
+
+#if defined(CONFIG_ARCH_TEGRA_241_SOC)
+static const struct tegra_fuse_info tegra241_fuse_info = {
+ .read = tegra30_fuse_read,
+ .size = 0x16008,
+ .spare = 0xcf0,
+};
+
+static const struct nvmem_keepout tegra241_fuse_keepouts[] = {
+ { .start = 0xc, .end = 0x1600c }
+};
+
+const struct tegra_fuse_soc tegra241_fuse_soc = {
+ .init = tegra30_fuse_init,
+ .info = &tegra241_fuse_info,
+ .keepouts = tegra241_fuse_keepouts,
+ .num_keepouts = ARRAY_SIZE(tegra241_fuse_keepouts),
+ .soc_attr_group = &tegra194_soc_attr_group,
+};
+#endif
diff --git a/drivers/soc/tegra/fuse/fuse.h b/drivers/soc/tegra/fuse/fuse.h
index a41e9f85281a..f3b705327c20 100644
--- a/drivers/soc/tegra/fuse/fuse.h
+++ b/drivers/soc/tegra/fuse/fuse.h
@@ -136,4 +136,8 @@ extern const struct tegra_fuse_soc tegra194_fuse_soc;
extern const struct tegra_fuse_soc tegra234_fuse_soc;
#endif
+#ifdef CONFIG_ARCH_TEGRA_241_SOC
+extern const struct tegra_fuse_soc tegra241_fuse_soc;
+#endif
+
#endif
diff --git a/drivers/soc/tegra/fuse/tegra-apbmisc.c b/drivers/soc/tegra/fuse/tegra-apbmisc.c
index e2ca93de6c1f..c72bdb3e4e2c 100644
--- a/drivers/soc/tegra/fuse/tegra-apbmisc.c
+++ b/drivers/soc/tegra/fuse/tegra-apbmisc.c
@@ -64,6 +64,7 @@ bool tegra_is_silicon(void)
switch (tegra_get_chip_id()) {
case TEGRA194:
case TEGRA234:
+ case TEGRA241:
case TEGRA264:
if (tegra_get_platform() == 0)
return true;
diff --git a/include/soc/tegra/fuse.h b/include/soc/tegra/fuse.h
index 3a513be50243..8f421b9f7585 100644
--- a/include/soc/tegra/fuse.h
+++ b/include/soc/tegra/fuse.h
@@ -17,6 +17,7 @@
#define TEGRA186 0x18
#define TEGRA194 0x19
#define TEGRA234 0x23
+#define TEGRA241 0x24
#define TEGRA264 0x26
#define TEGRA_FUSE_SKU_CALIB_0 0xf0
--
2.34.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v4 1/8] mm/util: Introduce kmemdup_array() to duplicate an array
2023-10-11 9:34 ` [PATCH v4 1/8] mm/util: Introduce kmemdup_array() to duplicate an array Kartik
@ 2023-10-11 15:36 ` Andy Shevchenko
2023-10-11 16:13 ` Kartik
0 siblings, 1 reply; 12+ messages in thread
From: Andy Shevchenko @ 2023-10-11 15:36 UTC (permalink / raw)
To: Kartik
Cc: thierry.reding, jonathanh, keescook, andy, akpm, arnd, petlozup,
pshete, ulf.hansson, frank.li, robh, stefank, pdeschrijver,
linux-tegra, linux-kernel, linux-hardening, linux-mm
On Wed, Oct 11, 2023 at 2:17 PM Kartik <kkartik@nvidia.com> wrote:
>
> Introduce function kmemdup_array(), that will copy `n` number of
> elements from a given array `src` to `dst`.
>
> On success, kmemdup_array() returns 0 and copy the elements from `src`
> to newly allocated array `dst`, it also stores number of elements
> copied from `src` array to `dst_count` parameter. On failure, this
> returns a negative integer value containing the error value.
Hmm... Why is it so complicated?
Can it be as simple as
return kmemdup(size_mul());
?
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v4 1/8] mm/util: Introduce kmemdup_array() to duplicate an array
2023-10-11 15:36 ` Andy Shevchenko
@ 2023-10-11 16:13 ` Kartik
0 siblings, 0 replies; 12+ messages in thread
From: Kartik @ 2023-10-11 16:13 UTC (permalink / raw)
To: andy.shevchenko
Cc: akpm, andy, arnd, frank.li, jonathanh, keescook, kkartik,
linux-hardening, linux-kernel, linux-mm, linux-tegra,
pdeschrijver, petlozup, pshete, robh, stefank, thierry.reding,
ulf.hansson
On Wed, 2023-10-11 at 18:36:11 +0300, Andy Shevchenko wrote:
> On Wed, Oct 11, 2023 at 2:17 PM Kartik <kkartik@nvidia.com> wrote:
> >
> > Introduce function kmemdup_array(), that will copy `n` number of
> > elements from a given array `src` to `dst`.
> >
> > On success, kmemdup_array() returns 0 and copy the elements from `src`
> > to newly allocated array `dst`, it also stores number of elements
> > copied from `src` array to `dst_count` parameter. On failure, this
> > returns a negative integer value containing the error value.
>
> Hmm... Why is it so complicated?
>
> Can it be as simple as
>
> return kmemdup(size_mul());
>
> ?
>
> --
> With Best Regards,
> Andy Shevchenko
The idea was to validate the arguments that are passed to kmemdup_array().
But I agree doing so complicates things here.
I will update this in the next patchset.
Thanks & Regards,
Kartik
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v4 7/8] soc/tegra: fuse: Add ACPI support for Tegra194 and Tegra234
2023-10-11 9:34 ` [PATCH v4 7/8] soc/tegra: fuse: Add ACPI support for Tegra194 and Tegra234 Kartik
@ 2023-10-12 18:59 ` kernel test robot
0 siblings, 0 replies; 12+ messages in thread
From: kernel test robot @ 2023-10-12 18:59 UTC (permalink / raw)
To: Kartik, thierry.reding, jonathanh, keescook, andy, akpm, arnd,
petlozup, pshete, ulf.hansson, frank.li, robh, stefank,
pdeschrijver, linux-tegra, linux-kernel, linux-hardening,
linux-mm
Cc: oe-kbuild-all
Hi Kartik,
kernel test robot noticed the following build warnings:
[auto build test WARNING on tegra/for-next]
[also build test WARNING on kees/for-next/hardening akpm-mm/mm-everything linus/master v6.6-rc5 next-20231012]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Kartik/mm-util-Introduce-kmemdup_array-to-duplicate-an-array/20231011-192039
base: https://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux.git for-next
patch link: https://lore.kernel.org/r/20231011093412.7994-8-kkartik%40nvidia.com
patch subject: [PATCH v4 7/8] soc/tegra: fuse: Add ACPI support for Tegra194 and Tegra234
config: arm64-randconfig-002-20231012 (https://download.01.org/0day-ci/archive/20231013/202310130245.1Ndq4Syg-lkp@intel.com/config)
compiler: aarch64-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231013/202310130245.1Ndq4Syg-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202310130245.1Ndq4Syg-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/soc/tegra/fuse/fuse-tegra.c:314:36: warning: 'tegra_fuse_acpi_match' defined but not used [-Wunused-const-variable=]
314 | static const struct acpi_device_id tegra_fuse_acpi_match[] = {
| ^~~~~~~~~~~~~~~~~~~~~
vim +/tegra_fuse_acpi_match +314 drivers/soc/tegra/fuse/fuse-tegra.c
313
> 314 static const struct acpi_device_id tegra_fuse_acpi_match[] = {
315 { "NVDA200F" },
316 { /* sentinel */ }
317 };
318 MODULE_DEVICE_TABLE(acpi, tegra_fuse_acpi_match);
319
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2023-10-12 19:00 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-11 9:34 [PATCH v4 0/8] soc/tegra: fuse: Add ACPI support Kartik
2023-10-11 9:34 ` [PATCH v4 1/8] mm/util: Introduce kmemdup_array() to duplicate an array Kartik
2023-10-11 15:36 ` Andy Shevchenko
2023-10-11 16:13 ` Kartik
2023-10-11 9:34 ` [PATCH v4 2/8] soc/tegra: fuse: Use dev_err_probe for probe failures Kartik
2023-10-11 9:34 ` [PATCH v4 3/8] soc/tegra: fuse: Refactor resource mapping Kartik
2023-10-11 9:34 ` [PATCH v4 4/8] soc/tegra: fuse: Add tegra_acpi_init_apbmisc() Kartik
2023-10-11 9:34 ` [PATCH v4 5/8] soc/tegra: fuse: Add function to add lookups Kartik
2023-10-11 9:34 ` [PATCH v4 6/8] soc/tegra: fuse: Add function to print SKU info Kartik
2023-10-11 9:34 ` [PATCH v4 7/8] soc/tegra: fuse: Add ACPI support for Tegra194 and Tegra234 Kartik
2023-10-12 18:59 ` kernel test robot
2023-10-11 9:34 ` [PATCH v4 8/8] soc/tegra: fuse: Add support for Tegra241 Kartik
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox