📄 powerpc-lite.patch
字号:
pinfo->brg = 1;++#if defined (CONFIG_MPC885ADS) || defined (CONFIG_MPC86XADS)+ bcsr_io = ioremap(BCSR1, sizeof(unsigned long));++ if (bcsr_io == NULL) {+ printk(KERN_CRIT "Could not remap BCSR\n");+ return;+ }+ out_be32(bcsr_io, in_be32(bcsr_io) & ~BCSR1_RS232EN_1);+ iounmap(bcsr_io);+#endif } void smc2_lineif(struct uart_cpm_port *pinfo) { volatile cpm8xx_t *cp = cpmp;+ unsigned *bcsr_io; (void)cp; /* fix warning */ #if defined (CONFIG_MPC885ADS)@@ -134,6 +147,17 @@ #endif pinfo->brg = 2;++#if defined (CONFIG_MPC885ADS) || defined (CONFIG_MPC86XADS)+ bcsr_io = ioremap(BCSR1, sizeof(unsigned long));++ if (bcsr_io == NULL) {+ printk(KERN_CRIT "Could not remap BCSR\n");+ return;+ }+ out_be32(bcsr_io, in_be32(bcsr_io) & ~BCSR1_RS232EN_2);+ iounmap(bcsr_io);+#endif } void scc1_lineif(struct uart_cpm_port *pinfo)@@ -233,6 +257,10 @@ { pr_debug("CPM uart[-]:init portdesc\n"); + /* Check if we have called this yet. This may happen if early kgdb+ breakpoint is on */+ if(cpm_uart_nr)+ return 0; cpm_uart_nr = 0; #ifdef CONFIG_SERIAL_CPM_SMC1 cpm_uart_ports[UART_SMC1].smcp = &cpmp->cp_smc[0];Index: linux-2.6.16/drivers/serial/cpm_uart/cpm_uart_cpm2.c===================================================================--- linux-2.6.16.orig/drivers/serial/cpm_uart/cpm_uart_cpm2.c 2006-03-20 11:23:29.000000000 +0530+++ linux-2.6.16/drivers/serial/cpm_uart/cpm_uart_cpm2.c 2006-04-25 11:31:05.000000000 +0530@@ -261,6 +261,10 @@ { pr_debug("CPM uart[-]:init portdesc\n"); + /* Check if we have called this yet. This may happen if early kgdb+ breakpoint is on */+ if(cpm_uart_nr)+ return 0; cpm_uart_nr = 0; #ifdef CONFIG_SERIAL_CPM_SMC1 cpm_uart_ports[UART_SMC1].smcp = (smc_t *) & cpm2_immr->im_smc[0];Index: linux-2.6.16/drivers/serial/cpm_uart/cpm_uart.h===================================================================--- linux-2.6.16.orig/drivers/serial/cpm_uart/cpm_uart.h 2006-03-20 11:23:29.000000000 +0530+++ linux-2.6.16/drivers/serial/cpm_uart/cpm_uart.h 2006-04-25 11:31:05.000000000 +0530@@ -42,6 +42,39 @@ #define SCC_WAIT_CLOSING 100 +#ifdef CONFIG_KGDB_CPM_UART++/* Speed of the debug UART. */+#if defined(CONFIG_KGDB_9600BAUD)+#define KGDB_BAUD B9600+#elif defined(CONFIG_KGDB_19200BAUD)+#define KGDB_BAUD B19200+#elif defined(CONFIG_KGDB_38400BAUD)+#define KGDB_BAUD B38400+#elif defined(CONFIG_KGDB_57600BAUD)+#define KGDB_BAUD B57600+#else+#define KGDB_BAUD B115200 /* Start with this if not given */+#endif++#ifdef CONFIG_KGDB_CPM_UART_SCC1+#define KGDB_PINFO_INDEX UART_SCC1+#elif CONFIG_KGDB_CPM_UART_SCC2+#define KGDB_PINFO_INDEX UART_SCC2+#elif CONFIG_KGDB_CPM_UART_SCC3+#define KGDB_PINFO_INDEX UART_SCC3+#elif CONFIG_KGDB_CPM_UART_SCC4+#define KGDB_PINFO_INDEX UART_SCC4+#elif CONFIG_KGDB_CPM_UART_SMC1+#define KGDB_PINFO_INDEX UART_SMC1+#elif CONFIG_KGDB_CPM_UART_SMC2+#define KGDB_PINFO_INDEX UART_SMC2+#else+#error The S(M)CC for kgdb console is undefined+#endif++#endif /* CONFIG_KGDB_CPM_UART */+ struct uart_cpm_port { struct uart_port port; u16 rx_nrfifos;@@ -77,6 +110,9 @@ extern int cpm_uart_nr; extern struct uart_cpm_port cpm_uart_ports[UART_NR]; +void cpm_uart_early_write(int index, const char *s, u_int count);+int cpm_uart_early_setup(int index,int early);+ /* these are located in their respective files */ void cpm_line_cr_cmd(int line, int cmd); int cpm_uart_init_portdesc(void);@@ -90,4 +126,19 @@ void scc3_lineif(struct uart_cpm_port *pinfo); void scc4_lineif(struct uart_cpm_port *pinfo); +static inline unsigned long cpu2cpm_addr(void *addr)+{+ if ((unsigned long)addr >= CPM_ADDR)+ return (unsigned long)addr;+ return virt_to_bus(addr);+}++static inline void *cpm2cpu_addr(unsigned long addr)+{+ if (addr >= CPM_ADDR)+ return (void *)addr;+ return bus_to_virt(addr);+}++ #endif /* CPM_UART_H */Index: linux-2.6.16/drivers/serial/mpsc.h===================================================================--- linux-2.6.16.orig/drivers/serial/mpsc.h 2006-03-20 11:23:29.000000000 +0530+++ linux-2.6.16/drivers/serial/mpsc.h 2006-04-25 11:31:05.000000000 +0530@@ -207,6 +207,10 @@ #define MPSC_RCRR 0x0004 #define MPSC_TCRR 0x0008 +/* MPSC Interrupt registers (offset from MV64x60_SDMA_INTR_OFFSET) */+#define MPSC_INTR_CAUSE 0x0004+#define MPSC_INTR_MASK 0x0084+#define MPSC_INTR_CAUSE_RCC (1<<6) /* ***************************************************************************** *Index: linux-2.6.16/drivers/serial/mpsc_kgdb.c===================================================================--- linux-2.6.16.orig/drivers/serial/mpsc_kgdb.c 2006-04-25 10:59:23.506518750 +0530+++ linux-2.6.16/drivers/serial/mpsc_kgdb.c 2006-04-25 11:31:05.000000000 +0530@@ -0,0 +1,299 @@+/*+ * drivers/serial/mpsc_kgdb.c+ *+ * KGDB driver for the Marvell MultiProtocol Serial Controller (MPCS)+ *+ * Based on the polled boot loader driver by Ajit Prem (ajit.prem@motorola.com)+ *+ * Author: Randy Vinson <rvinson@mvista.com>+ *+ * 2005 (c) MontaVista Software, Inc.+ * This program is free software; you can redistribute it and/or modify it+ * under the terms of the GNU General Public License as published by the+ * Free Software Foundation; either version 2 of the License, or (at your+ * option) any later version.+ */++#include <linux/config.h>+#include <linux/kgdb.h>+#include <linux/mv643xx.h>+#include <linux/device.h>+#include <asm/mv64x60.h>+#include <asm/serial.h>+#include <asm/io.h>+#include <asm/delay.h>++#include "mpsc.h"++/* Speed of the UART. */+static int kgdbmpsc_baud = CONFIG_KGDB_BAUDRATE;++/* Index of the UART, matches ttyMX naming. */+static int kgdbmpsc_ttyMM = CONFIG_KGDB_PORT_NUM;++#define MPSC_INTR_REG_SELECT(x) ((x) + (8 * kgdbmpsc_ttyMM))++static int kgdbmpsc_init(void);++static struct platform_device mpsc_dev, shared_dev;++static void __iomem *mpsc_base;+static void __iomem *brg_base;+static void __iomem *routing_base;+static void __iomem *sdma_base;++static unsigned int mpsc_irq;++static void kgdb_write_debug_char(int c)+{+ u32 data;++ data = readl(mpsc_base + MPSC_MPCR);+ writeb(c, mpsc_base + MPSC_CHR_1);+ mb();+ data = readl(mpsc_base + MPSC_CHR_2);+ data |= MPSC_CHR_2_TTCS;+ writel(data, mpsc_base + MPSC_CHR_2);+ mb();++ while (readl(mpsc_base + MPSC_CHR_2) & MPSC_CHR_2_TTCS) ;+}++static int kgdb_get_debug_char(void)+{+ unsigned char c;++ while (!(readl(sdma_base + MPSC_INTR_REG_SELECT(MPSC_INTR_CAUSE)) &+ MPSC_INTR_CAUSE_RCC)) ;++ c = readb(mpsc_base + MPSC_CHR_10 + (1 << 1));+ mb();+ writeb(c, mpsc_base + MPSC_CHR_10 + (1 << 1));+ mb();+ writel(~MPSC_INTR_CAUSE_RCC, sdma_base ++ MPSC_INTR_REG_SELECT(MPSC_INTR_CAUSE));+ return (c);+}++/*+ * This is the receiver interrupt routine for the GDB stub.+ * All that we need to do is verify that the interrupt happened on the+ * line we're in charge of. If this is true, schedule a breakpoint and+ * return.+ */+static irqreturn_t+kgdbmpsc_interrupt(int irq, void *dev_id, struct pt_regs *regs)+{+ if (irq != mpsc_irq)+ return IRQ_NONE;+ /*+ * If there is some other CPU in KGDB then this is a+ * spurious interrupt. so return without even checking a byte+ */+ if (atomic_read(&debugger_active))+ return IRQ_NONE;++ if (readl(sdma_base + MPSC_INTR_REG_SELECT(MPSC_INTR_CAUSE)) &+ MPSC_INTR_CAUSE_RCC)+ breakpoint();++ return IRQ_HANDLED;+}++static int __init kgdbmpsc_init(void)+{+ struct mpsc_pdata *pdata;+ u32 cdv;++ if (!brg_base || !mpsc_base || !routing_base || !sdma_base)+ return -1;++ /* Set MPSC Routing to enable both ports */+ writel(0x0, routing_base + MPSC_MRR);++ /* MPSC 0/1 Rx & Tx get clocks BRG0/1 */+ writel(0x00000100, routing_base + MPSC_RCRR);+ writel(0x00000100, routing_base + MPSC_TCRR);++ /* Disable all MPSC interrupts and clear any pending interrupts */+ writel(0, sdma_base + MPSC_INTR_REG_SELECT(MPSC_INTR_MASK));+ writel(0, sdma_base + MPSC_INTR_REG_SELECT(MPSC_INTR_CAUSE));++ pdata = (struct mpsc_pdata *)mpsc_dev.dev.platform_data;++ /* cdv = (clock/(2*16*baud rate)) for 16X mode. */+ cdv = ((pdata->brg_clk_freq / (32 * kgdbmpsc_baud)) - 1);+ writel((pdata->brg_clk_src << 18) | (1 << 16) | cdv,+ brg_base + BRG_BCR);++ /* Put MPSC into UART mode, no null modem, 16x clock mode */+ writel(0x000004c4, mpsc_base + MPSC_MMCRL);+ writel(0x04400400, mpsc_base + MPSC_MMCRH);++ writel(0, mpsc_base + MPSC_CHR_1);+ writel(0, mpsc_base + MPSC_CHR_9);+ writel(0, mpsc_base + MPSC_CHR_10);+ writel(4, mpsc_base + MPSC_CHR_3);+ writel(0x20000000, mpsc_base + MPSC_CHR_4);+ writel(0x9000, mpsc_base + MPSC_CHR_5);+ writel(0, mpsc_base + MPSC_CHR_6);+ writel(0, mpsc_base + MPSC_CHR_7);+ writel(0, mpsc_base + MPSC_CHR_8);++ /* 8 data bits, 1 stop bit */+ writel((3 << 12), mpsc_base + MPSC_MPCR);++ /* Enter "hunt" mode */+ writel((1 << 31), mpsc_base + MPSC_CHR_2);++ udelay(100);+ return 0;+}++static void __iomem *__init+kgdbmpsc_map_resource(struct platform_device *pd, int type, int num)+{+ void __iomem *base = NULL;+ struct resource *r;++ if ((r = platform_get_resource(pd, IORESOURCE_MEM, num)))+ base = ioremap(r->start, r->end - r->start + 1);+ return base;+}++static void __iomem *__init+kgdbmpsc_unmap_resource(struct platform_device *pd, int type, int num,+ void __iomem * base)+{+ if (base)+ iounmap(base);+ return NULL;+}++static void __init+kgdbmpsc_reserve_resource(struct platform_device *pd, int type, int num)+{+ struct resource *r;++ if ((r = platform_get_resource(pd, IORESOURCE_MEM, num)))+ request_mem_region(r->start, r->end - r->start + 1, "kgdb");+}++static int __init kgdbmpsc_local_init(void)+{+ if (!mpsc_dev.num_resources || !shared_dev.num_resources)+ return 1; /* failure */++ mpsc_base = kgdbmpsc_map_resource(&mpsc_dev, IORESOURCE_MEM,+ MPSC_BASE_ORDER);+ brg_base = kgdbmpsc_map_resource(&mpsc_dev, IORESOURCE_MEM,+ MPSC_BRG_BASE_ORDER);++ /* get the platform data for the shared registers and get them mapped */+ routing_base = kgdbmpsc_map_resource(&shared_dev,+ IORESOURCE_MEM,+ MPSC_ROUTING_BASE_ORDER);+ sdma_base =+ kgdbmpsc_map_resource(&shared_dev, IORESOURCE_MEM,+ MPSC_SDMA_INTR_BASE_ORDER);++ mpsc_irq = platform_get_irq(&mpsc_dev, 1);++ if (mpsc_base && brg_base && routing_base && sdma_base)+ return 0; /* success */++ return 1; /* failure */+}++static void __init kgdbmpsc_local_exit(void)+{+ if (sdma_base)+ sdma_base = kgdbmpsc_unmap_resource(&shared_dev, IORESOURCE_MEM,+ MPSC_SDMA_INTR_BASE_ORDER,+ sdma_base);+ if (routing_base)+ routing_base = kgdbmpsc_unmap_resource(&shared_dev,+ IORESOURCE_MEM,+ MPSC_ROUTING_BASE_ORDER,+ routing_base);+ if (brg_base)+ brg_base = kgdbmpsc_unmap_resource(&mpsc_dev, IORESOURCE_MEM,+ MPSC_BRG_BASE_ORDER,+ brg_base);+ if (mpsc_base)+ mpsc_base = kgdbmpsc_unmap_resource(&mpsc_dev, IORESOURCE_MEM,+ MPSC_BASE_ORDER, mpsc_base);+}++static void __init kgdbmpsc_update_pdata(struct platform_device *pdev)+{++ snprintf(pdev->dev.bus_id, BUS_ID_SIZE, "%s%u", pdev->name, pdev->id);+}++static int __init kgdbmpsc_pdev_init(void)+{+ struct platform_device *pdev;++ /* get the platform data for the specified port. */+ pdev = mv64x60_early_get_pdev_data(MPSC_CTLR_NAME, kgdbmpsc_ttyMM, 1);+ if (pdev) {+ memcpy(&mpsc_dev, pdev, sizeof(struct platform_device));+ if (platform_notify) {+ kgdbmpsc_update_pdata(&mpsc_dev);+ platform_notify(&mpsc_dev.dev);+ }++ /* get the platform data for the shared registers. */+ pdev = mv64x60_early_get_pdev_data(MPSC_SHARED_NAME, 0, 0);+ if (pdev) {+ memcpy(&shared_dev, pdev,+ sizeof(struct platform_device));+ if (platform_notify) {+ kgdbmpsc_update_pdata(&shared_dev);+ platform_notify(&shared_dev.dev);+ }+ }+ }+ return 0;+}++postcore_initcall(kgdbmpsc_pdev_init);++static int __init kgdbmpsc_init_io(void)+{++ kgdbmpsc_pdev_init();++ if (kgdbmpsc_local_init()) {+ kgdbmpsc_local_exit();+ return -1;+ }++ if (kgdbmpsc_init() == -1)+ return -1;+ return 0;+}++static void __init kgdbmpsc_hookup_irq(void)+{+ unsigned int msk;+ if (!request_irq(mpsc_irq, kgdbmpsc_interrupt, 0, "kgdb mpsc", NULL)) {+ /* Enable interrupt */+ msk = readl(sdma_base + MPSC_INTR_REG_SELECT(MPSC_INTR_MASK));+ msk |= MPSC_INTR_CAUSE_RCC;+ writel(msk, sdma_base + MPSC_INTR_REG_SELECT(MPSC_INTR_MASK));++ kgdbmpsc_reserve_resource(&mpsc_dev, IORESOURCE_MEM,+ MPSC_BASE_ORDER);+ kgdbmpsc_reserve_resource(&mpsc_dev, IORESOURCE_MEM,+ MPSC_BRG_BASE_ORDER);+ }+}++struct kgdb_io kgdb_io_ops = {+ .read_char = kgdb_get_debug_char,+ .write_char = kgdb_write_debug_char,+ .init = kgdbmpsc_init_io,+ .late_init = kgdbmpsc_hookup_irq,+};Index: linux-2.6.16/drivers/serial/Makefile===================================================================--- linux-2.6.16.orig/drivers/serial/Makefile 2006-04-25 11:28:49.000000000 +0530+++ linux-2.6.16/drivers/serial/Makefile 2006-04-25 11:31:05.000000000 +0530
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -