Detect ATA driver via PCI
This commit is contained in:
44
kernel/pci/ide.c
Normal file
44
kernel/pci/ide.c
Normal file
@ -0,0 +1,44 @@
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include "pci/pci.h"
|
||||
#include "pci/ide.h"
|
||||
#include "storedev/atasd.h"
|
||||
#include "storedev/storedev.h"
|
||||
#include "util/util.h"
|
||||
#include "kprintf.h"
|
||||
|
||||
#define ATA_MASTER 0x00
|
||||
#define ATA_SLAVE 0x01
|
||||
|
||||
#define ATA_PROBE(STRING, IOBASE, CTRLBASE, S_OR_M) \
|
||||
ps = ata_probesize_bytes((IOBASE), (CTRLBASE), (S_OR_M)); \
|
||||
if (ps > 0) { \
|
||||
AtaSdInitExtra extra = { \
|
||||
.devno = (S_OR_M), \
|
||||
.capacity = ps, \
|
||||
.iobase = (IOBASE), \
|
||||
.ctrlbase = (CTRLBASE), \
|
||||
}; \
|
||||
storedev_create(STOREDEV_ATASD, (STRING), (void *)&extra); \
|
||||
}
|
||||
|
||||
void pci_ide_init(PciDevInfo *devinfo) {
|
||||
LOG("pci", "init ATA drive\n");
|
||||
|
||||
uint16_t iobase, ctrlbase;
|
||||
uint64_t ps;
|
||||
|
||||
if (!(devinfo->progintf & 0x1)) {
|
||||
iobase = 0x1F0;
|
||||
ctrlbase = 0x3F6;
|
||||
}
|
||||
ATA_PROBE("atasd0m", iobase, ctrlbase, ATA_MASTER)
|
||||
ATA_PROBE("atasd0s", iobase, ctrlbase, ATA_SLAVE)
|
||||
|
||||
if (!(devinfo->progintf & 0x4)) {
|
||||
iobase = 0x170;
|
||||
ctrlbase = 0x376;
|
||||
}
|
||||
ATA_PROBE("atasd1m", iobase, ctrlbase, ATA_MASTER)
|
||||
ATA_PROBE("atasd1s", iobase, ctrlbase, ATA_SLAVE)
|
||||
}
|
||||
8
kernel/pci/ide.h
Normal file
8
kernel/pci/ide.h
Normal file
@ -0,0 +1,8 @@
|
||||
#ifndef PCI_IDE_H_
|
||||
#define PCI_IDE_H_
|
||||
|
||||
#include "pci/pci.h"
|
||||
|
||||
void pci_ide_init(PciDevInfo *devinfo);
|
||||
|
||||
#endif // PCI_IDE_H_
|
||||
@ -5,6 +5,7 @@
|
||||
#include "io/io.h"
|
||||
#include "std/string.h"
|
||||
#include "util/util.h"
|
||||
#include "pci/ide.h"
|
||||
#include "kprintf.h"
|
||||
|
||||
uint8_t pci_read8(uint32_t id, uint32_t reg) {
|
||||
@ -76,6 +77,7 @@ void pci_getbar(PciBar *bar, uint32_t id, uint32_t idx) {
|
||||
}
|
||||
|
||||
static PciMatch PCI_MATCHES[] = {
|
||||
{ 0x8086, 0x7010, &pci_ide_init },
|
||||
};
|
||||
|
||||
void pci_visit(uint32_t bus, uint32_t dev, uint32_t fn) {
|
||||
@ -103,8 +105,7 @@ void pci_visit(uint32_t bus, uint32_t dev, uint32_t fn) {
|
||||
pci_classname(devinfo.classcode, devinfo.subclass, devinfo.progintf));
|
||||
|
||||
for (size_t i = 0; i < LEN(PCI_MATCHES); i++) {
|
||||
if ((PCI_MATCHES[i].k1 == devinfo.vendorid && PCI_MATCHES[i].k2 == devinfo.deviceid)
|
||||
|| (PCI_MATCHES[i].k1 == devinfo.classcode && PCI_MATCHES[i].k2 == devinfo.subclass)) {
|
||||
if (PCI_MATCHES[i].k1 == devinfo.vendorid && PCI_MATCHES[i].k2 == devinfo.deviceid) {
|
||||
PCI_MATCHES[i].initfn(&devinfo);
|
||||
}
|
||||
}
|
||||
|
||||
@ -82,6 +82,7 @@ uint32_t pci_read32(uint32_t id, uint32_t reg);
|
||||
void pci_write8(uint32_t id, uint32_t reg, uint8_t v);
|
||||
void pci_write16(uint32_t id, uint32_t reg, uint16_t v);
|
||||
void pci_write32(uint32_t id, uint32_t reg, uint32_t v);
|
||||
void pci_getbar(PciBar *bar, uint32_t id, uint32_t idx);
|
||||
|
||||
void pci_init(void);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user