[PATCH] 2.6.9(?) kernel, replacing ucode patch infrastructure
Robert P. J. Day
rpjday at mindspring.com
Wed Oct 6 23:15:56 EST 2004
ok, one more time, here's a patch that should apply cleanly to the
latest bk repo for linuxppc-2.5. the purpose is to create a cleaner
and more extensible microcode patch infrastructure, so that all you
need to do is *select* the 8xx-relevant patch you want from the config
menu under "MPC8xx" options.
NOTE. Really. NOTE: There's a *lot* more cleanup that I'm going
to add on top of *this* patch. There's redundant code that's still
there, there's mystery code, there's more patches that can be added to
the choice menu and so on. But I would prefer to have *this* patch
applied first. As it stands, it's been tested with just relocating
SMC1, and also with relocating SMC1 while allocating SCC3 to ethernet.
Both appear to work fine.
Also, this patch should make *no* difference to anyone who's not
selecting a ucode patch. In that sense, it should be safe. In short,
don't criticize niggling details in what follows; all of that will be
cleaned up in short order. This just provides what I think is the
bare minimum to get the infrastructure in place.
Signed-off-by: Robert P. J. Day <rpjday at mindspring.com>
===== arch/ppc/8xx_io/Kconfig 1.4 vs edited =====
--- 1.4/arch/ppc/8xx_io/Kconfig 2004-05-27 18:37:33 -04:00
+++ edited/arch/ppc/8xx_io/Kconfig 2004-10-06 08:44:22 -04:00
@@ -140,13 +140,36 @@ config 8xx_CPU6
If in doubt, say N here.
-config UCODE_PATCH
- bool "I2C/SPI Microcode Patch"
+choice
+ prompt "Microcode patch selection"
+ default NO_UCODE_PATCH
+ help
+ Help not implemented yet, coming soon.
+
+config NO_UCODE_PATCH
+ bool "None"
+
+config USB_SOF_UCODE_PATCH
+ bool "USB SOF patch"
+ help
+ Help not implemented yet, coming soon.
+
+config I2C_SPI_UCODE_PATCH
+ bool "I2C/SPI relocation patch"
help
- Motorola releases microcode updates for their 8xx CPM modules. The
- microcode update file has updates for IIC, SMC and USB. Currently only
- the USB update is available by default, if the MPC8xx USB option is
- enabled. If in doubt, say 'N' here.
+ Help not implemented yet, coming soon.
+
+config I2C_SPI_SMC1_UCODE_PATCH
+ bool "I2C/SPI/SMC1 relocation patch"
+ help
+ Help not implemented yet, coming soon.
+
+endchoice
+
+config UCODE_PATCH
+ bool
+ default y
+ depends on !NO_UCODE_PATCH
endmenu
===== arch/ppc/8xx_io/micropatch.c 1.2 vs edited =====
--- 1.2/arch/ppc/8xx_io/micropatch.c 2002-02-05 02:55:41 -05:00
+++ edited/arch/ppc/8xx_io/micropatch.c 2004-10-06 08:41:43 -04:00
@@ -19,18 +19,12 @@
#include <asm/8xx_immap.h>
#include <asm/commproc.h>
-/* Define this to get SMC patches as well. You need to modify the uart
- * driver as well......
-#define USE_SMC_PATCH 1
+/*
+ * I2C/SPI relocation patch arrays.
*/
-#ifdef CONFIG_USB_MPC8xx
-#define USE_USB_SOF_PATCH
-#endif
+#ifdef CONFIG_I2C_SPI_UCODE_PATCH
-#ifdef USE_IIC_PATCH
-#define PATCH_DEFINED
- /* IIC/SPI */
uint patch_2000[] = {
0x7FFFEFD9,
0x3FFD0000,
@@ -183,11 +177,12 @@ uint patch_2f00[] = {
};
#endif
-#ifdef USE_SMC_PATCH
-#define PATCH_DEFINED
-/* SMC2/IIC/SPI Patch */
-/* This is the area from 0x2000 to 0x23ff.
-*/
+/*
+ * I2C/SPI/SMC1 relocation patch arrays.
+ */
+
+#ifdef CONFIG_I2C_SPI_SMC1_UCODE_PATCH
+
uint patch_2000[] = {
0x3fff0000,
0x3ffd0000,
@@ -511,8 +506,6 @@ uint patch_2000[] = {
0x6079e2bb
};
- /* This is from 0x2f00 to 0x2fff
- */
uint patch_2f00[] = {
0x30303030,
0x3e3e3434,
@@ -581,8 +574,6 @@ uint patch_2f00[] = {
};
uint patch_2e00[] = {
- /* This is from 0x2e00 to 0x2e3c
- */
0x27eeeeee,
0xeeeeeeee,
0xeeeeeeee,
@@ -602,8 +593,12 @@ uint patch_2e00[] = {
};
#endif
-#ifdef USE_USB_SOF_PATCH
-#define PATCH_DEFINED
+/*
+ * USB SOF patch arrays.
+ */
+
+#ifdef CONFIG_USB_SOF_UCODE_PATCH
+
uint patch_2000[] = {
0x7fff0000,
0x7ffd0000,
@@ -633,11 +628,12 @@ uint patch_2f00[] = {
void
cpm_load_patch(volatile immap_t *immr)
{
-#ifdef PATCH_DEFINED
+#ifdef CONFIG_UCODE_PATCH
volatile uint *dp;
volatile cpm8xx_t *commproc;
volatile iic_t *iip;
volatile spi_t *spp;
+ volatile smc_uart_t *smp;
int i;
commproc = (cpm8xx_t *)&immr->im_cpm;
@@ -652,6 +648,12 @@ cpm_load_patch(volatile immap_t *immr)
commproc->cp_rccr = 0;
/* Copy the patch into DPRAM.
+ *
+ * ADDENDUM: I am somewhat nervous about the next few lines,
+ * as they imply that *any* patch will *always* consist of at
+ * least the patch_2000[] and patch_2f00[] arrays, and it's
+ * not clear to me that that's true. More to come here as I
+ * figure this out.
*/
dp = (uint *)(commproc->cp_dpmem);
for (i=0; i<(sizeof(patch_2000)/4); i++)
@@ -661,29 +663,19 @@ cpm_load_patch(volatile immap_t *immr)
for (i=0; i<(sizeof(patch_2f00)/4); i++)
*dp++ = patch_2f00[i];
-#ifdef USE_USB_SOF_PATCH
-#if 0 /* usb patch should not relocate iic */
- iip = (iic_t *)&commproc->cp_dparam[PROFF_IIC];
-#define RPBASE 0x0030
- iip->iic_rpbase = RPBASE;
-
- /* Put SPI above the IIC, also 32-byte aligned.
- */
- i = (RPBASE + sizeof(iic_t) + 31) & ~31;
- spp = (spi_t *)&commproc->cp_dparam[PROFF_SPI];
- spp->spi_rpbase = i;
-#endif
+#ifdef CONFIG_USB_SOF_UCODE_PATCH
/* Enable uCode fetches from DPRAM. */
commproc->cp_rccr = 0x0009;
printk("USB uCode patch installed\n");
-#endif /* USE_USB_SOF_PATCH */
+#endif /* CONFIG_USB_SOF_PATCH */
-#if defined(USE_SMC_PATCH) || defined(USE_IIC_PATCH)
+#if defined(CONFIG_I2C_SPI_UCODE_PATCH) || \
+ defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
iip = (iic_t *)&commproc->cp_dparam[PROFF_IIC];
-#define RPBASE 0x0400
+# define RPBASE 0x0500
iip->iic_rpbase = RPBASE;
/* Put SPI above the IIC, also 32-byte aligned.
@@ -692,7 +684,7 @@ cpm_load_patch(volatile immap_t *immr)
spp = (spi_t *)&commproc->cp_dparam[PROFF_SPI];
spp->spi_rpbase = i;
-#ifdef USE_SMC_PATCH
+# if defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
dp = (uint *)&(commproc->cp_dpmem[0x0e00]);
for (i=0; i<(sizeof(patch_2e00)/4); i++)
*dp++ = patch_2e00[i];
@@ -707,9 +699,14 @@ cpm_load_patch(volatile immap_t *immr)
/* Enable uCode fetches from DPRAM.
*/
commproc->cp_rccr = 3;
-#endif
-#ifdef USE_IIC_PATCH
+ smp = (smc_uart_t *)&commproc->cp_dparam[PROFF_SMC1];
+ smp->smc_rpbase = 0x1FC0;
+
+ printk("I2C/SPI/SMC1 ucode patch installed.\n");
+# endif /* CONFIG_I2C_SPI_SMC1_UCODE_PATCH) */
+
+# if defined(CONFIG_I2C_SPI_UCODE_PATCH)
/* Enable the traps to get to it.
*/
commproc->cp_cpmcr1 = 0x802a;
@@ -721,8 +718,8 @@ cpm_load_patch(volatile immap_t *immr)
*/
commproc->cp_rccr = 1;
- printk("I2C uCode patch installed\n");
-#endif
+ printk("I2C/SPI ucode patch installed.\n");
+# endif /* CONFIG_I2C_SPI_UCODE_PATCH */
/* Relocate the IIC and SPI parameter areas. These have to
* aligned on 32-byte boundaries.
@@ -736,14 +733,14 @@ cpm_load_patch(volatile immap_t *immr)
spp = (spi_t *)&commproc->cp_dparam[PROFF_SPI];
spp->spi_rpbase = i;
-#endif /* USE_SMC_PATCH || USE_IIC_PATCH */
-#endif /* PATCH_DEFINED */
+#endif
+#endif /* CONFIG_UCODE_PATCH */
}
void
verify_patch(volatile immap_t *immr)
{
-#ifdef PATCH_DEFINED
+#ifdef CONFIG_UCODE_PATCH
volatile uint *dp;
volatile cpm8xx_t *commproc;
int i;
@@ -772,6 +769,5 @@ verify_patch(volatile immap_t *immr)
}
commproc->cp_rccr = 0x0009;
-#endif /* PATCH_DEFINED */
+#endif /* CONFIG_UCODE_PATCH */
}
-
===== drivers/serial/cpm_uart/cpm_uart_core.c 1.5 vs edited =====
--- 1.5/drivers/serial/cpm_uart/cpm_uart_core.c 2004-07-15 19:29:21 -04:00
+++ edited/drivers/serial/cpm_uart/cpm_uart_core.c 2004-10-06 08:50:03 -04:00
@@ -743,6 +743,19 @@ static void cpm_uart_init_smc(struct uar
pinfo->smcup->smc_rbase = (u_char *)pinfo->rx_bd_base - DPRAM_BASE;
pinfo->smcup->smc_tbase = (u_char *)pinfo->tx_bd_base - DPRAM_BASE;
+/*
+ * In case SMC1 is being relocated...
+ */
+#if defined (CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
+ up->smc_rbptr = pinfo->smcup->smc_rbase;
+ up->smc_tbptr = pinfo->smcup->smc_tbase;
+ up->smc_rstate = 0;
+ up->smc_tstate = 0;
+ up->smc_brkcr = 1; /* number of break chars */
+ up->smc_brkec = 0;
+#endif
+
+
/* Set up the uart parameters in the
* parameter ram.
*/
===== drivers/serial/cpm_uart/cpm_uart_cpm1.c 1.5 vs edited =====
--- 1.5/drivers/serial/cpm_uart/cpm_uart_cpm1.c 2004-07-19 12:47:25 -04:00
+++ edited/drivers/serial/cpm_uart/cpm_uart_cpm1.c 2004-10-06 08:50:16 -04:00
@@ -194,8 +194,16 @@ int cpm_uart_init_portdesc(void)
cpm_uart_nr = 0;
#ifdef CONFIG_SERIAL_CPM_SMC1
cpm_uart_ports[UART_SMC1].smcp = &cpmp->cp_smc[0];
+/*
+ * Is SMC1 being relocated?
+ */
+# ifdef CONFIG_I2C_SPI_SMC1_UCODE_PATCH
+ cpm_uart_ports[UART_SMC1].smcup =
+ (smc_uart_t *) & cpmp->cp_dparam[0x3C0];
+# else
cpm_uart_ports[UART_SMC1].smcup =
(smc_uart_t *) & cpmp->cp_dparam[PROFF_SMC1];
+# endif
cpm_uart_ports[UART_SMC1].port.mapbase =
(unsigned long)&cpmp->cp_smc[0];
cpm_uart_ports[UART_SMC1].smcp->smc_smcm |= (SMCM_RX | SMCM_TX);
===== include/asm-ppc/commproc.h 1.14 vs edited =====
--- 1.14/include/asm-ppc/commproc.h 2004-07-15 19:49:03 -04:00
+++ edited/include/asm-ppc/commproc.h 2004-10-06 07:48:03 -04:00
@@ -145,6 +145,8 @@ typedef struct smc_uart {
ushort smc_brkec; /* rcv'd break condition counter */
ushort smc_brkcr; /* xmt break count register */
ushort smc_rmask; /* Temporary bit mask */
+ char smc_res1[8]; /* Reserved: 0x34..0x3b */
+ ushort smc_rpbase; /* Relocation pointer */
} smc_uart_t;
/* Function code bits.
More information about the Linuxppc-embedded
mailing list