opal-wrappers.S 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. * PowerNV OPAL API wrappers
  3. *
  4. * Copyright 2011 IBM Corp.
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version
  9. * 2 of the License, or (at your option) any later version.
  10. */
  11. #include <asm/ppc_asm.h>
  12. #include <asm/hvcall.h>
  13. #include <asm/asm-offsets.h>
  14. #include <asm/opal.h>
  15. /* TODO:
  16. *
  17. * - Trace irqs in/off (needs saving/restoring all args, argh...)
  18. * - Get r11 feed up by Dave so I can have better register usage
  19. */
  20. #define OPAL_CALL(name, token) \
  21. _GLOBAL(name); \
  22. mflr r0; \
  23. mfcr r12; \
  24. std r0,16(r1); \
  25. std r12,8(r1); \
  26. std r1,PACAR1(r13); \
  27. li r0,0; \
  28. mfmsr r12; \
  29. ori r0,r0,MSR_EE; \
  30. std r12,PACASAVEDMSR(r13); \
  31. andc r12,r12,r0; \
  32. mtmsrd r12,1; \
  33. LOAD_REG_ADDR(r0,.opal_return); \
  34. mtlr r0; \
  35. li r0,MSR_DR|MSR_IR; \
  36. andc r12,r12,r0; \
  37. li r0,token; \
  38. mtspr SPRN_HSRR1,r12; \
  39. LOAD_REG_ADDR(r11,opal); \
  40. ld r12,8(r11); \
  41. ld r2,0(r11); \
  42. mtspr SPRN_HSRR0,r12; \
  43. hrfid
  44. _STATIC(opal_return)
  45. ld r2,PACATOC(r13);
  46. ld r4,8(r1);
  47. ld r5,16(r1);
  48. ld r6,PACASAVEDMSR(r13);
  49. mtspr SPRN_SRR0,r5;
  50. mtspr SPRN_SRR1,r6;
  51. mtcr r4;
  52. rfid
  53. OPAL_CALL(opal_console_write, OPAL_CONSOLE_WRITE);
  54. OPAL_CALL(opal_console_read, OPAL_CONSOLE_READ);
  55. OPAL_CALL(opal_console_write_buffer_space, OPAL_CONSOLE_WRITE_BUFFER_SPACE);
  56. OPAL_CALL(opal_rtc_read, OPAL_RTC_READ);
  57. OPAL_CALL(opal_rtc_write, OPAL_RTC_WRITE);
  58. OPAL_CALL(opal_cec_power_down, OPAL_CEC_POWER_DOWN);
  59. OPAL_CALL(opal_cec_reboot, OPAL_CEC_REBOOT);
  60. OPAL_CALL(opal_read_nvram, OPAL_READ_NVRAM);
  61. OPAL_CALL(opal_write_nvram, OPAL_WRITE_NVRAM);
  62. OPAL_CALL(opal_handle_interrupt, OPAL_HANDLE_INTERRUPT);
  63. OPAL_CALL(opal_poll_events, OPAL_POLL_EVENTS);
  64. OPAL_CALL(opal_pci_set_hub_tce_memory, OPAL_PCI_SET_HUB_TCE_MEMORY);
  65. OPAL_CALL(opal_pci_set_phb_tce_memory, OPAL_PCI_SET_PHB_TCE_MEMORY);
  66. OPAL_CALL(opal_pci_config_read_byte, OPAL_PCI_CONFIG_READ_BYTE);
  67. OPAL_CALL(opal_pci_config_read_half_word, OPAL_PCI_CONFIG_READ_HALF_WORD);
  68. OPAL_CALL(opal_pci_config_read_word, OPAL_PCI_CONFIG_READ_WORD);
  69. OPAL_CALL(opal_pci_config_write_byte, OPAL_PCI_CONFIG_WRITE_BYTE);
  70. OPAL_CALL(opal_pci_config_write_half_word, OPAL_PCI_CONFIG_WRITE_HALF_WORD);
  71. OPAL_CALL(opal_pci_config_write_word, OPAL_PCI_CONFIG_WRITE_WORD);
  72. OPAL_CALL(opal_set_xive, OPAL_SET_XIVE);
  73. OPAL_CALL(opal_get_xive, OPAL_GET_XIVE);
  74. OPAL_CALL(opal_register_exception_handler, OPAL_REGISTER_OPAL_EXCEPTION_HANDLER);
  75. OPAL_CALL(opal_pci_eeh_freeze_status, OPAL_PCI_EEH_FREEZE_STATUS);
  76. OPAL_CALL(opal_pci_eeh_freeze_clear, OPAL_PCI_EEH_FREEZE_CLEAR);
  77. OPAL_CALL(opal_pci_shpc, OPAL_PCI_SHPC);
  78. OPAL_CALL(opal_pci_phb_mmio_enable, OPAL_PCI_PHB_MMIO_ENABLE);
  79. OPAL_CALL(opal_pci_set_phb_mem_window, OPAL_PCI_SET_PHB_MEM_WINDOW);
  80. OPAL_CALL(opal_pci_map_pe_mmio_window, OPAL_PCI_MAP_PE_MMIO_WINDOW);
  81. OPAL_CALL(opal_pci_set_phb_table_memory, OPAL_PCI_SET_PHB_TABLE_MEMORY);
  82. OPAL_CALL(opal_pci_set_pe, OPAL_PCI_SET_PE);
  83. OPAL_CALL(opal_pci_set_peltv, OPAL_PCI_SET_PELTV);
  84. OPAL_CALL(opal_pci_set_mve, OPAL_PCI_SET_MVE);
  85. OPAL_CALL(opal_pci_set_mve_enable, OPAL_PCI_SET_MVE_ENABLE);
  86. OPAL_CALL(opal_pci_get_xive_reissue, OPAL_PCI_GET_XIVE_REISSUE);
  87. OPAL_CALL(opal_pci_set_xive_reissue, OPAL_PCI_SET_XIVE_REISSUE);
  88. OPAL_CALL(opal_pci_set_xive_pe, OPAL_PCI_SET_XIVE_PE);
  89. OPAL_CALL(opal_get_xive_source, OPAL_GET_XIVE_SOURCE);
  90. OPAL_CALL(opal_get_msi_32, OPAL_GET_MSI_32);
  91. OPAL_CALL(opal_get_msi_64, OPAL_GET_MSI_64);
  92. OPAL_CALL(opal_start_cpu, OPAL_START_CPU);
  93. OPAL_CALL(opal_query_cpu_status, OPAL_QUERY_CPU_STATUS);
  94. OPAL_CALL(opal_write_oppanel, OPAL_WRITE_OPPANEL);
  95. OPAL_CALL(opal_pci_map_pe_dma_window, OPAL_PCI_MAP_PE_DMA_WINDOW);
  96. OPAL_CALL(opal_pci_map_pe_dma_window_real, OPAL_PCI_MAP_PE_DMA_WINDOW_REAL);
  97. OPAL_CALL(opal_pci_reset, OPAL_PCI_RESET);
  98. OPAL_CALL(opal_pci_get_hub_diag_data, OPAL_PCI_GET_HUB_DIAG_DATA);
  99. OPAL_CALL(opal_pci_get_phb_diag_data, OPAL_PCI_GET_PHB_DIAG_DATA);
  100. OPAL_CALL(opal_pci_fence_phb, OPAL_PCI_FENCE_PHB);
  101. OPAL_CALL(opal_pci_reinit, OPAL_PCI_REINIT);
  102. OPAL_CALL(opal_pci_mask_pe_error, OPAL_PCI_MASK_PE_ERROR);
  103. OPAL_CALL(opal_set_slot_led_status, OPAL_SET_SLOT_LED_STATUS);
  104. OPAL_CALL(opal_get_epow_status, OPAL_GET_EPOW_STATUS);
  105. OPAL_CALL(opal_set_system_attention_led, OPAL_SET_SYSTEM_ATTENTION_LED);