RE: [PATCH 2/2] platform/x86: Add Intel Galileo platform specific setup

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



>Subject: [PATCH 2/2] platform/x86: Add Intel Galileo platform specific setup
>
[snippet removed]

>Since the Quark EFI bringup code configures the system to reset on an IMR
Typo: bring-up

>violation, this means that common operations such as mouting an SD based root
Typo: mounting

[snippet removed]

>+config INTEL_GALILEO
>+	bool "Intel Galileo Platform Support"
>+	depends on X86_32 && PCI
>+	select IOSF_MBI
>+	select IMR
>+	---help---
>+	  Intel Galileo platform support. This code is used to tear-down
>+	  BIOS and Grub Isolated Memory Regions used during bootup.
Missing dash. Should be "boot-up".

[snippet removed]

>diff --git a/drivers/platform/x86/intel_galileo.c
>b/drivers/platform/x86/intel_galileo.c
>new file mode 100644
>index 0000000..2a555aa
>--- /dev/null
>+++ b/drivers/platform/x86/intel_galileo.c
>@@ -0,0 +1,175 @@
>+/*
>+ * intel_galileo.c - Intel Galileo platform support.
>+ *
>+ * Copyright(c) 2013 Intel Corporation.
>+ * Copyright(c) 2014 Bryan O'Donoghue <pure.logic@xxxxxxxxxxxxxxxxx>
>+ *
>+ * This platform code provides an entry point to do Galileo specific
>+ * setup. Critically IMRs are policed to ensure the EFI provided memory
Critically --> Critical

>+ * map informing the kernel of it's available memory is consistent with
It's --> its

[snippet removed]

>+
>+enum {
>+	GALILEO_UNKNOWN = 0,
>+	GALILEO_QRK_GEN1,
>+	GALILEO_QRK_GEN2,
>+};
Suggest to drop QRK to kill confusion that it is Quark Gen 1 & 2. 

[snippet removed]

>+#ifdef DEBUG
>+#define SANITY "IMR : sanity error "
>+
>+/**
Per coding style, please just use /* and kill the extra * above and below.

>+ * intel_galileo_imr_sanity
>+ * Verify IMR sanity with some simple tests to verify
>+ * overlap, zero sized allocations
>+ *
>+ * @base: Physical base address of the kernel text section
>+ * @size: Extent of kernel memory to be covered from &_text to
>+&_sinittext
>+ * @return: none
>+ */
>+static void __init
>+intel_galileo_imr_sanity(unsigned long base, unsigned long size) {
>+	/* Test zero zero */
>+	if (imr_add(0, 0, 0, 0, true) == 0)
>+		pr_err(SANITY "zero sized IMR @ 0x00000000\n");

A side-discussion on imr_add():
I would think that we should allow 1KiB IMR setting. Current imr_add() logic
is prohibiting it. So, the 'size' input should be at least 1KiB and imr_add()
internal logic will adjust 'hi' by -1KiB. Please consider ..  
  
>+
>+	/* Test overlap */
>+	if (imr_add(base, size, IMR_NON_SMM, IMR_NON_SMM, true) == 0)
>+		pr_err(SANITY "overlapped IMR @ (0x%08lx - 0x%08lx)\n",
>+		       base, base + size);
>+
>+	/* Try overlap - IMR_ALIGN */
>+	base = base + size - IMR_ALIGN;
>+	if (imr_add(base, size, IMR_NON_SMM, IMR_NON_SMM, true) == 0)
>+		pr_err(SANITY "overlapped IMR @ (0x%08lx - 0x%08lx)\n",
>+		       base, base + size);
>+}
>+#endif
>+
>+/**
>+ * intel_galileo_imr_init
>+ *
>+ * Tear down IMRs used during bootup. BIOS and Grub
boot-up.

>+ * both setup IMRs around compressed kernel, initrd memory
>+ * that need to be removed before the kernel hands out one
>+ * of the IMR encased addresses to a downstream DMA agent
>+ * such as the SD or Ethernet. IMRs on Galileo are setup to
>+ * immediately reset the system on violation - so if you're
>+ * running a root filesystem from SD - you'll need the IMRs
>+ * torn down or you'll find seemingly random resets when using
>+ * your filesystem.
>+ */
>+static void __init intel_galileo_imr_init(void) {
>+	unsigned long base  = virt_to_phys(&_text);
>+	unsigned long size = virt_to_phys(&_sinittext) - base - IMR_ALIGN;
>+	int i, ret;
>+
>+	/* Tear down all existing unlocked IMRs */
>+	for (i = 0; i <= QUARK_X1000_IMR_NUM; i++)
>+		imr_del(i, 0, 0);
>+
>+	/*
>+	 * Setup an IMR around the physical extent of the kernel
>+	 * Non-SMM mode core read/write from/to kernel physical region.
>+	 * IMR locked.
>+	 */
>+	ret = imr_add(base, size, IMR_NON_SMM, IMR_NON_SMM, true);
>+	if (ret)
>+		pr_err("Unable to setup IMR for kernel: (%p - %p)\n",
>+			&_text, &__init_begin);
>+	else
>+		pr_info("IMR protect kernel memory: %ldk (%p - %p)\n",
>+			size >> 10, &_text, &__init_begin);
Perhaps we want to be consistent between using __init_begin & _sinittext?

>+#ifdef DEBUG
>+	intel_galileo_imr_sanity(base, size);
>+#endif
>+}
>+
>+/**
>+ * intel_galileo_init
>+ *
>+ * Identify a Galileo Gen1 or Gen2. If found run code to sanitise the
>+ * kernel memory space of IMRs that are inconsistent with the EFI memory
>map.
>+ */
>+static int __init intel_galileo_init(void) {
>+	int ret = 0, type = GALILEO_UNKNOWN;
type is assigned to either GALILEO_GEN1|2 below anyway.
So, we don't need to declare to UNKNOWN?

[snippet removed]
--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux