Skip to content

Commit

Permalink
pw_interrupt: Add backend for xtensa processors
Browse files Browse the repository at this point in the history
Change-Id: Ie883afce68738469fe88257468edd9ae43c18189
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/160031
Reviewed-by: Jonathon Reinhart <[email protected]>
Commit-Queue: Austin Foxley <[email protected]>
Presubmit-Verified: CQ Bot Account <[email protected]>
Reviewed-by: Ted Pudlik <[email protected]>
  • Loading branch information
afoxley authored and CQ Bot Account committed Jul 28, 2023
1 parent 50925b5 commit 9ed69ef
Show file tree
Hide file tree
Showing 7 changed files with 114 additions and 0 deletions.
1 change: 1 addition & 0 deletions PIGWEED_MODULES
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ pw_i2c_mcuxpresso
pw_ide
pw_interrupt
pw_interrupt_cortex_m
pw_interrupt_xtensa
pw_interrupt_zephyr
pw_intrusive_ptr
pw_kvs
Expand Down
4 changes: 4 additions & 0 deletions pw_build/generated_pigweed_modules_lists.gni
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ declare_args() {
dir_pw_interrupt = get_path_info("../pw_interrupt", "abspath")
dir_pw_interrupt_cortex_m =
get_path_info("../pw_interrupt_cortex_m", "abspath")
dir_pw_interrupt_xtensa = get_path_info("../pw_interrupt_xtensa", "abspath")
dir_pw_interrupt_zephyr = get_path_info("../pw_interrupt_zephyr", "abspath")
dir_pw_intrusive_ptr = get_path_info("../pw_intrusive_ptr", "abspath")
dir_pw_kvs = get_path_info("../pw_kvs", "abspath")
Expand Down Expand Up @@ -241,6 +242,7 @@ declare_args() {
dir_pw_ide,
dir_pw_interrupt,
dir_pw_interrupt_cortex_m,
dir_pw_interrupt_xtensa,
dir_pw_interrupt_zephyr,
dir_pw_intrusive_ptr,
dir_pw_kvs,
Expand Down Expand Up @@ -385,6 +387,7 @@ declare_args() {
"$dir_pw_ide:tests",
"$dir_pw_interrupt:tests",
"$dir_pw_interrupt_cortex_m:tests",
"$dir_pw_interrupt_xtensa:tests",
"$dir_pw_interrupt_zephyr:tests",
"$dir_pw_intrusive_ptr:tests",
"$dir_pw_kvs:tests",
Expand Down Expand Up @@ -529,6 +532,7 @@ declare_args() {
"$dir_pw_ide:docs",
"$dir_pw_interrupt:docs",
"$dir_pw_interrupt_cortex_m:docs",
"$dir_pw_interrupt_xtensa:docs",
"$dir_pw_interrupt_zephyr:docs",
"$dir_pw_intrusive_ptr:docs",
"$dir_pw_kvs:docs",
Expand Down
1 change: 1 addition & 0 deletions pw_interrupt/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ alias(
name = "backend_multiplexer",
actual = select({
"//pw_interrupt_cortex_m:backend": "//pw_interrupt_cortex_m:context",
"//pw_interrupt_xtensa:backend": "//pw_interrupt_xtensa:context",
"//conditions:default": "//pw_build:unspecified_backend",
}),
visibility = ["@pigweed_config//:__pkg__"],
Expand Down
36 changes: 36 additions & 0 deletions pw_interrupt_xtensa/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Copyright 2023 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

load(
"//pw_build:pigweed.bzl",
"pw_cc_library",
)

package(default_visibility = ["//visibility:public"])

licenses(["notice"])

constraint_value(
name = "backend",
constraint_setting = "//pw_interrupt:backend_constraint_setting",
)

pw_cc_library(
name = "context",
srcs = ["context.cc"],
target_compatible_with = [":backend"],
deps = [
"//pw_interrupt:context_facade",
],
)
31 changes: 31 additions & 0 deletions pw_interrupt_xtensa/BUILD.gn
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Copyright 2023 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

import("//build_overrides/pigweed.gni")

import("$dir_pw_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_unit_test/test.gni")

pw_source_set("context") {
public_deps = [ "$dir_pw_interrupt:context.facade" ]
sources = [ "context.cc" ]
}

pw_doc_group("docs") {
sources = [ "docs.rst" ]
}

pw_test_group("tests") {
}
34 changes: 34 additions & 0 deletions pw_interrupt_xtensa/context.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Copyright 2023 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

#include "pw_interrupt/context.h"

#include <xtensa/config/core.h>
#include <xtensa/hal.h>

#include <cstdint>

namespace pw::interrupt {

bool InInterruptContext() {
// xthal_intlevel_get returns the current interrupt level of the processor
// (value of PS.INTLEVEL register). C based handlers are always dispatched
// from an interrupt level below XCHAL_EXCM_LEVEL - handlers running above
// this level must be written in assembly. The interrupt level is set to zero
// when interrupts are enabled but the core isn't currently procesing one.
const uint32_t int_level = xthal_intlevel_get();
return (int_level < XCHAL_EXCM_LEVEL) && (int_level > 0);
}

} // namespace pw::interrupt
7 changes: 7 additions & 0 deletions pw_interrupt_xtensa/docs.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.. _module-pw_interrupt_xtensa:

-------------------
pw_interrupt_xtensa
-------------------
Pigweed's interrupt Xtensa module provides an architecture specific
backend for ``pw_interrupt``.

0 comments on commit 9ed69ef

Please sign in to comment.