config SND_CTXFI
tristate "Creative Sound Blaster X-Fi"
- depends on X86
select SND_PCM
help
If you want to use soundcards based on Creative Sound Blastr X-Fi
}
trnctl = 0x13; /* 32-bit, 4k-size page */
-#if BITS_PER_LONG == 64
- ptp_phys_low = info->vm_pgt_phys & ((1UL<<32)-1);
- ptp_phys_high = (info->vm_pgt_phys>>32) & ((1UL<<32)-1);
- trnctl |= (1<<2);
-#elif BITS_PER_LONG == 32
- ptp_phys_low = info->vm_pgt_phys & (~0UL);
- ptp_phys_high = 0;
-#else
-# error "Unknown BITS_PER_LONG!"
-#endif
+ ptp_phys_low = (u32)info->vm_pgt_phys;
+ ptp_phys_high = upper_32_bits(info->vm_pgt_phys);
+ if (sizeof(void *) == 8) /* 64bit address */
+ trnctl |= (1 << 2);
+#if 0 /* Only 4k h/w pages for simplicitiy */
#if PAGE_SIZE == 8192
trnctl |= (1<<5);
+#endif
#endif
hw_write_20kx(hw, PTPALX, ptp_phys_low);
hw_write_20kx(hw, PTPAHX, ptp_phys_high);
}
vmctl = 0x80000C0F; /* 32-bit, 4k-size page */
-#if BITS_PER_LONG == 64
- ptp_phys_low = info->vm_pgt_phys & ((1UL<<32)-1);
- ptp_phys_high = (info->vm_pgt_phys>>32) & ((1UL<<32)-1);
- vmctl |= (3<<8);
-#elif BITS_PER_LONG == 32
- ptp_phys_low = info->vm_pgt_phys & (~0UL);
- ptp_phys_high = 0;
-#else
-# error "Unknown BITS_PER_LONG!"
-#endif
-#if PAGE_SIZE == 8192
-# error "Don't support 8k-page!"
-#endif
+ ptp_phys_low = (u32)info->vm_pgt_phys;
+ ptp_phys_high = upper_32_bits(info->vm_pgt_phys);
+ if (sizeof(void *) == 8) /* 64bit address */
+ vmctl |= (3 << 8);
/* Write page table physical address to all PTPAL registers */
for (i = 0; i < 64; i++) {
hw_write_20kx(hw, VMEM_PTPAL+(16*i), ptp_phys_low);
#include "ctvmem.h"
#include <linux/slab.h>
#include <linux/mm.h>
-#include <asm/page.h> /* for PAGE_SIZE macro definition */
#include <linux/io.h>
#include <asm/pgtable.h>
-#define CT_PTES_PER_PAGE (PAGE_SIZE / sizeof(void *))
-#define CT_ADDRS_PER_PAGE (CT_PTES_PER_PAGE * PAGE_SIZE)
+#define CT_PTES_PER_PAGE (CT_PAGE_SIZE / sizeof(void *))
+#define CT_ADDRS_PER_PAGE (CT_PTES_PER_PAGE * CT_PAGE_SIZE)
/* *
* Find or create vm block based on requested @size.
return NULL;
}
- start_phys = (virt_to_phys(host_addr) & PAGE_MASK);
- pages = (PAGE_ALIGN(virt_to_phys(host_addr) + size)
- - start_phys) >> PAGE_SHIFT;
+ start_phys = (virt_to_phys(host_addr) & CT_PAGE_MASK);
+ pages = (CT_PAGE_ALIGN(virt_to_phys(host_addr) + size)
+ - start_phys) >> CT_PAGE_SHIFT;
ptp = vm->ptp[0];
- block = get_vm_block(vm, (pages << PAGE_SHIFT));
+ block = get_vm_block(vm, (pages << CT_PAGE_SHIFT));
if (block == NULL) {
printk(KERN_ERR "ctxfi: No virtual memory block that is big "
"enough to allocate!\n");
return NULL;
}
- pte_start = (block->addr >> PAGE_SHIFT);
+ pte_start = (block->addr >> CT_PAGE_SHIFT);
for (i = 0; i < pages; i++)
- ptp[pte_start+i] = start_phys + (i << PAGE_SHIFT);
+ ptp[pte_start+i] = start_phys + (i << CT_PAGE_SHIFT);
- block->addr += (virt_to_phys(host_addr) & (~PAGE_MASK));
+ block->addr += (virt_to_phys(host_addr) & (~CT_PAGE_MASK));
block->size = size;
return block;
static void ct_vm_unmap(struct ct_vm *vm, struct ct_vm_block *block)
{
/* do unmapping */
- block->size = ((block->addr + block->size + PAGE_SIZE - 1)
- & PAGE_MASK) - (block->addr & PAGE_MASK);
- block->addr &= PAGE_MASK;
+ block->size = ((block->addr + block->size + CT_PAGE_SIZE - 1)
+ & CT_PAGE_MASK) - (block->addr & CT_PAGE_MASK);
+ block->addr &= CT_PAGE_MASK;
put_vm_block(vm, block);
}
#include <linux/mutex.h>
#include <linux/list.h>
+/* The chip can handle the page table of 4k pages
+ * (emu20k1 can handle even 8k pages, but we don't use it right now)
+ */
+#define CT_PAGE_SIZE 4096
+#define CT_PAGE_SHIFT 12
+#define CT_PAGE_MASK (~(PAGE_SIZE - 1))
+#define CT_PAGE_ALIGN(addr) ALIGN(addr, CT_PAGE_SIZE)
+
struct ct_vm_block {
unsigned int addr; /* starting logical addr of this block */
unsigned int size; /* size of this device virtual mem block */