[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel] [UNIKRAFT RFC PATCH 1/1] Implement PL031 RTC library for Arm



From: Jianyong Wu <Jianyong.Wu@xxxxxxx>

Signed-off-by: Wei Chen <wei.chen@xxxxxxx>
Signed-off-by: Jianyong Wu <jianyong.wu@xxxxxxx>
---
 lib/fdt/include/libfdt.h      |   1 +
 plat/common/arm/rtc.c         | 167 ++++++++++++++++++++++++++++++++++
 plat/common/include/arm/rtc.h |  43 +++++++++
 3 files changed, 211 insertions(+)
 create mode 100644 plat/common/arm/rtc.c
 create mode 100644 plat/common/include/arm/rtc.h

diff --git a/lib/fdt/include/libfdt.h b/lib/fdt/include/libfdt.h
index 05dedbd..96d530d 100644
--- a/lib/fdt/include/libfdt.h
+++ b/lib/fdt/include/libfdt.h
@@ -1873,4 +1873,5 @@ const char *fdt_strerror(int errval);
 }
 #endif
 
+void *_libkvmplat_dtb;
 #endif /* _LIBFDT_H */
diff --git a/plat/common/arm/rtc.c b/plat/common/arm/rtc.c
new file mode 100644
index 0000000..c1cdc8d
--- /dev/null
+++ b/plat/common/arm/rtc.c
@@ -0,0 +1,167 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Authors: Wei Chen <Wei.Chen@xxxxxxx>
+ *          Jianyong Wu <Jianyong.Wu@xxxxxxx>
+ *
+ * Copyright (c) 2018, Arm Ltd. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
+ */
+#include <string.h>
+#include <libfdt.h>
+#include <uk/assert.h>
+#include <uk/essentials.h>
+#include <uk/print.h>
+#include <arm/cpu.h>
+
+static void *rtc_base_addr;
+uint32_t rtc_boot_seconds;
+
+/* Define offset of RTC registers */
+#define RTC_REG_DR     0
+#define RTC_REG_MR     0x4
+#define RTC_REG_LR     0x8
+#define RTC_REG_CR     0xc
+#define RTC_REG_IMSC   0x10
+#define RTC_REG_RIS    0x14
+#define RTC_REG_MIS    0x18
+#define RTC_REG_ICR    0x1c
+
+#define RTC_REG(r)     (rtc_base_addr + (r))
+
+static char *rtc_device_list[] = {
+       "arm,pl031",
+       "arm,primecell",
+};
+
+uint32_t rtc_read(void)
+{
+       return ioreg_read32(RTC_REG(RTC_REG_DR));
+}
+
+/*
+ * set rtc match register comparing with counter
+ * value to generat a interrupt
+ */
+void rtc_set_match(uint32_t alam)
+{
+       ioreg_write32(RTC_REG(RTC_REG_MR), alam);
+}
+
+void rtc_update(uint32_t val)
+{
+       ioreg_write32(RTC_REG(RTC_REG_LR), val);
+}
+
+void rtc_enable(void)
+{
+       ioreg_write32(RTC_REG(RTC_REG_CR), 1);
+}
+
+/* return rtc status, 1 denotes enable and 0 denotes disable */
+uint32_t rtc_get_status(void)
+{
+       uint32_t val;
+
+       val = ioreg_read32(RTC_REG(RTC_REG_CR));
+       val &= 0x1;
+       return val;
+}
+
+/* mask alam */
+void rtc_mask_intr(void)
+{
+       ioreg_write32(RTC_REG(RTC_REG_IMSC), 1);
+}
+
+/* clear alam mask */
+void rtc_unmask_intr(void)
+{
+       ioreg_write32(RTC_REG(RTC_REG_IMSC), 0);
+}
+
+/* return the raw state of rtc interrupt before masking*/
+uint32_t rtc_get_intr_raw_state(void)
+{
+       return ioreg_read32(RTC_REG(RTC_REG_RIS));
+}
+
+/* return interrupt state after interrupt masking */
+uint32_t rtc_get_intr_state(void)
+{
+       return ioreg_read32(RTC_REG(RTC_REG_MIS));
+}
+
+void rtc_clear_intr(void)
+{
+       ioreg_write32(RTC_REG(RTC_REG_ICR), 1);
+}
+
+int _dtb_init_rtc(void *dtb)
+{
+       uint32_t idx;
+       int fdt_rtc, naddr, nsize, prop_len, prop_min_len;
+       const uint64_t *regs;
+
+       uk_printd(DLVL_INFO, "Probing RTC...\n");
+       for (idx = 0;
+               idx < sizeof(rtc_device_list) / sizeof(rtc_device_list[0]);
+               idx++) {
+               fdt_rtc = fdt_node_offset_by_compatible(dtb, -1,
+                               rtc_device_list[idx]);
+                if (fdt_rtc >= 0)
+                        break;
+       }
+
+       if (fdt_rtc < 0)
+               UK_CRASH("No valid RTC device find\n");
+
+       naddr = fdt_address_cells(dtb, fdt_rtc);
+       if (naddr < 0 || naddr >= FDT_MAX_NCELLS)
+               UK_CRASH("Could not find proper address cells!\n");
+
+       nsize = fdt_size_cells(dtb, fdt_rtc);
+       if (nsize < 0 || nsize >= FDT_MAX_NCELLS)
+               UK_CRASH("Could not find proper size cells!\n");
+
+        regs = fdt_getprop(dtb, fdt_rtc, "reg", &prop_len);
+
+       /*
+        * The property must contain at least the start address and size.
+        */
+       prop_min_len = (int)sizeof(fdt32_t) * (naddr + nsize);
+       if (regs == NULL || prop_len < prop_min_len)
+               UK_CRASH("Bad 'reg' property: %p %d\n", regs, prop_len);
+
+       rtc_base_addr = (void *)fdt64_to_cpu(regs[0]);
+
+       /* Record the boot seconds */
+       rtc_boot_seconds = rtc_read();
+
+       uk_printd(DLVL_INFO, "Found RTC on: %p\n", rtc_base_addr);
+}
diff --git a/plat/common/include/arm/rtc.h b/plat/common/include/arm/rtc.h
new file mode 100644
index 0000000..d8bab7f
--- /dev/null
+++ b/plat/common/include/arm/rtc.h
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Authors: Wei Chen <Wei.Chen@xxxxxxx>
+ *          Jianyong Wu <Jianyong.Wu@xxxxxxx>
+ *
+ * Copyright (c) 2018, Arm Ltd. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
+ */
+
+#ifndef __PLAT_CMN_ARM_RTC_H__
+#define __PLAT_CMN_ARM_RTC_H__
+
+extern uint32_t rtc_boot_seconds;
+
+int _dtb_init_rtc(void *dtb);
+
+#endif //__PLAT_CMN_ARM_GICV2_H__
-- 
2.17.1


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.