diff options
author | Takashi Iwai <tiwai@suse.de> | 2009-06-02 09:04:29 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2009-06-02 09:54:46 -0400 |
commit | cd391e206f486955e216a61bd9ebcb0e142122e9 (patch) | |
tree | ecbf2facf4199093d44bae7e16767566353758d8 /sound/pci/ctxfi | |
parent | d2b9b96c516d4d61663d92ab4ad4f15ca0134ef2 (diff) |
ALSA: ctxfi - Remove PAGE_SIZE limitation
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>
Diffstat (limited to 'sound/pci/ctxfi')
-rw-r--r-- | sound/pci/ctxfi/cthw20k1.c | 16 | ||||
-rw-r--r-- | sound/pci/ctxfi/cthw20k2.c | 17 | ||||
-rw-r--r-- | sound/pci/ctxfi/ctvmem.c | 25 | ||||
-rw-r--r-- | sound/pci/ctxfi/ctvmem.h | 8 |
4 files changed, 30 insertions, 36 deletions
diff --git a/sound/pci/ctxfi/cthw20k1.c b/sound/pci/ctxfi/cthw20k1.c index 44283bd7b2df..b7b8e6f41d0d 100644 --- a/sound/pci/ctxfi/cthw20k1.c +++ b/sound/pci/ctxfi/cthw20k1.c | |||
@@ -1249,19 +1249,15 @@ static int hw_trn_init(struct hw *hw, const struct trn_conf *info) | |||
1249 | } | 1249 | } |
1250 | 1250 | ||
1251 | trnctl = 0x13; /* 32-bit, 4k-size page */ | 1251 | trnctl = 0x13; /* 32-bit, 4k-size page */ |
1252 | #if BITS_PER_LONG == 64 | 1252 | ptp_phys_low = (u32)info->vm_pgt_phys; |
1253 | ptp_phys_low = info->vm_pgt_phys & ((1UL<<32)-1); | 1253 | ptp_phys_high = upper_32_bits(info->vm_pgt_phys); |
1254 | ptp_phys_high = (info->vm_pgt_phys>>32) & ((1UL<<32)-1); | 1254 | if (sizeof(void *) == 8) /* 64bit address */ |
1255 | trnctl |= (1<<2); | 1255 | trnctl |= (1 << 2); |
1256 | #elif BITS_PER_LONG == 32 | 1256 | #if 0 /* Only 4k h/w pages for simplicitiy */ |
1257 | ptp_phys_low = info->vm_pgt_phys & (~0UL); | ||
1258 | ptp_phys_high = 0; | ||
1259 | #else | ||
1260 | # error "Unknown BITS_PER_LONG!" | ||
1261 | #endif | ||
1262 | #if PAGE_SIZE == 8192 | 1257 | #if PAGE_SIZE == 8192 |
1263 | trnctl |= (1<<5); | 1258 | trnctl |= (1<<5); |
1264 | #endif | 1259 | #endif |
1260 | #endif | ||
1265 | hw_write_20kx(hw, PTPALX, ptp_phys_low); | 1261 | hw_write_20kx(hw, PTPALX, ptp_phys_low); |
1266 | hw_write_20kx(hw, PTPAHX, ptp_phys_high); | 1262 | hw_write_20kx(hw, PTPAHX, ptp_phys_high); |
1267 | hw_write_20kx(hw, TRNCTL, trnctl); | 1263 | hw_write_20kx(hw, TRNCTL, trnctl); |
diff --git a/sound/pci/ctxfi/cthw20k2.c b/sound/pci/ctxfi/cthw20k2.c index 7c24c2ca96bd..349728765f2c 100644 --- a/sound/pci/ctxfi/cthw20k2.c +++ b/sound/pci/ctxfi/cthw20k2.c | |||
@@ -1203,19 +1203,10 @@ static int hw_trn_init(struct hw *hw, const struct trn_conf *info) | |||
1203 | } | 1203 | } |
1204 | 1204 | ||
1205 | vmctl = 0x80000C0F; /* 32-bit, 4k-size page */ | 1205 | vmctl = 0x80000C0F; /* 32-bit, 4k-size page */ |
1206 | #if BITS_PER_LONG == 64 | 1206 | ptp_phys_low = (u32)info->vm_pgt_phys; |
1207 | ptp_phys_low = info->vm_pgt_phys & ((1UL<<32)-1); | 1207 | ptp_phys_high = upper_32_bits(info->vm_pgt_phys); |
1208 | ptp_phys_high = (info->vm_pgt_phys>>32) & ((1UL<<32)-1); | 1208 | if (sizeof(void *) == 8) /* 64bit address */ |
1209 | vmctl |= (3<<8); | 1209 | vmctl |= (3 << 8); |
1210 | #elif BITS_PER_LONG == 32 | ||
1211 | ptp_phys_low = info->vm_pgt_phys & (~0UL); | ||
1212 | ptp_phys_high = 0; | ||
1213 | #else | ||
1214 | # error "Unknown BITS_PER_LONG!" | ||
1215 | #endif | ||
1216 | #if PAGE_SIZE == 8192 | ||
1217 | # error "Don't support 8k-page!" | ||
1218 | #endif | ||
1219 | /* Write page table physical address to all PTPAL registers */ | 1210 | /* Write page table physical address to all PTPAL registers */ |
1220 | for (i = 0; i < 64; i++) { | 1211 | for (i = 0; i < 64; i++) { |
1221 | hw_write_20kx(hw, VMEM_PTPAL+(16*i), ptp_phys_low); | 1212 | hw_write_20kx(hw, VMEM_PTPAL+(16*i), ptp_phys_low); |
diff --git a/sound/pci/ctxfi/ctvmem.c b/sound/pci/ctxfi/ctvmem.c index 363b67e3a9e7..74a03623d047 100644 --- a/sound/pci/ctxfi/ctvmem.c +++ b/sound/pci/ctxfi/ctvmem.c | |||
@@ -18,12 +18,11 @@ | |||
18 | #include "ctvmem.h" | 18 | #include "ctvmem.h" |
19 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
20 | #include <linux/mm.h> | 20 | #include <linux/mm.h> |
21 | #include <asm/page.h> /* for PAGE_SIZE macro definition */ | ||
22 | #include <linux/io.h> | 21 | #include <linux/io.h> |
23 | #include <asm/pgtable.h> | 22 | #include <asm/pgtable.h> |
24 | 23 | ||
25 | #define CT_PTES_PER_PAGE (PAGE_SIZE / sizeof(void *)) | 24 | #define CT_PTES_PER_PAGE (CT_PAGE_SIZE / sizeof(void *)) |
26 | #define CT_ADDRS_PER_PAGE (CT_PTES_PER_PAGE * PAGE_SIZE) | 25 | #define CT_ADDRS_PER_PAGE (CT_PTES_PER_PAGE * CT_PAGE_SIZE) |
27 | 26 | ||
28 | /* * | 27 | /* * |
29 | * Find or create vm block based on requested @size. | 28 | * Find or create vm block based on requested @size. |
@@ -138,24 +137,24 @@ ct_vm_map(struct ct_vm *vm, void *host_addr, int size) | |||
138 | return NULL; | 137 | return NULL; |
139 | } | 138 | } |
140 | 139 | ||
141 | start_phys = (virt_to_phys(host_addr) & PAGE_MASK); | 140 | start_phys = (virt_to_phys(host_addr) & CT_PAGE_MASK); |
142 | pages = (PAGE_ALIGN(virt_to_phys(host_addr) + size) | 141 | pages = (CT_PAGE_ALIGN(virt_to_phys(host_addr) + size) |
143 | - start_phys) >> PAGE_SHIFT; | 142 | - start_phys) >> CT_PAGE_SHIFT; |
144 | 143 | ||
145 | ptp = vm->ptp[0]; | 144 | ptp = vm->ptp[0]; |
146 | 145 | ||
147 | block = get_vm_block(vm, (pages << PAGE_SHIFT)); | 146 | block = get_vm_block(vm, (pages << CT_PAGE_SHIFT)); |
148 | if (block == NULL) { | 147 | if (block == NULL) { |
149 | printk(KERN_ERR "ctxfi: No virtual memory block that is big " | 148 | printk(KERN_ERR "ctxfi: No virtual memory block that is big " |
150 | "enough to allocate!\n"); | 149 | "enough to allocate!\n"); |
151 | return NULL; | 150 | return NULL; |
152 | } | 151 | } |
153 | 152 | ||
154 | pte_start = (block->addr >> PAGE_SHIFT); | 153 | pte_start = (block->addr >> CT_PAGE_SHIFT); |
155 | for (i = 0; i < pages; i++) | 154 | for (i = 0; i < pages; i++) |
156 | ptp[pte_start+i] = start_phys + (i << PAGE_SHIFT); | 155 | ptp[pte_start+i] = start_phys + (i << CT_PAGE_SHIFT); |
157 | 156 | ||
158 | block->addr += (virt_to_phys(host_addr) & (~PAGE_MASK)); | 157 | block->addr += (virt_to_phys(host_addr) & (~CT_PAGE_MASK)); |
159 | block->size = size; | 158 | block->size = size; |
160 | 159 | ||
161 | return block; | 160 | return block; |
@@ -164,9 +163,9 @@ ct_vm_map(struct ct_vm *vm, void *host_addr, int size) | |||
164 | static void ct_vm_unmap(struct ct_vm *vm, struct ct_vm_block *block) | 163 | static void ct_vm_unmap(struct ct_vm *vm, struct ct_vm_block *block) |
165 | { | 164 | { |
166 | /* do unmapping */ | 165 | /* do unmapping */ |
167 | block->size = ((block->addr + block->size + PAGE_SIZE - 1) | 166 | block->size = ((block->addr + block->size + CT_PAGE_SIZE - 1) |
168 | & PAGE_MASK) - (block->addr & PAGE_MASK); | 167 | & CT_PAGE_MASK) - (block->addr & CT_PAGE_MASK); |
169 | block->addr &= PAGE_MASK; | 168 | block->addr &= CT_PAGE_MASK; |
170 | put_vm_block(vm, block); | 169 | put_vm_block(vm, block); |
171 | } | 170 | } |
172 | 171 | ||
diff --git a/sound/pci/ctxfi/ctvmem.h b/sound/pci/ctxfi/ctvmem.h index 618952efa5b3..17d2d37a9ea7 100644 --- a/sound/pci/ctxfi/ctvmem.h +++ b/sound/pci/ctxfi/ctvmem.h | |||
@@ -23,6 +23,14 @@ | |||
23 | #include <linux/mutex.h> | 23 | #include <linux/mutex.h> |
24 | #include <linux/list.h> | 24 | #include <linux/list.h> |
25 | 25 | ||
26 | /* The chip can handle the page table of 4k pages | ||
27 | * (emu20k1 can handle even 8k pages, but we don't use it right now) | ||
28 | */ | ||
29 | #define CT_PAGE_SIZE 4096 | ||
30 | #define CT_PAGE_SHIFT 12 | ||
31 | #define CT_PAGE_MASK (~(PAGE_SIZE - 1)) | ||
32 | #define CT_PAGE_ALIGN(addr) ALIGN(addr, CT_PAGE_SIZE) | ||
33 | |||
26 | struct ct_vm_block { | 34 | struct ct_vm_block { |
27 | unsigned int addr; /* starting logical addr of this block */ | 35 | unsigned int addr; /* starting logical addr of this block */ |
28 | unsigned int size; /* size of this device virtual mem block */ | 36 | unsigned int size; /* size of this device virtual mem block */ |