Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
init.cpp
Go to the documentation of this file.
1#include "e1000/e1000.hpp"
2#include "ioforge/ioforge.h"
5#include <ioforge/ioforge.hpp>
6
8
9E1000Module::E1000Module() : IOforgePCI("E1000 Ethernet") {}
10
12
14
15extern "C" void fireHandler() { log("E1000 IRQ", "ok"); }
16
17#define IMS_RXQ0 (1 << 20) // Bit 20: Receive Queue 0
18#define IMS_TXQ0 (1 << 22) // Bit 22: Transmit Queue 0
19#define IMS_OTHER (1 << 24) // Bit 24: Other Causes (LSC, dll)
20
22 device = findDevice(0x8086, 0x100C);
23 device = findDevice(0x8086, 0x10D3);
24 if (!device) {
25 log(mod, "Device not found");
26 return;
27 }
28 log(mod, "Device found bar0 at 0x%x", device->bar[0].address);
29 uint32_t status = read(0x0008); // STATUS register
30 log(mod, "STATUS: 0x%x", status);
31
32 uint32_t ctrl = read(0x0000); // CTRL
33 write(0x0000, ctrl | (1 << 26)); // set RST bit
34 // tunggu reset selesai
35 for (volatile int i = 0; i < 10000; i++)
36 ;
37 while (read(0x0000) & (1 << 26))
38 ;
39
40 if (detectEeprom()) {
41 log(mod, "Eprom found");
42 } else {
43 log(mod, "Eprom not found");
44 }
45
47
48 linkup();
49
50 for (int i = 0; i < 0x80; i++)
51 write(0x5200 + i * 4, 0);
52
55
56 serial2_printf("E1000 interrupt line: %d (%d)\n",
57 device->interrupt_line);
58
61
62 if (msix_cap) {
63 log(mod, "MSI-X Available at cap : 0x%x", msix_cap);
64 auto cpu = ioforge_get_current_core_id();
65 auto irq = IOUtils::irq_alloc_entry();
66 IOUtils::irq_register(irq, (void*)E1000Module::fireHandler);
67 pci_enable_msix(device, irq, cpu, msix_cap);
68 // current_irq_mode = INT_MSIX;
69
70 // Bit 24 (EIAME), Bit 27 (IAME), Bit 31 (PBA_CLR)
71 uint32_t ctrl_ext = read(0x0018);
72 ctrl_ext |= (1 << 24) | (1 << 27) | (1u << 31);
73 write(0x0018, ctrl_ext);
74
75 uint32_t ivar = 0;
76 // RXQ0 -> Vector 0 (Bit 3 = Valid, Bit 2:0 = Vector 0)
77 ivar |= (1 << 3) | 0;
78 // TXQ0 -> Vector 0 (Bit 11 = Valid, Bit 10:8 = Vector 0)
79 ivar |= (1 << 11) | (0 << 8);
80 write(0x00E4, ivar);
81
82 // IVAR_MISC: Other causes (LSC, dll) -> Vector 0
83 // (Bit 3 = Valid, Bit 2:0 = Vector 0)
84 write(0x00E8, (1 << 3) | 0);
85
86 write(0x000DC, IMS_RXQ0 | IMS_TXQ0 | IMS_OTHER);
87
88 read(0x01580);
89 read(0x000C0);
90
91 msix = 1;
92 }
93
94 else if (msi_cap) {
95 log(mod, "MSI Available at 0x%x", msi_cap);
96 auto irq = IOUtils::irq_alloc_entry();
97 auto cpu = ioforge_get_current_core_id();
98 IOUtils::irq_register(irq, (void*)E1000Module::fireHandler);
99 pci_enable_msi(device, irq, cpu, msi_cap);
100 msix = 0;
101 }
102
103 else if (device->interrupt_line) {
104 log(mod, "Using Legacy IRQ");
105 isr_irq_register(device->interrupt_line,
107 msix = 0;
108 }
109
111 log(mod, "Successfully Initialized Module");
112}
113
114extern "C" int E1000SendPacketCWrapper(const struct data_template data[],
115 size_t count) {
116 int a = instance.sendPacket(data, count);
117 return a;
118}
119extern "C" int E1000GetMacAddressCWrapper(uint8_t mac[6]) {
120 return instance.getMacAddress(mac);
121}
122
123// extern "C" int E1000ReceivePacketCWraper(void** buffer, size_t* size) {
124// return instance.receivePacket(buffer, size);
125// }
126
127extern "C" void E1000StoreBufferToPoolCWrapper(int rx_id, void* vaddr) {
128 instance.storeBufferToPool(rx_id, vaddr);
129}
130
131__attribute__((constructor)) static void e100_constructor() {
134 sizeof(ioforge_nic_service));
135 log("E1000", "nic 0x%x", nic);
136
137 const char* service_name = "E1000";
139 (char*)service_name);
141 // nic->ops.receive = E1000ReceivePacketCWraper;
144
145 nic->pq_head = nic->pq_tail = 0;
146
148
149 // IoForgeNIC::create(nic);
150 serial2_printf("[E1000] Constructor selesai dijalankan\n");
151}
static AHCIModule instance
Definition init.cpp:5
int count
Definition cache.h:2
boolean_t detectEeprom()
Definition e1000.cpp:129
ioforge_pci_device * device
Definition e1000.hpp:68
static E1000Module * getInstance()
Definition init.cpp:13
void write(uint16_t p_address, uint32_t p_value)
Definition e1000.cpp:119
void setNIC(struct ioforge_nic_service *nic)
Definition e1000.hpp:46
void enableInterrupt()
Definition e1000.cpp:206
boolean_t syncMacAddress()
Definition e1000.cpp:162
void linkup()
Definition e1000.cpp:396
void unload() override
Definition init.cpp:11
void initTransmitterX()
Definition e1000.cpp:321
static void fireHandler()
Definition e1000.cpp:421
void load() override
Definition init.cpp:21
uint8_t msix
Definition e1000.hpp:63
void initReceiverX()
Definition e1000.cpp:238
uint32_t read(uint16_t p_address)
Definition e1000.cpp:125
E1000Module()
Definition init.cpp:9
static void * alloc(size_t size)
Definition ioforge.hpp:39
static void strcopy(char *dst, char *src)
Definition ioforge.hpp:56
const char * mod
Definition ioforge.hpp:65
struct ioforge_pci_device * findDevice(uint16_t vendor_id, uint16_t device_id)
IOforgePCI(const char *mod)
int E1000SendPacketCWrapper(const struct data_template data[], size_t count)
Definition init.cpp:114
void fireHandler()
Definition init.cpp:15
void E1000StoreBufferToPoolCWrapper(int rx_id, void *vaddr)
Definition init.cpp:127
int E1000GetMacAddressCWrapper(uint8_t mac[6])
Definition init.cpp:119
#define IMS_OTHER
Definition e1000.cpp:28
#define IMS_TXQ0
Definition e1000.cpp:27
#define IMS_RXQ0
Definition e1000.cpp:26
volatile uint8_t status
Definition e1000.hpp:3
a
Definition entry.h:6
struct fs_data data
Definition filesystem.h:1
typedef __attribute__
Definition msi.c:47
uint8_t ioforge_get_current_core_id()
uint32_t isr_irq_register(uint8_t irq, void *handler)
void serial2_printf(const char *fmt,...)
#define log(mod, fmt,...)
Definition ioforge.hpp:12
#define IoForgeModuleConstructor(Class)
Definition ioforge.hpp:7
uint16_t pci_cap_find_msi(struct ioforge_pci_device *pci)
void pci_enable_msi(struct ioforge_pci_device *pci, uint8_t vector, uint8_t cpu, uint16_t cap)
uintptr_t pci_enable_msix(struct ioforge_pci_device *pci, uint8_t vector, uint8_t cpu, uint16_t cap)
uint16_t pci_cap_find_msix(struct ioforge_pci_device *pci)
char name[64]
Definition ioforge.h:30
int(* send)(const struct data_template data[], size_t count)
Definition ioforge_nic.h:22
int(* get_mac_address)(uint8_t mac[6])
Definition ioforge_nic.h:24
void(* storeBufferToPool)(int rx_id, void *vaddr)
Definition ioforge_nic.h:25
struct ioforge_nic_operation ops
Definition ioforge_nic.h:60
struct ioforge_device service
Definition ioforge_nic.h:59
unsigned short uint16_t
Definition type.h:13
unsigned int uint32_t
Definition type.h:19
unsigned char uint8_t
Definition type.h:7