Skip to contentSkip to conversation

efuse driver for Tegra

PATCH Superseded Peter De Schrijver 2 participants 12 messages Jun 12, 2014 – Jun 16, 2014

Subsystems (5)
lore
Share & tools
lore
#0 lore raw

v8 cover efuse driver for Tegra

This driver allows userspace to read the raw efuse data. Its userspace interface is modelled after the sunxi_sid driver which provides similar functionality for some Allwinner SoCs. It has been tested on Tegra20 (ventana), Tegra30 (beaverboard), Tegra114 (dalmore) and Tegra124 (jetson TK1).

Changes since v1:

* Add documentation for sysfs interface
* Cleanup messages

Changes since v2:

* Incorporate early fuse code
* Remove module support
* Make driver always build when Tegra platform is selected
* Add DT binding document
* Address comments on v2

Changes since v3:

* Document sysfs file format
* Added apbmisc DT node for access to the apbmisc registers
* Address comments on v3

Changes since v4:

* Provide fallback to hardcoded 0x70000800 in case the apbmisc DT node is missing. This is exactly what the current code does and prevents a system crash in that case due to an invalid memory access by tegra_read_chipid()
* Added tegra_fuse_readl() function for drivers to read calibration data

Changes since v5:

* Fix kernel panic when booting on Tegra20 A03 with a missing fuse DT node
* Incorporate review comments

Changes since v6:

* Add the fix when booting on Tegra20 A03 which was supposed to be in v6 but missing

Changes since v7:

* Initialize speedo info and randomness in early boot
* Expose speedo, sku and revision related info in tegra_sku_info
* Move APB DMA into Tegra20 fuse driver and remove apbio
* Make code more complex to support systems without conforming DT

Peter De Schrijver (6):
ARM: tegra: export apb dma readl/writel
ARM: tegra: move fuse exports to tegra-soc.h
misc: fuse: Add efuse driver for Tegra
ARM: tegra: Add efuse and apbmisc bindings
ARM: tegra: build new fuse driver in drivers/misc
misc: fuse: move APB DMA into Tegra20 fuse driver

 Documentation/ABI/testing/sysfs-driver-tegra-fuse  |   11 +
 .../bindings/fuse/nvidia,tegra20-fuse.txt          |   40 +++
 .../bindings/misc/nvidia,tegra20-apbmisc.txt       |   13 +
 arch/arm/boot/dts/tegra114.dtsi                    |   15 +
 arch/arm/boot/dts/tegra124.dtsi                    |   15 +
 arch/arm/boot/dts/tegra20.dtsi                     |   15 +
 arch/arm/boot/dts/tegra30.dtsi                     |   15 +
 arch/arm/mach-tegra/Makefile                       |    5 -
 arch/arm/mach-tegra/apbio.c                        |  206 --------------
 arch/arm/mach-tegra/apbio.h                        |   22 --
 arch/arm/mach-tegra/cpuidle.c                      |    2 +-
 arch/arm/mach-tegra/flowctrl.c                     |    2 +-
 arch/arm/mach-tegra/fuse.c                         |  252 -----------------
 arch/arm/mach-tegra/fuse.h                         |   79 ------
 arch/arm/mach-tegra/hotplug.c                      |    2 +-
 arch/arm/mach-tegra/platsmp.c                      |    2 +-
 arch/arm/mach-tegra/pm.c                           |    2 +-
 arch/arm/mach-tegra/pmc.c                          |    2 +-
 arch/arm/mach-tegra/powergate.c                    |    2 +-
 arch/arm/mach-tegra/reset-handler.S                |    2 +-
 arch/arm/mach-tegra/reset.c                        |    2 +-
 arch/arm/mach-tegra/sleep-tegra30.S                |    2 +-
 arch/arm/mach-tegra/tegra.c                        |    7 +-
 arch/arm/mach-tegra/tegra114_speedo.c              |  104 -------
 arch/arm/mach-tegra/tegra20_speedo.c               |  109 --------
 arch/arm/mach-tegra/tegra30_speedo.c               |  292 --------------------
 drivers/misc/Makefile                              |    1 +
 drivers/misc/fuse/Makefile                         |    1 +
 drivers/misc/fuse/tegra/Makefile                   |    8 +
 drivers/misc/fuse/tegra/fuse-tegra.c               |  154 ++++++++++
 drivers/misc/fuse/tegra/fuse-tegra20.c             |  214 ++++++++++++++
 drivers/misc/fuse/tegra/fuse-tegra30.c             |  223 +++++++++++++++
 drivers/misc/fuse/tegra/fuse.h                     |   71 +++++
 drivers/misc/fuse/tegra/speedo-tegra114.c          |  109 ++++++++
 drivers/misc/fuse/tegra/speedo-tegra124.c          |  167 +++++++++++
 drivers/misc/fuse/tegra/speedo-tegra20.c           |  109 ++++++++
 drivers/misc/fuse/tegra/speedo-tegra30.c           |  287 +++++++++++++++++++
 drivers/misc/fuse/tegra/tegra-apbmisc.c            |  110 ++++++++
 include/linux/tegra-soc.h                          |   42 +++
 39 files changed, 1633 insertions(+), 1083 deletions(-)
 create mode 100644 Documentation/ABI/testing/sysfs-driver-tegra-fuse
 create mode 100644 Documentation/devicetree/bindings/fuse/nvidia,tegra20-fuse.txt
 create mode 100644 Documentation/devicetree/bindings/misc/nvidia,tegra20-apbmisc.txt
 delete mode 100644 arch/arm/mach-tegra/apbio.c
 delete mode 100644 arch/arm/mach-tegra/apbio.h
 delete mode 100644 arch/arm/mach-tegra/fuse.c
 delete mode 100644 arch/arm/mach-tegra/fuse.h
 delete mode 100644 arch/arm/mach-tegra/tegra114_speedo.c
 delete mode 100644 arch/arm/mach-tegra/tegra20_speedo.c
 delete mode 100644 arch/arm/mach-tegra/tegra30_speedo.c
 create mode 100644 drivers/misc/fuse/Makefile
 create mode 100644 drivers/misc/fuse/tegra/Makefile
 create mode 100644 drivers/misc/fuse/tegra/fuse-tegra.c
 create mode 100644 drivers/misc/fuse/tegra/fuse-tegra20.c
 create mode 100644 drivers/misc/fuse/tegra/fuse-tegra30.c
 create mode 100644 drivers/misc/fuse/tegra/fuse.h
 create mode 100644 drivers/misc/fuse/tegra/speedo-tegra114.c
 create mode 100644 drivers/misc/fuse/tegra/speedo-tegra124.c
 create mode 100644 drivers/misc/fuse/tegra/speedo-tegra20.c
 create mode 100644 drivers/misc/fuse/tegra/speedo-tegra30.c
 create mode 100644 drivers/misc/fuse/tegra/tegra-apbmisc.c
Signature · 1 line
1.7.7.rc0.72.g4b5ea.dirty
#1 lore raw

PATCH v8 1/6 ARM: tegra: export apb dma readl/writel

Export APB DMA readl and writel. These are needed because we can't access the fuses directly on Tegra20 without potentially causing a system hang. Also have the APB DMA readl and writel return an error in case of a read failure instead of just returning zero or ignore write failures.

---
 arch/arm/mach-tegra/apbio.c |   51 ++++++++++++++++++++++++++----------------
 include/linux/tegra-soc.h   |   14 +++++++++++
 2 files changed, 45 insertions(+), 20 deletions(-)
arch/arm/mach-tegra/apbio.c +31 -20
index bc47197..e0bf49d 100644
@@ -32,8 +32,8 @@ static u32 *tegra_apb_bb;
 static dma_addr_t tegra_apb_bb_phys;
 static DECLARE_COMPLETION(tegra_apb_wait);
 
-static u32 tegra_apb_readl_direct(unsigned long offset);
-static void tegra_apb_writel_direct(u32 value, unsigned long offset);
+static int tegra_apb_readl_direct(unsigned long offset, u32 *value);
+static int tegra_apb_writel_direct(u32 value, unsigned long offset);
 
 static struct dma_chan *tegra_apb_dma_chan;
 static struct dma_slave_config dma_sconfig;
@@ -128,58 +128,64 @@ static int do_dma_transfer(unsigned long apb_add,
 	return 0;
 }
 
-static u32 tegra_apb_readl_using_dma(unsigned long offset)
+int tegra_apb_readl_using_dma(unsigned long offset, u32 *value)
 {
 	int ret;
 
 	if (!tegra_apb_dma_chan && !tegra_apb_dma_init())
-		return tegra_apb_readl_direct(offset);
+		return tegra_apb_readl_direct(offset, value);
 
 	mutex_lock(&tegra_apb_dma_lock);
 	ret = do_dma_transfer(offset, DMA_DEV_TO_MEM);
-	if (ret < 0) {
+	if (ret < 0)
 		pr_err("error in reading offset 0x%08lx using dma\n", offset);
-		*(u32 *)tegra_apb_bb = 0;
-	}
+	else
+		*value = *tegra_apb_bb;
+
 	mutex_unlock(&tegra_apb_dma_lock);
-	return *((u32 *)tegra_apb_bb);
+
+	return ret;
 }
 
-static void tegra_apb_writel_using_dma(u32 value, unsigned long offset)
+int tegra_apb_writel_using_dma(u32 value, unsigned long offset)
 {
 	int ret;
 
-	if (!tegra_apb_dma_chan && !tegra_apb_dma_init()) {
-		tegra_apb_writel_direct(value, offset);
-		return;
-	}
+	if (!tegra_apb_dma_chan && !tegra_apb_dma_init())
+		return tegra_apb_writel_direct(value, offset);
 
 	mutex_lock(&tegra_apb_dma_lock);
 	*((u32 *)tegra_apb_bb) = value;
 	ret = do_dma_transfer(offset, DMA_MEM_TO_DEV);
+	mutex_unlock(&tegra_apb_dma_lock);
 	if (ret < 0)
 		pr_err("error in writing offset 0x%08lx using dma\n", offset);
-	mutex_unlock(&tegra_apb_dma_lock);
+
+	return ret;
 }
 #else
 #define tegra_apb_readl_using_dma tegra_apb_readl_direct
 #define tegra_apb_writel_using_dma tegra_apb_writel_direct
 #endif
 
-typedef u32 (*apbio_read_fptr)(unsigned long offset);
-typedef void (*apbio_write_fptr)(u32 value, unsigned long offset);
+typedef int (*apbio_read_fptr)(unsigned long offset, u32 *value);
+typedef int (*apbio_write_fptr)(u32 value, unsigned long offset);
 
 static apbio_read_fptr apbio_read;
 static apbio_write_fptr apbio_write;
 
-static u32 tegra_apb_readl_direct(unsigned long offset)
+static int tegra_apb_readl_direct(unsigned long offset, u32 *value)
 {
-	return readl(IO_ADDRESS(offset));
+	*value = readl(IO_ADDRESS(offset));
+
+	return 0;
 }
 
-static void tegra_apb_writel_direct(u32 value, unsigned long offset)
+static int tegra_apb_writel_direct(u32 value, unsigned long offset)
 {
 	writel(value, IO_ADDRESS(offset));
+
+	return 0;
 }
 
 void tegra_apb_io_init(void)
@@ -197,7 +203,12 @@ void tegra_apb_io_init(void)
 
 u32 tegra_apb_readl(unsigned long offset)
 {
-	return apbio_read(offset);
+	u32 val;
+
+	if (apbio_read(offset, &val) < 0)
+		return 0;
+	else
+		return val;
 }
 
 void tegra_apb_writel(u32 value, unsigned long offset)
include/linux/tegra-soc.h +14 -0
index 95f611d..b02d73b 100644
@@ -19,4 +19,18 @@
 
 u32 tegra_read_chipid(void);
 
+
+#if defined(CONFIG_TEGRA20_APB_DMA)
+int tegra_apb_readl_using_dma(unsigned long offset, u32 *value);
+int tegra_apb_writel_using_dma(u32 value, unsigned long offset);
+#else
+static inline int tegra_apb_readl_using_dma(unsigned long offset, u32 *value)
+{
+	return -EINVAL;
+}
+static inline int tegra_apb_writel_using_dma(u32 value, unsigned long offset)
+{
+	return -EINVAL;
+}
+#endif
 #endif /* __LINUX_TEGRA_SOC_H_ */
Signature · 1 line
1.7.7.rc0.72.g4b5ea.dirty
#2 lore raw

PATCH v8 2/6 ARM: tegra: move fuse exports to tegra-soc.h

In reply to Peter De Schrijver

All fuse related functionality will move to a driver in the following patches. To prepare for this, export all the required functionality in a global header file and move all users of fuse.h to tegra-soc.h. While we're at it, remove tegra_bct_strapping, as its only user was removed in Commit a7cbe92cef27 ("ARM: tegra: remove tegra EMC scaling driver").

---
 arch/arm/mach-tegra/cpuidle.c         |    2 +-
 arch/arm/mach-tegra/flowctrl.c        |    2 +-
 arch/arm/mach-tegra/fuse.h            |   18 ------------------
 arch/arm/mach-tegra/hotplug.c         |    2 +-
 arch/arm/mach-tegra/platsmp.c         |    2 +-
 arch/arm/mach-tegra/pm.c              |    2 +-
 arch/arm/mach-tegra/pmc.c             |    2 +-
 arch/arm/mach-tegra/powergate.c       |    2 +-
 arch/arm/mach-tegra/reset-handler.S   |    2 +-
 arch/arm/mach-tegra/reset.c           |    2 +-
 arch/arm/mach-tegra/sleep-tegra30.S   |    2 +-
 arch/arm/mach-tegra/tegra.c           |    2 +-
 arch/arm/mach-tegra/tegra114_speedo.c |    1 +
 arch/arm/mach-tegra/tegra20_speedo.c  |    1 +
 arch/arm/mach-tegra/tegra30_speedo.c  |    1 +
 include/linux/tegra-soc.h             |   24 ++++++++++++++++++++++++
 16 files changed, 38 insertions(+), 29 deletions(-)
arch/arm/mach-tegra/cpuidle.c +1 -1
index 7bc5d8d..ff0a10b 100644
@@ -23,8 +23,8 @@
 
 #include <linux/kernel.h>
 #include <linux/module.h>
+#include <linux/tegra-soc.h>
 
-#include "fuse.h"
 #include "cpuidle.h"
 
 void __init tegra_cpuidle_init(void)
arch/arm/mach-tegra/flowctrl.c +1 -1
index ce8ab8a..4b31091 100644
@@ -22,10 +22,10 @@
 #include <linux/kernel.h>
 #include <linux/io.h>
 #include <linux/cpumask.h>
+#include <linux/tegra-soc.h>
 
 #include "flowctrl.h"
 #include "iomap.h"
-#include "fuse.h"
 
 static u8 flowctrl_offset_halt_cpu[] = {
 	FLOW_CTRL_HALT_CPU0_EVENTS,
arch/arm/mach-tegra/fuse.h +0 -18
index c01d047..b17c4ba 100644
@@ -26,21 +26,7 @@
 #define SKU_ID_AP25E	27
 #define SKU_ID_T25E	28
 
-#define TEGRA20		0x20
-#define TEGRA30		0x30
-#define TEGRA114	0x35
-#define TEGRA124	0x40
-
 #ifndef __ASSEMBLY__
-enum tegra_revision {
-	TEGRA_REVISION_UNKNOWN = 0,
-	TEGRA_REVISION_A01,
-	TEGRA_REVISION_A02,
-	TEGRA_REVISION_A03,
-	TEGRA_REVISION_A03p,
-	TEGRA_REVISION_A04,
-	TEGRA_REVISION_MAX,
-};
 
 extern int tegra_sku_id;
 extern int tegra_cpu_process_id;
@@ -48,12 +34,8 @@ extern int tegra_core_process_id;
 extern int tegra_chip_id;
 extern int tegra_cpu_speedo_id;		/* only exist in Tegra30 and later */
 extern int tegra_soc_speedo_id;
-extern enum tegra_revision tegra_revision;
-
-extern int tegra_bct_strapping;
 
 unsigned long long tegra_chip_uid(void);
-void tegra_init_fuse(void);
 bool tegra_spare_fuse(int bit);
 u32 tegra_fuse_readl(unsigned long offset);
 
arch/arm/mach-tegra/hotplug.c +1 -1
index ff26af2..38c5170 100644
@@ -10,10 +10,10 @@
 #include <linux/kernel.h>
 #include <linux/smp.h>
 #include <linux/clk/tegra.h>
+#include <linux/tegra-soc.h>
 
 #include <asm/smp_plat.h>
 
-#include "fuse.h"
 #include "sleep.h"
 
 static void (*tegra_hotplug_shutdown)(void);
arch/arm/mach-tegra/platsmp.c +1 -1
index 929d104..d9878ac 100644
@@ -19,13 +19,13 @@
 #include <linux/smp.h>
 #include <linux/io.h>
 #include <linux/clk/tegra.h>
+#include <linux/tegra-soc.h>
 
 #include <asm/cacheflush.h>
 #include <asm/mach-types.h>
 #include <asm/smp_scu.h>
 #include <asm/smp_plat.h>
 
-#include "fuse.h"
 #include "flowctrl.h"
 #include "reset.h"
 #include "pmc.h"
arch/arm/mach-tegra/pm.c +1 -1
index f55b05a..d7e6370 100644
@@ -26,6 +26,7 @@
 #include <linux/err.h>
 #include <linux/slab.h>
 #include <linux/clk/tegra.h>
+#include <linux/tegra-soc.h>
 
 #include <asm/smp_plat.h>
 #include <asm/cacheflush.h>
@@ -37,7 +38,6 @@
 #include "iomap.h"
 #include "reset.h"
 #include "flowctrl.h"
-#include "fuse.h"
 #include "pm.h"
 #include "pmc.h"
 #include "sleep.h"
arch/arm/mach-tegra/pmc.c +1 -1
index fb79202..d8fe587 100644
@@ -21,9 +21,9 @@
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/tegra-powergate.h>
+#include <linux/tegra-soc.h>
 
 #include "flowctrl.h"
-#include "fuse.h"
 #include "pm.h"
 #include "pmc.h"
 #include "sleep.h"
arch/arm/mach-tegra/powergate.c +1 -1
index 4cefc5c..50a9af4 100644
@@ -30,8 +30,8 @@
 #include <linux/spinlock.h>
 #include <linux/clk/tegra.h>
 #include <linux/tegra-powergate.h>
+#include <linux/tegra-soc.h>
 
-#include "fuse.h"
 #include "iomap.h"
 
 #define DPD_SAMPLE		0x020
arch/arm/mach-tegra/reset-handler.S +1 -1
index 8c1ba4f..0c480d69 100644
@@ -20,9 +20,9 @@
 #include <asm/cache.h>
 #include <asm/asm-offsets.h>
 #include <asm/hardware/cache-l2x0.h>
+#include <linux/tegra-soc.h>
 
 #include "flowctrl.h"
-#include "fuse.h"
 #include "iomap.h"
 #include "reset.h"
 #include "sleep.h"
arch/arm/mach-tegra/reset.c +1 -1
index 146fe8e..203bac5 100644
@@ -22,12 +22,12 @@
 #include <asm/cacheflush.h>
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/firmware.h>
+#include <linux/tegra-soc.h>
 
 #include "iomap.h"
 #include "irammap.h"
 #include "reset.h"
 #include "sleep.h"
-#include "fuse.h"
 
 #define TEGRA_IRAM_RESET_BASE (TEGRA_IRAM_BASE + \
 				TEGRA_IRAM_RESET_HANDLER_OFFSET)
arch/arm/mach-tegra/sleep-tegra30.S +1 -1
index b16d4a57..f808c2c 100644
@@ -15,13 +15,13 @@
  */
 
 #include <linux/linkage.h>
+#include <linux/tegra-soc.h>
 
 #include <asm/assembler.h>
 #include <asm/asm-offsets.h>
 #include <asm/cache.h>
 
 #include "irammap.h"
-#include "fuse.h"
 #include "sleep.h"
 #include "flowctrl.h"
 
arch/arm/mach-tegra/tegra.c +1 -1
index 6191603..e48b271 100644
@@ -34,6 +34,7 @@
 #include <linux/usb/tegra_usb_phy.h>
 #include <linux/clk/tegra.h>
 #include <linux/irqchip.h>
+#include <linux/tegra-soc.h>
 
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/mach-types.h>
@@ -46,7 +47,6 @@
 #include "board.h"
 #include "common.h"
 #include "cpuidle.h"
-#include "fuse.h"
 #include "iomap.h"
 #include "irq.h"
 #include "pmc.h"
arch/arm/mach-tegra/tegra114_speedo.c +1 -0
index 5218d48..7c73716 100644
@@ -16,6 +16,7 @@
 
 #include <linux/kernel.h>
 #include <linux/bug.h>
+#include <linux/tegra-soc.h>
 
 #include "fuse.h"
 
arch/arm/mach-tegra/tegra20_speedo.c +1 -0
index fa6eb57..3b1bb53 100644
@@ -16,6 +16,7 @@
 
 #include <linux/kernel.h>
 #include <linux/bug.h>
+#include <linux/tegra-soc.h>
 
 #include "fuse.h"
 
arch/arm/mach-tegra/tegra30_speedo.c +1 -0
index 125cb16..81a958d 100644
@@ -16,6 +16,7 @@
 
 #include <linux/kernel.h>
 #include <linux/bug.h>
+#include <linux/tegra-soc.h>
 
 #include "fuse.h"
 
include/linux/tegra-soc.h +24 -0
index b02d73b..db93b77 100644
@@ -17,8 +17,29 @@
 #ifndef __LINUX_TEGRA_SOC_H_
 #define __LINUX_TEGRA_SOC_H_
 
+#define TEGRA20		0x20
+#define TEGRA30		0x30
+#define TEGRA114	0x35
+#define TEGRA124	0x40
+
+#ifndef __ASSEMBLY__
+
+enum tegra_revision {
+	TEGRA_REVISION_UNKNOWN = 0,
+	TEGRA_REVISION_A01,
+	TEGRA_REVISION_A02,
+	TEGRA_REVISION_A03,
+	TEGRA_REVISION_A03p,
+	TEGRA_REVISION_A04,
+	TEGRA_REVISION_MAX,
+};
+
+u32 tegra_read_straps(void);
 u32 tegra_read_chipid(void);
+void tegra_init_fuse(void);
 
+extern int tegra_chip_id;
+extern enum tegra_revision tegra_revision;
 
 #if defined(CONFIG_TEGRA20_APB_DMA)
 int tegra_apb_readl_using_dma(unsigned long offset, u32 *value);
@@ -33,4 +54,7 @@ static inline int tegra_apb_writel_using_dma(u32 value, unsigned long offset)
 	return -EINVAL;
 }
 #endif
+
+#endif /* __ASSEMBLY__ */
+
 #endif /* __LINUX_TEGRA_SOC_H_ */
Signature · 1 line
1.7.7.rc0.72.g4b5ea.dirty
#3 lore raw

PATCH v8 3/6 misc: fuse: Add efuse driver for Tegra

In reply to Peter De Schrijver

Implement fuse driver for Tegra20, Tegra30, Tegra114 and Tegra124.

---
 Documentation/ABI/testing/sysfs-driver-tegra-fuse |   11 +
 drivers/misc/fuse/Makefile                        |    1 +
 drivers/misc/fuse/tegra/Makefile                  |    8 +
 drivers/misc/fuse/tegra/fuse-tegra.c              |  144 +++++++++++
 drivers/misc/fuse/tegra/fuse-tegra20.c            |  141 ++++++++++
 drivers/misc/fuse/tegra/fuse-tegra30.c            |  223 ++++++++++++++++
 drivers/misc/fuse/tegra/fuse.h                    |   71 +++++
 drivers/misc/fuse/tegra/speedo-tegra114.c         |  109 ++++++++
 drivers/misc/fuse/tegra/speedo-tegra124.c         |  167 ++++++++++++
 drivers/misc/fuse/tegra/speedo-tegra20.c          |  109 ++++++++
 drivers/misc/fuse/tegra/speedo-tegra30.c          |  287 +++++++++++++++++++++
 drivers/misc/fuse/tegra/tegra-apbmisc.c           |  110 ++++++++
 include/linux/tegra-soc.h                         |   18 ++
 13 files changed, 1399 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/ABI/testing/sysfs-driver-tegra-fuse
 create mode 100644 drivers/misc/fuse/Makefile
 create mode 100644 drivers/misc/fuse/tegra/Makefile
 create mode 100644 drivers/misc/fuse/tegra/fuse-tegra.c
 create mode 100644 drivers/misc/fuse/tegra/fuse-tegra20.c
 create mode 100644 drivers/misc/fuse/tegra/fuse-tegra30.c
 create mode 100644 drivers/misc/fuse/tegra/fuse.h
 create mode 100644 drivers/misc/fuse/tegra/speedo-tegra114.c
 create mode 100644 drivers/misc/fuse/tegra/speedo-tegra124.c
 create mode 100644 drivers/misc/fuse/tegra/speedo-tegra20.c
 create mode 100644 drivers/misc/fuse/tegra/speedo-tegra30.c
 create mode 100644 drivers/misc/fuse/tegra/tegra-apbmisc.c
Documentation/ABI/testing/sysfs-driver-tegra-fuse new file +11 -0
new file mode 100644
index 0000000..69f5af6
@@ -0,0 +1,11 @@
+What:		/sys/devices/*/<our-device>/fuse
+Date:		February 2014
+Contact:	Peter De Schrijver <[email protected]>
+Description:	read-only access to the efuses on Tegra20, Tegra30, Tegra114
+		and Tegra124 SoC's from NVIDIA. The efuses contain write once
+		data programmed at the factory. The data is layed out in 32bit
+		words in LSB first format. Each bit represents a single value
+		as decoded from the fuse registers. Bits order/assignment
+		exactly matches the HW registers, including any unused bits.
+Users:		any user space application which wants to read the efuses on
+		Tegra SoC's
drivers/misc/fuse/Makefile new file +1 -0
new file mode 100644
index 0000000..0679c4f
@@ -0,0 +1 @@
+obj-$(CONFIG_ARCH_TEGRA)	+= tegra/
drivers/misc/fuse/tegra/Makefile new file +8 -0
new file mode 100644
index 0000000..3af357d
@@ -0,0 +1,8 @@
+obj-y					+= fuse-tegra.o
+obj-y					+= fuse-tegra30.o
+obj-y					+= tegra-apbmisc.o
+obj-$(CONFIG_ARCH_TEGRA_2x_SOC)		+= fuse-tegra20.o
+obj-$(CONFIG_ARCH_TEGRA_2x_SOC)		+= speedo-tegra20.o
+obj-$(CONFIG_ARCH_TEGRA_3x_SOC)		+= speedo-tegra30.o
+obj-$(CONFIG_ARCH_TEGRA_114_SOC)	+= speedo-tegra114.o
+obj-$(CONFIG_ARCH_TEGRA_124_SOC)	+= speedo-tegra124.o
drivers/misc/fuse/tegra/fuse-tegra.c new file +144 -0

144 lines not on this page · raw message

drivers/misc/fuse/tegra/fuse-tegra20.c new file +141 -0

141 lines not on this page · raw message

drivers/misc/fuse/tegra/fuse-tegra30.c new file +223 -0

223 lines not on this page · raw message

drivers/misc/fuse/tegra/fuse.h new file +71 -0

71 lines not on this page · raw message

drivers/misc/fuse/tegra/speedo-tegra114.c new file +109 -0

109 lines not on this page · raw message

drivers/misc/fuse/tegra/speedo-tegra124.c new file +167 -0

167 lines not on this page · raw message

drivers/misc/fuse/tegra/speedo-tegra20.c new file +109 -0

109 lines not on this page · raw message

drivers/misc/fuse/tegra/speedo-tegra30.c new file +287 -0

287 lines not on this page · raw message

drivers/misc/fuse/tegra/tegra-apbmisc.c new file +110 -0

110 lines not on this page · raw message

include/linux/tegra-soc.h +18 -0
index db93b77..5c33b16 100644
@@ -22,6 +22,9 @@
 #define TEGRA114	0x35
 #define TEGRA124	0x40
 
+#define TEGRA_FUSE_SKU_CALIB_0	0xf0
+#define TEGRA30_FUSE_SATA_CALIB	0x124
+
 #ifndef __ASSEMBLY__
 
 enum tegra_revision {
@@ -34,12 +37,27 @@ enum tegra_revision {
 	TEGRA_REVISION_MAX,
 };
 
+struct tegra_sku_info {
+	int sku_id;
+	int cpu_process_id;
+	int cpu_speedo_id;
+	int cpu_speedo_value;
+	int cpu_iddq_value;
+	int core_process_id;
+	int soc_speedo_id;
+	int gpu_speedo_id;
+	int gpu_process_id;
+	int gpu_speedo_value;
+	enum tegra_revision revision;
+};
+
 u32 tegra_read_straps(void);
 u32 tegra_read_chipid(void);
 void tegra_init_fuse(void);
 
 extern int tegra_chip_id;
 extern enum tegra_revision tegra_revision;
+extern struct tegra_sku_info tegra_sku_info;
 
 #if defined(CONFIG_TEGRA20_APB_DMA)
 int tegra_apb_readl_using_dma(unsigned long offset, u32 *value);
Signature · 1 line
1.7.7.rc0.72.g4b5ea.dirty
#4 lore raw

PATCH v8 4/6 ARM: tegra: Add efuse and apbmisc bindings

In reply to Peter De Schrijver

Add efuse and apbmisc bindings for Tegra20, Tegra30, Tegra114 and Tegra124.

---
 .../bindings/fuse/nvidia,tegra20-fuse.txt          |   40 ++++++++++++++++++++
 .../bindings/misc/nvidia,tegra20-apbmisc.txt       |   13 ++++++
 arch/arm/boot/dts/tegra114.dtsi                    |   15 +++++++
 arch/arm/boot/dts/tegra124.dtsi                    |   15 +++++++
 arch/arm/boot/dts/tegra20.dtsi                     |   15 +++++++
 arch/arm/boot/dts/tegra30.dtsi                     |   15 +++++++
 6 files changed, 113 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/fuse/nvidia,tegra20-fuse.txt
 create mode 100644 Documentation/devicetree/bindings/misc/nvidia,tegra20-apbmisc.txt
Documentation/devicetree/bindings/fuse/nvidia,tegra20-fuse.txt new file +40 -0
new file mode 100644
index 0000000..d8c98c7
@@ -0,0 +1,40 @@
+NVIDIA Tegra20/Tegra30/Tegr114/Tegra124 fuse block.
+
+Required properties:
+- compatible : should be:
+	"nvidia,tegra20-efuse"
+	"nvidia,tegra30-efuse"
+	"nvidia,tegra114-efuse"
+	"nvidia,tegra124-efuse"
+  Details:
+  nvidia,tegra20-efuse: Tegra20 requires using APB DMA to read the fuse data
+	due to a hardware bug. Tegra20 also lacks certain information which is
+	available in later generations such as fab code, lot code, wafer id,..
+  nvidia,tegra30-efuse, nvidia,tegra114-efuse and nvidia,tegra124-efuse:
+	The differences between these SoCs are the size of the efuse array,
+	the location of the spare (OEM programmable) bits and the location of
+	the speedo data.
+- reg: Should contain 1 entry: the entry gives the physical address and length
+       of the fuse registers.
+- clocks: Must contain an entry for each entry in clock-names.
+  See ../clocks/clock-bindings.txt for details.
+- clock-names: Must include the following entries:
+  - fuse
+- resets: Must contain an entry for each entry in reset-names.
+  See ../reset/reset.txt for details.
+- reset-names: Must include the following entries:
+ - fuse
+
+Example:
+
+	fuse at 7000f800 {
+		compatible = "nvidia,tegra20-efuse";
+		reg = <0x7000F800 0x400>,
+		      <0x70000000 0x400>;
+		clocks = <&tegra_car TEGRA20_CLK_FUSE>;
+		clock-names = "fuse";
+		resets = <&tegra_car 39>;
+		reset-names = "fuse";
+	};
+
+
Documentation/devicetree/bindings/misc/nvidia,tegra20-apbmisc.txt new file +13 -0
new file mode 100644
index 0000000..b97b8be
@@ -0,0 +1,13 @@
+NVIDIA Tegra20/Tegra30/Tegr114/Tegra124 apbmisc block
+
+Required properties:
+- compatible : should be:
+       "nvidia,tegra20-apbmisc"
+       "nvidia,tegra30-apbmisc"
+       "nvidia,tegra114-apbmisc"
+       "nvidia,tegra124-apbmisc"
+- reg: Should contain 2 entries: the first entry gives the physical address
+       and length of the registers which contain revision and debug features.
+       The second entry gives the physical address and length of the
+       registers indicating the strapping options.
+
arch/arm/boot/dts/tegra114.dtsi +15 -0
index fdc559a..335a1d8 100644
@@ -220,6 +220,12 @@
 		interrupt-controller;
 	};
 
+	apbmisc at 70000800 {
+		compatible = "nvidia,tegra114-apbmisc", "nvidia,tegra20-apbmisc";
+		reg = <0x70000800 0x64   /* Chip revision */
+		       0x70000008 0x04>; /* Strapping options */
+	};
+
 	pinmux: pinmux at 70000868 {
 		compatible = "nvidia,tegra114-pinmux";
 		reg = <0x70000868 0x148		/* Pad control registers */
@@ -485,6 +491,15 @@
 		clock-names = "pclk", "clk32k_in";
 	};
 
+	fuse@7000f800 {
+		compatible = "nvidia,tegra114-efuse";
+		reg = <0x7000f800 0x400>;
+		clocks = <&tegra_car TEGRA114_CLK_FUSE>;
+		clock-names = "fuse";
+		resets = <&tegra_car 39>;
+		reset-names = "fuse";
+	};
+
 	iommu at 70019010 {
 		compatible = "nvidia,tegra114-smmu", "nvidia,tegra30-smmu";
 		reg = <0x70019010 0x02c
arch/arm/boot/dts/tegra124.dtsi +15 -0
index 6d540a0..9739a13 100644
@@ -167,6 +167,12 @@
 		#dma-cells = <1>;
 	};
 
+	apbmisc at 0,70000800 {
+		compatible = "nvidia,tegra124-apbmisc", "nvidia,tegra20-apbmisc";
+		reg = <0x0 0x70000800 0x0 0x64>,   /* Chip revision */
+		      <0x0 0x7000E864 0x0 0x04>;   /* Strapping options */
+	};
+
 	pinmux: pinmux at 0,70000868 {
 		compatible = "nvidia,tegra124-pinmux";
 		reg = <0x0 0x70000868 0x0 0x164>, /* Pad control registers */
@@ -437,6 +443,15 @@
 		clock-names = "pclk", "clk32k_in";
 	};
 
+	fuse at 0,7000f800 {
+		compatible = "nvidia,tegra124-efuse";
+		reg = <0x0 0x7000f800 0x0 0x400>;
+		clocks = <&tegra_car TEGRA124_CLK_FUSE>;
+		clock-names = "fuse";
+		resets = <&tegra_car 39>;
+		reset-names = "fuse";
+	};
+
 	sdhci at 0,700b0000 {
 		compatible = "nvidia,tegra124-sdhci";
 		reg = <0x0 0x700b0000 0x0 0x200>;
arch/arm/boot/dts/tegra20.dtsi +15 -0
index a7ddf70..243d84c 100644
@@ -236,6 +236,12 @@
 		interrupt-controller;
 	};
 
+	apbmisc at 70000800 {
+		compatible = "nvidia,tegra20-apbmisc";
+		reg = <0x70000800 0x64   /* Chip revision */
+		       0x70000008 0x04>; /* Strapping options */
+	};
+
 	pinmux: pinmux at 70000014 {
 		compatible = "nvidia,tegra20-pinmux";
 		reg = <0x70000014 0x10   /* Tri-state registers */
@@ -545,6 +551,15 @@
 		#size-cells = <0>;
 	};
 
+	fuse at 7000f800 {
+		compatible = "nvidia,tegra20-efuse";
+		reg = <0x7000F800 0x400>;
+		clocks = <&tegra_car TEGRA20_CLK_FUSE>;
+		clock-names = "fuse";
+		resets = <&tegra_car 39>;
+		reset-names = "fuse";
+	};
+
 	pcie-controller at 80003000 {
 		compatible = "nvidia,tegra20-pcie";
 		device_type = "pci";
arch/arm/boot/dts/tegra30.dtsi +15 -0
index dec4fc8..0b1ede9 100644
@@ -335,6 +335,12 @@
 		interrupt-controller;
 	};
 
+	apbmisc at 70000800 {
+		compatible = "nvidia,tegra30-apbmisc", "nvidia,tegra20-apbmisc";
+		reg = <0x70000800 0x64   /* Chip revision */
+		       0x70000008 0x04>; /* Strapping options */
+	};
+
 	pinmux: pinmux at 70000868 {
 		compatible = "nvidia,tegra30-pinmux";
 		reg = <0x70000868 0xd4    /* Pad control registers */
@@ -631,6 +637,15 @@
 		nvidia,ahb = <&ahb>;
 	};
 
+	fuse at 7000f800 {
+		compatible = "nvidia,tegra30-efuse";
+		reg = <0x7000f800 0x400>;
+		clocks = <&tegra_car TEGRA30_CLK_FUSE>;
+		clock-names = "fuse";
+		resets = <&tegra_car 39>;
+		reset-names = "fuse";
+	};
+
 	ahub at 70080000 {
 		compatible = "nvidia,tegra30-ahub";
 		reg = <0x70080000 0x200
Signature · 1 line
1.7.7.rc0.72.g4b5ea.dirty
#5 lore raw

PATCH v8 5/6 ARM: tegra: build new fuse driver in drivers/misc

In reply to Peter De Schrijver

The Tegra fuse code has moved to drivers/misc/fuse/tegra. Enable the building of that code, and disable the building of the old fuse code in arch/arm/mach-tegra/. Also move the only user of tegra_revision over to tegra_sku_info.revision and export tegra_fuse_readl to allow drivers to read calibration fuses.

---
 arch/arm/mach-tegra/Makefile          |    4 -
 arch/arm/mach-tegra/fuse.c            |  252 ----------------------------
 arch/arm/mach-tegra/fuse.h            |   61 -------
 arch/arm/mach-tegra/tegra.c           |    3 +-
 arch/arm/mach-tegra/tegra114_speedo.c |  105 ------------
 arch/arm/mach-tegra/tegra20_speedo.c  |  110 ------------
 arch/arm/mach-tegra/tegra30_speedo.c  |  293 ---------------------------------
 drivers/misc/Makefile                 |    1 +
 drivers/misc/fuse/tegra/fuse-tegra.c  |   10 +
 include/linux/tegra-soc.h             |    2 +-
 10 files changed, 14 insertions(+), 827 deletions(-)
 delete mode 100644 arch/arm/mach-tegra/fuse.c
 delete mode 100644 arch/arm/mach-tegra/fuse.h
 delete mode 100644 arch/arm/mach-tegra/tegra114_speedo.c
 delete mode 100644 arch/arm/mach-tegra/tegra20_speedo.c
 delete mode 100644 arch/arm/mach-tegra/tegra30_speedo.c
arch/arm/mach-tegra/Makefile +0 -4
index 6fbfbb7..e8601bb 100644
@@ -2,7 +2,6 @@ asflags-y				+= -march=armv7-a
 
 obj-y                                   += io.o
 obj-y                                   += irq.o
-obj-y					+= fuse.o
 obj-y					+= pmc.o
 obj-y					+= flowctrl.o
 obj-y					+= powergate.o
@@ -13,13 +12,11 @@ obj-y					+= reset-handler.o
 obj-y					+= sleep.o
 obj-y					+= tegra.o
 obj-$(CONFIG_CPU_IDLE)			+= cpuidle.o
-obj-$(CONFIG_ARCH_TEGRA_2x_SOC)		+= tegra20_speedo.o
 obj-$(CONFIG_ARCH_TEGRA_2x_SOC)		+= sleep-tegra20.o
 obj-$(CONFIG_ARCH_TEGRA_2x_SOC)		+= pm-tegra20.o
 ifeq ($(CONFIG_CPU_IDLE),y)
 obj-$(CONFIG_ARCH_TEGRA_2x_SOC)		+= cpuidle-tegra20.o
 endif
-obj-$(CONFIG_ARCH_TEGRA_3x_SOC)		+= tegra30_speedo.o
 obj-$(CONFIG_ARCH_TEGRA_3x_SOC)		+= sleep-tegra30.o
 obj-$(CONFIG_ARCH_TEGRA_3x_SOC)		+= pm-tegra30.o
 ifeq ($(CONFIG_CPU_IDLE),y)
@@ -28,7 +25,6 @@ endif
 obj-$(CONFIG_SMP)			+= platsmp.o headsmp.o
 obj-$(CONFIG_HOTPLUG_CPU)               += hotplug.o
 
-obj-$(CONFIG_ARCH_TEGRA_114_SOC)	+= tegra114_speedo.o
 obj-$(CONFIG_ARCH_TEGRA_114_SOC)	+= sleep-tegra30.o
 obj-$(CONFIG_ARCH_TEGRA_114_SOC)	+= pm-tegra30.o
 ifeq ($(CONFIG_CPU_IDLE),y)
arch/arm/mach-tegra/fuse.c deleted +0 -252

252 lines not on this page · raw message

arch/arm/mach-tegra/fuse.h deleted +0 -61

61 lines not on this page · raw message

arch/arm/mach-tegra/tegra.c +2 -1
index e48b271..093d5f4 100644
@@ -131,7 +131,8 @@ static void __init tegra_dt_init(void)
 		goto out;
 
 	soc_dev_attr->family = kasprintf(GFP_KERNEL, "Tegra");
-	soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%d", tegra_revision);
+	soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%d",
+					tegra_sku_info.revision);
 	soc_dev_attr->soc_id = kasprintf(GFP_KERNEL, "%d", tegra_chip_id);
 
 	soc_dev = soc_device_register(soc_dev_attr);
arch/arm/mach-tegra/tegra114_speedo.c deleted +0 -105

105 lines not on this page · raw message

arch/arm/mach-tegra/tegra20_speedo.c deleted +0 -110

110 lines not on this page · raw message

arch/arm/mach-tegra/tegra30_speedo.c deleted +0 -293

293 lines not on this page · raw message

drivers/misc/Makefile +1 -0
index 7eb4b69..ecb9349 100644
@@ -55,3 +55,4 @@ obj-$(CONFIG_SRAM)		+= sram.o
 obj-y				+= mic/
 obj-$(CONFIG_GENWQE)		+= genwqe/
 obj-$(CONFIG_ECHO)		+= echo/
+obj-y				+= fuse/
drivers/misc/fuse/tegra/fuse-tegra.c +10 -0
index 3fa6f74..934073e 100644
@@ -98,6 +98,16 @@ static void tegra_enable_fuse_clk(void __iomem *base)
 	writel(reg, base + 0x14);
 }
 
+int tegra_fuse_readl(u32 offset, u32 *val)
+{
+	if (!fuse_readl)
+		return -EPROBE_DEFER;
+
+	*val = fuse_readl(offset);
+
+	return 0;
+}
+
 int tegra_fuse_create_sysfs(struct device *dev, int size,
 		     u32 (*readl)(const unsigned int offset))
 {
include/linux/tegra-soc.h +1 -1
index 5c33b16..1ca3756 100644
@@ -54,9 +54,9 @@ struct tegra_sku_info {
 u32 tegra_read_straps(void);
 u32 tegra_read_chipid(void);
 void tegra_init_fuse(void);
+int tegra_fuse_readl(u32 offset, u32 *val);
 
 extern int tegra_chip_id;
-extern enum tegra_revision tegra_revision;
 extern struct tegra_sku_info tegra_sku_info;
 
 #if defined(CONFIG_TEGRA20_APB_DMA)
Signature · 1 line
1.7.7.rc0.72.g4b5ea.dirty
#6 lore raw

PATCH v8 6/6 misc: fuse: move APB DMA into Tegra20 fuse driver

In reply to Peter De Schrijver

The Tegra20 fuse driver is the only user of tegra_apb_readl_using_dma(). Therefore we can simply the code by incorporating the APB DMA handling into the driver directly. tegra_apb_writel_using_dma() is dropped because there are no users.

---
 arch/arm/mach-tegra/Makefile           |    1 -
 arch/arm/mach-tegra/apbio.c            |  217 --------------------------------
 arch/arm/mach-tegra/apbio.h            |   22 ----
 arch/arm/mach-tegra/tegra.c            |    2 -
 drivers/misc/fuse/tegra/fuse-tegra20.c |   79 +++++++++++-
 include/linux/tegra-soc.h              |   14 --
 6 files changed, 76 insertions(+), 259 deletions(-)
 delete mode 100644 arch/arm/mach-tegra/apbio.c
 delete mode 100644 arch/arm/mach-tegra/apbio.h
arch/arm/mach-tegra/Makefile +0 -1
index e8601bb..c303b55 100644
@@ -5,7 +5,6 @@ obj-y                                   += irq.o
 obj-y					+= pmc.o
 obj-y					+= flowctrl.o
 obj-y					+= powergate.o
-obj-y					+= apbio.o
 obj-y					+= pm.o
 obj-y					+= reset.o
 obj-y					+= reset-handler.o
arch/arm/mach-tegra/apbio.c deleted +0 -217

217 lines not on this page · raw message

arch/arm/mach-tegra/apbio.h deleted +0 -22
deleted file mode 100644
index f05d71c..0000000
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2010 NVIDIA Corporation.
- * Copyright (C) 2010 Google, Inc.
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- */
-
-#ifndef __MACH_TEGRA_APBIO_H
-#define __MACH_TEGRA_APBIO_H
-
-void tegra_apb_io_init(void);
-u32 tegra_apb_readl(unsigned long offset);
-void tegra_apb_writel(u32 value, unsigned long offset);
-#endif
arch/arm/mach-tegra/tegra.c +0 -2
index 093d5f4..ee6fbc6 100644
@@ -43,7 +43,6 @@
 #include <asm/setup.h>
 #include <asm/trusted_foundations.h>
 
-#include "apbio.h"
 #include "board.h"
 #include "common.h"
 #include "cpuidle.h"
@@ -100,7 +99,6 @@ static void __init tegra_init_cache(void)
 static void __init tegra_init_early(void)
 {
 	of_register_trusted_foundations();
-	tegra_apb_io_init();
 	tegra_init_fuse();
 	tegra_cpu_reset_handler_init();
 	tegra_init_cache();
drivers/misc/fuse/tegra/fuse-tegra20.c +76 -3

115 lines not on this page · raw message

include/linux/tegra-soc.h +0 -14
index 1ca3756..fcf65ec 100644
@@ -59,20 +59,6 @@ int tegra_fuse_readl(u32 offset, u32 *val);
 extern int tegra_chip_id;
 extern struct tegra_sku_info tegra_sku_info;
 
-#if defined(CONFIG_TEGRA20_APB_DMA)
-int tegra_apb_readl_using_dma(unsigned long offset, u32 *value);
-int tegra_apb_writel_using_dma(u32 value, unsigned long offset);
-#else
-static inline int tegra_apb_readl_using_dma(unsigned long offset, u32 *value)
-{
-	return -EINVAL;
-}
-static inline int tegra_apb_writel_using_dma(u32 value, unsigned long offset)
-{
-	return -EINVAL;
-}
-#endif
-
 #endif /* __ASSEMBLY__ */
 
 #endif /* __LINUX_TEGRA_SOC_H_ */
Signature · 1 line
1.7.7.rc0.72.g4b5ea.dirty
#7 lore raw

v8 cover efuse driver for Tegra

In reply to Peter De Schrijver
Quoted 5 lines · Peter De Schrijver

This driver allows userspace to read the raw efuse data. Its userspace interface is modelled after the sunxi_sid driver which provides similar functionality for some Allwinner SoCs. It has been tested on Tegra20 (ventana), Tegra30 (beaverboard), Tegra114 (dalmore) and Tegra124 (jetson TK1).

I think this series looks OK now. However, I noticed one change in behaviour that I don't think is expected:

The current code/DTB print:
Tegra Revision: A01 SKU: 0 CPU Process: 0 Core Process: 0

However, applying these patches and booting yields:
Tegra Revision: A01 SKU: 0 CPU Process: 1 Core Process: 1

#8 lore raw

v8 cover efuse driver for Tegra

Quoted 7 lines · Stephen Warren
Quoted 5 lines · Peter De Schrijver

This driver allows userspace to read the raw efuse data. Its userspace interface is modelled after the sunxi_sid driver which provides similar functionality for some Allwinner SoCs. It has been tested on Tegra20 (ventana), Tegra30 (beaverboard), Tegra114 (dalmore) and Tegra124 (jetson TK1).

Quoted 9 lines

I think this series looks OK now. However, I noticed one change in behaviour that I don't think is expected:

The current code/DTB print:
Tegra Revision: A01 SKU: 0 CPU Process: 0 Core Process: 0

However, applying these patches and booting yields:
Tegra Revision: A01 SKU: 0 CPU Process: 1 Core Process: 1

On which board/SoC?

Cheers,

Peter.

#9 lore raw

v8 cover efuse driver for Tegra

Quoted 11 lines · Peter De Schrijver
Quoted 10 lines · Stephen Warren
Quoted 5 lines · Peter De Schrijver

This driver allows userspace to read the raw efuse data. Its userspace interface is modelled after the sunxi_sid driver which provides similar functionality for some Allwinner SoCs. It has been tested on Tegra20 (ventana), Tegra30 (beaverboard), Tegra114 (dalmore) and Tegra124 (jetson TK1).

I think this series looks OK now. However, I noticed one change in behaviour that I don't think is expected:

Quoted 9 lines
Quoted 6 lines

The current code/DTB print:
Tegra Revision: A01 SKU: 0 CPU Process: 0 Core Process: 0

However, applying these patches and booting yields:
Tegra Revision: A01 SKU: 0 CPU Process: 1 Core Process: 1

On which board/SoC?

I'm guessing you're running on Tegra124 because the silicon revision reported is A01. If this is correct then, the current output is bogus. The current fuse code does not have any Tegra124 support and will fall back to reading the same fuse bits as on Tegra20 to determine the process IDs. You should get a warning message though: 'Tegra: unknown chip id'

Cheers,

Peter.

#10 lore raw

v8 cover efuse driver for Tegra

Quoted 12 lines · Peter De Schrijver
Quoted 11 lines · Peter De Schrijver
Quoted 10 lines · Stephen Warren
Quoted 5 lines · Peter De Schrijver

This driver allows userspace to read the raw efuse data. Its userspace interface is modelled after the sunxi_sid driver which provides similar functionality for some Allwinner SoCs. It has been tested on Tegra20 (ventana), Tegra30 (beaverboard), Tegra114 (dalmore) and Tegra124 (jetson TK1).

I think this series looks OK now. However, I noticed one change in behaviour that I don't think is expected:

Quoted 7 lines
Quoted 7 lines
Quoted 5 lines

The current code/DTB print:
Tegra Revision: A01 SKU: 0 CPU Process: 0 Core Process: 0

However, applying these patches and booting yields:
Tegra Revision: A01 SKU: 0 CPU Process: 1 Core Process: 1

On which board/SoC?

Oops. Venice2/Tegra124.

Quoted 5 lines

I'm guessing you're running on Tegra124 because the silicon revision reported is A01. If this is correct then, the current output is bogus. The current fuse code does not have any Tegra124 support and will fall back to reading the same fuse bits as on Tegra20 to determine the process IDs. You should get a warning message though: 'Tegra: unknown chip id'

Ah yes:
Tegra: unknown chip id 64

OK, so there's nothing wrong with this change in behaviour:-)

If that error message still exists, it might be nice if that value was printed in hex since that's what the data sheets and code usually represents it as. That can certainly be a followon patch though; no need for a respin.

#11 lore raw

v8 cover efuse driver for Tegra

In reply to Peter De Schrijver
Quoted 5 lines · Peter De Schrijver

This driver allows userspace to read the raw efuse data. Its userspace interface is modelled after the sunxi_sid driver which provides similar functionality for some Allwinner SoCs. It has been tested on Tegra20 (ventana), Tegra30 (beaverboard), Tegra114 (dalmore) and Tegra124 (jetson TK1).

I've applied this series to Tegra's for-3.17/fuse-move branch.