Add a yellowstone stub and partially migrate denali

This commit is contained in:
Drew Galbraith 2023-07-05 14:51:24 -07:00
parent 318356e54c
commit 72483a3437
6 changed files with 57 additions and 29 deletions

View File

@ -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());

View File

@ -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())) {}
};

View File

@ -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,

View File

@ -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}"

View File

@ -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_;
};

View File

@ -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);
}