Thread (8 messages) 8 messages, 3 authors, 2004-10-08

next pass of cleaning up micropatch.c

flat view

From: Robert P. J. Day <hidden>
Date: 2004-10-08 12:51:23

  numerous changes to micropatch.c:

  1) define patching macros for brevity
  2) make sections for each patch more modular
  3) comment out questionable verify_patch() routine for now, since
	no one seems to call it


comments?  it's still not the final cut, just another step along
the way.

  Signed-off-by: Robert P. J. Day [off-list ref]




===== arch/ppc/8xx_io/micropatch.c 1.3 vs edited =====
--- 1.3/arch/ppc/8xx_io/micropatch.c	2004-10-07 18:28:32 -04:00
+++ edited/arch/ppc/8xx_io/micropatch.c	2004-10-08 08:34:58 -04:00
@@ -621,15 +621,29 @@
 };
 #endif

-/* Load the microcode patch.  This is called early in the CPM initialization
- * with the controller in the reset state.  We enable the processor after
- * we load the patch.
+/*
+ *  Shortcut macros for patching code.
  */
+
+#define PATCH2000 \
+	dp = (uint *)(commproc->cp_dpmem); \
+	for (i=0; i<(sizeof(patch_2000)/4); i++) \
+		*dp++ = patch_2000[i];
+
+#define PATCH2E00 \
+	dp = (uint *)&(commproc->cp_dpmem[0x0e00]); \
+	for (i=0; i<(sizeof(patch_2e00)/4); i++) \
+		*dp++ = patch_2e00[i];
+
+#define PATCH2F00 \
+	dp = (uint *)&(commproc->cp_dpmem[0x0f00]); \
+	for (i=0; i<(sizeof(patch_2f00)/4); i++) \
+		*dp++ = patch_2f00[i];
+
+
 void
-cpm_load_patch(volatile immap_t *immr)
-{
-#ifdef CONFIG_UCODE_PATCH
-	volatile uint		*dp;
+cpm_load_patch(volatile immap_t *immr) {
+	volatile uint		*dp;		/* Dual-ported RAM. */
 	volatile cpm8xx_t	*commproc;
 	volatile iic_t		*iip;
 	volatile spi_t		*spp;
@@ -638,42 +652,22 @@

 	commproc = (cpm8xx_t *)&immr->im_cpm;

-	/* We work closely with commproc.c.  We know it only allocates
-	 * from data only space.
-	 * For this particular patch, we only use the bottom 512 bytes
-	 * and the upper 256 byte extension.  We will use the space
-	 * starting at 1K for the relocated parameters, as the general
-	 * CPM allocation won't come from that area.
-	 */
-	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++)
-		*dp++ = patch_2000[i];
-
-	dp = (uint *)&(commproc->cp_dpmem[0x0f00]);
-	for (i=0; i<(sizeof(patch_2f00)/4); i++)
-		*dp++ = patch_2f00[i];
-
 #ifdef CONFIG_USB_SOF_UCODE_PATCH
-
-	/* Enable uCode fetches from DPRAM. */
+	commproc->cp_rccr = 0;
+	PATCH2000
+	PATCH2F00
 	commproc->cp_rccr = 0x0009;

-	printk("USB uCode patch installed\n");
-#endif /* CONFIG_USB_SOF_PATCH */
+	printk("USB SOF microcode patch installed\n");
+#endif /* CONFIG_USB_SOF_UCODE_PATCH */

 #if defined(CONFIG_I2C_SPI_UCODE_PATCH) || \
     defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)

+	commproc->cp_rccr = 0;
+	PATCH2000
+	PATCH2F00
+
 	iip = (iic_t *)&commproc->cp_dparam[PROFF_IIC];
 # define RPBASE 0x0500
 	iip->iic_rpbase = RPBASE;
@@ -684,63 +678,42 @@
 	spp = (spi_t *)&commproc->cp_dparam[PROFF_SPI];
 	spp->spi_rpbase = i;

-# 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];
+# if defined(CONFIG_I2C_SPI_UCODE_PATCH)
+	commproc->cp_cpmcr1 = 0x802a;
+	commproc->cp_cpmcr2 = 0x8028;
+	commproc->cp_cpmcr3 = 0x802e;
+	commproc->cp_cpmcr4 = 0x802c;
+	commproc->cp_rccr = 1;

-	/* Enable the traps to get to it.
-	*/
+	printk("I2C/SPI microcode patch installed.\n");
+# endif /* CONFIG_I2C_SPI_UCODE_PATCH */
+
+# if defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
+	PATCH2E00
 	commproc->cp_cpmcr1 = 0x8080;
 	commproc->cp_cpmcr2 = 0x808a;
 	commproc->cp_cpmcr3 = 0x8028;
 	commproc->cp_cpmcr4 = 0x802a;
-
-	/* Enable uCode fetches from DPRAM.
-	*/
 	commproc->cp_rccr = 3;

 	smp = (smc_uart_t *)&commproc->cp_dparam[PROFF_SMC1];
 	smp->smc_rpbase = 0x1FC0;

-	printk("I2C/SPI/SMC1 ucode patch installed.\n");
+	printk("I2C/SPI/SMC1 microcode 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;
-	commproc->cp_cpmcr2 = 0x8028;
-	commproc->cp_cpmcr3 = 0x802e;
-	commproc->cp_cpmcr4 = 0x802c;
-
-	/* Enable uCode fetches from DPRAM.
-	*/
-	commproc->cp_rccr = 1;
-
-	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.
-	 */
-	iip = (iic_t *)&commproc->cp_dparam[PROFF_IIC];
-	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
-#endif /* CONFIG_UCODE_PATCH */
+#endif /* some variation of the I2C/SPI patch was selected */
 }

+/*
+ *  Take this entire routine out, since no one calls it and its + * logic is suspect.
+ */
+
+#if 0
 void
 verify_patch(volatile immap_t *immr)
 {
-#ifdef CONFIG_UCODE_PATCH
 	volatile uint		*dp;
 	volatile cpm8xx_t	*commproc;
 	int i;
@@ -769,5 +742,5 @@
 		}

 	commproc->cp_rccr = 0x0009;
-#endif /* CONFIG_UCODE_PATCH */
 }
+#endif
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help