malta: enable PIIX4 SERIRQ
authorPaul Burton <paul.burton@imgtec.com>
Tue, 26 Nov 2013 17:45:27 +0000 (17:45 +0000)
committerDaniel Schwierzeck <daniel.schwierzeck@gmail.com>
Tue, 26 Nov 2013 20:49:34 +0000 (21:49 +0100)
Whilst U-boot does not require this itself, Linux currently relies upon
it having been muxed and enabled by the bootloader. Thus in order to
preserve compatibility with current kernels before a fix is merged in
Linux we will enable the SERIRQ interrupt and mux it to its pin.

Without doing this current kernels will never receive serial port
interrupts and the end result is typically that userland appears to
hang.

Signed-off-by: Paul Burton <paul.burton@imgtec.com>
arch/mips/include/asm/malta.h
board/imgtec/malta/malta.c

index bd9043d51cdf49b09a99b2d4cf71912933040e82..9e7c045aacf79f121847191f0748fb95998590bf 100644 (file)
 #define PCI_CFG_PIIX4_PIRQRCB          0x61
 #define PCI_CFG_PIIX4_PIRQRCC          0x62
 #define PCI_CFG_PIIX4_PIRQRCD          0x63
+#define PCI_CFG_PIIX4_SERIRQC          0x64
+#define PCI_CFG_PIIX4_GENCFG           0xb0
+
+#define PCI_CFG_PIIX4_SERIRQC_EN       (1 << 7)
+#define PCI_CFG_PIIX4_SERIRQC_CONT     (1 << 6)
+
+#define PCI_CFG_PIIX4_GENCFG_SERIRQ    (1 << 16)
 
 #endif /* _MIPS_ASM_MALTA_H */
index a1a4c0186606656a4bf52fe8fe205c42306d93f3..d363e49919e96454e692658289271b448c29f64f 100644 (file)
@@ -171,6 +171,8 @@ struct serial_device *default_serial_console(void)
 void pci_init_board(void)
 {
        pci_dev_t bdf;
+       u32 val32;
+       u8 val8;
 
        switch (malta_sys_con()) {
        case SYSCON_GT64120:
@@ -205,4 +207,14 @@ void pci_init_board(void)
        pci_write_config_byte(bdf, PCI_CFG_PIIX4_PIRQRCB, 10);
        pci_write_config_byte(bdf, PCI_CFG_PIIX4_PIRQRCC, 11);
        pci_write_config_byte(bdf, PCI_CFG_PIIX4_PIRQRCD, 11);
+
+       /* mux SERIRQ onto SERIRQ pin */
+       pci_read_config_dword(bdf, PCI_CFG_PIIX4_GENCFG, &val32);
+       val32 |= PCI_CFG_PIIX4_GENCFG_SERIRQ;
+       pci_write_config_dword(bdf, PCI_CFG_PIIX4_GENCFG, val32);
+
+       /* enable SERIRQ - Linux currently depends upon this */
+       pci_read_config_byte(bdf, PCI_CFG_PIIX4_SERIRQC, &val8);
+       val8 |= PCI_CFG_PIIX4_SERIRQC_EN | PCI_CFG_PIIX4_SERIRQC_CONT;
+       pci_write_config_byte(bdf, PCI_CFG_PIIX4_SERIRQC, val8);
 }