1 #ifndef _SYSTEMCFG_H 2 #define _SYSTEMCFG_H 3 4 /* 5 * Copyright (C) 2002 Peter Bergner <bergner@vnet.ibm.com>, IBM 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 10 * 2 of the License, or (at your option) any later version. 11 */ 12 13 /* Change Activity: 14 * 2002/09/30 : bergner : Created 15 * End Change Activity 16 */ 17 18 19 #ifndef __KERNEL__ 20 #include <unistd.h> 21 #include <fcntl.h> 22 #include <sys/mman.h> 23 #include <linux/types.h> 24 #endif 25 26 /* 27 * If the major version changes we are incompatible. 28 * Minor version changes are a hint. 29 */ 30 #define SYSTEMCFG_MAJOR 1 31 #define SYSTEMCFG_MINOR 0 32 33 struct systemcfg { 34 __u8 eye_catcher[16]; /* Eyecatcher: SYSTEMCFG:PPC64 0x00 */ 35 struct { /* Systemcfg version numbers */ 36 __u32 major; /* Major number 0x10 */ 37 __u32 minor; /* Minor number 0x14 */ 38 } version; 39 40 __u32 platform; /* Platform flags 0x18 */ 41 __u32 processor; /* Processor type 0x1C */ 42 __u64 processorCount; /* # of physical processors 0x20 */ 43 __u64 physicalMemorySize; /* Size of real memory(B) 0x28 */ 44 __u64 tb_orig_stamp; /* Timebase at boot 0x30 */ 45 __u64 tb_ticks_per_sec; /* Timebase tics / sec 0x38 */ 46 __u64 tb_to_xs; /* Inverse of TB to 2^20 0x40 */ 47 __u64 stamp_xsec; /* 0x48 */ 48 __u64 tb_update_count; /* Timebase atomicity ctr 0x50 */ 49 __u32 tz_minuteswest; /* Minutes west of Greenwich 0x58 */ 50 __u32 tz_dsttime; /* Type of dst correction 0x5C */ 51 __u32 dCacheL1Size; /* L1 d-cache size 0x60 */ 52 __u32 dCacheL1LineSize; /* L1 d-cache line size 0x64 */ 53 __u32 iCacheL1Size; /* L1 i-cache size 0x68 */ 54 __u32 iCacheL1LineSize; /* L1 i-cache line size 0x6C */ 55 __u8 reserved0[3984]; /* Reserve rest of page 0x70 */ 56 }; 57 58 #ifdef __KERNEL__ 59 extern struct systemcfg *systemcfg; 60 #else 61 62 /* Processor Version Register (PVR) field extraction */ 63 #define PVR_VER(pvr) (((pvr) >> 16) & 0xFFFF) /* Version field */ 64 #define PVR_REV(pvr) (((pvr) >> 0) & 0xFFFF) /* Revison field */ 65 66 /* Processor Version Numbers */ 67 #define PV_NORTHSTAR 0x0033 68 #define PV_PULSAR 0x0034 69 #define PV_POWER4 0x0035 70 #define PV_ICESTAR 0x0036 71 #define PV_SSTAR 0x0037 72 #define PV_POWER4p 0x0038 73 #define PV_POWER4ul 0x0039 74 #define PV_630 0x0040 75 #define PV_630p 0x0041 76 77 /* Platforms supported by PPC64 */ 78 #define PLATFORM_PSERIES 0x0100 79 #define PLATFORM_PSERIES_LPAR 0x0101 80 #define PLATFORM_ISERIES_LPAR 0x0201 81 82 systemcfg_init(void)83static inline volatile struct systemcfg *systemcfg_init(void) 84 { 85 int fd = open("/proc/ppc64/systemcfg", O_RDONLY); 86 volatile struct systemcfg *ret; 87 88 if (fd == -1) 89 return 0; 90 ret = mmap(0, sizeof(struct systemcfg), PROT_READ, MAP_SHARED, fd, 0); 91 close(fd); 92 if (!ret) 93 return 0; 94 if (ret->version.major != SYSTEMCFG_MAJOR || ret->version.minor < SYSTEMCFG_MINOR) { 95 munmap((void *)ret, sizeof(struct systemcfg)); 96 return 0; 97 } 98 return ret; 99 } 100 #endif /* __KERNEL__ */ 101 102 #endif /* _SYSTEMCFG_H */ 103