eth: use UncachedSlice for both desc and buffers

eth-uncached-buffers
Astro 2020-06-22 02:08:26 +02:00
parent 8267acfcba
commit 7c8ec46c8f
2 changed files with 16 additions and 13 deletions

View File

@ -59,7 +59,7 @@ register_bit!(desc_word1, global_broadcast, 31);
#[repr(C)] #[repr(C)]
pub struct DescList { pub struct DescList {
list: UncachedSlice<DescEntry>, list: UncachedSlice<DescEntry>,
buffers: Vec<Buffer>, buffers: UncachedSlice<Buffer>,
next: usize, next: usize,
} }
@ -67,7 +67,8 @@ impl DescList {
pub fn new(size: usize) -> Self { pub fn new(size: usize) -> Self {
let mut list = UncachedSlice::new(size, || DescEntry::zeroed()) let mut list = UncachedSlice::new(size, || DescEntry::zeroed())
.unwrap(); .unwrap();
let mut buffers = vec![Buffer::new(); size]; let mut buffers = UncachedSlice::new(size, || Buffer::new())
.unwrap();
let last = list.len().min(buffers.len()) - 1; let last = list.len().min(buffers.len()) - 1;
for (i, (entry, buffer)) in list.iter_mut().zip(buffers.iter_mut()).enumerate() { for (i, (entry, buffer)) in list.iter_mut().zip(buffers.iter_mut()).enumerate() {
@ -83,8 +84,8 @@ impl DescList {
entry.word1.write( entry.word1.write(
DescWord1::zeroed() DescWord1::zeroed()
); );
l2cache().invalidate_slice(&mut buffer[..]); // l2cache().invalidate_slice(&mut buffer[..]);
dcci_slice(&buffer[..]); // dcci_slice(&buffer[..]);
} }
DescList { DescList {
@ -141,10 +142,10 @@ pub struct PktRef<'a> {
impl<'a> Drop for PktRef<'a> { impl<'a> Drop for PktRef<'a> {
fn drop(&mut self) { fn drop(&mut self) {
// Flush buffer from cache, to be filled by the peripheral // // Flush buffer from cache, to be filled by the peripheral
// before next read // // before next read
l2cache().invalidate_slice(self.buffer); // l2cache().invalidate_slice(self.buffer);
dcci_slice(self.buffer); // dcci_slice(self.buffer);
self.entry.word0.modify(|_, w| w.used(false)); self.entry.word0.modify(|_, w| w.used(false));
dmb(); dmb();

View File

@ -1,6 +1,7 @@
use core::ops::{Deref, DerefMut}; use core::ops::{Deref, DerefMut};
use alloc::{vec, vec::Vec}; use alloc::{vec, vec::Vec};
use libcortex_a9::{asm::dmb, cache::dcc_slice, UncachedSlice}; use libcortex_a9::{asm::dmb, cache::dcc_slice, UncachedSlice};
//use libcortex_a9::{asm::*, cache::*, UncachedSlice};
use libregister::*; use libregister::*;
use log::{debug, warn}; use log::{debug, warn};
use crate::l2cache; use crate::l2cache;
@ -46,7 +47,7 @@ pub const DESCS: usize = 8;
#[repr(C)] #[repr(C)]
pub struct DescList { pub struct DescList {
list: UncachedSlice<DescEntry>, list: UncachedSlice<DescEntry>,
buffers: Vec<Buffer>, buffers: UncachedSlice<Buffer>,
next: usize, next: usize,
} }
@ -54,7 +55,8 @@ impl DescList {
pub fn new(size: usize) -> Self { pub fn new(size: usize) -> Self {
let mut list = UncachedSlice::new(size, || DescEntry::zeroed()) let mut list = UncachedSlice::new(size, || DescEntry::zeroed())
.unwrap(); .unwrap();
let mut buffers = vec![Buffer::new(); size]; let mut buffers = UncachedSlice::new(size, || Buffer::new())
.unwrap();
let last = list.len().min(buffers.len()) - 1; let last = list.len().min(buffers.len()) - 1;
// Sending seems to not work properly with only one packet // Sending seems to not work properly with only one packet
@ -133,9 +135,9 @@ pub struct PktRef<'a> {
impl<'a> Drop for PktRef<'a> { impl<'a> Drop for PktRef<'a> {
fn drop(&mut self) { fn drop(&mut self) {
// Write back all dirty cachelines of packet buffer // // Write back all dirty cachelines of packet buffer
dcc_slice(self.buffer); // dcc_slice(self.buffer);
l2cache().clean_slice(self.buffer); // l2cache().clean_slice(self.buffer);
self.entry.word1.modify(|_, w| w.used(false)); self.entry.word1.modify(|_, w| w.used(false));
dmb(); dmb();