⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 powerpc-lite.patch

📁 Linux-2.6.18内核调试工具补丁程序KGDB。
💻 PATCH
📖 第 1 页 / 共 5 页
字号:
 	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 + -