1fbe96f29SStephane Eranian #include <sys/types.h> 2fbe96f29SStephane Eranian #include <unistd.h> 3fbe96f29SStephane Eranian #include <stdio.h> 4fbe96f29SStephane Eranian #include <stdlib.h> 5fbe96f29SStephane Eranian #include <string.h> 6531d2410SArnaldo Carvalho de Melo #include <linux/stringify.h> 7379649cfSSukadev Bhattiprolu #include "header.h" 8379649cfSSukadev Bhattiprolu #include "util.h" 9fbe96f29SStephane Eranian 10fbe96f29SStephane Eranian #define mfspr(rn) ({unsigned long rval; \ 11fbe96f29SStephane Eranian asm volatile("mfspr %0," __stringify(rn) \ 12fbe96f29SStephane Eranian : "=r" (rval)); rval; }) 13fbe96f29SStephane Eranian 14fbe96f29SStephane Eranian #define SPRN_PVR 0x11F /* Processor Version Register */ 15fbe96f29SStephane Eranian #define PVR_VER(pvr) (((pvr) >> 16) & 0xFFFF) /* Version field */ 16fbe96f29SStephane Eranian #define PVR_REV(pvr) (((pvr) >> 0) & 0xFFFF) /* Revison field */ 17fbe96f29SStephane Eranian 18fbe96f29SStephane Eranian int 19fbe96f29SStephane Eranian get_cpuid(char *buffer, size_t sz) 20fbe96f29SStephane Eranian { 21fbe96f29SStephane Eranian unsigned long pvr; 22fbe96f29SStephane Eranian int nb; 23fbe96f29SStephane Eranian 24fbe96f29SStephane Eranian pvr = mfspr(SPRN_PVR); 25fbe96f29SStephane Eranian 26e7f01d1eSArnaldo Carvalho de Melo nb = scnprintf(buffer, sz, "%lu,%lu$", PVR_VER(pvr), PVR_REV(pvr)); 27fbe96f29SStephane Eranian 28fbe96f29SStephane Eranian /* look for end marker to ensure the entire data fit */ 29fbe96f29SStephane Eranian if (strchr(buffer, '$')) { 30fbe96f29SStephane Eranian buffer[nb-1] = '\0'; 31fbe96f29SStephane Eranian return 0; 32fbe96f29SStephane Eranian } 33fbe96f29SStephane Eranian return -1; 34fbe96f29SStephane Eranian } 35ce88f27cSSukadev Bhattiprolu 36ce88f27cSSukadev Bhattiprolu char * 37ce88f27cSSukadev Bhattiprolu get_cpuid_str(void) 38ce88f27cSSukadev Bhattiprolu { 39ce88f27cSSukadev Bhattiprolu char *bufp; 40ce88f27cSSukadev Bhattiprolu 41ce88f27cSSukadev Bhattiprolu if (asprintf(&bufp, "%.8lx", mfspr(SPRN_PVR)) < 0) 42ce88f27cSSukadev Bhattiprolu bufp = NULL; 43ce88f27cSSukadev Bhattiprolu 44ce88f27cSSukadev Bhattiprolu return bufp; 45ce88f27cSSukadev Bhattiprolu } 46