[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <e73c6976-7dac-3ee1-7f96-1e9c1829463f@marcan.st>
Date: Wed, 20 Oct 2021 01:49:10 +0900
From: Hector Martin <marcan@...can.st>
To: Sven Peter <sven@...npeter.dev>, Joerg Roedel <joro@...tes.org>
Cc: Martin Povišer <povik@...tonmail.com>,
Alyssa Rosenzweig <alyssa@...enzweig.io>,
Will Deacon <will@...nel.org>,
iommu@...ts.linux-foundation.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH] iommu/dart: Initialize DART_STREAMS_ENABLE
On 20/10/2021 01.22, Sven Peter wrote:
> DART has an additional global register to control which streams are
> isolated. This register is a bit redundant since DART_TCR can already
> be used to control isolation and is usually initialized to DART_STREAM_ALL
> by the time we get control. Some DARTs (namely the one used for the audio
> controller) however have some streams disabled initially. Make sure those
> work by initializing DART_STREAMS_ENABLE during reset.
>
> Reported-by: Martin Povišer <povik@...tonmail.com>
> Signed-off-by: Sven Peter <sven@...npeter.dev>
> ---
>
> While this could technically count as a fix I don't think it needs to go to
> 5.15 since no driver that requires this is in there. The first driver
> that needs this will likely only be ready for the 5.17 merge window.
>
> drivers/iommu/apple-dart.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/drivers/iommu/apple-dart.c b/drivers/iommu/apple-dart.c
> index ce92195db638..6f8c240d8d40 100644
> --- a/drivers/iommu/apple-dart.c
> +++ b/drivers/iommu/apple-dart.c
> @@ -70,6 +70,8 @@
> #define DART_ERROR_ADDR_HI 0x54
> #define DART_ERROR_ADDR_LO 0x50
>
> +#define DART_STREAMS_ENABLE 0xfc
> +
> #define DART_TCR(sid) (0x100 + 4 * (sid))
> #define DART_TCR_TRANSLATE_ENABLE BIT(7)
> #define DART_TCR_BYPASS0_ENABLE BIT(8)
> @@ -299,6 +301,9 @@ static int apple_dart_hw_reset(struct apple_dart *dart)
> apple_dart_hw_disable_dma(&stream_map);
> apple_dart_hw_clear_all_ttbrs(&stream_map);
>
> + /* enable all streams globally since TCR is used to control isolation */
> + writel(DART_STREAM_ALL, dart->regs + DART_STREAMS_ENABLE);
> +
> /* clear any pending errors before the interrupt is unmasked */
> writel(readl(dart->regs + DART_ERROR), dart->regs + DART_ERROR);
>
>
Reviewed-by: Hector Martin <marcan@...can.st>
--
Hector Martin (marcan@...can.st)
Public Key: https://mrcn.st/pub
Powered by blists - more mailing lists