Now, I'm writing a DMA driver on powerpc 440gx platform(2.6.26.5), as the only way to set up DMA Controller is to access it's dcr registers with 'mfdcr' and 'mtdcr'.
I've found some dma code in Linux kernel 2.6.26.5, so I copy the code u wrote to my driver module directory, and include them, but when I compile my driver, gcc complains following err messages: -------------------------------------------------------- {standard input}: Assembler messages: {standard input}:83: Error: unsupported relocation against dmanr --------------------------------------------------------- code I copy from kernel 2.6.26.5 (arch/ppc/syslib/ppc4xx_dma.c) -------------------------------------------- #include "dcr.h" /* #inlcude <asm/dcr-native.h> */ ppc_dma_ch_t dma_channels[MAX_PPC4xx_DMA_CHANNELS]; int ppc4xx_get_dma_status(void) { return (mfdcr(DCRN_DMASR)); } void ppc4xx_enable_dma(unsigned int dmanr) { unsigned int control; ppc_dma_ch_t *p_dma_ch = &dma_channels[dmanr]; ......... / * for other xfer modes, the addresses are already set */ control = mfdcr(DCRN_DMACR0 + (dmanr * 0x8)); <----------------err } void ppc4xx_set_src_addr(int dmanr, phys_addr_t src_addr) { if (dmanr >= MAX_PPC4xx_DMA_CHANNELS) { printk("set_src_addr: bad channel: %d\n", dmanr); return; } #ifdef PPC4xx_DMA_64BIT mtdcr(DCRN_DMASAH0 + dmanr*2, (u32)(src_addr >> 32)); #else mtdcr(DCRN_DMASA0 + dmanr*2, (u32)src_addr); #endif } -------------------------------------------------- DCR access micro I copied: ---------------------------------- #define mfdcr(rn) \ ({ \ unsigned long rval; \ asm volatile("mfdcr %0,%1" : "=r"(rval) : "i"(rn)); \ rval; \ }) #define mtdcr(rn, val) \ asm volatile("mtdcr %0,%1" : : "i"(rn), "r"(val)) ----------------------------------------------------- Makefile I worte ------------------------- obj-m := dmatest.o dmatest-objs += dma.o core.o KBUILD_CFLAGS += -m440 -mregnames -Wa, -booke KBUILD_ASFAGS += -m440 -mregnames -Wa, -booke --------- KBUILD_CFLAGS += -m440 -mregnames -Wa, -booke KBUILD_ASFAGS += -m440 -mregnames -Wa, -booke I add these two sentences when I read these http://sourceware.org/ml/binutils/2004-09/msg00161.html. When I change it to mfdcr(DCRN_DMACR0); then everything is fine. but from the result I got when I insmod my module driver, dcr reg is not changed. It seems that it's the problem with gnu assembler, my GNU assembler ver is 2.17 The attachments are the c source file I copy from linux 2.6.26.5, and I use these dma function to directly manipulate dcr registers, but when I make my driver module outside kernel source tree, it complains the error I mentioned above. Thanks!
ppc4xx_dma.c
Description: Binary data
dcr-native.h
Description: Binary data
dcr.h
Description: Binary data
_______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev