Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc

Pull sparc updates from David Miller:
"Just a couple of fixes/cleanups:

- Correct NUMA latency calculations on sparc64, from Nitin Gupta.

- ASI_ST_BLKINIT_MRU_S value was wrong, from Rob Gardner.

- Fix non-faulting load handling of non-quad values, also from Rob
Gardner.

- Cleanup VISsave assembler, from Sam Ravnborg.

- Fix iommu-common code so it doesn't emit rediculous warnings on
some architectures, particularly ARM"

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc:
sparc64: Fix numa distance values
sparc64: Don't restrict fp regs for no-fault loads
iommu-common: Fix error code used in iommu_tbl_range_{alloc,free}().
sparc64: use ENTRY/ENDPROC in VISsave
sparc64: Fix incorrect ASI_ST_BLKINIT_MRU_S value

+113 -37
+3
arch/sparc/include/asm/topology_64.h
··· 31 31 cpu_all_mask : \ 32 32 cpumask_of_node(pcibus_to_node(bus))) 33 33 34 + int __node_distance(int, int); 35 + #define node_distance(a, b) __node_distance(a, b) 36 + 34 37 #else /* CONFIG_NUMA */ 35 38 36 39 #include <asm-generic/topology.h>
+1 -1
arch/sparc/include/uapi/asm/asi.h
··· 279 279 * Most-Recently-Used, primary, 280 280 * implicit 281 281 */ 282 - #define ASI_ST_BLKINIT_MRU_S 0xf2 /* (NG4) init-store, twin load, 282 + #define ASI_ST_BLKINIT_MRU_S 0xf3 /* (NG4) init-store, twin load, 283 283 * Most-Recently-Used, secondary, 284 284 * implicit 285 285 */
+6 -6
arch/sparc/kernel/iommu.c
··· 161 161 162 162 entry = iommu_tbl_range_alloc(dev, &iommu->tbl, npages, NULL, 163 163 (unsigned long)(-1), 0); 164 - if (unlikely(entry == DMA_ERROR_CODE)) 164 + if (unlikely(entry == IOMMU_ERROR_CODE)) 165 165 return NULL; 166 166 167 167 return iommu->page_table + entry; ··· 253 253 npages = IO_PAGE_ALIGN(size) >> IO_PAGE_SHIFT; 254 254 iommu = dev->archdata.iommu; 255 255 256 - iommu_tbl_range_free(&iommu->tbl, dvma, npages, DMA_ERROR_CODE); 256 + iommu_tbl_range_free(&iommu->tbl, dvma, npages, IOMMU_ERROR_CODE); 257 257 258 258 order = get_order(size); 259 259 if (order < 10) ··· 426 426 iommu_free_ctx(iommu, ctx); 427 427 spin_unlock_irqrestore(&iommu->lock, flags); 428 428 429 - iommu_tbl_range_free(&iommu->tbl, bus_addr, npages, DMA_ERROR_CODE); 429 + iommu_tbl_range_free(&iommu->tbl, bus_addr, npages, IOMMU_ERROR_CODE); 430 430 } 431 431 432 432 static int dma_4u_map_sg(struct device *dev, struct scatterlist *sglist, ··· 492 492 &handle, (unsigned long)(-1), 0); 493 493 494 494 /* Handle failure */ 495 - if (unlikely(entry == DMA_ERROR_CODE)) { 495 + if (unlikely(entry == IOMMU_ERROR_CODE)) { 496 496 if (printk_ratelimit()) 497 497 printk(KERN_INFO "iommu_alloc failed, iommu %p paddr %lx" 498 498 " npages %lx\n", iommu, paddr, npages); ··· 571 571 iopte_make_dummy(iommu, base + j); 572 572 573 573 iommu_tbl_range_free(&iommu->tbl, vaddr, npages, 574 - DMA_ERROR_CODE); 574 + IOMMU_ERROR_CODE); 575 575 576 576 s->dma_address = DMA_ERROR_CODE; 577 577 s->dma_length = 0; ··· 648 648 iopte_make_dummy(iommu, base + i); 649 649 650 650 iommu_tbl_range_free(&iommu->tbl, dma_handle, npages, 651 - DMA_ERROR_CODE); 651 + IOMMU_ERROR_CODE); 652 652 sg = sg_next(sg); 653 653 } 654 654
+1 -1
arch/sparc/kernel/ldc.c
··· 1953 1953 1954 1954 entry = iommu_tbl_range_alloc(NULL, &iommu->iommu_map_table, 1955 1955 npages, NULL, (unsigned long)-1, 0); 1956 - if (unlikely(entry < 0)) 1956 + if (unlikely(entry == IOMMU_ERROR_CODE)) 1957 1957 return NULL; 1958 1958 1959 1959 return iommu->page_table + entry;
+9 -9
arch/sparc/kernel/pci_sun4v.c
··· 159 159 entry = iommu_tbl_range_alloc(dev, &iommu->tbl, npages, NULL, 160 160 (unsigned long)(-1), 0); 161 161 162 - if (unlikely(entry == DMA_ERROR_CODE)) 162 + if (unlikely(entry == IOMMU_ERROR_CODE)) 163 163 goto range_alloc_fail; 164 164 165 165 *dma_addrp = (iommu->tbl.table_map_base + (entry << IO_PAGE_SHIFT)); ··· 187 187 return ret; 188 188 189 189 iommu_map_fail: 190 - iommu_tbl_range_free(&iommu->tbl, *dma_addrp, npages, DMA_ERROR_CODE); 190 + iommu_tbl_range_free(&iommu->tbl, *dma_addrp, npages, IOMMU_ERROR_CODE); 191 191 192 192 range_alloc_fail: 193 193 free_pages(first_page, order); ··· 226 226 devhandle = pbm->devhandle; 227 227 entry = ((dvma - iommu->tbl.table_map_base) >> IO_PAGE_SHIFT); 228 228 dma_4v_iommu_demap(&devhandle, entry, npages); 229 - iommu_tbl_range_free(&iommu->tbl, dvma, npages, DMA_ERROR_CODE); 229 + iommu_tbl_range_free(&iommu->tbl, dvma, npages, IOMMU_ERROR_CODE); 230 230 order = get_order(size); 231 231 if (order < 10) 232 232 free_pages((unsigned long)cpu, order); ··· 256 256 entry = iommu_tbl_range_alloc(dev, &iommu->tbl, npages, NULL, 257 257 (unsigned long)(-1), 0); 258 258 259 - if (unlikely(entry == DMA_ERROR_CODE)) 259 + if (unlikely(entry == IOMMU_ERROR_CODE)) 260 260 goto bad; 261 261 262 262 bus_addr = (iommu->tbl.table_map_base + (entry << IO_PAGE_SHIFT)); ··· 288 288 return DMA_ERROR_CODE; 289 289 290 290 iommu_map_fail: 291 - iommu_tbl_range_free(&iommu->tbl, bus_addr, npages, DMA_ERROR_CODE); 291 + iommu_tbl_range_free(&iommu->tbl, bus_addr, npages, IOMMU_ERROR_CODE); 292 292 return DMA_ERROR_CODE; 293 293 } 294 294 ··· 317 317 bus_addr &= IO_PAGE_MASK; 318 318 entry = (bus_addr - iommu->tbl.table_map_base) >> IO_PAGE_SHIFT; 319 319 dma_4v_iommu_demap(&devhandle, entry, npages); 320 - iommu_tbl_range_free(&iommu->tbl, bus_addr, npages, DMA_ERROR_CODE); 320 + iommu_tbl_range_free(&iommu->tbl, bus_addr, npages, IOMMU_ERROR_CODE); 321 321 } 322 322 323 323 static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist, ··· 376 376 &handle, (unsigned long)(-1), 0); 377 377 378 378 /* Handle failure */ 379 - if (unlikely(entry == DMA_ERROR_CODE)) { 379 + if (unlikely(entry == IOMMU_ERROR_CODE)) { 380 380 if (printk_ratelimit()) 381 381 printk(KERN_INFO "iommu_alloc failed, iommu %p paddr %lx" 382 382 " npages %lx\n", iommu, paddr, npages); ··· 451 451 npages = iommu_num_pages(s->dma_address, s->dma_length, 452 452 IO_PAGE_SIZE); 453 453 iommu_tbl_range_free(&iommu->tbl, vaddr, npages, 454 - DMA_ERROR_CODE); 454 + IOMMU_ERROR_CODE); 455 455 /* XXX demap? XXX */ 456 456 s->dma_address = DMA_ERROR_CODE; 457 457 s->dma_length = 0; ··· 496 496 entry = ((dma_handle - tbl->table_map_base) >> shift); 497 497 dma_4v_iommu_demap(&devhandle, entry, npages); 498 498 iommu_tbl_range_free(&iommu->tbl, dma_handle, npages, 499 - DMA_ERROR_CODE); 499 + IOMMU_ERROR_CODE); 500 500 sg = sg_next(sg); 501 501 } 502 502
+15 -7
arch/sparc/kernel/unaligned_64.c
··· 436 436 int handle_ldf_stq(u32 insn, struct pt_regs *regs) 437 437 { 438 438 unsigned long addr = compute_effective_address(regs, insn, 0); 439 - int freg = ((insn >> 25) & 0x1e) | ((insn >> 20) & 0x20); 439 + int freg; 440 440 struct fpustate *f = FPUSTATE; 441 441 int asi = decode_asi(insn, regs); 442 - int flag = (freg < 32) ? FPRS_DL : FPRS_DU; 442 + int flag; 443 443 444 444 perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, 0); 445 445 446 446 save_and_clear_fpu(); 447 447 current_thread_info()->xfsr[0] &= ~0x1c000; 448 - if (freg & 3) { 449 - current_thread_info()->xfsr[0] |= (6 << 14) /* invalid_fp_register */; 450 - do_fpother(regs); 451 - return 0; 452 - } 453 448 if (insn & 0x200000) { 454 449 /* STQ */ 455 450 u64 first = 0, second = 0; 456 451 452 + freg = ((insn >> 25) & 0x1e) | ((insn >> 20) & 0x20); 453 + flag = (freg < 32) ? FPRS_DL : FPRS_DU; 454 + if (freg & 3) { 455 + current_thread_info()->xfsr[0] |= (6 << 14) /* invalid_fp_register */; 456 + do_fpother(regs); 457 + return 0; 458 + } 457 459 if (current_thread_info()->fpsaved[0] & flag) { 458 460 first = *(u64 *)&f->regs[freg]; 459 461 second = *(u64 *)&f->regs[freg+2]; ··· 515 513 case 0x100000: size = 4; break; 516 514 default: size = 2; break; 517 515 } 516 + if (size == 1) 517 + freg = (insn >> 25) & 0x1f; 518 + else 519 + freg = ((insn >> 25) & 0x1e) | ((insn >> 20) & 0x20); 520 + flag = (freg < 32) ? FPRS_DL : FPRS_DU; 521 + 518 522 for (i = 0; i < size; i++) 519 523 data[i] = 0; 520 524
+5 -5
arch/sparc/lib/VISsave.S
··· 6 6 * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz) 7 7 */ 8 8 9 + #include <linux/linkage.h> 10 + 9 11 #include <asm/asi.h> 10 12 #include <asm/page.h> 11 13 #include <asm/ptrace.h> 12 14 #include <asm/visasm.h> 13 15 #include <asm/thread_info.h> 14 - 15 - .text 16 - .globl VISenter, VISenterhalf 17 16 18 17 /* On entry: %o5=current FPRS value, %g7 is callers address */ 19 18 /* May clobber %o5, %g1, %g2, %g3, %g7, %icc, %xcc */ ··· 20 21 /* Nothing special need be done here to handle pre-emption, this 21 22 * FPU save/restore mechanism is already preemption safe. 22 23 */ 23 - 24 + .text 24 25 .align 32 25 - VISenter: 26 + ENTRY(VISenter) 26 27 ldub [%g6 + TI_FPDEPTH], %g1 27 28 brnz,a,pn %g1, 1f 28 29 cmp %g1, 1 ··· 78 79 .align 32 79 80 80: jmpl %g7 + %g0, %g0 80 81 nop 82 + ENDPROC(VISenter)
+69 -1
arch/sparc/mm/init_64.c
··· 93 93 static struct linux_prom64_registers pavail[MAX_BANKS]; 94 94 static int pavail_ents; 95 95 96 + u64 numa_latency[MAX_NUMNODES][MAX_NUMNODES]; 97 + 96 98 static int cmp_p64(const void *a, const void *b) 97 99 { 98 100 const struct linux_prom64_registers *x = a, *y = b; ··· 1159 1157 return NULL; 1160 1158 } 1161 1159 1160 + int __node_distance(int from, int to) 1161 + { 1162 + if ((from >= MAX_NUMNODES) || (to >= MAX_NUMNODES)) { 1163 + pr_warn("Returning default NUMA distance value for %d->%d\n", 1164 + from, to); 1165 + return (from == to) ? LOCAL_DISTANCE : REMOTE_DISTANCE; 1166 + } 1167 + return numa_latency[from][to]; 1168 + } 1169 + 1170 + static int find_best_numa_node_for_mlgroup(struct mdesc_mlgroup *grp) 1171 + { 1172 + int i; 1173 + 1174 + for (i = 0; i < MAX_NUMNODES; i++) { 1175 + struct node_mem_mask *n = &node_masks[i]; 1176 + 1177 + if ((grp->mask == n->mask) && (grp->match == n->val)) 1178 + break; 1179 + } 1180 + return i; 1181 + } 1182 + 1183 + static void find_numa_latencies_for_group(struct mdesc_handle *md, u64 grp, 1184 + int index) 1185 + { 1186 + u64 arc; 1187 + 1188 + mdesc_for_each_arc(arc, md, grp, MDESC_ARC_TYPE_FWD) { 1189 + int tnode; 1190 + u64 target = mdesc_arc_target(md, arc); 1191 + struct mdesc_mlgroup *m = find_mlgroup(target); 1192 + 1193 + if (!m) 1194 + continue; 1195 + tnode = find_best_numa_node_for_mlgroup(m); 1196 + if (tnode == MAX_NUMNODES) 1197 + continue; 1198 + numa_latency[index][tnode] = m->latency; 1199 + } 1200 + } 1201 + 1162 1202 static int __init numa_attach_mlgroup(struct mdesc_handle *md, u64 grp, 1163 1203 int index) 1164 1204 { ··· 1264 1220 static int __init numa_parse_mdesc(void) 1265 1221 { 1266 1222 struct mdesc_handle *md = mdesc_grab(); 1267 - int i, err, count; 1223 + int i, j, err, count; 1268 1224 u64 node; 1225 + 1226 + /* Some sane defaults for numa latency values */ 1227 + for (i = 0; i < MAX_NUMNODES; i++) { 1228 + for (j = 0; j < MAX_NUMNODES; j++) 1229 + numa_latency[i][j] = (i == j) ? 1230 + LOCAL_DISTANCE : REMOTE_DISTANCE; 1231 + } 1269 1232 1270 1233 node = mdesc_node_by_name(md, MDESC_NODE_NULL, "latency-groups"); 1271 1234 if (node == MDESC_NODE_NULL) { ··· 1294 1243 if (err < 0) 1295 1244 break; 1296 1245 count++; 1246 + } 1247 + 1248 + count = 0; 1249 + mdesc_for_each_node_by_name(md, node, "group") { 1250 + find_numa_latencies_for_group(md, node, count); 1251 + count++; 1252 + } 1253 + 1254 + /* Normalize numa latency matrix according to ACPI SLIT spec. */ 1255 + for (i = 0; i < MAX_NUMNODES; i++) { 1256 + u64 self_latency = numa_latency[i][i]; 1257 + 1258 + for (j = 0; j < MAX_NUMNODES; j++) { 1259 + numa_latency[i][j] = 1260 + (numa_latency[i][j] * LOCAL_DISTANCE) / 1261 + self_latency; 1262 + } 1297 1263 } 1298 1264 1299 1265 add_node_ranges();
+1
include/linux/iommu-common.h
··· 7 7 8 8 #define IOMMU_POOL_HASHBITS 4 9 9 #define IOMMU_NR_POOLS (1 << IOMMU_POOL_HASHBITS) 10 + #define IOMMU_ERROR_CODE (~(unsigned long) 0) 10 11 11 12 struct iommu_pool { 12 13 unsigned long start;
+3 -7
lib/iommu-common.c
··· 11 11 #include <linux/dma-mapping.h> 12 12 #include <linux/hash.h> 13 13 14 - #ifndef DMA_ERROR_CODE 15 - #define DMA_ERROR_CODE (~(dma_addr_t)0x0) 16 - #endif 17 - 18 14 static unsigned long iommu_large_alloc = 15; 19 15 20 16 static DEFINE_PER_CPU(unsigned int, iommu_hash_common); ··· 119 123 /* Sanity check */ 120 124 if (unlikely(npages == 0)) { 121 125 WARN_ON_ONCE(1); 122 - return DMA_ERROR_CODE; 126 + return IOMMU_ERROR_CODE; 123 127 } 124 128 125 129 if (largealloc) { ··· 202 206 goto again; 203 207 } else { 204 208 /* give up */ 205 - n = DMA_ERROR_CODE; 209 + n = IOMMU_ERROR_CODE; 206 210 goto bail; 207 211 } 208 212 } ··· 255 259 unsigned long flags; 256 260 unsigned long shift = iommu->table_shift; 257 261 258 - if (entry == DMA_ERROR_CODE) /* use default addr->entry mapping */ 262 + if (entry == IOMMU_ERROR_CODE) /* use default addr->entry mapping */ 259 263 entry = (dma_addr - iommu->table_map_base) >> shift; 260 264 pool = get_pool(iommu, entry); 261 265