Kernel: Fix AC97 issues

Set last entry bit on the last entry :D

Verify that allocated DMA buffer fits in a 32 bit integer
This commit is contained in:
2026-07-20 11:30:06 +03:00
parent 0b53fba991
commit 328771ae29
+13 -5
View File
@@ -182,13 +182,22 @@ namespace Kernel
m_bdl_region = TRY(DMARegion::create(bdl_size + buffer_size * m_used_bdl_entries)); m_bdl_region = TRY(DMARegion::create(bdl_size + buffer_size * m_used_bdl_entries));
memset(reinterpret_cast<void*>(m_bdl_region->vaddr()), 0x00, m_bdl_region->size()); memset(reinterpret_cast<void*>(m_bdl_region->vaddr()), 0x00, m_bdl_region->size());
if (m_bdl_region->paddr() + m_bdl_region->size() > BAN::numeric_limits<uint32_t>::max())
{
dwarnln("Could not allocate 32 bit dma buffer");
return BAN::Error::from_errno(EFAULT);
}
auto* bdl_entries = reinterpret_cast<AC97::BufferDescriptorListEntry*>(m_bdl_region->vaddr());
for (size_t i = 0; i < m_bdl_entries; i++) for (size_t i = 0; i < m_bdl_entries; i++)
{ {
auto& entry = reinterpret_cast<AC97::BufferDescriptorListEntry*>(m_bdl_region->vaddr())[i]; bdl_entries[i] = {
entry.address = m_bdl_region->paddr() + bdl_size + (i % m_used_bdl_entries) * buffer_size; .address = static_cast<uint32_t>(m_bdl_region->paddr() + bdl_size + (i % m_used_bdl_entries) * buffer_size),
entry.samples = 0; .samples = 0,
entry.flags = 0; .flags = 1 << 15,
};
} }
bdl_entries[m_bdl_entries - 1].flags |= 1 << 14;
m_bus_master->write32(BusMasterRegister::PO_BDBAR, m_bdl_region->paddr()); m_bus_master->write32(BusMasterRegister::PO_BDBAR, m_bdl_region->paddr());
@@ -245,7 +254,6 @@ namespace Kernel
auto& entry = reinterpret_cast<AC97::BufferDescriptorListEntry*>(m_bdl_region->vaddr())[m_bdl_head]; auto& entry = reinterpret_cast<AC97::BufferDescriptorListEntry*>(m_bdl_region->vaddr())[m_bdl_head];
entry.samples = sample_frames * get_channels(); entry.samples = sample_frames * get_channels();
entry.flags = (1 << 15);
memcpy( memcpy(
reinterpret_cast<void*>(m_bdl_region->paddr_to_vaddr(entry.address)), reinterpret_cast<void*>(m_bdl_region->paddr_to_vaddr(entry.address)),
m_sample_data->get_data().data(), m_sample_data->get_data().data(),