Re: [PATCH v5 5/8] iommu/amd: copy old trans table from old kernel

2016-09-28 Thread Baoquan He
On 09/28/16 at 09:37am, Baoquan He wrote:
> Hi Joerg,
> 
> On 09/20/16 at 02:40pm, Joerg Roedel wrote:
> > > + if ( !is_pre_enabled) {
> > > + for_each_iommu(iommu)
> > > + early_enable_iommu(iommu);
> > > + } else {
> > > + if (copy_dev_tables()) {
> > > + pr_err("Failed to copy DEV table from previous 
> > > kernel.\n");
> > > + /*
> > > +  * If failed to copy dev tables from old kernel, 
> > > continue to proceed
> > > +  * as it does in normal kernel.
> > > +  */
> > > + for_each_iommu(iommu) {
> > > + clear_translation_pre_enabled(iommu);
> > > + early_enable_iommu(iommu);
> > > + }
> > > + } else {
> > > + pr_info("Copied DEV table from previous kernel.\n");
> > > + for_each_iommu(iommu) {
> > > + iommu_feature_disable(iommu, CONTROL_CMDBUF_EN);
> > > + iommu_feature_disable(iommu, 
> > > CONTROL_EVT_LOG_EN);
> > 
> > Could you move that into new helpers (iommu_disable_command_buffer...)?
> 
> Did you mean wraping iommu_feature_disable(iommu, CONTROL_CMDBUF_EN) into a
> helper function like iommu_disable_command_buffer(), and wraping
> iommu_feature_disable(iommu, CONTROL_EVT_LOG_EN) into
> iommu_disable_event_buffer()?
> 
> I retest with not disabling command buffer and event log here, it works
> on amd iommu v1 and v2 systems. So if I understand your comment
> correctly, there's no need to add "iommu_feature_disable(iommu,
> CONTROL_CMDBUF_EN)"  and "iommu_feature_disable(iommu,
> CONTROL_EVT_LOG_EN)" here. I remember I added them here because more
> IO_PAGE_FAULT messages are printed without them. But now it seems not to
> related to them. So I will remove above two lines of code.

Oh, sorry, please ignore this. It will print many lines of below message
if do not disable cmd buffer and event log here.

[0.455642] AMD-Vi: Completion-Wait loop timed out

___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: [PATCH v5 5/8] iommu/amd: copy old trans table from old kernel

2016-09-27 Thread Baoquan He
Hi Joerg,

On 09/20/16 at 02:40pm, Joerg Roedel wrote:
> > +   if ( !is_pre_enabled) {
> > +   for_each_iommu(iommu)
> > +   early_enable_iommu(iommu);
> > +   } else {
> > +   if (copy_dev_tables()) {
> > +   pr_err("Failed to copy DEV table from previous 
> > kernel.\n");
> > +   /*
> > +* If failed to copy dev tables from old kernel, 
> > continue to proceed
> > +* as it does in normal kernel.
> > +*/
> > +   for_each_iommu(iommu) {
> > +   clear_translation_pre_enabled(iommu);
> > +   early_enable_iommu(iommu);
> > +   }
> > +   } else {
> > +   pr_info("Copied DEV table from previous kernel.\n");
> > +   for_each_iommu(iommu) {
> > +   iommu_feature_disable(iommu, CONTROL_CMDBUF_EN);
> > +   iommu_feature_disable(iommu, 
> > CONTROL_EVT_LOG_EN);
> 
> Could you move that into new helpers (iommu_disable_command_buffer...)?

Did you mean wraping iommu_feature_disable(iommu, CONTROL_CMDBUF_EN) into a
helper function like iommu_disable_command_buffer(), and wraping
iommu_feature_disable(iommu, CONTROL_EVT_LOG_EN) into
iommu_disable_event_buffer()?

I retest with not disabling command buffer and event log here, it works
on amd iommu v1 and v2 systems. So if I understand your comment
correctly, there's no need to add "iommu_feature_disable(iommu,
CONTROL_CMDBUF_EN)"  and "iommu_feature_disable(iommu,
CONTROL_EVT_LOG_EN)" here. I remember I added them here because more
IO_PAGE_FAULT messages are printed without them. But now it seems not to
related to them. So I will remove above two lines of code.

> 
> > +   iommu_enable_command_buffer(iommu);
> > +   iommu_enable_event_buffer(iommu);
> > +   iommu_set_device_table(iommu);
> > +   iommu_flush_all_caches(iommu);
> > +   }
> > +   }
> > +   }
> >  }
> >  
> >  static void enable_iommus_v2(void)
> > -- 
> > 2.5.5
> > 
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: [PATCH v5 5/8] iommu/amd: copy old trans table from old kernel

2016-09-21 Thread Baoquan He
On 09/20/16 at 02:40pm, Joerg Roedel wrote:
> On Thu, Sep 15, 2016 at 11:03:23PM +0800, Baoquan He wrote:
> > Here several things need be done:
> > 1) If iommu is pre-enabled in a normal kernel, just disable it and print
> >warning.
> > 2) If failed to copy dev table of old kernel, continue to proceed as
> >it does in normal kernel.
> > 3) Re-enable event/cmd buffer and install the new DTE table to reg.
> > 4) Flush all caches
> > 
> > Signed-off-by: Baoquan He 
> > ---
> >  drivers/iommu/amd_iommu_init.c | 44 
> > +++---
> >  1 file changed, 41 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c
> > index ce49641..47a8fc9 100644
> > --- a/drivers/iommu/amd_iommu_init.c
> > +++ b/drivers/iommu/amd_iommu_init.c
> > @@ -34,7 +34,7 @@
> >  #include 
> >  #include 
> >  #include 
> > -
> > +#include 
> 
> Please keep that empty line, it is there for readability.

Thanks, will change.

> 
> >  #include "amd_iommu_proto.h"
> >  #include "amd_iommu_types.h"
> >  #include "irq_remapping.h"
> > @@ -1344,6 +1344,12 @@ static int __init init_iommu_one(struct amd_iommu 
> > *iommu, struct ivhd_header *h)
> > iommu->int_enabled = false;
> >  
> > init_translation_status(iommu);
> > +   if (translation_pre_enabled(iommu) && !is_kdump_kernel()) {
> > +   iommu_disable(iommu);
> > +   clear_translation_pre_enabled(iommu);
> > +   pr_warn("Translation was enabled for IOMMU:%d but we are not in 
> > kdump mode\n",
> > +   iommu->index);
> > +   }
> >  
> > if (translation_pre_enabled(iommu))
> > pr_warn("Translation is already enabled - trying to copy 
> > translation structures\n");
> > @@ -1946,9 +1952,41 @@ static void early_enable_iommu(struct amd_iommu 
> > *iommu)
> >  static void early_enable_iommus(void)
> >  {
> > struct amd_iommu *iommu;
> > +   bool is_pre_enabled=false;
> >  
> > -   for_each_iommu(iommu)
> > -   early_enable_iommu(iommu);
> > +   for_each_iommu(iommu) {
> > +   if ( translation_pre_enabled(iommu) ) {
> 
> Coding style, too many spaces. There is more of that below.

Will change.

> 
> > +   is_pre_enabled = true;
> > +   break;
> > +   }
> > +   }
> > +
> > +   if ( !is_pre_enabled) {
> > +   for_each_iommu(iommu)
> > +   early_enable_iommu(iommu);
> > +   } else {
> > +   if (copy_dev_tables()) {
> > +   pr_err("Failed to copy DEV table from previous 
> > kernel.\n");
> > +   /*
> > +* If failed to copy dev tables from old kernel, 
> > continue to proceed
> > +* as it does in normal kernel.
> > +*/
> > +   for_each_iommu(iommu) {
> > +   clear_translation_pre_enabled(iommu);
> > +   early_enable_iommu(iommu);
> > +   }
> > +   } else {
> > +   pr_info("Copied DEV table from previous kernel.\n");
> > +   for_each_iommu(iommu) {
> > +   iommu_feature_disable(iommu, CONTROL_CMDBUF_EN);
> > +   iommu_feature_disable(iommu, 
> > CONTROL_EVT_LOG_EN);
> 
> Could you move that into new helpers (iommu_disable_command_buffer...)?

Yes, sure, will do.

> 
> > +   iommu_enable_command_buffer(iommu);
> > +   iommu_enable_event_buffer(iommu);
> > +   iommu_set_device_table(iommu);
> > +   iommu_flush_all_caches(iommu);
> > +   }
> > +   }
> > +   }
> >  }
> >  
> >  static void enable_iommus_v2(void)
> > -- 
> > 2.5.5
> > 
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: [PATCH v5 5/8] iommu/amd: copy old trans table from old kernel

2016-09-20 Thread Joerg Roedel
On Thu, Sep 15, 2016 at 11:03:23PM +0800, Baoquan He wrote:
> Here several things need be done:
> 1) If iommu is pre-enabled in a normal kernel, just disable it and print
>warning.
> 2) If failed to copy dev table of old kernel, continue to proceed as
>it does in normal kernel.
> 3) Re-enable event/cmd buffer and install the new DTE table to reg.
> 4) Flush all caches
> 
> Signed-off-by: Baoquan He 
> ---
>  drivers/iommu/amd_iommu_init.c | 44 
> +++---
>  1 file changed, 41 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c
> index ce49641..47a8fc9 100644
> --- a/drivers/iommu/amd_iommu_init.c
> +++ b/drivers/iommu/amd_iommu_init.c
> @@ -34,7 +34,7 @@
>  #include 
>  #include 
>  #include 
> -
> +#include 

Please keep that empty line, it is there for readability.

>  #include "amd_iommu_proto.h"
>  #include "amd_iommu_types.h"
>  #include "irq_remapping.h"
> @@ -1344,6 +1344,12 @@ static int __init init_iommu_one(struct amd_iommu 
> *iommu, struct ivhd_header *h)
>   iommu->int_enabled = false;
>  
>   init_translation_status(iommu);
> + if (translation_pre_enabled(iommu) && !is_kdump_kernel()) {
> + iommu_disable(iommu);
> + clear_translation_pre_enabled(iommu);
> + pr_warn("Translation was enabled for IOMMU:%d but we are not in 
> kdump mode\n",
> + iommu->index);
> + }
>  
>   if (translation_pre_enabled(iommu))
>   pr_warn("Translation is already enabled - trying to copy 
> translation structures\n");
> @@ -1946,9 +1952,41 @@ static void early_enable_iommu(struct amd_iommu *iommu)
>  static void early_enable_iommus(void)
>  {
>   struct amd_iommu *iommu;
> + bool is_pre_enabled=false;
>  
> - for_each_iommu(iommu)
> - early_enable_iommu(iommu);
> + for_each_iommu(iommu) {
> + if ( translation_pre_enabled(iommu) ) {

Coding style, too many spaces. There is more of that below.

> + is_pre_enabled = true;
> + break;
> + }
> + }
> +
> + if ( !is_pre_enabled) {
> + for_each_iommu(iommu)
> + early_enable_iommu(iommu);
> + } else {
> + if (copy_dev_tables()) {
> + pr_err("Failed to copy DEV table from previous 
> kernel.\n");
> + /*
> +  * If failed to copy dev tables from old kernel, 
> continue to proceed
> +  * as it does in normal kernel.
> +  */
> + for_each_iommu(iommu) {
> + clear_translation_pre_enabled(iommu);
> + early_enable_iommu(iommu);
> + }
> + } else {
> + pr_info("Copied DEV table from previous kernel.\n");
> + for_each_iommu(iommu) {
> + iommu_feature_disable(iommu, CONTROL_CMDBUF_EN);
> + iommu_feature_disable(iommu, 
> CONTROL_EVT_LOG_EN);

Could you move that into new helpers (iommu_disable_command_buffer...)?

> + iommu_enable_command_buffer(iommu);
> + iommu_enable_event_buffer(iommu);
> + iommu_set_device_table(iommu);
> + iommu_flush_all_caches(iommu);
> + }
> + }
> + }
>  }
>  
>  static void enable_iommus_v2(void)
> -- 
> 2.5.5
> 
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


[PATCH v5 5/8] iommu/amd: copy old trans table from old kernel

2016-09-15 Thread Baoquan He
Here several things need be done:
1) If iommu is pre-enabled in a normal kernel, just disable it and print
   warning.
2) If failed to copy dev table of old kernel, continue to proceed as
   it does in normal kernel.
3) Re-enable event/cmd buffer and install the new DTE table to reg.
4) Flush all caches

Signed-off-by: Baoquan He 
---
 drivers/iommu/amd_iommu_init.c | 44 +++---
 1 file changed, 41 insertions(+), 3 deletions(-)

diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c
index ce49641..47a8fc9 100644
--- a/drivers/iommu/amd_iommu_init.c
+++ b/drivers/iommu/amd_iommu_init.c
@@ -34,7 +34,7 @@
 #include 
 #include 
 #include 
-
+#include 
 #include "amd_iommu_proto.h"
 #include "amd_iommu_types.h"
 #include "irq_remapping.h"
@@ -1344,6 +1344,12 @@ static int __init init_iommu_one(struct amd_iommu 
*iommu, struct ivhd_header *h)
iommu->int_enabled = false;
 
init_translation_status(iommu);
+   if (translation_pre_enabled(iommu) && !is_kdump_kernel()) {
+   iommu_disable(iommu);
+   clear_translation_pre_enabled(iommu);
+   pr_warn("Translation was enabled for IOMMU:%d but we are not in 
kdump mode\n",
+   iommu->index);
+   }
 
if (translation_pre_enabled(iommu))
pr_warn("Translation is already enabled - trying to copy 
translation structures\n");
@@ -1946,9 +1952,41 @@ static void early_enable_iommu(struct amd_iommu *iommu)
 static void early_enable_iommus(void)
 {
struct amd_iommu *iommu;
+   bool is_pre_enabled=false;
 
-   for_each_iommu(iommu)
-   early_enable_iommu(iommu);
+   for_each_iommu(iommu) {
+   if ( translation_pre_enabled(iommu) ) {
+   is_pre_enabled = true;
+   break;
+   }
+   }
+
+   if ( !is_pre_enabled) {
+   for_each_iommu(iommu)
+   early_enable_iommu(iommu);
+   } else {
+   if (copy_dev_tables()) {
+   pr_err("Failed to copy DEV table from previous 
kernel.\n");
+   /*
+* If failed to copy dev tables from old kernel, 
continue to proceed
+* as it does in normal kernel.
+*/
+   for_each_iommu(iommu) {
+   clear_translation_pre_enabled(iommu);
+   early_enable_iommu(iommu);
+   }
+   } else {
+   pr_info("Copied DEV table from previous kernel.\n");
+   for_each_iommu(iommu) {
+   iommu_feature_disable(iommu, CONTROL_CMDBUF_EN);
+   iommu_feature_disable(iommu, 
CONTROL_EVT_LOG_EN);
+   iommu_enable_command_buffer(iommu);
+   iommu_enable_event_buffer(iommu);
+   iommu_set_device_table(iommu);
+   iommu_flush_all_caches(iommu);
+   }
+   }
+   }
 }
 
 static void enable_iommus_v2(void)
-- 
2.5.5

___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu