linux/drivers/platform/x86
Bryan O'Donoghue 28a375df16 x86/intel/quark: Add Isolated Memory Regions for Quark X1000
Intel's Quark X1000 SoC contains a set of registers called
Isolated Memory Regions. IMRs are accessed over the IOSF mailbox
interface. IMRs are areas carved out of memory that define
read/write access rights to the various system agents within the
Quark system. For a given agent in the system it is possible to
specify if that agent may read or write an area of memory
defined by an IMR with a granularity of 1 KiB.

Quark_SecureBootPRM_330234_001.pdf section 4.5 details the
concept of IMRs quark-x1000-datasheet.pdf section 12.7.4 details
the implementation of IMRs in silicon.

eSRAM flush, CPU Snoop write-only, CPU SMM Mode, CPU non-SMM
mode, RMU and PCIe Virtual Channels (VC0 and VC1) can have
individual read/write access masks applied to them for a given
memory region in Quark X1000. This enables IMRs to treat each
memory transaction type listed above on an individual basis and
to filter appropriately based on the IMR access mask for the
memory region. Quark supports eight IMRs.

Since all of the DMA capable SoC components in the X1000 are
mapped to VC0 it is possible to define sections of memory as
invalid for DMA write operations originating from Ethernet, USB,
SD and any other DMA capable south-cluster component on VC0.
Similarly it is possible to mark kernel memory as non-SMM mode
read/write only or to mark BIOS runtime memory as SMM mode
accessible only depending on the particular memory footprint on
a given system.

On an IMR violation Quark SoC X1000 systems are configured to
reset the system, so ensuring that the IMR memory map is
consistent with the EFI provided memory map is critical to
ensure no IMR violations reset the system.

The API for accessing IMRs is based on MTRR code but doesn't
provide a /proc or /sys interface to manipulate IMRs. Defining
the size and extent of IMRs is exclusively the domain of
in-kernel code.

Quark firmware sets up a series of locked IMRs around pieces of
memory that firmware owns such as ACPI runtime data. During boot
a series of unlocked IMRs are placed around items in memory to
guarantee no DMA modification of those items can take place.
Grub also places an unlocked IMR around the kernel boot params
data structure and compressed kernel image. It is necessary for
the kernel to tear down all unlocked IMRs in order to ensure
that the kernel's view of memory passed via the EFI memory map
is consistent with the IMR memory map. Without tearing down all
unlocked IMRs on boot transitory IMRs such as those used to
protect the compressed kernel image will cause IMR violations and system reboots.

The IMR init code tears down all unlocked IMRs and sets a
protective IMR around the kernel .text and .rodata as one
contiguous block. This sanitizes the IMR memory map with respect
to the EFI memory map and protects the read-only portions of the
kernel from unwarranted DMA access.

Tested-by: Ong, Boon Leong <boon.leong.ong@intel.com>
Signed-off-by: Bryan O'Donoghue <pure.logic@nexus-software.ie>
Reviewed-by: Andy Shevchenko <andy.schevchenko@gmail.com>
Reviewed-by: Darren Hart <dvhart@linux.intel.com>
Reviewed-by: Ong, Boon Leong <boon.leong.ong@intel.com>
Cc: andy.shevchenko@gmail.com
Cc: dvhart@infradead.org
Link: http://lkml.kernel.org/r/1422635379-12476-2-git-send-email-pure.logic@nexus-software.ie
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2015-02-18 23:22:47 +01:00
..
acer-wmi.c Driver core patches for 3.19-rc1 2014-12-14 16:10:09 -08:00
acerhdf.c platform-drivers-x86 for 3.19 2014-12-18 20:24:55 -08:00
alienware-wmi.c platform: x86: drop owner assignment from platform_drivers 2014-10-20 16:21:27 +02:00
amilo-rfkill.c platform: x86: drop owner assignment from platform_drivers 2014-10-20 16:21:27 +02:00
apple-gmux.c More ACPI and power management updates for 3.13-rc1 2013-11-20 13:25:04 -08:00
asus-laptop.c platform-drivers-x86 for 3.19 2014-12-18 20:24:55 -08:00
asus-nb-wmi.c asus-nb-wmi: Add another wapf=4 quirk 2014-12-03 10:10:13 -08:00
asus-wmi.c platform: x86: Deletion of checks before backlight_device_unregister() 2014-12-03 10:10:14 -08:00
asus-wmi.h
classmate-laptop.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
compal-laptop.c platform: x86: drop owner assignment from platform_drivers 2014-10-20 16:21:27 +02:00
dell-laptop.c Revert "platform: x86: dell-laptop: Add support for keyboard backlight" 2015-01-23 11:10:32 -08:00
dell-smo8800.c dell-smo8800: Add more ACPI ids and change description of driver 2014-12-03 10:10:19 -08:00
dell-wmi-aio.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
dell-wmi.c dell-wmi: Don't report keypresses on keybord illumination change 2014-12-03 10:10:16 -08:00
eeepc-laptop.c platform-drivers-x86 for 3.19 2014-12-18 20:24:55 -08:00
eeepc-wmi.c eeepc-wmi: Constify asus_quirks[] DMI table 2014-08-16 01:23:52 -07:00
fujitsu-laptop.c platform-drivers-x86 for 3.19 2014-12-18 20:24:55 -08:00
fujitsu-tablet.c fujitsu-tablet: Mark DMI callbacks as __init code 2014-08-16 01:23:52 -07:00
hdaps.c platform: x86: drop owner assignment from platform_drivers 2014-10-20 16:21:27 +02:00
hp_accel.c hp_accel: Add support for HP ZBook 15 2014-12-03 10:10:12 -08:00
hp-wireless.c hp_wireless: Inform the user if hp_wireless_input_setup()/add() fails 2014-12-03 10:10:15 -08:00
hp-wmi.c platform: x86: drop owner assignment from platform_drivers 2014-10-20 16:21:27 +02:00
ibm_rtl.c
ideapad-laptop.c platform-drivers-x86 for 3.19 2014-12-18 20:24:55 -08:00
intel_ips.c platform-drivers-x86 for 3.19 2014-12-18 20:24:55 -08:00
intel_ips.h
intel_menlow.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
intel_mid_powerbtn.c platform: x86: drop owner assignment from platform_drivers 2014-10-20 16:21:27 +02:00
intel_mid_thermal.c platform: x86: drop owner assignment from platform_drivers 2014-10-20 16:21:27 +02:00
intel_oaktrail.c platform-drivers-x86 for 3.19 2014-12-18 20:24:55 -08:00
intel_pmic_gpio.c platform: x86: drop owner assignment from platform_drivers 2014-10-20 16:21:27 +02:00
intel_scu_ipc.c PCI: Remove DEFINE_PCI_DEVICE_TABLE macro use 2014-08-12 12:15:14 -06:00
intel_scu_ipcutil.c
intel-rst.c intel-rst: Clean up ACPI add function 2014-09-17 13:55:54 -07:00
intel-smartconnect.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
Kconfig x86/intel/quark: Add Isolated Memory Regions for Quark X1000 2015-02-18 23:22:47 +01:00
Makefile platform/x86: Enable build support for toshiba_haps 2014-08-16 01:23:56 -07:00
msi-laptop.c platform-drivers-x86 for 3.19 2014-12-18 20:24:55 -08:00
msi-wmi.c platform: x86: Deletion of checks before backlight_device_unregister() 2014-12-03 10:10:14 -08:00
mxm-wmi.c Merge branch 'for_linus' of git://cavan.codon.org.uk/platform-drivers-x86 2014-01-29 18:54:05 -08:00
panasonic-laptop.c Fix sleep / suspend keys for Toughbook CF-51 2014-04-06 12:58:11 -04:00
pvpanic.c pvpanic: Set high notifier priority 2014-06-09 17:45:36 -04:00
samsung-laptop.c samsung-laptop: Add broken-acpi-video quirk for NC210/NC110 2014-10-27 21:45:12 -07:00
samsung-q10.c platform: x86: drop owner assignment from platform_drivers 2014-10-20 16:21:27 +02:00
sony-laptop.c platform-drivers-x86 for 3.19 2014-12-18 20:24:55 -08:00
tc1100-wmi.c platform: x86: drop owner assignment from platform_drivers 2014-10-20 16:21:27 +02:00
thinkpad_acpi.c platform-drivers-x86 for 3.19 2014-12-18 20:24:55 -08:00
topstar-laptop.c platform:x86: Remove OOM message after input_allocate_device 2013-11-20 18:51:03 -05:00
toshiba_acpi.c toshiba_acpi: Add keyboard backlight mode change event 2014-12-03 10:10:18 -08:00
toshiba_bluetooth.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
toshiba_haps.c platform/x86: Toshiba HDD Active Protection Sensor 2014-08-16 01:23:56 -07:00
wmi.c WMI: Remove unnecessary null test 2014-08-16 01:23:51 -07:00
xo1-rfkill.c platform: x86: drop owner assignment from platform_drivers 2014-10-20 16:21:27 +02:00
xo15-ebook.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00