| /* |
| * linux/include/asm-sh/mmzone.h |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| */ |
| #ifndef __ASM_SH_MMZONE_H |
| #define __ASM_SH_MMZONE_H |
| |
| #include <linux/config.h> |
| |
| #ifdef CONFIG_DISCONTIGMEM |
| |
| /* Currently, just for HP690 */ |
| #define PHYSADDR_TO_NID(phys) ((((phys) - __MEMORY_START) >= 0x01000000)?1:0) |
| |
| extern pg_data_t discontig_page_data[MAX_NUMNODES]; |
| extern bootmem_data_t discontig_node_bdata[MAX_NUMNODES]; |
| |
| /* |
| * Following are macros that each numa implmentation must define. |
| */ |
| |
| /* |
| * Given a kernel address, find the home node of the underlying memory. |
| */ |
| #define KVADDR_TO_NID(kaddr) PHYSADDR_TO_NID(__pa(kaddr)) |
| |
| /* |
| * Return a pointer to the node data for node n. |
| */ |
| #define NODE_DATA(nid) (&discontig_page_data[nid]) |
| |
| /* |
| * NODE_MEM_MAP gives the kaddr for the mem_map of the node. |
| */ |
| #define NODE_MEM_MAP(nid) (NODE_DATA(nid)->node_mem_map) |
| |
| #define phys_to_page(phys) \ |
| ({ unsigned int node = PHYSADDR_TO_NID(phys); \ |
| NODE_MEM_MAP(node) \ |
| + (((phys) - NODE_DATA(node)->node_start_paddr) >> PAGE_SHIFT); }) |
| |
| static inline int is_valid_page(struct page *page) |
| { |
| unsigned int i; |
| |
| for (i = 0; i < MAX_NUMNODES; i++) { |
| if (page >= NODE_MEM_MAP(i) && |
| page < NODE_MEM_MAP(i) + NODE_DATA(i)->node_size) |
| return 1; |
| } |
| return 0; |
| } |
| |
| #define VALID_PAGE(page) is_valid_page(page) |
| #define page_to_phys(page) PHYSADDR(page_address(page)) |
| |
| #endif /* CONFIG_DISCONTIGMEM */ |
| #endif |