diff --git a/repos/dde_uos-intel-gpgpu/src/gpgpu/kernel.h b/repos/dde_uos-intel-gpgpu/src/gpgpu/kernel.h new file mode 100644 index 0000000000..342708e452 --- /dev/null +++ b/repos/dde_uos-intel-gpgpu/src/gpgpu/kernel.h @@ -0,0 +1,31 @@ +#ifndef KERNEL_H +#define KERNEL_H + +#define GENODE +#include "../uos-intel-gpgpu/driver/gpgpu_driver.h" +#include +#include + +namespace gpgpu { + +typedef Genode::uint8_t Kernel_image; + + /** + * @class This class represents a kernel + * + */ + class Kernel : public Genode::List::Element + { + private: + struct kernel_config* kconf; + + Kernel(const Kernel ©) = delete; + + public: + Kernel(struct kernel_config* k) : kconf(k) {} + + inline struct kernel_config* get_config() { return kconf; } + }; +} + +#endif // KERNEL_H diff --git a/repos/dde_uos-intel-gpgpu/src/gpgpu/main.cc b/repos/dde_uos-intel-gpgpu/src/gpgpu/main.cc index 11b1d41a9e..17014d2eb7 100644 --- a/repos/dde_uos-intel-gpgpu/src/gpgpu/main.cc +++ b/repos/dde_uos-intel-gpgpu/src/gpgpu/main.cc @@ -24,14 +24,13 @@ void Component::construct(Genode::Env& e) // init globals static gpgpu_genode gg(e); _global_gpgpu_genode = ≫ - - static gpgpu::Main main(e); - + #ifdef TEST // test prink printk("Hello printk: %d", 42); // test alloc + uint8_t* dummy = (uint8_t*)uos_aligned_alloc(0, 42); uint8_t* test = (uint8_t*)uos_aligned_alloc(0x1000, 0x1000); uint64_t addr = (uint64_t)test; if((addr & 0xFFF) != 0) @@ -54,6 +53,7 @@ void Component::construct(Genode::Env& e) break; } } + free(dummy); free(test); Genode::log("Allocator test finished!"); @@ -79,13 +79,19 @@ void Component::construct(Genode::Env& e) Genode::log("Interrupt test finished!"); #else // init driver + Genode::log("Init GPGPU driver..."); GPGPU_Driver& gpgpudriver = GPGPU_Driver::getInstance(); gpgpudriver.init(0); + Genode::log("Register int handler..."); _global_gpgpu_genode->registerInterruptHandler(); // run the test and hope the best + Genode::log("Run self test..."); run_gpgpu_test(); #endif // TEST + Genode::log("Register RPCs..."); + static gpgpu::Main main(e); + Genode::log("This is the UOS Intel GPGPU End!"); } diff --git a/repos/dde_uos-intel-gpgpu/src/gpgpu/rpc.cc b/repos/dde_uos-intel-gpgpu/src/gpgpu/rpc.cc index 313cc664d3..cb72994155 100644 --- a/repos/dde_uos-intel-gpgpu/src/gpgpu/rpc.cc +++ b/repos/dde_uos-intel-gpgpu/src/gpgpu/rpc.cc @@ -19,11 +19,6 @@ namespace gpgpu { struct Main; } -void yeah() -{ - Genode::log("yeah"); -} - int gpgpu::Session_component::say_hello(int& i) { Genode::log("Hello from uos-intel-gpgpu!"); @@ -47,18 +42,21 @@ int gpgpu::Session_component::start_task(unsigned long kconf) kc->binary = (Genode::uint8_t*)((Genode::addr_t)kc->binary + mapped_base); // at this point all IO buffers should have phys addrs and all others have driver virt addrs - // this is just for testing - kc->finish_callback = yeah; - // set maximum frequency - //GPGPU_Driver& gpgpudriver = GPGPU_Driver::getInstance(); - //gpgpudriver.setMaxFreq(); + GPGPU_Driver& gpgpudriver = GPGPU_Driver::getInstance(); + gpgpudriver.setMaxFreq(); // start gpu task - //gpgpudriver.enqueueRun(*kc); + gpgpudriver.enqueueRun(*kc); + + /* + Kernel* kernel = (Kernel*)_global_gpgpu_genode->aligned_alloc(0, sizeof(Kernel)); + vgpu.add_kernel(kernel); + + free this somewhere + */ static int id = 0; - Genode::log("Started GPGPU-Task: ", id); return id++; } @@ -75,7 +73,6 @@ gpgpu::Root_component::Root_component(Genode::Entrypoint &ep, } - gpgpu::Main::Main(Genode::Env &env) : env(env) { /* diff --git a/repos/dde_uos-intel-gpgpu/src/gpgpu/rpc.h b/repos/dde_uos-intel-gpgpu/src/gpgpu/rpc.h index 9901a69e27..29b4596d8e 100644 --- a/repos/dde_uos-intel-gpgpu/src/gpgpu/rpc.h +++ b/repos/dde_uos-intel-gpgpu/src/gpgpu/rpc.h @@ -5,6 +5,7 @@ #include #include #include +#include "vgpu.h" namespace gpgpu { struct Session_component; @@ -14,7 +15,10 @@ namespace gpgpu { struct gpgpu::Session_component : Genode::Rpc_object { - Genode::addr_t mapped_base = 0; + VGpu vgpu; + Genode::addr_t mapped_base; + + Session_component() : vgpu(), mapped_base(0) {} int say_hello(int& i) override; diff --git a/repos/dde_uos-intel-gpgpu/src/gpgpu/vgpu.h b/repos/dde_uos-intel-gpgpu/src/gpgpu/vgpu.h new file mode 100644 index 0000000000..9f34e49c5b --- /dev/null +++ b/repos/dde_uos-intel-gpgpu/src/gpgpu/vgpu.h @@ -0,0 +1,53 @@ +#ifndef VGPU_H +#define VGPU_H + +#define GENODE +#include "../uos-intel-gpgpu/driver/gpgpu_driver.h" +#include "../uos-intel-gpgpu/driver/ppgtt32.h" +#include +#include "kernel.h" + +namespace gpgpu { + + class VGpu : public Chain + { + private: + PPGTT32* ppgtt; + Genode::List ready_list; + + public: + /** + * @brief Construct a new VGpu object + */ + VGpu() : ppgtt(nullptr), ready_list() {} + + /** + * @brief Add a kernel to the vGPU's ready list + * + * @param kernel - the kernel object to enqueue + */ + void add_kernel(Kernel* kernel) { + ready_list.insert(kernel); + } + + /** + * @brief Dequeue a kernel from the ready list + * + * @return First kernel image in ready list + */ + Kernel* take_kernel() { + Kernel* k = ready_list.first(); + ready_list.remove(k); + return k; + } + + /** + * @brief Get the ppgtt object + * + * @return PPGTT + */ + PPGTT32* get_ppgtt() { return ppgtt; } + }; +} + +#endif // VGPU_H diff --git a/repos/hello_gpgpu/src/hello_gpgpu/main.cc b/repos/hello_gpgpu/src/hello_gpgpu/main.cc index 0d530476cc..133e86911e 100644 --- a/repos/hello_gpgpu/src/hello_gpgpu/main.cc +++ b/repos/hello_gpgpu/src/hello_gpgpu/main.cc @@ -1,6 +1,8 @@ #include #include +#include + #define CL_TARGET_OPENCL_VERSION 100 #include "CL/cl.h" #include "test.h" @@ -9,6 +11,11 @@ extern int main(int argc, char *argv[]); void testvm_construct(Genode::Env& env) { + // wait for gpgpu construction + Libc::with_libc([&] { + usleep(5000000); + }); + // init CL env Genode::log("===Init VM==="); const unsigned long size = 0x10000 * 0x1000; @@ -30,10 +37,10 @@ void testvm_construct(Genode::Env& env) run_gpgpu_test(alloc); // run 2mm - /*Genode::log("===Run 2mm==="); + Genode::log("===Run 2mm==="); Libc::with_libc([&] { main(0, 0); - });*/ + }); Genode::log("===End==="); Genode::log("hello gpgpu completed");