Commit 685f779e authored by Thiemo Seufer's avatar Thiemo Seufer Committed by Ralf Baechle

Fix initialization. Unbreak the wait-for-completion loops. Code cleanup.

Signed-off-by: default avatarThiemo Seufer <ths@networkno.de>
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 65bda1a9
...@@ -207,30 +207,32 @@ typedef struct dmadscr_s { ...@@ -207,30 +207,32 @@ typedef struct dmadscr_s {
u64 pad_b; u64 pad_b;
} dmadscr_t; } dmadscr_t;
static dmadscr_t page_descr[NR_CPUS] __attribute__((aligned(SMP_CACHE_BYTES))); static dmadscr_t page_descr[DM_NUM_CHANNELS] __attribute__((aligned(SMP_CACHE_BYTES)));
void sb1_dma_init(void) void sb1_dma_init(void)
{ {
int cpu = smp_processor_id(); int i;
u64 base_val = CPHYSADDR(&page_descr[cpu]) | V_DM_DSCR_BASE_RINGSZ(1);
__raw_writeq(base_val, for (i = 0; i < DM_NUM_CHANNELS; i++) {
IOADDR(A_DM_REGISTER(cpu, R_DM_DSCR_BASE))); u64 base_val = (u64)CPHYSADDR(&page_descr[i]) | V_DM_DSCR_BASE_RINGSZ(1);
__raw_writeq(base_val | M_DM_DSCR_BASE_RESET, void *base_reg = (void *)IOADDR(A_DM_REGISTER(i, R_DM_DSCR_BASE));
IOADDR(A_DM_REGISTER(cpu, R_DM_DSCR_BASE)));
__raw_writeq(base_val | M_DM_DSCR_BASE_ENABL, __raw_writeq(base_val, base_reg);
IOADDR(A_DM_REGISTER(cpu, R_DM_DSCR_BASE))); __raw_writeq(base_val | M_DM_DSCR_BASE_RESET, base_reg);
__raw_writeq(base_val | M_DM_DSCR_BASE_ENABL, base_reg);
}
} }
void clear_page(void *page) void clear_page(void *page)
{ {
int cpu = smp_processor_id(); u64 to_phys = (u64)CPHYSADDR(page);
unsigned int cpu = smp_processor_id();
/* if the page is above Kseg0, use old way */ /* if the page is not in KSEG0, use old way */
if ((long)KSEGX(page) != (long)CKSEG0) if ((long)KSEGX(page) != (long)CKSEG0)
return clear_page_cpu(page); return clear_page_cpu(page);
page_descr[cpu].dscr_a = CPHYSADDR(page) | M_DM_DSCRA_ZERO_MEM | M_DM_DSCRA_L2C_DEST | M_DM_DSCRA_INTERRUPT; page_descr[cpu].dscr_a = to_phys | M_DM_DSCRA_ZERO_MEM | M_DM_DSCRA_L2C_DEST | M_DM_DSCRA_INTERRUPT;
page_descr[cpu].dscr_b = V_DM_DSCRB_SRC_LENGTH(PAGE_SIZE); page_descr[cpu].dscr_b = V_DM_DSCRB_SRC_LENGTH(PAGE_SIZE);
__raw_writeq(1, IOADDR(A_DM_REGISTER(cpu, R_DM_DSCR_COUNT))); __raw_writeq(1, IOADDR(A_DM_REGISTER(cpu, R_DM_DSCR_COUNT)));
...@@ -239,32 +241,32 @@ void clear_page(void *page) ...@@ -239,32 +241,32 @@ void clear_page(void *page)
* reliable way to delay completion detection. * reliable way to delay completion detection.
*/ */
while (!(__raw_readq(IOADDR(A_DM_REGISTER(cpu, R_DM_DSCR_BASE_DEBUG))) while (!(__raw_readq(IOADDR(A_DM_REGISTER(cpu, R_DM_DSCR_BASE_DEBUG)))
M_DM_DSCR_BASE_INTERRUPT))) & M_DM_DSCR_BASE_INTERRUPT))
; ;
__raw_readq(IOADDR(A_DM_REGISTER(cpu, R_DM_DSCR_BASE))); __raw_readq(IOADDR(A_DM_REGISTER(cpu, R_DM_DSCR_BASE)));
} }
void copy_page(void *to, void *from) void copy_page(void *to, void *from)
{ {
unsigned long from_phys = CPHYSADDR(from); u64 from_phys = (u64)CPHYSADDR(from);
unsigned long to_phys = CPHYSADDR(to); u64 to_phys = (u64)CPHYSADDR(to);
int cpu = smp_processor_id(); unsigned int cpu = smp_processor_id();
/* if either page is above Kseg0, use old way */ /* if any page is not in KSEG0, use old way */
if ((long)KSEGX(to) != (long)CKSEG0 if ((long)KSEGX(to) != (long)CKSEG0
|| (long)KSEGX(from) != (long)CKSEG0) || (long)KSEGX(from) != (long)CKSEG0)
return copy_page_cpu(to, from); return copy_page_cpu(to, from);
page_descr[cpu].dscr_a = CPHYSADDR(to_phys) | M_DM_DSCRA_L2C_DEST | M_DM_DSCRA_INTERRUPT; page_descr[cpu].dscr_a = to_phys | M_DM_DSCRA_L2C_DEST | M_DM_DSCRA_INTERRUPT;
page_descr[cpu].dscr_b = CPHYSADDR(from_phys) | V_DM_DSCRB_SRC_LENGTH(PAGE_SIZE); page_descr[cpu].dscr_b = from_phys | V_DM_DSCRB_SRC_LENGTH(PAGE_SIZE);
__raw_writeq(1, IOADDR(A_DM_REGISTER(cpu, R_DM_DSCR_COUNT))); __raw_writeq(1, (void *)IOADDR(A_DM_REGISTER(cpu, R_DM_DSCR_COUNT)));
/* /*
* Don't really want to do it this way, but there's no * Don't really want to do it this way, but there's no
* reliable way to delay completion detection. * reliable way to delay completion detection.
*/ */
while (!(__raw_readq(IOADDR(A_DM_REGISTER(cpu, R_DM_DSCR_BASE_DEBUG)) & while (!(__raw_readq((void *)IOADDR(A_DM_REGISTER(cpu, R_DM_DSCR_BASE_DEBUG)))
M_DM_DSCR_BASE_INTERRUPT))) & M_DM_DSCR_BASE_INTERRUPT))
; ;
__raw_readq(IOADDR(A_DM_REGISTER(cpu, R_DM_DSCR_BASE))); __raw_readq(IOADDR(A_DM_REGISTER(cpu, R_DM_DSCR_BASE)));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment