11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _PARISC_MMZONE_H 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PARISC_MMZONE_H 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_DISCONTIGMEM 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_PHYSMEM_RANGES 8 /* Fix the size for now (current known max is 3) */ 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int npmem_ranges; 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct node_map_data { 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pg_data_t pg_data; 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern struct node_map_data node_data[]; 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NODE_DATA(nid) (&node_data[nid].pg_data) 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* We have these possible memory map layouts: 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Astro: 0-3.75, 67.75-68, 4-64 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * zx1: 0-1, 257-260, 4-256 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Stretch (N-class): 0-2, 4-32, 34-xxx 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Since each 1GB can only belong to one region (node), we can create 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * an index table for pfn to nid lookup; each entry in pfnnid_map 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * represents 1GB, and contains the node that the memory belongs to. */ 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PFNNID_SHIFT (30 - PAGE_SHIFT) 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PFNNID_MAP_MAX 512 /* support 512GB */ 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern unsigned char pfnnid_map[PFNNID_MAP_MAX]; 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 31513e7ecd695a4c0f95b9aa86c03ec9b7d2d09e03Helge Deller#ifndef CONFIG_64BIT 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pfn_is_io(pfn) ((pfn & (0xf0000000UL >> PAGE_SHIFT)) == (0xf0000000UL >> PAGE_SHIFT)) 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* io can be 0xf0f0f0f0f0xxxxxx or 0xfffffffff0000000 */ 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pfn_is_io(pfn) ((pfn & (0xf000000000000000UL >> PAGE_SHIFT)) == (0xf000000000000000UL >> PAGE_SHIFT)) 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int pfn_to_nid(unsigned long pfn) 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned int i; 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char r; 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (unlikely(pfn_is_io(pfn))) 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds i = pfn >> PFNNID_SHIFT; 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUG_ON(i >= sizeof(pfnnid_map) / sizeof(pfnnid_map[0])); 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds r = pfnnid_map[i]; 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUG_ON(r == 0xff); 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (int)r; 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int pfn_valid(int pfn) 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int nid = pfn_to_nid(pfn); 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (nid >= 0) 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (pfn < node_end_pfn(nid)); 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else /* !CONFIG_DISCONTIGMEM */ 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_PHYSMEM_RANGES 1 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* _PARISC_MMZONE_H */ 67