Skip to content

Commit

Permalink
ALSA: ctxfi - Remove PAGE_SIZE limitation
Browse files Browse the repository at this point in the history
Remove the limitation of PAGE_SIZE to be 4k by defining the own
page size and macros for 4k.  8kb page size could be natively supported,
but it's disabled right now for simplicity.

Also, clean up using upper_32_bits() macro.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Takashi Iwai committed Jun 2, 2009
1 parent d2b9b96 commit cd391e2
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 37 deletions.
1 change: 0 additions & 1 deletion sound/pci/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,6 @@ config SND_CS5535AUDIO

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
Expand Down
16 changes: 6 additions & 10 deletions sound/pci/ctxfi/cthw20k1.c
Original file line number Diff line number Diff line change
Expand Up @@ -1249,18 +1249,14 @@ static int hw_trn_init(struct hw *hw, const struct trn_conf *info)
}

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);
Expand Down
17 changes: 4 additions & 13 deletions sound/pci/ctxfi/cthw20k2.c
Original file line number Diff line number Diff line change
Expand Up @@ -1203,19 +1203,10 @@ static int hw_trn_init(struct hw *hw, const struct trn_conf *info)
}

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);
Expand Down
25 changes: 12 additions & 13 deletions sound/pci/ctxfi/ctvmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,11 @@
#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.
Expand Down Expand Up @@ -138,24 +137,24 @@ ct_vm_map(struct ct_vm *vm, void *host_addr, int 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;
Expand All @@ -164,9 +163,9 @@ ct_vm_map(struct ct_vm *vm, void *host_addr, int size)
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);
}

Expand Down
8 changes: 8 additions & 0 deletions sound/pci/ctxfi/ctvmem.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,14 @@
#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 */
Expand Down

0 comments on commit cd391e2

Please sign in to comment.