From c1caeb7e70d9c5cad75a1627b9bcc7a9084fdf3e Mon Sep 17 00:00:00 2001 From: Johannes Schlatow Date: Mon, 10 Dec 2018 18:39:02 +0100 Subject: [PATCH] zynq: improve cache handling in nic_drv Clean and invalidate caches in nic_drv before/after triggering DMA. Issue #3179 --- repos/os/include/nic/component.h | 3 +++ .../os/src/drivers/nic/spec/gem/cadence_gem.h | 26 +++++++++++++++++-- repos/os/src/drivers/nic/spec/gem/target.mk | 2 +- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/repos/os/include/nic/component.h b/repos/os/include/nic/component.h index f272e3aed3..50e09beab3 100644 --- a/repos/os/include/nic/component.h +++ b/repos/os/include/nic/component.h @@ -75,6 +75,9 @@ class Nic::Session_component : Communication_buffers, public Session_rpc_object Genode::Signal_handler _packet_stream_dispatcher { _ep, *this, &Session_component::_dispatch }; + using Communication_buffers::_tx_ds; + using Communication_buffers::_rx_ds; + public: /** diff --git a/repos/os/src/drivers/nic/spec/gem/cadence_gem.h b/repos/os/src/drivers/nic/spec/gem/cadence_gem.h index 56f0eec982..e9a283ef4b 100644 --- a/repos/os/src/drivers/nic/spec/gem/cadence_gem.h +++ b/repos/os/src/drivers/nic/spec/gem/cadence_gem.h @@ -28,6 +28,7 @@ #include "rx_buffer_descriptor.h" #include "marvell_phy.h" +#include namespace Genode { @@ -339,10 +340,13 @@ namespace Genode Genode::Signal_handler _irq_handler; Marvel_phy _phy; + addr_t _rx_buf_region; + addr_t _tx_buf_region; + size_t _rx_buf_size; + size_t _tx_buf_size; void _init() { - // TODO checksum offloading and pause frames /* see 16.3.2 Configure the Controller */ /* 1. Program the Network Configuration register (gem.net_cfg) */ @@ -482,6 +486,16 @@ namespace Genode } } + void _invalidate_rx_buffers() + { + Kernel::update_data_region(_rx_buf_region, _rx_buf_size); + } + + void _clean_tx_buffers() + { + Kernel::update_data_region(_tx_buf_region, _tx_buf_size); + } + virtual void _handle_irq() { /* 16.3.9 Receiving Frames */ @@ -489,6 +503,8 @@ namespace Genode const Interrupt_status::access_t status = read(); const Rx_status::access_t rxStatus = read(); + _invalidate_rx_buffers(); + if ( Interrupt_status::Rx_complete::get(status) ) { while (_rx_buffer.next_packet()) { @@ -589,7 +605,11 @@ namespace Genode _rx_buffer(env, *_rx.source()), _irq(env, irq), _irq_handler(env.ep(), *this, &Cadence_gem::_handle_irq), - _phy(*this, _timer) + _phy(*this, _timer), + _rx_buf_region((addr_t)_tx_ds.local_addr()), + _tx_buf_region((addr_t)_rx_ds.local_addr()), + _rx_buf_size(_tx_ds.size()), + _tx_buf_size(_rx_ds.size()) { _irq.sigh(_irq_handler); _irq.ack_irq(); @@ -686,6 +706,8 @@ namespace Genode { _handle_acks(); + _clean_tx_buffers(); + while (_send()); } }; diff --git a/repos/os/src/drivers/nic/spec/gem/target.mk b/repos/os/src/drivers/nic/spec/gem/target.mk index 0c277f4f53..48662aadc7 100644 --- a/repos/os/src/drivers/nic/spec/gem/target.mk +++ b/repos/os/src/drivers/nic/spec/gem/target.mk @@ -1,5 +1,5 @@ REQUIRES = cadence_gem TARGET = nic_drv SRC_CC = main.cc -LIBS = base +LIBS = base syscall-hw INC_DIR += $(PRG_DIR)