2012-10-19 11:53:13

by Florian Fainelli

[permalink] [raw]
Subject: [PATCH 0/3] x86: ce4100: various fixes

Hi all,

This patch serie contains shutdown/reboot fixes for the CE4100 platform as
well as a PCI controller fix for devices without an interrupt line.

Florian Fainelli (3):
x86: ce4100: implement pm_poweroff
x86: ce4100: force reboot method to be KBD
x86: ce4100: fixup PCI configuration register access for devices
without interrupts

arch/x86/pci/ce4100.c | 13 +++++++++++++
arch/x86/platform/ce4100/ce4100.c | 10 ++++++++++
2 files changed, 23 insertions(+)

--
1.7.9.5


2012-10-19 11:53:16

by Florian Fainelli

[permalink] [raw]
Subject: [PATCH 1/3] x86: ce4100: implement pm_poweroff

The CE4100 platform is currently missing a proper pm_poweroff implementation
leading to poweroff making the CPU spin forever and the CE4100 platform does
not enter a low-power mode where the external Power Management Unit can
properly power off the system. Power off on this platform is implemented pretty
much like reboot, by writing to the SoC built-in 8051 microcontroller mapped at
I/O port 0xcf9, the value 0x4.

Signed-off-by: Florian Fainelli <[email protected]>
---
arch/x86/platform/ce4100/ce4100.c | 7 +++++++
1 file changed, 7 insertions(+)

diff --git a/arch/x86/platform/ce4100/ce4100.c b/arch/x86/platform/ce4100/ce4100.c
index 4c61b52..74f8774 100644
--- a/arch/x86/platform/ce4100/ce4100.c
+++ b/arch/x86/platform/ce4100/ce4100.c
@@ -27,6 +27,11 @@ static int ce4100_i8042_detect(void)
return 0;
}

+static void ce4100_power_off(void)
+{
+ outb(0x4, 0xcf9);
+}
+
#ifdef CONFIG_SERIAL_8250

static unsigned int mem_serial_in(struct uart_port *p, int offset)
@@ -143,4 +148,6 @@ void __init x86_ce4100_early_setup(void)
x86_init.pci.init_irq = sdv_pci_init;
x86_init.mpparse.setup_ioapic_ids = setup_ioapic_ids_from_mpc_nocheck;
#endif
+
+ pm_power_off = ce4100_power_off;
}
--
1.7.9.5

2012-10-19 11:53:20

by Florian Fainelli

[permalink] [raw]
Subject: [PATCH 2/3] x86: ce4100: force reboot method to be KBD

From: Maxime Bizon <[email protected]>

The default reboot is via ACPI for this platform, and the CEFDK bootloader
actually supports this, but will issue a system power off instead of a real
reboot. Setting the reboot method to be KBD instead of ACPI ensures proper
system reboot.

Signed-off-by: Florian Fainelli <[email protected]>
---
arch/x86/platform/ce4100/ce4100.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/arch/x86/platform/ce4100/ce4100.c b/arch/x86/platform/ce4100/ce4100.c
index 74f8774..8c9ed9a 100644
--- a/arch/x86/platform/ce4100/ce4100.c
+++ b/arch/x86/platform/ce4100/ce4100.c
@@ -21,6 +21,7 @@
#include <asm/i8259.h>
#include <asm/io.h>
#include <asm/io_apic.h>
+#include <asm/emergency-restart.h>

static int ce4100_i8042_detect(void)
{
@@ -144,6 +145,8 @@ void __init x86_ce4100_early_setup(void)
x86_init.mpparse.find_smp_config = x86_init_noop;
x86_init.pci.init = ce4100_pci_init;

+ reboot_type = BOOT_KBD;
+
#ifdef CONFIG_X86_IO_APIC
x86_init.pci.init_irq = sdv_pci_init;
x86_init.mpparse.setup_ioapic_ids = setup_ioapic_ids_from_mpc_nocheck;
--
1.7.9.5

2012-10-19 11:53:27

by Florian Fainelli

[permalink] [raw]
Subject: [PATCH 3/3] x86: ce4100: fixup PCI configuration register access for devices without interrupts

From: Maxime Bizon <[email protected]>

Some CE4100 devices such as the:
- DFX module (01:0b.7)
- entertainment encryption device (01:10.0)
- multimedia controller (01:12.0)

do not have a device interrupt at all. This patch fixes the PCI controller
code to declare the missing PCI configuration register space, as well as a
fixup method for forcing the interrupt pin to be 0 for these devices. This is
required to ensure that pci drivers matching on these devices will be able to
call honor the various PCI subsystem calls touching the configuration space.

Signed-off-by: Florian Fainelli <[email protected]>
---
arch/x86/pci/ce4100.c | 13 +++++++++++++
1 file changed, 13 insertions(+)

diff --git a/arch/x86/pci/ce4100.c b/arch/x86/pci/ce4100.c
index 41bd2a2..b914e20 100644
--- a/arch/x86/pci/ce4100.c
+++ b/arch/x86/pci/ce4100.c
@@ -115,6 +115,16 @@ static void sata_revid_read(struct sim_dev_reg *reg, u32 *value)
reg_read(reg, value);
}

+static void reg_noirq_read(struct sim_dev_reg *reg, u32 *value)
+{
+ unsigned long flags;
+
+ raw_spin_lock_irqsave(&pci_config_lock, flags);
+ /* force interrupt pin value to 0 */
+ *value = reg->sim_reg.value & 0xfff00ff;
+ raw_spin_unlock_irqrestore(&pci_config_lock, flags);
+}
+
static struct sim_dev_reg bus1_fixups[] = {
DEFINE_REG(2, 0, 0x10, (16*MB), reg_init, reg_read, reg_write)
DEFINE_REG(2, 0, 0x14, (256), reg_init, reg_read, reg_write)
@@ -144,6 +154,7 @@ static struct sim_dev_reg bus1_fixups[] = {
DEFINE_REG(11, 5, 0x10, (64*KB), reg_init, reg_read, reg_write)
DEFINE_REG(11, 6, 0x10, (256), reg_init, reg_read, reg_write)
DEFINE_REG(11, 7, 0x10, (64*KB), reg_init, reg_read, reg_write)
+ DEFINE_REG(11, 7, 0x3c, 256, reg_init, reg_noirq_read, reg_write)
DEFINE_REG(12, 0, 0x10, (128*KB), reg_init, reg_read, reg_write)
DEFINE_REG(12, 0, 0x14, (256), reg_init, reg_read, reg_write)
DEFINE_REG(12, 1, 0x10, (1024), reg_init, reg_read, reg_write)
@@ -161,8 +172,10 @@ static struct sim_dev_reg bus1_fixups[] = {
DEFINE_REG(16, 0, 0x10, (64*KB), reg_init, reg_read, reg_write)
DEFINE_REG(16, 0, 0x14, (64*MB), reg_init, reg_read, reg_write)
DEFINE_REG(16, 0, 0x18, (64*MB), reg_init, reg_read, reg_write)
+ DEFINE_REG(16, 0, 0x3c, 256, reg_init, reg_noirq_read, reg_write)
DEFINE_REG(17, 0, 0x10, (128*KB), reg_init, reg_read, reg_write)
DEFINE_REG(18, 0, 0x10, (1*KB), reg_init, reg_read, reg_write)
+ DEFINE_REG(18, 0, 0x3c, 256, reg_init, reg_noirq_read, reg_write)
};

static void __init init_sim_regs(void)
--
1.7.9.5

Subject: Re: [PATCH 3/3] x86: ce4100: fixup PCI configuration register access for devices without interrupts

* Florian Fainelli | 2012-10-19 13:51:56 [+0200]:

>From: Maxime Bizon <[email protected]>
>
>Some CE4100 devices such as the:
>- DFX module (01:0b.7)
>- entertainment encryption device (01:10.0)
>- multimedia controller (01:12.0)
>
>do not have a device interrupt at all. This patch fixes the PCI controller
>code to declare the missing PCI configuration register space, as well as a
>fixup method for forcing the interrupt pin to be 0 for these devices. This is
>required to ensure that pci drivers matching on these devices will be able to
>call honor the various PCI subsystem calls touching the configuration space.

So they realy don't have an Interrupt. I assumed that I was not good
enough reading the table and matching the entries to the HW.

>Signed-off-by: Florian Fainelli <[email protected]>
Acked-by: Sebastian Andrzej Siewior <[email protected]>

for patches 1-3

Sebastian