Add a yellowstone stub and partially migrate denali
This commit is contained in:
parent
318356e54c
commit
72483a3437
|
@ -8,8 +8,6 @@
|
|||
|
||||
namespace {
|
||||
|
||||
const uint64_t kPciSize = 0x1000;
|
||||
|
||||
const uint64_t kGhc_InteruptEnable = 0x2;
|
||||
|
||||
void interrupt_thread(void* void_driver) {
|
||||
|
@ -20,18 +18,11 @@ void interrupt_thread(void* void_driver) {
|
|||
crash("Driver returned from interrupt loop", glcr::INTERNAL);
|
||||
}
|
||||
|
||||
PciDeviceHeader* LoadPciDeviceHeader(uint64_t ahci_phys) {
|
||||
MappedMemoryRegion pci_region =
|
||||
MappedMemoryRegion::DirectPhysical(ahci_phys, kPciSize);
|
||||
return reinterpret_cast<PciDeviceHeader*>(pci_region.vaddr());
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
glcr::ErrorOr<glcr::UniquePtr<AhciDriver>> AhciDriver::Init(
|
||||
uint64_t ahci_phys) {
|
||||
PciDeviceHeader* header = LoadPciDeviceHeader(ahci_phys);
|
||||
glcr::UniquePtr<AhciDriver> driver(new AhciDriver(header));
|
||||
MappedMemoryRegion pci_region) {
|
||||
glcr::UniquePtr<AhciDriver> driver(new AhciDriver(pci_region));
|
||||
// RET_ERR(driver->LoadCapabilities());
|
||||
RET_ERR(driver->LoadHbaRegisters());
|
||||
RET_ERR(driver->LoadDevices());
|
||||
|
|
|
@ -10,7 +10,8 @@
|
|||
|
||||
class AhciDriver {
|
||||
public:
|
||||
static glcr::ErrorOr<glcr::UniquePtr<AhciDriver>> Init(uint64_t ahci_phys);
|
||||
static glcr::ErrorOr<glcr::UniquePtr<AhciDriver>> Init(
|
||||
MappedMemoryRegion ahci_phys);
|
||||
glcr::ErrorCode RegisterIrq();
|
||||
|
||||
void InterruptLoop();
|
||||
|
@ -21,6 +22,7 @@ class AhciDriver {
|
|||
void DumpPorts();
|
||||
|
||||
private:
|
||||
MappedMemoryRegion pci_region_;
|
||||
PciDeviceHeader* pci_device_header_ = nullptr;
|
||||
MappedMemoryRegion ahci_region_;
|
||||
AhciHba* ahci_hba_ = nullptr;
|
||||
|
@ -38,6 +40,8 @@ class AhciDriver {
|
|||
glcr::ErrorCode LoadHbaRegisters();
|
||||
glcr::ErrorCode LoadDevices();
|
||||
|
||||
AhciDriver(PciDeviceHeader* device_header)
|
||||
: pci_device_header_(device_header) {}
|
||||
AhciDriver(MappedMemoryRegion pci_region)
|
||||
: pci_region_(pci_region),
|
||||
pci_device_header_(
|
||||
reinterpret_cast<PciDeviceHeader*>(pci_region_.vaddr())) {}
|
||||
};
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include <mammoth/port_client.h>
|
||||
#include <stdint.h>
|
||||
#include <yellowstone.h>
|
||||
#include <yellowstone_stub.h>
|
||||
|
||||
#include "ahci/ahci_driver.h"
|
||||
#include "denali_server.h"
|
||||
|
@ -13,18 +14,10 @@ uint64_t main(uint64_t init_port_cap) {
|
|||
check(ParseInitPort(init_port_cap));
|
||||
glcr::UniquePtr<EndpointClient> yellowstone =
|
||||
EndpointClient::AdoptEndpoint(gInitEndpointCap);
|
||||
YellowstoneGetReq ahci_req{
|
||||
.type = kYellowstoneGetAhci,
|
||||
};
|
||||
auto resp_or =
|
||||
yellowstone->CallEndpoint<YellowstoneGetReq, YellowstoneGetAhciResp>(
|
||||
ahci_req);
|
||||
if (!resp_or.ok()) {
|
||||
check(resp_or.error());
|
||||
}
|
||||
|
||||
uint64_t ahci_addr = resp_or.value().ahci_phys_offset;
|
||||
ASSIGN_OR_RETURN(auto driver, AhciDriver::Init(ahci_addr));
|
||||
YellowstoneStub stub(gInitEndpointCap);
|
||||
ASSIGN_OR_RETURN(MappedMemoryRegion ahci_region, stub.GetAhciConfig());
|
||||
ASSIGN_OR_RETURN(auto driver, AhciDriver::Init(ahci_region));
|
||||
|
||||
YellowstoneGetReq req{
|
||||
.type = kYellowstoneGetRegistration,
|
||||
|
|
|
@ -4,7 +4,8 @@ add_executable(yellowstone
|
|||
yellowstone.cpp
|
||||
yellowstone_server.cpp
|
||||
)
|
||||
target_include_directories(yellowstone
|
||||
|
||||
target_include_directories(yellowstone
|
||||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
target_link_libraries(yellowstone
|
||||
|
@ -27,6 +28,10 @@ target_include_directories(yellowstone_stub
|
|||
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
|
||||
|
||||
target_link_libraries(yellowstone_stub
|
||||
mammoth
|
||||
)
|
||||
|
||||
set_target_properties(yellowstone_stub PROPERTIES
|
||||
COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${BASE_COMPILE_FLAGS}"
|
||||
LINK_FLAGS "${CMAKE_EXE_LINK_FLAGS} ${BASE_LINK_FLAGS}"
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
#pragma once
|
||||
|
||||
#include <mammoth/endpoint_client.h>
|
||||
#include <mammoth/memory_region.h>
|
||||
#include <ztypes.h>
|
||||
|
||||
class YellowstoneStub {
|
||||
public:
|
||||
explicit YellowstoneStub(z_cap_t yellowstone_cap);
|
||||
|
||||
glcr::ErrorOr<MappedMemoryRegion> GetAhciConfig();
|
||||
|
||||
private:
|
||||
glcr::UniquePtr<EndpointClient> yellowstone_stub_;
|
||||
};
|
|
@ -1,3 +1,23 @@
|
|||
// PLACEHOLDER
|
||||
#include <stdint.h>
|
||||
uint64_t a = 0;
|
||||
#include "include/yellowstone_stub.h"
|
||||
|
||||
#include "include/yellowstone.h"
|
||||
|
||||
namespace {
|
||||
|
||||
const uint64_t kPciSize = 0x1000;
|
||||
|
||||
} // namespace
|
||||
|
||||
YellowstoneStub::YellowstoneStub(z_cap_t yellowstone_cap)
|
||||
: yellowstone_stub_(EndpointClient::AdoptEndpoint(yellowstone_cap)) {}
|
||||
|
||||
glcr::ErrorOr<MappedMemoryRegion> YellowstoneStub::GetAhciConfig() {
|
||||
YellowstoneGetReq req{
|
||||
.type = kYellowstoneGetAhci,
|
||||
};
|
||||
ASSIGN_OR_RETURN(
|
||||
YellowstoneGetAhciResp resp,
|
||||
(yellowstone_stub_
|
||||
->CallEndpoint<YellowstoneGetReq, YellowstoneGetAhciResp>(req)));
|
||||
return MappedMemoryRegion::DirectPhysical(resp.ahci_phys_offset, kPciSize);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue