From a62fce8dc52ca0ec3a1ade9bca9f7bbdddaf9332 Mon Sep 17 00:00:00 2001 From: Christian Prochaska Date: Fri, 13 Dec 2019 13:14:45 +0100 Subject: [PATCH] sd_card_drv: i.MX8 support Fixes #3580 --- repos/base/include/drivers/defs/imx8q_evk.h | 26 +++++++++++++++++ repos/os/run/sd_card_bench.run | 14 +++++---- repos/os/src/drivers/sd_card/adma2.cc | 2 +- .../drivers/sd_card/spec/imx8q_evk/driver.cc | 29 +++++++++++++++++++ .../drivers/sd_card/spec/imx8q_evk/target.mk | 6 ++++ 5 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 repos/base/include/drivers/defs/imx8q_evk.h create mode 100644 repos/os/src/drivers/sd_card/spec/imx8q_evk/driver.cc create mode 100644 repos/os/src/drivers/sd_card/spec/imx8q_evk/target.mk diff --git a/repos/base/include/drivers/defs/imx8q_evk.h b/repos/base/include/drivers/defs/imx8q_evk.h new file mode 100644 index 0000000000..6caddccf7a --- /dev/null +++ b/repos/base/include/drivers/defs/imx8q_evk.h @@ -0,0 +1,26 @@ +/* + * \brief MMIO and IRQ definitions for the i.MX8Q EVK board + * \author Christian Prochaska + * \date 2019-09-26 + */ + +/* + * Copyright (C) 2019 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU Affero General Public License version 3. + */ + +#ifndef _INCLUDE__DRIVERS__DEFS__IMX8Q_EVK_H_ +#define _INCLUDE__DRIVERS__DEFS__IMX8Q_EVK_H_ + +namespace Imx8 { + enum { + /* SD host controller */ + SDHC_2_IRQ = 55, + SDHC_2_MMIO_BASE = 0x30b50000, + SDHC_2_MMIO_SIZE = 0x00010000, + }; +}; + +#endif /* _INCLUDE__DRIVERS__DEFS__IMX8Q_EVK_H_ */ diff --git a/repos/os/run/sd_card_bench.run b/repos/os/run/sd_card_bench.run index 0ed05ba432..0074bf9232 100644 --- a/repos/os/run/sd_card_bench.run +++ b/repos/os/run/sd_card_bench.run @@ -3,19 +3,21 @@ # proc buffer_size_kib {} { - if {[have_spec pl180]} { return [expr 12 * 1024] } - if {[have_spec imx6]} { return [expr 1024] } + if {[have_spec pl180]} { return [expr 12 * 1024] } + if {[have_spec imx8q_evk]} { return [expr 1024] } + if {[have_spec imx6]} { return [expr 1024] } if {[have_spec imx53] && - ![have_spec foc]} { return [expr 1024] } - if {[have_spec rpi]} { return [expr 4 * 1024] } - if {[have_spec omap4]} { return [expr 4 * 1024] } - if {[have_spec arndale]} { return [expr 1024] } + ![have_spec foc]} { return [expr 1024] } + if {[have_spec rpi]} { return [expr 4 * 1024] } + if {[have_spec omap4]} { return [expr 4 * 1024] } + if {[have_spec arndale]} { return [expr 1024] } puts "\n Run script is not supported on this platform. \n"; exit 0; } proc sd_card_drv {} { if {[have_spec pbxa9]} { return pbxa9_sd_card_drv } + if {[have_spec imx8q_evk]} { return imx8q_evk_sd_card_drv } if {[have_spec imx6q_sabrelite]} { return imx6q_sabrelite_sd_card_drv } if {[have_spec imx53]} { return imx53_sd_card_drv } if {[have_spec rpi]} { return rpi_sd_card_drv } diff --git a/repos/os/src/drivers/sd_card/adma2.cc b/repos/os/src/drivers/sd_card/adma2.cc index 9464957984..03aafd2721 100644 --- a/repos/os/src/drivers/sd_card/adma2.cc +++ b/repos/os/src/drivers/sd_card/adma2.cc @@ -60,6 +60,6 @@ int Table::setup_request(size_t const size, addr_t const buffer_phys) consumed += curr; } /* ensure that all descriptor writes were actually executed */ - asm volatile ("dsb"); + asm volatile ("dsb #15" ::: "memory"); return 0; } diff --git a/repos/os/src/drivers/sd_card/spec/imx8q_evk/driver.cc b/repos/os/src/drivers/sd_card/spec/imx8q_evk/driver.cc new file mode 100644 index 0000000000..99ada3dc91 --- /dev/null +++ b/repos/os/src/drivers/sd_card/spec/imx8q_evk/driver.cc @@ -0,0 +1,29 @@ +/* + * \brief Secure Digital Host Controller + * \author Christian Prochaska + * \date 2019-09-26 + */ + +/* + * Copyright (C) 2019 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU Affero General Public License version 3. + */ + +/* local includes */ +#include +#include + +using namespace Sd_card; +using namespace Genode; + +Driver::Driver(Env &env) +: + Driver_base(env.ram()), + Attached_mmio(env, Imx8::SDHC_2_MMIO_BASE, Imx8::SDHC_2_MMIO_SIZE), + _env(env), _irq(env, Imx8::SDHC_2_IRQ) +{ + log("SD card detected"); + log("capacity: ", card_info().capacity_mb(), " MiB"); +} diff --git a/repos/os/src/drivers/sd_card/spec/imx8q_evk/target.mk b/repos/os/src/drivers/sd_card/spec/imx8q_evk/target.mk new file mode 100644 index 0000000000..0355a05644 --- /dev/null +++ b/repos/os/src/drivers/sd_card/spec/imx8q_evk/target.mk @@ -0,0 +1,6 @@ +TARGET = imx8q_evk_sd_card_drv +REQUIRES = arm_v8 +SRC_CC += adma2.cc spec/imx/driver.cc spec/imx6/driver.cc +INC_DIR = $(REP_DIR)/src/drivers/sd_card/spec/imx + +include $(REP_DIR)/src/drivers/sd_card/target.inc