kvm_eiointc.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2024 Loongson Technology Corporation Limited
  4. */
  5. #ifndef __ASM_KVM_EIOINTC_H
  6. #define __ASM_KVM_EIOINTC_H
  7. #include <kvm/iodev.h>
  8. #define EIOINTC_IRQS 256
  9. #define EIOINTC_ROUTE_MAX_VCPUS 256
  10. #define EIOINTC_IRQS_U64_NUMS (EIOINTC_IRQS / 64)
  11. /* map to ipnum per 32 irqs */
  12. #define EIOINTC_IRQS_NODETYPE_COUNT 16
  13. #define EIOINTC_BASE 0x1400
  14. #define EIOINTC_SIZE 0x900
  15. #define EIOINTC_NODETYPE_START 0xa0
  16. #define EIOINTC_NODETYPE_END 0xbf
  17. #define EIOINTC_IPMAP_START 0xc0
  18. #define EIOINTC_IPMAP_END 0xc7
  19. #define EIOINTC_ENABLE_START 0x200
  20. #define EIOINTC_ENABLE_END 0x21f
  21. #define EIOINTC_BOUNCE_START 0x280
  22. #define EIOINTC_BOUNCE_END 0x29f
  23. #define EIOINTC_ISR_START 0x300
  24. #define EIOINTC_ISR_END 0x31f
  25. #define EIOINTC_COREISR_START 0x400
  26. #define EIOINTC_COREISR_END 0x41f
  27. #define EIOINTC_COREMAP_START 0x800
  28. #define EIOINTC_COREMAP_END 0x8ff
  29. #define EIOINTC_VIRT_BASE (0x40000000)
  30. #define EIOINTC_VIRT_SIZE (0x1000)
  31. #define EIOINTC_VIRT_FEATURES (0x0)
  32. #define EIOINTC_HAS_VIRT_EXTENSION (0)
  33. #define EIOINTC_HAS_ENABLE_OPTION (1)
  34. #define EIOINTC_HAS_INT_ENCODE (2)
  35. #define EIOINTC_HAS_CPU_ENCODE (3)
  36. #define EIOINTC_VIRT_HAS_FEATURES ((1U << EIOINTC_HAS_VIRT_EXTENSION) \
  37. | (1U << EIOINTC_HAS_ENABLE_OPTION) \
  38. | (1U << EIOINTC_HAS_INT_ENCODE) \
  39. | (1U << EIOINTC_HAS_CPU_ENCODE))
  40. #define EIOINTC_VIRT_CONFIG (0x4)
  41. #define EIOINTC_ENABLE (1)
  42. #define EIOINTC_ENABLE_INT_ENCODE (2)
  43. #define EIOINTC_ENABLE_CPU_ENCODE (3)
  44. #define LOONGSON_IP_NUM 8
  45. struct loongarch_eiointc {
  46. spinlock_t lock;
  47. struct kvm *kvm;
  48. struct kvm_io_device device;
  49. struct kvm_io_device device_vext;
  50. uint32_t num_cpu;
  51. uint32_t features;
  52. uint32_t status;
  53. /* hardware state */
  54. u64 nodetype[EIOINTC_IRQS_NODETYPE_COUNT / 4];
  55. /* one bit shows the state of one irq */
  56. u64 bounce[EIOINTC_IRQS_U64_NUMS];
  57. u64 isr[EIOINTC_IRQS_U64_NUMS];
  58. u64 coreisr[EIOINTC_ROUTE_MAX_VCPUS][EIOINTC_IRQS_U64_NUMS];
  59. u64 enable[EIOINTC_IRQS_U64_NUMS];
  60. /* use one byte to config ipmap for 32 irqs at once */
  61. u64 ipmap;
  62. /* use one byte to config coremap for one irq */
  63. u64 coremap[EIOINTC_IRQS / 8];
  64. DECLARE_BITMAP(sw_coreisr[EIOINTC_ROUTE_MAX_VCPUS][LOONGSON_IP_NUM], EIOINTC_IRQS);
  65. uint8_t sw_coremap[EIOINTC_IRQS];
  66. };
  67. int kvm_loongarch_register_eiointc_device(void);
  68. void eiointc_set_irq(struct loongarch_eiointc *s, int irq, int level);
  69. #endif /* __ASM_KVM_EIOINTC_H */