lsdc_probe.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2023 Loongson Technology Corporation Limited
  4. */
  5. #include "lsdc_drv.h"
  6. #include "lsdc_probe.h"
  7. /*
  8. * Processor ID (implementation) values for bits 15:8 of the PRID register.
  9. */
  10. #define LOONGSON_CPU_IMP_MASK 0xff00
  11. #define LOONGSON_CPU_IMP_SHIFT 8
  12. #define LOONGARCH_CPU_IMP_LS2K1000 0xa0
  13. #define LOONGARCH_CPU_IMP_LS2K2000 0xb0
  14. #define LOONGARCH_CPU_IMP_LS3A5000 0xc0
  15. #define LOONGSON_CPU_MIPS_IMP_LS2K 0x61 /* Loongson 2K Mips series SoC */
  16. /*
  17. * Particular Revision values for bits 7:0 of the PRID register.
  18. */
  19. #define LOONGSON_CPU_REV_MASK 0x00ff
  20. #define LOONGARCH_CPUCFG_PRID_REG 0x0
  21. /*
  22. * We can achieve fine-grained control with the information about the host.
  23. */
  24. unsigned int loongson_cpu_get_prid(u8 *imp, u8 *rev)
  25. {
  26. unsigned int prid = 0;
  27. #if defined(__loongarch__)
  28. __asm__ volatile("cpucfg %0, %1\n\t"
  29. : "=&r"(prid)
  30. : "r"(LOONGARCH_CPUCFG_PRID_REG)
  31. );
  32. #endif
  33. #if defined(__mips__)
  34. __asm__ volatile("mfc0\t%0, $15\n\t"
  35. : "=r" (prid)
  36. );
  37. #endif
  38. if (imp)
  39. *imp = (prid & LOONGSON_CPU_IMP_MASK) >> LOONGSON_CPU_IMP_SHIFT;
  40. if (rev)
  41. *rev = prid & LOONGSON_CPU_REV_MASK;
  42. return prid;
  43. }