vendor_extensions.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright 2024 Rivos, Inc
  4. */
  5. #include <asm/vendorid_list.h>
  6. #include <asm/vendor_extensions.h>
  7. #include <asm/vendor_extensions/andes.h>
  8. #include <linux/array_size.h>
  9. #include <linux/types.h>
  10. struct riscv_isa_vendor_ext_data_list *riscv_isa_vendor_ext_list[] = {
  11. #ifdef CONFIG_RISCV_ISA_VENDOR_EXT_ANDES
  12. &riscv_isa_vendor_ext_list_andes,
  13. #endif
  14. };
  15. const size_t riscv_isa_vendor_ext_list_size = ARRAY_SIZE(riscv_isa_vendor_ext_list);
  16. /**
  17. * __riscv_isa_vendor_extension_available() - Check whether given vendor
  18. * extension is available or not.
  19. *
  20. * @cpu: check if extension is available on this cpu
  21. * @vendor: vendor that the extension is a member of
  22. * @bit: bit position of the desired extension
  23. * Return: true or false
  24. *
  25. * NOTE: When cpu is -1, will check if extension is available on all cpus
  26. */
  27. bool __riscv_isa_vendor_extension_available(int cpu, unsigned long vendor, unsigned int bit)
  28. {
  29. struct riscv_isavendorinfo *bmap;
  30. struct riscv_isavendorinfo *cpu_bmap;
  31. switch (vendor) {
  32. #ifdef CONFIG_RISCV_ISA_VENDOR_EXT_ANDES
  33. case ANDES_VENDOR_ID:
  34. bmap = &riscv_isa_vendor_ext_list_andes.all_harts_isa_bitmap;
  35. cpu_bmap = riscv_isa_vendor_ext_list_andes.per_hart_isa_bitmap;
  36. break;
  37. #endif
  38. default:
  39. return false;
  40. }
  41. if (cpu != -1)
  42. bmap = &cpu_bmap[cpu];
  43. if (bit >= RISCV_ISA_VENDOR_EXT_MAX)
  44. return false;
  45. return test_bit(bit, bmap->isa) ? true : false;
  46. }
  47. EXPORT_SYMBOL_GPL(__riscv_isa_vendor_extension_available);