loongson_ipi_common.h 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * Loongson ipi interrupt header files
  4. *
  5. * Copyright (C) 2021 Loongson Technology Corporation Limited
  6. */
  7. #ifndef HW_LOONGSON_IPI_COMMON_H
  8. #define HW_LOONGSON_IPI_COMMON_H
  9. #include "qom/object.h"
  10. #include "hw/sysbus.h"
  11. #include "exec/memattrs.h"
  12. #define IPI_MBX_NUM 4
  13. #define TYPE_LOONGSON_IPI_COMMON "loongson_ipi_common"
  14. OBJECT_DECLARE_TYPE(LoongsonIPICommonState,
  15. LoongsonIPICommonClass, LOONGSON_IPI_COMMON)
  16. typedef struct IPICore {
  17. LoongsonIPICommonState *ipi;
  18. uint32_t status;
  19. uint32_t en;
  20. uint32_t set;
  21. uint32_t clear;
  22. /* 64bit buf divide into 2 32-bit buf */
  23. uint32_t buf[IPI_MBX_NUM * 2];
  24. qemu_irq irq;
  25. uint64_t arch_id;
  26. CPUState *cpu;
  27. } IPICore;
  28. struct LoongsonIPICommonState {
  29. SysBusDevice parent_obj;
  30. MemoryRegion ipi_iocsr_mem;
  31. MemoryRegion ipi64_iocsr_mem;
  32. uint32_t num_cpu;
  33. IPICore *cpu;
  34. };
  35. struct LoongsonIPICommonClass {
  36. SysBusDeviceClass parent_class;
  37. DeviceRealize parent_realize;
  38. DeviceUnrealize parent_unrealize;
  39. AddressSpace *(*get_iocsr_as)(CPUState *cpu);
  40. int (*cpu_by_arch_id)(LoongsonIPICommonState *lics, int64_t id,
  41. int *index, CPUState **pcs);
  42. };
  43. MemTxResult loongson_ipi_core_readl(void *opaque, hwaddr addr, uint64_t *data,
  44. unsigned size, MemTxAttrs attrs);
  45. MemTxResult loongson_ipi_core_writel(void *opaque, hwaddr addr, uint64_t val,
  46. unsigned size, MemTxAttrs attrs);
  47. /* Mainy used by iocsr read and write */
  48. #define SMP_IPI_MAILBOX 0x1000ULL
  49. #define CORE_STATUS_OFF 0x0
  50. #define CORE_EN_OFF 0x4
  51. #define CORE_SET_OFF 0x8
  52. #define CORE_CLEAR_OFF 0xc
  53. #define CORE_BUF_20 0x20
  54. #define CORE_BUF_28 0x28
  55. #define CORE_BUF_30 0x30
  56. #define CORE_BUF_38 0x38
  57. #define IOCSR_IPI_SEND 0x40
  58. #define IOCSR_MAIL_SEND 0x48
  59. #define IOCSR_ANY_SEND 0x158
  60. #define MAIL_SEND_ADDR (SMP_IPI_MAILBOX + IOCSR_MAIL_SEND)
  61. #define MAIL_SEND_OFFSET 0
  62. #define ANY_SEND_OFFSET (IOCSR_ANY_SEND - IOCSR_MAIL_SEND)
  63. #endif