From: Shunqian Zheng <shunqian.zheng-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Tomasz Figa <tfiga-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>,
Shunqian Zheng <zhengsq-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
Cc: "Mark Rutland" <mark.rutland-5wv7dgnIgG8@public.gmane.org>,
devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
"Heiko Stübner" <heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>,
"David Airlie" <airlied-cv59FeDIM0c@public.gmane.org>,
"Joerg Roedel" <joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>,
linux-I+IVW8TIWO2tmTQ+vhA3Yw@public.gmane.org,
dri-devel
<dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org>,
"linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
<linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
"open list:ARM/Rockchip SoC..."
<linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org>,
"IOMMU DRIVERS"
<iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>,
"Rob Herring" <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
姚智情 <mark.yao-TNX95d0MmH7DzftRWevZcw@public.gmane.org>,
"linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org"
<linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org>,
"simon xue" <xxm-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
Subject: Re: [PATCH v2 6/7] iommu/rockchip: use DMA API to map, to flush cache
Date: Mon, 13 Jun 2016 17:56:28 +0800 [thread overview]
Message-ID: <575E834C.30305@gmail.com> (raw)
In-Reply-To: <CAAFQd5Da+Eg=eiRUgLSS_qPjGbG474KYWDC=GaAMS8A_CuQ3Mg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
Hi
On 2016年06月10日 17:10, Tomasz Figa wrote:
> Hi,
>
> On Wed, Jun 8, 2016 at 10:26 PM, Shunqian Zheng <zhengsq@rock-chips.com> wrote:
>> Use DMA API instead of architecture internal functions like
>> __cpuc_flush_dcache_area() etc.
>>
>> To support the virtual device like DRM the virtual slave iommu
>> added in the previous patch, attaching to which the DRM can use
>> it own domain->dev for dma_map_*(), dma_sync_*() even VOP is disabled.
>>
>> With this patch, this driver is available for ARM64 like RK3399.
>>
> Could we instead simply allocate coherent memory for page tables using
> dma_alloc_coherent() and skip any flushing on CPU side completely? If
> I'm looking correctly, the driver only reads back the page directory
> when checking if there is a need to allocate new page table, so there
> shouldn't be any significant penalty for disabling the cache.
I try to use dma_alloc_coherent() to replace the dma_map_single(),
but it doesn't work for me properly.
Because the DRM uses the iommu_dma_ops instead the swiotlb_dma_ops after
attaching
to iommu, so when the iommu domain need to alloc a new page in
rk_iommu_map(),
it would call:
rk_iommu_map() --> dma_alloc_coherent() --> ops->alloc() -->
iommu_map() --> rk_iommu_map()
Then I try to reserve memory for coherent so that, dma_alloc_coherent()
calls dma_alloc_from_coherent()
but not ops->alloc(). But it doesn't work too because when DRM request
buffer it never uses iommu.
>
> Other than that, please see some comments inline.
>
>> Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com>
>> ---
>> drivers/iommu/rockchip-iommu.c | 113 ++++++++++++++++++++++++++---------------
>> 1 file changed, 71 insertions(+), 42 deletions(-)
>>
>> diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c
>> index d6c3051..aafea6e 100644
>> --- a/drivers/iommu/rockchip-iommu.c
>> +++ b/drivers/iommu/rockchip-iommu.c
>> @@ -4,8 +4,6 @@
>> * published by the Free Software Foundation.
>> */
>>
>> -#include <asm/cacheflush.h>
>> -#include <asm/pgtable.h>
>> #include <linux/compiler.h>
>> #include <linux/delay.h>
>> #include <linux/device.h>
>> @@ -61,8 +59,7 @@
>> #define RK_MMU_IRQ_BUS_ERROR 0x02 /* bus read error */
>> #define RK_MMU_IRQ_MASK (RK_MMU_IRQ_PAGE_FAULT | RK_MMU_IRQ_BUS_ERROR)
>>
>> -#define NUM_DT_ENTRIES 1024
>> -#define NUM_PT_ENTRIES 1024
>> +#define NUM_TLB_ENTRIES 1024 /* for both DT and PT */
> Is it necessary to change this in this patch? In general, it's not a
> good idea to mix multiple logical changes together.
Sure, will restore changes in v3.
>
>> #define SPAGE_ORDER 12
>> #define SPAGE_SIZE (1 << SPAGE_ORDER)
>> @@ -82,7 +79,9 @@
>>
>> struct rk_iommu_domain {
>> struct list_head iommus;
>> + struct device *dev;
>> u32 *dt; /* page directory table */
>> + dma_addr_t dt_dma;
>> spinlock_t iommus_lock; /* lock for iommus list */
>> spinlock_t dt_lock; /* lock for modifying page directory table */
>>
>> @@ -98,14 +97,12 @@ struct rk_iommu {
>> struct iommu_domain *domain; /* domain to which iommu is attached */
>> };
>>
>> -static inline void rk_table_flush(u32 *va, unsigned int count)
>> +static inline void rk_table_flush(struct device *dev, dma_addr_t dma,
>> + unsigned int count)
>> {
>> - phys_addr_t pa_start = virt_to_phys(va);
>> - phys_addr_t pa_end = virt_to_phys(va + count);
>> - size_t size = pa_end - pa_start;
>> + size_t size = count * 4;
> It would be a good idea to specify what "count" is. I'm a bit confused
> that before it meant bytes and now some multiple of 4?
"count" means PT/DT entry count to flush here. I would add some more
comment on it.
Thank you very much,
Shunqian
>
> Best regards,
> Tomasz
>
> _______________________________________________
> Linux-rockchip mailing list
> Linux-rockchip@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-rockchip
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
WARNING: multiple messages have this Message-ID (diff)
From: shunqian.zheng@gmail.com (Shunqian Zheng)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 6/7] iommu/rockchip: use DMA API to map, to flush cache
Date: Mon, 13 Jun 2016 17:56:28 +0800 [thread overview]
Message-ID: <575E834C.30305@gmail.com> (raw)
In-Reply-To: <CAAFQd5Da+Eg=eiRUgLSS_qPjGbG474KYWDC=GaAMS8A_CuQ3Mg@mail.gmail.com>
Hi
On 2016?06?10? 17:10, Tomasz Figa wrote:
> Hi,
>
> On Wed, Jun 8, 2016 at 10:26 PM, Shunqian Zheng <zhengsq@rock-chips.com> wrote:
>> Use DMA API instead of architecture internal functions like
>> __cpuc_flush_dcache_area() etc.
>>
>> To support the virtual device like DRM the virtual slave iommu
>> added in the previous patch, attaching to which the DRM can use
>> it own domain->dev for dma_map_*(), dma_sync_*() even VOP is disabled.
>>
>> With this patch, this driver is available for ARM64 like RK3399.
>>
> Could we instead simply allocate coherent memory for page tables using
> dma_alloc_coherent() and skip any flushing on CPU side completely? If
> I'm looking correctly, the driver only reads back the page directory
> when checking if there is a need to allocate new page table, so there
> shouldn't be any significant penalty for disabling the cache.
I try to use dma_alloc_coherent() to replace the dma_map_single(),
but it doesn't work for me properly.
Because the DRM uses the iommu_dma_ops instead the swiotlb_dma_ops after
attaching
to iommu, so when the iommu domain need to alloc a new page in
rk_iommu_map(),
it would call:
rk_iommu_map() --> dma_alloc_coherent() --> ops->alloc() -->
iommu_map() --> rk_iommu_map()
Then I try to reserve memory for coherent so that, dma_alloc_coherent()
calls dma_alloc_from_coherent()
but not ops->alloc(). But it doesn't work too because when DRM request
buffer it never uses iommu.
>
> Other than that, please see some comments inline.
>
>> Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com>
>> ---
>> drivers/iommu/rockchip-iommu.c | 113 ++++++++++++++++++++++++++---------------
>> 1 file changed, 71 insertions(+), 42 deletions(-)
>>
>> diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c
>> index d6c3051..aafea6e 100644
>> --- a/drivers/iommu/rockchip-iommu.c
>> +++ b/drivers/iommu/rockchip-iommu.c
>> @@ -4,8 +4,6 @@
>> * published by the Free Software Foundation.
>> */
>>
>> -#include <asm/cacheflush.h>
>> -#include <asm/pgtable.h>
>> #include <linux/compiler.h>
>> #include <linux/delay.h>
>> #include <linux/device.h>
>> @@ -61,8 +59,7 @@
>> #define RK_MMU_IRQ_BUS_ERROR 0x02 /* bus read error */
>> #define RK_MMU_IRQ_MASK (RK_MMU_IRQ_PAGE_FAULT | RK_MMU_IRQ_BUS_ERROR)
>>
>> -#define NUM_DT_ENTRIES 1024
>> -#define NUM_PT_ENTRIES 1024
>> +#define NUM_TLB_ENTRIES 1024 /* for both DT and PT */
> Is it necessary to change this in this patch? In general, it's not a
> good idea to mix multiple logical changes together.
Sure, will restore changes in v3.
>
>> #define SPAGE_ORDER 12
>> #define SPAGE_SIZE (1 << SPAGE_ORDER)
>> @@ -82,7 +79,9 @@
>>
>> struct rk_iommu_domain {
>> struct list_head iommus;
>> + struct device *dev;
>> u32 *dt; /* page directory table */
>> + dma_addr_t dt_dma;
>> spinlock_t iommus_lock; /* lock for iommus list */
>> spinlock_t dt_lock; /* lock for modifying page directory table */
>>
>> @@ -98,14 +97,12 @@ struct rk_iommu {
>> struct iommu_domain *domain; /* domain to which iommu is attached */
>> };
>>
>> -static inline void rk_table_flush(u32 *va, unsigned int count)
>> +static inline void rk_table_flush(struct device *dev, dma_addr_t dma,
>> + unsigned int count)
>> {
>> - phys_addr_t pa_start = virt_to_phys(va);
>> - phys_addr_t pa_end = virt_to_phys(va + count);
>> - size_t size = pa_end - pa_start;
>> + size_t size = count * 4;
> It would be a good idea to specify what "count" is. I'm a bit confused
> that before it meant bytes and now some multiple of 4?
"count" means PT/DT entry count to flush here. I would add some more
comment on it.
Thank you very much,
Shunqian
>
> Best regards,
> Tomasz
>
> _______________________________________________
> Linux-rockchip mailing list
> Linux-rockchip at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-rockchip
next prev parent reply other threads:[~2016-06-13 9:56 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-08 13:26 [PATCH v2 0/7] fix bugs; enable iommu for ARM64 Shunqian Zheng
2016-06-08 13:26 ` Shunqian Zheng
2016-06-08 13:26 ` Shunqian Zheng
[not found] ` <1465392392-2003-1-git-send-email-zhengsq-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
2016-06-08 13:26 ` [PATCH v2 1/7] iommu/rockchip: fix devm_{request,free}_irq parameter Shunqian Zheng
2016-06-08 13:26 ` Shunqian Zheng
2016-06-08 13:26 ` Shunqian Zheng
2016-06-10 5:30 ` [PATCH v2 1/7] iommu/rockchip: fix devm_{request, free}_irq parameter Tomasz Figa
2016-06-10 5:30 ` [PATCH v2 1/7] iommu/rockchip: fix devm_{request,free}_irq parameter Tomasz Figa
2016-06-10 5:30 ` [PATCH v2 1/7] iommu/rockchip: fix devm_{request, free}_irq parameter Tomasz Figa
2016-06-08 13:26 ` [PATCH v2 2/7] iommu/rockchip: add map_sg callback for rk_iommu_ops Shunqian Zheng
2016-06-08 13:26 ` Shunqian Zheng
2016-06-08 13:26 ` Shunqian Zheng
2016-06-10 5:31 ` Tomasz Figa
2016-06-10 5:31 ` Tomasz Figa
2016-06-10 5:31 ` Tomasz Figa
2016-06-08 13:26 ` [PATCH v2 3/7] iommu/rockchip: support virtual iommu slave device Shunqian Zheng
2016-06-08 13:26 ` Shunqian Zheng
2016-06-08 13:26 ` Shunqian Zheng
[not found] ` <1465392392-2003-4-git-send-email-zhengsq-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
2016-06-10 6:22 ` Tomasz Figa
2016-06-10 6:22 ` Tomasz Figa
2016-06-10 6:22 ` Tomasz Figa
[not found] ` <CAAFQd5DuAc-B17AqOg0mGcfLCGwztEOaukPL+c5jmL4a-AEeBA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-06-12 2:33 ` Shunqian Zheng
2016-06-08 13:26 ` [PATCH v2 4/7] ARM: dts: rockchip: add virtual iommu for display Shunqian Zheng
2016-06-08 13:26 ` Shunqian Zheng
2016-06-08 13:26 ` Shunqian Zheng
[not found] ` <1465392392-2003-5-git-send-email-zhengsq-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
2016-06-10 6:22 ` Tomasz Figa
2016-06-10 6:22 ` Tomasz Figa
2016-06-10 6:22 ` Tomasz Figa
2016-06-08 13:26 ` [PATCH v2 5/7] drm: rockchip: use common iommu api to attach iommu Shunqian Zheng
2016-06-08 13:26 ` Shunqian Zheng
2016-06-08 13:26 ` Shunqian Zheng
2016-06-10 8:03 ` Tomasz Figa
2016-06-10 8:03 ` Tomasz Figa
2016-06-10 8:03 ` Tomasz Figa
[not found] ` <CAAFQd5AEsMhQiNkjBr-Af6rBg9x6Z9bCOu7GuYXt2h=wao7Cow-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-06-12 3:37 ` Shunqian Zheng
2016-06-08 13:26 ` [PATCH v2 6/7] iommu/rockchip: use DMA API to map, to flush cache Shunqian Zheng
2016-06-08 13:26 ` Shunqian Zheng
2016-06-08 13:26 ` Shunqian Zheng
[not found] ` <1465392392-2003-7-git-send-email-zhengsq-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
2016-06-10 9:10 ` Tomasz Figa
2016-06-10 9:10 ` Tomasz Figa
2016-06-10 9:10 ` Tomasz Figa
[not found] ` <CAAFQd5Da+Eg=eiRUgLSS_qPjGbG474KYWDC=GaAMS8A_CuQ3Mg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-06-13 9:56 ` Shunqian Zheng [this message]
2016-06-13 9:56 ` Shunqian Zheng
2016-06-13 10:21 ` Tomasz Figa
[not found] ` <CAAFQd5DDCd8VcdEhEASAK7NMBnVJWuUxgGURtsa2KQBKsgsxUQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-06-13 10:31 ` Shunqian Zheng
[not found] ` <575E8B6F.1040103-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-06-13 10:41 ` Tomasz Figa
2016-06-13 10:41 ` Tomasz Figa
[not found] ` <575E834C.30305-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-06-13 10:39 ` Robin Murphy
2016-06-13 10:39 ` Robin Murphy
2016-06-13 10:39 ` Robin Murphy
2016-06-08 13:26 ` [PATCH v2 7/7] iommu/rockchip: enable rockchip iommu on ARM64 platform Shunqian Zheng
2016-06-08 13:26 ` Shunqian Zheng
2016-06-08 13:26 ` Shunqian Zheng
[not found] ` <1465392392-2003-8-git-send-email-zhengsq-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
2016-06-10 9:12 ` Tomasz Figa
2016-06-10 9:12 ` Tomasz Figa
2016-06-10 9:12 ` Tomasz Figa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=575E834C.30305@gmail.com \
--to=shunqian.zheng-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
--cc=airlied-cv59FeDIM0c@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
--cc=heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org \
--cc=linux-I+IVW8TIWO2tmTQ+vhA3Yw@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=mark.rutland-5wv7dgnIgG8@public.gmane.org \
--cc=mark.yao-TNX95d0MmH7DzftRWevZcw@public.gmane.org \
--cc=robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=tfiga-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
--cc=xxm-TNX95d0MmH7DzftRWevZcw@public.gmane.org \
--cc=zhengsq-TNX95d0MmH7DzftRWevZcw@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.