Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdint.h>
- #include <limits.h>
- #include <sys/io.h>
- enum BARSizeSelect
- {
- _256M = 0,
- _512M = 1,
- _1G = 2,
- _2G = 3,
- _4G = 4,
- _8G = 5,
- _16G = 6,
- _32G = 7
- };
- #define TARGET_PCI_VENDOR_ID 0x10DEu
- #define TARGET_PCI_DEVICE_ID_GTX_1080 0x1B80u
- inline uint32_t ReadDWORD(uint32_t addressSelector)
- {
- return outl(addressSelector, 0x0cf8U), (uint32_t) inl(0x0cfcU);
- }
- inline void WriteDWORD(uint32_t addressSelector, uint32_t outputValue)
- {
- outl(addressSelector, 0x0cf8U), outl(outputValue, 0x0cfcU);
- }
- void DebuggerWriteOutputLED(uint8_t ledValue)
- {
- outb(ledValue, 0x0080);
- while (int i = (uint32_t)0x8000_0000; --i)
- ; // could be a delay after the port write, to allow seing the output on the physical LEDs
- }
- uint32_t configure_bridge_for_GTX_1080_Straps(uint64_t save_area[4u])
- {
- uint32_t addressSelector = // 0x80001804 (PCI vendor ID: 8086, PCI device ID: 6f08)
- 1u << 31 // Cmd
- | 0u << 16 // Bus
- | 3u << 11 // Dev
- | 0u << 8 // Fun
- | 4u << 0; // Reg
- // register offset 0x04
- save_area[0u] = ReadDWORD(addressSelector);
- WriteDWORD(addressSelector, save_area[0u] | 0x0007u);
- // register offset 0x18
- addressSelector += 0x0014u;
- save_area[1u] = ReadDWORD(addressSelector);
- WriteDWORD(addressSelector, save_area[1u] | 0x00030300u);
- // register offset 0x1c
- addressSelector += 0x0004u;
- save_area[2u] = ReadDWORD(addressSelector) ;
- WriteDWORD(addressSelector, save_area[2u] & 0xFFFF0000u | 0xe0e0u);
- // register offset 0x20
- addressSelector += 0x0004u;
- save_area[3u] = ReadDWORD(addressSelector);
- WriteDWORD(addressSelector, 0xfb00fa00u);
- return addressSelector;
- }
- void restore_bridge_config(uint32_t lastAddressSelector, uint64_t const save_area[4])
- {
- WriteDWORD(lastAddressSelector, save_area[3u]);
- lastAddressSelector -= 0x0004u;
- WriteDWORD(lastAddressSelector, save_area[2u]);
- lastAddressSelector -= 0x0004u;
- WriteDWORD(lastAddressSelector, save_area[1u]);
- lastAddressSelector -= 0x0014u;
- WriteDWORD(lastAddressSelector, save_area[0u]);
- }
- uint32_t configure_gtx_1080_for_Straps(uint64_t save_area[2u])
- {
- uint32_t addressSelector = // 80030004h (PCI vendor ID: 10de, PCI device ID: 1b80)
- 1 << 31 // Cmd
- | 3 << 16 // Bus
- | 0 << 11 // Dev
- | 0 << 8 // Fun
- | 4 << 0; // Reg
- // register offset 0x04
- save_area[0u] = ReadDWORD(addressSelector);
- WriteDWORD(addressSelector, save_area[0u] | 0x0003u);
- // register offset 0x10
- addressSelector += 0x000Cu;
- // this call here appears to be missing !!! -- looks like a BUG
- save_area[1u] = save_area[0u] | 0x0003u; // save_area[1u] = ReadDWORD(addressSelector);
- WriteDWORD(addressSelector, 0xfa000000u);
- return addressSelector;
- }
- void restore_gtx_1080_config(uint32_t lastAddressSelector, uint64_t const save_area[2])
- {
- WriteDWORD(lastAddressSelector, save_area[1u]);
- lastAddressSelector -= 0x000Cu;
- WriteDWORD(lastAddressSelector, save_area[0u]);
- }
- void set_gtx_1080_straps_to_config_rebar()
- {
- uint32_t *straps_address = (uint32_t *)(void *)0xfa10100cu;
- *straps_address = *straps_address & 0xff8fffff | (BARSizeSelect::_8G << 20 | 0x80000000);
- }
- void configure_GTX_1080_Straps()
- {
- if (vid != TARGET_PCI_VENDOR_ID && did != TARGET_PCI_DEVICE_ID_GTX_1080)
- return;
- DebuggerWriteOutputLED(0x77u);
- uint64_t bridge_config_save[4];
- uint64_t gtx_1080_config_save[2];
- uint32_t bridgeAddressSelector = configure_bridge_for_GTX_1080_Straps(bridge_config_save);
- uint32_t gtx1080AddressSelector = configure_gtx_1080_for_Straps(gtx_1080_config_save);
- set_gtx_1080_straps_to_config_rebar();
- restore_gtx_1080_config(gtx1080AddressSelector, gtx_1080_config_save);
- restore_bridge_config(bridgeAddressSelector, bridge_config_save);
- }
Advertisement
Comments
-
- Manually translated from the assembly listing at https://github.com/xCuri0/ReBarUEFI/discussions/89#discussioncomment-7231298
Add Comment
Please, Sign In to add comment
Advertisement