Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 148363
b: refs/heads/master
c: cd391e2
h: refs/heads/master
i:
  148361: 7a8e8aa
  148359: 0ff16ec
v: v3
  • Loading branch information
Takashi Iwai committed Jun 2, 2009
1 parent 894c030 commit 585beb7
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 38 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d2b9b96c516d4d61663d92ab4ad4f15ca0134ef2
refs/heads/master: cd391e206f486955e216a61bd9ebcb0e142122e9
1 change: 0 additions & 1 deletion trunk/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 trunk/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 trunk/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 trunk/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 trunk/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 585beb7

Please sign in to comment.