From 1fe31e2bc4ac789000f11c1f78b31b0b1fa60882 Mon Sep 17 00:00:00 2001
From: Jan Malanik <janx.malanik@intel.com>
Date: Tue, 21 Nov 2017 12:05:43 -0800
Subject: Enable iommu support in grub

JIRA: YARDSTICK-895
It's required for sriov standalone yardstick tests.
This part of commit message will be deleted:
This code will be enabled when https://gerrit.opnfv.org/gerrit/#/c/47957/ will be merged,
because it requires host reboot.

Change-Id: I0ec9cbf90a9d83d54e545fcf421b8baf206601a4
Signed-off-by: Jan Malanik <janx.malanik@intel.com>
Signed-off-by: Malanik Jan <janx.malanik@intel.com>
---
 ansible/roles/enable_iommu_on_boot/tasks/main.yml  | 72 ++++++++++++++++++++++
 .../tasks/manual_modify_grub.yml                   | 34 ++++++++++
 ansible/roles/enable_iommu_on_boot/vars/main.yml   | 17 +++++
 3 files changed, 123 insertions(+)
 create mode 100644 ansible/roles/enable_iommu_on_boot/tasks/main.yml
 create mode 100644 ansible/roles/enable_iommu_on_boot/tasks/manual_modify_grub.yml
 create mode 100644 ansible/roles/enable_iommu_on_boot/vars/main.yml

diff --git a/ansible/roles/enable_iommu_on_boot/tasks/main.yml b/ansible/roles/enable_iommu_on_boot/tasks/main.yml
new file mode 100644
index 000000000..1b98a50b1
--- /dev/null
+++ b/ansible/roles/enable_iommu_on_boot/tasks/main.yml
@@ -0,0 +1,72 @@
+# Copyright (c) 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+---
+- name: Set iommu_boot_params for Intel
+  set_fact:
+    iommu_boot_params: ' intel_iommu=on iommu=pt'
+  when: hostvars[inventory_hostname]['ansible_system_vendor'] == "Intel Corporation"
+
+- name: Set iommu_boot_params for AMD
+  set_fact:
+    iommu_boot_params: ' amd_iommu=on iommu=pt'
+  when: hostvars[inventory_hostname]['ansible_system_vendor'] == "AuthenticAMD"
+
+- name: Set facts for this role
+  set_fact:
+    hugepages_help_string: '  # added by hugepages role'
+    iommu_help_string: ', added by iommu role'
+    hugepages_params: " default_hugepagesz=1G hugepagesz=1G hugepages=8"
+    iommu_original_kernel_params: 'GRUB_CMDLINE_LINUX="\$GRUB_CMDLINE_LINUX{{ hugepages_params }}'
+    iommu_enabled_kernel_params: '{{ iommu_original_kernel_params }}{{ iommu_boot_params }}"'
+    iommu_enabled_kernel_params_with_help: '{{ iommu_original_kernel_params }}{{ iommu_boot_params }}"{{ hugepages_help_string }}{{ iommu_help_string }}'
+
+- name: check if iommu is set by this role in /etc/default/grub
+  lineinfile:
+    path: /etc/default/grub
+    line: '{{ iommu_enabled_kernel_params_with_help }}'
+  #changed_when: no
+  check_mode: yes
+  register: is_mine_iommu_etc_grub
+  ignore_errors: True
+
+- name: check if iommu is set by someone else
+  command: "grep -o 'iommu' /etc/default/grub"
+  register: is_iommu
+  ignore_errors: True
+
+- fail:
+    msg: "Iommu already set by someone else"
+  when: is_mine_iommu_etc_grub.changed == false and is_iommu.stdout != ""
+
+- name: 'Configure iommu in /etc/default/grub'
+# and /boot/grub/grub.cfg(when: ansible_distribution == "Ubuntu")'
+  lineinfile:
+    path: /etc/default/grub
+    regexp: '({{ iommu_original_kernel_params }})"{{ hugepages_help_string }}'
+    line: '\1{{ iommu_boot_params }}"{{ hugepages_help_string }}{{ iommu_help_string }}'
+    backrefs: yes
+  when: is_mine_iommu_etc_grub.changed == true
+
+- name: find boot grub.cfg
+  find:
+    paths: /boot
+    file_type: file
+    patterns: 'grub*.cfg'
+    recurse: yes
+  register: grub_files
+
+- include: manual_modify_grub.yml
+  # only tested on Ubuntu, kernel line is probably different on other distros
+  with_items: "{{ grub_files.files }}"
+  when: ansible_distribution == "Ubuntu"
diff --git a/ansible/roles/enable_iommu_on_boot/tasks/manual_modify_grub.yml b/ansible/roles/enable_iommu_on_boot/tasks/manual_modify_grub.yml
new file mode 100644
index 000000000..6760c3f9d
--- /dev/null
+++ b/ansible/roles/enable_iommu_on_boot/tasks/manual_modify_grub.yml
@@ -0,0 +1,34 @@
+# Copyright (c) 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+---
+
+
+- name: check if iommu is set by this role in /boot grub.cfg files
+  lineinfile:
+    path: "{{ item.path }}"
+    regexp: '{{ hugepages_params }}{{ iommu_boot_params }}'
+    line: ''
+  #changed_when: no
+  check_mode: yes
+  register: is_mine_iommu_boot_grub
+  ignore_errors: True
+
+- name: added iommu to grub manually because we can't run update-grub in chroot
+  replace:
+    path: "{{ item.path }}"
+    regexp: '(.*linux\s+/boot/vmlinuz.*)$'
+    replace: '\1{{ iommu_boot_params }}'
+  when: is_mine_iommu_boot_grub.msg != "line replaced"
+
+- debug: var=ansible_kernel
diff --git a/ansible/roles/enable_iommu_on_boot/vars/main.yml b/ansible/roles/enable_iommu_on_boot/vars/main.yml
new file mode 100644
index 000000000..1b642dcb5
--- /dev/null
+++ b/ansible/roles/enable_iommu_on_boot/vars/main.yml
@@ -0,0 +1,17 @@
+# Copyright (c) 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+---
+update_grub:
+  Debian: "update-grub2"
+  RedHat: "grub2-mkconfig -o /boot/grub2/grub.cfg"
-- 
cgit