diff mbox series

[v2,17/39] acpi: Add a central location for table version numbers

Message ID 20200308214442.v2.17.I19e38d6d49d8a7ac5fbe8a724e5ab3e71f857208@changeid
State Superseded
Headers show
Series dm: Add programmatic generation of ACPI tables (part A) | expand

Commit Message

Simon Glass March 9, 2020, 3:44 a.m. UTC
Each ACPI table has its own version number. Add the version numbers in a
single function so we can keep them consistent and easily see what
versions are supported.

Start a new acpi_table file in a generic directory to house this function.
We can move things over to this file from x86 as needed.

Signed-off-by: Simon Glass <sjg at chromium.org>
---

Changes in v2:
- Move the sandbox acpi_table.h header file to an earlier patch
- Use #defines for MADT and MCFG version numbers

 include/acpi_table.h  | 61 +++++++++++++++++++++++++++++++++++++++++++
 lib/Makefile          |  1 +
 lib/acpi/Makefile     |  4 +++
 lib/acpi/acpi_table.c | 60 ++++++++++++++++++++++++++++++++++++++++++
 test/dm/acpi.c        | 14 ++++++++++
 5 files changed, 140 insertions(+)
 create mode 100644 lib/acpi/Makefile
 create mode 100644 lib/acpi/acpi_table.c

Comments

Wolfgang Wallner March 10, 2020, 9:26 a.m. UTC | #1
Hi Simon,

-----"Simon Glass" <sjg at chromium.org> schrieb: -----
> 
> Each ACPI table has its own version number. Add the version numbers in a
> single function so we can keep them consistent and easily see what
> versions are supported.
> 
> Start a new acpi_table file in a generic directory to house this function.
> We can move things over to this file from x86 as needed.
> 
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
> 
> Changes in v2:
> - Move the sandbox acpi_table.h header file to an earlier patch
> - Use #defines for MADT and MCFG version numbers
> 
>  include/acpi_table.h  | 61 +++++++++++++++++++++++++++++++++++++++++++
>  lib/Makefile          |  1 +
>  lib/acpi/Makefile     |  4 +++
>  lib/acpi/acpi_table.c | 60 ++++++++++++++++++++++++++++++++++++++++++
>  test/dm/acpi.c        | 14 ++++++++++
>  5 files changed, 140 insertions(+)
>  create mode 100644 lib/acpi/Makefile
>  create mode 100644 lib/acpi/acpi_table.c
> 
> diff --git a/include/acpi_table.h b/include/acpi_table.h
> index dd74895813..ccf6fa04db 100644
> --- a/include/acpi_table.h
> +++ b/include/acpi_table.h
> @@ -202,6 +202,26 @@ struct __packed acpi_fadt {
>  	struct acpi_gen_regaddr x_gpe1_blk;
>  };
>  
> +/* FADT TABLE Revision values */
> +#define ACPI_FADT_REV_ACPI_1_0		1
> +#define ACPI_FADT_REV_ACPI_2_0		3
> +#define ACPI_FADT_REV_ACPI_3_0		4
> +#define ACPI_FADT_REV_ACPI_4_0		4
> +#define ACPI_FADT_REV_ACPI_5_0		5
> +#define ACPI_FADT_REV_ACPI_6_0		6
> +
> +/* MADT TABLE Revision values */
> +#define ACPI_MADT_REV_ACPI_3_0		2
> +#define ACPI_MADT_REV_ACPI_4_0		3
> +#define ACPI_MADT_REV_ACPI_5_0		3
> +#define ACPI_MADT_REV_ACPI_6_0		5
> +
> +#define ACPI_MCFG_REV_ACPI_3_0		1
> +
> +/* IVRS Revision Field */
> +#define IVRS_FORMAT_FIXED	0x01	/* Type 10h & 11h only */
> +#define IVRS_FORMAT_MIXED	0x02	/* Type 10h, 11h, & 40h */
> +
>  /* FACS flags */
>  #define ACPI_FACS_S4BIOS_F		BIT(0)
>  #define ACPI_FACS_64BIT_WAKE_F		BIT(1)
> @@ -391,6 +411,47 @@ struct __packed acpi_spcr {
>  	u32 reserved2;
>  };
>  
> +/* Tables defined by ACPI and generated by U-Boot */
> +enum acpi_tables {
> +	ACPITAB_BERT,
> +	ACPITAB_DBG2,
> +	ACPITAB_DMAR,
> +	ACPITAB_DSDT,
> +	ACPITAB_FACS,
> +	ACPITAB_FADT,
> +	ACPITAB_HEST,
> +	ACPITAB_HPET,
> +	ACPITAB_IVRS,
> +	ACPITAB_MADT,
> +	ACPITAB_MCFG,
> +	ACPITAB_RSDP,
> +	ACPITAB_RSDT,
> +	ACPITAB_SLIT,
> +	ACPITAB_SRAT,
> +	ACPITAB_SSDT,
> +	ACPITAB_TCPA,
> +	ACPITAB_TPM2,
> +	ACPITAB_XSDT,
> +	ACPITAB_ECDT,
> +
> +	/* Additional proprietary tables */
> +	ACPITAB_VFCT,
> +	ACPITAB_NHLT,
> +	ACPITAB_SPMI,
> +
> +	ACPITAB_COUNT,
> +};
> +
> +/**
> + * acpi_get_table_revision() - Get the revision number generated for a table
> + *
> + * This keeps the version-number information in one place
> + *
> + * @table: ACPI table to check
> + * @return version number that U-Boot generates
> + */
> +int acpi_get_table_revision(enum acpi_tables table);
> +
>  #endif /* !__ACPI__*/
>  
>  #include <asm/acpi_table.h>
> diff --git a/lib/Makefile b/lib/Makefile
> index 15259d0473..9df834c2fd 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -5,6 +5,7 @@
>  
>  ifndef CONFIG_SPL_BUILD
>  
> +obj-$(CONFIG_$(SPL_TPL_)ACPIGEN) += acpi/

Is $(SPL_TPL_) needed here?
I don't see a CONFIG_SPL_ACPIGEN, and this section of the file is also covered
by "ifndef CONFIG_SPL_BUILD".

In any case, would it make sense to generate ACPI-related code for SPL and TPL?
As U-Boot does not use ACPI, but only provides it to the kernel, I would
assume we only need to handle ACPI tables in the last U-Boot stage before
booting a kernel.

>  obj-$(CONFIG_EFI) += efi/
>  obj-$(CONFIG_EFI_LOADER) += efi_driver/
>  obj-$(CONFIG_EFI_LOADER) += efi_loader/
> diff --git a/lib/acpi/Makefile b/lib/acpi/Makefile
> new file mode 100644
> index 0000000000..660491ef71
> --- /dev/null
> +++ b/lib/acpi/Makefile
> @@ -0,0 +1,4 @@
> +# SPDX-License-Identifier: GPL-2.0+
> +#
> +
> +obj-y += acpi_table.o
> diff --git a/lib/acpi/acpi_table.c b/lib/acpi/acpi_table.c
> new file mode 100644
> index 0000000000..197f965c08
> --- /dev/null
> +++ b/lib/acpi/acpi_table.c
> @@ -0,0 +1,60 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Tests for ACPI table generation

The description here does not really fit, is this maybe a copy/paste mistake?

> + *
> + * Copyright 2019 Google LLC
> + */
> +
> +#include <common.h>
> +#include <acpi_table.h>
> +
> +int acpi_get_table_revision(enum acpi_tables table)
> +{
> +	switch (table) {
> +	case ACPITAB_FADT:
> +		return ACPI_FADT_REV_ACPI_3_0;
> +	case ACPITAB_MADT:
> +		return ACPI_MADT_REV_ACPI_3_0;
> +	case ACPITAB_MCFG:
> +		return ACPI_MCFG_REV_ACPI_3_0;
> +	case ACPITAB_TCPA:
> +		/* THis version and the rest are open-coded */

typo: This

> +		return 2;
> +	case ACPITAB_TPM2:
> +		return 4;
> +	case ACPITAB_SSDT: /* ACPI 3.0 upto 6.3: 2 */
> +		return 2;
> +	case ACPITAB_SRAT: /* ACPI 2.0: 1, ACPI 3.0: 2, ACPI 4.0 upto 6.3: 3 */

Nit: "up to" instead of "upto"?

> +		return 1; /* TODO Should probably be upgraded to 2 */
> +	case ACPITAB_DMAR:
> +		return 1;
> +	case ACPITAB_SLIT: /* ACPI 2.0 upto 6.3: 1 */
> +		return 1;
> +	case ACPITAB_SPMI: /* IMPI 2.0 */
> +		return 5;
> +	case ACPITAB_HPET: /* Currently 1. Table added in ACPI 2.0 */
> +		return 1;
> +	case ACPITAB_VFCT: /* ACPI 2.0/3.0/4.0: 1 */
> +		return 1;
> +	case ACPITAB_IVRS:
> +		return IVRS_FORMAT_FIXED;
> +	case ACPITAB_DBG2:
> +		return 0;
> +	case ACPITAB_FACS: /* ACPI 2.0/3.0: 1, ACPI 4.0 upto 6.3: 2 */

Nit: "up to" instead of "upto"?

> +		return 1;
> +	case ACPITAB_RSDT: /* ACPI 1.0 upto 6.3: 1 */
> +		return 1;
> +	case ACPITAB_XSDT: /* ACPI 2.0 upto 6.3: 1 */
> +		return 1;
> +	case ACPITAB_RSDP: /* ACPI 2.0 upto 6.3: 2 */
> +		return 2;
> +	case ACPITAB_HEST:
> +		return 1;
> +	case ACPITAB_NHLT:
> +		return 5;
> +	case ACPITAB_BERT:
> +		return 1;
> +	default:
> +		return -EINVAL;
> +	}
> +}
> diff --git a/test/dm/acpi.c b/test/dm/acpi.c
> index e3519d4689..e65295b7ca 100644
> --- a/test/dm/acpi.c
> +++ b/test/dm/acpi.c
> @@ -7,6 +7,7 @@
>   */
>  
>  #include <common.h>
> +#include <acpi_table.h>
>  #include <dm.h>
>  #include <dm/acpi.h>
>  #include <dm/test.h>
> @@ -53,3 +54,16 @@ static int dm_test_acpi_get_name(struct unit_test_state *uts)
>  	return 0;
>  }
>  DM_TEST(dm_test_acpi_get_name, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
> +
> +/* Test acpi_get_table_revision() */
> +static int dm_test_acpi_get_table_revision(struct unit_test_state *uts)
> +{
> +	ut_asserteq(1, acpi_get_table_revision(ACPITAB_MCFG));
> +	ut_asserteq(2, acpi_get_table_revision(ACPITAB_RSDP));
> +	ut_asserteq(4, acpi_get_table_revision(ACPITAB_TPM2));
> +	ut_asserteq(-EINVAL, acpi_get_table_revision(ACPITAB_COUNT));
> +
> +	return 0;
> +}
> +DM_TEST(dm_test_acpi_get_table_revision,
> +	DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
> -- 
> 2.25.1.481.gfbce0eb801-goog

regards, Wolfgang
Simon Glass March 12, 2020, 3:22 a.m. UTC | #2
Hi Wolfgang,

On Tue, 10 Mar 2020 at 03:26, Wolfgang Wallner <
wolfgang.wallner at br-automation.com> wrote:
>
> Hi Simon,
>
> -----"Simon Glass" <sjg at chromium.org> schrieb: -----
> >
> > Each ACPI table has its own version number. Add the version numbers in a
> > single function so we can keep them consistent and easily see what
> > versions are supported.
> >
> > Start a new acpi_table file in a generic directory to house this
function.
> > We can move things over to this file from x86 as needed.
> >
> > Signed-off-by: Simon Glass <sjg at chromium.org>
> > ---
> >
> > Changes in v2:
> > - Move the sandbox acpi_table.h header file to an earlier patch
> > - Use #defines for MADT and MCFG version numbers
> >
> >  include/acpi_table.h  | 61 +++++++++++++++++++++++++++++++++++++++++++
> >  lib/Makefile          |  1 +
> >  lib/acpi/Makefile     |  4 +++
> >  lib/acpi/acpi_table.c | 60 ++++++++++++++++++++++++++++++++++++++++++
> >  test/dm/acpi.c        | 14 ++++++++++
> >  5 files changed, 140 insertions(+)
> >  create mode 100644 lib/acpi/Makefile
> >  create mode 100644 lib/acpi/acpi_table.c
> >
> > diff --git a/include/acpi_table.h b/include/acpi_table.h
> > index dd74895813..ccf6fa04db 100644
> > --- a/include/acpi_table.h
> > +++ b/include/acpi_table.h
> > @@ -202,6 +202,26 @@ struct __packed acpi_fadt {
> >       struct acpi_gen_regaddr x_gpe1_blk;
> >  };
> >
> > +/* FADT TABLE Revision values */
> > +#define ACPI_FADT_REV_ACPI_1_0               1
> > +#define ACPI_FADT_REV_ACPI_2_0               3
> > +#define ACPI_FADT_REV_ACPI_3_0               4
> > +#define ACPI_FADT_REV_ACPI_4_0               4
> > +#define ACPI_FADT_REV_ACPI_5_0               5
> > +#define ACPI_FADT_REV_ACPI_6_0               6
> > +
> > +/* MADT TABLE Revision values */
> > +#define ACPI_MADT_REV_ACPI_3_0               2
> > +#define ACPI_MADT_REV_ACPI_4_0               3
> > +#define ACPI_MADT_REV_ACPI_5_0               3
> > +#define ACPI_MADT_REV_ACPI_6_0               5
> > +
> > +#define ACPI_MCFG_REV_ACPI_3_0               1
> > +
> > +/* IVRS Revision Field */
> > +#define IVRS_FORMAT_FIXED    0x01    /* Type 10h & 11h only */
> > +#define IVRS_FORMAT_MIXED    0x02    /* Type 10h, 11h, & 40h */
> > +
> >  /* FACS flags */
> >  #define ACPI_FACS_S4BIOS_F           BIT(0)
> >  #define ACPI_FACS_64BIT_WAKE_F               BIT(1)
> > @@ -391,6 +411,47 @@ struct __packed acpi_spcr {
> >       u32 reserved2;
> >  };
> >
> > +/* Tables defined by ACPI and generated by U-Boot */
> > +enum acpi_tables {
> > +     ACPITAB_BERT,
> > +     ACPITAB_DBG2,
> > +     ACPITAB_DMAR,
> > +     ACPITAB_DSDT,
> > +     ACPITAB_FACS,
> > +     ACPITAB_FADT,
> > +     ACPITAB_HEST,
> > +     ACPITAB_HPET,
> > +     ACPITAB_IVRS,
> > +     ACPITAB_MADT,
> > +     ACPITAB_MCFG,
> > +     ACPITAB_RSDP,
> > +     ACPITAB_RSDT,
> > +     ACPITAB_SLIT,
> > +     ACPITAB_SRAT,
> > +     ACPITAB_SSDT,
> > +     ACPITAB_TCPA,
> > +     ACPITAB_TPM2,
> > +     ACPITAB_XSDT,
> > +     ACPITAB_ECDT,
> > +
> > +     /* Additional proprietary tables */
> > +     ACPITAB_VFCT,
> > +     ACPITAB_NHLT,
> > +     ACPITAB_SPMI,
> > +
> > +     ACPITAB_COUNT,
> > +};
> > +
> > +/**
> > + * acpi_get_table_revision() - Get the revision number generated for a
table
> > + *
> > + * This keeps the version-number information in one place
> > + *
> > + * @table: ACPI table to check
> > + * @return version number that U-Boot generates
> > + */
> > +int acpi_get_table_revision(enum acpi_tables table);
> > +
> >  #endif /* !__ACPI__*/
> >
> >  #include <asm/acpi_table.h>
> > diff --git a/lib/Makefile b/lib/Makefile
> > index 15259d0473..9df834c2fd 100644
> > --- a/lib/Makefile
> > +++ b/lib/Makefile
> > @@ -5,6 +5,7 @@
> >
> >  ifndef CONFIG_SPL_BUILD
> >
> > +obj-$(CONFIG_$(SPL_TPL_)ACPIGEN) += acpi/
>
> Is $(SPL_TPL_) needed here?
> I don't see a CONFIG_SPL_ACPIGEN, and this section of the file is also
covered
> by "ifndef CONFIG_SPL_BUILD".
>
> In any case, would it make sense to generate ACPI-related code for SPL
and TPL?
> As U-Boot does not use ACPI, but only provides it to the kernel, I would
> assume we only need to handle ACPI tables in the last U-Boot stage before
> booting a kernel.

That's right. The point of this is to only include it in U-Boot proper.
Actually I should use $SPL here so will fix that.

Regards,
Simon
diff mbox series

Patch

diff --git a/include/acpi_table.h b/include/acpi_table.h
index dd74895813..ccf6fa04db 100644
--- a/include/acpi_table.h
+++ b/include/acpi_table.h
@@ -202,6 +202,26 @@  struct __packed acpi_fadt {
 	struct acpi_gen_regaddr x_gpe1_blk;
 };
 
+/* FADT TABLE Revision values */
+#define ACPI_FADT_REV_ACPI_1_0		1
+#define ACPI_FADT_REV_ACPI_2_0		3
+#define ACPI_FADT_REV_ACPI_3_0		4
+#define ACPI_FADT_REV_ACPI_4_0		4
+#define ACPI_FADT_REV_ACPI_5_0		5
+#define ACPI_FADT_REV_ACPI_6_0		6
+
+/* MADT TABLE Revision values */
+#define ACPI_MADT_REV_ACPI_3_0		2
+#define ACPI_MADT_REV_ACPI_4_0		3
+#define ACPI_MADT_REV_ACPI_5_0		3
+#define ACPI_MADT_REV_ACPI_6_0		5
+
+#define ACPI_MCFG_REV_ACPI_3_0		1
+
+/* IVRS Revision Field */
+#define IVRS_FORMAT_FIXED	0x01	/* Type 10h & 11h only */
+#define IVRS_FORMAT_MIXED	0x02	/* Type 10h, 11h, & 40h */
+
 /* FACS flags */
 #define ACPI_FACS_S4BIOS_F		BIT(0)
 #define ACPI_FACS_64BIT_WAKE_F		BIT(1)
@@ -391,6 +411,47 @@  struct __packed acpi_spcr {
 	u32 reserved2;
 };
 
+/* Tables defined by ACPI and generated by U-Boot */
+enum acpi_tables {
+	ACPITAB_BERT,
+	ACPITAB_DBG2,
+	ACPITAB_DMAR,
+	ACPITAB_DSDT,
+	ACPITAB_FACS,
+	ACPITAB_FADT,
+	ACPITAB_HEST,
+	ACPITAB_HPET,
+	ACPITAB_IVRS,
+	ACPITAB_MADT,
+	ACPITAB_MCFG,
+	ACPITAB_RSDP,
+	ACPITAB_RSDT,
+	ACPITAB_SLIT,
+	ACPITAB_SRAT,
+	ACPITAB_SSDT,
+	ACPITAB_TCPA,
+	ACPITAB_TPM2,
+	ACPITAB_XSDT,
+	ACPITAB_ECDT,
+
+	/* Additional proprietary tables */
+	ACPITAB_VFCT,
+	ACPITAB_NHLT,
+	ACPITAB_SPMI,
+
+	ACPITAB_COUNT,
+};
+
+/**
+ * acpi_get_table_revision() - Get the revision number generated for a table
+ *
+ * This keeps the version-number information in one place
+ *
+ * @table: ACPI table to check
+ * @return version number that U-Boot generates
+ */
+int acpi_get_table_revision(enum acpi_tables table);
+
 #endif /* !__ACPI__*/
 
 #include <asm/acpi_table.h>
diff --git a/lib/Makefile b/lib/Makefile
index 15259d0473..9df834c2fd 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -5,6 +5,7 @@ 
 
 ifndef CONFIG_SPL_BUILD
 
+obj-$(CONFIG_$(SPL_TPL_)ACPIGEN) += acpi/
 obj-$(CONFIG_EFI) += efi/
 obj-$(CONFIG_EFI_LOADER) += efi_driver/
 obj-$(CONFIG_EFI_LOADER) += efi_loader/
diff --git a/lib/acpi/Makefile b/lib/acpi/Makefile
new file mode 100644
index 0000000000..660491ef71
--- /dev/null
+++ b/lib/acpi/Makefile
@@ -0,0 +1,4 @@ 
+# SPDX-License-Identifier: GPL-2.0+
+#
+
+obj-y += acpi_table.o
diff --git a/lib/acpi/acpi_table.c b/lib/acpi/acpi_table.c
new file mode 100644
index 0000000000..197f965c08
--- /dev/null
+++ b/lib/acpi/acpi_table.c
@@ -0,0 +1,60 @@ 
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Tests for ACPI table generation
+ *
+ * Copyright 2019 Google LLC
+ */
+
+#include <common.h>
+#include <acpi_table.h>
+
+int acpi_get_table_revision(enum acpi_tables table)
+{
+	switch (table) {
+	case ACPITAB_FADT:
+		return ACPI_FADT_REV_ACPI_3_0;
+	case ACPITAB_MADT:
+		return ACPI_MADT_REV_ACPI_3_0;
+	case ACPITAB_MCFG:
+		return ACPI_MCFG_REV_ACPI_3_0;
+	case ACPITAB_TCPA:
+		/* THis version and the rest are open-coded */
+		return 2;
+	case ACPITAB_TPM2:
+		return 4;
+	case ACPITAB_SSDT: /* ACPI 3.0 upto 6.3: 2 */
+		return 2;
+	case ACPITAB_SRAT: /* ACPI 2.0: 1, ACPI 3.0: 2, ACPI 4.0 upto 6.3: 3 */
+		return 1; /* TODO Should probably be upgraded to 2 */
+	case ACPITAB_DMAR:
+		return 1;
+	case ACPITAB_SLIT: /* ACPI 2.0 upto 6.3: 1 */
+		return 1;
+	case ACPITAB_SPMI: /* IMPI 2.0 */
+		return 5;
+	case ACPITAB_HPET: /* Currently 1. Table added in ACPI 2.0 */
+		return 1;
+	case ACPITAB_VFCT: /* ACPI 2.0/3.0/4.0: 1 */
+		return 1;
+	case ACPITAB_IVRS:
+		return IVRS_FORMAT_FIXED;
+	case ACPITAB_DBG2:
+		return 0;
+	case ACPITAB_FACS: /* ACPI 2.0/3.0: 1, ACPI 4.0 upto 6.3: 2 */
+		return 1;
+	case ACPITAB_RSDT: /* ACPI 1.0 upto 6.3: 1 */
+		return 1;
+	case ACPITAB_XSDT: /* ACPI 2.0 upto 6.3: 1 */
+		return 1;
+	case ACPITAB_RSDP: /* ACPI 2.0 upto 6.3: 2 */
+		return 2;
+	case ACPITAB_HEST:
+		return 1;
+	case ACPITAB_NHLT:
+		return 5;
+	case ACPITAB_BERT:
+		return 1;
+	default:
+		return -EINVAL;
+	}
+}
diff --git a/test/dm/acpi.c b/test/dm/acpi.c
index e3519d4689..e65295b7ca 100644
--- a/test/dm/acpi.c
+++ b/test/dm/acpi.c
@@ -7,6 +7,7 @@ 
  */
 
 #include <common.h>
+#include <acpi_table.h>
 #include <dm.h>
 #include <dm/acpi.h>
 #include <dm/test.h>
@@ -53,3 +54,16 @@  static int dm_test_acpi_get_name(struct unit_test_state *uts)
 	return 0;
 }
 DM_TEST(dm_test_acpi_get_name, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+/* Test acpi_get_table_revision() */
+static int dm_test_acpi_get_table_revision(struct unit_test_state *uts)
+{
+	ut_asserteq(1, acpi_get_table_revision(ACPITAB_MCFG));
+	ut_asserteq(2, acpi_get_table_revision(ACPITAB_RSDP));
+	ut_asserteq(4, acpi_get_table_revision(ACPITAB_TPM2));
+	ut_asserteq(-EINVAL, acpi_get_table_revision(ACPITAB_COUNT));
+
+	return 0;
+}
+DM_TEST(dm_test_acpi_get_table_revision,
+	DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);