]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
Changed PPC44x startup message (cpu info, speed...) to common style:
authorStefan Roese <sr@denx.de>
Sun, 27 Nov 2005 18:36:26 +0000 (19:36 +0100)
committerStefan Roese <sr@denx.de>
Sun, 27 Nov 2005 18:36:26 +0000 (19:36 +0100)
On PPC44x platforms, the startup message generated in "cpu.c" only
comprised the ppc type and revision but not additional informations
like speed etc. Those speed infos where printed in the board specific
code. This new implementation now prints all CPU infos in the common
cpu specific code. No board specific code is needed anymore and
therefore removed from all current 44x implementations.

Patch by Stefan Roese, 27 Nov 2005

12 files changed:
CHANGELOG
board/amcc/bamboo/bamboo.c
board/amcc/ebony/ebony.c
board/amcc/ocotea/ocotea.c
board/amcc/yellowstone/yellowstone.c
board/amcc/yosemite/yosemite.c
board/prodrive/p3p440/p3p440.c
board/sandburst/karef/karef.c
board/sandburst/metrobox/metrobox.c
board/xpedite1k/xpedite1k.c
cpu/ppc4xx/cpu.c
include/configs/bamboo.h

index 2f5fe91bb0c870aa6d2c6c64fd6a107630b60d53..78f3da124bee0406c6d1b2469e2363875df2ecc2 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,15 @@
 Changes for U-Boot 1.1.4:
 ======================================================================
 
+* Changed PPC44x startup message (cpu info, speed...) to common style:
+  On PPC44x platforms, the startup message generated in "cpu.c" only
+  comprised the ppc type and revision but not additional informations
+  like speed etc. Those speed infos where printed in the board specific
+  code. This new implementation now prints all CPU infos in the common
+  cpu specific code. No board specific code is needed anymore and
+  therefore removed from all current 44x implementations.
+  Patch by Stefan Roese, 27 Nov 2005
+
 * Remove unnnecessary #include <linux/types.h> from include/asm-*/u-boot.h
 
 * Allow use of include/image.h and include/asm-*/u-boot.h in proprietary code.
index 53bf735008aa0ed9364db37a375bc2355ff1ba39..17547671a782cccb8f703bf63db4ef7cdb4d9012 100644 (file)
@@ -359,10 +359,7 @@ void nand_init(void)
 
 int checkboard(void)
 {
-       sys_info_t sysinfo;
-       unsigned char *s = getenv("serial#");
-
-       get_sys_info(&sysinfo);
+       char *s = getenv("serial#");
 
        printf("Board: Bamboo - AMCC PPC440EP Evaluation Board");
        if (s != NULL) {
@@ -371,12 +368,6 @@ int checkboard(void)
        }
        putc('\n');
 
-       printf("\tVCO: %lu MHz\n", sysinfo.freqVCOMhz / 1000000);
-       printf("\tCPU: %lu MHz\n", sysinfo.freqProcessor / 1000000);
-       printf("\tPLB: %lu MHz\n", sysinfo.freqPLB / 1000000);
-       printf("\tOPB: %lu MHz\n", sysinfo.freqOPB / 1000000);
-       printf("\tEPB: %lu MHz\n", sysinfo.freqEPB / 1000000);
-
        return (0);
 }
 
index 9191f0f60f2e7c2f98a22d1db7133fa2645730d6..a2595eec520e82c94af18edaead7beeb975ba567 100644 (file)
@@ -90,11 +90,8 @@ int board_early_init_f(void)
 
 int checkboard(void)
 {
-       sys_info_t sysinfo;
        char *s = getenv("serial#");
 
-       get_sys_info(&sysinfo);
-
        printf("Board: Ebony - AMCC PPC440GP Evaluation Board");
        if (s != NULL) {
                puts(", serial# ");
@@ -102,11 +99,6 @@ int checkboard(void)
        }
        putc('\n');
 
-       printf("\tVCO: %lu MHz\n", sysinfo.freqVCOMhz / 1000000);
-       printf("\tCPU: %lu MHz\n", sysinfo.freqProcessor / 1000000);
-       printf("\tPLB: %lu MHz\n", sysinfo.freqPLB / 1000000);
-       printf("\tOPB: %lu MHz\n", sysinfo.freqOPB / 1000000);
-       printf("\tEPB: %lu MHz\n", sysinfo.freqEPB / 1000000);
        return (0);
 }
 
index 3926109bd578812c291b59ef7a6b44edf6ef1ddc..d1a29c52a513787b4f48f1365dd2153d682c7aaa 100644 (file)
@@ -186,11 +186,8 @@ int board_early_init_f (void)
 
 int checkboard (void)
 {
-       sys_info_t sysinfo;
        char *s = getenv ("serial#");
 
-       get_sys_info (&sysinfo);
-
        printf ("Board: Ocotea - AMCC PPC440GX Evaluation Board");
        if (s != NULL) {
                puts (", serial# ");
@@ -198,11 +195,6 @@ int checkboard (void)
        }
        putc ('\n');
 
-       printf ("\tVCO: %lu MHz\n", sysinfo.freqVCOMhz / 1000000);
-       printf ("\tCPU: %lu MHz\n", sysinfo.freqProcessor / 1000000);
-       printf ("\tPLB: %lu MHz\n", sysinfo.freqPLB / 1000000);
-       printf ("\tOPB: %lu MHz\n", sysinfo.freqOPB / 1000000);
-       printf ("\tEPB: %lu MHz\n", sysinfo.freqEPB / 1000000);
        return (0);
 }
 
index 069e28f3c80dfc83e7646c2d2bc64dc8d079f551..f3c689c114e105569f8850613d7f70c47d794432 100644 (file)
@@ -188,10 +188,7 @@ int misc_init_r (void)
 
 int checkboard(void)
 {
-       sys_info_t sysinfo;
-       unsigned char *s = getenv("serial#");
-
-       get_sys_info(&sysinfo);
+       char *s = getenv("serial#");
 
        printf("Board: Yellowstone - AMCC PPC440GR Evaluation Board");
        if (s != NULL) {
@@ -200,13 +197,6 @@ int checkboard(void)
        }
        putc('\n');
 
-       printf("\tVCO: %lu MHz\n", sysinfo.freqVCOMhz / 1000000);
-       printf("\tCPU: %lu MHz\n", sysinfo.freqProcessor / 1000000);
-       printf("\tPLB: %lu MHz\n", sysinfo.freqPLB / 1000000);
-       printf("\tOPB: %lu MHz\n", sysinfo.freqOPB / 1000000);
-       printf("\tEPB: %lu MHz\n", sysinfo.freqEPB / 1000000);
-       printf("\tPCI: %lu MHz\n", sysinfo.freqPCI / 1000000);
-
        return (0);
 }
 
index 61a39beed7d1abd3528d231eb52e1a76176bda2c..a5cf8b6c81db0989042ada80aaa6268c8969fe2b 100644 (file)
@@ -184,10 +184,7 @@ int misc_init_r (void)
 
 int checkboard(void)
 {
-       sys_info_t sysinfo;
-       unsigned char *s = getenv("serial#");
-
-       get_sys_info(&sysinfo);
+       char *s = getenv("serial#");
 
        printf("Board: Yosemite - AMCC PPC440EP Evaluation Board");
        if (s != NULL) {
@@ -196,13 +193,6 @@ int checkboard(void)
        }
        putc('\n');
 
-       printf("\tVCO: %lu MHz\n", sysinfo.freqVCOMhz / 1000000);
-       printf("\tCPU: %lu MHz\n", sysinfo.freqProcessor / 1000000);
-       printf("\tPLB: %lu MHz\n", sysinfo.freqPLB / 1000000);
-       printf("\tOPB: %lu MHz\n", sysinfo.freqOPB / 1000000);
-       printf("\tEPB: %lu MHz\n", sysinfo.freqEPB / 1000000);
-       printf("\tPCI: %lu MHz\n", sysinfo.freqPCI / 1000000);
-
        return (0);
 }
 
index cc4c9dda99e374345014c90ecc2c36646414560d..8ba66bf5e539dad5eac5ef1e6fede3d62ee842d6 100644 (file)
@@ -120,11 +120,7 @@ int board_early_init_f(void)
 
 int checkboard(void)
 {
-       sys_info_t sysinfo;
        char *s = getenv("serial#");
-       char buf[32];
-
-       get_sys_info(&sysinfo);
 
        printf("Board: P3P440");
        if (s != NULL) {
@@ -140,13 +136,6 @@ int checkboard(void)
 
        putc('\n');
 
-       printf("       at %s MHz (VCO=%lu, PLB=%lu, OPB=%lu, EBC=%lu MHz)\n",
-              strmhz(buf, sysinfo.freqProcessor),
-              sysinfo.freqVCOMhz / 1000000,
-              sysinfo.freqPLB / 1000000,
-              sysinfo.freqOPB / 1000000,
-              sysinfo.freqEPB / 1000000);
-
        return (0);
 }
 
index cfbfa47e9db2ff921746677bb4732186daf15169..2d71d3b2cc7280bb93ca25047b3726a0ce6c8e2d 100644 (file)
@@ -305,12 +305,6 @@ int checkboard (void)
                printf("OFEM Board Rev:\t0x%02X\tID:   0x%02X\n", ofem_brd_id, ofem_brd_rev);
        }
 
-       printf ("\tVCO: %lu MHz\n", sysinfo.freqVCOMhz / 1000000);
-       printf ("\tCPU: %lu MHz\n", sysinfo.freqProcessor / 1000000);
-       printf ("\tPLB: %lu MHz\n", sysinfo.freqPLB / 1000000);
-       printf ("\tOPB: %lu MHz\n", sysinfo.freqOPB / 1000000);
-       printf ("\tEPB: %lu MHz\n", sysinfo.freqEPB / 1000000);
-
        /* Fix the ack in the bme 32 */
        udelay(5000);
        out32(CFG_BME32_BASE + 0x0000000C, 0x00000001);
index 869367dabaa4ce86135dffda81c3c9edc5d0ca05..86d259fac4a1e2d277472ffc1617c493ae2227ee 100644 (file)
@@ -272,13 +272,6 @@ int checkboard (void)
        printf ("OptoFPGA ID:\t0x%02X\tRev:  0x%02X\n", opto_id, opto_rev);
        printf ("Board Rev:\t0x%02X\tID:  %s\n", brd_rev, board_id_as[brd_id]);
 
-       printf ("\tVCO: %lu MHz\n", sysinfo.freqVCOMhz / 1000000);
-       printf ("\tCPU: %lu MHz\n", sysinfo.freqProcessor / 1000000);
-       printf ("\tPLB: %lu MHz\n", sysinfo.freqPLB / 1000000);
-       printf ("\tOPB: %lu MHz\n", sysinfo.freqOPB / 1000000);
-       printf ("\tEPB: %lu MHz\n", sysinfo.freqEPB / 1000000);
-
-
        /* Fix the ack in the bme 32 */
        udelay(5000);
        out32(CFG_BME32_BASE + 0x0000000C, 0x00000001);
index d6b30b94466ca0e22f2b9792627051dfe0159f3a..bb36c965236344f42c44ef65f2f62043059f6d77 100644 (file)
@@ -96,15 +96,7 @@ int board_early_init_f(void)
 
 int checkboard (void)
 {
-       sys_info_t sysinfo;
-       get_sys_info (&sysinfo);
-
        printf ("Board: XES XPedite1000 440GX\n");
-       printf ("\tVCO: %lu MHz\n", sysinfo.freqVCOMhz / 1000000);
-       printf ("\tCPU: %lu MHz\n", sysinfo.freqProcessor / 1000000);
-       printf ("\tPLB: %lu MHz\n", sysinfo.freqPLB / 1000000);
-       printf ("\tOPB: %lu MHz\n", sysinfo.freqOPB / 1000000);
-       printf ("\tEPB: %lu MHz\n", sysinfo.freqEPB / 1000000);
 
        return (0);
 }
index d721e46b5bb22761faf908e1814f8077f649f8a5..6c619530f455de32122cd301fdceaa342388ec31 100644 (file)
 #include <ppc4xx.h>
 
 
+#if defined(CONFIG_405GP)
+#define PCI_ARBITER_ENABLED    (mfdcr(strap) & PSR_PCI_ARBIT_EN)
+#define PCI_ASYNC_ENABLED      (mfdcr(strap) & PSR_PCI_ASYNC_EN)
+#endif
+
+#if defined(CONFIG_405EP)
+#define PCI_ARBITER_ENABLED    (mfdcr(cpc0_pci) & CPC0_PCI_ARBIT_EN)
+#define I2C_BOOTROM_ENABLED    (mfdcr(cpc0_boot) & CPC0_BOOT_SEP)
+#endif
+
+#if defined(CONFIG_440EP) || defined(CONFIG_440GR)
+#define SDR0_SDSTP1_PAE                (0x80000000 >> 21)
+#define SDR0_SDSTP1_PAME       (0x80000000 >> 27)
+
+#define PCI_ARBITER_ENABLED    (mfdcr(cpc0_strp1) & SDR0_SDSTP1_PAE)
+#define PCI_ASYNC_ENABLED      (mfdcr(cpc0_strp1) & SDR0_SDSTP1_PAME)
+#endif
+
+#if defined(CONFIG_440GP)
+#define CPC0_STRP1_PAE         (0x80000000 >> 11)
+
+#define PCI_ARBITER_ENABLED    (mfdcr(cpc0_strp1) & CPC0_STRP1_PAE)
+#endif
+
+#if defined(CONFIG_440GX)
+#define SDR0_SDSTP1_PAE                (0x80000000 >> 13)
+
+#define PCI_ARBITER_ENABLED    (mfdcr(cpc0_strp1) & SDR0_SDSTP1_PAE)
+#endif
+
+#if defined(CONFIG_440)
+#define FREQ_EBC               (sys_info.freqEPB)
+#else
+#define FREQ_EBC               (sys_info.freqPLB / sys_info.pllExtBusDiv)
+#endif
+
+
 #if defined(CONFIG_440)
-static int do_chip_reset( unsigned long sys0, unsigned long sys1 );
+static int do_chip_reset(unsigned long sys0, unsigned long sys1);
 #endif
 
-/* ------------------------------------------------------------------------- */
 
 int checkcpu (void)
 {
-#if defined(CONFIG_405GP) || \
-    defined(CONFIG_405CR) || \
-    defined(CONFIG_405EP) || \
-    defined(CONFIG_440)   || \
-    defined(CONFIG_IOP480)
-       uint pvr = get_pvr();
-#endif
-#if defined(CONFIG_405GP) || \
-    defined(CONFIG_405CR) || \
-    defined(CONFIG_405EP) || \
-    defined(CONFIG_IOP480)
+#if !defined(CONFIG_405)       /* not used on Xilinx 405 FPGA implementations */
        DECLARE_GLOBAL_DATA_PTR;
-
+       uint pvr = get_pvr();
        ulong clock = gd->cpu_clk;
        char buf[32];
-#endif
 
-#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || defined(CONFIG_405EP)
-       PPC405_SYS_INFO sys_info;
+#if !defined(CONFIG_IOP480)
+       sys_info_t sys_info;
 
        puts ("CPU:   ");
 
        get_sys_info(&sys_info);
 
-#ifdef CONFIG_405GP
-       puts ("AMCC PowerPC 405GP");
-       if (pvr == PVR_405GPR_RB) {
-               putc('r');
-       }
-       puts (" Rev. ");
-#endif
-#ifdef CONFIG_405CR
-       puts ("AMCC PowerPC 405CR Rev. ");
+       puts("AMCC PowerPC 4");
+
+#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || defined(CONFIG_405EP)
+       puts("05");
 #endif
-#ifdef CONFIG_405EP
-       puts ("AMCC PowerPC 405EP Rev. ");
+#if defined(CONFIG_440)
+       puts("40");
 #endif
+
        switch (pvr) {
        case PVR_405GP_RB:
-       case PVR_405GPR_RB:
-               putc('B');
+               puts("GP Rev. B");
                break;
+
        case PVR_405GP_RC:
-#ifdef CONFIG_405CR
-       case PVR_405CR_RC:
-#endif
-               putc('C');
+               puts("GP Rev. C");
                break;
+
        case PVR_405GP_RD:
-               putc('D');
+               puts("GP Rev. D");
                break;
+
 #ifdef CONFIG_405GP
-       case PVR_405GP_RE:
-               putc('E');
+       case PVR_405GP_RE: /* 405GP rev E and 405CR rev C have same PVR */
+               puts("GP Rev. E");
                break;
 #endif
+
        case PVR_405CR_RA:
-               putc('A');
+               puts("CR Rev. A");
                break;
+
        case PVR_405CR_RB:
-       case PVR_405EP_RB:
-               putc('B');
-               break;
-       default:
-               printf ("? (PVR=%08x)", pvr);
+               puts("CR Rev. B");
                break;
-       }
-
-       printf (" at %s MHz (PLB=%lu, OPB=%lu, EBC=%lu MHz)\n", strmhz(buf, clock),
-              sys_info.freqPLB / 1000000,
-              sys_info.freqPLB / sys_info.pllOpbDiv / 1000000,
-              sys_info.freqPLB / sys_info.pllExtBusDiv / 1000000);
 
-#if defined(CONFIG_405GP)
-       if (mfdcr(strap) & PSR_PCI_ASYNC_EN) {
-               printf ("       PCI async ext clock used, ");
-       } else {
-               printf ("       PCI sync clock at %lu MHz, ",
-                      sys_info.freqPLB / sys_info.pllPciDiv / 1000000);
-       }
-       printf ("%sternal PCI arbiter enabled\n",
-               (mfdcr(strap) & PSR_PCI_ARBIT_EN) ? "in" : "ex");
-#elif defined(CONFIG_405EP)
-       printf ("       IIC Boot EEPROM %sabled\n",
-               (mfdcr(cpc0_boot) & CPC0_BOOT_SEP) ? "en" : "dis");
-       printf ("       PCI async ext clock used, ");
-       printf ("%sternal PCI arbiter enabled\n",
-               (mfdcr(cpc0_pci) & CPC0_PCI_ARBIT_EN) ? "in" : "ex");
+#ifdef CONFIG_405CR
+       case PVR_405CR_RC: /* 405GP rev E and 405CR rev C have same PVR */
+               puts("CR Rev. C");
+               break;
 #endif
 
-#if defined(CONFIG_405EP)
-       printf ("       16 kB I-Cache 16 kB D-Cache");
-#else
-       printf ("       16 kB I-Cache %d kB D-Cache",
-               ((pvr | 0x00000001) == PVR_405GPR_RB) ? 16 : 8);
-#endif
-#endif  /* defined(CONFIG_405GP) || defined(CONFIG_405CR) */
+       case PVR_405GPR_RB:
+               puts("GPr Rev. B");
+               break;
 
-#ifdef CONFIG_IOP480
-       printf ("PLX IOP480 (PVR=%08x)", pvr);
-       printf (" at %s MHz:", strmhz(buf, clock));
-       printf (" %u kB I-Cache", 4);
-       printf (" %u kB D-Cache", 2);
-#endif
+       case PVR_405EP_RB:
+               puts("EP Rev. B");
+               break;
 
 #if defined(CONFIG_440)
-       puts ("AMCC PowerPC 440");
-       switch(pvr) {
        case PVR_440GP_RB:
                puts("GP Rev. B");
                /* See errata 1.12: CHIP_4 */
@@ -166,40 +158,96 @@ int checkcpu (void)
                                        mfdcr(cpc0_strp1) );
                }
                break;
+
        case PVR_440GP_RC:
                puts("GP Rev. C");
                break;
+
        case PVR_440GX_RA:
                puts("GX Rev. A");
                break;
+
        case PVR_440GX_RB:
                puts("GX Rev. B");
                break;
+
        case PVR_440GX_RC:
                puts("GX Rev. C");
                break;
+
        case PVR_440GX_RF:
                puts("GX Rev. F");
                break;
+
        case PVR_440EP_RA:
                puts("EP Rev. A");
                break;
+
 #ifdef CONFIG_440EP
        case PVR_440EP_RB: /* 440EP rev B and 440GR rev A have same PVR */
                puts("EP Rev. B");
                break;
 #endif /*  CONFIG_440EP */
+
 #ifdef CONFIG_440GR
        case PVR_440GR_RA: /* 440EP rev B and 440GR rev A have same PVR */
                puts("GR Rev. A");
                break;
 #endif /* CONFIG_440GR */
+#endif /* CONFIG_440 */
+
        default:
                printf (" UNKNOWN (PVR=%08x)", pvr);
                break;
        }
+
+       printf (" at %s MHz (PLB=%lu, OPB=%lu, EBC=%lu MHz)\n", strmhz(buf, clock),
+              sys_info.freqPLB / 1000000,
+              sys_info.freqPLB / sys_info.pllOpbDiv / 1000000,
+              FREQ_EBC / 1000000);
+
+#if defined(I2C_BOOTROM_ENABLED)
+       printf ("       IIC Boot EEPROM %sabled\n", I2C_BOOTROM_ENABLED ? "en" : "dis");
+#endif
+
+#if defined(PCI_ARBITER_ENABLED)
+       printf ("       %sternal PCI arbiter enabled",
+               (PCI_ARBITER_ENABLED) ? "In" : "Ex");
+#endif
+
+#if defined(PCI_ASYNC_ENABLED)
+       if (PCI_ASYNC_ENABLED) {
+               printf (", PCI async ext clock used");
+       } else {
+               printf (", PCI sync clock at %lu MHz",
+                      sys_info.freqPLB / sys_info.pllPciDiv / 1000000);
+       }
 #endif
-       puts ("\n");
+
+#if defined(PCI_ARBITER_ENABLED) || defined(PCI_ASYNC_ENABLED)
+       putc('\n');
+#endif
+
+#if defined(CONFIG_405EP)
+       printf ("       16 kB I-Cache 16 kB D-Cache");
+#elif defined(CONFIG_440)
+       printf ("       32 kB I-Cache 32 kB D-Cache");
+#else
+       printf ("       16 kB I-Cache %d kB D-Cache",
+               ((pvr | 0x00000001) == PVR_405GPR_RB) ? 16 : 8);
+#endif
+#endif /* !defined(CONFIG_IOP480) */
+
+#if defined(CONFIG_IOP480)
+       printf ("PLX IOP480 (PVR=%08x)", pvr);
+       printf (" at %s MHz:", strmhz(buf, clock));
+       printf (" %u kB I-Cache", 4);
+       printf (" %u kB D-Cache", 2);
+#endif
+
+#endif /* !defined(CONFIG_405) */
+
+       putc ('\n');
 
        return 0;
 }
@@ -230,8 +278,7 @@ int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 }
 
 #if defined(CONFIG_440)
-static
-int do_chip_reset (unsigned long sys0, unsigned long sys1)
+static int do_chip_reset (unsigned long sys0, unsigned long sys1)
 {
        /* Changes to cpc0_sys0 and cpc0_sys1 require chip
         * reset.
@@ -252,31 +299,13 @@ int do_chip_reset (unsigned long sys0, unsigned long sys1)
  */
 unsigned long get_tbclk (void)
 {
-#if defined(CONFIG_440)
-
+#if !defined(CONFIG_IOP480)
        sys_info_t  sys_info;
 
        get_sys_info(&sys_info);
        return (sys_info.freqProcessor);
-
-#elif defined(CONFIG_405GP) || \
-      defined(CONFIG_405CR) || \
-      defined(CONFIG_405) || \
-      defined(CONFIG_405EP)
-
-       PPC405_SYS_INFO sys_info;
-
-       get_sys_info(&sys_info);
-       return (sys_info.freqProcessor);
-
-#elif defined(CONFIG_IOP480)
-
-       return (66000000);
-
 #else
-
-# error get_tbclk() not implemented
-
+       return (66000000);
 #endif
 
 }
index ab8a1e78f10a6bd74747334ab0dc6430279be28a..eacc74446cebc27bb9a6e20b6c2769838252b731 100644 (file)
@@ -73,7 +73,7 @@
  * Initial RAM & stack pointer (placed in SDRAM)
  *----------------------------------------------------------------------*/
 #define CFG_INIT_RAM_ADDR      0x70000000              /* DCache       */
-#define CFG_INIT_RAM_END       (8 << 10)
+#define CFG_INIT_RAM_END       (4 << 10)
 #define CFG_GBL_DATA_SIZE      256                     /* num bytes initial data       */
 #define CFG_GBL_DATA_OFFSET    (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
 #define CFG_INIT_SP_OFFSET     CFG_GBL_DATA_OFFSET