|
9 | 9 | MCFG_ENTRY *mcfg_entries[PCI_MCFG_MAX_ENTRIES_LEN]; |
10 | 10 | MCFG *mcfg; |
11 | 11 | uint64_t mcfg_entries_len = 0; |
12 | | -pcie_device_t *pci_devices[PCI_DEVICE_MAX]; |
13 | | -uint32_t pci_device_number = 0; |
| 12 | +extern pci_device_t pci_device[PCI_DEVICE_MAX]; |
| 13 | +extern uint32_t device_number; |
14 | 14 | bool is_pcie = false; // 是否是PCIE模式 (CP_Kernel无法加载PCIE驱动时候会切换回默认的PCI) |
15 | 15 |
|
16 | 16 | static uint64_t |
@@ -46,13 +46,13 @@ void mcfg_addr_to_entries(MCFG_ENTRY **entries) { |
46 | 46 | } |
47 | 47 | } |
48 | 48 |
|
49 | | -uint32_t pcie_read_command(pcie_device_t *device, uint8_t offset) { |
| 49 | +uint32_t pci_read_command(pci_device_t device, uint8_t offset) { |
50 | 50 | uint32_t address = (1 << 31) | (device->bus << 16) | (device->slot << 11) | (device->func << 8) | (offset & 0xFC); |
51 | 51 | io_out32(PCI_COMMAND_PORT,address); |
52 | 52 | return io_in32(PCI_DATA_PORT); |
53 | 53 | } |
54 | 54 |
|
55 | | -void pcie_write_command(pcie_device_t *device,uint8_t offset,uint32_t value){ |
| 55 | +void pci_write_command(pci_device_t device,uint8_t offset,uint32_t value){ |
56 | 56 | uint32_t address = (1 << 31) | (device->bus << 16) | (device->slot << 11) | (device->func << 8) | (offset & 0xFC); |
57 | 57 | io_out32(PCI_COMMAND_PORT,address); |
58 | 58 | io_out32(PCI_DATA_PORT,value); |
@@ -80,45 +80,46 @@ void pci_scan_function(uint16_t segment_group, uint8_t bus, uint8_t device, uint |
80 | 80 | switch (*((uint8_t *) header_type_mmio_addr + 2)) { |
81 | 81 | // Endpoint |
82 | 82 | case 0x00: { |
83 | | - pcie_device_t *pci_device = (pcie_device_t *) malloc(sizeof(pcie_device_t)); |
| 83 | + pci_device_t pci_device0 = (pci_device_t )malloc(sizeof(struct pci_device)); |
84 | 84 | uint32_t class_code_24bit = (device_class << 16) | (device_subclass << 8) | device_interface; |
85 | | - pci_device->class_code = class_code_24bit; |
86 | | - pci_device->vendor_id = vendor_id; |
87 | | - pci_device->device_id = device_id; |
| 85 | + pci_device0->class_code = class_code_24bit; |
| 86 | + pci_device0->vendor_id = vendor_id; |
| 87 | + pci_device0->device_id = device_id; |
88 | 88 |
|
89 | | - pci_device->segment = segment_group; |
90 | | - pci_device->bus = bus; |
91 | | - pci_device->slot = device; |
92 | | - pci_device->func = function; |
| 89 | + pci_device0->segment = segment_group; |
| 90 | + pci_device0->bus = bus; |
| 91 | + pci_device0->slot = device; |
| 92 | + pci_device0->func = function; |
93 | 93 |
|
94 | 94 | for (int i = 0; i < 6; i++) { |
95 | 95 | int offset = 0x10 + i * 4; |
96 | 96 | uint64_t bars_mmio_address = get_mmio_address(pci_address, offset); |
97 | 97 | uint32_t bar = *(uint32_t *) bars_mmio_address; |
98 | 98 |
|
99 | 99 | if (bar & 0x01) { |
100 | | - pci_device->bars[i].address = bar & 0xFFFFFFFC; |
101 | | - pci_device->bars[i].mmio = false; |
| 100 | + pci_device0->bars[i].address = bar & 0xFFFFFFFC; |
| 101 | + pci_device0->bars[i].mmio = false; |
102 | 102 | } else { |
103 | 103 | bool prefetchable = bar & (1 << 3); |
104 | 104 | UNUSED(prefetchable); |
105 | 105 | uint64_t bar_address = bar & 0xFFFFFFF0; |
106 | 106 | uint16_t bit = (bar & ((1 << 3) | (1 << 2) | (1 << 1))) >> 1; |
107 | 107 |
|
108 | 108 | if(bit == 0){ //0b00 |
109 | | - pci_device->bars[i].address = bar & 0xFFFFFFFC; |
110 | | - pci_device->bars[i].mmio = true; |
| 109 | + pci_device0->bars[i].address = bar & 0xFFFFFFFC; |
| 110 | + pci_device0->bars[i].mmio = true; |
111 | 111 | } else if(bit == 2){ //0b10 |
112 | 112 | uint32_t bar_address_upper = *((uint32_t *) bars_mmio_address + 1); |
113 | 113 | bar_address |= ((uint64_t) bar_address_upper << 32); |
114 | | - pci_device->bars[i].address = bar_address; |
115 | | - pci_device->bars[i].mmio = true; |
| 114 | + pci_device0->bars[i].address = bar_address; |
| 115 | + pci_device0->bars[i].mmio = true; |
116 | 116 | } |
117 | 117 | } |
118 | 118 | } |
119 | | - pci_device->name = pci_classname(pci_device->class_code); |
120 | | - pci_devices[pci_device_number] = pci_device; |
121 | | - pci_device_number++; |
| 119 | + pci_device0->name = pci_classname(pci_device0->class_code); |
| 120 | + pci_device0->is_pcie = true; |
| 121 | + pci_device[device_number] = pci_device0; |
| 122 | + device_number++; |
122 | 123 | } |
123 | 124 | break; |
124 | 125 | // PciPciBridge |
@@ -158,55 +159,34 @@ void pci_scan_segment(uint16_t segment_group) { |
158 | 159 | } |
159 | 160 | } |
160 | 161 |
|
161 | | -uint32_t get_pcie_num() { |
162 | | - return is_pcie ? pci_device_number : get_pci_num(); |
163 | | -} |
164 | | - |
165 | 162 | void print_all_pcie() { |
166 | | - if(!is_pcie){ |
167 | | - print_all_pci(); |
168 | | - printk("Model: PCI\n"); |
169 | | - return; |
170 | | - } |
171 | | - printk("Bus:Slot:Func\t[Vendor:Device]\tClass Code\tName\n"); |
172 | | - for (size_t i = 0; i < pci_device_number; i++) { |
173 | | - pcie_device_t *device = pci_devices[i]; |
174 | | - printk("%03d:%02d:%02d\t[0x%04X:0x%04X]\t<0x%08x>\t%s\n", |
| 163 | + printk("Bus:Slot:Func\t[Vendor:Device]\tClass Code\tType\tName\n"); |
| 164 | + for (size_t i = 0; i < device_number; i++) { |
| 165 | + pci_device_t device = pci_device[i]; |
| 166 | + printk("%03d:%02d:%02d\t[0x%04X:0x%04X]\t<0x%08x>\t%s\t%s\n", |
175 | 167 | device->bus, |
176 | 168 | device->slot, |
177 | 169 | device->func, |
178 | 170 | device->vendor_id, |
179 | 171 | device->device_id, |
180 | 172 | device->class_code, |
| 173 | + device->is_pcie ? "PCIE" : "PCI ", |
181 | 174 | device->name); |
182 | 175 | } |
183 | | - printk("Model: PCIE\n"); |
184 | | -} |
185 | | - |
186 | | -pcie_device_t *pcie_find_class(uint32_t class_code) { |
187 | | - for (size_t i = 0; i < pci_device_number; i++) { |
188 | | - if (pci_devices[i]->class_code == class_code) { |
189 | | - return pci_devices[i]; |
190 | | - } |
191 | | - if (class_code == (pci_devices[i]->class_code & 0xFFFF00)) { |
192 | | - return pci_devices[i]; |
193 | | - } |
194 | | - } |
195 | | - return NULL; |
196 | 176 | } |
197 | 177 |
|
198 | 178 | void pcie_init() { |
199 | 179 | if (mcfg == NULL) { |
200 | | - pci_setup(); |
201 | | - return; |
| 180 | + goto pci; |
202 | 181 | } |
203 | 182 | mcfg_addr_to_entries(mcfg_entries); |
204 | 183 | for (size_t i = 0; i < mcfg_entries_len; i++) { |
205 | 184 | uint16_t segment_group = mcfg_entries[i]->pci_segment_group; |
206 | 185 | pci_scan_segment(segment_group); |
207 | 186 | } |
208 | 187 | is_pcie = true; |
209 | | - kinfo("PCIE device find %d",pci_device_number); |
| 188 | + pci: |
| 189 | + pci_setup(); |
210 | 190 | } |
211 | 191 |
|
212 | 192 | /** |
|
0 commit comments