next pass of cleaning up micropatch.c
Robert P. J. Day
rpjday at mindspring.com
Fri Oct 8 22:44:27 EST 2004
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 <rpjday at mindspring.com>
===== 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
More information about the Linuxppc-embedded
mailing list