Thread (81 messages) 81 messages, 3 authors, 2022-01-10

Re: [PATCH v3 26/33] iommu/mediatek: Add mtk_iommu_bank_data structure

From: Yong Wu <yong.wu@mediatek.com>
Date: 2022-01-09 02:46:57
Also in: linux-devicetree, linux-iommu, linux-mediatek, lkml

Hi AngeloGioacchino,

Thanks very much for reviewing whole the patchset.

On Tue, 2022-01-04 at 16:53 +0100, AngeloGioacchino Del Regno wrote:
Il 23/09/21 13:58, Yong Wu ha scritto:
quoted
Prepare for supporting multi-banks for the IOMMU HW, No functional
change.

Add a new structure(mtk_iommu_bank_data) for each a bank. Each a
bank have
the independent HW base/IRQ/tlb-range ops, and each a bank has its
special
iommu-domain(independent pgtable), thus, also move the domain
information
into it.

In previous SoC, we have only one bank which could be treated as
bank0(
bankid always is 0 for the previous SoC).

After adding this structure, the tlb operations and irq could use
bank_data as parameter.

Signed-off-by: Yong Wu <yong.wu@mediatek.com>
---
[...]
  
quoted
-struct mtk_iommu_data {
+struct mtk_iommu_bank_data {
  	void __iomem			*base;
  	int				irq;
+	unsigned int			id;
+	struct device			*pdev;
`pdev` may be a bit misleading, as it's conventionally read as
"platform device"
and not as the intended "parent device"... perhaps calling it
parent_dev would be
more appropriate.
will rename it. Thanks.
quoted
+	struct mtk_iommu_data		*pdata;   /* parent data */
Same here, pdata -> parent_data
Will fix.
quoted
+	spinlock_t			tlb_lock; /* lock for tlb range
flush */
+	struct mtk_iommu_domain		*m4u_dom; /* Each bank has
a domain */
+};
+
+struct mtk_iommu_data {
+	union {
+		struct { /* only for gen1 */
+			void __iomem		*base;
+			int			irq;
+			struct mtk_iommu_domain	*m4u_dom;
+		};
+
+		/* only for gen2 that support multi-banks */
+		struct mtk_iommu_bank_data	bank[MTK_IOMMU_BANK_MAX];
+	};
Sorry, but I really don't like this union... please, update
mtk_iommu_v1 to always
use bank[0] or, more appropriately, dynamically allocate the bank
array with a
devm_kzalloc call (as to not waste memory on platforms with less
available banks).

In that case, you would have...
quoted
  	struct device			*dev;
  	struct clk			*bclk;
  	phys_addr_t			protect_base; /* protect memory
base */
  	struct mtk_iommu_suspend_reg	reg;
-	struct mtk_iommu_domain		*m4u_dom;
  	struct iommu_group		*m4u_group[MTK_IOMMU_GROUP_MAX];
  	bool                            enable_4GB;
-	spinlock_t			tlb_lock; /* lock for tlb range
flush */
	struct mtk_iommu_bank_data	*banks;
	u8				num_banks;

... where `num_banks` gets copied from the same in
mtk_iommu_plat_data, defined
for each SoC, and where `banks` is dynamically allocated in
mtk_iommu.c and
mtk_iommu_v1.c's probe() callback.
Thanks for this idea. I will try this to see if the code will be too
complicate after changing this. If it is, I will use bank[0] always in
mtk_iommu_v1, this looks simpler.
quoted
  
  	struct iommu_device		iommu;
  	const struct mtk_iommu_plat_data *plat_data;
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help